From 6b5e0a991401db8f13c3861e59a05cdd186add4a Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Tue, 9 Jul 2019 19:05:45 -0700 Subject: [PATCH 001/320] fix group node being exported as bone node --- code/FBX/FBXExporter.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index dd34e135f..a0a46e09d 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -1617,6 +1617,17 @@ void FBXExporter::WriteObjects () // at the same time we can build a list of all the skeleton nodes, // which will be used later to mark them as type "limbNode". std::unordered_set limbnodes; + + //actual bone nodes in fbx, without parenting-up + std::set setAllBoneNamesInScene; + for(int m = 0; m < mScene->mNumMeshes; ++ m) + { + aiMesh* pMesh = mScene->mMeshes[m]; + for(int b = 0; b < pMesh->mNumBones; ++ b) + setAllBoneNamesInScene.insert(pMesh->mBones[b]->mName.data); + } + aiMatrix4x4 mxTransIdentity; + // and a map of nodes by bone name, as finding them is annoying. std::map node_by_bone; for (size_t mi = 0; mi < mScene->mNumMeshes; ++mi) { @@ -1660,6 +1671,11 @@ void FBXExporter::WriteObjects () if (node_name.find(MAGIC_NODE_TAG) != std::string::npos) { continue; } + //not a bone in scene && no effect in transform + if(setAllBoneNamesInScene.find(node_name)==setAllBoneNamesInScene.end() + && parent->mTransformation == mxTransIdentity) { + continue; + } // otherwise check if this is the root of the skeleton bool end = false; // is the mesh part of this node? From d7773dcfba97b76ca4671b629f8856c0d2693d74 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 09:51:20 -0700 Subject: [PATCH 002/320] set->unordered_set;unsigned int for iteration --- code/FBX/FBXExporter.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index a0a46e09d..08f4bdbc9 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -1619,11 +1619,11 @@ void FBXExporter::WriteObjects () std::unordered_set limbnodes; //actual bone nodes in fbx, without parenting-up - std::set setAllBoneNamesInScene; - for(int m = 0; m < mScene->mNumMeshes; ++ m) + std::unordered_set setAllBoneNamesInScene; + for(unsigned int m = 0; m < mScene->mNumMeshes; ++ m) { aiMesh* pMesh = mScene->mMeshes[m]; - for(int b = 0; b < pMesh->mNumBones; ++ b) + for(unsigned int b = 0; b < pMesh->mNumBones; ++ b) setAllBoneNamesInScene.insert(pMesh->mBones[b]->mName.data); } aiMatrix4x4 mxTransIdentity; From f703a798f4a66166687a0d5252a6e389bd1d752c Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:27:59 -0700 Subject: [PATCH 003/320] customize error rate for bind pose --- code/FBX/FBXExporter.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index dd34e135f..347025a79 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -68,6 +68,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include //wangyi + // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure @@ -1824,7 +1826,10 @@ void FBXExporter::WriteObjects () // this should be the same as the bone's mOffsetMatrix. // if it's not the same, the skeleton isn't in the bind pose. - const float epsilon = 1e-4f; // some error is to be expected + float epsilon = 1e-4f; // some error is to be expected +#ifdef ASSIMP_CUSTOM_BINDPOSE_ERR + epsilon = ASSIMP_CUSTOM_BINDPOSE_ERR; +#endif bool bone_xform_okay = true; if (b && ! tr.Equal(b->mOffsetMatrix, epsilon)) { not_in_bind_pose.insert(b); From f03f099fa88b078b6197e5bcbdf8defdc136a107 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:29:50 -0700 Subject: [PATCH 004/320] clean up --- code/FBX/FBXExporter.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 347025a79..ea1efb777 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -68,8 +68,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#include //wangyi - // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure From 259a9bd2af6e7a0ed1d651b2bc0dfdec8d066003 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Thu, 11 Jul 2019 17:00:47 -0700 Subject: [PATCH 005/320] use ExportProperties to customize bind pose epsilon --- code/FBX/FBXExporter.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index ea1efb777..c51e15252 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -67,6 +67,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ @@ -1825,9 +1826,9 @@ void FBXExporter::WriteObjects () // this should be the same as the bone's mOffsetMatrix. // if it's not the same, the skeleton isn't in the bind pose. float epsilon = 1e-4f; // some error is to be expected -#ifdef ASSIMP_CUSTOM_BINDPOSE_ERR - epsilon = ASSIMP_CUSTOM_BINDPOSE_ERR; -#endif + float epsilon_custom = mProperties->GetPropertyFloat("BINDPOSE_EPSILON", -1); + if(epsilon_custom > 0) + epsilon = epsilon_custom; bool bone_xform_okay = true; if (b && ! tr.Equal(b->mOffsetMatrix, epsilon)) { not_in_bind_pose.insert(b); From 2c7f607e7c47461d60e8d371ce2f2cece1559a18 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Thu, 11 Jul 2019 12:22:43 +0100 Subject: [PATCH 006/320] Create ZipArchiveIOSystem Moved IOSystem Unzip functionality out of D3MF Importer into include/assimp Cleaned up and more efficient: Don't map the archive until the caller opens a file or requests the contents list Don't extract any files until they are opened Store the location of the data within the ZIP and extract it later if the file is opened. --- code/3MF/D3MFImporter.cpp | 8 +- code/3MF/D3MFOpcPackage.cpp | 345 +----------------- code/3MF/D3MFOpcPackage.h | 7 +- code/Common/ZipArchiveIOSystem.cpp | 521 ++++++++++++++++++++++++++++ include/assimp/ZipArchiveIOSystem.h | 40 +++ 5 files changed, 568 insertions(+), 353 deletions(-) create mode 100644 code/Common/ZipArchiveIOSystem.cpp create mode 100644 include/assimp/ZipArchiveIOSystem.h diff --git a/code/3MF/D3MFImporter.cpp b/code/3MF/D3MFImporter.cpp index 2898f8ac2..682de684a 100644 --- a/code/3MF/D3MFImporter.cpp +++ b/code/3MF/D3MFImporter.cpp @@ -50,6 +50,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include #include @@ -58,11 +59,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include "D3MFOpcPackage.h" -#ifdef ASSIMP_USE_HUNTER -# include -#else -# include -#endif #include #include "3MFXmlTags.h" #include @@ -453,7 +449,7 @@ bool D3MFImporter::CanRead(const std::string &filename, IOSystem *pIOHandler, bo if ( nullptr == pIOHandler ) { return false; } - if ( !D3MF::D3MFOpcPackage::isZipArchive( pIOHandler, filename ) ) { + if ( !ZipArchiveIOSystem::isZipArchive( pIOHandler, filename ) ) { return false; } D3MF::D3MFOpcPackage opcPackage( pIOHandler, filename ); diff --git a/code/3MF/D3MFOpcPackage.cpp b/code/3MF/D3MFOpcPackage.cpp index 3a6e4dbc9..739e0cfcc 100644 --- a/code/3MF/D3MFOpcPackage.cpp +++ b/code/3MF/D3MFOpcPackage.cpp @@ -49,6 +49,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include #include @@ -56,344 +57,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include -#ifdef ASSIMP_USE_HUNTER -# include -#else -# include -#endif #include "3MFXmlTags.h" namespace Assimp { namespace D3MF { - -class IOSystem2Unzip { -public: - static voidpf open(voidpf opaque, const char* filename, int mode); - static uLong read(voidpf opaque, voidpf stream, void* buf, uLong size); - static uLong write(voidpf opaque, voidpf stream, const void* buf, uLong size); - static long tell(voidpf opaque, voidpf stream); - static long seek(voidpf opaque, voidpf stream, uLong offset, int origin); - static int close(voidpf opaque, voidpf stream); - static int testerror(voidpf opaque, voidpf stream); - static zlib_filefunc_def get(IOSystem* pIOHandler); -}; - -voidpf IOSystem2Unzip::open(voidpf opaque, const char* filename, int mode) { - IOSystem* io_system = reinterpret_cast(opaque); - - const char* mode_fopen = NULL; - if((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) { - mode_fopen = "rb"; - } else { - if(mode & ZLIB_FILEFUNC_MODE_EXISTING) { - mode_fopen = "r+b"; - } else { - if(mode & ZLIB_FILEFUNC_MODE_CREATE) { - mode_fopen = "wb"; - } - } - } - - return (voidpf) io_system->Open(filename, mode_fopen); -} - -uLong IOSystem2Unzip::read(voidpf /*opaque*/, voidpf stream, void* buf, uLong size) { - IOStream* io_stream = (IOStream*) stream; - - return static_cast(io_stream->Read(buf, 1, size)); -} - -uLong IOSystem2Unzip::write(voidpf /*opaque*/, voidpf stream, const void* buf, uLong size) { - IOStream* io_stream = (IOStream*) stream; - - return static_cast(io_stream->Write(buf, 1, size)); -} - -long IOSystem2Unzip::tell(voidpf /*opaque*/, voidpf stream) { - IOStream* io_stream = (IOStream*) stream; - - return static_cast(io_stream->Tell()); -} - -long IOSystem2Unzip::seek(voidpf /*opaque*/, voidpf stream, uLong offset, int origin) { - IOStream* io_stream = (IOStream*) stream; - - aiOrigin assimp_origin; - switch (origin) { - default: - case ZLIB_FILEFUNC_SEEK_CUR: - assimp_origin = aiOrigin_CUR; - break; - case ZLIB_FILEFUNC_SEEK_END: - assimp_origin = aiOrigin_END; - break; - case ZLIB_FILEFUNC_SEEK_SET: - assimp_origin = aiOrigin_SET; - break; - } - - return (io_stream->Seek(offset, assimp_origin) == aiReturn_SUCCESS ? 0 : -1); -} - -int IOSystem2Unzip::close(voidpf opaque, voidpf stream) { - IOSystem* io_system = (IOSystem*) opaque; - IOStream* io_stream = (IOStream*) stream; - - io_system->Close(io_stream); - - return 0; -} - -int IOSystem2Unzip::testerror(voidpf /*opaque*/, voidpf /*stream*/) { - return 0; -} - -zlib_filefunc_def IOSystem2Unzip::get(IOSystem* pIOHandler) { - zlib_filefunc_def mapping; - -#ifdef ASSIMP_USE_HUNTER - mapping.zopen_file = (open_file_func)open; - mapping.zread_file = (read_file_func)read; - mapping.zwrite_file = (write_file_func)write; - mapping.ztell_file = (tell_file_func)tell; - mapping.zseek_file = (seek_file_func)seek; - mapping.zclose_file = (close_file_func)close; - mapping.zerror_file = (error_file_func)testerror; -#else - mapping.zopen_file = open; - mapping.zread_file = read; - mapping.zwrite_file = write; - mapping.ztell_file = tell; - mapping.zseek_file = seek; - mapping.zclose_file = close; - mapping.zerror_file = testerror; -#endif - mapping.opaque = reinterpret_cast(pIOHandler); - - return mapping; -} - -class ZipFile : public IOStream { - friend class D3MFZipArchive; - -public: - explicit ZipFile(size_t size); - virtual ~ZipFile(); - size_t Read(void* pvBuffer, size_t pSize, size_t pCount ); - size_t Write(const void* /*pvBuffer*/, size_t /*pSize*/, size_t /*pCount*/); - size_t FileSize() const; - aiReturn Seek(size_t /*pOffset*/, aiOrigin /*pOrigin*/); - size_t Tell() const; - void Flush(); - -private: - void *m_Buffer; - size_t m_Size; -}; - -ZipFile::ZipFile(size_t size) -: m_Buffer( nullptr ) -, m_Size(size) { - ai_assert(m_Size != 0); - m_Buffer = ::malloc(m_Size); -} - -ZipFile::~ZipFile() { - ::free(m_Buffer); - m_Buffer = NULL; -} - -size_t ZipFile::Read(void* pvBuffer, size_t pSize, size_t pCount) { - const size_t size = pSize * pCount; - ai_assert(size <= m_Size); - - std::memcpy(pvBuffer, m_Buffer, size); - - return size; -} - -size_t ZipFile::Write(const void* pvBuffer, size_t size, size_t pCount ) { - const size_t size_to_write( size * pCount ); - if ( 0 == size_to_write ) { - return 0U; - } - return 0U; -} - -size_t ZipFile::FileSize() const { - return m_Size; -} - -aiReturn ZipFile::Seek(size_t /*pOffset*/, aiOrigin /*pOrigin*/) { - return aiReturn_FAILURE; -} - -size_t ZipFile::Tell() const { - return 0; -} - -void ZipFile::Flush() { - // empty -} - -class D3MFZipArchive : public IOSystem { -public: - static const unsigned int FileNameSize = 256; - - D3MFZipArchive(IOSystem* pIOHandler, const std::string & rFile); - ~D3MFZipArchive(); - bool Exists(const char* pFile) const; - char getOsSeparator() const; - IOStream* Open(const char* pFile, const char* pMode = "rb"); - void Close(IOStream* pFile); - bool isOpen() const; - void getFileList(std::vector &rFileList); - -private: - bool mapArchive(); - -private: - unzFile m_ZipFileHandle; - std::map m_ArchiveMap; -}; - -// ------------------------------------------------------------------------------------------------ -// Constructor. -D3MFZipArchive::D3MFZipArchive(IOSystem* pIOHandler, const std::string& rFile) -: m_ZipFileHandle( nullptr ) -, m_ArchiveMap() { - if (! rFile.empty()) { - zlib_filefunc_def mapping = IOSystem2Unzip::get(pIOHandler); - - m_ZipFileHandle = unzOpen2(rFile.c_str(), &mapping); - if(m_ZipFileHandle != nullptr ) { - mapArchive(); - } - } -} - -// ------------------------------------------------------------------------------------------------ -// Destructor. -D3MFZipArchive::~D3MFZipArchive() { - for(auto &file : m_ArchiveMap) { - delete file.second; - } - m_ArchiveMap.clear(); - - if(m_ZipFileHandle != nullptr) { - unzClose(m_ZipFileHandle); - m_ZipFileHandle = nullptr; - } -} - -// ------------------------------------------------------------------------------------------------ -// Returns true, if the archive is already open. -bool D3MFZipArchive::isOpen() const { - return (m_ZipFileHandle != nullptr ); -} - -// ------------------------------------------------------------------------------------------------ -// Returns true, if the filename is part of the archive. -bool D3MFZipArchive::Exists(const char* pFile) const { - ai_assert(pFile != nullptr ); - - if ( pFile == nullptr ) { - return false; - } - - std::string filename(pFile); - std::map::const_iterator it = m_ArchiveMap.find(filename); - bool exist( false ); - if(it != m_ArchiveMap.end()) { - exist = true; - } - - return exist; -} - -// ------------------------------------------------------------------------------------------------ -// Returns the separator delimiter. -char D3MFZipArchive::getOsSeparator() const { -#ifndef _WIN32 - return '/'; -#else - return '\\'; -#endif -} - -// ------------------------------------------------------------------------------------------------ -// Opens a file, which is part of the archive. -IOStream *D3MFZipArchive::Open(const char* pFile, const char* /*pMode*/) { - ai_assert(pFile != NULL); - - IOStream* result = NULL; - - std::map::iterator it = m_ArchiveMap.find(pFile); - - if(it != m_ArchiveMap.end()) { - result = static_cast(it->second); - } - - return result; -} - -// ------------------------------------------------------------------------------------------------ -// Close a filestream. -void D3MFZipArchive::Close(IOStream *pFile) { - (void)(pFile); - ai_assert(pFile != NULL); - - // We don't do anything in case the file would be opened again in the future -} -// ------------------------------------------------------------------------------------------------ -// Returns the file-list of the archive. -void D3MFZipArchive::getFileList(std::vector &rFileList) { - rFileList.clear(); - - for(const auto &file : m_ArchiveMap) { - rFileList.push_back(file.first); - } -} - -// ------------------------------------------------------------------------------------------------ -// Maps the archive content. -bool D3MFZipArchive::mapArchive() { - bool success = false; - - if(m_ZipFileHandle != NULL) { - if(m_ArchiveMap.empty()) { - // At first ensure file is already open - if(unzGoToFirstFile(m_ZipFileHandle) == UNZ_OK) { - // Loop over all files - do { - char filename[FileNameSize]; - unz_file_info fileInfo; - - if(unzGetCurrentFileInfo(m_ZipFileHandle, &fileInfo, filename, FileNameSize, NULL, 0, NULL, 0) == UNZ_OK) { - // The file has EXACTLY the size of uncompressed_size. In C - // you need to mark the last character with '\0', so add - // another character - if(fileInfo.uncompressed_size != 0 && unzOpenCurrentFile(m_ZipFileHandle) == UNZ_OK) { - std::pair::iterator, bool> result = m_ArchiveMap.insert(std::make_pair(filename, new ZipFile(fileInfo.uncompressed_size))); - - if(unzReadCurrentFile(m_ZipFileHandle, result.first->second->m_Buffer, fileInfo.uncompressed_size) == (long int) fileInfo.uncompressed_size) { - if(unzCloseCurrentFile(m_ZipFileHandle) == UNZ_OK) { - // Nothing to do anymore... - } - } - } - } - } while(unzGoToNextFile(m_ZipFileHandle) != UNZ_END_OF_LIST_OF_FILE); - } - } - - success = true; - } - - return success; -} - // ------------------------------------------------------------------------------------------------ typedef std::shared_ptr OpcPackageRelationshipPtr; @@ -453,7 +121,7 @@ public: D3MFOpcPackage::D3MFOpcPackage(IOSystem* pIOHandler, const std::string& rFile) : mRootStream(nullptr) , mZipArchive() { - mZipArchive.reset( new D3MF::D3MFZipArchive( pIOHandler, rFile ) ); + mZipArchive.reset( new ZipArchiveIOSystem( pIOHandler, rFile ) ); if(!mZipArchive->isOpen()) { throw DeadlyImportError("Failed to open file " + rFile+ "."); } @@ -516,15 +184,6 @@ bool D3MFOpcPackage::validate() { return mZipArchive->Exists( ModelRef.c_str() ); } -bool D3MFOpcPackage::isZipArchive( IOSystem* pIOHandler, const std::string& rFile ) { - D3MF::D3MFZipArchive ar( pIOHandler, rFile ); - if ( !ar.isOpen() ) { - return false; - } - - return true; -} - std::string D3MFOpcPackage::ReadPackageRootRelationship(IOStream* stream) { std::unique_ptr xmlStream(new CIrrXML_IOStreamReader(stream)); std::unique_ptr xml(irr::io::createIrrXMLReader(xmlStream.get())); diff --git a/code/3MF/D3MFOpcPackage.h b/code/3MF/D3MFOpcPackage.h index 47c67f45f..87d172116 100644 --- a/code/3MF/D3MFOpcPackage.h +++ b/code/3MF/D3MFOpcPackage.h @@ -49,6 +49,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include namespace Assimp { + class ZipArchiveIOSystem; + namespace D3MF { using XmlReader = irr::io::IrrXMLReader ; @@ -60,22 +62,19 @@ struct OpcPackageRelationship { std::string target; }; -class D3MFZipArchive; - class D3MFOpcPackage { public: D3MFOpcPackage( IOSystem* pIOHandler, const std::string& rFile ); ~D3MFOpcPackage(); IOStream* RootStream() const; bool validate(); - static bool isZipArchive( IOSystem* pIOHandler, const std::string& rFile ); protected: std::string ReadPackageRootRelationship(IOStream* stream); private: IOStream* mRootStream; - std::unique_ptr mZipArchive; + std::unique_ptr mZipArchive; }; } // Namespace D3MF diff --git a/code/Common/ZipArchiveIOSystem.cpp b/code/Common/ZipArchiveIOSystem.cpp new file mode 100644 index 000000000..5a42a0dcb --- /dev/null +++ b/code/Common/ZipArchiveIOSystem.cpp @@ -0,0 +1,521 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + + +All rights reserved. + +Redistribution and use of this software 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 the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +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. + +---------------------------------------------------------------------- +*/ + +#include +#include + +#include + +#include + +#ifdef ASSIMP_USE_HUNTER +# include +#else +# include +#endif + +namespace Assimp { + + // ---------------------------------------------------------------- + // Wraps an existing Assimp::IOSystem for unzip + class IOSystem2Unzip { + public: + static voidpf open(voidpf opaque, const char* filename, int mode); + static uLong read(voidpf opaque, voidpf stream, void* buf, uLong size); + static uLong write(voidpf opaque, voidpf stream, const void* buf, uLong size); + static long tell(voidpf opaque, voidpf stream); + static long seek(voidpf opaque, voidpf stream, uLong offset, int origin); + static int close(voidpf opaque, voidpf stream); + static int testerror(voidpf opaque, voidpf stream); + static zlib_filefunc_def get(IOSystem* pIOHandler); + }; + + voidpf IOSystem2Unzip::open(voidpf opaque, const char* filename, int mode) { + IOSystem* io_system = reinterpret_cast(opaque); + + const char* mode_fopen = nullptr; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ) { + mode_fopen = "rb"; + } + else { + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) { + mode_fopen = "r+b"; + } + else { + if (mode & ZLIB_FILEFUNC_MODE_CREATE) { + mode_fopen = "wb"; + } + } + } + + return (voidpf)io_system->Open(filename, mode_fopen); + } + + uLong IOSystem2Unzip::read(voidpf /*opaque*/, voidpf stream, void* buf, uLong size) { + IOStream* io_stream = (IOStream*)stream; + + return static_cast(io_stream->Read(buf, 1, size)); + } + + uLong IOSystem2Unzip::write(voidpf /*opaque*/, voidpf stream, const void* buf, uLong size) { + IOStream* io_stream = (IOStream*)stream; + + return static_cast(io_stream->Write(buf, 1, size)); + } + + long IOSystem2Unzip::tell(voidpf /*opaque*/, voidpf stream) { + IOStream* io_stream = (IOStream*)stream; + + return static_cast(io_stream->Tell()); + } + + long IOSystem2Unzip::seek(voidpf /*opaque*/, voidpf stream, uLong offset, int origin) { + IOStream* io_stream = (IOStream*)stream; + + aiOrigin assimp_origin; + switch (origin) { + default: + case ZLIB_FILEFUNC_SEEK_CUR: + assimp_origin = aiOrigin_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END: + assimp_origin = aiOrigin_END; + break; + case ZLIB_FILEFUNC_SEEK_SET: + assimp_origin = aiOrigin_SET; + break; + } + + return (io_stream->Seek(offset, assimp_origin) == aiReturn_SUCCESS ? 0 : -1); + } + + int IOSystem2Unzip::close(voidpf opaque, voidpf stream) { + IOSystem* io_system = (IOSystem*)opaque; + IOStream* io_stream = (IOStream*)stream; + + io_system->Close(io_stream); + + return 0; + } + + int IOSystem2Unzip::testerror(voidpf /*opaque*/, voidpf /*stream*/) { + return 0; + } + + zlib_filefunc_def IOSystem2Unzip::get(IOSystem* pIOHandler) { + zlib_filefunc_def mapping; + +#ifdef ASSIMP_USE_HUNTER + mapping.zopen_file = (open_file_func)open; + mapping.zread_file = (read_file_func)read; + mapping.zwrite_file = (write_file_func)write; + mapping.ztell_file = (tell_file_func)tell; + mapping.zseek_file = (seek_file_func)seek; + mapping.zclose_file = (close_file_func)close; + mapping.zerror_file = (error_file_func)testerror; +#else + mapping.zopen_file = open; + mapping.zread_file = read; + mapping.zwrite_file = write; + mapping.ztell_file = tell; + mapping.zseek_file = seek; + mapping.zclose_file = close; + mapping.zerror_file = testerror; +#endif + mapping.opaque = reinterpret_cast(pIOHandler); + + return mapping; + } + + // ---------------------------------------------------------------- + // A read-only file inside a ZIP + + class ZipFile : public IOStream { + friend class ZipFileInfo; + explicit ZipFile(size_t size); + public: + virtual ~ZipFile(); + + // IOStream interface + size_t Read(void* pvBuffer, size_t pSize, size_t pCount) override; + size_t Write(const void* /*pvBuffer*/, size_t /*pSize*/, size_t /*pCount*/) override { return 0; } + size_t FileSize() const override; + aiReturn Seek(size_t pOffset, aiOrigin pOrigin) override; + size_t Tell() const override; + void Flush() override {} + + private: + size_t m_Size = 0; + size_t m_SeekPtr = 0; + std::unique_ptr m_Buffer; + }; + + + // ---------------------------------------------------------------- + // Info about a read-only file inside a ZIP + class ZipFileInfo + { + public: + explicit ZipFileInfo(unzFile zip_handle, size_t size); + + // Allocate and Extract data from the ZIP + ZipFile * Extract(unzFile zip_handle, const std::string & file) const; + + private: + size_t m_Size = 0; + unz_file_pos_s m_ZipFilePos = { 0,0 }; + }; + + ZipFileInfo::ZipFileInfo(unzFile zip_handle, size_t size) + : m_Size(size) { + ai_assert(m_Size != 0); + unzGetFilePos(zip_handle, &(m_ZipFilePos)); + } + + ZipFile * ZipFileInfo::Extract(unzFile zip_handle, const std::string & file) const { + // Find in the ZIP. This cannot fail + unz_file_pos_s *filepos = const_cast(&(m_ZipFilePos)); + if (unzGoToFilePos(zip_handle, filepos) != UNZ_OK) + return nullptr; + + if (unzOpenCurrentFile(zip_handle) != UNZ_OK) + return nullptr; + + ZipFile *zip_file = new ZipFile(m_Size); + + if (unzReadCurrentFile(zip_handle, zip_file->m_Buffer.get(), static_cast(m_Size)) != m_Size) + { + // Failed, release the memory + delete zip_file; + zip_file = nullptr; + } + + ai_assert(unzCloseCurrentFile(zip_handle) == UNZ_OK); + return zip_file; + } + + ZipFile::ZipFile(size_t size) + : m_Size(size) { + ai_assert(m_Size != 0); + m_Buffer = std::unique_ptr(new uint8_t[m_Size]); + } + + ZipFile::~ZipFile() { + } + + size_t ZipFile::Read(void* pvBuffer, size_t pSize, size_t pCount) { + const size_t size = pSize * pCount; + ai_assert((size + m_SeekPtr) <= m_Size); + + std::memcpy(pvBuffer, m_Buffer.get() + m_SeekPtr, size); + + m_SeekPtr += size; + + return size; + } + + size_t ZipFile::FileSize() const { + return m_Size; + } + + aiReturn ZipFile::Seek(size_t pOffset, aiOrigin pOrigin) { + switch (pOrigin) + { + case aiOrigin_SET: { + if (pOffset > m_Size) return aiReturn_FAILURE; + m_SeekPtr = pOffset; + return aiReturn_SUCCESS; + } + + case aiOrigin_CUR: { + if ((pOffset + m_SeekPtr) > m_Size) return aiReturn_FAILURE; + m_SeekPtr += pOffset; + return aiReturn_SUCCESS; + } + + case aiOrigin_END: { + if (pOffset > m_Size) return aiReturn_FAILURE; + m_SeekPtr = m_Size - pOffset; + return aiReturn_SUCCESS; + } + } + + return aiReturn_FAILURE; + } + + size_t ZipFile::Tell() const { + return m_SeekPtr; + } + + // ---------------------------------------------------------------- + // pImpl of the Zip Archive IO + class ZipArchiveIOSystem::Implement { + public: + static const unsigned int FileNameSize = 256; + + Implement(IOSystem* pIOHandler, const char* pFilename, const char* pMode); + ~Implement(); + + bool isOpen() const; + void getFileList(std::vector& rFileList); + void getFileListExtension(std::vector& rFileList, const std::string& extension); + bool Exists(std::string& filename); + IOStream* OpenFile(std::string& filename); + + static void SimplifyFilename(std::string& filename); + + private: + void MapArchive(); + + private: + unzFile m_ZipFileHandle = nullptr; + typedef std::unordered_map ZipFileMap; + ZipFileMap m_ArchiveMap; + }; + + ZipArchiveIOSystem::Implement::Implement(IOSystem* pIOHandler, const char* pFilename, const char* pMode) { + ai_assert(strcmp(pMode, "r") == 0); + ai_assert(pFilename != nullptr); + if (pFilename[0] == 0) + return; + + zlib_filefunc_def mapping = IOSystem2Unzip::get(pIOHandler); + m_ZipFileHandle = unzOpen2(pFilename, &mapping); + } + + ZipArchiveIOSystem::Implement::~Implement() { + m_ArchiveMap.clear(); + + if (m_ZipFileHandle != nullptr) { + unzClose(m_ZipFileHandle); + m_ZipFileHandle = nullptr; + } + } + + void ZipArchiveIOSystem::Implement::MapArchive() { + if (m_ZipFileHandle == nullptr) + return; + + if (!m_ArchiveMap.empty()) + return; + + // At first ensure file is already open + if (unzGoToFirstFile(m_ZipFileHandle) != UNZ_OK) + return; + + // Loop over all files + do { + char filename[FileNameSize]; + unz_file_info fileInfo; + + if (unzGetCurrentFileInfo(m_ZipFileHandle, &fileInfo, filename, FileNameSize, nullptr, 0, nullptr, 0) == UNZ_OK) { + if (fileInfo.uncompressed_size != 0) { + std::string filename_string(filename, fileInfo.size_filename); + SimplifyFilename(filename_string); + std::pair result = m_ArchiveMap.insert(std::make_pair(filename_string, ZipFileInfo(m_ZipFileHandle, fileInfo.uncompressed_size))); + } + } + } while (unzGoToNextFile(m_ZipFileHandle) != UNZ_END_OF_LIST_OF_FILE); + } + + bool ZipArchiveIOSystem::Implement::isOpen() const { + return (m_ZipFileHandle != nullptr); + } + + void ZipArchiveIOSystem::Implement::getFileList(std::vector& rFileList) { + MapArchive(); + rFileList.clear(); + + for (const auto &file : m_ArchiveMap) { + rFileList.push_back(file.first); + } + } + + void ZipArchiveIOSystem::Implement::getFileListExtension(std::vector& rFileList, const std::string& extension) { + MapArchive(); + rFileList.clear(); + + for (const auto &file : m_ArchiveMap) { + if (extension == BaseImporter::GetExtension(file.first)) + rFileList.push_back(file.first); + } + } + + bool ZipArchiveIOSystem::Implement::Exists(std::string& filename) { + MapArchive(); + + ZipFileMap::const_iterator it = m_ArchiveMap.find(filename); + bool exist(false); + + return (it != m_ArchiveMap.end()); + } + + IOStream * ZipArchiveIOSystem::Implement::OpenFile(std::string& filename) { + MapArchive(); + + SimplifyFilename(filename); + + // Find in the map + ZipFileMap::const_iterator zip_it = m_ArchiveMap.find(filename); + if (zip_it == m_ArchiveMap.cend()) + return nullptr; + + const ZipFileInfo &zip_file = (*zip_it).second; + return zip_file.Extract(m_ZipFileHandle, filename); + } + + inline void ReplaceAll(std::string& data, const std::string& before, const std::string& after) { + size_t pos = data.find(before); + while (pos != std::string::npos) + { + data.replace(pos, before.size(), after); + pos = data.find(before, pos + after.size()); + } + } + + inline void ReplaceAllChar(std::string& data, const char before, const char after) { + size_t pos = data.find(before); + while (pos != std::string::npos) + { + data[pos] = after; + pos = data.find(before, pos + 1); + } + } + + void ZipArchiveIOSystem::Implement::SimplifyFilename(std::string& filename) + { + ReplaceAllChar(filename, '\\', '/'); + + // Remove all . and / from the beginning of the path + size_t pos = filename.find_first_not_of("./"); + if (pos != 0) + filename.erase(0, pos); + + // Simplify "my/folder/../file.png" constructions, if any + static const std::string relative("/../"); + const size_t relsize = relative.size() - 1; + pos = filename.find(relative); + while (pos != std::string::npos) + { + // Previous slash + size_t prevpos = filename.rfind('/', pos - 1); + if (prevpos == pos) + filename.erase(0, pos + relative.size()); + else + filename.erase(prevpos, pos + relsize - prevpos); + + pos = filename.find(relative); + } + } + + ZipArchiveIOSystem::ZipArchiveIOSystem(IOSystem* pIOHandler, const char* pFilename, const char* pMode) + : pImpl(new Implement(pIOHandler, pFilename, pMode)) { + } + + // ---------------------------------------------------------------- + // The ZipArchiveIO + ZipArchiveIOSystem::ZipArchiveIOSystem(IOSystem* pIOHandler, const std::string& rFilename, const char* pMode) + : pImpl(new Implement(pIOHandler, rFilename.c_str(), pMode)) + { + } + + ZipArchiveIOSystem::~ZipArchiveIOSystem() { + delete pImpl; + } + + bool ZipArchiveIOSystem::Exists(const char* pFilename) const { + ai_assert(pFilename != nullptr); + + if (pFilename == nullptr) { + return false; + } + + std::string filename(pFilename); + return pImpl->Exists(filename); + } + + // This is always '/' in a ZIP + char ZipArchiveIOSystem::getOsSeparator() const { + return '/'; + } + + // Only supports Reading + IOStream * ZipArchiveIOSystem::Open(const char* pFilename, const char* pMode) { + ai_assert(pFilename != nullptr); + + for (size_t i = 0; pMode[i] != 0; ++i) + { + ai_assert(pMode[i] != 'w'); + if (pMode[i] == 'w') + return nullptr; + } + + std::string filename(pFilename); + return pImpl->OpenFile(filename); + } + + void ZipArchiveIOSystem::Close(IOStream* pFile) { + delete pFile; + } + + bool ZipArchiveIOSystem::isOpen() const { + return (pImpl->isOpen()); + } + + void ZipArchiveIOSystem::getFileList(std::vector& rFileList) const { + return pImpl->getFileList(rFileList); + } + + void ZipArchiveIOSystem::getFileListExtension(std::vector& rFileList, const std::string& extension) const { + return pImpl->getFileListExtension(rFileList, extension); + } + + bool ZipArchiveIOSystem::isZipArchive(IOSystem* pIOHandler, const char* pFilename) { + Implement tmp(pIOHandler, pFilename, "r"); + return tmp.isOpen(); + } + + bool ZipArchiveIOSystem::isZipArchive(IOSystem* pIOHandler, const std::string& rFilename) { + return isZipArchive(pIOHandler, rFilename.c_str()); + } + +} diff --git a/include/assimp/ZipArchiveIOSystem.h b/include/assimp/ZipArchiveIOSystem.h new file mode 100644 index 000000000..7be597f59 --- /dev/null +++ b/include/assimp/ZipArchiveIOSystem.h @@ -0,0 +1,40 @@ +#ifndef AI_ZIPARCHIVEIOSYSTEM_H_INC +#define AI_ZIPARCHIVEIOSYSTEM_H_INC + +#include +#include + +namespace Assimp { + class ZipArchiveIOSystem : public IOSystem { + public: + //! Open a Zip using the proffered IOSystem + ZipArchiveIOSystem(IOSystem* pIOHandler, const char *pFilename, const char* pMode = "r"); + ZipArchiveIOSystem(IOSystem* pIOHandler, const std::string& rFilename, const char* pMode = "r"); + virtual ~ZipArchiveIOSystem(); + bool Exists(const char* pFilename) const override; + char getOsSeparator() const override; + IOStream* Open(const char* pFilename, const char* pMode = "rb") override; + void Close(IOStream* pFile) override; + + // Specific to ZIP + //! The file was opened and is a ZIP + bool isOpen() const; + + //! Get the list of all files with their simplified paths + //! Intended for use within Assimp library boundaries + void getFileList(std::vector& rFileList) const; + + //! Get the list of all files with extension (must be lowercase) + //! Intended for use within Assimp library boundaries + void getFileListExtension(std::vector& rFileList, const std::string& extension) const; + + static bool isZipArchive(IOSystem* pIOHandler, const char *pFilename); + static bool isZipArchive(IOSystem* pIOHandler, const std::string& rFilename); + + private: + class Implement; + Implement *pImpl = nullptr; + }; +} // Namespace Assimp + +#endif // AI_ZIPARCHIVEIOSYSTEM_H_INC From d64e1bde1383b19f3c17084eeea9b63541605556 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Fri, 12 Jul 2019 11:29:35 +0100 Subject: [PATCH 007/320] First pass of Collada ZAE support Reads the manifest and loads the DAE Does not yet load embedded textures --- code/Collada/ColladaLoader.cpp | 1125 ++++++----- code/Collada/ColladaLoader.h | 2 +- code/Collada/ColladaParser.cpp | 2442 ++++++++++++----------- code/Collada/ColladaParser.h | 4 + test/models/Collada/duck.zae | Bin 0 -> 132801 bytes test/models/Collada/duck_nomanifest.zae | Bin 0 -> 132634 bytes 6 files changed, 1852 insertions(+), 1721 deletions(-) create mode 100644 test/models/Collada/duck.zae create mode 100644 test/models/Collada/duck_nomanifest.zae diff --git a/code/Collada/ColladaLoader.cpp b/code/Collada/ColladaLoader.cpp index 81db957d5..40b2b0811 100644 --- a/code/Collada/ColladaLoader.cpp +++ b/code/Collada/ColladaLoader.cpp @@ -60,6 +60,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include "time.h" #include "math.h" @@ -75,30 +76,30 @@ static const aiImporterDesc desc = { "", "", "http://collada.org", - aiImporterFlags_SupportTextFlavour, + aiImporterFlags_SupportTextFlavour | aiImporterFlags_SupportCompressedFlavour, 1, 3, 1, 5, - "dae" + "dae zae" }; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer ColladaLoader::ColladaLoader() -: mFileName() -, mMeshIndexByID() -, mMaterialIndexByName() -, mMeshes() -, newMats() -, mCameras() -, mLights() -, mTextures() -, mAnims() -, noSkeletonMesh( false ) -, ignoreUpDirection(false) -, useColladaName( false ) -, mNodeNameCounter( 0 ) { + : mFileName() + , mMeshIndexByID() + , mMaterialIndexByName() + , mMeshes() + , newMats() + , mCameras() + , mLights() + , mTextures() + , mAnims() + , noSkeletonMesh(false) + , ignoreUpDirection(false) + , useColladaName(false) + , mNodeNameCounter(0) { // empty } @@ -110,16 +111,27 @@ ColladaLoader::~ColladaLoader() { // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool ColladaLoader::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const { +bool ColladaLoader::CanRead(const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const { // check file extension std::string extension = GetExtension(pFile); - if (extension == "dae") { - return true; + bool readSig = checkSig && (pIOHandler != nullptr); + + if (!readSig) { + if (extension == "dae" || extension == "zae") { + return true; + } + } + + if (readSig) { + // Look for a DAE file inside, but don't extract it + ZipArchiveIOSystem zip_archive(pIOHandler, pFile); + if (zip_archive.isOpen()) + return !ColladaParser::ReadZaeManifest(zip_archive).empty(); } // XML - too generic, we need to open the file and search for typical keywords - if( extension == "xml" || !extension.length() || checkSig) { + if (extension == "xml" || !extension.length() || checkSig) { /* If CanRead() is called in order to check whether we * support a specific file extension in general pIOHandler * might be NULL and it's our duty to return true here. @@ -127,8 +139,8 @@ bool ColladaLoader::CanRead( const std::string& pFile, IOSystem* pIOHandler, boo if (!pIOHandler) { return true; } - static const char* tokens[] = {"GetPropertyInteger(AI_CONFIG_IMPORT_NO_SKELETON_MESHES,0) != 0; - ignoreUpDirection = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_COLLADA_IGNORE_UP_DIRECTION,0) != 0; - useColladaName = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_COLLADA_USE_COLLADA_NAMES,0) != 0; + noSkeletonMesh = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_NO_SKELETON_MESHES, 0) != 0; + ignoreUpDirection = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_COLLADA_IGNORE_UP_DIRECTION, 0) != 0; + useColladaName = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_COLLADA_USE_COLLADA_NAMES, 0) != 0; } // ------------------------------------------------------------------------------------------------ // Get file extension list -const aiImporterDesc* ColladaLoader::GetInfo () const { +const aiImporterDesc* ColladaLoader::GetInfo() const { return &desc; } // ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. -void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) { +void ColladaLoader::InternReadFile(const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) { mFileName = pFile; // clean all member arrays - just for safety, it should work even if we did not @@ -164,46 +176,46 @@ void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, I mAnims.clear(); // parse the input file - ColladaParser parser( pIOHandler, pFile); + ColladaParser parser(pIOHandler, pFile); - if( !parser.mRootNode) - throw DeadlyImportError( "Collada: File came out empty. Something is wrong here."); + if (!parser.mRootNode) + throw DeadlyImportError("Collada: File came out empty. Something is wrong here."); // reserve some storage to avoid unnecessary reallocs - newMats.reserve(parser.mMaterialLibrary.size()*2); - mMeshes.reserve(parser.mMeshLibrary.size()*2); + newMats.reserve(parser.mMaterialLibrary.size() * 2); + mMeshes.reserve(parser.mMeshLibrary.size() * 2); mCameras.reserve(parser.mCameraLibrary.size()); mLights.reserve(parser.mLightLibrary.size()); // create the materials first, for the meshes to find - BuildMaterials( parser, pScene); + BuildMaterials(parser, pScene); // build the node hierarchy from it - pScene->mRootNode = BuildHierarchy( parser, parser.mRootNode); + pScene->mRootNode = BuildHierarchy(parser, parser.mRootNode); // ... then fill the materials with the now adjusted settings FillMaterials(parser, pScene); // Apply unit-size scale calculation - pScene->mRootNode->mTransformation *= aiMatrix4x4(parser.mUnitSize, 0, 0, 0, - 0, parser.mUnitSize, 0, 0, - 0, 0, parser.mUnitSize, 0, - 0, 0, 0, 1); - if( !ignoreUpDirection ) { - // Convert to Y_UP, if different orientation - if( parser.mUpDirection == ColladaParser::UP_X) - pScene->mRootNode->mTransformation *= aiMatrix4x4( - 0, -1, 0, 0, - 1, 0, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1); - else if( parser.mUpDirection == ColladaParser::UP_Z) - pScene->mRootNode->mTransformation *= aiMatrix4x4( - 1, 0, 0, 0, - 0, 0, 1, 0, - 0, -1, 0, 0, - 0, 0, 0, 1); + pScene->mRootNode->mTransformation *= aiMatrix4x4(parser.mUnitSize, 0, 0, 0, + 0, parser.mUnitSize, 0, 0, + 0, 0, parser.mUnitSize, 0, + 0, 0, 0, 1); + if (!ignoreUpDirection) { + // Convert to Y_UP, if different orientation + if (parser.mUpDirection == ColladaParser::UP_X) + pScene->mRootNode->mTransformation *= aiMatrix4x4( + 0, -1, 0, 0, + 1, 0, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + else if (parser.mUpDirection == ColladaParser::UP_Z) + pScene->mRootNode->mTransformation *= aiMatrix4x4( + 1, 0, 0, 0, + 0, 0, 1, 0, + 0, -1, 0, 0, + 0, 0, 0, 1); } // Store scene metadata @@ -218,19 +230,19 @@ void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, I } // store all meshes - StoreSceneMeshes( pScene); + StoreSceneMeshes(pScene); // store all materials - StoreSceneMaterials( pScene); + StoreSceneMaterials(pScene); // store all lights - StoreSceneLights( pScene); + StoreSceneLights(pScene); // store all cameras - StoreSceneCameras( pScene); + StoreSceneCameras(pScene); // store all animations - StoreAnimations( pScene, parser); + StoreAnimations(pScene, parser); // If no meshes have been loaded, it's probably just an animated skeleton. @@ -245,56 +257,56 @@ void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, I // ------------------------------------------------------------------------------------------------ // Recursively constructs a scene node for the given parser node and returns it. -aiNode* ColladaLoader::BuildHierarchy( const ColladaParser& pParser, const Collada::Node* pNode) { +aiNode* ColladaLoader::BuildHierarchy(const ColladaParser& pParser, const Collada::Node* pNode) { // create a node for it aiNode* node = new aiNode(); // find a name for the new node. It's more complicated than you might think - node->mName.Set( FindNameForNode( pNode)); + node->mName.Set(FindNameForNode(pNode)); // calculate the transformation matrix for it - node->mTransformation = pParser.CalculateResultTransform( pNode->mTransforms); + node->mTransformation = pParser.CalculateResultTransform(pNode->mTransforms); // now resolve node instances std::vector instances; - ResolveNodeInstances(pParser,pNode,instances); + ResolveNodeInstances(pParser, pNode, instances); // add children. first the *real* ones - node->mNumChildren = static_cast(pNode->mChildren.size()+instances.size()); + node->mNumChildren = static_cast(pNode->mChildren.size() + instances.size()); node->mChildren = new aiNode*[node->mNumChildren]; - for( size_t a = 0; a < pNode->mChildren.size(); ++a) { - node->mChildren[a] = BuildHierarchy( pParser, pNode->mChildren[a]); + for (size_t a = 0; a < pNode->mChildren.size(); ++a) { + node->mChildren[a] = BuildHierarchy(pParser, pNode->mChildren[a]); node->mChildren[a]->mParent = node; } // ... and finally the resolved node instances - for( size_t a = 0; a < instances.size(); ++a) { - node->mChildren[pNode->mChildren.size() + a] = BuildHierarchy( pParser, instances[a]); + for (size_t a = 0; a < instances.size(); ++a) { + node->mChildren[pNode->mChildren.size() + a] = BuildHierarchy(pParser, instances[a]); node->mChildren[pNode->mChildren.size() + a]->mParent = node; } // construct meshes - BuildMeshesForNode( pParser, pNode, node); + BuildMeshesForNode(pParser, pNode, node); // construct cameras BuildCamerasForNode(pParser, pNode, node); // construct lights BuildLightsForNode(pParser, pNode, node); - + return node; } // ------------------------------------------------------------------------------------------------ // Resolve node instances -void ColladaLoader::ResolveNodeInstances( const ColladaParser& pParser, const Collada::Node* pNode, - std::vector& resolved) { +void ColladaLoader::ResolveNodeInstances(const ColladaParser& pParser, const Collada::Node* pNode, + std::vector& resolved) { // reserve enough storage resolved.reserve(pNode->mNodeInstances.size()); // ... and iterate through all nodes to be instanced as children of pNode - for (const auto &nodeInst: pNode->mNodeInstances) { + for (const auto &nodeInst : pNode->mNodeInstances) { // find the corresponding node in the library const ColladaParser::NodeLibrary::const_iterator itt = pParser.mNodeLibrary.find(nodeInst.mNode); const Collada::Node* nd = itt == pParser.mNodeLibrary.end() ? NULL : (*itt).second; @@ -318,7 +330,7 @@ void ColladaLoader::ResolveNodeInstances( const ColladaParser& pParser, const Co // ------------------------------------------------------------------------------------------------ // Resolve UV channels void ColladaLoader::ApplyVertexToEffectSemanticMapping(Collada::Sampler& sampler, - const Collada::SemanticMappingTable& table) { + const Collada::SemanticMappingTable& table) { std::map::const_iterator it = table.mMap.find(sampler.mUVChannel); if (it != table.mMap.end()) { if (it->second.mType != Collada::IT_Texcoord) { @@ -331,12 +343,12 @@ void ColladaLoader::ApplyVertexToEffectSemanticMapping(Collada::Sampler& sampler // ------------------------------------------------------------------------------------------------ // Builds lights for the given node and references them -void ColladaLoader::BuildLightsForNode( const ColladaParser& pParser, const Collada::Node* pNode, aiNode* pTarget) { - for( const Collada::LightInstance& lid : pNode->mLights) { +void ColladaLoader::BuildLightsForNode(const ColladaParser& pParser, const Collada::Node* pNode, aiNode* pTarget) { + for (const Collada::LightInstance& lid : pNode->mLights) { // find the referred light - ColladaParser::LightLibrary::const_iterator srcLightIt = pParser.mLightLibrary.find( lid.mLight); - if( srcLightIt == pParser.mLightLibrary.end()) { - ASSIMP_LOG_WARN_F("Collada: Unable to find light for ID \"" , lid.mLight , "\". Skipping."); + ColladaParser::LightLibrary::const_iterator srcLightIt = pParser.mLightLibrary.find(lid.mLight); + if (srcLightIt == pParser.mLightLibrary.end()) { + ASSIMP_LOG_WARN_F("Collada: Unable to find light for ID \"", lid.mLight, "\". Skipping."); continue; } const Collada::Light* srcLight = &srcLightIt->second; @@ -347,7 +359,7 @@ void ColladaLoader::BuildLightsForNode( const ColladaParser& pParser, const Coll out->mType = (aiLightSourceType)srcLight->mType; // collada lights point in -Z by default, rest is specified in node transform - out->mDirection = aiVector3D(0.f,0.f,-1.f); + out->mDirection = aiVector3D(0.f, 0.f, -1.f); out->mAttenuationConstant = srcLight->mAttConstant; out->mAttenuationLinear = srcLight->mAttLinear; @@ -357,7 +369,8 @@ void ColladaLoader::BuildLightsForNode( const ColladaParser& pParser, const Coll if (out->mType == aiLightSource_AMBIENT) { out->mColorDiffuse = out->mColorSpecular = aiColor3D(0, 0, 0); out->mColorAmbient = srcLight->mColor*srcLight->mIntensity; - } else { + } + else { // collada doesn't differentiate between these color types out->mColorDiffuse = out->mColorSpecular = srcLight->mColor*srcLight->mIntensity; out->mColorAmbient = aiColor3D(0, 0, 0); @@ -365,23 +378,25 @@ void ColladaLoader::BuildLightsForNode( const ColladaParser& pParser, const Coll // convert falloff angle and falloff exponent in our representation, if given if (out->mType == aiLightSource_SPOT) { - out->mAngleInnerCone = AI_DEG_TO_RAD( srcLight->mFalloffAngle ); + out->mAngleInnerCone = AI_DEG_TO_RAD(srcLight->mFalloffAngle); // ... some extension magic. - if (srcLight->mOuterAngle >= ASSIMP_COLLADA_LIGHT_ANGLE_NOT_SET*(1-1e-6f)) { + if (srcLight->mOuterAngle >= ASSIMP_COLLADA_LIGHT_ANGLE_NOT_SET * (1 - 1e-6f)) { // ... some deprecation magic. - if (srcLight->mPenumbraAngle >= ASSIMP_COLLADA_LIGHT_ANGLE_NOT_SET*(1-1e-6f)) { + if (srcLight->mPenumbraAngle >= ASSIMP_COLLADA_LIGHT_ANGLE_NOT_SET * (1 - 1e-6f)) { // Need to rely on falloff_exponent. I don't know how to interpret it, so I need to guess .... // epsilon chosen to be 0.1 - out->mAngleOuterCone = std::acos(std::pow(0.1f,1.f/srcLight->mFalloffExponent))+ - out->mAngleInnerCone; - } else { - out->mAngleOuterCone = out->mAngleInnerCone + AI_DEG_TO_RAD( srcLight->mPenumbraAngle ); - if (out->mAngleOuterCone < out->mAngleInnerCone) - std::swap(out->mAngleInnerCone,out->mAngleOuterCone); + out->mAngleOuterCone = std::acos(std::pow(0.1f, 1.f / srcLight->mFalloffExponent)) + + out->mAngleInnerCone; } - } else { - out->mAngleOuterCone = AI_DEG_TO_RAD( srcLight->mOuterAngle ); + else { + out->mAngleOuterCone = out->mAngleInnerCone + AI_DEG_TO_RAD(srcLight->mPenumbraAngle); + if (out->mAngleOuterCone < out->mAngleInnerCone) + std::swap(out->mAngleInnerCone, out->mAngleOuterCone); + } + } + else { + out->mAngleOuterCone = AI_DEG_TO_RAD(srcLight->mOuterAngle); } } @@ -392,12 +407,12 @@ void ColladaLoader::BuildLightsForNode( const ColladaParser& pParser, const Coll // ------------------------------------------------------------------------------------------------ // Builds cameras for the given node and references them -void ColladaLoader::BuildCamerasForNode( const ColladaParser& pParser, const Collada::Node* pNode, aiNode* pTarget) { - for( const Collada::CameraInstance& cid : pNode->mCameras) { +void ColladaLoader::BuildCamerasForNode(const ColladaParser& pParser, const Collada::Node* pNode, aiNode* pTarget) { + for (const Collada::CameraInstance& cid : pNode->mCameras) { // find the referred light - ColladaParser::CameraLibrary::const_iterator srcCameraIt = pParser.mCameraLibrary.find( cid.mCamera); - if( srcCameraIt == pParser.mCameraLibrary.end()) { - ASSIMP_LOG_WARN_F("Collada: Unable to find camera for ID \"" , cid.mCamera , "\". Skipping."); + ColladaParser::CameraLibrary::const_iterator srcCameraIt = pParser.mCameraLibrary.find(cid.mCamera); + if (srcCameraIt == pParser.mCameraLibrary.end()) { + ASSIMP_LOG_WARN_F("Collada: Unable to find camera for ID \"", cid.mCamera, "\". Skipping."); continue; } const Collada::Camera* srcCamera = &srcCameraIt->second; @@ -412,7 +427,7 @@ void ColladaLoader::BuildCamerasForNode( const ColladaParser& pParser, const Col out->mName = pTarget->mName; // collada cameras point in -Z by default, rest is specified in node transform - out->mLookAt = aiVector3D(0.f,0.f,-1.f); + out->mLookAt = aiVector3D(0.f, 0.f, -1.f); // near/far z is already ok out->mClipPlaneFar = srcCamera->mZFar; @@ -432,7 +447,7 @@ void ColladaLoader::BuildCamerasForNode( const ColladaParser& pParser, const Col std::tan(AI_DEG_TO_RAD(srcCamera->mVerFov)); } } - else if (srcCamera->mAspect != 10e10f && srcCamera->mVerFov != 10e10f) { + else if (srcCamera->mAspect != 10e10f && srcCamera->mVerFov != 10e10f) { out->mHorizontalFOV = 2.0f * AI_RAD_TO_DEG(std::atan(srcCamera->mAspect * std::tan(AI_DEG_TO_RAD(srcCamera->mVerFov) * 0.5f))); } @@ -447,103 +462,106 @@ void ColladaLoader::BuildCamerasForNode( const ColladaParser& pParser, const Col // ------------------------------------------------------------------------------------------------ // Builds meshes for the given node and references them -void ColladaLoader::BuildMeshesForNode( const ColladaParser& pParser, const Collada::Node* pNode, aiNode* pTarget) { +void ColladaLoader::BuildMeshesForNode(const ColladaParser& pParser, const Collada::Node* pNode, aiNode* pTarget) { // accumulated mesh references by this node std::vector newMeshRefs; newMeshRefs.reserve(pNode->mMeshes.size()); // add a mesh for each subgroup in each collada mesh - for( const Collada::MeshInstance& mid : pNode->mMeshes) { + for (const Collada::MeshInstance& mid : pNode->mMeshes) { const Collada::Mesh* srcMesh = nullptr; const Collada::Controller* srcController = nullptr; // find the referred mesh - ColladaParser::MeshLibrary::const_iterator srcMeshIt = pParser.mMeshLibrary.find( mid.mMeshOrController); - if( srcMeshIt == pParser.mMeshLibrary.end()) { + ColladaParser::MeshLibrary::const_iterator srcMeshIt = pParser.mMeshLibrary.find(mid.mMeshOrController); + if (srcMeshIt == pParser.mMeshLibrary.end()) { // if not found in the mesh-library, it might also be a controller referring to a mesh - ColladaParser::ControllerLibrary::const_iterator srcContrIt = pParser.mControllerLibrary.find( mid.mMeshOrController); - if( srcContrIt != pParser.mControllerLibrary.end()) { + ColladaParser::ControllerLibrary::const_iterator srcContrIt = pParser.mControllerLibrary.find(mid.mMeshOrController); + if (srcContrIt != pParser.mControllerLibrary.end()) { srcController = &srcContrIt->second; - srcMeshIt = pParser.mMeshLibrary.find( srcController->mMeshId); - if( srcMeshIt != pParser.mMeshLibrary.end()) { + srcMeshIt = pParser.mMeshLibrary.find(srcController->mMeshId); + if (srcMeshIt != pParser.mMeshLibrary.end()) { srcMesh = srcMeshIt->second; } } - if( !srcMesh) { - ASSIMP_LOG_WARN_F( "Collada: Unable to find geometry for ID \"", mid.mMeshOrController, "\". Skipping." ); + if (!srcMesh) { + ASSIMP_LOG_WARN_F("Collada: Unable to find geometry for ID \"", mid.mMeshOrController, "\". Skipping."); continue; } - } else { + } + else { // ID found in the mesh library -> direct reference to an unskinned mesh srcMesh = srcMeshIt->second; } // build a mesh for each of its subgroups size_t vertexStart = 0, faceStart = 0; - for( size_t sm = 0; sm < srcMesh->mSubMeshes.size(); ++sm) { + for (size_t sm = 0; sm < srcMesh->mSubMeshes.size(); ++sm) { const Collada::SubMesh& submesh = srcMesh->mSubMeshes[sm]; - if( submesh.mNumFaces == 0) { + if (submesh.mNumFaces == 0) { continue; } // find material assigned to this submesh std::string meshMaterial; - std::map::const_iterator meshMatIt = mid.mMaterials.find( submesh.mMaterial); + std::map::const_iterator meshMatIt = mid.mMaterials.find(submesh.mMaterial); const Collada::SemanticMappingTable* table = nullptr; - if( meshMatIt != mid.mMaterials.end()) { + if (meshMatIt != mid.mMaterials.end()) { table = &meshMatIt->second; meshMaterial = table->mMatName; - } else { - ASSIMP_LOG_WARN_F( "Collada: No material specified for subgroup <", submesh.mMaterial, "> in geometry <", - mid.mMeshOrController, ">." ); - if( !mid.mMaterials.empty() ) { + } + else { + ASSIMP_LOG_WARN_F("Collada: No material specified for subgroup <", submesh.mMaterial, "> in geometry <", + mid.mMeshOrController, ">."); + if (!mid.mMaterials.empty()) { meshMaterial = mid.mMaterials.begin()->second.mMatName; } } // OK ... here the *real* fun starts ... we have the vertex-input-to-effect-semantic-table // given. The only mapping stuff which we do actually support is the UV channel. - std::map::const_iterator matIt = mMaterialIndexByName.find( meshMaterial); + std::map::const_iterator matIt = mMaterialIndexByName.find(meshMaterial); unsigned int matIdx = 0; - if( matIt != mMaterialIndexByName.end()) { + if (matIt != mMaterialIndexByName.end()) { matIdx = static_cast(matIt->second); } - if (table && !table->mMap.empty() ) { + if (table && !table->mMap.empty()) { std::pair& mat = newMats[matIdx]; // Iterate through all texture channels assigned to the effect and // check whether we have mapping information for it. - ApplyVertexToEffectSemanticMapping(mat.first->mTexDiffuse, *table); - ApplyVertexToEffectSemanticMapping(mat.first->mTexAmbient, *table); - ApplyVertexToEffectSemanticMapping(mat.first->mTexSpecular, *table); - ApplyVertexToEffectSemanticMapping(mat.first->mTexEmissive, *table); - ApplyVertexToEffectSemanticMapping(mat.first->mTexTransparent,*table); - ApplyVertexToEffectSemanticMapping(mat.first->mTexBump, *table); + ApplyVertexToEffectSemanticMapping(mat.first->mTexDiffuse, *table); + ApplyVertexToEffectSemanticMapping(mat.first->mTexAmbient, *table); + ApplyVertexToEffectSemanticMapping(mat.first->mTexSpecular, *table); + ApplyVertexToEffectSemanticMapping(mat.first->mTexEmissive, *table); + ApplyVertexToEffectSemanticMapping(mat.first->mTexTransparent, *table); + ApplyVertexToEffectSemanticMapping(mat.first->mTexBump, *table); } // built lookup index of the Mesh-Submesh-Material combination - ColladaMeshIndex index( mid.mMeshOrController, sm, meshMaterial); + ColladaMeshIndex index(mid.mMeshOrController, sm, meshMaterial); // if we already have the mesh at the library, just add its index to the node's array - std::map::const_iterator dstMeshIt = mMeshIndexByID.find( index); - if( dstMeshIt != mMeshIndexByID.end()) { - newMeshRefs.push_back( dstMeshIt->second); - } else { + std::map::const_iterator dstMeshIt = mMeshIndexByID.find(index); + if (dstMeshIt != mMeshIndexByID.end()) { + newMeshRefs.push_back(dstMeshIt->second); + } + else { // else we have to add the mesh to the collection and store its newly assigned index at the node - aiMesh* dstMesh = CreateMesh( pParser, srcMesh, submesh, srcController, vertexStart, faceStart); + aiMesh* dstMesh = CreateMesh(pParser, srcMesh, submesh, srcController, vertexStart, faceStart); // store the mesh, and store its new index in the node - newMeshRefs.push_back( mMeshes.size()); + newMeshRefs.push_back(mMeshes.size()); mMeshIndexByID[index] = mMeshes.size(); - mMeshes.push_back( dstMesh); + mMeshes.push_back(dstMesh); vertexStart += dstMesh->mNumVertices; faceStart += submesh.mNumFaces; // assign the material index dstMesh->mMaterialIndex = matIdx; - if(dstMesh->mName.length == 0) { + if (dstMesh->mName.length == 0) { dstMesh->mName = mid.mMeshOrController; } } @@ -552,7 +570,7 @@ void ColladaLoader::BuildMeshesForNode( const ColladaParser& pParser, const Coll // now place all mesh references we gathered in the target node pTarget->mNumMeshes = static_cast(newMeshRefs.size()); - if( newMeshRefs.size()) { + if (newMeshRefs.size()) { struct UIntTypeConverter { unsigned int operator()(const size_t& v) const { return static_cast(v); @@ -560,76 +578,76 @@ void ColladaLoader::BuildMeshesForNode( const ColladaParser& pParser, const Coll }; pTarget->mMeshes = new unsigned int[pTarget->mNumMeshes]; - std::transform( newMeshRefs.begin(), newMeshRefs.end(), pTarget->mMeshes, UIntTypeConverter()); + std::transform(newMeshRefs.begin(), newMeshRefs.end(), pTarget->mMeshes, UIntTypeConverter()); } } // ------------------------------------------------------------------------------------------------ // Find mesh from either meshes or morph target meshes aiMesh *ColladaLoader::findMesh(std::string meshid) { - for (unsigned int i = 0; i < mMeshes.size(); ++i ) { + for (unsigned int i = 0; i < mMeshes.size(); ++i) { if (std::string(mMeshes[i]->mName.data) == meshid) { return mMeshes[i]; } } - for (unsigned int i = 0; i < mTargetMeshes.size(); ++i ) { + for (unsigned int i = 0; i < mTargetMeshes.size(); ++i) { if (std::string(mTargetMeshes[i]->mName.data) == meshid) { return mTargetMeshes[i]; } } - + return nullptr; } // ------------------------------------------------------------------------------------------------ // Creates a mesh for the given ColladaMesh face subset and returns the newly created mesh -aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada::Mesh* pSrcMesh, const Collada::SubMesh& pSubMesh, - const Collada::Controller* pSrcController, size_t pStartVertex, size_t pStartFace) { +aiMesh* ColladaLoader::CreateMesh(const ColladaParser& pParser, const Collada::Mesh* pSrcMesh, const Collada::SubMesh& pSubMesh, + const Collada::Controller* pSrcController, size_t pStartVertex, size_t pStartFace) { std::unique_ptr dstMesh(new aiMesh); dstMesh->mName = pSrcMesh->mName; // count the vertices addressed by its faces - const size_t numVertices = std::accumulate( pSrcMesh->mFaceSize.begin() + pStartFace, + const size_t numVertices = std::accumulate(pSrcMesh->mFaceSize.begin() + pStartFace, pSrcMesh->mFaceSize.begin() + pStartFace + pSubMesh.mNumFaces, size_t(0)); // copy positions dstMesh->mNumVertices = static_cast(numVertices); dstMesh->mVertices = new aiVector3D[numVertices]; - std::copy( pSrcMesh->mPositions.begin() + pStartVertex, pSrcMesh->mPositions.begin() + + std::copy(pSrcMesh->mPositions.begin() + pStartVertex, pSrcMesh->mPositions.begin() + pStartVertex + numVertices, dstMesh->mVertices); // normals, if given. HACK: (thom) Due to the glorious Collada spec we never // know if we have the same number of normals as there are positions. So we // also ignore any vertex attribute if it has a different count - if( pSrcMesh->mNormals.size() >= pStartVertex + numVertices) { + if (pSrcMesh->mNormals.size() >= pStartVertex + numVertices) { dstMesh->mNormals = new aiVector3D[numVertices]; - std::copy( pSrcMesh->mNormals.begin() + pStartVertex, pSrcMesh->mNormals.begin() + + std::copy(pSrcMesh->mNormals.begin() + pStartVertex, pSrcMesh->mNormals.begin() + pStartVertex + numVertices, dstMesh->mNormals); } // tangents, if given. - if( pSrcMesh->mTangents.size() >= pStartVertex + numVertices) { + if (pSrcMesh->mTangents.size() >= pStartVertex + numVertices) { dstMesh->mTangents = new aiVector3D[numVertices]; - std::copy( pSrcMesh->mTangents.begin() + pStartVertex, pSrcMesh->mTangents.begin() + + std::copy(pSrcMesh->mTangents.begin() + pStartVertex, pSrcMesh->mTangents.begin() + pStartVertex + numVertices, dstMesh->mTangents); } // bitangents, if given. - if( pSrcMesh->mBitangents.size() >= pStartVertex + numVertices) { + if (pSrcMesh->mBitangents.size() >= pStartVertex + numVertices) { dstMesh->mBitangents = new aiVector3D[numVertices]; - std::copy( pSrcMesh->mBitangents.begin() + pStartVertex, pSrcMesh->mBitangents.begin() + + std::copy(pSrcMesh->mBitangents.begin() + pStartVertex, pSrcMesh->mBitangents.begin() + pStartVertex + numVertices, dstMesh->mBitangents); } // same for texturecoords, as many as we have // empty slots are not allowed, need to pack and adjust UV indexes accordingly - for( size_t a = 0, real = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a ) { - if( pSrcMesh->mTexCoords[a].size() >= pStartVertex + numVertices) { + for (size_t a = 0, real = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; ++a) { + if (pSrcMesh->mTexCoords[a].size() >= pStartVertex + numVertices) { dstMesh->mTextureCoords[real] = new aiVector3D[numVertices]; - for( size_t b = 0; b < numVertices; ++b) { - dstMesh->mTextureCoords[real][b] = pSrcMesh->mTexCoords[a][pStartVertex+b]; + for (size_t b = 0; b < numVertices; ++b) { + dstMesh->mTextureCoords[real][b] = pSrcMesh->mTexCoords[a][pStartVertex + b]; } dstMesh->mNumUVComponents[real] = pSrcMesh->mNumUVComponents[a]; @@ -638,10 +656,10 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: } // same for vertex colors, as many as we have. again the same packing to avoid empty slots - for( size_t a = 0, real = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; ++a ) { - if( pSrcMesh->mColors[a].size() >= pStartVertex + numVertices) { + for (size_t a = 0, real = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; ++a) { + if (pSrcMesh->mColors[a].size() >= pStartVertex + numVertices) { dstMesh->mColors[real] = new aiColor4D[numVertices]; - std::copy( pSrcMesh->mColors[a].begin() + pStartVertex, pSrcMesh->mColors[a].begin() + pStartVertex + numVertices,dstMesh->mColors[real]); + std::copy(pSrcMesh->mColors[a].begin() + pStartVertex, pSrcMesh->mColors[a].begin() + pStartVertex + numVertices, dstMesh->mColors[real]); ++real; } } @@ -650,12 +668,12 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: size_t vertex = 0; dstMesh->mNumFaces = static_cast(pSubMesh.mNumFaces); dstMesh->mFaces = new aiFace[dstMesh->mNumFaces]; - for( size_t a = 0; a < dstMesh->mNumFaces; ++a) { - size_t s = pSrcMesh->mFaceSize[ pStartFace + a]; + for (size_t a = 0; a < dstMesh->mNumFaces; ++a) { + size_t s = pSrcMesh->mFaceSize[pStartFace + a]; aiFace& face = dstMesh->mFaces[a]; face.mNumIndices = static_cast(s); face.mIndices = new unsigned int[s]; - for( size_t b = 0; b < s; ++b) { + for (size_t b = 0; b < s; ++b) { face.mIndices[b] = static_cast(vertex++); } } @@ -665,25 +683,25 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: std::vector targetWeights; Collada::MorphMethod method = Collada::Normalized; - for(std::map::const_iterator it = pParser.mControllerLibrary.begin(); - it != pParser.mControllerLibrary.end(); it++) { + for (std::map::const_iterator it = pParser.mControllerLibrary.begin(); + it != pParser.mControllerLibrary.end(); it++) { const Collada::Controller &c = it->second; - const Collada::Mesh* baseMesh = pParser.ResolveLibraryReference( pParser.mMeshLibrary, c.mMeshId); + const Collada::Mesh* baseMesh = pParser.ResolveLibraryReference(pParser.mMeshLibrary, c.mMeshId); if (c.mType == Collada::Morph && baseMesh->mName == pSrcMesh->mName) { - const Collada::Accessor& targetAccessor = pParser.ResolveLibraryReference( pParser.mAccessorLibrary, c.mMorphTarget); - const Collada::Accessor& weightAccessor = pParser.ResolveLibraryReference( pParser.mAccessorLibrary, c.mMorphWeight); - const Collada::Data& targetData = pParser.ResolveLibraryReference( pParser.mDataLibrary, targetAccessor.mSource); - const Collada::Data& weightData = pParser.ResolveLibraryReference( pParser.mDataLibrary, weightAccessor.mSource); + const Collada::Accessor& targetAccessor = pParser.ResolveLibraryReference(pParser.mAccessorLibrary, c.mMorphTarget); + const Collada::Accessor& weightAccessor = pParser.ResolveLibraryReference(pParser.mAccessorLibrary, c.mMorphWeight); + const Collada::Data& targetData = pParser.ResolveLibraryReference(pParser.mDataLibrary, targetAccessor.mSource); + const Collada::Data& weightData = pParser.ResolveLibraryReference(pParser.mDataLibrary, weightAccessor.mSource); // take method method = c.mMethod; if (!targetData.mIsStringArray) { - throw DeadlyImportError( "target data must contain id. "); + throw DeadlyImportError("target data must contain id. "); } if (weightData.mIsStringArray) { - throw DeadlyImportError( "target weight data must not be textual "); + throw DeadlyImportError("target weight data must not be textual "); } for (unsigned int i = 0; i < targetData.mStrings.size(); ++i) { @@ -692,7 +710,7 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: aiMesh *aimesh = findMesh(targetMesh->mName); if (!aimesh) { if (targetMesh->mSubMeshes.size() > 1) { - throw DeadlyImportError( "Morhing target mesh must be a single"); + throw DeadlyImportError("Morhing target mesh must be a single"); } aimesh = CreateMesh(pParser, targetMesh, targetMesh->mSubMeshes.at(0), NULL, 0, 0); mTargetMeshes.push_back(aimesh); @@ -706,7 +724,7 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: } if (targetMeshes.size() > 0 && targetWeights.size() == targetMeshes.size()) { std::vector animMeshes; - for (unsigned int i = 0; i < targetMeshes.size(); ++i ) { + for (unsigned int i = 0; i < targetMeshes.size(); ++i) { aiMesh* targetMesh = targetMeshes.at(i); aiAnimMesh *animMesh = aiCreateAnimMesh(targetMesh); float weight = targetWeights[i]; @@ -715,54 +733,54 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: animMeshes.push_back(animMesh); } dstMesh->mMethod = (method == Collada::Relative) - ? aiMorphingMethod_MORPH_RELATIVE - : aiMorphingMethod_MORPH_NORMALIZED; + ? aiMorphingMethod_MORPH_RELATIVE + : aiMorphingMethod_MORPH_NORMALIZED; dstMesh->mAnimMeshes = new aiAnimMesh*[animMeshes.size()]; dstMesh->mNumAnimMeshes = static_cast(animMeshes.size()); - for (unsigned int i = 0; i < animMeshes.size(); ++i ) { + for (unsigned int i = 0; i < animMeshes.size(); ++i) { dstMesh->mAnimMeshes[i] = animMeshes.at(i); } } // create bones if given - if( pSrcController && pSrcController->mType == Collada::Skin) { + if (pSrcController && pSrcController->mType == Collada::Skin) { // resolve references - joint names - const Collada::Accessor& jointNamesAcc = pParser.ResolveLibraryReference( pParser.mAccessorLibrary, pSrcController->mJointNameSource); - const Collada::Data& jointNames = pParser.ResolveLibraryReference( pParser.mDataLibrary, jointNamesAcc.mSource); + const Collada::Accessor& jointNamesAcc = pParser.ResolveLibraryReference(pParser.mAccessorLibrary, pSrcController->mJointNameSource); + const Collada::Data& jointNames = pParser.ResolveLibraryReference(pParser.mDataLibrary, jointNamesAcc.mSource); // joint offset matrices - const Collada::Accessor& jointMatrixAcc = pParser.ResolveLibraryReference( pParser.mAccessorLibrary, pSrcController->mJointOffsetMatrixSource); - const Collada::Data& jointMatrices = pParser.ResolveLibraryReference( pParser.mDataLibrary, jointMatrixAcc.mSource); + const Collada::Accessor& jointMatrixAcc = pParser.ResolveLibraryReference(pParser.mAccessorLibrary, pSrcController->mJointOffsetMatrixSource); + const Collada::Data& jointMatrices = pParser.ResolveLibraryReference(pParser.mDataLibrary, jointMatrixAcc.mSource); // joint vertex_weight name list - should refer to the same list as the joint names above. If not, report and reconsider - const Collada::Accessor& weightNamesAcc = pParser.ResolveLibraryReference( pParser.mAccessorLibrary, pSrcController->mWeightInputJoints.mAccessor); - if( &weightNamesAcc != &jointNamesAcc) - throw DeadlyImportError( "Temporary implementational laziness. If you read this, please report to the author."); + const Collada::Accessor& weightNamesAcc = pParser.ResolveLibraryReference(pParser.mAccessorLibrary, pSrcController->mWeightInputJoints.mAccessor); + if (&weightNamesAcc != &jointNamesAcc) + throw DeadlyImportError("Temporary implementational laziness. If you read this, please report to the author."); // vertex weights - const Collada::Accessor& weightsAcc = pParser.ResolveLibraryReference( pParser.mAccessorLibrary, pSrcController->mWeightInputWeights.mAccessor); - const Collada::Data& weights = pParser.ResolveLibraryReference( pParser.mDataLibrary, weightsAcc.mSource); + const Collada::Accessor& weightsAcc = pParser.ResolveLibraryReference(pParser.mAccessorLibrary, pSrcController->mWeightInputWeights.mAccessor); + const Collada::Data& weights = pParser.ResolveLibraryReference(pParser.mDataLibrary, weightsAcc.mSource); - if( !jointNames.mIsStringArray || jointMatrices.mIsStringArray || weights.mIsStringArray) - throw DeadlyImportError( "Data type mismatch while resolving mesh joints"); + if (!jointNames.mIsStringArray || jointMatrices.mIsStringArray || weights.mIsStringArray) + throw DeadlyImportError("Data type mismatch while resolving mesh joints"); // sanity check: we rely on the vertex weights always coming as pairs of BoneIndex-WeightIndex - if( pSrcController->mWeightInputJoints.mOffset != 0 || pSrcController->mWeightInputWeights.mOffset != 1) - throw DeadlyImportError( "Unsupported vertex_weight addressing scheme. "); + if (pSrcController->mWeightInputJoints.mOffset != 0 || pSrcController->mWeightInputWeights.mOffset != 1) + throw DeadlyImportError("Unsupported vertex_weight addressing scheme. "); // create containers to collect the weights for each bone size_t numBones = jointNames.mStrings.size(); - std::vector > dstBones( numBones); + std::vector > dstBones(numBones); // build a temporary array of pointers to the start of each vertex's weights typedef std::vector< std::pair > IndexPairVector; std::vector weightStartPerVertex; - weightStartPerVertex.resize(pSrcController->mWeightCounts.size(),pSrcController->mWeights.end()); + weightStartPerVertex.resize(pSrcController->mWeightCounts.size(), pSrcController->mWeights.end()); IndexPairVector::const_iterator pit = pSrcController->mWeights.begin(); - for( size_t a = 0; a < pSrcController->mWeightCounts.size(); ++a) { + for (size_t a = 0; a < pSrcController->mWeightCounts.size(); ++a) { weightStartPerVertex[a] = pit; pit += pSrcController->mWeightCounts[a]; } // now for each vertex put the corresponding vertex weights into each bone's weight collection - for( size_t a = pStartVertex; a < pStartVertex + numVertices; ++a) { + for (size_t a = pStartVertex; a < pStartVertex + numVertices; ++a) { // which position index was responsible for this vertex? that's also the index by which // the controller assigns the vertex weights size_t orgIndex = pSrcMesh->mFacePosIndices[a]; @@ -770,58 +788,58 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: IndexPairVector::const_iterator iit = weightStartPerVertex[orgIndex]; size_t pairCount = pSrcController->mWeightCounts[orgIndex]; - for( size_t b = 0; b < pairCount; ++b, ++iit) + for (size_t b = 0; b < pairCount; ++b, ++iit) { size_t jointIndex = iit->first; size_t vertexIndex = iit->second; - ai_real weight = ReadFloat( weightsAcc, weights, vertexIndex, 0); + ai_real weight = ReadFloat(weightsAcc, weights, vertexIndex, 0); // one day I gonna kill that XSI Collada exporter - if( weight > 0.0f) + if (weight > 0.0f) { aiVertexWeight w; w.mVertexId = static_cast(a - pStartVertex); w.mWeight = weight; - dstBones[jointIndex].push_back( w); + dstBones[jointIndex].push_back(w); } } } // count the number of bones which influence vertices of the current submesh size_t numRemainingBones = 0; - for( std::vector >::const_iterator it = dstBones.begin(); it != dstBones.end(); ++it) - if( it->size() > 0) + for (std::vector >::const_iterator it = dstBones.begin(); it != dstBones.end(); ++it) + if (it->size() > 0) numRemainingBones++; // create bone array and copy bone weights one by one dstMesh->mNumBones = static_cast(numRemainingBones); dstMesh->mBones = new aiBone*[numRemainingBones]; size_t boneCount = 0; - for( size_t a = 0; a < numBones; ++a) + for (size_t a = 0; a < numBones; ++a) { // omit bones without weights - if( dstBones[a].size() == 0) + if (dstBones[a].size() == 0) continue; // create bone with its weights aiBone* bone = new aiBone; - bone->mName = ReadString( jointNamesAcc, jointNames, a); - bone->mOffsetMatrix.a1 = ReadFloat( jointMatrixAcc, jointMatrices, a, 0); - bone->mOffsetMatrix.a2 = ReadFloat( jointMatrixAcc, jointMatrices, a, 1); - bone->mOffsetMatrix.a3 = ReadFloat( jointMatrixAcc, jointMatrices, a, 2); - bone->mOffsetMatrix.a4 = ReadFloat( jointMatrixAcc, jointMatrices, a, 3); - bone->mOffsetMatrix.b1 = ReadFloat( jointMatrixAcc, jointMatrices, a, 4); - bone->mOffsetMatrix.b2 = ReadFloat( jointMatrixAcc, jointMatrices, a, 5); - bone->mOffsetMatrix.b3 = ReadFloat( jointMatrixAcc, jointMatrices, a, 6); - bone->mOffsetMatrix.b4 = ReadFloat( jointMatrixAcc, jointMatrices, a, 7); - bone->mOffsetMatrix.c1 = ReadFloat( jointMatrixAcc, jointMatrices, a, 8); - bone->mOffsetMatrix.c2 = ReadFloat( jointMatrixAcc, jointMatrices, a, 9); - bone->mOffsetMatrix.c3 = ReadFloat( jointMatrixAcc, jointMatrices, a, 10); - bone->mOffsetMatrix.c4 = ReadFloat( jointMatrixAcc, jointMatrices, a, 11); + bone->mName = ReadString(jointNamesAcc, jointNames, a); + bone->mOffsetMatrix.a1 = ReadFloat(jointMatrixAcc, jointMatrices, a, 0); + bone->mOffsetMatrix.a2 = ReadFloat(jointMatrixAcc, jointMatrices, a, 1); + bone->mOffsetMatrix.a3 = ReadFloat(jointMatrixAcc, jointMatrices, a, 2); + bone->mOffsetMatrix.a4 = ReadFloat(jointMatrixAcc, jointMatrices, a, 3); + bone->mOffsetMatrix.b1 = ReadFloat(jointMatrixAcc, jointMatrices, a, 4); + bone->mOffsetMatrix.b2 = ReadFloat(jointMatrixAcc, jointMatrices, a, 5); + bone->mOffsetMatrix.b3 = ReadFloat(jointMatrixAcc, jointMatrices, a, 6); + bone->mOffsetMatrix.b4 = ReadFloat(jointMatrixAcc, jointMatrices, a, 7); + bone->mOffsetMatrix.c1 = ReadFloat(jointMatrixAcc, jointMatrices, a, 8); + bone->mOffsetMatrix.c2 = ReadFloat(jointMatrixAcc, jointMatrices, a, 9); + bone->mOffsetMatrix.c3 = ReadFloat(jointMatrixAcc, jointMatrices, a, 10); + bone->mOffsetMatrix.c4 = ReadFloat(jointMatrixAcc, jointMatrices, a, 11); bone->mNumWeights = static_cast(dstBones[a].size()); bone->mWeights = new aiVertexWeight[bone->mNumWeights]; - std::copy( dstBones[a].begin(), dstBones[a].end(), bone->mWeights); + std::copy(dstBones[a].begin(), dstBones[a].end(), bone->mWeights); // apply bind shape matrix to offset matrix aiMatrix4x4 bindShapeMatrix; @@ -847,15 +865,15 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: // Therefore I added a little name replacement here: I search for the bone's node by either name, ID or SID, // and replace the bone's name by the node's name so that the user can use the standard // find-by-name method to associate nodes with bones. - const Collada::Node* bnode = FindNode( pParser.mRootNode, bone->mName.data); - if( !bnode) - bnode = FindNodeBySID( pParser.mRootNode, bone->mName.data); + const Collada::Node* bnode = FindNode(pParser.mRootNode, bone->mName.data); + if (!bnode) + bnode = FindNodeBySID(pParser.mRootNode, bone->mName.data); // assign the name that we would have assigned for the source node - if( bnode) - bone->mName.Set( FindNameForNode( bnode)); + if (bnode) + bone->mName.Set(FindNameForNode(bnode)); else - ASSIMP_LOG_WARN_F( "ColladaLoader::CreateMesh(): could not find corresponding node for joint \"", bone->mName.data, "\"." ); + ASSIMP_LOG_WARN_F("ColladaLoader::CreateMesh(): could not find corresponding node for joint \"", bone->mName.data, "\"."); // and insert bone dstMesh->mBones[boneCount++] = bone; @@ -867,65 +885,65 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: // ------------------------------------------------------------------------------------------------ // Stores all meshes in the given scene -void ColladaLoader::StoreSceneMeshes( aiScene* pScene) +void ColladaLoader::StoreSceneMeshes(aiScene* pScene) { pScene->mNumMeshes = static_cast(mMeshes.size()); - if( mMeshes.size() > 0) + if (mMeshes.size() > 0) { pScene->mMeshes = new aiMesh*[mMeshes.size()]; - std::copy( mMeshes.begin(), mMeshes.end(), pScene->mMeshes); + std::copy(mMeshes.begin(), mMeshes.end(), pScene->mMeshes); mMeshes.clear(); } } // ------------------------------------------------------------------------------------------------ // Stores all cameras in the given scene -void ColladaLoader::StoreSceneCameras( aiScene* pScene) +void ColladaLoader::StoreSceneCameras(aiScene* pScene) { pScene->mNumCameras = static_cast(mCameras.size()); - if( mCameras.size() > 0) + if (mCameras.size() > 0) { pScene->mCameras = new aiCamera*[mCameras.size()]; - std::copy( mCameras.begin(), mCameras.end(), pScene->mCameras); + std::copy(mCameras.begin(), mCameras.end(), pScene->mCameras); mCameras.clear(); } } // ------------------------------------------------------------------------------------------------ // Stores all lights in the given scene -void ColladaLoader::StoreSceneLights( aiScene* pScene) +void ColladaLoader::StoreSceneLights(aiScene* pScene) { pScene->mNumLights = static_cast(mLights.size()); - if( mLights.size() > 0) + if (mLights.size() > 0) { pScene->mLights = new aiLight*[mLights.size()]; - std::copy( mLights.begin(), mLights.end(), pScene->mLights); + std::copy(mLights.begin(), mLights.end(), pScene->mLights); mLights.clear(); } } // ------------------------------------------------------------------------------------------------ // Stores all textures in the given scene -void ColladaLoader::StoreSceneTextures( aiScene* pScene) +void ColladaLoader::StoreSceneTextures(aiScene* pScene) { pScene->mNumTextures = static_cast(mTextures.size()); - if( mTextures.size() > 0) + if (mTextures.size() > 0) { pScene->mTextures = new aiTexture*[mTextures.size()]; - std::copy( mTextures.begin(), mTextures.end(), pScene->mTextures); + std::copy(mTextures.begin(), mTextures.end(), pScene->mTextures); mTextures.clear(); } } // ------------------------------------------------------------------------------------------------ // Stores all materials in the given scene -void ColladaLoader::StoreSceneMaterials( aiScene* pScene) +void ColladaLoader::StoreSceneMaterials(aiScene* pScene) { pScene->mNumMaterials = static_cast(newMats.size()); if (newMats.size() > 0) { pScene->mMaterials = new aiMaterial*[newMats.size()]; - for (unsigned int i = 0; i < newMats.size();++i) + for (unsigned int i = 0; i < newMats.size(); ++i) pScene->mMaterials[i] = newMats[i].second; newMats.clear(); @@ -934,33 +952,33 @@ void ColladaLoader::StoreSceneMaterials( aiScene* pScene) // ------------------------------------------------------------------------------------------------ // Stores all animations -void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pParser) +void ColladaLoader::StoreAnimations(aiScene* pScene, const ColladaParser& pParser) { // recursively collect all animations from the collada scene - StoreAnimations( pScene, pParser, &pParser.mAnims, ""); + StoreAnimations(pScene, pParser, &pParser.mAnims, ""); // catch special case: many animations with the same length, each affecting only a single node. // we need to unite all those single-node-anims to a proper combined animation - for( size_t a = 0; a < mAnims.size(); ++a) + for (size_t a = 0; a < mAnims.size(); ++a) { aiAnimation* templateAnim = mAnims[a]; - if( templateAnim->mNumChannels == 1) + if (templateAnim->mNumChannels == 1) { // search for other single-channel-anims with the same duration std::vector collectedAnimIndices; - for( size_t b = a+1; b < mAnims.size(); ++b) + for (size_t b = a + 1; b < mAnims.size(); ++b) { aiAnimation* other = mAnims[b]; - if( other->mNumChannels == 1 && other->mDuration == templateAnim->mDuration && - other->mTicksPerSecond == templateAnim->mTicksPerSecond ) - collectedAnimIndices.push_back( b); + if (other->mNumChannels == 1 && other->mDuration == templateAnim->mDuration && + other->mTicksPerSecond == templateAnim->mTicksPerSecond) + collectedAnimIndices.push_back(b); } // if there are other animations which fit the template anim, combine all channels into a single anim - if( !collectedAnimIndices.empty() ) + if (!collectedAnimIndices.empty()) { aiAnimation* combinedAnim = new aiAnimation(); - combinedAnim->mName = aiString( std::string( "combinedAnim_") + char( '0' + a)); + combinedAnim->mName = aiString(std::string("combinedAnim_") + char('0' + a)); combinedAnim->mDuration = templateAnim->mDuration; combinedAnim->mTicksPerSecond = templateAnim->mTicksPerSecond; combinedAnim->mNumChannels = static_cast(collectedAnimIndices.size() + 1); @@ -973,7 +991,7 @@ void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pPars mAnims[a] = combinedAnim; // move the memory of all other anims to the combined anim and erase them from the source anims - for( size_t b = 0; b < collectedAnimIndices.size(); ++b) + for (size_t b = 0; b < collectedAnimIndices.size(); ++b) { aiAnimation* srcAnimation = mAnims[collectedAnimIndices[b]]; combinedAnim->mChannels[1 + b] = srcAnimation->mChannels[0]; @@ -983,9 +1001,9 @@ void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pPars // in a second go, delete all the single-channel-anims that we've stripped from their channels // back to front to preserve indices - you know, removing an element from a vector moves all elements behind the removed one - while( !collectedAnimIndices.empty() ) + while (!collectedAnimIndices.empty()) { - mAnims.erase( mAnims.begin() + collectedAnimIndices.back()); + mAnims.erase(mAnims.begin() + collectedAnimIndices.back()); collectedAnimIndices.pop_back(); } } @@ -993,11 +1011,11 @@ void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pPars } // now store all anims in the scene - if( !mAnims.empty()) + if (!mAnims.empty()) { pScene->mNumAnimations = static_cast(mAnims.size()); pScene->mAnimations = new aiAnimation*[mAnims.size()]; - std::copy( mAnims.begin(), mAnims.end(), pScene->mAnimations); + std::copy(mAnims.begin(), mAnims.end(), pScene->mAnimations); } mAnims.clear(); @@ -1005,17 +1023,17 @@ void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pPars // ------------------------------------------------------------------------------------------------ // Constructs the animations for the given source anim -void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pParser, const Collada::Animation* pSrcAnim, const std::string &pPrefix) +void ColladaLoader::StoreAnimations(aiScene* pScene, const ColladaParser& pParser, const Collada::Animation* pSrcAnim, const std::string &pPrefix) { std::string animName = pPrefix.empty() ? pSrcAnim->mName : pPrefix + "_" + pSrcAnim->mName; // create nested animations, if given - for( std::vector::const_iterator it = pSrcAnim->mSubAnims.begin(); it != pSrcAnim->mSubAnims.end(); ++it) - StoreAnimations( pScene, pParser, *it, animName); + for (std::vector::const_iterator it = pSrcAnim->mSubAnims.begin(); it != pSrcAnim->mSubAnims.end(); ++it) + StoreAnimations(pScene, pParser, *it, animName); // create animation channels, if any - if( !pSrcAnim->mChannels.empty()) - CreateAnimation( pScene, pParser, pSrcAnim, animName); + if (!pSrcAnim->mChannels.empty()) + CreateAnimation(pScene, pParser, pSrcAnim, animName); } struct MorphTimeValues @@ -1056,7 +1074,8 @@ void insertMorphTimeValue(std::vector &values, float time, floa { values[i].mKeys.push_back(k); return; - } else if (time > values[i].mTime && time < values[i+1].mTime) + } + else if (time > values[i].mTime && time < values[i + 1].mTime) { MorphTimeValues val; val.mTime = time; @@ -1082,30 +1101,30 @@ float getWeightAtKey(const std::vector &values, int key, unsign // ------------------------------------------------------------------------------------------------ // Constructs the animation for the given source anim -void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pParser, const Collada::Animation* pSrcAnim, const std::string& pName) +void ColladaLoader::CreateAnimation(aiScene* pScene, const ColladaParser& pParser, const Collada::Animation* pSrcAnim, const std::string& pName) { // collect a list of animatable nodes std::vector nodes; - CollectNodes( pScene->mRootNode, nodes); + CollectNodes(pScene->mRootNode, nodes); std::vector anims; std::vector morphAnims; - for( std::vector::const_iterator nit = nodes.begin(); nit != nodes.end(); ++nit) + for (std::vector::const_iterator nit = nodes.begin(); nit != nodes.end(); ++nit) { // find all the collada anim channels which refer to the current node std::vector entries; std::string nodeName = (*nit)->mName.data; // find the collada node corresponding to the aiNode - const Collada::Node* srcNode = FindNode( pParser.mRootNode, nodeName); -// ai_assert( srcNode != NULL); - if( !srcNode) + const Collada::Node* srcNode = FindNode(pParser.mRootNode, nodeName); + // ai_assert( srcNode != NULL); + if (!srcNode) continue; // now check all channels if they affect the current node std::string targetID, subElement; - for( std::vector::const_iterator cit = pSrcAnim->mChannels.begin(); + for (std::vector::const_iterator cit = pSrcAnim->mChannels.begin(); cit != pSrcAnim->mChannels.end(); ++cit) { const Collada::AnimationChannel& srcChannel = *cit; @@ -1113,8 +1132,8 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars // we expect the animation target to be of type "nodeName/transformID.subElement". Ignore all others // find the slash that separates the node name - there should be only one - std::string::size_type slashPos = srcChannel.mTarget.find( '/'); - if( slashPos == std::string::npos) + std::string::size_type slashPos = srcChannel.mTarget.find('/'); + if (slashPos == std::string::npos) { std::string::size_type targetPos = srcChannel.mTarget.find(srcNode->mID); if (targetPos == std::string::npos) @@ -1123,44 +1142,45 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars // not node transform, but something else. store as unknown animation channel for now entry.mChannel = &(*cit); entry.mTargetId = srcChannel.mTarget.substr(targetPos + pSrcAnim->mName.length(), - srcChannel.mTarget.length() - targetPos - pSrcAnim->mName.length()); + srcChannel.mTarget.length() - targetPos - pSrcAnim->mName.length()); if (entry.mTargetId.front() == '-') entry.mTargetId = entry.mTargetId.substr(1); entries.push_back(entry); continue; } - if( srcChannel.mTarget.find( '/', slashPos+1) != std::string::npos) + if (srcChannel.mTarget.find('/', slashPos + 1) != std::string::npos) continue; targetID.clear(); - targetID = srcChannel.mTarget.substr( 0, slashPos); - if( targetID != srcNode->mID) + targetID = srcChannel.mTarget.substr(0, slashPos); + if (targetID != srcNode->mID) continue; // find the dot that separates the transformID - there should be only one or zero - std::string::size_type dotPos = srcChannel.mTarget.find( '.'); - if( dotPos != std::string::npos) + std::string::size_type dotPos = srcChannel.mTarget.find('.'); + if (dotPos != std::string::npos) { - if( srcChannel.mTarget.find( '.', dotPos+1) != std::string::npos) + if (srcChannel.mTarget.find('.', dotPos + 1) != std::string::npos) continue; - entry.mTransformId = srcChannel.mTarget.substr( slashPos+1, dotPos - slashPos - 1); + entry.mTransformId = srcChannel.mTarget.substr(slashPos + 1, dotPos - slashPos - 1); subElement.clear(); - subElement = srcChannel.mTarget.substr( dotPos+1); - if( subElement == "ANGLE") + subElement = srcChannel.mTarget.substr(dotPos + 1); + if (subElement == "ANGLE") entry.mSubElement = 3; // last number in an Axis-Angle-Transform is the angle - else if( subElement == "X") + else if (subElement == "X") entry.mSubElement = 0; - else if( subElement == "Y") + else if (subElement == "Y") entry.mSubElement = 1; - else if( subElement == "Z") + else if (subElement == "Z") entry.mSubElement = 2; else - ASSIMP_LOG_WARN_F( "Unknown anim subelement <", subElement, ">. Ignoring" ); - } else { + ASSIMP_LOG_WARN_F("Unknown anim subelement <", subElement, ">. Ignoring"); + } + else { // no subelement following, transformId is remaining string - entry.mTransformId = srcChannel.mTarget.substr( slashPos+1); + entry.mTransformId = srcChannel.mTarget.substr(slashPos + 1); } std::string::size_type bracketPos = srcChannel.mTarget.find('('); @@ -1206,194 +1226,196 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars // determine which transform step is affected by this channel entry.mTransformIndex = SIZE_MAX; - for( size_t a = 0; a < srcNode->mTransforms.size(); ++a) - if( srcNode->mTransforms[a].mID == entry.mTransformId) + for (size_t a = 0; a < srcNode->mTransforms.size(); ++a) + if (srcNode->mTransforms[a].mID == entry.mTransformId) entry.mTransformIndex = a; - if( entry.mTransformIndex == SIZE_MAX) + if (entry.mTransformIndex == SIZE_MAX) { if (entry.mTransformId.find("morph-weights") != std::string::npos) { entry.mTargetId = entry.mTransformId; entry.mTransformId = ""; - } else + } + else continue; } entry.mChannel = &(*cit); - entries.push_back( entry); + entries.push_back(entry); } // if there's no channel affecting the current node, we skip it - if( entries.empty()) + if (entries.empty()) continue; // resolve the data pointers for all anim channels. Find the minimum time while we're at it - ai_real startTime = ai_real( 1e20 ), endTime = ai_real( -1e20 ); - for( std::vector::iterator it = entries.begin(); it != entries.end(); ++it) + ai_real startTime = ai_real(1e20), endTime = ai_real(-1e20); + for (std::vector::iterator it = entries.begin(); it != entries.end(); ++it) { Collada::ChannelEntry& e = *it; - e.mTimeAccessor = &pParser.ResolveLibraryReference( pParser.mAccessorLibrary, e.mChannel->mSourceTimes); - e.mTimeData = &pParser.ResolveLibraryReference( pParser.mDataLibrary, e.mTimeAccessor->mSource); - e.mValueAccessor = &pParser.ResolveLibraryReference( pParser.mAccessorLibrary, e.mChannel->mSourceValues); - e.mValueData = &pParser.ResolveLibraryReference( pParser.mDataLibrary, e.mValueAccessor->mSource); + e.mTimeAccessor = &pParser.ResolveLibraryReference(pParser.mAccessorLibrary, e.mChannel->mSourceTimes); + e.mTimeData = &pParser.ResolveLibraryReference(pParser.mDataLibrary, e.mTimeAccessor->mSource); + e.mValueAccessor = &pParser.ResolveLibraryReference(pParser.mAccessorLibrary, e.mChannel->mSourceValues); + e.mValueData = &pParser.ResolveLibraryReference(pParser.mDataLibrary, e.mValueAccessor->mSource); // time count and value count must match - if( e.mTimeAccessor->mCount != e.mValueAccessor->mCount) - throw DeadlyImportError( format() << "Time count / value count mismatch in animation channel \"" << e.mChannel->mTarget << "\"." ); + if (e.mTimeAccessor->mCount != e.mValueAccessor->mCount) + throw DeadlyImportError(format() << "Time count / value count mismatch in animation channel \"" << e.mChannel->mTarget << "\"."); - if( e.mTimeAccessor->mCount > 0 ) - { - // find bounding times - startTime = std::min( startTime, ReadFloat( *e.mTimeAccessor, *e.mTimeData, 0, 0)); - endTime = std::max( endTime, ReadFloat( *e.mTimeAccessor, *e.mTimeData, e.mTimeAccessor->mCount-1, 0)); - } + if (e.mTimeAccessor->mCount > 0) + { + // find bounding times + startTime = std::min(startTime, ReadFloat(*e.mTimeAccessor, *e.mTimeData, 0, 0)); + endTime = std::max(endTime, ReadFloat(*e.mTimeAccessor, *e.mTimeData, e.mTimeAccessor->mCount - 1, 0)); + } } - std::vector resultTrafos; - if( !entries.empty() && entries.front().mTimeAccessor->mCount > 0 ) - { - // create a local transformation chain of the node's transforms - std::vector transforms = srcNode->mTransforms; + std::vector resultTrafos; + if (!entries.empty() && entries.front().mTimeAccessor->mCount > 0) + { + // create a local transformation chain of the node's transforms + std::vector transforms = srcNode->mTransforms; - // now for every unique point in time, find or interpolate the key values for that time - // and apply them to the transform chain. Then the node's present transformation can be calculated. - ai_real time = startTime; - while( 1) - { - for( std::vector::iterator it = entries.begin(); it != entries.end(); ++it) - { - Collada::ChannelEntry& e = *it; + // now for every unique point in time, find or interpolate the key values for that time + // and apply them to the transform chain. Then the node's present transformation can be calculated. + ai_real time = startTime; + while (1) + { + for (std::vector::iterator it = entries.begin(); it != entries.end(); ++it) + { + Collada::ChannelEntry& e = *it; - // find the keyframe behind the current point in time - size_t pos = 0; - ai_real postTime = 0.0; - while( 1) - { - if( pos >= e.mTimeAccessor->mCount) - break; - postTime = ReadFloat( *e.mTimeAccessor, *e.mTimeData, pos, 0); - if( postTime >= time) - break; - ++pos; - } + // find the keyframe behind the current point in time + size_t pos = 0; + ai_real postTime = 0.0; + while (1) + { + if (pos >= e.mTimeAccessor->mCount) + break; + postTime = ReadFloat(*e.mTimeAccessor, *e.mTimeData, pos, 0); + if (postTime >= time) + break; + ++pos; + } - pos = std::min( pos, e.mTimeAccessor->mCount-1); + pos = std::min(pos, e.mTimeAccessor->mCount - 1); - // read values from there - ai_real temp[16]; - for( size_t c = 0; c < e.mValueAccessor->mSize; ++c) - temp[c] = ReadFloat( *e.mValueAccessor, *e.mValueData, pos, c); + // read values from there + ai_real temp[16]; + for (size_t c = 0; c < e.mValueAccessor->mSize; ++c) + temp[c] = ReadFloat(*e.mValueAccessor, *e.mValueData, pos, c); - // if not exactly at the key time, interpolate with previous value set - if( postTime > time && pos > 0) - { - ai_real preTime = ReadFloat( *e.mTimeAccessor, *e.mTimeData, pos-1, 0); - ai_real factor = (time - postTime) / (preTime - postTime); + // if not exactly at the key time, interpolate with previous value set + if (postTime > time && pos > 0) + { + ai_real preTime = ReadFloat(*e.mTimeAccessor, *e.mTimeData, pos - 1, 0); + ai_real factor = (time - postTime) / (preTime - postTime); - for( size_t c = 0; c < e.mValueAccessor->mSize; ++c) - { - ai_real v = ReadFloat( *e.mValueAccessor, *e.mValueData, pos-1, c); - temp[c] += (v - temp[c]) * factor; - } - } + for (size_t c = 0; c < e.mValueAccessor->mSize; ++c) + { + ai_real v = ReadFloat(*e.mValueAccessor, *e.mValueData, pos - 1, c); + temp[c] += (v - temp[c]) * factor; + } + } - // Apply values to current transformation - std::copy( temp, temp + e.mValueAccessor->mSize, transforms[e.mTransformIndex].f + e.mSubElement); - } + // Apply values to current transformation + std::copy(temp, temp + e.mValueAccessor->mSize, transforms[e.mTransformIndex].f + e.mSubElement); + } - // Calculate resulting transformation - aiMatrix4x4 mat = pParser.CalculateResultTransform( transforms); + // Calculate resulting transformation + aiMatrix4x4 mat = pParser.CalculateResultTransform(transforms); - // out of laziness: we store the time in matrix.d4 - mat.d4 = time; - resultTrafos.push_back( mat); + // out of laziness: we store the time in matrix.d4 + mat.d4 = time; + resultTrafos.push_back(mat); - // find next point in time to evaluate. That's the closest frame larger than the current in any channel - ai_real nextTime = ai_real( 1e20 ); - for( std::vector::iterator it = entries.begin(); it != entries.end(); ++it) - { - Collada::ChannelEntry& channelElement = *it; + // find next point in time to evaluate. That's the closest frame larger than the current in any channel + ai_real nextTime = ai_real(1e20); + for (std::vector::iterator it = entries.begin(); it != entries.end(); ++it) + { + Collada::ChannelEntry& channelElement = *it; - // find the next time value larger than the current - size_t pos = 0; - while( pos < channelElement.mTimeAccessor->mCount) - { - const ai_real t = ReadFloat( *channelElement.mTimeAccessor, *channelElement.mTimeData, pos, 0); - if( t > time) - { - nextTime = std::min( nextTime, t); - break; - } - ++pos; - } + // find the next time value larger than the current + size_t pos = 0; + while (pos < channelElement.mTimeAccessor->mCount) + { + const ai_real t = ReadFloat(*channelElement.mTimeAccessor, *channelElement.mTimeData, pos, 0); + if (t > time) + { + nextTime = std::min(nextTime, t); + break; + } + ++pos; + } - // https://github.com/assimp/assimp/issues/458 - // Sub-sample axis-angle channels if the delta between two consecutive - // key-frame angles is >= 180 degrees. - if (transforms[channelElement.mTransformIndex].mType == Collada::TF_ROTATE && channelElement.mSubElement == 3 && pos > 0 && pos < channelElement.mTimeAccessor->mCount) { - const ai_real cur_key_angle = ReadFloat(*channelElement.mValueAccessor, *channelElement.mValueData, pos, 0); - const ai_real last_key_angle = ReadFloat(*channelElement.mValueAccessor, *channelElement.mValueData, pos - 1, 0); - const ai_real cur_key_time = ReadFloat(*channelElement.mTimeAccessor, *channelElement.mTimeData, pos, 0); - const ai_real last_key_time = ReadFloat(*channelElement.mTimeAccessor, *channelElement.mTimeData, pos - 1, 0); - const ai_real last_eval_angle = last_key_angle + (cur_key_angle - last_key_angle) * (time - last_key_time) / (cur_key_time - last_key_time); - const ai_real delta = std::abs(cur_key_angle - last_eval_angle); - if (delta >= 180.0) { - const int subSampleCount = static_cast(std::floor(delta / 90.0)); - if (cur_key_time != time) { - const ai_real nextSampleTime = time + (cur_key_time - time) / subSampleCount; - nextTime = std::min(nextTime, nextSampleTime); - } - } - } - } + // https://github.com/assimp/assimp/issues/458 + // Sub-sample axis-angle channels if the delta between two consecutive + // key-frame angles is >= 180 degrees. + if (transforms[channelElement.mTransformIndex].mType == Collada::TF_ROTATE && channelElement.mSubElement == 3 && pos > 0 && pos < channelElement.mTimeAccessor->mCount) { + const ai_real cur_key_angle = ReadFloat(*channelElement.mValueAccessor, *channelElement.mValueData, pos, 0); + const ai_real last_key_angle = ReadFloat(*channelElement.mValueAccessor, *channelElement.mValueData, pos - 1, 0); + const ai_real cur_key_time = ReadFloat(*channelElement.mTimeAccessor, *channelElement.mTimeData, pos, 0); + const ai_real last_key_time = ReadFloat(*channelElement.mTimeAccessor, *channelElement.mTimeData, pos - 1, 0); + const ai_real last_eval_angle = last_key_angle + (cur_key_angle - last_key_angle) * (time - last_key_time) / (cur_key_time - last_key_time); + const ai_real delta = std::abs(cur_key_angle - last_eval_angle); + if (delta >= 180.0) { + const int subSampleCount = static_cast(std::floor(delta / 90.0)); + if (cur_key_time != time) { + const ai_real nextSampleTime = time + (cur_key_time - time) / subSampleCount; + nextTime = std::min(nextTime, nextSampleTime); + } + } + } + } - // no more keys on any channel after the current time -> we're done - if( nextTime > 1e19) - break; + // no more keys on any channel after the current time -> we're done + if (nextTime > 1e19) + break; - // else construct next keyframe at this following time point - time = nextTime; - } - } + // else construct next keyframe at this following time point + time = nextTime; + } + } // there should be some keyframes, but we aren't that fixated on valid input data // ai_assert( resultTrafos.size() > 0); // build an animation channel for the given node out of these trafo keys - if( !resultTrafos.empty() ) + if (!resultTrafos.empty()) { - aiNodeAnim* dstAnim = new aiNodeAnim; - dstAnim->mNodeName = nodeName; - dstAnim->mNumPositionKeys = static_cast(resultTrafos.size()); - dstAnim->mNumRotationKeys = static_cast(resultTrafos.size()); - dstAnim->mNumScalingKeys = static_cast(resultTrafos.size()); - dstAnim->mPositionKeys = new aiVectorKey[resultTrafos.size()]; - dstAnim->mRotationKeys = new aiQuatKey[resultTrafos.size()]; - dstAnim->mScalingKeys = new aiVectorKey[resultTrafos.size()]; + aiNodeAnim* dstAnim = new aiNodeAnim; + dstAnim->mNodeName = nodeName; + dstAnim->mNumPositionKeys = static_cast(resultTrafos.size()); + dstAnim->mNumRotationKeys = static_cast(resultTrafos.size()); + dstAnim->mNumScalingKeys = static_cast(resultTrafos.size()); + dstAnim->mPositionKeys = new aiVectorKey[resultTrafos.size()]; + dstAnim->mRotationKeys = new aiQuatKey[resultTrafos.size()]; + dstAnim->mScalingKeys = new aiVectorKey[resultTrafos.size()]; - for( size_t a = 0; a < resultTrafos.size(); ++a) - { - aiMatrix4x4 mat = resultTrafos[a]; - double time = double( mat.d4); // remember? time is stored in mat.d4 - mat.d4 = 1.0f; + for (size_t a = 0; a < resultTrafos.size(); ++a) + { + aiMatrix4x4 mat = resultTrafos[a]; + double time = double(mat.d4); // remember? time is stored in mat.d4 + mat.d4 = 1.0f; - dstAnim->mPositionKeys[a].mTime = time; - dstAnim->mRotationKeys[a].mTime = time; - dstAnim->mScalingKeys[a].mTime = time; - mat.Decompose( dstAnim->mScalingKeys[a].mValue, dstAnim->mRotationKeys[a].mValue, dstAnim->mPositionKeys[a].mValue); - } + dstAnim->mPositionKeys[a].mTime = time; + dstAnim->mRotationKeys[a].mTime = time; + dstAnim->mScalingKeys[a].mTime = time; + mat.Decompose(dstAnim->mScalingKeys[a].mValue, dstAnim->mRotationKeys[a].mValue, dstAnim->mPositionKeys[a].mValue); + } - anims.push_back( dstAnim); - } else + anims.push_back(dstAnim); + } + else { - ASSIMP_LOG_WARN( "Collada loader: found empty animation channel, ignored. Please check your exporter."); + ASSIMP_LOG_WARN("Collada loader: found empty animation channel, ignored. Please check your exporter."); } - if( !entries.empty() && entries.front().mTimeAccessor->mCount > 0 ) + if (!entries.empty() && entries.front().mTimeAccessor->mCount > 0) { std::vector morphChannels; - for( std::vector::iterator it = entries.begin(); it != entries.end(); ++it) + for (std::vector::iterator it = entries.begin(); it != entries.end(); ++it) { Collada::ChannelEntry& e = *it; @@ -1416,7 +1438,7 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars std::vector morphTimeValues; int morphAnimChannelIndex = 0; - for( std::vector::iterator it = morphChannels.begin(); it != morphChannels.end(); ++it) + for (std::vector::iterator it = morphChannels.begin(); it != morphChannels.end(); ++it) { Collada::ChannelEntry& e = *it; std::string::size_type apos = e.mTargetId.find('('); @@ -1438,8 +1460,8 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars for (unsigned int key = 0; key < morphAnim->mNumKeys; key++) { morphAnim->mKeys[key].mNumValuesAndWeights = static_cast(morphChannels.size()); - morphAnim->mKeys[key].mValues = new unsigned int [morphChannels.size()]; - morphAnim->mKeys[key].mWeights = new double [morphChannels.size()]; + morphAnim->mKeys[key].mValues = new unsigned int[morphChannels.size()]; + morphAnim->mKeys[key].mWeights = new double[morphChannels.size()]; morphAnim->mKeys[key].mTime = morphTimeValues[key].mTime; for (unsigned int valueIndex = 0; valueIndex < morphChannels.size(); valueIndex++) @@ -1454,48 +1476,48 @@ void ColladaLoader::CreateAnimation( aiScene* pScene, const ColladaParser& pPars } } - if( !anims.empty() || !morphAnims.empty()) + if (!anims.empty() || !morphAnims.empty()) { aiAnimation* anim = new aiAnimation; - anim->mName.Set( pName); + anim->mName.Set(pName); anim->mNumChannels = static_cast(anims.size()); if (anim->mNumChannels > 0) { anim->mChannels = new aiNodeAnim*[anims.size()]; - std::copy( anims.begin(), anims.end(), anim->mChannels); + std::copy(anims.begin(), anims.end(), anim->mChannels); } anim->mNumMorphMeshChannels = static_cast(morphAnims.size()); if (anim->mNumMorphMeshChannels > 0) { anim->mMorphMeshChannels = new aiMeshMorphAnim*[anim->mNumMorphMeshChannels]; - std::copy( morphAnims.begin(), morphAnims.end(), anim->mMorphMeshChannels); + std::copy(morphAnims.begin(), morphAnims.end(), anim->mMorphMeshChannels); } anim->mDuration = 0.0f; - for( size_t a = 0; a < anims.size(); ++a) + for (size_t a = 0; a < anims.size(); ++a) { - anim->mDuration = std::max( anim->mDuration, anims[a]->mPositionKeys[anims[a]->mNumPositionKeys-1].mTime); - anim->mDuration = std::max( anim->mDuration, anims[a]->mRotationKeys[anims[a]->mNumRotationKeys-1].mTime); - anim->mDuration = std::max( anim->mDuration, anims[a]->mScalingKeys[anims[a]->mNumScalingKeys-1].mTime); + anim->mDuration = std::max(anim->mDuration, anims[a]->mPositionKeys[anims[a]->mNumPositionKeys - 1].mTime); + anim->mDuration = std::max(anim->mDuration, anims[a]->mRotationKeys[anims[a]->mNumRotationKeys - 1].mTime); + anim->mDuration = std::max(anim->mDuration, anims[a]->mScalingKeys[anims[a]->mNumScalingKeys - 1].mTime); } for (size_t a = 0; a < morphAnims.size(); ++a) { - anim->mDuration = std::max(anim->mDuration, morphAnims[a]->mKeys[morphAnims[a]->mNumKeys-1].mTime); + anim->mDuration = std::max(anim->mDuration, morphAnims[a]->mKeys[morphAnims[a]->mNumKeys - 1].mTime); } anim->mTicksPerSecond = 1; - mAnims.push_back( anim); + mAnims.push_back(anim); } } // ------------------------------------------------------------------------------------------------ // Add a texture to a material structure -void ColladaLoader::AddTexture ( aiMaterial& mat, const ColladaParser& pParser, +void ColladaLoader::AddTexture(aiMaterial& mat, const ColladaParser& pParser, const Collada::Effect& effect, const Collada::Sampler& sampler, aiTextureType type, unsigned int idx) { // first of all, basic file name - const aiString name = FindFilenameForEffectTexture( pParser, effect, sampler.mName ); - mat.AddProperty( &name, _AI_MATKEY_TEXTURE_BASE, type, idx ); + const aiString name = FindFilenameForEffectTexture(pParser, effect, sampler.mName); + mat.AddProperty(&name, _AI_MATKEY_TEXTURE_BASE, type, idx); // mapping mode int map = aiTextureMapMode_Clamp; @@ -1504,7 +1526,7 @@ void ColladaLoader::AddTexture ( aiMaterial& mat, const ColladaParser& pParser, if (sampler.mWrapU && sampler.mMirrorU) map = aiTextureMapMode_Mirror; - mat.AddProperty( &map, 1, _AI_MATKEY_MAPPINGMODE_U_BASE, type, idx); + mat.AddProperty(&map, 1, _AI_MATKEY_MAPPINGMODE_U_BASE, type, idx); map = aiTextureMapMode_Clamp; if (sampler.mWrapV) @@ -1512,18 +1534,18 @@ void ColladaLoader::AddTexture ( aiMaterial& mat, const ColladaParser& pParser, if (sampler.mWrapV && sampler.mMirrorV) map = aiTextureMapMode_Mirror; - mat.AddProperty( &map, 1, _AI_MATKEY_MAPPINGMODE_V_BASE, type, idx); + mat.AddProperty(&map, 1, _AI_MATKEY_MAPPINGMODE_V_BASE, type, idx); // UV transformation mat.AddProperty(&sampler.mTransform, 1, _AI_MATKEY_UVTRANSFORM_BASE, type, idx); // Blend mode - mat.AddProperty((int*)&sampler.mOp , 1, + mat.AddProperty((int*)&sampler.mOp, 1, _AI_MATKEY_TEXBLEND_BASE, type, idx); // Blend factor - mat.AddProperty((ai_real*)&sampler.mWeighting , 1, + mat.AddProperty((ai_real*)&sampler.mWeighting, 1, _AI_MATKEY_TEXBLEND_BASE, type, idx); // UV source index ... if we didn't resolve the mapping, it is actually just @@ -1535,7 +1557,7 @@ void ColladaLoader::AddTexture ( aiMaterial& mat, const ColladaParser& pParser, map = sampler.mUVId; else { map = -1; - for (std::string::const_iterator it = sampler.mUVChannel.begin();it != sampler.mUVChannel.end(); ++it){ + for (std::string::const_iterator it = sampler.mUVChannel.begin(); it != sampler.mUVChannel.end(); ++it) { if (IsNumeric(*it)) { map = strtoul10(&(*it)); break; @@ -1546,12 +1568,12 @@ void ColladaLoader::AddTexture ( aiMaterial& mat, const ColladaParser& pParser, map = 0; } } - mat.AddProperty(&map,1,_AI_MATKEY_UVWSRC_BASE,type,idx); + mat.AddProperty(&map, 1, _AI_MATKEY_UVWSRC_BASE, type, idx); } // ------------------------------------------------------------------------------------------------ // Fills materials from the collada material definitions -void ColladaLoader::FillMaterials( const ColladaParser& pParser, aiScene* /*pScene*/) +void ColladaLoader::FillMaterials(const ColladaParser& pParser, aiScene* /*pScene*/) { for (auto &elem : newMats) { @@ -1563,7 +1585,7 @@ void ColladaLoader::FillMaterials( const ColladaParser& pParser, aiScene* /*pSce if (effect.mFaceted) /* fixme */ shadeMode = aiShadingMode_Flat; else { - switch( effect.mShadeType) + switch (effect.mShadeType) { case Collada::Shade_Constant: shadeMode = aiShadingMode_NoShading; @@ -1584,56 +1606,57 @@ void ColladaLoader::FillMaterials( const ColladaParser& pParser, aiScene* /*pSce break; } } - mat.AddProperty( &shadeMode, 1, AI_MATKEY_SHADING_MODEL); + mat.AddProperty(&shadeMode, 1, AI_MATKEY_SHADING_MODEL); // double-sided? shadeMode = effect.mDoubleSided; - mat.AddProperty( &shadeMode, 1, AI_MATKEY_TWOSIDED); + mat.AddProperty(&shadeMode, 1, AI_MATKEY_TWOSIDED); // wireframe? shadeMode = effect.mWireframe; - mat.AddProperty( &shadeMode, 1, AI_MATKEY_ENABLE_WIREFRAME); + mat.AddProperty(&shadeMode, 1, AI_MATKEY_ENABLE_WIREFRAME); // add material colors - mat.AddProperty( &effect.mAmbient, 1,AI_MATKEY_COLOR_AMBIENT); - mat.AddProperty( &effect.mDiffuse, 1, AI_MATKEY_COLOR_DIFFUSE); - mat.AddProperty( &effect.mSpecular, 1,AI_MATKEY_COLOR_SPECULAR); - mat.AddProperty( &effect.mEmissive, 1, AI_MATKEY_COLOR_EMISSIVE); - mat.AddProperty( &effect.mReflective, 1, AI_MATKEY_COLOR_REFLECTIVE); + mat.AddProperty(&effect.mAmbient, 1, AI_MATKEY_COLOR_AMBIENT); + mat.AddProperty(&effect.mDiffuse, 1, AI_MATKEY_COLOR_DIFFUSE); + mat.AddProperty(&effect.mSpecular, 1, AI_MATKEY_COLOR_SPECULAR); + mat.AddProperty(&effect.mEmissive, 1, AI_MATKEY_COLOR_EMISSIVE); + mat.AddProperty(&effect.mReflective, 1, AI_MATKEY_COLOR_REFLECTIVE); // scalar properties - mat.AddProperty( &effect.mShininess, 1, AI_MATKEY_SHININESS); - mat.AddProperty( &effect.mReflectivity, 1, AI_MATKEY_REFLECTIVITY); - mat.AddProperty( &effect.mRefractIndex, 1, AI_MATKEY_REFRACTI); + mat.AddProperty(&effect.mShininess, 1, AI_MATKEY_SHININESS); + mat.AddProperty(&effect.mReflectivity, 1, AI_MATKEY_REFLECTIVITY); + mat.AddProperty(&effect.mRefractIndex, 1, AI_MATKEY_REFRACTI); // transparency, a very hard one. seemingly not all files are following the // specification here (1.0 transparency => completely opaque)... // therefore, we let the opportunity for the user to manually invert // the transparency if necessary and we add preliminary support for RGB_ZERO mode - if(effect.mTransparency >= 0.f && effect.mTransparency <= 1.f) { + if (effect.mTransparency >= 0.f && effect.mTransparency <= 1.f) { // handle RGB transparency completely, cf Collada specs 1.5.0 pages 249 and 304 - if(effect.mRGBTransparency) { - // use luminance as defined by ISO/CIE color standards (see ITU-R Recommendation BT.709-4) + if (effect.mRGBTransparency) { + // use luminance as defined by ISO/CIE color standards (see ITU-R Recommendation BT.709-4) effect.mTransparency *= ( 0.212671f * effect.mTransparent.r + 0.715160f * effect.mTransparent.g + 0.072169f * effect.mTransparent.b - ); + ); effect.mTransparent.a = 1.f; - mat.AddProperty( &effect.mTransparent, 1, AI_MATKEY_COLOR_TRANSPARENT ); - } else { - effect.mTransparency *= effect.mTransparent.a; + mat.AddProperty(&effect.mTransparent, 1, AI_MATKEY_COLOR_TRANSPARENT); + } + else { + effect.mTransparency *= effect.mTransparent.a; } - if(effect.mInvertTransparency) { + if (effect.mInvertTransparency) { effect.mTransparency = 1.f - effect.mTransparency; } // Is the material finally transparent ? if (effect.mHasTransparency || effect.mTransparency < 1.f) { - mat.AddProperty( &effect.mTransparency, 1, AI_MATKEY_OPACITY ); + mat.AddProperty(&effect.mTransparency, 1, AI_MATKEY_OPACITY); } } @@ -1643,87 +1666,87 @@ void ColladaLoader::FillMaterials( const ColladaParser& pParser, aiScene* /*pSce AddTexture(mat, pParser, effect, effect.mTexAmbient, aiTextureType_LIGHTMAP); } - if( !effect.mTexEmissive.mName.empty()) - AddTexture( mat, pParser, effect, effect.mTexEmissive, aiTextureType_EMISSIVE); + if (!effect.mTexEmissive.mName.empty()) + AddTexture(mat, pParser, effect, effect.mTexEmissive, aiTextureType_EMISSIVE); - if( !effect.mTexSpecular.mName.empty()) - AddTexture( mat, pParser, effect, effect.mTexSpecular, aiTextureType_SPECULAR); + if (!effect.mTexSpecular.mName.empty()) + AddTexture(mat, pParser, effect, effect.mTexSpecular, aiTextureType_SPECULAR); - if( !effect.mTexDiffuse.mName.empty()) - AddTexture( mat, pParser, effect, effect.mTexDiffuse, aiTextureType_DIFFUSE); + if (!effect.mTexDiffuse.mName.empty()) + AddTexture(mat, pParser, effect, effect.mTexDiffuse, aiTextureType_DIFFUSE); - if( !effect.mTexBump.mName.empty()) - AddTexture( mat, pParser, effect, effect.mTexBump, aiTextureType_NORMALS); + if (!effect.mTexBump.mName.empty()) + AddTexture(mat, pParser, effect, effect.mTexBump, aiTextureType_NORMALS); - if( !effect.mTexTransparent.mName.empty()) - AddTexture( mat, pParser, effect, effect.mTexTransparent, aiTextureType_OPACITY); + if (!effect.mTexTransparent.mName.empty()) + AddTexture(mat, pParser, effect, effect.mTexTransparent, aiTextureType_OPACITY); - if( !effect.mTexReflective.mName.empty()) - AddTexture( mat, pParser, effect, effect.mTexReflective, aiTextureType_REFLECTION); + if (!effect.mTexReflective.mName.empty()) + AddTexture(mat, pParser, effect, effect.mTexReflective, aiTextureType_REFLECTION); } } // ------------------------------------------------------------------------------------------------ // Constructs materials from the collada material definitions -void ColladaLoader::BuildMaterials( ColladaParser& pParser, aiScene* /*pScene*/) +void ColladaLoader::BuildMaterials(ColladaParser& pParser, aiScene* /*pScene*/) { newMats.reserve(pParser.mMaterialLibrary.size()); - for( ColladaParser::MaterialLibrary::const_iterator matIt = pParser.mMaterialLibrary.begin(); + for (ColladaParser::MaterialLibrary::const_iterator matIt = pParser.mMaterialLibrary.begin(); matIt != pParser.mMaterialLibrary.end(); ++matIt) { const Collada::Material& material = matIt->second; // a material is only a reference to an effect - ColladaParser::EffectLibrary::iterator effIt = pParser.mEffectLibrary.find( material.mEffect); - if( effIt == pParser.mEffectLibrary.end()) + ColladaParser::EffectLibrary::iterator effIt = pParser.mEffectLibrary.find(material.mEffect); + if (effIt == pParser.mEffectLibrary.end()) continue; Collada::Effect& effect = effIt->second; // create material aiMaterial* mat = new aiMaterial; - aiString name( material.mName.empty() ? matIt->first : material.mName ); - mat->AddProperty(&name,AI_MATKEY_NAME); + aiString name(material.mName.empty() ? matIt->first : material.mName); + mat->AddProperty(&name, AI_MATKEY_NAME); // store the material mMaterialIndexByName[matIt->first] = newMats.size(); - newMats.push_back( std::pair( &effect,mat) ); + newMats.push_back(std::pair(&effect, mat)); } // ScenePreprocessor generates a default material automatically if none is there. // All further code here in this loader works well without a valid material so // we can safely let it to ScenePreprocessor. #if 0 - if( newMats.size() == 0) + if (newMats.size() == 0) { aiMaterial* mat = new aiMaterial; - aiString name( AI_DEFAULT_MATERIAL_NAME ); - mat->AddProperty( &name, AI_MATKEY_NAME); + aiString name(AI_DEFAULT_MATERIAL_NAME); + mat->AddProperty(&name, AI_MATKEY_NAME); const int shadeMode = aiShadingMode_Phong; - mat->AddProperty( &shadeMode, 1, AI_MATKEY_SHADING_MODEL); - aiColor4D colAmbient( 0.2, 0.2, 0.2, 1.0), colDiffuse( 0.8, 0.8, 0.8, 1.0), colSpecular( 0.5, 0.5, 0.5, 0.5); - mat->AddProperty( &colAmbient, 1, AI_MATKEY_COLOR_AMBIENT); - mat->AddProperty( &colDiffuse, 1, AI_MATKEY_COLOR_DIFFUSE); - mat->AddProperty( &colSpecular, 1, AI_MATKEY_COLOR_SPECULAR); + mat->AddProperty(&shadeMode, 1, AI_MATKEY_SHADING_MODEL); + aiColor4D colAmbient(0.2, 0.2, 0.2, 1.0), colDiffuse(0.8, 0.8, 0.8, 1.0), colSpecular(0.5, 0.5, 0.5, 0.5); + mat->AddProperty(&colAmbient, 1, AI_MATKEY_COLOR_AMBIENT); + mat->AddProperty(&colDiffuse, 1, AI_MATKEY_COLOR_DIFFUSE); + mat->AddProperty(&colSpecular, 1, AI_MATKEY_COLOR_SPECULAR); const ai_real specExp = 5.0; - mat->AddProperty( &specExp, 1, AI_MATKEY_SHININESS); + mat->AddProperty(&specExp, 1, AI_MATKEY_SHININESS); } #endif } // ------------------------------------------------------------------------------------------------ // Resolves the texture name for the given effect texture entry -aiString ColladaLoader::FindFilenameForEffectTexture( const ColladaParser& pParser, +aiString ColladaLoader::FindFilenameForEffectTexture(const ColladaParser& pParser, const Collada::Effect& pEffect, const std::string& pName) { aiString result; // recurse through the param references until we end up at an image std::string name = pName; - while( 1) + while (1) { // the given string is a param entry. Find it - Collada::Effect::ParamLibrary::const_iterator it = pEffect.mParams.find( name); + Collada::Effect::ParamLibrary::const_iterator it = pEffect.mParams.find(name); // if not found, we're at the end of the recursion. The resulting string should be the image ID - if( it == pEffect.mParams.end()) + if (it == pEffect.mParams.end()) break; // else recurse on @@ -1731,8 +1754,8 @@ aiString ColladaLoader::FindFilenameForEffectTexture( const ColladaParser& pPars } // find the image referred by this name in the image library of the scene - ColladaParser::ImageLibrary::const_iterator imIt = pParser.mImageLibrary.find( name); - if( imIt == pParser.mImageLibrary.end()) + ColladaParser::ImageLibrary::const_iterator imIt = pParser.mImageLibrary.find(name); + if (imIt == pParser.mImageLibrary.end()) { ASSIMP_LOG_WARN_F("Collada: Unable to resolve effect texture entry \"", pName, "\", ended up at ID \"", name, "\"."); @@ -1745,7 +1768,7 @@ aiString ColladaLoader::FindFilenameForEffectTexture( const ColladaParser& pPars // if this is an embedded texture image setup an aiTexture for it if (imIt->second.mFileName.empty()) { - if (imIt->second.mImageData.empty()) { + if (imIt->second.mImageData.empty()) { throw DeadlyImportError("Collada: Invalid texture, no data or file reference given"); } @@ -1755,13 +1778,13 @@ aiString ColladaLoader::FindFilenameForEffectTexture( const ColladaParser& pPars if (imIt->second.mEmbeddedFormat.length() > 3) { ASSIMP_LOG_WARN("Collada: texture format hint is too long, truncating to 3 characters"); } - strncpy(tex->achFormatHint,imIt->second.mEmbeddedFormat.c_str(),3); + strncpy(tex->achFormatHint, imIt->second.mEmbeddedFormat.c_str(), 3); // and copy texture data tex->mHeight = 0; tex->mWidth = static_cast(imIt->second.mImageData.size()); tex->pcData = (aiTexel*)new char[tex->mWidth]; - memcpy(tex->pcData,&imIt->second.mImageData[0],tex->mWidth); + memcpy(tex->pcData, &imIt->second.mImageData[0], tex->mWidth); // TODO: check the possibility of using the flag "AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING" // In FBX files textures are now stored internally by Assimp with their filename included @@ -1770,14 +1793,14 @@ aiString ColladaLoader::FindFilenameForEffectTexture( const ColladaParser& pPars // This may occur on this case too, it has to be studied // setup texture reference string result.data[0] = '*'; - result.length = 1 + ASSIMP_itoa10(result.data+1,static_cast(MAXLEN-1),static_cast(mTextures.size())); + result.length = 1 + ASSIMP_itoa10(result.data + 1, static_cast(MAXLEN - 1), static_cast(mTextures.size())); // and add this texture to the list mTextures.push_back(tex); } else { - result.Set( imIt->second.mFileName ); + result.Set(imIt->second.mFileName); ConvertPath(result); } return result; @@ -1785,77 +1808,78 @@ aiString ColladaLoader::FindFilenameForEffectTexture( const ColladaParser& pPars // ------------------------------------------------------------------------------------------------ // Convert a path read from a collada file to the usual representation -void ColladaLoader::ConvertPath (aiString& ss) +void ColladaLoader::ConvertPath(aiString& ss) { // TODO: collada spec, p 22. Handle URI correctly. // For the moment we're just stripping the file:// away to make it work. // Windows doesn't seem to be able to find stuff like // 'file://..\LWO\LWO2\MappingModes\earthSpherical.jpg' - if (0 == strncmp(ss.data,"file://",7)) + if (0 == strncmp(ss.data, "file://", 7)) { ss.length -= 7; - memmove(ss.data,ss.data+7,ss.length); + memmove(ss.data, ss.data + 7, ss.length); ss.data[ss.length] = '\0'; } - // Maxon Cinema Collada Export writes "file:///C:\andsoon" with three slashes... - // I need to filter it without destroying linux paths starting with "/somewhere" + // Maxon Cinema Collada Export writes "file:///C:\andsoon" with three slashes... + // I need to filter it without destroying linux paths starting with "/somewhere" #if defined( _MSC_VER ) - if( ss.data[0] == '/' && isalpha( (unsigned char) ss.data[1]) && ss.data[2] == ':' ) { + if (ss.data[0] == '/' && isalpha((unsigned char)ss.data[1]) && ss.data[2] == ':') { #else - if (ss.data[ 0 ] == '/' && isalpha( ss.data[ 1 ] ) && ss.data[ 2 ] == ':') { + if (ss.data[0] == '/' && isalpha(ss.data[1]) && ss.data[2] == ':') { #endif - --ss.length; - ::memmove( ss.data, ss.data+1, ss.length); - ss.data[ss.length] = 0; - } - - // find and convert all %xy special chars - char* out = ss.data; - for( const char* it = ss.data; it != ss.data + ss.length; /**/ ) - { - if( *it == '%' && (it + 3) < ss.data + ss.length ) - { - // separate the number to avoid dragging in chars from behind into the parsing - char mychar[3] = { it[1], it[2], 0 }; - size_t nbr = strtoul16( mychar); - it += 3; - *out++ = (char)(nbr & 0xFF); - } else - { - *out++ = *it++; + --ss.length; + ::memmove(ss.data, ss.data + 1, ss.length); + ss.data[ss.length] = 0; } - } - // adjust length and terminator of the shortened string - *out = 0; - ss.length = (ptrdiff_t) (out - ss.data); + // find and convert all %xy special chars + char* out = ss.data; + for (const char* it = ss.data; it != ss.data + ss.length; /**/) + { + if (*it == '%' && (it + 3) < ss.data + ss.length) + { + // separate the number to avoid dragging in chars from behind into the parsing + char mychar[3] = { it[1], it[2], 0 }; + size_t nbr = strtoul16(mychar); + it += 3; + *out++ = (char)(nbr & 0xFF); + } + else + { + *out++ = *it++; + } + } + + // adjust length and terminator of the shortened string + *out = 0; + ss.length = (ptrdiff_t)(out - ss.data); } // ------------------------------------------------------------------------------------------------ // Reads a float value from an accessor and its data array. -ai_real ColladaLoader::ReadFloat( const Collada::Accessor& pAccessor, const Collada::Data& pData, size_t pIndex, size_t pOffset) const +ai_real ColladaLoader::ReadFloat(const Collada::Accessor& pAccessor, const Collada::Data& pData, size_t pIndex, size_t pOffset) const { // FIXME: (thom) Test for data type here in every access? For the moment, I leave this to the caller size_t pos = pAccessor.mStride * pIndex + pAccessor.mOffset + pOffset; - ai_assert( pos < pData.mValues.size()); + ai_assert(pos < pData.mValues.size()); return pData.mValues[pos]; } // ------------------------------------------------------------------------------------------------ // Reads a string value from an accessor and its data array. -const std::string& ColladaLoader::ReadString( const Collada::Accessor& pAccessor, const Collada::Data& pData, size_t pIndex) const +const std::string& ColladaLoader::ReadString(const Collada::Accessor& pAccessor, const Collada::Data& pData, size_t pIndex) const { size_t pos = pAccessor.mStride * pIndex + pAccessor.mOffset; - ai_assert( pos < pData.mStrings.size()); + ai_assert(pos < pData.mStrings.size()); return pData.mStrings[pos]; } // ------------------------------------------------------------------------------------------------ // Collects all nodes into the given array -void ColladaLoader::CollectNodes( const aiNode* pNode, std::vector& poNodes) const +void ColladaLoader::CollectNodes(const aiNode* pNode, std::vector& poNodes) const { - poNodes.push_back( pNode); + poNodes.push_back(pNode); for (size_t a = 0; a < pNode->mNumChildren; ++a) { CollectNodes(pNode->mChildren[a], poNodes); } @@ -1863,15 +1887,15 @@ void ColladaLoader::CollectNodes( const aiNode* pNode, std::vectormName == pName || pNode->mID == pName) + if (pNode->mName == pName || pNode->mID == pName) return pNode; - for( size_t a = 0; a < pNode->mChildren.size(); ++a) + for (size_t a = 0; a < pNode->mChildren.size(); ++a) { - const Collada::Node* node = FindNode( pNode->mChildren[a], pName); - if( node) + const Collada::Node* node = FindNode(pNode->mChildren[a], pName); + if (node) return node; } @@ -1880,32 +1904,33 @@ const Collada::Node* ColladaLoader::FindNode( const Collada::Node* pNode, const // ------------------------------------------------------------------------------------------------ // Finds a node in the collada scene by the given SID -const Collada::Node* ColladaLoader::FindNodeBySID( const Collada::Node* pNode, const std::string& pSID) const +const Collada::Node* ColladaLoader::FindNodeBySID(const Collada::Node* pNode, const std::string& pSID) const { - if( pNode->mSID == pSID) - return pNode; + if (pNode->mSID == pSID) + return pNode; - for( size_t a = 0; a < pNode->mChildren.size(); ++a) - { - const Collada::Node* node = FindNodeBySID( pNode->mChildren[a], pSID); - if( node) - return node; - } + for (size_t a = 0; a < pNode->mChildren.size(); ++a) + { + const Collada::Node* node = FindNodeBySID(pNode->mChildren[a], pSID); + if (node) + return node; + } - return NULL; + return NULL; } // ------------------------------------------------------------------------------------------------ // Finds a proper unique name for a node derived from the collada-node's properties. // The name must be unique for proper node-bone association. -std::string ColladaLoader::FindNameForNode( const Collada::Node* pNode) +std::string ColladaLoader::FindNameForNode(const Collada::Node* pNode) { // If explicitly requested, just use the collada name. if (useColladaName) { if (!pNode->mName.empty()) { return pNode->mName; - } else { + } + else { return format() << "$ColladaAutoName$_" << mNodeNameCounter++; } } diff --git a/code/Collada/ColladaLoader.h b/code/Collada/ColladaLoader.h index 72c2dd8e7..ad606ea74 100644 --- a/code/Collada/ColladaLoader.h +++ b/code/Collada/ColladaLoader.h @@ -94,7 +94,7 @@ public: public: /** Returns whether the class can handle the format of the given file. * See BaseImporter::CanRead() for details. */ - bool CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const; + bool CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const override; protected: /** Return importer meta information. diff --git a/code/Collada/ColladaParser.cpp b/code/Collada/ColladaParser.cpp index 860ae2ae9..560c0cc9d 100644 --- a/code/Collada/ColladaParser.cpp +++ b/code/Collada/ColladaParser.cpp @@ -57,6 +57,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include @@ -66,9 +67,9 @@ using namespace Assimp::Formatter; // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer -ColladaParser::ColladaParser( IOSystem* pIOHandler, const std::string& pFile) - : mFileName( pFile ) - , mReader( nullptr ) +ColladaParser::ColladaParser(IOSystem* pIOHandler, const std::string& pFile) + : mFileName(pFile) + , mReader(nullptr) , mDataLibrary() , mAccessorLibrary() , mMeshLibrary() @@ -79,32 +80,60 @@ ColladaParser::ColladaParser( IOSystem* pIOHandler, const std::string& pFile) , mLightLibrary() , mCameraLibrary() , mControllerLibrary() - , mRootNode( nullptr ) + , mRootNode(nullptr) , mAnims() - , mUnitSize( 1.0f ) - , mUpDirection( UP_Y ) - , mFormat(FV_1_5_n ) // We assume the newest file format by default + , mUnitSize(1.0f) + , mUpDirection(UP_Y) + , mFormat(FV_1_5_n) // We assume the newest file format by default { // validate io-handler instance - if (nullptr == pIOHandler ) { - throw DeadlyImportError("IOSystem is NULL." ); + if (nullptr == pIOHandler) { + throw DeadlyImportError("IOSystem is NULL."); } - // open the file - std::unique_ptr file( pIOHandler->Open(pFile ) ); - if (file.get() == nullptr) { - throw DeadlyImportError( "Failed to open file " + pFile + "." ); + std::unique_ptr daefile; + std::unique_ptr zip_archive; + + // Determine type + std::string extension = BaseImporter::GetExtension(pFile); + if (extension != "dae") { + zip_archive.reset(new ZipArchiveIOSystem(pIOHandler, pFile)); + } + + if (zip_archive && zip_archive->isOpen()) { + std::string dae_filename = ReadZaeManifest(*zip_archive); + + if (dae_filename.empty()) { + ThrowException(std::string("Invalid ZAE")); + } + + daefile.reset(zip_archive->Open(dae_filename.c_str())); + if (daefile == nullptr) { + ThrowException(std::string("Invalid ZAE manifest: '") + std::string(dae_filename) + std::string("' is missing")); + } + } + else { + // attempt to open the file directly + daefile.reset(pIOHandler->Open(pFile)); + if (daefile.get() == nullptr) { + throw DeadlyImportError("Failed to open file '" + pFile + "'."); + } } // generate a XML reader for it - std::unique_ptr mIOWrapper(new CIrrXML_IOStreamReader(file.get())); - mReader = irr::io::createIrrXMLReader( mIOWrapper.get()); + std::unique_ptr mIOWrapper(new CIrrXML_IOStreamReader(daefile.get())); + mReader = irr::io::createIrrXMLReader(mIOWrapper.get()); if (!mReader) { - ThrowException("Collada: Unable to open file."); + ThrowException("Unable to read file, malformed XML"); } // start reading ReadContents(); + + // read embedded textures + if (zip_archive && zip_archive->isOpen()) { + // TODO + } } // ------------------------------------------------------------------------------------------------ @@ -112,18 +141,61 @@ ColladaParser::ColladaParser( IOSystem* pIOHandler, const std::string& pFile) ColladaParser::~ColladaParser() { delete mReader; - for( NodeLibrary::iterator it = mNodeLibrary.begin(); it != mNodeLibrary.end(); ++it) + for (NodeLibrary::iterator it = mNodeLibrary.begin(); it != mNodeLibrary.end(); ++it) delete it->second; - for( MeshLibrary::iterator it = mMeshLibrary.begin(); it != mMeshLibrary.end(); ++it) + for (MeshLibrary::iterator it = mMeshLibrary.begin(); it != mMeshLibrary.end(); ++it) delete it->second; } +// ------------------------------------------------------------------------------------------------ +// Read a ZAE manifest and return the filename to attempt to open +std::string ColladaParser::ReadZaeManifest(ZipArchiveIOSystem &zip_archive) { + // Open the manifest + std::unique_ptr manifestfile(zip_archive.Open("manifest.xml")); + if (manifestfile == nullptr) + { + // No manifest, hope there is only one .DAE inside + std::vector file_list; + zip_archive.getFileListExtension(file_list, "dae"); + + if (file_list.empty()) + return std::string(); + + return file_list.front(); + } + + std::unique_ptr mIOWrapper(new CIrrXML_IOStreamReader(manifestfile.get())); + irr::io::IrrXMLReader* manifest_reader = irr::io::createIrrXMLReader(mIOWrapper.get()); + + while (manifest_reader->read()) + { + // find the manifest "dae_root" element + if (manifest_reader->getNodeType() == irr::io::EXN_ELEMENT) + { + if (::strcmp(manifest_reader->getNodeName(), "dae_root") == 0) + { + if (!manifest_reader->read()) + return std::string(); + if (manifest_reader->getNodeType() != irr::io::EXN_TEXT && manifest_reader->getNodeType() != irr::io::EXN_CDATA) + return std::string(); + + const char* filepath = manifest_reader->getNodeData(); + if (filepath == nullptr) + return std::string(); + + return std::string(filepath); + } + } + } + return std::string(); +} + // ------------------------------------------------------------------------------------------------ // Read bool from text contents of current element bool ColladaParser::ReadBoolFromTextContent() { const char* cur = GetTextContent(); - return (!ASSIMP_strincmp(cur,"true",4) || '0' != *cur); + return (!ASSIMP_strincmp(cur, "true", 4) || '0' != *cur); } // ------------------------------------------------------------------------------------------------ @@ -138,39 +210,41 @@ ai_real ColladaParser::ReadFloatFromTextContent() // Reads the contents of the file void ColladaParser::ReadContents() { - while( mReader->read()) + while (mReader->read()) { // handle the root element "COLLADA" - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "COLLADA")) + if (IsElement("COLLADA")) { // check for 'version' attribute const int attrib = TestAttribute("version"); if (attrib != -1) { const char* version = mReader->getAttributeValue(attrib); - if (!::strncmp(version,"1.5",3)) { - mFormat = FV_1_5_n; + if (!::strncmp(version, "1.5", 3)) { + mFormat = FV_1_5_n; ASSIMP_LOG_DEBUG("Collada schema version is 1.5.n"); } - else if (!::strncmp(version,"1.4",3)) { - mFormat = FV_1_4_n; + else if (!::strncmp(version, "1.4", 3)) { + mFormat = FV_1_4_n; ASSIMP_LOG_DEBUG("Collada schema version is 1.4.n"); } - else if (!::strncmp(version,"1.3",3)) { - mFormat = FV_1_3_n; + else if (!::strncmp(version, "1.3", 3)) { + mFormat = FV_1_3_n; ASSIMP_LOG_DEBUG("Collada schema version is 1.3.n"); } } ReadStructure(); - } else + } + else { - ASSIMP_LOG_DEBUG_F( "Ignoring global element <", mReader->getNodeName(), ">." ); + ASSIMP_LOG_DEBUG_F("Ignoring global element <", mReader->getNodeName(), ">."); SkipElement(); } - } else + } + else { // skip everything else silently } @@ -181,47 +255,47 @@ void ColladaParser::ReadContents() // Reads the structure of the file void ColladaParser::ReadStructure() { - while( mReader->read()) + while (mReader->read()) { // beginning of elements - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "asset")) + if (IsElement("asset")) ReadAssetInfo(); - else if( IsElement( "library_animations")) + else if (IsElement("library_animations")) ReadAnimationLibrary(); - else if (IsElement("library_animation_clips")) - ReadAnimationClipLibrary(); - else if( IsElement( "library_controllers")) + else if (IsElement("library_animation_clips")) + ReadAnimationClipLibrary(); + else if (IsElement("library_controllers")) ReadControllerLibrary(); - else if( IsElement( "library_images")) + else if (IsElement("library_images")) ReadImageLibrary(); - else if( IsElement( "library_materials")) + else if (IsElement("library_materials")) ReadMaterialLibrary(); - else if( IsElement( "library_effects")) + else if (IsElement("library_effects")) ReadEffectLibrary(); - else if( IsElement( "library_geometries")) + else if (IsElement("library_geometries")) ReadGeometryLibrary(); - else if( IsElement( "library_visual_scenes")) + else if (IsElement("library_visual_scenes")) ReadSceneLibrary(); - else if( IsElement( "library_lights")) + else if (IsElement("library_lights")) ReadLightLibrary(); - else if( IsElement( "library_cameras")) + else if (IsElement("library_cameras")) ReadCameraLibrary(); - else if( IsElement( "library_nodes")) + else if (IsElement("library_nodes")) ReadSceneNode(NULL); /* some hacking to reuse this piece of code */ - else if( IsElement( "scene")) + else if (IsElement("scene")) ReadScene(); else SkipElement(); } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { break; } } - PostProcessRootAnimations(); + PostProcessRootAnimations(); PostProcessControllers(); } @@ -229,43 +303,43 @@ void ColladaParser::ReadStructure() // Reads asset information such as coordinate system information and legal blah void ColladaParser::ReadAssetInfo() { - if( mReader->isEmptyElement()) + if (mReader->isEmptyElement()) return; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "unit")) + if (IsElement("unit")) { // read unit data from the element's attributes - const int attrIndex = TestAttribute( "meter"); + const int attrIndex = TestAttribute("meter"); if (attrIndex == -1) { mUnitSize = 1.f; } else { - mUnitSize = mReader->getAttributeValueAsFloat( attrIndex); + mUnitSize = mReader->getAttributeValueAsFloat(attrIndex); } // consume the trailing stuff - if( !mReader->isEmptyElement()) + if (!mReader->isEmptyElement()) SkipElement(); } - else if( IsElement( "up_axis")) + else if (IsElement("up_axis")) { // read content, strip whitespace, compare const char* content = GetTextContent(); - if( strncmp( content, "X_UP", 4) == 0) + if (strncmp(content, "X_UP", 4) == 0) mUpDirection = UP_X; - else if( strncmp( content, "Z_UP", 4) == 0) + else if (strncmp(content, "Z_UP", 4) == 0) mUpDirection = UP_Z; else mUpDirection = UP_Y; // check element end - TestClosing( "up_axis"); + TestClosing("up_axis"); } - else if(IsElement("contributor")) + else if (IsElement("contributor")) { ReadContributorInfo(); } @@ -274,10 +348,10 @@ void ColladaParser::ReadAssetInfo() ReadMetaDataItem(mAssetMetaData); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if (strcmp( mReader->getNodeName(), "asset") != 0) - ThrowException( "Expected end of element."); + if (strcmp(mReader->getNodeName(), "asset") != 0) + ThrowException("Expected end of element."); break; } @@ -355,82 +429,82 @@ void ColladaParser::ToCamelCase(std::string &text) // Reads the animation clips void ColladaParser::ReadAnimationClipLibrary() { - if (mReader->isEmptyElement()) - return; + if (mReader->isEmptyElement()) + return; - while (mReader->read()) - { - if (mReader->getNodeType() == irr::io::EXN_ELEMENT) - { - if (IsElement("animation_clip")) - { - // optional name given as an attribute - std::string animName; - int indexName = TestAttribute("name"); - int indexID = TestAttribute("id"); - if (indexName >= 0) - animName = mReader->getAttributeValue(indexName); - else if (indexID >= 0) - animName = mReader->getAttributeValue(indexID); - else - animName = std::string("animation_") + to_string(mAnimationClipLibrary.size()); + while (mReader->read()) + { + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) + { + if (IsElement("animation_clip")) + { + // optional name given as an attribute + std::string animName; + int indexName = TestAttribute("name"); + int indexID = TestAttribute("id"); + if (indexName >= 0) + animName = mReader->getAttributeValue(indexName); + else if (indexID >= 0) + animName = mReader->getAttributeValue(indexID); + else + animName = std::string("animation_") + to_string(mAnimationClipLibrary.size()); - std::pair > clip; + std::pair > clip; - clip.first = animName; + clip.first = animName; - while (mReader->read()) - { - if (mReader->getNodeType() == irr::io::EXN_ELEMENT) - { - if (IsElement("instance_animation")) - { - int indexUrl = TestAttribute("url"); - if (indexUrl >= 0) - { - const char* url = mReader->getAttributeValue(indexUrl); - if (url[0] != '#') - ThrowException("Unknown reference format"); + while (mReader->read()) + { + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) + { + if (IsElement("instance_animation")) + { + int indexUrl = TestAttribute("url"); + if (indexUrl >= 0) + { + const char* url = mReader->getAttributeValue(indexUrl); + if (url[0] != '#') + ThrowException("Unknown reference format"); - url++; + url++; - clip.second.push_back(url); - } - } - else - { - // ignore the rest - SkipElement(); - } - } - else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) - { - if (strcmp(mReader->getNodeName(), "animation_clip") != 0) - ThrowException("Expected end of element."); + clip.second.push_back(url); + } + } + else + { + // ignore the rest + SkipElement(); + } + } + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + { + if (strcmp(mReader->getNodeName(), "animation_clip") != 0) + ThrowException("Expected end of element."); - break; - } - } + break; + } + } - if (clip.second.size() > 0) - { - mAnimationClipLibrary.push_back(clip); - } - } - else - { - // ignore the rest - SkipElement(); - } - } - else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) - { - if (strcmp(mReader->getNodeName(), "library_animation_clips") != 0) - ThrowException("Expected end of element."); + if (clip.second.size() > 0) + { + mAnimationClipLibrary.push_back(clip); + } + } + else + { + // ignore the rest + SkipElement(); + } + } + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + { + if (strcmp(mReader->getNodeName(), "library_animation_clips") != 0) + ThrowException("Expected end of element."); - break; - } - } + break; + } + } } void ColladaParser::PostProcessControllers() @@ -439,11 +513,11 @@ void ColladaParser::PostProcessControllers() for (ControllerLibrary::iterator it = mControllerLibrary.begin(); it != mControllerLibrary.end(); ++it) { meshId = it->second.mMeshId; ControllerLibrary::iterator findItr = mControllerLibrary.find(meshId); - while(findItr != mControllerLibrary.end()) { + while (findItr != mControllerLibrary.end()) { meshId = findItr->second.mMeshId; findItr = mControllerLibrary.find(meshId); } - + it->second.mMeshId = meshId; } } @@ -452,43 +526,43 @@ void ColladaParser::PostProcessControllers() // Re-build animations from animation clip library, if present, otherwise combine single-channel animations void ColladaParser::PostProcessRootAnimations() { - if (mAnimationClipLibrary.size() > 0) - { - Animation temp; + if (mAnimationClipLibrary.size() > 0) + { + Animation temp; - for (AnimationClipLibrary::iterator it = mAnimationClipLibrary.begin(); it != mAnimationClipLibrary.end(); ++it) - { - std::string clipName = it->first; + for (AnimationClipLibrary::iterator it = mAnimationClipLibrary.begin(); it != mAnimationClipLibrary.end(); ++it) + { + std::string clipName = it->first; - Animation *clip = new Animation(); - clip->mName = clipName; + Animation *clip = new Animation(); + clip->mName = clipName; - temp.mSubAnims.push_back(clip); + temp.mSubAnims.push_back(clip); - for (std::vector::iterator a = it->second.begin(); a != it->second.end(); ++a) - { - std::string animationID = *a; + for (std::vector::iterator a = it->second.begin(); a != it->second.end(); ++a) + { + std::string animationID = *a; - AnimationLibrary::iterator animation = mAnimationLibrary.find(animationID); + AnimationLibrary::iterator animation = mAnimationLibrary.find(animationID); - if (animation != mAnimationLibrary.end()) - { - Animation *pSourceAnimation = animation->second; + if (animation != mAnimationLibrary.end()) + { + Animation *pSourceAnimation = animation->second; - pSourceAnimation->CollectChannelsRecursively(clip->mChannels); - } - } - } + pSourceAnimation->CollectChannelsRecursively(clip->mChannels); + } + } + } - mAnims = temp; + mAnims = temp; - // Ensure no double deletes. - temp.mSubAnims.clear(); - } - else - { - mAnims.CombineSingleChannelAnimations(); - } + // Ensure no double deletes. + temp.mSubAnims.clear(); + } + else + { + mAnims.CombineSingleChannelAnimations(); + } } // ------------------------------------------------------------------------------------------------ @@ -498,24 +572,25 @@ void ColladaParser::ReadAnimationLibrary() if (mReader->isEmptyElement()) return; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "animation")) + if (IsElement("animation")) { // delegate the reading. Depending on the inner elements it will be a container or a anim channel - ReadAnimation( &mAnims); - } else + ReadAnimation(&mAnims); + } + else { // ignore the rest SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "library_animations") != 0) - ThrowException( "Expected end of element."); + if (strcmp(mReader->getNodeName(), "library_animations") != 0) + ThrowException("Expected end of element."); break; } @@ -524,9 +599,9 @@ void ColladaParser::ReadAnimationLibrary() // ------------------------------------------------------------------------------------------------ // Reads an animation into the given parent structure -void ColladaParser::ReadAnimation( Collada::Animation* pParent) +void ColladaParser::ReadAnimation(Collada::Animation* pParent) { - if( mReader->isEmptyElement()) + if (mReader->isEmptyElement()) return; // an element may be a container for grouping sub-elements or an animation channel @@ -538,68 +613,68 @@ void ColladaParser::ReadAnimation( Collada::Animation* pParent) // optional name given as an attribute std::string animName; - std::string animID; - int indexName = TestAttribute( "name"); - int indexID = TestAttribute( "id"); + std::string animID; + int indexName = TestAttribute("name"); + int indexID = TestAttribute("id"); - if (indexID >= 0) - animID = mReader->getAttributeValue(indexID); + if (indexID >= 0) + animID = mReader->getAttributeValue(indexID); - if( indexName >= 0) - animName = mReader->getAttributeValue( indexName); - else if( indexID >= 0) + if (indexName >= 0) + animName = mReader->getAttributeValue(indexName); + else if (indexID >= 0) animName = animID; else animName = "animation"; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { // we have subanimations - if( IsElement( "animation")) + if (IsElement("animation")) { // create container from our element - if( !anim) + if (!anim) { anim = new Animation; anim->mName = animName; - pParent->mSubAnims.push_back( anim); + pParent->mSubAnims.push_back(anim); } // recurse into the subelement - ReadAnimation( anim); + ReadAnimation(anim); } - else if( IsElement( "source")) + else if (IsElement("source")) { // possible animation data - we'll never know. Better store it ReadSource(); } - else if( IsElement( "sampler")) + else if (IsElement("sampler")) { // read the ID to assign the corresponding collada channel afterwards. - int indexID = GetAttribute( "id"); - std::string id = mReader->getAttributeValue( indexID); - ChannelMap::iterator newChannel = channels.insert( std::make_pair( id, AnimationChannel())).first; + int indexID = GetAttribute("id"); + std::string id = mReader->getAttributeValue(indexID); + ChannelMap::iterator newChannel = channels.insert(std::make_pair(id, AnimationChannel())).first; // have it read into a channel - ReadAnimationSampler( newChannel->second); + ReadAnimationSampler(newChannel->second); } - else if( IsElement( "channel")) + else if (IsElement("channel")) { // the binding element whose whole purpose is to provide the target to animate // Thanks, Collada! A directly posted information would have been too simple, I guess. // Better add another indirection to that! Can't have enough of those. - int indexTarget = GetAttribute( "target"); - int indexSource = GetAttribute( "source"); - const char* sourceId = mReader->getAttributeValue( indexSource); - if( sourceId[0] == '#') + int indexTarget = GetAttribute("target"); + int indexSource = GetAttribute("source"); + const char* sourceId = mReader->getAttributeValue(indexSource); + if (sourceId[0] == '#') sourceId++; - ChannelMap::iterator cit = channels.find( sourceId); - if( cit != channels.end()) - cit->second.mTarget = mReader->getAttributeValue( indexTarget); + ChannelMap::iterator cit = channels.find(sourceId); + if (cit != channels.end()) + cit->second.mTarget = mReader->getAttributeValue(indexTarget); - if( !mReader->isEmptyElement()) + if (!mReader->isEmptyElement()) SkipElement(); } else @@ -608,24 +683,24 @@ void ColladaParser::ReadAnimation( Collada::Animation* pParent) SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "animation") != 0) - ThrowException( "Expected end of element."); + if (strcmp(mReader->getNodeName(), "animation") != 0) + ThrowException("Expected end of element."); break; } } // it turned out to have channels - add them - if( !channels.empty()) + if (!channels.empty()) { - // FIXME: Is this essentially doing the same as "single-anim-node" codepath in - // ColladaLoader::StoreAnimations? For now, this has been deferred to after - // all animations and all clips have been read. Due to handling of - // this cannot be done here, as the channel owner - // is lost, and some exporters make up animations by referring to multiple - // single-channel animations from an . + // FIXME: Is this essentially doing the same as "single-anim-node" codepath in + // ColladaLoader::StoreAnimations? For now, this has been deferred to after + // all animations and all clips have been read. Due to handling of + // this cannot be done here, as the channel owner + // is lost, and some exporters make up animations by referring to multiple + // single-channel animations from an . /* // special filtering for stupid exporters packing each channel into a separate animation if( channels.size() == 1) @@ -635,53 +710,53 @@ void ColladaParser::ReadAnimation( Collada::Animation* pParent) */ { // else create the animation, if not done yet, and store the channels - if( !anim) + if (!anim) { anim = new Animation; anim->mName = animName; - pParent->mSubAnims.push_back( anim); + pParent->mSubAnims.push_back(anim); } - for( ChannelMap::const_iterator it = channels.begin(); it != channels.end(); ++it) - anim->mChannels.push_back( it->second); + for (ChannelMap::const_iterator it = channels.begin(); it != channels.end(); ++it) + anim->mChannels.push_back(it->second); - if (indexID >= 0) - { - mAnimationLibrary[animID] = anim; - } + if (indexID >= 0) + { + mAnimationLibrary[animID] = anim; + } } } } // ------------------------------------------------------------------------------------------------ // Reads an animation sampler into the given anim channel -void ColladaParser::ReadAnimationSampler( Collada::AnimationChannel& pChannel) +void ColladaParser::ReadAnimationSampler(Collada::AnimationChannel& pChannel) { - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "input")) + if (IsElement("input")) { - int indexSemantic = GetAttribute( "semantic"); - const char* semantic = mReader->getAttributeValue( indexSemantic); - int indexSource = GetAttribute( "source"); - const char* source = mReader->getAttributeValue( indexSource); - if( source[0] != '#') - ThrowException( "Unsupported URL format"); + int indexSemantic = GetAttribute("semantic"); + const char* semantic = mReader->getAttributeValue(indexSemantic); + int indexSource = GetAttribute("source"); + const char* source = mReader->getAttributeValue(indexSource); + if (source[0] != '#') + ThrowException("Unsupported URL format"); source++; - if( strcmp( semantic, "INPUT") == 0) + if (strcmp(semantic, "INPUT") == 0) pChannel.mSourceTimes = source; - else if( strcmp( semantic, "OUTPUT") == 0) + else if (strcmp(semantic, "OUTPUT") == 0) pChannel.mSourceValues = source; - else if( strcmp( semantic, "IN_TANGENT") == 0) + else if (strcmp(semantic, "IN_TANGENT") == 0) pChannel.mInTanValues = source; - else if( strcmp( semantic, "OUT_TANGENT") == 0) + else if (strcmp(semantic, "OUT_TANGENT") == 0) pChannel.mOutTanValues = source; - else if( strcmp( semantic, "INTERPOLATION") == 0) + else if (strcmp(semantic, "INTERPOLATION") == 0) pChannel.mInterpolationValues = source; - if( !mReader->isEmptyElement()) + if (!mReader->isEmptyElement()) SkipElement(); } else @@ -690,10 +765,10 @@ void ColladaParser::ReadAnimationSampler( Collada::AnimationChannel& pChannel) SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "sampler") != 0) - ThrowException( "Expected end of element."); + if (strcmp(mReader->getNodeName(), "sampler") != 0) + ThrowException("Expected end of element."); break; } @@ -707,31 +782,32 @@ void ColladaParser::ReadControllerLibrary() if (mReader->isEmptyElement()) return; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "controller")) + if (IsElement("controller")) { // read ID. Ask the spec if it's necessary or optional... you might be surprised. - int attrID = GetAttribute( "id"); - std::string id = mReader->getAttributeValue( attrID); + int attrID = GetAttribute("id"); + std::string id = mReader->getAttributeValue(attrID); // create an entry and store it in the library under its ID mControllerLibrary[id] = Controller(); // read on from there - ReadController( mControllerLibrary[id]); - } else + ReadController(mControllerLibrary[id]); + } + else { // ignore the rest SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "library_controllers") != 0) - ThrowException( "Expected end of element."); + if (strcmp(mReader->getNodeName(), "library_controllers") != 0) + ThrowException("Expected end of element."); break; } @@ -740,17 +816,17 @@ void ColladaParser::ReadControllerLibrary() // ------------------------------------------------------------------------------------------------ // Reads a controller into the given mesh structure -void ColladaParser::ReadController( Collada::Controller& pController) +void ColladaParser::ReadController(Collada::Controller& pController) { // initial values pController.mType = Skin; pController.mMethod = Normalized; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { // two types of controllers: "skin" and "morph". Only the first one is relevant, we skip the other - if( IsElement( "morph")) + if (IsElement("morph")) { pController.mType = Morph; int baseIndex = GetAttribute("source"); @@ -762,47 +838,47 @@ void ColladaParser::ReadController( Collada::Controller& pController) pController.mMethod = Relative; } } - else if( IsElement( "skin")) + else if (IsElement("skin")) { // read the mesh it refers to. According to the spec this could also be another // controller, but I refuse to implement every single idea they've come up with - int sourceIndex = GetAttribute( "source"); - pController.mMeshId = mReader->getAttributeValue( sourceIndex) + 1; + int sourceIndex = GetAttribute("source"); + pController.mMeshId = mReader->getAttributeValue(sourceIndex) + 1; } - else if( IsElement( "bind_shape_matrix")) + else if (IsElement("bind_shape_matrix")) { // content is 16 floats to define a matrix... it seems to be important for some models const char* content = GetTextContent(); // read the 16 floats - for( unsigned int a = 0; a < 16; a++) + for (unsigned int a = 0; a < 16; a++) { // read a number - content = fast_atoreal_move( content, pController.mBindShapeMatrix[a]); + content = fast_atoreal_move(content, pController.mBindShapeMatrix[a]); // skip whitespace after it - SkipSpacesAndLineEnd( &content); + SkipSpacesAndLineEnd(&content); } - TestClosing( "bind_shape_matrix"); + TestClosing("bind_shape_matrix"); } - else if( IsElement( "source")) + else if (IsElement("source")) { // data array - we have specialists to handle this ReadSource(); } - else if( IsElement( "joints")) + else if (IsElement("joints")) { - ReadControllerJoints( pController); + ReadControllerJoints(pController); } - else if( IsElement( "vertex_weights")) + else if (IsElement("vertex_weights")) { - ReadControllerWeights( pController); + ReadControllerWeights(pController); } - else if ( IsElement( "targets" )) + else if (IsElement("targets")) { while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if ( IsElement( "input")) { + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { + if (IsElement("input")) { int semanticsIndex = GetAttribute("semantic"); int sourceIndex = GetAttribute("source"); @@ -816,11 +892,12 @@ void ColladaParser::ReadController( Collada::Controller& pController) pController.mMorphWeight = source + 1; } } - } else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "targets") == 0) + } + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { + if (strcmp(mReader->getNodeName(), "targets") == 0) break; else - ThrowException( "Expected end of element."); + ThrowException("Expected end of element."); } } } @@ -830,47 +907,47 @@ void ColladaParser::ReadController( Collada::Controller& pController) SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "controller") == 0) + if (strcmp(mReader->getNodeName(), "controller") == 0) break; - else if( strcmp( mReader->getNodeName(), "skin") != 0 && strcmp( mReader->getNodeName(), "morph") != 0) - ThrowException( "Expected end of element."); + else if (strcmp(mReader->getNodeName(), "skin") != 0 && strcmp(mReader->getNodeName(), "morph") != 0) + ThrowException("Expected end of element."); } } } // ------------------------------------------------------------------------------------------------ // Reads the joint definitions for the given controller -void ColladaParser::ReadControllerJoints( Collada::Controller& pController) +void ColladaParser::ReadControllerJoints(Collada::Controller& pController) { - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { // Input channels for joint data. Two possible semantics: "JOINT" and "INV_BIND_MATRIX" - if( IsElement( "input")) + if (IsElement("input")) { - int indexSemantic = GetAttribute( "semantic"); - const char* attrSemantic = mReader->getAttributeValue( indexSemantic); - int indexSource = GetAttribute( "source"); - const char* attrSource = mReader->getAttributeValue( indexSource); + int indexSemantic = GetAttribute("semantic"); + const char* attrSemantic = mReader->getAttributeValue(indexSemantic); + int indexSource = GetAttribute("source"); + const char* attrSource = mReader->getAttributeValue(indexSource); // local URLS always start with a '#'. We don't support global URLs - if( attrSource[0] != '#') - ThrowException( format() << "Unsupported URL format in \"" << attrSource << "\" in source attribute of data element" ); + if (attrSource[0] != '#') + ThrowException(format() << "Unsupported URL format in \"" << attrSource << "\" in source attribute of data element"); attrSource++; // parse source URL to corresponding source - if( strcmp( attrSemantic, "JOINT") == 0) + if (strcmp(attrSemantic, "JOINT") == 0) pController.mJointNameSource = attrSource; - else if( strcmp( attrSemantic, "INV_BIND_MATRIX") == 0) + else if (strcmp(attrSemantic, "INV_BIND_MATRIX") == 0) pController.mJointOffsetMatrixSource = attrSource; else - ThrowException( format() << "Unknown semantic \"" << attrSemantic << "\" in data element" ); + ThrowException(format() << "Unknown semantic \"" << attrSemantic << "\" in data element"); // skip inner data, if present - if( !mReader->isEmptyElement()) + if (!mReader->isEmptyElement()) SkipElement(); } else @@ -879,10 +956,10 @@ void ColladaParser::ReadControllerJoints( Collada::Controller& pController) SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "joints") != 0) - ThrowException( "Expected end of element."); + if (strcmp(mReader->getNodeName(), "joints") != 0) + ThrowException("Expected end of element."); break; } @@ -891,85 +968,85 @@ void ColladaParser::ReadControllerJoints( Collada::Controller& pController) // ------------------------------------------------------------------------------------------------ // Reads the joint weights for the given controller -void ColladaParser::ReadControllerWeights( Collada::Controller& pController) +void ColladaParser::ReadControllerWeights(Collada::Controller& pController) { // read vertex count from attributes and resize the array accordingly - int indexCount = GetAttribute( "count"); - size_t vertexCount = (size_t) mReader->getAttributeValueAsInt( indexCount); - pController.mWeightCounts.resize( vertexCount); + int indexCount = GetAttribute("count"); + size_t vertexCount = (size_t)mReader->getAttributeValueAsInt(indexCount); + pController.mWeightCounts.resize(vertexCount); - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { // Input channels for weight data. Two possible semantics: "JOINT" and "WEIGHT" - if( IsElement( "input") && vertexCount > 0 ) + if (IsElement("input") && vertexCount > 0) { InputChannel channel; - int indexSemantic = GetAttribute( "semantic"); - const char* attrSemantic = mReader->getAttributeValue( indexSemantic); - int indexSource = GetAttribute( "source"); - const char* attrSource = mReader->getAttributeValue( indexSource); - int indexOffset = TestAttribute( "offset"); - if( indexOffset >= 0) - channel.mOffset = mReader->getAttributeValueAsInt( indexOffset); + int indexSemantic = GetAttribute("semantic"); + const char* attrSemantic = mReader->getAttributeValue(indexSemantic); + int indexSource = GetAttribute("source"); + const char* attrSource = mReader->getAttributeValue(indexSource); + int indexOffset = TestAttribute("offset"); + if (indexOffset >= 0) + channel.mOffset = mReader->getAttributeValueAsInt(indexOffset); // local URLS always start with a '#'. We don't support global URLs - if( attrSource[0] != '#') - ThrowException( format() << "Unsupported URL format in \"" << attrSource << "\" in source attribute of data element" ); + if (attrSource[0] != '#') + ThrowException(format() << "Unsupported URL format in \"" << attrSource << "\" in source attribute of data element"); channel.mAccessor = attrSource + 1; // parse source URL to corresponding source - if( strcmp( attrSemantic, "JOINT") == 0) + if (strcmp(attrSemantic, "JOINT") == 0) pController.mWeightInputJoints = channel; - else if( strcmp( attrSemantic, "WEIGHT") == 0) + else if (strcmp(attrSemantic, "WEIGHT") == 0) pController.mWeightInputWeights = channel; else - ThrowException( format() << "Unknown semantic \"" << attrSemantic << "\" in data element" ); + ThrowException(format() << "Unknown semantic \"" << attrSemantic << "\" in data element"); // skip inner data, if present - if( !mReader->isEmptyElement()) + if (!mReader->isEmptyElement()) SkipElement(); } - else if( IsElement( "vcount") && vertexCount > 0 ) + else if (IsElement("vcount") && vertexCount > 0) { // read weight count per vertex const char* text = GetTextContent(); size_t numWeights = 0; - for( std::vector::iterator it = pController.mWeightCounts.begin(); it != pController.mWeightCounts.end(); ++it) + for (std::vector::iterator it = pController.mWeightCounts.begin(); it != pController.mWeightCounts.end(); ++it) { - if( *text == 0) - ThrowException( "Out of data while reading "); + if (*text == 0) + ThrowException("Out of data while reading "); - *it = strtoul10( text, &text); + *it = strtoul10(text, &text); numWeights += *it; - SkipSpacesAndLineEnd( &text); + SkipSpacesAndLineEnd(&text); } - TestClosing( "vcount"); + TestClosing("vcount"); // reserve weight count - pController.mWeights.resize( numWeights); + pController.mWeights.resize(numWeights); } - else if( IsElement( "v") && vertexCount > 0 ) + else if (IsElement("v") && vertexCount > 0) { // read JointIndex - WeightIndex pairs const char* text = GetTextContent(); - for( std::vector< std::pair >::iterator it = pController.mWeights.begin(); it != pController.mWeights.end(); ++it) + for (std::vector< std::pair >::iterator it = pController.mWeights.begin(); it != pController.mWeights.end(); ++it) { - if( *text == 0) - ThrowException( "Out of data while reading "); - it->first = strtoul10( text, &text); - SkipSpacesAndLineEnd( &text); - if( *text == 0) - ThrowException( "Out of data while reading "); - it->second = strtoul10( text, &text); - SkipSpacesAndLineEnd( &text); + if (*text == 0) + ThrowException("Out of data while reading "); + it->first = strtoul10(text, &text); + SkipSpacesAndLineEnd(&text); + if (*text == 0) + ThrowException("Out of data while reading "); + it->second = strtoul10(text, &text); + SkipSpacesAndLineEnd(&text); } - TestClosing( "v"); + TestClosing("v"); } else { @@ -977,10 +1054,10 @@ void ColladaParser::ReadControllerWeights( Collada::Controller& pController) SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "vertex_weights") != 0) - ThrowException( "Expected end of element."); + if (strcmp(mReader->getNodeName(), "vertex_weights") != 0) + ThrowException("Expected end of element."); break; } @@ -991,32 +1068,33 @@ void ColladaParser::ReadControllerWeights( Collada::Controller& pController) // Reads the image library contents void ColladaParser::ReadImageLibrary() { - if( mReader->isEmptyElement()) + if (mReader->isEmptyElement()) return; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "image")) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { + if (IsElement("image")) { // read ID. Another entry which is "optional" by design but obligatory in reality - int attrID = GetAttribute( "id"); - std::string id = mReader->getAttributeValue( attrID); + int attrID = GetAttribute("id"); + std::string id = mReader->getAttributeValue(attrID); // create an entry and store it in the library under its ID mImageLibrary[id] = Image(); // read on from there - ReadImage( mImageLibrary[id]); - } else + ReadImage(mImageLibrary[id]); + } + else { // ignore the rest SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "library_images") != 0) - ThrowException( "Expected end of element."); + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { + if (strcmp(mReader->getNodeName(), "library_images") != 0) + ThrowException("Expected end of element."); break; } @@ -1025,16 +1103,16 @@ void ColladaParser::ReadImageLibrary() // ------------------------------------------------------------------------------------------------ // Reads an image entry into the given image -void ColladaParser::ReadImage( Collada::Image& pImage) +void ColladaParser::ReadImage(Collada::Image& pImage) { - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT){ + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { // Need to run different code paths here, depending on the Collada XSD version if (IsElement("image")) { SkipElement(); } - else if( IsElement( "init_from")) + else if (IsElement("init_from")) { if (mFormat == FV_1_4_n) { @@ -1043,7 +1121,7 @@ void ColladaParser::ReadImage( Collada::Image& pImage) // element content is filename - hopefully const char* sz = TestTextContent(); if (sz)pImage.mFileName = sz; - TestClosing( "init_from"); + TestClosing("init_from"); } if (!pImage.mFileName.length()) { pImage.mFileName = "unknown_texture"; @@ -1071,14 +1149,14 @@ void ColladaParser::ReadImage( Collada::Image& pImage) } else if (mFormat == FV_1_5_n) { - if( IsElement( "ref")) + if (IsElement("ref")) { // element content is filename - hopefully const char* sz = TestTextContent(); if (sz)pImage.mFileName = sz; - TestClosing( "ref"); + TestClosing("ref"); } - else if( IsElement( "hex") && !pImage.mFileName.length()) + else if (IsElement("hex") && !pImage.mFileName.length()) { // embedded image. get format const int attrib = TestAttribute("format"); @@ -1093,12 +1171,12 @@ void ColladaParser::ReadImage( Collada::Image& pImage) const char* cur = data; while (!IsSpaceOrNewLine(*cur)) cur++; - const unsigned int size = (unsigned int)(cur-data) * 2; + const unsigned int size = (unsigned int)(cur - data) * 2; pImage.mImageData.resize(size); - for (unsigned int i = 0; i < size;++i) - pImage.mImageData[i] = HexOctetToDecimal(data+(i<<1)); + for (unsigned int i = 0; i < size; ++i) + pImage.mImageData[i] = HexOctetToDecimal(data + (i << 1)); - TestClosing( "hex"); + TestClosing("hex"); } } else @@ -1107,8 +1185,8 @@ void ColladaParser::ReadImage( Collada::Image& pImage) SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "image") == 0) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { + if (strcmp(mReader->getNodeName(), "image") == 0) break; } } @@ -1118,36 +1196,36 @@ void ColladaParser::ReadImage( Collada::Image& pImage) // Reads the material library void ColladaParser::ReadMaterialLibrary() { - if( mReader->isEmptyElement()) + if (mReader->isEmptyElement()) return; std::map names; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "material")) + if (IsElement("material")) { // read ID. By now you probably know my opinion about this "specification" - int attrID = GetAttribute( "id"); - std::string id = mReader->getAttributeValue( attrID); + int attrID = GetAttribute("id"); + std::string id = mReader->getAttributeValue(attrID); std::string name; int attrName = TestAttribute("name"); if (attrName >= 0) - name = mReader->getAttributeValue( attrName); + name = mReader->getAttributeValue(attrName); // create an entry and store it in the library under its ID mMaterialLibrary[id] = Material(); - if( !name.empty()) + if (!name.empty()) { - std::map::iterator it = names.find( name); - if( it != names.end()) + std::map::iterator it = names.find(name); + if (it != names.end()) { std::ostringstream strStream; strStream << ++it->second; - name.append( " " + strStream.str()); + name.append(" " + strStream.str()); } else { @@ -1157,17 +1235,18 @@ void ColladaParser::ReadMaterialLibrary() mMaterialLibrary[id].mName = name; } - ReadMaterial( mMaterialLibrary[id]); - } else + ReadMaterial(mMaterialLibrary[id]); + } + else { // ignore the rest SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "library_materials") != 0) - ThrowException( "Expected end of element."); + if (strcmp(mReader->getNodeName(), "library_materials") != 0) + ThrowException("Expected end of element."); break; } @@ -1178,30 +1257,31 @@ void ColladaParser::ReadMaterialLibrary() // Reads the light library void ColladaParser::ReadLightLibrary() { - if( mReader->isEmptyElement()) + if (mReader->isEmptyElement()) return; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "light")) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { + if (IsElement("light")) { // read ID. By now you probably know my opinion about this "specification" - int attrID = GetAttribute( "id"); - std::string id = mReader->getAttributeValue( attrID); + int attrID = GetAttribute("id"); + std::string id = mReader->getAttributeValue(attrID); // create an entry and store it in the library under its ID ReadLight(mLightLibrary[id] = Light()); - } else + } + else { // ignore the rest SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "library_lights") != 0) - ThrowException( "Expected end of element."); + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { + if (strcmp(mReader->getNodeName(), "library_lights") != 0) + ThrowException("Expected end of element."); break; } @@ -1212,35 +1292,36 @@ void ColladaParser::ReadLightLibrary() // Reads the camera library void ColladaParser::ReadCameraLibrary() { - if( mReader->isEmptyElement()) + if (mReader->isEmptyElement()) return; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "camera")) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { + if (IsElement("camera")) { // read ID. By now you probably know my opinion about this "specification" - int attrID = GetAttribute( "id"); - std::string id = mReader->getAttributeValue( attrID); + int attrID = GetAttribute("id"); + std::string id = mReader->getAttributeValue(attrID); // create an entry and store it in the library under its ID Camera& cam = mCameraLibrary[id]; - attrID = TestAttribute( "name"); + attrID = TestAttribute("name"); if (attrID != -1) - cam.mName = mReader->getAttributeValue( attrID); + cam.mName = mReader->getAttributeValue(attrID); ReadCamera(cam); - } else + } + else { // ignore the rest SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "library_cameras") != 0) - ThrowException( "Expected end of element."); + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { + if (strcmp(mReader->getNodeName(), "library_cameras") != 0) + ThrowException("Expected end of element."); break; } @@ -1249,34 +1330,35 @@ void ColladaParser::ReadCameraLibrary() // ------------------------------------------------------------------------------------------------ // Reads a material entry into the given material -void ColladaParser::ReadMaterial( Collada::Material& pMaterial) +void ColladaParser::ReadMaterial(Collada::Material& pMaterial) { - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) { + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { if (IsElement("material")) { SkipElement(); } - else if( IsElement( "instance_effect")) + else if (IsElement("instance_effect")) { // referred effect by URL - int attrUrl = GetAttribute( "url"); - const char* url = mReader->getAttributeValue( attrUrl); - if( url[0] != '#') - ThrowException( "Unknown reference format"); + int attrUrl = GetAttribute("url"); + const char* url = mReader->getAttributeValue(attrUrl); + if (url[0] != '#') + ThrowException("Unknown reference format"); - pMaterial.mEffect = url+1; + pMaterial.mEffect = url + 1; SkipElement(); - } else + } + else { // ignore the rest SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "material") != 0) - ThrowException( "Expected end of element."); + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { + if (strcmp(mReader->getNodeName(), "material") != 0) + ThrowException("Expected end of element."); break; } @@ -1285,11 +1367,11 @@ void ColladaParser::ReadMaterial( Collada::Material& pMaterial) // ------------------------------------------------------------------------------------------------ // Reads a light entry into the given light -void ColladaParser::ReadLight( Collada::Light& pLight) +void ColladaParser::ReadLight(Collada::Light& pLight) { - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) { + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { if (IsElement("light")) { SkipElement(); } @@ -1309,16 +1391,16 @@ void ColladaParser::ReadLight( Collada::Light& pLight) // text content contains 3 floats const char* content = GetTextContent(); - content = fast_atoreal_move( content, (ai_real&)pLight.mColor.r); - SkipSpacesAndLineEnd( &content); + content = fast_atoreal_move(content, (ai_real&)pLight.mColor.r); + SkipSpacesAndLineEnd(&content); - content = fast_atoreal_move( content, (ai_real&)pLight.mColor.g); - SkipSpacesAndLineEnd( &content); + content = fast_atoreal_move(content, (ai_real&)pLight.mColor.g); + SkipSpacesAndLineEnd(&content); - content = fast_atoreal_move( content, (ai_real&)pLight.mColor.b); - SkipSpacesAndLineEnd( &content); + content = fast_atoreal_move(content, (ai_real&)pLight.mColor.b); + SkipSpacesAndLineEnd(&content); - TestClosing( "color"); + TestClosing("color"); } else if (IsElement("constant_attenuation")) { pLight.mAttConstant = ReadFloatFromTextContent(); @@ -1370,8 +1452,8 @@ void ColladaParser::ReadLight( Collada::Light& pLight) TestClosing("decay_falloff"); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "light") == 0) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { + if (strcmp(mReader->getNodeName(), "light") == 0) break; } } @@ -1379,11 +1461,11 @@ void ColladaParser::ReadLight( Collada::Light& pLight) // ------------------------------------------------------------------------------------------------ // Reads a camera entry into the given light -void ColladaParser::ReadCamera( Collada::Camera& pCamera) +void ColladaParser::ReadCamera(Collada::Camera& pCamera) { - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) { + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { if (IsElement("camera")) { SkipElement(); } @@ -1411,8 +1493,8 @@ void ColladaParser::ReadCamera( Collada::Camera& pCamera) TestClosing("zfar"); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "camera") == 0) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { + if (strcmp(mReader->getNodeName(), "camera") == 0) break; } } @@ -1426,28 +1508,29 @@ void ColladaParser::ReadEffectLibrary() return; } - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "effect")) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { + if (IsElement("effect")) { // read ID. Do I have to repeat my ranting about "optional" attributes? - int attrID = GetAttribute( "id"); - std::string id = mReader->getAttributeValue( attrID); + int attrID = GetAttribute("id"); + std::string id = mReader->getAttributeValue(attrID); // create an entry and store it in the library under its ID mEffectLibrary[id] = Effect(); // read on from there - ReadEffect( mEffectLibrary[id]); - } else + ReadEffect(mEffectLibrary[id]); + } + else { // ignore the rest SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "library_effects") != 0) - ThrowException( "Expected end of element."); + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { + if (strcmp(mReader->getNodeName(), "library_effects") != 0) + ThrowException("Expected end of element."); break; } @@ -1456,22 +1539,22 @@ void ColladaParser::ReadEffectLibrary() // ------------------------------------------------------------------------------------------------ // Reads an effect entry into the given effect -void ColladaParser::ReadEffect( Collada::Effect& pEffect) +void ColladaParser::ReadEffect(Collada::Effect& pEffect) { // for the moment we don't support any other type of effect. - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "profile_COMMON")) - ReadEffectProfileCommon( pEffect); + if (IsElement("profile_COMMON")) + ReadEffectProfileCommon(pEffect); else SkipElement(); } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "effect") != 0) - ThrowException( "Expected end of element."); + if (strcmp(mReader->getNodeName(), "effect") != 0) + ThrowException("Expected end of element."); break; } @@ -1480,107 +1563,107 @@ void ColladaParser::ReadEffect( Collada::Effect& pEffect) // ------------------------------------------------------------------------------------------------ // Reads an COMMON effect profile -void ColladaParser::ReadEffectProfileCommon( Collada::Effect& pEffect) +void ColladaParser::ReadEffectProfileCommon(Collada::Effect& pEffect) { - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "newparam")) { + if (IsElement("newparam")) { // save ID - int attrSID = GetAttribute( "sid"); - std::string sid = mReader->getAttributeValue( attrSID); + int attrSID = GetAttribute("sid"); + std::string sid = mReader->getAttributeValue(attrSID); pEffect.mParams[sid] = EffectParam(); - ReadEffectParam( pEffect.mParams[sid]); + ReadEffectParam(pEffect.mParams[sid]); } - else if( IsElement( "technique") || IsElement( "extra")) + else if (IsElement("technique") || IsElement("extra")) { // just syntactic sugar } - else if( mFormat == FV_1_4_n && IsElement( "image")) + else if (mFormat == FV_1_4_n && IsElement("image")) { // read ID. Another entry which is "optional" by design but obligatory in reality - int attrID = GetAttribute( "id"); - std::string id = mReader->getAttributeValue( attrID); + int attrID = GetAttribute("id"); + std::string id = mReader->getAttributeValue(attrID); // create an entry and store it in the library under its ID mImageLibrary[id] = Image(); // read on from there - ReadImage( mImageLibrary[id]); + ReadImage(mImageLibrary[id]); } /* Shading modes */ - else if( IsElement( "phong")) + else if (IsElement("phong")) pEffect.mShadeType = Shade_Phong; - else if( IsElement( "constant")) + else if (IsElement("constant")) pEffect.mShadeType = Shade_Constant; - else if( IsElement( "lambert")) + else if (IsElement("lambert")) pEffect.mShadeType = Shade_Lambert; - else if( IsElement( "blinn")) + else if (IsElement("blinn")) pEffect.mShadeType = Shade_Blinn; /* Color + texture properties */ - else if( IsElement( "emission")) - ReadEffectColor( pEffect.mEmissive, pEffect.mTexEmissive); - else if( IsElement( "ambient")) - ReadEffectColor( pEffect.mAmbient, pEffect.mTexAmbient); - else if( IsElement( "diffuse")) - ReadEffectColor( pEffect.mDiffuse, pEffect.mTexDiffuse); - else if( IsElement( "specular")) - ReadEffectColor( pEffect.mSpecular, pEffect.mTexSpecular); - else if( IsElement( "reflective")) { - ReadEffectColor( pEffect.mReflective, pEffect.mTexReflective); + else if (IsElement("emission")) + ReadEffectColor(pEffect.mEmissive, pEffect.mTexEmissive); + else if (IsElement("ambient")) + ReadEffectColor(pEffect.mAmbient, pEffect.mTexAmbient); + else if (IsElement("diffuse")) + ReadEffectColor(pEffect.mDiffuse, pEffect.mTexDiffuse); + else if (IsElement("specular")) + ReadEffectColor(pEffect.mSpecular, pEffect.mTexSpecular); + else if (IsElement("reflective")) { + ReadEffectColor(pEffect.mReflective, pEffect.mTexReflective); } - else if( IsElement( "transparent")) { + else if (IsElement("transparent")) { pEffect.mHasTransparency = true; const char* opaque = mReader->getAttributeValueSafe("opaque"); - if(::strcmp(opaque, "RGB_ZERO") == 0 || ::strcmp(opaque, "RGB_ONE") == 0) { + if (::strcmp(opaque, "RGB_ZERO") == 0 || ::strcmp(opaque, "RGB_ONE") == 0) { pEffect.mRGBTransparency = true; } // In RGB_ZERO mode, the transparency is interpreted in reverse, go figure... - if(::strcmp(opaque, "RGB_ZERO") == 0 || ::strcmp(opaque, "A_ZERO") == 0) { - pEffect.mInvertTransparency = true; - } + if (::strcmp(opaque, "RGB_ZERO") == 0 || ::strcmp(opaque, "A_ZERO") == 0) { + pEffect.mInvertTransparency = true; + } - ReadEffectColor( pEffect.mTransparent,pEffect.mTexTransparent); + ReadEffectColor(pEffect.mTransparent, pEffect.mTexTransparent); } - else if( IsElement( "shininess")) - ReadEffectFloat( pEffect.mShininess); - else if( IsElement( "reflectivity")) - ReadEffectFloat( pEffect.mReflectivity); + else if (IsElement("shininess")) + ReadEffectFloat(pEffect.mShininess); + else if (IsElement("reflectivity")) + ReadEffectFloat(pEffect.mReflectivity); /* Single scalar properties */ - else if( IsElement( "transparency")) - ReadEffectFloat( pEffect.mTransparency); - else if( IsElement( "index_of_refraction")) - ReadEffectFloat( pEffect.mRefractIndex); + else if (IsElement("transparency")) + ReadEffectFloat(pEffect.mTransparency); + else if (IsElement("index_of_refraction")) + ReadEffectFloat(pEffect.mRefractIndex); // GOOGLEEARTH/OKINO extensions // ------------------------------------------------------- - else if( IsElement( "double_sided")) + else if (IsElement("double_sided")) pEffect.mDoubleSided = ReadBoolFromTextContent(); // FCOLLADA extensions // ------------------------------------------------------- - else if( IsElement( "bump")) { + else if (IsElement("bump")) { aiColor4D dummy; - ReadEffectColor( dummy,pEffect.mTexBump); + ReadEffectColor(dummy, pEffect.mTexBump); } // MAX3D extensions // ------------------------------------------------------- - else if( IsElement( "wireframe")) { + else if (IsElement("wireframe")) { pEffect.mWireframe = ReadBoolFromTextContent(); - TestClosing( "wireframe"); + TestClosing("wireframe"); } - else if( IsElement( "faceted")) { + else if (IsElement("faceted")) { pEffect.mFaceted = ReadBoolFromTextContent(); - TestClosing( "faceted"); + TestClosing("faceted"); } else { @@ -1588,8 +1671,8 @@ void ColladaParser::ReadEffectProfileCommon( Collada::Effect& pEffect) SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "profile_COMMON") == 0) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { + if (strcmp(mReader->getNodeName(), "profile_COMMON") == 0) { break; } @@ -1599,92 +1682,92 @@ void ColladaParser::ReadEffectProfileCommon( Collada::Effect& pEffect) // ------------------------------------------------------------------------------------------------ // Read texture wrapping + UV transform settings from a profile==Maya chunk -void ColladaParser::ReadSamplerProperties( Sampler& out ) +void ColladaParser::ReadSamplerProperties(Sampler& out) { if (mReader->isEmptyElement()) { return; } - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) { + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { // MAYA extensions // ------------------------------------------------------- - if( IsElement( "wrapU")) { + if (IsElement("wrapU")) { out.mWrapU = ReadBoolFromTextContent(); - TestClosing( "wrapU"); + TestClosing("wrapU"); } - else if( IsElement( "wrapV")) { + else if (IsElement("wrapV")) { out.mWrapV = ReadBoolFromTextContent(); - TestClosing( "wrapV"); + TestClosing("wrapV"); } - else if( IsElement( "mirrorU")) { + else if (IsElement("mirrorU")) { out.mMirrorU = ReadBoolFromTextContent(); - TestClosing( "mirrorU"); + TestClosing("mirrorU"); } - else if( IsElement( "mirrorV")) { + else if (IsElement("mirrorV")) { out.mMirrorV = ReadBoolFromTextContent(); - TestClosing( "mirrorV"); + TestClosing("mirrorV"); } - else if( IsElement( "repeatU")) { + else if (IsElement("repeatU")) { out.mTransform.mScaling.x = ReadFloatFromTextContent(); - TestClosing( "repeatU"); + TestClosing("repeatU"); } - else if( IsElement( "repeatV")) { + else if (IsElement("repeatV")) { out.mTransform.mScaling.y = ReadFloatFromTextContent(); - TestClosing( "repeatV"); + TestClosing("repeatV"); } - else if( IsElement( "offsetU")) { + else if (IsElement("offsetU")) { out.mTransform.mTranslation.x = ReadFloatFromTextContent(); - TestClosing( "offsetU"); + TestClosing("offsetU"); } - else if( IsElement( "offsetV")) { + else if (IsElement("offsetV")) { out.mTransform.mTranslation.y = ReadFloatFromTextContent(); - TestClosing( "offsetV"); + TestClosing("offsetV"); } - else if( IsElement( "rotateUV")) { + else if (IsElement("rotateUV")) { out.mTransform.mRotation = ReadFloatFromTextContent(); - TestClosing( "rotateUV"); + TestClosing("rotateUV"); } - else if( IsElement( "blend_mode")) { + else if (IsElement("blend_mode")) { const char* sz = GetTextContent(); // http://www.feelingsoftware.com/content/view/55/72/lang,en/ // NONE, OVER, IN, OUT, ADD, SUBTRACT, MULTIPLY, DIFFERENCE, LIGHTEN, DARKEN, SATURATE, DESATURATE and ILLUMINATE - if (0 == ASSIMP_strincmp(sz,"ADD",3)) + if (0 == ASSIMP_strincmp(sz, "ADD", 3)) out.mOp = aiTextureOp_Add; - else if (0 == ASSIMP_strincmp(sz,"SUBTRACT",8)) + else if (0 == ASSIMP_strincmp(sz, "SUBTRACT", 8)) out.mOp = aiTextureOp_Subtract; - else if (0 == ASSIMP_strincmp(sz,"MULTIPLY",8)) + else if (0 == ASSIMP_strincmp(sz, "MULTIPLY", 8)) out.mOp = aiTextureOp_Multiply; - else { + else { ASSIMP_LOG_WARN("Collada: Unsupported MAYA texture blend mode"); } - TestClosing( "blend_mode"); + TestClosing("blend_mode"); } // OKINO extensions // ------------------------------------------------------- - else if( IsElement( "weighting")) { + else if (IsElement("weighting")) { out.mWeighting = ReadFloatFromTextContent(); - TestClosing( "weighting"); + TestClosing("weighting"); } - else if( IsElement( "mix_with_previous_layer")) { + else if (IsElement("mix_with_previous_layer")) { out.mMixWithPrevious = ReadFloatFromTextContent(); - TestClosing( "mix_with_previous_layer"); + TestClosing("mix_with_previous_layer"); } // MAX3D extensions // ------------------------------------------------------- - else if( IsElement( "amount")) { + else if (IsElement("amount")) { out.mWeighting = ReadFloatFromTextContent(); - TestClosing( "amount"); + TestClosing("amount"); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "technique") == 0) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { + if (strcmp(mReader->getNodeName(), "technique") == 0) break; } } @@ -1692,7 +1775,7 @@ void ColladaParser::ReadSamplerProperties( Sampler& out ) // ------------------------------------------------------------------------------------------------ // Reads an effect entry containing a color or a texture defining that color -void ColladaParser::ReadEffectColor( aiColor4D& pColor, Sampler& pSampler) +void ColladaParser::ReadEffectColor(aiColor4D& pColor, Sampler& pSampler) { if (mReader->isEmptyElement()) return; @@ -1700,64 +1783,64 @@ void ColladaParser::ReadEffectColor( aiColor4D& pColor, Sampler& pSampler) // Save current element name const std::string curElem = mReader->getNodeName(); - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "color")) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { + if (IsElement("color")) { // text content contains 4 floats const char* content = GetTextContent(); - content = fast_atoreal_move( content, (ai_real&)pColor.r); - SkipSpacesAndLineEnd( &content); + content = fast_atoreal_move(content, (ai_real&)pColor.r); + SkipSpacesAndLineEnd(&content); - content = fast_atoreal_move( content, (ai_real&)pColor.g); - SkipSpacesAndLineEnd( &content); + content = fast_atoreal_move(content, (ai_real&)pColor.g); + SkipSpacesAndLineEnd(&content); - content = fast_atoreal_move( content, (ai_real&)pColor.b); - SkipSpacesAndLineEnd( &content); + content = fast_atoreal_move(content, (ai_real&)pColor.b); + SkipSpacesAndLineEnd(&content); - content = fast_atoreal_move( content, (ai_real&)pColor.a); - SkipSpacesAndLineEnd( &content); - TestClosing( "color"); + content = fast_atoreal_move(content, (ai_real&)pColor.a); + SkipSpacesAndLineEnd(&content); + TestClosing("color"); } - else if( IsElement( "texture")) + else if (IsElement("texture")) { // get name of source texture/sampler - int attrTex = GetAttribute( "texture"); - pSampler.mName = mReader->getAttributeValue( attrTex); + int attrTex = GetAttribute("texture"); + pSampler.mName = mReader->getAttributeValue(attrTex); // get name of UV source channel. Specification demands it to be there, but some exporters // don't write it. It will be the default UV channel in case it's missing. - attrTex = TestAttribute( "texcoord"); - if( attrTex >= 0 ) - pSampler.mUVChannel = mReader->getAttributeValue( attrTex); + attrTex = TestAttribute("texcoord"); + if (attrTex >= 0) + pSampler.mUVChannel = mReader->getAttributeValue(attrTex); //SkipElement(); // as we've read texture, the color needs to be 1,1,1,1 pColor = aiColor4D(1.f, 1.f, 1.f, 1.f); } - else if( IsElement( "technique")) + else if (IsElement("technique")) { - const int _profile = GetAttribute( "profile"); - const char* profile = mReader->getAttributeValue( _profile ); + const int _profile = GetAttribute("profile"); + const char* profile = mReader->getAttributeValue(_profile); // Some extensions are quite useful ... ReadSamplerProperties processes // several extensions in MAYA, OKINO and MAX3D profiles. - if (!::strcmp(profile,"MAYA") || !::strcmp(profile,"MAX3D") || !::strcmp(profile,"OKINO")) + if (!::strcmp(profile, "MAYA") || !::strcmp(profile, "MAX3D") || !::strcmp(profile, "OKINO")) { // get more information on this sampler ReadSamplerProperties(pSampler); } else SkipElement(); } - else if( !IsElement( "extra")) + else if (!IsElement("extra")) { // ignore the rest SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END){ + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { if (mReader->getNodeName() == curElem) break; } @@ -1766,26 +1849,27 @@ void ColladaParser::ReadEffectColor( aiColor4D& pColor, Sampler& pSampler) // ------------------------------------------------------------------------------------------------ // Reads an effect entry containing a float -void ColladaParser::ReadEffectFloat( ai_real& pFloat) +void ColladaParser::ReadEffectFloat(ai_real& pFloat) { - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT){ - if( IsElement( "float")) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { + if (IsElement("float")) { // text content contains a single floats const char* content = GetTextContent(); - content = fast_atoreal_move( content, pFloat); - SkipSpacesAndLineEnd( &content); + content = fast_atoreal_move(content, pFloat); + SkipSpacesAndLineEnd(&content); - TestClosing( "float"); - } else + TestClosing("float"); + } + else { // ignore the rest SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END){ + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { break; } } @@ -1793,54 +1877,55 @@ void ColladaParser::ReadEffectFloat( ai_real& pFloat) // ------------------------------------------------------------------------------------------------ // Reads an effect parameter specification of any kind -void ColladaParser::ReadEffectParam( Collada::EffectParam& pParam) +void ColladaParser::ReadEffectParam(Collada::EffectParam& pParam) { - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "surface")) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { + if (IsElement("surface")) { // image ID given inside tags - TestOpening( "init_from"); + TestOpening("init_from"); const char* content = GetTextContent(); pParam.mType = Param_Surface; pParam.mReference = content; - TestClosing( "init_from"); + TestClosing("init_from"); // don't care for remaining stuff - SkipElement( "surface"); + SkipElement("surface"); } - else if( IsElement( "sampler2D") && (FV_1_4_n == mFormat || FV_1_3_n == mFormat)) + else if (IsElement("sampler2D") && (FV_1_4_n == mFormat || FV_1_3_n == mFormat)) { // surface ID is given inside tags - TestOpening( "source"); + TestOpening("source"); const char* content = GetTextContent(); pParam.mType = Param_Sampler; pParam.mReference = content; - TestClosing( "source"); + TestClosing("source"); // don't care for remaining stuff - SkipElement( "sampler2D"); + SkipElement("sampler2D"); } - else if( IsElement( "sampler2D")) + else if (IsElement("sampler2D")) { // surface ID is given inside tags - TestOpening( "instance_image"); + TestOpening("instance_image"); int attrURL = GetAttribute("url"); - const char* url = mReader->getAttributeValue( attrURL); - if( url[0] != '#') - ThrowException( "Unsupported URL format in instance_image"); + const char* url = mReader->getAttributeValue(attrURL); + if (url[0] != '#') + ThrowException("Unsupported URL format in instance_image"); url++; pParam.mType = Param_Sampler; pParam.mReference = url; - SkipElement( "sampler2D"); - } else + SkipElement("sampler2D"); + } + else { // ignore unknown element SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { break; } } @@ -1850,18 +1935,18 @@ void ColladaParser::ReadEffectParam( Collada::EffectParam& pParam) // Reads the geometry library contents void ColladaParser::ReadGeometryLibrary() { - if( mReader->isEmptyElement()) + if (mReader->isEmptyElement()) return; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "geometry")) + if (IsElement("geometry")) { // read ID. Another entry which is "optional" by design but obligatory in reality - int indexID = GetAttribute( "id"); - std::string id = mReader->getAttributeValue( indexID); + int indexID = GetAttribute("id"); + std::string id = mReader->getAttributeValue(indexID); // TODO: (thom) support SIDs // ai_assert( TestAttribute( "sid") == -1); @@ -1872,23 +1957,24 @@ void ColladaParser::ReadGeometryLibrary() // read the mesh name if it exists const int nameIndex = TestAttribute("name"); - if(nameIndex != -1) + if (nameIndex != -1) { mesh->mName = mReader->getAttributeValue(nameIndex); } // read on from there - ReadGeometry( mesh); - } else + ReadGeometry(mesh); + } + else { // ignore the rest SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "library_geometries") != 0) - ThrowException( "Expected end of element."); + if (strcmp(mReader->getNodeName(), "library_geometries") != 0) + ThrowException("Expected end of element."); break; } @@ -1897,29 +1983,30 @@ void ColladaParser::ReadGeometryLibrary() // ------------------------------------------------------------------------------------------------ // Reads a geometry from the geometry library. -void ColladaParser::ReadGeometry( Collada::Mesh* pMesh) +void ColladaParser::ReadGeometry(Collada::Mesh* pMesh) { - if( mReader->isEmptyElement()) + if (mReader->isEmptyElement()) return; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "mesh")) + if (IsElement("mesh")) { // read on from there - ReadMesh( pMesh); - } else + ReadMesh(pMesh); + } + else { // ignore the rest SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "geometry") != 0) - ThrowException( "Expected end of element."); + if (strcmp(mReader->getNodeName(), "geometry") != 0) + ThrowException("Expected end of element."); break; } @@ -1928,50 +2015,52 @@ void ColladaParser::ReadGeometry( Collada::Mesh* pMesh) // ------------------------------------------------------------------------------------------------ // Reads a mesh from the geometry library -void ColladaParser::ReadMesh( Mesh* pMesh) +void ColladaParser::ReadMesh(Mesh* pMesh) { - if( mReader->isEmptyElement()) + if (mReader->isEmptyElement()) return; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "source")) + if (IsElement("source")) { // we have professionals dealing with this ReadSource(); } - else if( IsElement( "vertices")) + else if (IsElement("vertices")) { // read per-vertex mesh data - ReadVertexData( pMesh); + ReadVertexData(pMesh); } - else if( IsElement( "triangles") || IsElement( "lines") || IsElement( "linestrips") - || IsElement( "polygons") || IsElement( "polylist") || IsElement( "trifans") || IsElement( "tristrips")) + else if (IsElement("triangles") || IsElement("lines") || IsElement("linestrips") + || IsElement("polygons") || IsElement("polylist") || IsElement("trifans") || IsElement("tristrips")) { // read per-index mesh data and faces setup - ReadIndexData( pMesh); - } else + ReadIndexData(pMesh); + } + else { // ignore the restf SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "technique_common") == 0) + if (strcmp(mReader->getNodeName(), "technique_common") == 0) { // end of another meaningless element - read over it } - else if( strcmp( mReader->getNodeName(), "mesh") == 0) + else if (strcmp(mReader->getNodeName(), "mesh") == 0) { // end of element - we're done here break; - } else + } + else { // everything else should be punished - ThrowException( "Expected end of element."); + ThrowException("Expected end of element."); } } } @@ -1981,44 +2070,46 @@ void ColladaParser::ReadMesh( Mesh* pMesh) // Reads a source element void ColladaParser::ReadSource() { - int indexID = GetAttribute( "id"); - std::string sourceID = mReader->getAttributeValue( indexID); + int indexID = GetAttribute("id"); + std::string sourceID = mReader->getAttributeValue(indexID); - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "float_array") || IsElement( "IDREF_array") || IsElement( "Name_array")) + if (IsElement("float_array") || IsElement("IDREF_array") || IsElement("Name_array")) { ReadDataArray(); } - else if( IsElement( "technique_common")) + else if (IsElement("technique_common")) { // I don't care for your profiles } - else if( IsElement( "accessor")) + else if (IsElement("accessor")) { - ReadAccessor( sourceID); - } else + ReadAccessor(sourceID); + } + else { // ignore the rest SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "source") == 0) + if (strcmp(mReader->getNodeName(), "source") == 0) { // end of - we're done break; } - else if( strcmp( mReader->getNodeName(), "technique_common") == 0) + else if (strcmp(mReader->getNodeName(), "technique_common") == 0) { // end of another meaningless element - read over it - } else + } + else { // everything else should be punished - ThrowException( "Expected end of element."); + ThrowException("Expected end of element."); } } } @@ -2030,83 +2121,84 @@ void ColladaParser::ReadDataArray() { std::string elmName = mReader->getNodeName(); bool isStringArray = (elmName == "IDREF_array" || elmName == "Name_array"); - bool isEmptyElement = mReader->isEmptyElement(); + bool isEmptyElement = mReader->isEmptyElement(); // read attributes - int indexID = GetAttribute( "id"); - std::string id = mReader->getAttributeValue( indexID); - int indexCount = GetAttribute( "count"); - unsigned int count = (unsigned int) mReader->getAttributeValueAsInt( indexCount); + int indexID = GetAttribute("id"); + std::string id = mReader->getAttributeValue(indexID); + int indexCount = GetAttribute("count"); + unsigned int count = (unsigned int)mReader->getAttributeValueAsInt(indexCount); const char* content = TestTextContent(); - // read values and store inside an array in the data library - mDataLibrary[id] = Data(); - Data& data = mDataLibrary[id]; - data.mIsStringArray = isStringArray; + // read values and store inside an array in the data library + mDataLibrary[id] = Data(); + Data& data = mDataLibrary[id]; + data.mIsStringArray = isStringArray; - // some exporters write empty data arrays, but we need to conserve them anyways because others might reference them - if (content) - { - if( isStringArray) + // some exporters write empty data arrays, but we need to conserve them anyways because others might reference them + if (content) + { + if (isStringArray) { - data.mStrings.reserve( count); + data.mStrings.reserve(count); std::string s; - for( unsigned int a = 0; a < count; a++) + for (unsigned int a = 0; a < count; a++) { - if( *content == 0) - ThrowException( "Expected more values while reading IDREF_array contents."); + if (*content == 0) + ThrowException("Expected more values while reading IDREF_array contents."); s.clear(); - while( !IsSpaceOrNewLine( *content)) + while (!IsSpaceOrNewLine(*content)) s += *content++; - data.mStrings.push_back( s); + data.mStrings.push_back(s); - SkipSpacesAndLineEnd( &content); + SkipSpacesAndLineEnd(&content); } - } else + } + else { - data.mValues.reserve( count); + data.mValues.reserve(count); - for( unsigned int a = 0; a < count; a++) + for (unsigned int a = 0; a < count; a++) { - if( *content == 0) - ThrowException( "Expected more values while reading float_array contents."); + if (*content == 0) + ThrowException("Expected more values while reading float_array contents."); ai_real value; // read a number - content = fast_atoreal_move( content, value); - data.mValues.push_back( value); + content = fast_atoreal_move(content, value); + data.mValues.push_back(value); // skip whitespace after it - SkipSpacesAndLineEnd( &content); + SkipSpacesAndLineEnd(&content); } } } - // test for closing tag - if( !isEmptyElement ) - TestClosing( elmName.c_str()); + // test for closing tag + if (!isEmptyElement) + TestClosing(elmName.c_str()); } // ------------------------------------------------------------------------------------------------ // Reads an accessor and stores it in the global library -void ColladaParser::ReadAccessor( const std::string& pID) +void ColladaParser::ReadAccessor(const std::string& pID) { // read accessor attributes - int attrSource = GetAttribute( "source"); - const char* source = mReader->getAttributeValue( attrSource); - if( source[0] != '#') - ThrowException( format() << "Unknown reference format in url \"" << source << "\" in source attribute of element." ); - int attrCount = GetAttribute( "count"); - unsigned int count = (unsigned int) mReader->getAttributeValueAsInt( attrCount); - int attrOffset = TestAttribute( "offset"); + int attrSource = GetAttribute("source"); + const char* source = mReader->getAttributeValue(attrSource); + if (source[0] != '#') + ThrowException(format() << "Unknown reference format in url \"" << source << "\" in source attribute of element."); + int attrCount = GetAttribute("count"); + unsigned int count = (unsigned int)mReader->getAttributeValueAsInt(attrCount); + int attrOffset = TestAttribute("offset"); unsigned int offset = 0; - if( attrOffset > -1) - offset = (unsigned int) mReader->getAttributeValueAsInt( attrOffset); - int attrStride = TestAttribute( "stride"); + if (attrOffset > -1) + offset = (unsigned int)mReader->getAttributeValueAsInt(attrOffset); + int attrStride = TestAttribute("stride"); unsigned int stride = 1; - if( attrStride > -1) - stride = (unsigned int) mReader->getAttributeValueAsInt( attrStride); + if (attrStride > -1) + stride = (unsigned int)mReader->getAttributeValueAsInt(attrStride); // store in the library under the given ID mAccessorLibrary[pID] = Accessor(); @@ -2114,77 +2206,78 @@ void ColladaParser::ReadAccessor( const std::string& pID) acc.mCount = count; acc.mOffset = offset; acc.mStride = stride; - acc.mSource = source+1; // ignore the leading '#' + acc.mSource = source + 1; // ignore the leading '#' acc.mSize = 0; // gets incremented with every param // and read the components - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "param")) + if (IsElement("param")) { // read data param - int attrName = TestAttribute( "name"); + int attrName = TestAttribute("name"); std::string name; - if( attrName > -1) + if (attrName > -1) { - name = mReader->getAttributeValue( attrName); + name = mReader->getAttributeValue(attrName); // analyse for common type components and store it's sub-offset in the corresponding field /* Cartesian coordinates */ - if( name == "X") acc.mSubOffset[0] = acc.mParams.size(); - else if( name == "Y") acc.mSubOffset[1] = acc.mParams.size(); - else if( name == "Z") acc.mSubOffset[2] = acc.mParams.size(); + if (name == "X") acc.mSubOffset[0] = acc.mParams.size(); + else if (name == "Y") acc.mSubOffset[1] = acc.mParams.size(); + else if (name == "Z") acc.mSubOffset[2] = acc.mParams.size(); /* RGBA colors */ - else if( name == "R") acc.mSubOffset[0] = acc.mParams.size(); - else if( name == "G") acc.mSubOffset[1] = acc.mParams.size(); - else if( name == "B") acc.mSubOffset[2] = acc.mParams.size(); - else if( name == "A") acc.mSubOffset[3] = acc.mParams.size(); + else if (name == "R") acc.mSubOffset[0] = acc.mParams.size(); + else if (name == "G") acc.mSubOffset[1] = acc.mParams.size(); + else if (name == "B") acc.mSubOffset[2] = acc.mParams.size(); + else if (name == "A") acc.mSubOffset[3] = acc.mParams.size(); /* UVWQ (STPQ) texture coordinates */ - else if( name == "S") acc.mSubOffset[0] = acc.mParams.size(); - else if( name == "T") acc.mSubOffset[1] = acc.mParams.size(); - else if( name == "P") acc.mSubOffset[2] = acc.mParams.size(); - // else if( name == "Q") acc.mSubOffset[3] = acc.mParams.size(); - /* 4D uv coordinates are not supported in Assimp */ + else if (name == "S") acc.mSubOffset[0] = acc.mParams.size(); + else if (name == "T") acc.mSubOffset[1] = acc.mParams.size(); + else if (name == "P") acc.mSubOffset[2] = acc.mParams.size(); + // else if( name == "Q") acc.mSubOffset[3] = acc.mParams.size(); + /* 4D uv coordinates are not supported in Assimp */ - /* Generic extra data, interpreted as UV data, too*/ - else if( name == "U") acc.mSubOffset[0] = acc.mParams.size(); - else if( name == "V") acc.mSubOffset[1] = acc.mParams.size(); + /* Generic extra data, interpreted as UV data, too*/ + else if (name == "U") acc.mSubOffset[0] = acc.mParams.size(); + else if (name == "V") acc.mSubOffset[1] = acc.mParams.size(); //else // DefaultLogger::get()->warn( format() << "Unknown accessor parameter \"" << name << "\". Ignoring data channel." ); } // read data type - int attrType = TestAttribute( "type"); - if( attrType > -1) + int attrType = TestAttribute("type"); + if (attrType > -1) { // for the moment we only distinguish between a 4x4 matrix and anything else. // TODO: (thom) I don't have a spec here at work. Check if there are other multi-value types // which should be tested for here. - std::string type = mReader->getAttributeValue( attrType); - if( type == "float4x4") + std::string type = mReader->getAttributeValue(attrType); + if (type == "float4x4") acc.mSize += 16; else acc.mSize += 1; } - acc.mParams.push_back( name); + acc.mParams.push_back(name); // skip remaining stuff of this element, if any SkipElement(); - } else + } + else { - ThrowException( format() << "Unexpected sub element <" << mReader->getNodeName() << "> in tag " ); + ThrowException(format() << "Unexpected sub element <" << mReader->getNodeName() << "> in tag "); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "accessor") != 0) - ThrowException( "Expected end of element."); + if (strcmp(mReader->getNodeName(), "accessor") != 0) + ThrowException("Expected end of element."); break; } } @@ -2192,29 +2285,30 @@ void ColladaParser::ReadAccessor( const std::string& pID) // ------------------------------------------------------------------------------------------------ // Reads input declarations of per-vertex mesh data into the given mesh -void ColladaParser::ReadVertexData( Mesh* pMesh) +void ColladaParser::ReadVertexData(Mesh* pMesh) { // extract the ID of the element. Not that we care, but to catch strange referencing schemes we should warn about - int attrID= GetAttribute( "id"); - pMesh->mVertexID = mReader->getAttributeValue( attrID); + int attrID = GetAttribute("id"); + pMesh->mVertexID = mReader->getAttributeValue(attrID); // a number of elements - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "input")) + if (IsElement("input")) { - ReadInputChannel( pMesh->mPerVertexData); - } else + ReadInputChannel(pMesh->mPerVertexData); + } + else { - ThrowException( format() << "Unexpected sub element <" << mReader->getNodeName() << "> in tag " ); + ThrowException(format() << "Unexpected sub element <" << mReader->getNodeName() << "> in tag "); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "vertices") != 0) - ThrowException( "Expected end of element."); + if (strcmp(mReader->getNodeName(), "vertices") != 0) + ThrowException("Expected end of element."); break; } @@ -2223,79 +2317,79 @@ void ColladaParser::ReadVertexData( Mesh* pMesh) // ------------------------------------------------------------------------------------------------ // Reads input declarations of per-index mesh data into the given mesh -void ColladaParser::ReadIndexData( Mesh* pMesh) +void ColladaParser::ReadIndexData(Mesh* pMesh) { std::vector vcount; std::vector perIndexData; // read primitive count from the attribute - int attrCount = GetAttribute( "count"); - size_t numPrimitives = (size_t) mReader->getAttributeValueAsInt( attrCount); + int attrCount = GetAttribute("count"); + size_t numPrimitives = (size_t)mReader->getAttributeValueAsInt(attrCount); // some mesh types (e.g. tristrips) don't specify primitive count upfront, // so we need to sum up the actual number of primitives while we read the

-tags size_t actualPrimitives = 0; // material subgroup - int attrMaterial = TestAttribute( "material"); + int attrMaterial = TestAttribute("material"); SubMesh subgroup; - if( attrMaterial > -1) - subgroup.mMaterial = mReader->getAttributeValue( attrMaterial); + if (attrMaterial > -1) + subgroup.mMaterial = mReader->getAttributeValue(attrMaterial); // distinguish between polys and triangles std::string elementName = mReader->getNodeName(); PrimitiveType primType = Prim_Invalid; - if( IsElement( "lines")) + if (IsElement("lines")) primType = Prim_Lines; - else if( IsElement( "linestrips")) + else if (IsElement("linestrips")) primType = Prim_LineStrip; - else if( IsElement( "polygons")) + else if (IsElement("polygons")) primType = Prim_Polygon; - else if( IsElement( "polylist")) + else if (IsElement("polylist")) primType = Prim_Polylist; - else if( IsElement( "triangles")) + else if (IsElement("triangles")) primType = Prim_Triangles; - else if( IsElement( "trifans")) + else if (IsElement("trifans")) primType = Prim_TriFans; - else if( IsElement( "tristrips")) + else if (IsElement("tristrips")) primType = Prim_TriStrips; - ai_assert( primType != Prim_Invalid); + ai_assert(primType != Prim_Invalid); // also a number of elements, but in addition a

primitive collection and probably index counts for all primitives - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "input")) + if (IsElement("input")) { - ReadInputChannel( perIndexData); + ReadInputChannel(perIndexData); } - else if( IsElement( "vcount")) + else if (IsElement("vcount")) { - if( !mReader->isEmptyElement()) + if (!mReader->isEmptyElement()) { if (numPrimitives) // It is possible to define a mesh without any primitives { // case - specifies the number of indices for each polygon const char* content = GetTextContent(); - vcount.reserve( numPrimitives); - for( unsigned int a = 0; a < numPrimitives; a++) + vcount.reserve(numPrimitives); + for (unsigned int a = 0; a < numPrimitives; a++) { - if( *content == 0) - ThrowException( "Expected more values while reading contents."); + if (*content == 0) + ThrowException("Expected more values while reading contents."); // read a number - vcount.push_back( (size_t) strtoul10( content, &content)); + vcount.push_back((size_t)strtoul10(content, &content)); // skip whitespace after it - SkipSpacesAndLineEnd( &content); + SkipSpacesAndLineEnd(&content); } } - TestClosing( "vcount"); + TestClosing("vcount"); } } - else if( IsElement( "p")) + else if (IsElement("p")) { - if( !mReader->isEmptyElement()) + if (!mReader->isEmptyElement()) { // now here the actual fun starts - these are the indices to construct the mesh data from actualPrimitives += ReadPrimitives(pMesh, perIndexData, numPrimitives, vcount, primType); @@ -2304,23 +2398,25 @@ void ColladaParser::ReadIndexData( Mesh* pMesh) else if (IsElement("extra")) { SkipElement("extra"); - } else if ( IsElement("ph")) { + } + else if (IsElement("ph")) { SkipElement("ph"); - } else { - ThrowException( format() << "Unexpected sub element <" << mReader->getNodeName() << "> in tag <" << elementName << ">" ); + } + else { + ThrowException(format() << "Unexpected sub element <" << mReader->getNodeName() << "> in tag <" << elementName << ">"); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( mReader->getNodeName() != elementName) - ThrowException( format() << "Expected end of <" << elementName << "> element." ); + if (mReader->getNodeName() != elementName) + ThrowException(format() << "Expected end of <" << elementName << "> element."); break; } } #ifdef ASSIMP_BUILD_DEBUG - if (primType != Prim_TriFans && primType != Prim_TriStrips && primType != Prim_LineStrip && + if (primType != Prim_TriFans && primType != Prim_TriStrips && primType != Prim_LineStrip && primType != Prim_Lines) { // this is ONLY to workaround a bug in SketchUp 15.3.331 where it writes the wrong 'count' when it writes out the 'lines'. ai_assert(actualPrimitives == numPrimitives); } @@ -2333,42 +2429,42 @@ void ColladaParser::ReadIndexData( Mesh* pMesh) // ------------------------------------------------------------------------------------------------ // Reads a single input channel element and stores it in the given array, if valid -void ColladaParser::ReadInputChannel( std::vector& poChannels) +void ColladaParser::ReadInputChannel(std::vector& poChannels) { InputChannel channel; // read semantic - int attrSemantic = GetAttribute( "semantic"); - std::string semantic = mReader->getAttributeValue( attrSemantic); - channel.mType = GetTypeForSemantic( semantic); + int attrSemantic = GetAttribute("semantic"); + std::string semantic = mReader->getAttributeValue(attrSemantic); + channel.mType = GetTypeForSemantic(semantic); // read source - int attrSource = GetAttribute( "source"); - const char* source = mReader->getAttributeValue( attrSource); - if( source[0] != '#') - ThrowException( format() << "Unknown reference format in url \"" << source << "\" in source attribute of element." ); - channel.mAccessor = source+1; // skipping the leading #, hopefully the remaining text is the accessor ID only + int attrSource = GetAttribute("source"); + const char* source = mReader->getAttributeValue(attrSource); + if (source[0] != '#') + ThrowException(format() << "Unknown reference format in url \"" << source << "\" in source attribute of element."); + channel.mAccessor = source + 1; // skipping the leading #, hopefully the remaining text is the accessor ID only // read index offset, if per-index - int attrOffset = TestAttribute( "offset"); - if( attrOffset > -1) - channel.mOffset = mReader->getAttributeValueAsInt( attrOffset); + int attrOffset = TestAttribute("offset"); + if (attrOffset > -1) + channel.mOffset = mReader->getAttributeValueAsInt(attrOffset); // read set if texture coordinates - if(channel.mType == IT_Texcoord || channel.mType == IT_Color){ + if (channel.mType == IT_Texcoord || channel.mType == IT_Color) { int attrSet = TestAttribute("set"); - if(attrSet > -1){ - attrSet = mReader->getAttributeValueAsInt( attrSet); - if(attrSet < 0) - ThrowException( format() << "Invalid index \"" << (attrSet) << "\" in set attribute of element" ); + if (attrSet > -1) { + attrSet = mReader->getAttributeValueAsInt(attrSet); + if (attrSet < 0) + ThrowException(format() << "Invalid index \"" << (attrSet) << "\" in set attribute of element"); channel.mIndex = attrSet; } } // store, if valid type - if( channel.mType != IT_Invalid) - poChannels.push_back( channel); + if (channel.mType != IT_Invalid) + poChannels.push_back(channel); // skip remaining stuff of this element, if any SkipElement(); @@ -2376,116 +2472,118 @@ void ColladaParser::ReadInputChannel( std::vector& poChannels) // ------------------------------------------------------------------------------------------------ // Reads a

primitive index list and assembles the mesh data into the given mesh -size_t ColladaParser::ReadPrimitives( Mesh* pMesh, std::vector& pPerIndexChannels, +size_t ColladaParser::ReadPrimitives(Mesh* pMesh, std::vector& pPerIndexChannels, size_t pNumPrimitives, const std::vector& pVCount, PrimitiveType pPrimType) { // determine number of indices coming per vertex // find the offset index for all per-vertex channels size_t numOffsets = 1; size_t perVertexOffset = SIZE_MAX; // invalid value - for( const InputChannel& channel : pPerIndexChannels) + for (const InputChannel& channel : pPerIndexChannels) { - numOffsets = std::max( numOffsets, channel.mOffset+1); - if( channel.mType == IT_Vertex) + numOffsets = std::max(numOffsets, channel.mOffset + 1); + if (channel.mType == IT_Vertex) perVertexOffset = channel.mOffset; } // determine the expected number of indices size_t expectedPointCount = 0; - switch( pPrimType) + switch (pPrimType) { - case Prim_Polylist: - { - for( size_t i : pVCount) - expectedPointCount += i; - break; - } - case Prim_Lines: - expectedPointCount = 2 * pNumPrimitives; - break; - case Prim_Triangles: - expectedPointCount = 3 * pNumPrimitives; - break; - default: - // other primitive types don't state the index count upfront... we need to guess - break; + case Prim_Polylist: + { + for (size_t i : pVCount) + expectedPointCount += i; + break; + } + case Prim_Lines: + expectedPointCount = 2 * pNumPrimitives; + break; + case Prim_Triangles: + expectedPointCount = 3 * pNumPrimitives; + break; + default: + // other primitive types don't state the index count upfront... we need to guess + break; } // and read all indices into a temporary array std::vector indices; - if( expectedPointCount > 0) - indices.reserve( expectedPointCount * numOffsets); + if (expectedPointCount > 0) + indices.reserve(expectedPointCount * numOffsets); if (pNumPrimitives > 0) // It is possible to not contain any indices { const char* content = GetTextContent(); - while( *content != 0) + while (*content != 0) { // read a value. // Hack: (thom) Some exporters put negative indices sometimes. We just try to carry on anyways. - int value = std::max( 0, strtol10( content, &content)); - indices.push_back( size_t( value)); + int value = std::max(0, strtol10(content, &content)); + indices.push_back(size_t(value)); // skip whitespace after it - SkipSpacesAndLineEnd( &content); + SkipSpacesAndLineEnd(&content); } } - // complain if the index count doesn't fit - if( expectedPointCount > 0 && indices.size() != expectedPointCount * numOffsets) { + // complain if the index count doesn't fit + if (expectedPointCount > 0 && indices.size() != expectedPointCount * numOffsets) { if (pPrimType == Prim_Lines) { // HACK: We just fix this number since SketchUp 15.3.331 writes the wrong 'count' for 'lines' - ReportWarning( "Expected different index count in

element, %zu instead of %zu.", indices.size(), expectedPointCount * numOffsets); + ReportWarning("Expected different index count in

element, %zu instead of %zu.", indices.size(), expectedPointCount * numOffsets); pNumPrimitives = (indices.size() / numOffsets) / 2; - } else - ThrowException( "Expected different index count in

element."); + } + else + ThrowException("Expected different index count in

element."); - } else if( expectedPointCount == 0 && (indices.size() % numOffsets) != 0) - ThrowException( "Expected different index count in

element."); + } + else if (expectedPointCount == 0 && (indices.size() % numOffsets) != 0) + ThrowException("Expected different index count in

element."); - // find the data for all sources - for( std::vector::iterator it = pMesh->mPerVertexData.begin(); it != pMesh->mPerVertexData.end(); ++it) + // find the data for all sources + for (std::vector::iterator it = pMesh->mPerVertexData.begin(); it != pMesh->mPerVertexData.end(); ++it) { InputChannel& input = *it; - if( input.mResolved) + if (input.mResolved) continue; // find accessor - input.mResolved = &ResolveLibraryReference( mAccessorLibrary, input.mAccessor); + input.mResolved = &ResolveLibraryReference(mAccessorLibrary, input.mAccessor); // resolve accessor's data pointer as well, if necessary const Accessor* acc = input.mResolved; - if( !acc->mData) - acc->mData = &ResolveLibraryReference( mDataLibrary, acc->mSource); + if (!acc->mData) + acc->mData = &ResolveLibraryReference(mDataLibrary, acc->mSource); } // and the same for the per-index channels - for( std::vector::iterator it = pPerIndexChannels.begin(); it != pPerIndexChannels.end(); ++it) + for (std::vector::iterator it = pPerIndexChannels.begin(); it != pPerIndexChannels.end(); ++it) { InputChannel& input = *it; - if( input.mResolved) + if (input.mResolved) continue; // ignore vertex pointer, it doesn't refer to an accessor - if( input.mType == IT_Vertex) + if (input.mType == IT_Vertex) { // warn if the vertex channel does not refer to the element in the same mesh - if( input.mAccessor != pMesh->mVertexID) - ThrowException( "Unsupported vertex referencing scheme."); + if (input.mAccessor != pMesh->mVertexID) + ThrowException("Unsupported vertex referencing scheme."); continue; } // find accessor - input.mResolved = &ResolveLibraryReference( mAccessorLibrary, input.mAccessor); + input.mResolved = &ResolveLibraryReference(mAccessorLibrary, input.mAccessor); // resolve accessor's data pointer as well, if necessary const Accessor* acc = input.mResolved; - if( !acc->mData) - acc->mData = &ResolveLibraryReference( mDataLibrary, acc->mSource); + if (!acc->mData) + acc->mData = &ResolveLibraryReference(mDataLibrary, acc->mSource); } // For continued primitives, the given count does not come all in one

, but only one primitive per

size_t numPrimitives = pNumPrimitives; - if( pPrimType == Prim_TriFans || pPrimType == Prim_Polygon) + if (pPrimType == Prim_TriFans || pPrimType == Prim_Polygon) numPrimitives = 1; // For continued primitives, the given count is actually the number of

's inside the parent tag - if ( pPrimType == Prim_TriStrips){ + if (pPrimType == Prim_TriStrips) { size_t numberOfVertices = indices.size() / numOffsets; numPrimitives = numberOfVertices - 2; } @@ -2494,66 +2592,66 @@ size_t ColladaParser::ReadPrimitives( Mesh* pMesh, std::vector& pP numPrimitives = numberOfVertices - 1; } - pMesh->mFaceSize.reserve( numPrimitives); - pMesh->mFacePosIndices.reserve( indices.size() / numOffsets); + pMesh->mFaceSize.reserve(numPrimitives); + pMesh->mFacePosIndices.reserve(indices.size() / numOffsets); size_t polylistStartVertex = 0; for (size_t currentPrimitive = 0; currentPrimitive < numPrimitives; currentPrimitive++) { // determine number of points for this primitive size_t numPoints = 0; - switch( pPrimType) + switch (pPrimType) { - case Prim_Lines: - numPoints = 2; - for (size_t currentVertex = 0; currentVertex < numPoints; currentVertex++) - CopyVertex(currentVertex, numOffsets, numPoints, perVertexOffset, pMesh, pPerIndexChannels, currentPrimitive, indices); - break; - case Prim_LineStrip: - numPoints = 2; - for (size_t currentVertex = 0; currentVertex < numPoints; currentVertex++) - CopyVertex(currentVertex, numOffsets, 1, perVertexOffset, pMesh, pPerIndexChannels, currentPrimitive, indices); - break; - case Prim_Triangles: - numPoints = 3; - for (size_t currentVertex = 0; currentVertex < numPoints; currentVertex++) - CopyVertex(currentVertex, numOffsets, numPoints, perVertexOffset, pMesh, pPerIndexChannels, currentPrimitive, indices); - break; - case Prim_TriStrips: - numPoints = 3; - ReadPrimTriStrips(numOffsets, perVertexOffset, pMesh, pPerIndexChannels, currentPrimitive, indices); - break; - case Prim_Polylist: - numPoints = pVCount[currentPrimitive]; - for (size_t currentVertex = 0; currentVertex < numPoints; currentVertex++) - CopyVertex(polylistStartVertex + currentVertex, numOffsets, 1, perVertexOffset, pMesh, pPerIndexChannels, 0, indices); - polylistStartVertex += numPoints; - break; - case Prim_TriFans: - case Prim_Polygon: - numPoints = indices.size() / numOffsets; - for (size_t currentVertex = 0; currentVertex < numPoints; currentVertex++) - CopyVertex(currentVertex, numOffsets, numPoints, perVertexOffset, pMesh, pPerIndexChannels, currentPrimitive, indices); - break; - default: - // LineStrip is not supported due to expected index unmangling - ThrowException( "Unsupported primitive type."); - break; + case Prim_Lines: + numPoints = 2; + for (size_t currentVertex = 0; currentVertex < numPoints; currentVertex++) + CopyVertex(currentVertex, numOffsets, numPoints, perVertexOffset, pMesh, pPerIndexChannels, currentPrimitive, indices); + break; + case Prim_LineStrip: + numPoints = 2; + for (size_t currentVertex = 0; currentVertex < numPoints; currentVertex++) + CopyVertex(currentVertex, numOffsets, 1, perVertexOffset, pMesh, pPerIndexChannels, currentPrimitive, indices); + break; + case Prim_Triangles: + numPoints = 3; + for (size_t currentVertex = 0; currentVertex < numPoints; currentVertex++) + CopyVertex(currentVertex, numOffsets, numPoints, perVertexOffset, pMesh, pPerIndexChannels, currentPrimitive, indices); + break; + case Prim_TriStrips: + numPoints = 3; + ReadPrimTriStrips(numOffsets, perVertexOffset, pMesh, pPerIndexChannels, currentPrimitive, indices); + break; + case Prim_Polylist: + numPoints = pVCount[currentPrimitive]; + for (size_t currentVertex = 0; currentVertex < numPoints; currentVertex++) + CopyVertex(polylistStartVertex + currentVertex, numOffsets, 1, perVertexOffset, pMesh, pPerIndexChannels, 0, indices); + polylistStartVertex += numPoints; + break; + case Prim_TriFans: + case Prim_Polygon: + numPoints = indices.size() / numOffsets; + for (size_t currentVertex = 0; currentVertex < numPoints; currentVertex++) + CopyVertex(currentVertex, numOffsets, numPoints, perVertexOffset, pMesh, pPerIndexChannels, currentPrimitive, indices); + break; + default: + // LineStrip is not supported due to expected index unmangling + ThrowException("Unsupported primitive type."); + break; } // store the face size to later reconstruct the face from - pMesh->mFaceSize.push_back( numPoints); + pMesh->mFaceSize.push_back(numPoints); } // if I ever get my hands on that guy who invented this steaming pile of indirection... - TestClosing( "p"); + TestClosing("p"); return numPrimitives; } ///@note This function willn't work correctly if both PerIndex and PerVertex channels have same channels. ///For example if TEXCOORD present in both and tags this function will create wrong uv coordinates. ///It's not clear from COLLADA documentation is this allowed or not. For now only exporter fixed to avoid such behavior -void ColladaParser::CopyVertex(size_t currentVertex, size_t numOffsets, size_t numPoints, size_t perVertexOffset, Mesh* pMesh, std::vector& pPerIndexChannels, size_t currentPrimitive, const std::vector& indices){ +void ColladaParser::CopyVertex(size_t currentVertex, size_t numOffsets, size_t numPoints, size_t perVertexOffset, Mesh* pMesh, std::vector& pPerIndexChannels, size_t currentPrimitive, const std::vector& indices) { // calculate the base offset of the vertex whose attributes we ant to copy size_t baseOffset = currentPrimitive * numOffsets * numPoints + currentVertex * numOffsets; @@ -2571,8 +2669,8 @@ void ColladaParser::CopyVertex(size_t currentVertex, size_t numOffsets, size_t n pMesh->mFacePosIndices.push_back(indices[baseOffset + perVertexOffset]); } -void ColladaParser::ReadPrimTriStrips(size_t numOffsets, size_t perVertexOffset, Mesh* pMesh, std::vector& pPerIndexChannels, size_t currentPrimitive, const std::vector& indices){ - if (currentPrimitive % 2 != 0){ +void ColladaParser::ReadPrimTriStrips(size_t numOffsets, size_t perVertexOffset, Mesh* pMesh, std::vector& pPerIndexChannels, size_t currentPrimitive, const std::vector& indices) { + if (currentPrimitive % 2 != 0) { //odd tristrip triangles need their indices mangled, to preserve winding direction CopyVertex(1, numOffsets, 1, perVertexOffset, pMesh, pPerIndexChannels, currentPrimitive, indices); CopyVertex(0, numOffsets, 1, perVertexOffset, pMesh, pPerIndexChannels, currentPrimitive, indices); @@ -2587,108 +2685,110 @@ void ColladaParser::ReadPrimTriStrips(size_t numOffsets, size_t perVertexOffset, // ------------------------------------------------------------------------------------------------ // Extracts a single object from an input channel and stores it in the appropriate mesh data array -void ColladaParser::ExtractDataObjectFromChannel( const InputChannel& pInput, size_t pLocalIndex, Mesh* pMesh) +void ColladaParser::ExtractDataObjectFromChannel(const InputChannel& pInput, size_t pLocalIndex, Mesh* pMesh) { // ignore vertex referrer - we handle them that separate - if( pInput.mType == IT_Vertex) + if (pInput.mType == IT_Vertex) return; const Accessor& acc = *pInput.mResolved; - if( pLocalIndex >= acc.mCount) - ThrowException( format() << "Invalid data index (" << pLocalIndex << "/" << acc.mCount << ") in primitive specification" ); + if (pLocalIndex >= acc.mCount) + ThrowException(format() << "Invalid data index (" << pLocalIndex << "/" << acc.mCount << ") in primitive specification"); // get a pointer to the start of the data object referred to by the accessor and the local index - const ai_real* dataObject = &(acc.mData->mValues[0]) + acc.mOffset + pLocalIndex* acc.mStride; + const ai_real* dataObject = &(acc.mData->mValues[0]) + acc.mOffset + pLocalIndex * acc.mStride; // assemble according to the accessors component sub-offset list. We don't care, yet, // what kind of object exactly we're extracting here ai_real obj[4]; - for( size_t c = 0; c < 4; ++c) + for (size_t c = 0; c < 4; ++c) obj[c] = dataObject[acc.mSubOffset[c]]; // now we reinterpret it according to the type we're reading here - switch( pInput.mType) + switch (pInput.mType) { - case IT_Position: // ignore all position streams except 0 - there can be only one position - if( pInput.mIndex == 0) - pMesh->mPositions.push_back( aiVector3D( obj[0], obj[1], obj[2])); - else - ASSIMP_LOG_ERROR("Collada: just one vertex position stream supported"); - break; - case IT_Normal: - // pad to current vertex count if necessary - if( pMesh->mNormals.size() < pMesh->mPositions.size()-1) - pMesh->mNormals.insert( pMesh->mNormals.end(), pMesh->mPositions.size() - pMesh->mNormals.size() - 1, aiVector3D( 0, 1, 0)); + case IT_Position: // ignore all position streams except 0 - there can be only one position + if (pInput.mIndex == 0) + pMesh->mPositions.push_back(aiVector3D(obj[0], obj[1], obj[2])); + else + ASSIMP_LOG_ERROR("Collada: just one vertex position stream supported"); + break; + case IT_Normal: + // pad to current vertex count if necessary + if (pMesh->mNormals.size() < pMesh->mPositions.size() - 1) + pMesh->mNormals.insert(pMesh->mNormals.end(), pMesh->mPositions.size() - pMesh->mNormals.size() - 1, aiVector3D(0, 1, 0)); - // ignore all normal streams except 0 - there can be only one normal - if( pInput.mIndex == 0) - pMesh->mNormals.push_back( aiVector3D( obj[0], obj[1], obj[2])); - else - ASSIMP_LOG_ERROR("Collada: just one vertex normal stream supported"); - break; - case IT_Tangent: - // pad to current vertex count if necessary - if( pMesh->mTangents.size() < pMesh->mPositions.size()-1) - pMesh->mTangents.insert( pMesh->mTangents.end(), pMesh->mPositions.size() - pMesh->mTangents.size() - 1, aiVector3D( 1, 0, 0)); + // ignore all normal streams except 0 - there can be only one normal + if (pInput.mIndex == 0) + pMesh->mNormals.push_back(aiVector3D(obj[0], obj[1], obj[2])); + else + ASSIMP_LOG_ERROR("Collada: just one vertex normal stream supported"); + break; + case IT_Tangent: + // pad to current vertex count if necessary + if (pMesh->mTangents.size() < pMesh->mPositions.size() - 1) + pMesh->mTangents.insert(pMesh->mTangents.end(), pMesh->mPositions.size() - pMesh->mTangents.size() - 1, aiVector3D(1, 0, 0)); - // ignore all tangent streams except 0 - there can be only one tangent - if( pInput.mIndex == 0) - pMesh->mTangents.push_back( aiVector3D( obj[0], obj[1], obj[2])); - else - ASSIMP_LOG_ERROR("Collada: just one vertex tangent stream supported"); - break; - case IT_Bitangent: - // pad to current vertex count if necessary - if( pMesh->mBitangents.size() < pMesh->mPositions.size()-1) - pMesh->mBitangents.insert( pMesh->mBitangents.end(), pMesh->mPositions.size() - pMesh->mBitangents.size() - 1, aiVector3D( 0, 0, 1)); + // ignore all tangent streams except 0 - there can be only one tangent + if (pInput.mIndex == 0) + pMesh->mTangents.push_back(aiVector3D(obj[0], obj[1], obj[2])); + else + ASSIMP_LOG_ERROR("Collada: just one vertex tangent stream supported"); + break; + case IT_Bitangent: + // pad to current vertex count if necessary + if (pMesh->mBitangents.size() < pMesh->mPositions.size() - 1) + pMesh->mBitangents.insert(pMesh->mBitangents.end(), pMesh->mPositions.size() - pMesh->mBitangents.size() - 1, aiVector3D(0, 0, 1)); - // ignore all bitangent streams except 0 - there can be only one bitangent - if( pInput.mIndex == 0) - pMesh->mBitangents.push_back( aiVector3D( obj[0], obj[1], obj[2])); - else - ASSIMP_LOG_ERROR("Collada: just one vertex bitangent stream supported"); - break; - case IT_Texcoord: - // up to 4 texture coord sets are fine, ignore the others - if( pInput.mIndex < AI_MAX_NUMBER_OF_TEXTURECOORDS) + // ignore all bitangent streams except 0 - there can be only one bitangent + if (pInput.mIndex == 0) + pMesh->mBitangents.push_back(aiVector3D(obj[0], obj[1], obj[2])); + else + ASSIMP_LOG_ERROR("Collada: just one vertex bitangent stream supported"); + break; + case IT_Texcoord: + // up to 4 texture coord sets are fine, ignore the others + if (pInput.mIndex < AI_MAX_NUMBER_OF_TEXTURECOORDS) + { + // pad to current vertex count if necessary + if (pMesh->mTexCoords[pInput.mIndex].size() < pMesh->mPositions.size() - 1) + pMesh->mTexCoords[pInput.mIndex].insert(pMesh->mTexCoords[pInput.mIndex].end(), + pMesh->mPositions.size() - pMesh->mTexCoords[pInput.mIndex].size() - 1, aiVector3D(0, 0, 0)); + + pMesh->mTexCoords[pInput.mIndex].push_back(aiVector3D(obj[0], obj[1], obj[2])); + if (0 != acc.mSubOffset[2] || 0 != acc.mSubOffset[3]) /* hack ... consider cleaner solution */ + pMesh->mNumUVComponents[pInput.mIndex] = 3; + } + else + { + ASSIMP_LOG_ERROR("Collada: too many texture coordinate sets. Skipping."); + } + break; + case IT_Color: + // up to 4 color sets are fine, ignore the others + if (pInput.mIndex < AI_MAX_NUMBER_OF_COLOR_SETS) + { + // pad to current vertex count if necessary + if (pMesh->mColors[pInput.mIndex].size() < pMesh->mPositions.size() - 1) + pMesh->mColors[pInput.mIndex].insert(pMesh->mColors[pInput.mIndex].end(), + pMesh->mPositions.size() - pMesh->mColors[pInput.mIndex].size() - 1, aiColor4D(0, 0, 0, 1)); + + aiColor4D result(0, 0, 0, 1); + for (size_t i = 0; i < pInput.mResolved->mSize; ++i) { - // pad to current vertex count if necessary - if( pMesh->mTexCoords[pInput.mIndex].size() < pMesh->mPositions.size()-1) - pMesh->mTexCoords[pInput.mIndex].insert( pMesh->mTexCoords[pInput.mIndex].end(), - pMesh->mPositions.size() - pMesh->mTexCoords[pInput.mIndex].size() - 1, aiVector3D( 0, 0, 0)); - - pMesh->mTexCoords[pInput.mIndex].push_back( aiVector3D( obj[0], obj[1], obj[2])); - if (0 != acc.mSubOffset[2] || 0 != acc.mSubOffset[3]) /* hack ... consider cleaner solution */ - pMesh->mNumUVComponents[pInput.mIndex]=3; - } else - { - ASSIMP_LOG_ERROR("Collada: too many texture coordinate sets. Skipping."); + result[static_cast(i)] = obj[pInput.mResolved->mSubOffset[i]]; } - break; - case IT_Color: - // up to 4 color sets are fine, ignore the others - if( pInput.mIndex < AI_MAX_NUMBER_OF_COLOR_SETS) - { - // pad to current vertex count if necessary - if( pMesh->mColors[pInput.mIndex].size() < pMesh->mPositions.size()-1) - pMesh->mColors[pInput.mIndex].insert( pMesh->mColors[pInput.mIndex].end(), - pMesh->mPositions.size() - pMesh->mColors[pInput.mIndex].size() - 1, aiColor4D( 0, 0, 0, 1)); + pMesh->mColors[pInput.mIndex].push_back(result); + } + else + { + ASSIMP_LOG_ERROR("Collada: too many vertex color sets. Skipping."); + } - aiColor4D result(0, 0, 0, 1); - for (size_t i = 0; i < pInput.mResolved->mSize; ++i) - { - result[static_cast(i)] = obj[pInput.mResolved->mSubOffset[i]]; - } - pMesh->mColors[pInput.mIndex].push_back(result); - } else - { - ASSIMP_LOG_ERROR("Collada: too many vertex color sets. Skipping."); - } - - break; - default: - // IT_Invalid and IT_Vertex - ai_assert(false && "shouldn't ever get here"); + break; + default: + // IT_Invalid and IT_Vertex + ai_assert(false && "shouldn't ever get here"); } } @@ -2696,25 +2796,25 @@ void ColladaParser::ExtractDataObjectFromChannel( const InputChannel& pInput, si // Reads the library of node hierarchies and scene parts void ColladaParser::ReadSceneLibrary() { - if( mReader->isEmptyElement()) + if (mReader->isEmptyElement()) return; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { // a visual scene - generate root node under its ID and let ReadNode() do the recursive work - if( IsElement( "visual_scene")) + if (IsElement("visual_scene")) { // read ID. Is optional according to the spec, but how on earth should a scene_instance refer to it then? - int indexID = GetAttribute( "id"); - const char* attrID = mReader->getAttributeValue( indexID); + int indexID = GetAttribute("id"); + const char* attrID = mReader->getAttributeValue(indexID); // read name if given. - int indexName = TestAttribute( "name"); + int indexName = TestAttribute("name"); const char* attrName = "unnamed"; - if( indexName > -1) - attrName = mReader->getAttributeValue( indexName); + if (indexName > -1) + attrName = mReader->getAttributeValue(indexName); // create a node and store it in the library under its ID Node* node = new Node; @@ -2722,55 +2822,56 @@ void ColladaParser::ReadSceneLibrary() node->mName = attrName; mNodeLibrary[node->mID] = node; - ReadSceneNode( node); - } else + ReadSceneNode(node); + } + else { // ignore the rest SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "library_visual_scenes") == 0) + if (strcmp(mReader->getNodeName(), "library_visual_scenes") == 0) //ThrowException( "Expected end of \"library_visual_scenes\" element."); - break; + break; } } } // ------------------------------------------------------------------------------------------------ // Reads a scene node's contents including children and stores it in the given node -void ColladaParser::ReadSceneNode( Node* pNode) +void ColladaParser::ReadSceneNode(Node* pNode) { // quit immediately on elements - if( mReader->isEmptyElement()) + if (mReader->isEmptyElement()) return; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "node")) + if (IsElement("node")) { Node* child = new Node; - int attrID = TestAttribute( "id"); - if( attrID > -1) - child->mID = mReader->getAttributeValue( attrID); - int attrSID = TestAttribute( "sid"); - if( attrSID > -1) - child->mSID = mReader->getAttributeValue( attrSID); + int attrID = TestAttribute("id"); + if (attrID > -1) + child->mID = mReader->getAttributeValue(attrID); + int attrSID = TestAttribute("sid"); + if (attrSID > -1) + child->mSID = mReader->getAttributeValue(attrSID); - int attrName = TestAttribute( "name"); - if( attrName > -1) - child->mName = mReader->getAttributeValue( attrName); + int attrName = TestAttribute("name"); + if (attrName > -1) + child->mName = mReader->getAttributeValue(attrName); // TODO: (thom) support SIDs // ai_assert( TestAttribute( "sid") == -1); if (pNode) { - pNode->mChildren.push_back( child); + pNode->mChildren.push_back(child); child->mParent = pNode; } else @@ -2781,26 +2882,26 @@ void ColladaParser::ReadSceneNode( Node* pNode) } // read on recursively from there - ReadSceneNode( child); + ReadSceneNode(child); continue; } // For any further stuff we need a valid node to work on else if (!pNode) continue; - if( IsElement( "lookat")) - ReadNodeTransformation( pNode, TF_LOOKAT); - else if( IsElement( "matrix")) - ReadNodeTransformation( pNode, TF_MATRIX); - else if( IsElement( "rotate")) - ReadNodeTransformation( pNode, TF_ROTATE); - else if( IsElement( "scale")) - ReadNodeTransformation( pNode, TF_SCALE); - else if( IsElement( "skew")) - ReadNodeTransformation( pNode, TF_SKEW); - else if( IsElement( "translate")) - ReadNodeTransformation( pNode, TF_TRANSLATE); - else if( IsElement( "render") && pNode->mParent == NULL && 0 == pNode->mPrimaryCamera.length()) + if (IsElement("lookat")) + ReadNodeTransformation(pNode, TF_LOOKAT); + else if (IsElement("matrix")) + ReadNodeTransformation(pNode, TF_MATRIX); + else if (IsElement("rotate")) + ReadNodeTransformation(pNode, TF_ROTATE); + else if (IsElement("scale")) + ReadNodeTransformation(pNode, TF_SCALE); + else if (IsElement("skew")) + ReadNodeTransformation(pNode, TF_SKEW); + else if (IsElement("translate")) + ReadNodeTransformation(pNode, TF_TRANSLATE); + else if (IsElement("render") && pNode->mParent == NULL && 0 == pNode->mPrimaryCamera.length()) { // ... scene evaluation or, in other words, postprocessing pipeline, // or, again in other words, a turing-complete description how to @@ -2813,14 +2914,14 @@ void ColladaParser::ReadSceneNode( Node* pNode) if (s[0] != '#') ASSIMP_LOG_ERROR("Collada: Unresolved reference format of camera"); else - pNode->mPrimaryCamera = s+1; + pNode->mPrimaryCamera = s + 1; } } - else if( IsElement( "instance_node")) + else if (IsElement("instance_node")) { // find the node in the library - int attrID = TestAttribute( "url"); - if( attrID != -1) + int attrID = TestAttribute("url"); + if (attrID != -1) { const char* s = mReader->getAttributeValue(attrID); if (s[0] != '#') @@ -2828,16 +2929,16 @@ void ColladaParser::ReadSceneNode( Node* pNode) else { pNode->mNodeInstances.push_back(NodeInstance()); - pNode->mNodeInstances.back().mNode = s+1; + pNode->mNodeInstances.back().mNode = s + 1; } } } - else if( IsElement( "instance_geometry") || IsElement( "instance_controller")) + else if (IsElement("instance_geometry") || IsElement("instance_controller")) { // Reference to a mesh or controller, with possible material associations - ReadNodeGeometry( pNode); + ReadNodeGeometry(pNode); } - else if( IsElement( "instance_light")) + else if (IsElement("instance_light")) { // Reference to a light, name given in 'url' attribute int attrID = TestAttribute("url"); @@ -2845,15 +2946,15 @@ void ColladaParser::ReadSceneNode( Node* pNode) ASSIMP_LOG_WARN("Collada: Expected url attribute in element"); else { - const char* url = mReader->getAttributeValue( attrID); - if( url[0] != '#') - ThrowException( "Unknown reference format in element"); + const char* url = mReader->getAttributeValue(attrID); + if (url[0] != '#') + ThrowException("Unknown reference format in element"); pNode->mLights.push_back(LightInstance()); - pNode->mLights.back().mLight = url+1; + pNode->mLights.back().mLight = url + 1; } } - else if( IsElement( "instance_camera")) + else if (IsElement("instance_camera")) { // Reference to a camera, name given in 'url' attribute int attrID = TestAttribute("url"); @@ -2861,12 +2962,12 @@ void ColladaParser::ReadSceneNode( Node* pNode) ASSIMP_LOG_WARN("Collada: Expected url attribute in element"); else { - const char* url = mReader->getAttributeValue( attrID); - if( url[0] != '#') - ThrowException( "Unknown reference format in element"); + const char* url = mReader->getAttributeValue(attrID); + if (url[0] != '#') + ThrowException("Unknown reference format in element"); pNode->mCameras.push_back(CameraInstance()); - pNode->mCameras.back().mCamera = url+1; + pNode->mCameras.back().mCamera = url + 1; } } else @@ -2875,7 +2976,7 @@ void ColladaParser::ReadSceneNode( Node* pNode) SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { break; } } @@ -2883,9 +2984,9 @@ void ColladaParser::ReadSceneNode( Node* pNode) // ------------------------------------------------------------------------------------------------ // Reads a node transformation entry of the given type and adds it to the given node's transformation list. -void ColladaParser::ReadNodeTransformation( Node* pNode, TransformType pType) +void ColladaParser::ReadNodeTransformation(Node* pNode, TransformType pType) { - if( mReader->isEmptyElement()) + if (mReader->isEmptyElement()) return; std::string tagName = mReader->getNodeName(); @@ -2894,38 +2995,38 @@ void ColladaParser::ReadNodeTransformation( Node* pNode, TransformType pType) tf.mType = pType; // read SID - int indexSID = TestAttribute( "sid"); - if( indexSID >= 0) - tf.mID = mReader->getAttributeValue( indexSID); + int indexSID = TestAttribute("sid"); + if (indexSID >= 0) + tf.mID = mReader->getAttributeValue(indexSID); // how many parameters to read per transformation type static const unsigned int sNumParameters[] = { 9, 4, 3, 3, 7, 16 }; const char* content = GetTextContent(); // read as many parameters and store in the transformation - for( unsigned int a = 0; a < sNumParameters[pType]; a++) + for (unsigned int a = 0; a < sNumParameters[pType]; a++) { // read a number - content = fast_atoreal_move( content, tf.f[a]); + content = fast_atoreal_move(content, tf.f[a]); // skip whitespace after it - SkipSpacesAndLineEnd( &content); + SkipSpacesAndLineEnd(&content); } // place the transformation at the queue of the node - pNode->mTransforms.push_back( tf); + pNode->mTransforms.push_back(tf); // and consume the closing tag - TestClosing( tagName.c_str()); + TestClosing(tagName.c_str()); } // ------------------------------------------------------------------------------------------------ // Processes bind_vertex_input and bind elements -void ColladaParser::ReadMaterialVertexInputBinding( Collada::SemanticMappingTable& tbl) +void ColladaParser::ReadMaterialVertexInputBinding(Collada::SemanticMappingTable& tbl) { - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "bind_vertex_input")) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { + if (IsElement("bind_vertex_input")) { Collada::InputSemanticMapEntry vn; @@ -2935,7 +3036,7 @@ void ColladaParser::ReadMaterialVertexInputBinding( Collada::SemanticMappingTabl // input semantic n = GetAttribute("input_semantic"); - vn.mType = GetTypeForSemantic( mReader->getAttributeValue(n) ); + vn.mType = GetTypeForSemantic(mReader->getAttributeValue(n)); // index of input set n = TestAttribute("input_set"); @@ -2944,12 +3045,12 @@ void ColladaParser::ReadMaterialVertexInputBinding( Collada::SemanticMappingTabl tbl.mMap[s] = vn; } - else if( IsElement( "bind")) { + else if (IsElement("bind")) { ASSIMP_LOG_WARN("Collada: Found unsupported element"); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "instance_material") == 0) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { + if (strcmp(mReader->getNodeName(), "instance_material") == 0) break; } } @@ -2957,90 +3058,91 @@ void ColladaParser::ReadMaterialVertexInputBinding( Collada::SemanticMappingTabl // ------------------------------------------------------------------------------------------------ // Reads a mesh reference in a node and adds it to the node's mesh list -void ColladaParser::ReadNodeGeometry( Node* pNode) +void ColladaParser::ReadNodeGeometry(Node* pNode) { // referred mesh is given as an attribute of the element - int attrUrl = GetAttribute( "url"); - const char* url = mReader->getAttributeValue( attrUrl); - if( url[0] != '#') - ThrowException( "Unknown reference format"); + int attrUrl = GetAttribute("url"); + const char* url = mReader->getAttributeValue(attrUrl); + if (url[0] != '#') + ThrowException("Unknown reference format"); Collada::MeshInstance instance; - instance.mMeshOrController = url+1; // skipping the leading # + instance.mMeshOrController = url + 1; // skipping the leading # - if( !mReader->isEmptyElement()) + if (!mReader->isEmptyElement()) { // read material associations. Ignore additional elements in between - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "instance_material")) + if (IsElement("instance_material")) { // read ID of the geometry subgroup and the target material - int attrGroup = GetAttribute( "symbol"); - std::string group = mReader->getAttributeValue( attrGroup); - int attrMaterial = GetAttribute( "target"); - const char* urlMat = mReader->getAttributeValue( attrMaterial); + int attrGroup = GetAttribute("symbol"); + std::string group = mReader->getAttributeValue(attrGroup); + int attrMaterial = GetAttribute("target"); + const char* urlMat = mReader->getAttributeValue(attrMaterial); Collada::SemanticMappingTable s; - if( urlMat[0] == '#') + if (urlMat[0] == '#') urlMat++; s.mMatName = urlMat; // resolve further material details + THIS UGLY AND NASTY semantic mapping stuff - if( !mReader->isEmptyElement()) + if (!mReader->isEmptyElement()) ReadMaterialVertexInputBinding(s); // store the association instance.mMaterials[group] = s; } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { - if( strcmp( mReader->getNodeName(), "instance_geometry") == 0 - || strcmp( mReader->getNodeName(), "instance_controller") == 0) + if (strcmp(mReader->getNodeName(), "instance_geometry") == 0 + || strcmp(mReader->getNodeName(), "instance_controller") == 0) break; } } } // store it - pNode->mMeshes.push_back( instance); + pNode->mMeshes.push_back(instance); } // ------------------------------------------------------------------------------------------------ // Reads the collada scene void ColladaParser::ReadScene() { - if( mReader->isEmptyElement()) + if (mReader->isEmptyElement()) return; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT) { - if( IsElement( "instance_visual_scene")) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT) { + if (IsElement("instance_visual_scene")) { // should be the first and only occurrence - if( mRootNode) - ThrowException( "Invalid scene containing multiple root nodes in element"); + if (mRootNode) + ThrowException("Invalid scene containing multiple root nodes in element"); // read the url of the scene to instance. Should be of format "#some_name" - int urlIndex = GetAttribute( "url"); - const char* url = mReader->getAttributeValue( urlIndex); - if( url[0] != '#') - ThrowException( "Unknown reference format in element"); + int urlIndex = GetAttribute("url"); + const char* url = mReader->getAttributeValue(urlIndex); + if (url[0] != '#') + ThrowException("Unknown reference format in element"); // find the referred scene, skip the leading # - NodeLibrary::const_iterator sit = mNodeLibrary.find( url+1); - if( sit == mNodeLibrary.end()) - ThrowException( "Unable to resolve visual_scene reference \"" + std::string(url) + "\" in element."); + NodeLibrary::const_iterator sit = mNodeLibrary.find(url + 1); + if (sit == mNodeLibrary.end()) + ThrowException("Unable to resolve visual_scene reference \"" + std::string(url) + "\" in element."); mRootNode = sit->second; - } else { + } + else { SkipElement(); } } - else if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END){ + else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { break; } } @@ -3048,23 +3150,23 @@ void ColladaParser::ReadScene() // ------------------------------------------------------------------------------------------------ // Aborts the file reading with an exception -AI_WONT_RETURN void ColladaParser::ThrowException( const std::string& pError) const +AI_WONT_RETURN void ColladaParser::ThrowException(const std::string& pError) const { - throw DeadlyImportError( format() << "Collada: " << mFileName << " - " << pError ); + throw DeadlyImportError(format() << "Collada: " << mFileName << " - " << pError); } -void ColladaParser::ReportWarning(const char* msg,...) +void ColladaParser::ReportWarning(const char* msg, ...) { ai_assert(NULL != msg); va_list args; - va_start(args,msg); + va_start(args, msg); char szBuffer[3000]; - const int iLen = vsprintf(szBuffer,msg,args); + const int iLen = vsprintf(szBuffer, msg, args); ai_assert(iLen > 0); va_end(args); - ASSIMP_LOG_WARN_F("Validation warning: ", std::string(szBuffer,iLen)); + ASSIMP_LOG_WARN_F("Validation warning: ", std::string(szBuffer, iLen)); } // ------------------------------------------------------------------------------------------------ @@ -3072,84 +3174,84 @@ void ColladaParser::ReportWarning(const char* msg,...) void ColladaParser::SkipElement() { // nothing to skip if it's an - if( mReader->isEmptyElement()) + if (mReader->isEmptyElement()) return; // reroute - SkipElement( mReader->getNodeName()); + SkipElement(mReader->getNodeName()); } // ------------------------------------------------------------------------------------------------ // Skips all data until the end node of the given element -void ColladaParser::SkipElement( const char* pElement) +void ColladaParser::SkipElement(const char* pElement) { // copy the current node's name because it'a pointer to the reader's internal buffer, // which is going to change with the upcoming parsing std::string element = pElement; - while( mReader->read()) + while (mReader->read()) { - if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END) - if( mReader->getNodeName() == element) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) + if (mReader->getNodeName() == element) break; } } // ------------------------------------------------------------------------------------------------ // Tests for an opening element of the given name, throws an exception if not found -void ColladaParser::TestOpening( const char* pName) +void ColladaParser::TestOpening(const char* pName) { // read element start - if( !mReader->read()) - ThrowException( format() << "Unexpected end of file while beginning of <" << pName << "> element." ); + if (!mReader->read()) + ThrowException(format() << "Unexpected end of file while beginning of <" << pName << "> element."); // whitespace in front is ok, just read again if found - if( mReader->getNodeType() == irr::io::EXN_TEXT) - if( !mReader->read()) - ThrowException( format() << "Unexpected end of file while reading beginning of <" << pName << "> element." ); + if (mReader->getNodeType() == irr::io::EXN_TEXT) + if (!mReader->read()) + ThrowException(format() << "Unexpected end of file while reading beginning of <" << pName << "> element."); - if( mReader->getNodeType() != irr::io::EXN_ELEMENT || strcmp( mReader->getNodeName(), pName) != 0) - ThrowException( format() << "Expected start of <" << pName << "> element." ); + if (mReader->getNodeType() != irr::io::EXN_ELEMENT || strcmp(mReader->getNodeName(), pName) != 0) + ThrowException(format() << "Expected start of <" << pName << "> element."); } // ------------------------------------------------------------------------------------------------ // Tests for the closing tag of the given element, throws an exception if not found -void ColladaParser::TestClosing( const char* pName) +void ColladaParser::TestClosing(const char* pName) { // check if we're already on the closing tag and return right away - if( mReader->getNodeType() == irr::io::EXN_ELEMENT_END && strcmp( mReader->getNodeName(), pName) == 0) + if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END && strcmp(mReader->getNodeName(), pName) == 0) return; // if not, read some more - if( !mReader->read()) - ThrowException( format() << "Unexpected end of file while reading end of <" << pName << "> element." ); + if (!mReader->read()) + ThrowException(format() << "Unexpected end of file while reading end of <" << pName << "> element."); // whitespace in front is ok, just read again if found - if( mReader->getNodeType() == irr::io::EXN_TEXT) - if( !mReader->read()) - ThrowException( format() << "Unexpected end of file while reading end of <" << pName << "> element." ); + if (mReader->getNodeType() == irr::io::EXN_TEXT) + if (!mReader->read()) + ThrowException(format() << "Unexpected end of file while reading end of <" << pName << "> element."); // but this has the be the closing tag, or we're lost - if( mReader->getNodeType() != irr::io::EXN_ELEMENT_END || strcmp( mReader->getNodeName(), pName) != 0) - ThrowException( format() << "Expected end of <" << pName << "> element." ); + if (mReader->getNodeType() != irr::io::EXN_ELEMENT_END || strcmp(mReader->getNodeName(), pName) != 0) + ThrowException(format() << "Expected end of <" << pName << "> element."); } // ------------------------------------------------------------------------------------------------ // Returns the index of the named attribute or -1 if not found. Does not throw, therefore useful for optional attributes -int ColladaParser::GetAttribute( const char* pAttr) const +int ColladaParser::GetAttribute(const char* pAttr) const { - int index = TestAttribute( pAttr); - if( index != -1) + int index = TestAttribute(pAttr); + if (index != -1) return index; // attribute not found -> throw an exception - ThrowException( format() << "Expected attribute \"" << pAttr << "\" for element <" << mReader->getNodeName() << ">." ); + ThrowException(format() << "Expected attribute \"" << pAttr << "\" for element <" << mReader->getNodeName() << ">."); return -1; } // ------------------------------------------------------------------------------------------------ // Tests the present element for the presence of one attribute, returns its index or throws an exception if not found -int ColladaParser::TestAttribute( const char* pAttr) const +int ColladaParser::TestAttribute(const char* pAttr) const { - for( int a = 0; a < mReader->getAttributeCount(); a++) - if( strcmp( mReader->getAttributeName( a), pAttr) == 0) + for (int a = 0; a < mReader->getAttributeCount(); a++) + if (strcmp(mReader->getAttributeName(a), pAttr) == 0) return a; return -1; @@ -3160,8 +3262,8 @@ int ColladaParser::TestAttribute( const char* pAttr) const const char* ColladaParser::GetTextContent() { const char* sz = TestTextContent(); - if(!sz) { - ThrowException( "Invalid contents in element \"n\"."); + if (!sz) { + ThrowException("Invalid contents in element \"n\"."); } return sz; } @@ -3171,85 +3273,85 @@ const char* ColladaParser::GetTextContent() const char* ColladaParser::TestTextContent() { // present node should be the beginning of an element - if( mReader->getNodeType() != irr::io::EXN_ELEMENT || mReader->isEmptyElement()) + if (mReader->getNodeType() != irr::io::EXN_ELEMENT || mReader->isEmptyElement()) return NULL; // read contents of the element - if( !mReader->read() ) + if (!mReader->read()) return NULL; - if( mReader->getNodeType() != irr::io::EXN_TEXT && mReader->getNodeType() != irr::io::EXN_CDATA) + if (mReader->getNodeType() != irr::io::EXN_TEXT && mReader->getNodeType() != irr::io::EXN_CDATA) return NULL; // skip leading whitespace const char* text = mReader->getNodeData(); - SkipSpacesAndLineEnd( &text); + SkipSpacesAndLineEnd(&text); return text; } // ------------------------------------------------------------------------------------------------ // Calculates the resulting transformation fromm all the given transform steps -aiMatrix4x4 ColladaParser::CalculateResultTransform( const std::vector& pTransforms) const +aiMatrix4x4 ColladaParser::CalculateResultTransform(const std::vector& pTransforms) const { aiMatrix4x4 res; - for( std::vector::const_iterator it = pTransforms.begin(); it != pTransforms.end(); ++it) + for (std::vector::const_iterator it = pTransforms.begin(); it != pTransforms.end(); ++it) { const Transform& tf = *it; - switch( tf.mType) + switch (tf.mType) { - case TF_LOOKAT: - { - aiVector3D pos( tf.f[0], tf.f[1], tf.f[2]); - aiVector3D dstPos( tf.f[3], tf.f[4], tf.f[5]); - aiVector3D up = aiVector3D( tf.f[6], tf.f[7], tf.f[8]).Normalize(); - aiVector3D dir = aiVector3D( dstPos - pos).Normalize(); - aiVector3D right = (dir ^ up).Normalize(); + case TF_LOOKAT: + { + aiVector3D pos(tf.f[0], tf.f[1], tf.f[2]); + aiVector3D dstPos(tf.f[3], tf.f[4], tf.f[5]); + aiVector3D up = aiVector3D(tf.f[6], tf.f[7], tf.f[8]).Normalize(); + aiVector3D dir = aiVector3D(dstPos - pos).Normalize(); + aiVector3D right = (dir ^ up).Normalize(); - res *= aiMatrix4x4( - right.x, up.x, -dir.x, pos.x, - right.y, up.y, -dir.y, pos.y, - right.z, up.z, -dir.z, pos.z, - 0, 0, 0, 1); - break; - } - case TF_ROTATE: - { - aiMatrix4x4 rot; - ai_real angle = tf.f[3] * ai_real( AI_MATH_PI) / ai_real( 180.0 ); - aiVector3D axis( tf.f[0], tf.f[1], tf.f[2]); - aiMatrix4x4::Rotation( angle, axis, rot); - res *= rot; - break; - } - case TF_TRANSLATE: - { - aiMatrix4x4 trans; - aiMatrix4x4::Translation( aiVector3D( tf.f[0], tf.f[1], tf.f[2]), trans); - res *= trans; - break; - } - case TF_SCALE: - { - aiMatrix4x4 scale( tf.f[0], 0.0f, 0.0f, 0.0f, 0.0f, tf.f[1], 0.0f, 0.0f, 0.0f, 0.0f, tf.f[2], 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f); - res *= scale; - break; - } - case TF_SKEW: - // TODO: (thom) - ai_assert( false); - break; - case TF_MATRIX: - { - aiMatrix4x4 mat( tf.f[0], tf.f[1], tf.f[2], tf.f[3], tf.f[4], tf.f[5], tf.f[6], tf.f[7], - tf.f[8], tf.f[9], tf.f[10], tf.f[11], tf.f[12], tf.f[13], tf.f[14], tf.f[15]); - res *= mat; - break; - } - default: - ai_assert( false); - break; + res *= aiMatrix4x4( + right.x, up.x, -dir.x, pos.x, + right.y, up.y, -dir.y, pos.y, + right.z, up.z, -dir.z, pos.z, + 0, 0, 0, 1); + break; + } + case TF_ROTATE: + { + aiMatrix4x4 rot; + ai_real angle = tf.f[3] * ai_real(AI_MATH_PI) / ai_real(180.0); + aiVector3D axis(tf.f[0], tf.f[1], tf.f[2]); + aiMatrix4x4::Rotation(angle, axis, rot); + res *= rot; + break; + } + case TF_TRANSLATE: + { + aiMatrix4x4 trans; + aiMatrix4x4::Translation(aiVector3D(tf.f[0], tf.f[1], tf.f[2]), trans); + res *= trans; + break; + } + case TF_SCALE: + { + aiMatrix4x4 scale(tf.f[0], 0.0f, 0.0f, 0.0f, 0.0f, tf.f[1], 0.0f, 0.0f, 0.0f, 0.0f, tf.f[2], 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f); + res *= scale; + break; + } + case TF_SKEW: + // TODO: (thom) + ai_assert(false); + break; + case TF_MATRIX: + { + aiMatrix4x4 mat(tf.f[0], tf.f[1], tf.f[2], tf.f[3], tf.f[4], tf.f[5], tf.f[6], tf.f[7], + tf.f[8], tf.f[9], tf.f[10], tf.f[11], tf.f[12], tf.f[13], tf.f[14], tf.f[15]); + res *= mat; + break; + } + default: + ai_assert(false); + break; } } @@ -3258,29 +3360,29 @@ aiMatrix4x4 ColladaParser::CalculateResultTransform( const std::vectorMsIK9a%(Cq>7|$t1&-*@_8Z; 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

Vi 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 =Geb5c%^8 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

>38$c zI-&2YX*HxW4rKE(LPzzIS$oZ*qSxpVk?a3Jjjy{8#mcwA_?` zx>m@ z;1^@oLYDB$SJ7W=S$wx2^E+uHMN$`7;m?xGZAld3b#vB)?d`o1vd4~YB{2_)s)ZkdA95Hf?y{SQR>8hCs|+>SNj#fd9~ z?ZfLQ$pFk6G6j+AZf`rA_K>w+tZc{|ZNsra3c^$^iUSwz+yV>M+^)bCJ&-*5^qZ#5 z8oKiE#(SV9^eOL)gLqcK(WFMr^?>Rrj^GT)hvNbi|y|Q}<5tgCl zsfUfop!F{u30%W?GI2I|9@S%TuUumycZbn@Qqx(JMdR(iSSxqpHu9>8k8%VP`ye)# z-M7jIvzpF32*(=*-2oKfEY?Dm=4WTHA0~a$BEOK1>oDG*Jy*tFRbN|%A)5ySo$J?m z;AeMb+_m_^&_!31&=(UvEJGo2q2h^N58fq`EHDtdZmKQl-)j zksamLG?wY8Bde2d+)<$+OPMoaauvEAlBuex;lC;0Do!jdEL%Pnz}Cg4K^K-*3Q+4OS>m3rK8(B@p57pOU%*Z6=LDnS?i#j!UmW zr;3KWAq&v;vXGLu`(NqH>fS|D3$069Kjqm{^OhtFtbIqAw8p)+)xcJ=&Rwg$r$n2z zSnDiaEvqEOsYi5Oh*+IO?5neB`E}^_N7nkp%4ItvsfpyIu(a%w=Md=fU?|QbVTXL& zNaT?vwU1D_`ca~ecIbHAane{?=EPwW<#e=2ef?6i*q;7ss8c^zWCG8_Pf@~M7WoC) z-Ys}aal*DeFV5O6n*PzC_)~>{dzk)bntLS|IkfS1aWdzuB<~5dsy~UZF4m8i{ioaR zWj_XJ_T`&Y33I6Kmi)$}?Q?g>GaN^m-FWLcq&8;FiYzEHkV?A#;&V$m0Jh&bB)Yyg z&AG^q?sC&qBz$ld`~V@_4e2DJwdD$idJS^)0Im|d#z(g8%80+uWhkrOGU*cE&P=Lr z08q611rA~LM^}Gk(q{V-cDQ}RzOV-pMp~gqHQv}@H|<~eE|IDKOeGE%Bc0W%y3?K$ z7c}Y$BMwY!peL%?Cr=*}q4Kv8H!&N4HJpoI?;7digyyqNI*v>Og*Io+HTDiK7GWJ% zrb8*JGx5i?S0ICq>0Q5QRzJ1)0cc($0yJ;#M+9;6n;5!H1WhV`N)7bbu&Y~$s#$qK zd-`qr<4pu&vtLF1qR0VYfA{kwb4THmTwvRp9qjbTL8*zo*95tzv2msKWK}C~CrC8% zLGSt{i206C4aD#-rS$=vFAf9!KZn^&AW?xLWf<+<>xJAGUlNzK=B2GCQvxQ7o&A(= zl~-S$X#X5w_JCFE!NlzyxWE|E?xu*|40#Ic_gzJ9AQ+~J*R=9< z2&cAt-w~;F(@vjgJk8HwJ5*TqVYExz5HTOe=U z5CFv$GkwkL5W{P`>n9nXg-%0YTI%jtLD84-m0?~*3L^%62M9V`xCU7{KKMc4K>&XMda2u z>07ElPvlXpFe(p&eU@W+B6vZum!hLsKj|DcLr&JTl)BUhhf)`z6eEFKH0+eYc<;AQ z*uiERvZy0FBV)!?HD3`yER@fGUKe&80Jv=W51&G?yG7mt=%0c^&%B^ol)8E34kx^S z`n+1O9JkZk#vO8W^|rg04$ZP_oy&ofS?6$ZG<=G!he>tR!EWwx@Y8*kPF(z;(R)hx zHQ#NRu?TH_1;WUK#itywNFtC4QAu^s_#%Pd1Crw^djY*lb1x#mS05+R`c&!*kVw`zmb307A&HG^1gts+1YM4k?h6bv~zkX1-{;C zjWhRz`Twbk8TsOllSWK{bIyFD_Suc(je6aj;kgwX7MXt)kEZZB7O`_?M@TMdiwC_u z*?LiS!@qftG}C5DkF3WCChI0!!fSA{3(j`u5f;Kto_kW_QCU})6XD8aPsN)k-a5%1 zZ`T1&phZochUDJ-+_P7Gc=apaEC*90pB7_+l#eZEX7&dti^_YIlujHWh##m>s8 z+0HdB65A;#xL3--*(H&~LdcG8D1c=&aExM97{S%IeAHldI{A!n2AH(D+(dea=PGF~ zXH&my;*vs~rc7Uqa@F&s0T4%o^=yl9UPhbIoPHJ5k;rDB18@>?XDhey!*YJ&D*5=@?wlWq-0DHLyzf5n@&I;*O>ZHZiV;`y>VmZ%QX;E=Y= zlsZQi6$FGn4`{1rqo8|fHT}h_(+H1l-Ql2?nVxHvSYL8lBl22`_Oyjy)hP*8%M}v$ z)J@h*$b<2dIpAo|RY#Seb{qx5LiP2?Nbxu_ z7oYiVI?&$Lwa->@bfZ-HaICbaZO`S!HM#F(?^y~eqoF3C4uaQzy<71k3k~@S8_fMn$6IE4jLNhy)u-y+!{!j~jvo_OcuJK34p)Pc0?Y{eCB+tA$# z8QE_Fd)&a)ZA%Ih&Z|xk1I4vvl~=vI(ynp{87p7~)^R1>Ty-gKO*U{?MIAb2!tf31 zxq4&4!V2%wXTh9FjAeVWog_3JNUuOyGJuwu?+4XiAidN(%3~kD=?>zXxXJdpjH1iN ztlVdai_iF8tt_9Myw|p)ZiN~HRjyk9ZVI8$#z*8La#nQ%?|a_ier43Vj9s<@%D|$R z--*2nvFBxkYt_iuG4K>os69&=Wcde z+r^aCh_n=5VBw#|nYoyA9}|SK5h|+o!FZ+J7sgfDaO1!k#3=Hsm2n8Kc@dItyn!cs zJNXGkd=lbebDnH)+wxUUTP1E{U(ZKtkS*4I163{@d1k ziaZsd1D+#o6Qj|u_{hy{`XZH{v@L3>*R$UKcUhJ0Rxw$wk%pSE(omUcM{NWP75f%aNyUTH{#wi6n!l}4*v zeI2*vu6CT0Z7v>NbNvGCmN70hVG8n+VXE{l9Gxrd)$eRUXL6?-NYRkL#JaAR>Cpbb zss|!DY8SKM@A-;Qrl_dUTQ!<7UyX3Am=MXt8!4rHMb1=7STFH1<;BjPJ4g*4aV`wf zQe|Ukb z>yBTxTM$61ysZ_8-f5tdke0aZma&<=dvFeVPLyX=`ETzpdAPCfiNB$(CeF=MpJ;vb zKT9yyjuebuwIjJ;i8l1=>Q$xKoOXu4yJb`;g!f#NuS-G8s06C<=V`ymN_hp0Wz1;eE3J4TZmafOnv1t9^l%h-e4 zcXKVAz6g2o=2OE;Qgh79M59#_^8`?ynBp#C=*;;6uQ67INK>cEo*PCEqADMw7p{?l zwxm&E6X0&syKE+RRhS1@Vwz#8C9M2Z*cK2KfjN7}Cy!h) zr7Pua3&AlS^WJGAd(=$uor`eQ=hEBxJMMznFeR+Vgh2>#n?o+FDu;LL6;=24xksGL zRiU*Yv__PM=lYyx-ifQ~e3`?y>U`WxO%B^;{v^pwmoHXXk_SyliKtD*%{)hk^;t(Y z5~Y!crp*!%B-l9lS;{$GCYza>%e$3BdREaq-n}xKL1*r@#t$4-Z9AZKrTdR9@!J~% z@T2SYiR&vgRr!Wbq=t!*RdJ*kkZ%vRkSCJ~psfc4QHPoKg-e6X^QW$lxz!eru;1U^ zUKiBQTzTB(r5hxB1BuRlB)8F>R_+gf({*J@c>MU+OBLoOxcIAXAv)-}CwO@ZO~u)z z#FZ(0^G#iU!8S#za;a%2nkP>YgHmg=w{)u_Il{MT-2S**Aso9oG(|(KxRSzFOJ>`8=8nyyS#IfZ@aV)FOxjBT^k!sFLHQ6B2xdO^pcpsTjq zQWHf*yEaKM$A*HpCeOr{ZxfHWt)T3C(WstR+D2B>bK=>-`+OdbTXuF1b4Kanyu&y3 zAN?>|n=gs<3)gF8{T+O3C;M16kWtx6ru?rt^W%#EJF>coOG0ldJD#%JHUx(DeGlcz z_n<>3Ykh>#jBU^^11}6`p3R6t@aevTg~AD!BT>M6HRjcnsr9H#>rgdWb3~655y)wo zKGnAdF2%+D2&$OtgqE_oTU^|iX$DP@EtYYKpUfWhx8at>ijMlQ&~$KMa2rv&lvZ2@ zpYrppwY7eKV1YId#^mHAV6;2Rv`6=A_c}?9MX+IZ*^join=c^_T)zdO;knH^a_gAg zoDXirHt#N1teLW#$h*&q1tjQknhcvxHIM~iGkK^XJ)Hy(^cdSTaXhsrYZ2YFUnf=1 ztu7gQI+s2lW8kT*>*FhE{f5E8+nX9Iy{iw0($U4f-N^)x#LfigrMh8+%6#Q&MjECt zjC1MJ93}r{4P95h);`L*$$e-#0lQ92QIW6l7!1v7>2DW#e~2n4t+~HX?U6U%@|Y{^ zp7Ht}FaK3Mpklsj_F5}=ueN%)FaTg~4FV(U#x0`uH(=TX@T~^wc}zmQz*QLL>^? z>gAcJ)g&%j%iUhq;=Kitf>&qjMefvR@MC9pMz}B-u^{*{B54hh%QNYfh+yWuxKDFg z^SZ-4dPDMw;n}-Mgy6N|B}^w%7ZL&EwtQ1)$kapJgTi6N$2U*ez2;hVP!iS3pmKO3vNiT&>|j`W zAH|HZCs^CjxI(kRbnjY&)R=v5HEC2djk;+cn}$_9_IXdbN6p?Voe|Zq3(SM~B-Msb zoC1Fi9DT7`_~y(XTb2Ou)IXcu_#_dNDhI~G(kH8;B;p{UqZHT9pIp;>9;=rz<^g_| z6IH+U1f@OAT`HYVPaQ$IQ{L<^XKA<$)PZba5drKU?cEqfQY|Nw$-<&_H9cRbS2TK400vR<3s+2NfC5v|TzEJ!Y4KFFFgKGh>{eF)w%;gD1ws8&F|h zy@8oLo!%@-$hu7b2(m&BmDMVWeL1-A{2qq&jCFA#C>-el+o^kYG1{>~F{(9{Lj$wK z*3XE1Q@rV-jef3!wh$`Zs-pqki)XZ3R-U&lnzo(y3oruY=B6;7rF?2iF68xWhphd> zwCUNSSU%o#Wl+yZsxUY@3LkMaz`Wiy`{HoGTwYY+Tzx58q-Y*75QA+ZXJ+(+Z|N!* zH}{dDI%8)I2=?aOcx^f2`-`Tnjuo>zhMG%B&_fCQ3|`vU^pH<7GS!UQ;ps*|aklF4 zX~gKaO>FIeD|5_q|Lm9Yr`>f)UtZChDDm-c@Li!(gLTLxqx4 z;?66%DGl%>$mGpJ6{z#IXe8i~rBQ7xc8FE;Jsdr_yerW~`&Sk$y!v$ZxE}C|54C&B z*dayO2QY-;I0uRVqtJ}WxBgB7sGmjssE23V1pA~e-?olHS&?tJvf@z}(NN=&x7zW) zx;|ufeEJMcJ2`{OJ#{Ck>|ld^P1Ktoi$BBkz{OZ}RpR_(7R5zt!!Yqd>s;t;y6hm7 znuducZY?95zkdPWy#Q-JxKL+Jk9IP*0_|)|M|9~TM^$h7mrtoi{??%HP_KA3`-P9C z5UCZK4~K{HX#jo2d`1-VhVmTj<>=C>G(UuOya4 zE=lyt4{PsSm)~Kk1zeG}i>34ZEJ3i$6!k=^^WgLDguS#SLuA|dd9&BuufzDvk!B>7 zKqdN#Z`QqPg9_X{!h)hu`@gGr0z}g3XQi%sa&&wk|WP{PJ&z0v0~n0C23e<9DD%IE5J%)X^3RW|L?BDvoB;{K_jcopR? zcazD=%tsAl8PBy&`8Ok>}g`CU(-jXAHl(LkJ; zZ|jEH3;;0-S7cCuX!D+HKCin#Cd?5$pjBIcny+P7+c_qG6NtV7CouWPLY3h~1 z0Q*zN@N@uroqok)%bbtYs`ie&_~z%f)tbf<&)vJPa+T~?S{(;*o5%>}#?h-L=W!toS|U8&E^m7@->i(R?e% z1UkgY>ujQGMpy-5Wi0H;0tE8@SammRE1&`DLk!MnE3d*+Tn|Gz$Ud)8*3TNzT`;PY z_z$eDHnR~FuMBQ&IfvsuI*Vqa#*h(ZI1MEFw9m<|gwQugXERWD19%-el7*QophXx% z7Yb3!GRbdIB+SWF%RRb(!^y`p#c(jFF~iXQfhunmkse+$6Ev{pi#bTLedf;w5fJN zjbJ6R3~;>97cC6&vTqczf=U}`e>)7?ZnerOy2yzz>UWz`mn%(rmYtaFM*9v9ccSH`FuJ%u8Yx6(lmnw3slqguS(on zfV&%0O}#xB9f>gq<8RR^n|SkkIjtxpTx!9abaixH`i}yHvv$q_n!P+y9AA6ub5XSy z#Y%@2H;)I)#noG{aNv|-(#d`zCXq*}&Y`QC$I?dtj}fdl9R+**p8e*HUJbLm`^-+d z@vto+eN`Iv*x61~mXN74u1K$>0!PvqEhZr!&@B_e-~8y2G$AAD*Axf{Wu9p6!Blg? zu}Wn4 z?+EC+3}#=6nTeP+84nK#xx<~o9@C|0J}lGu5@`%06(+3=y^JHl6|wCW zPIZd0)MmpBBvoCmaTohI*I6snep@+HKb-F2sC)0_!zTDc+W%7W7HcM)j7AgF(tj1q z@K8kyxmqrjkMJq

cXK<%%4toD?kC_HmG#_L9 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 PnSpQ}kp2slXJ7yTqc8-m literal 0 HcmV?d00001 diff --git a/test/models/Collada/duck_nomanifest.zae b/test/models/Collada/duck_nomanifest.zae new file mode 100644 index 0000000000000000000000000000000000000000..d5559ccb2f93d22385783c35e9d47ca8dbf11e1a GIT binary patch literal 132634 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

Vi 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 =Geb5c%^8 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

>38$c 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

cXK<%%4toD?kC_HmG#_L9 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 literal 0 HcmV?d00001 From 8636d5607c0edf4f528992dff290dda89ea536d0 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Fri, 12 Jul 2019 11:35:43 +0100 Subject: [PATCH 008/320] Add ZipArchiveIOSystem to CMake --- code/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 9c484910c..8d3f6ee28 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -104,6 +104,7 @@ SET( PUBLIC_HEADERS ${HEADER_PATH}/Exporter.hpp ${HEADER_PATH}/DefaultIOStream.h ${HEADER_PATH}/DefaultIOSystem.h + ${HEADER_PATH}/ZipArchiveIOSystem.h ${HEADER_PATH}/SceneCombiner.h ${HEADER_PATH}/fast_atof.h ${HEADER_PATH}/qnan.h @@ -172,6 +173,7 @@ SET( Common_SRCS Common/DefaultProgressHandler.h Common/DefaultIOStream.cpp Common/DefaultIOSystem.cpp + Common/ZipArchiveIOSystem.cpp Common/PolyTools.h Common/Importer.cpp Common/IFF.h From 2a72c9b616a2018cb9683094120e68016cf2d079 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Fri, 12 Jul 2019 14:46:48 +0100 Subject: [PATCH 009/320] Read embedded textures from Collada ZAE --- code/Collada/ColladaHelper.h | 8 ++------ code/Collada/ColladaLoader.cpp | 36 ++++++++++++++++++---------------- code/Collada/ColladaLoader.h | 6 +++--- code/Collada/ColladaParser.cpp | 22 ++++++++++++++++++++- code/Collada/ColladaParser.h | 3 +++ 5 files changed, 48 insertions(+), 27 deletions(-) diff --git a/code/Collada/ColladaHelper.h b/code/Collada/ColladaHelper.h index ffab6226d..66cff2d20 100644 --- a/code/Collada/ColladaHelper.h +++ b/code/Collada/ColladaHelper.h @@ -580,15 +580,11 @@ struct Image { std::string mFileName; - /** If image file name is zero, embedded image data - */ + /** Embedded image data */ std::vector mImageData; - /** If image file name is zero, file format of - * embedded image data. - */ + /** File format hint ofembedded image data */ std::string mEmbeddedFormat; - }; /** An animation channel. */ diff --git a/code/Collada/ColladaLoader.cpp b/code/Collada/ColladaLoader.cpp index 40b2b0811..bcf6b1c60 100644 --- a/code/Collada/ColladaLoader.cpp +++ b/code/Collada/ColladaLoader.cpp @@ -235,6 +235,9 @@ void ColladaLoader::InternReadFile(const std::string& pFile, aiScene* pScene, IO // store all materials StoreSceneMaterials(pScene); + // store all textures + StoreSceneTextures(pScene); + // store all lights StoreSceneLights(pScene); @@ -927,8 +930,7 @@ void ColladaLoader::StoreSceneLights(aiScene* pScene) void ColladaLoader::StoreSceneTextures(aiScene* pScene) { pScene->mNumTextures = static_cast(mTextures.size()); - if (mTextures.size() > 0) - { + if (mTextures.size() > 0) { pScene->mTextures = new aiTexture*[mTextures.size()]; std::copy(mTextures.begin(), mTextures.end(), pScene->mTextures); mTextures.clear(); @@ -1728,7 +1730,7 @@ void ColladaLoader::BuildMaterials(ColladaParser& pParser, aiScene* /*pScene*/) mat->AddProperty(&colSpecular, 1, AI_MATKEY_COLOR_SPECULAR); const ai_real specExp = 5.0; mat->AddProperty(&specExp, 1, AI_MATKEY_SHININESS); - } +} #endif } @@ -1766,14 +1768,19 @@ aiString ColladaLoader::FindFilenameForEffectTexture(const ColladaParser& pParse } // if this is an embedded texture image setup an aiTexture for it - if (imIt->second.mFileName.empty()) + if (!imIt->second.mImageData.empty()) { - if (imIt->second.mImageData.empty()) { - throw DeadlyImportError("Collada: Invalid texture, no data or file reference given"); - } - aiTexture* tex = new aiTexture(); + // Store embedded texture name reference + tex->mFilename.Set(imIt->second.mFileName.c_str()); + result.Set(imIt->second.mFileName); + + // TODO: check the possibility of using the flag "AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING" +// result.data[0] = '*'; +// result.length = 1 + ASSIMP_itoa10(result.data + 1, static_cast(MAXLEN - 1), static_cast(mTextures.size())); + + // setup format hint if (imIt->second.mEmbeddedFormat.length() > 3) { ASSIMP_LOG_WARN("Collada: texture format hint is too long, truncating to 3 characters"); @@ -1786,20 +1793,15 @@ aiString ColladaLoader::FindFilenameForEffectTexture(const ColladaParser& pParse tex->pcData = (aiTexel*)new char[tex->mWidth]; memcpy(tex->pcData, &imIt->second.mImageData[0], tex->mWidth); - // TODO: check the possibility of using the flag "AI_CONFIG_IMPORT_FBX_EMBEDDED_TEXTURES_LEGACY_NAMING" - // In FBX files textures are now stored internally by Assimp with their filename included - // Now Assimp can lookup through the loaded textures after all data is processed - // We need to load all textures before referencing them, as FBX file format order may reference a texture before loading it - // This may occur on this case too, it has to be studied - // setup texture reference string - result.data[0] = '*'; - result.length = 1 + ASSIMP_itoa10(result.data + 1, static_cast(MAXLEN - 1), static_cast(mTextures.size())); - // and add this texture to the list mTextures.push_back(tex); } else { + if (imIt->second.mFileName.empty()) { + throw DeadlyImportError("Collada: Invalid texture, no data or file reference given"); + } + result.Set(imIt->second.mFileName); ConvertPath(result); } diff --git a/code/Collada/ColladaLoader.h b/code/Collada/ColladaLoader.h index ad606ea74..92f390f17 100644 --- a/code/Collada/ColladaLoader.h +++ b/code/Collada/ColladaLoader.h @@ -100,14 +100,14 @@ protected: /** Return importer meta information. * See #BaseImporter::GetInfo for the details */ - const aiImporterDesc* GetInfo () const; + const aiImporterDesc* GetInfo () const override; - void SetupProperties(const Importer* pImp); + void SetupProperties(const Importer* pImp) override; /** Imports the given file into the given scene structure. * See BaseImporter::InternReadFile() for details */ - void InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler); + void InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler) override; /** Recursively constructs a scene node for the given parser node and returns it. */ aiNode* BuildHierarchy( const ColladaParser& pParser, const Collada::Node* pNode); diff --git a/code/Collada/ColladaParser.cpp b/code/Collada/ColladaParser.cpp index 560c0cc9d..20a881860 100644 --- a/code/Collada/ColladaParser.cpp +++ b/code/Collada/ColladaParser.cpp @@ -132,7 +132,7 @@ ColladaParser::ColladaParser(IOSystem* pIOHandler, const std::string& pFile) // read embedded textures if (zip_archive && zip_archive->isOpen()) { - // TODO + ReadEmbeddedTextures(*zip_archive); } } @@ -3056,6 +3056,26 @@ void ColladaParser::ReadMaterialVertexInputBinding(Collada::SemanticMappingTable } } +void Assimp::ColladaParser::ReadEmbeddedTextures(ZipArchiveIOSystem& zip_archive) +{ + // Attempt to load any undefined Collada::Image in ImageLibrary + for (ImageLibrary::iterator it = mImageLibrary.begin(); it != mImageLibrary.end(); ++it) { + Collada::Image &image = (*it).second; + + if (image.mImageData.empty()) { + std::unique_ptr image_file(zip_archive.Open(image.mFileName.c_str())); + if (image_file) { + image.mImageData.resize(image_file->FileSize()); + image_file->Read(image.mImageData.data(), image_file->FileSize(), 1); + image.mEmbeddedFormat = BaseImporter::GetExtension(image.mFileName); + if (image.mEmbeddedFormat == "jpeg") { + image.mEmbeddedFormat = "jpg"; + } + } + } + } +} + // ------------------------------------------------------------------------------------------------ // Reads a mesh reference in a node and adds it to the node's mesh list void ColladaParser::ReadNodeGeometry(Node* pNode) diff --git a/code/Collada/ColladaParser.h b/code/Collada/ColladaParser.h index 7c77013f6..a2c9a4ff2 100644 --- a/code/Collada/ColladaParser.h +++ b/code/Collada/ColladaParser.h @@ -239,6 +239,9 @@ namespace Assimp // Processes bind_vertex_input and bind elements void ReadMaterialVertexInputBinding( Collada::SemanticMappingTable& tbl); + /** Reads embedded textures from a ZAE archive*/ + void ReadEmbeddedTextures(ZipArchiveIOSystem &zip_archive); + protected: /** Aborts the file reading with an exception */ AI_WONT_RETURN void ThrowException( const std::string& pError) const AI_WONT_RETURN_SUFFIX; From 0c718a9c95d7d48d9dba832d35772efabefa2f88 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Fri, 12 Jul 2019 14:56:29 +0100 Subject: [PATCH 010/320] Add Collada ZAE unit test --- test/unit/utColladaImportExport.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/test/unit/utColladaImportExport.cpp b/test/unit/utColladaImportExport.cpp index 78a74d973..1a2a6bc9d 100644 --- a/test/unit/utColladaImportExport.cpp +++ b/test/unit/utColladaImportExport.cpp @@ -57,6 +57,19 @@ public: } }; -TEST_F( utColladaImportExport, importBlenFromFileTest ) { - EXPECT_TRUE( importerTest() ); +TEST_F(utColladaImportExport, importBlenFromFileTest) { + EXPECT_TRUE(importerTest()); +} + +class utColladaZaeImportExport : public AbstractImportExportBase { +public: + virtual bool importerTest() { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/Collada/duck.zae", aiProcess_ValidateDataStructure); + return nullptr != scene; + } +}; + +TEST_F(utColladaZaeImportExport, importBlenFromFileTest) { + EXPECT_TRUE(importerTest()); } From 678dd32da3c772831b210a348eda7069c84b31ad Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Fri, 12 Jul 2019 15:37:10 +0100 Subject: [PATCH 011/320] Add missing header --- code/Common/ZipArchiveIOSystem.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/code/Common/ZipArchiveIOSystem.cpp b/code/Common/ZipArchiveIOSystem.cpp index 5a42a0dcb..cff1109c2 100644 --- a/code/Common/ZipArchiveIOSystem.cpp +++ b/code/Common/ZipArchiveIOSystem.cpp @@ -46,6 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include #ifdef ASSIMP_USE_HUNTER # include From 07d3a7d5b075ad091403bd3330b0af9fc1457658 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Fri, 12 Jul 2019 16:02:51 +0100 Subject: [PATCH 012/320] Fix some warnings Hopefully the sorts out the MSVC2013 compiler --- code/Common/ZipArchiveIOSystem.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/code/Common/ZipArchiveIOSystem.cpp b/code/Common/ZipArchiveIOSystem.cpp index cff1109c2..8079db0b8 100644 --- a/code/Common/ZipArchiveIOSystem.cpp +++ b/code/Common/ZipArchiveIOSystem.cpp @@ -199,20 +199,23 @@ namespace Assimp { explicit ZipFileInfo(unzFile zip_handle, size_t size); // Allocate and Extract data from the ZIP - ZipFile * Extract(unzFile zip_handle, const std::string & file) const; + ZipFile * Extract(unzFile zip_handle) const; private: size_t m_Size = 0; - unz_file_pos_s m_ZipFilePos = { 0,0 }; + unz_file_pos_s m_ZipFilePos; }; ZipFileInfo::ZipFileInfo(unzFile zip_handle, size_t size) : m_Size(size) { ai_assert(m_Size != 0); + // Workaround for MSVC 2013 - C2797 + m_ZipFilePos.num_of_file = 0; + m_ZipFilePos.pos_in_zip_directory = 0; unzGetFilePos(zip_handle, &(m_ZipFilePos)); } - ZipFile * ZipFileInfo::Extract(unzFile zip_handle, const std::string & file) const { + ZipFile * ZipFileInfo::Extract(unzFile zip_handle) const { // Find in the ZIP. This cannot fail unz_file_pos_s *filepos = const_cast(&(m_ZipFilePos)); if (unzGoToFilePos(zip_handle, filepos) != UNZ_OK) @@ -385,8 +388,6 @@ namespace Assimp { MapArchive(); ZipFileMap::const_iterator it = m_ArchiveMap.find(filename); - bool exist(false); - return (it != m_ArchiveMap.end()); } @@ -401,7 +402,7 @@ namespace Assimp { return nullptr; const ZipFileInfo &zip_file = (*zip_it).second; - return zip_file.Extract(m_ZipFileHandle, filename); + return zip_file.Extract(m_ZipFileHandle); } inline void ReplaceAll(std::string& data, const std::string& before, const std::string& after) { From bcdb173e0936b191c2a150819ddc1b0942582cda Mon Sep 17 00:00:00 2001 From: Frooxius Date: Sat, 13 Jul 2019 22:20:47 +0200 Subject: [PATCH 013/320] - Fixed anim meshes generated from blendshapes not being copied to output for multi-material meshes - Fixed first vertex of each blendshape on a multi-material mesh having all unmapped vertice offsets being added to it - Fixed blendshapes not importing for multi-material FBX meshes with no bones --- code/FBX/FBXConverter.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/code/FBX/FBXConverter.cpp b/code/FBX/FBXConverter.cpp index a4c1015bf..9f940d322 100644 --- a/code/FBX/FBXConverter.cpp +++ b/code/FBX/FBXConverter.cpp @@ -1247,10 +1247,10 @@ namespace Assimp { ai_assert(count_faces); ai_assert(count_vertices); - // mapping from output indices to DOM indexing, needed to resolve weights + // mapping from output indices to DOM indexing, needed to resolve weights or blendshapes std::vector reverseMapping; std::map translateIndexMap; - if (process_weights) { + if (process_weights || mesh.GetBlendShapes().size() > 0) { reverseMapping.resize(count_vertices); } @@ -1407,7 +1407,10 @@ namespace Assimp { unsigned int count = 0; const unsigned int* outIndices = mesh.ToOutputVertexIndex(index, count); for (unsigned int k = 0; k < count; k++) { - unsigned int index = translateIndexMap[outIndices[k]]; + unsigned int outIndex = outIndices[k]; + if (translateIndexMap.find(outIndex) == translateIndexMap.end()) + continue; + unsigned int index = translateIndexMap[outIndex]; animMesh->mVertices[index] += vertex; if (animMesh->mNormals != nullptr) { animMesh->mNormals[index] += normal; @@ -1421,6 +1424,15 @@ namespace Assimp { } } + const size_t numAnimMeshes = animMeshes.size(); + if (numAnimMeshes > 0) { + out_mesh->mNumAnimMeshes = static_cast(numAnimMeshes); + out_mesh->mAnimMeshes = new aiAnimMesh*[numAnimMeshes]; + for (size_t i = 0; i < numAnimMeshes; i++) { + out_mesh->mAnimMeshes[i] = animMeshes.at(i); + } + } + return static_cast(meshes.size() - 1); } From f2731a1b99b6174c1d33b3c6e4146b1ecf72a097 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:27:59 -0700 Subject: [PATCH 014/320] customize error rate for bind pose --- code/FBX/FBXExporter.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 08f4bdbc9..f25b4f135 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -68,6 +68,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include //wangyi + // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure @@ -1840,7 +1842,10 @@ void FBXExporter::WriteObjects () // this should be the same as the bone's mOffsetMatrix. // if it's not the same, the skeleton isn't in the bind pose. - const float epsilon = 1e-4f; // some error is to be expected + float epsilon = 1e-4f; // some error is to be expected +#ifdef ASSIMP_CUSTOM_BINDPOSE_ERR + epsilon = ASSIMP_CUSTOM_BINDPOSE_ERR; +#endif bool bone_xform_okay = true; if (b && ! tr.Equal(b->mOffsetMatrix, epsilon)) { not_in_bind_pose.insert(b); From add4d6028b5da6c2a4c1cf4a9261a7a288715262 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:29:50 -0700 Subject: [PATCH 015/320] clean up --- code/FBX/FBXExporter.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index f25b4f135..5367a8525 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -68,8 +68,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#include //wangyi - // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure From 36130f9b86d27a8c8600dc5d163d69d9cbb19fef Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Thu, 11 Jul 2019 17:00:47 -0700 Subject: [PATCH 016/320] use ExportProperties to customize bind pose epsilon --- code/FBX/FBXExporter.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 5367a8525..915b4aca7 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -67,6 +67,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ @@ -1841,9 +1842,9 @@ void FBXExporter::WriteObjects () // this should be the same as the bone's mOffsetMatrix. // if it's not the same, the skeleton isn't in the bind pose. float epsilon = 1e-4f; // some error is to be expected -#ifdef ASSIMP_CUSTOM_BINDPOSE_ERR - epsilon = ASSIMP_CUSTOM_BINDPOSE_ERR; -#endif + float epsilon_custom = mProperties->GetPropertyFloat("BINDPOSE_EPSILON", -1); + if(epsilon_custom > 0) + epsilon = epsilon_custom; bool bone_xform_okay = true; if (b && ! tr.Equal(b->mOffsetMatrix, epsilon)) { not_in_bind_pose.insert(b); From f04517004878681e4fac09a60f7876a6df4652f2 Mon Sep 17 00:00:00 2001 From: ywang Date: Mon, 15 Jul 2019 15:52:45 -0700 Subject: [PATCH 017/320] update --- code/FBX/FBXExporter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 915b4aca7..dc17fc885 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -67,7 +67,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include -#include // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ From c1670b6a97dc91f7176afc16e21922a4c633bb95 Mon Sep 17 00:00:00 2001 From: kimkulling Date: Tue, 16 Jul 2019 11:40:34 +0200 Subject: [PATCH 018/320] closes https://github.com/assimp/assimp/issues/2548: check if weight are set or set the weight to 1.0f --- code/Collada/ColladaLoader.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/Collada/ColladaLoader.cpp b/code/Collada/ColladaLoader.cpp index 81db957d5..8d4570da8 100644 --- a/code/Collada/ColladaLoader.cpp +++ b/code/Collada/ColladaLoader.cpp @@ -772,10 +772,14 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: for( size_t b = 0; b < pairCount; ++b, ++iit) { - size_t jointIndex = iit->first; - size_t vertexIndex = iit->second; - ai_real weight = ReadFloat( weightsAcc, weights, vertexIndex, 0); + const size_t jointIndex = iit->first; + const size_t vertexIndex = iit->second; + ai_real weight = 1.0f; + if (!weights.mValues.empty()) { + weight = ReadFloat(weightsAcc, weights, vertexIndex, 0); + } + // one day I gonna kill that XSI Collada exporter if( weight > 0.0f) From 2122dc231d25bbf8bb604d11892f0b01cc4bd8e9 Mon Sep 17 00:00:00 2001 From: Merwan Date: Tue, 16 Jul 2019 20:37:41 +0200 Subject: [PATCH 019/320] Fix line continuations in OBJ files --- code/Obj/ObjFileParser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Obj/ObjFileParser.cpp b/code/Obj/ObjFileParser.cpp index d1603c6f0..97ef4af70 100644 --- a/code/Obj/ObjFileParser.cpp +++ b/code/Obj/ObjFileParser.cpp @@ -118,7 +118,7 @@ void ObjFileParser::parseFile( IOStreamBuffer &streamBuffer ) { size_t lastFilePos( 0 ); std::vector buffer; - while ( streamBuffer.getNextDataLine( buffer, '\0' ) ) { + while ( streamBuffer.getNextDataLine( buffer, '\\' ) ) { m_DataIt = buffer.begin(); m_DataItEnd = buffer.end(); From 9210ff37f2433e016cb8b83d62f9064ed0428e8d Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Tue, 9 Jul 2019 19:05:45 -0700 Subject: [PATCH 020/320] fix group node being exported as bone node --- code/FBX/FBXExporter.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index dd34e135f..a0a46e09d 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -1617,6 +1617,17 @@ void FBXExporter::WriteObjects () // at the same time we can build a list of all the skeleton nodes, // which will be used later to mark them as type "limbNode". std::unordered_set limbnodes; + + //actual bone nodes in fbx, without parenting-up + std::set setAllBoneNamesInScene; + for(int m = 0; m < mScene->mNumMeshes; ++ m) + { + aiMesh* pMesh = mScene->mMeshes[m]; + for(int b = 0; b < pMesh->mNumBones; ++ b) + setAllBoneNamesInScene.insert(pMesh->mBones[b]->mName.data); + } + aiMatrix4x4 mxTransIdentity; + // and a map of nodes by bone name, as finding them is annoying. std::map node_by_bone; for (size_t mi = 0; mi < mScene->mNumMeshes; ++mi) { @@ -1660,6 +1671,11 @@ void FBXExporter::WriteObjects () if (node_name.find(MAGIC_NODE_TAG) != std::string::npos) { continue; } + //not a bone in scene && no effect in transform + if(setAllBoneNamesInScene.find(node_name)==setAllBoneNamesInScene.end() + && parent->mTransformation == mxTransIdentity) { + continue; + } // otherwise check if this is the root of the skeleton bool end = false; // is the mesh part of this node? From c889699d581f2acbef899120be60104c5b1127cb Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 09:51:20 -0700 Subject: [PATCH 021/320] set->unordered_set;unsigned int for iteration --- code/FBX/FBXExporter.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index a0a46e09d..08f4bdbc9 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -1619,11 +1619,11 @@ void FBXExporter::WriteObjects () std::unordered_set limbnodes; //actual bone nodes in fbx, without parenting-up - std::set setAllBoneNamesInScene; - for(int m = 0; m < mScene->mNumMeshes; ++ m) + std::unordered_set setAllBoneNamesInScene; + for(unsigned int m = 0; m < mScene->mNumMeshes; ++ m) { aiMesh* pMesh = mScene->mMeshes[m]; - for(int b = 0; b < pMesh->mNumBones; ++ b) + for(unsigned int b = 0; b < pMesh->mNumBones; ++ b) setAllBoneNamesInScene.insert(pMesh->mBones[b]->mName.data); } aiMatrix4x4 mxTransIdentity; From cdf60d7423200890b9740715fb0ef1a65f5da6f0 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:27:59 -0700 Subject: [PATCH 022/320] customize error rate for bind pose --- code/FBX/FBXExporter.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 08f4bdbc9..f25b4f135 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -68,6 +68,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include //wangyi + // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure @@ -1840,7 +1842,10 @@ void FBXExporter::WriteObjects () // this should be the same as the bone's mOffsetMatrix. // if it's not the same, the skeleton isn't in the bind pose. - const float epsilon = 1e-4f; // some error is to be expected + float epsilon = 1e-4f; // some error is to be expected +#ifdef ASSIMP_CUSTOM_BINDPOSE_ERR + epsilon = ASSIMP_CUSTOM_BINDPOSE_ERR; +#endif bool bone_xform_okay = true; if (b && ! tr.Equal(b->mOffsetMatrix, epsilon)) { not_in_bind_pose.insert(b); From 6e0810d3c1e31f347ea2dff60ef7202bc9c5f802 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:29:50 -0700 Subject: [PATCH 023/320] clean up --- code/FBX/FBXExporter.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index f25b4f135..5367a8525 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -68,8 +68,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#include //wangyi - // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure From 6299c58fae951302e67381921de55994b9125517 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Thu, 11 Jul 2019 17:00:47 -0700 Subject: [PATCH 024/320] use ExportProperties to customize bind pose epsilon --- code/FBX/FBXExporter.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 5367a8525..915b4aca7 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -67,6 +67,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ @@ -1841,9 +1842,9 @@ void FBXExporter::WriteObjects () // this should be the same as the bone's mOffsetMatrix. // if it's not the same, the skeleton isn't in the bind pose. float epsilon = 1e-4f; // some error is to be expected -#ifdef ASSIMP_CUSTOM_BINDPOSE_ERR - epsilon = ASSIMP_CUSTOM_BINDPOSE_ERR; -#endif + float epsilon_custom = mProperties->GetPropertyFloat("BINDPOSE_EPSILON", -1); + if(epsilon_custom > 0) + epsilon = epsilon_custom; bool bone_xform_okay = true; if (b && ! tr.Equal(b->mOffsetMatrix, epsilon)) { not_in_bind_pose.insert(b); From 5121a835b5021a2262e71550fd876688fd9c72ae Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:27:59 -0700 Subject: [PATCH 025/320] customize error rate for bind pose --- code/FBX/FBXExporter.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 915b4aca7..7419f3d15 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -69,6 +69,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include //wangyi + // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure From e3683e49e4476aaba44fe5b9484091413ea35f7f Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:29:50 -0700 Subject: [PATCH 026/320] clean up --- code/FBX/FBXExporter.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 7419f3d15..915b4aca7 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -69,8 +69,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#include //wangyi - // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure From e1e9d92c01e0f38f0da2b02ca4acb409f84eedb2 Mon Sep 17 00:00:00 2001 From: ywang Date: Mon, 15 Jul 2019 15:52:45 -0700 Subject: [PATCH 027/320] update --- code/FBX/FBXExporter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 915b4aca7..dc17fc885 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -67,7 +67,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include -#include // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ From 2f6a005fb8c0f5830e03ad6dfe218810d3aebadf Mon Sep 17 00:00:00 2001 From: Merwan Date: Wed, 17 Jul 2019 18:19:17 +0200 Subject: [PATCH 028/320] Add unit test for OBJ line continuations --- test/unit/utObjImportExport.cpp | 34 +++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/test/unit/utObjImportExport.cpp b/test/unit/utObjImportExport.cpp index bb0d36b13..8156091b8 100644 --- a/test/unit/utObjImportExport.cpp +++ b/test/unit/utObjImportExport.cpp @@ -448,3 +448,37 @@ TEST_F(utObjImportExport, import_without_linend) { const aiScene *scene = myImporter.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/box_without_lineending.obj", 0); ASSERT_NE(nullptr, scene); } + +TEST_F(utObjImportExport, import_with_line_continuations) { + static const char *ObjModel = + "v -0.5 -0.5 0.5\n" + "v -0.5 \\\n" + " -0.5 -0.5\n" + "v -0.5 \\\n" + " 0.5 \\\n" + " -0.5\n" + "f 1 2 3\n"; + + Assimp::Importer myImporter; + const aiScene *scene = myImporter.ReadFileFromMemory(ObjModel, strlen(ObjModel), 0); + EXPECT_NE(nullptr, scene); + + EXPECT_EQ(scene->mNumMeshes, 1U); + EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 3U); + EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 1U); + + auto vertices = scene->mMeshes[0]->mVertices; + const float threshold = 0.0001f; + + EXPECT_NEAR(vertices[0].x, -0.5f, threshold); + EXPECT_NEAR(vertices[0].y, -0.5f, threshold); + EXPECT_NEAR(vertices[0].z, 0.5f, threshold); + + EXPECT_NEAR(vertices[1].x, -0.5f, threshold); + EXPECT_NEAR(vertices[1].y, -0.5f, threshold); + EXPECT_NEAR(vertices[1].z, -0.5f, threshold); + + EXPECT_NEAR(vertices[2].x, -0.5f, threshold); + EXPECT_NEAR(vertices[2].y, 0.5f, threshold); + EXPECT_NEAR(vertices[2].z, -0.5f, threshold); +} From a8019cf8d896d70349f13abd2d233efc62179768 Mon Sep 17 00:00:00 2001 From: kkulling Date: Fri, 19 Jul 2019 10:38:44 +0200 Subject: [PATCH 029/320] Unit: Fix new compiler warnings. --- code/Collada/ColladaLoader.cpp | 198 ++++++++++++++-------------- test/unit/utFBXImporterExporter.cpp | 39 +++--- test/unit/utSortByPType.cpp | 3 +- test/unit/utglTF2ImportExport.cpp | 135 +++++++++---------- 4 files changed, 182 insertions(+), 193 deletions(-) diff --git a/code/Collada/ColladaLoader.cpp b/code/Collada/ColladaLoader.cpp index 8d4570da8..e10edb732 100644 --- a/code/Collada/ColladaLoader.cpp +++ b/code/Collada/ColladaLoader.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -43,7 +41,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @file Implementation of the Collada loader */ - #ifndef ASSIMP_BUILD_NO_COLLADA_IMPORTER #include "ColladaLoader.h" @@ -67,7 +64,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -using namespace Assimp; +namespace Assimp { + using namespace Assimp::Formatter; static const aiImporterDesc desc = { @@ -112,7 +110,7 @@ ColladaLoader::~ColladaLoader() { // Returns whether the class can handle the format of the given file. bool ColladaLoader::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const { // check file extension - std::string extension = GetExtension(pFile); + const std::string extension = GetExtension(pFile); if (extension == "dae") { return true; @@ -166,12 +164,13 @@ void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, I // parse the input file ColladaParser parser( pIOHandler, pFile); - if( !parser.mRootNode) + if( !parser.mRootNode) { throw DeadlyImportError( "Collada: File came out empty. Something is wrong here."); + } // reserve some storage to avoid unnecessary reallocs - newMats.reserve(parser.mMaterialLibrary.size()*2); - mMeshes.reserve(parser.mMeshLibrary.size()*2); + newMats.reserve(parser.mMaterialLibrary.size()*2u); + mMeshes.reserve(parser.mMeshLibrary.size()*2u); mCameras.reserve(parser.mCameraLibrary.size()); mLights.reserve(parser.mLightLibrary.size()); @@ -191,19 +190,20 @@ void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, I 0, 0, parser.mUnitSize, 0, 0, 0, 0, 1); if( !ignoreUpDirection ) { - // Convert to Y_UP, if different orientation - if( parser.mUpDirection == ColladaParser::UP_X) - pScene->mRootNode->mTransformation *= aiMatrix4x4( - 0, -1, 0, 0, - 1, 0, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1); - else if( parser.mUpDirection == ColladaParser::UP_Z) - pScene->mRootNode->mTransformation *= aiMatrix4x4( - 1, 0, 0, 0, - 0, 0, 1, 0, - 0, -1, 0, 0, - 0, 0, 0, 1); + // Convert to Y_UP, if different orientation + if( parser.mUpDirection == ColladaParser::UP_X) { + pScene->mRootNode->mTransformation *= aiMatrix4x4( + 0, -1, 0, 0, + 1, 0, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + } else if( parser.mUpDirection == ColladaParser::UP_Z) { + pScene->mRootNode->mTransformation *= aiMatrix4x4( + 1, 0, 0, 0, + 0, 0, 1, 0, + 0, -1, 0, 0, + 0, 0, 0, 1); + } } // Store scene metadata @@ -211,8 +211,7 @@ void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, I const size_t numMeta(parser.mAssetMetaData.size()); pScene->mMetaData = aiMetadata::Alloc(static_cast(numMeta)); size_t i = 0; - for (auto it = parser.mAssetMetaData.cbegin(); it != parser.mAssetMetaData.cend(); ++it, ++i) - { + for (auto it = parser.mAssetMetaData.cbegin(); it != parser.mAssetMetaData.cend(); ++it, ++i) { pScene->mMetaData->Set(static_cast(i), (*it).first, (*it).second); } } @@ -232,9 +231,8 @@ void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, I // store all animations StoreAnimations( pScene, parser); - // If no meshes have been loaded, it's probably just an animated skeleton. - if (!pScene->mNumMeshes) { + if ( 0u == pScene->mNumMeshes) { if (!noSkeletonMesh) { SkeletonMeshBuilder hero(pScene); @@ -302,13 +300,12 @@ void ColladaLoader::ResolveNodeInstances( const ColladaParser& pParser, const Co // FIX for http://sourceforge.net/tracker/?func=detail&aid=3054873&group_id=226462&atid=1067632 // need to check for both name and ID to catch all. To avoid breaking valid files, // the workaround is only enabled when the first attempt to resolve the node has failed. - if (!nd) { + if (nullptr == nd) { nd = FindNode(pParser.mRootNode, nodeInst.mNode); } - if (!nd) + if (nullptr == nd) { ASSIMP_LOG_ERROR_F("Collada: Unable to resolve reference to instanced node ", nodeInst.mNode); - - else { + } else { // attach this node to the list of children resolved.push_back(nd); } @@ -318,7 +315,7 @@ void ColladaLoader::ResolveNodeInstances( const ColladaParser& pParser, const Co // ------------------------------------------------------------------------------------------------ // Resolve UV channels void ColladaLoader::ApplyVertexToEffectSemanticMapping(Collada::Sampler& sampler, - const Collada::SemanticMappingTable& table) { + const Collada::SemanticMappingTable& table) { std::map::const_iterator it = table.mMap.find(sampler.mUVChannel); if (it != table.mMap.end()) { if (it->second.mType != Collada::IT_Texcoord) { @@ -431,8 +428,7 @@ void ColladaLoader::BuildCamerasForNode( const ColladaParser& pParser, const Col out->mAspect = std::tan(AI_DEG_TO_RAD(srcCamera->mHorFov)) / std::tan(AI_DEG_TO_RAD(srcCamera->mVerFov)); } - } - else if (srcCamera->mAspect != 10e10f && srcCamera->mVerFov != 10e10f) { + } else if (srcCamera->mAspect != 10e10f && srcCamera->mVerFov != 10e10f) { out->mHorizontalFOV = 2.0f * AI_RAD_TO_DEG(std::atan(srcCamera->mAspect * std::tan(AI_DEG_TO_RAD(srcCamera->mVerFov) * 0.5f))); } @@ -470,7 +466,7 @@ void ColladaLoader::BuildMeshesForNode( const ColladaParser& pParser, const Coll } } - if( !srcMesh) { + if( nullptr == srcMesh) { ASSIMP_LOG_WARN_F( "Collada: Unable to find geometry for ID \"", mid.mMeshOrController, "\". Skipping." ); continue; } @@ -770,16 +766,13 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: IndexPairVector::const_iterator iit = weightStartPerVertex[orgIndex]; size_t pairCount = pSrcController->mWeightCounts[orgIndex]; - for( size_t b = 0; b < pairCount; ++b, ++iit) - { - + for( size_t b = 0; b < pairCount; ++b, ++iit) { const size_t jointIndex = iit->first; const size_t vertexIndex = iit->second; ai_real weight = 1.0f; if (!weights.mValues.empty()) { weight = ReadFloat(weightsAcc, weights, vertexIndex, 0); } - // one day I gonna kill that XSI Collada exporter if( weight > 0.0f) @@ -794,19 +787,21 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: // count the number of bones which influence vertices of the current submesh size_t numRemainingBones = 0; - for( std::vector >::const_iterator it = dstBones.begin(); it != dstBones.end(); ++it) - if( it->size() > 0) - numRemainingBones++; + for( std::vector >::const_iterator it = dstBones.begin(); it != dstBones.end(); ++it) { + if( it->size() > 0) { + ++numRemainingBones; + } + } // create bone array and copy bone weights one by one dstMesh->mNumBones = static_cast(numRemainingBones); dstMesh->mBones = new aiBone*[numRemainingBones]; size_t boneCount = 0; - for( size_t a = 0; a < numBones; ++a) - { + for( size_t a = 0; a < numBones; ++a) { // omit bones without weights - if( dstBones[a].size() == 0) + if( dstBones[a].empty() ) { continue; + } // create bone with its weights aiBone* bone = new aiBone; @@ -852,14 +847,16 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: // and replace the bone's name by the node's name so that the user can use the standard // find-by-name method to associate nodes with bones. const Collada::Node* bnode = FindNode( pParser.mRootNode, bone->mName.data); - if( !bnode) + if( !bnode) { bnode = FindNodeBySID( pParser.mRootNode, bone->mName.data); + } // assign the name that we would have assigned for the source node - if( bnode) + if( bnode) { bone->mName.Set( FindNameForNode( bnode)); - else + } else { ASSIMP_LOG_WARN_F( "ColladaLoader::CreateMesh(): could not find corresponding node for joint \"", bone->mName.data, "\"." ); + } // and insert bone dstMesh->mBones[boneCount++] = bone; @@ -871,89 +868,80 @@ aiMesh* ColladaLoader::CreateMesh( const ColladaParser& pParser, const Collada:: // ------------------------------------------------------------------------------------------------ // Stores all meshes in the given scene -void ColladaLoader::StoreSceneMeshes( aiScene* pScene) -{ +void ColladaLoader::StoreSceneMeshes( aiScene* pScene) { pScene->mNumMeshes = static_cast(mMeshes.size()); - if( mMeshes.size() > 0) - { - pScene->mMeshes = new aiMesh*[mMeshes.size()]; - std::copy( mMeshes.begin(), mMeshes.end(), pScene->mMeshes); - mMeshes.clear(); + if( mMeshes.empty() ) { + return; } + pScene->mMeshes = new aiMesh*[mMeshes.size()]; + std::copy( mMeshes.begin(), mMeshes.end(), pScene->mMeshes); + mMeshes.clear(); } // ------------------------------------------------------------------------------------------------ // Stores all cameras in the given scene -void ColladaLoader::StoreSceneCameras( aiScene* pScene) -{ +void ColladaLoader::StoreSceneCameras( aiScene* pScene) { pScene->mNumCameras = static_cast(mCameras.size()); - if( mCameras.size() > 0) - { - pScene->mCameras = new aiCamera*[mCameras.size()]; - std::copy( mCameras.begin(), mCameras.end(), pScene->mCameras); - mCameras.clear(); + if( mCameras.empty() ) { + return; } + pScene->mCameras = new aiCamera*[mCameras.size()]; + std::copy( mCameras.begin(), mCameras.end(), pScene->mCameras); + mCameras.clear(); } // ------------------------------------------------------------------------------------------------ // Stores all lights in the given scene -void ColladaLoader::StoreSceneLights( aiScene* pScene) -{ +void ColladaLoader::StoreSceneLights( aiScene* pScene) { pScene->mNumLights = static_cast(mLights.size()); - if( mLights.size() > 0) - { - pScene->mLights = new aiLight*[mLights.size()]; - std::copy( mLights.begin(), mLights.end(), pScene->mLights); - mLights.clear(); + if( mLights.empty() ) { + return; } + pScene->mLights = new aiLight*[mLights.size()]; + std::copy( mLights.begin(), mLights.end(), pScene->mLights); + mLights.clear(); } // ------------------------------------------------------------------------------------------------ // Stores all textures in the given scene -void ColladaLoader::StoreSceneTextures( aiScene* pScene) -{ +void ColladaLoader::StoreSceneTextures( aiScene* pScene) { pScene->mNumTextures = static_cast(mTextures.size()); - if( mTextures.size() > 0) - { - pScene->mTextures = new aiTexture*[mTextures.size()]; - std::copy( mTextures.begin(), mTextures.end(), pScene->mTextures); - mTextures.clear(); + if( mTextures.empty() ) { + return; } + pScene->mTextures = new aiTexture*[mTextures.size()]; + std::copy( mTextures.begin(), mTextures.end(), pScene->mTextures); + mTextures.clear(); } // ------------------------------------------------------------------------------------------------ // Stores all materials in the given scene -void ColladaLoader::StoreSceneMaterials( aiScene* pScene) -{ +void ColladaLoader::StoreSceneMaterials( aiScene* pScene) { pScene->mNumMaterials = static_cast(newMats.size()); - - if (newMats.size() > 0) { - pScene->mMaterials = new aiMaterial*[newMats.size()]; - for (unsigned int i = 0; i < newMats.size();++i) - pScene->mMaterials[i] = newMats[i].second; - - newMats.clear(); + if (newMats.empty() ) { + return; } + pScene->mMaterials = new aiMaterial*[newMats.size()]; + for (unsigned int i = 0; i < newMats.size();++i) { + pScene->mMaterials[i] = newMats[i].second; + } + newMats.clear(); } // ------------------------------------------------------------------------------------------------ // Stores all animations -void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pParser) -{ +void ColladaLoader::StoreAnimations( aiScene* pScene, const ColladaParser& pParser) { // recursively collect all animations from the collada scene StoreAnimations( pScene, pParser, &pParser.mAnims, ""); // catch special case: many animations with the same length, each affecting only a single node. // we need to unite all those single-node-anims to a proper combined animation - for( size_t a = 0; a < mAnims.size(); ++a) - { + for( size_t a = 0; a < mAnims.size(); ++a) { aiAnimation* templateAnim = mAnims[a]; - if( templateAnim->mNumChannels == 1) - { + if( templateAnim->mNumChannels == 1) { // search for other single-channel-anims with the same duration std::vector collectedAnimIndices; - for( size_t b = a+1; b < mAnims.size(); ++b) - { + for( size_t b = a+1; b < mAnims.size(); ++b) { aiAnimation* other = mAnims[b]; if( other->mNumChannels == 1 && other->mDuration == templateAnim->mDuration && other->mTicksPerSecond == templateAnim->mTicksPerSecond ) @@ -1884,19 +1872,23 @@ const Collada::Node* ColladaLoader::FindNode( const Collada::Node* pNode, const // ------------------------------------------------------------------------------------------------ // Finds a node in the collada scene by the given SID -const Collada::Node* ColladaLoader::FindNodeBySID( const Collada::Node* pNode, const std::string& pSID) const -{ - if( pNode->mSID == pSID) - return pNode; +const Collada::Node* ColladaLoader::FindNodeBySID( const Collada::Node* pNode, const std::string& pSID) const { + if (nullptr == pNode) { + return nullptr; + } - for( size_t a = 0; a < pNode->mChildren.size(); ++a) - { - const Collada::Node* node = FindNodeBySID( pNode->mChildren[a], pSID); - if( node) - return node; - } + if (pNode->mSID == pSID) { + return pNode; + } - return NULL; + for( size_t a = 0; a < pNode->mChildren.size(); ++a) { + const Collada::Node* node = FindNodeBySID( pNode->mChildren[a], pSID); + if (node) { + return node; + } + } + + return nullptr; } // ------------------------------------------------------------------------------------------------ @@ -1930,4 +1922,6 @@ std::string ColladaLoader::FindNameForNode( const Collada::Node* pNode) } } +} // Namespace Assimp + #endif // !! ASSIMP_BUILD_NO_DAE_IMPORTER diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index 3180d96a2..ecba5ee1e 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -70,10 +70,10 @@ TEST_F( utFBXImporterExporter, importBareBoxWithoutColorsAndTextureCoords ) { Assimp::Importer importer; const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/FBX/box.fbx", aiProcess_ValidateDataStructure ); EXPECT_NE( nullptr, scene ); - EXPECT_EQ(scene->mNumMeshes, 1); + EXPECT_EQ(scene->mNumMeshes, 1u); aiMesh* mesh = scene->mMeshes[0]; - EXPECT_EQ(mesh->mNumFaces, 12); - EXPECT_EQ(mesh->mNumVertices, 36); + EXPECT_EQ(mesh->mNumFaces, 12u); + EXPECT_EQ(mesh->mNumVertices, 36u); } TEST_F(utFBXImporterExporter, importCubesWithNoNames) { @@ -85,13 +85,13 @@ TEST_F(utFBXImporterExporter, importCubesWithNoNames) { const auto root = scene->mRootNode; ASSERT_STREQ(root->mName.C_Str(), "RootNode"); ASSERT_TRUE(root->mChildren); - ASSERT_EQ(root->mNumChildren, 2); + ASSERT_EQ(root->mNumChildren, 2u); const auto child0 = root->mChildren[0]; ASSERT_TRUE(child0); ASSERT_STREQ(child0->mName.C_Str(), "RootNode001"); ASSERT_TRUE(child0->mChildren); - ASSERT_EQ(child0->mNumChildren, 1); + ASSERT_EQ(child0->mNumChildren, 1u); const auto child00 = child0->mChildren[0]; ASSERT_TRUE(child00); @@ -101,7 +101,7 @@ TEST_F(utFBXImporterExporter, importCubesWithNoNames) { ASSERT_TRUE(child1); ASSERT_STREQ(child1->mName.C_Str(), "RootNode002"); ASSERT_TRUE(child1->mChildren); - ASSERT_EQ(child1->mNumChildren, 1); + ASSERT_EQ(child1->mNumChildren, 1u); const auto child10 = child1->mChildren[0]; ASSERT_TRUE(child10); @@ -117,13 +117,13 @@ TEST_F(utFBXImporterExporter, importCubesWithUnicodeDuplicatedNames) { const auto root = scene->mRootNode; ASSERT_STREQ(root->mName.C_Str(), "RootNode"); ASSERT_TRUE(root->mChildren); - ASSERT_EQ(root->mNumChildren, 2); + ASSERT_EQ(root->mNumChildren, 2u); const auto child0 = root->mChildren[0]; ASSERT_TRUE(child0); ASSERT_STREQ(child0->mName.C_Str(), "Cube2"); ASSERT_TRUE(child0->mChildren); - ASSERT_EQ(child0->mNumChildren, 1); + ASSERT_EQ(child0->mNumChildren, 1u); const auto child00 = child0->mChildren[0]; ASSERT_TRUE(child00); @@ -133,7 +133,7 @@ TEST_F(utFBXImporterExporter, importCubesWithUnicodeDuplicatedNames) { ASSERT_TRUE(child1); ASSERT_STREQ(child1->mName.C_Str(), "Cube3"); ASSERT_TRUE(child1->mChildren); - ASSERT_EQ(child1->mNumChildren, 1); + ASSERT_EQ(child1->mNumChildren, 1u); const auto child10 = child1->mChildren[0]; ASSERT_TRUE(child10); @@ -149,13 +149,13 @@ TEST_F(utFBXImporterExporter, importCubesComplexTransform) { const auto root = scene->mRootNode; ASSERT_STREQ(root->mName.C_Str(), "RootNode"); ASSERT_TRUE(root->mChildren); - ASSERT_EQ(root->mNumChildren, 2); + ASSERT_EQ(root->mNumChildren, 2u); const auto child0 = root->mChildren[0]; ASSERT_TRUE(child0); ASSERT_STREQ(child0->mName.C_Str(), "Cube2"); ASSERT_TRUE(child0->mChildren); - ASSERT_EQ(child0->mNumChildren, 1); + ASSERT_EQ(child0->mNumChildren, 1u); const auto child00 = child0->mChildren[0]; ASSERT_TRUE(child00); @@ -177,10 +177,9 @@ TEST_F(utFBXImporterExporter, importCubesComplexTransform) { "Cube1001_$AssimpFbx$_ScalingPivotInverse", "Cube1001" }; - for (size_t i = 0; i < chain_length; ++i) - { + for (size_t i = 0; i < chain_length; ++i) { ASSERT_TRUE(parent->mChildren); - ASSERT_EQ(parent->mNumChildren, 1); + ASSERT_EQ(parent->mNumChildren, 1u); auto node = parent->mChildren[0]; ASSERT_TRUE(node); ASSERT_STREQ(node->mName.C_Str(), chainStr[i]); @@ -193,19 +192,21 @@ TEST_F( utFBXImporterExporter, importPhongMaterial ) { Assimp::Importer importer; const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/FBX/phong_cube.fbx", aiProcess_ValidateDataStructure ); EXPECT_NE( nullptr, scene ); - EXPECT_EQ( (unsigned int)1, scene->mNumMaterials ); + EXPECT_EQ( 1u, scene->mNumMaterials ); const aiMaterial *mat = scene->mMaterials[0]; EXPECT_NE( nullptr, mat ); - float f; aiColor3D c; + float f; + aiColor3D c; + // phong_cube.fbx has all properties defined EXPECT_EQ( mat->Get(AI_MATKEY_COLOR_DIFFUSE, c), aiReturn_SUCCESS ); EXPECT_EQ( c, aiColor3D(0.5, 0.25, 0.25) ); EXPECT_EQ( mat->Get(AI_MATKEY_COLOR_SPECULAR, c), aiReturn_SUCCESS ); EXPECT_EQ( c, aiColor3D(0.25, 0.25, 0.5) ); EXPECT_EQ( mat->Get(AI_MATKEY_SHININESS_STRENGTH, f), aiReturn_SUCCESS ); - EXPECT_EQ( f, 0.5 ); + EXPECT_EQ( f, 0.5f ); EXPECT_EQ( mat->Get(AI_MATKEY_SHININESS, f), aiReturn_SUCCESS ); - EXPECT_EQ( f, 10.0 ); + EXPECT_EQ( f, 10.0f ); EXPECT_EQ( mat->Get(AI_MATKEY_COLOR_AMBIENT, c), aiReturn_SUCCESS ); EXPECT_EQ( c, aiColor3D(0.125, 0.25, 0.25) ); EXPECT_EQ( mat->Get(AI_MATKEY_COLOR_EMISSIVE, c), aiReturn_SUCCESS ); @@ -213,7 +214,7 @@ TEST_F( utFBXImporterExporter, importPhongMaterial ) { EXPECT_EQ( mat->Get(AI_MATKEY_COLOR_TRANSPARENT, c), aiReturn_SUCCESS ); EXPECT_EQ( c, aiColor3D(0.75, 0.5, 0.25) ); EXPECT_EQ( mat->Get(AI_MATKEY_OPACITY, f), aiReturn_SUCCESS ); - EXPECT_EQ( f, 0.5 ); + EXPECT_EQ( f, 0.5f ); } TEST_F(utFBXImporterExporter, importUnitScaleFactor) { diff --git a/test/unit/utSortByPType.cpp b/test/unit/utSortByPType.cpp index 749e618da..fb637b004 100644 --- a/test/unit/utSortByPType.cpp +++ b/test/unit/utSortByPType.cpp @@ -183,8 +183,7 @@ TEST_F(SortByPTypeProcessTest, SortByPTypeStep) { unsigned int idx = 0; for (unsigned int m = 0,real = 0; m< 10;++m) { for (unsigned int n = 0; n < 4;++n) { - if ((idx = num[m][n])) - { + if ((idx = num[m][n])) { EXPECT_TRUE(real < mScene->mNumMeshes); aiMesh* mesh = mScene->mMeshes[real]; diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index bac76473d..4104fe6b7 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -55,17 +53,23 @@ class utglTF2ImportExport : public AbstractImportExportBase { public: virtual bool importerTest() { Assimp::Importer importer; - const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured.gltf", aiProcess_ValidateDataStructure); + const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured.gltf", + aiProcess_ValidateDataStructure); EXPECT_NE( scene, nullptr ); - if ( !scene ) return false; + if (!scene) { + return false; + } EXPECT_TRUE( scene->HasMaterials() ); - if ( !scene->HasMaterials() ) return false; + if (!scene->HasMaterials()) { + return false; + } const aiMaterial *material = scene->mMaterials[0]; aiString path; aiTextureMapMode modes[2]; - EXPECT_EQ( aiReturn_SUCCESS, material->GetTexture(aiTextureType_DIFFUSE, 0, &path, nullptr, nullptr, nullptr, nullptr, modes) ); + EXPECT_EQ( aiReturn_SUCCESS, material->GetTexture(aiTextureType_DIFFUSE, 0, &path, nullptr, nullptr, + nullptr, nullptr, modes) ); EXPECT_STREQ( path.C_Str(), "CesiumLogoFlat.png" ); EXPECT_EQ( modes[0], aiTextureMapMode_Mirror ); EXPECT_EQ( modes[1], aiTextureMapMode_Clamp ); @@ -75,7 +79,8 @@ public: virtual bool binaryImporterTest() { Assimp::Importer importer; - const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/glTF2/2CylinderEngine-glTF-Binary/2CylinderEngine.glb", aiProcess_ValidateDataStructure); + const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/glTF2/2CylinderEngine-glTF-Binary/2CylinderEngine.glb", + aiProcess_ValidateDataStructure); return nullptr != scene; } @@ -83,7 +88,8 @@ public: virtual bool exporterTest() { Assimp::Importer importer; Assimp::Exporter exporter; - const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured.gltf", aiProcess_ValidateDataStructure ); + const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured.gltf", + aiProcess_ValidateDataStructure ); EXPECT_NE( nullptr, scene ); EXPECT_EQ( aiReturn_SUCCESS, exporter.Export( scene, "gltf2", ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured_out.gltf" ) ); @@ -105,7 +111,8 @@ TEST_F( utglTF2ImportExport, importBinaryglTF2FromFileTest ) { TEST_F(utglTF2ImportExport, importglTF2AndExportToOBJ) { Assimp::Importer importer; Assimp::Exporter exporter; - const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured.gltf", aiProcess_ValidateDataStructure); + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured.gltf", + aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "obj", ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF/BoxTextured_out.obj")); } @@ -113,7 +120,8 @@ TEST_F(utglTF2ImportExport, importglTF2AndExportToOBJ) { TEST_F(utglTF2ImportExport, importglTF2EmbeddedAndExportToOBJ) { Assimp::Importer importer; Assimp::Exporter exporter; - const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF-Embedded/BoxTextured.gltf", aiProcess_ValidateDataStructure); + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF-Embedded/BoxTextured.gltf", + aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "obj", ASSIMP_TEST_MODELS_DIR "/glTF2/BoxTextured-glTF-Embedded/BoxTextured_out.obj")); } @@ -124,10 +132,9 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModePointsWithoutIndices) { //Points without indices const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_00.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 1024); - for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) - { - EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 1); + EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 1024u); + for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { + EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 1u); EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], i); } } @@ -137,12 +144,11 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLinesWithoutIndices) { //Lines without indices const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_01.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 8); - for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) - { - EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 2); - EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], i*2); - EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[1], i*2 + 1); + EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 8u); + for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { + EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 2u); + EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], i*2u); + EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[1], i*2u + 1u); } } @@ -153,13 +159,12 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLinesLoopWithoutIndices) { EXPECT_NE(nullptr, scene); EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4); - std::array l1 = {{ 0, 1, 2, 3, 0 }}; - EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2); - for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) - { - EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 2); + std::array l1 = {{ 0, 1, 2, 3, 0 }}; + EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u); + for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { + EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 2u); EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], l1[i]); - EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[1], l1[i + 1]); + EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[1], l1[i + 1u]); } } @@ -171,11 +176,10 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLinesStripWithoutIndices) { EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 5); EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2); - for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) - { - EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 2); + for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { + EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 2u); EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], i); - EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[1], i + 1); + EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[1], i + 1u); } } @@ -184,19 +188,17 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesStripWithoutIndices //Triangles strip without indices const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_04.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2); - EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4); - std::array f1 = {{ 0, 1, 2 }}; - EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3); - for (int i = 0; i < 3; ++i) - { + EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u); + EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); + std::array f1 = {{ 0, 1, 2 }}; + EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u); + for (unsigned int i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]); } - std::array f2 = {{ 2, 1, 3 }}; - EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3); - for (int i = 0; i < 3; ++i) - { + std::array f2 = {{ 2u, 1u, 3u }}; + EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3u); + for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]); } } @@ -206,19 +208,17 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesFanWithoutIndices) //Triangles fan without indices const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_05.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2); - EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4); + EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u); + EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); std::array f1 = {{ 0, 1, 2 }}; - EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3); - for (int i = 0; i < 3; ++i) - { + EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u); + for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]); } - std::array f2 = {{ 0, 2, 3 }}; - EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3); - for (int i = 0; i < 3; ++i) - { + std::array f2 = {{ 0, 2, 3 }}; + EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3u); + for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]); } } @@ -228,19 +228,17 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesWithoutIndices) { //Triangles without indices const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_06.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2); - EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 6); - std::array f1 = {{ 0, 1, 2 }}; - EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3); - for (int i = 0; i < 3; ++i) - { + EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u); + EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 6u); + std::array f1 = {{ 0u, 1u, 2u }}; + EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u); + for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]); } - std::array f2 = {{ 3, 4, 5 }}; - EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3); - for (int i = 0; i < 3; ++i) - { + std::array f2 = {{ 3u, 4u, 5u }}; + EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3u); + for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]); } } @@ -250,10 +248,9 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModePoints) { //Line loop const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_07.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 1024); - for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) - { - EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 1); + EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 1024u); + for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { + EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 1u); EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], i); } } @@ -264,8 +261,8 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLines) { const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_08.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4); - std::array l1 = {{ 0, 3, 2, 1, 0 }}; - EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2); + std::array l1 = {{ 0, 3, 2, 1, 0 }}; + EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u); for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], l1[i]); @@ -334,15 +331,13 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesFan) { EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2); std::array f1 = {{ 0, 3, 2 }}; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3); - for (int i = 0; i < 3; ++i) - { + for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]); } - std::array f2 = {{ 0, 2, 1 }}; + std::array f2 = {{ 0, 2, 1 }}; EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3); - for (int i = 0; i < 3; ++i) - { + for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]); } } From 3416c04ad986837825ae799bf7dfab37b6aaf081 Mon Sep 17 00:00:00 2001 From: kimkulling Date: Fri, 19 Jul 2019 11:26:48 +0200 Subject: [PATCH 030/320] Unit: fix more compiler warnings. --- test/unit/utFBXImporterExporter.cpp | 8 ++-- test/unit/utglTF2ImportExport.cpp | 64 ++++++++++++++--------------- 2 files changed, 35 insertions(+), 37 deletions(-) diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index ecba5ee1e..1c7117319 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -185,7 +185,7 @@ TEST_F(utFBXImporterExporter, importCubesComplexTransform) { ASSERT_STREQ(node->mName.C_Str(), chainStr[i]); parent = node; } - ASSERT_EQ(0, parent->mNumChildren) << "Leaf node"; + ASSERT_EQ(0u, parent->mNumChildren) << "Leaf node"; } TEST_F( utFBXImporterExporter, importPhongMaterial ) { @@ -244,7 +244,7 @@ TEST_F(utFBXImporterExporter, importEmbeddedAsciiTest) { EXPECT_EQ(aiReturn_SUCCESS, mat->GetTexture(aiTextureType_DIFFUSE, 0, &path, nullptr, nullptr, nullptr, nullptr, modes)); ASSERT_STREQ(path.C_Str(), "..\\..\\..\\Desktop\\uv_test.png"); - ASSERT_EQ(1, scene->mNumTextures); + ASSERT_EQ(1u, scene->mNumTextures); ASSERT_TRUE(scene->mTextures[0]->pcData); ASSERT_EQ(439176u, scene->mTextures[0]->mWidth) << "FBX ASCII base64 compression splits data by 512Kb, it should be two parts for this texture"; } @@ -255,7 +255,7 @@ TEST_F(utFBXImporterExporter, importEmbeddedFragmentedAsciiTest) { const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/embedded_ascii/box_embedded_texture_fragmented.fbx", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(1, scene->mNumMaterials); + EXPECT_EQ(1u, scene->mNumMaterials); aiMaterial *mat = scene->mMaterials[0]; ASSERT_NE(nullptr, mat); @@ -264,7 +264,7 @@ TEST_F(utFBXImporterExporter, importEmbeddedFragmentedAsciiTest) { ASSERT_EQ(aiReturn_SUCCESS, mat->GetTexture(aiTextureType_DIFFUSE, 0, &path, nullptr, nullptr, nullptr, nullptr, modes)); ASSERT_STREQ(path.C_Str(), "paper.png"); - ASSERT_EQ(1, scene->mNumTextures); + ASSERT_EQ(1u, scene->mNumTextures); ASSERT_TRUE(scene->mTextures[0]->pcData); ASSERT_EQ(968029u, scene->mTextures[0]->mWidth) << "FBX ASCII base64 compression splits data by 512Kb, it should be two parts for this texture"; } diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index 4104fe6b7..2399f3371 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -157,9 +157,9 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLinesLoopWithoutIndices) { //Lines loop without indices const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_02.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4); + EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); - std::array l1 = {{ 0, 1, 2, 3, 0 }}; + std::array l1 = {{ 0u, 1u, 2u, 3u, 0u }}; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u); for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 2u); @@ -173,9 +173,9 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLinesStripWithoutIndices) { //Lines strip without indices const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_03.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 5); + EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 5u); - EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2); + EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u); for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 2u); EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], i); @@ -190,7 +190,7 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesStripWithoutIndices EXPECT_NE(nullptr, scene); EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u); EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); - std::array f1 = {{ 0, 1, 2 }}; + std::array f1 = {{ 0u, 1u, 2u }}; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u); for (unsigned int i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]); @@ -210,13 +210,13 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesFanWithoutIndices) EXPECT_NE(nullptr, scene); EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u); EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); - std::array f1 = {{ 0, 1, 2 }}; + std::array f1 = {{ 0u, 1u, 2u }}; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]); } - std::array f2 = {{ 0, 2, 3 }}; + std::array f2 = {{ 0u, 2u, 3u }}; EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3u); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]); @@ -260,8 +260,8 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLines) { //Lines const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_08.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4); - std::array l1 = {{ 0, 3, 2, 1, 0 }}; + EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); + std::array l1 = {{ 0u, 3u, 2u, 1u, 0u }}; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u); for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { @@ -275,9 +275,9 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLineLoop) { //Line loop const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_09.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4); - std::array l1 = {{ 0, 3, 2, 1, 0 }}; - EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2); + EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); + std::array l1 = {{ 0, 3u, 2u, 1u, 0u }}; + EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u); for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], l1[i]); @@ -290,11 +290,10 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLineStrip) { //Lines Strip const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_10.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4); - std::array l1 = {{ 0, 3, 2, 1, 0 }}; - EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2); - for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) - { + EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); + std::array l1 = {{ 0u, 3u, 2u, 1u, 0u }}; + EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u); + for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], l1[i]); EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[1], l1[i + 1]); } @@ -305,19 +304,17 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesStrip) { //Triangles strip const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_11.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2); - EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4); - std::array f1 = {{ 0, 3, 1 }}; - EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3); - for (int i = 0; i < 3; ++i) - { + EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u); + EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); + std::array f1 = {{ 0u, 3u, 1u }}; + EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u); + for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]); } - std::array f2 = {{ 1, 3, 2 }}; - EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3); - for (int i = 0; i < 3; ++i) - { + std::array f2 = {{ 1u, 3u, 2u }}; + EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3u); + for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]); } } @@ -327,16 +324,16 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesFan) { //Triangles fan const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_12.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4); - EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2); - std::array f1 = {{ 0, 3, 2 }}; + EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); + EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u); + std::array f1 = {{ 0u, 3u, 2u }}; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]); } - std::array f2 = {{ 0, 2, 1 }}; - EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3); + std::array f2 = {{ 0u, 2u, 1u }}; + EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3u ); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]); } @@ -373,7 +370,8 @@ TEST_F(utglTF2ImportExport, importglTF2FromMemory) { TEST_F( utglTF2ImportExport, bug_import_simple_skin ) { Assimp::Importer importer; - const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/glTF2/simple_skin/simple_skin.gltf", aiProcess_ValidateDataStructure ); + const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/glTF2/simple_skin/simple_skin.gltf", + aiProcess_ValidateDataStructure ); EXPECT_NE( nullptr, scene ); } From 68520bff0ccbff35167097cec42ef129749f5158 Mon Sep 17 00:00:00 2001 From: kimkulling Date: Fri, 19 Jul 2019 11:55:12 +0200 Subject: [PATCH 031/320] Fix another signed / unsigned comparison warning. --- test/unit/utFBXImporterExporter.cpp | 2 +- test/unit/utglTF2ImportExport.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index 1c7117319..55471c023 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -235,7 +235,7 @@ TEST_F(utFBXImporterExporter, importEmbeddedAsciiTest) { const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/embedded_ascii/box.FBX", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(1, scene->mNumMaterials); + EXPECT_EQ(1u, scene->mNumMaterials); aiMaterial *mat = scene->mMaterials[0]; ASSERT_NE(nullptr, mat); diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index 2399f3371..f3c861ba5 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -210,7 +210,7 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesFanWithoutIndices) EXPECT_NE(nullptr, scene); EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u); EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); - std::array f1 = {{ 0u, 1u, 2u }}; + std::array f1 = {{ 0u, 1u, 2u }}; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]); From e84f961f786ed214535275b00bd5f83c1e23fb02 Mon Sep 17 00:00:00 2001 From: kimkulling Date: Fri, 19 Jul 2019 13:03:08 +0200 Subject: [PATCH 032/320] change std::array to std::array to fix compiler warnings. --- test/unit/utglTF2ImportExport.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index f3c861ba5..29d63d81d 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -276,7 +276,7 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLineLoop) { const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_09.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); - std::array l1 = {{ 0, 3u, 2u, 1u, 0u }}; + std::array l1 = {{ 0, 3u, 2u, 1u, 0u }}; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u); for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { @@ -291,7 +291,7 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeLineStrip) { const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Asset-Generator/Mesh_PrimitiveMode/Mesh_PrimitiveMode_10.gltf", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); - std::array l1 = {{ 0u, 3u, 2u, 1u, 0u }}; + std::array l1 = {{ 0u, 3u, 2u, 1u, 0u }}; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 2u); for (unsigned int i = 0; i < scene->mMeshes[0]->mNumFaces; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[i].mIndices[0], l1[i]); @@ -306,13 +306,13 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesStrip) { EXPECT_NE(nullptr, scene); EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u); EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); - std::array f1 = {{ 0u, 3u, 1u }}; + std::array f1 = {{ 0u, 3u, 1u }}; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]); } - std::array f2 = {{ 1u, 3u, 2u }}; + std::array f2 = {{ 1u, 3u, 2u }}; EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mNumIndices, 3u); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[1].mIndices[i], f2[i]); @@ -326,7 +326,7 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesFan) { EXPECT_NE(nullptr, scene); EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u); - std::array f1 = {{ 0u, 3u, 2u }}; + std::array f1 = {{ 0u, 3u, 2u }}; EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]); From b6616e7b7983244858976b8b437fa0503c8938bb Mon Sep 17 00:00:00 2001 From: kimkulling Date: Fri, 19 Jul 2019 13:28:00 +0200 Subject: [PATCH 033/320] Fix another signed unsigned comparison warning. --- test/unit/utglTF2ImportExport.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index 29d63d81d..0ba5226cc 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -327,7 +327,7 @@ TEST_F(utglTF2ImportExport, importglTF2PrimitiveModeTrianglesFan) { EXPECT_EQ(scene->mMeshes[0]->mNumVertices, 4u); EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 2u); std::array f1 = {{ 0u, 3u, 2u }}; - EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3); + EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mNumIndices, 3u ); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(scene->mMeshes[0]->mFaces[0].mIndices[i], f1[i]); } From f804036cf3933d18f8e12161395e2149a76a16ac Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 19 Jul 2019 20:44:48 +0200 Subject: [PATCH 034/320] Update utBlenderWork.cpp Fix compiler warning signed against unsigned. --- test/unit/utBlenderWork.cpp | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/test/unit/utBlenderWork.cpp b/test/unit/utBlenderWork.cpp index 65fefde28..c0e3347ab 100644 --- a/test/unit/utBlenderWork.cpp +++ b/test/unit/utBlenderWork.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -73,11 +71,6 @@ TEST_F(BlenderWorkTest,work_279) { ASSERT_TRUE(pTest->HasMaterials()); ASSERT_TRUE(pTest->HasMeshes()); ASSERT_TRUE(pTest->mMeshes[0]->mNumVertices > 0); - ASSERT_EQ(44, pTest->mMeshes[0]->mNumFaces); - EXPECT_EQ(1, pTest->mNumMaterials); + ASSERT_EQ(44u, pTest->mMeshes[0]->mNumFaces); + EXPECT_EQ(1u, pTest->mNumMaterials); } - - - - - From 103048ff8512810c6c38d48b0fe4e9c7e843710c Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 20 Jul 2019 10:10:17 +0200 Subject: [PATCH 035/320] Update UnrealLoader.h use memcpy instead of = operator for pos copy. --- code/Unreal/UnrealLoader.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/Unreal/UnrealLoader.h b/code/Unreal/UnrealLoader.h index f846eb43a..678aaa76b 100644 --- a/code/Unreal/UnrealLoader.h +++ b/code/Unreal/UnrealLoader.h @@ -127,7 +127,8 @@ inline void CompressVertex(const aiVector3D& v, uint32_t& out) n.X = (int32_t)v.x; n.Y = (int32_t)v.y; n.Z = (int32_t)v.z; - out = t; + ::memcpy( &out, &t, sizeof(int32_t)); + //out = t; } // UNREAL vertex decompression From 78b283135e63707c7847242400be286351a8c9e8 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 21 Jul 2019 13:32:31 +0200 Subject: [PATCH 036/320] Update utIssues.cpp use correct test for floats. --- test/unit/utIssues.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/utIssues.cpp b/test/unit/utIssues.cpp index 6a974d7b9..0e30fa182 100644 --- a/test/unit/utIssues.cpp +++ b/test/unit/utIssues.cpp @@ -74,7 +74,7 @@ TEST_F( utIssues, OpacityBugWhenExporting_727 ) { if ( newScene->mNumMaterials > 0 ) { std::cout << "Desc = " << desc->description << "\n"; EXPECT_EQ( AI_SUCCESS, newScene->mMaterials[ 0 ]->Get( AI_MATKEY_OPACITY, newOpacity ) ); - EXPECT_EQ( opacity, newOpacity ); + EXPECT_FLOAT_EQ( opacity, newOpacity ); } delete scene; } From 17adc98eec4c4dc146c22a5cf665a9c3d59af38d Mon Sep 17 00:00:00 2001 From: Pierre Anquez <32702237+panquez@users.noreply.github.com> Date: Tue, 23 Jul 2019 15:58:30 +0200 Subject: [PATCH 037/320] Fix issue #2557 --- code/Common/Exporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index 58cad3be8..87745bca9 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -183,7 +183,7 @@ Exporter::ExportFormatEntry gExporters[] = Exporter::ExportFormatEntry( "3mf", "The 3MF-File-Format", "3mf", &ExportScene3MF, 0 ), #endif -#ifndef ASSIMP_BUILD_NO_ASSJSON_EXPORTER +#ifndef ASSIMP_BUILD_NO_Assjson_EXPORTER Exporter::ExportFormatEntry("json", "Plain JSON representation of the Assimp scene data structure", "json", &ExportAssimp2Json, 0) #endif }; From c6620478ecda02de87d16ad4084ead03b0387782 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Wed, 24 Jul 2019 16:12:06 +0100 Subject: [PATCH 038/320] Fix GCC warnings reported by Travis --- code/Common/ZipArchiveIOSystem.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/Common/ZipArchiveIOSystem.cpp b/code/Common/ZipArchiveIOSystem.cpp index 8079db0b8..463c2071b 100644 --- a/code/Common/ZipArchiveIOSystem.cpp +++ b/code/Common/ZipArchiveIOSystem.cpp @@ -226,7 +226,7 @@ namespace Assimp { ZipFile *zip_file = new ZipFile(m_Size); - if (unzReadCurrentFile(zip_handle, zip_file->m_Buffer.get(), static_cast(m_Size)) != m_Size) + if (unzReadCurrentFile(zip_handle, zip_file->m_Buffer.get(), static_cast(m_Size)) != static_cast(m_Size)) { // Failed, release the memory delete zip_file; @@ -281,6 +281,7 @@ namespace Assimp { m_SeekPtr = m_Size - pOffset; return aiReturn_SUCCESS; } + default:; } return aiReturn_FAILURE; @@ -355,7 +356,7 @@ namespace Assimp { if (fileInfo.uncompressed_size != 0) { std::string filename_string(filename, fileInfo.size_filename); SimplifyFilename(filename_string); - std::pair result = m_ArchiveMap.insert(std::make_pair(filename_string, ZipFileInfo(m_ZipFileHandle, fileInfo.uncompressed_size))); + m_ArchiveMap.emplace(filename_string, ZipFileInfo(m_ZipFileHandle, fileInfo.uncompressed_size)); } } } while (unzGoToNextFile(m_ZipFileHandle) != UNZ_END_OF_LIST_OF_FILE); From dadf5c00206120502928ee948998d3c21944d595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 25 Jul 2019 10:28:09 +0200 Subject: [PATCH 039/320] Fix white ambient in STL loader. A problem that sneaked in from #1293 (f84851e8931fb04e7074d487c91c3b3faa566994) due to insufficient code review, later reported in #2059 but not fixed properly. Having a white ambient practically means all other color information is ignored and the model stays bright white no matter how you set up your lighting, so putting it back to how it was before the commit above. --- code/STL/STLLoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/STL/STLLoader.cpp b/code/STL/STLLoader.cpp index c7144e444..199a84a44 100644 --- a/code/STL/STLLoader.cpp +++ b/code/STL/STLLoader.cpp @@ -225,7 +225,7 @@ void STLImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS } pcMat->AddProperty(&clrDiffuse,1,AI_MATKEY_COLOR_DIFFUSE); pcMat->AddProperty(&clrDiffuse,1,AI_MATKEY_COLOR_SPECULAR); - clrDiffuse = aiColor4D( ai_real(1.0), ai_real(1.0), ai_real(1.0), ai_real(1.0)); + clrDiffuse = aiColor4D( ai_real(0.05), ai_real(0.05), ai_real(0.05), ai_real(1.0)); pcMat->AddProperty(&clrDiffuse,1,AI_MATKEY_COLOR_AMBIENT); pScene->mNumMaterials = 1; From 9e04df810e75630bb43de6868111e547b1536d6a Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Thu, 25 Jul 2019 09:53:18 +0100 Subject: [PATCH 040/320] ZipArchiveIOSystem should be sorted, fix ZipFile::Read() Q3BSP relies on the sort order Read() should return number of elements read, not count of bytes Read() should clip to the file size and return elements actually read, instead of aborting if try to read too much --- code/Common/ZipArchiveIOSystem.cpp | 33 ++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/code/Common/ZipArchiveIOSystem.cpp b/code/Common/ZipArchiveIOSystem.cpp index 463c2071b..43c66a921 100644 --- a/code/Common/ZipArchiveIOSystem.cpp +++ b/code/Common/ZipArchiveIOSystem.cpp @@ -45,7 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include -#include +#include #include #ifdef ASSIMP_USE_HUNTER @@ -55,7 +55,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #endif namespace Assimp { - // ---------------------------------------------------------------- // Wraps an existing Assimp::IOSystem for unzip class IOSystem2Unzip { @@ -247,14 +246,25 @@ namespace Assimp { } size_t ZipFile::Read(void* pvBuffer, size_t pSize, size_t pCount) { - const size_t size = pSize * pCount; - ai_assert((size + m_SeekPtr) <= m_Size); + // Should be impossible + ai_assert(m_Buffer != nullptr); + ai_assert(NULL != pvBuffer && 0 != pSize && 0 != pCount); - std::memcpy(pvBuffer, m_Buffer.get() + m_SeekPtr, size); + // Clip down to file size + size_t byteSize = pSize * pCount; + if ((byteSize + m_SeekPtr) > m_Size) + { + pCount = (m_Size - m_SeekPtr) / pSize; + byteSize = pSize * pCount; + if (byteSize == 0) + return 0; + } - m_SeekPtr += size; + std::memcpy(pvBuffer, m_Buffer.get() + m_SeekPtr, byteSize); - return size; + m_SeekPtr += byteSize; + + return pCount; } size_t ZipFile::FileSize() const { @@ -312,9 +322,10 @@ namespace Assimp { void MapArchive(); private: + typedef std::map ZipFileInfoMap; + unzFile m_ZipFileHandle = nullptr; - typedef std::unordered_map ZipFileMap; - ZipFileMap m_ArchiveMap; + ZipFileInfoMap m_ArchiveMap; }; ZipArchiveIOSystem::Implement::Implement(IOSystem* pIOHandler, const char* pFilename, const char* pMode) { @@ -388,7 +399,7 @@ namespace Assimp { bool ZipArchiveIOSystem::Implement::Exists(std::string& filename) { MapArchive(); - ZipFileMap::const_iterator it = m_ArchiveMap.find(filename); + ZipFileInfoMap::const_iterator it = m_ArchiveMap.find(filename); return (it != m_ArchiveMap.end()); } @@ -398,7 +409,7 @@ namespace Assimp { SimplifyFilename(filename); // Find in the map - ZipFileMap::const_iterator zip_it = m_ArchiveMap.find(filename); + ZipFileInfoMap::const_iterator zip_it = m_ArchiveMap.find(filename); if (zip_it == m_ArchiveMap.cend()) return nullptr; From 5c6ea5d7ba914dc52e07df28fb4c862bcddac28e Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Thu, 25 Jul 2019 09:54:39 +0100 Subject: [PATCH 041/320] Fix memory leak in Collada ZAE and 3MF ZipFile reading Must close the file! --- code/3MF/D3MFOpcPackage.cpp | 6 +++--- code/Collada/ColladaParser.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/3MF/D3MFOpcPackage.cpp b/code/3MF/D3MFOpcPackage.cpp index 739e0cfcc..873ba8ee8 100644 --- a/code/3MF/D3MFOpcPackage.cpp +++ b/code/3MF/D3MFOpcPackage.cpp @@ -149,14 +149,14 @@ D3MFOpcPackage::D3MFOpcPackage(IOSystem* pIOHandler, const std::string& rFile) ASSIMP_LOG_DEBUG(rootFile); + mZipArchive->Close(fileStream); + mRootStream = mZipArchive->Open(rootFile.c_str()); ai_assert( mRootStream != nullptr ); if ( nullptr == mRootStream ) { throw DeadlyExportError( "Cannot open root-file in archive : " + rootFile ); } - mZipArchive->Close( fileStream ); - } else if( file == D3MF::XmlTag::CONTENT_TYPES_ARCHIVE) { ASSIMP_LOG_WARN_F("Ignored file of unsupported type CONTENT_TYPES_ARCHIVES",file); } else { @@ -167,7 +167,7 @@ D3MFOpcPackage::D3MFOpcPackage(IOSystem* pIOHandler, const std::string& rFile) } D3MFOpcPackage::~D3MFOpcPackage() { - // empty + mZipArchive->Close(mRootStream); } IOStream* D3MFOpcPackage::RootStream() const { diff --git a/code/Collada/ColladaParser.cpp b/code/Collada/ColladaParser.cpp index 20a881860..646ec473d 100644 --- a/code/Collada/ColladaParser.cpp +++ b/code/Collada/ColladaParser.cpp @@ -165,7 +165,7 @@ std::string ColladaParser::ReadZaeManifest(ZipArchiveIOSystem &zip_archive) { } std::unique_ptr mIOWrapper(new CIrrXML_IOStreamReader(manifestfile.get())); - irr::io::IrrXMLReader* manifest_reader = irr::io::createIrrXMLReader(mIOWrapper.get()); + std::unique_ptr manifest_reader(irr::io::createIrrXMLReader(mIOWrapper.get())); while (manifest_reader->read()) { From 3016f3a7256b20fa714a11fe6228d292e7add828 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Thu, 25 Jul 2019 10:13:53 +0100 Subject: [PATCH 042/320] Convert Q3BSP Importer to use ZipArchiveIOSystem Removes duplication, handles large files better --- code/CMakeLists.txt | 2 - code/Q3BSP/Q3BSPFileImporter.cpp | 16 +- code/Q3BSP/Q3BSPFileImporter.h | 12 +- code/Q3BSP/Q3BSPFileParser.cpp | 5 +- code/Q3BSP/Q3BSPFileParser.h | 13 +- code/Q3BSP/Q3BSPZipArchive.cpp | 325 ------------------------------- code/Q3BSP/Q3BSPZipArchive.h | 135 ------------- 7 files changed, 23 insertions(+), 485 deletions(-) delete mode 100644 code/Q3BSP/Q3BSPZipArchive.cpp delete mode 100644 code/Q3BSP/Q3BSPZipArchive.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 5c1197364..110b211f8 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -690,8 +690,6 @@ ADD_ASSIMP_IMPORTER( Q3BSP Q3BSP/Q3BSPFileParser.cpp Q3BSP/Q3BSPFileImporter.h Q3BSP/Q3BSPFileImporter.cpp - Q3BSP/Q3BSPZipArchive.h - Q3BSP/Q3BSPZipArchive.cpp ) ADD_ASSIMP_IMPORTER( RAW diff --git a/code/Q3BSP/Q3BSPFileImporter.cpp b/code/Q3BSP/Q3BSPFileImporter.cpp index 6a3b95bb8..4add00a07 100644 --- a/code/Q3BSP/Q3BSPFileImporter.cpp +++ b/code/Q3BSP/Q3BSPFileImporter.cpp @@ -43,7 +43,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef ASSIMP_BUILD_NO_Q3BSP_IMPORTER #include "Q3BSPFileImporter.h" -#include "Q3BSPZipArchive.h" #include "Q3BSPFileParser.h" #include "Q3BSPFileData.h" @@ -60,6 +59,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include #include #include #include @@ -181,7 +181,7 @@ const aiImporterDesc* Q3BSPFileImporter::GetInfo () const { // ------------------------------------------------------------------------------------------------ // Import method. void Q3BSPFileImporter::InternReadFile(const std::string &rFile, aiScene* scene, IOSystem* ioHandler) { - Q3BSPZipArchive Archive( ioHandler, rFile ); + ZipArchiveIOSystem Archive( ioHandler, rFile ); if ( !Archive.isOpen() ) { throw DeadlyImportError( "Failed to open file " + rFile + "." ); } @@ -223,10 +223,10 @@ void Q3BSPFileImporter::separateMapName( const std::string &importName, std::str // ------------------------------------------------------------------------------------------------ // Returns the first map in the map archive. -bool Q3BSPFileImporter::findFirstMapInArchive( Q3BSPZipArchive &bspArchive, std::string &mapName ) { +bool Q3BSPFileImporter::findFirstMapInArchive(ZipArchiveIOSystem &bspArchive, std::string &mapName ) { mapName = ""; std::vector fileList; - bspArchive.getFileList( fileList ); + bspArchive.getFileListExtension( fileList, "bsp" ); if (fileList.empty()) { return false; } @@ -249,7 +249,7 @@ bool Q3BSPFileImporter::findFirstMapInArchive( Q3BSPZipArchive &bspArchive, std: // ------------------------------------------------------------------------------------------------ // Creates the assimp specific data. void Q3BSPFileImporter::CreateDataFromImport( const Q3BSP::Q3BSPModel *pModel, aiScene* pScene, - Q3BSPZipArchive *pArchive ) { + ZipArchiveIOSystem *pArchive ) { if (nullptr == pModel || nullptr == pScene) { return; } @@ -418,7 +418,7 @@ void Q3BSPFileImporter::createTriangleTopology( const Q3BSP::Q3BSPModel *pModel, // ------------------------------------------------------------------------------------------------ // Creates all referenced materials. void Q3BSPFileImporter::createMaterials( const Q3BSP::Q3BSPModel *pModel, aiScene* pScene, - Q3BSPZipArchive *pArchive ) { + ZipArchiveIOSystem *pArchive ) { if ( m_MaterialLookupMap.empty() ) { return; } @@ -564,7 +564,7 @@ aiFace *Q3BSPFileImporter::getNextFace( aiMesh *mesh, unsigned int &faceIdx ) { // ------------------------------------------------------------------------------------------------ // Imports a texture file. bool Q3BSPFileImporter::importTextureFromArchive( const Q3BSP::Q3BSPModel *model, - Q3BSP::Q3BSPZipArchive *archive, aiScene*, + ZipArchiveIOSystem *archive, aiScene*, aiMaterial *pMatHelper, int textureId ) { if (nullptr == archive || nullptr == pMatHelper ) { return false; @@ -669,7 +669,7 @@ bool Q3BSPFileImporter::importLightmap( const Q3BSP::Q3BSPModel *pModel, aiScene // ------------------------------------------------------------------------------------------------ // Will search for a supported extension. -bool Q3BSPFileImporter::expandFile( Q3BSP::Q3BSPZipArchive *pArchive, const std::string &rFilename, +bool Q3BSPFileImporter::expandFile(ZipArchiveIOSystem *pArchive, const std::string &rFilename, const std::vector &rExtList, std::string &rFile, std::string &rExt ) { diff --git a/code/Q3BSP/Q3BSPFileImporter.h b/code/Q3BSP/Q3BSPFileImporter.h index 5af9fb7bc..ee21fa48e 100644 --- a/code/Q3BSP/Q3BSPFileImporter.h +++ b/code/Q3BSP/Q3BSPFileImporter.h @@ -54,9 +54,9 @@ struct aiMaterial; struct aiTexture; namespace Assimp { + class ZipArchiveIOSystem; namespace Q3BSP { - class Q3BSPZipArchive; struct Q3BSPModel; struct sQ3BSPFace; } @@ -85,24 +85,24 @@ protected: const aiImporterDesc* GetInfo () const; void InternReadFile(const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler); void separateMapName( const std::string &rImportName, std::string &rArchiveName, std::string &rMapName ); - bool findFirstMapInArchive( Q3BSP::Q3BSPZipArchive &rArchive, std::string &rMapName ); - void CreateDataFromImport( const Q3BSP::Q3BSPModel *pModel, aiScene* pScene, Q3BSP::Q3BSPZipArchive *pArchive ); + bool findFirstMapInArchive(ZipArchiveIOSystem &rArchive, std::string &rMapName ); + void CreateDataFromImport( const Q3BSP::Q3BSPModel *pModel, aiScene* pScene, ZipArchiveIOSystem *pArchive ); void CreateNodes( const Q3BSP::Q3BSPModel *pModel, aiScene* pScene, aiNode *pParent ); aiNode *CreateTopology( const Q3BSP::Q3BSPModel *pModel, unsigned int materialIdx, std::vector &rArray, aiMesh **pMesh ); void createTriangleTopology( const Q3BSP::Q3BSPModel *pModel, Q3BSP::sQ3BSPFace *pQ3BSPFace, aiMesh* pMesh, unsigned int &rFaceIdx, unsigned int &rVertIdx ); - void createMaterials( const Q3BSP::Q3BSPModel *pModel, aiScene* pScene, Q3BSP::Q3BSPZipArchive *pArchive ); + void createMaterials( const Q3BSP::Q3BSPModel *pModel, aiScene* pScene, ZipArchiveIOSystem *pArchive ); size_t countData( const std::vector &rArray ) const; size_t countFaces( const std::vector &rArray ) const; size_t countTriangles( const std::vector &rArray ) const; void createMaterialMap( const Q3BSP::Q3BSPModel *pModel); aiFace *getNextFace( aiMesh *pMesh, unsigned int &rFaceIdx ); - bool importTextureFromArchive( const Q3BSP::Q3BSPModel *pModel, Q3BSP::Q3BSPZipArchive *pArchive, aiScene* pScene, + bool importTextureFromArchive( const Q3BSP::Q3BSPModel *pModel, ZipArchiveIOSystem *pArchive, aiScene* pScene, aiMaterial *pMatHelper, int textureId ); bool importLightmap( const Q3BSP::Q3BSPModel *pModel, aiScene* pScene, aiMaterial *pMatHelper, int lightmapId ); bool importEntities( const Q3BSP::Q3BSPModel *pModel, aiScene* pScene ); - bool expandFile( Q3BSP::Q3BSPZipArchive *pArchive, const std::string &rFilename, const std::vector &rExtList, + bool expandFile(ZipArchiveIOSystem *pArchive, const std::string &rFilename, const std::vector &rExtList, std::string &rFile, std::string &rExt ); private: diff --git a/code/Q3BSP/Q3BSPFileParser.cpp b/code/Q3BSP/Q3BSPFileParser.cpp index 5bac5ae76..bed2efe53 100644 --- a/code/Q3BSP/Q3BSPFileParser.cpp +++ b/code/Q3BSP/Q3BSPFileParser.cpp @@ -45,9 +45,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "Q3BSPFileParser.h" #include "Q3BSPFileData.h" -#include "Q3BSPZipArchive.h" #include #include +#include #include namespace Assimp { @@ -55,7 +55,7 @@ namespace Assimp { using namespace Q3BSP; // ------------------------------------------------------------------------------------------------ -Q3BSPFileParser::Q3BSPFileParser( const std::string &mapName, Q3BSPZipArchive *pZipArchive ) : +Q3BSPFileParser::Q3BSPFileParser( const std::string &mapName, ZipArchiveIOSystem *pZipArchive ) : m_sOffset( 0 ), m_Data(), m_pModel(nullptr), @@ -101,6 +101,7 @@ bool Q3BSPFileParser::readData( const std::string &rMapName ) { const size_t readSize = pMapFile->Read( &m_Data[0], sizeof( char ), size ); if ( readSize != size ) { m_Data.clear(); + m_pZipArchive->Close(pMapFile); return false; } m_pZipArchive->Close( pMapFile ); diff --git a/code/Q3BSP/Q3BSPFileParser.h b/code/Q3BSP/Q3BSPFileParser.h index 143e42b15..fd73f5e10 100644 --- a/code/Q3BSP/Q3BSPFileParser.h +++ b/code/Q3BSP/Q3BSPFileParser.h @@ -48,13 +48,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { + class ZipArchiveIOSystem; + namespace Q3BSP { - -class Q3BSPZipArchive; -struct Q3BSPModel; -class ZipFile; - + struct Q3BSPModel; + class ZipFile; } // ------------------------------------------------------------------- @@ -62,7 +61,7 @@ class ZipFile; class Q3BSPFileParser { public: - Q3BSPFileParser( const std::string &rMapName, Q3BSP::Q3BSPZipArchive *pZipArchive ); + Q3BSPFileParser( const std::string &rMapName, ZipArchiveIOSystem *pZipArchive ); ~Q3BSPFileParser(); Q3BSP::Q3BSPModel *getModel() const; @@ -83,7 +82,7 @@ private: size_t m_sOffset; std::vector m_Data; Q3BSP::Q3BSPModel *m_pModel; - Q3BSP::Q3BSPZipArchive *m_pZipArchive; + ZipArchiveIOSystem *m_pZipArchive; }; } // Namespace Assimp diff --git a/code/Q3BSP/Q3BSPZipArchive.cpp b/code/Q3BSP/Q3BSPZipArchive.cpp deleted file mode 100644 index 931f2b905..000000000 --- a/code/Q3BSP/Q3BSPZipArchive.cpp +++ /dev/null @@ -1,325 +0,0 @@ -/* -Open Asset Import Library (assimp) ----------------------------------------------------------------------- - -Copyright (c) 2006-2019, assimp team - - -All rights reserved. - -Redistribution and use of this software 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 the assimp team, nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission of the assimp team. - -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. - ----------------------------------------------------------------------- -*/ - -#ifndef ASSIMP_BUILD_NO_Q3BSP_IMPORTER - -#include "Q3BSPZipArchive.h" -#include -#include -#include - -namespace Assimp { -namespace Q3BSP { - -voidpf IOSystem2Unzip::open(voidpf opaque, const char* filename, int mode) { - IOSystem* io_system = (IOSystem*) opaque; - - const char* mode_fopen = NULL; - if((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) { - mode_fopen = "rb"; - } else { - if(mode & ZLIB_FILEFUNC_MODE_EXISTING) { - mode_fopen = "r+b"; - } else { - if(mode & ZLIB_FILEFUNC_MODE_CREATE) { - mode_fopen = "wb"; - } - } - } - - return (voidpf) io_system->Open(filename, mode_fopen); -} - -uLong IOSystem2Unzip::read(voidpf /*opaque*/, voidpf stream, void* buf, uLong size) { - IOStream* io_stream = (IOStream*) stream; - - return static_cast(io_stream->Read(buf, 1, size)); -} - -uLong IOSystem2Unzip::write(voidpf /*opaque*/, voidpf stream, const void* buf, uLong size) { - IOStream* io_stream = (IOStream*) stream; - - return static_cast(io_stream->Write(buf, 1, size)); -} - -long IOSystem2Unzip::tell(voidpf /*opaque*/, voidpf stream) { - IOStream* io_stream = (IOStream*) stream; - - return static_cast(io_stream->Tell()); -} - -long IOSystem2Unzip::seek(voidpf /*opaque*/, voidpf stream, uLong offset, int origin) { - IOStream* io_stream = (IOStream*) stream; - - aiOrigin assimp_origin; - switch (origin) { - default: - case ZLIB_FILEFUNC_SEEK_CUR: - assimp_origin = aiOrigin_CUR; - break; - case ZLIB_FILEFUNC_SEEK_END: - assimp_origin = aiOrigin_END; - break; - case ZLIB_FILEFUNC_SEEK_SET: - assimp_origin = aiOrigin_SET; - break; - } - - return (io_stream->Seek(offset, assimp_origin) == aiReturn_SUCCESS ? 0 : -1); -} - -int IOSystem2Unzip::close(voidpf opaque, voidpf stream) { - IOSystem* io_system = (IOSystem*) opaque; - IOStream* io_stream = (IOStream*) stream; - - io_system->Close(io_stream); - - return 0; -} - -int IOSystem2Unzip::testerror(voidpf /*opaque*/, voidpf /*stream*/) { - return 0; -} - -zlib_filefunc_def IOSystem2Unzip::get(IOSystem* pIOHandler) { - zlib_filefunc_def mapping; - -#ifdef ASSIMP_USE_HUNTER - mapping.zopen_file = (open_file_func)open; - mapping.zread_file = (read_file_func)read; - mapping.zwrite_file = (write_file_func)write; - mapping.ztell_file = (tell_file_func)tell; - mapping.zseek_file = (seek_file_func)seek; - mapping.zclose_file = (close_file_func)close; - mapping.zerror_file = (error_file_func)testerror; -#else - mapping.zopen_file = open; - mapping.zread_file = read; - mapping.zwrite_file = write; - mapping.ztell_file = tell; - mapping.zseek_file = seek; - mapping.zclose_file = close; - mapping.zerror_file = testerror; -#endif - mapping.opaque = (voidpf) pIOHandler; - - return mapping; -} - -ZipFile::ZipFile(size_t size) : m_Size(size) { - ai_assert(m_Size != 0); - - m_Buffer = malloc(m_Size); -} - -ZipFile::~ZipFile() { - free(m_Buffer); - m_Buffer = NULL; -} - -size_t ZipFile::Read(void* pvBuffer, size_t pSize, size_t pCount) { - const size_t size = pSize * pCount; - assert(size <= m_Size); - - std::memcpy(pvBuffer, m_Buffer, size); - - return size; -} - -size_t ZipFile::Write(const void* /*pvBuffer*/, size_t /*pSize*/, size_t /*pCount*/) { - return 0; -} - -size_t ZipFile::FileSize() const { - return m_Size; -} - -aiReturn ZipFile::Seek(size_t /*pOffset*/, aiOrigin /*pOrigin*/) { - return aiReturn_FAILURE; -} - -size_t ZipFile::Tell() const { - return 0; -} - -void ZipFile::Flush() { - // empty -} - -// ------------------------------------------------------------------------------------------------ -// Constructor. -Q3BSPZipArchive::Q3BSPZipArchive(IOSystem* pIOHandler, const std::string& rFile) : m_ZipFileHandle(NULL), m_ArchiveMap() { - if (! rFile.empty()) { - zlib_filefunc_def mapping = IOSystem2Unzip::get(pIOHandler); - - m_ZipFileHandle = unzOpen2(rFile.c_str(), &mapping); - - if(m_ZipFileHandle != nullptr) { - mapArchive(); - } - } -} - -// ------------------------------------------------------------------------------------------------ -// Destructor. -Q3BSPZipArchive::~Q3BSPZipArchive() { - for(auto &file : m_ArchiveMap) { - delete file.second; - } - m_ArchiveMap.clear(); - - if(m_ZipFileHandle != nullptr) { - unzClose(m_ZipFileHandle); - m_ZipFileHandle = nullptr; - } -} - -// ------------------------------------------------------------------------------------------------ -// Returns true, if the archive is already open. -bool Q3BSPZipArchive::isOpen() const { - return (m_ZipFileHandle != nullptr); -} - -// ------------------------------------------------------------------------------------------------ -// Returns true, if the filename is part of the archive. -bool Q3BSPZipArchive::Exists(const char* pFile) const { - bool exist = false; - if (pFile != nullptr) { - std::string rFile(pFile); - std::map::const_iterator it = m_ArchiveMap.find(rFile); - - if(it != m_ArchiveMap.end()) { - exist = true; - } - } - - return exist; -} - -// ------------------------------------------------------------------------------------------------ -// Returns the separator delimiter. -char Q3BSPZipArchive::getOsSeparator() const { -#ifndef _WIN32 - return '/'; -#else - return '\\'; -#endif -} - -// ------------------------------------------------------------------------------------------------ -// Opens a file, which is part of the archive. -IOStream *Q3BSPZipArchive::Open(const char* pFile, const char* /*pMode*/) { - ai_assert(pFile != nullptr); - - IOStream* result = nullptr; - - std::map::iterator it = m_ArchiveMap.find(pFile); - - if(it != m_ArchiveMap.end()) { - result = (IOStream*) it->second; - } - - return result; -} - -// ------------------------------------------------------------------------------------------------ -// Close a filestream. -void Q3BSPZipArchive::Close(IOStream *pFile) { - (void)(pFile); - ai_assert(pFile != nullptr); - - // We don't do anything in case the file would be opened again in the future -} -// ------------------------------------------------------------------------------------------------ -// Returns the file-list of the archive. -void Q3BSPZipArchive::getFileList(std::vector &rFileList) { - rFileList.clear(); - - for(auto &file : m_ArchiveMap) { - rFileList.push_back(file.first); - } -} - -// ------------------------------------------------------------------------------------------------ -// Maps the archive content. -bool Q3BSPZipArchive::mapArchive() { - bool success = false; - - if(m_ZipFileHandle != nullptr) { - if(m_ArchiveMap.empty()) { - // At first ensure file is already open - if(unzGoToFirstFile(m_ZipFileHandle) == UNZ_OK) { - // Loop over all files - do { - char filename[FileNameSize]; - unz_file_info fileInfo; - - if(unzGetCurrentFileInfo(m_ZipFileHandle, &fileInfo, filename, FileNameSize, NULL, 0, NULL, 0) == UNZ_OK) { - // The file has EXACTLY the size of uncompressed_size. In C - // you need to mark the last character with '\0', so add - // another character - if(fileInfo.uncompressed_size != 0 && unzOpenCurrentFile(m_ZipFileHandle) == UNZ_OK) { - std::pair::iterator, bool> result = m_ArchiveMap.insert(std::make_pair(filename, new ZipFile(fileInfo.uncompressed_size))); - - if(unzReadCurrentFile(m_ZipFileHandle, result.first->second->m_Buffer, fileInfo.uncompressed_size) == (long int) fileInfo.uncompressed_size) { - if(unzCloseCurrentFile(m_ZipFileHandle) == UNZ_OK) { - // Nothing to do anymore... - } - } - } - } - } while(unzGoToNextFile(m_ZipFileHandle) != UNZ_END_OF_LIST_OF_FILE); - } - } - - success = true; - } - - return success; -} - -// ------------------------------------------------------------------------------------------------ - -} // Namespace Q3BSP -} // Namespace Assimp - -#endif // ASSIMP_BUILD_NO_Q3BSP_IMPORTER diff --git a/code/Q3BSP/Q3BSPZipArchive.h b/code/Q3BSP/Q3BSPZipArchive.h deleted file mode 100644 index db68925a8..000000000 --- a/code/Q3BSP/Q3BSPZipArchive.h +++ /dev/null @@ -1,135 +0,0 @@ -/* -Open Asset Import Library (assimp) ----------------------------------------------------------------------- - -Copyright (c) 2006-2019, assimp team - - -All rights reserved. - -Redistribution and use of this software 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 the assimp team, nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission of the assimp team. - -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. - ----------------------------------------------------------------------- -*/ -#ifndef AI_Q3BSP_ZIPARCHIVE_H_INC -#define AI_Q3BSP_ZIPARCHIVE_H_INC - -#ifdef ASSIMP_USE_HUNTER -# include -#else -# include -#endif -#include -#include -#include -#include -#include - -namespace Assimp { -namespace Q3BSP { - -// ------------------------------------------------------------------------------------------------ -/// \class IOSystem2Unzip -/// \ingroup Assimp::Q3BSP -/// -/// \brief -// ------------------------------------------------------------------------------------------------ -class IOSystem2Unzip { -public: - static voidpf open(voidpf opaque, const char* filename, int mode); - static uLong read(voidpf opaque, voidpf stream, void* buf, uLong size); - static uLong write(voidpf opaque, voidpf stream, const void* buf, uLong size); - static long tell(voidpf opaque, voidpf stream); - static long seek(voidpf opaque, voidpf stream, uLong offset, int origin); - static int close(voidpf opaque, voidpf stream); - static int testerror(voidpf opaque, voidpf stream); - static zlib_filefunc_def get(IOSystem* pIOHandler); -}; - -// ------------------------------------------------------------------------------------------------ -/// \class ZipFile -/// \ingroup Assimp::Q3BSP -/// -/// \brief -// ------------------------------------------------------------------------------------------------ -class ZipFile : public IOStream { - friend class Q3BSPZipArchive; - -public: - explicit ZipFile(size_t size); - ~ZipFile(); - size_t Read(void* pvBuffer, size_t pSize, size_t pCount ); - size_t Write(const void* /*pvBuffer*/, size_t /*pSize*/, size_t /*pCount*/); - size_t FileSize() const; - aiReturn Seek(size_t /*pOffset*/, aiOrigin /*pOrigin*/); - size_t Tell() const; - void Flush(); - -private: - void* m_Buffer; - size_t m_Size; -}; - -// ------------------------------------------------------------------------------------------------ -/// \class Q3BSPZipArchive -/// \ingroup Assimp::Q3BSP -/// -/// \brief IMplements a zip archive like the WinZip archives. Will be also used to import data -/// from a P3K archive ( Quake level format ). -// ------------------------------------------------------------------------------------------------ -class Q3BSPZipArchive : public Assimp::IOSystem { -public: - static const unsigned int FileNameSize = 256; - -public: - Q3BSPZipArchive(IOSystem* pIOHandler, const std::string & rFile); - ~Q3BSPZipArchive(); - bool Exists(const char* pFile) const; - char getOsSeparator() const; - IOStream* Open(const char* pFile, const char* pMode = "rb"); - void Close(IOStream* pFile); - bool isOpen() const; - void getFileList(std::vector &rFileList); - -private: - bool mapArchive(); - -private: - unzFile m_ZipFileHandle; - std::map m_ArchiveMap; -}; - -// ------------------------------------------------------------------------------------------------ - -} // Namespace Q3BSP -} // Namespace Assimp - -#endif // AI_Q3BSP_ZIPARCHIVE_H_INC From 9b78060a4aba5c04c919d8f8a2030703718f77d4 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Thu, 25 Jul 2019 10:14:42 +0100 Subject: [PATCH 043/320] Add copyright headers to ZipArchiveIOSystem --- code/Common/ZipArchiveIOSystem.cpp | 4 +++ include/assimp/ZipArchiveIOSystem.h | 47 +++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/code/Common/ZipArchiveIOSystem.cpp b/code/Common/ZipArchiveIOSystem.cpp index 43c66a921..7c37a05f9 100644 --- a/code/Common/ZipArchiveIOSystem.cpp +++ b/code/Common/ZipArchiveIOSystem.cpp @@ -40,6 +40,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ +/** @file ZipArchiveIOSystem.cpp + * @brief Zip File I/O implementation for #Importer + */ + #include #include diff --git a/include/assimp/ZipArchiveIOSystem.h b/include/assimp/ZipArchiveIOSystem.h index 7be597f59..38cbbf2a7 100644 --- a/include/assimp/ZipArchiveIOSystem.h +++ b/include/assimp/ZipArchiveIOSystem.h @@ -1,3 +1,50 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + + + +All rights reserved. + +Redistribution and use of this software 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 the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +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. +--------------------------------------------------------------------------- +*/ + +/** @file ZipArchiveIOSystem.h + * @brief Implementation of IOSystem to read a ZIP file from another IOSystem +*/ + #ifndef AI_ZIPARCHIVEIOSYSTEM_H_INC #define AI_ZIPARCHIVEIOSYSTEM_H_INC From e05ece2eec2a52eee44dd6ac5dfd5f05a96be239 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Thu, 25 Jul 2019 11:12:06 +0100 Subject: [PATCH 044/320] Add Exporter Unit Test output to gitignore --- test/.gitignore | 3 +++ test/models/PLY/cube_test.ply | 24 ------------------------ test/unit/utAssbinImportExport.cpp | 4 ++-- test/unit/utObjImportExport.cpp | 6 +++--- test/unit/utPLYImportExport.cpp | 2 +- 5 files changed, 9 insertions(+), 30 deletions(-) create mode 100644 test/.gitignore delete mode 100644 test/models/PLY/cube_test.ply diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 000000000..b652d6aae --- /dev/null +++ b/test/.gitignore @@ -0,0 +1,3 @@ +# Ignore Unit Test Output files + +*_out.* diff --git a/test/models/PLY/cube_test.ply b/test/models/PLY/cube_test.ply deleted file mode 100644 index eef7cd426..000000000 --- a/test/models/PLY/cube_test.ply +++ /dev/null @@ -1,24 +0,0 @@ -ply -format ascii 1.0 -comment Created by Open Asset Import Library - http://assimp.sf.net (v4.1.649942190) -element vertex 8 -property float x -property float y -property float z -element face 6 -property list uchar int vertex_index -end_header -0 0 0 -0 0 1 -0 1 1 -0 1 0 -1 0 0 -1 0 1 -1 1 1 -1 1 0 -4 0 1 2 3 -4 7 6 5 4 -4 0 4 5 1 -4 1 5 6 2 -4 2 6 7 3 -4 3 7 4 0 diff --git a/test/unit/utAssbinImportExport.cpp b/test/unit/utAssbinImportExport.cpp index 6def04796..63c22cfea 100644 --- a/test/unit/utAssbinImportExport.cpp +++ b/test/unit/utAssbinImportExport.cpp @@ -58,8 +58,8 @@ public: const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/OBJ/spider.obj", aiProcess_ValidateDataStructure ); Exporter exporter; - EXPECT_EQ( aiReturn_SUCCESS, exporter.Export( scene, "assbin", ASSIMP_TEST_MODELS_DIR "/OBJ/spider_test.assbin" ) ); - const aiScene *newScene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/OBJ/spider_test.assbin", aiProcess_ValidateDataStructure ); + EXPECT_EQ( aiReturn_SUCCESS, exporter.Export( scene, "assbin", ASSIMP_TEST_MODELS_DIR "/OBJ/spider_out.assbin" ) ); + const aiScene *newScene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/OBJ/spider_out.assbin", aiProcess_ValidateDataStructure ); return newScene != nullptr; } diff --git a/test/unit/utObjImportExport.cpp b/test/unit/utObjImportExport.cpp index bb0d36b13..e00cd2075 100644 --- a/test/unit/utObjImportExport.cpp +++ b/test/unit/utObjImportExport.cpp @@ -205,8 +205,8 @@ protected: ::Assimp::Exporter exporter; const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/OBJ/spider.obj", aiProcess_ValidateDataStructure ); EXPECT_NE( nullptr, scene ); - EXPECT_EQ( aiReturn_SUCCESS, exporter.Export( scene, "obj", ASSIMP_TEST_MODELS_DIR "/OBJ/spider_test.obj" ) ); - EXPECT_EQ( aiReturn_SUCCESS, exporter.Export( scene, "objnomtl", ASSIMP_TEST_MODELS_DIR "/OBJ/spider_nomtl_test.obj" ) ); + EXPECT_EQ( aiReturn_SUCCESS, exporter.Export( scene, "obj", ASSIMP_TEST_MODELS_DIR "/OBJ/spider_out.obj" ) ); + EXPECT_EQ( aiReturn_SUCCESS, exporter.Export( scene, "objnomtl", ASSIMP_TEST_MODELS_DIR "/OBJ/spider_nomtl_out.obj" ) ); return true; } @@ -263,7 +263,7 @@ TEST_F( utObjImportExport, issue809_vertex_color_Test ) { #ifndef ASSIMP_BUILD_NO_EXPORT ::Assimp::Exporter exporter; - EXPECT_EQ( aiReturn_SUCCESS, exporter.Export( scene, "obj", ASSIMP_TEST_MODELS_DIR "/OBJ/test.obj" ) ); + EXPECT_EQ( aiReturn_SUCCESS, exporter.Export( scene, "obj", ASSIMP_TEST_MODELS_DIR "/OBJ/test_out.obj" ) ); #endif // ASSIMP_BUILD_NO_EXPORT } diff --git a/test/unit/utPLYImportExport.cpp b/test/unit/utPLYImportExport.cpp index bb8ba64d9..17d1b28de 100644 --- a/test/unit/utPLYImportExport.cpp +++ b/test/unit/utPLYImportExport.cpp @@ -71,7 +71,7 @@ public: Exporter exporter; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", aiProcess_ValidateDataStructure); EXPECT_NE(nullptr, scene); - EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "ply", ASSIMP_TEST_MODELS_DIR "/PLY/cube_test.ply")); + EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "ply", ASSIMP_TEST_MODELS_DIR "/PLY/cube_out.ply")); return true; } From 7e8a3ec4cbdedf85d21c6dc994c3fed7bd1c4e6e Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Thu, 25 Jul 2019 13:38:49 +0100 Subject: [PATCH 045/320] Add unit test of valid and unique Exporter IDs, rename assjson id "json" is a very vague exporter ID, change to "assjson" Add a unit test to ensure all exporter have unique IDs and that they all have an ID, description and extension --- code/Assjson/json_exporter.cpp | 9 ------ code/Common/Exporter.cpp | 6 ++-- .../ImportExport/utAssjsonImportExport.cpp | 2 +- test/unit/ImportExport/utExporter.cpp | 29 +++++++++++++++++++ 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/code/Assjson/json_exporter.cpp b/code/Assjson/json_exporter.cpp index cd542b29e..e9fa72496 100644 --- a/code/Assjson/json_exporter.cpp +++ b/code/Assjson/json_exporter.cpp @@ -34,15 +34,6 @@ namespace Assimp { void ExportAssimp2Json(const char*, Assimp::IOSystem*, const aiScene*, const Assimp::ExportProperties*); -Exporter::ExportFormatEntry Assimp2Json_desc = Assimp::Exporter::ExportFormatEntry( - "json", - "Plain JSON representation of the Assimp scene data structure", - "json", - &ExportAssimp2Json, - 0u -); - - // small utility class to simplify serializing the aiScene to Json class JSONWriter { public: diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index 87745bca9..acff29399 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -167,7 +167,7 @@ Exporter::ExportFormatEntry gExporters[] = #endif #ifndef ASSIMP_BUILD_NO_ASSXML_EXPORTER - Exporter::ExportFormatEntry( "assxml", "Assxml Document", "assxml" , &ExportSceneAssxml, 0 ), + Exporter::ExportFormatEntry( "assxml", "Assimp XML Document", "assxml" , &ExportSceneAssxml, 0 ), #endif #ifndef ASSIMP_BUILD_NO_X3D_EXPORTER @@ -183,8 +183,8 @@ Exporter::ExportFormatEntry gExporters[] = Exporter::ExportFormatEntry( "3mf", "The 3MF-File-Format", "3mf", &ExportScene3MF, 0 ), #endif -#ifndef ASSIMP_BUILD_NO_Assjson_EXPORTER - Exporter::ExportFormatEntry("json", "Plain JSON representation of the Assimp scene data structure", "json", &ExportAssimp2Json, 0) +#ifndef ASSIMP_BUILD_NO_ASSJSON_EXPORTER + Exporter::ExportFormatEntry( "assjson", "Assimp JSON Document", "json", &ExportAssimp2Json, 0) #endif }; diff --git a/test/unit/ImportExport/utAssjsonImportExport.cpp b/test/unit/ImportExport/utAssjsonImportExport.cpp index 20a2a9e24..82dbf8b57 100644 --- a/test/unit/ImportExport/utAssjsonImportExport.cpp +++ b/test/unit/ImportExport/utAssjsonImportExport.cpp @@ -57,7 +57,7 @@ public: const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/spider.obj", aiProcess_ValidateDataStructure); Exporter exporter; - aiReturn res = exporter.Export(scene, "json", "./spider_test.json"); + aiReturn res = exporter.Export(scene, "assjson", "./spider_test.json"); return aiReturn_SUCCESS == res; } }; diff --git a/test/unit/ImportExport/utExporter.cpp b/test/unit/ImportExport/utExporter.cpp index c46a55b00..4635be2a4 100644 --- a/test/unit/ImportExport/utExporter.cpp +++ b/test/unit/ImportExport/utExporter.cpp @@ -71,3 +71,32 @@ TEST_F(ExporterTest, ProgressHandlerTest) { TestProgressHandler *ph(new TestProgressHandler); exporter.SetProgressHandler(ph); } + +// Make sure all the registered exporters have useful descriptions +TEST_F(ExporterTest, ExporterIdTest) { + Exporter exporter; + size_t exportFormatCount = exporter.GetExportFormatCount(); + EXPECT_NE(0, exportFormatCount) << "No registered exporters"; + typedef std::map ExportIdMap; + ExportIdMap exporterMap; + for (size_t i = 0; i < exportFormatCount; ++i) + { + // Check that the exporter description exists and makes sense + const aiExportFormatDesc* desc = exporter.GetExportFormatDescription(i); + ASSERT_NE(nullptr, desc) << "Missing aiExportFormatDesc at index " << i; + EXPECT_NE(nullptr, desc->id) << "Null exporter ID at index " << i; + EXPECT_STRNE("", desc->id) << "Empty exporter ID at index " << i; + EXPECT_NE(nullptr, desc->description) << "Null exporter description at index " << i; + EXPECT_STRNE("", desc->description) << "Empty exporter description at index " << i; + EXPECT_NE(nullptr, desc->fileExtension) << "Null exporter file extension at index " << i; + EXPECT_STRNE("", desc->fileExtension) << "Empty exporter file extension at index " << i; + + // Check the ID is unique + std::string key(desc->id); + std::pair result = exporterMap.emplace(key, desc); + EXPECT_TRUE(result.second) << "Duplicate exported id: '" << key << "' " << desc->description << " *." << desc->fileExtension << " at index " << i; + } + + const aiExportFormatDesc* desc = exporter.GetExportFormatDescription(exportFormatCount); + EXPECT_EQ(nullptr, desc) << "More exporters than claimed"; +} From 9dce8e40ba045aa3f5673a608ec0d6ff6c8cc030 Mon Sep 17 00:00:00 2001 From: Pierre Anquez <32702237+panquez@users.noreply.github.com> Date: Thu, 25 Jul 2019 16:03:26 +0200 Subject: [PATCH 046/320] Update CMakeLists.txt --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ad0462531..412628bbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -341,7 +341,7 @@ SET( ASSIMP_BIN_INSTALL_DIR "bin" CACHE STRING get_cmake_property(is_multi_config GENERATOR_IS_MULTI_CONFIG) -IF (is_multi_config OR (CMAKE_BUILD_TYPE STREQUAL "Debug")) +IF (INJECT_DEBUG_POSTFIX AND (CMAKE_BUILD_TYPE STREQUAL "Debug")) SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Debug Postfix for lib, samples and tools") ELSE() SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING "Debug Postfix for lib, samples and tools") From a879102309cc329db0dd8d1193aca5b021a3316c Mon Sep 17 00:00:00 2001 From: Pierre Anquez <32702237+panquez@users.noreply.github.com> Date: Thu, 25 Jul 2019 16:27:35 +0200 Subject: [PATCH 047/320] Update CMakeLists.txt --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 412628bbe..3e0f55df0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -341,8 +341,8 @@ SET( ASSIMP_BIN_INSTALL_DIR "bin" CACHE STRING get_cmake_property(is_multi_config GENERATOR_IS_MULTI_CONFIG) -IF (INJECT_DEBUG_POSTFIX AND (CMAKE_BUILD_TYPE STREQUAL "Debug")) - SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Debug Postfix for lib, samples and tools") +IF (CMAKE_BUILD_TYPE STREQUAL "Debug") + SET(CMAKE_DEBUG_POSTFIX "totototot" CACHE STRING "Debug Postfix for lib, samples and tools") ELSE() SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING "Debug Postfix for lib, samples and tools") ENDIF() From 80047cd633e53dfd57015cad5bbdae067f61387a Mon Sep 17 00:00:00 2001 From: Pierre Anquez <32702237+panquez@users.noreply.github.com> Date: Thu, 25 Jul 2019 16:29:17 +0200 Subject: [PATCH 048/320] Update Exporter.cpp --- code/Common/Exporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index 58cad3be8..87745bca9 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -183,7 +183,7 @@ Exporter::ExportFormatEntry gExporters[] = Exporter::ExportFormatEntry( "3mf", "The 3MF-File-Format", "3mf", &ExportScene3MF, 0 ), #endif -#ifndef ASSIMP_BUILD_NO_ASSJSON_EXPORTER +#ifndef ASSIMP_BUILD_NO_Assjson_EXPORTER Exporter::ExportFormatEntry("json", "Plain JSON representation of the Assimp scene data structure", "json", &ExportAssimp2Json, 0) #endif }; From 337df2020972fe8e91e30683151e0cf5475e4249 Mon Sep 17 00:00:00 2001 From: Pierre Anquez <32702237+panquez@users.noreply.github.com> Date: Thu, 25 Jul 2019 17:12:16 +0200 Subject: [PATCH 049/320] Update CMakeLists.txt --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e0f55df0..412628bbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -341,8 +341,8 @@ SET( ASSIMP_BIN_INSTALL_DIR "bin" CACHE STRING get_cmake_property(is_multi_config GENERATOR_IS_MULTI_CONFIG) -IF (CMAKE_BUILD_TYPE STREQUAL "Debug") - SET(CMAKE_DEBUG_POSTFIX "totototot" CACHE STRING "Debug Postfix for lib, samples and tools") +IF (INJECT_DEBUG_POSTFIX AND (CMAKE_BUILD_TYPE STREQUAL "Debug")) + SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Debug Postfix for lib, samples and tools") ELSE() SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING "Debug Postfix for lib, samples and tools") ENDIF() From 57a56b7b1d390a7ab0b8e93aaf6a2f01a0254725 Mon Sep 17 00:00:00 2001 From: ywang Date: Thu, 25 Jul 2019 13:14:54 -0700 Subject: [PATCH 050/320] extra layer for multi uv sets --- code/FBX/FBXExporter.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 08f4bdbc9..ae742dd5d 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -1219,6 +1219,16 @@ void FBXExporter::WriteObjects () layer.AddChild(le); layer.Dump(outstream, binary, indent); + for(unsigned int lr = 1; lr < m->GetNumUVChannels(); ++ lr) + { + FBX::Node layerExtra("Layer", int32_t(1)); + layerExtra.AddChild("Version", int32_t(100)); + FBX::Node leExtra("LayerElement"); + leExtra.AddChild("Type", "LayerElementUV"); + leExtra.AddChild("TypedIndex", int32_t(lr)); + layerExtra.AddChild(leExtra); + layerExtra.Dump(outstream, binary, indent); + } // finish the node record indent = 1; n.End(outstream, binary, indent, true); From 5a7c226c30506e5317a16200cb04f4dc6fdfd619 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 09:51:20 -0700 Subject: [PATCH 051/320] set->unordered_set;unsigned int for iteration From 8fc899035c747da7d4f0530a9fdd8e139b67c721 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:27:59 -0700 Subject: [PATCH 052/320] customize error rate for bind pose --- code/FBX/FBXExporter.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 08f4bdbc9..f25b4f135 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -68,6 +68,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include //wangyi + // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure @@ -1840,7 +1842,10 @@ void FBXExporter::WriteObjects () // this should be the same as the bone's mOffsetMatrix. // if it's not the same, the skeleton isn't in the bind pose. - const float epsilon = 1e-4f; // some error is to be expected + float epsilon = 1e-4f; // some error is to be expected +#ifdef ASSIMP_CUSTOM_BINDPOSE_ERR + epsilon = ASSIMP_CUSTOM_BINDPOSE_ERR; +#endif bool bone_xform_okay = true; if (b && ! tr.Equal(b->mOffsetMatrix, epsilon)) { not_in_bind_pose.insert(b); From 079e522eaeca98573cf0e379c321fd69f976286d Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:29:50 -0700 Subject: [PATCH 053/320] clean up --- code/FBX/FBXExporter.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index f25b4f135..5367a8525 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -68,8 +68,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#include //wangyi - // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure From 9b2aac8c96aa020fefb49ecec26513a117046764 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Thu, 11 Jul 2019 17:00:47 -0700 Subject: [PATCH 054/320] use ExportProperties to customize bind pose epsilon --- code/FBX/FBXExporter.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 5367a8525..915b4aca7 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -67,6 +67,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ @@ -1841,9 +1842,9 @@ void FBXExporter::WriteObjects () // this should be the same as the bone's mOffsetMatrix. // if it's not the same, the skeleton isn't in the bind pose. float epsilon = 1e-4f; // some error is to be expected -#ifdef ASSIMP_CUSTOM_BINDPOSE_ERR - epsilon = ASSIMP_CUSTOM_BINDPOSE_ERR; -#endif + float epsilon_custom = mProperties->GetPropertyFloat("BINDPOSE_EPSILON", -1); + if(epsilon_custom > 0) + epsilon = epsilon_custom; bool bone_xform_okay = true; if (b && ! tr.Equal(b->mOffsetMatrix, epsilon)) { not_in_bind_pose.insert(b); From c597e21b67a62584c2bb813769f59f1686fcccf5 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:27:59 -0700 Subject: [PATCH 055/320] customize error rate for bind pose --- code/FBX/FBXExporter.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 915b4aca7..7419f3d15 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -69,6 +69,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include //wangyi + // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure From 6e6765cae35a55a1fccdd2ac5e97d668b93d2d29 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:29:50 -0700 Subject: [PATCH 056/320] clean up --- code/FBX/FBXExporter.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 7419f3d15..915b4aca7 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -69,8 +69,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#include //wangyi - // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure From 0ed91589080f53b7ec66fa4324b1b37c523d5801 Mon Sep 17 00:00:00 2001 From: ywang Date: Mon, 15 Jul 2019 15:52:45 -0700 Subject: [PATCH 057/320] update --- code/FBX/FBXExporter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 915b4aca7..dc17fc885 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -67,7 +67,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include -#include // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ From 029338940c79198f1b78db121fe2d1e794e5b1b6 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:27:59 -0700 Subject: [PATCH 058/320] customize error rate for bind pose --- code/FBX/FBXExporter.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index dc17fc885..2ecd3177d 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -68,6 +68,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include //wangyi + // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure From 2ddb00f4e066db9721972c43b8bdeebfe3760711 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:29:50 -0700 Subject: [PATCH 059/320] clean up --- code/FBX/FBXExporter.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 2ecd3177d..dc17fc885 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -68,8 +68,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#include //wangyi - // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure From f9f408690e1081fbf338e6c39e4ff93c7b5158cb Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Thu, 11 Jul 2019 17:00:47 -0700 Subject: [PATCH 060/320] use ExportProperties to customize bind pose epsilon --- code/FBX/FBXExporter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index dc17fc885..915b4aca7 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -67,6 +67,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ From 0f0454c3b7cae51fee7790f6945ce50d7ce4ae57 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Wed, 10 Jul 2019 16:27:59 -0700 Subject: [PATCH 061/320] customize error rate for bind pose --- code/FBX/FBXExporter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 915b4aca7..f6dd4ab1b 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -69,6 +69,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include + // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure From aaaa0a02a382ad11150b04288e21ef05bfc35901 Mon Sep 17 00:00:00 2001 From: thomasbiang Date: Thu, 11 Jul 2019 17:00:47 -0700 Subject: [PATCH 062/320] use ExportProperties to customize bind pose epsilon --- code/FBX/FBXExporter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index f6dd4ab1b..ffc4cd145 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -70,6 +70,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include + // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure From a6b06ad811f7d022a9e97185b733cb444490dcbe Mon Sep 17 00:00:00 2001 From: ywang Date: Mon, 15 Jul 2019 15:52:45 -0700 Subject: [PATCH 063/320] update --- code/FBX/FBXExporter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index ffc4cd145..1f856e8b2 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -67,7 +67,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include -#include From d8eaf0bc7fa54e1f1927eb0740ed3a132d6b16eb Mon Sep 17 00:00:00 2001 From: ywang Date: Thu, 25 Jul 2019 15:53:57 -0700 Subject: [PATCH 064/320] cleanup empty lines --- code/FBX/FBXExporter.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 1f856e8b2..dc17fc885 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -68,8 +68,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include - - // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ // https://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure From 72e18ed4aaab85c78bae22b27216e563858ebd17 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Fri, 26 Jul 2019 09:10:09 +0100 Subject: [PATCH 065/320] Fix Travis CI sign-compare warning EXPECT_* triggers sign compare error with literal 0 and unsigned Use 0u literal with size_t --- test/unit/ImportExport/utExporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/ImportExport/utExporter.cpp b/test/unit/ImportExport/utExporter.cpp index 4635be2a4..43e711cb3 100644 --- a/test/unit/ImportExport/utExporter.cpp +++ b/test/unit/ImportExport/utExporter.cpp @@ -76,7 +76,7 @@ TEST_F(ExporterTest, ProgressHandlerTest) { TEST_F(ExporterTest, ExporterIdTest) { Exporter exporter; size_t exportFormatCount = exporter.GetExportFormatCount(); - EXPECT_NE(0, exportFormatCount) << "No registered exporters"; + EXPECT_NE(0u, exportFormatCount) << "No registered exporters"; typedef std::map ExportIdMap; ExportIdMap exporterMap; for (size_t i = 0; i < exportFormatCount; ++i) From 73914cd7e29f8bd0dc814024c9ef451d1748a8ca Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 26 Jul 2019 10:55:28 +0200 Subject: [PATCH 066/320] Update FBXExporter.cpp small reformatting improvement --- code/FBX/FBXExporter.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index dc17fc885..7d979be9b 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -1842,8 +1842,10 @@ void FBXExporter::WriteObjects () // if it's not the same, the skeleton isn't in the bind pose. float epsilon = 1e-4f; // some error is to be expected float epsilon_custom = mProperties->GetPropertyFloat("BINDPOSE_EPSILON", -1); - if(epsilon_custom > 0) + if(epsilon_custom > 0) { epsilon = epsilon_custom; + } + bool bone_xform_okay = true; if (b && ! tr.Equal(b->mOffsetMatrix, epsilon)) { not_in_bind_pose.insert(b); From 7fc4cf155295392c868edbfa68e8a651bddd7960 Mon Sep 17 00:00:00 2001 From: RichardTea Date: Fri, 26 Jul 2019 22:17:24 +0100 Subject: [PATCH 067/320] ASSIMP_BUILD_NO_*_EXPORTER Full fix for #2557 These macros should be all-caps. Correct the cmakelists --- code/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index a8a514f73..78c8a5c93 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -810,7 +810,7 @@ ADD_ASSIMP_IMPORTER( MMD MMD/MMDVmdParser.h ) -ADD_ASSIMP_EXPORTER( Assjson +ADD_ASSIMP_EXPORTER( ASSJSON Assjson/cencode.c Assjson/cencode.h Assjson/json_exporter.cpp From d83af910959dd8f50814e85e8459fa1614026d63 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 29 Jul 2019 09:03:29 +0200 Subject: [PATCH 068/320] Update Exporter.cpp Add exporter detail. --- code/Common/Exporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index acff29399..090b561ae 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -163,7 +163,7 @@ Exporter::ExportFormatEntry gExporters[] = #endif #ifndef ASSIMP_BUILD_NO_ASSBIN_EXPORTER - Exporter::ExportFormatEntry( "assbin", "Assimp Binary", "assbin" , &ExportSceneAssbin, 0 ), + Exporter::ExportFormatEntry( "assbin", "Assimp Binary File", "assbin" , &ExportSceneAssbin, 0 ), #endif #ifndef ASSIMP_BUILD_NO_ASSXML_EXPORTER From cfbe368d72cec6f3dd42ac164c4de08ed728837e Mon Sep 17 00:00:00 2001 From: Minmin Gong Date: Mon, 29 Jul 2019 22:33:42 -0700 Subject: [PATCH 069/320] Remove the usage of std::iterator --- code/X3D/X3DImporter.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter.cpp b/code/X3D/X3DImporter.cpp index 1f4d3f916..96fcf067a 100644 --- a/code/X3D/X3DImporter.cpp +++ b/code/X3D/X3DImporter.cpp @@ -80,7 +80,13 @@ const aiImporterDesc X3DImporter::Description = { //const std::regex X3DImporter::pattern_nws(R"([^, \t\r\n]+)"); //const std::regex X3DImporter::pattern_true(R"(^\s*(?:true|1)\s*$)", std::regex::icase); -struct WordIterator: public std::iterator { +struct WordIterator { + using iterator_category = std::input_iterator_tag; + using value_type = const char*; + using difference_type = ptrdiff_t; + using pointer = value_type*; + using reference = value_type&; + static const char *whitespace; const char *start_, *end_; WordIterator(const char *start, const char *end): start_(start), end_(end) { From 1e6eac9e653f967f96655ab68ce12f64b225c571 Mon Sep 17 00:00:00 2001 From: follower Date: Fri, 2 Aug 2019 04:44:21 +1200 Subject: [PATCH 070/320] Fix error when building assimp on older Mac OS X version. Prevents this error when building with Mac OS X 10.9 SDK: error: no member named 'atoi' in namespace 'std'; did you mean simply 'atoi'? --- include/assimp/scene.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/assimp/scene.h b/include/assimp/scene.h index e973f6c5b..df5d6f3b5 100644 --- a/include/assimp/scene.h +++ b/include/assimp/scene.h @@ -56,6 +56,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "material.h" #include "anim.h" #include "metadata.h" +#include #ifdef __cplusplus extern "C" { From 9330cca1cd0fbfcdb1c81202165cabb9b958d5d7 Mon Sep 17 00:00:00 2001 From: petrmohelnik Date: Sat, 3 Aug 2019 20:51:00 +0200 Subject: [PATCH 071/320] glTF 2.0 Lights import Importing of lights according to glTF 2.0 extension KHR_lights_punctual https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual Since glTF lights are based on PBR they use different attenuation model than conventional lights supported by assimp. It is possible to use attenuation factors in assimp to describe inverse square law fallof. But the light structure does not provide means to save range property. Therefore I resorted to use of metadata. When range parameter is present, I put it into 'PBR_LightRange' metadata of light's node. Please, see comment in glTF2Importer file. --- code/glTF2/glTF2Asset.h | 27 +++++++++++ code/glTF2/glTF2Asset.inl | 47 ++++++++++++++++++ code/glTF2/glTF2AssetWriter.inl | 5 ++ code/glTF2/glTF2Importer.cpp | 84 +++++++++++++++++++++++++++++++-- 4 files changed, 159 insertions(+), 4 deletions(-) diff --git a/code/glTF2/glTF2Asset.h b/code/glTF2/glTF2Asset.h index 70f92df5b..23015c90a 100644 --- a/code/glTF2/glTF2Asset.h +++ b/code/glTF2/glTF2Asset.h @@ -46,6 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * glTF Extensions Support: * KHR_materials_pbrSpecularGlossiness full * KHR_materials_unlit full + * KHR_lights_punctual full */ #ifndef GLTF2ASSET_H_INC #define GLTF2ASSET_H_INC @@ -668,6 +669,28 @@ namespace glTF2 void Read(Value& obj, Asset& r); }; + //! A light (from KHR_lights_punctual extension) + struct Light : public Object + { + enum Type + { + Directional, + Point, + Spot + }; + + Type type; + + vec3 color; + float intensity; + Nullable range; + + float innerConeAngle; + float outerConeAngle; + + Light() {} + void Read(Value& obj, Asset& r); + }; //! Image data used to create a texture. struct Image : public Object @@ -819,6 +842,7 @@ namespace glTF2 Nullable scale; Ref camera; + Ref light; std::vector< Ref > skeletons; //!< The ID of skeleton nodes. Each of which is the root of a node hierarchy. Ref skin; //!< The ID of the skin referenced by this node. @@ -1050,6 +1074,7 @@ namespace glTF2 { bool KHR_materials_pbrSpecularGlossiness; bool KHR_materials_unlit; + bool KHR_lights_punctual; } extensionsUsed; @@ -1063,6 +1088,7 @@ namespace glTF2 LazyDict buffers; LazyDict bufferViews; LazyDict cameras; + LazyDict lights; LazyDict images; LazyDict materials; LazyDict meshes; @@ -1083,6 +1109,7 @@ namespace glTF2 , buffers (*this, "buffers") , bufferViews (*this, "bufferViews") , cameras (*this, "cameras") + , lights (*this, "lights", "KHR_lights_punctual") , images (*this, "images") , materials (*this, "materials") , meshes (*this, "meshes") diff --git a/code/glTF2/glTF2Asset.inl b/code/glTF2/glTF2Asset.inl index b51975c77..6f9eba50b 100644 --- a/code/glTF2/glTF2Asset.inl +++ b/code/glTF2/glTF2Asset.inl @@ -1067,6 +1067,39 @@ inline void Camera::Read(Value& obj, Asset& /*r*/) } } +inline void Light::Read(Value& obj, Asset& /*r*/) +{ +#ifndef M_PI + const float M_PI = 3.14159265358979323846f; +#endif + + std::string type_string; + ReadMember(obj, "type", type_string); + if (type_string == "directional") + type = Light::Directional; + else if (type_string == "point") + type = Light::Point; + else + type = Light::Spot; + + name = MemberOrDefault(obj, "name", ""); + + SetVector(color, vec3{ 1.0f, 1.0f, 1.0f }); + ReadMember(obj, "color", color); + + intensity = MemberOrDefault(obj, "intensity", 1.0f); + + ReadMember(obj, "range", range); + + if (type == Light::Spot) + { + Value* spot = FindObject(obj, "spot"); + if (!spot) throw DeadlyImportError("GLTF: Light missing its spot parameters"); + innerConeAngle = MemberOrDefault(*spot, "innerConeAngle", 0.0f); + outerConeAngle = MemberOrDefault(*spot, "outerConeAngle", M_PI / 4.0f); + } +} + inline void Node::Read(Value& obj, Asset& r) { @@ -1110,6 +1143,19 @@ inline void Node::Read(Value& obj, Asset& r) if (this->camera) this->camera->id = this->id; } + + if (Value* extensions = FindObject(obj, "extensions")) { + if (r.extensionsUsed.KHR_lights_punctual) { + + if (Value* ext = FindObject(*extensions, "KHR_lights_punctual")) { + if (Value* light = FindUInt(*ext, "light")) { + this->light = r.lights.Retrieve(light->GetUint()); + if (this->light) + this->light->id = this->id; + } + } + } + } } inline void Scene::Read(Value& obj, Asset& r) @@ -1421,6 +1467,7 @@ inline void Asset::ReadExtensionsUsed(Document& doc) CHECK_EXT(KHR_materials_pbrSpecularGlossiness); CHECK_EXT(KHR_materials_unlit); + CHECK_EXT(KHR_lights_punctual); #undef CHECK_EXT } diff --git a/code/glTF2/glTF2AssetWriter.inl b/code/glTF2/glTF2AssetWriter.inl index bec88ceb8..92168fa61 100644 --- a/code/glTF2/glTF2AssetWriter.inl +++ b/code/glTF2/glTF2AssetWriter.inl @@ -202,6 +202,11 @@ namespace glTF2 { } + inline void Write(Value& /*obj*/, Light& /*c*/, AssetWriter& /*w*/) + { + + } + inline void Write(Value& obj, Image& img, AssetWriter& w) { if (img.bufferView) { diff --git a/code/glTF2/glTF2Importer.cpp b/code/glTF2/glTF2Importer.cpp index a2b18fc49..c6e998b3a 100644 --- a/code/glTF2/glTF2Importer.cpp +++ b/code/glTF2/glTF2Importer.cpp @@ -140,10 +140,10 @@ static aiTextureMapMode ConvertWrappingMode(SamplerWrap gltfWrapMode) } } -//static void CopyValue(const glTF2::vec3& v, aiColor3D& out) -//{ -// out.r = v[0]; out.g = v[1]; out.b = v[2]; -//} +static void CopyValue(const glTF2::vec3& v, aiColor3D& out) +{ + out.r = v[0]; out.g = v[1]; out.b = v[2]; +} static void CopyValue(const glTF2::vec4& v, aiColor4D& out) { @@ -710,6 +710,69 @@ void glTF2Importer::ImportCameras(glTF2::Asset& r) } } +void glTF2Importer::ImportLights(glTF2::Asset& r) +{ + if (!r.lights.Size()) + return; + + mScene->mNumLights = r.lights.Size(); + mScene->mLights = new aiLight*[r.lights.Size()]; + + for (size_t i = 0; i < r.lights.Size(); ++i) { + Light& light = r.lights[i]; + + aiLight* ail = mScene->mLights[i] = new aiLight(); + + switch (light.type) + { + case Light::Directional: + ail->mType = aiLightSource_DIRECTIONAL; break; + case Light::Point: + ail->mType = aiLightSource_POINT; break; + case Light::Spot: + ail->mType = aiLightSource_SPOT; break; + } + + if (ail->mType != aiLightSource_POINT) + { + ail->mDirection = aiVector3D(0.0f, 0.0f, -1.0f); + ail->mUp = aiVector3D(0.0f, 1.0f, 0.0f); + } + + vec3 colorWithIntensity = { light.color[0] * light.intensity, light.color[1] * light.intensity, light.color[2] * light.intensity }; + CopyValue(colorWithIntensity, ail->mColorAmbient); + CopyValue(colorWithIntensity, ail->mColorDiffuse); + CopyValue(colorWithIntensity, ail->mColorSpecular); + + if (ail->mType == aiLightSource_DIRECTIONAL) + { + ail->mAttenuationConstant = 1.0; + ail->mAttenuationLinear = 0.0; + ail->mAttenuationQuadratic = 0.0; + } + else + { + //in PBR attenuation is calculated using inverse square law which can be expressed + //using assimps equation: 1/(att0 + att1 * d + att2 * d*d) with the following parameters + //this is correct equation for the case when range (see + //https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual) + //is not present. When range is not present it is assumed that it is infinite and so numerator is 1. + //When range is present then numerator might be any value in range [0,1] and then assimps equation + //will not suffice. In this case range is added into metadata in ImportNode function + //and its up to implementation to read it when it wants to + ail->mAttenuationConstant = 0.0; + ail->mAttenuationLinear = 0.0; + ail->mAttenuationQuadratic = 1.0; + } + + if (ail->mType == aiLightSource_SPOT) + { + ail->mAngleInnerCone = light.innerConeAngle; + ail->mAngleOuterCone = light.outerConeAngle; + } + } +} + static void GetNodeTransform(aiMatrix4x4& matrix, const glTF2::Node& node) { if (node.matrix.isPresent) { CopyValue(node.matrix.value, matrix); @@ -881,6 +944,18 @@ aiNode* ImportNode(aiScene* pScene, glTF2::Asset& r, std::vector& pScene->mCameras[node.camera.GetIndex()]->mName = ainode->mName; } + if (node.light) { + pScene->mLights[node.light.GetIndex()]->mName = ainode->mName; + + //range is optional - see https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual + //it is added to meta data of parent node, because there is no other place to put it + if (node.light->range.isPresent) + { + ainode->mMetaData = aiMetadata::Alloc(1); + ainode->mMetaData->Set(0, "PBR_LightRange", node.light->range.value); + } + } + return ainode; } @@ -1150,6 +1225,7 @@ void glTF2Importer::InternReadFile(const std::string& pFile, aiScene* pScene, IO ImportMeshes(asset); ImportCameras(asset); + ImportLights(asset); ImportNodes(asset); From 74d2eb842beae502537434a4b6cafe3cec30db62 Mon Sep 17 00:00:00 2001 From: Gordon MacPherson Date: Wed, 7 Aug 2019 22:38:33 +0100 Subject: [PATCH 072/320] Fixed armature being marked as 'limbnode' This also fixes issue with root bone overwritten - which should not happen as it is a hack. Before the behaviour would create an additional bone which would end up breaking animations completely on import. Additionally this fixes required bones being removed. Co-authored-by: K. S. Ernest (iFire) Lee --- code/FBX/FBXConverter.cpp | 14 ++---------- code/FBX/FBXConverter.h | 3 --- code/FBX/FBXDocument.cpp | 8 ------- code/FBX/FBXExporter.cpp | 43 +++--------------------------------- code/FBX/FBXMeshGeometry.cpp | 2 -- 5 files changed, 5 insertions(+), 65 deletions(-) diff --git a/code/FBX/FBXConverter.cpp b/code/FBX/FBXConverter.cpp index 9f940d322..949ba0532 100644 --- a/code/FBX/FBXConverter.cpp +++ b/code/FBX/FBXConverter.cpp @@ -90,7 +90,6 @@ namespace Assimp { , anim_fps() , out(out) , doc(doc) - , mRemoveEmptyBones( removeEmptyBones ) , mCurrentUnit(FbxUnit::cm) { // animations need to be converted first since this will // populate the node_anim_chain_bits map, which is needed @@ -1462,14 +1461,8 @@ namespace Assimp { const WeightIndexArray& indices = cluster->GetIndices(); - if (indices.empty() && mRemoveEmptyBones ) { - continue; - } - const MatIndexArray& mats = geo.GetMaterialIndices(); - bool ok = false; - const size_t no_index_sentinel = std::numeric_limits::max(); count_out_indices.clear(); @@ -1509,8 +1502,7 @@ namespace Assimp { out_indices.push_back(std::distance(outputVertStartIndices->begin(), it)); } - ++count_out_indices.back(); - ok = true; + ++count_out_indices.back(); } } } @@ -1518,10 +1510,8 @@ namespace Assimp { // if we found at least one, generate the output bones // XXX this could be heavily simplified by collecting the bone // data in a single step. - if (ok && mRemoveEmptyBones) { - ConvertCluster(bones, model, *cluster, out_indices, index_out_indices, + ConvertCluster(bones, model, *cluster, out_indices, index_out_indices, count_out_indices, node_global_transform); - } } } catch (std::exception&) { diff --git a/code/FBX/FBXConverter.h b/code/FBX/FBXConverter.h index 17a7bc56b..fb1a87ca6 100644 --- a/code/FBX/FBXConverter.h +++ b/code/FBX/FBXConverter.h @@ -470,9 +470,6 @@ private: aiScene* const out; const FBX::Document& doc; - - bool mRemoveEmptyBones; - FbxUnit mCurrentUnit; }; diff --git a/code/FBX/FBXDocument.cpp b/code/FBX/FBXDocument.cpp index 1af08fe6d..506fd978d 100644 --- a/code/FBX/FBXDocument.cpp +++ b/code/FBX/FBXDocument.cpp @@ -90,14 +90,6 @@ const Object* LazyObject::Get(bool dieOnError) return object.get(); } - // if this is the root object, we return a dummy since there - // is no root object int he fbx file - it is just referenced - // with id 0. - if(id == 0L) { - object.reset(new Object(id, element, "Model::RootNode")); - return object.get(); - } - const Token& key = element.KeyToken(); const TokenList& tokens = element.Tokens(); diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index b73a8f172..8ebc8555a 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -1706,8 +1706,7 @@ void FBXExporter::WriteObjects () } if (end) { break; } } - limbnodes.insert(parent); - skeleton.insert(parent); + // if it was the skeleton root we can finish here if (end) { break; } } @@ -1848,46 +1847,10 @@ void FBXExporter::WriteObjects () inverse_bone_xform.Inverse(); aiMatrix4x4 tr = inverse_bone_xform * mesh_xform; - // this should be the same as the bone's mOffsetMatrix. - // if it's not the same, the skeleton isn't in the bind pose. - float epsilon = 1e-4f; // some error is to be expected - float epsilon_custom = mProperties->GetPropertyFloat("BINDPOSE_EPSILON", -1); - if(epsilon_custom > 0) { - epsilon = epsilon_custom; - } - - bool bone_xform_okay = true; - if (b && ! tr.Equal(b->mOffsetMatrix, epsilon)) { - not_in_bind_pose.insert(b); - bone_xform_okay = false; - } + sdnode.AddChild("Transform", tr); - // if we have a bone we should use the mOffsetMatrix, - // otherwise try to just use the calculated transform. - if (b) { - sdnode.AddChild("Transform", b->mOffsetMatrix); - } else { - sdnode.AddChild("Transform", tr); - } - // note: it doesn't matter if we mix these, - // because if they disagree we'll throw an exception later. - // it could be that the skeleton is not in the bone pose - // but all bones are still defined, - // in which case this would use the mOffsetMatrix for everything - // and a correct skeleton would still be output. - // transformlink should be the position of the bone in world space. - // if the bone is in the bind pose (or nonexistent), - // we can just use the matrix we already calculated - if (bone_xform_okay) { - sdnode.AddChild("TransformLink", bone_xform); - // otherwise we can only work it out using the mesh position. - } else { - aiMatrix4x4 trl = b->mOffsetMatrix; - trl.Inverse(); - trl *= mesh_xform; - sdnode.AddChild("TransformLink", trl); - } + sdnode.AddChild("TransformLink", bone_xform); // note: this means we ALWAYS rely on the mesh node transform // being unchanged from the time the skeleton was bound. // there's not really any way around this at the moment. diff --git a/code/FBX/FBXMeshGeometry.cpp b/code/FBX/FBXMeshGeometry.cpp index 44a0264ca..e60fc25e2 100644 --- a/code/FBX/FBXMeshGeometry.cpp +++ b/code/FBX/FBXMeshGeometry.cpp @@ -115,7 +115,6 @@ MeshGeometry::MeshGeometry(uint64_t id, const Element& element, const std::strin if(tempVerts.empty()) { FBXImporter::LogWarn("encountered mesh with no vertices"); - return; } std::vector tempFaces; @@ -123,7 +122,6 @@ MeshGeometry::MeshGeometry(uint64_t id, const Element& element, const std::strin if(tempFaces.empty()) { FBXImporter::LogWarn("encountered mesh with no faces"); - return; } m_vertices.reserve(tempFaces.size()); From 5b81899302c71969a466439bbed1de301419747c Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Fri, 9 Aug 2019 15:24:18 +0100 Subject: [PATCH 073/320] Add failing test. --- .../FBX/close_to_identity_transforms.fbx | 855 ++++++++++++++++++ test/unit/utFBXImporterExporter.cpp | 8 + 2 files changed, 863 insertions(+) create mode 100644 test/models/FBX/close_to_identity_transforms.fbx diff --git a/test/models/FBX/close_to_identity_transforms.fbx b/test/models/FBX/close_to_identity_transforms.fbx new file mode 100644 index 000000000..c0b990282 --- /dev/null +++ b/test/models/FBX/close_to_identity_transforms.fbx @@ -0,0 +1,855 @@ +; FBX 7.5.0 project file +; ---------------------------------------------------- + +FBXHeaderExtension: { + FBXHeaderVersion: 1003 + FBXVersion: 7500 + CreationTimeStamp: { + Version: 1000 + Year: 2019 + Month: 5 + Day: 14 + Hour: 17 + Minute: 27 + Second: 42 + Millisecond: 70 + } + Creator: "FBX SDK/FBX Plugins version 2018.1.1" + SceneInfo: "SceneInfo::GlobalInfo", "UserData" { + Type: "UserData" + Version: 100 + MetaData: { + Version: 100 + Title: "" + Subject: "" + Author: "" + Keywords: "" + Revision: "" + Comment: "" + } + Properties70: { + P: "DocumentUrl", "KString", "Url", "", "U:\Some\Absolute\Path\cubes_with_mirroring_and_pivot.fbx" + P: "SrcDocumentUrl", "KString", "Url", "", "U:\Some\Absolute\Path\cubes_with_mirroring_and_pivot.fbx" + P: "Original", "Compound", "", "" + P: "Original|ApplicationVendor", "KString", "", "", "Autodesk" + P: "Original|ApplicationName", "KString", "", "", "Maya" + P: "Original|ApplicationVersion", "KString", "", "", "201800" + P: "Original|DateTime_GMT", "DateTime", "", "", "14/05/2019 16:27:42.070" + P: "Original|FileName", "KString", "", "", "U:\Some\Absolute\Path\cubes_with_mirroring_and_pivot.fbx" + P: "LastSaved", "Compound", "", "" + P: "LastSaved|ApplicationVendor", "KString", "", "", "Autodesk" + P: "LastSaved|ApplicationName", "KString", "", "", "Maya" + P: "LastSaved|ApplicationVersion", "KString", "", "", "201800" + P: "LastSaved|DateTime_GMT", "DateTime", "", "", "14/05/2019 16:27:42.070" + P: "Original|ApplicationActiveProject", "KString", "", "", "U:\Some\Absolute\Path" + } + } +} +GlobalSettings: { + Version: 1000 + Properties70: { + P: "UpAxis", "int", "Integer", "",1 + P: "UpAxisSign", "int", "Integer", "",1 + P: "FrontAxis", "int", "Integer", "",2 + P: "FrontAxisSign", "int", "Integer", "",1 + P: "CoordAxis", "int", "Integer", "",0 + P: "CoordAxisSign", "int", "Integer", "",1 + P: "OriginalUpAxis", "int", "Integer", "",1 + P: "OriginalUpAxisSign", "int", "Integer", "",1 + P: "UnitScaleFactor", "double", "Number", "",100 + P: "OriginalUnitScaleFactor", "double", "Number", "",1 + P: "AmbientColor", "ColorRGB", "Color", "",0,0,0 + P: "DefaultCamera", "KString", "", "", "Producer Perspective" + P: "TimeMode", "enum", "", "",11 + P: "TimeProtocol", "enum", "", "",2 + P: "SnapOnFrameMode", "enum", "", "",0 + P: "TimeSpanStart", "KTime", "Time", "",1924423250 + P: "TimeSpanStop", "KTime", "Time", "",384884650000 + P: "CustomFrameRate", "double", "Number", "",-1 + P: "TimeMarker", "Compound", "", "" + P: "CurrentTimeMarker", "int", "Integer", "",-1 + } +} + +; Documents Description +;------------------------------------------------------------------ + +Documents: { + Count: 1 + Document: 1827132552544, "", "Scene" { + Properties70: { + P: "SourceObject", "object", "", "" + P: "ActiveAnimStackName", "KString", "", "", "Take 001" + } + RootNode: 0 + } +} + +; Document References +;------------------------------------------------------------------ + +References: { +} + +; Object definitions +;------------------------------------------------------------------ + +Definitions: { + Version: 100 + Count: 13 + ObjectType: "GlobalSettings" { + Count: 1 + } + ObjectType: "AnimationStack" { + Count: 1 + PropertyTemplate: "FbxAnimStack" { + Properties70: { + P: "Description", "KString", "", "", "" + P: "LocalStart", "KTime", "Time", "",0 + P: "LocalStop", "KTime", "Time", "",0 + P: "ReferenceStart", "KTime", "Time", "",0 + P: "ReferenceStop", "KTime", "Time", "",0 + } + } + } + ObjectType: "AnimationLayer" { + Count: 1 + PropertyTemplate: "FbxAnimLayer" { + Properties70: { + P: "Weight", "Number", "", "A",100 + P: "Mute", "bool", "", "",0 + P: "Solo", "bool", "", "",0 + P: "Lock", "bool", "", "",0 + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BlendMode", "enum", "", "",0 + P: "RotationAccumulationMode", "enum", "", "",0 + P: "ScaleAccumulationMode", "enum", "", "",0 + P: "BlendModeBypass", "ULongLong", "", "",0 + } + } + } + ObjectType: "Geometry" { + Count: 4 + PropertyTemplate: "FbxMesh" { + Properties70: { + P: "Color", "ColorRGB", "Color", "",0.8,0.8,0.8 + P: "BBoxMin", "Vector3D", "Vector", "",0,0,0 + P: "BBoxMax", "Vector3D", "Vector", "",0,0,0 + P: "Primary Visibility", "bool", "", "",1 + P: "Casts Shadows", "bool", "", "",1 + P: "Receive Shadows", "bool", "", "",1 + } + } + } + ObjectType: "Material" { + Count: 2 + PropertyTemplate: "FbxSurfaceLambert" { + Properties70: { + P: "ShadingModel", "KString", "", "", "Lambert" + P: "MultiLayer", "bool", "", "",0 + P: "EmissiveColor", "Color", "", "A",0,0,0 + P: "EmissiveFactor", "Number", "", "A",1 + P: "AmbientColor", "Color", "", "A",0.2,0.2,0.2 + P: "AmbientFactor", "Number", "", "A",1 + P: "DiffuseColor", "Color", "", "A",0.8,0.8,0.8 + P: "DiffuseFactor", "Number", "", "A",1 + P: "Bump", "Vector3D", "Vector", "",0,0,0 + P: "NormalMap", "Vector3D", "Vector", "",0,0,0 + P: "BumpFactor", "double", "Number", "",1 + P: "TransparentColor", "Color", "", "A",0,0,0 + P: "TransparencyFactor", "Number", "", "A",0 + P: "DisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "DisplacementFactor", "double", "Number", "",1 + P: "VectorDisplacementColor", "ColorRGB", "Color", "",0,0,0 + P: "VectorDisplacementFactor", "double", "Number", "",1 + } + } + } + ObjectType: "Model" { + Count: 4 + PropertyTemplate: "FbxNode" { + Properties70: { + P: "QuaternionInterpolate", "enum", "", "",0 + P: "RotationOffset", "Vector3D", "Vector", "",0,0,0 + P: "RotationPivot", "Vector3D", "Vector", "",0,0,0 + P: "ScalingOffset", "Vector3D", "Vector", "",0,0,0 + P: "ScalingPivot", "Vector3D", "Vector", "",0,0,0 + P: "TranslationActive", "bool", "", "",0 + P: "TranslationMin", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMax", "Vector3D", "Vector", "",0,0,0 + P: "TranslationMinX", "bool", "", "",0 + P: "TranslationMinY", "bool", "", "",0 + P: "TranslationMinZ", "bool", "", "",0 + P: "TranslationMaxX", "bool", "", "",0 + P: "TranslationMaxY", "bool", "", "",0 + P: "TranslationMaxZ", "bool", "", "",0 + P: "RotationOrder", "enum", "", "",0 + P: "RotationSpaceForLimitOnly", "bool", "", "",0 + P: "RotationStiffnessX", "double", "Number", "",0 + P: "RotationStiffnessY", "double", "Number", "",0 + P: "RotationStiffnessZ", "double", "Number", "",0 + P: "AxisLen", "double", "Number", "",10 + P: "PreRotation", "Vector3D", "Vector", "",0,0,0 + P: "PostRotation", "Vector3D", "Vector", "",0,0,0 + P: "RotationActive", "bool", "", "",0 + P: "RotationMin", "Vector3D", "Vector", "",0,0,0 + P: "RotationMax", "Vector3D", "Vector", "",0,0,0 + P: "RotationMinX", "bool", "", "",0 + P: "RotationMinY", "bool", "", "",0 + P: "RotationMinZ", "bool", "", "",0 + P: "RotationMaxX", "bool", "", "",0 + P: "RotationMaxY", "bool", "", "",0 + P: "RotationMaxZ", "bool", "", "",0 + P: "InheritType", "enum", "", "",0 + P: "ScalingActive", "bool", "", "",0 + P: "ScalingMin", "Vector3D", "Vector", "",0,0,0 + P: "ScalingMax", "Vector3D", "Vector", "",1,1,1 + P: "ScalingMinX", "bool", "", "",0 + P: "ScalingMinY", "bool", "", "",0 + P: "ScalingMinZ", "bool", "", "",0 + P: "ScalingMaxX", "bool", "", "",0 + P: "ScalingMaxY", "bool", "", "",0 + P: "ScalingMaxZ", "bool", "", "",0 + P: "GeometricTranslation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricRotation", "Vector3D", "Vector", "",0,0,0 + P: "GeometricScaling", "Vector3D", "Vector", "",1,1,1 + P: "MinDampRangeX", "double", "Number", "",0 + P: "MinDampRangeY", "double", "Number", "",0 + P: "MinDampRangeZ", "double", "Number", "",0 + P: "MaxDampRangeX", "double", "Number", "",0 + P: "MaxDampRangeY", "double", "Number", "",0 + P: "MaxDampRangeZ", "double", "Number", "",0 + P: "MinDampStrengthX", "double", "Number", "",0 + P: "MinDampStrengthY", "double", "Number", "",0 + P: "MinDampStrengthZ", "double", "Number", "",0 + P: "MaxDampStrengthX", "double", "Number", "",0 + P: "MaxDampStrengthY", "double", "Number", "",0 + P: "MaxDampStrengthZ", "double", "Number", "",0 + P: "PreferedAngleX", "double", "Number", "",0 + P: "PreferedAngleY", "double", "Number", "",0 + P: "PreferedAngleZ", "double", "Number", "",0 + P: "LookAtProperty", "object", "", "" + P: "UpVectorProperty", "object", "", "" + P: "Show", "bool", "", "",1 + P: "NegativePercentShapeSupport", "bool", "", "",1 + P: "DefaultAttributeIndex", "int", "Integer", "",-1 + P: "Freeze", "bool", "", "",0 + P: "LODBox", "bool", "", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0,0,0 + P: "Lcl Rotation", "Lcl Rotation", "", "A",0,0,0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1 + P: "Visibility", "Visibility", "", "A",1 + P: "Visibility Inheritance", "Visibility Inheritance", "", "",1 + } + } + } +} + +; Object properties +;------------------------------------------------------------------ + +Objects: { + Geometry: 1827080157856, "Geometry::", "Mesh" { + Vertices: *24 { + a: -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 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,1,2,3,5,6,7,9,10,11,13,15 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 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,-1,0,0,-1,0,0,-1,0,0,-1,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 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 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,-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,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 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,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-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 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1827080155296, "Geometry::", "Mesh" { + Vertices: *24 { + a: -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 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,1,2,3,5,6,7,9,10,11,13,15 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 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,-1,0,0,-1,0,0,-1,0,0,-1,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 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 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,-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,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 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,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-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 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1827080156320, "Geometry::", "Mesh" { + Vertices: *24 { + a: -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 + } + PolygonVertexIndex: *24 { + a: 0,1,3,-3,2,3,5,-5,4,5,7,-7,6,7,1,-1,1,7,5,-4,6,0,2,-5 + } + Edges: *12 { + a: 0,1,2,3,5,6,7,9,10,11,13,15 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *72 { + a: 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,-1,0,0,-1,0,0,-1,0,0,-1,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 + } + NormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *72 { + a: 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,-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,1,0,0,1,0,0,1,0,0,1,0 + } + BinormalsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *72 { + a: 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,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-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 + } + TangentsW: *24 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *28 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25 + } + UVIndex: *24 { + a: 0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *12 { + a: 0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Geometry: 1827080139424, "Geometry::", "Mesh" { + Vertices: *588 { + a: -0.499999970197678,-0.5,0.5,0.500000059604645,-0.5,0.5,-0.499999970197678,0.5,0.5,0.500000059604645,0.5,0.5,-0.499999970197678,0.5,-0.49999988079071,0.500000059604645,0.5,-0.49999988079071,-0.499999970197678,-0.5,-0.49999988079071,0.500000059604645,-0.5,-0.49999988079071,0,0,0.5,0,-0.5,0.5,0.500000059604645,0,0.5,0,0.5,0.5,-0.499999970197678,0,0.5,0,0.5,1.19209289550781e-07,0.500000059604645,0.5,1.19209289550781e-07,0,0.5,-0.49999988079071,-0.499999970197678,0.5,1.19209289550781e-07,0,0,-0.49999988079071,0.500000059604645,0,-0.49999988079071,0,-0.5,-0.49999988079071,-0.499999970197678,0,-0.49999988079071,0,-0.5,1.19209289550781e-07,0.500000059604645,-0.5,1.19209289550781e-07,-0.499999970197678,-0.5,1.19209289550781e-07,0.500000059604645,0,1.19209289550781e-07,-0.499999970197678,0,1.19209289550781e-07,-0.25,-0.25,0.5,-0.499999970197678,-0.25,0.5,-0.25,-0.5,0.5,0,-0.25,0.5,-0.25,0,0.5,-0.25,0.5,0.25,-0.499999970197678,0.5,0.25,-0.25,0.5,0.5,0,0.5,0.25,-0.25,0.5,1.19209289550781e-07,-0.25,0.25,-0.49999988079071,-0.499999970197678,0.25,-0.49999988079071,-0.25,0.5,-0.49999988079071,0,0.25,-0.49999988079071,-0.25,0,-0.49999988079071,-0.25,-0.5,-0.24999988079071,-0.499999970197678,-0.5,-0.24999988079071,-0.25,-0.5,-0.49999988079071,0,-0.5,-0.24999988079071,-0.25,-0.5,1.19209289550781e-07,0.500000059604645,-0.25,0.25,0.500000059604645,-0.25,0.5,0.500000059604645,-0.5,0.25,0.500000059604645,-0.25,1.19209289550781e-07,0.500000059604645,0,0.25,-0.499999970197678,-0.25,-0.24999988079071,-0.499999970197678,-0.25,-0.49999988079071,-0.499999970197678,-0.25,1.19209289550781e-07,-0.499999970197678,0,-0.24999988079071,0.250000059604645,-0.25,0.5,0.250000059604645,-0.5,0.5,0.250000059604645,0,0.5,0.250000059604645,0.25,0.5,0.500000059604645,0.25,0.5,0.250000059604645,0.5,0.5,0,0.25,0.5,-0.25,0.25,0.5,-0.499999970197678,0.25,0.5,0.250000059604645,0.5,0.25,0.500000059604645,0.5,0.25,0.250000059604645,0.5,1.19209289550781e-07,0.250000059604645,0.5,-0.24999988079071,0.500000059604645,0.5,-0.24999988079071,0.250000059604645,0.5,-0.49999988079071, +0,0.5,-0.24999988079071,-0.25,0.5,-0.24999988079071,-0.499999970197678,0.5,-0.24999988079071,0.250000059604645,0.25,-0.49999988079071,0.500000059604645,0.25,-0.49999988079071,0.250000059604645,0,-0.49999988079071,0.250000059604645,-0.25,-0.49999988079071,0.500000059604645,-0.25,-0.49999988079071,0.250000059604645,-0.5,-0.49999988079071,0,-0.25,-0.49999988079071,-0.25,-0.25,-0.49999988079071,0.250000059604645,-0.5,-0.24999988079071,0.500000059604645,-0.5,-0.24999988079071,0.250000059604645,-0.5,1.19209289550781e-07,0.250000059604645,-0.5,0.25,0,-0.5,0.25,-0.25,-0.5,0.25,-0.499999970197678,-0.5,0.25,0.500000059604645,-0.25,-0.24999988079071,0.500000059604645,0,-0.24999988079071,0.500000059604645,0.25,-0.24999988079071,0.500000059604645,0.25,1.19209289550781e-07,0.500000059604645,0.25,0.25,-0.499999970197678,-0.25,0.25,-0.499999970197678,0,0.25,-0.499999970197678,0.25,0.25,-0.499999970197678,0.25,1.19209289550781e-07,-0.499999970197678,0.25,-0.24999988079071,-0.594913899898529,0,0.594913899898529,-0.152911216020584,0,0.714658200740814,-0.594913899898529,-0.152911216020584,0.594913899898529,-0.152911216020584,-0.152911216020584,0.714658200740814,-0.594913899898529,0.594913899898529,7.29137497046395e-08,-0.152911216020584,0.714658200740814,7.29137497046395e-08,-0.594913899898529,0.594913899898529,0.152911216020584,-0.152911216020584,0.714658200740814,0.152911216020584,-0.594913899898529,0,-0.594913899898529,-0.152911216020584,0,-0.714658200740814,-0.594913899898529,0.152911216020584,-0.594913899898529,-0.152911216020584,0.152911216020584,-0.714658200740814,-0.594913899898529,-0.594913899898529,7.29137497046395e-08,-0.152911216020584,-0.714658200740814,7.29137497046395e-08,-0.594913899898529,-0.594913899898529,-0.152911216020584,-0.152911216020584,-0.714658200740814,-0.152911216020584,0.594913899898529,0,0.594913899898529,0.714658200740814,0,0.152911216020584,0.594913899898529,-0.152911216020584,0.594913899898529,0.714658200740814,-0.152911216020584,0.152911216020584,-0.714658200740814,0,-0.152911216020584,-0.594913899898529,-0.152911216020584,-0.594913899898529, +-0.714658200740814,-0.152911216020584,-0.152911216020584,8.62321627254444e-17,-0.594913899898529,0.594913899898529,8.62321627254444e-17,-0.152911216020584,0.714658200740814,0.152911230921745,-0.594913899898529,0.594913899898529,0.152911230921745,-0.152911216020584,0.714658200740814,0.152911230921745,0,0.714658200740814,0.594913899898529,0.152911216020584,0.594913899898529,0.152911230921745,0.152911216020584,0.714658200740814,8.62321627254444e-17,0.594913899898529,0.594913899898529,8.62321627254444e-17,0.152911216020584,0.714658200740814,-0.152911216020584,0.594913899898529,0.594913899898529,-0.152911216020584,0.152911216020584,0.714658200740814,8.62321627254444e-17,0.714658200740814,0.152911216020584,0.152911230921745,0.594913899898529,0.594913899898529,0.152911230921745,0.714658200740814,0.152911216020584,0.594913899898529,0.594913899898529,7.29137497046395e-08,0.152911230921745,0.714658200740814,7.29137497046395e-08,0.594913899898529,0.594913899898529,-0.152911216020584,0.152911230921745,0.714658200740814,-0.152911216020584,8.62321627254444e-17,0.594913899898529,-0.594913899898529,8.62321627254444e-17,0.714658200740814,-0.152911216020584,-0.152911216020584,0.594913899898529,-0.594913899898529,-0.152911216020584,0.714658200740814,-0.152911216020584,8.62321627254444e-17,0.152911216020584,-0.714658200740814,0.152911230921745,0.594913899898529,-0.594913899898529,0.152911230921745,0.152911216020584,-0.714658200740814,0.594913899898529,0,-0.594913899898529,0.152911230921745,0,-0.714658200740814,0.594913899898529,-0.152911216020584,-0.594913899898529,0.152911230921745,-0.152911216020584,-0.714658200740814,8.62321627254444e-17,-0.594913899898529,-0.594913899898529,8.62321627254444e-17,-0.152911216020584,-0.714658200740814,-0.152911216020584,-0.594913899898529,-0.594913899898529,-0.152911216020584,-0.152911216020584,-0.714658200740814,8.62321627254444e-17,-0.714658200740814,-0.152911216020584,0.152911230921745,-0.594913899898529,-0.594913899898529,0.152911230921745,-0.714658200740814,-0.152911216020584,0.594913899898529,-0.594913899898529,7.29137497046395e-08, +0.152911230921745,-0.714658200740814,7.29137497046395e-08,0.594913899898529,-0.594913899898529,0.152911216020584,0.152911230921745,-0.714658200740814,0.152911216020584,8.62321627254444e-17,-0.714658200740814,0.152911216020584,-0.152911216020584,-0.594913899898529,0.594913899898529,-0.152911216020584,-0.714658200740814,0.152911216020584,0.714658200740814,-0.152911216020584,7.29137497046395e-08,0.594913899898529,-0.594913899898529,-0.152911216020584,0.714658200740814,-0.152911216020584,-0.152911216020584,0.714658200740814,0,-0.152911216020584,0.594913899898529,0.152911216020584,-0.594913899898529,0.714658200740814,0.152911216020584,-0.152911216020584,0.714658200740814,0.152911216020584,7.29137497046395e-08,0.594913899898529,0.594913899898529,0.152911216020584,0.714658200740814,0.152911216020584,0.152911216020584,-0.714658200740814,-0.152911216020584,7.29137497046395e-08,-0.594913899898529,-0.594913899898529,0.152911216020584,-0.714658200740814,-0.152911216020584,0.152911216020584,-0.714658200740814,0,0.152911216020584,-0.594913899898529,0.152911216020584,0.594913899898529,-0.714658200740814,0.152911216020584,0.152911216020584,-0.714658200740814,0.152911216020584,7.29137497046395e-08,-0.594913899898529,0.594913899898529,-0.152911216020584,-0.714658200740814,0.152911216020584,-0.152911216020584,-0.541863918304443,-0.541864037513733,0.541863918304443,8.62321627254444e-17,0,0.714658200740814,-0.541863918304443,0.541863918304443,0.541863918304443,8.62321627254444e-17,0.714658200740814,7.29137497046395e-08,-0.541863918304443,0.541863918304443,-0.541863799095154,8.62321627254444e-17,0,-0.714658200740814,-0.541863918304443,-0.541864037513733,-0.541863799095154,8.62321627254444e-17,-0.714658200740814,7.29137497046395e-08,0.541863977909088,-0.541864037513733,0.541863918304443,0.714658200740814,0,7.29137497046395e-08,-0.714658200740814,0,7.29137497046395e-08,0.541863977909088,0.541863918304443,0.541863918304443,0.541863977909088,0.541863918304443,-0.541863799095154,0.541863977909088,-0.541864037513733,-0.541863799095154 + } + PolygonVertexIndex: *768 { + a: 99,98,100,-102,103,102,104,-106,107,106,108,-110,111,110,112,-114,115,114,116,-118,118,106,119,-121,122,121,123,-125,125,114,126,-128,129,128,130,-132,132,128,133,-135,136,135,137,-139,140,139,141,-143,143,139,144,-146,147,146,148,-150,151,150,152,-154,154,150,155,-157,158,157,159,-161,161,121,162,-164,164,157,165,-167,167,146,168,-170,170,135,171,-173,173,110,174,-176,176,98,177,-179,179,102,180,-182,100,182,162,-102,162,121,122,-102,122,183,99,-102,104,184,130,-106,130,128,132,-106,132,185,103,-106,108,186,141,-110,141,139,143,-110,143,187,107,-110,112,188,152,-114,152,150,154,-114,154,189,111,-114,116,190,159,-118,159,157,164,-118,164,191,115,-118,119,188,112,-121,112,110,173,-121,173,192,118,-121,123,190,116,-125,116,114,125,-125,125,183,122,-125,126,193,133,-128,133,128,129,-128,129,183,125,-128,130,184,177,-132,177,98,99,-132,99,183,129,-132,133,193,171,-135,171,135,136,-135,136,185,132,-135,137,194,144,-139,144,139,140,-139,140,185,136,-139,141,186,180,-143,180,102,103,-143,103,185,140,-143,144,194,168,-146,168,146,147,-146,147,187,143,-146,148,195,155,-150,155,150,151,-150,151,187,147,-150,152,188,119,-154,119,106,107,-154,107,187,151,-154,155,195,165,-157,165,157,158,-157,158,189,154,-157,159,190,123,-161,123,121,161,-161,161,189,158,-161,162,182,174,-164,174,110,111,-164,111,189,161,-164,165,195,148,-167,148,146,167,-167,167,191,164,-167,168,194,137,-170,137,135,170,-170,170,191,167,-170,171,193,126,-173,126,114,115,-173,115,191,170,-173,174,182,100,-176,100,98,176,-176,176,192,173,-176,177,184,104,-179,104,102,179,-179,179,192,176,-179,180,186,108,-182,108,106,118,-182,118,192,179,-182,30,26,27,-13,35,31,32,-17,40,36,37,-21,45,41,42,-24,50,46,47,-11,54,51,52,-21,29,55,56,-10,57,58,59,-11,61,62,33,-12,34,64,60,-12,66,67,68,-15,70,71,38,-16,39,73,69,-16,75,76,77,-19,79,80,43,-20,44,81,78,-20,83,84,48,-23,85,86,28,-10,49,88,82,-23,89,90,74,-19,91,92,65,-15,53,93,87,-24,94,95,63,-13,96,97,72,-17,27,26,28,-1,28,26,29,-10,29,26,30,-9,32,31,33,-3,33,31,34,-12,34,31,35,-14,37,36,38,-5,38,36,39, +-16,39,36,40,-18,42,41,43,-7,43,41,44,-20,44,41,45,-22,47,46,48,-2,48,46,49,-23,49,46,50,-25,52,51,42,-7,42,51,53,-24,53,51,54,-26,56,55,47,-2,47,55,57,-11,57,55,29,-9,59,58,60,-4,60,58,61,-12,61,58,57,-9,33,62,63,-3,63,62,30,-13,30,62,61,-9,60,64,65,-4,65,64,66,-15,66,64,34,-14,68,67,69,-6,69,67,70,-16,70,67,66,-14,38,71,72,-5,72,71,35,-17,35,71,70,-14,69,73,74,-6,74,73,75,-19,75,73,39,-18,77,76,78,-8,78,76,79,-20,79,76,75,-18,43,80,52,-7,52,80,40,-21,40,80,79,-18,78,81,82,-8,82,81,83,-23,83,81,44,-22,48,84,56,-2,56,84,85,-10,85,84,83,-22,28,86,87,-1,87,86,45,-24,45,86,85,-22,82,88,77,-8,77,88,89,-19,89,88,49,-25,74,90,68,-6,68,90,91,-15,91,90,89,-25,65,92,59,-4,59,92,50,-11,50,92,91,-25,87,93,27,-1,27,93,94,-13,94,93,53,-26,63,95,32,-3,32,95,96,-17,96,95,94,-26,72,97,37,-5,37,97,54,-21,54,97,96,-26 + } + Edges: *384 { + a: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,102,104,105,108,109,110,114,116,117,120,121,122,126,128,129,132,133,134,138,140,141,144,145,146,150,152,153,156,158,162,164,165,168,170,174,176,180,181,182,186,188,193,194,198,205,206,210,212,216,217,218,222,224,229,230,234,241,242,246,248,252,253,254,258,260,266,270,277,278,282,284,290,294,296,301,302,306,314,318,320,326,330,332,338,342,350,354,356,362,366,368,374,378,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,481,482,483,485,490,491,493,494,495,497,502,503,505,506,507,509,514,515,517,518,519,521,526,527,529,530,531,533,538,539,541,543,545,550,551,553,555,557,563,565,566,567,569,575,577,578,581,589,590,593,599,601,602,603,605,611,613,614,617,625,626,629,635,637,638,639,641,647,649,653,661,662,665,671,673,677,683,685,686,689,697,701,707,709,713,719,721,725,733,737,743,745,749,755,757,761 + } + GeometryVersion: 124 + LayerElementNormal: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Normals: *2304 { + a: -0.261487126350403,0,0.965206980705261,-0.261487126350403,0,0.965206980705261,-0.261487126350403,0,0.965206980705261,-0.261487126350403,0,0.965206980705261,-0.261487185955048,0.965206921100616,0,-0.261487185955048,0.965206921100616,0,-0.261487185955048,0.965206921100616,0,-0.261487185955048,0.965206921100616,0,-0.261487126350403,0,-0.965206980705261,-0.261487126350403,0,-0.965206980705261,-0.261487126350403,0,-0.965206980705261,-0.261487126350403,0,-0.965206980705261,-0.261487156152725,-0.965206921100616,0,-0.261487156152725,-0.965206921100616,0,-0.261487156152725,-0.965206921100616,0,-0.261487156152725,-0.965206921100616,0,0.965206980705261,0,0.261487185955048,0.965206980705261,0,0.261487185955048,0.965206980705261,0,0.261487185955048,0.965206980705261,0,0.261487185955048,-0.965206980705261,0,-0.261487185955048,-0.965206980705261,0,-0.261487185955048,-0.965206980705261,0,-0.261487185955048,-0.965206980705261,0,-0.261487185955048,0,-0.261487156152725,0.965206921100616,0,-0.261487156152725,0.965206921100616,0,-0.261487156152725,0.965206921100616,0,-0.261487156152725,0.965206921100616,0.261487126350403,0,0.965206980705261,0.261487126350403,0,0.965206980705261,0.261487126350403,0,0.965206980705261,0.261487126350403,0,0.965206980705261,0,0.261487185955048,0.965206980705261,0,0.261487185955048,0.965206980705261,0,0.261487185955048,0.965206980705261,0,0.261487185955048,0.965206980705261,0,0.965206921100616,0.261487156152725,0,0.965206921100616,0.261487156152725,0,0.965206921100616,0.261487156152725,0,0.965206921100616,0.261487156152725,0.261487156152725,0.965206921100616,0,0.261487156152725,0.965206921100616,0,0.261487156152725,0.965206921100616,0,0.261487156152725,0.965206921100616,0,0,0.965206980705261,-0.261487126350403,0,0.965206980705261,-0.261487126350403,0,0.965206980705261,-0.261487126350403,0,0.965206980705261,-0.261487126350403,0,0.261487156152725,-0.965206921100616,0,0.261487156152725,-0.965206921100616,0,0.261487156152725,-0.965206921100616,0,0.261487156152725,-0.965206921100616,0.261487126350403,0,-0.965206980705261, +0.261487126350403,0,-0.965206980705261,0.261487126350403,0,-0.965206980705261,0.261487126350403,0,-0.965206980705261,0,-0.261487185955048,-0.965206980705261,0,-0.261487185955048,-0.965206980705261,0,-0.261487185955048,-0.965206980705261,0,-0.261487185955048,-0.965206980705261,0,-0.965206921100616,-0.261487156152725,0,-0.965206921100616,-0.261487156152725,0,-0.965206921100616,-0.261487156152725,0,-0.965206921100616,-0.261487156152725,0.261487185955048,-0.965206921100616,0,0.261487185955048,-0.965206921100616,0,0.261487185955048,-0.965206921100616,0,0.261487185955048,-0.965206921100616,0,0,-0.965206980705261,0.261487126350403,0,-0.965206980705261,0.261487126350403,0,-0.965206980705261,0.261487126350403,0,-0.965206980705261,0.261487126350403,0.965206980705261,-0.261487066745758,0,0.965206980705261,-0.261487066745758,0,0.965206980705261,-0.261487066745758,0,0.965206980705261,-0.261487066745758,0,0.965206980705261,0,-0.261487185955048,0.965206980705261,0,-0.261487185955048,0.965206980705261,0,-0.261487185955048,0.965206980705261,0,-0.261487185955048,0.965206980705261,0.261487126350403,0,0.965206980705261,0.261487126350403,0,0.965206980705261,0.261487126350403,0,0.965206980705261,0.261487126350403,0,-0.965206980705261,-0.261487126350403,0,-0.965206980705261,-0.261487126350403,0,-0.965206980705261,-0.261487126350403,0,-0.965206980705261,-0.261487126350403,0,-0.965206980705261,0,0.261487185955048,-0.965206980705261,0,0.261487185955048,-0.965206980705261,0,0.261487185955048,-0.965206980705261,0,0.261487185955048,-0.965206980705261,0.261487066745758,0,-0.965206980705261,0.261487066745758,0,-0.965206980705261,0.261487066745758,0,-0.965206980705261,0.261487066745758,0,-0.211917281150818,-0.211917445063591,0.954034626483917,0,0,1,-0.211917281150818,-0.21191743016243,0.954034626483917,-0.211917266249657,-0.211917445063591,0.954034626483917,0,-0.261487185955048,0.965206980705261,0,-0.261487185955048,0.965206980705261,0,-0.261487185955048,0.965206980705261,0,-0.261487185955048,0.965206980705261,0,0,1,0,0,1,0,0,1,0,0,1,-0.211917445063591,0.954034626483917,0.211917281150818, +0,1,0,-0.211917445063591,0.954034626483917,0.211917281150818,-0.211917445063591,0.954034626483917,0.211917266249657,0,0.965206980705261,0.261487126350403,0,0.965206980705261,0.261487126350403,0,0.965206980705261,0.261487126350403,0,0.965206980705261,0.261487126350403,0,1,0,0,1,0,0,1,0,0,1,0,-0.211917594075203,0.211917579174042,-0.954034507274628,0,0,-1,-0.211917594075203,0.211917579174042,-0.954034507274628,-0.211917594075203,0.211917564272881,-0.954034507274628,0,0.261487185955048,-0.965206980705261,0,0.261487185955048,-0.965206980705261,0,0.261487185955048,-0.965206980705261,0,0.261487185955048,-0.965206980705261,0,0,-1,0,0,-1,0,0,-1,0,0,-1,-0.211917325854301,-0.954034626483917,-0.211917325854301,0,-1,0,-0.211917325854301,-0.954034686088562,-0.211917325854301,-0.211917355656624,-0.954034686088562,-0.211917355656624,0,-0.965206980705261,-0.261487126350403,0,-0.965206980705261,-0.261487126350403,0,-0.965206980705261,-0.261487126350403,0,-0.965206980705261,-0.261487126350403,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0.954034626483917,-0.211917251348495,0.21191731095314,1,0,0,0.954034626483917,-0.211917251348495,0.211917340755463,0.954034745693207,-0.211917266249657,0.211917325854301,0.965206980705261,-0.261487126350403,0,0.965206980705261,-0.261487126350403,0,0.965206980705261,-0.261487126350403,0,0.965206980705261,-0.261487126350403,0,1,0,0,1,0,0,1,0,0,1,0,0,-0.954034686088562,-0.211917355656624,-0.211917459964752,-1,0,0,-0.954034626483917,-0.211917325854301,-0.211917445063591,-0.954034686088562,-0.211917355656624,-0.211917474865913,-0.965206980705261,-0.261487066745758,0,-0.965206980705261,-0.261487066745758,0,-0.965206980705261,-0.261487066745758,0,-0.965206980705261,-0.261487066745758,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,0.211917281150818,-0.211917400360107,0.954034626483917,0,0,1,0.211917266249657,-0.211917415261269,0.954034626483917,0.211917266249657,-0.211917415261269,0.954034626483917,0.261487126350403,0,0.965206980705261,0.261487126350403,0,0.965206980705261,0.261487126350403,0,0.965206980705261,0.261487126350403,0,0.965206980705261, +0,0,1,0,0,1,0,0,1,0,0,1,0.211917296051979,0.211917415261269,0.954034626483917,0,0,1,0.211917296051979,0.211917415261269,0.954034626483917,0.211917281150818,0.211917415261269,0.954034626483917,0,0.261487156152725,0.965206921100616,0,0.261487156152725,0.965206921100616,0,0.261487156152725,0.965206921100616,0,0.261487156152725,0.965206921100616,0,0,1,0,0,1,0,0,1,0,0,1,-0.211917281150818,0.211917445063591,0.954034626483917,0,0,1,-0.211917281150818,0.211917445063591,0.954034626483917,-0.211917266249657,0.211917445063591,0.954034626483917,-0.261487126350403,0,0.965206980705261,-0.261487126350403,0,0.965206980705261,-0.261487126350403,0,0.965206980705261,-0.261487126350403,0,0.965206980705261,0,0,1,0,0,1,0,0,1,0,0,1,0.211917445063591,0.954034626483917,0.211917445063591,0,1,0,0.211917415261269,0.954034566879272,0.211917415261269,0.211917445063591,0.954034626483917,0.211917445063591,0.261487185955048,0.965206921100616,0,0.261487185955048,0.965206921100616,0,0.261487185955048,0.965206921100616,0,0.261487185955048,0.965206921100616,0,0,1,0,0,1,0,0,1,0,0,1,0,0.211917445063591,0.954034626483917,-0.211917489767075,0,1,0,0.21191743016243,0.954034566879272,-0.211917489767075,0.211917445063591,0.954034566879272,-0.211917474865913,0,0.965206921100616,-0.261487156152725,0,0.965206921100616,-0.261487156152725,0,0.965206921100616,-0.261487156152725,0,0.965206921100616,-0.261487156152725,0,1,0,0,1,0,0,1,0,0,1,0,-0.211917459964752,0.954034686088562,-0.211917340755463,0,1,0,-0.211917445063591,0.954034626483917,-0.21191731095314,-0.211917489767075,0.954034686088562,-0.211917355656624,-0.261487156152725,0.965206921100616,0,-0.261487156152725,0.965206921100616,0,-0.261487156152725,0.965206921100616,0,-0.261487156152725,0.965206921100616,0,0,1,0,0,1,0,0,1,0,0,1,0,0.211917608976364,0.211917579174042,-0.954034507274628,0,0,-1,0.211917608976364,0.211917564272881,-0.954034566879272,0.211917594075203,0.211917579174042,-0.954034507274628,0.261487126350403,0,-0.965206980705261,0.261487126350403,0,-0.965206980705261,0.261487126350403,0,-0.965206980705261, +0.261487126350403,0,-0.965206980705261,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0.211917579174042,-0.211917534470558,-0.954034507274628,0,0,-1,0.211917594075203,-0.211917549371719,-0.954034507274628,0.211917594075203,-0.211917519569397,-0.954034507274628,0,-0.261487156152725,-0.965206921100616,0,-0.261487156152725,-0.965206921100616,0,-0.261487156152725,-0.965206921100616,0,-0.261487156152725,-0.965206921100616,0,0,-1,0,0,-1,0,0,-1,0,0,-1,-0.211917594075203,-0.211917549371719,-0.954034507274628,0,0,-1,-0.211917579174042,-0.211917534470558,-0.954034566879272,-0.211917594075203,-0.211917519569397,-0.954034507274628,-0.261487126350403,0,-0.965206980705261,-0.261487126350403,0,-0.965206980705261,-0.261487126350403,0,-0.965206980705261,-0.261487126350403,0,-0.965206980705261,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0.211917340755463,-0.954034686088562,-0.211917519569397,0,-1,0,0.211917325854301,-0.954034626483917,-0.211917489767075,0.211917325854301,-0.954034686088562,-0.211917489767075,0.261487156152725,-0.965206921100616,0,0.261487156152725,-0.965206921100616,0,0.261487156152725,-0.965206921100616,0,0.261487156152725,-0.965206921100616,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0.211917281150818,-0.954034626483917,0.211917445063591,0,-1,0,0.211917296051979,-0.954034626483917,0.211917445063591,0.211917266249657,-0.954034626483917,0.211917445063591,0,-0.965206921100616,0.261487156152725,0,-0.965206921100616,0.261487156152725,0,-0.965206921100616,0.261487156152725,0,-0.965206921100616,0.261487156152725,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-0.211917296051979,-0.954034626483917,0.211917296051979,0,-1,0,-0.211917296051979,-0.954034626483917,0.211917296051979,-0.211917281150818,-0.954034686088562,0.211917281150818,-0.261487185955048,-0.965206921100616,0,-0.261487185955048,-0.965206921100616,0,-0.261487185955048,-0.965206921100616,0,-0.261487185955048,-0.965206921100616,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0.954034626483917,-0.211917325854301,-0.211917400360107,1,0,0,0.954034686088562,-0.211917340755463,-0.211917400360107,0.954034686088562,-0.211917355656624,-0.21191743016243,0.965206980705261,0,-0.261487185955048, +0.965206980705261,0,-0.261487185955048,0.965206980705261,0,-0.261487185955048,0.965206980705261,0,-0.261487185955048,1,0,0,1,0,0,1,0,0,1,0,0,0.954034686088562,0.211917370557785,-0.211917489767075,1,0,0,0.954034686088562,0.211917355656624,-0.211917445063591,0.954034626483917,0.211917355656624,-0.211917445063591,0.965206980705261,0.261487066745758,0,0.965206980705261,0.261487066745758,0,0.965206980705261,0.261487066745758,0,0.965206980705261,0.261487066745758,0,1,0,0,1,0,0,1,0,0,1,0,0,0.954034626483917,0.211917296051979,0.211917385458946,1,0,0,0.954034626483917,0.211917296051979,0.211917385458946,0.954034626483917,0.211917266249657,0.211917355656624,0.965206980705261,0,0.261487185955048,0.965206980705261,0,0.261487185955048,0.965206980705261,0,0.261487185955048,0.965206980705261,0,0.261487185955048,1,0,0,1,0,0,1,0,0,1,0,0,-0.954034626483917,-0.211917251348495,0.211917400360107,-1,0,0,-0.954034626483917,-0.211917266249657,0.211917400360107,-0.954034626483917,-0.211917251348495,0.211917400360107,-0.965206980705261,0,0.261487185955048,-0.965206980705261,0,0.261487185955048,-0.965206980705261,0,0.261487185955048,-0.965206980705261,0,0.261487185955048,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.954034626483917,0.211917281150818,0.211917445063591,-1,0,0,-0.954034626483917,0.211917281150818,0.211917445063591,-0.954034626483917,0.211917266249657,0.211917445063591,-0.965206980705261,0.261487126350403,0,-0.965206980705261,0.261487126350403,0,-0.965206980705261,0.261487126350403,0,-0.965206980705261,0.261487126350403,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.954034566879272,0.211917355656624,-0.211917519569397,-1,0,0,-0.954034686088562,0.211917370557785,-0.211917534470558,-0.954034626483917,0.211917355656624,-0.211917504668236,-0.965206980705261,0,-0.261487185955048,-0.965206980705261,0,-0.261487185955048,-0.965206980705261,0,-0.261487185955048,-0.965206980705261,0,-0.261487185955048,-1,0,0,-1,0,0,-1,0,0,-1,0,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,1,0,0,1,0,0,1,0,0,1,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,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,0,-1,0,0,-1,0,0,-1,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,0,-1,0,0,-1,0,0,-1,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,0,1,0,0,1,0,0,1,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,0,1,0,0,1,0,0,1,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,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,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,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,0,-1,0,0,-1,0,0,-1,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,0,-1,0,0,-1,0,0,-1,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,0,1,0,0,1,0,0,1,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,0,1,0,0,1,0,0,1,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,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,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,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,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,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,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,-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,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,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,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,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,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,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,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,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,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,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,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,-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,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,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,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,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,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,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,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,0 + } + NormalsW: *768 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementBinormal: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Binormals: *2304 { + a: 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,-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,1,0,0,1,0,0,1,0,0,1,0,0,0.965207040309906,0.261487185955048,0,0.965207040309906,0.261487185955048,0,0.965207040309906,0.261487185955048,0,0.965207040309906,0.261487185955048,-0,1,0,-0,1,0,-0,1,0,-0,1,0,0,0.965206980705261,-0.261487185955048,0,0.965206980705261,-0.261487185955048,0,0.965206980705261,-0.261487185955048,0,0.965206980705261,-0.261487185955048,0,0.261487185955048,-0.965207040309906,0,0.261487185955048,-0.965207040309906,0,0.261487185955048,-0.965207040309906,0,0.261487185955048,-0.965207040309906,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,-0.261487126350403,-0.965206980705261,0,-0.261487126350403,-0.965206980705261,0,-0.261487126350403,-0.965206980705261,0,-0.261487126350403,-0.965206980705261,0,-0.965207040309906,-0.261487185955048,0,-0.965207040309906,-0.261487185955048,0,-0.965207040309906,-0.261487185955048,0,-0.965207040309906,-0.261487185955048,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-0.965206980705261,0.261487185955048,0,-0.965206980705261,0.261487185955048,0,-0.965206980705261,0.261487185955048,0,-0.965206980705261,0.261487185955048,0,-0.261487185955048,0.965207040309906,0,-0.261487185955048,0.965207040309906,0,-0.261487185955048,0.965207040309906,0,-0.261487185955048,0.965207040309906,0,0,1,0,0,1,0,0,1,0,0,1,0,0.261487126350403,0.965206980705261,0,0.261487126350403,0.965206980705261,0,0.261487126350403,0.965206980705261,0,0.261487126350403,0.965206980705261,0.261487066745758,0.965206980705261,0,0.261487066745758,0.965206980705261,0,0.261487066745758,0.965206980705261,0,0.261487066745758,0.965206980705261,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,0,1,0,0,1,0,0,1,0, +0,1,0,0.261487066745758,0.965206980705261,0,0.261487066745758,0.965206980705261,0,0.261487066745758,0.965206980705261,0,0.261487066745758,0.965206980705261,0,-0.0554696954786777,0.977241098880768,0.204750895500183,0.0677256807684898,0.997704029083252,-0,0.0995207726955414,0.966452240943909,0.236782029271126,0.022095151245594,0.974918127059937,0.221464186906815,0,0.965206980705261,0.261487185955048,0,0.965206980705261,0.261487185955048,0,0.965206980705261,0.261487185955048,0,0.965206980705261,0.261487185955048,0,1,-0,0,1,-0,0,1,-0,0,1,-0,-0.0554696545004845,0.204750746488571,-0.977241158485413,0.0677258297801018,0,-0.997703969478607,0.0995210781693459,0.23678195476532,-0.966452240943909,0.0220953319221735,0.221464082598686,-0.974918246269226,0,0.261487126350403,-0.965206980705261,0,0.261487126350403,-0.965206980705261,0,0.261487126350403,-0.965206980705261,0,0.261487126350403,-0.965206980705261,0,0,-1,0,0,-1,0,0,-1,0,0,-1,-0.055469736456871,-0.977241158485413,-0.204751059412956,0.0677258297801018,-0.997703969478607,0,0.0995209664106369,-0.966452121734619,-0.236782252788544,0.0220952294766903,-0.974918127059937,-0.221464350819588,0,-0.965206980705261,-0.261487185955048,0,-0.965206980705261,-0.261487185955048,0,-0.965206980705261,-0.261487185955048,0,-0.965206980705261,-0.261487185955048,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0,-0.0554696694016457,-0.204750820994377,0.977241218090057,0.0677259787917137,0,0.997703969478607,0.0995214134454727,-0.236782014369965,0.966452121734619,0.0220954976975918,-0.221464157104492,0.974918186664581,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,0,1,0,0,1,0,0,1,0,0,1,0.204750746488571,0.977241218090057,0.0554696507751942,0,0.997704029083252,-0.0677256807684898,0.236781880259514,0.966452300548553,-0.0995208472013474,0.221463993191719,0.974918186664581,-0.0220952127128839,0.261487126350403,0.965206980705261,0,0.261487126350403,0.965206980705261,0,0.261487126350403,0.965206980705261,0,0.261487126350403,0.965206980705261,0, +-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0.204750791192055,0.977241098880768,-0.0554696619510651,0,0.997704029083252,0.0677257031202316,-0.236781939864159,0.966452240943909,0.099520817399025,-0.221464112401009,0.974918246269226,0.022095188498497,-0.261487066745758,0.965206980705261,0,-0.261487066745758,0.965206980705261,0,-0.261487066745758,0.965206980705261,0,-0.261487066745758,0.965206980705261,0,0,1,0,0,1,0,0,1,0,0,1,0,-0.099520780146122,0.966452240943909,0.236781999468803,-0.0677256733179092,0.997704029083252,0,0.0554696880280972,0.977241098880768,0.204750865697861,-0.022095151245594,0.974918127059937,0.221464157104492,-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.0554696880280972,0.977241098880768,-0.204750865697861,0.0677258223295212,0.997703969478607,-0,0.0995210558176041,0.966452181339264,-0.236782059073448,0.0220952890813351,0.974918246269226,-0.221464201807976,0,0.965207040309906,-0.261487185955048,0,0.965207040309906,-0.261487185955048,0,0.965207040309906,-0.261487185955048,0,0.965207040309906,-0.261487185955048,0,1,-0,0,1,-0,0,1,-0,0,1,-0,-0.0995210707187653,0.966452240943909,-0.236782118678093,-0.0677258297801018,0.997703969478607,0,0.0554696954786777,0.977241098880768,-0.204750895500183,-0.0220952928066254,0.974918186664581,-0.221464231610298,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.0995210558176041,0.236782118678093,-0.966452240943909,-0.0677258223295212,0,-0.997703969478607,0.0554696917533875,0.204750880599022,-0.977241098880768,-0.0220952853560448,0.221464216709137,-0.974918127059937,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.0554697066545486,-0.204750955104828,-0.977241158485413,0.0677259713411331,0,-0.997703969478607,0.0995213314890862,-0.236782237887383,-0.966452181339264,0.0220954213291407,-0.221464306116104,-0.974918186664581,0,-0.261487185955048,-0.965207040309906,0,-0.261487185955048,-0.965207040309906,0,-0.261487185955048,-0.965207040309906,0,-0.261487185955048,-0.965207040309906,0,0,-1,0,0,-1,0,0,-1,0,0,-1,-0.0995213687419891,-0.236782059073448,-0.966452181339264, +-0.0677259787917137,0,-0.997703969478607,0.0554696545004845,-0.204750776290894,-0.977241158485413,-0.0220954604446888,-0.221464172005653,-0.974918246269226,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.0995209515094757,-0.966452121734619,-0.236782252788544,-0.0677258223295212,-0.997703969478607,-0,0.0554697290062904,-0.977241098880768,-0.204751014709473,-0.0220952183008194,-0.974918127059937,-0.221464365720749,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.0554697290062904,-0.977241158485413,0.204751014709473,0.0677256733179092,-0.997704029083252,0,0.099520668387413,-0.966452181339264,0.236782178282738,0.022095087915659,-0.974918127059937,0.221464276313782,0,-0.965207040309906,0.261487185955048,0,-0.965207040309906,0.261487185955048,0,-0.965207040309906,0.261487185955048,0,-0.965207040309906,0.261487185955048,0,-1,0,0,-1,0,0,-1,-0,0,-1,0,-0.0995206907391548,-0.966452181339264,0.236782178282738,-0.0677256807684898,-0.997704029083252,-0,0.0554697178304195,-0.977241098880768,0.20475098490715,-0.0220951028168201,-0.974918127059937,0.221464276313782,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.0995213836431503,-0.23678220808506,0.966452121734619,-0.0677259713411331,0,0.997703969478607,0.0554697066545486,-0.204750940203667,0.977241098880768,-0.0220954623073339,-0.221464291214943,0.974918186664581,-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.0554696954786777,0.204750895500183,0.977241098880768,0.0677258223295212,0,0.997703969478607,0.0995211154222488,0.236782103776932,0.966452181339264,0.0220953226089478,0.221464246511459,0.974918186664581,0,0.261487185955048,0.965207040309906,0,0.261487185955048,0.965207040309906,0,0.261487185955048,0.965207040309906,0,0.261487185955048,0.965207040309906,0,0,1,0,0,1,0,0,1,0,0,1,-0.0995211601257324,0.23678195476532,0.966452181339264,-0.0677258297801018,0,0.997703969478607,0.0554696619510651,0.204750776290894,0.977241218090057,-0.022095363587141,0.221464082598686,0.974918246269226,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.236781939864159,0.966452240943909,0.0995208621025085, +-0,0.997704029083252,0.0677257031202316,0.204750806093216,0.977241158485413,-0.0554696656763554,0.221464112401009,0.974918186664581,0.0220951996743679,-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.204750806093216,0.977241098880768,0.0554696694016457,0,0.997703969478607,-0.0677258521318436,-0.236782044172287,0.966452240943909,-0.0995211452245712,-0.221464172005653,0.974918246269226,-0.0220953542739153,-0.261487066745758,0.965206980705261,0,-0.261487066745758,0.965206980705261,0,-0.261487066745758,0.965206980705261,0,-0.261487066745758,0.965206980705261,0,0,1,-0,-0,1,0,-0,1,0,-0,1,0,-0.236781984567642,0.966452300548553,0.09952113032341,-0,0.997703969478607,0.0677258297801018,-0.204750761389732,0.977241158485413,-0.0554696582257748,-0.221464067697525,0.974918246269226,0.022095350548625,-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.236781880259514,0.966452360153198,-0.0995208248496056,0,0.997704029083252,-0.0677256807684898,-0.20475073158741,0.977241158485413,0.0554696470499039,-0.221464022994041,0.974918246269226,-0.0220951903611422,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.204750746488571,0.977241158485413,-0.0554696545004845,0,0.997703969478607,0.0677258297801018,0.23678195476532,0.966452240943909,0.0995210781693459,0.221464082598686,0.974918246269226,0.0220953319221735,0.261487126350403,0.965206980705261,0,0.261487126350403,0.965206980705261,0,0.261487126350403,0.965206980705261,0,0.261487126350403,0.965206980705261,0,0,1,0,0,1,0,0,1,0,0,1,0,0.236782059073448,0.966452240943909,-0.0995211154222488,0,0.997703969478607,-0.0677258521318436,0.204750806093216,0.977241098880768,0.0554696656763554,0.221464142203331,0.974918186664581,-0.0220953188836575,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,-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,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,-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,-0,1,-0,-0,1,-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,-0,-1,-0,-0,-1,-0,-0,-1,-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,-0,-1,0,-0,-1,0,-0,-1,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,-0,1,-0,-0,1,-0,-0,1,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,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,-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,-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,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,-0,-1,-0,-0,-1,-0,-0,-1,-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,-0,-1,0,-0,-1,0,-0,-1,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,-0,1,-0,-0,1,-0,-0,1,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,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,-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,-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,-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,-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,-0,1,-0,-0,1,-0,-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,-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,-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,-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,-0,-1,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,-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,-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,-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,-0,-1,-0,-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,-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,-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,-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,-0,1,-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,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,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,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,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,-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,-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,-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,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0 + } + BinormalsW: *768 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + + } + LayerElementTangent: 0 { + Version: 102 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "Direct" + Tangents: *2304 { + a: 0.965206980705261,-0,0.261487126350403,0.965206980705261,-0,0.261487126350403,0.965206980705261,-0,0.261487126350403,0.965206980705261,-0,0.261487126350403,0.965207040309906,0.26148721575737,0,0.965207040309906,0.26148721575737,0,0.965207040309906,0.26148721575737,0,0.965207040309906,0.26148721575737,0,0.965206980705261,-0,-0.261487126350403,0.965206980705261,-0,-0.261487126350403,0.965206980705261,-0,-0.261487126350403,0.965206980705261,-0,-0.261487126350403,0.965206980705261,-0.261487156152725,-0,0.965206980705261,-0.261487156152725,-0,0.965206980705261,-0.261487156152725,-0,0.965206980705261,-0.261487156152725,-0,0.26148721575737,0,-0.965207040309906,0.26148721575737,0,-0.965207040309906,0.26148721575737,0,-0.965207040309906,0.26148721575737,0,-0.965207040309906,-0.26148721575737,0,0.965207040309906,-0.26148721575737,0,0.965207040309906,-0.26148721575737,0,0.965207040309906,-0.26148721575737,0,0.965207040309906,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,0,1,-0,0,1,-0,-0,1,-0,0,0.965206980705261,-0.261487156152725,0,0.965206980705261,-0.261487156152725,0,0.965206980705261,-0.261487156152725,0,0.965206980705261,-0.261487156152725,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,0.965206980705261,0,0.261487126350403,0.965206980705261,0,0.261487126350403,0.965206980705261,0,0.261487126350403,0.965206980705261,0,0.261487126350403,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0.965207040309906,0.26148721575737,-0,0.965207040309906,0.26148721575737,-0,0.965207040309906,0.26148721575737,-0,0.965207040309906,0.26148721575737,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,-0,0,-1,-0,0,-1,-0,0,-1,-0,0,-1,-0.26148721575737,-0,-0.965207040309906,-0.26148721575737,-0,-0.965207040309906,-0.26148721575737,-0,-0.965207040309906,-0.26148721575737,-0,-0.965207040309906,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.26148721575737,-0,0.965207040309906, +0.26148721575737,-0,0.965207040309906,0.26148721575737,-0,0.965207040309906,0.26148721575737,-0,0.965207040309906,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0.97571212053299,0.00952975451946259,0.218849271535873,0.997704029083252,-0.0677256807684898,0,0.972207129001617,-0.145124465227127,0.183717742562294,0.977037787437439,-0.0680116266012192,0.201919630169868,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,0.97571212053299,0.218849420547485,-0.0095297135412693,0.997703969478607,0,0.0677258297801018,0.972207069396973,0.183717846870422,0.145124778151512,0.977037727832794,0.20191977918148,0.0680118054151535,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,0.975712060928345,-0.00952968932688236,-0.21884959936142,0.997703969478607,0.0677258297801018,0,0.972207009792328,0.145124763250351,-0.183717966079712,0.977037727832794,0.0680118054151535,-0.201919928193092,1,0,0,1,0,0,1,0,0,1,0,0,1,-0,0,1,-0,0,1,-0,0,1,-0,0,0.97571212053299,-0.218849316239357,0.00952973961830139,0.997703969478607,0,-0.0677259787917137,0.972207069396973,-0.183717638254166,-0.145125105977058,0.977037727832794,-0.201919630169868,-0.068011961877346,1,0,0,1,0,0,1,0,0,1,0,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0.218849301338196,0.00952973961830139,-0.97571212053299,0,-0.0677256807684898,-0.997704029083252,0.1837178170681,-0.145124509930611,-0.972207069396973,0.201919689774513,-0.0680116564035416,-0.977037787437439,-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.218849420547485,0.0095297172665596,0.97571212053299,0,-0.0677257031202316,0.997704029083252,-0.183717906475067,-0.145124524831772,0.972207069396973,-0.201919823884964,-0.068011686205864,0.977037727832794,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.972207129001617,0.145124465227127,-0.183717742562294,0.997704029083252,0.0677256733179092,0,0.97571212053299,-0.00952975824475288,-0.218849256634712,0.977037787437439,0.0680116191506386,-0.201919630169868,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403, +1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,0.97571212053299,0.00952975172549486,-0.218849286437035,0.997703969478607,-0.0677258223295212,0,0.972207069396973,-0.14512474834919,-0.183717682957649,0.977037847042084,-0.0680117681622505,-0.20191964507103,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,0,1,-0,0,1,-0,-0,1,-0,0,0.972207069396973,0.14512474834919,0.183717668056488,0.997703969478607,0.0677258297801018,0,0.97571212053299,-0.00952975451946259,0.218849271535873,0.977037847042084,0.0680117756128311,0.201919630169868,0.965206980705261,-0,0.261487126350403,0.965206980705261,-0,0.261487126350403,0.965206980705261,-0,0.261487126350403,0.965206980705261,-0,0.261487126350403,1,-0,-0,1,-0,0,1,-0,0,1,-0,0,0.972207069396973,-0.183717831969261,-0.145124778151512,0.997703969478607,0,-0.0677258223295212,0.97571212053299,-0.218849420547485,0.00952972378581762,0.977037727832794,-0.20191977918148,-0.0680117979645729,0.965207040309906,-0.26148721575737,-0,0.965207040309906,-0.26148721575737,-0,0.965207040309906,-0.26148721575737,-0,0.965207040309906,-0.26148721575737,-0,1,-0,-0,1,-0,-0,1,-0,-0,1,-0,-0,0.97571212053299,-0.218849420547485,-0.0095297247171402,0.997703969478607,0,0.0677259713411331,0.972207009792328,-0.183717742562294,0.145125061273575,0.977037727832794,-0.201919749379158,0.0680119395256042,1,-0,0,1,-0,0,1,-0,0,1,-0,0,1,0,0,1,0,0,1,-0,-0,1,0,0,0.972207009792328,0.183717772364616,-0.145125061273575,0.997703969478607,0,-0.0677259787917137,0.97571212053299,0.218849420547485,0.00952971447259188,0.977037727832794,0.20191977918148,-0.0680119544267654,0.965206980705261,0.261487156152725,0,0.965206980705261,0.261487156152725,0,0.965206980705261,0.261487156152725,-0,0.965206980705261,0.261487156152725,0,1,-0,0,1,0,0,1,0,0,1,0,0,0.972207009792328,-0.14512474834919,0.183717995882034,0.997703969478607,-0.0677258223295212,0,0.975712060928345,0.00952969118952751,0.218849584460258,0.977037727832794,-0.0680117979645729,0.201919928193092,0.965206980705261,0,0.261487126350403,0.965206980705261,0,0.261487126350403,0.965206980705261,0,0.261487126350403,0.965206980705261,0,0.261487126350403, +1,-0,0,1,-0,0,1,-0,0,1,-0,0,0.975712060928345,-0.00952969212085009,0.218849584460258,0.997704029083252,0.0677256733179092,0,0.972207069396973,0.145124465227127,0.183718055486679,0.977037727832794,0.0680116564035416,0.201919972896576,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,-0,0,1,0,0,0.972207069396973,-0.145124480128288,-0.183718040585518,0.997704029083252,-0.0677256807684898,0,0.975712060928345,0.00952969398349524,-0.218849569559097,0.977037727832794,-0.0680116713047028,-0.201919972896576,0.965206980705261,0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,0.965206980705261,-0,-0.261487126350403,0.965206980705261,0,-0.261487126350403,1,0,0,1,0,0,1,0,0,1,0,0,0.972207069396973,0.183717623353004,0.145125105977058,0.997703969478607,0,0.0677259713411331,0.97571212053299,0.218849316239357,-0.00952974893152714,0.977037847042084,0.201919630169868,0.0680119544267654,0.965206980705261,0.261487156152725,0,0.965206980705261,0.261487156152725,0,0.965206980705261,0.261487156152725,0,0.965206980705261,0.261487156152725,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0.97571212053299,0.218849271535873,0.00952975638210773,0.997703969478607,0,-0.0677258223295212,0.972207069396973,0.183717668056488,-0.145124807953835,0.977037847042084,0.201919630169868,-0.0680118054151535,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,0.972207069396973,-0.183717682957649,0.145124822854996,0.997703969478607,0,0.0677258297801018,0.97571212053299,-0.218849286437035,-0.00952974427491426,0.977037847042084,-0.201919630169868,0.0680118054151535,0.965207040309906,-0.26148721575737,0,0.965207040309906,-0.26148721575737,0,0.965207040309906,-0.26148721575737,0,0.965207040309906,-0.26148721575737,0,1,0,-0,1,0,-0,1,0,-0,1,0,-0,-0.183717846870422,0.145124554634094,-0.972207069396973,0,0.0677257031202316,-0.997704029083252,-0.218849360942841,-0.0095297284424305,-0.97571212053299,-0.20191977918148,0.068011686205864,-0.977037727832794,-0.26148721575737,-0,-0.965207040309906,-0.26148721575737,-0,-0.965207040309906,-0.26148721575737,-0,-0.965207040309906,-0.26148721575737,-0,-0.965207040309906, +0,0,-1,0,0,-1,0,0,-1,0,0,-1,-0.218849450349808,0.00952971167862415,-0.97571212053299,0,-0.0677258521318436,-0.997703969478607,-0.1837178170681,-0.145124852657318,-0.972207069396973,-0.201919764280319,-0.0680118426680565,-0.977037727832794,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.183717772364616,0.145124807953835,-0.972207069396973,0,0.0677258297801018,-0.997703969478607,0.218849375844002,-0.00952972657978535,-0.97571212053299,0.201919689774513,0.0680118054151535,-0.977037727832794,0.26148721575737,0,-0.965207040309906,0.26148721575737,0,-0.965207040309906,0.26148721575737,0,-0.965207040309906,0.26148721575737,0,-0.965207040309906,0,0,-1,0,0,-1,0,-0,-1,0,0,-1,0.183717876672745,0.145124495029449,0.972207069396973,0,0.0677256807684898,0.997704029083252,0.218849375844002,-0.00952972192317247,0.97571212053299,0.20191977918148,0.0680116564035416,0.977037727832794,0.26148721575737,-0,0.965207040309906,0.26148721575737,-0,0.965207040309906,0.26148721575737,-0,0.965207040309906,0.26148721575737,-0,0.965207040309906,0,-0,1,0,-0,1,0,-0,1,0,-0,1,0.218849420547485,0.0095297135412693,0.97571212053299,0,-0.0677258297801018,0.997703969478607,0.183717846870422,-0.145124778151512,0.972207069396973,0.20191977918148,-0.0680118054151535,0.977037727832794,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.183717906475067,0.145124837756157,0.972207009792328,0,0.0677258521318436,0.997703969478607,-0.21884948015213,-0.00952970236539841,0.97571212053299,-0.201919838786125,0.0680118277668953,0.977037727832794,-0.26148721575737,0,0.965207040309906,-0.26148721575737,0,0.965207040309906,-0.26148721575737,0,0.965207040309906,-0.26148721575737,0,0.965207040309906,0,-0,1,0,-0,1,0,-0,1,0,-0,1,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,-0,1,0,0,1,0,0,1,0,0,1,-0,0,1,0,0,1,0,0,1,0,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,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,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,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,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,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,0,1,0,0,1,-0,0,1,0,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,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,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,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,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,-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,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,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,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,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,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,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,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,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,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,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,-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,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,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,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,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,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,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,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,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,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,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,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,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,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,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,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,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,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,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 + } + TangentsW: *768 { + a: 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + } + } + LayerElementUV: 0 { + Version: 101 + Name: "map1" + MappingInformationType: "ByPolygonVertex" + ReferenceInformationType: "IndexToDirect" + UV: *542 { + a: 0.375,0,0.625,0,0.375,0.25,0.625,0.25,0.375,0.5,0.625,0.5,0.375,0.75,0.625,0.75,0.375,1,0.625,1,0.875,0,0.875,0.25,0.125,0,0.125,0.25,0.5,0.125,0.5,0,0.5,1,0.625,0.125,0.5,0.25,0.375,0.125,0.5,0.375,0.625,0.375,0.75,0.25,0.5,0.5,0.375,0.375,0.25,0.25,0.5,0.625,0.625,0.625,0.875,0.125,0.5,0.75,0.375,0.625,0.125,0.125,0.5,0.875,0.625,0.875,0.75,0,0.5,1,0.375,0.875,0.25,0,0.75,0.125,0.75,0,0.875,0.125,0.75,0.25,0.25,0.125,0.25,0,0.25,0.25,0.125,0.125,0.4375,0.0625,0.375,0.0625,0.4375,0,0.4375,1,0.5,0.0625,0.4375,0.125,0.4375,0.3125,0.375,0.3125,0.3125,0.25,0.4375,0.25,0.5,0.3125,0.4375,0.375,0.4375,0.5625,0.375,0.5625,0.125,0.1875,0.4375,0.5,0.5,0.5625,0.4375,0.625,0.4375,0.8125,0.375,0.8125,0.1875,0,0.4375,0.75,0.5,0.8125,0.4375,0.875,0.6875,0.0625,0.625,0.0625,0.625,0.9375,0.6875,0,0.75,0.0625,0.6875,0.125,0.1875,0.0625,0.375,0.6875,0.125,0.0625,0.1875,0,0.25,0.0625,0.1875,0.125,0.5625,0.0625,0.5625,0,0.5625,1,0.5625,0.125,0.5625,0.1875,0.625,0.1875,0.5625,0.25,0.5,0.1875,0.4375,0.1875,0.375,0.1875,0.5625,0.3125,0.625,0.3125,0.6875,0.25,0.5625,0.375,0.5625,0.4375,0.625,0.4375,0.8125,0.25,0.5625,0.5,0.5,0.4375,0.4375,0.4375,0.375,0.4375,0.1875,0.25,0.5625,0.5625,0.625,0.5625,0.875,0.1875,0.5625,0.625,0.5625,0.6875,0.625,0.6875,0.875,0.0625,0.5625,0.75,0.5,0.6875,0.4375,0.6875,0.375,0.6875,0.5625,0.8125,0.625,0.8125,0.8125,0,0.5625,0.875,0.5625,0.9375,0.625,0.9375,0.5625,1,0.5,0.9375,0.4375,0.9375,0.4375,1,0.375,0.9375,0.3125,0,0.8125,0.0625,0.8125,0,0.875,0.0625,0.8125,0.125,0.8125,0.1875,0.875,0.1875,0.8125,0.25,0.75,0.1875,0.6875,0.1875,0.6875,0.25,0.3125,0.0625,0.3125,0,0.3125,0.125,0.3125,0.1875,0.3125,0.25,0.25,0.1875,0.1875,0.1875,0.1875,0.25,0.125,0.1875,0.4375,0.125,0.375,0.125,0.375,0.0625,0.4375,0.0625,0.4375,0.375,0.375,0.375,0.375,0.3125,0.4375,0.3125,0.4375,0.625,0.375,0.625,0.375,0.5625,0.4375,0.5625,0.4375,0.875,0.375,0.875,0.375,0.8125,0.4375,0.8125,0.6875,0.125,0.625,0.125,0.625,0.0625,0.6875,0.0625,0.1875,0.125,0.125,0.125,0.125,0.0625,0.1875,0.0625,0.5,0.0625,0.5,0,0.5625,0, +0.5625,0.0625,0.5625,0.125,0.625,0.1875,0.5625,0.1875,0.5,0.1875,0.5,0.25,0.4375,0.25,0.4375,0.1875,0.5,0.3125,0.5625,0.25,0.5625,0.3125,0.5625,0.375,0.625,0.375,0.625,0.4375,0.5625,0.4375,0.5,0.4375,0.5,0.5,0.4375,0.5,0.4375,0.4375,0.5,0.5625,0.5625,0.5,0.5625,0.5625,0.5625,0.625,0.625,0.625,0.625,0.6875,0.5625,0.6875,0.5,0.6875,0.5,0.75,0.4375,0.75,0.4375,0.6875,0.5,0.8125,0.5625,0.75,0.5625,0.8125,0.5625,0.875,0.625,0.875,0.625,0.9375,0.5625,0.9375,0.5,0.9375,0.5,1,0.4375,1,0.4375,0.9375,0.75,0.0625,0.75,0,0.8125,0,0.8125,0.0625,0.8125,0.125,0.875,0.125,0.875,0.1875,0.8125,0.1875,0.75,0.1875,0.75,0.25,0.6875,0.25,0.6875,0.1875,0.25,0.0625,0.25,0,0.3125,0,0.3125,0.0625,0.3125,0.125,0.375,0.1875,0.3125,0.1875,0.25,0.1875,0.25,0.25,0.1875,0.25,0.1875,0.1875,0.375,0,0.4375,0,0.5,0.125,0.375,0.25,0.5,0.375,0.375,0.5,0.5,0.625,0.375,0.75,0.5,0.875,0.625,0,0.6875,0,0.75,0.125,0.125,0,0.1875,0,0.25,0.125,0.625,0.25,0.625,0.3125,0.625,0.5,0.375,0.4375,0.625,0.5625,0.625,0.75,0.375,0.6875,0.625,0.8125,0.625,1,0.5625,1,0.375,1,0.375,0.9375,0.875,0,0.875,0.0625,0.875,0.25,0.8125,0.25,0.3125,0.25,0.125,0.25,0.125,0.1875 + } + UVIndex: *768 { + a: 51,19,47,46,57,24,53,52,63,30,59,58,69,36,65,64,75,17,71,70,81,45,78,76,50,15,83,82,85,17,87,86,89,18,55,90,56,18,88,92,95,21,97,96,100,23,61,101,62,23,99,104,107,27,109,108,112,29,67,113,68,29,111,115,118,33,120,119,122,35,124,123,74,39,128,127,130,40,132,131,134,41,136,135,80,43,138,137,139,19,91,140,142,44,144,143,47,0,48,46,48,15,50,46,50,14,51,46,53,2,55,52,55,18,56,52,56,20,57,52,59,4,61,58,61,23,62,58,62,26,63,58,65,6,67,64,67,29,68,64,68,32,69,64,71,1,73,70,73,39,74,70,74,38,75,70,78,12,79,76,79,43,80,76,80,42,81,76,83,1,71,82,71,17,85,82,85,14,50,82,87,3,88,86,88,18,89,86,89,14,85,86,55,2,91,90,91,19,51,90,51,14,89,90,88,3,93,92,93,21,95,92,95,20,56,92,97,5,99,96,99,23,100,96,100,20,95,96,61,4,102,101,102,24,57,101,57,20,100,101,99,5,105,104,105,27,107,104,107,26,62,104,109,7,111,108,111,29,112,108,112,26,107,108,67,6,114,113,114,30,63,113,63,26,112,113,111,7,116,115,116,33,118,115,118,32,68,115,120,9,121,119,121,35,122,119,122,32,118,119,124,8,125,123,125,36,69,123,69,32,122,123,128,10,129,127,129,40,130,127,130,38,74,127,132,11,133,131,133,41,134,131,134,38,130,131,136,3,87,135,87,17,75,135,75,38,134,135,138,0,47,137,47,19,139,137,139,42,80,137,91,2,141,140,141,44,142,140,142,42,139,140,144,13,145,143,145,45,81,143,81,42,142,143,146,149,148,147,150,153,152,151,154,157,156,155,158,161,160,159,162,165,164,163,166,169,168,167,170,173,172,171,174,176,175,163,177,180,179,178,181,183,182,178,184,187,186,185,188,191,190,189,192,194,193,189,195,198,197,196,199,202,201,200,203,205,204,200,206,209,208,207,210,213,212,211,214,217,216,215,218,221,220,219,222,225,224,223,226,229,228,227,230,232,231,147,233,236,235,234,148,149,238,237,238,149,170,171,170,149,146,239,152,153,179,240,179,153,181,178,181,153,150,241,156,157,190,242,190,157,192,189,192,157,154,243,160,161,201,244,201,161,203,200,203,161,158,245,164,165,247,246,247,165,214,215,214,165,162,248,168,169,250,249,250,169,226,227,226,169,166,251,172,173,164,246,164,173,174,163,174,173,170,239,175,176,182,252,182,176,177,178,177,176,174,239, +179,180,231,240,231,180,146,147,146,180,177,239,182,183,253,252,253,183,184,185,184,183,181,241,186,187,193,254,193,187,188,189,188,187,184,241,190,191,255,242,255,191,150,151,150,191,188,241,193,194,256,254,256,194,195,196,195,194,192,243,197,198,204,257,204,198,199,200,199,198,195,243,201,202,258,244,258,202,154,155,154,202,199,243,204,205,259,257,259,205,206,207,206,205,203,245,208,209,261,260,261,209,210,211,210,209,206,245,212,213,263,262,263,213,158,159,158,213,210,245,216,217,265,264,265,217,218,219,218,217,214,248,220,221,267,266,267,221,222,223,222,221,218,248,224,225,175,252,175,225,162,163,162,225,222,248,228,229,148,237,148,229,230,147,230,229,226,251,231,232,268,240,268,232,233,234,233,232,230,251,235,236,270,269,270,236,166,167,166,236,233,251 + } + } + LayerElementSmoothing: 0 { + Version: 102 + Name: "" + MappingInformationType: "ByEdge" + ReferenceInformationType: "Direct" + Smoothing: *384 { + a: 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,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,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,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + } + } + LayerElementMaterial: 0 { + Version: 101 + Name: "" + MappingInformationType: "AllSame" + ReferenceInformationType: "IndexToDirect" + Materials: *1 { + a: 0 + } + } + Layer: 0 { + Version: 100 + LayerElement: { + Type: "LayerElementNormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementBinormal" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementTangent" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementMaterial" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementSmoothing" + TypedIndex: 0 + } + LayerElement: { + Type: "LayerElementUV" + TypedIndex: 0 + } + } + } + Model: 1827098352032, "Model::Cube2", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-0.0104023897647858,0.00998288810253143,-0.0104375958442688 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.1,-0.1,0.1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1827098379872, "Model::Cube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",1.04023897647858,-0.998288810253143,1.04375958442688 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1827098382192, "Model::Cube3", "Mesh" { + Version: 232 + Properties70: { + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",-0.0106711769104004,0.00998288810253143,0.0939023494720459 + P: "Lcl Scaling", "Lcl Scaling", "", "A",0.1,0.1,0.1 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Model: 1827098384512, "Model::Cube1", "Mesh" { + Version: 232 + Properties70: { + P: "RotationPivot", "Vector3D", "Vector", "",0.0,0.0019,0.0 + P: "ScalingOffset", "Vector3D", "Vector", "",0.0,0.0019,0.0 + P: "ScalingPivot", "Vector3D", "Vector", "",0.0,0.0019,0.0 + P: "RotationActive", "bool", "", "",1 + P: "InheritType", "enum", "", "",1 + P: "ScalingMax", "Vector3D", "Vector", "",0,0,0 + P: "DefaultAttributeIndex", "int", "Integer", "",0 + P: "Lcl Translation", "Lcl Translation", "", "A",0.0,0.0019,0.0 + P: "Lcl Scaling", "Lcl Scaling", "", "A",1.0,1.0019,1.0 + P: "currentUVSet", "KString", "", "U", "map1" + } + Shading: T + Culling: "CullingOff" + } + Material: 1827074508720, "Material::Mat_Green", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",0,1,0 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0,0.800000011920929,0 + P: "Opacity", "double", "Number", "",1 + } + } + Material: 1827074501920, "Material::Mat_Red", "" { + Version: 102 + ShadingModel: "lambert" + MultiLayer: 0 + Properties70: { + P: "AmbientColor", "Color", "", "A",0,0,0 + P: "DiffuseColor", "Color", "", "A",1,0,0 + P: "DiffuseFactor", "Number", "", "A",0.800000011920929 + P: "TransparencyFactor", "Number", "", "A",1 + P: "Emissive", "Vector3D", "Vector", "",0,0,0 + P: "Ambient", "Vector3D", "Vector", "",0,0,0 + P: "Diffuse", "Vector3D", "Vector", "",0.800000011920929,0,0 + P: "Opacity", "double", "Number", "",1 + } + } + AnimationStack: 1825586153728, "AnimStack::Take 001", "" { + Properties70: { + P: "LocalStart", "KTime", "Time", "",1924423250 + P: "LocalStop", "KTime", "Time", "",230930790000 + P: "ReferenceStart", "KTime", "Time", "",1924423250 + P: "ReferenceStop", "KTime", "Time", "",230930790000 + } + } + AnimationLayer: 1827070038960, "AnimLayer::BaseLayer", "" { + } +} + +; Object connections +;------------------------------------------------------------------ + +Connections: { + + ;Model::Cube2, Model::RootNode + C: "OO",1827098352032,0 + + ;Model::Cube3, Model::RootNode + C: "OO",1827098382192,0 + + ;AnimLayer::BaseLayer, AnimStack::Take 001 + C: "OO",1827070038960,1825586153728 + + ;Geometry::, Model::Cube2 + C: "OO",1827080157856,1827098352032 + + ;Material::Mat_Green, Model::Cube2 + C: "OO",1827074508720,1827098352032 + + ;Model::Cube1, Model::Cube2 + C: "OO",1827098379872,1827098352032 + + ;Geometry::, Model::Cube1 + C: "OO",1827080155296,1827098379872 + + ;Material::Mat_Green, Model::Cube1 + C: "OO",1827074508720,1827098379872 + + ;Geometry::, Model::Cube3 + C: "OO",1827080156320,1827098382192 + + ;Material::Mat_Red, Model::Cube3 + C: "OO",1827074501920,1827098382192 + + ;Model::Cube1, Model::Cube3 + C: "OO",1827098384512,1827098382192 + + ;Geometry::, Model::Cube1 + C: "OO",1827080139424,1827098384512 + + ;Material::Mat_Red, Model::Cube1 + C: "OO",1827074501920,1827098384512 +} +;Takes section +;---------------------------------------------------- + +Takes: { + Current: "Take 001" + Take: "Take 001" { + FileName: "Take_001.tak" + LocalTime: 1924423250,230930790000 + ReferenceTime: 1924423250,230930790000 + } +} diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index 55471c023..e597b23ff 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -188,6 +188,14 @@ TEST_F(utFBXImporterExporter, importCubesComplexTransform) { ASSERT_EQ(0u, parent->mNumChildren) << "Leaf node"; } +TEST_F(utFBXImporterExporter, importCloseToIdentityTransforms) { + Assimp::Importer importer; + // This was asserting in FBXConverter.cpp because the transforms appeared to be the identity by one test, but not by another. + // This asset should now load successfully. + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/close_to_identity_transforms.fbx", aiProcess_ValidateDataStructure); + ASSERT_TRUE(scene); +} + TEST_F( utFBXImporterExporter, importPhongMaterial ) { Assimp::Importer importer; const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/FBX/phong_cube.fbx", aiProcess_ValidateDataStructure ); From 181d3dd84fdcd8c3d6ee1e41daaea5dbe527d887 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Fri, 9 Aug 2019 15:28:14 +0100 Subject: [PATCH 074/320] Fix node chain bug. --- code/FBX/FBXConverter.cpp | 40 ++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/code/FBX/FBXConverter.cpp b/code/FBX/FBXConverter.cpp index 949ba0532..b6f15b457 100644 --- a/code/FBX/FBXConverter.cpp +++ b/code/FBX/FBXConverter.cpp @@ -684,30 +684,37 @@ namespace Assimp { bool ok; aiMatrix4x4 chain[TransformationComp_MAXIMUM]; + + ai_assert(TransformationComp_MAXIMUM < 32); + std::uint32_t chainBits = 0; + // A node won't need a node chain if it only has these. + const std::uint32_t chainMaskSimple = (1 << TransformationComp_Translation) + (1 << TransformationComp_Scaling) + (1 << TransformationComp_Rotation); + // A node will need a node chain if it has any of these. + const std::uint32_t chainMaskComplex = ((1 << (TransformationComp_MAXIMUM)) - 1) - chainMaskSimple; + std::fill_n(chain, static_cast(TransformationComp_MAXIMUM), aiMatrix4x4()); // generate transformation matrices for all the different transformation components const float zero_epsilon = 1e-6f; const aiVector3D all_ones(1.0f, 1.0f, 1.0f); - bool is_complex = false; const aiVector3D& PreRotation = PropertyGet(props, "PreRotation", ok); if (ok && PreRotation.SquareLength() > zero_epsilon) { - is_complex = true; + chainBits = chainBits | (1 << TransformationComp_PreRotation); GetRotationMatrix(Model::RotOrder::RotOrder_EulerXYZ, PreRotation, chain[TransformationComp_PreRotation]); } const aiVector3D& PostRotation = PropertyGet(props, "PostRotation", ok); if (ok && PostRotation.SquareLength() > zero_epsilon) { - is_complex = true; + chainBits = chainBits | (1 << TransformationComp_PostRotation); GetRotationMatrix(Model::RotOrder::RotOrder_EulerXYZ, PostRotation, chain[TransformationComp_PostRotation]); } const aiVector3D& RotationPivot = PropertyGet(props, "RotationPivot", ok); if (ok && RotationPivot.SquareLength() > zero_epsilon) { - is_complex = true; + chainBits = chainBits | (1 << TransformationComp_RotationPivot) | (1 << TransformationComp_RotationPivotInverse); aiMatrix4x4::Translation(RotationPivot, chain[TransformationComp_RotationPivot]); aiMatrix4x4::Translation(-RotationPivot, chain[TransformationComp_RotationPivotInverse]); @@ -715,21 +722,21 @@ namespace Assimp { const aiVector3D& RotationOffset = PropertyGet(props, "RotationOffset", ok); if (ok && RotationOffset.SquareLength() > zero_epsilon) { - is_complex = true; + chainBits = chainBits | (1 << TransformationComp_RotationOffset); aiMatrix4x4::Translation(RotationOffset, chain[TransformationComp_RotationOffset]); } const aiVector3D& ScalingOffset = PropertyGet(props, "ScalingOffset", ok); if (ok && ScalingOffset.SquareLength() > zero_epsilon) { - is_complex = true; + chainBits = chainBits | (1 << TransformationComp_ScalingOffset); aiMatrix4x4::Translation(ScalingOffset, chain[TransformationComp_ScalingOffset]); } const aiVector3D& ScalingPivot = PropertyGet(props, "ScalingPivot", ok); if (ok && ScalingPivot.SquareLength() > zero_epsilon) { - is_complex = true; + chainBits = chainBits | (1 << TransformationComp_ScalingPivot) | (1 << TransformationComp_ScalingPivotInverse); aiMatrix4x4::Translation(ScalingPivot, chain[TransformationComp_ScalingPivot]); aiMatrix4x4::Translation(-ScalingPivot, chain[TransformationComp_ScalingPivotInverse]); @@ -737,22 +744,28 @@ namespace Assimp { const aiVector3D& Translation = PropertyGet(props, "Lcl Translation", ok); if (ok && Translation.SquareLength() > zero_epsilon) { + chainBits = chainBits | (1 << TransformationComp_Translation); + aiMatrix4x4::Translation(Translation, chain[TransformationComp_Translation]); } const aiVector3D& Scaling = PropertyGet(props, "Lcl Scaling", ok); if (ok && (Scaling - all_ones).SquareLength() > zero_epsilon) { + chainBits = chainBits | (1 << TransformationComp_Scaling); + aiMatrix4x4::Scaling(Scaling, chain[TransformationComp_Scaling]); } const aiVector3D& Rotation = PropertyGet(props, "Lcl Rotation", ok); if (ok && Rotation.SquareLength() > zero_epsilon) { + chainBits = chainBits | (1 << TransformationComp_Rotation); + GetRotationMatrix(rot, Rotation, chain[TransformationComp_Rotation]); } const aiVector3D& GeometricScaling = PropertyGet(props, "GeometricScaling", ok); if (ok && (GeometricScaling - all_ones).SquareLength() > zero_epsilon) { - is_complex = true; + chainBits = chainBits | (1 << TransformationComp_GeometricScaling); aiMatrix4x4::Scaling(GeometricScaling, chain[TransformationComp_GeometricScaling]); aiVector3D GeometricScalingInverse = GeometricScaling; bool canscale = true; @@ -767,13 +780,14 @@ namespace Assimp { } } if (canscale) { + chainBits = chainBits | (1 << TransformationComp_GeometricScalingInverse); aiMatrix4x4::Scaling(GeometricScalingInverse, chain[TransformationComp_GeometricScalingInverse]); } } const aiVector3D& GeometricRotation = PropertyGet(props, "GeometricRotation", ok); if (ok && GeometricRotation.SquareLength() > zero_epsilon) { - is_complex = true; + chainBits = chainBits | (1 << TransformationComp_GeometricRotation) | (1 << TransformationComp_GeometricRotationInverse); GetRotationMatrix(rot, GeometricRotation, chain[TransformationComp_GeometricRotation]); GetRotationMatrix(rot, GeometricRotation, chain[TransformationComp_GeometricRotationInverse]); chain[TransformationComp_GeometricRotationInverse].Inverse(); @@ -781,7 +795,7 @@ namespace Assimp { const aiVector3D& GeometricTranslation = PropertyGet(props, "GeometricTranslation", ok); if (ok && GeometricTranslation.SquareLength() > zero_epsilon) { - is_complex = true; + chainBits = chainBits | (1 << TransformationComp_GeometricTranslation) | (1 << TransformationComp_GeometricTranslationInverse); aiMatrix4x4::Translation(GeometricTranslation, chain[TransformationComp_GeometricTranslation]); aiMatrix4x4::Translation(-GeometricTranslation, chain[TransformationComp_GeometricTranslationInverse]); } @@ -789,12 +803,12 @@ namespace Assimp { // is_complex needs to be consistent with NeedsComplexTransformationChain() // or the interplay between this code and the animation converter would // not be guaranteed. - ai_assert(NeedsComplexTransformationChain(model) == is_complex); + ai_assert(NeedsComplexTransformationChain(model) == ((chainBits & chainMaskComplex) != 0)); // now, if we have more than just Translation, Scaling and Rotation, // we need to generate a full node chain to accommodate for assimp's // lack to express pivots and offsets. - if (is_complex && doc.Settings().preservePivots) { + if ((chainBits & chainMaskComplex) && doc.Settings().preservePivots) { FBXImporter::LogInfo("generating full transformation chain for node: " + name); // query the anim_chain_bits dictionary to find out which chain elements @@ -807,7 +821,7 @@ namespace Assimp { for (size_t i = 0; i < TransformationComp_MAXIMUM; ++i, bit <<= 1) { const TransformationComp comp = static_cast(i); - if (chain[i].IsIdentity() && (anim_chain_bitmask & bit) == 0) { + if ((chainBits & bit) == 0 && (anim_chain_bitmask & bit) == 0) { continue; } From 3c7a608956d1504caffa3179f03ea1c0342f3a9a Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Fri, 9 Aug 2019 16:26:59 +0100 Subject: [PATCH 075/320] Add an include. --- code/FBX/FBXConverter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/code/FBX/FBXConverter.cpp b/code/FBX/FBXConverter.cpp index b6f15b457..fd7929e19 100644 --- a/code/FBX/FBXConverter.cpp +++ b/code/FBX/FBXConverter.cpp @@ -66,6 +66,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include namespace Assimp { From 4c1e8fe9c3b61d9fca5814e1c038985e83b3449a Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 9 Aug 2019 20:30:12 +0200 Subject: [PATCH 076/320] Update config.h.in closes https://github.com/assimp/assimp/issues/2570: fix a typo. --- include/assimp/config.h.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/assimp/config.h.in b/include/assimp/config.h.in index d08b929a1..dad43710e 100644 --- a/include/assimp/config.h.in +++ b/include/assimp/config.h.in @@ -142,7 +142,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** @brief Specifies the maximum angle that may be between two vertex tangents * that their tangents and bi-tangents are smoothed. * - * This applies to the CalcTangentSpace-Step. TFvhe angle is specified + * This applies to the CalcTangentSpace-Step. The angle is specified * in degrees. The maximum value is 175. * Property type: float. Default value: 45 degrees */ From 3d0775eebc0f2a86b87752385782e9b90c83279f Mon Sep 17 00:00:00 2001 From: ywang Date: Mon, 12 Aug 2019 18:10:43 -0700 Subject: [PATCH 077/320] respect export flag if aiJoinIdenticalVertices is not needed --- code/Common/Exporter.cpp | 5 ++- code/FBX/FBXExporter.cpp | 68 +++++++++++++++++++--------------------- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index 090b561ae..88bd9916f 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -472,7 +472,10 @@ aiReturn Exporter::Export( const aiScene* pScene, const char* pFormatId, const c } ExportProperties emptyProperties; // Never pass NULL ExportProperties so Exporters don't have to worry. - exp.mExportFunction(pPath,pimpl->mIOSystem.get(),scenecopy.get(), pProperties ? pProperties : &emptyProperties); + ExportProperties* pProp = pProperties ? (ExportProperties*)pProperties : &emptyProperties; + pProp->SetPropertyBool("bJoinIdenticalVertices", must_join_again); + exp.mExportFunction(pPath,pimpl->mIOSystem.get(),scenecopy.get(), pProp); + exp.mExportFunction(pPath,pimpl->mIOSystem.get(),scenecopy.get(), pProp); pimpl->mProgressHandler->UpdateFileWrite(4, 4); } catch (DeadlyExportError& err) { diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 8ebc8555a..0722a0fba 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -67,6 +67,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include // RESOURCES: // https://code.blender.org/2013/08/fbx-binary-file-format-specification/ @@ -1005,6 +1006,9 @@ void FBXExporter::WriteObjects () object_node.EndProperties(outstream, binary, indent); object_node.BeginChildren(outstream, binary, indent); + bool bJoinIdenticalVertices = mProperties->GetPropertyBool("bJoinIdenticalVertices", true); + std::vector> vVertexIndice;//save vertex_indices as it is needed later + // geometry (aiMesh) mesh_uids.clear(); indent = 1; @@ -1031,21 +1035,35 @@ void FBXExporter::WriteObjects () std::vector vertex_indices; // map of vertex value to its index in the data vector std::map index_by_vertex_value; - int32_t index = 0; - for (size_t vi = 0; vi < m->mNumVertices; ++vi) { - aiVector3D vtx = m->mVertices[vi]; - auto elem = index_by_vertex_value.find(vtx); - if (elem == index_by_vertex_value.end()) { - vertex_indices.push_back(index); - index_by_vertex_value[vtx] = index; - flattened_vertices.push_back(vtx[0]); - flattened_vertices.push_back(vtx[1]); - flattened_vertices.push_back(vtx[2]); - ++index; - } else { - vertex_indices.push_back(int32_t(elem->second)); + if(bJoinIdenticalVertices){ + int32_t index = 0; + for (size_t vi = 0; vi < m->mNumVertices; ++vi) { + aiVector3D vtx = m->mVertices[vi]; + auto elem = index_by_vertex_value.find(vtx); + if (elem == index_by_vertex_value.end()) { + vertex_indices.push_back(index); + index_by_vertex_value[vtx] = index; + flattened_vertices.push_back(vtx[0]); + flattened_vertices.push_back(vtx[1]); + flattened_vertices.push_back(vtx[2]); + ++index; + } else { + vertex_indices.push_back(int32_t(elem->second)); + } } } + else { // do not join vertex, respect the export flag + vertex_indices.resize(m->mNumVertices); + std::iota(vertex_indices.begin(), vertex_indices.end(), 0); + for(unsigned int v = 0; v < m->mNumVertices; ++ v) { + aiVector3D vtx = m->mVertices[v]; + flattened_vertices.push_back(vtx.x); + flattened_vertices.push_back(vtx.y); + flattened_vertices.push_back(vtx.z); + } + } + vVertexIndice.push_back(vertex_indices); + FBX::Node::WritePropertyNode( "Vertices", flattened_vertices, outstream, binary, indent ); @@ -1748,28 +1766,8 @@ void FBXExporter::WriteObjects () // connect it connections.emplace_back("C", "OO", deformer_uid, mesh_uids[mi]); - // we will be indexing by vertex... - // but there might be a different number of "vertices" - // between assimp and our output FBX. - // this code is cut-and-pasted from the geometry section above... - // ideally this should not be so. - // --- - // index of original vertex in vertex data vector - std::vector vertex_indices; - // map of vertex value to its index in the data vector - std::map index_by_vertex_value; - int32_t index = 0; - for (size_t vi = 0; vi < m->mNumVertices; ++vi) { - aiVector3D vtx = m->mVertices[vi]; - auto elem = index_by_vertex_value.find(vtx); - if (elem == index_by_vertex_value.end()) { - vertex_indices.push_back(index); - index_by_vertex_value[vtx] = index; - ++index; - } else { - vertex_indices.push_back(int32_t(elem->second)); - } - } + //computed before + std::vector& vertex_indices = vVertexIndice[mi]; // TODO, FIXME: this won't work if anything is not in the bind pose. // for now if such a situation is detected, we throw an exception. From 25dcef275888884e0121162c36db382763b246c4 Mon Sep 17 00:00:00 2001 From: Roger Date: Fri, 16 Aug 2019 00:11:12 -0400 Subject: [PATCH 078/320] Create FUNDING.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..f79fb0a95 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +patreon: assimp From 0400e0bc7fde9568f55e61735bd7cb03a6a8b524 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Fri, 16 Aug 2019 11:10:30 +0100 Subject: [PATCH 079/320] Multi-Config generators should also set the debug suffix when enabled Issue #2599 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 412628bbe..4f464ba46 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -341,7 +341,7 @@ SET( ASSIMP_BIN_INSTALL_DIR "bin" CACHE STRING get_cmake_property(is_multi_config GENERATOR_IS_MULTI_CONFIG) -IF (INJECT_DEBUG_POSTFIX AND (CMAKE_BUILD_TYPE STREQUAL "Debug")) +IF (INJECT_DEBUG_POSTFIX AND (is_multi_config OR CMAKE_BUILD_TYPE STREQUAL "Debug")) SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Debug Postfix for lib, samples and tools") ELSE() SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING "Debug Postfix for lib, samples and tools") From f69bf5f7edcb28d644ff5d6d785f9bd70d23453d Mon Sep 17 00:00:00 2001 From: Ghanshyam Bhutra Date: Fri, 16 Aug 2019 17:04:42 -0700 Subject: [PATCH 080/320] fix for div by zero reported by address sanitizer --- code/PostProcessing/CalcTangentsProcess.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/PostProcessing/CalcTangentsProcess.cpp b/code/PostProcessing/CalcTangentsProcess.cpp index b30f39c27..a3f7dd255 100644 --- a/code/PostProcessing/CalcTangentsProcess.cpp +++ b/code/PostProcessing/CalcTangentsProcess.cpp @@ -212,7 +212,7 @@ bool CalcTangentsProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) // project tangent and bitangent into the plane formed by the vertex' normal aiVector3D localTangent = tangent - meshNorm[p] * (tangent * meshNorm[p]); aiVector3D localBitangent = bitangent - meshNorm[p] * (bitangent * meshNorm[p]); - localTangent.Normalize(); localBitangent.Normalize(); + localTangent.NormalizeSafe(); localBitangent.NormalizeSafe(); // reconstruct tangent/bitangent according to normal and bitangent/tangent when it's infinite or NaN. bool invalid_tangent = is_special_float(localTangent.x) || is_special_float(localTangent.y) || is_special_float(localTangent.z); @@ -220,10 +220,10 @@ bool CalcTangentsProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) if (invalid_tangent != invalid_bitangent) { if (invalid_tangent) { localTangent = meshNorm[p] ^ localBitangent; - localTangent.Normalize(); + localTangent.NormalizeSafe(); } else { localBitangent = localTangent ^ meshNorm[p]; - localBitangent.Normalize(); + localBitangent.NormalizeSafe(); } } From 7ee7946dc56d4260affcb56b6322bf440f2fc40f Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 18 Aug 2019 09:40:13 +0200 Subject: [PATCH 081/320] Update scene.h use #include only if the compiler is used to compile c++ code. --- include/assimp/scene.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/assimp/scene.h b/include/assimp/scene.h index df5d6f3b5..2667db85b 100644 --- a/include/assimp/scene.h +++ b/include/assimp/scene.h @@ -56,9 +56,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "material.h" #include "anim.h" #include "metadata.h" -#include #ifdef __cplusplus +# include extern "C" { #endif From e5372fc385559d8223da5b4673fe9d5fdf63c1aa Mon Sep 17 00:00:00 2001 From: anandvsingh Date: Sun, 18 Aug 2019 15:44:38 +0200 Subject: [PATCH 082/320] Update CMakeLists.txt --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f464ba46..9bbf8bb50 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -173,7 +173,7 @@ SET (ASSIMP_VERSION ${ASSIMP_VERSION_MAJOR}.${ASSIMP_VERSION_MINOR}.${ASSIMP_VER SET (ASSIMP_SOVERSION 5) SET( ASSIMP_PACKAGE_VERSION "0" CACHE STRING "the package-specific version used for uploading the sources" ) - +set(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /MDd /Ob2") if(NOT HUNTER_ENABLED) # Enable C++11 support globally set_property( GLOBAL PROPERTY CXX_STANDARD 11 ) From 74685477e6276b4301eeaaf5fcc9830d3a1e02ec Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 19 Aug 2019 17:22:51 +0200 Subject: [PATCH 083/320] Update CMakeLists.txt Put it into the win32 for VS part. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9bbf8bb50..3ed9f6b56 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -173,7 +173,6 @@ SET (ASSIMP_VERSION ${ASSIMP_VERSION_MAJOR}.${ASSIMP_VERSION_MINOR}.${ASSIMP_VER SET (ASSIMP_SOVERSION 5) SET( ASSIMP_PACKAGE_VERSION "0" CACHE STRING "the package-specific version used for uploading the sources" ) -set(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /MDd /Ob2") if(NOT HUNTER_ENABLED) # Enable C++11 support globally set_property( GLOBAL PROPERTY CXX_STANDARD 11 ) @@ -254,6 +253,7 @@ ELSEIF(MSVC) IF(MSVC12) ADD_COMPILE_OPTIONS(/wd4351) ENDIF() + SET(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /MDd /Ob2") ELSEIF ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) IF(NOT HUNTER_ENABLED) SET(CMAKE_CXX_FLAGS "-fPIC -std=c++11 ${CMAKE_CXX_FLAGS}") From fbb34b1de159de772a6715acf9759acf11fcf543 Mon Sep 17 00:00:00 2001 From: Gordon MacPherson Date: Mon, 12 Aug 2019 19:17:07 +0100 Subject: [PATCH 084/320] ScaleProcess overhauled to improve compatibility with animations and unit conversion. ./assimp Added arguments --gs to assimp command line option to enable global scaling. No scaling for mScale of 1.0. Co-Authored-By: K. S. Ernest (iFire) Lee --- code/PostProcessing/ScaleProcess.cpp | 116 ++++++++++++++++++++++++--- code/PostProcessing/ScaleProcess.h | 13 ++- test/unit/TestModelFactory.h | 2 +- test/unit/utScaleProcess.cpp | 13 --- tools/assimp_cmd/Main.cpp | 4 + 5 files changed, 121 insertions(+), 27 deletions(-) diff --git a/code/PostProcessing/ScaleProcess.cpp b/code/PostProcessing/ScaleProcess.cpp index 6d458c4b1..36c59ecf5 100644 --- a/code/PostProcessing/ScaleProcess.cpp +++ b/code/PostProcessing/ScaleProcess.cpp @@ -39,19 +39,17 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -#ifndef ASSIMP_BUILD_NO_GLOBALSCALE_PROCESS - #include "ScaleProcess.h" #include #include + namespace Assimp { ScaleProcess::ScaleProcess() : BaseProcess() , mScale( AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT ) { - // empty } ScaleProcess::~ScaleProcess() { @@ -71,10 +69,15 @@ bool ScaleProcess::IsActive( unsigned int pFlags ) const { } void ScaleProcess::SetupProperties( const Importer* pImp ) { - mScale = pImp->GetPropertyFloat( AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY, 0 ); + mScale = pImp->GetPropertyFloat( AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY, 1.0f ); } void ScaleProcess::Execute( aiScene* pScene ) { + if(mScale == 1.0f) return; // nothing to scale + + ai_assert(mScale != 0); + ai_assert(nullptr != pScene && nullptr != pScene->mRootNode); + if ( nullptr == pScene ) { return; } @@ -82,22 +85,113 @@ void ScaleProcess::Execute( aiScene* pScene ) { if ( nullptr == pScene->mRootNode ) { return; } + + // Process animations and update position transform to new unit system + for( unsigned int animationID = 0; animationID < pScene->mNumAnimations; animationID++ ) + { + aiAnimation* animation = pScene->mAnimations[animationID]; + + for( unsigned int animationChannel = 0; animationChannel < animation->mNumChannels; animationChannel++) + { + aiNodeAnim* anim = animation->mChannels[animationChannel]; + + for( unsigned int posKey = 0; posKey < anim->mNumPositionKeys; posKey++) + { + aiVectorKey& vectorKey = anim->mPositionKeys[posKey]; + vectorKey.mValue *= mScale; + } + } + } + + for( unsigned int meshID = 0; meshID < pScene->mNumMeshes; meshID++) + { + aiMesh *mesh = pScene->mMeshes[meshID]; + + // Reconstruct mesh vertexes to the new unit system + for( unsigned int vertexID = 0; vertexID < mesh->mNumVertices; vertexID++) + { + aiVector3D& vertex = mesh->mVertices[vertexID]; + vertex *= mScale; + } + + + // bone placement / scaling + for( unsigned int boneID = 0; boneID < mesh->mNumBones; boneID++) + { + // Reconstruct matrix by transform rather than by scale + // This prevent scale values being changed which can + // be meaningful in some cases + // like when you want the modeller to see 1:1 compatibility. + aiBone* bone = mesh->mBones[boneID]; + + aiVector3D pos, scale; + aiQuaternion rotation; + + bone->mOffsetMatrix.Decompose( scale, rotation, pos); + + aiMatrix4x4 translation; + aiMatrix4x4::Translation( pos * mScale, translation ); + + aiMatrix4x4 scaling; + aiMatrix4x4::Scaling( aiVector3D(scale), scaling ); + + aiMatrix4x4 RotMatrix = aiMatrix4x4 (rotation.GetMatrix()); + + bone->mOffsetMatrix = translation * RotMatrix * scaling; + } + + + // animation mesh processing + // convert by position rather than scale. + for( unsigned int animMeshID = 0; animMeshID < mesh->mNumAnimMeshes; animMeshID++) + { + aiAnimMesh * animMesh = mesh->mAnimMeshes[animMeshID]; + + for( unsigned int vertexID = 0; vertexID < animMesh->mNumVertices; vertexID++) + { + aiVector3D& vertex = animMesh->mVertices[vertexID]; + vertex *= mScale; + } + } + } traverseNodes( pScene->mRootNode ); } -void ScaleProcess::traverseNodes( aiNode *node ) { +void ScaleProcess::traverseNodes( aiNode *node, unsigned int nested_node_id ) { applyScaling( node ); + + for( size_t i = 0; i < node->mNumChildren; i++) + { + // recurse into the tree until we are done! + traverseNodes( node->mChildren[i], nested_node_id+1 ); + } } void ScaleProcess::applyScaling( aiNode *currentNode ) { if ( nullptr != currentNode ) { - currentNode->mTransformation.a1 = currentNode->mTransformation.a1 * mScale; - currentNode->mTransformation.b2 = currentNode->mTransformation.b2 * mScale; - currentNode->mTransformation.c3 = currentNode->mTransformation.c3 * mScale; + // Reconstruct matrix by transform rather than by scale + // This prevent scale values being changed which can + // be meaningful in some cases + // like when you want the modeller to + // see 1:1 compatibility. + + aiVector3D pos, scale; + aiQuaternion rotation; + currentNode->mTransformation.Decompose( scale, rotation, pos); + + aiMatrix4x4 translation; + aiMatrix4x4::Translation( pos * mScale, translation ); + + aiMatrix4x4 scaling; + + // note: we do not use mScale here, this is on purpose. + aiMatrix4x4::Scaling( scale, scaling ); + + aiMatrix4x4 RotMatrix = aiMatrix4x4 (rotation.GetMatrix()); + + currentNode->mTransformation = translation * RotMatrix * scaling; } } -} // Namespace Assimp - -#endif // !! ASSIMP_BUILD_NO_GLOBALSCALE_PROCESS +} // Namespace Assimp \ No newline at end of file diff --git a/code/PostProcessing/ScaleProcess.h b/code/PostProcessing/ScaleProcess.h index 256737875..468a21673 100644 --- a/code/PostProcessing/ScaleProcess.h +++ b/code/PostProcessing/ScaleProcess.h @@ -39,7 +39,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -#pragma once +#ifndef SCALE_PROCESS_H_ +#define SCALE_PROCESS_H_ #include "Common/BaseProcess.h" @@ -53,6 +54,11 @@ namespace Assimp { // --------------------------------------------------------------------------- /** ScaleProcess: Class to rescale the whole model. + * Now rescales animations, bones, and blend shapes properly. + * Please note this will not write to 'scale' transform it will rewrite mesh + * and matrixes so that your scale values + * from your model package are preserved, so this is completely intentional + * bugs should be reported as soon as they are found. */ class ASSIMP_API ScaleProcess : public BaseProcess { public: @@ -78,7 +84,7 @@ public: virtual void Execute( aiScene* pScene ); private: - void traverseNodes( aiNode *currentNode ); + void traverseNodes( aiNode *currentNode, unsigned int nested_node_id = 0 ); void applyScaling( aiNode *currentNode ); private: @@ -86,3 +92,6 @@ private: }; } // Namespace Assimp + + +#endif // SCALE_PROCESS_H_ \ No newline at end of file diff --git a/test/unit/TestModelFactory.h b/test/unit/TestModelFactory.h index f1ef1701f..0e48fb744 100644 --- a/test/unit/TestModelFactory.h +++ b/test/unit/TestModelFactory.h @@ -89,7 +89,7 @@ public: scene->mMeshes[ 0 ]->mFaces[ 0 ].mIndices[ 1 ] = 1; scene->mMeshes[ 0 ]->mFaces[ 0 ].mIndices[ 2 ] = 2; - scene->mRootNode = new aiNode; + scene->mRootNode = new aiNode(); scene->mRootNode->mNumMeshes = 1; scene->mRootNode->mMeshes = new unsigned int[1]{ 0 }; diff --git a/test/unit/utScaleProcess.cpp b/test/unit/utScaleProcess.cpp index fe87daa8d..fd2773c24 100644 --- a/test/unit/utScaleProcess.cpp +++ b/test/unit/utScaleProcess.cpp @@ -69,18 +69,5 @@ TEST_F( utScaleProcess, accessScaleTest ) { EXPECT_FLOAT_EQ( 2.0f, process.getScale() ); } -TEST_F( utScaleProcess, rescaleModelTest ) { - float opacity; - aiScene *testScene = TestModelFacttory::createDefaultTestModel( opacity ); - ai_real v1 = testScene->mRootNode->mTransformation.a1; - ScaleProcess process; - process.setScale( 10.0f ); - process.Execute( testScene ); - ai_real v2 = testScene->mRootNode->mTransformation.a1; - const ai_real scale = v2 / v1; - EXPECT_FLOAT_EQ( scale, 10.0f ); - TestModelFacttory::releaseDefaultTestModel( &testScene ); -} - } // Namespace UnitTest } // Namespace Assimp diff --git a/tools/assimp_cmd/Main.cpp b/tools/assimp_cmd/Main.cpp index af372582c..9173a756b 100644 --- a/tools/assimp_cmd/Main.cpp +++ b/tools/assimp_cmd/Main.cpp @@ -384,6 +384,7 @@ int ProcessStandardArguments( // -om --optimize-meshes // -db --debone // -sbc --split-by-bone-count + // -gs --global-scale // // -c --config-file= @@ -472,6 +473,9 @@ int ProcessStandardArguments( else if (!strcmp(param, "-embtex") || ! strcmp(param, "--embed-textures")) { fill.ppFlags |= aiProcess_EmbedTextures; } + else if (!strcmp(param, "-gs") || ! strcmp(param, "--global-scale")) { + fill.ppFlags |= aiProcess_GlobalScale; + } else if (! strncmp( param, "-c",2) || ! strncmp( param, "--config=",9)) { const unsigned int ofs = (params[i][1] == '-' ? 9 : 2); From eb55a6a3cd5030e2c15037505b335fc5a9904ec8 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 19 Aug 2019 20:24:01 +0200 Subject: [PATCH 085/320] Update ScaleProcess.cpp Fix review findings. --- code/PostProcessing/ScaleProcess.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/code/PostProcessing/ScaleProcess.cpp b/code/PostProcessing/ScaleProcess.cpp index 36c59ecf5..2a605d6bc 100644 --- a/code/PostProcessing/ScaleProcess.cpp +++ b/code/PostProcessing/ScaleProcess.cpp @@ -73,10 +73,13 @@ void ScaleProcess::SetupProperties( const Importer* pImp ) { } void ScaleProcess::Execute( aiScene* pScene ) { - if(mScale == 1.0f) return; // nothing to scale + if(mScale == 1.0f) { + return; // nothing to scale + } - ai_assert(mScale != 0); - ai_assert(nullptr != pScene && nullptr != pScene->mRootNode); + ai_assert( mScale != 0 ); + ai_assert( nullptr != pScene ); + ai_assert( nullptr != pScene->mRootNode ); if ( nullptr == pScene ) { return; @@ -194,4 +197,4 @@ void ScaleProcess::applyScaling( aiNode *currentNode ) { } } -} // Namespace Assimp \ No newline at end of file +} // Namespace Assimp From 4bc5e8c2624af67943c893692a649d5768275266 Mon Sep 17 00:00:00 2001 From: Gordon MacPherson Date: Mon, 19 Aug 2019 19:31:56 +0100 Subject: [PATCH 086/320] Stop JoinVerticiesProcess removing bones from mesh as per #2596 Co-authored-by: K. S. Ernest (iFire) Lee --- code/PostProcessing/JoinVerticesProcess.cpp | 25 --------------------- 1 file changed, 25 deletions(-) diff --git a/code/PostProcessing/JoinVerticesProcess.cpp b/code/PostProcessing/JoinVerticesProcess.cpp index 914ec05b4..f121fc60d 100644 --- a/code/PostProcessing/JoinVerticesProcess.cpp +++ b/code/PostProcessing/JoinVerticesProcess.cpp @@ -431,31 +431,6 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) bone->mWeights = new aiVertexWeight[bone->mNumWeights]; memcpy( bone->mWeights, &newWeights[0], bone->mNumWeights * sizeof( aiVertexWeight)); } - else { - - /* NOTE: - * - * In the algorithm above we're assuming that there are no vertices - * with a different bone weight setup at the same position. That wouldn't - * make sense, but it is not absolutely impossible. SkeletonMeshBuilder - * for example generates such input data if two skeleton points - * share the same position. Again this doesn't make sense but is - * reality for some model formats (MD5 for example uses these special - * nodes as attachment tags for its weapons). - * - * Then it is possible that a bone has no weights anymore .... as a quick - * workaround, we're just removing these bones. If they're animated, - * model geometry might be modified but at least there's no risk of a crash. - */ - delete bone; - --pMesh->mNumBones; - for (unsigned int n = a; n < pMesh->mNumBones; ++n) { - pMesh->mBones[n] = pMesh->mBones[n+1]; - } - - --a; - ASSIMP_LOG_WARN("Removing bone -> no weights remaining"); - } } return pMesh->mNumVertices; } From b8d4ae5a7c01c0967088aee53c7d7ede12deecde Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Wed, 21 Aug 2019 15:54:14 +0100 Subject: [PATCH 087/320] Add git commit, original filename to DLL PE header Windows only --- code/res/assimp.rc | 4 ++-- revision.h.in | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/code/res/assimp.rc b/code/res/assimp.rc index 14ffdf4f5..daecf9cf5 100644 --- a/code/res/assimp.rc +++ b/code/res/assimp.rc @@ -52,8 +52,8 @@ BEGIN VALUE "FileDescription", "Open Asset Import Library" VALUE "FileVersion", VER_FILEVERSION VALUE "InternalName", "assimp " - VALUE "LegalCopyright", "Copyright (C) 2006-2010" - VALUE "OriginalFilename", "assimpNN.dll" + VALUE "LegalCopyright", "Copyright (C) 2006-2019" + VALUE "OriginalFilename", VER_ORIGINAL_FILENAME_STR VALUE "ProductName", "Open Asset Import Library" VALUE "ProductVersion", VER_FILEVERSION_STR ,0 diff --git a/revision.h.in b/revision.h.in index 0ad58feb7..2be06c56b 100644 --- a/revision.h.in +++ b/revision.h.in @@ -13,6 +13,16 @@ #define STR(x) STR_HELP(x) #define VER_FILEVERSION VER_MAJOR,VER_MINOR,VER_PATCH,VER_BUILD +#if (GitVersion == 0) #define VER_FILEVERSION_STR STR(VER_MAJOR) "." STR(VER_MINOR) "." STR(VER_PATCH) "." STR(VER_BUILD) +#else +#define VER_FILEVERSION_STR STR(VER_MAJOR) "." STR(VER_MINOR) "." STR(VER_PATCH) "." STR(VER_BUILD) " (Commit 0x@GIT_COMMIT_HASH@)" +#endif + +#ifdef NDEBUG +#define VER_ORIGINAL_FILENAME_STR "assimp@LIBRARY_SUFFIX@.dll" +#else +#define VER_ORIGINAL_FILENAME_STR "assimp@LIBRARY_SUFFIX@@CMAKE_DEBUG_POSTFIX@.dll" +#endif // NDEBUG #endif // ASSIMP_REVISION_H_INC From 0f6e95f19db4d981042504991ec924002f23b1c9 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Wed, 21 Aug 2019 16:07:51 +0100 Subject: [PATCH 088/320] Fix typo. githash canonically doesn't start 0x --- revision.h.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/revision.h.in b/revision.h.in index 2be06c56b..6d09afbc6 100644 --- a/revision.h.in +++ b/revision.h.in @@ -16,7 +16,7 @@ #if (GitVersion == 0) #define VER_FILEVERSION_STR STR(VER_MAJOR) "." STR(VER_MINOR) "." STR(VER_PATCH) "." STR(VER_BUILD) #else -#define VER_FILEVERSION_STR STR(VER_MAJOR) "." STR(VER_MINOR) "." STR(VER_PATCH) "." STR(VER_BUILD) " (Commit 0x@GIT_COMMIT_HASH@)" +#define VER_FILEVERSION_STR STR(VER_MAJOR) "." STR(VER_MINOR) "." STR(VER_PATCH) "." STR(VER_BUILD) " (Commit @GIT_COMMIT_HASH@)" #endif #ifdef NDEBUG From 0d29203e24a8bc2c75278931a6bd25b2ae5848de Mon Sep 17 00:00:00 2001 From: Gordon MacPherson Date: Wed, 21 Aug 2019 20:29:46 +0100 Subject: [PATCH 089/320] Prototype unit system for assimp generic enough to be used across formats. --- code/FBX/FBXImporter.cpp | 6 ++- code/PostProcessing/ScaleProcess.cpp | 10 ++++- include/assimp/BaseImporter.h | 62 +++++++++++++++++++++++++++- include/assimp/config.h.in | 7 ++++ 4 files changed, 82 insertions(+), 3 deletions(-) diff --git a/code/FBX/FBXImporter.cpp b/code/FBX/FBXImporter.cpp index ec8bbd2b4..6a851b9ee 100644 --- a/code/FBX/FBXImporter.cpp +++ b/code/FBX/FBXImporter.cpp @@ -189,8 +189,12 @@ void FBXImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS if (settings.convertToMeters) { unit = FbxUnit::m; } + // convert the FBX DOM to aiScene - ConvertToAssimpScene(pScene,doc, settings.removeEmptyBones, unit); + ConvertToAssimpScene(pScene, doc, settings.removeEmptyBones, unit); + + // Set file scale relative to meters + SetFileScale( doc.GlobalSettings().UnitScaleFactor() ); std::for_each(tokens.begin(),tokens.end(),Util::delete_fun()); } diff --git a/code/PostProcessing/ScaleProcess.cpp b/code/PostProcessing/ScaleProcess.cpp index 2a605d6bc..ac770c41f 100644 --- a/code/PostProcessing/ScaleProcess.cpp +++ b/code/PostProcessing/ScaleProcess.cpp @@ -43,7 +43,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include - +#include namespace Assimp { @@ -69,7 +69,15 @@ bool ScaleProcess::IsActive( unsigned int pFlags ) const { } void ScaleProcess::SetupProperties( const Importer* pImp ) { + // User scaling mScale = pImp->GetPropertyFloat( AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY, 1.0f ); + + // File scaling * Application Scaling + float importerScale = pImp->GetPropertyFloat( AI_CONFIG_APP_SCALE_KEY, 1.0f ); + + // apply scale to the scale + // helps prevent bugs with backward compatibility for anyone using normal scaling. + mScale *= importerScale; } void ScaleProcess::Execute( aiScene* pScene ) { diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index 48dfc8ed8..3244fd74f 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -48,8 +48,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#include #include #include +#include struct aiScene; struct aiImporterDesc; @@ -161,14 +163,72 @@ public: * some loader features. Importers must provide this information. */ virtual const aiImporterDesc* GetInfo() const = 0; + /** + * Will be called only by scale process when scaling is requested. + */ + virtual void SetFileScale(double scale) + { + fileScale = scale; + } + + virtual double GetFileScale() const + { + return fileScale; + } + + enum ImporterUnits { + M, + MM, + CM, + INCHES, + FEET + }; + + /** + * Assimp Importer + * unit conversions available + * if you need another measurment unit add it below. + * it's currently defined in assimp that we prefer meters. + * */ + std::map importerUnits = { + {ImporterUnits::M, 1}, + {ImporterUnits::CM, 0.01}, + {ImporterUnits::MM, 0.001}, + {ImporterUnits::INCHES, 0.0254}, + {ImporterUnits::FEET, 0.3048} + }; + + virtual void SetApplicationUnits( const ImporterUnits& unit ) + { + importerScale = importerUnits[unit]; + applicationUnits = unit; + } + + virtual const ImporterUnits& GetApplicationUnits() + { + return applicationUnits; + } + + /* Returns scale used by application called by ScaleProcess */ + const double GetImporterScale() + { + ai_assert(importerScale != 0); + ai_assert(fileScale != 0); + return importerScale * fileScale; + } + // ------------------------------------------------------------------- /** Called by #Importer::GetExtensionList for each loaded importer. * Take the extension list contained in the structure returned by * #GetInfo and insert all file extensions into the given set. * @param extension set to collect file extensions in*/ void GetExtensionList(std::set& extensions); + +protected: + ImporterUnits applicationUnits = ImporterUnits::M; + double importerScale = 1.0; + double fileScale = 1.0; -protected: // ------------------------------------------------------------------- /** Imports the given file into the given scene structure. The diff --git a/include/assimp/config.h.in b/include/assimp/config.h.in index dad43710e..3a6379bf4 100644 --- a/include/assimp/config.h.in +++ b/include/assimp/config.h.in @@ -999,6 +999,13 @@ enum aiComponent # define AI_CONFIG_GLOBAL_SCALE_FACTOR_DEFAULT 1.0f #endif // !! AI_DEBONE_THRESHOLD +#define AI_CONFIG_APP_SCALE_KEY "APP_SCALE_FACTOR" + +#if (!defined AI_CONFIG_APP_SCALE_KEY) +# define AI_CONFIG_APP_SCALE_KEY 1.0 +#endif // AI_CONFIG_APP_SCALE_KEY + + // ---------- All the Build/Compile-time defines ------------ /** @brief Specifies if double precision is supported inside assimp From ffc19790fbe802483044c982bd35c887b614255c Mon Sep 17 00:00:00 2001 From: Gordon MacPherson Date: Wed, 21 Aug 2019 22:22:23 +0100 Subject: [PATCH 090/320] Depreciated compiler which doesn't support standard features --- appveyor.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 851d9c096..3729ea028 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,7 +14,6 @@ matrix: fast_finish: true image: - - Visual Studio 2013 - Visual Studio 2015 - Visual Studio 2017 @@ -27,7 +26,6 @@ configuration: Release install: - set PATH=C:\Ruby24-x64\bin;%PATH% - set CMAKE_DEFINES -DASSIMP_WERROR=ON - - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2013" set CMAKE_GENERATOR_NAME=Visual Studio 12 2013 - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2015" set CMAKE_GENERATOR_NAME=Visual Studio 14 2015 - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2017" set CMAKE_GENERATOR_NAME=Visual Studio 15 2017 - if "%platform%"=="x64" set CMAKE_GENERATOR_NAME=%CMAKE_GENERATOR_NAME% Win64 From db8606ba5723bb26a3c0aa0698b43403e9f4a0fa Mon Sep 17 00:00:00 2001 From: Gordon MacPherson Date: Wed, 21 Aug 2019 23:32:31 +0100 Subject: [PATCH 091/320] Fix typo --- include/assimp/BaseImporter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index 3244fd74f..79a9b1b94 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -210,7 +210,7 @@ public: } /* Returns scale used by application called by ScaleProcess */ - const double GetImporterScale() + double GetImporterScale() const { ai_assert(importerScale != 0); ai_assert(fileScale != 0); From d923c8ce48a4f15afd19a2bd4406cfad0899f008 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 23 Aug 2019 19:16:20 +0200 Subject: [PATCH 092/320] Update FUNDING.yml add kofi --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index f79fb0a95..e750822ab 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1 +1,2 @@ patreon: assimp +ko_fi: kimkulling From d56198774e2ea38c293056d5f63bd10fd6e2fa9c Mon Sep 17 00:00:00 2001 From: Gordon MacPherson Date: Mon, 26 Aug 2019 20:37:49 +0100 Subject: [PATCH 093/320] Fix FBX units not being converted from CM to application scale --- code/FBX/FBXImporter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/FBX/FBXImporter.cpp b/code/FBX/FBXImporter.cpp index 6a851b9ee..09694a38f 100644 --- a/code/FBX/FBXImporter.cpp +++ b/code/FBX/FBXImporter.cpp @@ -193,8 +193,8 @@ void FBXImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS // convert the FBX DOM to aiScene ConvertToAssimpScene(pScene, doc, settings.removeEmptyBones, unit); - // Set file scale relative to meters - SetFileScale( doc.GlobalSettings().UnitScaleFactor() ); + // units is relative to CM :) we need it in meters for assimp + SetFileScale( doc.GlobalSettings().UnitScaleFactor() * 0.01f); std::for_each(tokens.begin(),tokens.end(),Util::delete_fun()); } From c50a4d8adef556fb8e9830436e5c55915eb37ab8 Mon Sep 17 00:00:00 2001 From: Gordon MacPherson Date: Mon, 26 Aug 2019 22:39:20 +0100 Subject: [PATCH 094/320] Fix segfault caused by FBX file with missing face #2614 --- code/FBX/FBXMeshGeometry.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/FBX/FBXMeshGeometry.cpp b/code/FBX/FBXMeshGeometry.cpp index e60fc25e2..169bf0029 100644 --- a/code/FBX/FBXMeshGeometry.cpp +++ b/code/FBX/FBXMeshGeometry.cpp @@ -610,8 +610,12 @@ void MeshGeometry::ReadVertexDataMaterials(std::vector& materials_out, cons const std::string& ReferenceInformationType) { const size_t face_count = m_faces.size(); - ai_assert(face_count); + if(face_count == 0) + { + return; + } + // materials are handled separately. First of all, they are assigned per-face // and not per polyvert. Secondly, ReferenceInformationType=IndexToDirect // has a slightly different meaning for materials. From 7e12257ebc98bfbeca275b000270415f3332869d Mon Sep 17 00:00:00 2001 From: Gordon MacPherson Date: Mon, 26 Aug 2019 22:44:25 +0100 Subject: [PATCH 095/320] Fix segfault #2614 --- code/FBX/FBXMeshGeometry.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/FBX/FBXMeshGeometry.cpp b/code/FBX/FBXMeshGeometry.cpp index e60fc25e2..5c9a0e309 100644 --- a/code/FBX/FBXMeshGeometry.cpp +++ b/code/FBX/FBXMeshGeometry.cpp @@ -610,7 +610,10 @@ void MeshGeometry::ReadVertexDataMaterials(std::vector& materials_out, cons const std::string& ReferenceInformationType) { const size_t face_count = m_faces.size(); - ai_assert(face_count); + if(face_count <= 0) + { + return; + } // materials are handled separately. First of all, they are assigned per-face // and not per polyvert. Secondly, ReferenceInformationType=IndexToDirect From ad971468efbf030f30a4da119fa645a2f2d5dd71 Mon Sep 17 00:00:00 2001 From: Gordon MacPherson Date: Tue, 27 Aug 2019 15:15:40 +0100 Subject: [PATCH 096/320] size_t cannot be less than 0 --- code/FBX/FBXMeshGeometry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/FBX/FBXMeshGeometry.cpp b/code/FBX/FBXMeshGeometry.cpp index 5c9a0e309..97ea0d344 100644 --- a/code/FBX/FBXMeshGeometry.cpp +++ b/code/FBX/FBXMeshGeometry.cpp @@ -610,7 +610,7 @@ void MeshGeometry::ReadVertexDataMaterials(std::vector& materials_out, cons const std::string& ReferenceInformationType) { const size_t face_count = m_faces.size(); - if(face_count <= 0) + if(face_count == 0) { return; } From abdd853ca57fb4ac020c3a16a41b85cbcf11b6c7 Mon Sep 17 00:00:00 2001 From: Gordon MacPherson Date: Tue, 27 Aug 2019 15:50:50 +0100 Subject: [PATCH 097/320] FIX missing update call for scale to post process --- code/Common/BaseImporter.cpp | 27 +++++++++++++++++++++++++-- code/FBX/FBXImporter.cpp | 10 +++++++--- include/assimp/BaseImporter.h | 15 ++++++--------- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index 0a5694aa0..de5018a25 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -76,9 +76,25 @@ BaseImporter::~BaseImporter() { // nothing to do here } +void BaseImporter::UpdateImporterScale( Importer* pImp ) +{ + ai_assert(pImp != nullptr); + ai_assert(importerScale != 0.0); + ai_assert(fileScale != 0.0); + + double activeScale = importerScale * fileScale; + + // Set active scaling + pImp->SetPropertyFloat( AI_CONFIG_APP_SCALE_KEY, activeScale); + + ASSIMP_LOG_DEBUG_F("UpdateImporterScale scale set: %f", activeScale ); +} + // ------------------------------------------------------------------------------------------------ // Imports the given file and returns the imported data. -aiScene* BaseImporter::ReadFile(const Importer* pImp, const std::string& pFile, IOSystem* pIOHandler) { +aiScene* BaseImporter::ReadFile(Importer* pImp, const std::string& pFile, IOSystem* pIOHandler) { + + m_progress = pImp->GetProgressHandler(); if (nullptr == m_progress) { return nullptr; @@ -100,6 +116,11 @@ aiScene* BaseImporter::ReadFile(const Importer* pImp, const std::string& pFile, { InternReadFile( pFile, sc.get(), &filter); + // Calculate import scale hook - required because pImp not available anywhere else + // passes scale into ScaleProcess + UpdateImporterScale(pImp); + + } catch( const std::exception& err ) { // extract error description m_ErrorText = err.what(); @@ -112,7 +133,7 @@ aiScene* BaseImporter::ReadFile(const Importer* pImp, const std::string& pFile, } // ------------------------------------------------------------------------------------------------ -void BaseImporter::SetupProperties(const Importer* /*pImp*/) +void BaseImporter::SetupProperties(const Importer* pImp) { // the default implementation does nothing } @@ -588,6 +609,8 @@ aiScene* BatchLoader::GetImport( unsigned int which ) return nullptr; } + + // ------------------------------------------------------------------------------------------------ void BatchLoader::LoadAll() { diff --git a/code/FBX/FBXImporter.cpp b/code/FBX/FBXImporter.cpp index 09694a38f..bd359dbf2 100644 --- a/code/FBX/FBXImporter.cpp +++ b/code/FBX/FBXImporter.cpp @@ -192,9 +192,13 @@ void FBXImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS // convert the FBX DOM to aiScene ConvertToAssimpScene(pScene, doc, settings.removeEmptyBones, unit); - - // units is relative to CM :) we need it in meters for assimp - SetFileScale( doc.GlobalSettings().UnitScaleFactor() * 0.01f); + + // size relative to cm + float size_relative_to_cm = doc.GlobalSettings().UnitScaleFactor(); + + // Set FBX file scale is relative to CM must be converted to M for + // assimp universal format (M) + SetFileScale( size_relative_to_cm * 0.01f); std::for_each(tokens.begin(),tokens.end(),Util::delete_fun()); } diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index 79a9b1b94..55f7fe375 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -82,6 +82,10 @@ class IOStream; class ASSIMP_API BaseImporter { friend class Importer; +private: + /* Pushes state into importer for the importer scale */ + virtual void UpdateImporterScale( Importer* pImp ); + public: /** Constructor to be privately used by #Importer */ @@ -134,7 +138,7 @@ public: * a suitable response to the caller. */ aiScene* ReadFile( - const Importer* pImp, + Importer* pImp, const std::string& pFile, IOSystem* pIOHandler ); @@ -209,14 +213,6 @@ public: return applicationUnits; } - /* Returns scale used by application called by ScaleProcess */ - double GetImporterScale() const - { - ai_assert(importerScale != 0); - ai_assert(fileScale != 0); - return importerScale * fileScale; - } - // ------------------------------------------------------------------- /** Called by #Importer::GetExtensionList for each loaded importer. * Take the extension list contained in the structure returned by @@ -230,6 +226,7 @@ protected: double fileScale = 1.0; + // ------------------------------------------------------------------- /** Imports the given file into the given scene structure. The * function is expected to throw an ImportErrorException if there is From 43cb76653b262c01379517947ace2799340aa809 Mon Sep 17 00:00:00 2001 From: Gordon MacPherson Date: Tue, 27 Aug 2019 15:54:12 +0100 Subject: [PATCH 098/320] Removed depreciated FBX Unit and scaling code --- code/FBX/FBXConverter.cpp | 50 ++++----------------------------------- code/FBX/FBXConverter.h | 19 ++------------- code/FBX/FBXImporter.cpp | 7 +----- 3 files changed, 7 insertions(+), 69 deletions(-) diff --git a/code/FBX/FBXConverter.cpp b/code/FBX/FBXConverter.cpp index fd7929e19..6717b592f 100644 --- a/code/FBX/FBXConverter.cpp +++ b/code/FBX/FBXConverter.cpp @@ -78,7 +78,7 @@ namespace Assimp { #define CONVERT_FBX_TIME(time) static_cast(time) / 46186158000L - FBXConverter::FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit ) + FBXConverter::FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones ) : defaultMaterialIndex() , lights() , cameras() @@ -90,8 +90,7 @@ namespace Assimp { , mNodeNames() , anim_fps() , out(out) - , doc(doc) - , mCurrentUnit(FbxUnit::cm) { + , doc(doc) { // animations need to be converted first since this will // populate the node_anim_chain_bits map, which is needed // to determine which nodes need to be generated. @@ -119,7 +118,6 @@ namespace Assimp { ConvertGlobalSettings(); TransferDataToScene(); - ConvertToUnitScale(unit); // if we didn't read any meshes set the AI_SCENE_FLAGS_INCOMPLETE // to make sure the scene passes assimp's validation. FBX files @@ -3537,46 +3535,6 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa out->mMetaData->Set(14, "CustomFrameRate", doc.GlobalSettings().CustomFrameRate()); } - void FBXConverter::ConvertToUnitScale( FbxUnit unit ) { - if (mCurrentUnit == unit) { - return; - } - - ai_real scale = 1.0; - if (mCurrentUnit == FbxUnit::cm) { - if (unit == FbxUnit::m) { - scale = (ai_real)0.01; - } else if (unit == FbxUnit::km) { - scale = (ai_real)0.00001; - } - } else if (mCurrentUnit == FbxUnit::m) { - if (unit == FbxUnit::cm) { - scale = (ai_real)100.0; - } else if (unit == FbxUnit::km) { - scale = (ai_real)0.001; - } - } else if (mCurrentUnit == FbxUnit::km) { - if (unit == FbxUnit::cm) { - scale = (ai_real)100000.0; - } else if (unit == FbxUnit::m) { - scale = (ai_real)1000.0; - } - } - - for (auto mesh : meshes) { - if (nullptr == mesh) { - continue; - } - - if (mesh->HasPositions()) { - for (unsigned int i = 0; i < mesh->mNumVertices; ++i) { - aiVector3D &pos = mesh->mVertices[i]; - pos *= scale; - } - } - } - } - void FBXConverter::TransferDataToScene() { ai_assert(!out->mMeshes); @@ -3630,9 +3588,9 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa } // ------------------------------------------------------------------------------------------------ - void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit) + void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones) { - FBXConverter converter(out, doc, removeEmptyBones, unit); + FBXConverter converter(out, doc, removeEmptyBones); } } // !FBX diff --git a/code/FBX/FBXConverter.h b/code/FBX/FBXConverter.h index fb1a87ca6..77ced1950 100644 --- a/code/FBX/FBXConverter.h +++ b/code/FBX/FBXConverter.h @@ -76,23 +76,13 @@ namespace Assimp { namespace FBX { class Document; - -enum class FbxUnit { - cm = 0, - m, - km, - NumUnits, - - Undefined -}; - /** * Convert a FBX #Document to #aiScene * @param out Empty scene to be populated * @param doc Parsed FBX document * @param removeEmptyBones Will remove bones, which do not have any references to vertices. */ -void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit); +void ConvertToAssimpScene(aiScene* out, const Document& doc, bool removeEmptyBones); /** Dummy class to encapsulate the conversion process */ class FBXConverter { @@ -123,7 +113,7 @@ public: }; public: - FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones, FbxUnit unit); + FBXConverter(aiScene* out, const Document& doc, bool removeEmptyBones); ~FBXConverter(); private: @@ -430,10 +420,6 @@ private: void ConvertGlobalSettings(); - // ------------------------------------------------------------------------------------------------ - // Will perform the conversion from a given unit to the requested unit. - void ConvertToUnitScale(FbxUnit unit); - // ------------------------------------------------------------------------------------------------ // copy generated meshes, animations, lights, cameras and textures to the output scene void TransferDataToScene(); @@ -470,7 +456,6 @@ private: aiScene* const out; const FBX::Document& doc; - FbxUnit mCurrentUnit; }; } diff --git a/code/FBX/FBXImporter.cpp b/code/FBX/FBXImporter.cpp index bd359dbf2..c8c1a6853 100644 --- a/code/FBX/FBXImporter.cpp +++ b/code/FBX/FBXImporter.cpp @@ -185,13 +185,8 @@ void FBXImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS // take the raw parse-tree and convert it to a FBX DOM Document doc(parser,settings); - FbxUnit unit(FbxUnit::cm); - if (settings.convertToMeters) { - unit = FbxUnit::m; - } - // convert the FBX DOM to aiScene - ConvertToAssimpScene(pScene, doc, settings.removeEmptyBones, unit); + ConvertToAssimpScene(pScene, doc, settings.removeEmptyBones); // size relative to cm float size_relative_to_cm = doc.GlobalSettings().UnitScaleFactor(); From afb24d7a1c7857b0293eb89ef669e8f38a0bec8d Mon Sep 17 00:00:00 2001 From: Daniel Bernar Date: Tue, 27 Aug 2019 19:33:12 +0300 Subject: [PATCH 099/320] Fix #2618 Added CXX flag -O3 for MinGW --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ed9f6b56..c1517e93c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -271,7 +271,7 @@ ELSEIF( CMAKE_COMPILER_IS_MINGW ) SET(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}") SET(CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}") ENDIF() - SET(CMAKE_CXX_FLAGS "-fvisibility=hidden -fno-strict-aliasing -Wall -Wno-long-long -Wa,-mbig-obj ${CMAKE_CXX_FLAGS}") + SET(CMAKE_CXX_FLAGS "-fvisibility=hidden -fno-strict-aliasing -Wall -Wno-long-long -Wa,-mbig-obj -O3 ${CMAKE_CXX_FLAGS}") SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}") ADD_DEFINITIONS( -U__STRICT_ANSI__ ) ENDIF() From a9d902946d3772f794b4d8a5e53e0778399e7c2f Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 08:01:00 +0200 Subject: [PATCH 100/320] fix inefficient check for 'Composition' emptiness --- code/AMF/AMFImporter_Postprocess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AMF/AMFImporter_Postprocess.cpp b/code/AMF/AMFImporter_Postprocess.cpp index 2bfe3f78c..1f20e1843 100644 --- a/code/AMF/AMFImporter_Postprocess.cpp +++ b/code/AMF/AMFImporter_Postprocess.cpp @@ -66,7 +66,7 @@ aiColor4D AMFImporter::SPP_Material::GetColor(const float /*pX*/, const float /* aiColor4D tcol; // Check if stored data are supported. - if(Composition.size() != 0) + if(!Composition.empty()) { throw DeadlyImportError("IME. GetColor for composition"); } From 9ad7ce11294e97b29f1ae0f9a864875d26775c55 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 08:02:08 +0200 Subject: [PATCH 101/320] prefer prefix ++ operator for non-primitive types --- code/AMF/AMFImporter_Postprocess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AMF/AMFImporter_Postprocess.cpp b/code/AMF/AMFImporter_Postprocess.cpp index 1f20e1843..2dbca7560 100644 --- a/code/AMF/AMFImporter_Postprocess.cpp +++ b/code/AMF/AMFImporter_Postprocess.cpp @@ -340,7 +340,7 @@ void AMFImporter::PostprocessHelper_SplitFacesByTextureID(std::list Date: Thu, 29 Aug 2019 08:02:51 +0200 Subject: [PATCH 102/320] prefer prefix ++ operator for non-primitive types --- code/AMF/AMFImporter_Postprocess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AMF/AMFImporter_Postprocess.cpp b/code/AMF/AMFImporter_Postprocess.cpp index 2dbca7560..799c17905 100644 --- a/code/AMF/AMFImporter_Postprocess.cpp +++ b/code/AMF/AMFImporter_Postprocess.cpp @@ -883,7 +883,7 @@ nl_clean_loop: if(node_list.size() > 1) { // walk through all nodes - for(std::list::iterator nl_it = node_list.begin(); nl_it != node_list.end(); nl_it++) + for(std::list::iterator nl_it = node_list.begin(); nl_it != node_list.end(); ++nl_it) { // and try to find them in another top nodes. std::list::const_iterator next_it = nl_it; From dbb498095d74b8b8f6cf507411e621d5c95ceaab Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 08:05:45 +0200 Subject: [PATCH 103/320] function parameter 'meshid' should be passed by const reference --- code/Collada/ColladaLoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Collada/ColladaLoader.cpp b/code/Collada/ColladaLoader.cpp index 6ef90c817..112ac189c 100644 --- a/code/Collada/ColladaLoader.cpp +++ b/code/Collada/ColladaLoader.cpp @@ -588,7 +588,7 @@ void ColladaLoader::BuildMeshesForNode(const ColladaParser& pParser, const Colla // ------------------------------------------------------------------------------------------------ // Find mesh from either meshes or morph target meshes -aiMesh *ColladaLoader::findMesh(std::string meshid) { +aiMesh *ColladaLoader::findMesh(const std::string& meshid) { for (unsigned int i = 0; i < mMeshes.size(); ++i) { if (std::string(mMeshes[i]->mName.data) == meshid) { return mMeshes[i]; From 30eb3c56c3d26722cc1b700bccca0a2aa5ee6b29 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 08:12:22 +0200 Subject: [PATCH 104/320] prefer prefix ++ operator for non-primitive types --- code/X3D/X3DImporter.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/X3D/X3DImporter.cpp b/code/X3D/X3DImporter.cpp index 96fcf067a..9f9105778 100644 --- a/code/X3D/X3DImporter.cpp +++ b/code/X3D/X3DImporter.cpp @@ -650,7 +650,7 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsArrCol4f(const int pAttrIdx, std::ve if(tlist.size() > 0) { pValue.reserve(tlist.size()); - for ( std::list::iterator it = tlist.begin(); it != tlist.end(); it++ ) + for ( std::list::iterator it = tlist.begin(); it != tlist.end(); ++it ) { pValue.push_back( *it ); } @@ -855,7 +855,7 @@ void X3DImporter::GeometryHelper_Extend_PolylineIdxToLineIdx(const std::list::const_iterator plit_next; - plit_next = plit, plit_next++; + plit_next = ++plit, plit_next; pLineCoordIdx.push_back(*plit);// second point of previous line. pLineCoordIdx.push_back(-1);// delimiter if((*plit_next == (-1)) || (plit_next == pPolylineCoordIdx.end())) break;// current polyline is finished @@ -1048,7 +1048,7 @@ void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::vector::const_iterator colidx_it = pColorIdx.begin(), coordidx_it = pCoordIdx.begin(); colidx_it != pColorIdx.end(); colidx_it++, coordidx_it++) + for(std::vector::const_iterator colidx_it = pColorIdx.begin(), coordidx_it = pCoordIdx.begin(); colidx_it != pColorIdx.end(); ++colidx_it, ++coordidx_it) { if ( *colidx_it == ( -1 ) ) { @@ -1134,7 +1134,7 @@ void X3DImporter::MeshGeometry_AddNormal(aiMesh& pMesh, const std::vector::const_iterator it = pNormals.begin(); it != pNormals.end(); it++ ) + for ( std::list::const_iterator it = pNormals.begin(); it != pNormals.end(); ++it ) { norm_arr_copy.push_back( *it ); } @@ -1147,7 +1147,7 @@ void X3DImporter::MeshGeometry_AddNormal(aiMesh& pMesh, const std::vector::const_iterator it = pNormalIdx.begin(); it != pNormalIdx.end(); it++) + for(std::vector::const_iterator it = pNormalIdx.begin(); it != pNormalIdx.end(); ++it) { if(*it != (-1)) tind.push_back(*it); } From 806bcf76b19e487bbf7ba7474a96a75d230096e6 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 08:23:09 +0200 Subject: [PATCH 105/320] fix inefficient checking for lists emptiness --- code/X3D/X3DImporter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/X3D/X3DImporter.cpp b/code/X3D/X3DImporter.cpp index 9f9105778..660db1a1a 100644 --- a/code/X3D/X3DImporter.cpp +++ b/code/X3D/X3DImporter.cpp @@ -1708,7 +1708,7 @@ void X3DImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSy for(size_t i = 0; i < pScene->mNumMeshes; i++) pScene->mMeshes[i] = *it++; } - if(mat_list.size() > 0) + if(!mat_list.empty()) { std::list::const_iterator it = mat_list.begin(); @@ -1717,7 +1717,7 @@ void X3DImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSy for(size_t i = 0; i < pScene->mNumMaterials; i++) pScene->mMaterials[i] = *it++; } - if(light_list.size() > 0) + if(!light_list.empty()) { std::list::const_iterator it = light_list.begin(); From 765c0e71f69886ad624da01f5aeaf25738c572ad Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 08:25:19 +0200 Subject: [PATCH 106/320] prefer prefix ++ operator for non-primitive types --- code/X3D/X3DImporter_Geometry3D.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/X3D/X3DImporter_Geometry3D.cpp b/code/X3D/X3DImporter_Geometry3D.cpp index 2eecc079d..f85f65756 100644 --- a/code/X3D/X3DImporter_Geometry3D.cpp +++ b/code/X3D/X3DImporter_Geometry3D.cpp @@ -157,7 +157,7 @@ void X3DImporter::ParseNode_Geometry3D_Cone() } // copy data from temp array - for(std::vector::iterator it = tvec.begin(); it != tvec.end(); it++) ((CX3DImporter_NodeElement_Geometry3D*)ne)->Vertices.push_back(*it); + for(std::vector::iterator it = tvec.begin(); it != tvec.end(); ++it) ((CX3DImporter_NodeElement_Geometry3D*)ne)->Vertices.push_back(*it); ((CX3DImporter_NodeElement_Geometry3D*)ne)->Solid = solid; ((CX3DImporter_NodeElement_Geometry3D*)ne)->NumIndices = 3; @@ -336,7 +336,7 @@ void X3DImporter::ParseNode_Geometry3D_ElevationGrid() aiVector3D tvec(xSpacing * xi, *he_it, zSpacing * zi); grid_alias.Vertices.push_back(tvec); - he_it++; + ++he_it; } } }// END: create grid vertices list @@ -977,7 +977,7 @@ void X3DImporter::ParseNode_Geometry3D_Sphere() StandardShapes::MakeSphere(tess, tlist); // copy data from temp array and apply scale - for(std::vector::iterator it = tlist.begin(); it != tlist.end(); it++) + for(std::vector::iterator it = tlist.begin(); it != tlist.end(); ++it) { ((CX3DImporter_NodeElement_Geometry3D*)ne)->Vertices.push_back(*it * radius); } From 7d8a25993bdec9e714c07bd7c258f2ec428cd863 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 08:29:30 +0200 Subject: [PATCH 107/320] prefer prefix ++ operator for non-primitive types --- code/X3D/X3DImporter_Postprocess.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/X3D/X3DImporter_Postprocess.cpp b/code/X3D/X3DImporter_Postprocess.cpp index e7686b41e..f960e5471 100644 --- a/code/X3D/X3DImporter_Postprocess.cpp +++ b/code/X3D/X3DImporter_Postprocess.cpp @@ -194,7 +194,7 @@ void X3DImporter::Postprocess_BuildMaterial(const CX3DImporter_NodeElement& pNod aiMaterial& taimat = **pMaterial;// creating alias for convenience. // at this point pNodeElement point to node. Walk through childs and add all stored data. - for(std::list::const_iterator el_it = pNodeElement.Child.begin(); el_it != pNodeElement.Child.end(); el_it++) + for(std::list::const_iterator el_it = pNodeElement.Child.begin(); el_it != pNodeElement.Child.end(); ++el_it) { if((*el_it)->Type == CX3DImporter_NodeElement::ENET_Material) { @@ -544,7 +544,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle vec_copy.reserve(((CX3DImporter_NodeElement_Coordinate*)*ch_it)->Value.size()); for(std::list::const_iterator it = ((CX3DImporter_NodeElement_Coordinate*)*ch_it)->Value.begin(); - it != ((CX3DImporter_NodeElement_Coordinate*)*ch_it)->Value.end(); it++) + it != ((CX3DImporter_NodeElement_Coordinate*)*ch_it)->Value.end(); ++it) { vec_copy.push_back(*it); } @@ -589,7 +589,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle } // copy additional information from children - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { ai_assert(*pMesh); if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Color) @@ -779,7 +779,7 @@ void X3DImporter::Postprocess_CollectMetadata(const CX3DImporter_NodeElement& pN // copy collected metadata to output node. pSceneNode.mMetaData = aiMetadata::Alloc( static_cast(meta_list.size()) ); meta_idx = 0; - for(std::list::const_iterator it = meta_list.begin(); it != meta_list.end(); it++, meta_idx++) + for(std::list::const_iterator it = meta_list.begin(); it != meta_list.end(); ++it, ++meta_idx) { CX3DImporter_NodeElement_Meta* cur_meta = (CX3DImporter_NodeElement_Meta*)*it; From 60f2535dcd9556655dc4fd8469c7019b64d65891 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 08:30:24 +0200 Subject: [PATCH 108/320] fix inefficient check for 'SceneNode_Mesh' emptiness --- code/X3D/X3DImporter_Postprocess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Postprocess.cpp b/code/X3D/X3DImporter_Postprocess.cpp index f960e5471..95e408f83 100644 --- a/code/X3D/X3DImporter_Postprocess.cpp +++ b/code/X3D/X3DImporter_Postprocess.cpp @@ -686,7 +686,7 @@ void X3DImporter::Postprocess_BuildNode(const CX3DImporter_NodeElement& pNodeEle for(size_t i = 0; i < pSceneNode.mNumChildren; i++) pSceneNode.mChildren[i] = *it++; } - if(SceneNode_Mesh.size() > 0) + if(!SceneNode_Mesh.empty()) { std::list::const_iterator it = SceneNode_Mesh.begin(); From 43865e6bc9533ae617afac1d60ff12f018d8d442 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 08:34:18 +0200 Subject: [PATCH 109/320] fix inefficient checking for 'url' emptiness --- code/X3D/X3DImporter_Texturing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Texturing.cpp b/code/X3D/X3DImporter_Texturing.cpp index b4e42025a..2eaf3e6bc 100644 --- a/code/X3D/X3DImporter_Texturing.cpp +++ b/code/X3D/X3DImporter_Texturing.cpp @@ -89,7 +89,7 @@ void X3DImporter::ParseNode_Texturing_ImageTexture() ((CX3DImporter_NodeElement_ImageTexture*)ne)->RepeatS = repeatS; ((CX3DImporter_NodeElement_ImageTexture*)ne)->RepeatT = repeatT; // Attribute "url" can contain list of strings. But we need only one - first. - if(url.size() > 0) + if(!url.empty()) ((CX3DImporter_NodeElement_ImageTexture*)ne)->URL = url.front(); else ((CX3DImporter_NodeElement_ImageTexture*)ne)->URL = ""; From 8e90bf8381f6bf7ad01adc002c82e1e7d407ecc1 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 08:43:09 +0200 Subject: [PATCH 110/320] fix inefficient checking for lists emptiness --- code/AMF/AMFImporter_Postprocess.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AMF/AMFImporter_Postprocess.cpp b/code/AMF/AMFImporter_Postprocess.cpp index 799c17905..ef2c50371 100644 --- a/code/AMF/AMFImporter_Postprocess.cpp +++ b/code/AMF/AMFImporter_Postprocess.cpp @@ -346,7 +346,7 @@ void AMFImporter::PostprocessHelper_SplitFacesByTextureID(std::list 0) pOutputList_Separated.push_back(face_list_cur); - } while(pInputList.size() > 0); + } while(!pInputList.empty()); } void AMFImporter::Postprocess_AddMetadata(const std::list& metadataList, aiNode& sceneNode) const @@ -907,7 +907,7 @@ nl_clean_loop: // // // Nodes - if(node_list.size() > 0) + if(!node_list.empty()) { std::list::const_iterator nl_it = node_list.begin(); From f1e0c460eda033ed25e2484a18bfd6fe88f62e27 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 08:43:56 +0200 Subject: [PATCH 111/320] Prefer prefix ++ operator for non-primitive types --- code/AMF/AMFImporter_Postprocess.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AMF/AMFImporter_Postprocess.cpp b/code/AMF/AMFImporter_Postprocess.cpp index ef2c50371..344c4eb59 100644 --- a/code/AMF/AMFImporter_Postprocess.cpp +++ b/code/AMF/AMFImporter_Postprocess.cpp @@ -888,8 +888,8 @@ nl_clean_loop: // and try to find them in another top nodes. std::list::const_iterator next_it = nl_it; - next_it++; - for(; next_it != node_list.end(); next_it++) + ++next_it; + for(; next_it != node_list.end(); ++next_it) { if((*next_it)->FindNode((*nl_it)->mName) != nullptr) { From 789e8abfe85b92b97f4a14991db854e81640af7b Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 08:44:49 +0200 Subject: [PATCH 112/320] prefer prefix ++ operator for non-primitive types --- code/Collada/ColladaLoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Collada/ColladaLoader.cpp b/code/Collada/ColladaLoader.cpp index 112ac189c..0fbc7d599 100644 --- a/code/Collada/ColladaLoader.cpp +++ b/code/Collada/ColladaLoader.cpp @@ -688,7 +688,7 @@ aiMesh* ColladaLoader::CreateMesh(const ColladaParser& pParser, const Collada::M Collada::MorphMethod method = Collada::Normalized; for (std::map::const_iterator it = pParser.mControllerLibrary.begin(); - it != pParser.mControllerLibrary.end(); it++) { + it != pParser.mControllerLibrary.end(); ++it) { const Collada::Controller &c = it->second; const Collada::Mesh* baseMesh = pParser.ResolveLibraryReference(pParser.mMeshLibrary, c.mMeshId); From ffb30fbc85e83e523c97a1b4340adc811614605b Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 09:02:19 +0200 Subject: [PATCH 113/320] prefer prefix ++ operator for non-primitive types --- code/X3D/X3DExporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DExporter.cpp b/code/X3D/X3DExporter.cpp index 9839e6ca6..e5eeb0886 100644 --- a/code/X3D/X3DExporter.cpp +++ b/code/X3D/X3DExporter.cpp @@ -68,7 +68,7 @@ aiMatrix4x4 out_matr; } // multiplicate all matrices in reverse order - for(std::list::reverse_iterator rit = matr.rbegin(); rit != matr.rend(); rit++) out_matr = out_matr * (*rit); + for(std::list::reverse_iterator rit = matr.rbegin(); rit != matr.rend(); ++rit) out_matr = out_matr * (*rit); return out_matr; } From b1f8f6ae3b77166118b32ff2bd31176a829dc5d1 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 09:04:27 +0200 Subject: [PATCH 114/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/X3D/X3DImporter.cpp b/code/X3D/X3DImporter.cpp index 660db1a1a..46bf4e62a 100644 --- a/code/X3D/X3DImporter.cpp +++ b/code/X3D/X3DImporter.cpp @@ -182,7 +182,7 @@ bool X3DImporter::FindNodeElement_FromNode(CX3DImporter_NodeElement* pStartNode, }// if((pStartNode->Type() == pType) && (pStartNode->ID() == pID)) // Check childs of pStartNode. - for(std::list::iterator ch_it = pStartNode->Child.begin(); ch_it != pStartNode->Child.end(); ch_it++) + for(std::list::iterator ch_it = pStartNode->Child.begin(); ch_it != pStartNode->Child.end(); ++ch_it) { found = FindNodeElement_FromNode(*ch_it, pID, pType, pElement); if ( found ) @@ -687,7 +687,7 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsArrVec2f(const int pAttrIdx, std::ve if(tlist.size() > 0) { pValue.reserve(tlist.size()); - for ( std::list::iterator it = tlist.begin(); it != tlist.end(); it++ ) + for ( std::list::iterator it = tlist.begin(); it != tlist.end(); ++it ) { pValue.push_back( *it ); } @@ -823,7 +823,7 @@ void X3DImporter::GeometryHelper_Extend_PointToLine(const std::list& std::list::const_iterator pit = pPoint.begin(); std::list::const_iterator pit_last = pPoint.end(); - pit_last--; + --pit_last; if ( pPoint.size() < 2 ) { @@ -1031,7 +1031,7 @@ void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::vector::const_iterator it = pColors.begin(); it != pColors.end(); it++ ) + for ( std::list::const_iterator it = pColors.begin(); it != pColors.end(); ++it ) { col_arr_copy.push_back( *it ); } @@ -1291,7 +1291,7 @@ void X3DImporter::MeshGeometry_AddTexCoord(aiMesh& pMesh, const std::list::const_iterator it = pTexCoords.begin(); it != pTexCoords.end(); it++ ) + for ( std::list::const_iterator it = pTexCoords.begin(); it != pTexCoords.end(); ++it ) { tc_arr_copy.push_back( aiVector3D( ( *it ).x, ( *it ).y, 0 ) ); } From 805fda3df8e45ab0faee31547a183a76d06907fd Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 09:05:15 +0200 Subject: [PATCH 115/320] possible inefficient checking for 'NodeElement_List' emptiness --- code/X3D/X3DImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter.cpp b/code/X3D/X3DImporter.cpp index 46bf4e62a..c245e3454 100644 --- a/code/X3D/X3DImporter.cpp +++ b/code/X3D/X3DImporter.cpp @@ -136,7 +136,7 @@ X3DImporter::~X3DImporter() { void X3DImporter::Clear() { NodeElement_Cur = nullptr; // Delete all elements - if(NodeElement_List.size()) { + if(!NodeElement_List.empty()) { for ( std::list::iterator it = NodeElement_List.begin(); it != NodeElement_List.end(); it++ ) { delete *it; } From 438b0705082bcba45c3742f5ecad84ddc25e6e0a Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:22:50 +0200 Subject: [PATCH 116/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Geometry2D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Geometry2D.cpp b/code/X3D/X3DImporter_Geometry2D.cpp index b29c80b04..c72f5d76c 100644 --- a/code/X3D/X3DImporter_Geometry2D.cpp +++ b/code/X3D/X3DImporter_Geometry2D.cpp @@ -399,7 +399,7 @@ void X3DImporter::ParseNode_Geometry2D_Polypoint2D() if(!def.empty()) ne->ID = def; // convert vec2 to vec3 - for(std::list::iterator it2 = point.begin(); it2 != point.end(); it2++) + for(std::list::iterator it2 = point.begin(); it2 != point.end(); ++it2) { ((CX3DImporter_NodeElement_Geometry2D*)ne)->Vertices.push_back(aiVector3D(it2->x, it2->y, 0)); } From eadbc89a1ffd99edd14929f08d8dd7ceb813b523 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:23:27 +0200 Subject: [PATCH 117/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Geometry3D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Geometry3D.cpp b/code/X3D/X3DImporter_Geometry3D.cpp index f85f65756..d639a6e1c 100644 --- a/code/X3D/X3DImporter_Geometry3D.cpp +++ b/code/X3D/X3DImporter_Geometry3D.cpp @@ -226,7 +226,7 @@ void X3DImporter::ParseNode_Geometry3D_Cylinder() // copy data from temp arrays std::list& vlist = ((CX3DImporter_NodeElement_Geometry3D*)ne)->Vertices;// just short alias. - for(std::vector::iterator it = tside.begin(); it != tside.end(); it++) vlist.push_back(*it); + for(std::vector::iterator it = tside.begin(); it != tside.end(); ++it) vlist.push_back(*it); if(top) { From f009c216b663d7a27f4aa10170920d664fa65112 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:24:58 +0200 Subject: [PATCH 118/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Postprocess.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/X3D/X3DImporter_Postprocess.cpp b/code/X3D/X3DImporter_Postprocess.cpp index 95e408f83..e19cc98d9 100644 --- a/code/X3D/X3DImporter_Postprocess.cpp +++ b/code/X3D/X3DImporter_Postprocess.cpp @@ -273,7 +273,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle std::vector tarr; tarr.reserve(tnemesh.Vertices.size()); - for(std::list::iterator it = tnemesh.Vertices.begin(); it != tnemesh.Vertices.end(); it++) tarr.push_back(*it); + for(std::list::iterator it = tnemesh.Vertices.begin(); it != tnemesh.Vertices.end(); ++it) tarr.push_back(*it); *pMesh = StandardShapes::MakeMesh(tarr, static_cast(tnemesh.NumIndices));// create mesh from vertices using Assimp help. @@ -642,13 +642,13 @@ void X3DImporter::Postprocess_BuildNode(const CX3DImporter_NodeElement& pNodeEle for(size_t i = 0; i < (size_t)tne_group.Choice; i++) chit_begin++;// forward iterator to chosen node. chit_end = chit_begin; - chit_end++;// point end iterator to next element after chosen node. + ++chit_end;// point end iterator to next element after chosen node. } }// if(tne_group.UseChoice) }// if(pNodeElement.Type == CX3DImporter_NodeElement::ENET_Group) // Reserve memory for fast access and check children. - for(std::list::const_iterator it = chit_begin; it != chit_end; it++) + for(std::list::const_iterator it = chit_begin; it != chit_end; ++it) {// in this loop we do not read metadata because it's already read at begin. if((*it)->Type == CX3DImporter_NodeElement::ENET_Group) { @@ -706,7 +706,7 @@ void X3DImporter::Postprocess_BuildShape(const CX3DImporter_NodeElement_Shape& p CX3DImporter_NodeElement::EType mesh_type = CX3DImporter_NodeElement::ENET_Invalid; unsigned int mat_ind = 0; - for(std::list::const_iterator it = pShapeNodeElement.Child.begin(); it != pShapeNodeElement.Child.end(); it++) + for(std::list::const_iterator it = pShapeNodeElement.Child.begin(); it != pShapeNodeElement.Child.end(); ++it) { if(PostprocessHelper_ElementIsMesh((*it)->Type)) { From 0d173151666d70836da239fe8c9ff0e662ccc0ec Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:25:38 +0200 Subject: [PATCH 119/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Rendering.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Rendering.cpp b/code/X3D/X3DImporter_Rendering.cpp index d0c58030d..9317a449a 100644 --- a/code/X3D/X3DImporter_Rendering.cpp +++ b/code/X3D/X3DImporter_Rendering.cpp @@ -956,7 +956,7 @@ void X3DImporter::ParseNode_Rendering_TriangleStripSet() ne_alias.CoordIndex.clear(); coord_num_sb = 0; - for(std::vector::const_iterator vc_it = ne_alias.VertexCount.begin(); vc_it != ne_alias.VertexCount.end(); vc_it++) + for(std::vector::const_iterator vc_it = ne_alias.VertexCount.begin(); vc_it != ne_alias.VertexCount.end(); ++vc_it) { if(*vc_it < 3) throw DeadlyImportError("TriangleStripSet. stripCount shall be greater than or equal to three."); From ebb061d89c71986991f50ae997146055b59ec54f Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:29:24 +0200 Subject: [PATCH 120/320] fix inefficient check for 'mNodeElement_List' emptiness --- code/AMF/AMFImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AMF/AMFImporter.cpp b/code/AMF/AMFImporter.cpp index d173bd0f5..dedb6dcdd 100644 --- a/code/AMF/AMFImporter.cpp +++ b/code/AMF/AMFImporter.cpp @@ -83,7 +83,7 @@ void AMFImporter::Clear() mMaterial_Converted.clear(); mTexture_Converted.clear(); // Delete all elements - if(mNodeElement_List.size()) + if(!mNodeElement_List.empty()) { for(CAMFImporter_NodeElement* ne: mNodeElement_List) { delete ne; } From 65ba0c4b46bb4dfa3a9e867ae37c5b6f4e4c7780 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:30:50 +0200 Subject: [PATCH 121/320] fix inefficient checking for lists emptiness --- code/AMF/AMFImporter_Postprocess.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/AMF/AMFImporter_Postprocess.cpp b/code/AMF/AMFImporter_Postprocess.cpp index 344c4eb59..9e92f8860 100644 --- a/code/AMF/AMFImporter_Postprocess.cpp +++ b/code/AMF/AMFImporter_Postprocess.cpp @@ -321,7 +321,7 @@ void AMFImporter::PostprocessHelper_SplitFacesByTextureID(std::list mesh_idx; }// for(const CAMFImporter_NodeElement* ne_child: pNodeElement.Child) // if meshes was created then assign new indices with current aiNode - if(mesh_idx.size() > 0) + if(!mesh_idx.empty()) { std::list::const_iterator mit = mesh_idx.begin(); @@ -924,7 +924,7 @@ nl_clean_loop: // // Meshes - if(mesh_list.size() > 0) + if(!mesh_list.empty()) { std::list::const_iterator ml_it = mesh_list.begin(); From 02444be25185e955e3fb72123abf24db42e8cf23 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:36:09 +0200 Subject: [PATCH 122/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/X3D/X3DImporter.cpp b/code/X3D/X3DImporter.cpp index c245e3454..b8f1c6bec 100644 --- a/code/X3D/X3DImporter.cpp +++ b/code/X3D/X3DImporter.cpp @@ -137,7 +137,7 @@ void X3DImporter::Clear() { NodeElement_Cur = nullptr; // Delete all elements if(!NodeElement_List.empty()) { - for ( std::list::iterator it = NodeElement_List.begin(); it != NodeElement_List.end(); it++ ) { + for ( std::list::iterator it = NodeElement_List.begin(); it != NodeElement_List.end(); ++it ) { delete *it; } NodeElement_List.clear(); @@ -151,7 +151,7 @@ void X3DImporter::Clear() { bool X3DImporter::FindNodeElement_FromRoot(const std::string& pID, const CX3DImporter_NodeElement::EType pType, CX3DImporter_NodeElement** pElement) { - for(std::list::iterator it = NodeElement_List.begin(); it != NodeElement_List.end(); it++) + for(std::list::iterator it = NodeElement_List.begin(); it != NodeElement_List.end(); ++it) { if(((*it)->Type == pType) && ((*it)->ID == pID)) { @@ -617,7 +617,7 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsArrCol3f(const int pAttrIdx, std::ve if(tlist.size() > 0) { pValue.reserve(tlist.size()); - for(std::list::iterator it = tlist.begin(); it != tlist.end(); it++) pValue.push_back(*it); + for(std::list::iterator it = tlist.begin(); it != tlist.end(); ++it) pValue.push_back(*it); } } @@ -725,7 +725,7 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsArrVec3f(const int pAttrIdx, std::ve if(tlist.size() > 0) { pValue.reserve(tlist.size()); - for ( std::list::iterator it = tlist.begin(); it != tlist.end(); it++ ) + for ( std::list::iterator it = tlist.begin(); it != tlist.end(); ++it ) { pValue.push_back( *it ); } @@ -910,7 +910,7 @@ void X3DImporter::GeometryHelper_CoordIdxStr2FacesArr(const std::vector pFaces.reserve(f_data.size() / 3); inds.reserve(4); //PrintVectorSet("build. ci", pCoordIdx); - for(std::vector::iterator it = f_data.begin(); it != f_data.end(); it++) + for(std::vector::iterator it = f_data.begin(); it != f_data.end(); ++it) { // when face is got count how many indices in it. if(*it == (-1)) @@ -957,7 +957,7 @@ void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::list tcol; // create RGBA array from RGB. - for(std::list::const_iterator it = pColors.begin(); it != pColors.end(); it++) tcol.push_back(aiColor4D((*it).r, (*it).g, (*it).b, 1)); + for(std::list::const_iterator it = pColors.begin(); it != pColors.end(); ++it) tcol.push_back(aiColor4D((*it).r, (*it).g, (*it).b, 1)); // call existing function for adding RGBA colors MeshGeometry_AddColor(pMesh, tcol, pColorPerVertex); @@ -997,7 +997,7 @@ void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::list tcol; // create RGBA array from RGB. - for ( std::list::const_iterator it = pColors.begin(); it != pColors.end(); it++ ) + for ( std::list::const_iterator it = pColors.begin(); it != pColors.end(); ++it ) { tcol.push_back( aiColor4D( ( *it ).r, ( *it ).g, ( *it ).b, 1 ) ); } From 44d7cb8177d732501d52fc7a2fb9b4a02565a168 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:37:19 +0200 Subject: [PATCH 123/320] possible inefficient checking for lists emptiness --- code/X3D/X3DImporter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/X3D/X3DImporter.cpp b/code/X3D/X3DImporter.cpp index b8f1c6bec..46ac2a2b3 100644 --- a/code/X3D/X3DImporter.cpp +++ b/code/X3D/X3DImporter.cpp @@ -722,7 +722,7 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsArrVec3f(const int pAttrIdx, std::ve XML_ReadNode_GetAttrVal_AsListVec3f(pAttrIdx, tlist);// read as list // and copy to array - if(tlist.size() > 0) + if(!tlist.empty()) { pValue.reserve(tlist.size()); for ( std::list::iterator it = tlist.begin(); it != tlist.end(); ++it ) @@ -1699,7 +1699,7 @@ void X3DImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSy // create nodes tree Postprocess_BuildNode(*NodeElement_Cur, *pScene->mRootNode, mesh_list, mat_list, light_list); // copy needed data to scene - if(mesh_list.size() > 0) + if(!mesh_list.empty()) { std::list::const_iterator it = mesh_list.begin(); From 69fce64b9ca2a4d006c63cc8d748878d25be4f76 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:40:31 +0200 Subject: [PATCH 124/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Geometry2D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Geometry2D.cpp b/code/X3D/X3DImporter_Geometry2D.cpp index c72f5d76c..f25d801c8 100644 --- a/code/X3D/X3DImporter_Geometry2D.cpp +++ b/code/X3D/X3DImporter_Geometry2D.cpp @@ -500,7 +500,7 @@ void X3DImporter::ParseNode_Geometry2D_TriangleSet2D() if(!def.empty()) ne->ID = def; // convert vec2 to vec3 - for(std::list::iterator it2 = vertices.begin(); it2 != vertices.end(); it2++) + for(std::list::iterator it2 = vertices.begin(); it2 != vertices.end(); ++it2) { ((CX3DImporter_NodeElement_Geometry2D*)ne)->Vertices.push_back(aiVector3D(it2->x, it2->y, 0)); } From b363fa388373568901f3817cc66b415807f11225 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:41:00 +0200 Subject: [PATCH 125/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Geometry3D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Geometry3D.cpp b/code/X3D/X3DImporter_Geometry3D.cpp index d639a6e1c..8eae3e771 100644 --- a/code/X3D/X3DImporter_Geometry3D.cpp +++ b/code/X3D/X3DImporter_Geometry3D.cpp @@ -239,7 +239,7 @@ void X3DImporter::ParseNode_Geometry3D_Cylinder() if(bottom) { - for(std::vector::iterator it = tcir.begin(); it != tcir.end(); it++) + for(std::vector::iterator it = tcir.begin(); it != tcir.end(); ++it) { (*it).y = -height;// y - because circle made in oXZ. vlist.push_back(*it); From cca81e877a6373a9b479b1656b4d9786b8639b27 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:41:34 +0200 Subject: [PATCH 126/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Postprocess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Postprocess.cpp b/code/X3D/X3DImporter_Postprocess.cpp index e19cc98d9..d3af49c9f 100644 --- a/code/X3D/X3DImporter_Postprocess.cpp +++ b/code/X3D/X3DImporter_Postprocess.cpp @@ -81,7 +81,7 @@ aiMatrix4x4 X3DImporter::PostprocessHelper_Matrix_GlobalToCurrent() const } // multiplicate all matrices in reverse order - for(std::list::reverse_iterator rit = matr.rbegin(); rit != matr.rend(); rit++) out_matr = out_matr * (*rit); + for(std::list::reverse_iterator rit = matr.rbegin(); rit != matr.rend(); ++rit) out_matr = out_matr * (*rit); return out_matr; } From 2f53d42d457ebffdd8a3d4ac67861cdbb64db007 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:42:09 +0200 Subject: [PATCH 127/320] fix inefficient checking for 'SceneNode_Child' emptiness --- code/X3D/X3DImporter_Postprocess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Postprocess.cpp b/code/X3D/X3DImporter_Postprocess.cpp index d3af49c9f..328789576 100644 --- a/code/X3D/X3DImporter_Postprocess.cpp +++ b/code/X3D/X3DImporter_Postprocess.cpp @@ -677,7 +677,7 @@ void X3DImporter::Postprocess_BuildNode(const CX3DImporter_NodeElement& pNodeEle }// for(std::list::const_iterator it = chit_begin; it != chit_end; it++) // copy data about children and meshes to aiNode. - if(SceneNode_Child.size() > 0) + if(!SceneNode_Child.empty()) { std::list::const_iterator it = SceneNode_Child.begin(); From ba3e4ae89227a5670f7fc59785884429bcc2b01e Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:42:47 +0200 Subject: [PATCH 128/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Rendering.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Rendering.cpp b/code/X3D/X3DImporter_Rendering.cpp index 9317a449a..b6cbb2499 100644 --- a/code/X3D/X3DImporter_Rendering.cpp +++ b/code/X3D/X3DImporter_Rendering.cpp @@ -519,7 +519,7 @@ void X3DImporter::ParseNode_Rendering_IndexedTriangleStripSet() ne_alias.CoordIndex.clear(); int counter = 0; int32_t idx[3]; - for(std::vector::const_iterator idx_it = index.begin(); idx_it != index.end(); idx_it++) + for(std::vector::const_iterator idx_it = index.begin(); idx_it != index.end(); ++idx_it) { idx[2] = *idx_it; if (idx[2] < 0) From a044852938dfb1e5f6eb166c7406ef0f20210386 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:44:19 +0200 Subject: [PATCH 129/320] fix inefficient checking for lists emptiness --- code/AMF/AMFImporter_Postprocess.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AMF/AMFImporter_Postprocess.cpp b/code/AMF/AMFImporter_Postprocess.cpp index 9e92f8860..37478d9ec 100644 --- a/code/AMF/AMFImporter_Postprocess.cpp +++ b/code/AMF/AMFImporter_Postprocess.cpp @@ -344,7 +344,7 @@ void AMFImporter::PostprocessHelper_SplitFacesByTextureID(std::list 0) pOutputList_Separated.push_back(face_list_cur); + if(!face_list_cur.empty()) pOutputList_Separated.push_back(face_list_cur); } while(!pInputList.empty()); } @@ -787,7 +787,7 @@ std::list ch_node; }// for(const CAMFImporter_NodeElement* ne: pConstellation.Child) // copy found aiNode's as children - if(ch_node.size() == 0) throw DeadlyImportError(" must have at least one ."); + if(ch_node.empty()) throw DeadlyImportError(" must have at least one ."); size_t ch_idx = 0; From 75fed8340d9c3d72392b954d7b902bc8c8dcea6a Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:46:50 +0200 Subject: [PATCH 130/320] fix function declaration --- code/FBX/FBXExporter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/FBX/FBXExporter.h b/code/FBX/FBXExporter.h index 71fb55c57..1ae727eda 100644 --- a/code/FBX/FBXExporter.h +++ b/code/FBX/FBXExporter.h @@ -156,7 +156,7 @@ namespace Assimp void WriteAnimationCurveNode( StreamWriterLE& outstream, int64_t uid, - std::string name, // "T", "R", or "S" + const std::string& name, // "T", "R", or "S" aiVector3D default_value, std::string property_name, // "Lcl Translation" etc int64_t animation_layer_uid, From e8ae086b3595434b11265d53ab408c14a7219c66 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:48:51 +0200 Subject: [PATCH 131/320] fix function definition --- code/FBX/FBXExporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 8ebc8555a..5816a2ce1 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -2435,7 +2435,7 @@ void FBXExporter::WriteModelNodes( void FBXExporter::WriteAnimationCurveNode( StreamWriterLE& outstream, int64_t uid, - std::string name, // "T", "R", or "S" + const std::string& name, // "T", "R", or "S" aiVector3D default_value, std::string property_name, // "Lcl Translation" etc int64_t layer_uid, From 3ef0860f3087077a5d1f2109d6259d6029340eea Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:54:21 +0200 Subject: [PATCH 132/320] prefer prefix ++/-- operators for non-primitive types --- code/Importer/IFC/IFCGeometry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Importer/IFC/IFCGeometry.cpp b/code/Importer/IFC/IFCGeometry.cpp index 032030112..d1c7aee19 100644 --- a/code/Importer/IFC/IFCGeometry.cpp +++ b/code/Importer/IFC/IFCGeometry.cpp @@ -128,7 +128,7 @@ void ProcessPolygonBoundaries(TempMesh& result, const TempMesh& inmesh, size_t m outer_polygon_it = begin + master_bounds; } else { - for(iit = begin; iit != end; iit++) { + for(iit = begin; iit != end; ++iit) { // find the polygon with the largest area and take it as the outer bound. IfcVector3& n = normals[std::distance(begin,iit)]; const IfcFloat area = n.SquareLength(); From b3788039dfe99d73197b454a5c3353e16dde7afb Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:55:09 +0200 Subject: [PATCH 133/320] prefer prefix ++/-- operators for non-primitive types --- code/Obj/ObjFileParser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/Obj/ObjFileParser.cpp b/code/Obj/ObjFileParser.cpp index 97ef4af70..699aafe6a 100644 --- a/code/Obj/ObjFileParser.cpp +++ b/code/Obj/ObjFileParser.cpp @@ -244,8 +244,8 @@ void ObjFileParser::copyNextWord(char *pBuffer, size_t length) { size_t index = 0; m_DataIt = getNextWord(m_DataIt, m_DataItEnd); if ( *m_DataIt == '\\' ) { - m_DataIt++; - m_DataIt++; + ++m_DataIt; + ++m_DataIt; m_DataIt = getNextWord( m_DataIt, m_DataItEnd ); } while( m_DataIt != m_DataItEnd && !IsSpaceOrNewLine( *m_DataIt ) ) { From aec4726d217393307f13275493e38ea348c0a856 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:56:21 +0200 Subject: [PATCH 134/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/X3D/X3DImporter.cpp b/code/X3D/X3DImporter.cpp index 46ac2a2b3..04589fd95 100644 --- a/code/X3D/X3DImporter.cpp +++ b/code/X3D/X3DImporter.cpp @@ -837,7 +837,7 @@ void X3DImporter::GeometryHelper_Extend_PointToLine(const std::list& { pLine.push_back(*pit);// second point of previous line pLine.push_back(*pit);// first point of next line - pit++; + ++pit; } // add last point of last line pLine.push_back(*pit); @@ -1121,7 +1121,7 @@ void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::vector::const_iterator it = col_tgt_arr.begin(); it != col_tgt_arr.end(); it++) col_tgt_list.push_back(*it); + for(std::vector::const_iterator it = col_tgt_arr.begin(); it != col_tgt_arr.end(); ++it) col_tgt_list.push_back(*it); // add prepared colors list to mesh. MeshGeometry_AddColor(pMesh, col_tgt_list, pColorPerVertex); } @@ -1227,7 +1227,7 @@ void X3DImporter::MeshGeometry_AddNormal(aiMesh& pMesh, const std::list Date: Thu, 29 Aug 2019 10:56:58 +0200 Subject: [PATCH 135/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Geometry2D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Geometry2D.cpp b/code/X3D/X3DImporter_Geometry2D.cpp index f25d801c8..350fd6c40 100644 --- a/code/X3D/X3DImporter_Geometry2D.cpp +++ b/code/X3D/X3DImporter_Geometry2D.cpp @@ -356,7 +356,7 @@ void X3DImporter::ParseNode_Geometry2D_Polyline2D() std::list tlist; // convert vec2 to vec3 - for(std::list::iterator it2 = lineSegments.begin(); it2 != lineSegments.end(); it2++) tlist.push_back(aiVector3D(it2->x, it2->y, 0)); + for(std::list::iterator it2 = lineSegments.begin(); it2 != lineSegments.end(); ++it2) tlist.push_back(aiVector3D(it2->x, it2->y, 0)); // convert point set to line set GeometryHelper_Extend_PointToLine(tlist, ((CX3DImporter_NodeElement_Geometry2D*)ne)->Vertices); From 340611785a1aca42368d56c0514a686aaf08765f Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:57:23 +0200 Subject: [PATCH 136/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Geometry3D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Geometry3D.cpp b/code/X3D/X3DImporter_Geometry3D.cpp index 8eae3e771..9716f78d1 100644 --- a/code/X3D/X3DImporter_Geometry3D.cpp +++ b/code/X3D/X3DImporter_Geometry3D.cpp @@ -153,7 +153,7 @@ void X3DImporter::ParseNode_Geometry3D_Cone() { StandardShapes::MakeCircle(bottomRadius, tess, tvec); height = -(height / 2); - for(std::vector::iterator it = tvec.begin(); it != tvec.end(); it++) it->y = height;// y - because circle made in oXZ. + for(std::vector::iterator it = tvec.begin(); it != tvec.end(); ++it) it->y = height;// y - because circle made in oXZ. } // copy data from temp array From 946d64282b8acd3fdecedf3ba5651e93b7ad79bd Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 10:58:01 +0200 Subject: [PATCH 137/320] fix inefficient checking for 'url' emptiness --- code/X3D/X3DImporter_Networking.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Networking.cpp b/code/X3D/X3DImporter_Networking.cpp index 89010ae08..a7a200675 100644 --- a/code/X3D/X3DImporter_Networking.cpp +++ b/code/X3D/X3DImporter_Networking.cpp @@ -93,7 +93,7 @@ void X3DImporter::ParseNode_Networking_Inline() // at this place new group mode created and made current, so we can name it. if(!def.empty()) NodeElement_Cur->ID = def; - if(load && (url.size() > 0)) + if(load && !url.empty()) { std::string full_path = mpIOHandler->CurrentDirectory() + url.front(); From 89079ead1226b8562852cdcb1ad016601271048e Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 11:44:41 +0200 Subject: [PATCH 138/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Postprocess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Postprocess.cpp b/code/X3D/X3DImporter_Postprocess.cpp index 328789576..8fcdbb9d6 100644 --- a/code/X3D/X3DImporter_Postprocess.cpp +++ b/code/X3D/X3DImporter_Postprocess.cpp @@ -639,7 +639,7 @@ void X3DImporter::Postprocess_BuildNode(const CX3DImporter_NodeElement& pNodeEle } else { - for(size_t i = 0; i < (size_t)tne_group.Choice; i++) chit_begin++;// forward iterator to chosen node. + for(size_t i = 0; i < (size_t)tne_group.Choice; i++) ++chit_begin;// forward iterator to chosen node. chit_end = chit_begin; ++chit_end;// point end iterator to next element after chosen node. From 2d0d2374c1b10589ea22ae540404ba371a404d49 Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 12:00:44 +0200 Subject: [PATCH 139/320] fix ColladaLoader::findMesh() declaration --- code/Collada/ColladaLoader.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Collada/ColladaLoader.h b/code/Collada/ColladaLoader.h index 92f390f17..dce46e06f 100644 --- a/code/Collada/ColladaLoader.h +++ b/code/Collada/ColladaLoader.h @@ -120,7 +120,7 @@ protected: void BuildMeshesForNode( const ColladaParser& pParser, const Collada::Node* pNode, aiNode* pTarget); - aiMesh *findMesh(std::string meshid); + aiMesh *findMesh(const std::string& meshid); /** Creates a mesh for the given ColladaMesh face subset and returns the newly created mesh */ aiMesh* CreateMesh( const ColladaParser& pParser, const Collada::Mesh* pSrcMesh, const Collada::SubMesh& pSubMesh, From de51122639a96b8ff0c76cf0752e559c919418cf Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 29 Aug 2019 12:09:56 +0200 Subject: [PATCH 140/320] fix regression --- code/X3D/X3DImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter.cpp b/code/X3D/X3DImporter.cpp index 04589fd95..365761cf6 100644 --- a/code/X3D/X3DImporter.cpp +++ b/code/X3D/X3DImporter.cpp @@ -855,7 +855,7 @@ void X3DImporter::GeometryHelper_Extend_PolylineIdxToLineIdx(const std::list::const_iterator plit_next; - plit_next = ++plit, plit_next; + plit_next = plit, ++plit_next; pLineCoordIdx.push_back(*plit);// second point of previous line. pLineCoordIdx.push_back(-1);// delimiter if((*plit_next == (-1)) || (plit_next == pPolylineCoordIdx.end())) break;// current polyline is finished From 01d0f06d3a464eee2d6fb38c6744c40d67d809b5 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Fri, 30 Aug 2019 11:42:23 +0100 Subject: [PATCH 141/320] Make IsVerbose accessible outside the exporter --- code/Common/Exporter.cpp | 30 +---------------------- code/PostProcessing/MakeVerboseFormat.cpp | 29 ++++++++++++++++++++++ code/PostProcessing/MakeVerboseFormat.h | 7 ++++++ 3 files changed, 37 insertions(+), 29 deletions(-) diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index 090b561ae..6ee2e2c57 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -315,34 +315,6 @@ const aiExportDataBlob* Exporter::ExportToBlob( const aiScene* pScene, const cha return pimpl->blob; } -// ------------------------------------------------------------------------------------------------ -bool IsVerboseFormat(const aiMesh* mesh) { - // avoid slow vector specialization - std::vector seen(mesh->mNumVertices,0); - for(unsigned int i = 0; i < mesh->mNumFaces; ++i) { - const aiFace& f = mesh->mFaces[i]; - for(unsigned int j = 0; j < f.mNumIndices; ++j) { - if(++seen[f.mIndices[j]] == 2) { - // found a duplicate index - return false; - } - } - } - - return true; -} - -// ------------------------------------------------------------------------------------------------ -bool IsVerboseFormat(const aiScene* pScene) { - for(unsigned int i = 0; i < pScene->mNumMeshes; ++i) { - if(!IsVerboseFormat(pScene->mMeshes[i])) { - return false; - } - } - - return true; -} - // ------------------------------------------------------------------------------------------------ aiReturn Exporter::Export( const aiScene* pScene, const char* pFormatId, const char* pPath, unsigned int pPreprocessing, const ExportProperties* pProperties) { @@ -352,7 +324,7 @@ aiReturn Exporter::Export( const aiScene* pScene, const char* pFormatId, const c // format. They will likely not be aware that there is a flag in the scene to indicate // this, however. To avoid surprises and bug reports, we check for duplicates in // meshes upfront. - const bool is_verbose_format = !(pScene->mFlags & AI_SCENE_FLAGS_NON_VERBOSE_FORMAT) || IsVerboseFormat(pScene); + const bool is_verbose_format = !(pScene->mFlags & AI_SCENE_FLAGS_NON_VERBOSE_FORMAT) || MakeVerboseFormatProcess::IsVerboseFormat(pScene); pimpl->mProgressHandler->UpdateFileWrite(0, 4); diff --git a/code/PostProcessing/MakeVerboseFormat.cpp b/code/PostProcessing/MakeVerboseFormat.cpp index 50ff5ed93..41f50a5ba 100644 --- a/code/PostProcessing/MakeVerboseFormat.cpp +++ b/code/PostProcessing/MakeVerboseFormat.cpp @@ -224,3 +224,32 @@ bool MakeVerboseFormatProcess::MakeVerboseFormat(aiMesh* pcMesh) } return (pcMesh->mNumVertices != iOldNumVertices); } + + +// ------------------------------------------------------------------------------------------------ +bool IsMeshInVerboseFormat(const aiMesh* mesh) { + // avoid slow vector specialization + std::vector seen(mesh->mNumVertices,0); + for(unsigned int i = 0; i < mesh->mNumFaces; ++i) { + const aiFace& f = mesh->mFaces[i]; + for(unsigned int j = 0; j < f.mNumIndices; ++j) { + if(++seen[f.mIndices[j]] == 2) { + // found a duplicate index + return false; + } + } + } + + return true; +} + +// ------------------------------------------------------------------------------------------------ +bool MakeVerboseFormatProcess::IsVerboseFormat(const aiScene* pScene) { + for(unsigned int i = 0; i < pScene->mNumMeshes; ++i) { + if(!IsMeshInVerboseFormat(pScene->mMeshes[i])) { + return false; + } + } + + return true; +} diff --git a/code/PostProcessing/MakeVerboseFormat.h b/code/PostProcessing/MakeVerboseFormat.h index 1adf8e2f6..8565d5933 100644 --- a/code/PostProcessing/MakeVerboseFormat.h +++ b/code/PostProcessing/MakeVerboseFormat.h @@ -94,6 +94,13 @@ public: * @param pScene The imported data to work at. */ void Execute( aiScene* pScene); +public: + + // ------------------------------------------------------------------- + /** Checks whether the scene is already in verbose format. + * @param pScene The data to check. + * @return true if the scene is already in verbose format. */ + static bool IsVerboseFormat(const aiScene* pScene); private: From c1d4ed7873bf51e271d30a92fcd595efdf994086 Mon Sep 17 00:00:00 2001 From: escherstair Date: Tue, 3 Sep 2019 07:55:27 +0200 Subject: [PATCH 142/320] prefer prefix ++/-- operators for non-primitive types --- code/AMF/AMFImporter_Postprocess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AMF/AMFImporter_Postprocess.cpp b/code/AMF/AMFImporter_Postprocess.cpp index 37478d9ec..79b5e15e2 100644 --- a/code/AMF/AMFImporter_Postprocess.cpp +++ b/code/AMF/AMFImporter_Postprocess.cpp @@ -334,7 +334,7 @@ void AMFImporter::PostprocessHelper_SplitFacesByTextureID(std::list Date: Tue, 3 Sep 2019 07:56:37 +0200 Subject: [PATCH 143/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter.cpp b/code/X3D/X3DImporter.cpp index 365761cf6..dcf6092ca 100644 --- a/code/X3D/X3DImporter.cpp +++ b/code/X3D/X3DImporter.cpp @@ -1241,7 +1241,7 @@ void X3DImporter::MeshGeometry_AddTexCoord(aiMesh& pMesh, const std::vector::const_iterator it = pTexCoords.begin(); it != pTexCoords.end(); it++) + for(std::list::const_iterator it = pTexCoords.begin(); it != pTexCoords.end(); ++it) { texcoord_arr_copy.push_back(aiVector3D((*it).x, (*it).y, 0)); } From 53d795c1c923cb9fafb07389df68ea85e8518c03 Mon Sep 17 00:00:00 2001 From: escherstair Date: Tue, 3 Sep 2019 07:57:08 +0200 Subject: [PATCH 144/320] possible inefficient checking for 'tlist' emptiness --- code/X3D/X3DImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter.cpp b/code/X3D/X3DImporter.cpp index dcf6092ca..0d48d00b7 100644 --- a/code/X3D/X3DImporter.cpp +++ b/code/X3D/X3DImporter.cpp @@ -684,7 +684,7 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsArrVec2f(const int pAttrIdx, std::ve XML_ReadNode_GetAttrVal_AsListVec2f(pAttrIdx, tlist);// read as list // and copy to array - if(tlist.size() > 0) + if(!tlist.empty()) { pValue.reserve(tlist.size()); for ( std::list::iterator it = tlist.begin(); it != tlist.end(); ++it ) From 75993ad653d99c343b412d7b6059d919712a9529 Mon Sep 17 00:00:00 2001 From: escherstair Date: Tue, 3 Sep 2019 07:57:58 +0200 Subject: [PATCH 145/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Geometry3D.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Geometry3D.cpp b/code/X3D/X3DImporter_Geometry3D.cpp index 9716f78d1..e12cbd3ab 100644 --- a/code/X3D/X3DImporter_Geometry3D.cpp +++ b/code/X3D/X3DImporter_Geometry3D.cpp @@ -230,7 +230,7 @@ void X3DImporter::ParseNode_Geometry3D_Cylinder() if(top) { - for(std::vector::iterator it = tcir.begin(); it != tcir.end(); it++) + for(std::vector::iterator it = tcir.begin(); it != tcir.end(); ++it) { (*it).y = height;// y - because circle made in oXZ. vlist.push_back(*it); From 33e71ee8df9327130ec5f91b4fe997ab502e0f46 Mon Sep 17 00:00:00 2001 From: escherstair Date: Tue, 3 Sep 2019 07:59:17 +0200 Subject: [PATCH 146/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Postprocess.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/X3D/X3DImporter_Postprocess.cpp b/code/X3D/X3DImporter_Postprocess.cpp index 8fcdbb9d6..59a085c74 100644 --- a/code/X3D/X3DImporter_Postprocess.cpp +++ b/code/X3D/X3DImporter_Postprocess.cpp @@ -89,7 +89,7 @@ aiMatrix4x4 X3DImporter::PostprocessHelper_Matrix_GlobalToCurrent() const void X3DImporter::PostprocessHelper_CollectMetadata(const CX3DImporter_NodeElement& pNodeElement, std::list& pList) const { // walk through childs and find for metadata. - for(std::list::const_iterator el_it = pNodeElement.Child.begin(); el_it != pNodeElement.Child.end(); el_it++) + for(std::list::const_iterator el_it = pNodeElement.Child.begin(); el_it != pNodeElement.Child.end(); ++el_it) { if(((*el_it)->Type == CX3DImporter_NodeElement::ENET_MetaBoolean) || ((*el_it)->Type == CX3DImporter_NodeElement::ENET_MetaDouble) || ((*el_it)->Type == CX3DImporter_NodeElement::ENET_MetaFloat) || ((*el_it)->Type == CX3DImporter_NodeElement::ENET_MetaInteger) || @@ -255,7 +255,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle std::vector tarr; tarr.reserve(tnemesh.Vertices.size()); - for(std::list::iterator it = tnemesh.Vertices.begin(); it != tnemesh.Vertices.end(); it++) tarr.push_back(*it); + for(std::list::iterator it = tnemesh.Vertices.begin(); it != tnemesh.Vertices.end(); ++it) tarr.push_back(*it); *pMesh = StandardShapes::MakeMesh(tarr, static_cast(tnemesh.NumIndices));// create mesh from vertices using Assimp help. return;// mesh is build, nothing to do anymore. @@ -438,7 +438,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle vec_copy.reserve(((CX3DImporter_NodeElement_Coordinate*)*ch_it)->Value.size()); for(std::list::const_iterator it = ((CX3DImporter_NodeElement_Coordinate*)*ch_it)->Value.begin(); - it != ((CX3DImporter_NodeElement_Coordinate*)*ch_it)->Value.end(); it++) + it != ((CX3DImporter_NodeElement_Coordinate*)*ch_it)->Value.end(); ++it) { vec_copy.push_back(*it); } @@ -580,7 +580,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle CX3DImporter_NodeElement_Set& tnemesh = *((CX3DImporter_NodeElement_Set*)&pNodeElement);// create alias for convenience // at first search for node and create mesh. - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Coordinate) { From ceacad237f3a5546820295cc7ef9f908e208dd35 Mon Sep 17 00:00:00 2001 From: escherstair Date: Tue, 3 Sep 2019 08:00:12 +0200 Subject: [PATCH 147/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Rendering.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/X3D/X3DImporter_Rendering.cpp b/code/X3D/X3DImporter_Rendering.cpp index b6cbb2499..fe54a7891 100644 --- a/code/X3D/X3DImporter_Rendering.cpp +++ b/code/X3D/X3DImporter_Rendering.cpp @@ -413,7 +413,7 @@ void X3DImporter::ParseNode_Rendering_IndexedTriangleSet() ne_alias.CoordIndex.clear(); int counter = 0; int32_t idx[3]; - for(std::vector::const_iterator idx_it = index.begin(); idx_it != index.end(); idx_it++) + for(std::vector::const_iterator idx_it = index.begin(); idx_it != index.end(); ++idx_it) { idx[counter++] = *idx_it; if (counter > 2) @@ -765,7 +765,7 @@ void X3DImporter::ParseNode_Rendering_TriangleFanSet() // assign indices for first triangle coord_num_first = 0; coord_num_prev = 1; - for(std::vector::const_iterator vc_it = ne_alias.VertexCount.begin(); vc_it != ne_alias.VertexCount.end(); vc_it++) + for(std::vector::const_iterator vc_it = ne_alias.VertexCount.begin(); vc_it != ne_alias.VertexCount.end(); ++vc_it) { if(*vc_it < 3) throw DeadlyImportError("TriangleFanSet. fanCount shall be greater than or equal to three."); From bbb1f6a1dcdefdb785caa2b884a91dd080ff9743 Mon Sep 17 00:00:00 2001 From: escherstair Date: Tue, 3 Sep 2019 08:01:05 +0200 Subject: [PATCH 148/320] prefer prefix ++/-- operators for non-primitive types --- contrib/gtest/test/gtest-param-test_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/gtest/test/gtest-param-test_test.cc b/contrib/gtest/test/gtest-param-test_test.cc index 8b278bb94..8aacfce72 100644 --- a/contrib/gtest/test/gtest-param-test_test.cc +++ b/contrib/gtest/test/gtest-param-test_test.cc @@ -215,7 +215,7 @@ TEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) { // Verifies that prefix and postfix operator++() advance an iterator // all the same. it2 = it; - it++; + ++it; ++it2; EXPECT_TRUE(*it == *it2); } From e317fbfbb652c178b828faa967f0f997beed21c8 Mon Sep 17 00:00:00 2001 From: escherstair Date: Tue, 3 Sep 2019 08:01:56 +0200 Subject: [PATCH 149/320] prefer prefix ++/-- operators for non-primitive types --- test/unit/SceneDiffer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/SceneDiffer.cpp b/test/unit/SceneDiffer.cpp index fb000db29..684d9fee6 100644 --- a/test/unit/SceneDiffer.cpp +++ b/test/unit/SceneDiffer.cpp @@ -123,7 +123,7 @@ void SceneDiffer::showReport() { return; } - for ( std::vector::iterator it = m_diffs.begin(); it != m_diffs.end(); it++ ) { + for ( std::vector::iterator it = m_diffs.begin(); it != m_diffs.end(); ++it ) { std::cout << *it << "\n"; } From c4ce8cec962daf2f6618485df703bb7392cfb652 Mon Sep 17 00:00:00 2001 From: escherstair Date: Tue, 3 Sep 2019 08:02:56 +0200 Subject: [PATCH 150/320] prefer prefix ++/-- operators for non-primitive types --- tools/assimp_qt_viewer/glview.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/assimp_qt_viewer/glview.cpp b/tools/assimp_qt_viewer/glview.cpp index 97eba83a1..6ecdb0f4d 100644 --- a/tools/assimp_qt_viewer/glview.cpp +++ b/tools/assimp_qt_viewer/glview.cpp @@ -203,7 +203,7 @@ void CGLView::Matrix_NodeToRoot(const aiNode* pNode, aiMatrix4x4& pOutMatrix) } // multiply all matrices in reverse order - for ( std::list::reverse_iterator rit = mat_list.rbegin(); rit != mat_list.rend(); rit++) + for ( std::list::reverse_iterator rit = mat_list.rbegin(); rit != mat_list.rend(); ++rit) { pOutMatrix = pOutMatrix * (*rit); } @@ -729,7 +729,7 @@ void CGLView::FreeScene() { GLuint* id_tex = new GLuint[id_tex_size]; QMap::iterator it = mTexture_IDMap.begin(); - for(int idx = 0; idx < id_tex_size; idx++, it++) + for(int idx = 0; idx < id_tex_size; idx++, ++it) { id_tex[idx] = it.value(); } From 071504991aaf294fdaa18eac1de0eab64ce3d680 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 3 Sep 2019 11:39:05 +0200 Subject: [PATCH 151/320] Update CMakeLists.txt Enable optimization --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c1517e93c..6a1c97f75 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -242,7 +242,7 @@ IF ((CMAKE_C_COMPILER_ID MATCHES "GNU") AND NOT CMAKE_COMPILER_IS_MINGW) SET(CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}") ENDIF() # hide all not-exported symbols - SET(CMAKE_CXX_FLAGS "-g -fvisibility=hidden -fno-strict-aliasing -Wall ${CMAKE_CXX_FLAGS}") + SET(CMAKE_CXX_FLAGS "-g -fvisibility=hidden -fno-strict-aliasing -Wall -O3 ${CMAKE_CXX_FLAGS}") SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}") SET(LIBSTDC++_LIBRARIES -lstdc++) ELSEIF(MSVC) @@ -259,7 +259,7 @@ ELSEIF ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) SET(CMAKE_CXX_FLAGS "-fPIC -std=c++11 ${CMAKE_CXX_FLAGS}") SET(CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}") ENDIF() - SET(CMAKE_CXX_FLAGS "-g -fvisibility=hidden -fno-strict-aliasing -Wall -Wno-long-long ${CMAKE_CXX_FLAGS}" ) + SET(CMAKE_CXX_FLAGS "-g -fvisibility=hidden -fno-strict-aliasing -Wall -O3 -Wno-long-long ${CMAKE_CXX_FLAGS}" ) SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}") ELSEIF( CMAKE_COMPILER_IS_MINGW ) IF (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0) From 4d9b3501840eb55d88615754a90a49c8f0fb22b3 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 3 Sep 2019 15:17:42 +0200 Subject: [PATCH 152/320] Update CMakeLists.txt Remove optimization because irrxml sucks. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a1c97f75..c1517e93c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -242,7 +242,7 @@ IF ((CMAKE_C_COMPILER_ID MATCHES "GNU") AND NOT CMAKE_COMPILER_IS_MINGW) SET(CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}") ENDIF() # hide all not-exported symbols - SET(CMAKE_CXX_FLAGS "-g -fvisibility=hidden -fno-strict-aliasing -Wall -O3 ${CMAKE_CXX_FLAGS}") + SET(CMAKE_CXX_FLAGS "-g -fvisibility=hidden -fno-strict-aliasing -Wall ${CMAKE_CXX_FLAGS}") SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}") SET(LIBSTDC++_LIBRARIES -lstdc++) ELSEIF(MSVC) @@ -259,7 +259,7 @@ ELSEIF ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) SET(CMAKE_CXX_FLAGS "-fPIC -std=c++11 ${CMAKE_CXX_FLAGS}") SET(CMAKE_C_FLAGS "-fPIC ${CMAKE_C_FLAGS}") ENDIF() - SET(CMAKE_CXX_FLAGS "-g -fvisibility=hidden -fno-strict-aliasing -Wall -O3 -Wno-long-long ${CMAKE_CXX_FLAGS}" ) + SET(CMAKE_CXX_FLAGS "-g -fvisibility=hidden -fno-strict-aliasing -Wall -Wno-long-long ${CMAKE_CXX_FLAGS}" ) SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}") ELSEIF( CMAKE_COMPILER_IS_MINGW ) IF (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0) From 727cf0c49f552073fe022c4ec24526dc0c561df0 Mon Sep 17 00:00:00 2001 From: Ryan McCampbell Date: Mon, 8 Jul 2019 23:21:57 -0700 Subject: [PATCH 153/320] Fixed unicode on windows --- code/Common/DefaultIOSystem.cpp | 80 +++++++++------------------------ 1 file changed, 20 insertions(+), 60 deletions(-) diff --git a/code/Common/DefaultIOSystem.cpp b/code/Common/DefaultIOSystem.cpp index d40b67de3..7606d8ced 100644 --- a/code/Common/DefaultIOSystem.cpp +++ b/code/Common/DefaultIOSystem.cpp @@ -73,28 +73,14 @@ using namespace Assimp; // Tests for the existence of a file at the given path. bool DefaultIOSystem::Exists( const char* pFile) const { -#ifdef _WIN32 +#if defined(_WIN32) && !defined(WindowsStore) wchar_t fileName16[PATHLIMIT]; -#ifndef WindowsStore - bool isUnicode = IsTextUnicode(pFile, static_cast(strlen(pFile)), NULL) != 0; - if (isUnicode) { - - MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, pFile, -1, fileName16, PATHLIMIT); - struct __stat64 filestat; - if (0 != _wstat64(fileName16, &filestat)) { - return false; - } - } else { -#endif - FILE* file = ::fopen(pFile, "rb"); - if (!file) - return false; - - ::fclose(file); -#ifndef WindowsStore + MultiByteToWideChar(CP_UTF8, 0, pFile, -1, fileName16, PATHLIMIT); + struct __stat64 filestat; + if (0 != _wstat64(fileName16, &filestat)) { + return false; } -#endif #else FILE* file = ::fopen( pFile, "rb"); if( !file) @@ -112,27 +98,19 @@ IOStream* DefaultIOSystem::Open( const char* strFile, const char* strMode) ai_assert(NULL != strFile); ai_assert(NULL != strMode); FILE* file; -#ifdef _WIN32 +#if defined(_WIN32) && !defined(WindowsStore) wchar_t fileName16[PATHLIMIT]; -#ifndef WindowsStore - bool isUnicode = IsTextUnicode(strFile, static_cast(strlen(strFile)), NULL) != 0; - if (isUnicode) { - MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, strFile, -1, fileName16, PATHLIMIT); - std::string mode8(strMode); - file = ::_wfopen(fileName16, std::wstring(mode8.begin(), mode8.end()).c_str()); - } else { -#endif - file = ::fopen(strFile, strMode); -#ifndef WindowsStore - } -#endif + MultiByteToWideChar(CP_UTF8, 0, strFile, -1, fileName16, PATHLIMIT); + std::string mode8(strMode); + std::wstring mode16(mode8.begin(), mode8.end()); + file = ::_wfopen(fileName16, mode16.c_str()); #else file = ::fopen(strFile, strMode); #endif if (nullptr == file) return nullptr; - return new DefaultIOStream(file, (std::string) strFile); + return new DefaultIOStream(file, strFile); } // ------------------------------------------------------------------------------------------------ @@ -167,44 +145,26 @@ inline static void MakeAbsolutePath (const char* in, char* _out) ai_assert(in && _out); #if defined( _MSC_VER ) || defined( __MINGW32__ ) #ifndef WindowsStore - bool isUnicode = IsTextUnicode(in, static_cast(strlen(in)), NULL) != 0; - if (isUnicode) { - wchar_t out16[PATHLIMIT]; - wchar_t in16[PATHLIMIT]; - MultiByteToWideChar(CP_UTF8, MB_PRECOMPOSED, in, -1, out16, PATHLIMIT); - wchar_t* ret = ::_wfullpath(out16, in16, PATHLIMIT); - if (ret) { - WideCharToMultiByte(CP_UTF8, MB_PRECOMPOSED, out16, -1, _out, PATHLIMIT, nullptr, nullptr); - } - if (!ret) { - // preserve the input path, maybe someone else is able to fix - // the path before it is accessed (e.g. our file system filter) - ASSIMP_LOG_WARN_F("Invalid path: ", std::string(in)); - strcpy(_out, in); - } - - } else { -#endif - char* ret = :: _fullpath(_out, in, PATHLIMIT); - if (!ret) { - // preserve the input path, maybe someone else is able to fix - // the path before it is accessed (e.g. our file system filter) - ASSIMP_LOG_WARN_F("Invalid path: ", std::string(in)); - strcpy(_out, in); - } -#ifndef WindowsStore + wchar_t in16[PATHLIMIT]; + wchar_t out16[PATHLIMIT]; + MultiByteToWideChar(CP_UTF8, 0, in, -1, in16, PATHLIMIT); + wchar_t* ret = ::_wfullpath(out16, in16, PATHLIMIT); + if (ret) { + WideCharToMultiByte(CP_UTF8, 0, out16, -1, _out, PATHLIMIT, nullptr, nullptr); } +#else + char* ret = ::_fullpath(_out, in, PATHLIMIT); #endif #else // use realpath char* ret = realpath(in, _out); +#endif if(!ret) { // preserve the input path, maybe someone else is able to fix // the path before it is accessed (e.g. our file system filter) ASSIMP_LOG_WARN_F("Invalid path: ", std::string(in)); strcpy(_out,in); } -#endif } // ------------------------------------------------------------------------------------------------ From 6c65b5b5496638c149907a605003f9a74f7bceb7 Mon Sep 17 00:00:00 2001 From: Ryan McCampbell Date: Tue, 9 Jul 2019 02:17:45 -0700 Subject: [PATCH 154/320] Cleaned up unicode code and removed fixed-size buffers --- code/Common/DefaultIOSystem.cpp | 74 ++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/code/Common/DefaultIOSystem.cpp b/code/Common/DefaultIOSystem.cpp index 7606d8ced..da7376809 100644 --- a/code/Common/DefaultIOSystem.cpp +++ b/code/Common/DefaultIOSystem.cpp @@ -61,12 +61,22 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; -// maximum path length -// XXX http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html -#ifdef PATH_MAX -# define PATHLIMIT PATH_MAX -#else -# define PATHLIMIT 4096 +#ifdef _WIN32 +static std::wstring Utf8ToWide(const char* in) +{ + int size = MultiByteToWideChar(CP_UTF8, 0, in, -1, nullptr, 0); + std::wstring out(size, L'\0'); + MultiByteToWideChar(CP_UTF8, 0, in, -1, &out[0], size); + return out; +} + +static std::string WideToUtf8(const wchar_t* in) +{ + int size = WideCharToMultiByte(CP_UTF8, 0, in, -1, nullptr, 0, nullptr, nullptr); + std::string out(size, '\0'); + WideCharToMultiByte(CP_UTF8, 0, in, -1, &out[0], size, nullptr, nullptr); + return out; +} #endif // ------------------------------------------------------------------------------------------------ @@ -74,11 +84,8 @@ using namespace Assimp; bool DefaultIOSystem::Exists( const char* pFile) const { #if defined(_WIN32) && !defined(WindowsStore) - wchar_t fileName16[PATHLIMIT]; - - MultiByteToWideChar(CP_UTF8, 0, pFile, -1, fileName16, PATHLIMIT); struct __stat64 filestat; - if (0 != _wstat64(fileName16, &filestat)) { + if (0 != _wstat64(Utf8ToWide(pFile).c_str(), &filestat)) { return false; } #else @@ -99,11 +106,7 @@ IOStream* DefaultIOSystem::Open( const char* strFile, const char* strMode) ai_assert(NULL != strMode); FILE* file; #if defined(_WIN32) && !defined(WindowsStore) - wchar_t fileName16[PATHLIMIT]; - MultiByteToWideChar(CP_UTF8, 0, strFile, -1, fileName16, PATHLIMIT); - std::string mode8(strMode); - std::wstring mode16(mode8.begin(), mode8.end()); - file = ::_wfopen(fileName16, mode16.c_str()); + file = ::_wfopen(Utf8ToWide(strFile).c_str(), Utf8ToWide(strMode).c_str()); #else file = ::fopen(strFile, strMode); #endif @@ -140,31 +143,39 @@ bool IOSystem::ComparePaths (const char* one, const char* second) const // ------------------------------------------------------------------------------------------------ // Convert a relative path into an absolute path -inline static void MakeAbsolutePath (const char* in, char* _out) +inline static std::string MakeAbsolutePath (const char* in) { - ai_assert(in && _out); -#if defined( _MSC_VER ) || defined( __MINGW32__ ) + ai_assert(in); + std::string out; +#ifdef _WIN32 #ifndef WindowsStore - wchar_t in16[PATHLIMIT]; - wchar_t out16[PATHLIMIT]; - MultiByteToWideChar(CP_UTF8, 0, in, -1, in16, PATHLIMIT); - wchar_t* ret = ::_wfullpath(out16, in16, PATHLIMIT); + wchar_t* ret = ::_wfullpath(nullptr, Utf8ToWide(in).c_str(), 0); if (ret) { - WideCharToMultiByte(CP_UTF8, 0, out16, -1, _out, PATHLIMIT, nullptr, nullptr); + out = WideToUtf8(ret); + free(ret); } #else - char* ret = ::_fullpath(_out, in, PATHLIMIT); + char* ret = ::_fullpath(nullptr, in, 0); + if (ret) { + out = ret; + free(ret); + } #endif #else // use realpath - char* ret = realpath(in, _out); + char* ret = realpath(in, nullptr); + if (ret) { + out = ret; + free(ret); + } #endif - if(!ret) { + if (!ret) { // preserve the input path, maybe someone else is able to fix // the path before it is accessed (e.g. our file system filter) ASSIMP_LOG_WARN_F("Invalid path: ", std::string(in)); - strcpy(_out,in); + out = in; } + return out; } // ------------------------------------------------------------------------------------------------ @@ -176,11 +187,8 @@ bool DefaultIOSystem::ComparePaths (const char* one, const char* second) const if( !ASSIMP_stricmp(one,second) ) return true; - char temp1[PATHLIMIT]; - char temp2[PATHLIMIT]; - - MakeAbsolutePath (one, temp1); - MakeAbsolutePath (second, temp2); + std::string temp1 = MakeAbsolutePath(one); + std::string temp2 = MakeAbsolutePath(second); return !ASSIMP_stricmp(temp1,temp2); } @@ -213,5 +221,3 @@ std::string DefaultIOSystem::absolutePath( const std::string &path ) } // ------------------------------------------------------------------------------------------------ - -#undef PATHLIMIT From 0685e415ad6b32b23eef89315bd5658d9bf021c1 Mon Sep 17 00:00:00 2001 From: Ryan McCampbell Date: Mon, 19 Aug 2019 12:00:01 -0400 Subject: [PATCH 155/320] removed extra null character in Utf8ToWide and WideToUtf8 --- code/Common/DefaultIOSystem.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/Common/DefaultIOSystem.cpp b/code/Common/DefaultIOSystem.cpp index da7376809..7e26ec4b2 100644 --- a/code/Common/DefaultIOSystem.cpp +++ b/code/Common/DefaultIOSystem.cpp @@ -64,16 +64,18 @@ using namespace Assimp; #ifdef _WIN32 static std::wstring Utf8ToWide(const char* in) { - int size = MultiByteToWideChar(CP_UTF8, 0, in, -1, nullptr, 0); - std::wstring out(size, L'\0'); + size_t size = MultiByteToWideChar(CP_UTF8, 0, in, -1, nullptr, 0); + // size includes terminating null; std::wstring adds null automatically + std::wstring out(size - 1, L'\0'); MultiByteToWideChar(CP_UTF8, 0, in, -1, &out[0], size); return out; } static std::string WideToUtf8(const wchar_t* in) { - int size = WideCharToMultiByte(CP_UTF8, 0, in, -1, nullptr, 0, nullptr, nullptr); - std::string out(size, '\0'); + size_t size = WideCharToMultiByte(CP_UTF8, 0, in, -1, nullptr, 0, nullptr, nullptr); + // size includes terminating null; std::string adds null automatically + std::string out(size - 1, '\0'); WideCharToMultiByte(CP_UTF8, 0, in, -1, &out[0], size, nullptr, nullptr); return out; } From a8822a2b29514700202d586a5397481de93bcbd2 Mon Sep 17 00:00:00 2001 From: Ryan McCampbell Date: Mon, 19 Aug 2019 15:36:45 -0400 Subject: [PATCH 156/320] Cleaned up formatting in DefaultIOSystem.cpp --- code/Common/DefaultIOSystem.cpp | 40 ++++++++++++++++----------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/code/Common/DefaultIOSystem.cpp b/code/Common/DefaultIOSystem.cpp index 7e26ec4b2..ce5996fa8 100644 --- a/code/Common/DefaultIOSystem.cpp +++ b/code/Common/DefaultIOSystem.cpp @@ -83,36 +83,36 @@ static std::string WideToUtf8(const wchar_t* in) // ------------------------------------------------------------------------------------------------ // Tests for the existence of a file at the given path. -bool DefaultIOSystem::Exists( const char* pFile) const +bool DefaultIOSystem::Exists(const char* pFile) const { #if defined(_WIN32) && !defined(WindowsStore) struct __stat64 filestat; - if (0 != _wstat64(Utf8ToWide(pFile).c_str(), &filestat)) { + if (_wstat64(Utf8ToWide(pFile).c_str(), &filestat) != 0) { return false; } #else - FILE* file = ::fopen( pFile, "rb"); - if( !file) + FILE* file = ::fopen(pFile, "rb"); + if (!file) return false; - ::fclose( file); + ::fclose(file); #endif return true; } // ------------------------------------------------------------------------------------------------ // Open a new file with a given path. -IOStream* DefaultIOSystem::Open( const char* strFile, const char* strMode) +IOStream* DefaultIOSystem::Open(const char* strFile, const char* strMode) { - ai_assert(NULL != strFile); - ai_assert(NULL != strMode); + ai_assert(strFile != nullptr); + ai_assert(strMode != nullptr); FILE* file; #if defined(_WIN32) && !defined(WindowsStore) file = ::_wfopen(Utf8ToWide(strFile).c_str(), Utf8ToWide(strMode).c_str()); #else file = ::fopen(strFile, strMode); #endif - if (nullptr == file) + if (!file) return nullptr; return new DefaultIOStream(file, strFile); @@ -120,7 +120,7 @@ IOStream* DefaultIOSystem::Open( const char* strFile, const char* strMode) // ------------------------------------------------------------------------------------------------ // Closes the given file and releases all resources associated with it. -void DefaultIOSystem::Close( IOStream* pFile) +void DefaultIOSystem::Close(IOStream* pFile) { delete pFile; } @@ -138,14 +138,14 @@ char DefaultIOSystem::getOsSeparator() const // ------------------------------------------------------------------------------------------------ // IOSystem default implementation (ComparePaths isn't a pure virtual function) -bool IOSystem::ComparePaths (const char* one, const char* second) const +bool IOSystem::ComparePaths(const char* one, const char* second) const { - return !ASSIMP_stricmp(one,second); + return !ASSIMP_stricmp(one, second); } // ------------------------------------------------------------------------------------------------ // Convert a relative path into an absolute path -inline static std::string MakeAbsolutePath (const char* in) +inline static std::string MakeAbsolutePath(const char* in) { ai_assert(in); std::string out; @@ -182,21 +182,21 @@ inline static std::string MakeAbsolutePath (const char* in) // ------------------------------------------------------------------------------------------------ // DefaultIOSystem's more specialized implementation -bool DefaultIOSystem::ComparePaths (const char* one, const char* second) const +bool DefaultIOSystem::ComparePaths(const char* one, const char* second) const { // chances are quite good both paths are formatted identically, // so we can hopefully return here already - if( !ASSIMP_stricmp(one,second) ) + if (!ASSIMP_stricmp(one, second)) return true; std::string temp1 = MakeAbsolutePath(one); std::string temp2 = MakeAbsolutePath(second); - return !ASSIMP_stricmp(temp1,temp2); + return !ASSIMP_stricmp(temp1, temp2); } // ------------------------------------------------------------------------------------------------ -std::string DefaultIOSystem::fileName( const std::string &path ) +std::string DefaultIOSystem::fileName(const std::string& path) { std::string ret = path; std::size_t last = ret.find_last_of("\\/"); @@ -205,16 +205,16 @@ std::string DefaultIOSystem::fileName( const std::string &path ) } // ------------------------------------------------------------------------------------------------ -std::string DefaultIOSystem::completeBaseName( const std::string &path ) +std::string DefaultIOSystem::completeBaseName(const std::string& path) { std::string ret = fileName(path); std::size_t pos = ret.find_last_of('.'); - if(pos != ret.npos) ret = ret.substr(0, pos); + if (pos != std::string::npos) ret = ret.substr(0, pos); return ret; } // ------------------------------------------------------------------------------------------------ -std::string DefaultIOSystem::absolutePath( const std::string &path ) +std::string DefaultIOSystem::absolutePath(const std::string& path) { std::string ret = path; std::size_t last = ret.find_last_of("\\/"); From a16906686f498cf4360c54ce41ef7838b1fecc84 Mon Sep 17 00:00:00 2001 From: Ryan McCampbell Date: Tue, 3 Sep 2019 21:06:48 -0400 Subject: [PATCH 157/320] Fixed type conversion warnings --- code/Common/DefaultIOSystem.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/Common/DefaultIOSystem.cpp b/code/Common/DefaultIOSystem.cpp index ce5996fa8..c0d356689 100644 --- a/code/Common/DefaultIOSystem.cpp +++ b/code/Common/DefaultIOSystem.cpp @@ -64,18 +64,18 @@ using namespace Assimp; #ifdef _WIN32 static std::wstring Utf8ToWide(const char* in) { - size_t size = MultiByteToWideChar(CP_UTF8, 0, in, -1, nullptr, 0); + int size = MultiByteToWideChar(CP_UTF8, 0, in, -1, nullptr, 0); // size includes terminating null; std::wstring adds null automatically - std::wstring out(size - 1, L'\0'); + std::wstring out(static_cast(size) - 1, L'\0'); MultiByteToWideChar(CP_UTF8, 0, in, -1, &out[0], size); return out; } static std::string WideToUtf8(const wchar_t* in) { - size_t size = WideCharToMultiByte(CP_UTF8, 0, in, -1, nullptr, 0, nullptr, nullptr); + int size = WideCharToMultiByte(CP_UTF8, 0, in, -1, nullptr, 0, nullptr, nullptr); // size includes terminating null; std::string adds null automatically - std::string out(size - 1, '\0'); + std::string out(static_cast(size) - 1, '\0'); WideCharToMultiByte(CP_UTF8, 0, in, -1, &out[0], size, nullptr, nullptr); return out; } From eb762e654eb73bf31220f1879d74254fb9332803 Mon Sep 17 00:00:00 2001 From: Ryan McCampbell Date: Tue, 3 Sep 2019 23:13:44 -0400 Subject: [PATCH 158/320] Removed WindowsStore checks --- code/Common/DefaultIOSystem.cpp | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/code/Common/DefaultIOSystem.cpp b/code/Common/DefaultIOSystem.cpp index c0d356689..6fdc24dd8 100644 --- a/code/Common/DefaultIOSystem.cpp +++ b/code/Common/DefaultIOSystem.cpp @@ -85,7 +85,7 @@ static std::string WideToUtf8(const wchar_t* in) // Tests for the existence of a file at the given path. bool DefaultIOSystem::Exists(const char* pFile) const { -#if defined(_WIN32) && !defined(WindowsStore) +#ifdef _WIN32 struct __stat64 filestat; if (_wstat64(Utf8ToWide(pFile).c_str(), &filestat) != 0) { return false; @@ -107,7 +107,7 @@ IOStream* DefaultIOSystem::Open(const char* strFile, const char* strMode) ai_assert(strFile != nullptr); ai_assert(strMode != nullptr); FILE* file; -#if defined(_WIN32) && !defined(WindowsStore) +#ifdef _WIN32 file = ::_wfopen(Utf8ToWide(strFile).c_str(), Utf8ToWide(strMode).c_str()); #else file = ::fopen(strFile, strMode); @@ -150,21 +150,12 @@ inline static std::string MakeAbsolutePath(const char* in) ai_assert(in); std::string out; #ifdef _WIN32 -#ifndef WindowsStore wchar_t* ret = ::_wfullpath(nullptr, Utf8ToWide(in).c_str(), 0); if (ret) { out = WideToUtf8(ret); free(ret); } #else - char* ret = ::_fullpath(nullptr, in, 0); - if (ret) { - out = ret; - free(ret); - } -#endif -#else - // use realpath char* ret = realpath(in, nullptr); if (ret) { out = ret; From 873a358ce483c742f502f5b80a3af73ab134425a Mon Sep 17 00:00:00 2001 From: Mike Samsonov Date: Wed, 28 Aug 2019 18:42:49 +0100 Subject: [PATCH 159/320] A crash in the aiMesh descructor --- CMakeLists.txt | 2 +- code/Common/SceneCombiner.cpp | 29 +++++++++++++++++++++++++++++ include/assimp/SceneCombiner.h | 2 ++ test/unit/utglTF2ImportExport.cpp | 9 +++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c1517e93c..61251f85a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -253,7 +253,7 @@ ELSEIF(MSVC) IF(MSVC12) ADD_COMPILE_OPTIONS(/wd4351) ENDIF() - SET(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /MDd /Ob2") + SET(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /MDd /Ob2 /DEBUG:FULL /Zi") ELSEIF ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) IF(NOT HUNTER_ENABLED) SET(CMAKE_CXX_FLAGS "-fPIC -std=c++11 ${CMAKE_CXX_FLAGS}") diff --git a/code/Common/SceneCombiner.cpp b/code/Common/SceneCombiner.cpp index e445bd743..4e6bc5b47 100644 --- a/code/Common/SceneCombiner.cpp +++ b/code/Common/SceneCombiner.cpp @@ -1091,6 +1091,35 @@ void SceneCombiner::Copy( aiMesh** _dest, const aiMesh* src ) { aiFace& f = dest->mFaces[i]; GetArrayCopy(f.mIndices,f.mNumIndices); } + + // make a deep copy of all blend shapes + CopyPtrArray(dest->mAnimMeshes, dest->mAnimMeshes, dest->mNumAnimMeshes); +} + +// ------------------------------------------------------------------------------------------------ +void SceneCombiner::Copy(aiAnimMesh** _dest, const aiAnimMesh* src) { + if (nullptr == _dest || nullptr == src) { + return; + } + + aiAnimMesh* dest = *_dest = new aiAnimMesh(); + + // get a flat copy + ::memcpy(dest, src, sizeof(aiAnimMesh)); + + // and reallocate all arrays + GetArrayCopy(dest->mVertices, dest->mNumVertices); + GetArrayCopy(dest->mNormals, dest->mNumVertices); + GetArrayCopy(dest->mTangents, dest->mNumVertices); + GetArrayCopy(dest->mBitangents, dest->mNumVertices); + + unsigned int n = 0; + while (dest->HasTextureCoords(n)) + GetArrayCopy(dest->mTextureCoords[n++], dest->mNumVertices); + + n = 0; + while (dest->HasVertexColors(n)) + GetArrayCopy(dest->mColors[n++], dest->mNumVertices); } // ------------------------------------------------------------------------------------------------ diff --git a/include/assimp/SceneCombiner.h b/include/assimp/SceneCombiner.h index 679a2acea..f69a25f43 100644 --- a/include/assimp/SceneCombiner.h +++ b/include/assimp/SceneCombiner.h @@ -65,6 +65,7 @@ struct aiLight; struct aiMetadata; struct aiBone; struct aiMesh; +struct aiAnimMesh; struct aiAnimation; struct aiNodeAnim; @@ -363,6 +364,7 @@ public: static void Copy (aiMesh** dest, const aiMesh* src); // similar to Copy(): + static void Copy (aiAnimMesh** dest, const aiAnimMesh* src); static void Copy (aiMaterial** dest, const aiMaterial* src); static void Copy (aiTexture** dest, const aiTexture* src); static void Copy (aiAnimation** dest, const aiAnimation* src); diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index 0ba5226cc..1e8e4af9d 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -380,4 +380,13 @@ TEST_F( utglTF2ImportExport, exportglTF2FromFileTest ) { EXPECT_TRUE( exporterTest() ); } +TEST_F( utglTF2ImportExport, crash_in_anim_mesh_destructor ) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Sample-Models/AnimatedMorphCube-glTF/AnimatedMorphCube.gltf", + aiProcess_ValidateDataStructure); + ASSERT_NE( nullptr, scene ); + Assimp::Exporter exporter; + ASSERT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "glb2", ASSIMP_TEST_MODELS_DIR "/glTF2/glTF-Sample-Models/AnimatedMorphCube-glTF/AnimatedMorphCube_out.glTF")); +} + #endif // ASSIMP_BUILD_NO_EXPORT From 0324643cd5821dc6da7b58bf90c4be3e2d60e111 Mon Sep 17 00:00:00 2001 From: Mike Samsonov Date: Wed, 28 Aug 2019 18:53:13 +0100 Subject: [PATCH 160/320] Missing model files --- .../AnimatedMorphCube.bin | Bin 0 -> 4284 bytes .../AnimatedMorphCube.gltf | 282 ++++++++++++++++++ 2 files changed, 282 insertions(+) create mode 100644 test/models/glTF2/glTF-Sample-Models/AnimatedMorphCube-glTF/AnimatedMorphCube.bin create mode 100644 test/models/glTF2/glTF-Sample-Models/AnimatedMorphCube-glTF/AnimatedMorphCube.gltf diff --git a/test/models/glTF2/glTF-Sample-Models/AnimatedMorphCube-glTF/AnimatedMorphCube.bin b/test/models/glTF2/glTF-Sample-Models/AnimatedMorphCube-glTF/AnimatedMorphCube.bin new file mode 100644 index 0000000000000000000000000000000000000000..7b14a1793452ffe0860fe0ef1f0d7a60187b99d8 GIT binary patch literal 4284 zcmeH~4NOy46vwYn5h?-&)QLJw{X(Lm79C38Jx6VZn++Sf>ck;_R#Y@HKRQ34RY9wp zW}*%|<1&dlt&?Snb4ziW%&B4ZGb%dh&^e7msB^|jrt|H-`yS@SWRAov*%DsT{{B7p zobyiaJ*OXpG+hp8QiL>1A65B3M?0F<94v1$w3LCNy_`>XS)WB<-a?XTAAShZc9N3EOVqxNsn z|KE8z*SMJmijw(vX>;^{`K&wtUix$f)w($~zli^f#5Sk47N6$LR}g8%wkntevF8xd znrKKHMh(%DFcM1IGKP`}(vF0aNXBpyO>`uR#4tvY4x~MaB^?=K`F5{$h6-z)PT`E# z%NR=cxfAJWubJNU&!fyvKX$p8%}pyj9%lE_pL{;H=BF$em_J18bg<3U33}-Du-}~s zLktEu>PdxBCKH_ZnjzC-fg8Ro$hBJGfqxzp*lZBYe*dJI3gLaH6V7@+fEe9I7;o9a z^0=VZw;j6cOJSyUH?aG{U4I!E39lsxv4EJGy?I9fYJc37}2;KBSIKrgC>DCZj?F_{|ZY@@N z!?E5Ufe|_#4lu;v7)yIxXzPd{xjNz3p3eBAuPZ(l^E1jcor~7q0 z;WguJe>!S)8Q9k_7Sk;joNpVC#jXih?wN>}eOcHjW@DUwDjH4Gagx=F4rdOQx@Y5Y zZ!X^Q&%;n%9wr(VpxLqr=hh`Ch4$-U8xdVkre5(h0IFY!CBw4ky8|t1j!!OFo&~Oc?l;WM>q%WxXGFG zMX1ypL=@vW8+N5|Ruqnr?e@8xJB}1`w(YlxGnkZerYC&KdAQ^lrv}e)K90V|X$|^K zwzK||?sM@;8_sosNY2*RI&$_ckLRqN)0&X*6fiw*j&z};dz{dEaE&*-{UL{ES2ru@;Q5!7jRzLXXg|}nQPbC zA-0ZiOB+(sA-zi)-Jg*L=5MCb&(jbxt{2dQ zi9^BVUQdg)gP^8v8;yOK2$ywkswF+3UOY_c;I2@(<$G%1-2s9RUZAdNQE(=umS!&3 zg1OBdx{trzWs}eHf zW`H*NkYJxM3vyR%5iYzj7lh*ZLQP;kROP1%-A65Ce&Iqt!3I^4CyXo3E`dOu!??F` z8N@D*F(w?yhttNQ)YT6PAds_Wn7P6Z?Eiy-{p{sum!zC!iE_rBm9yWj^n}JN_ezq| zLm}C6Z_QGAPEdN$s`ThdrFTavJ#CMXdp%{VJOitg+351EJTrTX Date: Wed, 28 Aug 2019 19:35:13 +0100 Subject: [PATCH 161/320] alloc-dealloc-mismatch --- code/glTF2/glTF2Importer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/glTF2/glTF2Importer.cpp b/code/glTF2/glTF2Importer.cpp index c6e998b3a..bd6a03174 100644 --- a/code/glTF2/glTF2Importer.cpp +++ b/code/glTF2/glTF2Importer.cpp @@ -1041,7 +1041,7 @@ aiNodeAnim* CreateNodeAnim(glTF2::Asset& r, Node& node, AnimationSamplers& sampl delete[] values; } else if (node.rotation.isPresent) { anim->mNumRotationKeys = 1; - anim->mRotationKeys = new aiQuatKey(); + anim->mRotationKeys = new aiQuatKey[anim->mNumRotationKeys]; anim->mRotationKeys->mTime = 0.f; anim->mRotationKeys->mValue.x = node.rotation.value[0]; anim->mRotationKeys->mValue.y = node.rotation.value[1]; From 4029fe5e4645d6e8f9db26cd260950ec57dd9cb7 Mon Sep 17 00:00:00 2001 From: Mike Samsonov Date: Wed, 28 Aug 2019 20:12:46 +0100 Subject: [PATCH 162/320] alloc-dealloc-mismatch --- code/glTF2/glTF2Importer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/glTF2/glTF2Importer.cpp b/code/glTF2/glTF2Importer.cpp index bd6a03174..a52e43716 100644 --- a/code/glTF2/glTF2Importer.cpp +++ b/code/glTF2/glTF2Importer.cpp @@ -1064,7 +1064,7 @@ aiNodeAnim* CreateNodeAnim(glTF2::Asset& r, Node& node, AnimationSamplers& sampl delete[] values; } else if (node.scale.isPresent) { anim->mNumScalingKeys = 1; - anim->mScalingKeys = new aiVectorKey(); + anim->mScalingKeys = new aiVectorKey[anim->mNumScalingKeys]; anim->mScalingKeys->mTime = 0.f; anim->mScalingKeys->mValue.x = node.scale.value[0]; anim->mScalingKeys->mValue.y = node.scale.value[1]; From b271091c64b3c6e7d17d32e003ecbfb708ba64e5 Mon Sep 17 00:00:00 2001 From: Mike Samsonov Date: Thu, 29 Aug 2019 10:44:56 +0100 Subject: [PATCH 163/320] fix division by zero --- code/glTF2/glTF2Importer.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/glTF2/glTF2Importer.cpp b/code/glTF2/glTF2Importer.cpp index a52e43716..eacf57c89 100644 --- a/code/glTF2/glTF2Importer.cpp +++ b/code/glTF2/glTF2Importer.cpp @@ -1130,6 +1130,7 @@ void glTF2Importer::ImportAnimations(glTF2::Asset& r) // Use the latest keyframe for the duration of the animation double maxDuration = 0; + unsigned int maxNumberOfKeys = 0; for (unsigned int j = 0; j < ai_anim->mNumChannels; ++j) { auto chan = ai_anim->mChannels[j]; if (chan->mNumPositionKeys) { @@ -1137,21 +1138,25 @@ void glTF2Importer::ImportAnimations(glTF2::Asset& r) if (lastPosKey.mTime > maxDuration) { maxDuration = lastPosKey.mTime; } + maxNumberOfKeys = std::max(maxNumberOfKeys, chan->mNumPositionKeys); } if (chan->mNumRotationKeys) { auto lastRotKey = chan->mRotationKeys[chan->mNumRotationKeys - 1]; if (lastRotKey.mTime > maxDuration) { maxDuration = lastRotKey.mTime; } + maxNumberOfKeys = std::max(maxNumberOfKeys, chan->mNumRotationKeys); } if (chan->mNumScalingKeys) { auto lastScaleKey = chan->mScalingKeys[chan->mNumScalingKeys - 1]; if (lastScaleKey.mTime > maxDuration) { maxDuration = lastScaleKey.mTime; } + maxNumberOfKeys = std::max(maxNumberOfKeys, chan->mNumScalingKeys); } } ai_anim->mDuration = maxDuration; + ai_anim->mTicksPerSecond = (maxNumberOfKeys > 0 && maxDuration > 0) ? (maxNumberOfKeys / (maxDuration/1000)) : 30; mScene->mAnimations[i] = ai_anim; } From 22bd047db52f079831f9266748053f2e97b846ca Mon Sep 17 00:00:00 2001 From: RumbleballTheReal <41473331+RumbleballTheReal@users.noreply.github.com> Date: Thu, 5 Sep 2019 23:44:54 +0200 Subject: [PATCH 164/320] Added VertexColors to FBX exporter (one channel) Works properly with Blender (custom importer) and UnrealEngine (Official SDK) --- code/FBX/FBXExporter.cpp | 50 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 5816a2ce1..0d6c1a011 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -1116,6 +1116,51 @@ void FBXExporter::WriteObjects () normals.End(outstream, binary, indent, true); } + // colors, if any + // TODO only one color channel currently + const int32_t colorChannelIndex = 0; + if (m->HasVertexColors(colorChannelIndex)) { + FBX::Node vertexcolors("LayerElementColor", int32_t(colorChannelIndex)); + vertexcolors.Begin(outstream, binary, indent); + vertexcolors.DumpProperties(outstream, binary, indent); + vertexcolors.EndProperties(outstream, binary, indent); + vertexcolors.BeginChildren(outstream, binary, indent); + indent = 3; + FBX::Node::WritePropertyNode( + "Version", int32_t(101), outstream, binary, indent + ); + char layerName[8]; + sprintf(layerName, "COLOR_%d", colorChannelIndex); + FBX::Node::WritePropertyNode( + "Name", (const char*)layerName, outstream, binary, indent + ); + FBX::Node::WritePropertyNode( + "MappingInformationType", "ByPolygonVertex", + outstream, binary, indent + ); + FBX::Node::WritePropertyNode( + "ReferenceInformationType", "Direct", + outstream, binary, indent + ); + std::vector color_data; + color_data.reserve(4 * polygon_data.size()); + for (size_t fi = 0; fi < m->mNumFaces; ++fi) { + const aiFace &f = m->mFaces[fi]; + for (size_t pvi = 0; pvi < f.mNumIndices; ++pvi) { + const aiColor4D &c = m->mColors[colorChannelIndex][f.mIndices[pvi]]; + color_data.push_back(c.r); + color_data.push_back(c.g); + color_data.push_back(c.b); + color_data.push_back(c.a); + } + } + FBX::Node::WritePropertyNode( + "Colors", color_data, outstream, binary, indent + ); + indent = 2; + vertexcolors.End(outstream, binary, indent, true); + } + // uvs, if any for (size_t uvi = 0; uvi < m->GetNumUVChannels(); ++uvi) { if (m->mNumUVComponents[uvi] > 2) { @@ -1209,6 +1254,11 @@ void FBXExporter::WriteObjects () le.AddChild("Type", "LayerElementNormal"); le.AddChild("TypedIndex", int32_t(0)); layer.AddChild(le); + // TODO only 1 color channel currently + le = FBX::Node("LayerElement"); + le.AddChild("Type", "LayerElementColor"); + le.AddChild("TypedIndex", int32_t(0)); + layer.AddChild(le); le = FBX::Node("LayerElement"); le.AddChild("Type", "LayerElementMaterial"); le.AddChild("TypedIndex", int32_t(0)); From eb8479a95e350f4c3582893be3a9a26b076fa4b1 Mon Sep 17 00:00:00 2001 From: escherstair Date: Fri, 6 Sep 2019 11:19:27 +0200 Subject: [PATCH 165/320] possible inefficient checking for 'tlist' emptiness --- code/X3D/X3DImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter.cpp b/code/X3D/X3DImporter.cpp index 0d48d00b7..d1d38e0b6 100644 --- a/code/X3D/X3DImporter.cpp +++ b/code/X3D/X3DImporter.cpp @@ -647,7 +647,7 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsArrCol4f(const int pAttrIdx, std::ve XML_ReadNode_GetAttrVal_AsListCol4f(pAttrIdx, tlist);// read as list // and copy to array - if(tlist.size() > 0) + if(!tlist.empty()) { pValue.reserve(tlist.size()); for ( std::list::iterator it = tlist.begin(); it != tlist.end(); ++it ) From d177c722b1fb1f4a2d8c54922f246b16d2749766 Mon Sep 17 00:00:00 2001 From: escherstair Date: Fri, 6 Sep 2019 11:28:38 +0200 Subject: [PATCH 166/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Postprocess.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter_Postprocess.cpp b/code/X3D/X3DImporter_Postprocess.cpp index 59a085c74..e113b1bad 100644 --- a/code/X3D/X3DImporter_Postprocess.cpp +++ b/code/X3D/X3DImporter_Postprocess.cpp @@ -554,7 +554,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle } // copy additional information from children - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { ai_assert(*pMesh); if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Color) From 91706a1f6e8234a959b38d26f6e1eaadbdec8c36 Mon Sep 17 00:00:00 2001 From: escherstair Date: Fri, 6 Sep 2019 11:29:52 +0200 Subject: [PATCH 167/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Rendering.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/X3D/X3DImporter_Rendering.cpp b/code/X3D/X3DImporter_Rendering.cpp index fe54a7891..6e95c9441 100644 --- a/code/X3D/X3DImporter_Rendering.cpp +++ b/code/X3D/X3DImporter_Rendering.cpp @@ -295,7 +295,7 @@ void X3DImporter::ParseNode_Rendering_IndexedTriangleFanSet() ne_alias.CoordIndex.clear(); int counter = 0; int32_t idx[3]; - for(std::vector::const_iterator idx_it = index.begin(); idx_it != index.end(); idx_it++) + for(std::vector::const_iterator idx_it = index.begin(); idx_it != index.end(); ++idx_it) { idx[2] = *idx_it; if (idx[2] < 0) @@ -617,7 +617,7 @@ void X3DImporter::ParseNode_Rendering_LineSet() size_t coord_num = 0; ne_alias.CoordIndex.clear(); - for(std::vector::const_iterator vc_it = ne_alias.VertexCount.begin(); vc_it != ne_alias.VertexCount.end(); vc_it++) + for(std::vector::const_iterator vc_it = ne_alias.VertexCount.begin(); vc_it != ne_alias.VertexCount.end(); ++vc_it) { if(*vc_it < 2) throw DeadlyImportError("LineSet. vertexCount shall be greater than or equal to two."); From 1503608aaae09999568bbe2c5500f50a9c90c61c Mon Sep 17 00:00:00 2001 From: escherstair Date: Fri, 6 Sep 2019 11:31:07 +0200 Subject: [PATCH 168/320] prefer prefix ++/-- operators for non-primitive types --- contrib/gtest/test/gtest-param-test_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/gtest/test/gtest-param-test_test.cc b/contrib/gtest/test/gtest-param-test_test.cc index 8b278bb94..6265168fd 100644 --- a/contrib/gtest/test/gtest-param-test_test.cc +++ b/contrib/gtest/test/gtest-param-test_test.cc @@ -196,7 +196,7 @@ TEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) { << "element same as its source points to"; // Verifies that iterator assignment works as expected. - it++; + ++it; EXPECT_FALSE(*it == *it2); it2 = it; EXPECT_TRUE(*it == *it2) << "Assigned iterators must point to the " From 1b86de9d149a442df58fcbf255c92cd808ecd8da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabien=20P=C3=A9an?= Date: Sun, 8 Sep 2019 19:15:57 +0200 Subject: [PATCH 169/320] Fix Sample_SimpleOpenGL.c Extra `struct` causing problems --- samples/SimpleOpenGL/Sample_SimpleOpenGL.c | 44 +++++++++++----------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/samples/SimpleOpenGL/Sample_SimpleOpenGL.c b/samples/SimpleOpenGL/Sample_SimpleOpenGL.c index 2dec5bc01..c3894a632 100644 --- a/samples/SimpleOpenGL/Sample_SimpleOpenGL.c +++ b/samples/SimpleOpenGL/Sample_SimpleOpenGL.c @@ -26,9 +26,9 @@ #include /* the global Assimp scene object */ -const struct aiScene* scene = NULL; +const aiScene* scene = NULL; GLuint scene_list = 0; -struct aiVector3D scene_min, scene_max, scene_center; +aiVector3D scene_min, scene_max, scene_center; /* current rotation angle */ static float angle = 0.f; @@ -49,22 +49,22 @@ void reshape(int width, int height) } /* ---------------------------------------------------------------------------- */ -void get_bounding_box_for_node (const struct aiNode* nd, - struct aiVector3D* min, - struct aiVector3D* max, - struct aiMatrix4x4* trafo +void get_bounding_box_for_node (const aiNode* nd, + aiVector3D* min, + aiVector3D* max, + aiMatrix4x4* trafo ){ - struct aiMatrix4x4 prev; + aiMatrix4x4 prev; unsigned int n = 0, t; prev = *trafo; aiMultiplyMatrix4(trafo,&nd->mTransformation); for (; n < nd->mNumMeshes; ++n) { - const struct aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]]; + const aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]]; for (t = 0; t < mesh->mNumVertices; ++t) { - struct aiVector3D tmp = mesh->mVertices[t]; + aiVector3D tmp = mesh->mVertices[t]; aiTransformVecByMatrix4(&tmp,trafo); min->x = aisgl_min(min->x,tmp.x); @@ -84,9 +84,9 @@ void get_bounding_box_for_node (const struct aiNode* nd, } /* ---------------------------------------------------------------------------- */ -void get_bounding_box (struct aiVector3D* min, struct aiVector3D* max) +void get_bounding_box (aiVector3D* min, aiVector3D* max) { - struct aiMatrix4x4 trafo; + aiMatrix4x4 trafo; aiIdentityMatrix4(&trafo); min->x = min->y = min->z = 1e10f; @@ -95,7 +95,7 @@ void get_bounding_box (struct aiVector3D* min, struct aiVector3D* max) } /* ---------------------------------------------------------------------------- */ -void color4_to_float4(const struct aiColor4D *c, float f[4]) +void color4_to_float4(const aiColor4D *c, float f[4]) { f[0] = c->r; f[1] = c->g; @@ -113,16 +113,16 @@ void set_float4(float f[4], float a, float b, float c, float d) } /* ---------------------------------------------------------------------------- */ -void apply_material(const struct aiMaterial *mtl) +void apply_material(const aiMaterial *mtl) { float c[4]; GLenum fill_mode; int ret1, ret2; - struct aiColor4D diffuse; - struct aiColor4D specular; - struct aiColor4D ambient; - struct aiColor4D emission; + aiColor4D diffuse; + aiColor4D specular; + aiColor4D ambient; + aiColor4D emission; ai_real shininess, strength; int two_sided; int wireframe; @@ -179,11 +179,11 @@ void apply_material(const struct aiMaterial *mtl) } /* ---------------------------------------------------------------------------- */ -void recursive_render (const struct aiScene *sc, const struct aiNode* nd) +void recursive_render (const aiScene *sc, const aiNode* nd) { unsigned int i; unsigned int n = 0, t; - struct aiMatrix4x4 m = nd->mTransformation; + aiMatrix4x4 m = nd->mTransformation; /* update transform */ aiTransposeMatrix4(&m); @@ -192,7 +192,7 @@ void recursive_render (const struct aiScene *sc, const struct aiNode* nd) /* draw all meshes assigned to this node */ for (; n < nd->mNumMeshes; ++n) { - const struct aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]]; + const aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]]; apply_material(sc->mMaterials[mesh->mMaterialIndex]); @@ -203,7 +203,7 @@ void recursive_render (const struct aiScene *sc, const struct aiNode* nd) } for (t = 0; t < mesh->mNumFaces; ++t) { - const struct aiFace* face = &mesh->mFaces[t]; + const aiFace* face = &mesh->mFaces[t]; GLenum face_mode; switch(face->mNumIndices) { @@ -324,7 +324,7 @@ int loadasset (const char* path) /* ---------------------------------------------------------------------------- */ int main(int argc, char **argv) { - struct aiLogStream stream; + aiLogStream stream; glutInitWindowSize(900,600); glutInitWindowPosition(100,100); From da97f1be79081fc6ad6fc7b81ad22f6df6d2a1c4 Mon Sep 17 00:00:00 2001 From: RevoluPowered Date: Fri, 6 Sep 2019 15:03:02 +0100 Subject: [PATCH 170/320] Implemented basic PBR materials into assimp. This adds the following texture types: - BASE_COLOR - NORMAL_CAMERA - EMISSION_COLOR - METALNESS - DIFFUSE_ROUGHNESS This is the first small change required. We only support maya right now. --- code/FBX/FBXConverter.cpp | 6 ++++++ include/assimp/material.h | 45 ++++++++++++++++++++++++++++----------- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/code/FBX/FBXConverter.cpp b/code/FBX/FBXConverter.cpp index 6717b592f..69e57f73e 100644 --- a/code/FBX/FBXConverter.cpp +++ b/code/FBX/FBXConverter.cpp @@ -2001,6 +2001,12 @@ namespace Assimp { TrySetTextureProperties(out_mat, textures, "Maya|SpecularTexture", aiTextureType_SPECULAR, mesh); TrySetTextureProperties(out_mat, textures, "Maya|FalloffTexture", aiTextureType_OPACITY, mesh); TrySetTextureProperties(out_mat, textures, "Maya|ReflectionMapTexture", aiTextureType_REFLECTION, mesh); + // Maya PBR + TrySetTextureProperties(out_mat, textures, "Maya|baseColor|file", aiTextureType_BASE_COLOR, mesh); + TrySetTextureProperties(out_mat, textures, "Maya|normalCamera|file", aiTextureType_NORMAL_CAMERA, mesh); + TrySetTextureProperties(out_mat, textures, "Maya|emissionColor|file", aiTextureType_EMISSION_COLOR, mesh); + TrySetTextureProperties(out_mat, textures, "Maya|metalness|file", aiTextureType_METALNESS, mesh); + TrySetTextureProperties(out_mat, textures, "Maya|diffuseRoughness|file", aiTextureType_DIFFUSE_ROUGHNESS, mesh); } void FBXConverter::SetTextureProperties(aiMaterial* out_mat, const LayeredTextureMap& layeredTextures, const MeshGeometry* const mesh) diff --git a/include/assimp/material.h b/include/assimp/material.h index 4b5a1293d..7ac643ced 100644 --- a/include/assimp/material.h +++ b/include/assimp/material.h @@ -196,34 +196,40 @@ enum aiTextureType * (#aiMaterialProperty::mSemantic) for all material properties * *not* related to textures. */ - aiTextureType_NONE = 0x0, + aiTextureType_NONE = 0, + + /** LEGACY API MATERIALS + * Legacy refers to materials which + * Were originally implemented in the specifications around 2000. + * These must never be removed, as most engines support them. + */ /** The texture is combined with the result of the diffuse * lighting equation. */ - aiTextureType_DIFFUSE = 0x1, + aiTextureType_DIFFUSE = 1, /** The texture is combined with the result of the specular * lighting equation. */ - aiTextureType_SPECULAR = 0x2, + aiTextureType_SPECULAR = 2, /** The texture is combined with the result of the ambient * lighting equation. */ - aiTextureType_AMBIENT = 0x3, + aiTextureType_AMBIENT = 3, /** The texture is added to the result of the lighting * calculation. It isn't influenced by incoming light. */ - aiTextureType_EMISSIVE = 0x4, + aiTextureType_EMISSIVE = 4, /** The texture is a height map. * * By convention, higher gray-scale values stand for * higher elevations from the base height. */ - aiTextureType_HEIGHT = 0x5, + aiTextureType_HEIGHT = 5, /** The texture is a (tangent space) normal-map. * @@ -231,7 +237,7 @@ enum aiTextureType * normal maps. Assimp does (intentionally) not * distinguish here. */ - aiTextureType_NORMALS = 0x6, + aiTextureType_NORMALS = 6, /** The texture defines the glossiness of the material. * @@ -240,21 +246,21 @@ enum aiTextureType * function defined to map the linear color values in the * texture to a suitable exponent. Have fun. */ - aiTextureType_SHININESS = 0x7, + aiTextureType_SHININESS = 7, /** The texture defines per-pixel opacity. * * Usually 'white' means opaque and 'black' means * 'transparency'. Or quite the opposite. Have fun. */ - aiTextureType_OPACITY = 0x8, + aiTextureType_OPACITY = 8, /** Displacement texture * * The exact purpose and format is application-dependent. * Higher color values stand for higher vertex displacements. */ - aiTextureType_DISPLACEMENT = 0x9, + aiTextureType_DISPLACEMENT = 9, /** Lightmap texture (aka Ambient Occlusion) * @@ -263,14 +269,27 @@ enum aiTextureType * scaling value for the final color value of a pixel. Its * intensity is not affected by incoming light. */ - aiTextureType_LIGHTMAP = 0xA, + aiTextureType_LIGHTMAP = 10, /** Reflection texture * * Contains the color of a perfect mirror reflection. * Rarely used, almost never for real-time applications. */ - aiTextureType_REFLECTION = 0xB, + aiTextureType_REFLECTION = 11, + + /** PBR Materials + * PBR definitions from maya and other modelling packages now use this standard. + * This was originally introduced around 2012. + * Support for this is in game engines like Godot, Unreal or Unity3D. + * Modelling packages which use this are very common now. + */ + + aiTextureType_BASE_COLOR = 12, + aiTextureType_NORMAL_CAMERA = 13, + aiTextureType_EMISSION_COLOR = 14, + aiTextureType_METALNESS = 15, + aiTextureType_DIFFUSE_ROUGHNESS = 16, /** Unknown texture * @@ -278,7 +297,7 @@ enum aiTextureType * above is considered to be 'unknown'. It is still imported, * but is excluded from any further post-processing. */ - aiTextureType_UNKNOWN = 0xC, + aiTextureType_UNKNOWN = 17, #ifndef SWIG From ddc26e1c461e9595d5f84a52c26e91d0c5a5cc88 Mon Sep 17 00:00:00 2001 From: RevoluPowered Date: Sun, 8 Sep 2019 18:17:40 +0100 Subject: [PATCH 171/320] Added maya stingray support for textures --- code/FBX/FBXConverter.cpp | 9 +++++++++ include/assimp/material.h | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/code/FBX/FBXConverter.cpp b/code/FBX/FBXConverter.cpp index 69e57f73e..3f64016ea 100644 --- a/code/FBX/FBXConverter.cpp +++ b/code/FBX/FBXConverter.cpp @@ -2001,12 +2001,21 @@ namespace Assimp { TrySetTextureProperties(out_mat, textures, "Maya|SpecularTexture", aiTextureType_SPECULAR, mesh); TrySetTextureProperties(out_mat, textures, "Maya|FalloffTexture", aiTextureType_OPACITY, mesh); TrySetTextureProperties(out_mat, textures, "Maya|ReflectionMapTexture", aiTextureType_REFLECTION, mesh); + // Maya PBR TrySetTextureProperties(out_mat, textures, "Maya|baseColor|file", aiTextureType_BASE_COLOR, mesh); TrySetTextureProperties(out_mat, textures, "Maya|normalCamera|file", aiTextureType_NORMAL_CAMERA, mesh); TrySetTextureProperties(out_mat, textures, "Maya|emissionColor|file", aiTextureType_EMISSION_COLOR, mesh); TrySetTextureProperties(out_mat, textures, "Maya|metalness|file", aiTextureType_METALNESS, mesh); TrySetTextureProperties(out_mat, textures, "Maya|diffuseRoughness|file", aiTextureType_DIFFUSE_ROUGHNESS, mesh); + + // Maya stingray + TrySetTextureProperties(out_mat, textures, "Maya|TEX_color_map|file", aiTextureType_BASE_COLOR, mesh); + TrySetTextureProperties(out_mat, textures, "Maya|TEX_normal_map|file", aiTextureType_NORMAL_CAMERA, mesh); + TrySetTextureProperties(out_mat, textures, "Maya|TEX_emissive_map|file", aiTextureType_EMISSION_COLOR, mesh); + TrySetTextureProperties(out_mat, textures, "Maya|TEX_metallic_map|file", aiTextureType_METALNESS, mesh); + TrySetTextureProperties(out_mat, textures, "Maya|TEX_roughness_map|file", aiTextureType_DIFFUSE_ROUGHNESS, mesh); + TrySetTextureProperties(out_mat, textures, "Maya|TEX_ao_map|file", aiTextureType_AMBIENT_OCCLUSION, mesh); } void FBXConverter::SetTextureProperties(aiMaterial* out_mat, const LayeredTextureMap& layeredTextures, const MeshGeometry* const mesh) diff --git a/include/assimp/material.h b/include/assimp/material.h index 7ac643ced..206eb2a2b 100644 --- a/include/assimp/material.h +++ b/include/assimp/material.h @@ -290,6 +290,7 @@ enum aiTextureType aiTextureType_EMISSION_COLOR = 14, aiTextureType_METALNESS = 15, aiTextureType_DIFFUSE_ROUGHNESS = 16, + aiTextureType_AMBIENT_OCCLUSION = 17, /** Unknown texture * @@ -297,7 +298,7 @@ enum aiTextureType * above is considered to be 'unknown'. It is still imported, * but is excluded from any further post-processing. */ - aiTextureType_UNKNOWN = 17, + aiTextureType_UNKNOWN = 18, #ifndef SWIG From 602b0cf0c297f97d2c9316c9838e1d374a8865b9 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 8 Sep 2019 21:03:08 +0200 Subject: [PATCH 172/320] Update Sample_SimpleOpenGL.c Introduce C_STRUCT for c-compatibility mode. --- samples/SimpleOpenGL/Sample_SimpleOpenGL.c | 42 +++++++++++----------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/samples/SimpleOpenGL/Sample_SimpleOpenGL.c b/samples/SimpleOpenGL/Sample_SimpleOpenGL.c index c3894a632..085b95516 100644 --- a/samples/SimpleOpenGL/Sample_SimpleOpenGL.c +++ b/samples/SimpleOpenGL/Sample_SimpleOpenGL.c @@ -26,9 +26,9 @@ #include /* the global Assimp scene object */ -const aiScene* scene = NULL; +const C_STRUCT aiScene* scene = NULL; GLuint scene_list = 0; -aiVector3D scene_min, scene_max, scene_center; +C_STRUCT aiVector3D scene_min, scene_max, scene_center; /* current rotation angle */ static float angle = 0.f; @@ -49,22 +49,22 @@ void reshape(int width, int height) } /* ---------------------------------------------------------------------------- */ -void get_bounding_box_for_node (const aiNode* nd, - aiVector3D* min, - aiVector3D* max, - aiMatrix4x4* trafo +void get_bounding_box_for_node (const amTransformation); for (; n < nd->mNumMeshes; ++n) { - const aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]]; + const C_STRUCT aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]]; for (t = 0; t < mesh->mNumVertices; ++t) { - aiVector3D tmp = mesh->mVertices[t]; + C_STRUCT aiVector3D tmp = mesh->mVertices[t]; aiTransformVecByMatrix4(&tmp,trafo); min->x = aisgl_min(min->x,tmp.x); @@ -84,7 +84,7 @@ void get_bounding_box_for_node (const aiNode* nd, } /* ---------------------------------------------------------------------------- */ -void get_bounding_box (aiVector3D* min, aiVector3D* max) +void get_bounding_box(C_STRUCT aiVector3D* min, C_STRUCT aiVector3D* max) { aiMatrix4x4 trafo; aiIdentityMatrix4(&trafo); @@ -95,7 +95,7 @@ void get_bounding_box (aiVector3D* min, aiVector3D* max) } /* ---------------------------------------------------------------------------- */ -void color4_to_float4(const aiColor4D *c, float f[4]) +void color4_to_float4(const C_STRUCT aiColor4D *c, float f[4]) { f[0] = c->r; f[1] = c->g; @@ -113,16 +113,16 @@ void set_float4(float f[4], float a, float b, float c, float d) } /* ---------------------------------------------------------------------------- */ -void apply_material(const aiMaterial *mtl) +void apply_material(const C_STRUCT aiMaterial *mtl) { float c[4]; GLenum fill_mode; int ret1, ret2; - aiColor4D diffuse; - aiColor4D specular; - aiColor4D ambient; - aiColor4D emission; + C_STRUCT aiColor4D diffuse; + C_STRUCT aiColor4D specular; + C_STRUCT aiColor4D ambient; + C_STRUCT aiColor4D emission; ai_real shininess, strength; int two_sided; int wireframe; @@ -179,11 +179,11 @@ void apply_material(const aiMaterial *mtl) } /* ---------------------------------------------------------------------------- */ -void recursive_render (const aiScene *sc, const aiNode* nd) +void recursive_render (const C_STRUCT aiScene *sc, const C_STRUCT aiNode* nd) { unsigned int i; unsigned int n = 0, t; - aiMatrix4x4 m = nd->mTransformation; + C_STRUCT aiMatrix4x4 m = nd->mTransformation; /* update transform */ aiTransposeMatrix4(&m); @@ -192,7 +192,7 @@ void recursive_render (const aiScene *sc, const aiNode* nd) /* draw all meshes assigned to this node */ for (; n < nd->mNumMeshes; ++n) { - const aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]]; + const C_STRUCT aiMesh* mesh = scene->mMeshes[nd->mMeshes[n]]; apply_material(sc->mMaterials[mesh->mMaterialIndex]); @@ -203,7 +203,7 @@ void recursive_render (const aiScene *sc, const aiNode* nd) } for (t = 0; t < mesh->mNumFaces; ++t) { - const aiFace* face = &mesh->mFaces[t]; + const C_STRUCT aiFace* face = &mesh->mFaces[t]; GLenum face_mode; switch(face->mNumIndices) { @@ -324,7 +324,7 @@ int loadasset (const char* path) /* ---------------------------------------------------------------------------- */ int main(int argc, char **argv) { - aiLogStream stream; + C_STRUCT aiLogStream stream; glutInitWindowSize(900,600); glutInitWindowPosition(100,100); From db55ba4908101215307dcee1349e0d3e236e9fd1 Mon Sep 17 00:00:00 2001 From: escherstair Date: Mon, 9 Sep 2019 15:00:28 +0200 Subject: [PATCH 173/320] possible inefficient checking for 'tlist' emptiness --- code/X3D/X3DImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/X3D/X3DImporter.cpp b/code/X3D/X3DImporter.cpp index d1d38e0b6..367d84fcf 100644 --- a/code/X3D/X3DImporter.cpp +++ b/code/X3D/X3DImporter.cpp @@ -614,7 +614,7 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsArrCol3f(const int pAttrIdx, std::ve XML_ReadNode_GetAttrVal_AsListCol3f(pAttrIdx, tlist);// read as list // and copy to array - if(tlist.size() > 0) + if(!tlist.empty()) { pValue.reserve(tlist.size()); for(std::list::iterator it = tlist.begin(); it != tlist.end(); ++it) pValue.push_back(*it); From 621a7a1abd162a4c09aeb55cc8ac9b33dd6abf38 Mon Sep 17 00:00:00 2001 From: RumbleballTheReal <41473331+RumbleballTheReal@users.noreply.github.com> Date: Mon, 9 Sep 2019 15:50:57 +0200 Subject: [PATCH 174/320] Create BUILDBINARIES_EXAMPLE.bat --- BUILDBINARIES_EXAMPLE.bat | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 BUILDBINARIES_EXAMPLE.bat diff --git a/BUILDBINARIES_EXAMPLE.bat b/BUILDBINARIES_EXAMPLE.bat new file mode 100644 index 000000000..df8468195 --- /dev/null +++ b/BUILDBINARIES_EXAMPLE.bat @@ -0,0 +1,20 @@ +:: This is an example file to generate binaries using Windows Operating System +:: This script is configured to be executed from the source directory + +:: Compiled binaries will be placed in BINARIES_DIR\code\CONFIG + +SET SOURCE_DIR=. + +:: For generators see "cmake --help" +SET GENERATOR=Visual Studio 15 2017 + +SET BINARIES_DIR="./BINARIES/Win32" +cmake CMakeLists.txt -G "%GENERATOR%" -S %SOURCE_DIR% -B %BINARIES_DIR% +cmake --build %BINARIES_DIR% --config release + +SET BINARIES_DIR="./BINARIES/x64" +cmake CMakeLists.txt -G "%GENERATOR% Win64" -S %SOURCE_DIR% -B %BINARIES_DIR% +cmake --build %BINARIES_DIR% --config debug +cmake --build %BINARIES_DIR% --config release + +PAUSE From a0fb50146aa0e02086be17ccc20e5a557645d479 Mon Sep 17 00:00:00 2001 From: RumbleballTheReal <41473331+RumbleballTheReal@users.noreply.github.com> Date: Mon, 9 Sep 2019 15:56:21 +0200 Subject: [PATCH 175/320] Update BUILDBINARIES_EXAMPLE.bat --- BUILDBINARIES_EXAMPLE.bat | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BUILDBINARIES_EXAMPLE.bat b/BUILDBINARIES_EXAMPLE.bat index df8468195..0841a83e8 100644 --- a/BUILDBINARIES_EXAMPLE.bat +++ b/BUILDBINARIES_EXAMPLE.bat @@ -3,6 +3,9 @@ :: Compiled binaries will be placed in BINARIES_DIR\code\CONFIG +:: NOTE +:: The build process will generate a config.h file that is placed in BINARIES_DIR\include + SET SOURCE_DIR=. :: For generators see "cmake --help" From a16645f3f73c40896d60665489a77c8ac97d28cb Mon Sep 17 00:00:00 2001 From: RumbleballTheReal <41473331+RumbleballTheReal@users.noreply.github.com> Date: Mon, 9 Sep 2019 21:20:44 +0200 Subject: [PATCH 176/320] Update BUILDBINARIES_EXAMPLE.bat --- BUILDBINARIES_EXAMPLE.bat | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BUILDBINARIES_EXAMPLE.bat b/BUILDBINARIES_EXAMPLE.bat index 0841a83e8..2dd13a542 100644 --- a/BUILDBINARIES_EXAMPLE.bat +++ b/BUILDBINARIES_EXAMPLE.bat @@ -5,6 +5,9 @@ :: NOTE :: The build process will generate a config.h file that is placed in BINARIES_DIR\include +:: This file must be merged with SOURCE_DIR\include +:: You should write yourself a script that copies the files where you want them. +:: Also see: https://github.com/assimp/assimp/pull/2646 SET SOURCE_DIR=. From 1899aaef6e9bcaf62520626ae2838bce4909f84d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabien=20P=C3=A9an?= Date: Mon, 9 Sep 2019 22:44:58 +0200 Subject: [PATCH 177/320] Update Sample_SimpleOpenGL.c --- samples/SimpleOpenGL/Sample_SimpleOpenGL.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/SimpleOpenGL/Sample_SimpleOpenGL.c b/samples/SimpleOpenGL/Sample_SimpleOpenGL.c index 085b95516..a8a3532cf 100644 --- a/samples/SimpleOpenGL/Sample_SimpleOpenGL.c +++ b/samples/SimpleOpenGL/Sample_SimpleOpenGL.c @@ -49,7 +49,7 @@ void reshape(int width, int height) } /* ---------------------------------------------------------------------------- */ -void get_bounding_box_for_node (const ax = min->y = min->z = 1e10f; From 52d01704705fcd692be3b0009f4d9b7d12e48dd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabien=20P=C3=A9an?= Date: Mon, 9 Sep 2019 23:00:04 +0200 Subject: [PATCH 178/320] Update CMakeLists.txt --- samples/SimpleOpenGL/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/SimpleOpenGL/CMakeLists.txt b/samples/SimpleOpenGL/CMakeLists.txt index e594f2dae..93f389741 100644 --- a/samples/SimpleOpenGL/CMakeLists.txt +++ b/samples/SimpleOpenGL/CMakeLists.txt @@ -25,6 +25,7 @@ INCLUDE_DIRECTORIES( ${Assimp_SOURCE_DIR}/include ${Assimp_SOURCE_DIR}/code ${OPENGL_INCLUDE_DIR} + ${GLUT_INCLUDE_DIR} ${Assimp_SOURCE_DIR}/samples/freeglut/include ) From b9cff2a0194fe758ce4b28548d27eb259ec340bf Mon Sep 17 00:00:00 2001 From: escherstair Date: Tue, 10 Sep 2019 07:54:07 +0200 Subject: [PATCH 179/320] prefer prefix ++/-- operators for non-primitive types --- code/X3D/X3DImporter_Postprocess.cpp | 46 ++++++++++++++-------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/code/X3D/X3DImporter_Postprocess.cpp b/code/X3D/X3DImporter_Postprocess.cpp index e113b1bad..539563fcf 100644 --- a/code/X3D/X3DImporter_Postprocess.cpp +++ b/code/X3D/X3DImporter_Postprocess.cpp @@ -289,7 +289,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle // at first create mesh from existing vertices. *pMesh = GeometryHelper_MakeMesh(tnemesh.CoordIdx, tnemesh.Vertices); // copy additional information from children - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Color) MeshGeometry_AddColor(**pMesh, ((CX3DImporter_NodeElement_Color*)*ch_it)->Value, tnemesh.ColorPerVertex); @@ -301,7 +301,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle MeshGeometry_AddTexCoord(**pMesh, ((CX3DImporter_NodeElement_TextureCoordinate*)*ch_it)->Value); else throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of ElevationGrid: " + to_string((*ch_it)->Type) + "."); - }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. }// if(pNodeElement.Type == CX3DImporter_NodeElement::ENET_ElevationGrid) @@ -313,7 +313,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle CX3DImporter_NodeElement_IndexedSet& tnemesh = *((CX3DImporter_NodeElement_IndexedSet*)&pNodeElement);// create alias for convenience // at first search for node and create mesh. - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Coordinate) { @@ -322,7 +322,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle } // copy additional information from children - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Color) MeshGeometry_AddColor(**pMesh, tnemesh.CoordIndex, tnemesh.ColorIndex, ((CX3DImporter_NodeElement_Color*)*ch_it)->Value, tnemesh.ColorPerVertex); @@ -338,7 +338,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle MeshGeometry_AddTexCoord(**pMesh, tnemesh.CoordIndex, tnemesh.TexCoordIndex, ((CX3DImporter_NodeElement_TextureCoordinate*)*ch_it)->Value); else throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of IndexedFaceSet: " + to_string((*ch_it)->Type) + "."); - }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. }// if(pNodeElement.Type == CX3DImporter_NodeElement::ENET_IndexedFaceSet) @@ -348,7 +348,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle CX3DImporter_NodeElement_IndexedSet& tnemesh = *((CX3DImporter_NodeElement_IndexedSet*)&pNodeElement);// create alias for convenience // at first search for node and create mesh. - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Coordinate) { @@ -357,7 +357,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle } // copy additional information from children - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { ai_assert(*pMesh); if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Color) @@ -369,7 +369,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle {} // skip because already read when mesh created. else throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of IndexedLineSet: " + to_string((*ch_it)->Type) + "."); - }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. }// if(pNodeElement.Type == CX3DImporter_NodeElement::ENET_IndexedLineSet) @@ -381,7 +381,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle CX3DImporter_NodeElement_IndexedSet& tnemesh = *((CX3DImporter_NodeElement_IndexedSet*)&pNodeElement);// create alias for convenience // at first search for node and create mesh. - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Coordinate) { @@ -390,7 +390,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle } // copy additional information from children - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { ai_assert(*pMesh); if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Color) @@ -408,7 +408,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle else throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of IndexedTriangleSet or IndexedTriangleFanSet, or \ IndexedTriangleStripSet: " + to_string((*ch_it)->Type) + "."); - }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. }// if((pNodeElement.Type == CX3DImporter_NodeElement::ENET_IndexedTriangleFanSet) || (pNodeElement.Type == CX3DImporter_NodeElement::ENET_IndexedTriangleStripSet)) @@ -430,7 +430,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle CX3DImporter_NodeElement_Set& tnemesh = *((CX3DImporter_NodeElement_Set*)&pNodeElement);// create alias for convenience // at first search for node and create mesh. - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Coordinate) { @@ -448,7 +448,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle } // copy additional information from children - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { ai_assert(*pMesh); if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Color) @@ -459,7 +459,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle {} // skip because already read when mesh created. else throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of PointSet: " + to_string((*ch_it)->Type) + "."); - }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. }// if(pNodeElement.Type == CX3DImporter_NodeElement::ENET_PointSet) @@ -469,7 +469,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle CX3DImporter_NodeElement_Set& tnemesh = *((CX3DImporter_NodeElement_Set*)&pNodeElement);// create alias for convenience // at first search for node and create mesh. - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Coordinate) { @@ -478,7 +478,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle } // copy additional information from children - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { ai_assert(*pMesh); if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Color) @@ -489,7 +489,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle {} // skip because already read when mesh created. else throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of LineSet: " + to_string((*ch_it)->Type) + "."); - }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. }// if(pNodeElement.Type == CX3DImporter_NodeElement::ENET_LineSet) @@ -499,7 +499,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle CX3DImporter_NodeElement_Set& tnemesh = *((CX3DImporter_NodeElement_Set*)&pNodeElement);// create alias for convenience // at first search for node and create mesh. - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Coordinate) { @@ -508,7 +508,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle } // copy additional information from children - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { if ( nullptr == *pMesh ) { break; @@ -526,7 +526,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle MeshGeometry_AddTexCoord(**pMesh, tnemesh.CoordIndex, tnemesh.TexCoordIndex, ((CX3DImporter_NodeElement_TextureCoordinate*)*ch_it)->Value); else throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of TrianlgeFanSet: " + to_string((*ch_it)->Type) + "."); - }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. }// if(pNodeElement.Type == CX3DImporter_NodeElement::ENET_TriangleFanSet) @@ -536,7 +536,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle CX3DImporter_NodeElement_Set& tnemesh = *((CX3DImporter_NodeElement_Set*)&pNodeElement);// create alias for convenience // at first search for node and create mesh. - for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) { if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Coordinate) { @@ -570,7 +570,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle MeshGeometry_AddTexCoord(**pMesh, tnemesh.CoordIndex, tnemesh.TexCoordIndex, ((CX3DImporter_NodeElement_TextureCoordinate*)*ch_it)->Value); else throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of TrianlgeSet: " + to_string((*ch_it)->Type) + "."); - }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. }// if(pNodeElement.Type == CX3DImporter_NodeElement::ENET_TriangleSet) @@ -605,7 +605,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle MeshGeometry_AddTexCoord(**pMesh, tnemesh.CoordIndex, tnemesh.TexCoordIndex, ((CX3DImporter_NodeElement_TextureCoordinate*)*ch_it)->Value); else throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of TriangleStripSet: " + to_string((*ch_it)->Type) + "."); - }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ch_it++) + }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. }// if(pNodeElement.Type == CX3DImporter_NodeElement::ENET_TriangleStripSet) From e1322f9178aecb94bf053f8efa2aa12d5394a414 Mon Sep 17 00:00:00 2001 From: Robert Spencer Date: Tue, 10 Sep 2019 20:38:31 +0100 Subject: [PATCH 180/320] Fix indentation error in python bindings --- port/PyAssimp/pyassimp/helper.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/port/PyAssimp/pyassimp/helper.py b/port/PyAssimp/pyassimp/helper.py index 4003fb5ad..5c1aca827 100644 --- a/port/PyAssimp/pyassimp/helper.py +++ b/port/PyAssimp/pyassimp/helper.py @@ -274,8 +274,8 @@ def hasattr_silent(object, name): """ try: - if not object: - return False + if not object: + return False return hasattr(object, name) except AttributeError: return False From d91eebf347b370336e4212ae9921ae25694f0172 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 10 Sep 2019 22:13:54 +0200 Subject: [PATCH 181/320] Add ortho camera. --- code/glTF/glTFAssetWriter.inl | 6 ++- code/glTF/glTFImporter.cpp | 80 +++++++++++++++++------------------ include/assimp/camera.h | 2 - 3 files changed, 42 insertions(+), 46 deletions(-) diff --git a/code/glTF/glTFAssetWriter.inl b/code/glTF/glTFAssetWriter.inl index 20afb24e7..0aaeca993 100644 --- a/code/glTF/glTFAssetWriter.inl +++ b/code/glTF/glTFAssetWriter.inl @@ -55,7 +55,8 @@ namespace glTF { namespace { template - inline Value& MakeValue(Value& val, float(&r)[N], MemoryPoolAllocator<>& al) { + inline + Value& MakeValue(Value& val, float(&r)[N], MemoryPoolAllocator<>& al) { val.SetArray(); val.Reserve(N, al); for (decltype(N) i = 0; i < N; ++i) { @@ -64,7 +65,8 @@ namespace glTF { return val; } - inline Value& MakeValue(Value& val, const std::vector & r, MemoryPoolAllocator<>& al) { + inline + Value& MakeValue(Value& val, const std::vector & r, MemoryPoolAllocator<>& al) { val.SetArray(); val.Reserve(static_cast(r.size()), al); for (unsigned int i = 0; i < r.size(); ++i) { diff --git a/code/glTF/glTFImporter.cpp b/code/glTF/glTFImporter.cpp index 146d7453e..edcc30636 100644 --- a/code/glTF/glTFImporter.cpp +++ b/code/glTF/glTFImporter.cpp @@ -82,7 +82,7 @@ glTFImporter::glTFImporter() : BaseImporter() , meshOffsets() , embeddedTexIdxs() -, mScene( NULL ) { +, mScene( nullptr ) { // empty } @@ -90,17 +90,16 @@ glTFImporter::~glTFImporter() { // empty } -const aiImporterDesc* glTFImporter::GetInfo() const -{ +const aiImporterDesc* glTFImporter::GetInfo() const { return &desc; } -bool glTFImporter::CanRead(const std::string& pFile, IOSystem* pIOHandler, bool /* checkSig */) const -{ +bool glTFImporter::CanRead(const std::string& pFile, IOSystem* pIOHandler, bool /* checkSig */) const { const std::string &extension = GetExtension(pFile); - if (extension != "gltf" && extension != "glb") + if (extension != "gltf" && extension != "glb") { return false; + } if (pIOHandler) { glTF::Asset asset(pIOHandler); @@ -116,44 +115,42 @@ bool glTFImporter::CanRead(const std::string& pFile, IOSystem* pIOHandler, bool return false; } - - -//static void CopyValue(const glTF::vec3& v, aiColor3D& out) -//{ -// out.r = v[0]; out.g = v[1]; out.b = v[2]; -//} - -static void CopyValue(const glTF::vec4& v, aiColor4D& out) -{ - out.r = v[0]; out.g = v[1]; out.b = v[2]; out.a = v[3]; +static void CopyValue(const glTF::vec4& v, aiColor4D& out) { + out.r = v[0]; + out.g = v[1]; + out.b = v[2]; + out.a = v[3]; } -static void CopyValue(const glTF::vec4& v, aiColor3D& out) -{ - out.r = v[0]; out.g = v[1]; out.b = v[2]; +static void CopyValue(const glTF::vec4& v, aiColor3D& out) { + out.r = v[0]; + out.g = v[1]; + out.b = v[2]; } -static void CopyValue(const glTF::vec3& v, aiVector3D& out) -{ - out.x = v[0]; out.y = v[1]; out.z = v[2]; +static void CopyValue(const glTF::vec3& v, aiVector3D& out) { + out.x = v[0]; + out.y = v[1]; + out.z = v[2]; } -static void CopyValue(const glTF::vec4& v, aiQuaternion& out) -{ - out.x = v[0]; out.y = v[1]; out.z = v[2]; out.w = v[3]; +static void CopyValue(const glTF::vec4& v, aiQuaternion& out) { + out.x = v[0]; + out.y = v[1]; + out.z = v[2]; + out.w = v[3]; } -static void CopyValue(const glTF::mat4& v, aiMatrix4x4& o) -{ +static void CopyValue(const glTF::mat4& v, aiMatrix4x4& o) { o.a1 = v[ 0]; o.b1 = v[ 1]; o.c1 = v[ 2]; o.d1 = v[ 3]; o.a2 = v[ 4]; o.b2 = v[ 5]; o.c2 = v[ 6]; o.d2 = v[ 7]; o.a3 = v[ 8]; o.b3 = v[ 9]; o.c3 = v[10]; o.d3 = v[11]; o.a4 = v[12]; o.b4 = v[13]; o.c4 = v[14]; o.d4 = v[15]; } -inline void SetMaterialColorProperty(std::vector& embeddedTexIdxs, Asset& /*r*/, glTF::TexProperty prop, aiMaterial* mat, - aiTextureType texType, const char* pKey, unsigned int type, unsigned int idx) -{ +inline +void SetMaterialColorProperty(std::vector& embeddedTexIdxs, Asset& /*r*/, glTF::TexProperty prop, aiMaterial* mat, + aiTextureType texType, const char* pKey, unsigned int type, unsigned int idx) { if (prop.texture) { if (prop.texture->source) { aiString uri(prop.texture->source->uri); @@ -167,16 +164,14 @@ inline void SetMaterialColorProperty(std::vector& embeddedTexIdxs, Asset& / mat->AddProperty(&uri, _AI_MATKEY_TEXTURE_BASE, texType, 0); } - } - else { + } else { aiColor4D col; CopyValue(prop.color, col); mat->AddProperty(&col, 1, pKey, type, idx); } } -void glTFImporter::ImportMaterials(glTF::Asset& r) -{ +void glTFImporter::ImportMaterials(glTF::Asset& r) { mScene->mNumMaterials = unsigned(r.materials.Size()); mScene->mMaterials = new aiMaterial*[mScene->mNumMaterials]; @@ -499,27 +494,28 @@ void glTFImporter::ImportMeshes(glTF::Asset& r) CopyVector(meshes, mScene->mMeshes, mScene->mNumMeshes); } -void glTFImporter::ImportCameras(glTF::Asset& r) -{ - if (!r.cameras.Size()) return; +void glTFImporter::ImportCameras(glTF::Asset& r) { + if (!r.cameras.Size()) { + return; + } mScene->mNumCameras = r.cameras.Size(); mScene->mCameras = new aiCamera*[r.cameras.Size()]; - for (size_t i = 0; i < r.cameras.Size(); ++i) { Camera& cam = r.cameras[i]; aiCamera* aicam = mScene->mCameras[i] = new aiCamera(); if (cam.type == Camera::Perspective) { - aicam->mAspect = cam.perspective.aspectRatio; aicam->mHorizontalFOV = cam.perspective.yfov * aicam->mAspect; aicam->mClipPlaneFar = cam.perspective.zfar; aicam->mClipPlaneNear = cam.perspective.znear; - } - else { - // assimp does not support orthographic cameras + } else { + aicam->mClipPlaneFar = cam.ortographic.zfar; + aicam->mClipPlaneNear = cam.ortographic.znear; + aicam->mHorizontalFOV = 0.0; + aicam->mAspect = cam.ortographic.xmag / cam.ortographic.ymag; } } } diff --git a/include/assimp/camera.h b/include/assimp/camera.h index e573eea5d..a9a9f7653 100644 --- a/include/assimp/camera.h +++ b/include/assimp/camera.h @@ -113,7 +113,6 @@ struct aiCamera */ C_STRUCT aiVector3D mPosition; - /** 'Up' - vector of the camera coordinate system relative to * the coordinate space defined by the corresponding node. * @@ -134,7 +133,6 @@ struct aiCamera */ C_STRUCT aiVector3D mLookAt; - /** Half horizontal field of view angle, in radians. * * The field of view angle is the angle between the center From 7ff7a5d64e40e2c3794e3d3580542afdf30a3e78 Mon Sep 17 00:00:00 2001 From: kimkulling Date: Wed, 11 Sep 2019 17:00:39 +0200 Subject: [PATCH 182/320] glTF: Try to remove duplicate code. --- code/CMakeLists.txt | 2 + code/Common/BaseImporter.cpp | 2 +- code/glTF/glTFAsset.h | 69 ++------- code/glTF/glTFAsset.inl | 194 +------------------------ code/glTF/glTFAssetWriter.inl | 2 +- code/glTF/glTFCommon.cpp | 193 +++++++++++++++++++++++++ code/glTF/glTFCommon.h | 241 ++++++++++++++++++++++++++++++++ code/glTF/glTFImporter.cpp | 33 ----- code/glTF2/glTF2Asset.h | 69 ++------- code/glTF2/glTF2Asset.inl | 196 +------------------------- code/glTF2/glTF2AssetWriter.inl | 2 +- code/glTF2/glTF2Importer.cpp | 23 +-- 12 files changed, 479 insertions(+), 547 deletions(-) create mode 100644 code/glTF/glTFCommon.cpp create mode 100644 code/glTF/glTFCommon.h diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 447a02bf2..55538d965 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -766,6 +766,8 @@ ADD_ASSIMP_EXPORTER( X3D ) ADD_ASSIMP_IMPORTER( GLTF + glTF/glTFCommon.h + glTF/glTFCommon.cpp glTF/glTFAsset.h glTF/glTFAsset.inl glTF/glTFAssetWriter.h diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index de5018a25..b77bbfe23 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -85,7 +85,7 @@ void BaseImporter::UpdateImporterScale( Importer* pImp ) double activeScale = importerScale * fileScale; // Set active scaling - pImp->SetPropertyFloat( AI_CONFIG_APP_SCALE_KEY, activeScale); + pImp->SetPropertyFloat( AI_CONFIG_APP_SCALE_KEY, static_cast( activeScale) ); ASSIMP_LOG_DEBUG_F("UpdateImporterScale scale set: %f", activeScale ); } diff --git a/code/glTF/glTFAsset.h b/code/glTF/glTFAsset.h index 359917b95..ddc7f086e 100644 --- a/code/glTF/glTFAsset.h +++ b/code/glTF/glTFAsset.h @@ -92,38 +92,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # endif #endif +#include "glTF/glTFCommon.h" + namespace glTF { -#ifdef ASSIMP_API - using Assimp::IOStream; - using Assimp::IOSystem; - using std::shared_ptr; -#else - using std::shared_ptr; - - typedef std::runtime_error DeadlyImportError; - typedef std::runtime_error DeadlyExportError; - - enum aiOrigin { aiOrigin_SET = 0, aiOrigin_CUR = 1, aiOrigin_END = 2 }; - class IOSystem; - class IOStream - { - FILE* f; - public: - IOStream(FILE* file) : f(file) {} - ~IOStream() { fclose(f); f = 0; } - - size_t Read(void* b, size_t sz, size_t n) { return fread(b, sz, n, f); } - size_t Write(const void* b, size_t sz, size_t n) { return fwrite(b, sz, n, f); } - int Seek(size_t off, aiOrigin orig) { return fseek(f, off, int(orig)); } - size_t Tell() const { return ftell(f); } - - size_t FileSize() { - long p = Tell(), len = (Seek(0, aiOrigin_END), Tell()); - return size_t((Seek(p, aiOrigin_SET), len)); - } - }; -#endif + using glTFCommon::shared_ptr; + using glTFCommon::IOSystem; + using glTFCommon::IOStream; using rapidjson::Value; using rapidjson::Document; @@ -136,37 +111,9 @@ namespace glTF struct Light; struct Skin; - - // Vec/matrix types, as raw float arrays - typedef float (vec3)[3]; - typedef float (vec4)[4]; - typedef float (mat4)[16]; - - - namespace Util - { - void EncodeBase64(const uint8_t* in, size_t inLength, std::string& out); - - size_t DecodeBase64(const char* in, size_t inLength, uint8_t*& out); - - inline size_t DecodeBase64(const char* in, uint8_t*& out) - { - return DecodeBase64(in, strlen(in), out); - } - - struct DataURI - { - const char* mediaType; - const char* charset; - bool base64; - const char* data; - size_t dataLength; - }; - - //! Check if a uri is a data URI - inline bool ParseDataURI(const char* uri, size_t uriLen, DataURI& out); - } - + using glTFCommon::vec3; + using glTFCommon::vec4; + using glTFCommon::mat4; //! Magic number for GLB files #define AI_GLB_MAGIC_NUMBER "glTF" diff --git a/code/glTF/glTFAsset.inl b/code/glTF/glTFAsset.inl index 7b7acd705..c06aa7fb5 100644 --- a/code/glTF/glTFAsset.inl +++ b/code/glTF/glTFAsset.inl @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -52,6 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #endif using namespace Assimp; +using namespace glTFCommon; namespace glTF { @@ -301,7 +301,7 @@ inline void Buffer::Read(Value& obj, Asset& r) const char* uri = it->GetString(); - Util::DataURI dataURI; + glTFCommon::Util::DataURI dataURI; if (ParseDataURI(uri, it->GetStringLength(), dataURI)) { if (dataURI.base64) { uint8_t* data = 0; @@ -654,12 +654,12 @@ inline void Image::Read(Value& obj, Asset& r) if (Value* uri = FindString(obj, "uri")) { const char* uristr = uri->GetString(); - Util::DataURI dataURI; + glTFCommon::Util::DataURI dataURI; if (ParseDataURI(uristr, uri->GetStringLength(), dataURI)) { mimeType = dataURI.mediaType; if (dataURI.base64) { uint8_t *ptr = nullptr; - mDataLength = Util::DecodeBase64(dataURI.data, dataURI.dataLength, ptr); + mDataLength = glTFCommon::Util::DecodeBase64(dataURI.data, dataURI.dataLength, ptr); mData.reset(ptr); } } @@ -1474,190 +1474,4 @@ inline std::string Asset::FindUniqueID(const std::string& str, const char* suffi return id; } -namespace Util { - - inline - bool ParseDataURI(const char* const_uri, size_t uriLen, DataURI& out) { - if ( NULL == const_uri ) { - return false; - } - - if (const_uri[0] != 0x10) { // we already parsed this uri? - if (strncmp(const_uri, "data:", 5) != 0) // not a data uri? - return false; - } - - // set defaults - out.mediaType = "text/plain"; - out.charset = "US-ASCII"; - out.base64 = false; - - char* uri = const_cast(const_uri); - if (uri[0] != 0x10) { - uri[0] = 0x10; - uri[1] = uri[2] = uri[3] = uri[4] = 0; - - size_t i = 5, j; - if (uri[i] != ';' && uri[i] != ',') { // has media type? - uri[1] = char(i); - for (; uri[i] != ';' && uri[i] != ',' && i < uriLen; ++i) { - // nothing to do! - } - } - while (uri[i] == ';' && i < uriLen) { - uri[i++] = '\0'; - for (j = i; uri[i] != ';' && uri[i] != ',' && i < uriLen; ++i) { - // nothing to do! - } - - if ( strncmp( uri + j, "charset=", 8 ) == 0 ) { - uri[2] = char(j + 8); - } else if ( strncmp( uri + j, "base64", 6 ) == 0 ) { - uri[3] = char(j); - } - } - if (i < uriLen) { - uri[i++] = '\0'; - uri[4] = char(i); - } else { - uri[1] = uri[2] = uri[3] = 0; - uri[4] = 5; - } - } - - if ( uri[ 1 ] != 0 ) { - out.mediaType = uri + uri[ 1 ]; - } - if ( uri[ 2 ] != 0 ) { - out.charset = uri + uri[ 2 ]; - } - if ( uri[ 3 ] != 0 ) { - out.base64 = true; - } - out.data = uri + uri[4]; - out.dataLength = (uri + uriLen) - out.data; - - return true; - } - - template - struct DATA - { - static const uint8_t tableDecodeBase64[128]; - }; - - template - const uint8_t DATA::tableDecodeBase64[128] = { - 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, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 64, 0, 0, - 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, - 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0 - }; - - inline char EncodeCharBase64(uint8_t b) - { - return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[size_t(b)]; - } - - inline uint8_t DecodeCharBase64(char c) - { - return DATA::tableDecodeBase64[size_t(c)]; // TODO faster with lookup table or ifs? - /*if (c >= 'A' && c <= 'Z') return c - 'A'; - if (c >= 'a' && c <= 'z') return c - 'a' + 26; - if (c >= '0' && c <= '9') return c - '0' + 52; - if (c == '+') return 62; - if (c == '/') return 63; - return 64; // '-' */ - } - - inline size_t DecodeBase64(const char* in, size_t inLength, uint8_t*& out) - { - ai_assert(inLength % 4 == 0); - - if (inLength < 4) { - out = 0; - return 0; - } - - int nEquals = int(in[inLength - 1] == '=') + - int(in[inLength - 2] == '='); - - size_t outLength = (inLength * 3) / 4 - nEquals; - out = new uint8_t[outLength]; - memset(out, 0, outLength); - - size_t i, j = 0; - - for (i = 0; i + 4 < inLength; i += 4) { - uint8_t b0 = DecodeCharBase64(in[i]); - uint8_t b1 = DecodeCharBase64(in[i + 1]); - uint8_t b2 = DecodeCharBase64(in[i + 2]); - uint8_t b3 = DecodeCharBase64(in[i + 3]); - - out[j++] = (uint8_t)((b0 << 2) | (b1 >> 4)); - out[j++] = (uint8_t)((b1 << 4) | (b2 >> 2)); - out[j++] = (uint8_t)((b2 << 6) | b3); - } - - { - uint8_t b0 = DecodeCharBase64(in[i]); - uint8_t b1 = DecodeCharBase64(in[i + 1]); - uint8_t b2 = DecodeCharBase64(in[i + 2]); - uint8_t b3 = DecodeCharBase64(in[i + 3]); - - out[j++] = (uint8_t)((b0 << 2) | (b1 >> 4)); - if (b2 < 64) out[j++] = (uint8_t)((b1 << 4) | (b2 >> 2)); - if (b3 < 64) out[j++] = (uint8_t)((b2 << 6) | b3); - } - - return outLength; - } - - - - inline void EncodeBase64( - const uint8_t* in, size_t inLength, - std::string& out) - { - size_t outLength = ((inLength + 2) / 3) * 4; - - size_t j = out.size(); - out.resize(j + outLength); - - for (size_t i = 0; i < inLength; i += 3) { - uint8_t b = (in[i] & 0xFC) >> 2; - out[j++] = EncodeCharBase64(b); - - b = (in[i] & 0x03) << 4; - if (i + 1 < inLength) { - b |= (in[i + 1] & 0xF0) >> 4; - out[j++] = EncodeCharBase64(b); - - b = (in[i + 1] & 0x0F) << 2; - if (i + 2 < inLength) { - b |= (in[i + 2] & 0xC0) >> 6; - out[j++] = EncodeCharBase64(b); - - b = in[i + 2] & 0x3F; - out[j++] = EncodeCharBase64(b); - } - else { - out[j++] = EncodeCharBase64(b); - out[j++] = '='; - } - } - else { - out[j++] = EncodeCharBase64(b); - out[j++] = '='; - out[j++] = '='; - } - } - } - -} - } // ns glTF diff --git a/code/glTF/glTFAssetWriter.inl b/code/glTF/glTFAssetWriter.inl index 0aaeca993..1bbb8fd8c 100644 --- a/code/glTF/glTFAssetWriter.inl +++ b/code/glTF/glTFAssetWriter.inl @@ -215,7 +215,7 @@ namespace glTF { else if (img.HasData()) { uri = "data:" + (img.mimeType.empty() ? "application/octet-stream" : img.mimeType); uri += ";base64,"; - Util::EncodeBase64(img.GetData(), img.GetDataLength(), uri); + glTFCommon::Util::EncodeBase64(img.GetData(), img.GetDataLength(), uri); } else { uri = img.uri; diff --git a/code/glTF/glTFCommon.cpp b/code/glTF/glTFCommon.cpp new file mode 100644 index 000000000..cd03224e4 --- /dev/null +++ b/code/glTF/glTFCommon.cpp @@ -0,0 +1,193 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + +All rights reserved. + +Redistribution and use of this software 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 the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +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. + +---------------------------------------------------------------------- +*/ +#include "glTF/glTFCommon.h" + +namespace glTFCommon { + +using namespace glTFCommon::Util; + +namespace Util { + +size_t DecodeBase64(const char* in, size_t inLength, uint8_t*& out) { + ai_assert(inLength % 4 == 0); + + if (inLength < 4) { + out = 0; + return 0; + } + + int nEquals = int(in[inLength - 1] == '=') + + int(in[inLength - 2] == '='); + + size_t outLength = (inLength * 3) / 4 - nEquals; + out = new uint8_t[outLength]; + memset(out, 0, outLength); + + size_t i, j = 0; + + for (i = 0; i + 4 < inLength; i += 4) { + uint8_t b0 = DecodeCharBase64(in[i]); + uint8_t b1 = DecodeCharBase64(in[i + 1]); + uint8_t b2 = DecodeCharBase64(in[i + 2]); + uint8_t b3 = DecodeCharBase64(in[i + 3]); + + out[j++] = (uint8_t)((b0 << 2) | (b1 >> 4)); + out[j++] = (uint8_t)((b1 << 4) | (b2 >> 2)); + out[j++] = (uint8_t)((b2 << 6) | b3); + } + + { + uint8_t b0 = DecodeCharBase64(in[i]); + uint8_t b1 = DecodeCharBase64(in[i + 1]); + uint8_t b2 = DecodeCharBase64(in[i + 2]); + uint8_t b3 = DecodeCharBase64(in[i + 3]); + + out[j++] = (uint8_t)((b0 << 2) | (b1 >> 4)); + if (b2 < 64) out[j++] = (uint8_t)((b1 << 4) | (b2 >> 2)); + if (b3 < 64) out[j++] = (uint8_t)((b2 << 6) | b3); + } + + return outLength; +} + +void EncodeBase64(const uint8_t* in, size_t inLength, std::string& out) { + size_t outLength = ((inLength + 2) / 3) * 4; + + size_t j = out.size(); + out.resize(j + outLength); + + for (size_t i = 0; i < inLength; i += 3) { + uint8_t b = (in[i] & 0xFC) >> 2; + out[j++] = EncodeCharBase64(b); + + b = (in[i] & 0x03) << 4; + if (i + 1 < inLength) { + b |= (in[i + 1] & 0xF0) >> 4; + out[j++] = EncodeCharBase64(b); + + b = (in[i + 1] & 0x0F) << 2; + if (i + 2 < inLength) { + b |= (in[i + 2] & 0xC0) >> 6; + out[j++] = EncodeCharBase64(b); + + b = in[i + 2] & 0x3F; + out[j++] = EncodeCharBase64(b); + } + else { + out[j++] = EncodeCharBase64(b); + out[j++] = '='; + } + } + else { + out[j++] = EncodeCharBase64(b); + out[j++] = '='; + out[j++] = '='; + } + } +} + +bool ParseDataURI(const char* const_uri, size_t uriLen, DataURI& out) { + if (nullptr == const_uri) { + return false; + } + + if (const_uri[0] != 0x10) { // we already parsed this uri? + if (strncmp(const_uri, "data:", 5) != 0) // not a data uri? + return false; + } + + // set defaults + out.mediaType = "text/plain"; + out.charset = "US-ASCII"; + out.base64 = false; + + char* uri = const_cast(const_uri); + if (uri[0] != 0x10) { + uri[0] = 0x10; + uri[1] = uri[2] = uri[3] = uri[4] = 0; + + size_t i = 5, j; + if (uri[i] != ';' && uri[i] != ',') { // has media type? + uri[1] = char(i); + for (; uri[i] != ';' && uri[i] != ',' && i < uriLen; ++i) { + // nothing to do! + } + } + while (uri[i] == ';' && i < uriLen) { + uri[i++] = '\0'; + for (j = i; uri[i] != ';' && uri[i] != ',' && i < uriLen; ++i) { + // nothing to do! + } + + if (strncmp(uri + j, "charset=", 8) == 0) { + uri[2] = char(j + 8); + } + else if (strncmp(uri + j, "base64", 6) == 0) { + uri[3] = char(j); + } + } + if (i < uriLen) { + uri[i++] = '\0'; + uri[4] = char(i); + } + else { + uri[1] = uri[2] = uri[3] = 0; + uri[4] = 5; + } + } + + if (uri[1] != 0) { + out.mediaType = uri + uri[1]; + } + if (uri[2] != 0) { + out.charset = uri + uri[2]; + } + if (uri[3] != 0) { + out.base64 = true; + } + out.data = uri + uri[4]; + out.dataLength = (uri + uriLen) - out.data; + + return true; +} + +} +} diff --git a/code/glTF/glTFCommon.h b/code/glTF/glTFCommon.h new file mode 100644 index 000000000..c5abdc94d --- /dev/null +++ b/code/glTF/glTFCommon.h @@ -0,0 +1,241 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2019, assimp team + +All rights reserved. + +Redistribution and use of this software 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 the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +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. + +---------------------------------------------------------------------- +*/ +#ifndef AI_GLFTCOMMON_H_INC +#define AI_GLFTCOMMON_H_INC + +#ifndef ASSIMP_BUILD_NO_GLTF_IMPORTER + +#include + +#include +#include +#include +#include +#include +#include + +#define RAPIDJSON_HAS_STDSTRING 1 +#include +#include +#include + +#ifdef ASSIMP_API +# include +# include +# include +#else +# include +# define AI_SWAP4(p) +# define ai_assert +#endif + + +#if _MSC_VER > 1500 || (defined __GNUC___) +# define ASSIMP_GLTF_USE_UNORDERED_MULTIMAP +# else +# define gltf_unordered_map map +#endif + +#ifdef ASSIMP_GLTF_USE_UNORDERED_MULTIMAP +# include +# if _MSC_VER > 1600 +# define gltf_unordered_map unordered_map +# else +# define gltf_unordered_map tr1::unordered_map +# endif +#endif + +namespace glTFCommon { + +#ifdef ASSIMP_API + using Assimp::IOStream; + using Assimp::IOSystem; + using std::shared_ptr; +#else + using std::shared_ptr; + + typedef std::runtime_error DeadlyImportError; + typedef std::runtime_error DeadlyExportError; + + enum aiOrigin { + aiOrigin_SET = 0, + aiOrigin_CUR = 1, + aiOrigin_END = 2 + }; + + class IOSystem; + + class IOStream { + public: + IOStream(FILE* file) : f(file) {} + ~IOStream() { fclose(f); f = 0; } + + size_t Read(void* b, size_t sz, size_t n) { return fread(b, sz, n, f); } + size_t Write(const void* b, size_t sz, size_t n) { return fwrite(b, sz, n, f); } + int Seek(size_t off, aiOrigin orig) { return fseek(f, off, int(orig)); } + size_t Tell() const { return ftell(f); } + + size_t FileSize() { + long p = Tell(), len = (Seek(0, aiOrigin_END), Tell()); + return size_t((Seek(p, aiOrigin_SET), len)); + } + + private: + FILE* f; + }; +#endif + + // Vec/matrix types, as raw float arrays + typedef float(vec3)[3]; + typedef float(vec4)[4]; + typedef float(mat4)[16]; + + static void CopyValue(const glTFCommon::vec3& v, aiColor4D& out) { + out.r = v[0]; + out.g = v[1]; + out.b = v[2]; + out.a = 1.0; + } + + static void CopyValue(const glTFCommon::vec4& v, aiColor4D& out) { + out.r = v[0]; + out.g = v[1]; + out.b = v[2]; + out.a = v[3]; + } + + static void CopyValue(const glTFCommon::vec4& v, aiColor3D& out) { + out.r = v[0]; + out.g = v[1]; + out.b = v[2]; + } + + static void CopyValue(const glTFCommon::vec3& v, aiColor3D& out) { + out.r = v[0]; + out.g = v[1]; + out.b = v[2]; + } + + static void CopyValue(const glTFCommon::vec3& v, aiVector3D& out) { + out.x = v[0]; + out.y = v[1]; + out.z = v[2]; + } + + static void CopyValue(const glTFCommon::vec4& v, aiQuaternion& out) { + out.x = v[0]; + out.y = v[1]; + out.z = v[2]; + out.w = v[3]; + } + + static void CopyValue(const glTFCommon::mat4& v, aiMatrix4x4& o) { + o.a1 = v[0]; o.b1 = v[1]; o.c1 = v[2]; o.d1 = v[3]; + o.a2 = v[4]; o.b2 = v[5]; o.c2 = v[6]; o.d2 = v[7]; + o.a3 = v[8]; o.b3 = v[9]; o.c3 = v[10]; o.d3 = v[11]; + o.a4 = v[12]; o.b4 = v[13]; o.c4 = v[14]; o.d4 = v[15]; + } + + namespace Util { + + void EncodeBase64(const uint8_t* in, size_t inLength, std::string& out); + + size_t DecodeBase64(const char* in, size_t inLength, uint8_t*& out); + + inline + size_t DecodeBase64(const char* in, uint8_t*& out) { + return DecodeBase64(in, strlen(in), out); + } + + struct DataURI { + const char* mediaType; + const char* charset; + bool base64; + const char* data; + size_t dataLength; + }; + + //! Check if a uri is a data URI + bool ParseDataURI(const char* const_uri, size_t uriLen, DataURI& out); + + template + struct DATA { + static const uint8_t tableDecodeBase64[128]; + }; + + template + const uint8_t DATA::tableDecodeBase64[128] = { + 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 64, 0, 0, + 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, + 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0 + }; + + inline + char EncodeCharBase64(uint8_t b) { + return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[size_t(b)]; + } + + inline + uint8_t DecodeCharBase64(char c) { + return DATA::tableDecodeBase64[size_t(c)]; // TODO faster with lookup table or ifs? + /*if (c >= 'A' && c <= 'Z') return c - 'A'; + if (c >= 'a' && c <= 'z') return c - 'a' + 26; + if (c >= '0' && c <= '9') return c - '0' + 52; + if (c == '+') return 62; + if (c == '/') return 63; + return 64; // '-' */ + } + + size_t DecodeBase64(const char* in, size_t inLength, uint8_t*& out); + + void EncodeBase64(const uint8_t* in, size_t inLength, std::string& out); + } + +} + +#endif // ASSIMP_BUILD_NO_GLTF_IMPORTER + +#endif // AI_GLFTCOMMON_H_INC diff --git a/code/glTF/glTFImporter.cpp b/code/glTF/glTFImporter.cpp index edcc30636..cc7ab7211 100644 --- a/code/glTF/glTFImporter.cpp +++ b/code/glTF/glTFImporter.cpp @@ -115,39 +115,6 @@ bool glTFImporter::CanRead(const std::string& pFile, IOSystem* pIOHandler, bool return false; } -static void CopyValue(const glTF::vec4& v, aiColor4D& out) { - out.r = v[0]; - out.g = v[1]; - out.b = v[2]; - out.a = v[3]; -} - -static void CopyValue(const glTF::vec4& v, aiColor3D& out) { - out.r = v[0]; - out.g = v[1]; - out.b = v[2]; -} - -static void CopyValue(const glTF::vec3& v, aiVector3D& out) { - out.x = v[0]; - out.y = v[1]; - out.z = v[2]; -} - -static void CopyValue(const glTF::vec4& v, aiQuaternion& out) { - out.x = v[0]; - out.y = v[1]; - out.z = v[2]; - out.w = v[3]; -} - -static void CopyValue(const glTF::mat4& v, aiMatrix4x4& o) { - o.a1 = v[ 0]; o.b1 = v[ 1]; o.c1 = v[ 2]; o.d1 = v[ 3]; - o.a2 = v[ 4]; o.b2 = v[ 5]; o.c2 = v[ 6]; o.d2 = v[ 7]; - o.a3 = v[ 8]; o.b3 = v[ 9]; o.c3 = v[10]; o.d3 = v[11]; - o.a4 = v[12]; o.b4 = v[13]; o.c4 = v[14]; o.d4 = v[15]; -} - inline void SetMaterialColorProperty(std::vector& embeddedTexIdxs, Asset& /*r*/, glTF::TexProperty prop, aiMaterial* mat, aiTextureType texType, const char* pKey, unsigned int type, unsigned int idx) { diff --git a/code/glTF2/glTF2Asset.h b/code/glTF2/glTF2Asset.h index 23015c90a..15c4c44fa 100644 --- a/code/glTF2/glTF2Asset.h +++ b/code/glTF2/glTF2Asset.h @@ -95,38 +95,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include +#include "glTF/glTFCommon.h" + namespace glTF2 { -#ifdef ASSIMP_API - using Assimp::IOStream; - using Assimp::IOSystem; - using std::shared_ptr; -#else - using std::shared_ptr; - - typedef std::runtime_error DeadlyImportError; - typedef std::runtime_error DeadlyExportError; - - enum aiOrigin { aiOrigin_SET = 0, aiOrigin_CUR = 1, aiOrigin_END = 2 }; - class IOSystem; - class IOStream - { - FILE* f; - public: - IOStream(FILE* file) : f(file) {} - ~IOStream() { fclose(f); f = 0; } - - size_t Read(void* b, size_t sz, size_t n) { return fread(b, sz, n, f); } - size_t Write(const void* b, size_t sz, size_t n) { return fwrite(b, sz, n, f); } - int Seek(size_t off, aiOrigin orig) { return fseek(f, off, int(orig)); } - size_t Tell() const { return ftell(f); } - - size_t FileSize() { - long p = Tell(), len = (Seek(0, aiOrigin_END), Tell()); - return size_t((Seek(p, aiOrigin_SET), len)); - } - }; -#endif + using glTFCommon::shared_ptr; + using glTFCommon::IOSystem; + using glTFCommon::IOStream; using rapidjson::Value; using rapidjson::Document; @@ -138,35 +113,9 @@ namespace glTF2 struct Texture; struct Skin; - // Vec/matrix types, as raw float arrays - typedef float (vec3)[3]; - typedef float (vec4)[4]; - typedef float (mat4)[16]; - - namespace Util - { - void EncodeBase64(const uint8_t* in, size_t inLength, std::string& out); - - size_t DecodeBase64(const char* in, size_t inLength, uint8_t*& out); - - inline size_t DecodeBase64(const char* in, uint8_t*& out) - { - return DecodeBase64(in, strlen(in), out); - } - - struct DataURI - { - const char* mediaType; - const char* charset; - bool base64; - const char* data; - size_t dataLength; - }; - - //! Check if a uri is a data URI - inline bool ParseDataURI(const char* uri, size_t uriLen, DataURI& out); - } - + using glTFCommon::vec3; + using glTFCommon::vec4; + using glTFCommon::mat4; //! Magic number for GLB files #define AI_GLB_MAGIC_NUMBER "glTF" @@ -552,7 +501,7 @@ namespace glTF2 /// but in real life you'll get: /// "accessor_0" : { byteOffset: 0, byteLength: 4}, "accessor_1" : { byteOffset: 2, byteLength: 4} /// Yes, accessor of next mesh has offset and length which mean: current mesh data is decoded, all other data is encoded. - /// And when before you start to read data of current mesh (with encoded data ofcourse) you must decode region of "bufferView", after read finished + /// And when before you start to read data of current mesh (with encoded data of course) you must decode region of "bufferView", after read finished /// delete encoding mark. And after that you can repeat process: decode data of mesh, read, delete decoded data. /// /// Remark. Encoding all data at once is good in world with computers which do not has RAM limitation. So, you must use step by step encoding in diff --git a/code/glTF2/glTF2Asset.inl b/code/glTF2/glTF2Asset.inl index 6f9eba50b..e5e4a58c1 100644 --- a/code/glTF2/glTF2Asset.inl +++ b/code/glTF2/glTF2Asset.inl @@ -282,9 +282,7 @@ Ref LazyDict::Retrieve(unsigned int i) template Ref LazyDict::Get(unsigned int i) { - return Ref(mObjs, i); - } template @@ -361,11 +359,11 @@ inline void Buffer::Read(Value& obj, Asset& r) const char* uri = it->GetString(); - Util::DataURI dataURI; + glTFCommon::Util::DataURI dataURI; if (ParseDataURI(uri, it->GetStringLength(), dataURI)) { if (dataURI.base64) { uint8_t* data = 0; - this->byteLength = Util::DecodeBase64(dataURI.data, dataURI.dataLength, data); + this->byteLength = glTFCommon::Util::DecodeBase64(dataURI.data, dataURI.dataLength, data); this->mData.reset(data, std::default_delete()); if (statedLength > 0 && this->byteLength != statedLength) { @@ -717,12 +715,12 @@ inline void Image::Read(Value& obj, Asset& r) if (Value* uri = FindString(obj, "uri")) { const char* uristr = uri->GetString(); - Util::DataURI dataURI; + glTFCommon::Util::DataURI dataURI; if (ParseDataURI(uristr, uri->GetStringLength(), dataURI)) { mimeType = dataURI.mediaType; if (dataURI.base64) { uint8_t *ptr = nullptr; - mDataLength = Util::DecodeBase64(dataURI.data, dataURI.dataLength, ptr); + mDataLength = glTFCommon::Util::DecodeBase64(dataURI.data, dataURI.dataLength, ptr); mData.reset(ptr); } } @@ -1515,190 +1513,4 @@ inline std::string Asset::FindUniqueID(const std::string& str, const char* suffi return id; } -namespace Util { - - inline - bool ParseDataURI(const char* const_uri, size_t uriLen, DataURI& out) { - if ( NULL == const_uri ) { - return false; - } - - if (const_uri[0] != 0x10) { // we already parsed this uri? - if (strncmp(const_uri, "data:", 5) != 0) // not a data uri? - return false; - } - - // set defaults - out.mediaType = "text/plain"; - out.charset = "US-ASCII"; - out.base64 = false; - - char* uri = const_cast(const_uri); - if (uri[0] != 0x10) { - uri[0] = 0x10; - uri[1] = uri[2] = uri[3] = uri[4] = 0; - - size_t i = 5, j; - if (uri[i] != ';' && uri[i] != ',') { // has media type? - uri[1] = char(i); - for (; uri[i] != ';' && uri[i] != ',' && i < uriLen; ++i) { - // nothing to do! - } - } - while (uri[i] == ';' && i < uriLen) { - uri[i++] = '\0'; - for (j = i; uri[i] != ';' && uri[i] != ',' && i < uriLen; ++i) { - // nothing to do! - } - - if ( strncmp( uri + j, "charset=", 8 ) == 0 ) { - uri[2] = char(j + 8); - } else if ( strncmp( uri + j, "base64", 6 ) == 0 ) { - uri[3] = char(j); - } - } - if (i < uriLen) { - uri[i++] = '\0'; - uri[4] = char(i); - } else { - uri[1] = uri[2] = uri[3] = 0; - uri[4] = 5; - } - } - - if ( uri[ 1 ] != 0 ) { - out.mediaType = uri + uri[ 1 ]; - } - if ( uri[ 2 ] != 0 ) { - out.charset = uri + uri[ 2 ]; - } - if ( uri[ 3 ] != 0 ) { - out.base64 = true; - } - out.data = uri + uri[4]; - out.dataLength = (uri + uriLen) - out.data; - - return true; - } - - template - struct DATA - { - static const uint8_t tableDecodeBase64[128]; - }; - - template - const uint8_t DATA::tableDecodeBase64[128] = { - 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, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 64, 0, 0, - 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, - 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0 - }; - - inline char EncodeCharBase64(uint8_t b) - { - return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="[size_t(b)]; - } - - inline uint8_t DecodeCharBase64(char c) - { - return DATA::tableDecodeBase64[size_t(c)]; // TODO faster with lookup table or ifs? - /*if (c >= 'A' && c <= 'Z') return c - 'A'; - if (c >= 'a' && c <= 'z') return c - 'a' + 26; - if (c >= '0' && c <= '9') return c - '0' + 52; - if (c == '+') return 62; - if (c == '/') return 63; - return 64; // '-' */ - } - - inline size_t DecodeBase64(const char* in, size_t inLength, uint8_t*& out) - { - ai_assert(inLength % 4 == 0); - - if (inLength < 4) { - out = 0; - return 0; - } - - int nEquals = int(in[inLength - 1] == '=') + - int(in[inLength - 2] == '='); - - size_t outLength = (inLength * 3) / 4 - nEquals; - out = new uint8_t[outLength]; - memset(out, 0, outLength); - - size_t i, j = 0; - - for (i = 0; i + 4 < inLength; i += 4) { - uint8_t b0 = DecodeCharBase64(in[i]); - uint8_t b1 = DecodeCharBase64(in[i + 1]); - uint8_t b2 = DecodeCharBase64(in[i + 2]); - uint8_t b3 = DecodeCharBase64(in[i + 3]); - - out[j++] = (uint8_t)((b0 << 2) | (b1 >> 4)); - out[j++] = (uint8_t)((b1 << 4) | (b2 >> 2)); - out[j++] = (uint8_t)((b2 << 6) | b3); - } - - { - uint8_t b0 = DecodeCharBase64(in[i]); - uint8_t b1 = DecodeCharBase64(in[i + 1]); - uint8_t b2 = DecodeCharBase64(in[i + 2]); - uint8_t b3 = DecodeCharBase64(in[i + 3]); - - out[j++] = (uint8_t)((b0 << 2) | (b1 >> 4)); - if (b2 < 64) out[j++] = (uint8_t)((b1 << 4) | (b2 >> 2)); - if (b3 < 64) out[j++] = (uint8_t)((b2 << 6) | b3); - } - - return outLength; - } - - - - inline void EncodeBase64( - const uint8_t* in, size_t inLength, - std::string& out) - { - size_t outLength = ((inLength + 2) / 3) * 4; - - size_t j = out.size(); - out.resize(j + outLength); - - for (size_t i = 0; i < inLength; i += 3) { - uint8_t b = (in[i] & 0xFC) >> 2; - out[j++] = EncodeCharBase64(b); - - b = (in[i] & 0x03) << 4; - if (i + 1 < inLength) { - b |= (in[i + 1] & 0xF0) >> 4; - out[j++] = EncodeCharBase64(b); - - b = (in[i + 1] & 0x0F) << 2; - if (i + 2 < inLength) { - b |= (in[i + 2] & 0xC0) >> 6; - out[j++] = EncodeCharBase64(b); - - b = in[i + 2] & 0x3F; - out[j++] = EncodeCharBase64(b); - } - else { - out[j++] = EncodeCharBase64(b); - out[j++] = '='; - } - } - else { - out[j++] = EncodeCharBase64(b); - out[j++] = '='; - out[j++] = '='; - } - } - } - -} - } // ns glTF diff --git a/code/glTF2/glTF2AssetWriter.inl b/code/glTF2/glTF2AssetWriter.inl index 92168fa61..5d1b22064 100644 --- a/code/glTF2/glTF2AssetWriter.inl +++ b/code/glTF2/glTF2AssetWriter.inl @@ -218,7 +218,7 @@ namespace glTF2 { if (img.HasData()) { uri = "data:" + (img.mimeType.empty() ? "application/octet-stream" : img.mimeType); uri += ";base64,"; - Util::EncodeBase64(img.GetData(), img.GetDataLength(), uri); + glTFCommon::Util::EncodeBase64(img.GetData(), img.GetDataLength(), uri); } else { uri = img.uri; diff --git a/code/glTF2/glTF2Importer.cpp b/code/glTF2/glTF2Importer.cpp index eacf57c89..61e5f4b8a 100644 --- a/code/glTF2/glTF2Importer.cpp +++ b/code/glTF2/glTF2Importer.cpp @@ -64,6 +64,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; using namespace glTF2; +using namespace glTFCommon; namespace { // generate bi-tangents from normals and tangents according to spec @@ -140,22 +141,23 @@ static aiTextureMapMode ConvertWrappingMode(SamplerWrap gltfWrapMode) } } -static void CopyValue(const glTF2::vec3& v, aiColor3D& out) +/*static void CopyValue(const glTF2::vec3& v, aiColor3D& out) { out.r = v[0]; out.g = v[1]; out.b = v[2]; } + static void CopyValue(const glTF2::vec4& v, aiColor4D& out) { out.r = v[0]; out.g = v[1]; out.b = v[2]; out.a = v[3]; -} +}*/ /*static void CopyValue(const glTF2::vec4& v, aiColor3D& out) { out.r = v[0]; out.g = v[1]; out.b = v[2]; }*/ -static void CopyValue(const glTF2::vec3& v, aiColor4D& out) +/*static void CopyValue(const glTF2::vec3& v, aiColor4D& out) { out.r = v[0]; out.g = v[1]; out.b = v[2]; out.a = 1.0; } @@ -168,15 +170,15 @@ static void CopyValue(const glTF2::vec3& v, aiVector3D& out) static void CopyValue(const glTF2::vec4& v, aiQuaternion& out) { out.x = v[0]; out.y = v[1]; out.z = v[2]; out.w = v[3]; -} +}*/ -static void CopyValue(const glTF2::mat4& v, aiMatrix4x4& o) +/*static void CopyValue(const glTF2::mat4& v, aiMatrix4x4& o) { o.a1 = v[ 0]; o.b1 = v[ 1]; o.c1 = v[ 2]; o.d1 = v[ 3]; o.a2 = v[ 4]; o.b2 = v[ 5]; o.c2 = v[ 6]; o.d2 = v[ 7]; o.a3 = v[ 8]; o.b3 = v[ 9]; o.c3 = v[10]; o.d3 = v[11]; o.a4 = v[12]; o.b4 = v[13]; o.c4 = v[14]; o.d4 = v[15]; -} +}*/ inline void SetMaterialColorProperty(Asset& /*r*/, vec4& prop, aiMaterial* mat, const char* pKey, unsigned int type, unsigned int idx) { @@ -188,7 +190,7 @@ inline void SetMaterialColorProperty(Asset& /*r*/, vec4& prop, aiMaterial* mat, inline void SetMaterialColorProperty(Asset& /*r*/, vec3& prop, aiMaterial* mat, const char* pKey, unsigned int type, unsigned int idx) { aiColor4D col; - CopyValue(prop, col); + glTFCommon::CopyValue(prop, col); mat->AddProperty(&col, 1, pKey, type, idx); } @@ -987,7 +989,12 @@ void glTF2Importer::ImportNodes(glTF2::Asset& r) } struct AnimationSamplers { - AnimationSamplers() : translation(nullptr), rotation(nullptr), scale(nullptr) {} + AnimationSamplers() + : translation(nullptr) + , rotation(nullptr) + , scale(nullptr) { + // empty + } Animation::Sampler* translation; Animation::Sampler* rotation; From f67c18d41a1a3e6d9a1e23fc7c26bd37952be789 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 11 Sep 2019 22:21:20 +0200 Subject: [PATCH 183/320] introduce inline helper. --- code/glTF/glTFCommon.h | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/code/glTF/glTFCommon.h b/code/glTF/glTFCommon.h index c5abdc94d..d9edee75e 100644 --- a/code/glTF/glTFCommon.h +++ b/code/glTF/glTFCommon.h @@ -128,46 +128,53 @@ namespace glTFCommon { typedef float(vec4)[4]; typedef float(mat4)[16]; - static void CopyValue(const glTFCommon::vec3& v, aiColor4D& out) { + inline + void CopyValue(const glTFCommon::vec3& v, aiColor4D& out) { out.r = v[0]; out.g = v[1]; out.b = v[2]; out.a = 1.0; } - static void CopyValue(const glTFCommon::vec4& v, aiColor4D& out) { + inline + void CopyValue(const glTFCommon::vec4& v, aiColor4D& out) { out.r = v[0]; out.g = v[1]; out.b = v[2]; out.a = v[3]; } - static void CopyValue(const glTFCommon::vec4& v, aiColor3D& out) { + inline + void CopyValue(const glTFCommon::vec4& v, aiColor3D& out) { out.r = v[0]; out.g = v[1]; out.b = v[2]; } - static void CopyValue(const glTFCommon::vec3& v, aiColor3D& out) { + inline + void CopyValue(const glTFCommon::vec3& v, aiColor3D& out) { out.r = v[0]; out.g = v[1]; out.b = v[2]; } - static void CopyValue(const glTFCommon::vec3& v, aiVector3D& out) { + inline + void CopyValue(const glTFCommon::vec3& v, aiVector3D& out) { out.x = v[0]; out.y = v[1]; out.z = v[2]; } - static void CopyValue(const glTFCommon::vec4& v, aiQuaternion& out) { + inline + void CopyValue(const glTFCommon::vec4& v, aiQuaternion& out) { out.x = v[0]; out.y = v[1]; out.z = v[2]; out.w = v[3]; } - static void CopyValue(const glTFCommon::mat4& v, aiMatrix4x4& o) { + inline + void CopyValue(const glTFCommon::mat4& v, aiMatrix4x4& o) { o.a1 = v[0]; o.b1 = v[1]; o.c1 = v[2]; o.d1 = v[3]; o.a2 = v[4]; o.b2 = v[5]; o.c2 = v[6]; o.d2 = v[7]; o.a3 = v[8]; o.b3 = v[9]; o.c3 = v[10]; o.d3 = v[11]; From f9c6fed1907c3d15e118c7cf41a3984196819360 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 11 Sep 2019 22:34:53 +0200 Subject: [PATCH 184/320] Add a camera unittest. --- code/glTF2/glTF2Importer.cpp | 8 +- test/models/glTF2/cameras/Cameras.gltf | 98 +++++++++++++++++++++ test/models/glTF2/cameras/simpleSquare.bin | Bin 0 -> 60 bytes test/unit/utglTF2ImportExport.cpp | 7 ++ 4 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 test/models/glTF2/cameras/Cameras.gltf create mode 100644 test/models/glTF2/cameras/simpleSquare.bin diff --git a/code/glTF2/glTF2Importer.cpp b/code/glTF2/glTF2Importer.cpp index 61e5f4b8a..ced37601e 100644 --- a/code/glTF2/glTF2Importer.cpp +++ b/code/glTF2/glTF2Importer.cpp @@ -705,9 +705,11 @@ void glTF2Importer::ImportCameras(glTF2::Asset& r) aicam->mHorizontalFOV = cam.cameraProperties.perspective.yfov * aicam->mAspect; aicam->mClipPlaneFar = cam.cameraProperties.perspective.zfar; aicam->mClipPlaneNear = cam.cameraProperties.perspective.znear; - } - else { - // assimp does not support orthographic cameras + } else { + aicam->mClipPlaneFar = cam.ortographic.zfar; + aicam->mClipPlaneNear = cam.ortographic.znear; + aicam->mHorizontalFOV = 0.0; + aicam->mAspect = cam.ortographic.xmag / cam.ortographic.ymag; } } } diff --git a/test/models/glTF2/cameras/Cameras.gltf b/test/models/glTF2/cameras/Cameras.gltf new file mode 100644 index 000000000..25e9e24a3 --- /dev/null +++ b/test/models/glTF2/cameras/Cameras.gltf @@ -0,0 +1,98 @@ +{ + "scenes" : [ + { + "nodes" : [ 0, 1, 2 ] + } + ], + "nodes" : [ + { + "rotation" : [ -0.383, 0.0, 0.0, 0.92375 ], + "mesh" : 0 + }, + { + "translation" : [ 0.5, 0.5, 3.0 ], + "camera" : 0 + }, + { + "translation" : [ 0.5, 0.5, 3.0 ], + "camera" : 1 + } + ], + + "cameras" : [ + { + "type": "perspective", + "perspective": { + "aspectRatio": 1.0, + "yfov": 0.7, + "zfar": 100, + "znear": 0.01 + } + }, + { + "type": "orthographic", + "orthographic": { + "xmag": 1.0, + "ymag": 1.0, + "zfar": 100, + "znear": 0.01 + } + } + ], + + "meshes" : [ + { + "primitives" : [ { + "attributes" : { + "POSITION" : 1 + }, + "indices" : 0 + } ] + } + ], + + "buffers" : [ + { + "uri" : "simpleSquare.bin", + "byteLength" : 60 + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteOffset" : 0, + "byteLength" : 12, + "target" : 34963 + }, + { + "buffer" : 0, + "byteOffset" : 12, + "byteLength" : 48, + "target" : 34962 + } + ], + "accessors" : [ + { + "bufferView" : 0, + "byteOffset" : 0, + "componentType" : 5123, + "count" : 6, + "type" : "SCALAR", + "max" : [ 3 ], + "min" : [ 0 ] + }, + { + "bufferView" : 1, + "byteOffset" : 0, + "componentType" : 5126, + "count" : 4, + "type" : "VEC3", + "max" : [ 1.0, 1.0, 0.0 ], + "min" : [ 0.0, 0.0, 0.0 ] + } + ], + + "asset" : { + "version" : "2.0" + } +} diff --git a/test/models/glTF2/cameras/simpleSquare.bin b/test/models/glTF2/cameras/simpleSquare.bin new file mode 100644 index 0000000000000000000000000000000000000000..a6edb3b0d31b460695b9a225476ee921ab01ab58 GIT binary patch literal 60 ZcmZQzU}RtdVrC$T3L5OO^FiVeIRG=<0|o#9 literal 0 HcmV?d00001 diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index 1e8e4af9d..829d31451 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -375,6 +375,13 @@ TEST_F( utglTF2ImportExport, bug_import_simple_skin ) { EXPECT_NE( nullptr, scene ); } +TEST_F(utglTF2ImportExport, import_cameras) { + Assimp::Importer importer; + const aiScene* scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/cameras/Cameras.gltf", + aiProcess_ValidateDataStructure); + EXPECT_NE(nullptr, scene); +} + #ifndef ASSIMP_BUILD_NO_EXPORT TEST_F( utglTF2ImportExport, exportglTF2FromFileTest ) { EXPECT_TRUE( exporterTest() ); From a25a1f077206810d83827b8fe2dfc4fd01a55f31 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 12 Sep 2019 20:27:35 +0200 Subject: [PATCH 185/320] fix the build. --- code/glTF2/glTF2Importer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/glTF2/glTF2Importer.cpp b/code/glTF2/glTF2Importer.cpp index ced37601e..6eb71652a 100644 --- a/code/glTF2/glTF2Importer.cpp +++ b/code/glTF2/glTF2Importer.cpp @@ -706,10 +706,10 @@ void glTF2Importer::ImportCameras(glTF2::Asset& r) aicam->mClipPlaneFar = cam.cameraProperties.perspective.zfar; aicam->mClipPlaneNear = cam.cameraProperties.perspective.znear; } else { - aicam->mClipPlaneFar = cam.ortographic.zfar; - aicam->mClipPlaneNear = cam.ortographic.znear; + aicam->mClipPlaneFar = cam.cameraProperties.ortographic.zfar; + aicam->mClipPlaneNear = cam.cameraProperties.ortographic.znear; aicam->mHorizontalFOV = 0.0; - aicam->mAspect = cam.ortographic.xmag / cam.ortographic.ymag; + aicam->mAspect = cam.cameraProperties.ortographic.xmag / cam.cameraProperties.ortographic.ymag; } } } From a1254f067e85b1e1d65479e50098c50e42ebf1b4 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 13 Sep 2019 12:05:29 +0200 Subject: [PATCH 186/320] closes https://github.com/assimp/assimp/issues/2627 - fix typo Remove code from ai_assert test, will be removed in release versions. --- code/glTF/glTFExporter.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/glTF/glTFExporter.cpp b/code/glTF/glTFExporter.cpp index 3bd944bb6..034f91f3b 100644 --- a/code/glTF/glTFExporter.cpp +++ b/code/glTF/glTFExporter.cpp @@ -242,7 +242,10 @@ inline Ref ExportData(Asset& a, std::string& meshName, Ref& bu namespace { void GetMatScalar(const aiMaterial* mat, float& val, const char* propName, int type, int idx) { - ai_assert(mat->Get(propName, type, idx, val) == AI_SUCCESS); + ai_assert( nullptr != mat ); + if ( nullptr != mat ) { + mat->Get(propName, type, idx, val); + } } } From 79056da4be10105168eb572b9b01b468fb62b79b Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 14 Sep 2019 09:12:08 +0200 Subject: [PATCH 187/320] closes https://github.com/assimp/assimp/issues/2613 : merge glTF2 patch. --- code/glTF/glTFAsset.inl | 8 ++++++-- code/glTF/glTFImporter.cpp | 7 +++++-- code/glTF2/glTF2Asset.inl | 7 +++++-- code/glTF2/glTF2Importer.cpp | 16 ++++++++++++++-- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/code/glTF/glTFAsset.inl b/code/glTF/glTFAsset.inl index c06aa7fb5..f31781a3f 100644 --- a/code/glTF/glTFAsset.inl +++ b/code/glTF/glTFAsset.inl @@ -1180,8 +1180,12 @@ inline void Light::SetDefaults() falloffExponent = 0.f; } -inline void Node::Read(Value& obj, Asset& r) -{ +inline +void Node::Read(Value& obj, Asset& r) { + if (name.empty()) { + name = id; + } + if (Value* children = FindArray(obj, "children")) { this->children.reserve(children->Size()); for (unsigned int i = 0; i < children->Size(); ++i) { diff --git a/code/glTF/glTFImporter.cpp b/code/glTF/glTFImporter.cpp index cc7ab7211..3f2afbdf9 100644 --- a/code/glTF/glTFImporter.cpp +++ b/code/glTF/glTFImporter.cpp @@ -475,14 +475,17 @@ void glTFImporter::ImportCameras(glTF::Asset& r) { if (cam.type == Camera::Perspective) { aicam->mAspect = cam.perspective.aspectRatio; - aicam->mHorizontalFOV = cam.perspective.yfov * aicam->mAspect; + aicam->mHorizontalFOV = cam.cameraProperties.perspective.yfov * ((aicam->mAspect == 0.f) ? 1.f : aicam->mAspect); aicam->mClipPlaneFar = cam.perspective.zfar; aicam->mClipPlaneNear = cam.perspective.znear; } else { aicam->mClipPlaneFar = cam.ortographic.zfar; aicam->mClipPlaneNear = cam.ortographic.znear; aicam->mHorizontalFOV = 0.0; - aicam->mAspect = cam.ortographic.xmag / cam.ortographic.ymag; + aicam->mAspect = 1.0f; + if (0.f != cam.cameraProperties.ortographic.ymag) { + aicam->mAspect = cam.cameraProperties.ortographic.xmag / cam.cameraProperties.ortographic.ymag; + } } } } diff --git a/code/glTF2/glTF2Asset.inl b/code/glTF2/glTF2Asset.inl index e5e4a58c1..6b47b1607 100644 --- a/code/glTF2/glTF2Asset.inl +++ b/code/glTF2/glTF2Asset.inl @@ -1098,8 +1098,11 @@ inline void Light::Read(Value& obj, Asset& /*r*/) } } -inline void Node::Read(Value& obj, Asset& r) -{ +inline +void Node::Read(Value& obj, Asset& r) { + if (name.empty()) { + name = id; + } if (Value* children = FindArray(obj, "children")) { this->children.reserve(children->Size()); diff --git a/code/glTF2/glTF2Importer.cpp b/code/glTF2/glTF2Importer.cpp index 6eb71652a..d1871ce0e 100644 --- a/code/glTF2/glTF2Importer.cpp +++ b/code/glTF2/glTF2Importer.cpp @@ -702,14 +702,17 @@ void glTF2Importer::ImportCameras(glTF2::Asset& r) if (cam.type == Camera::Perspective) { aicam->mAspect = cam.cameraProperties.perspective.aspectRatio; - aicam->mHorizontalFOV = cam.cameraProperties.perspective.yfov * aicam->mAspect; + aicam->mHorizontalFOV = cam.cameraProperties.perspective.yfov * ((aicam->mAspect == 0.f) ? 1.f : aicam->mAspect); aicam->mClipPlaneFar = cam.cameraProperties.perspective.zfar; aicam->mClipPlaneNear = cam.cameraProperties.perspective.znear; } else { aicam->mClipPlaneFar = cam.cameraProperties.ortographic.zfar; aicam->mClipPlaneNear = cam.cameraProperties.ortographic.znear; aicam->mHorizontalFOV = 0.0; - aicam->mAspect = cam.cameraProperties.ortographic.xmag / cam.cameraProperties.ortographic.ymag; + aicam->mAspect = 1.0f; + if (0.f != cam.cameraProperties.ortographic.ymag ) { + aicam->mAspect = cam.cameraProperties.ortographic.xmag / cam.cameraProperties.ortographic.ymag; + } } } } @@ -905,6 +908,9 @@ aiNode* ImportNode(aiScene* pScene, glTF2::Asset& r, std::vector& std::vector> weighting(mesh->mNumBones); BuildVertexWeightMapping(node.meshes[0]->primitives[primitiveNo], weighting); + mat4* pbindMatrices = nullptr; + node.skin->inverseBindMatrices->ExtractData(pbindMatrices); + for (uint32_t i = 0; i < mesh->mNumBones; ++i) { aiBone* bone = new aiBone(); @@ -920,6 +926,8 @@ aiNode* ImportNode(aiScene* pScene, glTF2::Asset& r, std::vector& } GetNodeTransform(bone->mOffsetMatrix, *joint); + CopyValue(pbindMatrices[i], bone->mOffsetMatrix); + std::vector& weights = weighting[i]; bone->mNumWeights = static_cast(weights.size()); @@ -935,6 +943,10 @@ aiNode* ImportNode(aiScene* pScene, glTF2::Asset& r, std::vector& } mesh->mBones[i] = bone; } + + if (pbindMatrices) { + delete[] pbindMatrices; + } } } From ca0549558be98c09448331d97cb8043589cddcf8 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 14 Sep 2019 10:31:35 +0200 Subject: [PATCH 188/320] closes https://github.com/assimp/assimp/issues/2653: introduce 2 tests to reproduce fbx-tokenize issue. --- test/models/FBX/transparentTest.fbx | 839 ++++++++++++++++++++++++++++ test/unit/utFBXImporterExporter.cpp | 10 + 2 files changed, 849 insertions(+) create mode 100644 test/models/FBX/transparentTest.fbx diff --git a/test/models/FBX/transparentTest.fbx b/test/models/FBX/transparentTest.fbx new file mode 100644 index 000000000..2c4f1cd82 --- /dev/null +++ b/test/models/FBX/transparentTest.fbx @@ -0,0 +1,839 @@ +Kaydara FBX Binary  „ ¼ FBXHeaderExtension\   FBXHeaderVersionIë x   +FBXVersionI„ ˜   EncryptionTypeI  CreationTimeStampÏ   VersionIè å   YearIã ü   MonthI    DayI '   HourI ?   MinuteI W   SecondI t   MillisecondID ¼  ' CreatorS" FBX SDK/FBX Plugins version 2017.1¯  ' SceneInfoS GlobalInfo SceneInfoS UserData  TypeS UserData0   VersionId  MetaData^   VersionId u   TitleS Ž   SubjectS ¦   AuthorS À   KeywordsS Ú   RevisionS ó   CommentS ¢ Properties70˜  q PS DocumentUrlS KStringS UrlS SC C:\Users\Destranix\Documents\maya\projects\Test\transparentTest.fbx  t PS SrcDocumentUrlS KStringS UrlS SC C:\Users\Destranix\Documents\maya\projects\Test\transparentTest.fbxL  $ PS OriginalS CompoundS S œ  B PS Original|ApplicationVendorS KStringS S S Autodeskæ  < PS Original|ApplicationNameS KStringS S S Maya3  ? PS Original|ApplicationVersionS KStringS S S 2017Ž  M PS Original|DateTime_GMTS DateTimeS S S 11/09/2019 14:11:05.265  t PS Original|FileNameS KStringS S SC C:\Users\Destranix\Documents\maya\projects\Test\transparentTest.fbxC  % PS LastSavedS CompoundS S ”  C PS LastSaved|ApplicationVendorS KStringS S S Autodeskß  = PS LastSaved|ApplicationNameS KStringS S S Maya-  @ PS LastSaved|ApplicationVersionS KStringS S S 2017‰  N PS LastSaved|DateTime_GMTS DateTimeS S S 11/09/2019 14:11:05.265  p PS! Original|ApplicationActiveProjectS KStringS S S/ C:\Users\Destranix\Documents\maya\projects\Test•  € PS Original|ApplicationNativeFileS KStringS S SB C:\Users\Destranix\Documents\maya\projects\Test\transparentTest.mb ä   FileIdR (¶/æ»/Æȶø+®%óÿ   CreationTimeS 2019-09-11 16:11:05:324c  6 CreatorS1 FBX SDK/FBX Plugins version 2017.1 build=20161007È GlobalSettings—   VersionIè » Properties70ç  ) PS UpAxisS intS IntegerS I " +  - PS + UpAxisSignS intS IntegerS I \ +  , PS FrontAxisS intS IntegerS I š +  0 PS FrontAxisSignS intS IntegerS I Ô +  , PS CoordAxisS intS IntegerS I   0 PS CoordAxisSignS intS IntegerS I Q  1 PS OriginalUpAxisS intS IntegerS I ”  5 PS OriginalUpAxisSignS intS IntegerS I Ú  8 PS UnitScaleFactorS doubleS NumberS D ð?(  @ PS OriginalUnitScaleFactorS doubleS NumberS D ð?~  H PS AmbientColorS ColorRGBS ColorS D D D Í  A PS DefaultCameraS KStringS S S Producer Perspective  % PS TimeModeS enumS S I 7  ) PS TimeProtocolS enumS S I q  , PS SnapOnFrameModeS enumS S I ²  3 PS TimeSpanStartS KTimeS TimeS LR^´r ò  2 PS TimeSpanStopS KTimeS TimeS L°éœY 8  8 PS CustomFrameRateS doubleS NumberS D ð¿l  & PS + TimeMarkerS CompoundS S ®  4 PS CurrentTimeMarkerS intS IntegerS Iÿÿÿÿ ý Documentsõ   CountI ð   DocumentL@q®– S S SceneÅ Properties70o  & PS SourceObjectS objectS S ¸  ; PS ActiveAnimStackNameS KStringS S S Take 001 ã  RootNodeL ! +References (\ DefinitionsR   VersionId i   CountI@ ·   +ObjectTypeS GlobalSettingsª   CountI    +ObjectTypeS AnimationStackø   CountI    PropertyTemplateS FbxAnimStackƒ Properties70x  + PS DescriptionS KStringS S S ¶  0 PS + LocalStartS KTimeS TimeS L ó  / PS LocalStopS KTimeS TimeS L 5  4 PS ReferenceStartS KTimeS TimeS L v  3 PS ReferenceStopS KTimeS TimeS L Z   +ObjectTypeS AnimationLayerÞ   CountI M   PropertyTemplateS FbxAnimLayer@ Properties70]  * PS WeightS NumberS S AD Y@Œ  ! PS MuteS boolS S I »  ! PS SoloS boolS S I ê  ! PS LockS boolS S I 9  A PS ColorS ColorRGBS ColorS Dš™™™™™é?Dš™™™™™é?Dš™™™™™é?m  & PS BlendModeS enumS S I °  5 PS RotationAccumulationModeS enumS S I ð  2 PS ScaleAccumulationModeS enumS S I 3  5 PS BlendModeBypassS ULongLongS S L    +ObjectTypeS Geometry•   CountI “  PropertyTemplateS FbxMesh† Properties70&  A PS ColorS ColorRGBS ColorS Dš™™™™™é?Dš™™™™™é?Dš™™™™™é?x  D PS BBoxMinS Vector3DS VectorS D D D Ê  D PS BBoxMaxS Vector3DS VectorS D D D   / PS Primary VisibilityS boolS S I ?  * PS Casts ShadowsS boolS S I y  , PS Receive ShadowsS boolS S I ¢  +ObjectTypeS MaterialÛ   CountI •   PropertyTemplateS FbxSurfacePhongˆ Properties70d  1 PS ShadingModelS KStringS S S Phong™  ' PS + MultiLayerS boolS S I é  B PS EmissiveColorS ColorS S AD D D )  2 PS EmissiveFactorS NumberS S AD ð?x  A PS AmbientColorS ColorS S ADš™™™™™É?Dš™™™™™É?Dš™™™™™É?·  1 PS AmbientFactorS NumberS S AD ð?  A PS DiffuseColorS ColorS S ADš™™™™™é?Dš™™™™™é?Dš™™™™™é?E  1 PS DiffuseFactorS NumberS S AD ð?”  A PS BumpS Vector3DS VectorS D D D è  F PS NormalMapS Vector3DS VectorS D D D )  3 PS + BumpFactorS doubleS NumberS D ð?|  E PS TransparentColorS ColorS S AD D D À  6 PS TransparencyFactorS NumberS S AD   M PS DisplacementColorS ColorRGBS ColorS D D D d  ; PS DisplacementFactorS doubleS NumberS D ð?Å  S PS VectorDisplacementColorS ColorRGBS ColorS D D D   A PS VectorDisplacementFactorS doubleS NumberS D ð?d  B PS SpecularColorS ColorS S ADš™™™™™É?Dš™™™™™É?Dš™™™™™É?¤  2 PS SpecularFactorS NumberS S AD ð?ç  5 PS ShininessExponentS NumberS S AD 4@9  D PS ReflectionColorS ColorS S AD D D {  4 PS ReflectionFactorS NumberS S AD ð? ^#  +ObjectTypeS TextureÜ   CountI Q#   PropertyTemplateS FbxFileTextureD# Properties70^  + PS TextureTypeUseS enumS S I   1 PS Texture alphaS NumberS S AD ð?Ú  / PS CurrentMappingTypeS enumS S I   & PS WrapModeUS enumS S I B  & PS WrapModeVS enumS S I s  # PS UVSwapS boolS S I ®  - PS PremultiplyAlphaS boolS S I ý  A PS TranslationS VectorS S AD D D I!  > PS RotationS VectorS S AD D D ”!  = PS ScalingS VectorS S AD ð?D ð?D ð?ó!  Q PS TextureRotationPivotS Vector3DS VectorS D D D Q"  P PS TextureScalingPivotS Vector3DS VectorS D D D “"  4 PS CurrentTextureBlendModeS enumS S I Í"  , PS UVSetS KStringS S S default#  ( PS UseMaterialS boolS S I 7#  & PS UseMipMapS boolS S I 7  + +ObjectTypeS Model–#   CountI ô6  PropertyTemplateS FbxNodeç6 Properties70$  2 PS QuaternionInterpolateS enumS S I q$  K PS RotationOffsetS Vector3DS VectorS D D D É$  J PS RotationPivotS Vector3DS VectorS D D D !%  J PS ScalingOffsetS Vector3DS VectorS D D D x%  I PS ScalingPivotS Vector3DS VectorS D D D ´%  . PS TranslationActiveS boolS S I &  K PS TranslationMinS Vector3DS VectorS D D D f&  K PS TranslationMaxS Vector3DS VectorS D D D  &  , PS TranslationMinXS boolS S I Ú&  , PS TranslationMinYS boolS S I '  , PS TranslationMinZS boolS S I N'  , PS TranslationMaxXS boolS S I ˆ'  , PS TranslationMaxYS boolS S I Â'  , PS TranslationMaxZS boolS S I ú'  * PS RotationOrderS enumS S I >(  6 PS RotationSpaceForLimitOnlyS boolS S I ‡(  ; PS RotationStiffnessXS doubleS NumberS D Ð(  ; PS RotationStiffnessYS doubleS NumberS D )  ; PS RotationStiffnessZS doubleS NumberS D W)  0 PS AxisLenS doubleS NumberS D $@­)  H PS PreRotationS Vector3DS VectorS D D D *  I PS PostRotationS Vector3DS VectorS D D D =*  + PS RotationActiveS boolS S I “*  H PS RotationMinS Vector3DS VectorS D D D é*  H PS RotationMaxS Vector3DS VectorS D D D +  ) PS RotationMinXS boolS S I W+  ) PS RotationMinYS boolS S I Ž+  ) PS RotationMinZS boolS S I Å+  ) PS RotationMaxXS boolS S I ü+  ) PS RotationMaxYS boolS S I 3,  ) PS RotationMaxZS boolS S I i,  ( PS InheritTypeS enumS S I ¡,  * PS ScalingActiveS boolS S I ö,  G PS + ScalingMinS Vector3DS VectorS D D D K-  G PS + ScalingMaxS Vector3DS VectorS D ð?D ð?D ð?-  ( PS ScalingMinXS boolS S I ·-  ( PS ScalingMinYS boolS S I í-  ( PS ScalingMinZS boolS S I #.  ( PS ScalingMaxXS boolS S I Y.  ( PS ScalingMaxYS boolS S I .  ( PS ScalingMaxZS boolS S I î.  Q PS GeometricTranslationS Vector3DS VectorS D D D J/  N PS GeometricRotationS Vector3DS VectorS D D D ¥/  M PS GeometricScalingS Vector3DS VectorS D ð?D ð?D ð?é/  6 PS MinDampRangeXS doubleS NumberS D -0  6 PS MinDampRangeYS doubleS NumberS D q0  6 PS MinDampRangeZS doubleS NumberS D µ0  6 PS MaxDampRangeXS doubleS NumberS D ù0  6 PS MaxDampRangeYS doubleS NumberS D =1  6 PS MaxDampRangeZS doubleS NumberS D „1  9 PS MinDampStrengthXS doubleS NumberS D Ë1  9 PS MinDampStrengthYS doubleS NumberS D 2  9 PS MinDampStrengthZS doubleS NumberS D Y2  9 PS MaxDampStrengthXS doubleS NumberS D  2  9 PS MaxDampStrengthYS doubleS NumberS D ç2  9 PS MaxDampStrengthZS doubleS NumberS D ,3  7 PS PreferedAngleXS doubleS NumberS D q3  7 PS PreferedAngleYS doubleS NumberS D ¶3  7 PS PreferedAngleZS doubleS NumberS D ì3  ( PS LookAtPropertyS objectS S $4  * PS UpVectorPropertyS objectS S S4  ! PS ShowS boolS S I ™4  8 PS NegativePercentShapeSupportS boolS S I ß4  8 PS DefaultAttributeIndexS intS IntegerS Iÿÿÿÿ5  # PS FreezeS boolS S I A5  # PS LODBoxS boolS S I 5  N PS Lcl TranslationS Lcl TranslationS S AD D D ó5  H PS Lcl RotationS Lcl RotationS S AD D D G6  F PS Lcl ScalingS Lcl ScalingS S AD ð?D ð?D ð?‡6  2 PS + VisibilityS + VisibilityS S AD ð?Ú6  E PS Visibility InheritanceS Visibility InheritanceS S I R   +ObjectTypeS NodeAttributeA7   CountI R   PropertyTemplateS FbxCamera R Properties70Ô7  A PS ColorS ColorRGBS ColorS Dš™™™™™é?Dš™™™™™é?Dš™™™™™é? 8  > PS PositionS VectorS S AD D D l8  > PS UpVectorS VectorS S AD D ð?D À8  F PS InterestPositionS VectorS S AD D D ô8  & PS RollS RollS S AD <9  : PS OpticalCenterXS OpticalCenterXS S AD „9  : PS OpticalCenterYS OpticalCenterYS S AD Ö9  D PS BackgroundColorS ColorS S AD)\Âõ(ä?D)\Âõ(ä?D)\Âõ(ä?:  - PS TurnTableS NumberS S AD P:  1 PS DisplayTurnTableIconS boolS S I ˆ:  * PS UseMotionBlurS boolS S I È:  2 PS UseRealTimeMotionBlurS boolS S I ;  9 PS Motion Blur IntensityS NumberS S AD ð?I;  , PS AspectRatioModeS enumS S I ‹;  4 PS AspectWidthS doubleS NumberS D t@Î;  5 PS AspectHeightS doubleS NumberS D i@<  9 PS PixelAspectRatioS doubleS NumberS D ð?R<  / PS FilmOffsetXS NumberS S AD <  / PS FilmOffsetYS NumberS S AD Ï<  2 PS FilmWidthS doubleS NumberS Dé&1¬ê?=  3 PS + FilmHeightS doubleS NumberS D/Ý$•ã?V=  8 PS FilmAspectRatioS doubleS NumberS DUUUUUUõ?=  9 PS FilmSqueezeRatioS doubleS NumberS D ð?×=  , PS FilmFormatIndexS enumS S I >  , PS PreScaleS NumberS S AD ð?Q>  2 PS FilmTranslateXS NumberS S AD ‘>  2 PS FilmTranslateYS NumberS S AD Ñ>  2 PS FilmRollPivotXS NumberS S AD ?  2 PS FilmRollPivotYS NumberS S AD P?  1 PS FilmRollValueS NumberS S AD ˆ?  * PS FilmRollOrderS enumS S I ¿?  ) PS ApertureModeS enumS S I ñ?  $ PS GateFitS enumS S I 3@  4 PS FieldOfViewS FieldOfViewS S AD  p9@w@  6 PS FieldOfViewXS FieldOfViewXS S AD D@»@  6 PS FieldOfViewYS FieldOfViewYS S AD D@ø@  / PS FocalLengthS NumberS S AD&‘àVrA@/A  ) PS CameraFormatS enumS S I gA  * PS UseFrameColorS boolS S I »A  F PS + FrameColorS ColorRGBS ColorS D333333Ó?D333333Ó?D333333Ó?îA  % PS ShowNameS boolS S I )B  - PS ShowInfoOnMovingS boolS S I \B  % PS ShowGridS boolS S I ˜B  . PS ShowOpticalCenterS boolS S I ÍB  ' PS + ShowAzimutS boolS S I C  ) PS ShowTimeCodeS boolS S I 8C  & PS ShowAudioS boolS S I C  G PS + AudioColorS Vector3DS VectorS D D ð?D ÍC  2 PS NearPlaneS doubleS NumberS D $@ D  1 PS FarPlaneS doubleS NumberS D @¯@KD  1 PS AutoComputeClipPanesS boolS S I ˆD  / PS ViewCameraToLookAtS boolS S I ÊD  4 PS ViewFrustumNearFarPlaneS boolS S I E  5 PS ViewFrustumBackPlaneModeS enumS S I PE  5 PS BackPlaneDistanceS NumberS S AD @¯@E  2 PS BackPlaneDistanceModeS enumS S I ÔE  6 PS ViewFrustumFrontPlaneModeS enumS S I F  6 PS FrontPlaneDistanceS NumberS S AD $@YF  3 PS FrontPlaneDistanceModeS enumS S I ŒF  % PS LockModeS boolS S I ÍF  3 PS LockInterestNavigationS boolS S I G  . PS BackPlateFitImageS boolS S I AG  * PS BackPlateCropS boolS S I {G  , PS BackPlateCenterS boolS S I ¸G  / PS BackPlateKeepRatioS boolS S I H  @ PS BackgroundAlphaTresholdS doubleS NumberS D à?>H  * PS ShowBackplateS boolS S I €H  4 PS BackPlaneOffsetXS NumberS S AD ÂH  4 PS BackPlaneOffsetYS NumberS S AD I  5 PS BackPlaneRotationS NumberS S AD FI  3 PS BackPlaneScaleXS NumberS S AD ð?‡I  3 PS BackPlaneScaleYS NumberS S AD ð?ÁI  , PS Background TextureS objectS S þI  / PS FrontPlateFitImageS boolS S I 7J  + PS FrontPlateCropS boolS S I rJ  - PS FrontPlateCenterS boolS S I °J  0 PS FrontPlateKeepRatioS boolS S I ùJ  ; PS Foreground OpacityS doubleS NumberS D ð?2K  + PS ShowFrontplateS boolS S I uK  5 PS FrontPlaneOffsetXS NumberS S AD ¸K  5 PS FrontPlaneOffsetYS NumberS S AD üK  6 PS FrontPlaneRotationS NumberS S AD >L  4 PS FrontPlaneScaleXS NumberS S AD ð?€L  4 PS FrontPlaneScaleYS NumberS S AD ð?ºL  , PS Foreground TextureS objectS S ôL  , PS DisplaySafeAreaS boolS S I 6M  4 PS DisplaySafeAreaOnRenderS boolS S I uM  1 PS SafeAreaDisplayStyleS enumS S I ¿M  < PS SafeAreaAspectRatioS doubleS NumberS DFUUUUUõ?üM  / PS Use2DMagnifierZoomS boolS S I ?N  5 PS 2D Magnifier ZoomS NumberS S AD Y@N  2 PS 2D Magnifier XS NumberS S AD I@¿N  2 PS 2D Magnifier YS NumberS S AD I@þN  1 PS CameraProjectionTypeS enumS S I >O  2 PS OrthoZoomS doubleS NumberS D ð?|O  0 PS UseRealTimeDOFAndAAS boolS S I ¶O  , PS UseDepthOfFieldS boolS S I ìO  ( PS FocusSourceS enumS S I -P  3 PS + FocusAngleS doubleS NumberS D @qP  6 PS FocusDistanceS doubleS NumberS D i@«P  , PS UseAntialiasingS boolS S I ÷P  > PS AntialiasingIntensityS doubleS NumberS DÝê9é}ãè?4Q  / PS AntialiasingMethodS enumS S I tQ  2 PS UseAccumulationBufferS boolS S I ·Q  5 PS FrameSamplingCountS intS IntegerS I óQ  . PS FrameSamplingTypeS enumS S I FT   +ObjectTypeS Implementation[R   CountI 9T   PropertyTemplateS FbxImplementation,T Properties70îR  9 PS ShaderLanguageS KStringS S S MentalRaySL1S  5 PS ShaderLanguageVersionS KStringS S S qS  2 PS RenderAPIS KStringS S S MentalRay¯S  0 PS RenderAPIVersionS KStringS S S ìS  / PS RootBindingNameS KStringS S S T  % PS ConstantsS CompoundS S ìV   +ObjectTypeS BindingTable…T   CountI ßV   PropertyTemplateS FbxBindingTableÒV Properties70U  * PS + TargetNameS KStringS S S ?U  * PS + TargetTypeS KStringS S S ƒU  6 PS CodeAbsoluteURLS KStringS XRefUrlS S ÇU  6 PS CodeRelativeURLS KStringS XRefUrlS S V  - PS CodeTAGS KStringS S S shaderFV  6 PS DescAbsoluteURLS KStringS XRefUrlS S ŠV  6 PS DescRelativeURLS KStringS XRefUrlS S ÅV  - PS DescTAGS KStringS S S shader ÎW   +ObjectTypeS AnimationCurveNode1W   CountI ÁW   PropertyTemplateS FbxAnimCurveNode´W Properties70§W   PS dS CompoundS S X   +ObjectTypeS AnimationCurveX   CountI + \  + +ObjectTypeS VideoTX   CountI \  PropertyTemplateS FbxVideo\ Properties70ÏX  * PS ImageSequenceS boolS S I Y  6 PS ImageSequenceOffsetS intS IntegerS I SY  2 PS FrameRateS doubleS NumberS D Y  , PS LastFrameS intS IntegerS I ÃY  ( PS WidthS intS IntegerS I úY  ) PS HeightS intS IntegerS I 3Z  + PS PathS KStringS XRefUrlS S nZ  - PS + StartFrameS intS IntegerS I ¨Z  , PS StopFrameS intS IntegerS I èZ  2 PS PlaySpeedS doubleS NumberS D "[  , PS OffsetS KTimeS TimeS L Z[  * PS InterlaceModeS enumS S I [  ( PS FreeRunningS boolS S I ¿[  ! PS LoopS boolS S I ô[  ' PS + AccessModeS enumS S I ¢â Objects8f  ! GeometryLÐü* S + GeometryS MeshT]  Í Verticesd À ®þ +À €±À €~Þ@ ®þ +@ €±À €~Þ@ ®þ +À €±@ €~Þ@ ®þ +@ €±@ €~Þ@ ®þ +À €±@ €~ÞÀ ®þ +@ €±@ €~ÞÀ ®þ +À €±À €~ÞÀ ®þ +@ €±À €~ÞÀà]  m PolygonVertexIndexi `   ýÿÿÿ   ûÿÿÿ   ùÿÿÿ   ÿÿÿÿ   üÿÿÿ  ûÿÿÿ/^  = Edgesi 0   +      P^   GeometryVersionI| xa   LayerElementNormalI ^   VersionIe £^   NameS Ú^   MappingInformationTypeS ByPolygonVertex +_  ReferenceInformationTypeS Directka  M NormalsdH @ ð? ð? ð? ð? ð? ð? ð? ð? ð¿ ð¿ ð¿ ð¿ ð¿ ð¿ ð¿ ð¿ ð? ð? ð? ð? ð¿ ð¿ ð¿ ð¿ Ãc   LayerElementUVI ±a   VersionIe Ëa  NameS map1b   MappingInformationTypeS ByPolygonVertex9b   ReferenceInformationTypeS IndexToDirect5c  í UVd à Ø? ä? Ø? Ð? ä? Ð? Ø? à? ä? à? Ø? è? ä? è? Ø? ð? ä? ð? ì? ì? Ð? À? À? Ð?¶c  m UVIndexi `                +   ²d   LayerElementMaterialI d   VersionIe d   NameS Gd  MappingInformationTypeS AllSame~d   ReferenceInformationTypeS IndexToDirect¥d   Materialsi  +f   LayerI âd   VersionId Le LayerElement#e   TypeS LayerElementNormal?e   +TypedIndexI ¸e LayerElemente   TypeS LayerElementMaterial«e   +TypedIndexI f LayerElementõe   TypeS LayerElementUVf   +TypedIndexI ùÕ  ! GeometryLÐÒ* S + GeometryS Meshß1  \Ë VerticesdTW  OË xl½yàžÃÕÿ?‰¥©¥”Ðj…¡Ä[(ú¨~†>B(¥ZQ[†Ò>žÇÚÖöÕ&SK’Øj©õ¢‚Rû[rO" ’„DpYB"ö=¿÷œ™sÿ朸ÿù$¯Ï|Îuæœ3ï{î랙˾|G1¦=¸ÿŠ?ÝU}Oïàg³ÛÉ‚‡uÞ9?ñvý‰·‹ö§¼,qsùe· >wè5‰û6¿EðiGSû=ö¸©æq“ÛoL¼ùÖç××Ü<ûè͉‡5öûgÍãA¿»5qÛïÞ«jî>ÚçöÄÍj{\\s3´ÿ‰ÇÕûœSóæì{3ŸÐï·5·Û|™ù¤~¿MÇñaîÖèsNÍC±Óàº5‡æë6ð³æí‡ÙÏÔ¯š›Ò¯€8ÔÜÏËqˆƒ÷¸©æ¦ÄÍ Î5SsœÃe—Ý&ø39/y¬¹ùSΣCÞkîûå¼;ÔIÍùNÚ½ûÜYs3|¯~„xYÕÞ¢®zWö-ê*q¯üiàOâFùßÂj?Dö·AÉþWÄ'ñ¸¦Œ§C<‰÷•ñþîÖÄÍÚ2_ ò•¸û¦Ì¯G~oV“õ`PduÕÁï¹~ÂÀ/‰{ÔUúýR¼¯¬ÏöoÙN‹ëÖím¹n€Ÿ5wÅψ~Õ¼ýeîWƒ8ÔÜÏ-qØ]ŽG»ñí7R»ýåøå8»ÈñnJ^âzJBÎc$õÄ¢®’ýðšÔŸu•¸E]Õ~Ñ z5¾æЫ :ø ôJpèéô*Šö§¤ñ½ê>w(Õ7ôj¬àÓÞ“ì›=öx æЫû‡^Ý[sèÕƒ‰c\ßUsèոġWT_œwèULz%ò½Ÿ8ôêòÚô*ó ý(Nlº”ù¤~¤ßšC¯.Oö˜C¯¨=ôJè ô*søY·‡^‘Ÿ©_5‡^Q¿ W÷ÖzEq€^=PsèÅ z5¶æÐ+Š3ôª#ø39/Ð+º>û½¢7û±š‡7ס¸‡Åo7_Hõì·íÿhÝ>®÷:7ÿÁ]Sjn&¯BãÊ÷~iRÍýÀiT͘1 ¾î™T÷qæNÂÄÓ;ðÓ5ÿy¨nßž9grâíE}ÆÔÜŸpê#‰7#Ljy`uÿ£Ôþƒ®«ÛÛç?–¸½n€˜wÅi_7ó¨¦p³ê ëÈ^‰;=Û1£Æˆy‹+×u÷#ÚŸýLýª¹/ýj‡šÇ_å8xÄMðurÜ â\s·uŽsûþ]SjÞNÌy‰ÛôÏñ(þG›óؾ>úÍãË(yŸ?[ðøz®wÒJSkûnÝO‘ôÊ©öuÕ•}‡ºJ¼Qþ8Ôqå¿Ÿ´ +½Ï5½dú›Ú·÷.ŸÄíWÄ3qwµŒ¿Eü©=ꪓì•øä+ñv„Ìo3ò~uU··¨‡ÔÞüSÖO;õ âuEö8þ…ûUd}¶Od;AÕ³+×õªþMñ3õ«¶ÎÈý2j|YÔUj× nu{‹ºJÿwˆsÍÝV9Îy©¹A]¥ÿÇRêŠÚ-’z7Ëy÷ÏJý1‹s¸Wš*ìÃvza~5³æ˜_]ÛÇüJp̯òçõ'ÎíOIº„ùÕtÁç¥ñ†ùÕã‚OHã +ó+¡‡˜_eùÖçT/\'˜_ÑxÀ¡é:s̯2ŸÔ/Ï#J]1ÇüêædÛc~Eí1¿ïã˜_e?ëö˜_‘Ÿ©_5ÇüŠú…ùUÖãr]̯(˜_ ÝÀüŠâ†ùÕãµ̯(Θ_Mü™œ̯èúì?æW”G̯È_æ˜_Ý‘þó+Á1¿¢:ÁüêÉÚ>æW‡”ù•hùÕµ=°ƒù•ä¨«Ä1¿þ`~Eõù•ðó+z?óCd1¿¢qe¿">É>æW"ž˜_ÑxÀ‰‡ƒe<=♸Qñˆ?µŸ)óe/âÉü¶Gã¤YQÖC°«0PÖE]%;Ív²ÞLáQ×g±ãU=7åº~&{\ŸÍÀìgêWÍmé—CjÞn”ã·šÛóIßâ\óðÇçxµïu•Ú9ä±noQWéÿy¯¹G]¥ÿû¥þDÔUâÍagSœ¸_@ùõÜìyÂΛëÐû„_ ½uGSêëºN}&ÙÁü™âÄýõ£îŸ›xüÆ »ëöfÆùó7×  Ï+ÜŸûˆ77 ÏÇÌCáí*ƒîNǯQ¿™›%ïóg Þ¼žëÄž´Ò³µ}»î§G’^©öuÕƒx5ʾE]%”?ø‰x6ˆgâöjƒøS{ÔU¿ç8xä+q|ù #ï§ñ€Ïƒ¢ êÚ_+ë'Ný‚¸A]ÑïËûoS¸C]Õ<>‘íxU϶\שúoË~¦~Õvü¥_j|™‡€¸ÕíñytÊ"΂o•ãܾ§ÆûÃ9/Í@©u•þ>.’zÒl–óîž•úÓ¢®R{{âJÏÖ×¢—}zïjÞö½î¶~ãÆž÷|ÍÝ÷è$ÞþpÈs5ogîHymv»AØ·ý†æKî–¿H}ûíÒ¥hz }ó\Fã­ù}?¡ÏÍÕûþÄ;Ψ¯ëÞ¹ŽÆOøå T¿\WñÖ‘ó“Ÿqz 81·ý—y>q÷ÍÆÔvšß~I¼é{÷Õ5÷ÿöBjo¾s÷Õé'Ûq…‡ÕnSs_ì¸AÌ£â†ùº~Öíû‰~Õ¼y»ô q¨¹)qˆ[ÍÛï帵ÿþ‹ÐSâl‘Ñþ’ä±æqFÎcxè<Š÷×o“óîæìMñ`¿™ë¤ýÛ(ÁÍôEz¥Ú7¨«ÄÑ+ûqÛ#:‰åG]%Iÿýƒ¿¡÷}¯úkÑßÔ¾ýÒ,â¿“ñl¯Ú‡ôǪø{Ä?µÈ|Å[FÎOÜ ®:é:Eg ò›¸[UÖC8áKâ~uU?—£ñæÖ’õf ª>]±Ó¨zn6È×mágº>ûc‹Ÿ©_5oÞÊýŠˆCÍm‰Cƒ¸ Žº¢ÿß,ǯ?!ÇÙ /uûöþœ³£Ô‹ºJíüƒROÚ%ï³¥þ˜Õr4Eqâ~Á½pÿêÅúº¸ug¿Áý+Áqÿj|âíú[Ñþô‘4qÿJØws‡Òûî_ }sÓ’.áþÕûƒûW¤Kø~Þߘãþճ麸Ï#ô÷¯h\áþÕ/·Çý«6µÇý«ÉµŸ¸õbâ¸õ`Íqÿ*ó ýès3ÛÁ}ªÌ'õ»6ýæ¸õ`ÍqÿŠÚãþ•¸O‚ûW™ÃϺ=î_‘Ÿ©_5Çý+êî_åù#þ—ã€ûW¤Óìî_QÜpÿJèî_QœqÿJèIx&ç÷¯èú];ÊyÄý+ò—9î_Oþáþ•à¸Eu‚ûW/ ÿ‡ïuL¹%ÚãþÕ=°ƒûW’£®Çý+áî_Ñ8Äý+á?î_ͤöCdqÿŠÆî_-ŸÔ÷¯D„œGÜ¿Êý(õŒïÇ'ÿpÿJpÜ¿Êu‚ºªýGSzÅ#í+‚BóÚf«ë_®¹_‹‰ü…»a¾°¾@÷yÝÇ“Åuý¬s¨⟎þÇ çÒûŸ»ðB¡cí“I—šæ‹ù˜_óÇT¯ö”±Yïyþü²¥º÷Ç¢8q^ÌÑøq?_]|ÙnºçËäÿšG«ûe~“¸9í°ëjÖêy%µÃ».ýdûÌÛo5®æíAÙN‹ëÖ¼)×mà§à}³Ÿ©_5wÜ/Ä¡æÍ9q«¹-q ˆsÍÛ rœÛ& }hž*y¹~¾Ô™­s-ò^Û1땼£NߪÔɃ÷—œv<é•jßn=„>çe¿…ýÄ·Qþ´ð‡¸ò¿…ÿ‰[Õ_‹º"~ÁÒñ!;÷ËxÄ3q²Œ¿AüÇÉ|yä‹Úï'ók‘ßÄͲê!q÷ÿdý´ßî¡ñfPWé÷\W±ðVÕ§-v¬®çMÊuUý·«?ѯÚ~óRîW@júæ8´çËñh7ŸL:Ö9~-ê*ý½E^j;¦äÅ 5w[å<ú-¥žD›óîúcQWô÷CSœ8>¸$½p¿ýÕÚ>î·ßÛÁop¿}AÍq¿}2ñÍ>vp¿=ži¢Ð7Üo§qˆûíÒÿáÃéý÷Û[aÛùy^qÈC4ïf?q¿=·ye½çùÆZ}²þ<¹µxÁýv?¸ß>µ¶ûí ’ÿ¸ßkŽûí¯ßfôõ5Ç}uâ¸ß~}ú}×æ+/ˆ5ÇýöÜþ’ùSkŽûít]Üoïã¸ßžÇ9úU·Çývêî·ÓçZ¾.î·Sp¿½­Ûã~;Å ÷Û…þà~;Å÷Û…þà~;å÷ÛóõYÿÏyÄývò—¯‹ûí“Óõp¿úÇ÷Ûs~¶à¸ßþ[Ò+Õ÷ÛïíIqü¶´û퓉o*ýÁývú<ƒûíÂÜo§qˆûí¢¿¸ß>/ÙiŽY:>‰ã~»ˆ'î·ÓxÃ}iÜo§:3e¾p¿ê>\$ó‹ûí4Np¿]Ôî·¿J×(ë÷Û‰ã~ûõÔïÜo'Žûí²>‹ÜoõŒûít]ÜoõûíägêWm÷Û³~"5ÇývŠî··5Çývšá~ûK5ÇývŠ3î·‹ñŽûí”Üo§ësà~;å÷ÛÉ_æ¸ß>9ÙÅývê7sÜo§:ÁývÁÑ”^íÐ,¬ýi~9ÿ¾~z/+x»ÉMù{¬ÛV~­nïü$µßãáOóØË4ŠVþÇg6ÌóƒÕVqhÖ^Ò&;Þ\!æ™aòw¨^ÃNPœ¸_æ§oÓx3Ûöï#ágÇÑø‰ÏŒóäfÂß_Kö›‘M¨ýo¾8p!ñÅ o¬¹{uñöí…7¦ßóu™‡QM¨y(vÂÜÑâs„+×uð³no‹Ÿ©_5oöÎýrˆCÍm‰Cƒ¸ ^âçšÇ§sœ-ò"ø£9/y¬y³{ÎcÛkÙÜo~_Ø8çÝ¡NêövH®ôTÁÝnþžôJµ÷¨«Ä1jû¨«ÄòÇ¢®oKÿ-ê*q«úÛ¢¿dç+âCüËËE< â™xø¡Œ¿Gü©ý62_qßãhü4OËüÆñ§ñGÈzˆŸHã'¾.ëÇ/GÜ£®Òu¸®˜ÔUÍ›b'¨zöåº~Öí]ñ3õ«æq¯Ü/‹8ÔÜOÊq0z<~w éW³™¿sJœ‘—ÚŽA]¥ÿû[¥>XÔµ3RO ê*qw¨Ô‡º";ÿ7•âÄñAÓüznöëdëóÍuìà7ø~Pp|?H÷©Ü¶ýÕíñý Íðý Ð1|?˜çQ½_ýÂ÷ƒT7ø~Pè3¾¤qˆïÅHïÙO|?Hãߣ‰÷|?Hº„õ¢§nûN¥ñƒïÅýF|?¸(õ ßN¬ýÇ÷ƒ¯'Žïé{ ¶ƒï‰ãûAú¾”9¾$Žï'¦¿cŽï3ÇukŽïéºø~ô»ÛþøìgêWÝßR¿RjŽï)ø~ô»kg7|?(t ßRœñý Ð¥81çß’_lßRñý`î¿ï(yŸ?[p|?Hu‚ï×~âûÁI¯T{|?ø`â…ï…|?øXâø~PøƒïiÞ€ï…ÿø~Æaè%û‹ïiâûÁ¥â“ìãûAO|?Hº„ïÑDüñý é’A]ÕýÂ÷ƒyüŒùÅ÷ƒ4ðý ¨|?˜Çϵ²~ðý q|?(ë­p|?(êßR{|?(êßÒuñý ¨|?H~¦~¥~s~ñý`î—_ø~â€ïÅxÄ÷ƒ/¥¿Ç÷ƒbüÚ­rœñý ïç¼àûA¡ø~òˆïsÖ3LOë„?XÏ@ó¬gþc=ÝWÁzÑ_¬gÈãðK³T|’ýöw2žXÏ@º„ïýEü±žáõÔëD¾°žôëD~±žÆ Ö3ˆzÀzâXÏp[']Ÿß7/öv²õ ·‘_…c=q¬gõ‰õ dëD=c=q¬gõõ Y'ÕxÁzêÖ3ˆñ…õ ‡qþ ®èÿ7Ëñ‹õ g¬gX\·ÇzÊ Ö3}ÀzÊ#Ö3dK±žazú{3[êÖ3P`=Ń㖚¦—½iÒ;õuýÏßÄŸ*x³öLúœãÇ'ìØ›^¡yƒ·~6ÏÎupú¢_áê^NöÃèÑ'öÇn´!Õ™4Rè¼ßiå×ÉŸWú‰÷ÓwÿàcbÞÛ<~IÇ/˜U÷Ë.Yýd§¹`È£57ë_N<¼úÙí‚»2_ôÙíéïØ϶'óöÂ! +¾^±s‚Y‚’¯ágÍmñÓ¢_5÷æ~Ä¡æñ‡%ˆ[ÍCÿ·€8×<^•ãܾÓ0%/1't¦½1ç1>9”úÍý ßÍyÿš$xó³\'í£¯ nn8å´¤WjïPW=àÚ¾C]%”?Í¿^¡y³Wþ;øŸÚÕßý%;×-ŸÄý®2ž âIí_–ñ·ˆâfÚ%4Þ,ꪃßwãƒü’óe=xÔCâíY?õ“¸A]ÑïYÇ +·¨+Á‹¨êÙ•ëFøY·o§f?úUs¿AéâPó¸cŽƒCÜjÞl¸!éWø“¿¶Ä¹y[Ž÷0/çÅw¤>8ÔU²kQWµ}‡ºJÿ7¨“šGÔUú¿C]Õ<5M/¬¿z·æX5¡ŽõW‚cýÕÌıþJØq§¤÷!¬¿:†õW/¦öX%t ë¯hbýÕ çë¯hbýÕ«µ?XEã딨»íúéÖ_‘®3Çú+?X5GØÚÿÝäÖ_M­9Ö_e>¡ß5Çú«Ì'õ»3ýÛgŽõWSkŽõWÔë¯æÔë¯2‡Ÿ5Çú+ò3õ«æXEýÂú«WkŽýƒ¬¿"ýf°þŠâ†õWB—°þŠâŒõWB—°þŠò‚õWRgþ”óˆõWä/ÛÇú«™É¬¿믨N°þê½ÚOìü#ͯT{¬¿šÐ;X%ìXÔUâX%üÁú+š7`ý•ðë¯^¤öCd±þŠÆ!Ö_-ŸÔë¯D<±þj1ñ¾2þXEº„õW"_XEuõW"¿XEãë¯D=`ýq¬¿õƒuVıþJÔ[—÷•õ‰õWÔë¯D=cýq¬¿’õ_üÄú+1^°þŠú…õWb|aýUŽÃîr¸JzÒ®“ónP'µºJÿ7¨«š'”^X/úà‡Lì€c½¨hõ¢³ÇzQ¡caà ´>ëE¥ŽÍ:‡æ X/*ú…õ¢¯‘ /ó.¬¥qˆõ¢‹j°^”Æ!ÖU’®wóþ²¥ñ†õ¢¤ë̱^”ÆÖ‹ŠuqX/JãÊ­yÔµ}¬%Žõ¢w×ëB?H~b½èÝé'ÛgŽõ¢OÔëEó¸ÅukŽõ¢Ä±^”æ5l§é›ýLýªÛc½hîâPs¬¥8`½¨˜Ga½(Å ëE….a½(ÅëE….a½hÎËõó….™­s±^4÷£Ô9Ö‹æ¼£NjÌV¥N,8Ö‹š_©öX/:±qÄzQaëEg%Žõ¢Â¬¥õ òëE_Ní±^TôëE_#~ÁÒñ!û÷Ëxb½(C¬ñÇzQªc¬ùÂzQª{¿ŸÌ/Ö‹Ò8ÁzQQX/JëEEý`½èɬ½;ýäzÀzQâX/*êëEÉÖ‹ÊzÞ¤\WÕ?Ö‹f?ѯÚ>Ö‹R¿°^TŒ/¬Ízt¾X/šõ+Èñ‹õ¢9ÎÈKmëE)/X/*ôëE)X/*ôëEg¥¿ÇzÑÜïRoX/JuÒ,x +Yzùë~ôa}Ýö´S&uÀíè±¢½Û`¯Ù‰ûE Åu›þJßo™i ?Í“×м!¼ñ3ѯð³yn¿CŽSñ3l½/C3â'Bçͼáï¤ë†½'æ±aX߬KëÉõl~OãÁx²¸Ï;„ÆUœºÒŒº¿ÍÄ>R‡œqOÍãJC‰·žqOú=×USx3m¥5ÅŽùèdú|ÌíC¹n€Ÿu{SüLý¼ô«=ç'¤Cl§™›ãÐ nuûf«7‡8 ¾oŽsœú°Ð;3çÅ u{ûõœÇpÝX¡?íú9ïñŸ?Êñà÷ëSs4Ï%¸_æ×¢ù•nºêIyTöã÷öšx\(ýiáµWþøŸx»Xö7¢¿dg»¥ã“¸Qñ ˆgâÍ2þíûR7Væ«ùž§º÷Èüä7Ù±¨«~r¾Ú‡ûиòûËú1¨ŸÔÞ£®ÒÏnû3·¨«šÇbÇéz>7_·…Ÿu{WüLýª¹/ýjÏVã«ÄÁ#nuûfË}i>çšÇ}rœ òRó0#çÅ"5w}rã?¥žÔµ»Véê*ñ8ÿ(ŠÇˆ^XßþQmëÛ'wð¬oí±¾}ñÍ>¤ü°¬ooo›(üÄúvzßÂúvÑ/œ'CŸû°¾ê…íà<™|ßæ‡Þþl|è»dÞFbë×êCã çÉ®³¬o§ñ†õíÏÖv°¾ÆÖ·‹zÀúö’}¿Íè{ëöXßNëÛï¥ë—qÚå+/õ‰õí¹ý%óŸ­Ûc};]ëÛi^Ã~b};ùÙ¢_u{¬oÏz‹8ÔëÛ)XßþNͱ¾â†õíB—°¾âŒõíB—°¾ò‚õíùú¥_Íñ9Xß.ôëÛç¤ëa};õýÇúö\'‡Ÿ-8Ö·ŸNó+ÕëÛ'÷¤:ù¶´õísˆo*ýÁúö6q¬oþc};Í°¾]ôëÛ_Oí±¾}©ø$Žõí"žXßNãëÀEü±¾êëÛE¾°¾ý²s‘Ì/Ö·Ó8ÁúöÔ?~ÿ°ÁGÔ~ ¬¬o'Žõí÷¦ßs{¬o'Žõí²>‹¬oõŒõít]¬oõõíägêWmëÛ©_q¨9Ö·S°¾ýšc}û[éÿXßþ^ͱ¾âŒõíb¼c};åëÛéúÜ/¬o§æö¾\×ÃOÑ~—ìgê—àwå~Å-±Wâà·º}{YŽ[¿¡×7ç8{ä¥nï¦å¼8ä±æÍüœÇ0ò ÁCÿ’w{Å£ëÏʹNük7IþìAó+Õ> ®zG¯íotÎÓ‰[åA]%n”ÿþ“Õ_‡þ&Þv–ŽñÍe<-♸[QÆ? þdÿt™/|%¶“ùm:ƃû‰¬‹zHí›oÈúqï]EÜ ®Òï9ž¶p¯ë³Ø ªžC¹n?k;íÎÙÏÔ¯š›Ò¯q¨ysRŽCDÜjîQWéÿq®¹½)Ç9ü^Ž÷0µäåh©u•þ>ŒzbQWdw]©?uEí_½‰âÄñI®¤öã|Rûƒý8tÀ±GpìÇ¡u ím+ ;Øóµßã¡ŸØóZâØ#ôûqès_»ÚêT/ìöã^a?Ž˜—b?Îûd§ H×¹=öãÐ8Ä~ÒuæØCã ûqÄ÷&ØCã +ûqžìIýæyÅ~’ì7‹ÞWsì»!Žý8÷¥ßs{æØódͱ‡Úc?Žø^ ûqèºØCó¶ƒý8ä'öãÐ<ˆ9öãP¿°G|îÃ~Šöã¼W_×–¸a?ŽÐ%ìÇ¡8c?é7Ûæ¼`?ùÅûq(Ø“û]âã7ÎyÇ~Á±‡êûqÇ~œ3i~¥Úc?Î#)¾Ø#Ú{ÔUâØ#üÁ~œü9g°ôûq^Kí±Gôûqèó‹ûŠøý//ñÄ~œ÷ǾìÇ¡zuÛÈ|a?éöãˆüb?ìÇõ€ý84~°ç¾®ÃqƾâØ#ê9öãÈú,v°GÔ3öãÐu±GÔ?ö㟩_©|]ìÇ¡~a?Ž_ØCqÀ~œ÷êöÍw—¼“þý8rüÎ)qF^êöØCyÁ~ò‹¯‹ý89Fê öãä¼*õûq¨NüÿM¥8±¸B¯pÕ˜%õuÃ??´“~sòwo7{”î#›÷ÖvÂ=k¼œÚûuÇPœØ¾{d ͳÃ%Ÿˆþ†åN¥yƒ;rˆ¹jÍÌ¢³(Nlǯ±„Æi{ì”üþYÆQ»è¥<_YÞo¹}{ØïsÝÿp9š‡2ß@ãÄ>qÌSuÝoNZ’üo§¬ð@ÍÃÜ牻i+<@¿çñË|ú1OÕÜ;~§åòçãÒޕ뺫Ñ|³ëû‰~Õv<÷káYïÔ¼í›ã`·šû+sÜâ\ó°lŽ³A^j¼¼»–Ðæî’Ç“¾›ãÁþošó¯#xÛä:qï.ÜݵÊY4¿RíêªqvÚ>ê*q¯ü±¨«Ä›u¤ÿ üO<^,ûÛ ¿‰‡#–ŽÙWñŒˆgâí12þñOÜ¢®:é÷%ù";¨«š7Ý@ãÁ?.ëÁÿú$?q²¬ŸðÌóÄ›©ªÞ˜ëú,vZUÏŽ¯«ê?øìgêWò—ýoæ~9Ä¡æ¶ÄÁ!n5o¯Gó-8×<,“ãl—šûÉ9/á©u•Úù¥žÄMrÞãRÌ5¥NÞY,ô&òë¹ÙŸŠë¾¹ÎÔ~ƒýƒ‚cÿ ÝGÆþAaûI¯°Pè*öÒû–ëãÄqÃþAzŸÃþÁ\/<.Ö=“Æ!ö͉y)öÒ8Ä>;ñ¹ûó8¼¨éz×þ §Ò8ÄþA¡WØ?Hã +ûgÕýÅþÁOS±ðÁšcÿ qì|0ýžícÿ qìœUsìÌ×­9öÒu±æ›lç‹fýD¿êöØ?HýJq¨9öR°0ëw‰[\'Ç ûÅ< +û)ÎØ?˜õ›ÛOÌyÁþA¡3Ø?HyÄþÁܧJÞçÏû©N°ð³ÚOì$½²ª=öNíA±PØÁþÁy‰cÿ ðû©Î±Pøýƒ4oÀþAÑ_ì¤yö.ŸdûE<±Æ!öÙ‰øcÿ CìùÂþÁü>=Bæûi<`ÿ ¨ìÌãçZY?Ø?Hûe½Žýƒ¢>±Úcÿ ¨gì¤ëbÿ ¨ì$?S¿R¿¹Þ°0÷K/ì¤8`ÿ Ø?Hú…ýƒ¤ßlû)ÎØ?(ÇûÃ9/Ø?(ôû)Ø?˜ãQê +ûç%ÿ°Ppì¤:ÁþÁÏjÿS +Ó+|÷ÁÝönZ¼º‡àÍ–_›Ÿ¸?I]wä8º/c½=ç³øãÞpqjoŽ™*t8Üvî;‰Ç¯ŸMqâ8„f0Õ™àC¡Wö®{¨.qÿ“Þ?¹}³îcTÇqÐ"_MFuož?Š>7s{ÿÁT'þ§ëÌîÁõ™7;ÜBã͆½ªyÛYç?äÿY{?”~rûXxØgÙ5÷ÅNÀuknÊuÍn_ˆú·ÅÏÔ¯º½-ýrˆCÍÃ9 âVsSâÖ=5ëw‰{kŽsóÈíbå&ä¼´'J݈#rò^Ûo7Ïyßù@p¿m®ûÙ ŠÇÇžóÊŸi~¥ÚÔUâh•}ƒºJ¼Qþ8ÔUâNùá?qÕ_ƒºJÜ|E|÷ËxzÄ3q?CÆ¿]ç±<w•ùŠÃ‡Ñ8ôÏÉüú÷§Òx {Ëzh¶¿…Æ.맷ÎèºgÊz‹…·ª>=ÛQõlÊu­ªË~¢_é:œWúÕ 5wä8´}äxôW&ýŠÿ'ǯG]¥¿o¦¨ñ>>ç%þ^êƒE]¥ööP©'uEvÖ’úÓ ®7Ÿ 8±ÿ ¥ö;ž~ÏûïàÿØï,Úc¿ós‰c¿³Ð1ìwÎ÷e®¼Eè*ö;Óûö;KÞõ4±ß™ê…¯‹ýÎ4±ß™t½Ë{ý=Ã޿ɺ^Æ#ö;Bþ|üþÂÚìw&]Â~çü¹¹´Ç~goØï<»nýÎ4Þ°ßylͱßùódûǦŸ]îÌû…^a¿3ÙÁ~ç|¨\ûóu?yamûó<ýª9ö;S¿°ß™æ›|]ìwÎq8è`ÒoæØïLqÃ~g9)qÆ~g1oÁ~gÊ ö; ýÁ~gÊ#ö; ýÁ~gÊ;ö;S<øºØïLu‚ýÎ’üÄ_èþ•jýÎ÷ ŽØï,ìc¿ós‰c¿³ðûé¾ ö; ÿ±ß™æ Øï,ú‹ýÎ4±ßy©øÐu¯•ñÄ~gzž`ìwþ„üùHæ ûó<`s™_ìw¦ñ€ý΢°ß™Æö;‹úÁ~çÏ“}ìw›~r<±ß™8ö;‹úÄ~g²ƒý΢ž±ß9롪ìw&?S¿jû¦ô ûÅøÂ~gŠö;‹ñØØ|ß +ûÅøÅ~çç+äxÇ~gÊ ö; }À~gÊ#ö;S?¸¿Øïü\òû©ß̱ߙꤶ—àhJ¯æÒ­¾ýšzúü¦ÝýTÑÞo³ëó‰ÇO÷×Gþ†>çÇßÞ”óÉz2.¯ +»\EùgÜü—ÞMvü­[ˆy—ýç,wí9G’®sû¸Ïo©.íwö&]gîqÇ’d'ܸhQOò·\×_ýWª{;ü ‘_ß¡qÒÌxbNÝÞ¬ð +·°Ããjî®?ô‹d?îtÁ¸ô“íÛÂÛ™OÌ©yüz¶Óàº5o;ùº-üüªâ'úUóøóܯˆ8ÔÜr·š‡ksÜ,â\óæÙg‡¼ÔÜÍy±ÈcÍã9y¯yغäý’­(‡vJ®³Ü±‚›_ÝÿWš_©öñ±ÓŸèA²ßÜõùÄÛ%Òº"~‚ô¿…ÿ‰Çe#ú›xsËÒñIܪxÄ3ñ°–Œ@üÉÎ 2_ù¢öÃd~-òKí§Ëzhû¼BãÇm¯êgô¡4Þ ê*ýÇÓnQW5oŠ£ê9ŽË×5ªþÛ+‹ŸèWm'î—ûeÔøò?Íqðˆ[ݾ½f}þqˆsÍM‰³E^jîÊy1ÈcÍ-êŠþ?Hê‰A]%Þ\,õÇ>’ë$.s,Å©´M/œÏðemç3Lï€ã|Ñç3¼8Îg:†óèsÎgºúÐoò}õ[þBùçëâ|†÷’œÏ tç3Ðû"ÎgŸq>CœÏ âó>Mvp>ÝÏ`ûxÞCœÏ@Ÿ›™ã|WxÞÄÓ=©Eßšß~Iç3tjŽó¾Löq>C'ýäö8Ÿ8Îgxºæ¾ØÁó&è>·Çù dç3Ðý<æ8Ÿ!û‰~Õvp>CîâPsœÏ@qÀù b^ó(nxÞé7Û7%Î8ŸAÌ[p>CÎ òXÛÇù ”GœÏ@þ²œÏðBj‡ó¨ßÌq>Õ Îgç3üæWª=Îg˜Þ;8ŸAØÇù /$Žó„?8Ÿ>çã|á?Îg Ï98ŸAôç3äy×f©ø$û8ŸAÄç3Ð8Äù "þ8ŸáÓÔç3ˆ|á|‡8ŸAäç3Ð8Áù ¢p>qœÏÐé¤ë—zs—û2ÙÇù ò«pœÏ@ç3ˆúÄù dç3ˆzÆù Äq>ƒ¨œÏ@~¦~Õöq>õ ç3ˆñ…ó( âV··¨+úÿÍrüâ|Š3Îgø¬nó(/8ŸAèÎg <â|†ìoé/Îgx!ý=Îg ~s|p>Õ Îg<µÅ«={;ãÒÏbÇßvøŒþ·¾Q´o.ß™î#Ûá¿’×ÝiUúœã×¾ŽâÄvšûÿHólóí(NÌÍ×·{?Ù7û=%âG¥yƒ?d¶ˆ§k ªK¿çôþÉvì9—~–ìøf/NýîòqPÝ;» }nîòkäqµïðgêöÍ1+C;aç“ÿ5wƒ~JÜ}ö¿1]‡í0·û ¦æ¡Ø‰¸nÍã9ùº~Ö¼›ýLýªy8;÷Ë!5oæ8ÄŸ=%Æ£-qk¾u§u{ß'ǹýîu¤‹ì¿¿/ç% û•Ôæ<佶Ó\–óîQ')Nl'Þ’ëÄÿeˆàfÇQg'½Òíêª'ýýVÒ¾C]%n•?u•xPþ·ðŸÚ«þô—øWÄ'ñæ`ÏñL<î!ãoÿÄý×e¾,ò•xXWæ·={z…ódòø¼pÈ\ê¿_¬W윰@èUûI¾.Γ¡ûF|]œ'C~¦~Õvpž õ çÉäyS±ódr·º=Γ¡¸á<Òo¶ód(Î8OFÌ[pž åçÉ]Ây2”Gœ÷’ûW®‹ód(ï8OFpœ'Cu‚ódÇy2çÐçAÕçÉä:Töqž Õ-Γþà<ªsœ'#üÇy2ï¤üá<Ñ_œ'Cz®[:>©=ΓñÄy2ô>ŠsWDüqž ½ïâ<‘/œ'CïÓ8OFä7 ¿öÃù²pžL? dýà<â8OFÔ›+çɈútÅΓõŒódÈΓõódÈÏÔ¯Ôo®œ'“û…8ÔçÉPpžÌ'5Çy24ŸÀy2büâ<Š3ΓãçÉP^pžŒÐœ'CyÄy29¥®pž åçÉŽód¨NpžŒàè +½Â£?ïåð¯n¿–œ1³ƒÿ‡‘‹EûæJŸ¿÷êõ#ÁÝšù¼_7ùJŠÛ ófåqñæ)NÌÛïÿíƒd¿ýøä%u|¯Ӹ3[îJºÎí݈Å4NÛ?Ü'âoƧ:öGGºŸÁíísWP݇ñ—Ð}¾.p%+÷Ô–óêëú9÷Šð§™5b|Í›—ùÓ#Æ“¿<~™ÏÚr^Í]±c'\’¿(íÛÍòu#ü¬Û7󳟩_5÷1÷«ÝbWšo²ÿÍ99 âV·ooÈqóˆsÍ]‰sœt%é"Ûiçæ¼ä1õ›¹Y£œÛŒ¼×<\‘ónP'5o>ÎuâW:Ep»ú¯F$½Òíêª'qeß¡®÷ÊŸˆ+ÿ-ê*ñø†ì¯Go?Z:>‰[Ï€x&îTü âOüÿd¾ ò•xŒ2¿ùuÉþ“²âìi\ÔU¿ïÆõ“Ú;ÔU²Ç¼Ý!óVÕgSìxUÏ®\·Ÿµÿlö3õ«æ®“ûe‡š7gç84ˆ[Í ê*ýß!Î5Ûæ8‡‰r¼;ÔUjÔß·äq„Ô‡ºJíý#R"êŠì¬xŠÐ%4¥W»ðeÁýU}Ÿìà7q·“oÖyçÅÄÍ÷& +½ò§¤ÏùîòË„®ú¹CésNsÀæB‡ý´ô>çö؃꥛¯Mnÿ„®û­ÏE<ݳÒûh³Æ~¤ëÜÞü;‡¾ß½ô¹™9οʺ´Úù>_Ñ ;´?+ӷϳ)Ü>ž}ooúM¨¹ÛæËÌ'õ›üâöÌý}ž­9ÎÑ¢ö×­y{h¾n„Ÿ57ÅÏÔ¯š»ƒr¿p˜Ð«0/Çç†eýæ~•¸9Ŷƒó (ÎÍe—ÉyË3%/ëOºdÿ”óè‘÷Xõ7ôËy÷¨“šãœ"ªóÓ>½kn‡ï52éÎËíq®Ú“=‰+ûu•8Îãþ´ð‡Ú+ÿ ê*ñfˆìoD©ýà¥ã“¸QñÄybyÞÐWÆçÑû®[[æ+~¸Õ½ÿ¦Ìo@~Ì·«Éz°¨‡Ä-ꪓ~_òÕ ü’x@]%¿–âª>qŽµÇyn¢ž]¹n?k;¾øÙ¢_5·æ~á01¾Â܃¸ÕíýÆ·Ó|Ë"Î5oËqöÿãÝ¢®¨ÝzJBÎc3Hê‰C]¥öÍkR"ê*q·wŸÞ?9>ø'½lŸßõvøsÿãÑT‡¶÷2‚7W©ƒvö¿÷ øqûðÖat_ÆÞ·§Ð1÷Ìë¤Wáá5)ÿÜ>>?£+ÖÎõRòèn>‘æ ¹‡tÛÛMo¤yƒ¿õMóñ¯iú'n¦ûÜÞ {*×ýáÿùµÜ–õäçí³W¾nÏÓx3wÜ*ê§p.q{÷­¢Þº|ÿVè•)vü¯þ#õêü|Ý~¦ø±ŸñÙÏÔ¯š»r¿âPó°I‰â&øM9nq®¹-qŽcö:žÎy‰?ÞCêÉ›9M¯e„þ„«rÞ›¯ýNòs„ó/Ü-Þ~}TíêªýʾC]%Þ( ꊸò?²3Aöס¿Ôþò¥ã“xüR®pˆ'µ¿EÆ¿ýð×_&î—ù +È—7¨«~pò›xØOÖCøÑ÷NÜÝ.ëÇ¡®Ç9i¢Þ˜»_ÈúôÅN£êÙ•ë6ð3ùËþØâgƒ~ÕÜ”~5ˆCÍýÆ9q«yó¯ó|k¼¿þ°g‹¼¤~ðuÛ99/y¬yx#ç±5ROꊮ·¼ÔŸu•x<ïÒÞµ z…z/ãð/¾®_øý§:ø¿hTïšc=}/⎜!ü‰nGŸó›õþÛ§O|ìla(ÿlß-9ë£ÄÍÛoÉø Ø‘æ ~ÑÑâs´=õÏ4o°»ý5Ï÷‹Î˜Á›Ó8Ä9x4eûq¹ýi†»n¥ï%˜ÛI;иòÝ7?ŃyóþLâöꞇï¿î2íüµ='¹}(¼½ø¾ù‚;æî[é{6noÊu[ø)Ú?S¿jÞìžû凚ûSrâ[o ½j7Ëqùˆ¤ß|ÝðIŽ³C^R?˜ã¼;ÊK{Ä ¡Wþ—9탣„þ„usÞ ê¤¶^Íubfm,¸²þ¹I¯Úþ²½C]õ$®ì;ÔUâQùcQW‰ã¼Aáÿwª¿ úKí¿">‰‡…2žñLÜ’ñÇy‰TÇ8Oä ç+RÝ7wÊü†‰;ôv°ãþ.ë¡}o&q•¬ŸvÃui¼ÔUº>ç¥ËQW5lGÕ3Î ÌöUý·Ëf?S¿j;¦ôË#5w'ç8Ä7åx4¨«Ô® Çoü8ǹYOŽ÷8;çÅ"®êWs@ΣEÞknQWɾCÔ¼A]jcÁÑ”^í ó÷#'“^5'}Gðæš«H¯üŸ÷ïíð—Ý8O^» ?ÛÙ†æ ö‹„^Ås·¤yCØy<½¿±s«¡qèžÜ@~Ž~äˆ0_è•]³Äq«Û7[ä¸áW1ñæ8ãÜW¡W¦äÅ"Ô¿·fë’Ç­®úã×ËyoŽ´9¥½ßªÔÉ/ /9ô*¨öuÕƒ8zeß¡®7Ê?ðÒ+£üwð?µÇyª¢¿ýM<^°t|·*žñ¤ö'Ëø{Äߥö¨«~rÞqlïÄã~2¿aÓ=³.­!ë¡9èMâÍÿ“õãPWÉÖq‹z³…‡oÉú lG×s¹.ÎוõÏ~¢_©ìûRîW{¿_v¸Õí›Í'“^áW1~Ã9Îá#9ÞýS9/þz©q«œÇ¸¥Ô‹º¢ø!õ' ®w ºD¯pÖm‚û§_#½r‹·ç’^ÅG:f¯¾‹î#›Ãwíí`‘ãÓ<µæü?lÿ¼èoóÐéô9ǽz¤¼¯uû9yÞðÏ¿Ó<”혻V5vÜ7 ù>sÇe4Ýàñ"_æÊçhúÑ“¤^:‹Æa²ó u^⪧Ñx G½'ê'¬>¸=æ=¡W]þË_HýcšbÇ\?Iê_~ÖíãÙÏÔ¯š›Ò¯ˆ8Ô<Ü™ãÐ.82Ï7ùsq‰›CœSœØŸø`ŽssØ®B—â“9/yí¯ÌyŒ¯oMýf;þÚœ÷öÌÛ$Ÿë¤¹|®àññwH¯t{‡ºê²ïPW‰[åO¸ê.ºì•ÿu•Ú·ÛÉþÔÙùŠøPûk—Ž§ƒ°ªŒ{ûe¤WÍî2_ùJíýu2¿áY4Üþ² ê!µÿ#ë§]m:ñæhYo±p{€¬Ïv•lÇéz.×ð“úÇõPüLýª¹/ýŠˆCÍ êŠü|EŽGsÛ94ß +ˆsú=׃A]Ñß{9Þ-ê*ñ0EêC{EΣAÞk;u•Ú[ÔUÍê*ñxÙ\Áè¯ûÑrÿbüN™ÝÁÿÃè±¢}Ü`¯‰·‹ +½ò+þ•î#‡i÷vé÷%náÉkH¯Ú7~&æ]f¿4ohvØÞ߸½¸/Íš?!]gîç 7vÍMï‰ø·ÃúæyÔzòüø§qˆs‰Åº_wþ!4®pÞl›âÁöí¤>Ë%ûÍ3&ÕÜ­<”¸?èŒIÔïÒ/[¸y|¥¶æ†íຂ—ëšõÕy˜ì'úU·Ç9ÏÔ¯€8ÔÜ”88Ä­æ~ë7Ä9õƒûå~–ãl‘—š73s^p®µÐ+œ?Ly4È{ÝÞ/çÝ¡Njîþ_®ûüQ‚Çe~}~úÛÁuS?ØW®ëtý/û™úU·Ìý +ˆCÍ}‰ƒEÜßj_šo5~ý¾9ÎyIñ` ê*ý}³PêƒA]%zbPW‰û*ýA]QûçŽÊqbFÛô²<¬÷õ9ðvè`Áãèù¤WfÅ㤎í¸Å;©½Ù~¡cnæ€w×Néåð“ûÍ&½ +».'t»¹+ßN\V|Žn{½MzwIó}¶ã’ï »Oï¥û¯Ìÿ_¢qØ Ú”¾_bî&¾Jã0¼qŠÐ«pêÅy¼íÚwrŠ·o—›x3¸ïdŠG‰[,Ü¿yŠÐ+_ìøÝ6]\·7|]øYs[üLýª¹á~!5%q‹•ŸñÎ7ƒ8×¼Y˜ãÜl·‹Ð¥0#ç%¬pœÐ%Sòè‘÷ÚŽ¿.ç=<ü¸ànÝ\'ýTðøƒgI¯–jºêßNÙw¨«Ä½òÇÃâÊÿÿ×ÈþFô7ñö¿—ŽOâá÷2žñt©ýÎ2þqÏ|_8,‘ùjo~‰ê»ÙUæ7<ü*‡¸XÖC<åb?uÕI×á÷;ÔOº®E]‘¿< ª>›b'èzæëÂÏÚŽ/~¦~ÕÜ•~9Ä¡æ­Éqˆˆ[ò‹ýlîÈß zĹæñµçïËñ§—¼|]êCø¯œÇp¨ÔƒºJ~4¤þxÔUâqÝO…þ Ñ+¼|ðòÿb?Ãä^ÙïÌícÿ£_í ð¡Ð«ö„KI¯ü5Qè•1†ô*ùaïÚ¾ ÃésN<öXóýùô9Çúˆ§ßäÐ^× Ïn”ç¡%¿íZ}hÆ'·¦ûì¿ÛöH‡î’ùR¯>>.«•½2[l°|²o¶-ê'˜áÄÛíG‹zcW^ ô*n^ì\:_êU¹®yjkºŸÇ~¶Ûd?S¿R\™ã\zê—EjÞn\‸Ū=ν§¸ĹæfxŽ³A^jî¦ç¼4›}Hqâëâ¼tÊc³Öl¡?~Ãœwœó¿|mÇN,uò«³oÛç‚4¿Šª½C]õ€ã¹ ¾C]Wþø“xl¤ÿ üOܪþ:ô—øWÄ'qwÈÒñtàÍ<‡ø'nPWüàø4ÈWâîb™_œÏŸõuU·Çyþ4®ì6²~â—È㹠¢ÞšÂ-ê*ùË×5lG×s¹.ž_ êß?S¿j;8—>÷ q¨¹C]¥~µÇ¨ñ¸Í|º_÷—ã×ËqvÈ ý]ቜ—¸©Ô< çñÛRO ê*ùaP'µºJÜ~¶à©izÅÞoþoÓ§;à~–<Þðé•Ûë4¡cí ½ßMíÛó}Änœ§ïòQâvå;z»ôûÒ/¿æ&ùsÎ%O ½ò÷^CŸsìn¿÷ýÚ}'½r¿Ÿ âï_ûCwó¿E¾ÌC¯åqøÚ(±OÁoº„ƉÝ|_Z§Öõç¥;–ðÏ®¿Ý”'æöÓo|xÿí¦PÿŠÿ]¾Å¾/ +^ì4 G‰}¶\7ÀϺ}ó`ö3õ«æí«¹_í ß‹ûê¾Ä!"nÉ/öÓß“ãÖ®tG5rœòRsûDÎKüÉiB7,çñ)¿|ÝÞ]ŸónQ'5·Gå:iF‡âÄþ´£'‘^éöuÕcPoÚ>ê*ñFùàOâNùàâAõ·A©ýWÄ'q£âéOì'ãÿÄÃM2_ùJ¼}Uæ7l²„ÆC ë!¼x·ž¬¿ä_#ûÊzsÌu};QÕ³+×ð3õ¯ÿ²Ÿ©_5·¥_í®r|ÅŸæ8X=ニ>ZÄ9ùËö›¾9Îq9Þýã9/ížRšës ò^Û1¨+ÊW/©?u•x¼î;'¾.½ìú§ V}ô*Ž’vâÆç¼ÖÁ_øc{Éë>4é•?I~>mœôª™°¡ÐáößO’^Ùñ.ë:Ï—.ß&Ã-ˆûðî”?™‡{ö|¦“~1øÑ>þë;´®(œûáéûtž_µ;R>ÙN3í€ÉÎ)—Qþ™»ÿ>çø×ÿ%⾘ô*~ûÏxõͽ#܉£?ñw§ŸHãÐ|­Ð«0õ Ò+÷·÷¥^·b?ÇlòRŠûc÷|œ¸ÿbÈ#5onÑ']7ô>à‘Ônï oÝ䥚·{d;æì÷E=ÛrÝ ?ëö¶ø™úUóöO¹_q¨¹+q°ˆ[ò‹ý±·“/[¦æ~—瀼Ôõ@v>"ê§yc ou•üåö¡p‡ºª¹-vŒªgW®ágÝÞ?S¿jnK¿<âPó檛{“Ÿˆ[úÙõç ‹I¯ â\s¿s‰ó r¼ÔU²k‘Ǻ}\-ç1ì&õ¤½¡ä½GêC]%;q“….Ñ+úœOzå—YVð¸éM¤Wñö•…ŽÙ=v~¯KnÏ(ŸÝþN}™ô*l¾ŠÐá8wÃÏSû°úê½~r{×o éUè•÷kvù”¼~Ñÿèº?Á<þômÒ«¸m?ºŸÁÜíwÜò1Ù;š¾gîþ;C7ê"Qá˳.½±PÔ}mñøÎBQo¦pwîE¢>}±ÓÌMë;øº¶\×|¿ß‡©ßÌÛŸe?S¿jîJ¿<âPó8¹Äq£þ=‰kç¸YÄYðgrœÛ=zËyqÈcÝÞ ÎyŒ½—úã6Éy·¨“º½9 ׉;fªä»oø÷4¿2ª½C]õ 7Ú>ê*q£ü‰ð‡Ú+ÿ ê*qZç·m÷þz²c^8õÑn onëõ²àÅŽÛì ZÀím¹n€Ÿuûf^öÓ¢_5kç~¥8¤ë³Wâ·š‡·q®¹;.ÇÙ#/5÷æ¼xäQðá9y¯¹»)çÝߘâÁþ´ÿÉuo;Hp3ì2Ò+ÝÞ¡®z úó²ºJÜ*ZøC\ùáâNõ×£¿‰›¯ˆn>ñ´ˆgâvŽŒƒø'V’ùrÈWân™ßða?'ñYõÚǹ²~Úö¦ñžWõV¸A]¥~pœqN%Ùqªž_~Šös³Ÿ©_57Ü/Ä!ùÅöÛ9íŽj<Î?ˆæ[ñE5~ÍqwËñÞ<’óâgH}h‡å<ä½¾nû¯œ÷0Lêý<×I¼õ ¡Kp™^áê1‚‡ë>'½jOþ®àqÀ£¤WæýµÄuݽk¼ß%gǽr.!½r—~"ôªYþÔü9çȽþŽãÖ\5ŽôªYt–ˆ§]s éU{ÜÿøúK4oˆ V£ÏÍl'þ{‡a§åè{ æa“ò8|âQîNÊãí‘«óæ=OÜ=¾Âc©lÇnf#ôÊ;æGËÑ÷lÜÞ–ëÚWW£ûyÌ}ñ3õ«¶ïJ¿â«ë6kä8DÄ­æ¶ÄÍ Î5o–+q^wÌò5ÇsÖ(/á½µ„.ù{J‘wÑ~³œ÷xÕÁÛkr¸÷ nî^å¢4¿jT{‡ºJñuÚ>ꊸò§…?‰åÿo.‘ýmÑ_²óñqhçĉxÄ3q<'NÄß þ‰ÔU'ý¾Ì òEuUs<'ŽÆž'êÁÿæ$?qŠ¬<'Žx3MÕ[á~º¬O<'ŽÚëzÆsⲎ©ú‡e?S¿R<Øÿ°(÷«](Ç—)qÀsâz§þuÛ_9Žô +ω“ãwÙg<'NŒw?%ç%¼+õ¡½;çÏq“z²iÎ;ž'¸¹¶ÔÉ»‹%‡oéÇ ZÁág×ÏÁ£æ¥|¸7ˆöí-¼ž¸íÛ½òo '½ŠgŸòÉvì#g.Iíã^ÇPþ»üÊõ¿$;çîë¥ÔƒºCóü‹B¯šþ‡ÆaÓçðÿôT~ºû^>âÿnÜH¡WáõH¯Ú#•zuðVYÞž+ôªY{Ù’3ær¡WvÖ±Ä× ½2…ûwæŠú ÅŽûõ¡¢žm¹n?S¿»q(~¦~Õ<ŽÉýjŸ{QŒ/[âÐŽÚ;ë7<4ÇÍ#Ωlß\‘ãì‘Á§ä¼4«7R¯ç<6[ß ôÇþ;çÝ Nj;qP®“¸í7¯ŸIz¥Û;ÔUÊ_Pöê*q¯ü1¨«Äò?À⪿ý%;_—ì«xÄ3ñæk2þñO<Œ•ùj}DõíPWüžãÚŠÆIxKÖCüî²y\Ý#ëÇ=ulæ¨z+<ªú ÅNTõìÊu#üLýflñ3õ«æí½¹_qHýãöþ‡9q«¹E]¥ÿ7?‘ã×\^âü79ÞÝ䜗f5©íë9a+©'ñæœw3VêÙ-×IÜæB—à +½ìó³o­ólÊGxc àí I¯Ü÷û  ë¿žçWÞ%ôª¼ +Ý°Ë]/ã+l3ôÊß7FÄ óI¯ü“;‘®s<í‘O“^ùkþ#âÏš³|„Ÿñâ>t?ƒÛ»ßžJãÐŽ#õêÜûi6« z¥Î£y>7;zÀÔšÇÇ¿ ÿ5`jŠÛo˜¯:è•š·3²×­¹+×µ—ô¡ûyl§=!û™ú%Ú—~9Ä!õÛ7Gä8XÄ­æaÝ·¶wžorû00Ç9~p—Ð+<’ò·í/t)¬—óØ.(ôϤ¼ûçf ç:q'¯´bíµŸ’^9ÕÞ¡®zП¨ì;ÔUâAùcPWÄ•ÿu•¸Wýèoâ͘¥ããÀãLÏ€x&îƒø'Þ^$ó呯Äñ\K‘ß0ê~x®¥¨‹zHíñ\KQ?í´/ˆ[ÔUò—󙣮jÞNÏvt=»r]§ê¿=>û™úUÛñgæ~á¹–b|µ¿Êqðˆ[ò—ýi×9³wú?žk)æxÎ#Ź}_Žwƒº¢øo#õÁ ®È×¥žÄ9ï~¾ÔóF®wÒJ+¦ë³?É•ô +Ÿ!x¸ð6Ò«xý8©W·Lë ýþÿ–zuÀÏé{¯fè@1.£qÑÜ·Î?Ï«üÍ‹–ê…ý‰í«¤Wqò?D<›ƒhÞ`ÿëº?ÁíÝ~ûÐ8tÇ!ôÊ|úéU¸wUú~‰Û‡ »Ðx3[Ý)ê!œµ.7wáXQ?aÊ(âæÒ±¢Þ|ávë;E}ºb§Åu;ˆ+_וë6ð³æÍ’ìgê—à?ËýJqˆ•Sâà·šÛ7‡8×<¼’ãì—š7s^Ú_ü[êÕœG‹¼×íí­9ïñ?G]jÎËuÒÞ…àvÿã.¦Ïƒª½C]¥º5ʾC]%Þ(,ê*ñöPé¿E]#ûÛ ¿íc»t|·*ží9ƒhšÈøÄ?µ÷ÇÊ|Yä+ñö™ß0~—¬?[Êzg®KãÊ^ ë'LEÜ_"ëÍ3Wõ銯êÙ•ëFøIñ(ã«ù$û™úUó¸oî—QãË•8ÄúÇóŠ^íþïçš·/ç8;äEð‡s^âÏ¥>ÔUòÃŽ–zÒÜRòþ™ÔŸu•ÚÇû®ºD/ÛÇóR)x^ªÐ+íð¼TO¦õŠ¹Ö«.WzÅ\ës­W]®ôŠ¹Ö+æZ¯º\és­W̵^1×zÅ\ës­W̵^1×zÕåJ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½êr¥W̵^1×zÅ\ëU—+½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õªË•^u¹Ò+æZ¯˜k½b®õŠyV«ÿ_¯š}_ÉŸCÔçAæZ¯º\és­W̵^u¹Ò+æZ¯˜k½êr¥W̵^1×zÅ\ës­W̵^1×zÅ\ëU—+½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õªË•^1×zÅ\ës­W]®ôŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö«.WzÕåJ¯˜k½b®õŠ¹Ö+æZ¯Ú½žX>êùs­W]®ôŠ¹Ö+æZ¯º\és­W̵^u¹Ò+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õªË•^1×zÅ\ës­W̵^1×zÅ\ës­W̵^1×zÕåJ¯˜k½b®õŠ¹Ö«.WzÅ\ës­W̵^1×zÅ\ës­W̵^1×zÅ\ës­W̵^1×zÅ\ëU—+½êr¥W̵^1×zÅ\ës­Wvûè~®Ö+æZ¯º\és­W̵^u¹Ò+æZ¯˜k½êr¥W̵^1×zÅ\ës­W̵^1×zÅ\ëU—+½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õªË•^1×zÅ\ës­W]®ôŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö«.WzÕåJ¯˜k½b®õŠ¹Ö+æZ¯ü ké{­W̵^u¹Ò+æZ¯˜k½êr¥W̵^1×zÕåJ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö«.WzÅ\ës­W̵^1×zÅ\ës­W̵^1×zÅ\ëU—+½b®õŠ¹Ö+æZ¯º\és­W̵^1×zÅ\ës­W̵^1×zÅ\ës­W̵^1×zÅ\ës­W]®ôªË•^1×zÅ\ës­W̵^5»Œ ïŵ^1×zÕåJ¯˜k½b®õªË•^1×zÅ\ëU—+½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯º\és­W̵^1×zÅ\ës­W̵^1×zÅ\ës­W]®ôŠ¹Ö+æZ¯˜k½êr¥W̵^1×zÅ\ës­W̵^1×zÅ\ës­W̵^1×zÅ\ës­W̵^u¹Ò«.WzÅ\ës­W̵^1×zÕþè$Z¯©õŠ¹Ö«.WzÅ\ës­W]®ôŠ¹Ö+æZ¯º\és­W̵^1×zÅ\ës­W̵^1×zÕåJ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½êr¥W̵^1×zÅ\ëU—+½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õªË•^u¹Ò+æZ¯˜k½b®õŠ¹Ö+»£§õtZ¯˜k½êr¥W̵^1×zÕåJ¯˜k½b®õªË•^1×zÅ\ës­W̵^1×zÅ\ës­W]®ôŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö«.WzÅ\ës­W̵^u¹Ò+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯º\éU—+½b®õŠ¹Ö+æZ¯˜k½òÛïA롵^1×zÕåJ¯˜k½b®õªË•^1×zÅ\ëU—+½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯º\és­W̵^1×zÅ\ës­W̵^1×zÅ\ës­W]®ôŠ¹Ö+æZ¯˜k½êr¥W̵^1×zÅ\ës­W̵^1×zÅ\ës­W̵^1×zÅ\ës­W̵^u¹Ò«.WzÅ\ës­W̵^1×zå~ó?´/Aës­W]®ôŠ¹Ö+æZ¯º\és­W̵^u¹Ò+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õªË•^1×zÅ\ës­W̵^1×zÅ\ës­W̵^1×zÕåJ¯˜k½b®õŠ¹Ö«.WzÅ\ës­W̵^1×zÅ\ës­W̵^1×zÅ\ës­W̵^1×zÅ\ëU—+½êr¥W̵^1×zÅ\ës­Wqèéœ ­W̵^u¹Ò+æZ¯˜k½êr¥W̵^1×zÕåJ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö«.WzÅ\ës­W̵^1×zÅ\ës­W̵^1×zÅ\ëU—+½b®õŠ¹Ö+æZ¯º\és­W̵^1×zÅ\ës­W̵^1×zÅ\ës­W̵^1×zÅ\ës­W]®ôªË•^1×zÅ\ës­W̵^¹V¥ó´^1×zÕåJ¯˜k½b®õªË•^1×zÅ\ëU—+½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯º\és­W̵^1×zÅ\ës­W̵^1×zÅ\ës­W]®ôŠ¹Ö+æZ¯˜k½êr¥W̵^1×zÅ\ës­W̵^1×zÅ\ës­W̵^1×zÅ\ës­W̵^u¹Ò«.WzÅ\ës­W̵^1×z÷y…ÎÐzÅ\ëU—+½b®õŠ¹Ö«.WzÅ\ës­W]®ôŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½êr¥W̵^1×zÅ\ës­W̵^1×zÅ\ës­W̵^u¹Ò+æZ¯˜k½b®õªË•^1×zÅ\ës­W̵^1×zÅ\ës­W̵^1×zÅ\ës­W̵^1×zÕåJ¯º\és­W̵^1×zÅ\ë•|/®õŠ¹Ö«.WzÅ\ës­W]®ôŠ¹Ö+æZ¯º\és­W̵^1×zÅ\ës­W̵^1×zÕåJ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½êr¥W̵^1×zÅ\ëU—+½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õŠ¹Ö+æZ¯˜k½b®õªË•^u¹Ò+æÿ[ç¯IQ¥ÿfDvD\XÒŠŠ4,Ù! Šº¨·ÐQ\@@htÙ%ˆJðç +-¨«$1DÀI‚Ép‹4„!Ãhr‚D¿§NõÓŸ:ÏûÌ÷Ö­®:çÔ÷í÷Þª~ÕWäê+rõ¹ú*®wðË“€ê+rõÕÈÅWäê+rõÕÈÅWäê+rõÕÈÅWäê+rõ¹úŠ\}E®¾"W_‘«¯F.¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_\|E®¾"W_‘«¯F.¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõÕÈÅW#_‘«¯ÈÕWäê+rõUø÷ÆžC¦¾"W_\|E®¾"W_\|E®¾"W_\|E®¾"W_‘«¯ÈÕWäê+rõ¹újäâ+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõÕÈÅWäê+rõ¹újäâ+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_\|5rñ¹úŠ\}E®¾"W_u;ý×óóº¿"W_\|E®¾"W_\|E®¾"W_\|E®¾"W_‘«¯ÈÕWäê+rõ¹újäâ+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõÕÈÅWäê+rõ¹újäâ+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_\|5rñ¹úŠ\}E®¾"W_Å-ÉŸ'!Ï¿"W_\|E®¾"W_\|E®¾"W_\|E®¾"W_‘«¯ÈÕWäê+rõ¹újäâ+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõÕÈÅWäê+rõ¹újäâ+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_\|5rñ¹úŠ\}E®¾"W_õ^`ÏŸÖ÷ƒäê«‘‹¯ÈÕWäê«‘‹¯ÈÕWäê«‘‹¯ÈÕWäê+rõ¹úŠ\}E®¾"W_\|E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾¹øŠ\}E®¾"W_\|E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê«‘‹¯F.¾"W_‘«¯ÈÕWäê«ê£ÍCóz?H®¾¹øŠ\}E®¾¹øŠ\}E®¾¹øŠ\}E®¾"W_‘«¯ÈÕWäê+rõÕÈÅWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê«‘‹¯ÈÕWäê+rõÕÈÅWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾¹øjäâ+rõ¹úŠ\}E®¾ +_\äÞyùŠ\}5rñ¹úŠ\}5rñ¹úŠ\}5rñ¹úŠ\}E®¾"W_‘«¯ÈÕWäê«‘‹¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕW#_‘«¯ÈÕWäê«‘‹¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}5rñÕÈÅWäê+rõ¹úŠ\}Õ®ÓÜ:/_‘«¯F.¾"W_‘«¯F.¾"W_‘«¯F.¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}5rñ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõy%Ÿç5rñ¹úŠ\}E®¾¹øŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕW#_\|E®¾"W_‘«¯È§øj­æòyújàS|E®¾ø_ |Š¯ÈÕWŸâ«Oñ¹újàS|Åöòy^íÀ§øjàS|ÅþåóÙÏ_ í§øŠ\}5ð)¾ø_ |Š¯>ÅWŸâ+ö#Ÿ?ÈyMñÕÐ~Š¯^©¯ÈÕWŸâ«Oñû‘Ïä8S|ŠŸçE>ÅWC?S|Åëòsý†Ïû‘Ï$Ÿâ+ö/Ÿ?ÈöS|5´Ÿâ«OñÕÀ§øjàS|5ð)¾ø_‘«¯ÈÕWŸâ+¶—Ïd¦øjh¯¾Â¿ÏMŸËäïƒäê«‘‹¯ÈÕWäê«‘‹¯ÈÕWäê«‘‹¯ÈÕWäzE®¾"W_‘ëý¹úŠ\}5rñ¹úŠ\}E®¾"W_‘«¯ÈõþŠ\}E®¾"W_\|E®¾"W_‘ëýÕÈÅWäê+rõ¹Þ_‘ëý¹úŠ\ï¯ÈÕWäê+rõ¹úŠ\}E®¾"W_\|5rñ¹úŠ\ï¯ÈÕWäø¯}ñóÛõ›Ë'@ÔWäê«‘‹¯ÈÕWäê«‘‹¯ÈÕWäê«‘‹¯ÈÕWäê+rõ¹úŠ\}E®¾"W_\|E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾¹øŠ\}E®¾"W_\|E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê«‘‹¯F.¾"W_‘«¯ÈÕW䃮ÆÏKmCsë<}5ð)¾"W_ |Š¯>ÅWäê«OñÕÀ§øŠ\}5ð)¾b{}?8ð)¾ø_±}?8ð)¾ø_‘«¯>ÅWìˆ?žyœâ«¡ý_ |Š¯>ÅWŸâ«OñÕÀ§øŠ\}5ð)¾ø_±}?H®¾ø_ |Š¯>ÅWìGß|Š¯Ø¿¾dÿòyôÌã_ í§øjàS|5ð)¾âuåóèÇëÊçÑ\}5ôÓ¨¯8ù<ú±}?8´Ÿâ««¯Âv‹Ü;/_‘«¯F.¾"W_‘«¯F.¾"W_‘«¯F.¾"W_‘ëý¹úŠ\}E®÷Wäê+rõÕÈÅWäê+r½¿"W_‘«¯ÈÕWäê+rõ¹úŠ\}5rñ¹úŠ\}E®÷W#_‘«¯ÈÕWäê+r½¿"W_‘ëý¹Þ_‘«¯ÈÕWäê+rõ¹Þ_‘ëýÕÈÅW#_‘ëý¹Þ_‘«¯ÈÕWÕ'š‡æå+rõÕÈÅWäê+rõÕÈÅWäê+rõÕÈÅWäê+rõ¹úŠ\}E®¾"W_‘«¯F.¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_\|E®¾"W_‘«¯F.¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõÕÈÅW#_‘«¯ÈÕWäê+rõUÿ™ ›—¯ÈÕW#_‘«¯ÈÕW#_‘«¯ÈÕW#_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾¹øŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}5rñ¹úŠ\}E®¾¹øŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕW#_\|E®¾"W_‘«¯ÈÕWq›Ežž—¯ÈÕW#_‘«¯ÈÕW#_‘«¯ÈÕW#_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾¹øŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}5rñ¹úŠ\}E®¾¹øŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕW#_\|E®¾"W_‘«¯ÈÕWÝÿ×óóò¹újäâ+rõ¹újäâ+rõ¹újäâ+rõ¹úŠ\}E®¾"W_‘«¯ÈÕW#_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯F.¾"W_‘«¯ÈÕW#_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹újäâ«‘‹¯ÈÕWäê+rõ¹ú*~¬ùó¼|E®¾¹øŠ\}E®¾¹øŠ\}E®¾¹øŠ\}E®¾"W_‘«¯ÈÕWäê+rõÕÈÅWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê«‘‹¯ÈÕWäê+rõÕÈÅWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾¹øjäâ+rõ¹úŠ\}E®¾ +ÿqðËóò¹újäâ+rõ¹újäâ+rõ¹újäâ+rõ¹úŠ\}E®¾"W_‘«¯ÈÕW#_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯F.¾"W_‘«¯ÈÕW#_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹újäâ«‘‹¯ÈÕWäê+rõ¹ú*nrÁ+óò¹újäâ+rõ¹újäâ+rõ¹újäâ+rõ¹úŠ\}E®¾"W_‘«¯ÈÕW#_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯F.¾"W_‘«¯ÈÕW#_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹újäâ«‘‹¯ÈÕWäê+rõ¹ú*lþèkóò¹újäâ+rõ¹újäâ+rõ¹újäâ+rõ¹úŠ\}E®¾"W_‘«¯ÈÕW#_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯F.¾"W_‘«¯ÈÕW#_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹újäâ«‘‹¯ÈÕWäê+rõ¹ú*n½È›óò¹újäâ+rõ¹újäâ+rõ¹újäâ+rõ¹úŠ\}E®¾"W_‘«¯ÈÕW#_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯F.¾"W_‘«¯ÈÕW#_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹újäâ«‘‹¯ÈÕWäê+rõ¹ú*|åc›—¯ÈÕW#_‘«¯ÈÕW#_‘«¯ÈÕW#_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾¹øŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}5rñ¹úŠ\}E®¾¹øŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕW#_\|E®¾"W_‘«¯ÈÕWqçÿúǼ|E®¾¹øŠ\}E®¾¹øŠ\}E®¾¹øŠ\}E®¾"W_‘«¯ÈÕWäê+rõÕÈÅWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê«‘‹¯ÈÕWäê+rõÕÈÅWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾¹øjäâ+rõ¹úŠ\}E®¾ê>²q ƒ/_‘«¯F.¾"W_‘«¯F.¾"W_‘«¯F.¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}5rñ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹újäâ+rõ¹úŠ\}5rñ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯F.¾¹øŠ\}E®¾"W_‘«¯š­Yp^¾"W_\|E®¾"W_\|E®¾"W_\|E®¾"W_‘«¯ÈÕWäê+rõ¹újäâ+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõÕÈÅWäê+rõ¹újäâ+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}E®¾"W_\|5rñ¹úŠ\}E®¾"W_õÛ®øÎyùŠ\}5rñ¹úŠ\}5rñ¹úŠ\}5rñ¹úŠ\}E®¾"W_‘«¯ÈÕWäê«‘‹¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕW#_‘«¯ÈÕWäê«‘‹¯ÈÕWäê+rõ¹úŠ\}E®¾"W_‘«¯ÈÕWäê+rõ¹úŠ\}5rñÕÈÅWäê+rõ¹úŠ|ôÕßw4O‘·¿8ë¾I|3ž|™Ýo‘÷gíýLâÍ¿Gòy»Õÿ’x·ýL{?I¯>úMãla¿Ç'¯û÷*¢}ûPmû'Ècÿø´Äã¬_Ù>{òîà ÞžxýïGþ}ÿ%›oöO‰‡Ý°çàWoþuzâíy‹ØóRÉÛ+>¹`âÕš|´ì§ýá2ïL<üâÒÙŽ_s¨ñê¨Kg§y°ŸfàõZ|´äaè§Çu®Ûaœ%ïÞÈãLórü y^)i\¼n5Ä! n%¯‡¸Ĺäí£9Îy)ywUÎKÿŸ¿GÉÛ-skä½äõ™9ïño;Z<8žî°\'ý…Ç8^o±ûésÂ;iPWà•ôPW‰w2žu•x¿º2~¾Ÿo‡ù´ýÔø$^K<ûƒ6°¿‡WõñoÿÔ¾ÙÍç«F¾ïÿäóÛ^þI['õ¾Ú,cëªþ¹¯ŸvÖ¡Æ›#}½5äRŸa觑zÃu#Æiñî7º×ó8Ó¼J?ŸçUÉú +CZÄÍæ7ôÓ>øø´ôïq.yÿHŽs@^¿2ç%~Ñû¡B]¥qÔ'yŸtg yÿ«÷OºJíãÇ8/ÙWýÀç¥öù÷›¯Úgg:Þ¯þäÓ“ø‰ð¡½¯–{úe㯜cyf=÷³6_Õo{Øꂼ]û†·Rûæ‚óm*yUÿÀ|ÕÜöqç«z§»l}6ÇÿÍžÁöñ‡w.ÑO¿í¡Úzˆÿìë¡F=¤öÕ‰¾~úþ‘ý†ºJãe^"9êªäý͹­ç0\7Hý÷ßÈãLó*ûi~çÕ!i\¼nÿÕ‡qsüý?˜–þ]!Îé¿l߬•ãÜ¿ì×{…º²ø¯íýP¡®lO{ŸÄ9ïÍ\ïŸêÙ\'a¯…æé«xÙÎKíF‡Þ;‰ñ…™§8/õgle¾ªïœW›g÷3_Å?ä|U_ûƒ7R?ñ³»ºùÖÇ.g¾ªº©‹O³ý²æ«ê‡ìu’ñé>þ_æ«núW\üÃÛ.Ó8/;äU‹_ž~5¯Ï¶ó¾ÚvM[Ÿá…{)Ûwï›ßÖauþ¯¯/y}ÇnÆÛ‹}}šÇS ¼yñžGJÞý„¯mç|U×í0β}=Œ3Í«äñü<¯þþ‡ª4?^·âк©óUÜ.Ç­AœËöÕ19Î òâø59/Ýb»ïjžÉyìÖ:Åy¬þ}Î{…:)û‰ä:‰ü_Ç«§`¾Òöu5ù´Ò@]%ÞÈx*ÔUâ•Œ¿ÅøË|ækýÌ#>!õ/ñ¬ÏÄ»òñoÿÄÛK}¾º§^µú¨«I|Ÿyi·YÓÖIû¼¯‡øÞùóºú“¯Ÿpûn™_$õ6ð(õÙýD©ç0\7bœiÞO=Œ3Í«äýyy^qHócûæc95âVòu•þÝ}Ưßê×Cœâ×{˜•óÒ-êýÐ?óØ®é}OÏy¯.õþ©6Ìu×þ_ç% žÚßœï¼Ôžø÷{,{¿×ñ8㺧¯^^Êù*œ·D¾¿ªÏϯKü=Øuo¼žÚ‡£^·º`|º¾óë§Ç¦|äÇ]f÷ÝS?tñ¬—|#¯ÏݯùëDÑ>>ï'âc‹º|ů|ÛÖgûñ·{_­rJ^Ÿ7íê|þk¯¼>¯]Ðùª½÷ì·t¾j^ݲ«óU=ôS}âí®žëáºõã‹:_5Ã8{ÌËâÁ¸ ój‡XÌ·["Ç!"n%¯‡¸UˆsÉ»·q^æüJ®Íyi_ZÊûêOC‘w×þ9ïñ¸óïÏu^zÆñêÜ…ÍW´¨«”¿ ý£®ŒËxzŒ'ñVÆßaü‰wGúùö˜¯õ3ø´¯$ž-â™x¿›…ø'^¡®&Ó÷‡¼TÈ—qÔUÉÛ•O±õP£®JÞ|}/[?ñ_?í=ïnzxs³¯ÏzèGë9 × Rÿíyœi^)ûÔpŸô¤__Õ‡JÖc{ìevç4oöÓÍŸã\!/%o®ÉyiÿìýП›óöŸ¬šóõþ©NêäÏÏ8ÿ`öU·+;Þ¾µ‹ùª»ô§ÎKñôš¯ú[ayãøC{úK)OñOñã¿~7óUÿðn¾á7ÛïkâÇþwZÀϱŸþþmÌWõ+«8_Åçb¾ªïšáâ–ÞÙî'»Ž²çγŸê¾?/Ño»êV/”ùj^]ÚÖgwæ|ÎWý9Of~ïw®+Û÷ý¦¶«¿s]šûïΚÏÕgú Øê…²}=\·Å8KÞݛǙæUòø¾<¯‡4^7 qh·’·CÜ:Ĺäa÷çy)ys]ÎKƒ<:¾_Îc…¼—<œ–óÞì·²óRÿ·\'ñ¬m¯ö=ú—éý ¶¨« ðþéu•x-ãé1ã2þˆñ'd¾ æ›x5øàî/>ž5â™x}§‡ø'Þ.äó¯ÄÃ*>¿í+KÛ:‰gøz¨P©}¼Ç×OÿশÞÚ¤Þ^¡®Ò<˜÷øÇÜOz¼.ÆéÚß“Ç™æUòŠóBÒ¸Øû\ŽC¿®¬Ç¹Û˜¯âC²~wËqnÏõë½»6祹Åû¡ß7ç±BÞËëö¿Ëyo÷õþ©ÿžë$ž¹ó†l_±ù•ë§ÝzîÝ“øNó¶ù«žödâñìw9_Õ¯g¾ +›\dyã0û‘×Rûvµ…¯â=+˜¯ÚÅ›ð}¶K¿aë³ï»¯ù5ï1_5Ÿø¹½?&Ÿ{ÁÖgüàÒ._aó݈©ß{Nz¾ÌWså/m}†C¸äí[[ÛúlŸ}òÚ’×O\f<¾øäµi¼n5ððÓÃ.y3ôÓÝ{Òó%¯‡ëVZÚùªÿBgšWÙ> ój‡’ÇYC7›ßðºß—ãV#ÎŽßãÜo|‘{ŸØ^ŸóDz}Ø(ç1N›ßûj•œ÷uR¶¯¶Êuvíù§W0_UÒ> ®&*xCûG]%^Éx"Æcíeüê*ñ8ÃÏ·B]%Þ/:5>¼©|<;Ä3ñöã>þ5âŸx…ºšÄ˜÷ùJ¼»Û緽◶ÚC|=tÿØÚÖO÷Œ¯ŸðøeÆêÊÆËûêwZŸìGê9 × RÿÕ0Î4¯²ÿvÓ<¯€8”¼âÐ!ni~œoºJÿnç’Ç»rœ+äÅñër^ÂYÞñÓ9q>ï“~åœ÷z{ïŸu•Æv™íüd_íz :ÞþióUµÑ>ÎKñwï1_µ?ý?ËçU-~Wþ{X¿®wÃVæ«jŸ£­.Ø>|êÿ6‰+7OÿÎüMÞn{„ù*¾ûQ»¯'¿9ÝÖg<éµ7Ê8‡ý÷´õ¶=á/%og?kë3üäåçJÞöμ>w]ÅùªÞäFãÍ?¶tõÓ>·º­ÃvÚVÎWÍÀûÝVq¾ê7ÎýT¾ü\šÇ_×m1NLJq¦y•¼ÿ~žW‹8”< q¨·Xöϸí}´y×m>™ãÜ"/eû8;ç¥FKËyl?½OŽ×Ñ©9ï1,è½tN®“¸êºŽ÷ÿrö/Òý•¶¨« ðFûG]%ÞêÇÓa<‰×2þueýÈ|[Ì7ñî©©ñ ‰ÿëÔx&OôñïÿÄÛm|¾âõÏZ}W?öùmúN['5êj?ÇøÔƒõó÷-]ýtÏ®në­B]¥ñ²};ð€º*y=ôSI=‡áºã,Û‡aœi^%¯‡y5ˆCÉ»ãNŸfãDÜÒÇñls„ùªBœKÞ¬7ÄùA¿Þ+ÔUê·FËöqÑœÇvCï“þ”!ïÞ?u•ú‰«¬ë¼d_õrßu^j¹ø®I|'ú¬¿îÊ=‘x³Û|ŽWìb¾jöºÔy¸¿ñF{ÿß]±‚›oÿûÛìýO}ypñ齶ùª_c†‹gØçcæ«ê]_vñïÏý«­ÏxÀJ._ñSÿmë³ýÈzÞW_Þˆñ·Ÿ½ô¡æ%1aë3,rÍ5%ï_>Îx³ø5פyíÞnzéC%oÙÏG×ó¾®[ý`%ç«fgšWÙOÃy!%ï÷Îqècp¾j†¸5ˆsšÇÙŸžã\!/ŽßóR!%¯ïÏy¬‘÷’‡•rÞÛe¿kñ`ÿÕ?ç:©Ÿ<Íñþ¾7_5Ò> ®&ªTÏÒ?ê*ñ¸«O‡ñßÓ? ®¯d¾5ê*ñvñ àquψx&^-äã_#þÆQW“øö8_ä+ñöÃ>¿í¶ûÛzˆŸñõÐ>aëªYØ×O…úIýÄŤÞ^ʼ×úd?RÏa¸núï>™Ç™æ•âÁñwçäyuˆCÉë!qKãbûþèµÍWÝå~ýV¨«ôó5òR¶¯QW‰WÈcÉ»¹9áï“~Åœ÷¶öþ ¨«ÔOxâ4‹Ç“ºN_qšï§ýŸUÍWÍ»n<å¯O¢}øìw-oì§?eZ¾¿zç„uó'ÍWõ»þ0-àçؾYr•üûš#ï²xŒü¼ãíýO½á·ó}ýðúÞov£­Ïðí+^OóÛ?ñ}[Ÿáôß¿\òê’'òú|âÐgKÞ¬ú†y¬^íóÎWÍÃX ¢ßz¹uœ¯ê7ÿÙÖa½â:ÎW#_ýóÎWõÐO÷ä¡Ï¦8qœõpÝã,ywqgšWÉûÇó¼ú ¾ý÷’7C"â–ÆËþ›?å¸õ ýÁ¼NÞ.‘ãÜ"/eûú¦œ—ø™ïZ<ؾfoo(Û‡“sÞkÔIÉëst'½Çû꤫žî¯´}@]M€Gíu•x'ãi1žÄƒŒ¿Åøoe¾ækíçŸÄ+‰g@<pó-ÿˆø'Þžæó¯ÄûÇ}~ÛUÞÈ›áë¡}è¶~²¾~š7þÙÖa»‚¯·@®õ9ô¥žÃp݈q¦ù1ýEyœi^%¯‡yõëûõ?—ãPëz<÷x{ßX#Î6ïa=v‹ç8ÇýzonÌyé7ñ~èNÎy¬÷²Ÿ +ueùšÏû' ®'¾gž¾jÉçä|ÛY¿ºsíë÷Ìq^Š+îb¾ªg¼â¼Ôïq”ý½¤9>ZžÙO}Ëùöþ?n™_ÇÈ«v¿7Sÿq·Ýœ¯ª͵û‰°Ý%v_ÏöÍ*Û™¯ÚûVrñï—šn¾Š·­åò>¸“­Ïpä\Û‡È~Âk»çõ¹Ðc}Šyµúò Dü»úàI³JÞVûï?|Ò¬4^¶'ïz¬/y\mè稹¶¯–í«áºÕík9_õkçq¦y•ý4üjÄ¡äýÊC·XŒ§þ`Ž[‹8—¼Ú/ǹB^JnÎyé>ðŠóX5ä±[jŽóX³BÎ{ÿ𶠔ýÔW uòÕïwßÌ|¥}@]MTð€ôPWÆe<-Æ“xìüø;Œ?ñZæ0_ãóˆOâáËSãÀ»{}üâŸx…ºšÄ˜ÇùJ<áóÛ¾º»­“uU¶¯Q©}½¶¯ŸøÖ¾Æê*kìà5êªäûÑz®¤þëaœi^e?ñÝü‡’ÔUg¿«¬ÇµçÚ}Xܯßzß瀼ØÏ koÊy‰«z?tßòønï“ +u•ÆQ¡NÊ~ÔUâá+:žš¦¯úª—Úeßa¾ê·ßÈñxÒÜÇ&Ó¼sw竸îêæ«êßtã·Î0_…®Éñ༞šcïÚõßî|Õ³¤ùªÝs~Ï~¾l}ÆOòZçæ3‡N‹Nxó¼—JÞþþa[ŸÝ«z_]õ¸­ÏöÙ}\=´ß9"¯ÏõwõÓ/ð‚ñn£Å¯âÀ›çöqõÙ ý4®ê}Åëbœ)~¬ÏzgšWÉ+Î q(y;Ä¡AÜÒ¼ÙOücŽ[…8—¼{2ǹ[ç“ÎWí-9/í‚»{_ yl÷²ŸæÄœ÷öÊËä:éê7½ïgéþjJ{ÔUÊSþê*ñFÆÓ`<ÆeüãO<ïç1ßÄûÿ˜ŸÄÛoûx6ˆgHí×óñ›:-ñö Ÿ¯þô‡­¾»õ}~Û+·õŸñõ÷9ÂÖO…ºšL×ê¿Fý¤þkÔ•wàÕÀ£Ôg7ôÓj=óºgÙO3Œ3Í«äa˜W@JÞW9qKãâ8»?,i¾jç’Ç'†8ȯ÷xó—wx?´ÿžóØnç}R¡®Ò8º+¼ÔUâq™7€ì+žø Ç›ÿÝgÎ$¾ÓžäߟÆå?k¾êŸzÒy©yçíï÷í WN ø9η½íøüþÿÙ/¸ùV›Ï0_uùˆÿ;ÅÌÏÛûŸîàÏØ}=ûiîÝÏÖguÚK¯º8ﻸù*.û1—¯¸|cë³zuoÛ‡È~ÂϾlë³¾a!ç«úêé¶Þº-¸ºì?¼k{ãÍ6\âÁ~êW7.ä|U±\·l_ ×­–û˜óUËqb^eûv˜W‹8”¼â·’7k qCœc1Îð…çy)ywkÎKƒ<–¼GÎc…¼—¼ù·œ÷€:)yø¹Nêòþ Æ'¾íkæ«ZÛ£®&*|Iÿu•xñt þ8ïG™íÇ_¡®¬½Ì·Á|o?<5>‰wùxö÷ìgë3üÎÇ? þí+ÔÕ$þÃyÕÈ—ñW|~Ûþl¾jgûzh®šž×Õ¾~Ú…¶Ï|k_oÍÀ[©ÏÀ~pÝ4Ž' × Zÿÿ–Ç™æU¶ßËój‡’7CjÄÍñ5?o¿—©dý6ŸÏqn—Ž§B]¥Ÿïžô~¨PW‰‡½O*ÔUâÍoÅ?¨+kÿÎÎKhj_íϲxóºÍ]OÜ1‰ï„gÖr<þöÒG×~ÅùªþÍ9ö÷ûê+ëO ø>ûén_Ò|Õ~øïíKö·÷?áñÜïýâÙåû‰ßþÒîëÙOuÎ"æ«ð/[¹ø78ÚÖgØèrû=ÇØþØûm}6']mûzÈÃvwØúl·\ïÁò¸Èwm}¶;¿tUÉÛÅn6^ïúÒUiÞl?ò/­÷`É»¡Ÿêä«ó>5¾nòºgÙ>“Ç™æUòj˜WDJÞþ1Ç¡l'»åxª!nqŽÅ8ãÅ9ÎÝë;_ÅÛr^òèÚ›óŸ^ËæÍþ›rÞûœåùœ\'ݯïq<ÞøâaéþJÛÔÕx'ýÔUⵌ§=îÛÒÈøkÔUj߯ãç[¡®¬ŸyÄÇÚŸ05žý´‹øø÷g=_âݧ}¾ä+ñæDŸßöËwØz[øz¨P©}ü/_?ý¢7ïvñõ^oåë³_8÷´ž‡ëFŒÓæÇzÆ™æUòf˜WDJ^¡®lœúõXu݇µˆsú>ë¡B]ÙÏ7~½×¨«ÄÛk¼úcr+ä½ì§F]¥ö5êªä-ê*ñxô=ŽÙWýµÚñfæ–æ«j­“—âr«›¯ÚSæN øÉqük?hk_›ey&wdïÿ«ýwvó­W¼'¿ÿùÅ/ÜïÕ›5fÙýDuñÜ|_Ïøÿë§ÞšÄõÚ}.µ÷쿤6_Åolàò–Ø&ßw}q1ï«lbë3.¹ó)ì§Ùö9ãÍwwp¾ê—~O½ïÎWäÍ»w~ ‹ýöóŸ‹y_ ×­öØÀùªÆ™æUöÓóê/šk÷¡ì¿^rˆâV¶ïVÏq‹ßß¹ŠÅxšrœòRòjÈK<–¼[kÈãš';5Ëæ¼w;ÕÎKÍšC|i#Çã‘ß5_µÒ> ®RÜé? ®¯d<ÍÌíﻕŒ?`ü©}+óm1ßÄãϧÆ'ñZâY!žÖ~oÿñ©=êjÿeü»Å·™–xÜÜç·]u['í¾ºmž3Þý?_?u•úiPWéúì¿xû¯¾>[ö£õ<\·Ñúç81¯²ÿþá<¯þB¿¾ê%rÄ­lß­6ËîÃjÄ9—ãl—Ïqn_õë½¹=ç¥9Ùû!®™ó×ð>©QWézqGïŸu•xØj#ç% ûê7ø™óRsȬÛ'ñn¯¼ŸŽãìŽ?Îös7?ÚbZÀ÷ÉûY š¯ªC>í|ÕÏ©ÌWõ¯žr÷™ñ§k˜¯Úõ.w3+óU¸myï«kwÌ÷.çâß.yŠ­ÏpÔìË8·‡Üm볞‡¼¯gð^xýr[Ÿõ‡Ý_¶¯NÝÞÖg8ä–+K곌w‡ÝreŠç[“ßuØý%ïOÉýD\·äÕpÝã,yÆÙc^%¯†yÕˆCÉÃ595âæø9nñ¨§ÌëghŽs<øÓÎWõ— +yŒÅ¼Ú«sòîx—óP'%oÊuÒ.y¡ãÝ ˜¯´}@]MàzµôPW‰÷?ôã ¨«Ä[‹ñ[?2ßu•x¦Æ'ñp«gx&^Iüû%N±õÙéóÕ|wöØÛ|~Û×.ŸÐM‡¯‡€zH¼=Ø×O»ÌYÆkÔUº>óE¥>ë¡ŸJë™×Å8]?Ã8Ó¼JÞ óª‡’‡YC·’7¿¯ÌWí‘~ýÖ¨«Ô®B^B9þ;r^òXòxUÎc³§÷IºJý´ë{ÿt¨«Äã:/ÙW»Ò4Ç›'?d¾j.É¿wd<»zaóUØé7θõ:ö÷ûn¹ë‡ë»ö´÷ÿÍê•óUxã‡öþ§záy‹ÇØÿŒuíýOóÔ.ù~sðLýÙýD½áÿRƳÚh5óUœÜÌå+¾} [Ÿí9g>Q¶¯¯þˆ­Ïæð æ–¼{ùÖì±ßL¸úéV\ÆÖas„óU;ðþˆ æN"‚;ôS{æ%¯†ëögÉÛaœi^%ï>燒7ûä8ÄçŸ7¯óºýrÜúÕ*ç«öõ瀼ÄbœÍ9/ýŽ·85_Êyì/ÎÇ`ÿí29ïê¤ì§}<×IuÇÊŽ‡-—û©½\Ñ·¨«‰4é? ®2žu•x%ãï0þă̷Ã|­ý<â“xû¤g@<o6ðñoÿ ^K¾ò•x÷GŸßöªLK<üÒ×CÿÒ­Æ›ã|ýô+,cë­B]¥ë3Î#G]•<²©ç0\·‘úïçÏãLó*û©†y5ˆCÉÃÞ9ñ9¿+ÔUj×Íðë7¾–ãÜ-ë×{œ“óR#¡˜W·UÎc¼—¼F]¥þê¤äêÊøí+;Ž¦öUOÿÖ´€ÿcÜšOtÛ$þ]O{›ãÝoö{ØølìÆÓ>¿ƒý=¬¾`ç«p÷Óv?Ý^™ÿÎÀþãWæÚýDwÌûœ¯Âé{ÚýDWýÉüÍöõª§ÚýDsæsöºJ^½ö5[ŸÍM§çßËòýã¾·çõù•¿ÙßKÙ¾þùY¶>ãûûR<ÈÃĘ¯ª?œyEÉû?Í;÷Ì+Ò¼Ù~ä[ô÷•¼úi¾ú·ÇKÞÿ,_·Ç8K¿—Ç™æUòðjžW‹8”¼]eˆâæøi9nâ\òzˆs<ç«ö®œ—ø©¯Âs9Ý|o³ys¾íq9ïÝ?}Ëóõr´?;Êñð̇M¾Òöu5ÞJÿu•x'ã©PWÆeüã·~®ðó ˜¯µÿõÔø$ß:×Å3 žÖþ ÿþ•¯Ùëk¸Ñç«E¾ú©PW“øÏä7ñvs_í'þcZâál_?u•x<Ç×yøO_ŸÍÐO'õ†ëvgšÇSãì0¯’Wü:Ä¡äÍÊ9 âVòîw{æû°ËýúmvÈq®‘—4^·¿3ç¥BKÞ>›óØWÞ'ue×[Àû§C]%;jZÙ}õO>âúoŽ[Ü|7ÜÛñîý/>4™~âß®rãlö?Äþ~}´å™ãoîÙÞ|Õmµš½Žü†™æ«°ñÆæoò~•³í~"þëßíu’<Üw­Ïn‰Í}ü·ý–­Ïféóì÷²cûW7³õÝØûjûm}V‹Ow¾Šž—×íK_Qæ+¬ýVæW/í|EÞ,1ý¾^·ú‰¸nÉûíòu#ÆYòjgšWÉÃ6y^âPòöÞ‡ +q+y=Ä- Î%ïfç8wGm^Çy÷—å®r«¿ŸóØ ï±˜W»tÎ{ƒ:)ywL®“êsÓ¯êý>{HòUöu5‘¸ôPW‰·2žã±ö2þ +u•x·¥ŸoÄ|­ýFSã“x%ñlÏÄûÅ}ü+ÄßúyŸÏW|e3«ûæ_|~[ä7¤~õõP£¯QW“éûÃëi7ó-ã-êÊ®¯\ê³ú©¤žÃpÝã,ûi†q¦y•¼Þ:Ï+.é×W{OŽC…¸•í›•Ï¶û°q.y}Žsó+¿ÞkÔ•µ[VüÐæº=õi{ý«ÖXßûêàgòúüß ^²xð>êòýl}6»Dû=û¯ïÏçZÛË´¿—Ž|ƱÙc·¯qoÙOsçʶ»;¾¼äÝGwÏü®ƒ/Oñ`?-ùkÜ[ò0ôS_qäc%ï?¯1Î’ws‡ó·˜WÉ›˜çÕ¯¾¾óUwPŽC‡¸•íûSrÜĹäaˆs¼úXó:Çßß“óÒ"±˜WµDÎc¼—¼=&ç½B”¼{-×I³Ð>Ž×‹}õàä+mPW‰Kÿu•x#ãÁï/ìï%Œ¿F]¥öñY?ßóM¼uj|¯%ž-â™xøWˆ¿ñÿñùª¯Äcôùm‘ßú¿Í×Cœ³²­« +u5‰ï3þê'µ¨«Ôyÿ‘Ì{©Ïn觑zÃu;Œ³ì§¹/3Í«äa2Ï«BJÞ˜ãÐ!n%¯PWéßq.yûÁçö*¿Þê*µ‹•÷C³øǃ½Oê*µo®õþ‰¨+ëçû8/¡©}Õ§]íüÓ|ñå[&ñúöíïÞwkŸxsùîî>ª>íQûýróçÎy¸»o#óU¿ÿÖî>³ý̓v?Ñžt’{]¯´‚ùªÞà{d›¿Ë|U?º´‹µâÁù}âÅ×»s7ÝGæõùÇìïì§~c1[‡ÝÏ·¼'Ń¼Zî×ÆÛÇÿfþÔ_cš7Û÷™÷¿ØòÇ—úÙã1û;êØþõ|݈q–íëaœi^%oVÈóª‡’Ç q@ÜJÞ®˜ãÖ"Î%Çå8÷/væuŽ§òãî?5ç1Þ¶½Í›íÛ÷æ¼Çß]íx÷…\'ýuO8^²ÏAö~PÚÔÕâ¨ýÔUâ­Œ§ûÝ£ö÷’FÆ0þÔ¾’ùö˜¯õsâÔø$Þ¬ïãÙ!žÖþÿñO<\äóÕÝp¤½ר«I|Œòðïög¾ÔCâýc¾~ÔOâê*]‡ý„ר+LJ~¢Ôs®1β}?;³Å¼JÞ,?Ì q(y\7Ç! n%ïVXÁ|Õ~߯ßzˆs÷‚_ïí½9/ͤ÷C@]¥~kÔU(狺J¼B”<¢®¨«’ÙWà:Ž7g}Å|×:Õy©ûõzæ«z¿¯ZÞçþã‹d_½ïDçáîÂïÙïkªwïauÁöÕ;Ö1_U›ßnñ 'mo÷Í—çä×Éá>ªy~u»Ÿh69àÏe<냎²õÙ,8Ç~ÏÁ~êË~në3Ôk{_¼D^ŸŸßïn×wÙzk^ÿo_?|Îxøë;_…×›ïw÷$"Èë¶C?×-y<(_7bœ%ï.ÍãLó*y{`žW@JŸËqˆ_¸Ý¼ÎëÖCܺÝüNÞLÏqîß{âßÊ~š r^Ú}¿š½>Ä9~,ç±BÞËöÝÑ9ï ê$ógä:iþoKÇ«u=0ùJÛÔÕDúù5}ÿu•x-ãiPW‰·2þã·ö2ßó5>ø$ÞmëãÙ!ž‰Ç}ükÄ?ñæ>_5ò•x»ŒÏoàylæë¡B=„Ôÿk¾~âúŸËëíM_oÝÀ›/øúìwÉýÔRÏíp݈q¦q1ïí%yœi^%o~’çÕ"%ïŸÍqè?ï×csâövÖ-é×oü§çø¿Þ›ó‡¼|Ïû¡F]¥ëÅ5¼OÔ•ñŸxÿô¨+ã?ÚÒy ]ØW}צÎKýâ'Þ<‰ï„Ks^ +ÚñÁÄûméî£ú[×µ¿‡užbyfÜêK¾n¿¯ güŸÕy÷̓í~"Vó9_5ËýJê¿ûöÒ.žÝo6³û <·ìÅ4ö^<ÑÖgû¥í÷äñÌCl}Æ›[ûûy½âÛl}†9宲Ÿî›oï?w²äͯöµu[½çÜÉ4.öÞ.zÊ]%o†~Â-­ý•íã +ùºã,ÛŽó*y÷Â0/Ä¡äÕ‡q+yÿo9nýïÿϼÎëVCœkäŵ¿hÈ òXòxKÎc{ÉaÎcÍÚ9ïáÎM-ì?þK®“þ'‡:^ÝüÛŸ$_ÕÒ¾C]M€7ÒüàŽ&^ÉxÔUâq?þæâ¯Ûïk™où¦öý[Õ”øÿ–gÜfv?QKüÄ?µo·òùŠgb¯Çêj2]‡¿—@~Sû°ˆ¯‡v·Œ7‹Iýµ¯­·°”¯·zàQê3 ýtRÏÝòùº=ÆióÆSãLó*y÷|žWDJ^qè7ÇQWöïÓýúmöÈq®—²}aÎKµ®÷CºJíš‹½Oú™CÞçxÿT‹æ:é~|¨ÅiŒ3úH_ÝQk:/U³÷¿i¼ÿôwœ—šµ× ñøæÆî>*îôuûýrüæi–göß^öyû}MûÉã¬.ÈÃ܇í~¢9su÷>ºþíy}´“½N²}Üì›Võ{6uñoþó¶>ÛSŸ²ßs°}ó›Ûú¬÷»éá2ž!¾hën¹éÎ’W >jë¶ýÈÏ/+y8y;[·ñã?¿,Í›ý×ïo½éÎ’Çwä~:\·äýd¾nq:~Ü0NÌ«äñ‹y^q(yÍ8 n%oOÈq«ç’w÷å8ä¥äÍ¥9/5òXò¸cÎc¼—¼]kÈû‘kZ<‡þš\'ÕÛws¼úê…?¶÷ƒÒ>^¿ÿMˆc%ý÷3× ñþ ?žue|?þãO<®çç1ßÄ»3¦Æ'ñZâY!ž‰·Kùø·ˆ¿õsŠÏWƒ|Yû}}~kä×Úßìë¡Ÿþ¨­Ÿða©Ÿ“¶³õV¡®ÒÏ1žÕÀkÔUÉ»¡ŸJê9^–¯[Iý÷ÇãļÊ~âæy^•¬¯æs9 âV¶ï¿Ã¼ç’WCœkä¥äÍ%9/òXòueÿÞÀû¤B]%ÞáýS_›ë$¾m7‹Ó´M_õÖ‹:/ÕßßáÆIðæŽÜuÛµV¼?ñî‚O8¯Æ7~ž¿|ì–ç±ÿË×}6µwù¿ŸöëÔ|Uo»mö÷ðºÐ/»°ùªþíùu’|¾_æõ9íëîï¶íE—Úúì^{Ùî7ÇëvÀ›6ÎÕßç}µõæ±ê°WçL`\lŽ¿ÖÖmØö—–¼:ç¶n›¾qiêíû?f^ÿìÕ9%¯†~ê5Þç|Uñº¯¿lï›ÙOûÓ<Îó*ûé/Ì󪇒7ŒÃ6ÛÚ}(û CÜĹl†87ÈKÉûÉœ— +y,y|=ç±»}ç±nœ÷ð¥E-¼n½o®/ÕÖg{ëZîï¶ø¼T[ŸqƒØý&Ûwí¾oØuØÙþþ@ŽÏK55Ÿ{¿ó>/5ßµ›^2‘æMON¾ßÖmõÃM/Iý‘ãóR·›½NÉñy©ÖO‹ë–Ÿ—j×­6ü‡½of?ø¼TgšWپ懒ãóR-âVr|^ªÅ­Ûe¶»ïÂç¥Zœ»kó>^7\‘óÒï9ÓÆEŽÏKµ<ä½ìŸ—jyïù‹ãø¼T«“ú¯3,쟗ú#»¿’öø¼Ô&ÇZú¯PW‰w2|^ªýþ1Èø#ÆŸÚãy¹n¾ø¼T»Ÿ¨æŸÔ>^èã‰ÏKµõÙÜâãÏKµû®~}Ÿ/|^ê©Ÿæ~Ÿ_|^ª­‡vS_ø¼T[?Õ~¾~ðy©æ±æ¾Þðy©Æ{©O|^jîGꟗj×­¥þñy©yœ˜W/ó‚ÏKµyuˆCÉñy©ÙSÓýzÄç¥Úûœø?~ý6¨«ôóÝ5²Þ/Ïy‰ßö~Àç¥Zëí¼Oðy©9ïKyÿàóR­Nª7gäxз¸¦}Ý?Çù§yîý³'ñæݸړ÷&>¸¢Åƒqè–}ÚÞχ¿œ“óÌõ~õÂO[ûiçx <̼Áî'ÚóÏ·x°Ÿ°Ìì~Ÿæâv¼+ßwu³×U¶?¸3×ëáÓ¯Âßy=]Ÿg¿ÏcûæÐ Íøœ¸;&ð}òê–ŸeŸœ8ãâ’w7üÃxwꌋSlß¼_xƒ;JoÎýô¸nÉëáºõÓ¯â7ò8kÌ«l†y¥8”<~5Ç! nŽ¿?Ç Ÿg>ã8ëµrœãËç¸û®xUÎK\{E‹ÛwuÎc|Ú{¬š1ä}îç·îé\'õ^ 9Õ˼ùC»¿’ö5êjqì¤ÿu•x+ã ¨+ã2þ€º2>ŸŸ/>Ïî'âySã“ÚWÏñL¼þ…ø[{ÔÕ$¾Ïø4ÈWâýÁ>¿í!Úz¨PWeû +õ`íOðõgÿÃx…º²ïë¢x@]•<Þ”ûi¤žëáºAê¿ß=3Í«ì§9`˜—¬¯jˆC‹¸•íkÔUúw8;¾fŽsÿ’¬÷+s^º™Þ5ê*ý||Êû¤û@Î{¸Ïû§G]Ùu÷\È<Íø£ ûj;ßù§ýí߯›LßÙû½Ž÷¸îã/-•ó6ĹýÓæ«f™óÝ}>7êÉÔ¾=òu« ^·}ûwì~"ìô˜Åƒ¼:î2[ŸøÜ%ó7y³Äy}îv½®’÷O õúè¢ùý1=¹Ã·óúüØÛ¯ð¹Kæ1|îÒí)ì'|}¯¼n¯Yð¢’ãs—Œ‡¼(̓íò›w½½äøÜ%kß|üíÎWøÜ%».>wÉ~ÏÇ~ð¹Kyœ˜WÙOÃy=ùÃKÞ/žã€Ï]2¯³ŸæØ7|î’y¼?ÇŸ»äîCÂ5C^þ¼”‹í»s‡<îõÞ¾¾¬šóŽÏ]r¼ïr„??ãx8gaóU'íêjqÄç:ùö¨«ÄOºJ¼{¿‡ñ'ðóÅçLÙýD»ãÔøXÿψx&ÞïêãÿÄkÔÕdúþ‡ +ù²~PW%ïV:ÅÖCs£¯‡æk{Ùú‰³|ý´w?`¼›-õF®õ9ôÓK=^Wê¿mò8Ó¼Òx9þîÉ<¯€8”¼â·’÷Ç\f÷ â\òöm9ÎòRòfVÎKû¢÷CºJíš=½Oâ*9ïñïŸêø¡N^|Æù]ØW¿ý¯œº/ͽvßi§Íïx¿Êiw'ÞŸõ.ËãÐn´žý¾¦Ýø"çáîúGìõ Ÿcâæï^Á~Ï1qñéÞ÷†­O|Ž‰½NŽýÏzù +Ÿ÷a¯«äÕç^°õ‰Ï1±÷Çäø[Ÿñî“(ãÙ]ñKóCwÈá·9þ­mÝâsL.(9>Ç$¯çž¼ÀæÍõ;ðöÐÃo+y;ôÓÞsÒ%Çç˜Øuñ9&ù÷|C?õ0Î4¯²}·iž>Çä…’ãsL,øç+|Ž‰Å­EœËöø‹s¼8~]ÎKƒ<–¼ûtÎc?ßüyÞÃ8›•sÞê¤l_o™ë¤Ùe¶ãaÃ~`÷WÒ¾A]M ~ð9)®}ƒºJŸ«âÆS£®ï7òã¯QW‰×2ßóµ~æãoýÚųB<o?æãß þÖ~mŸ¯øùÝm}vwùüÆËië!ìë!þ}k[?ñi_?Íc—oPWé:¬[ò +uUòn觕zn†ë¶gÙ> ãLó*yülžW8”¼¹:Ç¡ÒõøÞ7ÌkÝdýÞ9Äy)û©PWéßÍ™Þ5êÊÚUÞ'ê*ñ°÷O@]Y?ÿ3ÛâÄø ©}ásœâÂ_3™¾sè³ÎŸÕÊÝ•8>Àñæþ]ì÷5qÏK—êo´×'|.€ÕÅxÝßßf÷] î}>7ÁÖ]µÆ ÷¾Ÿ `ë³^èËO¥y°Ÿpî_mýÖ¬dïÉëOý·­ÏîÃëÝ_¶ï¶ÝßÜóÇ’ãs,í!Ï:Þ®8ä½þnž7½ý®\'ͧy~ß¿`¿¿’ö-êjql´ÿ•º+ñZÆS¡®¯dü-ÆoýÈ|æ›x?95>ÆWóñÄç,¼”xx§‹ø[ÿûû|5ÈWâí:>¿ý6ûÛzŸñõP£RûîŸ}ý„—Ž3^¡®Ò÷™¯zàÖçÐ>çÂÕs;\·Ã8Ë~úõò8Ó¼J^ óꇒw{å8DÄ­ä ê*ý»BœK^Ÿ–ãÜ~Û¯÷vö—]¼jÔUúùö`ï“ueý.ãýÓ¢®¬ýã§YœŸ4”ô…çr;ÿôWÿjÖ$8ž³íüY¯¸ËÆ?ðŠóR³ÇQùþ¸‹n^íÍçÛýDØÒ?ÿÏÙ¶û‰°ÛnŽÏ!·õÙ~ù÷¾Ï-ÏëóÞ•ì} Ûã9ç/§ñàùÕv¿I×ÞÉÖg{ÄÜûÒ¼Gþêîæ±f¡Çn)y³Úò¶>›µO:¯äý[ûÇs¶ÏK×a?#×c·”ÏëÎíœ{_Éñ|o»n‹q–¼ÆÙc^%ïßçÕ %o‡8Ôˆ[ÉÃÚ9nâ\òfßçy)ywSÎK<:þœÇ +y/y\>ç= NJÞ^9ÔÉWt¼Ù}³ýíþJÚw¨«‰Çwûþ»v¹Óøª~›Wö¾wßgûxØ—m}ÆÙ 9_uWM·õYoyÀŸ\û…¶7Þo}ÀŸÒuØO7ðn)y;ôƒç0ßëøpÝã,y5Œ3ÍËña^ýAŸ±û£ñº÷ä8tˆ[Ù¾[3Ç- ÎŽ>Ç9ξÒâÄ~ê[s^*ä±l_¿#ç±=ÑßõËå¼Çß~"ÇcˆsüN®“îþoÞöµïÛý•¶G]M ŽÚü·ÏÎI<>éǃç3?híeü-ÆŸxÿŒŸoÄ|­Ÿu¦Æ'ñJâÙ"ž‰w§úø÷ß[Ü긫}¾ºk¬î›¿øüVÈoê§F]Mâ¿Œsåt[W;~*ÔOjß ®ÒÇöïÌÏëvõ‡~‚ÖóOóu{Œ³ì' ãLó*y3Ì«?PÖׇq+ÛwkäýT-â\ò¸YŽs…¼”¼½%ç¥FK¦ç<âùÄ'ηE]Y»Ä?¨«ÄãÜ-Nld_q§ÚõSÍÜòªI|§[ódwÝf¹ÕïH<œ2×sæƒöþϱtójî8È^ŸðÜK« ^7®pý^+üâöûò~õY¶>»‹æºûØfÉOÙú¬÷¹ÔüÍöÝ#õŸÓxð|E»ß$Çs;³Ç¾¸Ø=iÞäýª›äû±%w¾©äÕ¶ùy"Õww8·äíRIý·ûîpnú/û!ïÿuç›JÞo3<—×-y7\·Ã8_<3Í«äóBJÞ-‘ãP!n%¯‡¸áy›/–¼_>ǹu–ʼnãïnòrò\ç±j­œÇy/û©–òŽ:q|Í¡N¶ÚÈñæÈï¶v%íûµ¶¼jq¬¤ÿý'ÞÉxzŒÇ¸Œ¿ÇøÇs/Ý|kÔ•ñŸOõs¡g‹x&Þìíã_!þ‰ÇÝ}¾äËÚoîó[#¿‰WKøz¨‡ÄÃÿóõÓ¿{â/Öu•þ˼Ä÷RŸõÐO­õ¼Êp]©ÿ~±aœ˜WÙ÷pžW‹8”¼]<Ç¡ÿ™_õj³ò}Cë×oºJ?_#/e?Õ— +y,yX3ç±YÃû$Ö9ïÍŽÞ?5êÊ~~Ë,NŒ.i_a¥iÎKõ“ºrß©/9Ô]·©¾=ñj§[Ü8›­×™›x³Üõ/Úu†×ßþÎ=óýÄj•óvõÆí~¢{þywf¬kïë§vq÷±qŸåõ¹Áóë*_ß?½šÕk;¹™Ýor^ÝÛ·°õYŸsæ]n»äíÐO‡ë–Ÿ¯ùJíÿøü6ÈoâÝ¢¾ðÜ*ãêjßg<Û™ooPWéç¦ðÅ}}ö?Éýô¸nÙ¾®Ûbœ%Ã8#æUòþKy^âPòæž!Ÿöë±^ùììµ-üú×ç8‡_ùõ^ y‰ËŠÚœÇvï“u•ÆÑ>áýƒçªå:A]•ãDSûÂódœð<™8‰ïày2Žãy2·$ŽçÉ8/áy2wÿs缄çÉäû‰ý·vÞÆódl}ây2ÎóxžÌvÝ q÷±xžL¾ïzté‡'p}æÏ“yÖ®{ñõùu˜¯_7ië½ÿÆcw”íñ<[ŸxžÌu%ÇódŒãy2g;Ìü©¿ž®Ãëö™ãy2×9¾ìÐÏÝáøëùºxžŒÝ‡²ñ|‹9žÏ`õ„ç3<êÚÿf3[Ÿx>ƒÅƒíñ|[¿x>ƒÿ½ú™‡ØzÇón/ûÁóÌx>Ã5%ï¾ù–q<Ÿá¬’ãù ¶~ð|†³&‹ñãù Æñ|†kJÞ ýàù ·—Ïg°þñ|÷{x<Ÿ!ó*Ûãù y^ˆCÉñ|‹žÏ`~bð|†¼ÿO¹öCœñ|¿®/ò‚<–íñ|Ë#žÏ`ãeÿx>ÃÍ©žÏ`ó&Çó¬Nð|Çñ|†ïØý•´Çó&'ОÏàúÇónNÏgpãÁóîJÏgpãÇóì~ÏgpóÅóòú|«šŸÔOÿ-O<ŸÁÖ'žcàâç3<Úãù ._x>ƒ­w<ŸÁå·B~S{<ŸÁÕžÏ`Ïg8k2]x= Gíû‚µ_ÊמÏ`Ïgpõ‰ç3X?x>ƒ«g<ŸÁ8žÏàêÏg°q¦y¥ëðºx>ƒÍ Ïgpë Ïg°8tˆ[Ù¾F]Ù¿O÷ëÏg°8ãù Ï”íñ|Ë žÏàü€ç3Xñ|†<Þ!x>CÎûï<ŸÁêÏg°xpü˜Š}á¼³ïÿû;\:‰ï༳͛íqÞùÆÄqÞÙçç$Þ{†óRuùºöú„óÎ.8ïüPjóÎÎó8ïlëçÝëB?ß/·þ§}Ýþ^4Žç¢Kmýâ¼³ù›¼:쀧mœ«¿ï¶‰4.ÖÉÖ<“8Î;_íøñך7pÞùŒ’ã¼³­œw>#ýûÁygã8ï|uÉqÞÙúÁyçÛçu_Ùî_ØÎ;Û8qÞÙþ¾JŽóÎ6/œwö÷]ŒÃ6Ûºûœw¶¸á¼³[§8ïlqÆyg·®qÞÙò‚óÎ^ç-8ïló ÇyçÓ|pÞÙæMŽóÎV'8ïìùk7ím¾’ö8ï|éúÁyg×?Î;ߘ8Î;»ñà¼óœÄqÞÙçí~çÝ|qÞù¡Ôç§ÄÇ®{‚'Î;?n×ÏÇçŸ4þªÏÎ;ÛzÇyg—_œw¶õ€óήpÞ9{c_?8ïü\êçÏHÿeUÆçíõçݼú«¶×§0íaœ´õ‰óƒ”ýàü ­Oœ›³xpü8?˜=ÖýÍÝ÷âü`öØáÓÍßcû=¾cëçí~“çŸJãÇùÁ«Êëâü y£:qÆé%ÇùÁì½Sgœž~Žýàü`öÌÂ\UrœÌ×-9ÎÚuq~Ðî_ØÎÚ8q~ÐüAŽóƒ6¯‡²œ´8àüà#Ž¿?Ç çÝ:ÅùA‹3κuóƒ–œ´qñº8?hyÄùÁ<¡p~ðút½0wŽã8?hu‚óƒÎ38?¸§ùJÚãüàÅèç]?8?x}â8?èƃóƒv?ÑÊøq~Ðî'Úùü|q~ÐÖ'ÎN‰Oêç]qÇÍçqlÿC˜G|¬ÿ·~íâ‰ó8$Žs+.þ8cõÖöùÂyóÎã¸üâ<Ž­œÇqõ€ó8¶~pçÔI\‡yÁ¹ã8ãêçq|}ýà<Ž«gœÇ±ëâ<Ž«œÇ±q¦y¥ùñº8cóÂy·¾pÇâ€ó8—í»÷¾Ñ§ã<ŽýÜØÏCœ‘—²=ÎãX^pÇÆÅö8“óXyŸàËø^qãÇþöüzÓE›7ûÁþv[ŸØßîâ€ýíù¾k·Ý,lýíXÿ_¾Ä½.`ûC‰cøÝé¿\GKM·õ‹ýíæorìo·:ÆþöÙeûøêî¶n±¿=–ûÛOýcûÉ%Ç>vãØß~rú>ûù»‹%ÇþöÜþȹ³KŽýív]ìo·ûöƒýí6Î4¯²=ö·Û¼°¿Ý½îc»ÅûÛû²=ö·[Ü°¿ýá’c»ÅûÛ­?^ûÛ-/Øßž¯Ïשoä»]§Æ'õýí.žØßþPâØîâýíÙc·ú|a»Õ}{¸Ï/ö·Û:ÁþvWØßþ¸]w¦¯ìo7Þ­ãë ûÛc»¯Ï¡ìowõŒýív]ìowõýí6Î4/‹+_‡ya»__+å8`{ïÚÏœû@ú7ö·?\rìo·8c»[ïØßnyÁþv»>ëûÛ-Øßnã%ÇþöY©_ìo·y“c»Õ ö·;žR•¾°_Ôõý¢çN‚c¿¨ö‹^•8ö‹úñÏ|ðFã¯Í²üóºØ/jëûE]°_Ôî»°_Ô^ÙûEï³ë^4÷ž \‡ûEíuû*Ýëö‹ÚúÅ~Ñ[ËöØ/ú°ç‹‹]WrìÍ~[rçËJŽý¢Æ±_ôÄ’c_裩ì=1ý—ã!Ç~ÑËJŽý¢y]áº%Ç~QãØ/z«ã‹çq¦y•ûE󼇒c¿¨ÅûEóý)ëpˆö‹öe{ìµ8c¿¨õÇñc¿hÎËÉs-NäØ/jyÄ~Ñ<¡ìÍyG”ýWku²ÕFŽc¿è7ÌWÒûEÏ@±_Ôõý¢W%Žý¢n<Ø/z£q?ö‹ÚúÄ~Q7_ìµ×÷úçSãcý\èã‰ý¢vŸý¢.þØ/juŒý¢._Ø/jußlîó‹ý¢¶N°_ÔÕö‹Ç~QW?Ø/ú¨Åu•þËøc¿¨qìuõ‰ý¢Öö‹úz^e¸®Ô?ö‹æqb^eÿØ/jóÂ~Q·¾°_4ßoý̯Gì½Ï~¾õëûEsœ‘—²ìµ¼`¿¨óö‹Z±_ÔùûE¯J?ý¢yÞ¬gÔ•õ»åFŽ£©}aÿ•».ö_ýqßÁþ+DZÿêòıÿª·þ†þ±ÿêúıÿÊÝgbÿ•åû¯œ—°ÿÊêû¯ÌÓc¾V9Û^ç°ÿêβì¿2aŸ’Åcl¿Í·H×Åþ+wŸŒýW½gÑg¹~¶_ÑÖ-ö_]\rì¿ÊüŠ¥O(9öYe~õÒ'¤þx]r쿺¸äØeí±ÿjVɱÿ*sŒ³äØeãLó*9ö_Ù¼°ÿêÎ’cÿ•Åû¯ì¾‰ãÁþ+‹ö_9aÿ•Åû¯ÌslýW–쿲ë“cÿ•åû¯l¼äØuyö_9ŽýWV'Øå<ƒýW»š¯¤=ö_ýq"åKúÇþ«ËÇþ+7쿺>qì¿rãÇþ«[­ý–~¾Øe볞G|R{ì¿rñÄþ+[اäâýWv_ýW._ØeuýW.¿Øeëû¯\=`ÿ•qì¿rõƒýWƱÿÊÕÛÈ÷õ‰ýWÖû¯\=cÿ•qì¿òõ?Œ3Í+Í›yÄþ+›ö_¹õ…ýW9Ÿöëû¯òýÙ~ýbÿ•Åû¯,ûÇþ+Ë ö_y?üÿ¶Î'4ÎëŠâÓ®´Hë.´èFÎdã@ãB;tfVÁºi²¥CH…’˜²)ƒ›USˆÚ&PÉŽcLDj»N4‰Üô›Ê‘]°ˆe¥Žì¡Ph²êŸE)i÷Üï ïHÕÆöÑ÷½{ß}gîœ{-ò™¿J? +/‘Wñzæ¯ gþ*ó„¼²õ±/æì¹Ì3œmÀ™gÅ_~ßD8ó Æ?Ì3\ œyù]ìù}:oæŒÏ™gØ{æÄÓÅžyÝ/æþÜç´~ñû&t™g0½‘yÝ[æ”×Åžß7¡ºŸy†Kõ:Ì3ˆ˜g×8ó ™gXªqæ>nØó KñgYŸyáÌ3Œkœy†\kt©Æ™gÎ<ƒø`¶NÙ'~ÕöÌ3¤_Ä¡Æ™gP˜g¸YãÌ3(nü¾ «Ç:mœ™g¸mökí¹pŽ5Î<ƒÎ‘yí·ì“y†&ì˜gßgžAyÂ<ƒáÌ3üP|µËžy†³}ÖažÁÖgž¡ œyÛó WgžÁöÏ<ƒî'ó æ/ó Ûa?ýogO|„ñx2Ï ûHßßâÏ<ÃNØ3Ï`çÅ<ÃÀ™g°óežA÷„yËæ„3Ï°ÔľÊûû¯~úq¬Ãï›XŠ? Î<ƒpæ,?™gÐ:Ì3X>3Ï œyËæ´Ïð«^ŸyùÅ<ƒÝ/æ‡eâVÛ3Ï ^š®øýežAqfžávmÏ<ƒÎ…yãætŽÌ3ä~Û80ÏÐÄë;7œ˜gPž0Ï x”ø„©¾>º!? +Np¥áô §?¸8ýAçŸûîêüèš¿ôuÞôÓïr^½Ík±ýÁb¿å¹ôÅcôÅÄÓ3ü‰›º·ôÑ6k{úƒù~ùÒœâ1³úÙ¼×ÇÆ“Úžþ ò›þà›5Np§aô_©qúƒÂùù¢¯Ä÷Ëúô…óóE߬qúƒ‰óܧ?¨çÒ”uèjŸáWmOP~Ejœþ â@ðÃ÷gÜè&oµq¦?¨8Ó´ûKPçBÐî;ýA#ýÁô£]‡þàZ<þ áô•'ôo×û¡?øñÕ.{úƒ+}Ö¡?hëÐ\ œþ í‡þ î'ýAÛ?ýAÝOúƒæ/ýÁk±ýÁ=ñ œþ Å“þ î-}4‹?ýAÕôí¼èf½ñ ?_úƒºô-èæý9éùCP8ýAÏ·§?hùIPöô-Ÿéê¹ô-ÿé&ãWø]òŸ/š~íº_ô‡q«í銗èÚý¥?¨8Óôû~)Ï…þ ñýA#ýÁŒG›Wô×âyô §?¨<¡?h|G_èíò£ø…Þ~ºGo÷}øѪðþ)ÿŠ=z{ÞÏå‰ù‹Þ¾öèíò»Ø£·'=ùäVì·àèíªÇøy2gôö̳ûÕO(öü<å%z»âQpôvÝkôö‹õúèíÊoôös5ŽÞ.~@o_¬qtuáèí‹MµÏþ¥¿ž«qôö´ÿå‹5ŽÞ®ç¢·‹Ê>ÑÛµOôö?Õöèíò ½Ýîz»â€Þ¾UÛ£·+nèíÛ5ŽÞ®8£·ÛýEo×¹ ·çóKþ<•çˆÞn<ÀÏ“YuÑÛå_Ù?z{æÉã?7½ýqñÕ.{ôöÓýˆãW}}ôöUá_óý ·ë~¢·ÛþÑÛ7½ÝüEo¡·ï‰OØ£·[<ÑÛ¯Ž.mñGoWóódì¼ÐÛ•÷èív¾èíº'èí–èíê¹=Ïôváèí‹ñýOôváè힟í:èí–Ïèíz.z»å?z»ö~Õëw[¿ÐÛý~ÝŸq@oß2ûÞ÷ãßèíÛ5ŽÞ®8£·Û}Go×¹ ·ëùÅ/ôv#z»ö[pôöÕX½]~½]y‚Þn8¦úB¿Ò¹{ô«“ ßA¿2ýê|àèWæú•Þѯ’wÛüG¿’î~%½m¶þfO÷ýJ~œÿ?¨¼A¿º\Çýêj<ÇÎeòØÝSô«?ÔöèW[aÏÿT<Êúï¸8ú•ø»àèW‰¯/¼X¯ƒN•øÆ‹ñºb_pô«•G¿’=úÕj£_%Î>kýJû ¿jýJ~¡_]®qô+ÅýJö~e8ú•òýj»Þ'úÕ÷ZýÊìѯNöYýÊqò*pô+Ûú•ÞѯlÿèW”ý£î/ú•î úÕžø„=ú•Åýêªðy?ú•î)ú•ú•òýÊÎýJ÷ýÊòýJ8ú•å:•pô+Ë·>ïù‰~%{ô+Ëgô+áèWžÿí>ѯ쾠_É/ô+»_èW‡C~ѯ’ïñû‹~•¼ôk¿ïèW:ô+ç‡Qž#úUúÑòÿð|ÄýÊpô«Ìò*¾_ò¿ê«ûÑ ãÑgûõùgôiÏðé×ÿözÃ+†ß:`}ŠÉ}w/ÿÇ«K;—÷)ÿ‡_ü‹ü+Ïö6›°_-žÃ{Ÿ[|rýAù=³âæ{–ÿóû>|ú܇™/Ík|øô³É{ÇÆçj|ôÂ;Ù·ûòC§j¼»u\ùÝ=uðùŸl~.|ræàóMõ\>' +ï|å¡S5>½–ët^Ÿ«ñAûÜÁâܸƧOå>ï¶~ñyP|_üåó â0$nµýdÆσâ§b?øfÆyú÷ Wjûé{y.|Ìx´ù3éæ9Nïöä_Y§{°=÷;7 ŸÜÍ<üäñh±Üûïï_ñùÑìäUœÏ›Ž“W/ïÚŸ/ßµÿáÆ>ñØòÜßþ†ýtuo|ïþŸx>Xòøw‰¿ìÉ«&Ökã3â¼g^ÔÎwùØ;º|´|è’aßyÕógzõsá]òJë•ø·øpŸççôý\‡ùgËçAûÜá®üï´û ¿êõG?K¿ø\l÷«K^…Ý2q«íù<¸ÿç|#ãÜá\j¼C^Å¿'=ç‡y%»OœO&ä¹o;ÿt>Í<üøñh‰?Kë‹úÊöO}¥÷ê+é¯N4¼‚újRï“úêõÀ©¯2_ÚøS_é}™úê]³ßì½%ûÇå_ÙõÕÛS_Ùûõ•êoêô»œïcGôþG}õ[[ÿ_ßÑçSê«Ó5N}¥ûO}¥{SžK}•øúÂÑÚž:*ñ…£±¯b_pê+ñzÁ©¯dO}uº¶§¾Jœ}Ö8õ•ö~Õ8õ•ü¢¾ò÷ñŒõ•ÞÊs©¯7ê«wëu¨¯gê+½?ûÑ­<ê+=¿àÔW:Gê+í·àÔW'b]ê+鯲nxxNï3ÅžúêÛm}eöÔWª'¨¯'¯ú¬O}eû¡¾Q_Ùþ©¯ô¾<|Ôý¥¾z+Ö¡¾ÚŸÀ©¯,žÔW…Ï{ü©¯T¯P_ÙyQ_)﩯ì|©¯tO¨¯,¨¯„S_YþPG §¾²|›áóžŸÔW²§¾²|¦¾N}åùßî“úÊî õ•ü¢¾²ûE}•q8ä÷‘úêíˆÏô¿¿ÔWŠ3ýA»ïÔW:ê+ç‡Qž#õUúÑÞ_꫱>õ•áÔW™'ä•žßÚcª/øJÏ)ù_)¾ð•áðÕñ†WÀWÎóG½8|u¶^¾RžÃWo¾Ù{Mö‡+Ësá«3ÃWv.ð•êlîõ«õ:|T>ÁW¿©q>êý¾Z¬qøJü _Ùû|•øúÂ3µ=¼”øÆÂ3Mø]âÜâð•Õ]ð•ìá«ÅÚ¾Jœ}Ö8|¥}†_5_É/øÊïÅNƾ¯”ýÀWŠ|õF½|¥8ÃWg ¿•ç_Y _éá+í·¬_×ÃW†ÃWyžû]½>|õ`ËWf_é~ÂWŽ“W}Ö‡¯l?ðÕËÃW¶øJy_™¿ðÕka_í‰Oàð•Å¾Z>ïñ‡¯tÿá+;/øJy_ÙùÂWº'ð•å|%¾²ü—„ÃW–o3|Þó¾’=|eù _ ‡¯<ÿÛ}ÂWv_à+ù_Ùý‚¯2‡ü>ÂWg">ð•Ý_øJq†¯ì¾ÃW:øÊùa”ç_¥å‘W±>|e8|•yB^éù»øŠ—è+òsÒþ½þ£ä­°ÿ<˾š.ß  0­ PolygonVertexIndexiÌt  #­ xC°fÝÆþ¶mÛ¶mÛæmÛ¶mÛ¶mÛ¶m÷MúT=õ&µ¿iktþûï¿ÿ°Lìôß¿å€,3;…ËXv—³¬ì.aÙØq\ʲ³c¸Œå`Gq98ËÉŽàr–‹Æå,7;„Ë¡Xv—C³¼ì .‡aùØ~\Ëò³}¸Ž`{q9<+ÈöàrVˆíÆ刬0Û…Ë‘X¶—#³¢l.GaÅØv\ŽÊŠ³m¸•`[q9:+ɶàr VŠmÆ嘬4ۄ˱X¶—c³²l.ÇaåØz\ŽËʳu¸U`kq9>«ÈÖàrV‰­Æ儬2[…ˉX¶—³ªl.'aÕØr\Nʪ³e¸œŒÕ`Kq99«É–àr +V‹-Æ唬6[„Ë©X¶—S³ºl.§aõØ|\NËê³y¸œŽ5`sq9=kÈæàrÖˆÍÆeÿ2²Y¸×6š°™¸lMÙ \¶ÿ±é¸lÍØ4\¶æl*.ÛF 6—m£%›ŒË¶ÑŠMÂeÛhÍ&â²m´apÙ6Ú²ñ¸œ—µcãpÙ6Ú³±¸œŸu`cp¹ ëÈFãrAÖ‰ÂåB¬3‰Ë¶Ñ…ÀeÛèʆã²mtcÃpÙ6º³¡¸l=Ø\¶žl0.ÛF/6—m£7ˆË¶Ñ‡ ÀeÛèËúã²môs¸lýY_\¶¬.ÛÆ@Ö—mcë…˶1˜õÄeÛÂzà²m eÝqÙ6†±n¸lÃYW\¶¬ .ÛÆHÖ—mcë„˶1šuÄeÛÃ:àr6–µÇeÛÇÚá²mŒgmq¹>›ÀÚà²mLd­q¹!›ÄZár#6™µÄ匬1k{mc*kŽË¶15ÃåmxqÙ6f°¦¸l3Y\¶Y¬1.ÛÆlÖ—mckˆË¶1—5ÀeÛ˜Çêã²mÌgõpÙ6°º¸l Y\îÀ±Ú¸l‹Y-\¶%¬&.ÛÆRV—mc«ŽË¶±œUÃeÛXÁªâ²m¬dUpÙ6V±Ê¸l«Y%\îÅÖ°Š¸lkY\¶u¬<.ÛÆzV—û± ¬,.ÛÆFV—mc+ËÙfV +—±-¬$.f[Y \¶m¬8.ÛÆvV —mc+ŠË¶±“ÁeÛØÅ +ã²mìf…pÙ6ö°‚¸l{Y\¶},?.ÛÆ~–—mã ˋ˶qåÁå ìË˶q˜åÂeÛ8Ârâ²me9p¹1›Â²ã^Û8βá²mœ`Yqy:;ɲà²mœb™qy&;Í2á²mœaqÙ6β ¸lçXz\¶ó,.ÏcXZ\¶‹, .ÛÆ%–—mã2K…Ë‹Ø–—³«,./a×Xr\¶ë,.ÛÆ –—mã&K‚˶q‹%ÆeÛ¸Íá²mÜa qÙ6l÷X|\¶û,.ÛÆ—mã!‹ƒË¶ñˆÅÆeÛxÌbá²m²0¸lŸXh\¶Ï,.b_XH\>̾²¸|„}cÁqù(û΂áòvŒŽ¶ñ“ÁeÛøÅã²müfpÙ6þ°€¸lY \¶\¶ øÍŸ¿eÛˆÿÁeÛ„ÿÆeÛŒÿÂeÛ‚ÿÄeÛŠÿÀeÛ†Çå+,8þ —m#þ—m#$þ—¯³Pøg\¶Ðø'\¶0øG\¶°ø\¶pø{\¶ðø;\¶ø[\¾Ç"âopù>‹„¿ÆeÛˆŒ¿ÂeÛˆ‚¿ÄeÛˆŠ¿ÀeÛˆ†?ÇeÛˆŽ?ÃåmàOqÙ6bâOpÙ6báqÙ6bãpÙ6âàqÙ6ââpÙ6âá÷qÙ6âã÷pÙ6àwqÙ6âwpÙ6á·qÙ6ã·pÙ6’à7qÙ6’â7pÙ6’á×qÙ6’ã×pÙ6RàWqÙ6RâWpÙ6Rá—qÙ&~°K¸×6Òðý".ÛFZü.ÛF:ü<.ÛFzü.ÛFü,.ÛFFv—m#;˶‘™ÂeÛÈÂNâ²mde'pÙ6²±ã¸lÙÙ1\¶ì(.ÛFNv—m#;ŒË¶‘›ÂeÛÈÃâ²mäepÙ6ò±ý¸lùÙ>\¶l/.ÛFA¶—m£Û˶Q˜íÂeÛ(Âvâ²me;pÙ6Š±í¸lÅÙ6\¶l+.ÛFI¶—c°Rl3.ÛFi¶ —m£ ۈ˶Q–mÀeÛ(ÇÖã²m”gëpÙ6*°µ¸ŸUdkpÙ6*±Õ¸l•Ù*\¶*l%.ÛFU¶—m£[ŽË¶Q-ÃeÛ¨Á–â²mÔdKpÙ6j±Å¸lµÙ"\¶:l!.ÛDjîÜkõØ|\¶úl.ÛF6—m£!›ƒË¶ÑˆÍÆeÛhÌfá²m4a3qÙ6š²¸lÿcÓqÙ6š±i¸lÍÙT\¶l +.ÛFK6—m£›„˶њMÄeÛhÃ&à²m´eãqÙ6Ú±q¸líÙX\ÎÏ:°1¸lÙh\¶Nl.ÛFg6—m£ ˶ѕ ÇeÛèƆá²mtgCqÙ6z°!¸l=Ù`\¶^l.ÛFo6—m£€Ë¶Ñ—õÇeÛèçpÙ6ú³¾¸lX\¶¬7.ÛÆ Ö —mc0ë‰Ë¶1„õÀeÛʺã²m cÝpÙ6†³®¸l#X\¶‘¬3.ÛÆ(Ö —mc4ëˆË¶1†uÀeÛËÚãrjV—µÃ½¶1žµÅeÛ˜ÀÚà²mLd­qÙ6&±V¸l“YK\¶)¬.ÛÆTÖ—mck†ËÿÚðâ²mÌ`MqÙ6f²&¸l³Xc\¶Ù¬.·bsXC\¶¹¬.ÛÆ«‡Ë¶±€ÕÅeÛXÈêà²m,bµqÙ6³Z¸lKXM\¶¥¬.ÛÆ2V—mc9«†Ë¶±‚UÅeÛXɪà²m¬b•qÙ6V³J¸lkXE\¶µ¬.ÛÆ:V—mc=+‡Ë¶±•ÅeÛØÈÊà²mlb¥qÙ66³R¸lI\¶­¬.ÛÆ6V—mc;+†Ë¶±ƒÅeÛØÉŠà²mìb…qÙ6v³B¸<ŠíaqÙ6ö²¸lûX~\¶ý,.×eãX^ÜkY\¶C,7.ÛÆa– —mãˉ˶q”åÀeÛ8Ʋã²mgÙpÙ6N°¬¸.ÛÆ}—m㋋˶ñÅÁeÛxÄbã²m°°¸lY\ǰи×6>³P¸l_XH\¶¯,.ÛÆ7—mã; †Ë¶ñƒÅeÛøÉ‚à²mübqÙ6~³@¸lX@\¶¿, .ÛÆ.ÛF üïoÞÿð9ÿƒË¶ÿ˶ÿ…˶ÿ‰Ë¶ÿ˶ ÿŽË¶ÿ†Ë¶ÿŠË¶ÿ‚˶ +ÿŒË¶ÿ„˶ÿˆË¶ÿ€Ë¶˶‡Ë¶‹Ë¶ƒË¶ ˶…˶‰Ë¶˶ ŽË¶†ËÿÚÀŸâ²mÄÄŸà²mÄÂã²mÄÆá²mÄÁâ²mÄÅà²mÄÃïã²mÄÇïá²m$Àïâ²m$Äïà²m$Âoã²m$Æoá²m$Áoâ²M|b7p¯m$ãûu\¶äø5\¶øU\¶”ø\¶Tøe\¶Ôø%\¶4øE\¶´ø\¶tøy\¶ôø9\¶ øY\¶Œì .ÛF&v—m#3;…˶‘…ÄeÛÈÊNà²mdcÇqÙ6²³c¸l9ØQ\¶œì.ÛF.v—m#7;„˶‘‡ÄeÛÈËà²mäcûqÙ6ò³}¸lØ^\¶‚l.ÛF!¶—m£0ۅ˶Q„íÄeÛ(Êvà²mcÛqÙ6Š³m¸l%ØV\¶’l .Ç`¥Øf\¶Òl.ÛF¶—m£,ۀ˶QŽ­ÇeÛ(ÏÖá²mT`kq9>«ÈÖà²mTb«qÙ6*³U¸lUØJ\¶ªl.ÛF5¶—m")wîµl).ÛFM¶—m£[ŒË¶Q›-ÂeÛ¨Ãâ²mÔe pÙ6ê±ù¸lõÙ<\¶l..ÛFC6—m£›Ë¶Ñ˜ÍÂeÛhÂfâ²m4e3pÙ6þǦã²m4cÓpÙ6š³©¸l-Ø\¶–l2.ÛF+6 —m£5›ˆË¶Ñ†MÀeÛhËÆã²m´cãpÙ6Ú³±¸œŸu`cpÙ6:²Ñ¸lØ(\¶Îl$.ÛF6—m£+ŽË¶Ñ ÃeÛèΆâ²mô`CpÙ6z²Á¸l½Ø \¶Þl .ÛF6 —m£/ë˶ÑÏá²môg}qÙ6°>¸lYo\¶A¬.ÛÆ`Ö—mcë˶1”uÇeÛƺá²m g]q9)«Îºà^ÛÉ:ã²mŒbpÙ6F³Ž¸lcX\¶±¬=.ÛÆ8Ö—mc–—mc?ˇ˶q€åÅeÛ8Èòà²mb¹qÙ6³\¸lGXN\¶£,.ÛÆ1–—mã8ˆËÓØ –—§³“, .ÛÆ)–—mã4˄˶q†eÄeÛ8Ë2à²mœcéqÙ6γt¸<]`iqÙ6.²4¸l—Xj\¶Ë,.ÛÆ–—mã*K˶q%Çe۸Βá²mÜ`IqÙ6n²$¸l·Xb\¶Û,.ÛÆ–—mã.K€Ë¶qÅÇeÛ¸Ïâá²m<`qqÙ6²8¸lXl\¶Ç,.ÛÆ—mã)‹Ë¶ñŒEÇeÛx΢áò6ö‚EÅeÛxÉ¢à²m¼b‘qÙ6^³H¸<‚íbq¯m¼epÙ6Þ±ð¸lïY8\ÞÇ>°°¸lY\¶O,4.ÛÆg +—m㠉˶ñ•…ÀeÛøÆ‚ã²m|gÁpÙ6~° ¸l?Y\>Á~±À¸l¿Y \¶?, .ÛÆ_ —mã¿@ —m# þ÷ïØ6âpÙ6á¿qÙ6ã¿pÙ6‚à?qÙ6‚â?pÙ6‚áßqÙ6‚ãßpÙ6Bà_qÙ6Bâ_pÙ6BáŸqÙ6BãŸpÙ6ÂàqÙ6ÂâpÙ6ÂáïqÙ6ÂãïpÙ6"àoqÙ6"âopÙ6"á¯qÙ6"ã¯pÙ6¢à/qÙ6¢â/pÙ6¢áÏqÙ6¢ãÏpù_øS\¶˜ø\¶Xøc\¶Øø#\¶8øC\¶¸ø\¶xø}\¶‰7ìîµ|¿‹Ë¶‘¿ƒË¶‘¿Ë¶‘¿…˶‘¿‰Ë¶‘¿Ë¶‘ ¿ŽË¶‘¿†Ë¶‘¿ŠË¶‘¿‚˶‘ +¿ŒË¶‘¿„˶‘¿ˆË¶‘¿€Ë¶‘?˶‘?‡Ë¶‘?‹Ë¶‘‘ÁeÛÈÄNã²mdf§pÙ6²°“¸lYÙ \¶lì8.ÛFvv —m#;ŠË¶‘“ÁeÛÈÅã²mäf‡pÙ6ò°ƒ¸lyÙ\¶|l?.ÛF~¶—m£ ۋ˶QíÁeÛ(Ävã²mf»pÙ6Š°¸lEÙ\¶bl;.ÛFq¶ —m£ۊ˶Q’mÁå¬ی˶QšmÂeÛ(Ã6â²m”epÙ6ʱõ¸låÙ:\¶ +l-.ÛD|îÜk•Øj\¶Êl.ÛF¶—m£*[˶Q-ÇeۨΖá²mÔ`KqÙ6j²%¸lµØb\¶Úl.ÛF¶—m£.[€Ë¶QÍÇeÛ¨Ïæá²m4`sqÙ6²9¸lØl\¶Æl.ÛF6—m£)›Ë¶ñ?6—m£›†Ë¶ÑœMÅeÛhÁ¦à²m´d“qÙ6Z±I¸l­ÙD\¶6l.ÛF[6—m£‡Ë¶ÑžÅåü¬ƒË¶Ñ‘ÆeÛèÄFá²mtf#qÙ6º°¸l]Ùp\¶nl.ÛFw6—m£‚˶ѓ ÆeÛèÅá²môfqÙ6ú°¸l}Y\¶~—m£?ë‹Ë¶1€õÁeÛÈzãr|V‘õ½¶1˜õÄeÛÂzà²m eÝqÙ6†±n¸lÃYW\¶¬ .ÛÆHÖ—mcë„˶1šuÄeÛÃ:à²mŒeíqÙ6Ʊv¸lãY[\®Ï&°6¸lYk\¶I¬.ÛÆdÖ—mc +k˶1•5Çeۘƚáò¿6¼¸l3XS\¶™¬ .ÛÆ,Ö—mc6k„˶1‡5ÄeÛ˜Ëà²mÌcõqÙ6æ³z¸l X]\¶…¬.ÛÆ"V—mc1«…˶±„ÕÄeÛXÊjà²m,cÕqÙ6–³j¸l+XU\¶•¬ +.ÛÆ*V—mc5«„˶±†UÄeÛXË*à²m¬cåqÙ6Ö³r¸Üm`eqÙ66²2¸l›Xi\¶Í¬.WdƒXIÜk \¶m¬8.ÛÆvV —mc+ŠË¶±“ÁeÛØÅ +ã²mìf…pÙ6ö°‚¸l{Y\¶},?.ÛÆ~–—mã ˋ˶qåÁå ìË˶q˜åÂeÛ8Ârâ²me9pÙ6Ž±ì¸lÇY6\¶,+.Og'Y\¶S,3.ÛÆi– —mã ˈ˶q–eÀeÛ8ÇÒã²mœgépy»ÀÒâ²m\dipÙ6.±Ô¸l—Y*\¶+,%.ÛÆU–—mãKŽË¶q%ÃeÛ¸Á’â²mÜdIpÙ6n±Ä¸l·Y"\¶;,!.ÛÆ]– —mã‹Ë¶qŸÅÃeÛxÀââ²m¶—m#?ۇ˶Q€íÅeÛ(Èöà²mb»qÙ6 +³]¸lEØN\¶¢l.ÛF1¶—m£8ۆ˶Q‚mÅeÛ(ɶàr VŠmÆe›ˆÉÝ„{m£ ۈ˶Q–mÀeÛ(ÇÖã²m”gëpÙ6*°µ¸lÙ\¶Jl5.ÛFe¶ +—m£ +[‰Ë¶Q•­ÀeۨƖã²mTgËpÙ6j°¥¸l5Ù\¶Zl1.ÛFm¶—m£[ˆË¶Q—-ÀeÛ¨Çæã²mÔgópÙ6°¹¸l Ù\¶Fl6.ÛFc6 —m£ ›‰Ë¶Ñ”ÍÀeÛø›ŽË¶ÑŒMÃeÛhΦâ²m´`SpÙ6Z²É¸l­Ø$\¶Öl".ÛF6—m£-˶юÃeÛhÏÆâ²mt`cpÙ6:²Ñ¸lØ(\¶Îl$.ÛF6—m£+ŽË¶Ñ ÃeÛèΆâ²mô`CpÙ6z²Á¸l½Ø \¶Þl .Çd¥Ù Ük}Y\¶~—m£?ë‹Ë¶1€õÁeÛÈzã²m b½pÙ6³ž¸lCX\¶¡¬;.ÛÆ0Ö —mc8ëŠË¶1‚uÁeÛÉ:ãrM6ŠuÂeÛÍ:â²mŒapÙ6Ʋö¸lãX;\¶ñ¬-.×gX\¶‰¬5.ÛÆ$Ö +—mc2k‰Ë¶1…µÀeۘʚã²mLcÍpù_^\¶¬).ÛÆLÖ—mckŒË¶1›5ÂeÛ˜Ãâ²mÌe pÙ6æ±ú¸lóY=\¶¬..ÛÆBV—mc«Ë¶±˜ÕÂeÛXÂjâ²m,e5pÙ6–±ê¸lËY5\¶¬*.ÛÆJV—{°U¬2.ÛÆjV —mc «ˆË¶±–UÀåÒ¬+{mc=+‡ËýØV—mc#+ƒË¶±‰•ÆeÛØÌJá²mla%qÙ6¶²¸lÛXq\¶í¬.ÛÆV—mc'+‚˶±‹ÆeÛØÍ +áò(¶‡ÄeÛØË +à²mìcùqÙ6ö³|¸lX^\¶ƒ,.ÛÆ!–—mã0˅˶q„åÄeÛ8Êrà²mcÙqÙ6Ž³l¸l'XV\žÎN²,¸l§Xf\¶Ó,.ÛÆ–—mã,ˀ˶qŽ¥ÇeÛ8ÏÒáò±Ð¸lŸY(\¶/,$.ÛÆW—m㠎˶ñÃeÛøÁ‚â²müdApÙ6~±À¸l¿Y \¶?, .ÛÆ_ —mã¿ —m# þ÷ïØ6âpÙ6á¿qÙ6ã¿pÙ6‚à?qÙ6‚â?pÙ6‚áßqÙ6‚ãßpÙ6Bà_qÙ6Bâ_pÙ6BáŸqÙ6BãŸpÙ6ÂàqÙ6ÂâpÙ6Âáïqù ¿ÃeÛˆ€¿ÅeÛˆˆ¿ÁeÛˆ„¿Æe›xÀ^á^ÛˆÂ÷—¸lQñ¸lÑðç¸lÑñg¸ü¯ ü).ÛFLü .ÛF,ü1.ÛFlü.ÛFü!.ÛF\ü.ÛF<ü>.ÛF|ü.ÛFü..ÛFBü.ÛF"ü6.ÛFbü.ÛFü&.ÛFRü.ÛF2ü:.ÛFrü.ÛF +ü*.ÛFJü +.ÛF*ü2.ÛFjü.ÛFü".ÛFZü.ÛF:ü<.ÛFzü.ÛFü,.ÛFFv—m#;˶‘™ÂeÛÈÂNâ²mde'pÙ6²±ã¸lÙÙ1\¶ì(.ÛFNv—m#;ŒË¶‘›ÂeÛÈÃâ²mäepÙ6ò±ý¸lùÙ>\¶l/.ÛFA¶—m£Û˶Q˜íÂeÛ(Âvâ²MDæîÀ½¶QŒmÇeÛ(ζá²m”`[qÙ6J²-¸ƒ•b›qÙ6J³M¸leØF\¶²l.ÛF9¶—m£<[‡Ë¶Q­ÅeÛ¨ÈÖà²mTb«qÙ6*³U¸lUØJ\¶ªl.ÛF5¶—m£:[†Ë¶Qƒ-Åeۨɖà²mÔb‹qÙ6j³E¸luØB\¶ºl.ÛF=6—m£>›‡Ë¶Ñ€ÍÅeÛhÈæà²m4b³qÙ6³Y¸lMØL\¶¦l.ÛÆÿØt\¶fl.ÛFs6—m£›‚˶ђMÆeÛhÅ&á²m´fqÙ6Ú° ¸lmÙx\¶vl.ÛF{6—ó³l .ÛFG6—m£…˶љÄeÛèÂFà²mteÃq92+ʆá^ÛèΆâ²mô`CpÙ6z²Á¸l½Ø \¶Þl .ÛF6 —m£/ë˶ÑÏá²môg}qÙ6°>¸lYo\¶A¬.ÛÆ`Ö—+³!¬.ÛÆPÖ—mcë†Ë¶1œuÅeÛÁºà²mŒdqÙ6F±N¸l£YG\¶1¬.ÛÆXÖ—mck‡Ë¶1žµÅåúlkƒË¶1‘µÆeÛ˜ÄZá²mLf-qÙ6¦°¸lSYs\¶i¬.ÿkË˶1ƒ5Åeۘɚà²mÌbqÙ6f³F¸lsXC\¶¹¬.ÛÆ«‡Ë¶±€ÕÅeÛXÈêà²m,bµqÙ6³Z¸Ü‰-a5qÙ6–²¸lËXu\¶å¬.eÝXUÜk+Y\¶U¬2.ÛÆjV —mc «ˆË¶±–UÀeÛXÇÊã²m¬gåp¹ÛÀÊâ²mldepÙ66±Ò¸l›Y)\¶-¬$.ÛÆVV—‡°m¬8.ÛÆvV —mc+ŠË¶±“ÁeÛØÅ +ã²mìf…pÙ6ö°‚¸l{Y\¶},?.ÛÆ~–—mã ˋ˶qåÁeÛ8Ärã²mf¹pÙ6Ž°œ¸lGY\¶c,;.ÛÆq– —mãËŠËÓÙI–—mãˌ˶qšeÂeÛ8Ã2â²mœepÙ6αô¸lçY:\žÇ.°´¸lY\¶K,5.ÛÆe– +—mã +K‰Ë¶q•¥Àå%ìKŽË¶q%ÃeÛ¸Á’â²mÜdIp¹[Áã^Û¸Íá²mÜa qÙ6l÷X|\¶û,.ÛÆ—mã!‹ƒË¶ñˆÅÆeÛxÌbá²m²0¸lŸXh\¶Ï,.ÛÆ—mã+ ˶ñÇeÛø΂á²mü`AqÙ6~² ¸l¿X`\¶ß,.ÛÆ—mã/ €Ë¶ñ_P†Ë¶ ÿû÷?lñ?¸lð߸lñ_¸lAðŸ¸lAñ¸lÁðï¸lÁño¸l!ð¯¸|…Ä¿à²m„Â?ã²m„Æ?á²m„Á?â²MÜbp¯m„ãû{\¶ðø;\¶ø[\¶ˆø\¶Høk\¶Èø+\¶(øK\¶¨ø \¶høs\¶èø3\þ×þ—m#&þ—m#þ—m#6þ—m#þ—m#.þ —m#~—m#>~—m#~—m#!~—m#~—m#1~ —m# ~—m#)~—m#~—m#9~ —m#~—m#%~—m#~—m#5~ —m# ~—m#-~—m#~—m#=~—m#~—m##;ƒË¶‘‰ÆeÛÈÌNá²mda'qÙ6²²¸lÙØq\¶ìì.ÛFv—m#';‚˶‘‹ÆeÛÈÍá²mäaqÙ6ò²¸lùØ~\¶‰°Ü}¸×6 +°½¸lÙ\¶Bl7.ÛFa¶ —m£ۉ˶Q”íÀeÛ(ƶã²mgÛpÙ6J°­¸l%Ù\ŽÁJ±Í¸l¥Ù&\¶2l#.ÛFY¶—m£[˶Qž­ÃeÛ¨ÀÖâ²mTdkpÙ6*±Õ¸l•Ù*\¶*l%.ÛFU¶—m£[ŽË¶Q-ÃeÛ¨Á–â²mÔdKpÙ6j±Å¸lµÙ"\¶:l!.ÛF]¶ —m£›Ë¶QŸÍÃeÛhÀæâ²m4dspÙ6±Ù¸lÙ,\¶&l&.ÛFS6—mãl:.ÛF36 —m£9›ŠË¶Ñ‚MÁeÛhÉ&ã²m´b“pÙ6Z³‰¸lmØ\¶¶l<.ÛF;6—m£=‹ËaY~6÷ÚFG6—m£…˶љÄeÛèÂFà²mteÃqÙ6º±a¸lÝÙP\¶l.ÛFO6—m£„˶ћ ÄeÛèÃà²môeýq¹,ëçpÙ6ú³¾¸lX\¶¬7.ÛÆ Ö —mc0ë‰Ë¶1„õÀeÛʺã²m cÝpÙ6†³®¸l#X\¶‘¬3.ÛÆ(Ö —mc4ëˆË¶1†uÀeÛËÚã²mŒcípÙ6Ƴ¶¸lX\¶‰¬5.ÛÆ$Ö +—mc2k‰Ë¶1…µÀeۘʚã²mLcÍpù_^\¶¬).ÛÆLÖ—mckŒË¶1›5ÂeÛ˜Ãâ²mÌe p¹ ›Çêã²mÌgõpÙ6°º¸l Y\ÎÏ:°Ú¸×6³Z¸lKXM\¶¥¬.ÛÆ2V—mc9«†Ë¶±‚UÅeÛXɪà²m¬b•qÙ6V³J¸lkXE\¶µ¬.ÛÆ:V—mc=+‡ËýØV—mc#+ƒË¶±‰•ÆeÛØÌJá²mla%qÙ6¶²¸lÛXq\¶í¬.ÛÆV—mc'+‚˶±‹ÆeÛØÍ +á²mìaqÙ6ö²¸lûX~\¶ý,.ÛÆ–—mã ˃˶qˆåÆeÛ8Ìrá²ma9qÙ6Ž²¸lÇXv\¶ã,.ÛÆ –—§³“, .ÛÆ)–—mã4˄˶q†eÄeÛ8Ë2à²mœcéqÙ6γt¸<]`iqÙ6.²4¸l—Xj\¶Ë,.w`‹XJÜkWY +\¶k,9.ÛÆu– —mãKŠË¶q“%ÁeÛ¸Åã²mÜf‰pÙ6î°„¸lwY\¶{,>.ÛÆ}—m㋋˶ñÅÁå ì‹Ë¶ñ˜ÅÂeÛxÂbâ²m°°¸lY\¶O,4.ÛÆg +—m㠉˶ñ•…ÀeÛøÆ‚ã²m|gÁpÙ6~° ¸l?Y\¶_,0.ÛÆo—m㠈˶ñ—ÀeÛø/ÃeÛ€ÿýÆû¶€ø\¶@øo\¾Àã¿pÙ6‚à?qÙ6‚â?pÙ6‚áßqÙ&®°o¸×6Bðý+.ÛFHü .ÛF(ü3.ÛFhü.ÛFü#.ÛFXü.ÛF8ü=.ÛFxü.ÛFü-.ÛFDü .ÛF$ü5.ÛFdü.ÛFü%.ÛFTü.ÛF4ü9.ÛFtü.ÿkŠË¶‚˶ ŒË¶„˶ˆË¶€Ë¶¿Ë¶¿‡Ë¶‘ ¿‹Ë¶‘¿ƒË¶‘¿Ë¶‘¿…˶‘¿‰Ë¶‘¿Ë¶‘ ¿ŽË¶‘¿†Ë¶‘¿ŠË¶‘¿‚˶‘ +¿ŒË¶‘¿„˶‘¿ˆË¶‘¿€Ë¶‘?˶‘?‡Ë¶‘?‹Ë¶‘‘ÁeÛÈÄNã²mdf§pÙ6²°“¸lYÙ \¶lì8.ÛFvv —m#;ŠË6œ{÷ÚF.v—m#7;„˶‘‡ÄeÛÈËà²mäcûqÙ6ò³}¸lØ^\¶‚l.ÛF!¶—m£0ۅ˶Q„íÄeÛ(Êvà²mcÛqÙ6Š³m¸l%ØV\¶’l .Ç`¥Øf\¶Òl.ÛF¶—m£,ۀ˶QŽ­ÇeÛ(ÏÖá²mT`kq9>«ÈÖà²mTb«qÙ6*³U¸lUØJ\¶ªl.ÛF5¶—m£:[†Ë¶Qƒ-Åeۨɖà²mÔb‹qÙ6j³E¸luØB\¶ºl.ÛF=6—m£>›‡Ë¶Ñ€ÍÅeÛhÈæà²m4b³qÙ6³Y¸lMØL\¶¦l.ÛÆÿØt\¶fl.ÛFs6—m£›‚˶ђMÆåà,'›„{m£5›ˆË¶Ñ†MÀeÛhËÆã²m´cãpÙ6Ú³±¸lØ\¶Žl4.ÛF'6 +—m£3‰Ë¶Ñ…ÀeÛèʆã²mtcÃpÙ6º³¡¸\œõ`CpÙ6z²Á¸l½Ø \¶Þl .ÛF6 —m£/ë˶ÑÏá²môg}qÙ6°>¸lYo\¶A¬.ÛÆ`Ö—mcë˶1”uÇeÛƺá²m g]qÙ6F°.¸l#Yg\¶Q¬.ÛÆhÖ—mc ë€Ë¶1–µÇeÛÇÚá²mŒgmqÙ6&°6¸lYk\¶I¬.ÛÆdÖ—mc +k˶1•5Çeۘƚáò¿6¼¸ÜŒÍ`MqÙ6f²&¸l³Xc\¶Ù¬.çd­XCÜksY\¶y¬>.ÛÆ|V—mc«‹Ë¶±ÕÁeÛXÄjã²m,fµpÙ6–°š¸lKY \¶e¬:.ÛÆrV —mc«ŠË¶±’UÁål«ŒË¶±šUÂeÛXÃ*â²m¬epÙ6Ö±ò¸lëY9\¶ ¬,.ÛÆFV—mc+˶±™•ÂeÛØÂJâ²mle%pÙ6¶±â¸lÛY1\¶¬(.ÛÆNV—mc+ŒË¶±›ÂeÛØà +â²mìepÙ6ö±ü¸lûY>\¶,/.ÛÆA–—mãË˶q˜åÂeÛ8Ârâ²me9pÙ6Ž±ì¸lÇY6\¶,+.Og'Y\žÁN±Ì¸l§Y&\¶3,#.ÛÆY–—[±9,=îµó,.ÛÆ–—mã"KƒË¶q‰¥ÆeÛ¸ÌRá²m\a)qÙ6®²¸l×Xr\¶ë,.ÛÆ –—mã&K‚˶q‹%ÆeÛ¸Íáò*v‡%ÄeÛ¸Ëà²mÜcñqÙ6î³x¸lX\\¶‡,.ÛÆ#—mã1‹…˶ñ„ÅÄeÛxÊbà²m²0¸lŸXh\¶Ï,.ÛÆ—mã+ ˶ñÇeÛø΂á²mü`AqÙ6~² ¸l¿X`\¶ß,.ŸbX@\¶¿, .ÛÆ¿2ŽË¶ 8¿ùÊûžÃα?¸×6ñý7.ÛF`ü.ÛFü'.ÛFPü.ÛF0ü;.ÛFpü.ÛFü+.ÛFHü .ÛF(ü3.ÛFhü.ÛFü#.ÛFXü.ÛF8ü=.ßaáñw¸lð·¸lñ7¸l‘ð׸l‘ñW¸lQð—¸lQñ¸lÑðç¸lÑñg¸ü¯ ü).ÛFLü .ÛF,ü1.ÛFlü.ÛFü!.ÛF\ü.ÛF<ü>.ÛF|ü.ÛFü..ÛFBü.ÛF"ü6.ÛFbü.ÛFü&.ÛFRü.ÛF2ü:.ÛFrü.ÛF +ü*.ÛFJü +.ÛF*ü2.ÛFjü.ÛFü".ÛFZü.ÛF:ü<.ÛFzü.ÛFü,.ÛFFv—m#;Ë6{ +÷ÚFv—m#+;˶‘ÇeÛÈÎŽá²mä`GqÙ6r²#¸l¹Øa\¶Üì.ÛFv—m#/;€Ë¶‘íÇeÛÈÏöá²m`{qÙ6 +²=¸l…Øn\¶Âl.ÛF¶—m£(Û˶QŒmÇeÛ(ζá²m”`[qÙ6J²-¸ƒ•b›qÙ6J³M¸leØF\¶²l.ÛF9¶—m£<[‡Ë¶Q­ÅeÛ¨ÈÖà²mTb«qÙ6*³U¸lUØJ\¶ªl.ÛF5¶—m£:[†Ë¶Qƒ-Åeۨɖà²mÔb‹qÙ6j³E¸luØB\¶ºl.ÛF=6—m£>›‡Ë¶Ñ€ÍÅeÛhÈæà²m4b³qÙ6³Y¸lMØL\È2³¸×6þǦã²m4cÓpÙ6š³©¸l-Ø\¶–l2.ÛF+6 —m£5›ˆË¶Ñ†MÀeÛhËÆã²m´cãpÙ6Ú³±¸lØ\¶Žl4.dØ(\¶Îl$.ÛF6—m£+ŽË¶Ñ ÃeÛèΆâ²mô`CpÙ6z²Á¸l½Ø \¶Þl .ÛF6 —m£/ë˶ÑÏá²môg}qÙ6°>¸lYo\¶A¬.ÛÆ`Ö—mcë˶1”uÇeÛƺá²m g]qÙ6F°.¸l#Yg\¶Q¬.ÛÆhÖ—mc ë€Ë¶1–µÇeÛÇÚá²mŒgmqÙ6&°6¸lYk\nÈ&±V¸l“YK\¶)¬.ÛÆTÖ—3³¦¬îý׆—mckŠË¶1“5ÁeÛ˜Åã²mÌfpÙ6æ°†¸lsY\¶y¬>.ÛÆ|V—mc«‹Ë¶±ÕÁeÛXÄjã²m,fµp¹[Âjâ²m,e5pÙ6–±ê¸lËY5\¶¬*.ÛÆJV—mc«ŒË¶±šUÂeÛXÃ*â²m¬epÙ6Ö±ò¸lëY9\¶ ¬,.ÛÆFV—mc+˶±™•ÂeÛØÂJâ²mle%pÙ6¶±â¸lÛY1\¶¬(.ÛÆNV—mc+ŒË¶±›ÂeÛØà +â²mìepÙ6ö±ü¸lûY>\¶,/.ÛÆA–—mãË˶q˜åÂåIìˉ˶q”åÀeÛ8Ʋã²mgÙp¹)›Æ²âÞéì$˂˶qŠeÆeÛ8Í2á²mœaqÙ6β ¸lçXz\¶ó,.ÛÆ–—mã"KƒË¶q‰¥ÆeÛ¸ÌRá²m\a)qÙ6®²¸¼„]cÉqÙ6®³d¸l7XR\¶›, .ÛÆ-–—mã6K„˶q‡%ÄeÛ¸Ëà²mÜcñqÙ6î³x¸lX\\¶‡,.ÛÆ#—mã1‹…˶ñ„ÅÄeÛxÊbà²m–—mc?ˇ˶q€åÅeÛ8Èòàr}6åƽ¶q˜åÂeÛ8Ârâ²me9pÙ6Ž±ì¸lÇY6\¶,+.Og'Y\¶S,3.ÛÆi– —mã ˈ˶q–eÀeÛ8ÇÒã²mœgépy»ÀÒâ²m\dipÙ6.±Ô¸l—Y*\¶+,%.ÛÆU–—mãKŽË¶q%ÃeÛ¸Á’â²mÜdIpÙ6n±Ä¸l·Y"\¶;,!.ÛÆ]– —mã‹Ë¶qŸÅÃeÛxÀââ²m.ÛF|ü.ÛFü..ÛFBü.ÛF"ü6.ÛFbü.ÛFü&.ÛFRü.ÛF2ü:.ÛÄv ÷ÚF +¾_ÅeÛH‰_ÁeÛH…_ÆeÛH_ÂeÛHƒ_ÄeÛH‹_ÀeÛH‡ŸÇeÛHŸÃeÛÈ€ŸÅeÛÈÈÎà²mdb§qÙ62³S¸lYØI\¶¬ì.ÛF6v—m#;;†Ë¶‘ƒÅeÛÈÉŽà²mäb‡qÙ6r³C¸lyØA\¶¼ì .ÛF>¶—m#?ۇ˶Q€íÅeÛ(Èöà²mb»qÙ6 +³]¸lEØN\¶¢l.ÛF1¶—m£8ۆ˶Q‚mÅeÛ(ɶàr VŠmÆeÛ(Í6á²m”aqÙ6ʲ ¸låØz\¶òl.ÛF¶—m£"[ƒË¶Q‰­ÆeÛ¨ÌVá²mTa+qÙ6ª²¸lÕØr\¶êl.ÛF ¶—m"9w îµZl1.ÛFm¶—m£[ˆË¶Q—-ÀeÛ¨Çæã²mÔgópÙ6°¹¸l Ù\¶Fl6.ÛFc6 —m£ ›‰Ë¶Ñ”ÍÀeÛø›ŽË¶ÑŒMÃeÛhΦâ²m´`SpÙ6Z²É¸l­Ø$\¶Öl".ÛF6—m£-˶юÃeÛhÏÆâ²mt`cpÙ6:²Ñ¸lØ(\¶Îl$.ÛF6—m£+ŽË¶Ñ ÃeÛèΆâ²mô`CpÙ6z²Á¸l½Ø \¶Þl .ÛF6 —m£/ë˶ÑÏá²môg}qÙ6°>¸lYo\¶A¬.ÛÆ`Ö—mcë˶1”uÇeÛƺá²m g]qÙ6F°.¸l#Yg\NÎj²N¸×6F³Ž¸lcX\¶±¬=.ÛÆ8Ö—mc.ÛÆ|V—mc«‹Ë¶±ÕÁeÛXÄjã²m,fµpÙ6–°š¸lKY \¶e¬:.ÛÆrV —mc«ŠË¶±’UÁeÛXÅ*ã²m¬f•pÙ6Ö°Š¸lkY\¶u¬<.ÛÆzV—mc+‹Ë¶±‘•ÁeÛØÄJã²mlf¥pÙ6¶°’¸l \¶m¬8.ÛÆvV —‡±¬(.ÛÆNV—mc+ŒË¶±›Âåšl+ˆ{mc/+ðŽË! +%‹b¿mÛ¶mÛ¶9mÛ¶mÛ¶m۶힤÷¼äÔ:‹ÂeÛØÇòã²mìgùpÙ6°¼¸lY\¶C,7.ÛÆa– —mãˉ˶q”åÀeÛ8Ʋã²mgÙpÙ6N°¬¸.ÛÆ}—m㋋˶ñÅÁeÛxÄbã²m²0¸lŸXh\¶Ï,.ÛÆ—mã+ ˶ñÇeÛø΂á²mü`AqÙ6~² ¸l¿X`\¶ß,.ŸbX@\¶¿, .ÛÆ¡.ÛF üï'þÿ°mÄÿà²mÂã²mÆá²mÁâ²mÅà²mÿã²mÇ¿á²m„À¿â²m„Ä¿à²m„Â?ã²m„Æ?á²m„Á?â²m„Å?à²m„Ãßã²m„Çßá²mDÀßâ²mDÄßà²mDÂ_ã²mDÆ_á²mDÁ_â²mDÅ_à²mDßã²mDÇŸáò¿6ð§¸l1ñ'¸l±ðǸl±ñG¸lqð‡¸lqñ¸lñðû¸lññ{¸l ð»¸lïØÜk‰x¿Ë¶‘¿…˶‘¿‰Ë¶‘¿Ë¶‘ ¿ŽË¶‘¿†Ë¶‘¿ŠË¶‘¿‚˶‘ +¿ŒË¶‘¿„˶‘¿ˆË¶‘¿€Ë¶‘?˶‘?‡Ë¶‘?‹Ë¶‘‘ÁeÛÈÄNã²mdf§pÙ6²°“¸lYÙ \¶lì8.ÛFvv —m#;ŠË¶‘“ÁeÛÈÅã²mäf‡pÙ6ò°ƒ¸lyÙ\¶|l?.ÛF~¶—m£ ۋ˶QíÁeÛ(Ävã²mf»pÙ6Š°¸lEÙ\¶bl;.ÛFq¶ —m£ۊ˶Q’mÁå¬ی˶QšmÂeÛ(Ã6â²m”epÙ6ʱõ¸låÙ:\¶ +l-.ÛFE¶—m£[Ë6‘» +÷ÚF¶—m£*[˶Q-ÇeۨΖá²mÔ`KqÙ6j²%¸lµØb\¶Úl.ÛF¶—m£.[€Ë¶QÍÇeÛ¨Ïæá²m4`sqÙ6²9¸lØl\¶Æl.ÛF6—m£)›Ë¶ñ?6—m£›†Ë¶ÑœMÅeÛhÁ¦à²m´d“qÙ6Z±I¸l­ÙD\¶6l.ÛF[6—m£‡Ë¶ÑžÅeÛèÀÆà²mtd£qÙ6:±Q¸lÙH\¶.l.ÛFW6—m£†Ë¶Ñ ÅeÛèÁ†à²môdƒqÙ6z±A¸l½Ù@\¶>l .ÛF_Ö—m£ŸÃeÛèÏúâ²m `}pÙ6²Þ¸lƒX/\¶Á¬'.'d•YÜkCYw\¶a¬.ÛÆpÖ—mcë‚˶1’uÆeÛÅ:á²mŒfqÙ6Æ°¸lcY{\¶q¬.ÛÆxÖ—mckƒË¶1‘µÆå†lk…˶1™µÄeÛ˜ÂZà²mLeÍqÙ6¦±f¸ü¯ /.ÛÆ Ö—mc&k‚˶1‹5ÆeÛ˜Íá²mÌa qÙ6沸lóX}\¶ù¬.ÛÆV—mc!«ƒË¶±ˆÕÆeÛXÌjá²m,a5qÙ6–²¸lËXu\¶å¬.ÛÆ +V—mc%«‚˶±ŠUÆeÛXÍ*á²m¬aqÙ6Ö² +¸lëXy\¶õ¬.ÛÆV—mc#+ƒËØ&V—mc3+…˶±…•ÄeÛØÊJàre6„ǽ¶±ÃeÛØÁŠâ²mìdEpÙ6v±Â¸l»Y!\¶=¬ .ÛÆ^V —mcË˶±ŸåÃeÛ8Àòâ²mdypÙ6±Ü¸l‡Y.\žÄŽ°œ¸lGY\¶c,;.ÛÆq– —mãËŠËÓÙI–—mãˌ˶qšeÂeÛ8Ã2â²mœepÙ6αô¸lçY:\¶ ,-.ÛÆE–—mãK˶q™¥ÂeÛ¸ÂRâ²m\e)pÙ6®±ä¸l×Y2\¶,).ÛÆM–—mãKŒË¶q›%ÂeÛ¸Ãâ²mÜe pÙ6î±ø¸l÷Y<\¶,..ÛÆC—mã‹Ë¶ñ˜ÅÂåMì ‹‰Ë¶ñ”ÅÀeÛxÆ¢ã²m³P¸l_XH\¶¯,.aßXp\¶ï,.ÛÆ—mã' ‚˶ñ‹ÆeÛøÍá²müaqÙ6þ² ¸lÿ…f¸lð¿ùÿöÿƒË¶ÿ˶ÿ…˶ÿ‰Ë¶ÿ˶ ÿŽË¶ÿ†Ë¶ÿŠË¶ÿ‚˶ +ÿŒË¶ÿ„˶ÿˆË¶ÿ€Ë¶˶‡Ë¶‹Ë¶ƒË¶ ˶…˶‰Ë¶˶ ŽË¶†ËÿÚÀŸâ²mÄÄŸà²mÄÂã²M¼`p¯mÄáý!.ÛF\ü.ÛF<ü>.ÛF|ü.ÛFü..ÛFBü.ÛF"ü6.ÛFbü.ÛFü&.ÛFRü.ÛF2ü:.ÛFrü.ÛF +ü*.ÛFJü +.ÛF*ü2.ÛFjü.ÛFü".ÛFZü.ÛF:ü<.ÛFzü.ÛFü,.ÛFFv—m#;˶‘™ÂeÛÈÂNâ²mde'pÙ6²±ã¸lÙÙ1\¶ì(.ÛFNv—m#;ŒË¶‘›ÂeÛÈÃâ²mäepÙ6ò±ý¸lùÙ>\¶l/.ÛFA¶—m£Û˶Q˜íÂeÛ(Âvâ²me;pÙ6Š±í¸lÅÙ6\¶l+.ÛFI¶—c°Rl3.ÛFi¶ —m£ ÛˆË6›»÷ÚF9¶—m£<[‡Ë¶Q­ÅeÛ¨ÈÖà²mTb«qÙ6*³U¸lUØJ\¶ªl.ÛF5¶—m£:[†Ë¶Qƒ-Åeۨɖà²mÔb‹qÙ6j³E¸luØB\¶ºl.ÛF=6—m£>›‡Ë¶Ñ€ÍÅeÛhÈæà²m4b³qÙ6³Y¸lMØL\¶¦l.ÛÆÿØt\¶fl.ÛFs6—m£›‚˶ђMÆeÛhÅ&á²m´fqÙ6Ú° ¸lmÙx\¶vl.ÛF{6—m£ƒË¶Ñ‘ÆeÛèÄFá²mtf#qÙ6º°¸l]Ùp\¶nl.ÛFw6—m£‚˶ѓ ÆeÛèÅá²môfqÙ6ú°¸l}Y\ŽÍʲ~¸×6ú³¾¸lX\¶¬7.ÛÆ Ö —mc0ë‰Ë¶1„õÀeÛʺã²m cÝpÙ6†³®¸l#X\¶‘¬3.ÛÆ(Ö —mc4ëˆËµÙÖ—mc,k˶1ŽµÃeÛÏÚâ²mL`mpÙ6&²Ö¸l“X+\¶É¬%.ÛÆÖ—mc*kŽË¶15ÃåmxqÙ6f°¦¸l3Y\¶Y¬1.ÛÆlÖ—mckˆË¶1—5ÀeÛ˜Çêã²mÌgõpÙ6°º¸l Y\¶E¬6.ÛÆbV —mc «‰Ë¶±”ÕÀeÛXƪã²m,gÕpÙ6V°ª¸l+Y\¶U¬2.ÛÆjV —{±5¬".ÛÆZV—mc+˶±ž•Ã岬Ÿ÷ÚÆFV—mc+˶±™•ÂeÛØÂJâ²mle%pÙ6¶±â¸lÛY1\¶¬(.ÛÆNV—mc+ŒË¶±›ÂeÛØà +â²mìepy ÛÇòã²mìgùpÙ6°¼¸lY\¶C,7.ÛÆa– —mãˉ˶q”åÀeÛ8Ʋã²mgÙpÙ6N°¬¸.ÛÆ}—m㋋˶ñÅÁå~l‹{mã1‹…˶ñ„ÅÄeÛxÊbà²m²0¸lŸXh\¶Ï,.ÛÆ—mã+ ˶ñÇeÛø΂á²mü`AqÙ6~² ¸l¿X`\¶ß,.ÛÆ—mã/ €Ë¶ñ_†Ë¶ ÿûÿ?lñ?¸lð߸lñ_¸lAðŸ¸lAñ¸lÁðï¸lÁño¸l!ð¯¸l!ñ/¸l¡ðϸl¡ñO¸lað¸lañ¸láð÷¸láñw¸lð·¸lñ7¸l‘ð׸l‘ñW¸lQð—¸lØ ÜkÑxŽË¶†ËÿÚÀŸâ²mÄÄŸà²mÄÂã²mÄÆá²mÄÁâ²mÄÅà²mÄÃïã²mÄÇïá²m$Àïâ²m$Äïà²m$Âoã²m$Æoá²m$Áoâ²m$Åoà²m$ïã²m$ǯá²m¤À¯â²m¤Ä¯à²m¤Â/ã²m¤Æ/á²m¤Á/â²m¤Å/à²m¤ÃÏã²m¤ÇÏá²mdÀÏâ²mddgpÙ62±Ó¸l™Ù)\¶,ì$.ÛFVv—m#;ŽË¶‘ÃeÛÈÁŽâ²mädGpÙ6r±Ã¸l¹Ù!\¶<ì .ÛF^v —m#Û˶‘ŸíÃeÛ(Àöâ²md{pÙ6 +±Ý¸l…Ù.\¶"l'.ÛFQ¶—m£ÛŽË6•» ÷ÚF ¶—m£$Û‚Ë1X)¶—m£4ۄ˶Q†mÄeÛ(Ë6à²m”cëqÙ6ʳu¸lØZ\¶Šl .ÛF%¶—m£2[…˶Q…­ÄeÛ¨ÊVà²mTcËqÙ6ª³e¸l5ØR\¶šl .ÛF-¶—m£6[„˶Q‡-ÄeÛ¨Ëà²mÔcóqÙ6ê³y¸l Ø\\¶†l.ÛF#6—m£1›…˶фÍÄeÛhÊfà²müMÇeÛhƦá²m4gSqÙ6Z°)¸l-Ùd\¶Vl.ÛFk6—m£ ›€Ë¶Ñ–ÇeÛhÇÆá²m´gcqÙ6:°1¸lÙh\¶Nl.ÛFg6—m£ ˶ѕ ÇeÛèƆá²mtgCq9*+Άà^ÛèÉã²môbƒpÙ6z³¸l}Ø \¶¾¬?.ÛF?‡Ë¶ÑŸõÅeÛÀúà²m d½qÙ6±^¸lƒYO\¶!¬.ÛÆPÖ—«²a¬.ÛÆpÖ—mcë‚˶1’uÆeÛÅ:á²mŒfqÙ6Æ°¸lcY{\¶q¬.ÛÆxÖ—mckƒË¶1‘µÆeÛ˜ÄZá²mLf-qÙ6¦°¸lSYs\¶i¬.ÿkË˶1ƒ5Åeۘɚà²mÌbqÙ6f³F¸lsXC\¶¹¬.ÛÆ«‡Ë¶±€ÕÅeÛXÈêà²m,bµqÙ6³Z¸lKXM\¶¥¬.waËXu\¶å¬.ÛÆ +V—mc%«‚ËÅYV÷ÚÆjV —mc «ˆË¶±–UÀeÛXÇÊã²m¬gåpÙ66°²¸lY\¶M¬4.ÛÆfV +—mc +‰Ë¶±••ÀeÛØÆŠã²mlgÅpyÛÁŠâ²mìdEpÙ6v±Â¸l»Y!\¶=¬ .ÛÆ^V —mcË˶±ŸåÃeÛ8Àòâ²mdypÙ6±Ü¸l‡Y.\¶#,'.ÛÆQ–—mãˎ˶qœeÃeÛ8Á²âòtv’eÁeÛ8Å2ã²mœf™pÙ6ΰŒ¸lgY\¶s,=.ÛÆy–—mãK‹Ë¶q‘¥ÁeÛ¸ÄRã²m\f©pÙ6®°”¸lWY +\¶k,9.ÛÆu– ——±,).ÛÆM–—mãKŒË¶q›%ÂålKˆ{mã.K€Ë¶qÅÇeÛ¸Ïâá²m<`qqÙ6²8¸lXl\¶Ç,.ÛÆ—mã)‹Ë¶ñŒEÇeÛx΢á²m¼`QqÙ6^²(¸¼ƒ½b‘qÙ6^³H¸loXD\¶·,.ÛÆ;—mã= ‡Ë¶ñ…ÅeÛøÈÂà²m|b¡qÙ6>³P¸l_XH\¶¯,.ÛÆ7—mã; †Ë¶ñƒÅeÛøÉ‚à²mübqÙ6~³@¸lX@\¶¿, .ÛÆa.ÛF üï{þÿ°mÄÿà²mÂã²mÆá²mÁâ²mÅà²mÿã²mÇ¿á²m„À¿â²m„Ä¿à²m„Â?ãò ÿ„˶ÿˆË¶ÿ€Ë¶Ë6q‡½Ã½¶÷·¸lñ7¸l‘ð׸l‘ñW¸lQð—¸lQñ¸lÑðç¸lÑñg¸ü¯ ü).ÛFLü .ÛF,ü1.ÛFlü.ÛFü!.ÛF\ü.ÛF<ü>.ÛF|ü.ÛFü..ÛFBü.ÛF"ü6.ÛFbü.ÛFü&.ÛFRü.ÛF2ü:.ÛFrü.ÛF +ü*.ÛFJü +.ÛF*ü2.ÛFjü.ÛFü".ÛFZü.ÛF:ü<.ÛFzü.ÛFü,.ÛFFv—m#;˶‘™ÂeÛÈÂNâ²mde'pÙ6²±ã¸lÙÙ1\¶ì(.ÛFNv—m#;ŒË¶‘›ÂeÛÈÃâ²mäepÙ6ò±ý¸lùÙ>\¶l/.ÛDxîÜk…Øn\¶Âl.ÛF¶—m£(Û˶QŒmÇeÛ(ζá²m”`[qÙ6J²-¸ƒ•b›qÙ6J³M¸leØF\¶²l.ÛF9¶—m£<[‡Ë¶Q­ÅeÛ¨ÈÖà²mTb«qÙ6*³U¸lUØJ\¶ªl.ÛF5¶—m£:[†Ë¶Qƒ-Åeۨɖà²mÔb‹qÙ6j³E¸luØB\¶ºl.ÛF=6—m£>›‡Ë¶Ñ€ÍÅeÛhÈæà²m4b³qÙ6³Y¸lMØL\¶¦l.ÛÆÿØt\¶fl.ÛFs6—m£›‚˶ђMÆeÛhÅ&á²m´fqÙ6Ú° ¸lmÙx\¶vl.ÛF{6—m£ƒË¶Ñ‘Æå𬠅{m£3‰Ë¶Ñ…ÀeÛèʆã²mtcÃpÙ6º³¡¸l=Ø\¶žl0.ÛF/6—m£7ˆË¶Ñ‡ ÀeÛèËúã²môs¸lýY_\.Ï°>¸lYo\¶A¬.ÛÆ`Ö—mcë˶1”uÇeÛƺá²m g]qÙ6F°.¸l#Yg\¶Q¬.ÛÆhÖ—mc ë€Ë¶1–µÇeÛÇÚá²mŒgmqÙ6&°6¸lYk\¶I¬.ÛÆdÖ—mc +k˶1•5Çeۘƚáò¿6¼¸l3XS\¶™¬ .ÛÆ,Ö—mc6k„˶1‡5ÄeÛ˜Ëà²mÌcõqÙ6æ³z¸ÜŽ-`uqÙ6²:¸l‹Xm\¶Å¬.dXMÜkKY \¶e¬:.ÛÆrV —mc«ŠË¶±’UÁeÛXÅ*ã²m¬f•pÙ6Ö°Š¸lkY\¶u¬<.ÛÆzV—mc+‹Ë¶±‘•Áål+˶±™•ÂeÛØÂJâ²mle%pÙ6¶±â¸lÛY1\¶¬(.ÛÆNV—mc+ŒË¶±›ÂeÛØà +â²mìepÙ6ö±ü¸lûY>\¶,/.ÛÆA–—mãË˶q˜åÂeÛ8Ârâ²me9pÙ6Ž±ì¸lÇY6\¶,+.Og'Y\¶S,3.ÛÆi– —mã ˈ˶q–eÀeÛ8ÇÒã²mœgépÙ6.°´¸lY\^À.±Ô¸l—Y*\¶+,%.ÛÆU–—;±%,9îµë,.ÛÆ –—mã&K‚˶q‹%ÆeÛ¸Íá²mÜa qÙ6l÷X|\¶û,.ÛÆ—mã!‹ƒË¶ñˆÅÆeÛxÌbáò&ö„ÅÄeÛxÊbà²m‹‡Ë¶ñ€ÅÅeÛxÈâà²m³P¸l_XH\¶¯,.ÛÆ7—mã; †Ë¶ñƒÅeÛøÉ‚à²mübqÙ6~³@¸lX@\¶¿, .Ÿaÿ…g¸lð¿oùÿöÿƒË¶ÿË6qý½¶„÷Ÿ¸lAñ¸lÁðï¸lÁño¸l!ð¯¸l!ñ/¸l¡ðϸl¡ñO¸lað¸lañ¸láð÷¸láñw¸lð·¸lñ7¸l‘ð׸l‘ñW¸lQð—¸lQñ¸lÑðç¸lÑñg¸ü¯ ü).ÛFLü .ÛF,ü1.ÛFlü.ÛFü!.ÛF\ü.ÛF<ü>.ÛF|ü.ÛFü..ÛFBü.ÛF"ü6.ÛFbü.ÛFü&.ÛFRü.ÛF2ü:.ÛFrü.ÛF +ü*.ÛFJü +.ÛF*ü2.ÛFjü.ÛFü".ÛFZü.ÛF:ü<.ÛFzü.ÛFü,.ÛFFv—m#;˶‘™ÂeÛÈÂNâ²MæžÀ½¶‘ÇeÛÈÎŽá²mä`GqÙ6r²#¸l¹Øa\¶Üì.ÛFv—m#/;€Ë¶‘íÇeÛÈÏöá²m`{qÙ6 +²=¸l…Øn\¶Âl.ÛF¶—m£(Û˶QŒmÇeÛ(ζá²m”`[qÙ6J²-¸ƒ•b›qÙ6J³M¸leØF\¶²l.ÛF9¶—m£<[‡Ë¶Q­ÅeÛ¨ÈÖà²mTb«qÙ6*³U¸lUØJ\¶ªl.ÛF5¶—m£:[†Ë¶Qƒ-Åeۨɖà²mÔb‹qÙ6j³E¸luØB\¶ºl.ÛF=6—m£>›‡Ë¶Ñ€ÍÅeÛhÈæà²m4b³qÙ6³Y¸lMØL\¶¦l.ÛÆÿØt\̲²i¸×6š³©¸l-Ø\¶–l2.ÛF+6 —m£5›ˆË¶Ñ†MÀeÛhËÆã²m´cãpÙ6Ú³±¸lØ\¶Žl4.ÛF'6 +—m£3‰Ë…Y6—m£+ŽË¶Ñ ÃeÛèΆâ²mô`CpÙ6z²Á¸l½Ø \¶Þl .ÛF6 —m£/ë˶ÑÏá²môg}qÙ6°>¸lYo\¶A¬.ÛÆ`Ö—mcë˶1”uÇeÛƺá²m g]qÙ6F°.¸l#Yg\¶Q¬.ÛÆhÖ—mc ë€Ë¶1–µÇeÛÇÚá²mŒgmqÙ6&°6¸lYk\¶I¬.ÛÆdÖ—³)¬.ÛÆTÖ—mck†ËÿÚðârVßXSÜk3Y\¶Y¬1.ÛÆlÖ—mckˆË¶1—5ÀeÛ˜Çêã²mÌgõpÙ6°º¸l Y\¶E¬6.ÛÆbV —mc «‰Ë¶±”ÕÀå.l«ŽË¶±œUÃeÛXÁªâ²m¬dUpÙ6V±Ê¸l«Y%\¶5¬".ÛÆZV—mc+˶±ž•ÃeÛØÀÊâ²mldepÙ66±Ò¸l›Y)\¶-¬$.ÛÆVV—mc+ŽË¶±ÃeÛØÁŠâ²mìdEpÙ6v±Â¸l»Y!\¶=¬ .ÛÆ^V —mcË˶±ŸåÃeÛ8Àòâ²mdypÙ6±Ü¸l‡Y.\¶#,'.ÛÆQ–—§°c,;.ÛÆq– —mãËŠËÓÙI–—›±,3îµÓ,.ÛÆ–—mã,ˀ˶qŽ¥ÇeÛ8ÏÒá²m\`iqÙ6.²4¸l—Xj\¶Ë,.ÛÆ–—mã*K˶q%Çe۸Βáò2vƒ%Åe۸ɒà²mÜb‰qÙ6n³D¸lwXB\¶»,.ÛÆ=—mã>‹‡Ë¶ñ€ÅÅeÛxÈâà²m³P¸l_XH\¶¯,.ÛÆ7—mã; †ËÇØ—mã' ‚˶ñ‹ÆeÛøÍáò vŠĽ¶ñ—ÀeÛø/ÃeÛ€ÿ}Ãÿ¶€ø\¶@øo\¶Àø/\¶ øO\¶ ø\¶`øw\¶àø7\¶øW\¶ø\¶Pøg\¾ÁBãŸpÙ6ÂàqÙ6ÂâpÙ6ÂáïqÙ6ÂãïpÙ6"àoqÙ6"âopÙ6"á¯qÙ6"ã¯pÙ6¢à/qÙ6¢â/pÙ6¢áÏqÙ6¢ãÏpù_øS\¶˜ø\¶Xøc\¶Øø#\¶8øC\¶¸ø\¶xø}\¶øø=\¶ø]\¶„ø\¶Døm\¶Äø-\¶$øM\¶¤ø \¶døu\¶äø5\¶øU\¶”ø\¶Tøe\¶Ôø%\¶4øE\¶´ø\¶tøy\¶‰?ìîµ ¼ŸÅeÛÈÈÎà²mdb§qÙ62³S¸lYØI\¶¬ì.ÛF6v—m#;;†Ë¶‘ƒÅeÛÈÉŽà²mäb‡qÙ6r³C¸lyØA\¶¼ì .ÛF>¶—m#?ۇ˶Q€íÅeÛ(Èöà²mb»qÙ6 +³]¸lEØN\¶¢l.ÛF1¶—m£8ۆ˶Q‚mÅeÛ(ɶàr VŠmÆeÛ(Í6á²m”aqÙ6ʲ ¸låØz\¶òl.ÛF¶—m£"[ƒË¶Q‰­ÆeÛ¨ÌVá²mTa+qÙ6ª²¸lÕØr\¶êl.ÛF ¶—m£&[‚˶Q‹-ÆeÛ¨Íá²mÔa qÙ6겸lõØ|\¶úl.ÛF6—m"=wîµFl6.ÛFc6 —m£ ›‰Ë¶Ñ”ÍÀeÛø›ŽË¶ÑŒMÃeÛhΦâ²m´`SpÙ6Z²É¸l­Ø$\¶Öl".ÛF6—m£-˶юÃeÛhÏÆâ²mt`cpÙ6:²Ñ¸lØ(\¶Îl$.ÛF6—m£+ŽË¶Ñ ÃeÛèΆâ²mô`CpÙ6z²Á¸l½Ø \¶Þl .ÛF6 —m£/ë˶ÑÏá²môg}qÙ6°>¸lYo\¶A¬.ÛÆ`Ö—mcë˶1”uÇeÛƺá²m g]qÙ6F°.¸l#Yg\¶Q¬.ÛÆhÖ—mc ë€Ë¶1–µÇeÛÇÚá²mŒgmqÙ6&°6¸lYk\NϲV¸×6&³–¸lSX \¶©¬9.ÛÆ4Ö —ÿµáÅeÛ˜Ášâ²mÌdMpÙ6f±Æ¸l³Y#\¶9¬!.ÛÆ\Ö —mc«Ë¶1ŸÕÃåvl«‹Ë¶±ÕÁeÛXÄjã²m,fµpÙ6–°š¸lKY \¶e¬:.ÛÆrV —mc«ŠË¶±’UÁeÛXÅ*ã²m¬f•pÙ6Ö°Š¸lkY\¶u¬<.ÛÆzV—mc+‹Ë¶±‘•ÁeÛØÄJã²mlf¥pÙ6¶°’¸l \¶m¬8.ÛÆvV —mc+ŠË¶±“ÁeÛØÅ +ã²mìf…pÙ6ö°‚¸l{Y\¶},?.ÛÆ~–—DZ,/.ÛÆA–—mãË˶q˜åÂå†lˉ{mã(Ë˶qŒeÇeÛ8βá²mœ`Yqy:;ɲà²mœb™qÙ6N³L¸lgXF\¶³,.ÛÆ9–—mãÃþ‹ÄpÙ6à_ñÿ‡m# þ—m#þ—m#0þ —m#þ—m#(þ—m#þ—m#8þ —m#þ—m#$þ—m#þ—m#4þ —m# þ—m#,þ—m#þ—m#<þ—m#þ—m#"þ—m#þ—m#2þ +—m# +þ—m#*þ—m#þ—m#:þ —ÿµ?ÅeÛˆ‰?ÁeÛˆ…?ÆeÛˆ?ÂeÛˆƒ?ÄeÛˆ‹?ÀeÛˆ‡ßÇeÛˆßÃeÛH€ßÅeÛHˆßÁeÛH„ßÆe›øÀná^ÛHÂûM\¶¤ø \¶døu\¶äø5\¶øU\¶”ø\¶Tøe\¶Ôø%\¶4øE\¶´ø\¶tøy\¶ôø9\¶ øY\¶Œì .ÛF&v—m#3;…˶‘…ÄeÛÈÊNà²mdcÇqÙ6²³c¸l9ØQ\¶œì.ÛF.v—m#7;„˶‘‡ÄeÛÈËà²mäcûqÙ6ò³}¸lØ^\¶‚l.ÛF!¶—m£0ۅ˶Q„íÄeÛ(Êvà²mcÛqÙ6Š³m¸l%ØV\¶’l .Ç`¥Øf\¶Òl.ÛF¶—m£,ۀ˶QŽ­ÇeÛ(ÏÖá²mT`kqÙ6*²5¸l•Øj\¶Êl.ÛF¶—m"1wîµjl9.ÛFu¶ —m£[ŠË¶Q“-ÁeÛ¨Åã²mÔf‹pÙ6ê°…¸luÙ\¶zl>.ÛF}6—m£›‹Ë¶ÑÍÁeÛhÄfã²m4f³pÙ6š°™¸lMÙ \¶ÿ±é¸lÍØ4\¶æl*.ÛF 6—m£%›ŒË¶ÑŠMÂeÛhÍ&â²m´apÙ6Ú²ñ¸líØ8\¶öl,.ÛF6—m£#˶щÂeÛèÌFâ²mta#pÙ6º²á¸lÝØ0\¶îl(.ÛF6—m£'ŒË¶Ñ‹ ÂeÛèÍâ²môapÙ6ú²þ¸lý.ÛFÖ—mc ëƒË¶1õÆeÛÄzá²m f=qÙ6†°¸lCYw\N̪²n¸×6†³®¸l#X\¶‘¬3.ÛÆ(Ö —mc4ëˆË¶1†uÀeÛËÚã²mŒcípÙ6Ƴ¶¸lX\¶‰¬5.ÛÆ$Ö +—mc2k‰ËÙÖ—mc*kŽË¶15ÃåmxqÙ6f°¦¸l3Y\¶Y¬1.ÛÆlÖ—mckˆË¶1—5ÀeÛ˜Çêã²mÌgõpÙ6°º¸l Y\¶E¬6.ÛÆbV —mc «‰Ë¶±”ÕÀeÛXƪã²m,gÕpÙ6V°ª¸l+Y\¶U¬2.ÛÆjV —mc «ˆË¶±–UÀeÛXÇÊã²m¬gåpÙ66°²¸lY\¶M¬4.ÛÆfV +—±-¬$.ÛÆVV—mc+ŽË¶±Ãåªl+Š{mc'+‚˶±‹ÆeÛØÍ +á²mìaqÙ6ö²¸lûX~\¶ý,.ÛÆ–—mã ˃˶qˆåÆeÛ8Ìrá²ma9qÙ6Ž²¸<…cÙqÙ6Ž³l¸l'XV\žÎN²,¸l§Xf\¶Ó,.ÛÆ–—mã,ˀ˶qŽ¥ÇeÛ8ÏÒá²m\`iqÙ6.²4¸l—Xj\¶Ë,.ÛÆ–—mã*K˶q%Çe۸Βá²mÜ`IqÙ6n²$¸l·Xb\¶Û,.ÛÆ–—mã.K€Ë¶qÅÇeÛ¸Ïâá²m<`qqÙ6²8¸lXl\¶Ç,.ÛÆ—mã)‹Ë[Ø3—mã9‹†Ë¶ñ‚EÅeÛxÉ¢àò0¶ƒEƽ¶ñšEÂeÛxÃ"â²m¼epÙ6Þ±ð¸lïY8\¶,,.ÛÆG—mã ˶ñ™…ÂeÛøÂBâ²m|e!pÙ6¾±à¸lßY0\>Æ~° ¸l?Y\¶_,0.ÛÆo—m㠈˶ñ—ÀeÛø/2ÃeÛ€ÿ}Éÿ¶€ø\¶@øo\¶Àø/\¶ øO\¶ ø\¶`øw\¶àø7\¶øW\¶ø\¶Pøg\¶Ðø'\¶0øG\¶°ø\¶pø{\¶ðø;\¶ø[\¶ˆø\¶Høk\¶Èø+\¶(øK\¶¨ø \¶høs\¶èø3\þ×þ—m#&þ—m#þ—m#6þ—m#þ—mâ{€{m#ï÷qÙ6âã÷pÙ6àwqÙ6âwpÙ6á·qÙ6ã·pÙ6’à7qÙ6’â7pÙ6’á×qÙ6’ã×pÙ6RàWqÙ6RâWpÙ6Rá—qÙ6Rã—pÙ6ÒàqÙ6ÒâpÙ6ÒáçqÙ6ÒãçpÙ62àgqÙ62²3¸l™Øi\¶Ìì.ÛFv—m#+;˶‘ÇeÛÈÎŽá²mä`GqÙ6r²#¸l¹Øa\¶Üì.ÛFv—m#/;€Ë¶‘íÇeÛÈÏöá²m`{qÙ6 +²=¸l…Øn\¶Âl.ÛF¶—m£(Û˶QŒmÇeÛ(ζá²m”`[qÙ6J²-¸ƒ•b›qÙ6J³M¸leØF\¶²l.ÛF9¶—m".wîµ +l-.ÛFE¶—m£[˶Q™­ÂeÛ¨ÂVâ²mTe+pÙ6ª±å¸lÕÙ2\¶l).ÛFM¶—m£[ŒË¶Q›-ÂeÛ¨Ãâ²mÔe pÙ6ê±ù¸lõÙ<\¶l..ÛFC6—m£›Ë¶Ñ˜ÍÂeÛhÂfâ²m4e3pÙ6þǦã²m4cÓpÙ6š³©¸l-Ø\¶–l2.ÛF+6 —m£5›ˆË¶Ñ†MÀeÛhËÆã²m´cãpÙ6Ú³±¸lØ\¶Žl4.ÛF'6 +—m£3‰Ë¶Ñ…ÀeÛèʆã²mtcÃpÙ6º³¡¸l=Ø\¶žl0.ÛF/6—m£7ˆË¶Ñ‡ ÀeÛèËúã²môs¸lýY_\ŽËʳ>¸×6²Þ¸lƒX/\¶Á¬'.ÛÆÖ—mc(ëŽË¶1ŒuÃeÛκâ²mŒ`]pÙ6F²Î¸l£X'\¶Ñ¬#.ÛÆÖ—mc,kËuÙ8Ö—mc‹‡ËëØ—mã!‹ƒË¶ñˆÅÆeÛxÌbáò ¶‰ÅĽ¶ñ”ÅÀeÛxÆ¢ã²m°°¸lY\>À>±Ð¸lŸY(\¶/,$.ÛÆW—m㠎˶ñÃeÛøÁ‚â²müdApÙ6~±À¸l¿Y \¶?, .ÛÆ_ —mã¿( —m# þ÷ÿØ6âpÙ6á¿qÙ6ã¿pÙ6‚à?qÙ6‚â?pÙ6‚áßqÙ6‚ãßpÙ6Bà_qÙ6Bâ_pÙ6BáŸqÙ6BãŸpÙ6ÂàqÙ6ÂâpÙ6ÂáïqÙ6ÂãïpÙ6"àoqÙ6"âopÙ6"á¯qÙ6"ã¯pÙ6¢à/qÙ6¢â/pÙ6¢áÏqÙ&ž°g¸÷_¼?ÅeÛˆ‰?ÁeÛˆ…?ÆeÛˆ?ÂeÛˆƒ?ÄeÛˆ‹?ÀeÛˆ‡ßÇeÛˆßÃeÛH€ßÅeÛHˆßÁeÛH„ßÆeÛHŒßÂeÛH‚ßÄeÛHŠßÀeÛH†_ÇeÛHŽ_ÃeÛH_ÅeÛH‰_ÁeÛH…_ÆeÛH_ÂeÛHƒ_ÄeÛH‹_ÀeÛH‡ŸÇeÛHŸÃeÛÈ€ŸÅeÛÈÈÎà²mdb§qÙ62³S¸lYØI\¶¬ì.ÛF6v—m#;;†Ë¶‘ƒÅeÛÈÉŽà²mäb‡qÙ6r³C¸lyØA\¶¼ì .ÛF>¶—m#?ۇ˶Q€íÅeÛ(Èöà²mb»qÙ6 +³]¸lEØN\¶¢l.ÛF1¶—m£8ۆ˶Q‚mÅe›ˆÎÝ‚{c°Rl3.ÛFi¶ —m£ ۈ˶Q–mÀeÛ(ÇÖã²m”gëpÙ6*°µ¸lÙ\¶Jl5.ÛFe¶ +—m£ +[‰Ë¶Q•­ÀeۨƖã²mTgËpÙ6j°¥¸l5Ù\¶Zl1.ÛFm¶èÿ-ÝcÌ-fÛnáÚ¶mÛ¶mû«m¾µmÛ¶mÛ¶mïq4»É™kŒ>ýµ:ÇÌ´]ͱ6ÖmæXëµ r¬õÛù9ÖÆí¼kcÃvnŽµ±Q;'ÇÚظcmlÒÎʱ66mgæX›µ3r¬ÿk§çX›·Ór¬-Ú©9ÖÆ–í”kc«vrŽµ±u;)ÇÚئ˜cmlÛNȱ6¶kÇçXÛ·ãr¬Ú±9ÖÆŽí˜kc§vtŽµ±s;*ÇÚØ¥™cmìڎȱ6vk‡çX»·Ãr¬=Ú¡9ÖÆžíkc¯vpŽÇhKµƒrWû´s¬}Û9ÖÆ~mÿkã–cmìßö˱6hûæX¶}r¬ƒÚÞ9ÖÆÁm¯kã¶gŽµqhÛ#ÇÚ8¬ížcmÞvËñ툶kŽµqdÛ%ÇÚ8ªíœcmÝvʱ6Ži;æXǶr¬ãÚö9ÖÆñm»kㄶmŽµqbÛ&ÇÚ8©mcmœÜ¶Ê±6Ni[æX§¶-r¬ÓÚæ9þ¯ 7ÇÚ8£m–cmœÙ6ͱ6Îj›äXg·s¬sÚF9ÖƹmÃk㼶AŽµq~[?ÇÚ¸ ­—cm\ØÖͱ6.jëäX·µs¬KÚZ9ÖÆ¥mÍk㲶FŽµqy[=Ç»·+Új9ÖÆ•mÕk㪶JŽµqu[9ÇKµ½ÛJ¹«kÛŠ9ÖÆum…kãú¶|ŽµqC[.ÇÚ¸±-›cmÜԖɱ6nnKçX·´¥r¬[Û’9ÖÆmm‰kãö¶xŽµqG[,ÇÚ¸³-šã#Ú]m‘kãî¶pŽµqO[(ÇÚ¸·-˜cmÜ×ȱ6îoóçX´ùr¬Û¼9ÖÆCmžkãá6wŽµñH›+ÇÚx´Í™cm<Öæȱ6o³çXO´Ùr|z{²Íšcm<Õfɱ6žn3çXÏ´™r¬gÛŒ9ÖÆsm†kãù6}ŽµñB›.ÇÚx±M›cm¼Ô¦É±6^nSçX¯´©r¬WÛ”9ÖÆkmŠkãõ6yŽµñF›,ÇÚx³Mšã+Ú[m’kãí6qŽµñN›(ÇÚx·M˜ã½Û5m‚ÜÕÆûmükãƒ6^Žµña7ÇÚø¨“cm|ÜÆα6>icåXŸ¶1s¬ÏÚ9ÖÆçmôkã‹6ZŽµñe5ÇÚøª’cm|ÝFÎñ]í›6RŽµñm1ÇÚø®cm|߆ϱ6~hÃåX?¶as¬ŸÚ09ÖÆÏmèkã—6TŽµñk2ÇÚø­ ‘cmüÞϱ6þhƒåX¶As¬¿Ú 9ÖÆßmàkãŸ6PŽµño0ÇÚ`´–cm ˜ÿûyßÿcm ”ÿ“cm œÿcm ’ÿ•cm šÿ™cm –ÿ‘cm žÿžcm ‘ÿ–cm ™ÿšcm •ÿ’cm ÿœcm “ÿ”cm ›ÿ˜ã·Úpù9ÖÆðù÷9ÖÆùw9Öƈù·9ÖÄ{í›ÜÕÆÈýüëkc”ü«kcÔüËkc´ü‹kcôüókcŒü³ÿ×FþiŽµ1VþIŽµ1vþqŽµ1NþQŽµ1nþaŽµ1^þAŽµ1~þ~Žµ1Aþ^Žµ1aþnŽµ1QþNŽµ1qþvŽµ1IþVŽµ1iþfŽµ1YþFŽµ1yþzŽµ1EþZŽµ1eþjŽµ1UþJŽµ1uþrŽµ1MþRŽµ1mþbŽµ1]þBŽµ1}þ|Žµ1Cþ\Žµ1cþlŽµ1S{&ÇÚ˜¹=cmÌҞʱ6fmOæX³µ'r¬ÙÛã9ÖÆí±kcÎöhŽµ1W{$ÇÚ˜»=œcmÌÓʱ6æmæXóµr¬ùÛý9ÖÆí¾kcÁvoŽµ±P»'ÇÚX¸ÝcMŒÔ½+wµ±h»3ÇÚX¬Ý‘cm,Þnϱ6–h·åXK¶[s¬¥Ú-9³-Ýnα6–i7åX˶s¬åÚ 9ÖÆòíúkc…v]Žµ±b»6ÇÚX©]“cm¬Ü®Î±6ViWåX«¶+s¬ÕÚ9ÖÆêíòkcvYŽµ±f»4ÇÚX«]’cm¬Ý.α6ÖiåXë¶ s¬õÚ9ÖÆúíükcƒv^Žµ±a;7ÇÚب“cmlÜÎα66igåX›¶3s¬ÍÚ9ÖÆÿµÓs¬ÍÛi9ÖÆíÔkcËvJŽµ±U;9ÇÚغ”cmlÓṈ6¶m'äXÛµãs¬íÛq9ÖÆíØkcÇvLŽµ±S;:ÇÚع•cmìÒŽÌñHm‘vDîjc·vxŽµ±{;,ÇÚØ£šcmìÙɱ6öjçX{·ƒr¬}Ú9Öƾí€kc¿¶Žµñ?˱6öoûåX´}s¬Û>9^©Ôöα6n{åX‡´=s¬CÛ9ÖÆam÷kãð¶[ŽµqDÛ5ÇÚ8²í’cmÕvα6Žn;åXÇ´s¬cÛ9ÖÆqmûkãø¶]ŽµqBÛ6ÇÚ8±m“cmœÔ¶Î±6Nn[åX§´-s¬SÛ9ÖÆimóÿ׆›cmœÑ6˱6Îl›æXgµMr¬³ÛÆ9ÖÆ9m£kãܶaŽµq^Û ÇÚ8¿­Ÿcm\ÐÖ˱6.lëæxÇvQ['ÇÚ¸¸­cm\ÒÖʱ6.mkæx‘¶k[#wµqy[=ÇÚ¸¢­–cm\ÙVͱ6®j«äXW·•s¬kÚJ9ÖƵmÅk㺶BŽµq}[>ÇÚ¸¡-—cmÜؖͱ6njËäX7·¥s|P»¥-•cmÜږ̱6nkKäX··Ås¬;Úb9ÖÆmÑk㮶HŽµqw[8ÇÚ¸§-”cmÜÛ̱6îk äX÷·ùs¬Ú|9ÖƃmÞkã¡6OŽµñp›;ÇÚx¤Í•cm<Úæ̱6ksäX·Ùs¬'Úl9>½=Ùfͱ6žj³äXO·™s¬gÚL9ÖƳmÆkã¹6CŽµñ|›>ÇÚx¡M—cm¼Ø¦Í±6^jÓäX/·©s|Q{¥M•cm¼Ú¦Ì±6^kSäX¯·És¼k»¬M–»Úx³Mšcm¼Õ&ɱ6ÞnçXï´‰r¬wÛ„9ÖÆ{m‚kãý6~ŽµñA/ÇÚø°›cm|ÔÆɱ6>ncçXŸ´±r¬OÛ˜9¾¥}ÖÆȱ6>o£çX_´Ñr¬/Û¨9ÖÆWm”kãë6rŽµñM)ÇÚø¶˜cm|×Fȱ6¾oÃçX?´ár¬Û°9ÖÆOm˜kãç6tŽµñK*ÇÚøµ ™cmüֆȱ6~oƒçX´Ár¬?Û 9ÖÆ_mkãï6pŽµñO(ÇÚø· ˜cm 0z˱6Ìÿý¬ïÿ±6Êÿɱ6Îÿα6Éÿʱ6Íÿ̱6Ëÿȱ6ÏÏñ+mˆü·kcÈü×kc¨ü—kcèüçkâöSîjcØ~þcŽµ1\þCŽµ1|þ}Žµ1Bþ]Žµ1bþmŽµ1RþMŽµ1rþuŽµ1JþUŽµ1jþeŽµ1ZþEŽµ1zþyŽµ1FþYŽÿk#ÿ4ÇÚ+ÿ$ÇÚ;ÿ8ÇÚ'ÿ(ÇÚ7ÿ0ÇÚ/ÿ ÇÚ??ÇÚ˜ /ÇÚ˜07ÇÚ˜('ÇÚ˜8;ÇÚ˜$+ÇÚ˜43ÇÚ˜,#ÇÚ˜<=ÇÚ˜"-ÇÚ˜25ÇÚ˜*%ÇÚ˜:9ÇÚ˜&)ÇÚ˜61ÇÚ˜.!ÇÚ˜>>ÇÚ˜!.ÇÚ˜16ÇÚ˜©=“cmÌܞα6fiOåX³¶'s¬ÙÚ9ÖÆìíñkcŽöXŽµ1g{4ÇÚ˜«=’cmÌÝα6æiåXó¶s¬‰aºä®6æo÷çX ´ûr¬Û½9ÖÆBížkcávwŽµ±H»+ÇÚX´Ý™cm,Öîȱ6o·çXK´Ûr¬%Û­9ÖÆRí–Ù–n7çXË´›r¬eÛ9ÖÆrí†kcùv}Žµ±B».ÇÚX±]›cm¬Ô®É±6VnWçX«´«r¬UÛ•9ÖÆjíŠkcõvyŽµ±F»,ÇÚX³]šcm¬Õ.ɱ6ÖnçXë´‹r¬uÛ…9ÖÆzí‚kcýv~Žµ±A;/ÇÚØ°›cmlÔÎɱ66ngçX›´³r¬MÛ™9ÖÆfíŒkãÿÚé9ÖÆæí´kc‹vjŽµ±e;%ÇÚتœcmlÝNʱ6¶i'æXÛ¶r¬íÚñ9¦Í׎Ë]mìЎͱ6vlÇäX;µ£s¬ÛQ9ÖÆ.íÈkc×vDŽµ±[;<ÇÚؽ–cmìÑͱ6öl‡äX{µƒs¬½ÛA9ÖÆ>íÀ/ÓömäXûµýs¬ÿYŽµ±Û/ÇÚ8 í›cmØöɱ6j{çX·½r¬CÚž9ÖÆ¡mkã°¶{ŽµqxÛ-ÇÚ8¢íšcmÙvɱ6Žj;çXG·r¬cÚŽ9ÖƱm‡k㸶}Žµq|Û.ÇÚ8¡m›cmœØ¶É±6Nj[çX'·­r¬SÚ–9ÖÆ©m‹kã´¶yŽÿkÃͱ6Îh›åXg¶Ms¬³Ú&9ÖÆÙmãoÝÎiåXç¶ s¬óÚ9ÖÆùmýÏ׶oëå®6.lëæXµur¬‹ÛÚ9ÖÆ%m­kãÒ¶fŽµqY[#ÇÚ¸¼­žcm\ÑV˱6®l«æXWµUr¬«ÛÊ9ÖÆ5m¥kãÚ¶bŽ÷m×µr¬ëÛò9ÖÆ m¹kãƶlŽµqS[&ÇÚ¸¹-cmÜҖʱ6nmKæX·µ%r¬ÛÛâ9ÖÆm±kãζhŽµqW[$ÇÚ¸»-œcmÜÓʱ6îm æX÷µr¬ûÛü9ÖÆm¾kãÁ6oŽµñP›'ÇÚx¸Ícm<Òæʱ6msæXµ9r¬ÇÛì9ÖÆm¶ŸÞžl³æXOµYr¬§ÛÌ9ÖÆ3m¦kãÙ6cŽÏiϵr¬çÛô9ÖÆ mºkãÅ6mŽ·o´irW/·©s¬WÚT9ÖÆ«mÊkãµ6EŽµñz›<ÇÚx£M–cm¼Ù&ͱ6Þj“äXo·‰s¬wÚD9ÖÆ»mÂkã½6AŽµñ~?Ç×µÚx9ÖƇmÜkã£6NŽµñq;ÇÚø¤•cm|ÚÆ̱6>kcäXŸ·Ñs¬/Úh9ÖÆ—mÔkã«6JŽµñu9ÇÚø¦”cm|ÛF̱6¾k#äXß·ás¬Úp9ÖÆmØkã§6LŽµñs:ÇÚø¥ •cmüچ̱6~kCäX¿·Ás¬?Ú`9ÖÆŸmÐkã¯6HŽµñw8ÇÚø§ ”cmüÛ̱6£åXæÿ~Ú÷ÿø¹6PþOŽµ1pþwŽµ1HþWŽµ1hþgŽ5ñRû#wµ1x?ÿ=ÇÚ"ÿ-ÇÚ2ÿ5ÇÚ*ÿ%ÇÚ:ÿ9ÇÚ&ÿ)ÇÚ6ÿ1ÇÚ.ÿ!ÇÚ>ÿ>ÇÚ!ÿ.ÇÚ1ÿ6ÇÚ)ÿ&ÇÚ9ÿ:ÇÚ%ÿ*ÇÚ5ÿ2ÇÚ-ÿ"ÇÚ=ÿ<ÇÚ#ÿ,Çÿµ‘šcmŒ•’cmŒœcmŒ“”cmŒ›˜cmŒ—cmŒŸ¿ŸcmL¿—cmL˜¿›cmL”¿“cmLœ¿cmL’¿•cmLš¿™cmL–¿‘cmLž¿žcmL‘¿–cmL™¿šcmL•¿’cmL¿œcmL“¿”cmL›¿˜cmL—¿cmLŸ?ŸcmÌ?—cm̘?›cmÌԞɱ6fnOçX³´§r¬YÛ“9ÖÆlí‰kcööxŽ51X÷±ÜÕÆœíÑkc®öHŽµ1w{8ÇÚ˜§=”cmÌÛ̱6ækäXó·ûs¬Ú}9ÖÆ‚íÞkc¡vOŽµ±p»;ÇÚX¤Ý•cm,Úî̱6kwäX‹·Ûs¬%Úm9ÖÆ’íÖkc©vKŽÇlK·›s¬eÚM9ÖƲíÆkc¹vCŽµ±|»>ÇÚX¡]—cm¬Ø®Í±6Vj×äX+·«s¬UÚU9ÖƪíÊkcµvEŽµ±z»<ÇÚX£]–cm¬Ù.ͱ6Öj—äXk·‹s¬uÚE9ÖƺíÂkc½vAŽµ±~;?ÇÚØ —cmlØÎͱ66jçäX·³s¬MÚY9ÖƦíÌkc³vFŽµñíôkcóvZŽµ±E;5ǃµ9Ú)¹«­ÚÉ9ÖÆÖí¤kc›vbŽµ±m;!ÇÚØ®Ÿcmlߎ˱6vhÇæX;¶cr¬ÚÑ9ÖÆÎí¨kc—vdŽµ±k;"ÇÚØ­žãÅÚîí°kcvhŽµ±g;$ÇÚØ«œcmìÝʱ6öiæXû¶r¬ýÚþ9ÖÆÿ,ÇÚØ¿í—cmÐöͱ6lûäXµ½s¬ƒÛ^9ÖÆ!mÏkãжGŽµqXÛ=ÇÚ8¼í–cmÑvͱ6Žl»äXGµs¬£ÛN9ÖÆ1mÇkãضCŽµq\Û>ÇÚ8¾m—cmœÐ¶Í±6NlÛäX'µ­s¬“ÛV9ÖÆ)mËkãÔ¶EŽ7k§µÍsü_nŽµqFÛ,ÇÚ8³mšã9Ú–m“ÜÕÆÙmãk㜶QŽµqnÛ0ÇÚ8¯mcmœßÖϱ6.hëåX¶us¬‹Ú:9ÖÆÅmíkã’¶VŽµqi[3ÇÚ¸¬­‘cm\ÞVÏñî튶ZŽµqe[5ÇÚ¸ª­’cm\ÝVα6®i+åX׶s¬ëÚ +9ÖÆõmùkㆶ\Žµqc[6ÇÚ¸©-“cmÜܖα6niKåX·¶%s¬ÛÚ9ÖÆímñk㎶XŽµqg[4ÇÚ¸«-’cmÜÝα6îi åX÷¶s¬ûÚ9ÖÆýmþkã6_Žµñ`›7ÇÚx¨Í“cm<Üæα6isåX¶9s¬ÇÚ9ÖÆãmöŸÖžh³åøôöd›5ÇÚxªÍ’cm<ÝfÎñ–í¬6SîjãÙ6cŽµñ\›!ÇÚx¾MŸcm¼Ð¦Ë±6^lÓæX/µir¬—ÛÔ9ÖÆ+mªkãÕ6eŽµñZ›"ÇÚx½Mžcm¼Ñ&˱6Þl“æøŠöV›$ÇÚx»Mœcm¼Ó&ʱ6ÞmæXïµ r¬÷Ûø9ÖÆm¼kãÃ6nŽµñQ'ÇÚø¸cm|ÒÆʱ6>mcæXŸµ1r¬ÏÛè9ÖÆm´kãË6jŽµñU%ÇÚøºœcm|ÓFʱ6¾m#æXßµr¬ïÛð9ÖÆm¸kãÇ6lŽµñS&ÇÚø¹ cmü҆ʱ6~mCæX¿µ!r¬ßÛà9ÖÆm°kãÏ6hŽŸhµAr¬¿ÛÀ9ÖÆ?m kãß6`ŽÏjÏ´rWŽÙ_óIßÿcm ”ÿ“cm œÿcm ’ÿ•cm šÿ™cm –ÿ‘cm žÿžcm ‘ÿ–cm ™ÿšcm •ÿ’cm ÿœcm “ÿ”cm ›ÿ˜ã·Úpù9ÖÆðù÷9ÖÆùw9Öƈù·9ÖÆHù79ÖÆÈù×9ÖÆ(ùW9Öƨù—9ÖÆhù9ÖÆèùç9ÖÆùg9þ¯üÓkc¬ü“kcìüãkcœü£kcÜüÃkc¼üƒkcüüýkc‚ü½kcÂüÝkc¢ükcâüíkc’ü­kcÒüÍkc²ükcòüõkcŠüµkcÊüÕkcªü•kcêüåkcšü¥kcÚüÅkcºü…kcúüùkc†ü¹kcÆüÙÿ×FþL>@W3·§s¬YÚS9ÖƬíÉkc¶öDŽµ1{{<ÇÚ˜£=–cmÌÙͱ6æjäXs·‡s¬yÚC9ÖƼíÁkc¾ö@Žµ1»?ÇÚX Ý—cm,Øîͱ6j÷äX ·»s¬EÚ]9ÖÆ¢íÎkc±vGŽµ±x»=ÇÚX¢Ý–cm,Ùnͱ6–j·äx̶t»9ÇÚX¦Ý”cm,Ûṉ6–k7äXË·ës¬Úu9ÖÆŠíÚkc¥vMŽµ±r»:ÇÚX¥]•cm¬Ú®Ì±6VkWäX«·Ës¬5Úe9ÖÆšíÒkc­vIŽµ±v»8ÇÚX§]”cm¬Û.̱6ÖkäXë·ós¬ Úy9ÖƆíÜkc£vNŽµ±q;;Ç´™ÚY¹«MÛ™9ÖÆfíŒkãÿÚé9ÖÆæí´kc‹vjŽµ±e;%ÇÚتœcmlÝNʱ6¶i'æXÛ¶r¬íÚñ9ÖÆöí¸kc‡vlŽh;¶cr¬ÚÑ9ÖÆÎí¨kc—vdŽµ±k;"ÇÚØ­žcmìÞ˱6öh‡æX{¶Cr¬½ÚÁ9ÖÆÞí kcŸv`Žµ±o; ÇÚدíŸcmüÏr¬ýÛ~9ÖÆmßkãÀ¶OŽµqPÛ;ÇÚ8¸í•cmÒö̱6m{äX‡µÝs¬ÃÛn9ÖÆm×kãȶKŽµqTÛ9ÇÚ8ºí”cmÓv̱6Žm;äXǵís¬ãÛv9ޠжͱ6NlÛäX'µ­s¬“ÛV9ž©mÒ¶Ì]mœÚ¶È±6Nk›çø¿6Ük㌶YŽµqfÛ4ÇÚ8«m’cmœÝ6α6ÎiåXç¶ s¬óÚ9ÖÆùmýkザ^Žµqa[7Ç;¶‹Ú:9ÖÆÅmíkã’¶VŽµqi[3ÇÚ¸¬­‘cm\ÞVϱ6®h«åXW¶Us¬«Ú*9ÖÆÕmåk㚶RŽµqm[1ÇÚ¸®­cm\ߖϱ6nhËåX7¶es¬›Ú29ÖÆÍmékã–¶TŽµqk[2ÇÚ¸­-‘cmÜÞϱ6îh‹åXw¶Es¬»Ú"9ÖÆÝmák㞶PŽµqo[0ÇÚ¸¯-cmÜßæϱ6hóåX¶ys|B{¨Í“cm<Üæα6isåX¶9s¼I;¥Í‘»Úx¼Ížcm<ÑfËñéíÉ6kŽµñT›%ÇÚxºÍœcm<Ófʱ6žm3æXϵr¬çÛô9ÖÆ mºkãÅ6mŽµñR›&ÇÚx¹Mã‹Ú+mªkãÕ6eŽµñZ›"ÇÚx½Mžcm¼Ñ&˱6Þl“æXoµIr¬·ÛÄ9ÖÆ;m¢kãÝ6aŽµñ^› ÇÚx¿Ÿcm|ÐÆ˱6>lãæXµqr¬ÛØ9ÖÆ'm¬kãÓ6fŽµñY#ÇÚø¼žcm|ÑF˱6¾l£æX_µQr¬¯ÛÈ9ÖÆ7m¤kãÛ6bŽµñ]!ÇÚø¾ ŸcmüІ˱6~lÃæX?µar¬ŸÛÐ9~¨ý҆ʱ6~mCæX¿µ!r¬ßÛà9>¥=ÖË]müÙͱ6þjƒäX·s¬Ú@9ÖÆ¿mÀkc€±ZŽµ1`þïÇ}ÿµ1PþOŽµ1pþwŽµ1HþWŽµ1hþgŽµ1XþGŽµ1xþ{Ž_iCä¿åXCæ¿æøµ6TþKŽµ1tþsŽµ1LþSŽµ1lþcŽµ1\þCŽµ1|þ}Žµ1Bþ]Žµ1bþmŽµ1RþMŽµ1rþuŽµ1JþUŽµ1jþeŽµ1ZþEŽµ1zþyŽµ1FþYŽÿk#ÿ4ÇÚ+ÿ$ÇÚ;ÿ8ÇÚ'ÿ(ÇÚ7ÿ0ÇÚ/ÿ ÇÚ??ÇÚ˜ /ÇÚ˜07ÇÚ˜('ÇÚ˜8;ÇÚ˜$+ÇÚ˜43ÇÚ˜,#ÇÚ˜<=ÇÚ˜"-ÇÚ˜25ÇÚ˜*%ÇÚ˜:9Çšø£½”»Ú˜¶Ÿ¿˜cmL—¿cmLŸ?ŸcmÌ?—cm̘?›cmÌԞɱ6fnOçX³´§r¬YÛ“9ÖÆlí‰kcööxŽµ1G{,ÇÚ˜³=šcmÌÕɱ6ænçXó´‡r¬yÛƒ9ÖÆ|íkcþvŽµ±@»/ÇÚX°Ý›cm,Ôîɱ6nwçX‹´»r¬EÛ9ÖÆbíŽkcñv{Žµ±D»-ÇÚX²Ýšcm,ÕnÉñ˜mévsŽµ±L»)ÇÚX¶Ý˜cm,×nȱ6–o×çX+´ër¬Ûµ9ÖÆJíškcåvuŽµ±J»*ÇÚXµ]™cm¬Ö®È±6Vo—çXk´Ër¬5Û¥9ÖÆZí’kcívqŽµ±N»(ÇÚX·]˜cMLÓ½ wµ±~;?ÇÚØ —cmlØÎͱ66jçäX·³s¬MÚY9ÖƦíÌkc³vFŽµñíôkcóvZŽµ±E;5ÇÚز’cmlÕNα6¶n'åXÛ´s¬mÛ 9ÖÆvíøkcûv\Žµ±C;6ÇÚر“cmìԎα6vnGåX»´#s¬]Û9ÖÆníðkc÷vXŽµ±G;4ÇÚس’cmìÕα6önåXû´s¬}Û9ÖÆ~mÿkã–cmìßö˱6hûæX¶}r¬ƒÚÞ9ÖÆÁm¯kã¶gŽµqhÛ#ÇÚ8¬ížcmÞv˱6Žh»æXG¶]r¬£ÚÎ9ÖÆÑm§k㘶cŽµqlÛ!ÇÓ´õÚö¹«ãÛv9ÖÆ mÛkãĶMŽµqRÛ:ÇÚ8¹m•cmœÒ¶Ì±6Nm[äX§µÍsü_nŽµqFÛ,ÇÚ8³mšcmœÕ6ɱ6ÎnçxëvNÛ(ÇÚ8·m˜cmœ×6ȱ6ÎoëçX´õr¬ Ûº9ÖÆEmkãâ¶vŽµqI[+ÇÚ¸´­™cm\ÖÖȱ6.o«çXW´Õr¬+Ûª9ÖÆUm•kãê¶rŽµqM[)ÇÚ¸¶­˜cm\×Vȱ6®oËçX7´år¬Û²9ÖÆMm™kãæ¶tŽµqK[*ÇÚ¸µ-™cmÜ֖ȱ6no‹çXw´År¬;Û¢9ÖÆ]m‘kãî¶pŽj÷´…r¬{Û‚9ÖÆ}mkãþ6Ž×kǵùrW¶ys¬‡Ú<9ÖÆÃmîkã‘6WŽµñh›3ÇÚx¬Í‘cm<Þfϱ6žh³åøôöd›5ÇÚxªÍ’cm<Ýfα6ži3åX϶s|N{®Ícm<ߦϱ6^hÓåX/¶is¬—Ú49ÖÆËmêkã•6UŽµñj›2ÇÚx­M‘cm¼Þ&ϱ6Þh“åXo¶Is¬·Ú$9ÖÆÛmâkã6QŽµñn›0ÇÚx¯Mcm¼ßÆϱ6>hãåX¶qs¬Ú89ÖÆÇmìkã“6VŽµñi3ÇÚø¬‘cm|ÞFÏñmí‹6ZŽµñe5ÇÚøª’cm|ÝFα6¾i#åX߶s|Oû®cm|߆ϱ6~hÃåX?¶as|\{  “»Úø¹ cmü҆ʱ6~mCæX¿µ!r¬ßÛà9ÖÆm°kãÏ6hŽµñW$ÇÚø» œcmüÓʱ6þmæXŒÝr¬ó?êûü\(ÿ'ÇÚ8ÿ;ÇÚ$ÿ+ÇÚ4ÿ3ÇÚ,ÿ#ÇÚ<ÿ=ÇÚ"ÿ-ÇÚ2ÿ5ÇÚ*ÿ%ÇÚ:ÿ9ÇÚ&ÿ)ÇÚ6ÿ1ÇÚ.ÿ!ÇÚ>ÿ>ÇÚ!ÿ.ÇÚ1ÿ6ÇÚ)ÿ&ÇÚ9ÿ:ÇÚ%ÿ*ÇÚ5ÿ2ÇÚ-ÿ"ÇÚ=ÿ<ÇÚ#ÿ,Çÿµ‘šcmŒ•’cmŒœcmŒ“”cmŒ›˜cmŒ—cmŒŸ¿ŸcmL¿—cmL˜¿›cmL”¿“cmLœ¿cmL’¿•cmLš¿™cMüÔÞÈ]mLÞÏ_ϱ6¦È_˱6¦Ì_ͱ6¦Ê_ɱ6¦Î_α6¦É_ʱ6¦Í_̱6¦Ë_ȱ6¦ÏŸÏ±6fȟ˱6f̟ͱ6fjÏäX3·§s¬YÚS9ÖƬíÉkc¶öDŽµ1{{<ÇÚ˜£=–cmÌÙͱ6æjäXs·‡s¬yÚC9ÖƼíÁkc¾ö@Žµ1»?ÇÚX Ý—cm,Øîͱ6j÷äX ·»s¬EÚ]9ÖÆ¢íÎkc±vGŽµ±x»=ÇÚX¢Ý–cm,Ùnͱ6–j·äx̶t»9ÇÚX¦Ý”cm,Ûṉ6–k7äXË·ës¬Úu9ÖÆŠíÚkc¥vMŽµ±r»:ÇÚX¥]•cm¬Ú®Ì±6VkWäX«·Ës¬‰Éº—å®6Öl—æXkµKr¬µÛÅ9ÖÆ:í¢kcÝvaŽµ±^» ÇÚX¿ŸcmlÐÎ˱66lçæXµsr¬ÛÙ9ÖÆ&í¬kcÓvfŽµ±Y;#ÇÚø¿vzŽµ±y;-ÇÚØ¢šcmlÙNɱ6¶j'çX[·“r¬mÚ‰9Öƶí„kc»v|Žµ±};.ÇÚØ¡›cmì؎ɱ6vjGçX;·£r¬]Ú‘9ÖÆ®íˆkc·vxŽµ±{;,ÇÚØ£šcmìÙɱ6öjçX{·ƒr¬}Ú9Öƾí€kc¿¶Žµñ?˱6öoûåX´}s¬Û>9ÖÆAmïkãà¶WŽµqHÛ3ÇÚ8´í‘cmÖvϱ6o»åx²¶FÛ5wµqdÛ%ÇÚ8ªíœcmÝvʱ6Ži;æXǶr¬ãÚö9ÖÆñm»kㄶmŽµqbÛ&ÇÚ8©mcmœÜ¶Ê±6Ni[æX§¶-r¼Y;­mžãÿÚps¬3Úf9ÖÆ™mÓk㬶IŽµqvÛ8ÇÚ8§m”cmœÛ6̱6ÎkäXç·õs¬ Úz9ÖÆ…mÝk㢶NŽµqq[;ÇÚ¸¤­•cm\ÚÖ̱6.kkäX—·Õs¬+Új9ÖÆ•mÕk㪶JŽµqu[9ÇÚ¸¦­”cm\ÛV̱6®k+äX×·ås¬Úr9ÖÆmÙk㦶LŽµqs[:ÇÚ¸¥-•cmÜÚ–Ìñ!í¶¶DŽµq{[<ÇÚ¸£-–cmÜÙÍñ툶Hîjãî¶pŽµqO[(ÇÚ¸·-˜cmÜ×ȱ6îoóçX´ùr¬Û¼9ÖÆCmžkãá6wŽµñH›+ÇÚx´Í™cm<Öæȱ6o³çø´öD›-ǧ·'Û¬9ÖÆSm–kãé6sŽµñL›)ÇÚx¶Í˜cm<×fȱ6žoÓçX/´ér¬Û´9ÖÆKmškãå6uŽµñJ›*ÇÚxµM™cm¼Ö¦È±6^o“çXo´Ér¬7Û¤9ÖÆ[m’kãí6qŽµñN›(ÇÚx·M˜cm¼×&ȱ6ÞoãçX´ñr¬Û¸9ÖÆGmœkãã6vŽµñI+ÇÚø´™cm|ÖÆȱ6>o£çø¶öE-ÇÚø²šcm|ÕFɱ6¾n#çøˆvW)wµñm1ÇÚø®cm|߆ϱ6~hÃåX?¶as¬ŸÚ09ÖÆÏmèkã—6TŽµñk2ÇÚø­ ‘cmüÞϱ6þhƒåX¶AsüDû« ’cmüÝα6þiåXÿ¶s¬Æi9ÖÆ€ù¿öý?ÖÆ@ù?9ÖÆÀùß9ÖÆ ù_9ÖÆ ùŸ9ÖÆ`ù9ÖÆàùï9ÖÆùo9ÖÆù¯9ÖÆPù/9ÖÆÐùÏ9ÖÆ0ùO9ÖÆ°ù9ÖÆpù9ÖÆðù÷9ÖÆùw9Öƈù·9ÖÆHù79ÖÆÈù×9ÖÆ(ùW9Öƨù—9ÖÆhù9ÖÆèùç9ÖÆùg9þ¯üÓkc¬ü“kcìüãkcœü£kcÜüÃkc¼üƒkcüüýkâ›ö^îjcÂ~þnŽµ1QþNŽµ1qþvŽµ1IþVŽµ1iþfŽµ1YþFŽµ1yþzŽµ1EþZŽµ1eþjŽµ1UþJŽµ1uþrŽµ1MþRŽµ1mþbŽµ1]þBŽµ1}þ|Žµ1Cþ\Žµ1cþlŽµ1S{&ÇÚ˜¹=cmÌҞʱ6fmOæX³µ'r¬ÙÛã9ÖÆí±kcÎöhŽµ1W{$ÇÚ˜»=œcmÌÓʱ6æmæXóµr¬ùÛý9ÖÆí¾kcÁvoŽµ±P»'ÇÚX¸Ýcm,Òîʱ6mwæX‹µ;r¬ÅÛí9ÖÆí¶kcÉvkŽµ±T»%Çc¶¥ÛÍ9ÖÆ2í¦kcÙvcŽµ±\»!ÇÚX¾]Ÿcm¬Ð®Ë±6Vl×æXt¯É]m¬Ü®Î±6ViWåX«¶+s¬ÕÚ9ÖÆêíòkcvYŽµ±f»4ÇÚX«]’cm¬Ý.α6ÖiåXë¶ s¬õÚ9ÖÆúíükcƒv^Žµ±a;7ÇÚب“cmlÜÎα66igåX›¶3s¬ÍÚ9ÖÆÿµÓs¬ÍÛi9ÖÆíÔkcËvJŽµ±U;9ÇÚغ”cmlÓṈ6¶m'äXÛµãs¬íÛq9ÖÆíØkcÇvLŽµ±S;:ÇÚع•cmìҎ̱6vmGäX»µÃs¬ÝÛa9ÖÆíÐkcÏvHŽµ±W;8ÇÚØ»”cmìÓ̱6ömäXûµýs¬ÿYŽµ±Û/ÇÚ8 í›cmØöÉñm¥¶wîjãà¶WŽµqHÛ3ÇÚ8´í‘cmÖvϱ6o»åXG´]s¬#Û.9ÖÆQmçkãè¶SŽµqLÛ1ÇÚ8¶ícm׶ϱ6ŽoÛåxƒvBÛ6ÇÚ8±m“cmœÔ¶Î±6Nn[åX§´-s¬SÛ9ÖÆimóÿ׆›cmœÑ6˱6Îl›æXgµMr¬³ÛÆ9ÖÆ9m£kãܶaŽµq^Û ÇÚ8¿­Ÿcm\ÐÖ˱6.lëæXµur¬‹ÛÚ9ÖÆ%m­kãÒ¶fŽµqY[#ÇÚ¸¼­žãÝÛmµkãʶjŽµqU[%ÇÚ¸º­œcm\ÓVʱ6®m+æX×µr¬ëÛò9þ_»¡-—cmÜؖͱ6njËäX7·¥s¼R;¨-•»Ú¸µ-™cmÜ֖ȱ6no‹çXw´År¬;Û¢9ÖÆ]m‘kãî¶pŽµqO[(ÇÚ¸·-˜cmÜ×ȱ6îoóçX´ùr¬Û¼9>¡=Ôæɱ6nsçX´¹r¬GÛœ9ÖÆcmŽkãñ6{ŽµñD›-ǧ·'Û¬9ÖÆSm–kãé6sŽµñL›)ÇÚx¶Í˜cm<×fȱ6žoÓçX/´ér¬Û´9ÖÆKmškãå6uŽµñJ›*ÇÚxµM™cm¼Ö¦È±6^o“çXo´Ér¬7Û¤9ÖÆ[m’kãí6qŽµñN›(ÇÚx·M˜cm¼×&ȱ6ÞoãçX´ñr¬Û¸9¾¡}ÔÆɱ6>ncçXŸ´±r¬OÛ˜9>¨ÝÒÆÈ]m|ÞFϱ6¾h£åX_¶Qs¬¯Ú(9ÖÆ×mäkã›6RŽµñm1ÇÚø®cm|߆ϱ6~hÃåX?¶as¬ŸÚ09ÖÆÏmè?Ô~iCåX¿¶!s¬ßÚ9ÖÆïmðkã6XŽµñg4ÇÚø« ’cmüÝα6þiåXÿ¶s¬Æm9ÖÆ€ù¿ôý?ÖÆ@ù?9ÖÆÀùß9ÖÆ ù_9ÖÆ ùŸ9ÖÆ`ù9ÖÆàùï9ÖÆùo9ÖÆù¯9ÖÆPù/9ÖÆÐùÏ9ÖÆ0ùO9ÖÆ°ù9ÖÆpù9ÖÆðù÷9ÖÆùw9Öƈù·9ÖÆHù79ÖÆÈù×9ÖÆ(ùW9Öƨù—9ÖÆhù9ÖÆèùç9ÖÆùg9þ¯üÓkâ³öI>`›üñqÇþÑ=ǾÆsÜ/å ÷Ë< Çãu9¿Ëñ]Ž'ìr†Œ3aÊŒ9w,X²bÍ=¶<°ã‘'ö8râÌ…+ϼðÊÀ×Oa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹øú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7oÖOa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹é'Hˆ0¢Äˆ“ IŠ4²äÈS H‰2ªÔ¨Ó I‹6ºôè3`Ȉ1¦Ì˜sÇ‚%+ÖܳaË;ybÏ#'Î\¸òÌ ¯Üü3ú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7R?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐ¥GŸCFŒ™0eÆœ;,Y±æž [ØñÈ{9qæ•g^xåFà-ú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7aý &B”q$I‘&C–y +)Q¦B•u4iѦC—} 1f”sîX°dÅš{6ly`Ç#Oì9päÄ™ Wžyá•V?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐ¥GŸCFŒ™0eÆœ;,Y±æž [ØñÈ{9qæ•g^xåFàOé'Hˆ0¢Äˆ“ IŠ4²äÈS H‰2ªÔ¨Ó I‹6ºôè3`Ȉ1¦Ì˜sÇ‚%+ÖܳaË;ybÏ#'Î\¸òÌ ¯Ü¼U?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐ¥GŸCFŒ™0eÆœ;,Y±æž [ØñÈ{9qæ•g^xåF ¢Ÿ !ÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-Útèңπ!#ÆL˜2cÎ –¬Xsφ-ìxä‰=Žœ8sáÊ3/¼r#ðÏé'Hˆ0¢Äˆ“ IŠ4²äÈS H‰2ªÔ¨Ó I‹6ºôè3`Ȉ1¦Ì˜sÇ‚%+ÖܳaË;ybÏ#'Î\¸òÌ ¯Üüiý &B”q$I‘&C–y +)Q¦B•u4iѦC—} 1f”sîX°dÅš{6ly`Ç#Oì9päÄ™ Wžyá•·é'Hˆ0¢Äˆ“ IŠ4²äÈS H‰2ªÔ¨Ó I‹6ºôè3`Ȉ1¦Ì˜sÇ‚%+ÖܳaË;ybÏ#'Î\¸òÌ ¯ÜDõ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]zô0dĘ Sf̹cÁ’kîÙ°å<±çÀ‘g.\yæ…Wnþyý &B”q$I‘&C–y +)Q¦B•u4iѦC—} 1f”sîX°dÅš{6ly`Ç#Oì9päÄ™ Wžyá•?£Ÿ !ÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-Útèңπ!#ÆL˜2cÎ –¬Xsφ-ìxä‰=Žœ8sáÊ3/¼r#ðvý &B”q$I‘&C–y +)Q¦B•u4iѦC—} 1f”sîX°dÅš{6ly`Ç#Oì9päÄ™ Wžyᕘ~‚„!JŒ8 ’¤H“!KŽ<Š”(S¡J: š´hÓ¡K>†Œ3aÊŒ9w,X²bÍ=¶<°ã‘'ö8râÌ…+ϼðÊÀ¿ Ÿ !ÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-Útèңπ!#ÆL˜2cÎ –¬Xsφ-ìxä‰=Žœ8sáÊ3/¼r#ðgõ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]zô0dĘ Sf̹cÁ’kîÙ°å<±çÀ‘g.\yæ…WnÞ¡Ÿ !ÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-Útèңπ!#ÆL˜2cÎ –¬Xsφ-ìxä‰=Žœ8sáÊ3/¼r#×Oa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹øsú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7^?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐ¥GŸCFŒ™0eÆœ;,Y±æž [ØñÈ{9qæ•g^xåFàú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7 ý &B”q$I‘&C–y +)Q¦B•u4iѦC—} 1f”sîX°dÅš{6ly`Ç#Oì9päÄ™ Wžyá•Q?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐ¥GŸCFŒ™0eÆœ;,Y±æž [ØñÈ{9qæ•g^xåFà/è'Hˆ0¢Äˆ“ IŠ4²äÈS H‰2ªÔ¨Ó I‹6ºôè3`Ȉ1¦Ì˜sÇ‚%+ÖܳaË;ybÏ#'Î\¸òÌ ¯Ü¼K?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐ¥GŸCFŒ™0eÆœ;,Y±æž [ØñÈ{9qæ•g^xåF ©Ÿ !ÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-Útèңπ!#ÆL˜2cÎ –¬Xsφ-ìxä‰=Žœ8sáÊ3/¼r#ðõ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]zô0dĘ Sf̹cÁ’kîÙ°å<±çÀ‘g.\yæ…Wnþ’~‚„!JŒ8 ’¤H“!KŽ<Š”(S¡J: š´hÓ¡K>†Œ3aÊŒ9w,X²bÍ=¶<°ã‘'ö8râÌ…+ϼðÊÀ»õ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]zô0dĘ Sf̹cÁ’kîÙ°å<±çÀ‘g.\yæ…WnRú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7ÿ’~‚„!JŒ8 ’¤H“!KŽ<Š”(S¡J: š´hÓ¡K>†Œ3aÊŒ9w,X²bÍ=¶<°ã‘'ö8râÌ…+ϼðÊÀ_ÖOa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹x~‚„!JŒ8 ’¤H“!KŽ<Š”(S¡J: š´hÓ¡K>†Œ3aÊŒ9w,X²bÍ=¶<°ã‘'ö8râÌ…+ϼðÊ@Z?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐ¥GŸCFŒ™0eÆœ;,Y±æž [ØñÈ{9qæ•g^xåFà_ÖOa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹ø+ú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7ïÕOa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹Èè'Hˆ0¢Äˆ“ IŠ4²äÈS H‰2ªÔ¨Ó I‹6ºôè3`Ȉ1¦Ì˜sÇ‚%+ÖܳaË;ybÏ#'Î\¸òÌ ¯Üü+ú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7U?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐ¥GŸCFŒ™0eÆœ;,Y±æž [ØñÈ{9qæ•g^xåFà}ú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7Yý &B”q$I‘&C–y +)Q¦B•u4iѦC—} 1f”sîX°dÅš{6ly`Ç#Oì9päÄ™ Wžyá•U?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐ¥GŸCFŒ™0eÆœ;,Y±æž [ØñÈ{9qæ•g^xåFà_ÓOa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹x¿~‚„!JŒ8 ’¤H“!KŽ<Š”(S¡J: š´hÓ¡K>†Œ3aÊŒ9w,X²bÍ=¶<°ã‘'ö8râÌ…+ϼðÊ@N?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐ¥GŸCFŒ™0eÆœ;,Y±æž [ØñÈ{9qæ•g^xåFà_×Oa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹økú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7ÐOa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹Èë'Hˆ0¢Äˆ“ IŠ4²äÈS H‰2ªÔ¨Ó I‹6ºôè3`Ȉ1¦Ì˜sÇ‚%+ÖܳaË;ybÏ#'Î\¸òÌ ¯Üüuý &B”q$I‘&C–y +)Q¦B•u4iѦC—} 1f”sîX°dÅš{6ly`Ç#Oì9päÄ™ Wžyá•¿¡Ÿ !ÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-Útèңπ!#ÆL˜2cÎ –¬Xsφ-ìxä‰=Žœ8sáÊ3/¼r#ðAý &B”q$I‘&C–y +)Q¦B•u4iѦC—} 1f”sîX°dÅš{6ly`Ç#Oì9päÄ™ Wžyá•‚~‚„!JŒ8 ’¤H“!KŽ<Š”(S¡J: š´hÓ¡K>†Œ3aÊŒ9w,X²bÍ=¶<°ã‘'ö8râÌ…+ϼðÊÀ¿¡Ÿ !ÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-Útèңπ!#ÆL˜2cÎ –¬Xsφ-ìxä‰=Žœ8sáÊ3/¼r#ð7õ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]zô0dĘ Sf̹cÁ’kîÙ°å<±çÀ‘g.\yæ…Wn>¤Ÿ !ÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-Útèңπ!#ÆL˜2cÎ –¬Xsφ-ìxä‰=Žœ8sáÊ3/¼r#PÔOa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹ø7õ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]zô0dĘ Sf̹cÁ’kîÙ°å<±çÀ‘g.\yæ…Wnþ–~‚„!JŒ8 ’¤H“!KŽ<Š”(S¡J: š´hÓ¡K>†Œ3aÊŒ9w,X²bÍ=¶<°ã‘'ö8râÌ…+ϼðÊÀ‡õ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]zô0dĘ Sf̹cÁ’kîÙ°å<±çÀ‘g.\yæ…WnJú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7ÿ–~‚„!JŒ8 ’¤H“!KŽ<Š”(S¡J: š´hÓ¡K>†Œ3aÊŒ9w,X²bÍ=¶<°ã‘'ö8râÌ…+ϼðÊÀßÖOa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹øˆ~‚„!JŒ8 ’¤H“!KŽ<Š”(S¡J: š´hÓ¡K>†Œ3aÊŒ9w,X²bÍ=¶<°ã‘'ö8râÌ…+ϼðÊ@Y?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐ¥GŸCFŒ™0eÆœ;,Y±æž [ØñÈ{9qæ•g^xåFàßÖOa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹ø;ú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7ÕOa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹¨è'Hˆ0¢Äˆ“ IŠ4²äÈS H‰2ªÔ¨Ó I‹6ºôè3`Ȉ1¦Ì˜sÇ‚%+ÖܳaË;ybÏ#'Î\¸òÌ ¯Üü;ú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7W?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐ¥GŸCFŒ™0eÆœ;,Y±æž [ØñÈ{9qæ•g^xåFàcú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7Uý &B”q$I‘&C–y +)Q¦B•u4iѦC—} 1f”sîX°dÅš{6ly`Ç#Oì9päÄ™ Wžyá•¿§Ÿ !ÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-Útèңπ!#ÆL˜2cÎ –¬Xsφ-ìxä‰=Žœ8sáÊ3/¼r#ð÷õ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]zô0dĘ Sf̹cÁ’kîÙ°å<±çÀ‘g.\yæ…Wn>®Ÿ !ÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-Útèңπ!#ÆL˜2cÎ –¬Xsφ-ìxä‰=Žœ8sáÊ3/¼r#PÓOa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹øwõ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]zô0dĘ Sf̹cÁ’kîÙ°å<±çÀ‘g.\yæ…Wnþ~‚„!JŒ8 ’¤H“!KŽ<Š”(S¡J: š´hÓ¡K>†Œ3aÊŒ9w,X²bÍ=¶<°ã‘'ö8râÌ…+ϼðÊÀ'ô$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]zô0dĘ Sf̹cÁ’kîÙ°å<±çÀ‘g.\yæ…Wnêú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.=ú 2bÌ„)3æܱ`ÉŠ5÷lØòÀŽGžØsàȉ3®<óÂ+7ÿP?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐ¥GŸCFŒ™0eÆœ;,Y±æž [ØñÈ{9qæ•g^xåFàé'Hˆ0¢Äˆ“ IŠ4²äÈS H‰2ªÔ¨Ó I‹6ºôè3`Ȉ1¦Ì˜sÇ‚%+ÖܳaË;ybÏ#'Î\¸òÌ ¯Ü|R?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐ¥GŸCFŒ™0eÆœ;,Y±æž [ØñÈ{9qæ•g^xåF ¡Ÿ !ÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-Útèңπ!#ÆL˜2cÎ –¬Xsφ-ìxä‰=Žœ8sáÊ3/¼r#ðïé'Hˆ0¢Äˆ“ IŠ4²äÈS H‰2ªÔ¨Ó I‹6ºôè3`Ȉ1¦Ì˜sÇ‚%+ÖܳaË;ybÏ#'Î\¸òÌ ¯Üücý &B”q$I‘&C–y +)Q¦B•u4iѦC—} 1f”sîX°dÅš{6ly`Ç#Oì9päÄ™ Wžyá•Oé'Hˆ0¢Äˆ“ IŠ4²äÈS H‰2ªÔ¨Ó I‹6ºôè3`Ȉ1¦Ì˜sÇ‚%+ÖܳaË;ybÏ#'Î\¸òÌ ¯Ü4õ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]zô0dĘ Sf̹cÁ’kîÙ°å<±çÀ‘g.\yæ…Wnþ}ý &B”q$I‘&C–y +)Q¦B•u4iѦC—} 1f”sîX°dÅš{6ly`Ç#Oì9päÄ™ Wžyá•¢Ÿ !ÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-Útèңπ!#ÆL˜2cÎ –¬Xsφ-ìxä‰=Žœ8sáÊ3/¼r#ðiý &B”q$I‘&C–y +)Q¦B•u4iѦC—} 1f”sîX°dÅš{6ly`Ç#Oì9päÄ™ Wžyá•–~‚„!JŒ8 ’¤H“!KŽ<Š”(S¡J: š´hÓ¡K>†Œ3aÊŒ9w,X²bÍ=¶<°ã‘'ö8râÌ…+ϼðÊÀ Ÿ !ÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-Útèңπ!#ÆL˜2cÎ –¬Xsφ-ìxä‰=Žœ8sáÊ3/¼r#ðOõ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]zô0dĘ Sf̹cÁ’kîÙ°å<±çÀ‘g.\yæ…Wn>£Ÿ !ÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-Útèңπ!#ÆL˜2cÎ –¬Xsφ-ìxä‰=Žœ8sáÊ3/¼r#ÐÖOa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:téÑgÀc&L™1çŽKV¬¹gÖv<òÄžGNœ¹på™^¹øõ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]zô0dĘ Sfü¡7¼á oäxoæ-¼•·ñvÞÁ;yïæ=¼—÷ñ~>Àùæ#|”ñq|½ÁS𠮃op$¼ÁX¼á³|ŽÏó¾È—ø2_á«|¯ó ¾É·ø6ßá»|ïóþo~Äù ?ågüœ_ðK~ůù ¿åwüž7¾Q?oâͼ…·ò6ÞÎ;x'ïâݼ‡÷ò>ÞÏø âÃ|„ò1>Î'ø$ŸâÓ|†Ïò9>Ïø"_â¿æ+|•¯ñu¾Á7ùßæ;|—ïñ}~Àù?æ'ü”Ÿñs~Á/ù¿æ7ü–ßñ{ÞÐÏ›x3oá­¼·óÞÉ»x7ïá½¼÷ó>ȇø0áïñ1>Î'ø$ŸâÓ|†Ïò9>Ïø"_âË|…¯ò5¾Î7ø&ßâÛ|‡ïò=¾Ïø!?âÇü„Ÿò3~Î/ø%¿â×ü†ßò;~Ïm‚?àM¼™·ðVÞƟ㼓wñnÞÃ{yïç|ña>ÂGùç|’Oñi>ÃgùŸç |‘/ñe¾ÂWù_ç|“oñm¾Ãwùßçüñc~ÂOù?çü¿üŠ_ó~Ëïø=oüÃúyoæ-¼•·ñvÞÁ;yïæ=¼—÷ñ~>Àùæ#|”ñq>Á'ùŸæ3|–Ïñy¾Àù_æ+|•¯ñu¾Á7ùÿ+ßá»|ïó~Èø1?á§üŒŸó ~ɯø5¿á·üŽßóÆ?ÐÏ›x3oá­¼·óÞÉ»x7ïá½¼÷ó>ȇø0á£|Œó >ɧø4Ÿá?ás|ž/ðE¾Ä—ù +_åk|oðM¾Å·ùßå{|ŸðC~Äù ?ågüœ_ðK~ůù ¿åwüž7þý¼‰7óÞÊÛx;ï་wóÞËûøë|€ò!>ÌGø(ãã|‚Oò)>Ígø,Ÿãó|/ò%¾ÌWø*_ãë|ƒoò-¾Íwø.ßãûü€ò#~ÌOø)?ãçü‚_ò+~Íoø-¿ã÷¼ñ¾á œ7ñfÞÂ[yo缓wñnÞÃ{yïç|ña>ÂGùç|’Oñi>ÃgùŸç |‘/ñe¾ÂWù_ç|“oñm¾Ãwùßçüñÿð~ÊÏø9¿à—üŠ_ó~Ëïø=oücÖŸ7ñfÞÂ[yo缓wñnÞÃ{yïç|ña>ÂGùç|’Oñi>ÃgùŸç |‘/ñe¾ÂÇ×ø:ßà›|‹oó¾Ë÷ø>?à‡üˆó~ÊÏø9¿à—üŠ_ó~Ëïø=o|“~ÞÄ›y oåm¼wðNÞÅ»yïå}¼ŸðA>ćùåcüC>Á'ùŸæ3|–Ïñy¾Àù_æ+|•¯ñu¾Á7ùßæ;|—ïñ}~Àù?æ'ü”Ÿñs~Á/ù¿æ7ü–ßñ{ÞÔÏ›x3oá­¼·óþ"ïâݼ‡÷ò>ÞÏø âÃ|„ò1>Î'ø$ŸâÓ|†Ïò9>Ïø"_âË|…¯ò5¾Î7ø&ßâÛ|‡ïò=¾Ïø!?âÇü„Ÿò3~Î/ø%¿âÿã7ü–ßñ{ÞøÇõó&ÞÌ[x+oãí¼ƒwò.ÞÍ{x/ïãý|€ò!>ÌGø(ãã|‚Oò)>Ígø,Ÿãó|/þÿ Ùñë |çeì$å•íìò–u¶¼²]Þ²;oYÙòÊvvyË:[^ÙÎ.oYgË@Ö—°!$Ã@–„ !F²,lIÙ0’e!KÂÆ’a K† YRÏÏðú¼ü0`Ȉ1¦Ì˜³`ÉŠ_cÖ{9ñÍ™ WnÜyðäÅ›¿V?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐåçéÑgÀc&L™1gÁ’k6lÙ±çÀ‘ßœ¹påÆO^¼ùé'Hˆ0¢Äˆ“ IŠ4²äÈó)Q¦B•u4iѦC—/zô0dĘ SfÌY°dÅš [vì9päÄ7g.\¹qçÁ“o>~¿~‚ü a"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:tù¢GŸCFŒ™0eÆœKV¬Ù°eÇžGNüg.\¹qçÁ“o>þ:ý &B”q$I‘&C–y +)Q¦B•u4iѦC—/zô0dĘ ¿ÌŒ9 –¬X³aËŽ=ŽœøæÌ…+73aÊŒ9 –¬X³á×Ù±çÀ‘ßœ¹påÆO^¼ùøAý &B”q$I‘&C–y +)Q¦B•u4iѦC—/zü†Œ3aÊŒ9 –¬X³aËŽ=ŽœøæÌ…+73aÊŒ9 –¬X³aËŽ=ŽœøæÌ…+73aÊŒ9 ~•k6lÙ±çÀ‘ßœ¹påÆO^¼ùø[ô$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›Ÿ£Ë=ú 2bÌ„)3æ,X²b͆-;ö8râ›3®Ü¸óàÉ‹7«~‚„!JŒ8 ’¤H“!Ë“§@‘e*T©Q§A“m:tù¢GŸCFŒ™0eÆœKV¬Ù°eÇžGN|sæ•w’ú "L„(1â$H’"M†,9ò(R¢L…*5êü MZ´éÐå‹} 1f”s,Y±fÖ{9ñÍ™ WnÜyðäÅ›¿K?AB„‰%FœI~”4²äÈS H‰2ªÔ¨Ó I‹6º|ѣπ!#ÆL˜2c΂%+ÖlزcÏ#'¾9sáÊ;žüo>~D?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐå‹} 1f”s,Y±fï³cÏ#'¾9sáÊ;ž¼xó!ðGõ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]¾èñ 2bÌ„)3æ,X²b͆-;ö8râ›3®Ü¸óàÉ‹7)ý &B”q$I‘&C–y +ùIÊT¨R£Nƒ&-ÚtèòE>†Œ3aÊŒ9 –¬X³aËŽ=ŽœøæÌ…+7îÒú "L„(1â$H’"Í‘%GžEJ”©P¥FMZ´éÐå‹} 1f”s,Y±fÖ{9ñÍ™ WnÜyðäÅ›ß÷Çõó &B”q$I‘&C–y +)Q¦B•u4iѦC—/zô0dĘ SfÌY°dÅš [vüŽœøæÌ…+7îþ^ý &B”q$I‘&C–y +)Q槨R£Nƒ&-ÚtèòE>†Œ3aÊŒ9 –¬X³aËŽ=ŽœøæÌ…+7îþ>ý &B”q$I‘&C–y +)Q¦B•u4iѦC—/zô0dĘ SfÌYð«¬X³aËŽ=ŽœøæÌ…+73aÊŒ9 –¬X³aËŽ=ŽœøæÌ…+73aÊŒ9 –¬X³aËŽ=~“ßœ¹påÆO^¼ùøSö'Hˆ0¢Äˆ“ IŠ4²äÈS H‰2ªÔ¨Ó I‹6º|ѣπ!#~‰ SfÌY°dÅš [vì9päÄ7g.\¹qçÁ“o>~L?AB„‰%FœIR¤É%GžEJ”©P姩ӠI‹6º|ѣπ!#ÆL˜2c΂%+ÖlزcÏ#'¾9sáÊ;ž¼xó!ð÷ë'Hˆ0¢Äˆó#$I‘&C–y +)Q¦B•u4iѦC—/zô0dĘ SfÌY°dÅš [vì9päÄ7g.\¹qçwyòâ͇@N?AB„‰%FœIR¤É%GžEJ”©P¥FMZ´éÐå‹} 1f”s,YñklزcÏ#'¾9sáÊ;ž¼xó!ðè'Hˆ0¢Äˆ“ IŠ4²äÈS H‰2ªÔ¨Ó I‹6ºü<=ú 2bÌ„)3æ,X²b͆-;ö8râ›3®Ü¸óàÉ‹7ÿ ~‚„!JŒ8 ’¤H“!KŽ~\?AB„‰%FœI~”4²äÈS H‰2ªÔ¨Ó I‹6º|ѣπ!#ÆL˜2c΂%+ÖlزcÏ#'¾9sáÊ;žüo>þý &B”q$I‘&C–y +)Q¦B•u4iѦC—/zô0dĘ SfÌY°dÅš ¿ÎŽ=ŽœøæÌ…+7ø%&L™1gÁ’k6lÙ±çÀ‘ßœ¹påÆO^¼ùø§ô$D˜QbÄI$Eš Yrä)P¤D™ +U~š: š´hÓ¡Ë=ú 2bÌ„)3æ,X²b͆-;ö8râ›3®Ü¸óàÉ‹7ý &B”q~„$)ÒdÈ’#O"%ÊT¨R£Nƒ&-ÚtèòE>†Œ3aÊŒ9 –¬X³aËŽ=ŽœøæÌ…+7îü.O^¼ùø§õ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]¾èÑgÀc&L™1gÁ’¿Æ†-;ö8râ›3®Ü¸óàÉ‹7ÿŒ~‚„!JŒ8 ’¤H“!KŽ<Š”(S¡J: š´hÓ¡ËÏӣπ!#ÆL˜2c΂%+ÖlزcÏ#'¾9sáÊ;ž¼xó!ðçõ$D˜QbÄI$Eš Yräù Š”(S¡J: š´hÓ¡Ë=ú 2bÌ„)3æ,X²b͆-;ö8râ›3®Ü¸óàÉ‹7UýùAÂDˆ#N‚$)ÒdÈ’#O"%ÊT¨R£Nƒ&-ÚtèòE>†Œ3aÊŒ9 –¬X³aËŽ=Žœø-Î\¸rã΃'/Þ|ü³ú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡._ôè3`Ȉ1~™s,Y±fÖ{9ñÍ™ WnÜyðäÅ›ŸÒOa"D‰'A’i2dÉ‘§@‘e*T©QçghÒ¢M‡._ôè3`Ȉ1¦Ì˜³`ÉŠ5¶ìØsàȉoÎ\¸rã΃'/Þ|üsú "L„(1â$Hò£¤É%GžEJ”©P¥FMZ´éÐå‹} 1f”s,Y±fÖ{9ñÍ™ WnÜyðä÷xó!PÓOa"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:tù¢GŸCFŒ™0eÆœKV¬ÙðëìØsàȉoÎ\¸rã΃'/Þ|üý &B”q$I‘&C–y +)Q¦B•u4iѦC—/zü†Œ3aÊŒ9 –¬X³aËŽ=ŽœøæÌ…+73aÊŒ_aÁ’k6lÙ±çÀ‘ßœ¹påÆO^¼ùøõ$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiÐägiÓ¡Ë=ú 2bÌ„)3æ,X²b͆-;ö8râ›3®Ü¸óàÉ‹7?­Ÿ !ÂDˆ#N‚$)ÒüYrä)P¤D™ +UjÔiФE›]¾èÑgÀc&L™1gÁ’k6lÙ±çÀ‘ßœ¹påÆO^¼ù}Q??@a"D‰'A’i2dÉ‘§@‘e*T©Q§A“m:tù¢GŸCFŒ™0eÆœKV¬Ù°eÇopàȉoÎ\¸rã΃'/Þ|4ô$D˜QbÄI$Eš Yrä)P¤D™ +UjÔiФE›]¾èÑgÀ/2bÌ„)3æ,X²b͆-;ö8râ›3®Ü¸óàÉ‹7ÿ’~‚„!JŒ8 ’¤H“!KŽ<Š”(óST©Q§A“m:tù¢GŸCFŒ™0eÆœKV¬Ù°eÇžGN|sæ•w†Œ3aÊŒ9 ~•k6lÙ±çÀ‘ßœ¹påÆO^¼ùhê'Hˆ0¢Äˆ“ IŠ4²äÈS H‰2ªÔ¨Ó I‹6?G—/zô0dĘ SfÌY°dÅš [vì9päÄ7g.\¹qçÁ“o>þ²~‚„!JŒ8 ’¤H“!Ë“§@‘e*T©Q§A“m:tù¢GŸCFŒ™0eÆœKV¬Ù°eÇžGN|sæ•w†Œ3aÊŒ9 –¬ø56lÙ±çÀ‘ßœ¹påÆO^¼ùø+ú "L„(1â$H’"M†,9ò(R¢L…*5ê4hÒ¢M‡.?O>†Œ3aÊŒ9 –¬X³aËŽ=ŽœøæÌ…+7î,â{ïoÿsrž³Îç³öšÙ3³Ÿ½ÏN–ù[ûϾ~¯û.?àŠgú|še òQW<30È1¾xò…ÙV^>úÂìyáä‚ß>aó•—9˜0õÎ?1•³WqT~±ýó[ëÃއǃ_OŸ´í=Á‘Ï«·~éÚ§ÂíNíæoæäÅü™ƒ¼}~ô•Ö:Tç·O[9{y¥öÁgoŠ,1þùÆÜÇ ßÚÞã¥^5>ùÚë­u.†>?1\÷ûŸèUœì SC>8åÐçï ù˜?{‘3Ç翽gÈ¿žýÔÍV®¼qÀ/G]1Þäüê…ÑVÎ^ÅAÞìuE´ŸcþÕOoñKò*òrý=¶ÝÐAƒ[w;Òú»Ÿwrö*òvïxþ ŽÛO½pG_ ?#¯â wó?$<Îœèø¦¼Šƒ¼Ø+>¿€Ó¬ø‡­õw󼊃<^‚Îwunèø¬¼Šƒ<%>~zŽ›§µþìUäÕÓññüúѧƄ|ä y9¯?¶o~A||Ÿ½ŠƒÜ=¾¢ë +ÏÿÙSc¬íË^ÅAží}ÅÃu ¿øÕ Ñy yNÞ§¤ù7?¾¢ëð•—9ðÎÝÂu ßñ¢òü©øúJqW/Ï?’ºo9wßw_í°xÿozëÆãGåà—ï>úë¸ÊÞ‡çƒy–Þ®{S^æ(/ø<9{Gå˜gþ´þ˜'Ï_yÕ<‘7¯\{G¸ÿƒÃ|åUäÅïc>8Õ°ç'ZÇ ö*ò|Òô[L΀çn ï—ò*òæî÷gZüü¨QÑu£_7ò*òìѵnµøåûóßoåìUŸó‚öŽõñyóg¯â o÷‰¯ÀÉ&Ù×oìU•ƒßŽk²Ö‡½Šƒ¼Ø×>?fOÇÇyåUäÙ‹£¯´æY +>{yóG›_ÝgŸßÙ«8>ßü’“¬ëÏ–®±>ìUœ¦w>ªî1Æâ×;Æç/ðÙ«8ðªí[kŸ¶¶ {yîöŸnrÁ­û<Âm_+g¯â Ï®)gZçÙlÅŧZëV‘Wqsï„œ{$wÿ:÷‹½j9­¿ÏŠ×_yýx⤼å7¶™ÎßsÈ›â¸ß‹n˜gNëãu¯g„7‚¸oà­DOUŸûA4åMq2ê‹0Ïú£Ë¯°Ö‡½¯8Üa|yÍ•—ô¹o‚[g}”WrDOUÜûþù_y¹wróê·z*¿Î¯~ÀZååÞ |î‹|þN|ý–ò*÷Tàd¿u³µ>y1æ ç¾yMûÒ+ú(î‹Ào‰œ½È‡û¢½ÐCöõƒò2ÞV]>_?$½‚£ú¢üÈÁ§XûgK^Ì“9>=Uöˆ}|V^îÀç¾y¹Ú6¿0÷Oòb¼âp_„ñs÷‹/½Ôwaæž +¹óð­{~Ù«8>§ž +üf­æVk}Ø«8ȹ/?’]fñÙ«8ȹ/?_3¿ßâ³7É¡ž +üj‹Æ<¿+oNx¹/?Û0¾~CÎÞ$‡z*p²%ŸÜ3|ÿ€Ï…Wõ]µØÿ+q~a/æÏä­àg›Øç/ö*Nƒç/ÔSùuØÔæ³Wq¼—ú"ð«­ìãFÞ‡û"ð³ÍÅõ§ð2^ÕSÍŸ„›òºŸwÏ¿¢w⾜fjŽÅg/øÌA>w¿²8s·£•³7ÉqèÖ½¿â~±× 3Ç#W}áç~ûïqD5¯|î0Ÿš®‘—#ê‡ë\yÇíçÑu8Íp›/½‚£æÓn?gš5åUœZôHíàuÌ÷+¯ä~y@ýãñ¤:ûô*Žê©¶^狯¼ªw*EO• ›3ÁZÿVyGõEÍšï¿R^Å)DOÕn7Ÿ9åUÕWt½µþÊ+9¢/ÊÇ͹Öâ+/÷N8Ö¢§jv9Èì¯Ø›âd¢/Ê·[qXøüÈ7„Wr¨§òóÙ슫Âý9{}.8õT˜§Û£×OÁ©…—9~<õTà×ÛÎñ‘K/qÀW}Q5xóï#Ø«8>Ï×òmìã'{9÷EX‡ü¾c×µöö*rî‹òÞy¼ÞÏ>>³Wq»ùò­sœ/†Í™>~sáUä9õENö‰×!ìUäîø=ÏMñùÎ*òŠÎû~Üù7\åUäÜ_m?¾×äUäÜÓŠíË^ÅAÎ=Ö¡üa|}¥¼Šãsê©À/v˜ó@xüDÎ^ÅA®ú¢öÈ«~fñÙ«8>ŸÇã{yF}ÖÁ}å[çq§Ž?Ìÿÿúñ¥ú¢Æ]ÿÌËã‹9˜¿ê‹š-_»Óâ³Wq«¾¨ºôÊÛM>y9÷En£v¶cùÁûQ½Šƒ¼R=ÕWꇬù³7ÅQ=UqL}@_°‡‚““¹âp_„ñ+¯äÐùÅsvŒŸß!WÞJp¸/'XšÎ?‘Â+9ÔÓìŸß‘+/÷N¯zªÚ]_…ûÆ+¯â¸çïvº­ÍW^ÅQ}Qáúkþ¹ð2Çß_ÑSµCìëOååÞ |î‹|N9{‘3Çýú'^§Þ¿ÿœóyåü¿ß¼8æÃ^Ÿ ÷T˜gö×øñå9«8Üáqš»ý¤ÏAqS^äÌAÎ}‘ãu¯?_Ÿ:%\Ÿ”WqÜþõHð6|Þ|ü–äÅ|˜ƒ\õE¹;N†óOy™>÷EÈ‹Ë^4ß¿Ä^ŒWõ|­ í {‘3Ç碧ª_²÷ååÞ)ïí'ª§Ê.qD¸b>ìMq +ê1°V´}ÁW^æøñîá ü0›ûoäÒË¿0×Wàÿ+ƾN˱þԹߟ§ë:ÅA^QOþ§]ÅAÞÒö¿pÇÏðñ‹œ½)Žê‹q¥¼ÌÁ| +zŠ¼ZiÔäpÿo{×uÒ+8ª/Ê®q„¹>äÅ|˜ƒ\7ÜÏ£毼Ÿ–3¯û¹›Ä<íϘgáŽoáúü»^Õe#ˉ!_y1æøœú"̳Úa«->{9÷Eà—ÝrKÈGÎ^ÅAÎ}òâ¥ùù]ìÅxæ`=U_T,0ÝüûJö&9¢§j®1«ÏM7pØësÁQ}QþíX|åUÙ]0Oå•,@ï+8-=¾gÂKß'p_äÆuïõëñó;ð•—9_SO~õr||@®¼Ì_õEÙËÃíþ–¼Šƒùp_Ôà<"ÖGy™/÷Eðº¯Ñ-åeøÄ}çî{ó8¯8j¼ÊçÕ«8©ùԇώÎûŠƒ\õEÍšWÏÏ)¯âdtN}Îzß +ßÿéçC^äÌÁzrO•c;þDZ7YÇ7ö*¼ª/Ê^Yê°pþÊ›äPO…õÉ~µóî!öúœ8>}Q“{“¹}•WpT_Töýpý1ö"WÕµÛ eñ•WqT_Ôœzimñ•—9ØŽª§Êfu‘ÅgoŠ£ú¢lô¥Ñßga•WqTO•Í¼Üì•—9¸_ª§j¯¹ìk}Ø«8Mï<•‹#ùhóïsÙ›âp_„ùä«ýávkþÊ«8ÜS_Ž‰ŸÈÙ‹\qrÑcä/œ°wøþ"p¤WpT_T2Ûü|<öb¿eæ£ú¢êµ/ØÏßÉ›âp_„ù”|áUÕµk_ý}SÊËœ¯ãˆíR~oö=ÖþÉ^ÅAîæÝ°žQØý¦s}Å^Åq¿b^©<åUóù¿Î+±þóêUÕÍ+Ÿ9XÏÆÍßÚOêƒ?ÝufŠ£zªò³ñõ‰»?Ýçe«8Üùù¬c_ß²㙃ùð:ûñôä y§é=~ óñóÖï;<Ü.àóø§ çјOMë~#¼ÌÁxî‹çýúEýOÊËÜ/Õµo¿½^y¹ê‹ÚW¿`_’7ÅQ}Qµó°¨Ãú(¯âp_N=ß±gZû{±nÌA®ú¢ösÇÞòS^Åᾜfóa£ºopÃ|Ø‹œ9ȹ/r¼îqæsöñGy™~+_ =¾”7ÅQ}Q5X<ÿR^ês0ÕSµÃc>橼ÌÁxî‹—#þgV¸}1åeN#z*pêuÅñŸ¼)Žãñí¯[Øë~Ù/ñ>ÕÞŸîü«8Ê‹œ{¤”WçùƒŸ/ðúV¿QŸÐ?ú\ x‡{*ð˵5ß«¼Ì—û"ð«QüŽ5ö*NŽíN=øÙ^\Ýâ³7É¡ž*ä‡ÏïÂÜòrï„û¥zªf”=ÿ¹÷+ô&9ÔSažíoßfÍSyeï¤zªMg¿”WõNª/*Ïï±Åo”Wô]Üa}òzá -¾ôŠ¾KõEeÿÇ£ÇiÊ«8ª/ʾ9Öü|Qå•ÑS5-t²µ>Ê˽î/÷EÈ«U˜Ïß•WqT_Ôþhñ>kþÊË<î¸/òó¿eÁó,>{9÷Eà—ϽiþýcEÞGöE{ÿñ;áq&åUÕSµç÷>¿üBxGöT[-rÝ@ nëåUÕSµÃûUÖö­„WrDOÕì°ù÷•Ê˽“»ßûË}‘Ïÿ㬙Öü•—9د‚õÅ?»Þç½Ñâ—äMq ¾vù­à oðûøg‡ƒo‚¯ÝüÁÞà÷ñÏOæcÔÇ_?Ñûñ0ÿ¯ïÝÿã9ª§*.ˆ¯3mž8ØîÜyÎ>öñ‡½Šƒ\õEÕ>ýµöÏŒ¼ŠƒÜ¯âÇÿè¬Cóü›{Y×WìUäÜa}êo ˆ> 9{“ñ|6Û×^åU}—ꩪ1ý÷7ן¼˜¿âpO…uÈwXè¤o“¹ÿêlåUÕ•G-n¾Iy™ƒûÅ}æ™ÿì|“ÏÞ‡{*ðˉg™Ÿï¡¼Ì—û"ð³vÑK¬õgoŠÃ}øå…ý/¶øÊ«8µè©ªÞÿ–ò*Žê©òõþl¾?Ay™ƒuS}ÑÜëëñÅÞ$‡z*¬Cs`¿C­õW^Õ;©ž*ßi¡û->{1ÅQ}Q±žè7„WqÜzð­sœ™»ÎÖõ³ò2÷KöTË ˜d­{SîÜ<:óç y&¼j¼ê‹ê){n`­O³X}®•+÷E˜g3uoóóm”Wq¸/ÂzòöJy™ƒñª§ª—Z-úüŸ”Wq¸/òÞ½ÝíN^?žz'äÜažå”=[Ûñ_µÝý9૾¨ZÒ^åUÕÕw¼n¿ÿ¼˜§â”¢§ª½¿åUÕSÕ?yf¼uüW^Åá¾Û7;p†Ù¿)/spU_TOØ{³pþ)¯âp_NûÒ–f?À^Ì“9ÈU_ÔüøݨßHy‡û"xÛ¥V³ßÿF^?^õ]Ôa|¹é©—…ë\y¹wÂxÕS•K­v‡ÅW^Å‘}ÑÒ‚/¼Š3÷zf »3Á­{~üJäŠ#û¢—·´ßÿ&øŠ£ú¢âÖ½o3×_x‡û"ìçå-6_y™ãÖ»³ÎÜ!Ÿ{~çŸò*N)ú¢üÖ˜¯¼È§¤¾óÌÅ:+/sàÍDO•?å•'¢[g»P6÷ÛnN^Ÿÿë/|2çi¼ê‹ò¥W»>ÜRódŽO}òÊ]G…|¿þÊ«8¢§jn±÷Oöúù(Žê©–‰çŽòrï„ñª/j79õ p}0¾^Åáž +ëìx|ëìoÊË÷Ëñª/*ÿüËÂù§¼ŠÃ}8õ½—›Ï_Ø‹y2¹ê‹ê« ƒJzUßE=8ÙÓ¿6ÿþ…½˜§êT_äÎ#Ñû[”|æ W}QþJ|}>{Sî©rœ×Ü~®?8ìEÎäÜߺãpÈG^ +/sÀ羜lÙxþÈÙ«8Èç^Y£šæ >{¹ê‹êÛâ~ Û—½Šƒ\õT­»¾ +×ßóɛ⨾¨™Ïö"Wî‹òÞþYßøjôÿ€£¼ÌÁxÕµ·Çë“ò*ŽêTÄ^ÌSW}Qûîo¢ã'8î+ß:çÅQ=U¶ÿ˜‘V¢¼ÌÁþÆ“qßwæÓ¼÷›iáã9{SœZôEíÉ“£Ï_yGÍ?ðŒU6ŒØ=¿ o<ôãÿ›û"ÜßúÈ×ÌÏ¿b/Æ3÷—{*äÅŠG¯¿€£¼Š£ú¢œøÊ‹\qT_T?qCôùà(¯äˆžª8á:³S^î°žÜS!¯~~¾ùþFöb'¯_â8_g*ê©×´þžO^ŒWÕ¹ßã[g>ìuƒºÛKõ]¢/j/ˆ×–"W½÷E9Öm›¯¼ÌÁvQóá\ySÙíucÔŸ;_gÙ‹œ9𪞪8¿ÿÉáþ NN^Åñ9õTà4ÇŒú äìUäÜSåØ߶}Çüüö*rwÞ‰z*̳þùq÷†ë£¼)÷Eàd'L6¯oÙ‹ù(Žê‹Ê³úGÇ7åEÎä­;n‡ë€ùÄG®¼Ì_õEM5ùáOãUlÕµîühñÙ«8>§¾yþð[™ÏÉ‹ñÜwa=[ê©×Ä×?àH¯àp_NùÝ?°óa¶‹ê©ê¥VŽÞ«¼)Žê‹2ZÌ“½ÈGõNî÷øÖ=> /vßwÆ«¾(ë·ë~}Á/5ø{ùíÇ6÷+ÕwQO…uÎ\÷k‡½˜'÷Nȹ/¿¾çÄèù/råeøª§ÊßÝe¿ðñ >{“ÑSÕƒ?ˆž_ƒÃ^ŸÇÏGôTÕ›ÏÞ§=’[çµ­í«¼Š“+þƒó±øÊ«8ª/*ò]w÷¬s&¼’C=Ö3ûÍÁ„ûøÊ«z'Õ#O>?œ¿ò"Wî©üÝ÷¹'™û'{q¿˜/÷Eàçϯ?%œ?ò†¼Š/÷Eà´×¿gòÙ«8ÈUOU.´ëÎáöU^ÅÉq½M=•ÏW[¸ùà°×'ÆsOå×s¹M£ÿwÕs„—9૾¨Í¤;ÍÏß`oŠãxÑ ëP¸ù‡û¿Ô}ž+¼Ä}“÷Æ«¾¨ê;ñ*kýÙ«8ÈU_Ô¸îÎÖñ™½)÷EÖá” o1×GxGõE8?6«8-õ$ؾî~ð­»}…—9î—»ãE_ÔÞco_–*Nþñþ=ÃøbuûøÃ^Åñ¹è‹šv‰®?•7Å©iýÁÉÅ:+¯â8^tÃöu#sÿTÞÒý¦{}N=øí;ñú W^îòÞö­DO•ßkï?ìMqø~ažœ»ï;÷—½ÈåxѵSï<Ó:¾}Z¼Üùü£].²øìõãEßÅ}Æ×½`öy1ž99ŽÔSaý‹m½>{ǧž +yñê%Ñù7é%¼ÜS!oæv/D^Œgæ©ú¢ê¹ƒí×G„—9àËžê/ñãódoŠÃ}Æ»õy0Ü?‘—äE®8ÜSå½ýªØξ¾R^æ`à¾ü’®ß³Wqp¿T_T6ññ |ö*¼ª§júâþö¦8ª/Ê8Òº¾R^É¡¾óiOÚÐüü@åU}—»ßÑ­=’òªñÚ9_p_”cÿüéµu}X?2hÍ{¢ÙÌGöE[î]?+¯â W}Q<ÅÎwÝë=ò¦8ª/ªÝúXÇå•ê©0ŸêQ±þÂ˽“›Gçþª¾¨}h¿}Âù§¼ŠÃ}8ů6ßÃÚOØ‹y2Çç¢/*¶ÚûªpÿLyUï¤ú¢ìþýv ×óa¯Ï©ïÂ|TO•ZÔ~ý¼)Žê‹Ú+–°?ÿAx™Óˆž +ói6þ0ê°ìUäª/ª7Üè.kû²WqsO•ãq±ì¬s¬íË^ÅÁýå¾y=ë®óÂù§¼ÌÁøŒú¢¶·]òÇÄñAx§¤ž +óÏôÕðü¨¼È‡û"ðëéû®rö"Wœ–®s0¾yà.³ÿQ^É}QÛïÎÆš¿òrß…u+¨§Bîøö㋼Ϭ÷EŸ‹ã§ò2|ÕS9¾ùú{Sî‹0ÿìgöþÏ^ϽSC=†çßcŸ•WrÜ›燡û·Ï•—Æ»o;çwî‹ópÏç$8ª§*Åúÿ+¾;OÅQ}Q+øÊ«89m_¬OëŽÖñ_y™ƒõt;³§jnÙï“O^ÅAÎ}æ_‰õaoŠÃ}Æ«í¨¼óÌÙjï±áú(o*W}Q=c¿ C¾_7áUî‹0Ÿâ?/Œþ® +|åeŽO=øm>ë'}ÁF@.½‚Ã=8ùBwVáú —^ÑwqO…ûUη¯ùú){1ž9y︤zªü´þæù½Šƒœû"¬CóØÂæù—½Š“õæ/û¢…âó{Ê+9¢§jfÙ×? y1Oîp¿¸/òãG÷·{äU䥸~+Åõ[CÞ$‡z*Ìß}å[ç|ª¼Ü;¹_îö ÔSa;Vƒâç§ÏRäªwR}Q¾ÆÑßO%½Ôwa<÷Tȳÿ9Ð|£ò2§=î/÷H)/Ï{ë_¨žjè"Q?~;$ÎSœ†ú"Ì¿ØzÂåáñyM^äŠã~Ý0ÏÊqÂã¿ÔÙß”7‚t¿éŒçž +ü‚øÈ•Wq¸§‡çƒ\zEßÅ}8ùVñú#g¯û¾³ŠÃ=8ù°x?ñ¹ð2Þ‚žg!oªAQÿéùäÅxÅQ=U=減­ý“½à+Žê©šÝV¾Þâ+¯âp_„u(~üÖT‹¯¼ŠÃ}øíÕc¢Ï_BÎ^äÌÁºq_„<ßréèó™Áa/Æ3'ïí·•è©š'k­{Sî©0ÏjÛg®ës“ nÝóð*÷Tà×;,ýý)rö"gŽ›Wg>Üa|¶£Íg¯â ç¾üüÍ™?×9{9÷Eào®zi¸þÈÙ«8ȹ§§øÐæ³7ÅQ}Q&ŽoÊËÌSõEÅ —‡ëƒy*¯â¸<ê©ÀiO0ÿŸbåeæŸÑótŸÿ× k„ýªòúñŠC}QÓ»îj‹ó#y=Ÿ8>w o*OzCH÷ßÝÇï§Ì•×ýú'rJµnŸÒ >s·‚ïŽ3æõç¿j{×'Äñ|ê‹nÿ´Ž?ìÅxÕwq_„ñÍ_V½4ä#g/rÅ©Äý*i}g¯â W=U1gäúÖû£2ò¦8ÜS¹;Ó™Cû 8ìE.9ô<ü²ß蛬íË^ŒW½“ê‹Šê„Û,¾ò*÷Eþþ~yôîÖñ_y‡û"/¿êÐpþÊ‹œ9ÈU_T-´ÛPkþð*÷E˜µÈ Y|åUÕSe:Õ\åeÖ‡û¢¼·ÿ×Û/a~¾7{yM×QÈ˿ݽþ«¼¯8Ü“?ºþxkÿa/øÌA®ú¢š¿)/sÀç¾yöö®£¬ý‡½¯8ª/Ê&Nšd­{=Ÿú®¬·Ÿp_„<ÿâ:Ññöb¼âp_Ôàúë9fÅ^𙃼=•ûytKy™ãï/õE9Ö-¢w¾éž7)W?ê©Ü¯w8¥[Ÿpûæ«8ÞKó§ÙzNÔŸ(¯â`<áç~Û™=âôÂó{ÞË•—9)oé®ßÌÇy¹;.E×ó˜g±ˆ}É^ÅÁ:ÔSyþžöú(/sÀW=U>_|}¨¼)NIëƒñùŸ‰Ž>'/rÉ!>Ö³ý‡}ü”^âÀ«zªvÜUÑëË)¯äˆ ûÎ’w„_̇½>Õ5«Í>Ìâ+¯âȾh•sÍ¿/`/Ö9¸_ª/jŽx<º~öò*Æs_„¼:û}­õQ^æ48OQOåçóúûÑÿŸ¨¼)NK×Wà ÛÏ/ròb±òÄpýÁa/Æ3Ûû"?þš££~ 9{Sî©0Ï|ý/è¾Á-Çý^Å©éñ‹ínðµsÞa¯ûy'gî÷E˜g¶ò_£þAyÇçÔSa>ÕwŽ®¯”7ÅQ}Q~tÌW^äÌÁýmEOÕlo_Ï!oŠã~/ºáþóýê&kÿWÞâ¾É{Ûs÷}wø\ÌWÞ‡{*ð«vjÔß"¯É‹œ9ðr_„<{nêÄðñ{1ž9Ï=òŒÎSà(¯âp_NýüÔñÖöe/æ£8Üùíøùøü®¼È™ãsÑSµKöû’u}RoAÜ/î©WoÅ×·˜{1^qT_Tß~vôùKà°9s°ÎÜSažÕÛ÷GŠƒñª/*¯:z\¸ÿ¤¼Š#û¢UûG½(æÃ^äÌÁýR}Qûó3£ë+p +ò¦8¹è‹²Ï¯]_Ã^äŠÃ}æ™msá•áúûœ¼È™¯ì©êo˜ï¿eoŠÃ}Æ·ÏŠësáeî÷EÈËSÛèüžò2ã ê‹gÿ_Ÿ¤¼ÌÁxî‹À¯çŸÈ•Wq¸/jz×ÿy?›¯¼ÌÁ|¸/Bž}!~~šò2ëÃ}QÞ»~ÈÝq><ÿ*¯âøñÔS!oˆ×'éçnX‡Òñ­ù³ó‰ î›ÜS_lbóÙ«8>§¾ü|Ó¥/ÏÈÙ›âp_Žâ«œ9ðªžÊý<º)¯ÔÙŽŠÓRONùÝ·~ší‹ñŠÃ}‘ÿòy&_z©ïÂýjè:üê?—»ÌšK^ÅA®ú¢l«¥÷·øìUœÛ…z*Ì?»êRóïïØ«8ðrO~õÝÝì~¼ŠÓˆž +ür³·£ÏEÎ^Å—û"pŠ‹wˆ^_FÎ^ÅAÎ}8íswL·¶/{'Çö¥ž +übýe¢ç¿ÈÙ«8Èkê‹Ÿ9{ÇMºs\åž +œ|Û%ÇYû{9÷Tà7Ãl>{9÷Eàçcû—}nnÈÙë~ÞYÅ)¨§§Údióù—ò2^î‹À¯·[2zþ‹œ½Šƒœû"pÚ5¿x‰µ}Ù«89öOê©<ÿÛ6Ÿ½Šo&θþiÉ«8ðrO…ù»ß‹nÈÙ›÷ÖAq¸/òœÍìë·Hê¾ÁxæÀË}Æ×ó}8Òê¯ò*ŽSwÔSïöCóú™½Šƒ\õEõ©ýKkÿd¯âä˜?õT˜v„Íg¯âÀË}QÝ;/Û-½¿uüa¯â W}QÖÿWÑßï+oŠ£ú¢ú–ñg˜ó'/Ö“9𪞪2âJkû²Wq|N=æÓ¼1ö<‹Ï^ÅAÞP_„un†ú+åUŒçž +y6h©èýù)/sà垪A?³úœ™Öú°Wqü}Q)øìUäè©‚ýÿìlöÎ+ãó‰çš¯B†¯ïñ9÷EîçyæSÿ´]øøÅxåeÆ«¾(ûÌâ#B~ÊËðÝ~]Ç‚ÓltÎZáþœ½Šƒœû"Ïóvt~DÎ^ÅA.û¢‡¯ˆÎàgäUœ:ÑSåoN2ÿ¾¬$oŠÃ=æSy*úÿq³¹äPO…uȯ_!ú|p”—{'Œç¾y¹à–Ñë)¯â¨žªxî.Öù‹½˜sêÞöåž +ó,7Ú÷L‹Ï^Å—û"Ÿ?r…ùþCåeN“è©šãç/Ê«8XÕ5Íiæç—²Wqàåž +ó,?7èžðú9{^î©Ài8Ü|}‡½Š/÷Eß¼6É|}Š½IõT˜uc|þR^Ÿ ÷E¯®Ø‹ù(÷Eߺù‡ÛWy‘3ëÆ}Æg¯Šõ'¯â`žŽÇ·ÎùC÷}7'¯Ïéþmþ§ä€Ï}æÓÜÿÝ ­õ'üǯ¯Qß÷EÈ«Y6_y‡ç¾Ê•WWyqÓæñYW9÷En\g?©nZü>Q^Åá¾üvöw/ Ï_È•Wq¸§Â~U­»môúøÊËŒW=U5ß æûg”WqT_”{¯µÿ³óTî‹0¾úåáæëwìÅz29÷Tàç§í5ÃܾÂËϧ¾üzÖÓ,>{ÇçÔßt·ù÷ìU䪧*6Úq†µ}Ù«8˜'÷EÈëÜw{ÈGy%GôTÍ‘³¢ëåõ¹àp_„ñ•;>„óG®¼Ìñ÷WôTÙÌý†[ÏOÙ›âpO…y–CNœbíŸÒK½8ª/ÊÆþ=ê0^y%‡z*Üßê s†‡óGÎ^Ÿ󩨧Bî¾F7pØëuÏG‚Ã×Á»ß|âu‘â4ªGš4oç_Å)?ç÷Fx™ƒõœ×u`¯â ç¾ë_?hŸßy>)÷Tž?iëÃýÓç«8ÜyÎ}ûFý³Ï…Wqd_4YÌ_x™ƒùp_äóaç®Ö¹^Åá¾ür§øø€<#/ræ`>Üa|ýÈw÷ 眽Šƒœû"pÜuæ‘Ý7Á­s|`oŠÃ=•ãu8åà+kþÊËxU_T¼tyýÌÞ‡û"ŒoŽÏ¿ÈÙ‹œ9~DOÕl°½ùþgö¦8™è©Šõ·^¿À<•—9~<õT˜O>òœáÖþ#½Äñ|ê©<ÿü¿›ý{¹ê‹Š¯-o^æäUäÜùù >{SÙSýÄ>ÿæ«8ÜaþÙ–ñöõó$/rÅiÅù½!Žò"g¼ª§Ê‰¿à°7Éù”}øÊË}—ïþA·O¼N£±s¿ý_Ÿïõ7󸪼²/Úëoæûsæ•£ú¢¹ó´Ž?­ð*Žœà(¯ââ:¶qÐk}”WqT_Ôž~Lôú‚»ÿÝëáewª/*& dÍŸ½)Žê‹Ê—ú.³øÊËx¹/Â:dÏ̸«/Þ)º×EäMqTOU¿{Ü_y™ƒyr_„¼¸î€èü‹y*¯âp_~;y¨½þäÅxÅá¾ãók˜nm_åeî¯ê‹ò³?û‹ÏÞ‡{*Ì¿ÙfÑs­í«¼’#zªòÔA‡[|啽“ê©öúÛm_y¹wÂ:¨¾hîqÒâ»Üô*Žì‹Ntà›^æ`»s_„ûU]=þ<‹ß’Wqs_„¼þÅ»t²àÖ9þ°ã™ã~ϼ®Àøš®|.¼Á<ðO“o®ø”c< Áןû"̳|ëËæõ {ÁgòŒÎïàt~G®¼ÌñüàÍý§çŒŠ÷äìUäÜSy­3ò’¼ŠãsѹÏ=žîÿàäMqjê‹À)g½ö"WÕ5bþìÅ|GõEÙš[Þ®æÉ^䊣ú¢ú/›Ç1åe¼Ü!ofÜnn_åUw]õTXÏêˆWÌ÷/±óarî‹7×®ÊËŒç¾üüçKÎùÈ•—9às_„¼ZòÌ:hpëÙ‹ñŠ£ú¢ª½> {‘3ÇÍ«3î‹gï~9z~{1^q¸/Âøê½…w·ÖŸ½¯8Üa|Óo‘-¾ò*Žê‹²;N6ß­¼ÌÁß"ÑöMy‡û"ðËSÄüÉ‹ñŠ£ú¢j»?Q^Åq~¾u¯‹ö¶ûåeˆû¾ÃQ¹¼Ž^5žùØŽÅ_¿±Føþç¦÷~˲ßç[;æ`þ-õ-à´ß46<~*¯â Ÿ{¿BøÙ«7Gç_äìUä˜ýÓe.×|ö*rî‹°Ùkï¾ |ö*òšú"ðó!/Fýrö*rÙðã«Ãí>{9÷EX‡rµ­£^üŠ¼Šƒœ{*pòGn:ÁÚ¾ìUäÜŸM[§/ä#goŠÃ}8Íå—>`ñ•—9ðrOUã}ãß?ê|kû²Wqs_„ù×?}쮯¼Šƒ\öE«O?;ä+¯âøœz*pŠIKDý†ÏÉ«8ÈU_”¯¾uôþÏ'oŠ#û¢Ñ¢#/øŠãŽŸQ_„yÖo,?)Ü?Á©„—9?÷ølqòù§`n_áUœVôEî8föÿìÅ<™ƒ\õEù¤%">ÖMy‡{*pÚ/la>~•WqjêÀÏŽ¯+/s°>9ñ‘· Ú|öb÷Eàçƒãó/rö*rî‹êÞü³‡n>.Àg¯â /hýÁ©¿4m×p}jáU¬gA=r÷5º)¯Ô}žKx¹/§ßHê¾QxáÍ·µ·¯ò2|î‹0Ÿf{ÿgoŠÃ}ø凷FÛ¹ò2^î‹šÞ~RÍ7m«pÿŸ½ŠƒñÜS!¯¯Û#zlÊË丹 +œúÅ›FZóg¯â ç¾üêËFŸ¯…œ½ŠÓb©§ª{yûĤ[¬ã{ÇçÔS5ðžü‡èýÛÊ«8¸_ÜßN^"zþ‚¼"¯â 羜ü'KDý*rö*rî‹>9{¹ê‹ªkŒzEðÙ«8 ösê©ÀÉÿqÔ.áõrö*¼ª/jŸYÛ|}–½Šƒœû"Ì3¤Žþ>9{¹ê‹ª_]õ?à³WqêÞú7ÔSSßzÀæú“Wqàåž +ü¢ß‰?ŸÈÙ«8È ê‹|þµÁæûßØëÇ+Žê‹–Ï£ã§ç×ç‚Ã=Ö¡úÆÑ»XëÓã%GôEÙùOœkn_áåÞ ÷KõTÙfãÏÅ<ٛ⨾¨ÞlxÔŸ{¾ð2^Õ‚Ï^Åñ9õT˜g½œ8>“Wqs_äùùÙÏ°Wq«¾({KðÉ›âp_äçï®O¬ýSy™ÓôŽoÜ_pè6ÖùwîõIèUäÜŸmbïÿìUœ×ÔSßnlóÙ«8ðrO~½Ô€Éá: goŠã~oÝ×ÿò¤ÉW^†À«ú¢²ÿÑÑ燻ß7½ŠÓöÖ_õEõ¦öú³Wqs_äçùîïnµÖŸ½Šƒ\õEÅ +öñ§!¯â4½õáž +óÏç?z˾x£u{Hò*¼ª/ª¦ý;~#¯âÀ«ú¢âª'JkþìUäª/*÷}8z}ëÆ^Å©{ëÏ=U‹ýöëS. 眽ŠÓ`ûŠ¾¨\ùŽÑáþ ~N^ÅAÎ}8Ù‡G™û{¹ê‹j·ZëÃ^ÅA®ú¢ò½ø<‚íË^ÅA®ú¢æÑñÑûÿÛÞöb¯â`¼ê‹ªwìù+/sjì?ÔSaŠ‹ãëȮ½)Žê‹âCOç»îñ‡¼˜s0î‹+>ç¯8²/r×±æþI𙃜û"Üßjó˜¼^æ4ØßÄû¸G_z©wÂxî‹—sN^¿Ãý-ç¯8Üa¼ûÊ·ÎþÃ^7¨“+Žê©ŽÊ‡û"pªÛÿn?ÿúWAgþŠÃ}QÞ»¿Õò‡ld]?+/s0Oî‹|>s£èù]Ê«8ÜŸýaQóùoM^ŒWÕÕïˆÎ/à(/s0žû"äõY·MµŽÊ«8ÜŸm´ôí!9{‘+Žê©êëW¸j ûåàÖÙ•WrDO•ÿבÅW^îܼ:óQ}Qví(óÿOQ^Å)¨/‚·üí¢‡†óÇñ½ÈGõEÕÌ¢ó‹ò"—ÑO|4ÍÚ”Wõ]Üa>ÙEŸÏ\y%GõE·‰ã§ðf‚Ã}æÙ8zR¸}‘ç«8õEà”wü=:~"W^Åᾜâ±SÍç/Ê«8µê‹_y™ƒyª¾¨úY<<Ž2áUî‹àm‡½¯8Üùñâü®¼ŠÃ}øê<^ ¯âp_¾ûÊ·ÎñVyGõE¹8¿³Ô}ßñ*N#zªfþµ¢÷Ç‚£¼ŠÃ}8Õïì÷—*¯âp_~;Ý>>(¯â4Ôßl:f¢u|S^Å‘=U9bgëü¢¼ŠÃ=ŽíÙO›ÇçFx™ƒuà¾üú˻ޮråeøÜ“?v\ôúrö¦8Üa|µì·~®?øÊË?žú"ð‹e_y4ä#—^Áá¾Þ↣÷ÿ€¯¼ŠÃ}8åÁ#ì÷Ÿ“óQî‹0¾=zÄÎáþ£¼È‡û"Œ/Çÿ‚pý•¹âp_~¶•}|`/Æ3^î‹0¾8xÄÖú°7É}QUß|ß…òrß…yº¯|ë>âÏ»…—‡ã~qî¾ÿD>Oqê‹æ•ñŠ£ú"ž'8*Wî©pUÄüÔxÕ1'5ÿyåTç¬2Oýϧîo&øóêåë=ðÛWîúäÒK×¥9/ÔSSY%zþˆœ½ŠƒíÅ}8ÕÞ¿1ùìUäÜ_ŸpæÖñ™½IŽê©~ÿç;,¾òªÞ‰û¢¼·]šgÿõW~žäEÎäª/Ê®Y,z`Ò«ú.ê©ÀiÛ~z¸>~>äE®z'î‹À//#Úÿ‘+/s°Ÿp_„ù4?X)z}|ö¦8ÜSßfβοìÅxÅá¾ólŽÞms‹¯¼Ì—û"ðë…6ŽÞߎ\y™¾ê©²¿ž]ÿƒÏÞGõEùqgÞh­{ÁWÙý×›gZ|åUÕ•çï¶oŸ›\pë\·«8ª/*ÇÆÇçéð¥—úÿ¸ œ`Þøg—OÞ‡û"ŒoƬbö·_;^渟wrÕåçÆü”Wq¸/§ú}|~Ç|Ø‹œ9ÈùúÁçÄOyÇñ¢[Þ[·(ì~Ó]gòºur5žû¢¼7>wœpÿGþi9n\ÇË}8Åî¯->{9÷Eà·kŽ‰Þ‹œ½Šƒœû"lÇâŸ×D >{9÷Eà”'Û×WìUŸ‹¾¨þîn;…ÇOåU¬ƒê‹êËÞ˜òÁa¯â W}Q[,o¿¾F^ÅA®ú¢zÌPûýóäUÜ_î‹°ÎÙ“í~Lx™>÷E˜Où…Ëîµ_ìMqTOU :~|ÈW^䊣zªê†®°ööbþŠÃ=•_ÿswÛÉš?{1æx/õTž?åé‰!ßçäUäª/*O‰žO^ÅAÎ}îo}üŒhý‘³Wq«žªrÇÿpû‚ÏÞÇýœoŸx¾c¯ûåOÏðÿëñX‡Ê]ÿ„ëó¿åîuNÈGþi½?¯={ÿíûµò5ƒ6Œ7Ng;æÿØ/z_VŠ¯ú¢züŒhÿôáeÖ‡û¢¼·¿ë,=¿Ÿ½Šƒœû"pÜ×è– ¯â W}Q9ì }ÂýÇÉÌÇ‘â ç¾󬾲¢ùú{9÷E˜gÛ|?zÿŒò¦8™è‹ªEî×çdÁ­³>ìu?ï®qò^®zª|± ¦X|ö¦8ª§ª¾º¡ùþ(åUî‹0ŸbÈø‹Âý9{‘+÷EYoÝÚ™¯^®8Ê«8ª/*þ¸¬}}H^ÌGqT_TØ z~ŽôRß…û«ú¢zÄìKÂõŸ½Šƒ\õEÕàSÃí >{SÕe3ûfZ|åUÕ5,fÿ…WqT_T¯³˜¹}•WqT_TÑñͯ¿ð*÷TØ^ÅÌøø ¾ò2ãÝ×è–ãñûÑ~Ñû»+oqßอzªò²Ñúƒß’7Å™{=c=ŽòK®ÿÝ”:Çyö"g¼ª§j¿óáÎæõySůMØÉâ+/s°žîþñ­³Íßíë4öæ½ucrÕñx÷½éUäÜ!w<¾uÏã”æ=¯â¨¾¨Ü.¾¾‡ðræ`»«¾¨|ú‹[ÇOö*¼ÜS¹ùuÖ¡½Ï>>°7Åá¾ãs÷øµæ¯¼ÌÁOyGõTíÌï_jÍŸ½˜'s°]dOõèZ7[|ö*î¯ê‹ÊUßfòÉ«8ðrO…û[÷­»->{SÙmºút‹¯¼Ì—û"Ì?Ûþ  -~I^Åñë¦ú¢Ëãó—ò*ŽÏE_T]&Î_äUÜ/Ù­g_ÿ°Wq«¾({ Ï|ÿyAÞGöEÿXÎ~}Sx%Çm8ºuŽŸÅ?íóc¦¼qß~âù¨ü÷W·ÎïÒK|¬›ì‹Ü~îÿyo>ìUäÜ“¯g÷'yG­rî‘R^N&ú¢ìòóÖ½Ç +nÝí~í3çô¡ûgw; +÷Eßî.ž¿/sòž—{*¬gõòmÑùQyãÝ×è~þòmÑõ9rå Ýo:ë¦ú¢r¾-£×Ág¯C™œ¼—«žªùî-áþ>{“z‡ñõ!EŸßˆy²×çÄAÎ}æÙ.»Wôÿ를Ì_õEÅa™¯±Wq0î‹0ÿê‰'¯²GìUäÜyþ¹'EÏO}N^ÅÉzû÷Tžsë’Qåsò*rî‹À)fˆ>—yE^ÅAÎ}òj·ÅªpýÁg/Æ+÷Eàdƒ/1ÿ¾•½à3¹ê‹Ší:Íš¿ôŠ¾‹{*Ì¿þÚ³†|̇½È™ƒœû"ðË—o‹úaäÊËð¹§'ûýmÑù9{9÷Eà´_Ø2z rö*NŽóõTàT+®i~~{¹ê‹êáñùWy'Ãy‡z*Ïé?v‡nnÈÙë~Þ=¹ê©²“·8+Ü?Á¯È›âp_N}õ+Û[ןìŸ9ȹ/¿ºlÿ=B>råeøª§Ê®‹¯ÓÀgo’ãЭ{½G¡û¶›“×ç4>ÇxÊý<_Š¿óÊÁxÕµO œfퟕð2ÇóEO•_½fôÿWâ~±7Åᾜü{·ý8ÜÿÁa/ræä½õW=U¹üØB¾ò¦8Ü“ía??b/æÏäª/*Geþ}ò2Çó©/Bž=´©yþb/Æ·‚Ã}ÆçWïz[¸þÈÙ‹\q¸/ÂúW÷|ÍåeÆs_„¼øÂóöó#áUî©0ÿrûúŠ½˜s—Ô_/mŸ¿”—9às_„¼ùÕÀiáöU^ŒWÕµt}{‘3¹ê©òž±¯O„Wqd_ôÿ¼~ ›Dpëœ_Øë~Þ=ïˆÞIöE#ì~/^æä=/÷E~>¯Üvn¸}}NÞ$‡ú"pª/ÅÇgä™ò^î©°*{óQ½SA=RÊËãÁ瞪é}îV{Œ}~q¿Ç·îþ#z'î©0Ïü¬W¢÷¦¼ŠSQO~öÊè}bÈÙ‹\qrê©ÜïÜßâÌW¢Ï‡Gz‰ƒñÜ!¯¾7=z~šò2ã¹/òüwö¶¯ß„—9yo¸§¿^áÏÑû‹WäMq¸/òœc߈ÎïÈ•—9Xî‹ìÿ³7ŠþþüŠ¼ŠãÇS_„ñÍoÞß’^âx>õEàÔõ¾SC¾ò*ŽÏ©/BžíòtÔ)/Æsï„œû"p²u–=-<a<{‘3÷—û"ðóqeÔo#g¯âÀ«ú¢æ7 ç>{SÙ-tãÁæö%/æÏx¹/B^žµ²ùÿ;däÅxɡ뙦÷øj¶þ¦ùÿ/³ü’8ȹ/òùø÷ +×'åUî‹Àϯ}é«ÈÈ‹ñŠÃ=¶Wµâg‡óGy™ƒñÜ!/î{pXÈOy‡û¢Ûwù£Ï/R^äÌÁ|¸/òã϶¯ò¦8Üï~/º!¯È‹\qT_”»Xt} N$uß —ê‹šÞú3ß¡º×iäõ9q|îþA·.‡Â¤—ÆûûE}8åJ7^>0þÓ«8ȹ/B^>=:¿(/Æ3ÇM­3î‹0>ÛuKóú½)÷T˜gûߟ5_ßQ^æÀ«ú¢r|9%\åU¿ÔSùü¹wÌÿÿ…½~¼à¨¾¨é{ð¤ðøæ9äE®8Üa|öûw×ëÀ^äÌAÎ}øío—<Ùœ¿ð*÷Tà—G­}>råeæ¯ú¢bÊÈèú|ö*ŽO=òö¾Í×¥WpTOÕNÜÉüûGöb>ÌÁýâ¾㋳W¾ÕÚ¾ìMqZº.Âøì^4_—^Áá¾óoOùÒ­÷·°óarÕÕÇÚ¯¯I¯è2ê‹à­ÿ4$zþâsò"WîyšÞù·¼õæèõSp”—9Ï}Ö¿™òà°ðø“ò*{Á/¿l_²㙃ùËÞÉ oà°×1Ïû¸¿ÜSyÎ~ š×·yõVôþ«‡û"Ì'_blôù3Ê‹œ9ÈU_T-<6úÿ5R^æ`<÷TÈËï›l”—9˜¿ê©Êžú·¤—z'ϧ¾yñÁÄ*Üÿ=Ÿ¼Ͻrî‹°7Åáž +|÷•oó¸ò2^î©×'_~µ>,Åxæ4½ýœû"Œ¯ëŠïsò¦8ܹùuÖ¡X̾~P^æ`>|=ÿø·Î1÷OáUÕ#•.]¦¼ÌÁºqî9ÆFïOCÎÞGݯF­ð2^ÕSÕǽ½¾‰ù³WqZ< ž +y5éYûù y1ž{'äÜažÕ£×G0ž½È™Óàú„z*ðë¯ÛÇOö¦8Üßü}úmÖþ¯¼Ìñ÷‹ú"ðÛ÷w¿Ãâ³7ÅQ}Q=ù¬,¾ôª¾KôEÅØQÑù÷‹½~þÄA®ú¢|Å·.ìsÐàÖ=î‘7ÅQ}Quó?ÍþŠ½à+Žê‹²£Îˆ^Ÿu÷£3ö"WÕåÚÏ¿Ø‹ù+Žê‹Ú!EŸŽò2ã¹/ÂýmÜã×ھʫ8ª/j6~l´ÅW^æ`þª/jž[Ó|{Sî©°>|†\yGõEõu«ŸaÄu)sœ_DO•_ŸcþìU¬÷Eà´Üg¾¾Ã^ÅA®ú¢æ„¸çQÞÇýß:Çî‘Ü N®¼<Þ{©§Bž/~Ö™Öþ_-ç_óQ=UqïSæë³Ê«8Üå½uÈûl¾ò2óçž +y½ØYÑû”ã‡{*¬gõÃG¢×/Àa/rÅᾨé='Ûï/"/æÃ丹Êç'½½?VyýxÁQ}Quôä¬ý³$/øÌAÎ}îo{Ú“Ñç«cþÊËð¹/BÞ:':þ(/Æ+Žì‹f>aö3ìŸ9>§¾yµßYÑûs0ÿLxUßÅ}øÅ)Çšóg/Æ3óQ}Q±Ë6æõ9{¹ê‹Š ÿ½¿ódoŠ£ú¢bÌÚ'Xû¿ò2Çχz*Ì'ÿóÔËÂó;ré%ø|N>ô—Ñëï>'¯â W}Q3vÙèù‹ç“Wq—¢§*÷-Ì×gٛ⸟ó­sox*zÿ•ÔÉÙ‹œ!¸¿ÜS!/÷ÜcT¸}Áa/Æ+÷Eàdâó#8ìE®8ÜS?÷þ(oŠ#û¢=2Õz|±×óEßÅׇ~¼ë,~-¼ŠÃ}ø5õÈå}—ê‹ÊåÅü…—9˜÷TØO²7ìã³ò2|î‹Àw×iCÃõGÎ^ÅAνòŠÖ|ö¦Æs_Žû=¾uŽ‡b¼âp_ä~¿ÃÉõŸà(>srp¨§¿|÷öáñ9{“ê©À©Žzà°Wq0î‹Àiû?#ä+¯âÀ«ú¢âû‡GŸ¥¼ŠãÇSOåçyÎé“ÂùcžÒKŒ—}ÑÁÇEïIy™ƒùs_„¼¹töáÝ$‚[çq×ã™ã~¯{ý#zª|l}~)8Ê«z'÷ w/®?øìÅxÅá¾ãËãÿßyE^äŠÃ}æY®·•ùù–Ê«8Üå½íRÜú·¨_U^äÌAÎ=øÕŠññ¹ò2ÇóE_Tÿö¬èõwðÙ«8ÈU_”ýì­[­ýŸ½)Žê‹ò¦Eÿ?EÖÛ.Ê«8ÜS¿:ÿkþÊËÜ/î‹À¯v¿{døøBÎÞ‡û"ŒoŽyܼþW^æ`>ª/ªO\Äüû)åUÕG?n¾‰½~ž¢wR=U3kZÔÏxŽòŠ¾‹û"¬±º}ý£¼Š£z*7ß覼ÈGõEÙ—EŸådæõ'ræ W}QyðÝ#ÃÇ—Ÿ§ð2§IôTåõÕ„ù°Wq0î©À)nºrŠÉ'oŠ“QO~¾î×Í÷‡(¯âÔ¢§j×ùú8ëø£¼Š£ú¢ì¸¸ßÃýR^Åá¾Ès¶_Ó|ýTy™ã· õTÈ›å6¼×ZŸ–¼ϽS-zªûíËÞòÁa¯â`¼ê‹Šq³£~/åeÖ™û"x«vþC¬ù³7ÅqûUtžÂ<óÃíçÊËœº·Îœcþíbñó#åU¿¨§B^];ò´îÜ”×ý¼û|\pd_4̾~`/øŠ£ú¢âûüÛ +¯âÔÔ“`>í±›ý¹ò2ëÉ}¶cYÙ|ö*rÕ•‹Ç×çÊ«8ȹ/ò¹{þî?X7öúñÔwa|%Ößý<ºyŽðFƒÝ7Ϲû¾³?·÷=k¾¿ˆÇ§8Üß<²Â(ëïgÙ‹ñŠ£ú¢v³FïïGy‡û"p²;ÇŽ¶¶¯ò2ëÆ}QÞ[ÿbþKÍëö&9ÔSaþUólôüKy}Nx¹§òùb/MÏ/ÊëÇSß…ñÜù¼\*â{Žð2Çß/ê©À)Wøœý÷õäUÌ“û"äÙ_æL ×'åeÆ«¾([,·¯ÿ…—9à˾è©6Ÿ¼)÷EXÏìÅÿ8!\¬[!¼ÌÁxÕÕß=¿Hy™ƒû¥zªúÍÝN¶ŽìU̇û"ܯöˆãOµÖ‡½Šƒœû"ð«ûž=Óâ³7Åá¾üüÛ_1__P^Åá¾ë™°?ÊË?OÑS;¼gö'Ò+8²/ú}üùH˜{‘3¹ê‹šº1ܾX·Rx™ƒñª/ªÿ…yüT^Åá¾ÞlƒÛ£÷¿ùû+¼ÌÁxÕSëß~ºµ>Ê«8ª/j6¼ýônÁ­sÝÅ^÷óNάƒê©ªoÇó÷ò¦8Áü:ÿÄøöAûø ¼ŠÃ=øÕº·`­?{1ž9¸¿Ü!/èú öb¼â¨žª­2ÿÿöz>õNÈe_äЭ{Ý®¼¢ïR}Q~ì˜ÛÂõw®Ÿœs¿íäŠÃ}QÓ{^_¹Smñ•—9ðr_~uÇÓÃÇråeøÜ!ÏÞ_.:þ€Ï^ŒgNÛ[î‹0¾\|xt~AÎ^ÅÁ|Jê©À).ÚôzkýÙ«8𪾨üpS³c¯â ç¾ÈÏÿൢב³WqšÞúsON5%þÿ³äUx¹§Bîx|ë<ŽØ‹ñÌq¿ÜO=ò²ßkÑû+Àa)Æ«Þ‰û¢½ÜŸìÏÇf/øÌAÎ}æÙŒÏ_)/sÀW}Q½Q|þU^ÅÁ|TOU‹ó,{SÕ¹yñ­³?°× êäŠSþÿì‹°nŸ–“'Î#|§Rã¹/ÂøüÊqexüwÜÎ:09ss_”÷8õ3ïDçwäÊËð¹/ÂþPŸ·ì˜ðø >{¹ê‹²[ÆM ùÊ«8˜÷TàTwŒ+C>öö*¼ÜS!oç|%zˆòbeþcÃõWÞ‡{*pÊ£æ»Ûâ+¯â¨žª(‹öÏ”WrD_T¾øÎ]4¸uŽÊ˽SŽã‰è©ò¯<ý}™ótÃäMq¸/§zñöûŸ…Wq¸/¿\à'Ñßw W^Åá¾÷ÿ²E¿‰\yGöE ¿xš¹ +¯â¨¾¨¼kÜvÖþS+/õ]xÜ©¾¨>ãdkþìMr¨§òëÌÁýâ¾ó¬ŸÇ|}½Š¯ê‹ÊßÅü”WqTOÕ¼øNôþġ½ÈGõEíĵ£×w­ð*÷EàWë6¯O”Wq¸/òüŸí{€5éU}õTmo»gk?}þaÊ˽Æs_~~Ãg£þ +¹ò2|î‹?Yû‚p}Àg/Æ3ãÝÏùÖyÜe/½ý}ŠÔÉ•—!Ï}¼Í×3×_y™Óˆž*ÇqcÏÑë³Ê«8Ï=òâåx}R^Åá¾üú¦øüˆœ½È™ƒõç¾ãsÁgoŠã~ηîþCiÊKÃç~krþ·òüÿŸû"¬C±ìr[ßr¢ëFÌ“9ȹ/?b™èó³Wq<¾¨§§zÿ‹æç'³7Åá¾Èó—[.zÿ°Ï…—9ðÊžj…QèùäUœ¬·ÿ¨¾¨·ÔkûfäUlî©0Ïfx¼Ÿ g¯âÀË=8Ù}yôþ:äìUäÜSýv™ö¹A¸!g¯ûyç8ÀäÜSS Ÿm¾ÿŠ½Šƒœû"ð³ç–¿Ýš?{9÷Tàç|ë\‹Ï^ÅAÎ=øÅ×W½Øâ³Wqs_~û‡[¯²øìUäÜ_äËí?Ð Â 9{ÝÏ;ûssONyÑR‡[|ö*rî‹<¾qQ?æsò*rÕeK/g¾¿½$¯â çž +óÌW¹(zþˆœ½Šƒ\õEÙNKDý?øìUœ¼·Ý¹§§}û×Ñû³Wqàåž +œbÒ¥7Xû{¹ì‹Ü€ð¦¼nLgÿgNÞ˹§§\ÑÞBçÜ+ŽûQ÷qG=øÅJ6Ÿ½Šƒœ{*ðó–3oìUäª/*w\"zýHy'ÇúPONöá/²öö*¼Ü_¾ô¥èó‘³Wqs_NùûúŠ½Š“÷Ö‡û"ð«Yç›çö*¼Üߎ\áFkýÙ«8ȹ/òüåfÍ´øìUäÜŸ}ù³÷™|ò*ŽÏ©/¿|÷”èïÇ‘³Wqs_NqÕß·æÏ^ÅAÎ}øíÏ67Ï_ìUŸSO~±Ó’æûoÙ›âp_~þúÑû÷+¯ä¨žj‘'ÌÇ—òªÞIõEÕ)Ã'ZÛ7#/Ö‡9ȹ/Â:dëˆ^¿CÎÞ‡{*p +wüìs¿ŒråeNÞ;¾å¢§ªŸ[&zÿ?øìMqT_”]¾Rô÷}àK/õ]~¼è‘òŸ\j>—^Åy=Ùæ+/÷]n»u®O°ýð÷ ßã+röºŸ›•ƒ.¾ª\qT÷HÈáÃWäj<÷EðÖ/ Þ?¼Ú°m=®™/÷EÈëµËÑáã |öb¼âpOÕôz­|ÝÁÑë›à°9s|N}òæwC'†óoÞJp¸/¿}öë{†|äìE®8Üa›c¼ÊÚŽÊËx¹/B^¯ï')¯âp_~óõÓ¢¿/CÎ^äŠÃ}Æ·ß=É\áUÕ5×½>åeÆs_„¼m§šï¿R^Åá¾üì¤&[ëÃ^ŒWÕ•³¯7?ß@y™¯ê‹ÚóΈŽØ?•—9às_„<ö¨“ÂõŸ½¯8ª§*׊Ÿà°¹äP_äǯ|šy|P^îÀᾨé'³ßþ~ +ãKáeÆs_äóçÞˆúá”Wq¸/¿zyhô÷#Èsò"Wî‹üøoØ민Š£zªfÜfÑ߇¦¼ŠãöëèNyôþCÃ÷‡ —Þˆòñ稾¨™“­dñ•—9˜÷EÈëWìëåUî©ÜÝì\Oæ/Ûû?{1æ ç¾yõû¡ãÃó{Ê«8Ü_n<8zÿ_ûò*Žê‹Úe®‰øÊ‹œ9ÈU_Ôô?Ë|—ò*Žê‹ê68ßZöbžŠ£ú¢ò3Ïßbñ•—9ðr_„¼øÍÑëûؾʫ8Üyκñó#åEÎäÜ!Ï'\sŸ“·îë5Ê+ú.Õ•›Úϯًù(Žê‹Ê­âã38Ê«8ª/*.ÙìLkÿQ^Åá¾ólÆÛ|åUœ`ûuþ ¾Ê•WWy5öœ#¬ë+5^åÜ;¹qýPõHìUã‘«¾¨ÚvJÔ¯b|»ï§Y Åᾜrç Ì×ßÙ‹íÅœFôEà×ÇMÙ7Ü?‘³WqàU}Q=dÊuæ:7Åá¾ÈÏsØÕÑߧƒÃ^䊣zªâ˜bs}È‹ù(÷EŸo|ˆùú/{1æ çž +üj™ýï´Ö_y™>÷Tž¿ôëÓ->{Sî‹ÀÏÛÓü|€Jx™ã½ÔS!/ºøkþìÅxÕ;©¾¨zï óõMö‚Ϭ÷EMïq]Oøï{Ãýö*rî‹À¯>¯ ùÈÙ«8˜÷Eßœt|´>à³Wqs_~}Èæó/ö*ŽÏ©/jzë_¸Ço¸>Ê›âpO~}`Í9{‘3^î‹0ÏvëbD8pØ«8ȹ/¿ù£èù;rö*òŒz*pò=.ˆžÿ"g¯â W}Q3ðØèõkðÙ›âp_N±‹}~g/øŠÃ}‘ç¯:e‡ Ý7Á­s]Ä^÷óNÎxU_TowõE}œ‚¼ŠƒñÜS5x| žb¾ÿ\y™/÷Eà·g#Âù#/„—9às_„û• ²¯ÅgoŠÃ=øͶS® ¿ÈÙ‹œ9ðr_„uhößf²Åg¯â ç¾ÈÏgÇ«£÷§)¯â ç¾üŒ_È ò*rÕUƒþ0ÊZö¦8Ü5½ý¿Ùnʸ{‘3÷—û"ðóc¹+ä#g¯âÀË=òjÿKL>{1ž9ðr_„yæ¿]ß~y^î‹ÀÏfÞ=¾+/sÀW}Qquÿ›¬õg¯âà~q_„¼Ø|¤Ù±ã™¯ê©ZÇïs¿ܺçåU}—è‹æ>Ž,¾ò–‚Ã}‘›ogžÙzÌ×ÇÙ‹u`rî‹\Ÿë3??Ay™ãùÔSŸoÝw¡µÿÔäUäª/ª†üôd‹ÏÞ‡û"Ì¿ØAßÈ >sû_çŸ>ï·Û‡ýRÊ«8²/Úþóýáy1É¡÷;aÿT=RE^5Þ{©§B^œ¾þjÖúT‡÷;5|Üa<÷Nðr_„ñÅn{ ±8ìU䪧*¶ë]_)¯â`¼ê‹ª‰mÔ/£¼ÌÁø’ú"x‹{í>¾+¯äPON=s”½þÂ[óW}Q±ÓÿÜam_ö*rÙ­ùmûï§È«8>§¾¨ÁõÕF‡ßl­K^ÅA®ú¢ì°øïs•7ÅQ}Q±äÊQ‚íÎ^äŠÃ}æ™}sO“¯¼ŠÃ}æÓVUôú¯ò"grÕ59)º>Iy™ƒí¢ú¢êÉчZû?{9÷T¸_ͽDŸïù³7ÅᾜÒ=ŽÂý_y‘39÷EÈ›+?3)ä·½Çò2÷‹û"Ï_çÛæõ {¹ê‹Ú_®Âù+¯â 羜òˆ~æó;ö*ÖSõE9ÇS^æÀ[Ðóhx«÷3ûö*ŽÏE_TnÑÛ°¿RÞ‡û"¬C1æÝqÖãWy%GôEn^ÑMy}NäÜ9hçùKíökþ‘Ô}“âp_„ñÙ¶ýö ÷åEÎäÜ!¯'´Ñû‹R^æ`<÷Tmï8“m»×áú¤¼ÌÁxî‹àmquÈOy™>÷Eà7+h®{óQ}Qq×ûøO^Åñó¤žÊç—-½~Žô +÷Eà·÷}>ò†¼È™ƒùpOåó¿o`òÙëÇSïä½ÔS!¯g]õ?ž#¼Ü;Ã}‘ßÞ0:|üb<{‘3óá¾yýÚýç„û¿òb÷Tàp„¼^ßööÕµs¶ûªÕ_ï¬uQø¸VŸSO…ûUŒ]_!go’C=8ÅÉgÞÎÓç«z'ÕååP›O^ÌŸ9ȹ§Â<Û½ÏnÍŸ½Šƒ\õEåŸbñÙ«8È ê‹g§þm‚Åg/Æ+Žê‹š‘3' t‹…8ìEÎœ¦·ÿ7ÔS9^çú¿Zné!9{^î‹À)ž¸Óü|rö*rÕåcV‰þþ]y§é­ê©òý/Ž>ö¦8ÜSažÍ­£¢ù{¾ð2ã¹/B^ž³ß kÿT^Åá¾üv‰á3C>rö"gNƒýSõTsf™ý0{Sœ’z*¿þ§þú0kþ•ð2Ç{EO•ôkóý? yÇçÔSµ½u«_ϼ¾eoŠÃ}øí2íµÖú(/sàåž +y¶ÎÑú(/Æ3ãe_D|p”—9àsO…ý''>ò‚rÅAÎ}æÙ¼»–ùùìMqTOÕîuÞànÒ¸)/rÅÁïã+擽¿Vôü9{‘ã÷ƒ¯ŸØSµØ|ö:žÉÁýâž +ó)¾gJ¸>ÈÙ«8ÞK=8Ù¨¡·[|ö&9ÔS_múð_y¹ïÂýR}Qþåâʾ`c)¯â çžÊsv½¾ƒu`oŠÃ}8õµ'›ßW‘óaŽ÷R_äù{ =5\Ÿ“Wq«¾(ÿp©“M>ySœŠú"Ì3ûǘ{B~Û;ï°9sàå¾üæÆ+¢¿GÎÞ'£ž +œz££Ï?A.½ÄÁýR}Q~ÂÖçtÐàÖ=Î7ÅQ}Q5ç×Y|åUî‹Ü|;ó,qðŽ_y%GôTíÚñù=ååÞ Ûû"p²M¾1Ü?‘³Wq°]¸/§Üèô ,>{^ÕS»ÛÇ7ö*æÉ=æSºëpû"W^æÀ+{ª¿Úç_ö*ŽÊq¿º~@^Wq|N}8õc›ï¯c¯â çÞ 9÷HÊ›Ï}8íA÷|;쯗=cî·ŠÃ=UÛ;ÎWO~Q¸ÿ€/½ªw}QöƒÍ£ÿ_)åU}÷E˜gùùý¯¿à³ãGõEU½ÇM!ö"grî‹W‹®0饾 ãU_T~®Œž¥¼ÌÁxî‹·kzk¸>˜ò*÷Eà=ñ‘³¹äˆžªYð¿Ìÿ¿Iy¹ïÂýå¾óÉŸ?)ú|fäìUŸ‹¾¨úpϨ?Ÿ½Šƒñª/ª?:oŠµ}•WqT_ÔþòŒh}0Oå•ÑSå#7?Äš¿òrï„ùp_„ukþR´þ¯¼ŠÃ}øõƒ?=:œ?rö"gæÃ}Æמ~ö@÷Mpë^ß’Wqs_äxNu@üþyäìU䪧*??Ý<¿³WqšÞy0£>óÌç+O×ö¦8…àWkÿíü¯¼È''>æÙ<¾eÔï#½ÄÁýâž +üöÊg¢ç§ÈÙ›äPON]?½¹òÊÞ‰®3=g‚ÍW^î<‡z*¬sþaÑߧøñÂ˽Æs_„¼9h ùú¾ò*÷E˜}Õég‡û§ò"grî©<¿þfôùu>^Åᾜâ‰Ã£×y‘×ÂË?ê‹òÞñÍñøÖ9î±WqÜ/w·Ô!Ïç_í¶pýó„—û.pjê‹7OŽˆ^ßGÎ^äÌÁýâ¾(ïͳØ0Þß {ã¹/BÞŒûrtýòJõT˜OöËšÏØëçC䲧Úç°©Ý ÜR^ÅQ}Q»îSW„|çéìo y‘+÷EySÖñÿŸŽò2㹧Â:õë׆óOy™>÷E>ÿõOÍÏ_b¯/ú.ÕU‡ÅÏï<‡¼È™ƒœû"äm}BÔŸcÝ”—9/û¢ƒÆEï?Oy™~é®+ÂíN••'XyAÞ‡û"ðë_ÿtë>÷Mpë^—*/õNî÷ºqý/0=úûJŒW^îüxÕSí?îÔp}°ÒKœ¦w}«z*Õ#5äÅ<Õxî‹rFì¶WØ_!Ïvúè”ð~ÏÜ_ÙS}æÕ*ä€_’Wqs_Nvóáׄ|?Oò*Æ«¾¨šýÕhÿIy™¯ê‹ò¿ŽŽÞ?‰ù°7ÅážÊÏóó¯FÇð¥Wô]ÜßÌšyV¸þÈ3òbþÌÁ|T_”ú‹èó+ÀgoŠ£ú¢|›Ç†ó‡½È‡û"ŒÏ½¿ÈçÂ+9ÔSa=³ 7½Íš¿ô +Žê‹òWÏé ùÊ‹œ9ȹ/jÐo/x»¹þÊËð¹/Â:·_X=êO”Wq«¾(_ä¼èúGyǧž*_»ÅZé%øª§*g5Ú”7Åá¾È¯óeôùÌà°9ss_”÷Ö§:2î¯R^æ`»p_~ù‹Å¶×9{óW=ÕÿÇÞ›‡ÝrÕeÚ%j„0T%/[Ûv@›¡íó–J«ôe´QØ@%ßÅøA@dB"ÈL‚2“b +(D¢€9å l `3h"]BÑ!$ßZû]Oõªç¬;u +‚4~îôüøå~Ö^»víU÷^µßævÇ<»Æ÷\â¨N¾¨¹øý‹ýϧçGýî‹BžÿæGÿÆyñ?.»õå:G|÷E‘·ã GÝüžÕõ‰åGu÷E3ÿØú:Çs‰£úd¾HüîZ—|Ï-&GõÁr×8䋆ï|ákóO¹ÄqO5æóópõW÷çx®Æïœùù‚/šÞ|½…?§\âÌuðEÝoþÑ©åühœž»Æ!_4~±¾~ó\ñô>Š öØÿá.—/>_4~Ï kóT1kÿºé²§,~ŸVuÏëÄOÕuOzy9ÿâŒëÞ)äq’§ +þá·×øž»Æ!_4Ýú¼ÅþsŸr£×‹<Õô-·{cmüž»Æ!_Ô?þòê÷ã”KòEí»–ëÍæšïÒëâžJõáÔ×çž«~çhÞÜ©šGT×?ž«~çèùNä‹~î/:›ôÇsãÿ¾{?:Gýî‹ToÿîýUÿÓ@®sæ\óTª¿ô3gÔÆO¹î»Äq_òó~öÎ/©ÿžKÕÝS‰?ýÏ£߯©N¹ÎŸ|ÑôK¯]ì¯ßs‰£×Ñ}‘êÃcêûÓåªîÕÉ×¼yõûYÊ%Žû"ÍÃx«ÇvåùSÏ‹r£~÷T3ÿþw¯Þ¿@¹Î™ùà©š¿û H¹ÄQ¿{*ÕÃy×=·6?”ëœ9<Õô°÷¾µä¯åºwÁS‰3|èÅÕÏwÏ%ŽÆïžJõþ?¼xñ½ åªß9êw_¤zó³w©úÊuNÐú<ÕðýÇVçßs‰£çE¾(Üì/^X{}=—8óëbžJóÓ>yé—Äñ\âèy¹/g¸Á›×_”KÕ݉Ó_ë ¿D¹kòEíµêŸ¿ž«ñ‡|Q{äk^t^tñØ­“=7þﻺs‚êæ‹To¯óóÕû§çú%çÞ¡V'Žû"ÍÛø£G-Öÿ3r£þŽ<ÕãïP=?P.qÜ͹§Õç¡·\õ;'è8O5üÆÒ¯ŠÓY.q4Ïî‹Toxçª?÷\õÇ}Ñ<Îÿýš³kï_ÏŸ8ä‹šæ‹ýù”«ºsæºyªQëöŸù¢È¯Ÿ=—8ª“/êžPg¹Ä™Ÿ/xªî¶GU__ÊeßU÷Eí“–ã×8)}ø¢q|â«Êó›øž;σqæ~òTçþZuÿ3æGÇ­{*§·ã\õÁr×8Á|‘žWäùcç™)×9ñ?Þ÷Ò੦g?ᕵù÷Pâhœä©¦?ªê¯(—8î‹”Û>nùù®qR®sÔ¾è¿pfy~XË%Žû"qšßÿî…ÿÔx&ËUÝ9ª»§¿.Xì/Rr‰ã¾H¹ã7Üôyµù¡\䘧8òÄחǧêž;×C¾(\tóÅþq(—8î‹Ä ¹óâû¹N¹ä»ÌSéu>õñêï_Q.y'÷Eg{ÝßYܱ–K÷Eâ÷þUÿæ¹s?ø.òE!®kÇå=ÕCϽkyükœ˜k¾Kóé¾Hõî²·,¾ßŸù–«~ç„|þw_$Îp뺟ñ\â̹àFóHk¹Þ/¾{*qú+~òöµýí}ø“ż­qÜéùv7{Ïk¯/å:G¹î‹4þöÔë7Ê%Žêî‹ÄO?®zþñ\⨯w†Ú<´_|põ÷‘å’w +æ‹4žö~W[xÕ)×9z]܉ӽÿy§×Æï¹k÷TA¯;øÊuŽrÝ;iüî‘Ör½性nÿÉãjþ*¼úŽÕ}î4òTá3ÿ»úý‚ç®qȵ~Qõó…r£ùq_¤zógï|~íü€¹ä»ÀSõ/¸ÑâûkÊUݽ“ŽòT£_Ï]ã¸/R|ÊuŽÆãžJüöÌ7,®U§\çˆïžJœñ»ž½ðª{.qæ:xªá‘¶¸~ßs‰£~òEã·?oñûâP.q܉3ÝúŒ*Ÿr‰ã¾Hüþ~瑵ó3å"|QÿÅ罥Ƨ\ò]î‹4þîÔWý~•¹Ä!_4¾â Õó0å"<ÕðùÇ=²<¿éyQ.y'÷EâôŸyÜSkóC¹Äq_4óOzÑÉ5>åÇ}‘øÍ]þ¶ê·{È%Žû"ñÇݨ¾þ\â/ÿ™ÕïG(—8î‹t^JŸ#µù§\çhÈ5GœüÓ%-—8î‹”Û÷÷¨úÏU?qÜ©|â=êßßA.rÀSõ÷üÛúþsÈuï¤q’/nöù_=/6Ýõå"ýë5È%Žû"qºSþ¢º~£\çèx&_Ô>å²—”Ç?å®rÌS‰3Ýéo¹6ÿ”ë¾K÷EA××­ÿ”ëñÉSµ·øâkÊñ¯åÇ}ÑœûÀÏ,¾¿›ë–«:qÜ©¿»ä5¯+ǯz ¹Ä!_ÔôO¨ú[Ê%zªÛ} úûZ˜ Þ‰|ÑðÂgþ¿µã?P.ù.ðTÝ5ïñóµù§\÷Nzßuæ©T®xÜb©^_ÏU¿s‚ÞGæ©Äi.ÜâûYq=ó‹ýÛâ{®ú‰C¾hxã'«ß_{®øÎѼ‘/ +/[Î8žKÕÝù{ùî?}÷â÷ Ä÷\â¨N¾¨{ì‹×—r×8ä‹Æᯫߟz®ž—sT'_4sù›Ëã'ä"Ç<•æa<ó¿[ò5ÏëÆQ|Q{à^[ò×r‰Cž*<úŠêç‹çÎãïä¾hçý§—žÿãⱃ\çÄÿn×O¾¨ÿ½sÇÿZ.qÈ?ðÕë#ÏÕ8‰ã¾hÒû÷ô?»|}ÅÁ\ð]䋆SÏ^ÌÿZ.qÈS5g¾ººþô\=/â¸/Ò8‡_}`ÕP®s”ë¾Hüö3Zø7Õ)—8ä©Ú[üÖ‰O¹ÄA_ô½ÿð„Úñ㹚â§?û ªÿ 9à‹â¸ü±ÿ~‡\ô]à©Ò:­vþñÐøï].y'òEýù[|7s —8ä©ú~ìѵñS.qÜ=ß_~ȯWùë=_÷Tâ·ÿÄSÊãSõr#¾û"½ÂÏ}tá‡Å÷\â¨N¾¨ýô_½¢œÊ%ŽÆÀSo¿óY%_Ï]ã§ê/ÿ¯¯ñ1¼ù¢ð™G¼½äkœ”KòEí.¬î?÷\ÍqȵW<¸ºþ¤\â¸/ÒqÒ½ã΋ãSã¤\稟|Ñtà?¿¶œÿµ\â¸/RîxÑ7.¾WÝsUwŽÆã¾Hý㽿§zþôÜ5Žû"õO?pÏsÊùYËuŽúÉ…Sï»ðÃk¹È!_ôS}Ü8ˆâ±¿~¶Üø¿ï×C¾¨»÷Cú¿\â/Ÿô‰ŸªÍ?å‡|QsjýósÉw/êðÞ_,÷/…<Ï”K¾Ë½“8ä‘(—ú‹ãCÿïîxh?vyõûÇþ‰'T_ýÇÅÿÝqÈ…·Õï?¥\ç„<Ÿä‹¦?õ—ÊãSï/Ï%Žêè‹îõÚSjǧç®qÐÝèÌ3küžrÍw5y~Ü©ÞüãC«~{„\â¸/ºÍ ¨Ÿr3ê:×<•^Çæ—?¤|})—8ê'_4M?ñÄ’¿–ëõ“§ +×>Pý}*Ê%ú¢ñuUÿ€¹æ»4oî©ô¼úG}Çk¯ïd¹ÄÑü“/jÿúSÕõ3å‡<Õç¿6~ÏÕ83?/ðTÍ/¾gá—ÄñÜ5ù¢éœ¯~?K¹Ä!_^zÞŸkü”ë'xªîŸ^Ï]ã/êŸúcg×^_Ê%ù¢pûcª¿/A¹ÎÑó"_4ÁyØs‰£ºû"½ŽãZÿþÂr×8䋺¿xjÕ/Q.qÈ ùâü¬çE¹Ä!OÕýà ?Užÿŧ\âÄÿÎûëíÃø!×!ñß;Ž{*½^Ã_ýDÕ_ÈuÎÌO5~ôò-—¼zª›Ÿð”Úû×sçqšw +šóEçxü>žåGu÷Eâ7·=æÑåñ£ºç®qÜS5ùyMÿë©‹Ïwñ)—8î‹ÄÞþ»¯/ǯºçªNòEÃßTýþ‚rôú‚§ê¯ÂkÇç®qÜižûG~Ó3j|ÊuÎå:GóF¾¨»ô½ÕÏ_Ï]ã/šnÿšêþLÊ%Žû"ÍOû©±zÿå‡|Q;þVuýO¹Ä!_>ÛTý9å"1×|—^òTþl±¿TÏËs×8ä‹š{ŸyNõõ…\ç(—|QÿÐßyxï¹ÄÑó%_Ô|䛞s^lÒCÌ5ßÿ»ýëhðTÃõß öÜ5ú¢gÜòŽåøÅ¡\â¸/güö‹^ã‹ðEíé'ývíõÅ\à/Ž<ý95>åÇ}‘Ž“îìs«ëÊ%Ž{*ñû[½ðª{®êΙ_GðTÓï]x§òõÇs‰£ºû"qº‹O«~ä¹ÄQ|Ñtõ‹ëOÊ]ãw"ä¹âS¿û"õ·?ó›j÷?6ÏþÞê÷žÄq_òy)¼õmÕý{”ëœyœà©Â_?«¹À!_Ô5ÇŸYŸçªNòEÝ˾ûQ5>åÇ=•ŽÃé„S_V;ÿP®sô¼Ü©Þœxêé%-—8䋆˸º>ñ\‡8è‹n÷…êúsÁw¹/Ò<4¿û¢*?@®sæ瞪}ç.¾ß\Ëuï4óÁSŸ}ß¯ú=WuòNä‹Ú‡-ÿ~8”‹ðTá­euüKÞ‰|Q{ÞÛª~sÁw¡/:åÚo©½¾˜ ¾Ë}‘ŽóáG¾ðì’¯:å:Góà¾HœîÒãî]ã{.qT'_Ô~ý<¿|})wƒ¾èÀgSŽ_ÏU8î‹Ôߟºüû›sr‰CžjúŽó~¹œŸ™¹Äq_4sNÛ«^Q®sôz‘/êoòÄûUÇo¹kòEÝéË¿_6?/È%Žû"güéÏ>¦6~ÊuŽÆã¾HüæÏwñý²ê”뜙žjz܇^_ÿâ{î‡|QwôòúWÏU8î‹4Îþòãê~r‰ã¾hÏ©ËÏwÊUÝ9ª“/êŸS÷-å‚ïB_tðmÕõ¡çjœÎQÝ=•æ§yõ#_R?ªO–»Æq_¤þpÖ#þJ|Ì5ߥ~òNî‘VsÁ;¹/õwÎ<á'UïrÿêyÕ9<•8íç^³ø|T½±\âh~Ü yüý‹-Ïoâ{.qTw_$þøš3Y?ª{.qæºy*qšËî¾8?«î¹Ä™ò<¸§R½½ÕÅ«ßsÕïåº/êsîøû¨žŸ=—8ª»/Å¿õ->_(—8ª»/4o×8n1ÿ”Kœ)sÜS‰ß]pʕǧê“åG¹î‹FÿÓùÓßs‰£ºû"ñû+>p^ÉW}²\â¨îžjÐøß{ɹ5¾çGu÷Egû k¾ªäS.qTw_$N{½Yÿ”KÕ݉?þÞ×½ü¼Ø¤‡êžÿ÷gpŽêî‹4Îéß«Æ÷\â¨î¾Hüæßµ¸~TÝs‰£ºû¢)?íiŸZ|ÿ+¾çGu÷Eƒøøˆê÷_žKÕÝõ:þÿôv‹ïG(—8Sæ/j|ÿ¾|})wã¾Hã ¯:ã¹åûKãô\Õ£ºû"ñûßá‡U§\çˆï¾hÌóÖ?ý[ëñ=—8sÝ|‘8Ý+Ï_¬)—8ª»/g:ê—ë[Ê%Î\7O%~¸ÕÅÇ–ÇêžKÕÝMz·|‰ï¹k÷E⌿ñbÿ*åªîÕÝ©ÞyÆâ÷ñÆü¼(9æ©fλþøÜrþ)w®Góæ¾hæ¿ô ‹ý¥sÝr‰£zo¾hÏ÷ýöÊóÃÌ·\âÌuóEâLï?ûå%Ÿr‰£:ù¢îÉ{O+çŸr×8=ø¢ö­|Z9~qóóTñÉìÖÃánKågÒøÍSÍüîÀâ}7×-—8£Æ¾¨{úñU,—8ª£/zfï¹Ä™òøÝ©ÞÞãÀÙåñ¯ùi-WýÎQ¿{*ÕÛÏsNɇr3äñ“/ +Ÿ;æå%Ÿr‰£ºû"³‰¯ïyZ<ö[Ë%Nüïvýî‹B®O?~ñýõZ®sÄw_$Nø§c~¥œÊ%ΨãÇ<ÕÌ¿éù 5×-—8ª»/R}¼ðŽo,çæ[®ú£~÷EªtìÛK¾8”K÷Eâw×ûïTòU÷\Õ‰ã¾HýÍx쯪N¹Îóëë¾hæ\Zÿz.qTÌSéx ÇX|¿I¹ÄQÝ}‘81Çûï_Ë%Žêƒyªß¿Í= åû‹r‰£~÷Tâw§¿Ø_¡:å:gæƒ/ïûÝ?Pî_ßs‰Óëø1OÕäùéîsÆK¾êž»Ê1O¥qNq}Rοø”ëÞiÔøÁõqSò)—8ª“/ê_ò5~Ï%Žêä‹ÌçGu÷Tš‡Ä/Ïo¿çGuòEC\‡”|Ê%Žêä‹šS–|ßs‰£ºû"³;þÀÙåøÅ÷\â ùøtO%Îø™cÎ)ù”»Æ!_>LÕ/y®Æãœ)Ÿ<Õtü¡¿8žKœQó¾h<åøúý–KÕÝSiœÓgù•Úø=—8S?ù¢©½ßÂ_Q.qT'_ÔpàÁµñ{.qÆ<~òEãêÇçGuòEӳ꯯çgÊãwO5×?U¿çÎýà»È —ëÏ™c¹£ÆI¾ |‘Ÿgtü`®q4òE‘çÝúÊs‰3?/ðEíݗ뫶ϷTâôš7óT!sÂqõÏ_Ï%ŽrÝSiœ“yÊ%ΔÇïžJüæ^õÏ_Ï%ŽrÝ©¿‹£v~ð\â¨îÞI|§r»û¼t/>Y=úó¦¼ôòO–õæ†ï»àÊê­q¦w^9'¼y¼¤äÇ=ë‰ßZ½½û~ÆCœæœ#>Qò§#ß÷¡ÄV¯½_Ç\ë§{ÄÅ+ùí-.øëħ:åRÿøÆ_øhÉ/øèGŸê[9ÃÛïõ7%¿¹Ö«þ.ñ©N¹Ô?<îè—üþ­WÿøŽOuô‡Ïï]Xò»»|ö‰?Z½ÉuqÚKÞþç%¿=òAŸLüþ“õ:å'|Ûeï(ùãGNº4ñ‡o_Öû\§\âL_wƒ³ü÷]ºãwW«×)—8Ãõopv¯cæ‡Ôë˜ œñ¦—½£äk¨S.q¦xûŸ—üéÚû¯o€:å§ÿǽ Kþxçýã3üÓ²Þ©¹Ä™âû¢ä·ùý5ž¼¬oÙßQ.qºø~,ù:?4ïXÖ‡oÞ?oP.q›~á£%?äóÕ)ûyñÇJ~{óýósõ­œá GìÎ7:þÃuö?GÒçN™ÛçÏÊ%N?KN›?«7ú|„\â„øù¾à_ÿóÝëÍu÷ë”ëýmæ´÷9¸;ßh~šï¯¼>~l¿îåz¿8‘»X§Náå‘õpìN;›£\âwÉã^lî¼þ‰ýºs”KœÆæŠë«Ä÷yã|^i.p;NÚãŸõÇêS<~®,—8½ÿc<þg²z“ë~*—8!®¯Fž}\_íÆ uÊ%N[9ÿ$~Z甹S·¬·¹îågŒë¨ƒi¼ù‘ÖW»ñ[=ä:姵uÂ×Q‰ßßd¹®P½\ℯ_®s¦¸þIüê”Kœ!®£vó‘çG|ªS.õwß¹\gjúP¯oå¤uÑbüq}•þÖWµ:å§ë¨’3ÄuTúwZ/•õ´îJÿ¦\â„øþ*9z_Ps3ÚõÎ|€:å§9wyýØþÙþy,¯Ï+Ÿß¶r¦¸Ž*9Ãw[«‡¸îJ}”KœÞ®»ûkí¾Pr©?}•ãïòçàhõp·ýÏÇ­œôù^ò‡ìŽR¿Þ~réÏœ´ž)ùc\_íæÙêýßçõ‰'ç'¾dŸ*ùÍå·yOZGy}xÁ§ß­õUÙ?燼z$ã̹½“ϧ¼–ç¶råþªµã¤ÍëðÞêAës›ÿ9×úÅ vüËSQr©Ÿ|Õ·rÈMæµÚ|ÝG¹Äì<©ëS?éú”r‰C¾ˆê”‹ýà©ú/,?¿¦ì6sÀS…K—Ÿ¿i}u0¾©)—¼ù"ªS.õ“/¢úVN OÕBr‰C¾ˆê”Kýi=“^7=¾T…òTT§ñ@ÿh×/òTT'Eýè‹ìº¬]ñWÈ©\?îÞGVŸâº+Õäë—kÀSQ½7Žr©¿!_äõüýÈVÎ?×Êã³ÉŸƒ^ïïºÿýN¹Þ/N0ï1û"«wשû+å"Ç<|Qoõ)û«rÓúªœqâ!QõTT§\êï,·ËžÊëýŠ¿ò~q|Þä©©çu¦s”{H¿|—?S^ŸwVïsýŽr­_òET§\ê'ïDõ­œ´.*+yªÞêÍ»¯Ü_'­gJ¾®OƒÕÛø½á^<)—8ÿå‹Ò:g‘›ýå"<y$Ê¥~òETßÊ!_DuÊ¥~ôEæ¯Ò÷z»×¼rÀ_….½–øäÀ!_4€¿¢\â/Í_õÙka®õ§uÚn>ÁS‘¢Ü­Þ©75ÅïÓx(7X¿dE¹äЙŸr‰C¾ˆê=äR?ú¢O/¿ÿVüqÈ5ÿ¼üþºÕ¾,È%No×)òTÔ1—úí:KïÇê˜ ý~½&O•Ö9éx×#­¯vÿÞÈ!_4š¿jòþ+Ê%Î`×ÝòT½Õåµ(—8£]ïËQsÓÅÏÓržå©ÒçlYVüqÒz¦ä¿Ò¾,Ê%N<>þJ¾Èëãÿe·/Ë9s.pÜÉ;y}öHÆ™sÍ_©Ÿ|Õ)—úƒ½îíÊýƒ[9ç£<•×7Þ?(ù"ªÈÅ~;ÏÈS¹×J뫃ñ ÚÊI׃åñßäëÐÖêm®S.q;oËSQr©Ÿ|Õ·rÈSõ°/‹r‰C¾ˆ|å‡|ù(Ê%ù¢1®sÒñ¨Ç”ï+¤\â/¢:åR?ù¢1î¯+Çßd?¹™¾ˆî¤\òN]|-Æ™=Uxü².E¹ÄIïë’òy€ê˜ òE=ø(Ê%NžŠê”Ký]<Ÿ—óóÕòWMÜßžÆAãÌW¬í› +î1èþÁœëýò]i=SÎ|‘×Û¸¿=õ9g̹Þ/NüOþJ¾ÈëºÏ9Êõ~q‚_žª³ú´²ÿŠ8i=YÎÏ(Oeõ>×1×úÅiìu³§ê¬®ýT>ÿÊ%ù"òQ”Kœ°Ñ_Q.qÈ5vþYóWÄ vÞÓõ)Õ18ä‹Ò:§<®Zí¿ÚÈA_dû²t_!å}ø«r‰ƒ¾üU¹Ä!_ÔÇßg(çÞ¹È_ÔX]|Êí­_¾‹¼Óp³åýƒò{”Kœ|Q€ýT”KôE°/‹r‰3Øõ‹üU°zº®Ù‹"´‹8M|?¦ÿN¨N¹ÔŸÖE%_ž*­sÊzú¾o÷oqȵæ¯tÿ 姷ëeyªÁêòZ˜kýâŒæÈ_µùþAÊ%Nú|/çYžÊë!ï—vŽr½_œ6®CJ¾|‘×Ózi×gãQ®÷‹Ë…¿’/òú¼ŸÊÆ3ç‡|Õ1w£¿òùÔ¾,Ê%ïÔÚñÓæýW½ÕC®c®õ‹ì¸Õþ+ªS.õ“/¢úVù"¯·+þÊûå»Z;_ÉSÑ~*ç(—8Må<0„éû¾ò}×kˆí§òõ2qÈQsé>DðTä‘(—úÉQ}+‡|Õ)—úɵæ¯Òú*½î[9䋨N¹ÔO¾(­sÒxõÐ}…[9ä‹h?å"<Õd×/òW˜ œÞ®wBá·ËùÑyƒr‰“Ö3%Gû¦¨žÎ3e¿r©¿ù*ù«tž/ÇÙ¬üþUgýò`Cü\[p²/òz/dåz¿|Wpï!_dõ¿LãpÎœkýää‹zó?]öW­q”›ÖWå<ˆ‡´ðWòT^ŸÎ¿âÙé÷(×ûÅé,WžÊëmþ],ç(×ûÅñù—/:¤®ûm<Ê=¤_¾ËŽyªÎê}Þ—uG¹Ö/ù"ªS.õ“w¢úVNcçyªÁö_õ+û¯ˆì|ÕÅóç^¿m性"D¹Ô?Øõ»û¢ÆêÚO ×çMœÎŸì©©_Å÷ºGà÷ÛûœëýMî_æþ+å‡<Õ7sÀS¥õRyÞèWüy'òEX‡\ê'_ÔÙ>¨.ß?¸•C¾ˆê”Ký䩨¾•C¾h0•¾¿Û‹'ÊEø"¼rà/ê7þþqÈq“æC^¿gE¹ÖŸÖc»ù„}V½ý®{ŸïÄ\àtæ䩼.E¹Þ/Nc×Y]>øõ”ÎÎQ.qÈ¥õR9ÿòZ”KòN£y-Ý?H¹Äéüú={*¯7ñº>=Êõ~ù®Ñ=CöT^oÁ_͹Àéâçx9ÏòTéó½¬k?æZ¿8m\”òW#ì¿R.qâ”–¿Ò¾,ç̹À!OEuÏœ Þ‰|‘×üþU—ÿÊûõûë¾Ñ_͹ÀI×åë+_4Äßg(ëÓF%ù¢6®»Jþ˜ÿ.!å'Øy&yòƒñEt¯•¾7LuÊ%Nº®,ÇÙæëÐ`õtþ¼Ò\ëŸ9vþﲧ +T7Žr©}‘ù+ý¾ÐVù¢žöeA.qÐÅïûÊ×eZùûƒÈ¿3H>ªƒ\ê'_D>j+‡¼SWù»B»ã¼qÈ;öûWc\/%>å‡ä¿/@¹ÄÌ;ÉSQr©¿ïÇô¼çG>¤óFY×û}+‡<Õ>Šr‰Ó/j¬ÞeE¹ÄIŸ/å<È5Vïaÿ•r‰3Äϵ’/_äuÝH¹Þ/Ž{y*¯wWÑï·Ë¥uNù¼´ŸŠr½_œx\.ü•|‘×µŸÊ9Êõ~q‚Sžª³ºöS9G¹ÄIëØrfOeuíËÂ\맳㧇ûU÷ùŸsãÞI¾¨·ß¿ +×Ý¿¾ ñ'€¿j¬>å¿KH¹Ä!OEuÊ¥~òTTßÌ}Vä‘(—úÉQ}+‡|Õ)—úÉѾ¬ÍðEÕ‡ì¯(—|yªÞ|”ø”‹ðE#ìË¢\ò]ä‹&ðQ”KòE­ù«´¾Ú‹'gÊ%Ng×)òE­Õ›¼ï‘r‰C¾¨±ë .{-Ê%No×òTT§\ê'_Dõ­œÎ®ß勼>û(ðfÞ/ÎhÞ@žÊëüÕœ œôùžŽ;=䋼žö™§>Êõ~qÚ¸)ùòE^Oë¥]ŸG¹Þ/NÒÂ_Éy]û²œ3ç‡<•×å‘0×ü•úÝ;Éù|¦uÎÁ÷Üü•8­½îÚgÕ[}Ì^ s­_œ<•×Ó÷}iü”ëý³ïOÕZ} ¥\ï—ïšâ~òòø”§òz þJ¹Þ/N°óäì‹ îå"ÇÎóòWi³x^òZ€Ó“/‚û)—8=y*¨OKôEà‘6s¾ÂþŠŠr½_œ`çÏ­þJ¹Ä!_4lôWÄ!_DuÊ¥~òETßÊéÈSY=ý~æÁøæ¥\â/Ák¥õUùy§\â /Šëœ4^=Ò:'ý›r‘Þ‰¥­òE£ù«>û1Ê%ù¢Éö_¥ï1ÓüS.qÈMà¯(—8䩨N¹Ôß/¬ž¾ïKó³•3‚§jìºL^‹r‰ÓÂ>«´ÎIãÕCû²(—8äÒ:gÁÿÎ þ:ý›r‰ÓÛuº<Õ`õ6®¯s­_œÑ<ù+ý]BÊ%Nžª³ú÷*—8i]Tγ|‘×CöW”ëýâÄ)]ø+ù"¯÷?ñ¹wëûÁr<Êõ~qÜÉSy]É9s®ù+õ“/òùlô{VÆàþÁy¿–?䯸pÎN°ãvÕåïÍ[ã(—8i=S¾^òEÕ[ðWÊ%Ž{'ù"ªS.õ;O^ÕþŠ|Ñ°Ñ_‡|Qg÷6ù÷Û)9䋬ÞfE¹äÈQ½§\ðNè‹`ÿå'€w¢úVú"óQÚ'†¹Ö?äýlä©B\_Œ'K=´ÿj0Žr‘žª±zú}†”G¹Áúå»È¥uÎbüù÷Û)—8䋨N¹ÔŸÖ3‹qæßi¡¾•“Ö3%_û¬«wÿJœ.~¾”|ù¢Æê}þ|¡\â ñó¨äÓýƒmöQ”KœÖü‰1×úÓº(õ“/Í_¥ßÝñ£\â/l?UZ_%>å"‡<•Õ›ì)7­‹R¾ò]]ÉSQ½5Žr©Ÿ|‘××xÿ ú"óW!ß?H¹Äìú]žª§:äg´ë}ù"¯§ï ÓëG¹Þ/Nžª±:í¿R.qÒ:ª<®ä‹¼ÞoÜ%N|Ê %_äõ銋«þjÎy*¯Ë#a.x'Ÿgù"ª{n—ýöÛñ#_ÔZ½ßè¯Ä vœË5VÁ_)—8䋨N¹ÔŸÖ3åñ)ÌŸ7ù÷¯6sìü¹æ¯(7 ‡|ù¨­òE-ø+Ê%N¾ˆê”Kýè‹ÀGm槢:änõN¼ÖVù"ªS.öƒ§"µ•C¾¨‡û)—8䋨N¹ÔßÆ÷õÁø¡¡G¯wÒ¿©¾•3‚§Jëœ2wÌ^‹r‰C¾ˆê”Kýé|^ŽSž*}^Ôê[9ƒyù"ªS.ö»?Éž*X½YñWÞ/ï”ÖQå<ÈSy½¥\ï'Š %_äõáFXýûƒÊõ~q‚_žÊëòZÎQ®÷Ï›gÚ¥ûœ£ÜCæ¼Ó”=UgÇUû¯”ëýâ¸w’/ìþÁü•r‰Ì;ÉSy}öQëýâ/¢ºs”Kýè‹À#mæ€w"…ãú"óWÃÊþ+äÄõUy~Ð>« õrèG_dIž„r‰C¾ˆêäR?ù"ªoæ€/j N¹ä»Èuæ¯Ò÷ƒ{ñäI¹ÄA_þŠr‰Ó’/²zXñWȱë&ù«ô>ÝÍGš“øH×e»Cnœ´ž)9òT-Ô)—8=ø¢ uÊ%No×ékþŠr‰3ºgÈžŠê[9î=ä©ZóW-Ü?(…œ¸>)__ù¢ÖêòQ”ëýâÄCoá¯ä©¼.ü†êýƒÊõ~qÜÉSy}öH6ž9×üÕÜoó,åû²ì¿š6ú+ù¢Ö«ì¯0ú;þå©‚ÕÛEœöYQr±ßÎ3òTiS·ÝŠ¿ +À vÞ[óW”KòEÁÎÃÝÊýƒÄ!_DuÊ¥~òEiSοö_målõW”‹òTTÿÿ™¿"_DuòWÔO¾hÚ诈3Ä÷ÑÁøá ‡~·j²ú÷_Q.qÈQr©?­‹ÊñËSy=íoO}[9M\G•|í³òºöSQ®÷‹“Îç%_þªózÞ÷ëåg0Ï@þj„ûûœKœ`þdöEVïÀ_)9qUÎ|Qoõ>û«´¾ZôçÜ´¾ZÔs<$þJ¾ÈëÚOE¹Þ/N°\ù¢êÎQ.q|Þ䋼ÞÈGA®÷‹ÓÙñÓÁþ« þjÎy*÷Qø+å‡|‘×geþJ¹Þ¿æ†û¯¶z§ÞüÕ¯O)w«w"E¹ÔO¾h04ߌ8ä‹:óQÜ?¨\ä€/ê¡N¹[½y$Ê¥~ôE÷_‡|Õ·rÈõýqðT´ŸŠr‰ÓØuŠJÏ[yªê”KòET§\ê'_Ô™×Jë®ô<·rÈQr±Juç(—úðTi½T'i}µ_Ü­œ +sÁw‘/¢ß³¢\â °Ïj´ú—úûíè‹àþAÊ%ù"òZ=ä‡|í§¢\äØõË쩬Þä÷å¦uQzë!N°ë,y*ª·ÆQ.õ§õÌ"7{*ªoå´ä©¬Vürìú]¾¨·ú¤¿KH¹Ö/ÎhÞ@¾ˆê”Ký]ü\.ç_¾(}î—õ~¿]ã!N×!%G¾Èë üþ•r½_œx¼~YþjÎy*ªÓx°ßæYû¦|þUßÊiíø‘§òz—÷_a.pÒz¾|}É_¸P¹Ä!OEuç(—úÉ¥õÒâymôWòN?å©ü<¦:å‡|QZ/•ã—×¢\â/"E¹ÄA_‰r‰Cû¦¦o»ìåühQ¹Ä!_ÔšJ¿ÿy0ž(—8ä‹ZÛ—•~¿4ñ)—8ä‹&óZéûÓr‰C¾ˆ|å‡|‘×åµ(×ûÇü{ï䋨îåRÏi^õHë«Ý<[½Éõ­òE£ù«îT.qп¢\â¤óy9?òT^ó}|[9ƒyù"ªS.ö›÷¸ªýU×WåüÈSQ=Àx¨?—‡å¯¦»|ßî÷¯¶r:¿<Õ}<Ê¥~¾òETßÊéìø‘/¢:æ‡|‘×Ø¥ñxÿšwBe÷*—úÉ ࣶrȹ곿¢\䀧jâunù¾“¿¢Ü´¾ªõ“/êÁ_Q.qÈy½Ï÷R®÷·ê7ï”ÖQ{ñM:ÅïéÊ竺sæ\৚âújÁÏ¿ßN¹Ä!_4˜¿úR¿|Q ‰r‰C¾h°ûõû픋œ÷Rî@ðE-Õã÷•éøÒ#­¯Ò¿©ß¯wÒú*õ§÷{Éér}+'­‹JŽö;µVy)å§_ N¹Äéíú}öTV×ý€”KœÑ¼|‘×{Ø¥\ï§1"_ÔY=Àþ+å§ë“òõ•/¢:åR<Ë_uϺ¼úûíqÈQÝ9s®ýþ•ö_ù¼ÉSM/YúÃö_õùþAâ´vüÈuV³¿Â\ë'­çË×W¾È룾7Žr½_òN½ý.Vú½…ƒqò3çZ›ûÉ;ÿÈGQ.rÀ_‘¢\?§ómz¾è‹Ì_õ+û¯ˆC¾¨±ßoùïNKôEæ‘´?‡r‰C¾h45Áþ+å‡|Ñhþªyÿ¾_¢\â´à‹úë-×oòc”KòEÍwºþLÇå‡|‘û¨´¾J|Ê%ù¢é0÷_)—8ƒ]§hß”×Ç¿%Žû«&¿¯½ô~·ñ(×ûÅÁSõPwŽr‰Ó§JëœÝë™^Óøèòߤ\䘿š=•ÕõyA¹és¡8Cü<*ëm\G¥§õRY×~ªÎ8Ê%N _äõ‡Šr½_¬7ÿ#ÕY]û²œ£\âÄ©Xø+ù"¯7ujúûƒ”ëýâx?ù« rÅñçKþªƒß¿R.q:;N䋼ÞÃþ«98î䋼.E¹Þ/ù¢Ö~×}€¿?¨\â/jüü“¯ï(—8è‹lTŸ¯O)—8oå©Ò:§möWx0âtvœÈy½Ïþ +sìø—/òú þjÎNoÞIžŠê”‹ývžéò>«´ÎYŸ¹¾™cç«._‡6VT‡\ï‡|Ñ`©¥\â/òýTòW˜ ¾«O5]²¼¯Í÷—Q.qÈMߺÜ¥ýE”KòEM\_•Çüå‡|QwåúmÈû¯(—8ä‹ZðW˜ ýä©Z»°É¯/å=ø+ÊEŽ]¿ÈV— w°~qÈQr©¿ç“ƒñÃMí³¬ž¾7L}[9i]Tò婨S.q:ðEé<_æ6ùó…r‰“ÖE%GžÊëéû¾ÔG¹Þ/Nú<-ùòE^oÁ_͹Àéâ:ªäÏžÊêüþ•r‰ŸòÂ_Éy½»ëþþ« ¹Þ/ŽçÊy]÷:G¹Þ/ŽÏ³|QkóÙ€¿R.qÒ:ªœÿîlssãÞI¾h°}Pì¿R.qZðT^³¿¢\ï—ïJë¨r~†|ç>jÔõG¹Ä!_Ôƒ¿¢\â¤uQ9~y*¯§õÕ^<8)×ûÅ!_>¿wa™Ûæ¿?èå"<Õhõ.û+Ê%ïD¾ÈëéûÁ4?”ëýÚ¯E¾¨7•¾L|ç(—8îä‹š.×oâS.qȵßyèús7~ÊßE¾(˜¿š÷_A.qÈ5毚||R.qȵæ¯B~Q.rì:«•§²zºžJóO¹i]´{}Ò1â´v½&_ÔQÝ8s.ô·à©Òzi1žì¯(—8½]wËy]÷R®÷‹3˜7§Jë¥rü ì¿R.qÒçrÉ‘§j¬>ÂýƒÊ%N×3%_ž*­7Êz€û•Kœ ž*b ¯5^|Ånÿ凼y$Ìïäó&OåõüÕ˜÷_y¿8i}Uγ|Õ3ç'­çK¾<•×»þJòE^oaÿ•r½¿Ëýi]TŽ¿Íž*@Ý9Ê%Ncç«AžÊê}®S.qðTTwŽr©Ÿ|Õ7sÈSQ=®ëÊ×KÞŒ¼ù¢a£¿"NžŠê”Ký䋨¾•C¾ˆê”Kýä‹ÜG­ù+ä€/š¬>ßÇÞl°þô}âÁx2Í;ÍžÊêòQ”Kœ´.J9z„| ú ¹ØÏc%_žj°ú¸â¯¼_œZû¯08ä‹‚ù«Iû¯ —8]gu:@r‰ÓÙu¢üUkõ´ÎÙ½¿ —8i=“?÷v~ÚgEuÊ¥þÞ¯ßõ;WV—ÚÊIë™rüòE^oÁ_)×ûÅIŸ§%_¾ÈëòZÎQ®÷‹“Ö'%_žÊëS\_íúl<Êõ~qÒz¦äËSy½yîç«þjÎy*¯Ë#a®ù+õ{¾òE^6ú+q:;~¶ú«98i=_ο|‘×å£h<Þ/N×Q%_¾ÈëòQÎQ®÷‹ì<³Õ_͹Àiì|%_äõt^=÷‹ƒ¾È¼V€ýWÊEø"Ü—¹pÈ;5¶/+}?˜æsÁw‘/jíþÁ1ß?H¹ÄiÓ_ ú}*Êú¢ÃÜ¥\äÀ¾©ê-ä’¿"OÌ#¥õÕîõ…\â/"E¹È_4P<õ·ñü°{ÞéØŽðöWòEC<_•¹ÃF%NZÏ”y*ªS.õ§óyÉ—/òz“}ÔVNZÏ”ü ÷ªN¹ÄIŸã%_žÊëýÆýW3'®¯J¾|Q°ú þJ¹Þ/N<$Ë_µwÿàîþAç(—8­Sžª³º¼–s”KœÆæ_þªµzXÙEœ´ž)ç¿ÕÂþ«98ä©ÈGùx”KòE^Wö_yÿûÉM‡é¯”‹ðT|ÝJ¹Þ?©Ÿ<•ÕðWs®õË;‘/rÕÃþ+å‡|Õ)—úÉ;y=­¯öâ›w+‡|Ñ`^Kž‡r‰C¾(Ø>(ñ1úÉQr©Ÿ|Ñ×Wi¾õXóWÄAO>Šr‰ƒ¾ÈüUº~Ù=È%No×_]~_{=äz¹Þ/Nk×}³§²úþJ¹ÄIë™òu\óW=䧷ëwù"¯Ùkmå¤uÑbüÙS V—¢\â¤Ïå’/_DuÊ¥þ´)ùSöT^Ÿ}ŒÇûʼnïÏ…¿’§òúp«k¼G¿ÏPŽgÎy*ªcîaú+ù¢`óÀ_Í÷-Z¿8'[ýÕœ œ´ž/çS¾ˆê4êwï$_äõ>ï§ÚÊ ö~—¿j Ž¹ÐßTΟÓ‡ŠÕûxþÜÕ7rÒ÷zåü§ó|âx=­—®,×ûÅ!_Duç̹ö½‰öM5à©Ô)—8è©À#Q.rÌ;É5T‡\êG_di‚û5⧢ºsæ\ðNä‹:óWÚE¹Ä!OEuÊ¥~òNX¿ŠüUg^«ÍçÊm­?­‹Òû}ˆç“Ýû>sâCžÊëòQ˜ òE x-Ê%N:Ÿ—ãŸ=Ô)—8i]Tò婨¾•“>ÇKþì‹ Ž¹ÐâúªäËy½ßè¯Ä‰‡ÌÂ_Éy]û²(×ûÅIëºrüòT^ðûWÊõ~qZ›7ù"¯Ëk9G¹Þ/NZÏ”ã—/¢ºsæ\ৢ:åR¿{'ù"ªoå/r5Âþ+‡8î†|êõ´¾Ú‹!åzÿÌ1ï4ÈSQÝ|šrÓº¨Ëüºr‰3Ð>+¨S.qȵñý^Ž?­»Ò¿·r†x>)9òTTÇ\à /2Õm¼pÞÇžÊ=Ò¼/ r½_,­gÊùÙꯔKœô¹\ò¿ÒþjöTæ…æ:úÓz¦¿|‘×Ço½ñîï†òET§\êoíùÊy}öQ6~òWâtvü´WÑþ+qÈMÿŠ8䩨N¹ÔO¾ˆê[9îf_diÐu«íû’7Cx§Ñêi½´Nç(7­ÓÊ÷Ñ—ê¯(w«w"´•C¾Èëºr½Þ¯Þ©‡ºsæ\èGï‰r‘žª…z¹èÁÈSY}ŒûÛÓñ‰¹Ö¯ýZä‹ðH¾K¹Ä!_Ô™¿ +ùýE¹Ä!ï”Ö]i>æG>?P.qz»^“¿ê¬Þd?O¹ÈO…^‹rC¾Èëú*Êõ~y0òEƒy y-ç(—8ùòW#ü~»r‰“Öåq²Õ_)—8ñø[ø+y*¯O¿Ú&%ù"ªcî—é¯ZØ5¼ëˆ1}.{åÁÒúªœÿ­þjÎN0ï*_Duõ÷vÿ |‘×壶r{¿oõWÊEŽ'Óú*½^ Õi<ÐO¾(­sÊ×}öQ9䋨N¹ÔOžª!¯ÞŒ8ä‹&ðW”‹ðTî£ä¯(—¼ù"ªS.õ£/Úè¯cÞIžŠ +s¡Ÿ|Õ)—úðTTßÊiÿù«´ž9?lÜG©>¦¿RúI<=ä‹°~˜þJœÑ¼Á¿û«ý™¦}SòE±k±ÿJõ`>j“Öuåë+_DuÊ¥þÖü•|Õ·rÒúª¿<Õ18䋨N¹ÔOÞÉëCþ=ö­òET§\ê'_Dõ­òET§\ìïDû²¶rÈ æ¯Òzi/¾¹(—8䋼>®ü~»÷k¿ù"ª;G¹ÔO¾ˆê[9䋨N¹ØOÞ ê[9Á¼“<ÕɧQ?ù"¯ËGmåt䋬¾uÿ•|Wg׉òEX‡\ê'_Dõ­œÞ®ß勼.E¹Þ/Î`Þ@žŠêÎQ.õ7æO䋨¾•“Ö鼨‡<Õ)ûÁSż/Ï_ÉwwúJù+ù¢`¯K·Ñ_‰ÓÙñCþj¼û³>Öa˜ œ`Ç¿|‘×å£|Š¼Yú\(õæ þÝ_í¿Ö¼Sìú7å¯ÂÆýWò`i=SWä¯:¸pÎù"ªûx”Ký!þ>C9~y*¯ý•8䋨N¹ÔO¾ˆê[9䋨N¹Ôâ:ªœÿ>߇Eõ­œ<Õ)—úÉy}Úè¯Òzl/ždÈQr©Ÿ|Õ·rÐmüý+䀧"ÔP.p¿²¿’§êìþA탢ñïr%OÕÛuY“÷_Q.qÈy]û²0×®7åÁÈQr©¿·ënù"¯ËGmå æ ¶ú+å‡|Õ·rÈ;Qr± +s¡Ÿ|Q^‹ÆCòEüå‡|‘×ÓºkwüC®÷7ò]æä©:«Oq}•øÎQ®÷‹C¾¨‹ë«ÄÓ#­»Ò¿£\â§òº¼åzÿšwÌ'Èk9G¹ÔßØ>Ú5~ü~»jãï·‹Cû¬¼.„¹æÁÔlþ勼À_]U÷°ÿjεãmö]à‚Õµ/+­¯Ê÷Ýœkýää©zø]wÊ¥þÆÎ3Ú ¾•Ó¦¿êòõ)å‡|Õ£\ê'_DõÍðTîµæýT°ï‹¼ù¢Æþ.á½å‡|Q÷R.qÈQr©½“y$ÍÏfx§ÁêMö“>ånöN°/‹r'è'_4€¿6rZóWm>x=­sÆÊõ~q†xKÿòETwÎœ œ´.*ù䯺|_!å"‡<•Õ›|ºs”›>ÊqÊwæ¶ú+å'}Ž—¹ôûWíußwAêÛÌ1ÿ#_DÉÇ£\êCªú"¯·yµ¯èï_É#QîVïÔÚë"¯µ•“Ö3åë+OEuÌù"¯ËGQ®÷¯y§ÖöemÝ¥~òE^ŸòïÆP®÷¹}Ñ—ùûíS¾>Më™Åë«¿3hõ!×GÈ%ù"ªOKýä©ÈGmå/¢:åR?y*ªoåÐ>+ªS.õ£/¢}Pà¯Þ‰<ÒfFžŠê4èà‹:«k_ù+âôvý•Ö3{ñC¤³z£:ä"Ç®å‹:«ËGa®õÏòTT7Îœ ý䋼Þ\;?²‘3Øõ¾<ÕuÊ%NcþDžÊëòZ”ëýâ¤õ@:^ô ûçß³²ñ(—8‘[õT^žrÍêï_͹À!Oåuy$Ì5¥þ`ÏW¾ÈëòZžKLœÎŽù"¯Ï>ÊÆ3ç']”¯¯<•×‡¿%ù"¯÷°ÿJ¹Þ/ìýÞæß¹j îœ9ú;Ovù:ë9è‹`å"|Qó…½ Ë×=Ä}ïãÁŸÖWe}ëþ+y*÷Hmö”ëý3Ù×éØŽòWì¿Òx×;;(®sÊ\Õ£ÜÃõN<•ù¨¹¹éó¨úÓz¦¬¥ýÕì‹âçl™«:'­jýá_Ù_ÉSÅCiᵺ»~ß&%ù"¯k_åz¿|Wkó&OEuç(ûíøùJû+yªá ËãY>*­ëÇIÞ÷åþJœÝÌ_D‰r©Ÿ|‘×Û|_áVú"Û•Ö9{ñÍE¹È‰ë¢òxKë¨Äñ¿'¨ú¹[½Ó@û©¾½>žžúÁ¨c.ô“/"E¹ÄAO‰r‘CÞ ê[9ø"¯¯Ý?èýò]]5ù<0X=­sÒqë姳ë5ù¢ÖêiÝ•ø˜kýâtà‹Òzi÷>Kïµøhóþ+Ê%ù"¯k?åz¿|WZÏ”ãÜꯔKœÆ|…|Q°zÈp+'­ÊñËy]^‹r½_œøÒ-ü•<•×Ç‹¯x÷XtŽr½_÷EòN^—GrÎœkþJýþ|勼>û(ãh<Þ/NZÏ”ó/OEuç̹ÀI×%_¾ˆê˜ œÞöYÉQr©¿±óù«.{­Í;Ovùú´±zZ_ŒG¹Þ/ú"ðHÎQ.qÐmôWȉë™òø‘/¢ýT[9è‹ÌGÉ_Q.rÀ;‘Gj —ú[ðEÔ·rÈ5àµ(—8ä‹ZÛ5]{ÿþPÊ%ù"ªS.õàF¨oå´ñ<°{ߧ÷~|„|è¬Þæ:ågˆç·’/_äõ´¾J}”ëýâ¤õLÉ—§j¡îå'ÏK¾¼Õ)—úÓz¦äÿ[õWÝß1¦ç™>ßËç+oÀƒÅÿ¤ê©¼>>ÿ’SÓúÊ9Êõ~ù®´+Ç#_äõñGŒ{âåz¿8­=_òWS^ß:G¹ÄIë™rü[ýÕœ òET§ñP OEõ­òE^³×¢\ïŸr?ú"Û•Ö9éøqŽr‘ó¯ì¯ä©Ü#éw±×_‰C¾¨7”¾ïKóC¹Ä!O5™×š²×¢\â/êÁGQ.qÈQr©}ì¿ÚÌO… r©?§¢:Œ‡8è‹Àk5KœÁ®³Òú*ç^orÝ9ò`Þ/Nk×i=³;ÏX}¥\â¤uQâé!OEõr±ß¯»¯µ¿Ïª‡úVNZ_•ã¿ªýÕ!¾"Ž7æ¯äµh<ÄIërüòE^Ÿâúj×¹Þ/N|]þJ¾ˆêΙsCžÊëòH˜{˜ÞI¾ÈçsöQ9i=SÎÿV5ç']”|òWÝÆýWâ/¢ºG¹ÔßØû}öEVo7ú«™cçÏ!_‡6VïT‡\Óx˜þJ¹Ä!_4Á¾,Ì%ß÷óZ]ÞE¹äÐG¢\ä|…ýù"¯ëï60ï×ïe‘/"åœ9|ù"¯7ùõ¥\ï—ïB_×9õ¡ÿ¯~×Ý9Ê%ù¢ÁüÕð–«<å Kœ_Ÿnå¤uQùúpÿ`Úg¾NÊ%ù"¯ËG9G¹Þ/ßE¾Èëi}•ÆïåzÈýè‹Ì_iÿ•s”KòET(|ù¢öSQ.rÀ á²w쎗tÌÄG¯}kûåî¿J륔‡¹àÈõ¶ž×ß%t¦\âtà©‚ÕµŠr‰3ØuV£ó€ÕÓújwüC.rìzMžªƒz¹=ô“/òzZ/¥ñS®÷˃õ~ýþJû©œ£\âŒæ È_¥uN¿s”Kœôyšþ;=ä©‚Õ;Ø¥\â¤uEÉ—/òº|åz¿8q܇密ïÿ¦êýƒÊ%y*ª;gÎ=Lï$_äó0Àï_ïú?ß«–ó,NZÏ”õ­þjÎNZÏ—|ù"¯ËGÑx¼_òNTwŽr©¿±ó†<•ŸÂF%NZÏ,æ'_‡Rr©Ÿ|Ñ`þª‹ë«ƒéMã!ΞŠ¼å'€§¢:åb?x*òQ›9à‹Ü#Íž‡ÆòET§\êG_>j3ÇöYɹG’Âñ ‡|Õ)—úÉy}\ñWÞ/ßÕÆ÷ãî}™Þ›ñ!O•Þ§µºs”Kœ!žßJŽ|‘×Çìµ08i=SòCöT^ïÁ_)×ûgNü|)ùòEé<_Öƒî+´ñ(×ûÅI뢒#_Duç(ûÍ{̾ÈêÓF5sâúªÿ쩨¹úã!¹ôWÙSQ}+§µ\yª´Þ+Ÿ—ê”Kœ´.]p䩬®}Y˜kýò]i=Sò;ðWm®·Æ™sCžŠ|”G¹Ä!_DuÊ¥~òE×ç¥ö_É›ÇÏWòT|}J¹È1%_ÔØ÷ªSîòET§\êïmŸ•|Ñõ­òE¾ŸJû¯(—8䋨N¹ØO¾ê[9ä‹p_ä}‘ù(y$Ì…~òE£ù«&ßßJã!N _DuÊ¥þÞ®wä©Òû}/~˜èÑ®ø+âøõšüU°ëÊ&Ÿß(9q=SŽ³ËžŠ<åRo×ïòETßÊIë¢rüòEÔ)—8îIä©Òç~™ÛdE¹ÄIë’#_DuÊÅ~óWòEñ¸¬z­­òT^—GÂ\óWê÷y“/š^²œÿ.û«Ö8ø+q:;NÈ_ù÷Û)—8i=_¾¾òEÕ;Ø¥\âwòz›ÿŠr½¿Ïý~Þ§òó@þJ¹ÄñóU—ýUZç”ó¦:å‡|Õ)—úûœ +ú+óZé{ºƒñàßÊ!_äõö_)×ûÓ:-‡<ÕÉ9Ê%NcÞIžjºÚ Î._ßñ}—î®Ç(—8è‹®wƒ³wÏ/=Çø˜ù‹ðTÓMý‰”×Bîáz'yª|æZ¿8äzØE¹Äì:E¾ˆê”Kýé}]¾Ži}µ›g¨oå æä‹z«§uוæZ¿8îf_d)­»Ÿr‘CžŠê›>_ó û¯È_5°ÿj«¿’§JŸû‹ñ€¿šs­æÄõUÉ‘¿J뜲>Àþ«sƒõ‹_²ÃòWÍEgíîüÿ¸{óðYªÂ\·ƒŠhPAM9žÄ““˜ä(²w‰QPE°DE1Šˆ…8 ƒÌ A±˜gdpÚ»PL9"Ʊ‚Fà„„hT¸µúW_=k}¬×¢sOž{Ïé`,ÞoõêêêÕoW÷¦^âøxy*ÏËç¿?H½âT¶nòE¾þÍ赨—8a_¯sþªsìù"÷Q-üýƒê%y§Ê¾W(D½Ä!_D9õÒxòE}°›ñWÄ)ìü/OÕ€¢^â /ú·ôúávôÔKœŽ<•ååx=U½Ä!_ÔÚïPÉ_…ýUü|Q/qÈUp=õ‡®³êšîßšaÿ¶:ì —8ä‹ÜGµãõWØ ×q¡/E½Ä!_ÔÁ÷øè%N þª†œz‰ãñŠz‰C¾¨öW1?ì¯ÖO^ê%yªš<ô‡|Q9ì¯Â|u“¿¢^â/jÍ_5ãúP/qÈ…ýR2ÿñ÷¯¨—8ä‹^œ°/Šç/OU[öWaœsÔKœp>ùòEžwÃßÆQ¯§3o _ÔZ.¯åõ'ìg’ùËY^9öÚxy§°/ŠùòTaŸçòQ>õgXÒÄ_ÉyÞ¿hå÷Û©×Ç‹ã½òT¥Í_>Ê9êEŽ­›<•¯Ãäµ ×Ç‹SÛqÒ€¿*Á_©—8ä‹'y~ߤ^â/ªÌ#Õ£¿¢^â„}Qô‡|QmßÔúP/qÈyÞßÄ^òN੪_¥SØç„õ§Þ8ä‹Â>'ðtë‡ëÛß©—8a?sêñ<àyØç„qØ œÚÞ÷•ãy,ìsâÞ°_ZÌß8ê%NžÊóbôWØ œÆÞwËyÞß+Ä^à„}Q²£§ò¼„ïª×ÇËw…×å˜/OUXÞ?äÆ/†qÎQ/qÂ~&æËSy^þŠz}¼8Ô%_äy þjêy*Ïå‘°×üÕ4ÞÖYžÊ×A9ö§²ãGžÊófÆ_ùxqÂ~>~|õ¾Àó +ü•z}¼8ä‹(wŽzi<ù"Ê—åv¾jÇ÷¡”S/ŽOö9Éã2ã¯h<ù¢ÚüU?úe9 x*Ï«Ñ_Q¯û¢µÃ“‘<åΙzÁ;‘/Â|IN žŠrê¥ñä‹jóWaÖsYù¢Î®§ +û«Åã½Ä!_T û«ÀÓM‰z‰ö31G¾Èóvüþ õúxqÂ>*æ‡ýLø3åÎQ/û™˜/_ä¹|Ô²òEÅ=ôWê%N8Ÿ'󗧲¼sê%NkþAžÊó°_ +ó¨¡×Ç‹öEñüå‹<¯Á_©×Ç‹öE1_žª±\^Ë9ê%Îp—%_äy÷•ë¯¨×Ç‹SÚ<å©jË{úýö±—8~å‹<ïà÷ÛÕëãÅ©íø)Á_Õ௦^à/ò¼¥^/ïT‚§¢Ü9êÅñà‹Â>'9ngüUãÉa¾,‡<•åÕŒ¿"ïD¾È}ù+õ§4%_TX^ŽþŠz‰CžªØøî×o¯NÔKôTæ‘ÚÑ/Q/qðT-äÎQ/qп¢^ä˜w’§ê o —¼ù¢ÒüU7ú+ê%NØÏ,Ž‹pl ·ÉSYöKaõ"ÇÞÉ–×òZÐöEñ<Å!_D9õÒøʼÓä©,/—ôWÇÞ¿Ë5”S/ŒïÌ?ÈyöKa}©×Ç‹S˜÷§ª-/—üý+qªa’<ò¼sêõñä䩆¥H¼Vùû.~ÿÊ9êõñâ/¢Ü9Sï’þª³ïV3×_ùã8ù.;~ä‹*ËÛÑ_a¯'¼/HßÑSQN½4ž|åËrÈyÞû«µÃƒK½>^×_ùùª]Ò_©—8ä‹(_–C¾È¯§š»þŠ8ù«ÉYö]aý©9ä‹(‡^ò]ä‹Ú%¯¿"N þª†œz‘¾ˆüõÒxòE­ù«°^<¿`>Ä)ÀSõðýAê%ù¢Þ¼–<öÂø +üUiyØ_-Žÿ%9ä©(§^O¾ˆ|ÔÒœáõ%ÜoÝä©jËy-ðf>^œvx]‹ùòEž7à¯ÔëãÅ)Í_Éy^‚¿R¯§öWñüå©<—×rŽz}¼8ú'þJžŠr稗Æ×6ù"Ê—åøý•/ò|ºž +æããÅ©íø©Á_5௦^à/ò¼¥^?çÐGÙïÆ«—Ƈ}Q||6£§j!_–ƒžÊ®¿ +û®ÕÃÁC½ÈOUØyXÉ9êu¥ñä‹j¸þŠz‰C¾¨þÞœøq û®°>Ø ¾‹|QcþJ×Q/qzðT5|z‰Ó‚§ê,oF?F½ÄA_‰z‰C¾¨6~o!<¾ËrÐÙõTºþŠz‰S Ï£0¯é6z*Ê[è¥ñþ~'ì£}棔/Ë û™xþºÎÊób<ïÑ||üÄ_„^Ëæ£Þ8½'Õ.yý•8yy*Ï[øþ z}¼85xªÂò®¿R/qªa??¾òEžpý•z}¼8ÃqŸõT”;gêy*ʱüù"_ÿÉG-É©ìø‘§ò\> +{C¾ˆrê¥ñä‹û_1þžÕ²÷NòEeæ<°vxp©—8~¾ +û™À¡œziŠzÉ;‘/jÀ_Q/qz{Ÿ"OÕZ>7\œ —8%xªÊòjõúxqÈ…}N|\ÕðýAõ‡|QþŠz‰ƒ¾ÈüU3¾o¥^âvž—w"åõ}‘ù«¾?¨ù‡|åõ‚ï"_T™¿êôûNKrÈ‘¢^â/jÍ_Ñ÷uýqÈ௨—8ä‹ðWÔKòE”S/¯þ/óW“/²÷å’þJœÊ¼ÓtÝ”åtý•z‘cþJ¾¨¡œza|çÞ`ôTž‡}Îêa“@½>¾Çà©<×õTÎQ¯'ï$_T û„0_Ý*ðWêõñâ ÿÿ=òWÍ)wdÿjêy*Ê}>S/x'_7y*÷ZʽW¿ßNœÊŽy*ʱ8ä‹(§^ö3ñq"OU[^Íø+â”vž ç°oë†ýUÜ[9ö‡¼Sx¿óÃ>çwõ‡|QØ_Å|ù+ê%ù"Ê©—Æ“§jÀ#-Ë!_D>Šz‘¾¨²<ìÂãK½ä»jðE%äØ ãÑ™jþ“ß$_Tû«°º…Ïßi>ÄiÈAN½Ä!_Dy½4¾OEù²òEx-ê%z'ðHÔ‹ðTáõ">~Šñºße9­yù"Ïkøývõúxq*ðT¥åºžÊ9ê%N3ì£âu/ +û¥8¯á÷ÛÕKœá)™ø+ù"Ïu]õúxqj›§|‘çòZÎQ¯Ç×Y¾Èó~¿]½>^œÚŽŸüU þjêŽ{'ù"Ïå£|>êõñâ„}QrœŒžª´¼¥^â/"…½à»ÈQN½4>ìgâõ‘/¼'_„> +æCôTÃþ*¾_áúçÕÓ {Á;‘/*À_ÐKòT”S/G_dþJžjYù"ÊèÅñà©ÈG-ËAïdßœ»þ +9à¯jËK]—½•/Æñ…½ÏªGžïáx×Mž™z‰öE1gòES/qðE%äô§ïäy5\ßî'õúxy°Î¼|QØçÄëÖÂ÷ÕKœÂüÕä‹,×õÒÔ‹œaÏS¾(ìsâ¼Ô÷ +¡×Ç‹3,iâ¯ä‹<Ÿ¾Ç½>^÷EúÝ*Ï'dó™zÍ_i<ù"_Ͼ?X¿ßNœÊŽòWüþÕÔ œð>"~õ{Sž×ðûWêõñâÔà©*Ë;ðWê%y*Ï›Ñ_Q¯—ï*íü)OåçÃü•z‰C¾¨…½0ž|åÔKãÉÕæ¯êÿŸ~°"Oey7㯈CžŠòzi<ù¢ÚüÕt}Ú’Œ|]O…½à»ÈQN½8~Ø­^tÓuV½åº.kYNµ¤¿¢^â/ +û¥ø~é:¨e95xªÂòzæ÷Û‰^âyÑ÷Óã¼sê%NØÏÄù"Ï+ðWêõñâ¸÷/ªî¡¿šza|Ø%ó=Uc¹®§¢^â Ç}â¯ä‹(§^_Û<å‹Šz‰C¾ˆrê¥ñä‹ZóHáóÇpü,Ë!_D9õÒxòT x­e9ù"È©—8ä‹(_–ž×áqÓMžŠrê¥ñè‹Ì#ãùmYNIžÊòéº,è%NãïßGOEyE½À û¢xýÛÑSu–73þŠ8ø¢Úò +~ÿJ½Ä©†ýI<ÿÉSAN½ÄŽËÄ_ÉQ¾,‡<•çòHØkþjoë,_„>jINelj|‘ç-üþÕtÝpÂû‚øñ•/*,ïÀ_©—8ä‹jóWáóÁµá$E½6^¾«³ë¬&_d箿R/qÈ…÷‰ñºU£¿*¡—8-x§Ò>ÐõWÔKòN•ý~»~ÿŠz‰Cžª4¥ïR/qðz'øý+êEø¢šrè¥ñä(_–C¾ˆrìßE¾¨²ïÎý~;qÈ5põ§OÕZ.¯E½Ä ÏÇÅy+œ»†›ÎåÅx~ ^ä 瓘/Oå^«¿?H½ä»ÈyÞŒþŠz}¼|Wx]ˆç/_äyþJ½>^œ°/ŠùòEž7ã÷£^/NØÅ|ù«ÒóÝøÅ0Î9ê%NcþgòT–WtýÕØKœaJ÷È_ézª°¿Šï¯z‰SÛxù"Ï壜£^/Ž¯³|‘çÍ’×_‰SÛñ#_äy×_M½Àqï$_ÔÚïPuà¯ÔKòTî£ÚÑ_Q/qȵæ¯Â¾kõðàR/qðT­åÝ诨—8ä‹Â~)>Λñzê%ú"øõ‡|åôÒxòE䣖å/¢œzi<ù¢ÆüÕÿîë¯Zøþ õ’w"_Ôƒ¿Â^O¾¨öWáùª›®¿¢^âÔö>eºÎÊr]OE½ÄéÀ_öþ«Ïô'ì‹âu§ò¼ÿþAêõñâ /2Ô?våï‡uŽz‘cï—u½Sc¹®§j¨×Æ‹Ó™7/ò¼]òûƒâÔæOä© +ËË%ÿJœ°Ÿ‰_òW|P½Äž?÷È_M×SÙ|¦^ৢÜç3õ‚w"Oåy ×_•ÿ¸^^G}?îÕŒ¿"NmÞI¾Èó +®¿R¯§´óJ냽6^×k‘/*áz*ê%ú"ðWÔKœvx…ó«nòT”÷ÐKã›áùóå©Âó=Ϋñü°,§35y*ËÃ>'ôQ/qÜ;Éy^ÁõWêõñâ/¢Ü9ê¥ñ­yù"Ï ¸þŠü•8îIêÑUæ¯Jøý«©×ÆOœa?“'pýU=æÔöW9ÎpH$þJ¾ˆòÆ8ê¥ñµ—§ò\>jYŽ¯¿|åÔ‹ãýø믚%ý•Æ“/rÕÎø+â/ò<ì—V‹O½>¾•ïOEÉ9ê¥ñè‹Ì_…ýU˜ÿ²òEä£ÂûÜøy4õ‚ï"_„>Ê8•¾'µ¤wª‡ýR<Ïÿì÷ɶèÇß¿¢^âôÃç€ñ<å‘*ûýv]E½Ä!_Ôš¿Ÿz‘žª³<ì¯Ç'ô’w"_Ô™šþ^Bè%ù"Ê©—ÆWö>EžŠòe9…½ß©Çó åÔKãÑeÞ†ÇwYN¾¨´<ìs¿‚^â4öþ]žªµ\>Šz‰CžŠrê¥ñxªÚònÆ_§ö'‹Ç-Šz‘žŠ~ÏŠz—õN•]ö?áq§Þ¥½Ó°Ï <ݾ.ü™zÉ;‘/¢¼†^_‚§êàú«e9=ø¢r¸¾=^Ÿzô«ÔKòEå!©×Ò÷©—8xªÆòBç èEÎp>‰×A¾(컲9ôÒøbØGÅù"Ê—å„×…˜/_äy7þýƒÔëãÅiÍ?Èy>ï ópŽz}¼8•y'yªÒòjØ_¾sÔKœfØGÅë#_öKqö9‹ùC/q†)Ý#¥ïñQ/qjŸçø=ÁÒòzÉïÊwù:“¿ÒõTÔKœÚŽŸüUþJ½Ä!_äyþJ½>^¾‹|Q3ì¯âã'ì—V¢sÔKòEa¿óÃçƒO½Ä!_D9õÒxòT¥}®QŽiYyªÖ|T5þ~;õ§&O9õ§ OEù²òE­ù«nü~õ"|Qù°‡^ŽGÝħ^ò]ä©óHáó¾ÐG½Ä!_T›¿úÏþýƒä‹(§^_Ùûù«Âr=¿–æØû/ù«ð<ßð¾lñgè-€SÙûµpýCàPN½4ž|QeþªœñWÄiýýûøýAÏ{øûÕëãå»:ó ºÎÊórüþ sÔëãÅ©ÁS–·ðýAõ'ìgâãD¾Èó®¿R¯g8T%_äyù÷þòªp\Ù|¦^à§ò\ {Í_Mãmå©Èka/p;~ä©*Ë壨—8¥ÿ3þŠz‰Óƒ§¢|YNiçy*ʱ—8vÞûßí¯ÈµKú+â/jïH¯û«µÃÁO½Ä!_Ô¿Ÿ7ôýAê%ù"Ê©—Æ“/"µ4|QeyØ_…õ§Þe½y$ê¥ñä‹Èk-ÍOUX®oëC½äÈSuöþEþ +{Á;‘§ò¼ýõúøbߧ¢Üü•z‰C¾ˆòe9á|7Ýä‹jË›%ý•8­û‡ÑSy.E½>^Þɽ‡<•çÝ’×_‰ö3ñú„}Qø³ç |P½>^œ•ø+y*ÏûòSÇjÏG½>^œÒæ/OU[®ë²œ£^âÜmÇ}¬çòZÔëãÉ;à¯ðWS¯‡â/ò\>ª6Žz}¼¼ù"Ê£^žŠ<Ò²òE]ÕŽïO©—8¥ç§÷ÑvT3ú+êEx*òQa•<¿ô½E‧¢ïñQï²Þ)|ÞÏS×_Q/y'òE…ù«ðùÝêáä@½Ä!_Ԙןz‘žª‚œzÉw‘/¢œzi<ù¢°_ +ë­[7ì¯ÂŸ—åà‹ZËÃuïO½Ä Ïëxž<•½/«Çœz‰SÙû>ù«°Ï‰{Ã熋?C/qÈSu毊Ñ_Q/qZ{ÿ._ö9ÉüGE½ÄéÌ3ÈyÞŽþ +{S˜÷/ò¼¥^/NõªÔ_Éy^¿R¯g8¤%Oåy·ßY5õ‡|åØ þŠ|‘ç%\¥ßÑòñs×_UvêEΰ¿Š9òEåí’ßg8.%_D9õÒøÚæ)Oå¹®§Z–ãë&_D9õâx;~ðW=ü~»æS‡|QaÏ‹nøÜpõ°8ÎQ/qÈ•výU3^E½Ä!_Ôš×jÆ먗8ä‹ZóWÞŸB/rÀ…}Nü¼›¼õÚxù.òE…ù¨v¼þŠz‰C¾¨¿O{a<ú"óWú~õ‡|Qcß+ û«pü‡ýUü¸¨9ä©,Ÿz/ßE¾¨ýƒt?9ÍÓ8ê%ù¢Î®¿j†¿ßy±>ÐKòEù«fôWÔKœC˜?õ’w"_D9õÒxòN”/Ë!_D>Šz‰CÞ©·¿ÿZ¾Žz‰C¾¨ßðxN7ýý’ÐKòEžëú+êõñáóÄ0¿<åÎQ/¯Ì;Uãùòe9ä:óZíÌï_§ U[öWa=©9ö>½¯³ª)‡^߯kñq(_Dù²œ +jYŽ¯[3ú¢»åòQ6õÞm'æ43ß$N5ì£bŽ®³ê,×÷©—8½ï–§*=‹z‰Ó™g¿ª-ûœp?±×Æ‹S€§ª-ï¢×ëx=ÕKœ°/JÆžŠrê¥ñÃ]Nü•|åËrÈSy>y$˜'_ä¹®Ër]Ç%ßUÚã^žªò|ÜŸS/q +;Î'Oåùø¾ƒz‰C¾ˆr?þç®ã"_ä¹®ƒ¢^/ßEžª²ógþJ½Ä!_ö]ñó.œ‡×O +ê%ù"Ê©—Æ“/¢ë©–å/"…½ÿ}|y-òWÄ!_D9õÒø°Ÿ Çnúž åËrÈ•Ãçtqo=^OE½ÈžG1§ŸGåòQØkãÅ)í}SxŸú<×ù{ö3ñüå‹Â~)—c/ŒoÀS–WãõWÔ‹œáu$ž§ÂqžË±Æö>«Ï­}Žß9õ§Îoñ<å©JÏÇóõ§OUY.¯E½Äñ÷Ëáúöp{ÿ.¯…½>~ä„×Áx}ä‹:ËËñû€ÔKœS/pÜÉSy.äó™zíº)'_äë ë©¨—8•'Õè©ËË1Ç^/ŽÿòE”S/'_Dù²÷N“/öWñqÛߤ^âTvþœÞ‡ÚùsÊ¡—8¹óíÚðb9Ÿ‡<ìÓâû¥^¿7EiYù"Ê©—Æ“§¢|Yù"Ê©—Æ“/*á:¨e9ä‹(§^ÿ_ì¯Ð-é¯ˆÓ Ï£Åó)<§†›<åËrJóNÓóÑòvôZØkãÅiìý£üUØçÄ÷«ÏoaŸçê%NžŠrì%xªÚóñóê-|üè»Úáu-¾¿aþ칮ˢ^/Ni¾B¾¨²\ßtŽz‘c¾E¾¨±|òZÐöWñ:ˆ3,Eâ¯ä‹î–_׉áûƒÔ{·ñãï½×Ö+_äyÿ`?öúxq|Ýä‹î–ëóY›zï6^¾ËŽŸ~ôTµå͘ߣ^/ù"Ê©—Æ“w¢|Yú¢%ýqÈ…}Nr<ïO;è%NØÏÄœÉY®÷ÝÔKòE”;G½8¼Sù²òT”c/||QóÈï_‘/¢ïñæÍt]qÈÕ·¥×_µúý+ðiÄ!_TÙ÷øÚñú+ê%N8žW/ºMdzåº.‹z‘cïwºñಜnx]‹×GžÊs]OE½>^œ^òE”;G׃áx[gyª°Ï‰ïo¿ßÞüÃÊß7ä£8?ãþ¼ö|¼.‹z‰SÚq.ö9ñü»ñýö‡|Qeß+ ¿/ºvX|ìµñú½÷°ŸIæ9¾ó<œ—Ÿz}|'Ž÷ô¾2¼OŒ{õ>Ñ9ê û¢xüıóm8ÿ‡y6ö;T͘Soîü8è‹Ìkéï¤^ä û¨ä~éwìûƒúûêù¢~£ô÷3‹ï¯ü»_¦^â/*‡ÏãûU|uå{Ô‹ðTÅúé÷ +}¯z—õNÕcîþ{áx Þÿ·þªöWO½aµèsnÓu\à©Â~)öWáÏÎQï²Þ©žw1¿Ðóz;/ž1GçÒòzôWÔ‹ðTåÅx¾¢Þ°¿ŠçYŽãÑ™jáú+õ§^âÞðù`ø³¿ÖuPÎQ/qZóòEž‡ßý]½>^œjxç/O^¯ã\^Ë9ê%Nc¾EžÊóv¼þŠz}¼8ÃR§þjôEý]w%¾«~ØÃOÊù«©8µÍ_¾ˆrê¥ñ¥­³¾?èëPÊGÁ|ˆSûñ3zªÊòz¼. {m¼|—çºÎª³ï^ùÜœz‰CžªöKññY<á‹7¯ê%NØÏÄœ~8oNoy=æØkãÅA_”9þ®^äØy{zmß û«À÷óp8o/râÀuVÝíéëW3þ~{ ½Ëz§ÊüUØç„yRï²Þ©ztº¿ŸøÔK¾‹ÔÏŸÕ˜S/qÈÕæ¯êñý5õ‡|Qo©öWáø¡^䀧êÌG•òZÐKÞ‰|Qkþªÿ>Aìµñò]ä©Ša•<î£_¢^䀧jœîßÂþ*¬?õ’w"_ÔÙþSëC½Ä!_ÔÂß?H½Ä!OE9õÒxòEa¿´Xï°æíþ~çðçe9áù˜pÆó@q}šwë­|¯z‰Ó˜w*ÆóXkyØ_-æ½Ä!_ÔùûßñüŒ½à»ü}·<•¿n‡ïO…ùS/qÂ~&^ÿÉY^ëõѼz‰öQ1_ž*¼^Çy­ß¡‚^â4æ[ä‹JË+øþ z‰C¾ÈóêÊŸüõúxù®Úç9^gåysëzÝêïõúxy0_7y*Ï;ðWêõñâ„ýLò8Žžª´¼¥^âøq.Oåy8ÃúP¯}ѰωïW þJ½Ä û™˜#OU[Þþªƒ^â„}QÂ߇úù°sê%N ¾¨°ó9¾¿¦^â/*ÁkQ/qÈ…ýR²n£¿¢^â/¢œzi<ù¢òÞéþ'|~·z8þ—å /zHºŸz‰C¾¨$½ÈOÕØï_µ£¿¢^òN=xªÚr]E½Ä ÇsxÜt“/ò\Ï/êõñâ„çcÌ—§jìz€n öÚxù®vxŒ×?ì¯ÂŸ;È©—8áu9æËõg¤y?ú+ê%N5ìOb¾|QØoĹ|õgXŠÄ_Éy^\tÇÂ_Q¯‡<•çòHÎQï/naÿîwÿÒUíš1 ÿ(ÇûQ½tÕ±qÞjüáÏzOœwcÞýæÇÅ9q†ŠÅ:U;­jW Э9Í<.Ωwøÿ²åÅ»œs4ÏöÎߣ^â(¯ÚåÚ,ÿèÓߙͭ—8Ê«£óüz‹w\’å[/qúq«]W]s”×Ï}ÚGã\ëæ½÷߶¹*Ç)¿{øq.Ž÷§÷îömÎÎrn¼Ïaq®ù{ï§Ø%|Vl{òšarºMó·^åÎ)Çù—/zå‡ãy¼ÅñÜ]ú‹ëÄoôxY/qÔ[þj›·åøýÓÿâœxþÔKåõª=.ÊñË?~ëÁ9¾÷Îr>õ‚sc¾Æ7·ïvFœkþÔ[Gã‹O½àÓñ<Å/>}特œz‰Óf—÷Äñ‹“NU|¿”{ï,çg0ÿg|ý}ËôÆÑãR>nÏfçùïéþvš¿õGy·kzþ§;ôÎîI/q”‡ó[nªï|E.÷^â”ãù³<2}ÿ«ù×?¿:Ùÿ+÷^â¨wاϳ«æ?`ÿc½ÄQ>x•dŸ#~û¬o¿åžôGùðÏä¦u(sð!9¾÷ÿsv+Nþ ùw{|fÜþÙ{‰£Ü½ÓÄ74åÖ;å6¾ÕùÜ<•îosקÔëõ-ë'Çq'æ©Ä¯¼~ò¾@¹÷§ùî©&Îû´føCt[<ŽÞKœ)_TÞÿ³äøõG¹û¢r\çþsŸIÎÛÃýXÌß{‰ÓëC¾¨¸è‰— ^â¨×}‘æÙþø —æÖÇ{‰3õš/¿Þn§ä}½rï%N3®{*qúþ’Üü½wŽãžJüîßW%þV9õÇ}‘8ͦOö‡Ê±|ù¢þïŸsDn}¨×9z\Ðí¸áÕ«†IG·Åñï½ÄQî¾hà­pö¼8ñ·Ê ë%Žr÷Eâô/?ðÙù[/q”»/¿Øìòk²|ë%ŽròEõÅéùz‰£œ|Qyô^¯ÌÍß{‰£œ|Qÿ“õ›ß{‰£Ü=•Ö¡?æÑÙó¿÷G9ù¢j·=“÷•ÔKåè‹ ÝÏ ï%N3ž?ÝS Ì•ç×{ýÕš´`‘§Ñpýà §0O%~wÉÿQÞS¯qº±—|Qýµ<ß{‰£}ÑÏÖOö½š¿÷G¹û"qÚŸ­Ÿø%å•õG9ù¢þ7û”{~y/q”“/êïýÙÄ?hþÞKåî‹&Îç·þHnþÞKœ~<~ÜS‰ß~í‰ÿWÞ[/q”»/š8»oœ|n«Ü{‰ÓêygžJœrýg—]ë%N'>ø¢æàÇŸžã{/qú‘ï¾Hóïw}ø>k†?D·ÅùÇ{‰£œ|QñäkŽÊñ½—8ÊÝ•:^ñ„äýép?VΟÖKœv\÷TâTG=é¬xþÔKõº/¿øÁ™Ùý³÷G¹{*ñ›§ýùãÇ{‰£¼_Ômqz—ã{/q¦Ü<•æßï¾qr]„rï%ŽròEÍ—÷È¿¿°^â(w_¤yVOý‡ÄÏ+÷^â(wO%N·Iþñõ^âtãñïžJüúñ¿yeìg”{/q”“/êÚë¹ãÇ{‰ÓëùkžJó¬p@Öox/qÔëžJü¦þ?øØð‡è¶8ÿx/q¦Ü¼S9žÇjóHCÏÊùÙzgÇ›§Ro½Õwω×_yuÑõÙç…{'ÍÇ}Q«ãjužï½ÄQN¾¨>b£3Ö ƒt£Þ`¬›y'åî‹úqþÅ©ßLÞ_h}¼—8åØëžJó,·þböú%ï%ŽzÝ5ãü»‹÷KÞ_S/q”»/§X³ÿñúS/q”»/¿ÛäÏ“Ïm•{/q”»/§\gç7ÇÇ¿rï%Žr÷EâT_|wò¹¡rï%Žr÷Eýøøö·íóùÜü½—8ÊÝižÕ]7­‰ùÔKåî‹&þ ?NüÌ”[/q”÷æ‹:­ÏÞ÷Iöÿßz‰3åæ‹Ä)òëäø§^â(wOÕëüóW~Küü¢^â(w_$N³ï#’÷ÔKåqþåƒv>2>~¨—8ÊÝMœ³®O®/¢^âL¹yª^ëßí|nýë%Žr÷EÍÈonzÒ 1Ÿz‰£|ø§ßV^ï.¸îÞñþz‡ÿy1Þ!Êݵz|¯ÛöÔøñÕøÆz•;G¹û"ñ›÷m¹K<å%ô:G|òEÃOnâ{ï0h±>ÎQN¾¨<ÿúãâÇ·Óq•´.þ°à;G|÷EÓ<¿õÛįŠï½ÄQî¾Hüj¿ï&ûsåõgÊÍS5:~Þ½Q²Ïß{‰3åæ‹:=¿®:2ñKÔKåî‹4Ïæ[O:!>þ©—8ʇ÷¹Ùשú>uM|üP/q”“/êθò´ß{‰£Ü}‘æÙþñ…WæÖÇ{‰£Ü}‘Ö¹½ñ²³c>õG9yªöm«“Ï益8¥öÿæ©úñøl?úµ¬ð^â¨×}‘Ö¡üÊ“ãg®×9â»/Ò:4ý?~,wüx/q”»/¿Xÿío‹_åÞKåî‹Ä©Ÿ|áY9¾÷G¹{*ñûw•Ýz/q”»/¿»ôýÙëf½—8ÊÉw\œ\ŸI½ÄQÕëà5G&þ¡Wn½ÄQN¾¨Ür‡2ö3ÔKåî‹´ÅÙù×wï%ŽròEÕ·{jüü¢^â('OUîÿšäó5ñ½—8¥öEæ©&x$ìµñâ¸/šzøFvÿÙ¶÷yN¼o$N«}‚y*ñ«w¥|åµõgê5OÕ½ýy$þJ|ïã¸/*ô¸Üµó¹ññC½ÊÓŽótO%~¹ù翤¼¶^â4#ß=•8囿ø±)·^⨗|Q¿ÛqÉþmâ[/q”“/*ïüŸ¯¿øÞKåä‹ÊMþ=y}ß{‰£œ|Qõûò|ë%N¯ãÜ<•æY|öÉu¿Ê½—8S/ø¢öö?¿¾‹ï½Ä™rðEí?ÿX/q:­y*ͳûÈ!ÙÏ—½—8êuO%~¿öºä:UåÞKœ~œažJœª7ï%ŽròEåÚëšÜùß{‰Óéñî¸ÝV|ÑÇóÇ÷G9ù¢êã×e¯òä¸%N«ã|Q³Ûq‡åÖÇ{‰£Ü}Q¯uÛâöäóa ëæ½Äitü˜§*Å9ïÉçÔKœNëcžJó,îz@òù õ§ß<•øÍÚ7&ÞI¹÷G9ù¢âk;ïž{|½—8Ý8òEý½žš|yš¿õG½î©Ä©6¿ý͹ù{/qÔëžJüæ¸ OÌñ½wŽã¾Hüþ1kÞ°jøCt[9þ¡×9ý¸þä©ŠVgÏÞKœvä“/ê6~ë¹ù{/q:ÿ橦ùœ°á‰9¾÷G9ú¢mÓóõG¹û"qº³Š÷原Îz‰£Ü}‘øý+K®Sî½ÄQîžJœò±7\Ï_¹÷ÎqÜS Çûâ8/ÎþÃÄŸˆO½ÎiÇã§0O%~}"쬗8º_ä‹šëò¯¿ÞKåî©zݯèÄ0þëÊùÁz‰£Ü}ÑÄ¿è€äó¯)·^âhÝ)ï/NýÉÄ·^wÎÔkÞIãÝ#)÷^å>¾”‡1_4ÍóÉ'$Ÿï‹S]zMrÜG¹û"qºïŸìo©—8ïžJü~˽Úìùz‰ã¾HüºÚ+ûþ”z‰Cžªyì“Ïçz‰CžªÿØ^ïÏ­õ"í×W¯þÝVΟÐKòTÕOoH^‡žŸz‰ã¾Hœþ//Îú+ê%Žû"ñ»ŸvïÍ?ÔKòTewAÖc¯y'ÍÓ}‘òbë'žœ›?õ"Þ«œ8䋪¯?3»ÿ§^â§ê°*»þÔKòEÅÇ/Ͼ?¢^â¸/ÒñÓ¼é1̨×9z\È57ÿ윘?×KòEÅW]ó5ïUNòEÍó¿|eŽO½Äq_¤u(¯Ú*ù|MóÄ^ð]ä‹š³×œÏ¶|ù¢î€ “ï_Oó·^åÄq_¤y6Û¬›õKØ ¾‹|Q½Õ6æÖ‡z‰C¾¨;æÙçÆ|­ƒ÷*wŽÖ½Wã‰Cžªþ«m²×OR/qÈS·Þy|¼>š'õ}Ñz·d?¡^â¸/Ò<›Ý™}×P/ø.÷Eâw·z£çù¢æEy?à½ÄQN¾¨þÖáY¿ç½s÷TÓú˜GRN½î4ž|QñÓÿ–ø‡iü¯÷Î{ó]Óý2_TŽû½úÏ~ž}í½Ä™æcžJüæ±?}|~PN½äÈÕ']–ømñ½Wó$ù¢êïöÉ~?Â{'¾ù.­ù¢î¯Îúïã¸/Òøâ¹·dÏÏØk¾K÷‹|Qÿ'˜ø¹^â/ªßrWöú"ïÕ<‰C¾¨:ãæìïÓb/ø.òEåïüpîõ…z£õtOÕ×Çvçž“ýýIï%ŽÖ|QýŒ§$ߟë%ù¢f¿»²ç1ïÕ<‘Cžj>ûþŽzÝ;iÝÈS[œø½ižÖ;ÇqO%Nó8?C/qÜi>ÝGÿõÀøü<×KòEí??O½Ê‰C¾¨8û¢ä÷%4ïUN÷Eß]û“ãù+§^â/jþôçY¿D½ÎѺ‘§*¾wöûkÞ;Çq_Tjÿ°Û­ù÷§Ðë­'yªbÏ}’ïïÌõÇ}‘8Å+n;>z¯æéåè‹îØû„øø™ë%ù¢æèW¿7æk>õ*wŽw÷EÊ›ýö|GŽï½OòEÍméúˆã½Ê‰ã¾Hë\W·¾sÕpç£ÛŠç´Þ`|^o¾K9ù¢òoìÏK=/ —8ù¢‰sÛ·²¯/Þ«y:G9ù¢úÓ;&¿ï=Û ¾Ë}‘8Íœœÿ5ïUîåä©Ê_ìÿéøøœëuŽŽ+÷TÊ«‡£‹ùš÷j¼s4}Ñ]¯KöŸâP/qÈÕŸÙ19>§ùX¯rçh>î‹”÷[<í¹õñ^wŽzÉ•Ü=¹¾Wê%Žû¢nÜ?÷ë¾î°ÜùÁ{5OçL9xªòÕÛ&Ïß¹^òN䋆÷ÑÙÏG¼Wó$Žû¢r<5Ûÿà ÜúP¯sÔKžªÊÏùs½Äq_$ÎÐï·ÅyÞ{‡A+çò]æ©Êq|qÜe‰?œroÕzG½ä‹ú§žgâ[ï½x$ᅢñî‹4¾:d׬Ÿ¬¾¶¶Ê]7åÝ_òEýoJ>ÿ¢^â(w_¤óL»õ…Ùï—y/q4÷EâW¼è¼øü©œz#>ù¢öœ}/Ëñ½—8Êѽê“Éùš¿õGãÝS)o¾ðÙüç§Ðëõ’/*Ͻ2Ù?ÏõÇ}‘8ý“N<7^ÍÇ{•;G9ù¢ö€/œóçz‰ƒ¾èQ§&Ÿ¯i>Þ«Ü9ÝŒ§ê6}Â×üëã/ªo¹ô€UÃä¢ÛÊyÞz‡ÿ¾È‰C¾¨üí©Éñ©—8ø¢æ¸ó?–ãS¯st¿ÈSU(/ùÓúC/qÈS•÷>ø€5Ñâk>Þ«Ü9šzªö«ÉùMïã/j.Íÿýk ô‡|Q{ÞW³Ÿ/P/qÜéþV??èEñã«õ¡^çh¼û"åÅz?;~|çz‰ãžJœ¡Ço‹ç©÷ƒ¹sJ=¯ÉS½ôû‰¦Þ9ù¢¾}xöýWi½š¿sÔKžª}Ýã’ù‹ã½sòEåÛwÍ^_G½Äq_¤y–§~5ñ{S½ÎÑãå¾HœöÛ]œ;þ½wŽCžª="¿¿¥^çèq!OÕyNr~Ó<½wŽã¾Hã« Óç¯ÖÍ{•§OU½òûoˆÏÔ«œ8ä‹ÊCóëz¿sÔKžª|Üo/Žç/Ž÷ÎrÌS‰Síù‹ë²|ê5ŽŽòEÍ/Î^_í½sœ +|QÕš½>{ã¾HëÓovÓE¹õ¡^çè~‘/*Ï9§Íñ½w–cžJóo÷~þY«†?D·•×©sò½îºOÕ¾ÎÏÖ;Ç!_Ôô¾ìï3P/qÈuOÏzSÊ«§ÚîÂsëï½sôE»~?ëkèuŽz‹»ßÇ ù“Îz‰3åä‹öÎï¼wŽC¾(prϯz‰CÞ‰<õþ®ñ¹ã¤?~··åòâ _ÎÞ/_·áa]<Žè‹ö¸WvH½ÎÑy‰|Q¹î†/Ž×_cc½ÄQN¾¨þÚÉßï£ûë½ÄQîžJœö¿?éêxþʽwŽS™/§ºê£Y>õ:G½î©”·GïüþÜü½Wã£yº/Òø®ÿɹññ©œz‰Cžªù©ÉùM|ê%ù¢æyç¿&ž¿î¯÷*wŽæã¾Hyñ?IöÏâx¯Æ;GãÝS)/ŸþŽdÿ&õÇ}Q©×µ}³Ë?Þ«ù8G9ù¢òÙÍ{bþl¯ù.Ý_òTýÇŸþÚ˜?ÍÇzç8䋪›’õ«ÔK÷Ešg·ÍùÉ߯¤œz‰C¾¨þú ‰¿Ÿz‰C¾¨?ö;§æÖŸz‰C¾¨~̶Ù믨×9zÜÉSuå?f?Ö{ç8ä‹ +x}§^ç¨wxÜü¶xÝoÿåìç_Þ;Ç!_Ô<1ϧ^â/êþéÔ¬_¢^ç ‹²XòEí1éþªÇS/qÜS‰S¿ú^ÙãÇ{5OçL9xªêé¾xÕ0H·rœ?õºwþ¿•õOÕüÓÉõ!ï½ÊÝ;é¸r_¤ñÕgþõ¼xþʽwŽC¾¨ùõ/Nʨ×9å¸>ä©hŸì½sòEýßlxUn}¨—8î‹´Îå š|þ¢œz‘¾¨=eƒdÿ/>õ’ïr_$NqÉÆ—æÖ‡z‰ƒ¾è{\ãS/rÀSU—™=þ+è%ïä¾HëÓoß¼'7ê%yªæ+’ýÛ\/qÜSéù^>ôËÛçæO½ÎÑ|܉_ýÇÏY3 ÒM9õ:gøÿçO÷E¥ÎÇì|HŽï½Ä™ròTW®N®ß¦Þ9ù¢îµë&×MëUŽóEßÂþ{CÞ£8.}}Ÿë%ù¢ê‚ ž“;>©9æ©J?_=5¹~[ó§Þe½“{¤¹^¯ùøë‘žGÅ!ÏI®ÿWÞýê#Ù}‘s4òEõ/¿—øUñ½—8š?ù¢úµÍ;âÇW|ï%ŽrôE›¥¿ÉÄ·^â(w_$N·Ë5ïÊZë%Žr÷EÊÛCÊäûƒÔ«ñÎÑxòEÍw.ÎúêuŽø䋪»®:%^ÍÓ{‰37OÕŸ›´½aâoÅÁ^ãL|ðTýK.»2>>©—8šù¢bç'\óÅñÞ9Žû"ͳúöÇäÖŸzSŽçÉÆ<Õ4ŸWüsr|R/qtÝSMü7­“üý¿Sn½ÄQN¾¨Û÷MÇÆë3ñ­wŽC¾¨n®M~IïUNôE;]ó¦xþâ`/ø.òEí–?I®Ÿ¿¡^ð]苶볟ÏR/qÜMóüÀÙ÷§-ôÇ}‘Ž“þ—&×·Ïõ:Gã ðTý¡ÏIüÌ\/qÈÕÏÈÿýSÞ«yÇ}Q7žŸ›Û¿—œŸÅ¡^ç”Úÿƒ§jw¾&ÙRï,Ç<•Ö¹´ý•æï½Snõº/šø¿ø^òýÓ)·^â¨×}‘8í«›wÄçå¥õG¹û¢)¿ÿ¥Éû#ñ½wO¾Ë<•8åß•õõŠOÞÉ}‘Æ—kßzíªáºÍö‚ïò}µ8Ãó(}ˆõý‹÷¹Î™rðT퉇ž—{|©½“y*Í¿yæ†o‹ùš÷*'ïD¾¨9(ÿúŽ½à»Èµ¯}~òù©æé½Ê‰C¾¨øØf¿ŸB½Äq_¤õïßÿÅÆÇç4OèuŽÆ»§¿¸Oú÷G+§^çˆO¾¨ànÉ÷CÅ÷^âh¼û"åÍ7—ý|z‰ã¾HüòŽôõK¹÷*wN)Ï žªßïyÉõâx/q´nù"qª[ó¯/ÞKœ)7O%~ùæç%Ÿ_(÷^â(wO5qÖË¿¾x/q”»/?ìsâó›òÊz‰£Ü}‘8Í°¿Êñ½—8¥ŽðTð½w–c×;iþ䑨×Ç‹ã¾H÷·¿z} ÆW·½t§Üº9GãÝ)ozqÞƒA/qÜSMó?êñÙç¯÷j>ÎQN¾¨¼ÏiÉñ3×ëñÉSuïZ'ù~–øÞKw_¤¼¸ßiÉçkz‰C¾¨Ø¨Î^_佚qÈ•½¥Ž_5ïUîœnÆSÕ¯yIöó/ï%Žî—û"åõþ¸ÍÍŸz‰ã¾¨ÏKÍšgý•÷j>ÎÑýrO%~µß ç¯Ü{‰Óë_˜/RÞ}ûô÷åøÞ«ñÄ)ÈýÑégÄ|q¼W9qÈ5Û¾(yýÕ:÷Ö«œ8è‹ŽûáéñüÅ¡^â/êþlÞQ/x'ôEÏùqöûÔK÷Ez¼ªõÿ"ûýˆz3­'xªnzëxýçzãhõ†}Qn>µy*ݯn½Ó’ϧæzÓ§¿}ðv/ˆÇ@¹÷Góq_$N¿núú®Ü{ç8î©ÄižRo½føŸuSN½Ä!_ÔÞïúäñŸz£ñî‹”×Ãþ*w>5OïUNòEÕº§%þŠz•Ç}Ñ4~ó{]™›¿÷jþÎQN¾¨Ûï·ÙëÏè%yªrÕíŸÉÍß{5Oçhȵ7¬Iæ/Ž÷G¹û¢)_÷>¯ñ½wo¾KãÉ_øIâ÷&ôÇ}‘z«;?óüxý'>ô:GãÝ)¯p}r}È\/qȵ}K¯?õ*wŽròEÕÆ×'ßOÑü±|ú¢û¾¥‰×_|ïÕ<£œ|QµáöÙïµÖKåä‹š=ìÙù[/q”»/R^š'Ñúx¯Æ;Gã óTåøº\û·xþâP¯s4ž¼“{¤¹^¯ù÷¶âÏÜ&y}™òòo©s4÷Eâ´ÝÁÉçãʽ—8Ÿνy*qÚûßrlüürë%Žr÷ES~žÉþpâ[ï4Þ|—îyªú’};q¬wŽã¾Hó,Ë÷^¯øÔëõº/¿ÙuŸÇ|åÞKÍÇ}Ñ”ïð åøÞ;ß徨ß7•[ïx\ÌŸ8Ö«ù;GãÝi|õàë.]3 Òm®×9¥öÿà©ÚgüeòùõG¹û"ͳ¾åÝkrëã½ÄÑ|Üi|ÿ«“õ§^â:?€/ê×ûÓ£ãùSï‡|Qñ ã“÷Çz•§3_¤yÖ—\ûþxþâP¯s4ž|Q¿ù6gÇü¹^ä€/ê÷ú@öû Þ;ÍÓ8zÜÉSU'}òŒ5ÃÿÝV®C°Þ9Žû¢RÏ»Ï>1{ýõ:g˜×Ê|ÌSi>ÍfÛ$×Íõ’wrO5q^pçÛãõ¡^ÍÓ9ï¾Hy?¬Oîøi —8è‹6|ÜKsþÊ{5ç(w_¤û[ÀãÛR/ø.÷EâWÃ:Äë£Ü{5Oâ/j^÷¬Ÿ¤^â/*Ö¹%{}©÷jþÎQN¾¨¹ø!YÿL½Äq_¤Þö‘Oÿûxý•{¯râ¸/ÒãØüöÉ÷§&ô§0O%~½Yz~Vî½Ê3ÍÇ<•ò~³½“ë“Åñ^'ßE¾¨­;;wþ¡^ç¨×}‘òòÀÿù阯ùS¯s4Þ}Q9ž·ëM×|$æÏõ:G|÷EÊ« 7û`̧^'Žû¢iü!wæŸÊz5Þ9º¿ù¢/}â¨UÃÿݯw¥õgÊÁÕ/?'ûûº½õg˜×b>è©î·ÍñüÅ¡^⸧§xaþõ·€^çhþ䋺ï}õäÜü½—8ÊÝ•Ú·ìù·ÉþS÷Ë{‰£Ü}‘øÅ‘uòý#å½õG¹{*qÚÏ¥û7åÞKåî‹”W/J_ßÅ÷^wŽÖ³4?£¼Z•úq¼Wã£ù¸§§Ü.|z/qÔëÞIã ðHÞKã§ÜõÎrÀu_9"»>½õNóŽû¢iž›þKöüC½ÎÑý"OU>cìõ¥½õÎqÈuûÜ›ãõ×:x¯râ§j¾òËKrÇ?õ‡|Qû«‘ãS¯s´ny =¾ÝIŸû›ÜúxïÇ=•Ö³¶×YêU×|‘øÝûò¯¿ÞKõº/¿ùòÆÙÏ—½wŽC¾¨|o~þÔëÍ}ÑÓÇWó¤^çˆO¾¨Ùò¼—|l¤›øõÿ}å}–ù®izïÇ}‘æ9üÓo+ï ×9z\ÜMùÞðøZë4|—û"/Ïú§äóSåô:§/òTî‘Ä÷Þáî,ÖÍÇ+w_¤¼}d‘øÏn|¿ß}~ÏäsU'Žû"¯_ºýɹóƒ÷j¼stÝMó<ôïòþÁz‰£^òE]½ýÕñüçz‰ã¾H½ÕŽÇïó•{¯râ¸/ÒøþÅùë託8ä‹ú—ÿ·¹óö‚ïr_¤ù×õ'’ëC”S/qÜMœGnšü~…rê%ù¢ú+J®¿‡^䘧ÒñÜ¿û’ë»Ä§^÷N¯rê%ù¢úÂÓ(~½È1O¥Ç«Þòï’Ï¿¦Üz§8ä©úG›½>Šz‰C¾¨zX±GîùE½Î)åCÀS5ŸÞó1_ëï½s÷EZÏ~“=²×‡{¯ÆÇ}‘ÆW»ä¯?¡^â§*î—G½Äq_4Íÿù÷¿ÔK÷TÓãø¥=³×?WÐëÍsø§ßû¥Êøs½™Æƒ/jnHÏÿÃÿÿ»{#>ù¢zاÅÇ¿øÞ;ÇqïÔÍx$ï¾èü>™¿8íE}ò¹€îqÜSéþ¶[ƒ?±^ñ£ùtà©Š-_ž}ÿè½s÷E_ÿ|Ÿäý¯æé½Ê£Ü}‘Ö§|ÖËw‰Ÿ¹^çˆï¾Hœrã¿;/æS/q¦Ü<•øÅ>/ßfÍ0H7åÞ;ü÷Åó½“y*ͳ¸v›kâù‹ï½â“w"_T½xí‡c>õŠO÷Eâ4< ùüKïUNòEÝsÿGòý>êUîõº/êÆóOÿ”—^™[ï%ŽzÝ)o>ÿß’ëæz‰C¾¨¸×’ߟ§^åÄ!OU|÷œìó‹z3­xªê¾{'þVóô^â(w_$Nõ{Mòùþ”[/q”»/§=ðWÙãÇ{ç8î‹:Ÿ»ý6ù|p¶×|—Æ“/ªœþýïs½Äî_r§Û½ä:çaÐÊþÄz•'áÓü͵ãúÞúÄøûwÔKõ’/j.é?F½ÄQî¾HólþúAÏÍúë%ŽîW¾¨þöѯˆù³½Æß}‘ò~¿õ²Ÿßy¯Æ;G÷Ë}‘ò~Ótÿ õÇ}‘8å·¯>5>ÿS¯rç(w_$~{~Ÿ=R¯sÄw_$~µú廬é¦Ü{‡ÿ¾xÞÇ}‘8ýýw=3ǧ^稗|Q»:Ý_Qï‡|Qý§ä?¿°^ñ3ÍÇþÅñ^åÎÑýu_¤¼ùΉߣ^wŽzɵÿøáäú@q¼wŽC¾¨^ßsëã½â‡|QÿØ£Ìñ©—8î‹´õéùgš'ô:Gã݉߾2ÿúE½Äq¤Þæo_¾ÍªáºÍõÇón<¿U§þdèY¼Žx¯rç(w_$~±Eºþʱ|ù¢bÿõ’z'qüz'qÜ#)§^¯ÞÊ|Q¯õßæ²äù¥¼Ûö²ü¾8î‹Ä©w= ûûô:Gó'_Ô¯ZçÐøùK½ÄéÆu OÕmqPÖ_y/q4÷TÊ«íÎÌî¼Wã£^òEÍAÕ¶¹ç¯÷G9ù¢ò…'óµÎÞKœ^ûóTâô/>à5ñã«Ü{ç8î‹4Ÿ~«Ïí›ãS¯sÔKžªÜíÆ£âõ¡^â(w_¤¼Üÿ=]ÌŸÖÇz5Þ9ݸþä©ê³žw]ÌÇ{ç8ä©Ú¿wEŽO½ÎÑ|Üi>]sŸ³b¾rêuÎÄ7O¥u®w¿1û÷'z/q”»§¿Ù)ÿüò^âL¹y*ñ‹­ö>3^åÞKåî©Äé_S]šã{/q:Ÿæ©”7»V»æøÞ«ñ½q4O÷TÊûW]¶{̇z£ñxªö%ùÇ—zÓêüižªój‡ôõ]÷Ë{ç8î©Ä©O½ÊÓótO%~yå¶ý’rïã /ºîI»äøØk¾K÷Ë}‘æÓŸ^íºf˜´nßY¯rç ÿßÊç>æ©Ä¯·øá[sǧ÷G½î‹Ä¯^rÀñü•{/q”»/§Øî²ìþÙ{‰£Ü}‘øí«·M¾¿¬Ü{‰£Ü=•8Ýg&Ÿó*÷^âèqqO¥¼Ø1=?ˆï½O÷EÓø#/{aüø*÷^åÎÑ| +óTº¿í°ÿÏñ[ëã¸/Òøê^_K®o¡^åÎQî¾Hyyr—ý|ŸzÓéüžªØeç·ÄÏß¹^÷]z\Ü©·¼þ¨äûâ{ïÇ=•øío¾ü¡xþʽW¹s4÷EßüåË’ßVî½ÄÑýr_¤ñí³^–ø7ñ½—8ÊkðTÕ‹N<<>þ©wŽãžJó¬¶úá[c¾8Þ«Ü9šû¢‰ÿÑôýã”[/q”»§Ò|ꇥ¯ßzç8ñÃù3·>Þ«ù8gšy*åÝ ROB½ïÞI¹û"qŠä__¼—8SnžJ÷·®î8#~þÎõÞSï$y$êõñâ¸/šæÿÝí“ï*¯Žzqöw)#¾{*qšCM>ŸR^[ïÇ}‘8íw·Ï^K½Äq_Ôé}Á¿äùÔëÝ/÷EšË“_?¿¨wŽã¾Hüú û'ǧrïUN÷E_oR'¯ïS½Äq_¤ûÛmù‰ìõçÔë­§{*ñ‹]a¼þʽ—8º¿î©”wë?*¹þJ|ïÕxçh¼û"åíº[e_ê%ù¢þ9ï='w~ó^ÍÇ9Ýøù¢òOŽñ½—8ÊÝ)oo\'ñcâ{¯Æ;G‹û"qª÷þYþû§ÖKœ©×<•øÝæ_Í~“zÝ;‰ï¾HüÖΟʽwŽãžJœþ‡éë»rêuŽz݉Ó}?Ï÷^â('_4ü÷äF½Ã …çqÎ4|Q_ùÃÊu8öˆÓÏGòEmshöø7|Aå䋪ç\šõÃÞKåù­x³Ÿnÿ®Üùß{‰£œ|Qý¯ÛŸó©—8ÊÉu[§ëÓëüi½ÄQî¾hâ—ß'{/qt݉?õ*wN7Ïî‹´>ýÞG$þG¹÷G9ú¢·>#Ë÷^â(w_Ô÷«½×w²Ÿo6Ö;Ë1O¥u(¿ù³ìõíÔë¾KòEõÓóï¼—8º_î©´>ÍÖ›&ß?Ç{‰3åæ‹”·ßÛ=ù|z5¾2Î4óTS~Xúú(Ž÷Nã£ù´æ©”—Ãúçž¿µõj¼s4÷Eßü(ÿúè½s÷Tâ·ÿšçS¯s¦u3O¥ùôÇä_¿¼—8š§{'wD½4^9ù¢r‡‡e_¿š3Ö^n_áñÝé~µÿëÉu\ʽ—8Ê݉Sl”þ¾Ÿrï%N7ž' óTâôÌó½—8êu_$~ñÐõëx•{/q”»§§;yƒìùÙ{‰3åð>«ÙõÑÉïKPïÇ}‘8õÿ¸1ñŸÊ±×|—Æ»/R^¾©¿8>¿)§^çè~‘/ªwþLrý³øÞ;Ç!_Ô}k㫳ó‡^â¸/šæ¹ÙŸgÿþ)êuŽîyªê„%×/Q/q¦Ü|ÑĹõ†csÏ/ïã¸/¿z£^ã—ÐK÷Eâ÷'l°oŽO½Äq_$~}ï““ëÓ”S¯s´nä©ú}žå{ïÇ}‘æY|ë±ïÎÿÔK÷Eÿù×/ê%ù¢òâÓòŸC/qÜiþÝÆÊ~E½ÈOÕ=òQÉç›s½î»ô¸ÿLnâ4üåêøú(åÞ;üÏ¿Ó;%ðáâTð¨ÃsÏ/êuŽz݉_üz£Srǧ÷Îq܉ßýr£ór|ìßÕƒ§j7ʯ÷jþÄqO¥ùW7?6ñoÊ©—8î‹Äiž˜ß_Q/q܉_]wBöúê%Žû"ñû—=úÂÜñI½ÎÑãB¾¨>üÍÉïRïÇ}‘8ÍIgeÿþ2êuÎÔ ¾¨Ýð[‰ÿ¤Þ9Ž{*qªv‡}rëO½ÎQ¯û"ñÛÏ?ëìÜó×{‰£Ü}‘øý¦øPŽï½s÷EÍ…]ŽO½Ä!_TþþW²Ï¯z£ûå¾Hó/ß¾ó¹Ç×{‰£Ü}‘øí?>$y­Ü{ç8î©Ä©žöÐìúP¯s:yBòTëæ÷‡ÞKœé~/ê_ÿØXïÇ}‘Ö§»ä´ìçÔKòEí°¿ÊÿÔ‹ðTÃýNnº_ÔëÞI zª&|&¥Ãˆ3ü§Å¾Ë=•æéIy ½4Þ}Q©Ï×®¿î¤xý5ŸnÕŸœçêuŽròEÝS¿xrÌ¡^â(w_¤¼ÿÅÉçÓü­Wã‘žªyê³~À{Åwï¤Ü}Q7ž7škO®ãõÑxêuŽÆ»§¿¾á ‰ŸTN½Îß}‘Ö¹>ü‚Ä/‰ï½ÄQî¾hâ?ÿ’õŸrë%ŽròEåï–ø«‰o½ÄQŸ_í÷Î~þè½ÄQî¾hšgýúäóGê%ŽòÒ<•øíÍ·'¿¦¼¶^â('_Ôoqa²?ß{‰£Ü}‘Ö¡xýa'­ Ñmåºë%Žr÷EoÁiîwéÕ1¿sï%Žr÷Eâ·§¾.ñ?ʽ—8ÊÉõ¿sâÄ÷^â(w_$Nõá““ý›rï%Žr÷Eâ»ïÑñú+÷^âL¹ù"qÊîääóåÞKåî‹Ä)Oyä1¹ù{/q”“§ªÖæ×Ç{ç8䋺«O~ÞšáÎè&Ž÷*wŽr÷E¥ö'ëÝœø¥¡gñ¼£^çˆO¾¨þîíÉç/ÔKåî‹4ÏúO^—\ß;åÖKåè‹.Ü$ù|dâ[/q”»/§\ý'ÙóOo½ÄQî¾Hüú„7%¿Ï£Ü{‰£Ü}‘8ýW$ûXåÞKå䋪ú£‰ß{ç8î©Äi·=v«œ¿õ^ñ£Ü}‘øÍKŽË¾¾S¯sÄwO%~¿ÅÃ>‘;¿y/q”“/*Žý÷æøÞ;ÇA_ô®ßf_Ô{ÅwŽròEÕæïL®Ï׺ÕÐëñ݉S\ñÈçÆçgåÞKœ)_ÔÿüàÄŸˆï½sòEõù¿wE<ÿ‰c½Ê3åà©ú‹791wüP¯{'ñÉ•·Ý~DvþÖ;Çq_¤uîßû¦äû)âP¯s4ž|Qõ€üë/õ:G|÷Ešó¼c·ÚbøCt[ñ!ÖKåî‹ÞÊ>a»;O‹×_¹÷G9ù¢êÃ÷Í^ÿÖYï'ºÿú×ÅüõýSïU®qú§r÷EÃ_ðËoÉþý¼úÿõOâ(wï$¾{$åÔëãKíÁSUÏ¿ãœÜã[îÿ„—ÅùÇ=•æÙ®ýzòüRN½ÎÑú¸/Ò|ºO}={|z/q”»/Ò<ëóŸ}تẕz^X/q:ðTâT÷=í²˜?ô,Ž+ï%Žr÷EâÝדý!õÎqÜSMüõ¿—Ý¿y¯Æ§6_¤ñý÷6;7>•ÐKôEgýaöø§^ç”ãã…žê'7$ï/úñx¨­wŽã¾HëÐ<¸<'wü”Ö«ñÄq_¤ñÕ§.Ïò©—8î©t‹Ó?ños½È1O¥uîÿùåGÅÇõN¹q4÷EÊ»Ÿìô¶xý©Wã‰ã¾hà!ïˆç¯Ü{•}ÑÇ¿~dŽß@¯sÔë¾HyÿOØ.æOë½Äq_$~ý©üü½Wã‰ã¾Hã«gß•ÝŸP/qÐ=)}ë%Žû"qŠO¤ë£õï¬W9q܉ßzýßÇÇ¿rïUîœRûóTÓ|†ùçøÞKõ’§ª6¿:ùý„¹^çL|óEÊûÒã_óô^'ßE¾¨zêÕïÊ®õŠïåñuªøä×O‹ùÓú@¯sÄw_¤¼xhº>Ô«ñÄq_¤ñ凎{g<åÞ«Ü9Óý5O¥yöMþø÷^â¨×}‘òáŸÉm®—8î‹èbŸY½æðü÷ë“ÖÅã‰ã¾Hüþ=ëž’[êuŽÖÍ}‘Ö¡½æ~ÉõcÔKw_4åw<*y7×K÷EâWÝ9»ÿ¬­w¾Ë}‘Æ—|Ñ[³ë½ÎѺ‘§ªNÙ1ûûÀÞ;Ç!_Tíù´Ä_é~Q/qÈS—=û„5T7ÍÓ{•;G¹û¢·x¾ˆýs%‡^â¸/¿ßè ÛåߨOÿºè%yªæÓðú ½ÈOÕî~ÒËrþŠzÝ;iÜ)/Ÿš_êuŽ_÷Eâw°ÿñÞ9Ž¤èŸ+çÛ}u‹ÜúPoôÿë_òEõåéþpøŸ~g/qÜ;‰ãI9õÒx÷Eå8ÏîÀ/%ßß¿zû³ï[£ñü~§&ûÛ¹^çLã͉ß\ðþ¬ÿi©8î‹Äo÷ÿÒŹóõ:Gó'OUÜtÛañù“zg9ä©Ö?5ûû™ÔKÞÉ}‘žÝƒNM>_˜æI½à܉S¯möû×Þ«usŽæ龨÷çÝk>²eüøÎõ:G½ä‹ú=N^©wŽã¾hº_§|fßxþâx¯rç(wO%~y\ý˜¯¼†^ç”z7O%NwLJÿʽwŽãžJ÷«~Ì'ÛÜü©—8î‹4ÏêéÏ93æS¯rç('_T_ùëÄÿÏõ:Gã{ðEÅ:éóWó¡^â/ª/h’ï/‹O½ÈOU=$}}ŸzÉ;‘§ª>yUòþ]|êuŽÖŸ|Qóƒû“;~¼—8šù¢á¿'7q¨—8î‹ÄéüÒQ¹ù'¥+XÙ?Û~OœŠ<ÕWnzf¼ÓxïUîœr<ÿ/jÞü¥ÄoS]™§õÎqÜSi>ÝÇóÇöšw=ÕŸ”|>¥ñÞ«Ü9x*­C·ûY[~løCt[Yëã/jÊ?ÔKòEíÁùý-õ:G÷‹9ÿý ê5ߥu#OUüˆ«ãóõÎqȵÛ=5ùþ‘î¯÷*'Ž{*'Ý£¶X»føŸ£ÛâñÂ^ðNî‹t‹Ï>ø1®×9üVŽóTç=Ÿ91æSï‡|Q}Û}÷ŽùÔ«Ü9ê%OÕ¿aß3r|ï%Δÿß´ÝçoK®ÿÔ<½wøçó×=•8íùMrý õŠïåî‹Ä/^}ÖŸÅçåÞKåä‹Šg>à…¹×wïã¸/Òøòàüë»÷NãÁw‘/jÉ¿~Q/rÀSõ7¦ûÍ“zà¸/ÒqR=ù—{ǯøÔëGïdi®×½S9>/ÈS•ë•½~©Ù½J>—œã¸/Òýê~xyÖÿP/qÜišo¼+ùû/æz£ñè©6H×g®—8î‹zù“Ý«äûéšOc½ÊSêõÅ|‘æY¿ù’ksççÎz‰3ÍÓ<•øía·%×)Ç^ã¨×=•8Õ·ï·j¸óº)÷Þr\⸧§{Ü.[Å룜z3Ìkñºã¾¨ßòoÞý¾Üü½wŽã¾Hüâ_¹"æ+÷^åÄq_¤ñí«ŽJ¾?¢{Áw¹/Òýmß~PvþÔK÷TÿEÛf¿_à½ïÝ_òTÕI¿M~¿EœÖzç8î‹Ä©ÞµÉ¡ññ9åÐK÷EšO½Ñ.ÛgùÐëÍÇ}ÑÄßÿ’ïGL9ô:G|÷EâtßÿBò9‹òÚz‰3åà©j{ß{‰£ññüP}ü¦üõ]ÐëõÿLnSïCJ®¯›ëM ÃÄq_4ü§Åy¯{HÊ×øÆz•§7_$~±~ÊWî½Ê‰ã¾Hó©ŽùËõãý³8ÔK÷Eç–Ë“Ï©W9qzóEâ7Glr\|þW^X¯râ¸/Ò|Úg>æM¹ý-õ:G½ä‹Ú‡•\_7Ûk¾kožJy³qÊ×|°×8O¾¨º5ÝßÎõ‡|Q»Sêg4ïUîœRûóEšg÷£ôøÇ{‰£Ü=•8Õ-—'~›zg9æ©ÄožrØrÇ¿÷j~f{Áw¹/êô¼Þ(ÿú彚'qÜSMüáŒoSn½ÊÿŸêÎ<ÞŽªÎöÕ­€2[e ­¢L +´J,&QH˜Â”0cÍc–."„f”Pa ˆ’P EE°EJ„E™DTúí{ÎYÛ½W~ëî\žïó^×¹9ëîó]¿Úµk×®u†ËÿÜ~¾M9tΑÀ‰=ÿïq¸=8œuèŸW®9'î´¯þbëÌA{•Sµ/]sÎèAC?r¾ÌÁþrNN;f¹ýb~¨‡|í9/ßUËí÷tå«8œÁ·øÁ¤SâúÁ—¾”;a¿T^Ô¼pMó•¯â@ç¼(Ô¹ÙýÇZýþŠó"ð‹Ý–¼¿º#_Å®ò¢æ½Ëm÷øì«8hÏyú¹}b óú¨|™>çEà»_?(îèì«8Ð9/§®ÿ隸 ³oŽ#ó¢ew¿Ëâ+_ÅQy‘ÛõÕ$Cý•ðeÚsN…ýí6¾ßü~fåËœÀyQ}ø‡fÅý£|íUNåþò-3ßS¾Ì |Ê‹ wÝǯŠëGì‹öœ;AWyQ=cƒäýŸhϾЇs*ÔYï‘ÎÿA'_èÌi39U»ÊÔ$ß ‡}û¥ò¢úß_H¾ß|öUœÐ^äTí‰)?p”/qÀ—y‘೯â Ω‚¾òTóýWµðeNðUyÑåöø,…o!8*/ª—9jÎB_D´õ_O!_ÿûþúò.ôƒÊ©º•§š×/öÍqÊ©P»4íèÊ—9ðU9UuÔƒÉûÀgßGåEåŸÒõ-øÊWq8/B=͇—ºÒš?•¯âpN~ußíÉëkÐÙ:s°¿*/êý€¹~cßGåEõ¬3¯¶ú‡}ÁW΋ÐÞMÝ7¹þBW¾ÌA¿q^½Xã…ó­ó—}Ñ^q8§BîËÏŠùà°/tæ]äTÝÓöúVùrî„:9/‚îî»Ý¬_ù*çEàwc/¸&îèì ]q*Ê©Ðoî„Î2ǧðU΋PO¹ÉýÉúJùBgt•u³~f¾>¢|§¦œ +õ×õ ÓÍþ¾ÌAýœS9ä*'.7Î:¾ì«8¨³¥œ +z³}ÊÏù2§ECyøÕd{ü°¯âÝië­*75y}Á·éëä›ã¨ÜIåHÒ—r§ýC9U¨ç«O'ãzwFª+öWæTûÌH^¿ ߇ó"ÔS®û¦„½ _èŠÃyêq'¬l~þHù*çTÛÝçYç/û¢=s°_œA¯_ÚžÉ'_´W΋о}ïs3b>tö…®8œaݼÒõ38ÊWqT^TþhòýóÊ:s s^ÔλvÚnŠçOÔ¯|™>çEÐÛæÀäû”/Ú+çE¨³Ùõóúžà3:çE¨³Ûå‘ÙÖøQ¾ÌAœýã¿Mò«œ¯âpN…ý*o¾ÛÌ?ù¢Åá¼üjÔµ‡Åã:ûBW•Õ.=ÁQ¾ŠÃy8õš×^×~`_è’CyÚ×ÿ¶ró•oЉtÊ©Àoï»;y}ºô%øœA¯lóÙí™꡼ºoýCørÞçE-r¹5®ýªuþ²©âøvýzD^äÖLùÊ7Çá¼õ4ÿ¶ròútö…Îøv”¡ÎŠÆ'8ì«8ÐU^Tïtú¹ñøW¾Š]åE•_ÿÄ|ÔϾ9çE¨SGì >s «¼¨[pwòý6Y_‘wq^„~(Æþú¸PûBW΋о[ïMÉ÷#)_èÌ®ò¢î†»ÇÅçoÎWr(§§¸ãîËL¾ò•u·Ýý«ÿ•¯â¨¼¨zꥃÍú…¯âp^úçñUOŽëÇ‹|¡+ŽÌ‹ŽßhAÌW¾ÐGåEåû$ëOÔY‘/tÅQyQwûÝ—Yõ³o¨Ÿò.è*§j®Ù%ù~³Ð^ø2ûÅ9ô꟯ýªU?û¢=sPÊ‹º?–|þåËð9§Çût2¿Ag_ÅÎyôbm{}ȾhÏ—É©ªWNÞ?ûæ8œÓ}Ùæ+_Åᜪ¬¯êµìñ#})wBœá8úœ!韜/sŸr'pTŽ¤|¹=8œ¡þn÷4ŸA=ݳóÍýR΋Ài÷™Íhÿ ›ò…Îè*/jŸmÌ÷>½õ°òeÚûþ4sªöªG“÷¢åËœÀ§¼(èJòÿÀ'ßО8hÏyÚww¾œÜ¿Cw—9ૼ¨<úõäûÍÀg_ÅA{Ω ‡M˜Ïÿà(_æ =çEлէš¯Ï*_æ´™œªyð!³~öUôçE¨¿8ç+I¾}s΋ÀqsWfõ¿ô¥¼ ûÅ9êq3¾Ÿä‡ÊWqB{‘U›¯51®?ëK´ç¼¾õ˜‹’õtåËðU^Tî<é?âúÁg_Å í)§‚îʵNíŸm½ùSúÇ?¯Ÿ?PN½XwêþVýÊWæ]"pcŽù˜ùù/áË÷Ëè΋ —/½>Õ¬Ÿ|Ñž9è•SuûÎ?-îpØ7Çñ¿ç­\¶9f§¸ÀW¾ iENåÛõøîét ½&_ÅA=œSì™^—¡³¯â@WyQuí£æëãì«8í *Ÿ¡Î—÷?töUør^½Üq’ùþG¾hÏœPÈ©ÜÌG“×7ÁQ¾qZ¬Ã©À©¯°ùì«8¨_åEî³/Ç:¿ØWqP'çTлO^?Gù2í9§‚Þ6ÿ8kþQ¾Š£rªfÕ©;Å|å ]qT^äöLïÀQ¾ŠÃ9ú¿Úëødý ¾ò•Ê‹À)îÙâƸ”oЇr*ð«KÇÏùÐÙ7èÄ ¾"/jîÙ°µøì«8ðUyQµÛÏoŽùà(_Åᜠ+œrÛt}…zØ:s s^ô•¦î4Ú?À–óeÚs^½[´èª¸¼OïºÙ_É¡œ +?ÎÍñɾ¡â@—yÑ3ó“×/r¾ŠÃy8Íkéú +z-|GæEþúnö¿ðU•ÕcÙº¾7—9-®"§ªßgÏÏì«8áøRN½;òWö÷/Ú/iî„ãÈ98ÊW¶§œÊá¾ã¯“û_ø¿Úî¨þ¶àKÿûÞùÈyôæèïŠç—ñe|9/§XõNóýÕì«8AyQùÜÑÉû«•oŽÃyú§üìŸvµÆ?û¢½âp^„öÝÞ;3îèÊ—9Ø/•5w™|,øì›ãp^NùL{¹U¿òe|9/rƒqØ=}è–ÖüƾŠó"ðË÷o’¼? :û*t΋À)Ç^xAÜ?A'_ÅÎ9U1èŸòÎß$ùUà“oŽÃ98õ©›%¯)_èÌ/çEào™rK||¡³¯â@WyQ³÷¢äï#€Ï¾9çEØßrÌ*ÉûÓ ³/tæÀWåEݯ^ŸÀ!߇s*pºoÜz£ÅW¾Ì ¾”¹ÁølÖ¹lB|R¾Š]åEŧ'íׯ|:çE¨³ØçmÉçk‚N¾9çEàÔÕkã¬ë‹òU΋À/_ùJŽÈ©µ>¾œ;¡N΋æ·ÿ¶×?Ê—9às^ø»l·sÜÿA¾ÌÁqWyQýÐÑÉëûO¾Šó"ìW÷ÄÑÉû'¡³¯â@ç¼uvÏÛ|öUÔÃyôfËIÇXç¯òe|9/BýåÏWÿzÌW¾ŠƒöœSAww¥ë«œ¯â¨¼¨þæ­Éë¶Êºâp^„:«oÞzŽÕ?Ò—ò.ô›Ì©î<2ùþå›ã¨¼¨½ï7Xõ;òEÿ(çEh_­3f¾ÅW¾ÌÁ~q^„~è^Ÿf¾ÿ}'ÔI9ôâíï1û_ú¾*§j¶Ÿt¾Õ?ì›åP^„úÛ‹o5óå«r'΋ÐÿÅ= “÷Ç*_ÔÏ´çœ +üzÛI,ô°¹ÁuMù2Ç?¯ÿ:åEà4»l·j¼¾‚ξŠs*pø:tòUœ ‹¼¨ô×Y«Ø7Çá¼uVÿðÇ âë;8ì 9A§¼zY”ä3np¼”/ç]a\QNNQÚ¯/°¯â NΠsŽ”óUík±t½?yÿOà?sgò¾z芣ò¢î´ É÷ûa¿Ø:sà«r*÷ëUo‹ç·ÐÏä›ã¨¼¨>ûCöû—Èõ+çE¨³õý׎òeÚ«¼¨ùÅGÄçoΗ9às^NWŸq­Åg_ÅÎyt·Ç +æ÷ ±/Ú3Ç Îw΋оØlÂç¬þg_ÅÎ9U;ÈÕÛKW¾.îå«8A§¼üúÄ’ïç‡Î¾ŠƒzTNU\üûd|‚Ͼ9çEhßµÆܸÿQ'ûBgt΋À/ßt¹ùùnéKy8œßöøQ¾Ì_åTõr›%ïÌúRî¾Ê‹êýnæ'ì›ã¨œÊM>Ã|¬òeö—s*èÝÓöüɾhÏìçTÐËs>”¬?ÁQ¾Š£ò¢Žøʺ⨼¨úuzGù*çTÝ`~+}ÿ[ó›òeêQëÉî©”ŸóeŽÌÿCëÉxžo¹ÃgÞa­?ÙWq‚®ò"ßÿKâ«8¨“ó"´/¾óÅÙqÿ‡þ¾Ì_æE“ÏøvÌW¾Šƒö*/*×ûCr}DýµðU•Sµÿ1ákqý¨“}¡+çT¡Î¿^63æcÙ:sàË9ôÂÏŸ1_ù¢½âp^„zÜvíŸm½ûYöõ¿ïßçRÞåºÊ©Ê‹cÌG{ö…®8*/r›¾»ù¨“}¡+çEèçêœÍïÇV¾Ì/çEлåg%çWΗ9nÐÿœS/óÍÛâñ£|íU^ÔlùïÆüœ/sÀWyQuí[Í÷²oŽÃ9ö·¹jÂ.qýà°/tÅá¼ýPœrkòþå 9ÐU^T}ìö÷‡ _æ€Ï9U¨¿XlëÍì«8A§üAñ•®8¾º^=œ¡½ÿ}²)¾o4,‡ó¢À¡ûw7à$¦þtæø_õ})§¿¡ë8ô‚|¾œSSÞúÅäýÐÙWqà«r§¡:ãó |ö |j¾Ê‹ªÑ—̱øÕ›ÚïË¥¼ õ¨œª¹é/çŽöED[ü _ÅáœÊ Ž»;d¯‰_ù2Ç×Õ«‡ó¢°_?œ’|þ+ç«8*§*©”/tæ@WyQù™KÌüMù2|΋Ðͳ£ìõ9ù*úŸó¢ _{sòù¬œ¯â¨œª9s~²þW¾Ð™ÓfrªjÓÕnŠÏ/pØWq «¼¨ºê=Éü>û*ŽÃ|K9U7دâÇšëCöUÔÃyøíû&ï߃®|™>çEóÔ¨#âù:û*NØ/‘Su·mšäàä›ã¨¼¨|ðõyÖøa_Ô¯8*/*ï²çyå«8œ¡7ßžÿ•/sÐo*/ªiþT¾9çTá8z mýë…ðeŽn¯½Ê‹ˆý·¿o¿ÈpT^ä|ÖøY߯“9è•SÕÿ¾×®Ÿ}s΋ÐoÍ‘6_ù*ŽÊ©ªOI^ŸÍù2'ì­3Á©Åøg_Åq˜Ÿ)§ +üæÈiVÿ³¯âÀ·¦¼üöÙQæûsjòÍqT^Tý÷–7öfÑÖ;_”/sÜ 8/ò¼þyúø”ÿeñÙWqÂ~QN~uË_ìüŸ|s•u[œ|ÿFΗ9Ø/΋À)´Ï/öÍr(§¿8ûûýÿÂWæN”S¡?‹µÆ›ë[å˹8œSA/î?ÑÌ—Ø홃~àœ +zý® Ÿ¿à°/Ú3íeNµúÓ÷Å|p”/sÀç¼z}Õ{Íï×êÈ홃z8/Bûâ°½’ÏßAW¾Ìqƒy@åTÍ~{íÏ೯â„ö”Aoß×&ù<öWúí9/¿˜•ÞAW¾’ãhë¯[nŸ³[üúøÊ—ÙõLõÐèOÆïïòÏÞ— Ü =ÉCûב¦˜¯[±¯â„ý¥¼z}³½¾mÉí9w‚Îyê/oIùhϾЙó"ð›9)ºòeNè7Êà«r$öÍµçœ +uº­NØÍšßš ¶®8XÏ»Íö0×ÏÒ—8è•SÕëÞœ|þ:ìù*ú­£œ +zùn7×êöE{æ ž’ö z»yÚ?à(_ÅQ9U}èדüMùBgŽÃü/rªêö “×ÀaßÇQN8Ëœ°[|}®|‡ó"ôsñ³O^o_áËœPÈ©Ê{›äõ»œ/çN/rªò§3¾mõû*N¨GäTÍ܃o1ùä«8ÐU^T¿uòQVÿ³¯â@ç¼û[pL²þ :ùæ8*/jßíγêW¾ŠÃyêq+Ûó°òeöWæEÓLò眯äˆûôz‹=Ì×/ù¢N•wÕbþôÏã­ß*|™ƒýeˆÜã,©þF9ÍçìþYR_Ôé|ÿXã°˜xĶñú핯⨼¨~ñÉó¬ùAù*ŽÊ©Ê÷8óó/ÊWq8/B?t¯çEÐË?oŽöE{æ 8/‚^®”®¯ÀQ¾ÌA{™Ÿ®¯r¾Ì_åEn {þ¯ÈWqPO'rªö' ¶¯_à(_æ€ÏyôòÁÛÇëðÙí‡ó"´o–·ïÙ홃z8/B{ç×oæü@¾9ŽÊ‹*ÁW¾ÌAœA¯‰:•/sB{ñ~'•#±/êQí9/ +¾Ï?Ú?[;xßEõzªûß÷ÖóÌ :åEà׫Ì_èù*t•¹ßÜp…Ågߧ¤œ*Թ͗[|åËøÊœê#ßJÖWÊWq s^8›Œ½Åª¿$_ÅÎyøÍ '$ï^‘¯â@¯)/ +œÓFÕ£}#lÐÙ×ÿ¾ß*8œSSﺓ¬þ©„/sàËyøżZ|öUœ ‹¼¨¹øwY|öUè*/ªŽ<>¹?Å~±¯â@çœ +œòû÷'ùtöUœ SNÕ„ylöVÿ°¯â@o)§Bí>;$ç¯òÍq8§¿^óõGöE{æÀ—ó"´/Oe¾¿—}:çTÿuÉû[‚N¾ŠÝÿäÍÌ—Ÿ|ý“ÍöJ§[~«dü«ö9½9U;ëíÉ÷ûå|‡ó"pŠ·neæ3ìêyçEà—¾¬óKù2¾ê~¶Úö‰i£}#lÊ×ÿ¾w|‡s*pÚåìã˾à3:çEàWć®|™>çEàÔoŸ—¬ß ³o–C98îw7$ßO]ùª¼‹ó"pš±O˜ãŸ}Q?s s^~±ÂVÉû·¡³¯â@缨\_Ê íõû*t΋PgçÇO|~)_ÅÎçø-­Ã¡³¯â@ç¼uVÿ8ï Öù˾Š]åEÍ•{Þhõû*NÐ)/B?¸§®ÛǪŸ}s΋À¯Ÿz×éqýЕ/sàËyQ3ŸÍƒ3çX|öU蜵àŸüLò÷›”¯â`U^ä®{2ÿ+߇s*ÔSþc:Bg_芣ò¢nÅyÇã'p„¯â¨¼¨=ì¸äsRèö…Îè*/jiþDýÊWq8/jãÇóxë]Ç•/sü“{í9§ßùõC<þ¡³©â@w”ó€£ø¬+N7臊øÐÝX»~æ£=sà[¿ï6)öUèœ;µàSŽ¤|U{Ô£ò¢úÅ5“üõt‡üùüø¸+t•µ/¬™¬Àg_ÅÎy8೯â@¯(§ß}eë$¿‚ξŠó"èÅ kÎû|öE{ÅQyQWÎ4ïßÙ|æ@WyQ9ãBóýÊ—9ૼ¨ûÁŒkÍùŸ|s•åÌSãþ‡}¡3ºÊ‹Ü +ÿ뎘ã«|™>çEÐÝË'&ù$øì‹öŠ£ò¢òʃ“劉}¡3ºÊ‹Üõ;~Ó<¾Â—9M˜'Óœ +ýÐ<ý°9~ØWqP?çEà×sOþºu|ÙWq «¼¨¼`ÛäûÍ”¯â@W9•{è'ö÷ç“oŽSŠ¼¨ÚÿÏÉõö…®8~¿y6b_ÿd³=|UNÕî÷çó­ñÉÅd9”S¡Å—:qàËyôF\ß™öŠÃ9ê¯^J×à°/tÉ9UqòÖÉúSù]pT^Ô¾¸ÂîññEì 9Ð+Ê©PO)Æòeøœ_ˆã˾Š]æE‚ϾŠ]åEå䭓׿°_-ù*t•uß¹)y}|öUœvp}ᜠ+œfÇQI~}¾åTÐËÓu8øì‹öŠÃyÚ»—íó—}Ñž9-®¿”S¡Îvé·‰¯à°¯â ½Ê‹ŠìyZ|þæ|™>çEà4—_¸o\?töUè*/ªï_õV‹Ï¾ŠÓ ú_åTÍêgœdõû*N >åT¨§ª.4¿˜}ý©ò¢æ¥5“ë¯òÍqdNEãö…ÎÔ#ó¢—Åýù*|9/‚ÞœùoÉüŽ?¿ÌûJÅá¼(p^YáPs|’/êaN;?þ÷É~û•­“|º#_ÅÎyŽ7v½Ç¾Š£tÅWºâtƒþQyQÒiýÃîsšßçÉ: +¾åiÿ«ú§Ÿr*pTŽ¤|¹=85­ »ë6Jò èÍ2 ‹ß×]q8/Bûn›É7Zó§òUœFäTõX›¯|‡ó"Ô_ÍÜ(yÿtåËŒ“BäTÍu6Ÿ}s΋BÏH^¿ƒ®|GåTõk$ï¯ ¿¾ÌÁ~q^NµóY{Xã‡}s΋ÀoŸŸuƒ5?+_ÅQyQµýÉæ÷c(_Åá¼õ»Ÿ}IÜ?èö…®8*§ª9óN«Øõ0:çEAÿÜ%÷¨SúŠ¼KåEÍûÞ•|ÿ­ò…ÎèœS¡Îê¨Éû‡¡+_怯rªæâ³öˆû|öU´ç¼íëmíùSù*ŽÌ‹VeÎÿÊWr|Á´õ®ãõ·_2?ŸU_b =ìq8Ï^ÝqHò:tå«8¬ã¸t‹IÖçà+_ÅiÄõ½œ™^ß•/tÅᜠ+u6ćξЙ_΋оÜ+ÿÐÙ7ÇἜêú´ +_Å)UNuûÄuãÏ_€/}§PÇW¬ßZá«8­àWÅcæ}P©|‡ó"ôƒÛû,óþ]úŠ¼‹ó"ðËŽ\ϟЕ¯âp^Ný©íìü_ø2ã–ó"ðÝ݇دÿ’¯â@ç¼ür§)Éûß ³oŽ#sªCίOÀW¾ÌA{΋ w“LŽù¡Ná«8œ_Œ\[ã‡}Ñ^q8/BûöÚšó¿òeö—ó"èîöõ—}Ñ^q8§Býõ¬Ž5ûŸ|ÁW•U/ÛësöE=ŠÃãõ”ÿhÏoÊWqT^Tžö’™/±/êQΩ°¿Å¶;X÷éì‹öÌ ¾”¡}yÃFWÅÇ:û*t΋ wþúkñÙí™êñÿ¡mØœGùcèá°œ%m¯8#ÕÑKê‹ö2/ºÒîæg9ô~'ì—Ê‘:á«Ú«¼¨x}•ÑÖø¯§›l­»‡ó"ìo{÷ô›­ñ©|™ƒ~PyQu拳c~ÎWrDNÅÇõ°oÐGåEŠ¯tÅá¼ýP_yÎÕ S˜y>¢~ær*ð‹)““¿_ ]ùrî¾Ì‹>|¯™Ï³oŽ#ó¢õw2ßßR/øÌÁþr^„öÝ—¦$Ÿ/ƒîÈ7Çá¼í»‡/2óIé+ò.΋Ào®ÿjrÿ}¡3'ì¯È©Êï¸8Ÿà°oŽ£ò¢öõ…æø”¾”w¡΋ 7ÓÞšðQ§òeÚs^½½úóýoÊWqT^Txtòþå ]qT^ԹݾÏÏà(_ÅQy‘çñ֛ߔ¯â¨¼È-šn¾~Á¦þqÏ—9'*§*ßö™½¬þaß,GäHªNå«r'΋°¿Í³3¿fÕ¯|GåEõ÷¦›ëgå«8*/ªÿkæ×âùû¥|‡ó"¯ê¿fšù†òeê)E^ä~“òs¾ŠÃy8í-«™×GöEÌÎyQ;xݶôó[ÜÿY_‘wqNNÑŸ¬•/êdtΩÀïDýì«8ÐU^Te¯oÙWq s^„~(V»ùöøüÅ~±¯â ½£¼zñÔ§·oΗ9ð弜r¹ï˜ïïe_ÅÎyêï^¸ã«Výì«8Ð9/ +õ/ú~òúŽòU´çœ*èk}?™?s¾Ì/çEà7Ÿ¼~ Ý‘¯â@缜âW›Ÿd߇ó¢Ðþ4ûþEù*çE¡þuÓûå 9ÐU^T½ém£ãûôœ/sÀ—y‘º¾oŽÃyQ;˜ÿëçÒë/êo…/sàë&8‰è(_ÿ+ó¾XqFÚþr:¿¾Šçå›Ó9/B=í_÷=)Π+_æÀWåNœ#Ͼàp{èœSN{q;«þö†W¶ŠÏ‹‡s*𫯞|~ºôyçEà¸]VMŽ/töEýÌî&8Í–«™ë+öõO6Ç¿ÒÁOLýèì›ãp^ŽÛ|µ«­õ‰òU΋À/>õÎk,¾ô¥¼+ìåEàwkýSrÿ }ºÌ‹Ú ’||öUèœã&o4/ž Wä›ãȼè ß°øÊWq8/Bõ–/^fßZø*ŽÊ‹ºç¦&ïOËù2ý¦ò¢úøÝÌñɾ9çE¨³Øäšý#|™|ENUŽ~u?k~f_ÅÎyêïN[©²Æû*t΋Àš‡->û*tÿ3ÙÀ/¶XÍÌ÷Ø×?yØùYæE'Ùýþà3:çE¡þm~G¾ŠÝÿL6ð+Ñ?ùú'Û?œ_|ÆžÿÙ|æ@ç¼üòÓ6Ÿ}'è”Sþqvÿ³oŽÃ9øÿ¥ðe|9/ß}Ò>¿Ø7Çᜠ+üvܪI> ]ù2§ÍäTÅÜW¶²æ7öÍr(§BõÄúAørîçEЫ­ìõ¡ò•‘S•Û‹õ­ðåÜ ý¦rªr½w™ÿ—}s΋šÁqwg®´½u}T¾Ì/çEøk<˜|¿‡òÍq8§¿z~êdëúåÈí™|ENÕ®6{†Õ?ì›ãp^„zê÷ÞhæcÊWq8/¿òý`Õ¯|‡ó¢fp|‹mß‘|>(çËÌ{åTí€_ý~Ꜹ~å«8¨§9UwØ*sc¾òUèœSS^ôâÖ}:û*t΋°¿<Ï+_ÅA{Ω‚þÉÕ/ZèÍ¢­·Q¾Ìoô|ü×\Ï(ß‘rоú\:ÿ{sÓWéàp^Ô`~ûxÚ?hϾЙ]åEÎ_Gâñ™óU΂¯È‘ØWµ‡Îy‘ôsùØlóýÕC³/ŒÇ•â@º_ˆûzñŸ³“û;å‹öŠ£ò"·Ákæû7Ø|æ@ç¼z=î}ûÄý€q¨|Ç?/ÙÜ ÿ›ÇÒþQ¾Ðˆ ó"ÿ«þy´þkÇÇ%çËð9/‚^­÷¾}b¾òE{Åá¼íë¥jæ3ì‹öŠÃyÚ7ÏÏ>8>¾Ð¥/åNhÏyú¡ÚãVûõ#áËð9/¿YçÉëЕ/sŸrªv06÷\’ä{೯â@ç¼È ÆgÛ”7Çý¯|:çT¨³zjöøx|*_Å®ò"÷àÚöüI¾Š]åEõe'Ü÷ö‹}:çE臦´Ï_öUèCó¶U§¯7Ùæ=òU蜎ŸâãëÍÌõƒâ@ç¼üö…;“ëô†|:çEàT‚ϾŠ]åEÕRiÿ(_ÅÎyQÐ7³Çû†ö"ïRyQùá”8ä 9A§¼¨Œ“êÅôøBW¾*wâ¼ý\ûõ•5>Ùu2:¯çQgë×ñy§|:çEà»ó>?æCg_ÅÎ9•â@g_ÅÎy‘ßúÍéú|U?sÀçœ*ð—IùA'_ÅÎyQ¨“Ö·O¾ŠtÊ©Àw~ü›Ç—|§Á}åTàwÏ6×⳯âÀ—ó"ð«›¾šäÐÙWq s^½üÓ æûoÙí‡ó"ÔéÖÝ3épØ:s s^~sû;’ûSèÊ—9àsNN»åîÉëãÐÙWqšÁøQ9U{ç;L>û*N;àsN…zŠ·üÔÌoÙWq°¿*/jÔõ‹|¾œS¡þæ€w·òöUøòõí«Õ–Ý!ÎÇ”oŽS‹œªxç²ëW¾Ð%Ço¨ÓMXg\\¿oÓ_’oÐcˆÿ?8œ¡·l:ÿ£=ûBgNƒù“r*Ôã~™æÊ7Ë¡œ +üúwöú‡}Ñ~Is'´ç ºòåönp¼J•S}wÅ&¾¾ Ÿ‹ÍHr!Å í)§BÕu3gŽö¢­7~*å+8œy^Ó^)ø—9¨_åTõV$ùòU7¨³¡œ +œjŒÍgߧ œ +üblz¡+_æ`¿8/§öõÇã:û*t΋À)ßzªyʾŠsªÀ¯OšoOöÍq8/¿xÿ©»[ýS +_Åá¼üúâGXõ+_æ´ƒùSæTËMØѪŸ}Çá<¥œ +õw+^m®?òÍq8§¿|yŠÙÿÊWq8/¿Þáíf¾¤|%‡r*ìoýç«ÍüPùrîçT8^å÷?}a<~О}¡3§_ÿ“·þ:a¹ôüU¾þÉýöDq˜?E^TÏ\}|¼þ òUè*/*ýü÷O78_ØWq sNU ö«ž™^¿Àg߇ó"ðýOÞzý̾¾QOgê)D^4t±æ6Uør^äpÜgÍœóÁQ¾ÌŸó"èÝ+ã÷¯òE{æ }-rªv›fÅ|p”¯äPNN»Ôóû¥•o+8*/ªûÇëãþÏù2'´'_‡ñöÜø¤~_é+82§ZþÔäõ/å 9A§¼¨Å}1ñ‹Á~µ¤+NhOyÚ»wmœ¬O²¾ÄŸó"ôs÷×´ÿ•¯â@缜ò‚æýû*t΋ »Ï®š|?‰òE{æ 8/ +í/Z*yÿtöÍq8/§üÂÉf¾T)_Ê»Àá¼zwÌ’|ºòU΋À©wÝôs~¾ÌA¿q^~{Ûé&Ÿ}:çTà»ê´¬õû*t΋ÀoÞjÏÏì«8A§œ +üvÅt}}§Å–ßP¿ðeNà‹¼¨9ûÄäú>ûæ8*/j'¬|ÿ 8ì ]q8/BÕq/$ßïŽòeÚs^~yéÙß´ægåËðU^Ônµšýú#ùæ8œ¡~wèÌsâóö…Îè*/êv\ñ«”/sÜàüå¼õW;­h®ŸÙWqÚÁú„sª ekûó äÚSÞ…þ)(/‚^=ž¿C¾hÏœNäEhß¼ÿêµÌëù*t΋À/68÷ ‹Ï¾9çEhïèú›óeNhïÿoí ßbmèÿY_zÚ«¼ˆš‡ï—`]qÜ`ü7"§j¿c¿øüò\óú¨8hÏyQ¨Ç¯Ob>tåËðU^äÆ^žä{àûó:ñÍqTNU¾ùNsýþOyêQyQójzþ‚þŠãÇ«¢œ +œbg{}Ⱦ9çE¨§xióõ/åËœ÷w”Gßü>åCg_ÅÁ~qNŽ£y:ûæ8œÓÑü]ù2¾*§*γ×Wì«8Å`ü¨¼¨ ëêg_Å®ò¢úúN‹×O¾9çEàøuBrÿûBgt•Sµ't'Zõ+_Åá¼¾nìóýuì‹öŠÃyÚ—{®¼?ºôyçEí༚'ãþ_úŠ¼‹ó"pxžÉù*ŽÊ‹Ú_Ûó3û¢æ@÷?“ 㳓^¿P¿ôM([o¨œÊý$­_ùBgt™S}ðêÍ­õ›òeŽßÞzCåT­ŸŸ­õC)|™¾Ê‹JZ'`Ù7ÇQ9U³ž½¾bßÀ_ÂÜ u"Gbß\{ΩÜà¸twÙg_\´õŽWûò%§X:süóúëIÊ©POûý’ùÙe| ÁQ9U5âÖøa_Ô£8Ñþ㿽ý*©~ì/ûBÇ“ñ¾xýìñ»{·~¿ÙÏä›ãȼèóû›ù†òeNðyQ3{âÖü_“¯â@ç¼Èa\-wK2?øþëõû*NhO9ø墉;ÇõC/”/qÀWyQ¹ï¨Ëâñ >û*öKåEåv]×û*t•S•—~X\à“¯â ½Ê‹ªM6ývÌÿÇöeÚ«¼¨\þ–$_B=ÊWq8/ +¾÷¯`ò•¯âTâ>¥üÁ +É}®ò…Îœv°N+Åz»ùÂþ3Ìþ'߇s*78OËÛÒùýϾЙó"èÎ×—óy—Ê©†øqÿ(_èÌÁqqâ>±öó¼âǺâà¸xÿdCûDô ³¯âø§ô¯ï :ø‹7·9hÏyôÊÏøøªzÐ^rÄ:°ºoë-ãõ-8ìtâ ΋ОÇ9töUè*/rקçøì«8Ð9/§ý†Íg_ÅÎ÷Sàûß'töõúãò.´ç¼ºï‡dý=1õ‚Nyt΋ Ww}ÛüþFå«8NÌÿÅýéüóU΋BRG€¯|™ÚSN~û…ý§ŽäüåÜ)ðÅõ«»uâùŸ}s•5ko¾ÿYù2¾œAoÝwÍ÷7²/Ú3'ô³Ê©–¿¥Žûå«r'•uo>0ùûAà;òEŠ£ò¢îÔ•.]˜ŽÑþ}ù‚ÏœVäT¨³¼É¾a_Å/ÏoÐ+qþ*_æÀ—ó¢PÿÖéúMùæ8œSS_ùBW•ÄW¾ÐGåEþyɆ:Ù:s ·"§JàýæzIqüSzíK±®`>8¬ç8*/ª7_²õøŠ£rª–r$Ô¯|¹½ôçTàT·NNևйr΋°¿í)›$ß¾òU΋Àq¯ï61žŸ•/tæ@/)/‚ÞŽyÕ\Ÿ(_ÅQyQ» íå ]qT^Ô~w™±V>¦|™_΋ WÛ¼š\_p\”/sÖ¥”Ó_ù*t•kß5¾>*ßGåEÍ6ÍŸì‹ýbNÐ)/‚Þ¼~òùÜP¿ðå¼ í9§jñºó²‡%ßßžóeÚs^ôÇ?ä“9_ÅἜîþ#“|LùBgúÇQNå0n§l’Œå«8Ð9§B=Å?ŒŸOå›ãøû)3§Ró û¢æ ΩPO1Öž?ÙWqàË9ôb[›Ï¾h¯8œS¡žÊ×÷?8ì 9臚r*ð;âCg_Åîýy3×Qëò)Ç›™ü‘êð­DNÕ‰ë#ï¬âr*ÔY/œœäÐÙWq óy½[h_ßÙí‡ó"7èÿFŒöŸ9Ð9/jó?¯ßr¾Ìß÷+o½ñã-sX¼>Q¾ŠÝ÷›y›—~·wœOú"L_ÅÎ98åvöüÀ¾Š]åE¥?¾ÖüþŠƒ:¹ó¡»ÛÒñ ŽòUœv s*å ]qT^Ô̹å s}µx¡½ã.9"§ª^ßí*«ÿ•¯ÊT^T¼Õt‹Ï¾8.ÌÎyôæK›™ßžhÏΩ W¿¹È¼?R¾ŠÃyøíÓ¯'ß? }¡3û%ó"q~±oŽÃ9•Ì3C÷ÖñZ?X:s‚¯ÈyŠÛÒë—òÍq8§B6«º©5²/Ú3¾œ¡ÎâU{~f_ůÿÉ[ï|/W94ùþ.‡u‹ðeHðå_àúëçOë8²oŽ³8~øõU#|™_΋ s{ÿ¸×o¬£=sо9•âŒTç¼(ø;ëàÑ u–ÿ´ëéñ¸….9”S_¾òóËc>ô–|ƒNøª¼¨=}¥yæø!ß,‡rªPÏ{6KÞ?táËyWh/Öá²”/q°_*/*ÖØÌÌØ7ÇQ9U÷Åß&¿û«|GåT屿Ý·ì‹úGåEõƒWϵÆ'û†ýRy—Ê‹NºÒüüû†úGåTõϻŬ_ø2§ÍåT37¿"æ£NöÍq*Ê©ÀiFO˜m¿-ù¢ÿ™_•S¹åg}ÁªŸ}Ça>§œ +õ4_š5ÞªŸ}s•µ§¤ósΗ9èg΋À)O·ùì«8ÐU^TùùÇêöÍq†Ö{ñqDýþ'o½ë¯òeŽ_•1Ü?6¯ïŠs*Å ýàÄ›ø.)Ç?׬ó北Ïãí ùr^ä¡=Nùjº~p™ýR΋À¯xì•Ö¸bßОò./΋B{qþ²¯â`ÿhï}xëõ[M¾nÐoÌiEN~uÆJóâþΦŠãÛõêᜠ+õt¼ÿ|öUèœß¾7 ³¯â@ç¼z³êÚã6ñ°¹Áþ²¯ÿ}dÊÖø¬È홃z8/BûúñÉëwA¾Ì_åTÍöß4ß?Ͼ9çEhßýú'æç/Øí‡ó"´Wó˜ò•±N+VÙü)s'_0mýëÅœ½×µ®SÊ—ûÜÿ×£¹û'÷G¾™é‹qµ8Æ^WŽâ }¤üfÎÞ{XýS.!߉uêoçìoÎì›ãp^úSÔ©|™ƒ:e^ô«Ï'!çËœÀ§¼z±Å”Iñü~G¾hϹÚûß'tÕÊ7øàp^½ñço…~S¾ŠSˆû r¹ç·²òå+9"§*ýùkõò-Gä$nße°Æ§ôœRèÅÞ6_ú +çE8Žõ~Ï~Ö:¾ÊWq8¯üƒ–=ÂêåËœw…دb’Ý?5ù*t•¹]m>ûæ8œ¡ÚO2ß+}EÞÅý~'øì‹ú™½¡œ +|ÿ“·Þõ}:çTÚã”ìñæŠt•‰þa_Åî(§BýÕkË'ùô†|s•¹uW™iÍ?ÊWqø~3Ô9Í^*_æ`¿øx_Ÿ¿Ò×­úòUè*/j¿zÎ5Ÿ}:çT¨¿¼ñú$߆ξŠó¢À™¹Ü¹Výì›åPN~õÑm’ï‡Þ +_Îà«rªâó+Ní¡ÑÖ_ÿ“oŽÃ9•çõ8®Z¶²úGù2¾*§ªÖ_%ùûDÊWqêTyÑ +Ïoe]Ù7ÇáóuŸÝÀZ_ÂWq8/¿úå¨äï+AW¾ŠãŸÇ[ïø²è÷Çò]ü ýq"rªò‰QÉë×à/ŽŒ7âื"/*º?$ï¿Ÿ}Ç ö—s*p:_¿9þÉ7Çá¼üjº=ÿ+_æ„ýRïw9’òU¹“£<¾Ýî㎌çèõÑ‹fYýÆôCA|èí×6L®/à³/Ú+ŽÊ‹Üîù®U'û‚¯8C¾§9TôƒðUœ‚rôCsˆÍW¾ÌÁ~UÔÿ?ÍîåËðkÊ©Àw¿yKòù8è ù*t΋Üà¼n>qéLk|²¯â@wÔÿàÛ;2>îÐÙWq Ë¼èø&?|öÍq8/B?wwA\?8ùBgt΋ ·S¾qNÌÏúŠ¼KåEn—qçÆÇWùBgt™­¹~òþ%Ô¯|GæEŸ¼Ô¼¿hÈ7Ô)ò.•uë<ó5«:å+ò.•5ﺵ¾R¾ŠÃyú¹xx×Ý-¾òeúó"ðÝa‹ì¿¯*|™>çEàW‚ϾŠ]åEnãKo¯òÍq8/§ÜèÞ]¬õ-û‚Ïœ S^}ˆcÍÊ—s'p8/‚ÞÑú:ûBW•¹±éúé+ò.΋Àq‡§ã3èÂWqd^4Ið…/sPÿ™l?‰è@o„/·÷{÷œAoüùeŸsD^Tÿ«Ý?ìê!t΋B?œ»óÝÖù«|™¾Ì‹è8*߇ó"´ïöL×?Ð[ò…®8*/j.ÚÐ|ýKù2¾*/ª÷üHòþØÐ?—9às^ôÙ»|ËŸìÚ«¼KäEÕzϘùXI¾à«Ü‰s*ôƒ[ÿ™¯Åõƒ£|™ƒö*/*ÖfJÌÏù*çTà?ÜÕ¾'_ÔÉèœA/?eß_(_Åá¼õ·oþ²ùú2û¢ær*ðýï“ ºò•¹“È‹Ü›¾|u|Óþƒ7”;uÄ÷¨~%tåËy8ª½ò•Ê‹r|å«ò.•5KÙãGñGåEÕÒöü¯|‡s'ŒC•#±¯j]åEÍ{$ïO@ûú…¥Í\BqT^Ôî]Ýwö…®82§úíìY|å«8*/*ÿ´ô&_ø2ý©ò"Åg]q‚NyôZÔ)ù‚ÃyQ;øÞŒòù÷Äý£|¡3Çårª‹ö:`tt²*_Å®ò"÷äÉçCä›ã¨¼¨9h™„ïw¥??“/tæ Ω —wìµsÜ?à°/Ú3íUNUŸ9ï‹1å«8œS³Qòú5tåËÔÏy8îÐùæú“}ºÊ‹üù•ÌÊ7ÇQyQ÷È2sâþ‡}¡+çE¨³}5çGø*çTàZ:ù|tö…®8œ¡}÷Ç´~èÊWq*Ê©ÚÁüVÓü¾òeúSåEÝÍ{_å«8¨‡ó"püóxëÍ?ì«8þÉýùŠr*ð;?-Œ GþkrÀWyQûä·[|öÍqTNUû¢}é?è÷FäTõkiýà°¯G Ï9Uçëoà+_â }C9êq¯¥|èÊWqZÊ‹à[ù:ãúÁW¾ÌA{•µ¿²×?Ê—9¨“s*èŽø¨Gù*ŽÊ‹Úûç$ï_R¾Ð‡ó¢óÿN{šß»È¾Ø/æ@ç¼üêþ9Éõz-|™ƒý✠+œîú¹ÓFû"°Ag_ÅñÏëw*§j¶Lò½Rà³oŽÃyêi]fN<þƒN¾Ð™_••O푼? öUœÐžr*迾Äý8ÊWpüó’ üâÏöüɾ¡}Bé=è_—E^Túó×êöõ¤a9*/šb>8ì ]qz{’þÓ·©6ô¨_§ð]¼ù`ü/þ‹aù‹7žÃyŽWõT:?£~ÅgÚs^Ôæ7÷B:>s¾ÌA{Ω‚N9RΗs'Ô¯ò¢z»÷îg½>[ï¸Ô]Öy§8*/ª¶[ê.k|*_ÅiEÓî6É|ýBù*NI÷)è·úàæ8«~å«8J/Æ=0Ïâ+_æ„q¢úçK‡ßoñÙWq0Þ8§Bÿ4‚ß’®8ðu”ßm9=¹¾@gßlj¼¨³±ùýíÊWrDNUь틎¶Þ¼§|â`¿8/‚^ì°ÔåÖñe_´W΋|½½:Ëé“Ìï?a_ð™]åEõÑ;ηúGúŠ¼‹s*Ô_jŸ¿ì‹:GåEnbs°ÕÿÒ—ò.Ô©rªò‹3X|åËìçEðm·˜n¯ÈWq tŸ ~5~ÒMÖñe_ÅÎyøÅøæ8‹Ï¾ŠÓâ>EÌÿÕööõ‹}s΋P¿â+9ðõ<Þzço5vcóó­ÌWè*/bSÿØôÍq8/rŽâ+9¨GåEÅNéõ7ëKyö‹ó"ø¶yÌüûwì«8Ðýù•äTÖŸ~|ZãŸ}sœšÎ_ôCyüá÷Ç|å 9AyÑÐ:$æç|kâ Ÿ;Ê© '¤ëÔþh¯82/Ú~©ú'G[oü³¯ÿ}OgêQyQ#柖|s΋POT7þÛ«SúRß¡ûÐø8æø0ÃÏGæEÙë+p£Ÿ½ýbN‹ù_äEþs‹YûU’¯â@ç¼È×Õ«§þÆ%æõ‘}ºÊ‹Ú»§ÜbÕϾŠÓ ú‡s*è妛ëgöE{Åá¼íë¸<®:ûBgú™s*èÑøèýöE{æ =çEhßùëK\?ôžYôâ@ç¼z»§½þa_´gêQyQ¹]º~ Gù*ÎÐü°0Ú_ø¦RïQï¼`_´_RêTüÿS]ñ•ŽúÙí9§‚®Ú+9-Ö "§ªÇ¦ãSùf9”Sa9GŸ}Uû ‹œªøÁã­×Û-‹o[çÊd^ä9渾’#r*÷9»Î¡ú-_•;©¼¨ý |‡ó"ÿ“·þuMø*çEÚã›æûßØí‡ó"´¯>Z?`õ³òU•Õ-jk*_ÅQyQ½u‘|>û¥|‡ó"p܆uòútåËœïœÎæÅ5Vÿ³oŽÃyø庵ùúo-|‡ó"ðÛŠ“­ã+}EÞÅyQØ_5?_æ N΋À÷óCòùzè…ðeøœSÓÑù }ºÊ‹šÏß‹Çøì«8Ðe^äŠÚ⳯â@ç¼u–[¥ó<ôŽ|:ç9à4[¤ó'töU¥ƒS >û*NÐ)§¿XÛîöUèþg²_nZ$ß}ý“û×£„RNè#øì«8Á—rªÀ߬¸'ž‚N¾Šó"pªMŸ|sG9øÿVýÊ—9nÐÿ*§ªÞ—^•oŽÃy8n³Â|¬òeúó"ðý<“¬¡³¯â@oE^Ô­]œ#æ·ÄWq 7”S¡Îšæ1èì«8ÐýÏd§ñýoöõO6Ï_¥ƒï6,î°øì«8Ð9/¿. óõ5öUèœï¶,’¿¿}:çEà4+¦Yã‡}ºÊ‹Ü¶u²¾U¾9ŽÊ‹Ê­‹äóqà+_ÅἜróâj«”/s°_þg²ï×96ŸtÿäaÇ¿Ì‹׿}þš}ÁW΋P¿ó÷GVÿmøÜ7sàËyøå‡l>û*tUÒÙ÷rÿŠÞŠëãHëç¼Ç·|åËΩ ·”c(_պʩÜw_Hþþ)øþy¼õÏ_‘; ÕŸGþɽö%ñ¡³/tÅqâ~‹Gú +NMý NsWÚ?Е¯âpû¯ûœ»è_­üp¤¾Ýç‚ïÖÙÖüüE-|™ƒýå¼üîËcÎ;töUèœu蟫.IòðÙWq‚.rªâÄ1ÇÄõ+ßGåEÕ:ÛÚ¯;/øÌ^‹¼¨8kÌVýÊWqJ‘SÕç/‰ù¨‡}¡+ŽÊ©ª¦›ßŸ©|™ƒãUˆóÚ×Å[o^b_ÅîÏëdzè°ë6Uè¿à7tþBW|怯ò¢âʱÞ˾Š]åE¥¯tZl¿ßÈWq «¼(E÷õ¯;ä«8Ð9/‚ÞŽ°ÿ‡ó"ÅÏéŠSPNå{¢×õ¢Ë~÷ŽÏ´ç¼ü†øЕ/sÀ/D^ÔÑqŸ}'è"/òüÇý>û*t•5šŸøæ8*§*¾µÁÎñúö…®8œ¡ +|ãùåË´wbìŽo‰ù9_ÅQ9U#æöEŠÓQN…:ݺéø áË´WyQ{Ò˜S¬ñ©|™~C9êo~±õ½Ÿ}ºÊ‹ÚÍ^6ùì«8ÐU^äüñ2³~òUèŽr*ôO÷úÅÓ->û*tΩÀoV}%ù~Tèì«8Ð9/§ùÚÅ·-ô¢­w]`_Å®ò"7g››­þaߧ¤¼¨ÅûFþå ³b>8ì 9ÐýºÈΩÖK×ç9_ʼnú·÷_pXG=%ùBWí9/¿]7]_A_R|9/‚^ß“®Àg_´WUÒÙ|Õžuÿ¸¿üÞ Éø)GµÿïåËyøÕzéý;töEÌÞÑõœÚk~`ߧ¥üí¹Nå›kÏyQƒùá¼îk~¨îûå"k¿˜ƒz8/B=%ñ•¯â@÷?“ üDô ³¯ÿUo¢÷oÄ/çEÿÑøøFzâ«8Ð9§§¥óºß¯Ä7Çá¼ççÏxüCW¾ŠÃy8Õ­ŸmõôyçEàÒõtå«82§¢ó |å«8œÓŒ{ü«á«8œß8Ñü|œòU΋À/®zx;küH_‘wq^Ôæ¥â‡4??®|™ƒó‚ó"ð«Òû#èì›ã8Ê©Ð?Š¯tæÀ—ó"ðýOÞzó*ó'ì/Sós+Æ!7Wèœùç÷çÿGÒëtöUœ÷§”SS~7½¾C/ÈWq ûçñÖïçÿø¤øþÔ7êéì›ã””SÓŠëW¥|‡‹¿¤~€®|‡ó"pjÏ·æå+9"§êÞó¶ÙVÿ+_λÔq®r$öUí›Áøt”#¡½Ûwº™?¸ƒ§'×÷‡ó¢ó§â 9¨“{àÓ/‚.øÔ<ä]*/âöO¿@Ì®ò"Â9>sÀWyÑHùÌ_åE#å+çTè‡vßéæ:–}Q§â¨œÊí—Žså ]q8/B=¨Ÿ}Ñž9~?ûó¹È©ê§®¸ ^¿Ã¾Šƒý✠+œòŒO%Ÿ„ξŠß‚ò"pʾÔ~]Œ|¾þ÷É~"úÐÙWqüSúëCrà³®8ð­)GBûrÿt|*ß,‡øC|åtâ@÷?“-ðõoý__jæC^$×qðþÆ×wèKÊi±~£û\pª§®Hòèì«8¾ŽÞøᜠ+œVðÙWqàË9øµèöUœ S^~Kó'töUèœãÇɳÖüƾŠúMÜG ÕiñÙ7Çñ¿O¶PÿÓW<Oߨ7Øzé?vþ©ýø‰ù9_ůi8ôèìë›õ÷‹8‘n÷³à“<ôü„ó"ÔÉ¥+t΋À©üû¢Næ@ç¼|w€=þŸ9às^~Móó³œ'OÝ;îgp˜ŸãTûN¿Ðä?Çñ÷_‹årCã‡ù9Nõé=·³Î_æç8Ýþ¢âç8¾žäó°ègæç8¥qßÝëâç8þ÷Ɇz˜ï™çÚ;ú÷ϵ_Xã‡ù¹z¸~ÔÉüÇ“ä~æç8…‘3 /æ+ôJÔÃ|´—×/#7èâç8|ŸŽþ:^ñqÌqüï“ æûFÃŽÃâ€Ãºâ@çö#åäÚ3¾êxqûÿÿ6§}úŠ›ããûFë)ms˜Ÿë7ó[‹½Ž04ž™Ÿã´ßùãÖ<Æü§¸ïs-ó³ß ÞB?ß·ö¼è°¯_1{ðÿ7Äa~®ž’îk°_#åO,~ÿØ;îÄÏÕÓ>ks˜Ÿå|î¢Å>/Л牯8í`ÙŒÞóì¾6ôOK|ÿûa÷³âç8C÷ƒÖùÎü‡ïË°_ÌÏqøýà08Îgý/-NO§û…!ÎÞ­´ÆÕÜVû¡~Ò‹%ä¨öAb¥›Yj¯tüÍéÐÏiß =2÷KµGÿ´ôzºâ¨öà;c5ìø¡öà4KXjݯ£’×ñÕ~©öÐùõú‡Û½.ŸåP{püóxÑqÿ{q|=ß’^€ÎótnêYBŽjtîžà4~|ÆóêçýRí¡WôztŽÃíÁiGÈáöàÔ#Ü/nNKçon¿¸=8Ö}Üpó†j?Tg¼þTõ@çö¡ã>nØz¨=85½Ž _5~¸=8þy¼ý?9ßÿÞõTô:¯ßÉa÷‹Û£Öß(G½~ªŽ·G=õç1nôÜ~q{p:z½5Çáöàðëª9·‡_?Íq¸=8¼¿9·ÿÿ–cÜÇ ;ÿP{ì—z=QgnŽzÝPq¸=8êõAÅáöí×½ª=êºÿZ’ë…jë#Y'ð}8Ö}Ü°Ç]½Îh¼®8ÿP9y€ „Ó   LayerElementUVI f¬   VersionIe €¬  NameS map1·¬   MappingInformationTypeS ByPolygonVertexî¬   ReferenceInformationTypeS IndexToDirect{M  ~  UVdf;  q  xTyÜ•ÃÿÆÇ^I¢i±Uh¾¤±´©”}IL¨d + ÙB"-Š˜´EÚ¥)Ú´JJJ&ZˆìKYç|®Ïõ¼~Ï_ß×û;sfùÌõî¾ïsÎscrç*¹©1&Ôþåýâÿ¦¥‡ §Ç¶ ûå‡Û~&ln¯,l__žq^¿ò}ôŸPIØlŸ¾ð a_å-áøöàÇ' }[9¼þŠ1Âö›ý„ã / +›e{ çnÏ ‡ç÷vËG }Éß_×]Â7þ.ÌþñÄ…9žk¸C8è|éé-`]íøX×ë&}&Ìý˜!kÑ®ûµ5>f=\çUÂYëo\!ÌzÚFËñzÖ{Ù2áÂ>(ý“òÂ|½ë]E˜ãÛ)Ç ¿ÎŸ/©/\²¾zg¢?×_¥9úsÛ..ÙÏËПõyåjaÖÏ_ßIØh}í°ÀZÿØ ‹0χÌócž/Çó<Χùº¯ù º^Ï|é~ ó§ûe>Yæ—õb¾YÏ’ü³Þ#àÏ#/m€ü]¢> ¯/ì+.—ü¥‘' Çç§ çÏë +ÛËF!Ÿ·œ l^zý/:¼â.ôÙ +ç× »Û r1ú/;ýßj.ìW(ìNo"lž++œ>n >u/á8²!xðnÉ9¯üN8k×! s<ße ò¨óÅêKÐ_×ãÞy¬ë WMGÝ=~’°ÕýÚóÆ ;­Gø0 +³^ö£„ƒÖÓÝ8RØ\ŠzÇ#ÀêÛíëð¡äõß7@þt|CkaΟ&\Öõe7úsý žæþìòQÂÜ¿ýv"ú³>íf¡¿Ö/-œ/ÌúÚºK„Ößw^Öó)a=?öçùr¼Äóç|š®'k~¸ÞÄ|é~Œæûe>Yæ—õòšï õdþYo×°!ò¨ç‘ê·öýÖKÞìõç Û‘SÁ7¶@û7O ç6ç +»=nW?K8ÞÖýÿ>U8O;QØýZýÛ,œŽ…OçË¿—Sá/»C8¼«×«O6›*ÈëS“Õh_­×“®ËÑÞA¯ÊùÔ¯$oìŸÓÏu¼8ù:ŸŸ‚¼{]O8ìEy½çz÷{ùŽýØÙý1¾î×u¹ýµñäîÂAë•N¿YØi=à ]Ñ_ëí»tæ¿WláXÉ_Ÿ:·süÊÝ…9ú÷Ya®Ï?3 ý¹þÖ«…¹¿8õ;aî?ù½Ï£¤>¿*l ~¶v-aÖ×Í?íZó\á çC¶z~ìÏóåxVÏ?è|ÌGÔõ0?\¯Õ|ÝOÖü9Ý/óYÍoÐz1ß%õÔü—Ô{|ày¤á‘¿ Ë÷“®G¾kŒ§\‹|ŸÚ íï^)ì'þ¼î"a{Öè?~åç·K~S³³¥=uþ@Øoj >a<ò>¢Žpî4P8Ž=ZØßÙGØÖ;X8¾r«°¹m_awJWp­_?åôÒzaö3’pÐñò²W‘Çë0Ÿ;w°pÒõÄ÷u½fúMèÿöcÛ_%ìt¿î±6Âõr¶°×zù—OÇëk¢žqU#á¬õ¶ ¢]ÿ½b»½¬!ò«¯·ŸwÎ:~Z|¬çCæù9íŸô|ƒŽôüÎÇ|p=ÌÕõÍ—ÑýdÍ÷›5ŸAëÁüF­WÖ|­'ó_Rï.]$_ô#þs?ò¶f.òýg_äñõ€üïÙý>\ûayYðÀ®èÀÇ’×|AGáüàhä{ø…¶_OäyØyàiíп|ñïÔJÖ£ùáz™/£ûÉš?î73ŸZ¬ùe½‚æÛi=™ÿ¨õ.<‰#ü÷êúç„ã¿S$ïnáaר«°_õ”p^}”pñˆpØóSäóÜ{ÑÿóaÂn×íèß­òüu'ôîXp[\oÂY»ç¯ç¾ ®/¹ÒaÓ[Ÿw^[Ø.>¯ï;íãð<’WŽÎÓõyC9Þ¾Pò´®8Z8êx®!®æ`Ì—nè€v]O>éLáÄõh…ÍMØ»{?a¯ûõË~ÞTÜGÒzøk¿6£^᮵ÂAë™O[)œµÞiÙ2ô×ó`»Û£­ä¯KŸƒÿÄ/Á:¿ÿç8äY×—jtŽ\ÿ°±Âܟﺬû÷óö](çÁúì¬#ÌúùKZ +'Ö÷¡ÂfêoëuëùKÎýõ|ŽÇó7:_Ô|8]OÐü8]/óe¸Í_Ôý2ŸŽõÐü­ó´žázäŸõ.<JÞøïUXòø„ñ’3x’pžÝ>Œ|Ú]’ïTfxîòãÄ«¤=Ž~P8µ?TØüïNáüÖ:ä}öÅ/ §6¸ßs7÷vÏ/¦åeè?¤ºôw[› +·¿°ÕH8ßÿ ò«×Í.éßôa«ã….¸ÿç|ñ·¦xý¬Ç‘üfî'NöºßpòYúK{ÔzÅóîÂëYÏÑÝЮõ.<Ÿ Ó«ín"Þ/åëÍ;KŬã»gð|ÌùÍ+¸_òº¾Ð3|àúÕ“ü:ÝŸoÔyæþ'NÎZsæVô×ú™#ö_T<Ö7L®%lZjý‡Öó|”žû{=_ŽÇóÏg`¾’|èzJò£ë5š¯¬ûaþ¼î—ùd=˜_Ö+j¾ó,ÔÓkþ­Ö»p=—|eõÃݾïIñÁŸðò·¢*ü9m­°=×mK„ã^ç;¿ný%òýë+àjàÃÆÁÂiËéhï¡Ï7Ÿÿ–ŠõU®“v{ä{àx¿Ì=𬰭‹çw3«Ú{ãý¬xêÂù ¼_E¯L€Ú?ÄûI^Ç3ËÏv§ó¹ÃÊ +g]kþòºëu‡MF¾u?¾Ñ`Ýohp úïz˜A {­—›t¶pÔzºO ÛûQïÂó9^¯÷W^ÛÓw‰|½«¿U˜ã‡s/–üGÎÿ÷»ÂA×g¦%ùö\îÖýåª ‘Ý¿©QùÖú„¯Îάßý·G­ol> ý+¢þfñpá çCvz~ìy¾:Ïßë|^ó‘«c=™ùÑõzÍWÖý$Í_žŠýFÍgþKë¡ùõZ/æÛj=æŸõö]¶åb.é‡ûëa÷j?\/~ûCØ\¾‡pÞç{ô/û¨ø/ÍÂéJð㈕Âöˆñða”ú²Ï¹Âî¤1hÿwG*Îkê67¾$œÿ»E8öè$œŽh'œj ìváy$ר$lÆçyï=…óz|žgö‡ñùƒ©‰þ~q'É¿©†ñ¬9V8é|æÕ’O§ë cf {]oøàqá¬û)Œ't¿ñ’¦ÂæMÔÃýZSØ•C½Ò¡ {­g(»·pÔzÎás©‹úÁvyøúðê¿ðEÇ¿Ý->$?·ß ?t}~Ë•’ÿÈõïž-Ìý…=•<[Ýî…ÖÇ<ñ"ò®õK›— G­oÚ¸SØ|†ú§?ÿëùy~Qûó|9Ï??Žù˜Ïõh~¼®7i¾’î'iþ÷Ë|j=˜ß õ²šï’z2ÿZïBB7—ò£ÓaÂiõð!þïgº÷_Þ ~|ð»ä7]¹y^qœôÑWàÝ„m‹åÂñ»¿%¿±ßTápØ Âá«aàŸ[ +»m½…Íò½…óÞ¸ßÊ=FÏ-Žï>h$í±JáðFEá0öTáüòFÉ;Ù÷&œ´¿ý÷S¶'Æó ’v§ó¥ÓVK^“®'½_Òõ¦î¥=ë~ÂÕ§ ›o±ßÔ«’°½ +õWþ*y·W ^þþMàŒzÆ&?F½ ×óR~°=×(>ðõùh¼?Ëñó+/Â?«†üëúò!ij®ß¼—ä7éþÌ×× gÝ¿=àmá õ þv¬_³“Ï#°¾w^$lÆ þþÄЮçCæù%íÏóµ:Ïßë|̇Ñõ0?y;ÖË|¥JºæO÷5ŸQëQ’_Ö‹ùÖzZæ_ëGT‘¼óúaÕ¶ÿtÆýÔ“'‡WÀ‡xxÜà†àõ{Ož'~<ºKòêÞ9Q8üˆû³øñ É»ýè}i7õÛ‚Ÿ+œvo‘|Çex>1­Û ›ï¯Aÿ76½'~<}ºpØùŒ°9ÿ`´7½Y8ÝŒÏ;¬²ÿâIÉÔþ©æ9Â^Ç‹]ôùBç‹KfH¾ÝŸXOêx7X×kŽvÂY÷~¬ u¿é¹­’o·êßû yzåm…³Ö3uQ8°Þ#F ¿^?JÚ÷‰û©íx½^>pü«>Î:ü³®º>×lµ°Õõ›º­àƒî/¬˜"œtÿñÁ$ßIëc>»\8ký«O#ÿZß\æmas êoü‡Â–ç£ìôüØßêùr<ž^ù¬æ#èz˜®—ùJu°Ÿ¤ù³ºß¨ù ¬‡æ7_‰zÍ·Ñz2ÿNë]øü|s1w%~œx¾p<îJñÃ]qŽ°ýišø`n;EØÿ‚÷£âË5…Íäûç‰MàKðSñ3òüΡÆá4äoɺhŠp¬p|˜:PØü=ì=ña]a·ýðÕgç-žSl[Áë׿(œáûPIÙµÀçÛAûû ˆAÇK#¶H¾ƒÎç¯z^؈õäw.GûP¬×-«*œ¹Ÿ‡àƒ}\÷ûÎLÉ·×zäšC…“Ö+´ë+µžyÜÍÂæx­w—.`¾¿ËöOÇ‹|½¯ÐZ|0µ0¾+÷£²ÎÚ= ?t}©gÉ¿×õ›fƒ„ͻ؟¾òÎýïºy©õy`Úµ~¦üÏ`­¯yéˆ%ÅóȬÿàzÂQÏ'){=¿ü"ú;=ß¼?Æ3zþ^çc>¬®‡ù1ºÞ¬ùJça?Qóu¿Aóéµ̯Ñz1ߎõÔüçu¨wZÖFòM?̳׃/l#~˜Z„Ó=Ï‹þŒ¶ÂæìçI>+þý¯j+©.l¯œž$ßçâ~Ì®-œïÂó¿_tøàË%ä½æïûûxÿ9Mü|Žpº íöJawü¹Âiȳ‹íæʦÇjáôÏjÉ¿UvoÞ#l†jÿ~5à‡Žg–¯€“0Ÿû¶ŸpÒõ˜ÃO¶‹±ÞpÏo’ߤû‰‡ÏŽºß¼ñ aßõ°: ­—ÙJØõA=Íg§¡ÿE¨wáù\¸ä<Ø>iªøÁׇ‡o?œŽïÞ;P|0Ÿëüc§']Ÿ¾øuý¹ã'ÂV÷žo/y÷Üÿ­ï[­9¡¢äÝjýÜí {­onà‡Öß-†þz>d¯çÇþAÏ×êxç<æc>‚®ÇôÐüèzæ+ê~˜¿<û šO«õ(ɯÖ+×D¾½Ö“ùwZïÂû‰’ç¤ï_™Ý÷ +‡{›Š釻„㞊¹Lga3èÃyÅ|†Ð^Øî{¤pœÐX8O’öïð">d]¿é}|àþ| >èþýW!ÿ¬Ïª[…“Ö/­ž†v­¯]ºE8kýí®¿…ã‘8²×ócÿ’óÕñ²žÐùÌ|Í×£ù±ºÞ ùJ½°æ/è~KòÉzh~½Ö+j¾“Ö3ïBþóƒ¨w!á’gþ{•¯†|o ~øwŸvOÜ(~¸µx}܈ϯÃð˾…÷£âµ­Ñ×™©xÎyhmŒ·éLñ#UÆõÄžXSü÷l@¾ÛÔŸSìo»¼!*ÜŒ¼¾<øãw‹í.µögÞ*lfVvNNƒ–Iþɶ_á¨ýÝg{Âg1^h8ù?Pç+ßJ8´Åzüj\/²®×¬yMò¿À~¢ë&œt¿¦z´k=ÂÅÈ¿ýõr¶IþëyÎÇÂîÔ;.[&ÌóðÚ®X.~ðõ¦Çpñ#êø±>¿¶:¿½ ïG%]ŸÙï}\/týyP'ñ!èþÒß ›°ÿtEWä[ëcîþP8°~+X<¯õµZ g­ª}½°Õó‰Ê^ÏÏ°¿žo>ã9=ÿÔ[çÓ|D]ót½%ùÒý0i_ì—ùÌmõý9ͯ×z1ßù.Ô3iþ½Ö»ðù9ò«×ôÁ›È÷GLjöÑqÂù`|?*Ž"ìk÷›W¬O¸æ>a{õ¬Täx¨N‹Œ°kÚD8Nœ,>¸6þaøPÿÉwêôøÛÌsß’¼ç¾ }éAÂþI|Ë4ö™ÿb|?>{«pºb òØn¿Z8hÿ¼ß/ðaÆ‹] +Û„ùâ¨áÇuXO8ùä_×ëxùŸ„ý¤5M…Ýbìל»úk=Ò̵’wSõJ?M‡ ž¡WNZïÂççÂôƒíæ¤ÏĬ¯÷ßâûQYÇOk‚\/¬ÎoÆ4ÇõB×NýOØëú󫯈Q÷çÚ5‘ü'Ý¿_1G8k}ÂÑÇ!ïeP??¢·°Óúº?&Á­¿ï¸D8êùy~Vû›{q¾NÇãù;Χùpºž’üèzKòÅýhþ÷«ùL/£Aó´^FómµžÌ>õ.|~Ž<ÓÚKÀ.~ä‹Þ¿p +žÏ»Oöw_9OþýXþ,x¿Ç渴úŸ4`®øòu;áܧ–øg#lžÝ>»Øž¾Ö÷‡{­Ãõ áðáŽ]’wÛù)a·ÏÂþŠËÀ[>›U|½ùßÇJ›¢pª¾P| ›vÃíOùJòu¼<¢·°ïŽùüIx6ôÆzâ“Ó$ïfÖNò¹/ö“n¬ >ûµ?•|›2¨‡©ö +ø­×Uý…ý(Ô3¾v+øoÔÛué‚þzÅö´×vñ#èëÓuÊõÃêøöÑñâ‡ãü»zÃ]Ÿ¹ñ ñ!éúÍü`î¯ñ“¸^èþÍy‡À‡‘¨]Ô_8iýòߟ +;­¯Xiiñ<²Öß=}²°Õó±Ê˜ØŸ?rƒ°×ý‡Y7!ÿZŸp[öZ?ëÿ'ùwZ__³7üÐú§ùC…£ž9èù9íïõ|ŽçyþœOóát=Fócu½ÌWÔý0V÷Ë|­‡ÓüæÓP/æ;j=ƒæ?Šz>?—|&úñû_±ýxÞØñƒ°}cOá´ÿFasH…yâÇëI8t<~œú"Úo}N®þŒžÂ©ryñ#\ݼëuÜ?]^ ¯÷áþè¿õ’÷¸úaøpê‹àÞ‹%ÿþÇk…ó-…ͱVØR~L ” ŸW»'Ñ??ý¾øaïÆxδÁõãcÌgÚoüûÑXOn~—pÚõš‡ +›Ã±ŸÂx’gwöë&ܾFëñu á¨õ +u¬pÖzæJe„ý…¨wá¾jC±®Vý0£=½a𼡯wþ#t|ÿíOâ‡×ùóèÏÄó Ö—O?×ÿë=âƒmý™½jÃÝ¿;yžpÐúØÊMp=xõ‹ï?Öú†Yà‡Ö?üöÚõ|ÈAÏýƒžoÐñ’ž¿Ñù²æÃp=ÌÏžXoI¾~Á~ +ãIž"÷Ë|j=˜_«õ²šoÃz2ÿZïÂQ|Y<’ûÝ«¶}ÌŒ2hoüÍ<9·õ¿ ß¾NEvUq}q¿ž[ä°sŠ´›òVüH[Eÿ-ýfË<“.ש ~„­°Ÿ¾J|°Ûðþ]ì¿Lòíxø0yø1ûátm¿·e¾yø>o|ã áx/¾¯›”ó#Åëµÿ{SáÃ[/4Ä÷ŸÂC˜/ç¹’7C×3ö"øQëu”<›mºŸZ#…Ýد_ŠëCª„z¤¶‡K{¸õ²C¾—üÇSQOÓâá¤õ.<Ÿ—òÃj»è ñÁéëÃâÊâÇ£çÿ}\/ŽÁúüî„×@?œî/|s·ø`6cÿiìa’ï¤õ‰sF€µ~æ¸ÿGQßÐÎ-“óÕú»ã¯Žz>V9èù±âù«ãéù{ùºž¬ùqºÞ’|•Ç~˜?«ûe>=ë¡ùuZ¯<ùvZOÏük½ ŸŸ—öcþIÂqÜVñ#>P]8ÍÅ÷oÃøýÁo·v"ï]†c!ﯿ2§X/ûÔHa3õñÁý‡÷»Ò5wÈõÂ,:QÚÇ5q¿´ìøÐè`\Êâý,¿ãÉ¿¬ÚΘQßt¬)ZÝ.›Í¢rþ¾®°k„þö»1âGÖñR+œNÁ|±ûXñ!,ÅzÜx?Êx¬7|õ!|˜†ý˜Yw§‰Ø¯ßY íÝP3õkÉ{˜Œz¥¿gƒêéú¾,ìÇ£Þ…çsaÇ÷wµÝ\UUüàësS|ÿ–ãçvMà‡ÎŸZ7¬®/ŸPW|Hº~s쾸>èþܪEÂY÷ï«Þ&ù7]Q×ùwa¯õ _#ù·? ¾iëXø¡õ7£]χôüJúó|u¼ çot>«ù°º¯ù1º^æ+£ûÑüEݯÓ|z­óY/ÍwÔz:ͺõ.|~.y/$Mîoýñ-…í*ü½“oû?áÐrÆ<ù÷ᮚàðý)·k/¼þ½ðãJÜ…óO?©“àÇ]ß-¾>µï-œžY->ÄûÏ€_ôò”?‘ÿ­WŠæ—é±fü‡KðyaÚoçôâxaW-i·[^Žfˆ^9]VSØ–AÿTeˆøàja<3²ü؆ùžàGÆzü5…ó`¬7==ùû1mqÿ”[ë~Ü…üÏE=Üá³ÿµ^Ÿ@þ[¡žþÍÛ…³Ö»ð|Žvž‡¶Ç“ñ÷N^_oßn…ç ßì‰ï#E?ÆÛà‡®Ï_u£øažÁúMÓ6âCÔý¥•%ÿQ÷ožþ@ر>å/–¼›ª¨_Þ9|9ê›ú–].ùÐúÇ' G=Ÿ \r~ÚŸç›8ÞTœÐù’æ# Âz˜Ÿ ëe¾ÒYØ×üݯÕ|:­GÒü¦=P/§ùÎ3´žš§õ.|~Ž|óß«§: Ç?—Î/î×V¹XØ}ô‚øáÎ>C8´îŠí®kUð!é½"ûBþ¿™1[ê•ç +»väza_ÆýVþ ‘øá·’öøëñÁÐÏG†GñÁnœƒüwœì]ÂyCMa3äX´÷[;­8_\7× åô^ðFô-‚:ž[Žïšç0Ÿ{öVñ!þ†õ„wõ~j!ÖkÎ +âGlý˜ÍGÁ—o±ßP©äÛTÖzÜ7 yoƒzååW +ÛÕ¨gøêLáðê]x>özQÛÝ>äúaVàõá¤ëÅ ãûiÉõ#éüñ7|Þçt}ùñ±¸ŸÒõþþ[üHº??ª³øtÿaŸ#$ÿAë㦽)œ´~þÂê’3õ5•nƒZŸ†[=rÔóc§çët<¯çot>æÃéz˜«ë-ÜK~òåØóu¿VóéXͯÑzæ[ëi5ÿFë]øü\òméǯ}ÀÇÌ_Ì[Úr³°¹ªÿ<É_õeÄ…â‡][OÚãMáÇ‚}„ócg‰îñÕðã¨vâGøe¸púc®;ñ<Ê…ç‡~ø¾°m¹]òï,üûaJþÃw½…ã›WO>^8U)?â›âCVNÇâû¹v2úÛž=Ä3ãyó…ø`Za>S Ï¡Ö“_%ù7»±^ÿíUð£öc{þŠ|?ŽýÆ‹_v· ñKõa$ê/íYë™+'lŽE½ ÏŸëL?Øž>sâGÔקq÷âùCÇ]Þ€:8ÿ#¹~8]Ÿ7‹A×o»ãýÙÌý=4 × Ý¿íÛ>h}R‡ò’w¯õKÓ„Ç¡¾æÕÕðCëo~ùS8êù”°žû{=ß ã%=ÿ óeÍGîƒõDÍOì¯ëÕ|å;°¯ù3º_æÓj="ó«õŠšï õ4šÿ õ.Ü¡Hžé‡½jòÞnÊüâ9…É!ï_âûÛfãMÂn{øѬ…°™÷ç9×¾¸ž¸ã¾+>5Ü*>„oçËõÂ4{U8×Þç‰q7Çjwày¢ËÂ~÷‰¸^¼ï䕧‡™øûöÔÿ™©ÅñÍÒàË´&±ÛDøA~j_\?Bÿô2¾?Va¼Øp‰øáÿÄ|yZcát4Ö“{¾‰ëC]¬7>w +|Ù‰ýز¸^ä°ßÔ³»ä=ÍG=r‹ÚÂök­×K¿KþÓW¨gn½N8´G½ ßoë¿W%í“Ûâù\_ïŽÂ÷ÕMKŒŸ_#~d?¼´§ø๾oÄó…®ß=^M|°½°¿xÓ^⃮ûÿq‘pÖú„½ºÁ‡1¨Ÿ;| |`}Ï:uEñ<²Ö?ÓIØêù£žŸÕþAÏ×èxVÏßé|Aót=ÌÓõFÍ—ÑýxÍ_ÐýͧÕz0¿Aëå™ï#µžš«õ.|~Ž¼ëy˜4IØö7¿¸_wï(áxsûyEö6§ì+~˜i…Ýaø<À×?¼¨­øa>ÿCòf5?ü°™Â©c<_t¼í ß|›c…ýk=p=þ‰äß–í)ù= ._<¥¸žÐOèÛuŽ ð÷‚üûßr½°W ¿_u î¯t¼Üe*üx]çkv„pl„õ˜ŸìµXonvüxûq£FKþÍì7 ?\õ°“þ”¼›Æ¨WÚoò êiÂX´÷E½ Ïç¥ü(iä*<ŸóõCÞÄóÇ_º[ü0Ïa~ÿ+>ßðº>ä•â‡mŽõ»17àzÁý]x‘ø`šcÿ®K5É¿íŠúä×'­_èÛ >h}ÝšçÁ¬ÿ‹„£žO ëù±Òóõ:^Ðó:ŸÕ|]ó“Ûëz5_†ûÑüÝ/óiXÍoüPë¥ù¶ZÏ<ùO£Þ¶áTä™~»H8Œ}n¾ü{Ðb†°ÿµñ¼"§^#…Ó>óæÙÔìþ·ž2§Ènû¹à.Ÿ¼SdÿH9ð£¯áý¨í‹%ÿñé9x¿é ZV?RƒúàïŠ)|.>øs¦À‡öø>B¨óß[2ÿž'J»Ù1V8þ5N®V9\ƒïC˜ºÚÿßópu.Ƴ#GÁ«1_X‹ïÆVX­wüŒõÚ_v ÿ°Wÿnaw#ö›g¾õð•–JÞÓ~¨—»ãYa÷êé¦u‡ãPïÂó9˜÷»lïÐUüðúú´ÿ<èøö¾£å~ʼ£ó·êŒû)]_j3Tüðº~7û5ñÃëþÒ©£q?¥ûÏzˆžõ¹¨†äݳ~_Œ‡Z_“YY<Ìú?q¢°Õó±ÊQÏϱ¿žoÚ¤ãéù[/j>‚®'k~¼®—ù2ºæÏë~™ÏÜõ(ÉィWb¾µžéäßi½ ×sɯãõü‰,lV>1¿¸ßxðJð}G‰î¼)Â~tOø1øqáø>¾_îF]!öéøNñõéä£À—V?ÜéëáÇûG‹nÙ@a×±›\/l•3áGù=qÿtÓV\/úþ ùG>_þ;<ê$´?ôéäâ|თÅL^øøµ¬sŠ°¿ã¹åÂ0ŸëºE|×`=n`[\/`½>.€—ë~\ öÃ~ÍÆÈ÷Ô#ö~^ØA½ò§„Íý¨§ÿú,ð*Ô»ðýv¼^σí¶~ñì××÷ÿÏ:¾;¹Þ¯Òùí‹ø~yàúîûHüˆº~÷ÉâGÔý¹j?Š‘û¿p©øµ>y÷ý⃩‹ú¹sÊHþ“Ö×›ÎðCëŸæ<+õ|ÈIÏÏi«çku<§çu>æÃêz˜Ÿ|ÖË|å5Øó—ïÅ~ó3Èg¥ß·×ü­WÐ|ǵžšÿTõ.|~.ù-ñã§ÝÈûîûçóæ¾Ø.œ÷Ù[ü?Dÿ&µáÇ£…MÕ;fKÿ‹oEÿ±[ð¼±÷[©æ`<?þä?ýþ ®ýŸ‡wÎÆýÓø|=Îi)× {ñNÉ¿^ׇ¯ ‡oÌéõàÇÑåáÇÀ—ÄD>)ãz±ýý•ÇÀ/˜;ÅôžÎ·k±øîÒõì¨+ìva½±mü1ØOa<á4^÷ûïÉ·=õÈovMQ¯pv=ø°ŸÖóÈòÂñOÔ»ð|¾¾XǨ~mOû> ~ðõþÏ¿Äó9Æ›oÂó8çÿe‘\?"×7é ñ!ëúÝ÷q½Ðýå½›âz¡û7‹ªãú õ £7Æ“ú¥qÝà‡Ö7 [?´þáÇÝÂVχœx~Úßéù/êù;/k>ÒB¬'j~‚®×h¾ŒîÇiþ<÷kÏô3êQ’_­—Õ|­gÔü{­wá(¾*ž‡×óH—,ljÝ9¿øÿ›×ÑŸÂ÷×Í›‘ÿOñ÷®ùö·…ÝÀ²ú|rÞ-xÞxði?íƒç»Å‡x¹^ø3&»GÄõbÛ…h¿møàÎüMòï¿ï&ùÓ†§ Z¼Y\_XS¾ôè÷†ðe/ˆ¦'Ø[‹ól‡þæÑC…í/5¼~ÜŽùòc“ćøÖ[”¶u°Þügøñ öãwþ%ùÎÍ°_kŸöw¢æœ3áÃÔ˼ö¯ä? Ò¿h¿^؃z®ç¥üHÚî6?¬¾>vÇ÷µŽŸžÅß»:ß´Ü ?t}nS+ØF¨iušäݳ~e— +'­¯«|تbý³Ö?V¬'õ|ÈIÏý½ž¯ÑñŒžj‰ùóÁõh~Œ®×k¾ŒîÇjþÒçØ/ó[ yòëµ^ù5äÛi=ó¯õ#ª”ò#Ω+.è,~¤^Ú~ØG©¸?×—ÐãÙ÷¤›–KþÃÂ×Þ-²;LØ|õ ž7ê\ +?æÞ#÷SáÄrèusñÃü2C|°/\'× ¿ìjøqôZ\ŽùGòïÚ] >Ä0>ü>mRq>sGCá4aÛÄ"‡£Gˆî5°ÿ¿Gþ@ÿ8møÒã™®Íá‡Å|©Ê`ñ!ŒÂzÒØoÅ{ Ök_½T8ÌÓý<°ùߊýÚsnŽ‹Q÷ +®©ê+-—ü‡ÃQÏôÐxp;Ô»ð|.œx¿«íù­‘âGÒ×ç¯O’çñ ã›æ3äúáu~3 +ßOJº¾Xáñ#èú}_ü0ã°?³z£øaªbÿnÊ +ñÃk}ÂCÄ3õs+Kþ“Ö×wj?´þ¦ÎõÂVÏ'×'=?§ý£ž¯ÕñxþŽói>Ò[XOI~>Âz“æËè~˜?§ûMÌç úý2æ·ê4ßõdþµÞ…ûÝÒ~Ôl.œï¾b~1oþœÂ&¾-~¤{* +ÛƒZ¶[$ïéÈ–ð£çëÂöÁ¾â‡ý¤«pˆÏ¯óýxÿ×z÷S¯é÷ßš.׋4¥+üXu¤ø+àóÂ4o±øÛàûŠîÅðaÿSàÏm_?¾*~e×å}ñÁ½„þîKü½“{㹑õÄüæ ¯õ‚S°³'Þ¿5Ïèz/­?a?áÐ âƒ{ûu7œ*œ«¡¡üçÈ%ÔËõ}^ØF=ͬ»„MÔ»ð|^ʶûG_?¼¾Þú–ø¼CÇ·»6ˆAçO?uç¤ë3Mç‹I×ïNÇçÝN÷fÖ²î?wŒø´>湟„£ÖÏ|Ý\òµ¾~b_ø¡õwç C;ÏG9ñü´âùnÇx%ç?\çÓ|x]é‡üX]/óet?VóÏÒýj>½Ö#j~㨗Ó|§kQO¯ù7ZïÂçç¥ü®cZ‹¶Bká|ü‹â‡mq‚°™ø÷œb ¿· îÚúN‘m$ªï%~„ûûçäyíªöùåÄ{>?´ ˈvÞïM{-’û¥ôGyñ%5:W|ˆ‡ãïoCó§_+Îg^i,~˜C§O?Þ ?”Ý +ýûÙèŸÜ&>„ÆÏ/¯*ìöÅ|þŒ¸¿Z¤ë¹ö5ñÁ}€õ¦=÷αŸ0¡Ÿøjb¿î‘r¾'ꑺO’¼û7´^_u¶µµž;p«õnØP8ëõÃi»é8Mü0[ðú°®ÞϽSÇm¼_¥óçæŬ닷ÿ+~˜½°þpQ;¹^xÝŸ}©øuÿ~T_ñ!i}ÒÑÇIÞÝA¨_Ñùg}ÿ˜?´þ±ãa«çCNz~^û›]8ß ã9=ÿÈù4F×ã5?éE¬—ù2ºæÏé~™O¯õ0̯ÖËh¾­ÖÓiþãÕ¨·ïÒ>ðyð‡»…Óò³æó–×_ö·?Â!gƒ[¼?êàzb–<?6¯‘ü»ô¸‘û©TßOq¿Ý"÷S©JFþ?ë0YòÝè:_‚û§Í‡ }üñ!nyE|;ÿyUúŸsšpju$¸Ï Ü_¶ñ{‡é{íßd-üxUÇ3ú÷~]1Ÿ]ÖTüð±7ß1`½fòVɬƒýÄ&—ÁùدU¯KQ³î>É{j…zù6§§ ž®za³õ.”íz^ÛCƒyâGÐ×Ç úŠNÇW‡ç ?>ÿüÐõ™ø?¹Ÿrº~wóPñ#èþÂÃKÄ ûO•Vã~jÔ'Üu©äÝœ…ú¹Ö¯ +G­o8' g­¿éý·pÒóɽÀYÏÏk«ç[2Ï_çËš ë)É®—ùÊ7a?Fó^Â~£æÓj=¼æ×°^šoÇzjþÖ;ÿ×Oòîy—ïª?_ò7î^ðÿn?òæ+„ÝWáÇÈã„ÃÑVü0ÿ×V?ÜG/ ç?ZâýÛ»Z ûãWÊõ„ïÿšÜñMñ±ócâCX´Yî—ì‡GÂ*§Éõ!Nž†ÞüJ±¿Ùt:¸_ÿñ²ÞsŸ?L ÛÇËý•Žþîæ…ð㌗þ >¸1Ÿéˆïßš¯°_¥›\/lm¬×uLâCÞý¤ê‚;a¿áÃÉÈ{ ÔÃyò¾õ2Ó÷Žg žáÒ Ÿ×w£Þ…çsá̯´Ý–Y!~X}½Y8Dü¿B[ñ#éüñÇÄ³ë «z‰A×ïÚ ~$ÝŸ»åpñÁéþÝy‡H¾]#­Ï¢þðAëgþùT8h}ÃÀJÉùiý ?(ìô|ÈYÏýž/Ç3]pþ…¿W”ñKòÁõh~Òͺ^Í—Ñý0F÷5ŸV둘_­—×|Ǩ§Õü§ýPïÂó ò­çáÞ}]8Õ8Füp݇ +Û÷ñý!÷æÂ…û@ñ#–= ý{Ι%ymû¯ä?ý;ŸÿõÁç%y¾_úAiwê‹ù1ü=V*»·ÜO¹6ø{ÝpÂír½ðSk‰îÉ)âCº÷-ñ!4Y?N|¸ç a3}ÇXáòp¥l÷…çñ³Ð??7Cü0Oa<Ûu=ž7êb¾´dÀzB¯–ð£#ÖÊáó ³ûI÷?Ì#ñþÃwý%ÿînÔ#Œ®&Ðzõ‰ä߀zƯ +›Z¨wá†þUWξûá¼ô*ø±ÞΣªK^L­âC~¶Þ¿­|‹°}êÙÉ’gWV84| Ï ð÷_ቿq¿ôB]\?þ­+ׇÔr†øà¶6Ì¡MÀ;.SÏò°ø‘”ÍmÏŠaú‡…ãqý0'Êxn$þ¾.<¥óÝ¿S|H±žôñqÂæi¬7½Ý> Ã~Òn¼?ë"ö+\V iß$ïî(ÔË=2FضE=ÓœžÂáÔ»p¿[ʬínêvñƒ¯ÓÉõ#ëøæ®çĬóû‘‰öO¬Ï×ÿAü°3±~?£«ÜO™5ØŸ;}î§úéþgÝ$>$­Oágª„Í"ÔÏûÿÁÖ·foø¡õ7ïvz>ä¬ç´Ôóu:^âùë|‘ùÐõÍO>M׫ù2ÜóWû ÌçÔ#0¿w¢^éLäÛj=æ?MA½ ×sä]ý°nŽ½÷?b™Eh_SMü0çGa7£?üØ~“°­±kf1Ÿfî·ò™ð}ªåëàG§±xÿ¶ë½ÂæÁoå~Êîª,ì:¶—û)SŸ‡„äzn„ëG÷WćtÈ»âƒ8íeñkòYÂéèY£ÅÄ󇛵ðþÕSèo†ëÇ]/,ÇûýáGÌç\->õäzûÁG°^Ó¹=ü¸ûÉq?å›b¿©^mñ#ÕÒzÜ2yŸ‰z¥ï»ƒ?Ñzþ|Ž°¹õ.¼Ÿˆv=£íé±_ÅÌ××Ù,~Xßóžøaêc~÷CøñÖ—:ÕÁó¸®ß­œ$~¸úØ_´'|àþ +Vh}æW¼G­Ÿ­t³°×úÆÛ&ÀÖãbá¤ç㔳ž_ÐþIÏ×èxVÏßé|Nóáu=Aó“t½^óet?y&òçt¿Aó™¾G=r+ä7ÕB½‚æÛk=ó#È¿×z».ÛžÇÎ?÷—ÿ'y[ó|è¸øá›)œ.4ª!>˜6¾\j£¼¾k?Ü_)ç&ÏÑ?UÇ÷IÒVÏ<‡û«‹0Ÿ‹3àÇãXyj›ø¾Åz]¥:¶ö“«?ŠëÅ&ÝïEÿ ï}Q÷Ñ áp êå/wÂñÔÓ{ÚÇ Þ…- +gþ{¥íîš=÷ôõvÌŸâ‡×ñýº¯àÇŘߞ7]üp5°>7¸«øuýîë_įûs{Õ¢î¿ð÷çÂnÔÇUn"y/Œ'ÿ¾¤÷Ÿ‡g¡¾qÖø¡õ¿ý…þz>äÂßïÊyþþ\ÚÍí8ßÂß³ =ÿÂߟ 3Vד5?…¿—‡ÏÌ×vì§äóì—ù çj=4¿y-êe5ßñeÔ3}‡ü玨wáû 2^ WÜ"ç°ì'ñÃÆ]Èû²us%Ÿ[V¢ÿÎïÞ•~ †ƒW4˜Yä\ëBôï;ÏãöøðÏoÛ]9|8´í1I¸ki“_û©´¿'äÞ‹û§+ÎÛ\ìg.{A|H?€3~©øÿ‡ígƒ9pT‘}½{Ås(8ë?ÞÕþízãúqÆ3„Ót¾úÏ‹nÖc¿ÕïÛ^ˆõ†¹ûàúaž”ý˜Åxö›z¬’|»Pß؃D½Lª œV žîªÏ×ÉþV Þ…ë¹pÖó`{nXAüàë}ÕC_uü8 ,žÇ{b~3büÐõ¥ùcĬë÷{üOî§÷×ëBÉ›×ýÛ›¾k}ÌM¸^d­_è¹LòëÇ£¾iï +«‹ëɬÿ' 'ž²™„ó‹Úßêùz/ëù§nz}Ò|änXóãt½Vó• öÃü9Ýo`>ŸC=¢æ×h½òKÈw®‚z¦‹¯õ.|~ô<òÌÚÂæ-âGºYû>Vü°S¶#ÿFÃF¸‹µVáýÜÏ:K»­êÄ°ä@á´ô¿Éržðýa7õ4yÞÈÕœøá>;Gî§ì²%âƒ;¸Á˜b{váÂïÈõ!ݽ>”ùëùb»é.¸ßç#Šìwß ?8p+ü(‡þö¾®âGøãÙ®·Àʘ/Íë'~˜MXk9N|oc½é–,>ØØ9¿‘p:ûÍÃð|ŽC=âóõÄó¤Öëxøà2êéŸzM|ð»PïÂóy)?ÛË!~D}}|æDñ#ëø錓Å;ó›ï“ç §ë³¿|!~Ø[±~W5ˆI÷—¾¹[|pó±ÿ<ö0ÉÔú¤9#„ƒÖÏ÷°«€ú¦v>hý ¿Ï ìô|Èæœ_Ôþ^Ï·ð{OÏ?è|…ߟ‘|D]OÒü~OBÖË|å*ØOÖüÅŸ±_¯ùt;Q£ùuZ¯¨ù¶ZϨùÏePïÂýni?ª®þ©øNU_~è.~„~¸Þ˜c.ƒc>€}o…O÷³Éóxº³†°y—øa&ÍÁõ¢Ê?òþTXÛ¼÷7x?jÊñ!õœ;Zò^ûaÓ»†\Òy+àÃkŸ+¶‡jÍÀ;^&ýç÷„ßSÏëáGôO¯]ŽëG_ŒçG^&~˜{0_¼èñÕÑõŒ{÷WGa½¦ê»âƒA÷³©|™ýþ»Vðá~­‡ÙC8‡zÙg^—ü›Ÿµžó{ƒk¢Þ…çsðø=€Èö/Ž?__¶…øa÷ÀøæûKÄÇùÏm%~x]_ªy$î§tý¡áBñ#ëþLÇ(y3cÿé‹s$¯Yë*ây½ŽúåOODþ{¡¾iäðCëŸÎ +Öó!›f8?öz¾IÇ‹zþ^ç‹Ì‡®Çj~òÕXof¾t?Ióç¸_ͧ;Gë¡ù ;µ^šïPõŒšÿ¸ õ.|~.>D½~¤‡: +çÖKÅ·×¹ÂÎ4?LÛÃÀ©œøá+m@þ?*?švW´ÃçãGž_V®çñð/¾¯•îŸ'Ïæ)¼ß›N4¶˜ïüÜâƒ[×&JþÆ÷±L‡ÃFJûAÇWÞZdóNsð%}ž-²âNøq)8}~%ü˜€þþÓðãZŒ—;\?>Ã|þ+¼Ÿ›êc=qO|ŸÊõÇzÝ¢¡âCXƒýØ;7ÇدÙÐ +¼õ°]>’¼»÷Q¯´ûð^¨gúý’÷@?vôö½Þ?òŠ©byñÃU=YØ\=÷Éã?Á‡ã^•÷sÓßc„ýk§ÛÂðãæò<žÛmÂõbËïÛc³nÂéòSÆÙõÛëÅ]ÓäzÿÆoÁ¸òËíyã:øðû“ƒeüK[‚ç¶|ºÈþ’ÛáGÇfíáÇnô7ûâ¿'`ÎÓñL½~`>×ãD¹~„XOºö\¹~˜o°ÞÐãøqöc÷)>¸?±_ûÏ‘àÚ¨‡_:y¿õr×µN‡ ž¹v%áÜõ.lýÕSíæñ³Å ¯Ü#~ß]ůó‡ï^‡º¾ðÐñÃôÄúcƒ/ý…sŽºw)î§üZŸYµ$ïAëçÎ$l›£¾©Þ:á¤õw=þëùÍç8?öÏ<_/èù§™˜/i>Œ®Ç´G~œ®—ùòºæ/÷Ç~æÓh=¬æ7^ˆz%Íwþõôšÿ0 õ.|~^ÊØþiáß?âȾæú÷ŠùKÛ› §?î‚?î'ïk?¦èû[î™"y¾í*ñÔyQžÇýèïÅÓú|yÞpÿô?¸a´Œßù7øqÚJ\/¶Þ >v!2Þ«áÃS«ž*²ù©•^?Nz¼Èî¨[àÇà8©9ü‚þ±áñ¸~ÔÆx¦Ñ¡ð£)æ3ûT?Ì#X™SCüí°ÞT½µøaÀ~Üȧć8ûuGÿˆüÔ#Ö»yÿ õÊVÇ¢žæÚ/Ö×^F½ Ïç–~h{ºöñÃ,ÅëÓmÏŠIÇ{/?‚ÎÎþ~èúÌôU⇫õ»¦mįûË3*Ë¿×ûú°Ö'•¿Xòîiý¾Ÿ+lß@}sß²÷‘´þiàIÂNϧð{?Âvίð{@Âfηðû>2^Öó/ü¾°×|~ßGÖÃüD]of¾t?Ió¦é~5Ÿ†õÐü­—×|;­§×ü[­wáyùÖëG˜1>,+~¸.áC£ñ⇙~pxöxñÃ][M8ü%ÞϽq¹øOÙö–äõð[áÇ؇'Jý~ÖÏ×'W_ä<í!\?^ Ù¶1ðåïo†Ù¬¼ ~ìÿ»\rÍð¡î£ÛÓ­Áµ—ö/²Ûv#ü¨ Ž‡6 ÐßwÂÈñ\×ÿàÃ^;d¾4T?áM]OÕ=áÇt¬×¬¸Qóî|Ô˼0Uò[¡žnÑ=ÂþÔ»ð|^Ê í©Ürýpúzßq¡øátü|cEy?7êüþ[ü=`äúm…÷«¸þ+‹I÷Wøý+ñÁ‡ý~ÿJòožG} +¿%´~…߫¿ÿ÷k}+Ý´þ. vz>d{6Î/WD¯çku¼Èóç|šÂï_ÉüNóSøý+Y/óet?Qóçt¿Vó™v Nóë´^©>ò®F=­æßi½ã²e’ï¨~ø7Âû„ø‘þyO8]îÄÜî)ð‡ÏÀ&­Ñ??ÖüŽëEß&K~oÆ÷Ó†K^+rz´´»{‡‘öZ~üûüóE·ãótóÐу‹ìG÷‡¯Í}XÚË Ö|Ý»Èáý Àí¾¥Èîîëà‡‡­'ÀŒþqö.ÜOMÃxiùÇðã ÌÞž ?ö{AÖã×$øñ ÖOÀ÷ ÝfìÇ_VIü°½±_ÿp7ñ#ôG=œÿJònV ^iï‘ÿ¨gø«¹p®Žz»† Kû¡í>÷?øú¸æ ñ#pü#N?’Îï\w¹~$]Ÿkþ°øajcýé†éâGÖýŃJÞÌLìß¹æÈã +­O™MÂvŽÖo¯‹àÇ6­oÇ?´þiý"°žOT¶àü +ï?I{ÐóM{êxUpþi?ùÐõ0?žëÕ|yÝOÔü¥fدÕ|†¦¨GÔüúª¨WÐ|­§Õü§/PïÂçç’ï¨~¸¯Ÿ¿ø–¬Cþ» ~¸£ôzÒ¥9ü˜ØIÚÃÚwäóŽøøþÂöàûÄÈ8ñ!õ>ïWm?þ|Ùáåbžã|b.úú9É÷¾<ÝCž/ÂãOÀ¯/êWl7ëñû¼ÆNì"|m{øáNi$¯?ûZøÀ¾-~?Ö8ôw;¾†ëx{¼?^Ä|®åXøÑë õ£øa¶c½yítñ!܇ýø_ãzQû ¯œ)œÖ£a®©›ÖëÖö’ÿx êO>DØ·A½ ;,åGÒö<ýñÃëësëÝâGÒñÝò«á‡Îo‡¾ ?t}©×<ñíÃú]w|ÿÖ4Ðý=4MüHºÿÂïÉAëSø}8ÉsÖú~NØ\ õ}u5|`ýùSØñ|”-Ïýõ| ¿'ý½žá÷á0žæ#õÁz¬æ§ðûp²^æ«ðûpâ{Iþt¿†ù‚zÍoX†z9æ[ëi4ÿNë]øü>¨…ó‘ó/üïšbÞ·–b³N?bûüßJ·¿Ñyb»þ½(Ç3[ºýŽ&È£ö7W*Å¡ÅæRlô÷79^¨ö0òÍ×—[WŠÃoÇöoîSŠƒþ÷Ì8ž™Y ÷_\ÿ˜;J±4¿‡>‡àúÄñ»t)ÅᙥØ4)9þñW—bsÈ¥8ü÷_iþ ¿ÉõºoñßÓ"›Í}ô~ç—ÖâïÉØ^Øo©v7ßÏöÂþñï‘®/MjQŠÃ˜;J±ÓÿþXÉëÍ/Õžú¶ê…ÿt|wG“Rlô÷<9^ê0¨T{¡ž¥ØµÀß“³¡¾ø÷—ëo€¿e{8þêRí®ÚÃ¥¸PÿRœÊ®+Å…ó(Å…q%ÿ¶^ßR¾é 9¨/d£¾ ϟ♾ƒúB¦/dúB¦/dúB6ê ™¾ y_Èô…L_È…|ˆdúB¦/äÂy‹dúB¦/äÂù‰dúB¦/%¬¾é ™¾é ™¾é ™¾é ™¾é ¹PñƒL_Èô…L_Èô…L_Èô…L_Èô…œÔ2}!Ó2}!Ó2}!Óç/å ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾éK «/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúâŸîþÉÿ¿#Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2})aõ…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Bú®”/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/%¬¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾éKü±«¼/ôyŸL_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô¥„Õ2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}IŸ Ð2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó—V_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô%·¿Ÿ«éõ…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô¥„Õ2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}1¬/å ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾éK «/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúbߺD>‡áý™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾éK «/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúâ6¯,å ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾éK «/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúâ+âïx}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2})aõ…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_ÂÙ å{,ô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô¥„Õ2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}‰ÝÏ–ï9Ò2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó—V_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô%ž]Ê2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó—V_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô%tª|/ž×2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó—V_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_ÈôÅì9µ”/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/%¬¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é‹mp’ü¯/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/%¬¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é‹»nB)_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_JX}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó?¸–ü]!¯/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/dúB¦/%¬¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾é ™¾éK˜ÿR)_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_JX}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó—øsUù;t^_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_JX}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó—TcX)_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_JX}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó2}!Ó—|QEùÝ^_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_Èô…L_JX}ù¿ªÎ:l«b}ۃ݉ºu©ØIØ5&X˜XË tÛØŒ±UlQQ°–‰…Øn»À[Ç­bbw~ïᆵsßû—Çu\sÏš¹ç:]ë‰÷ /hxAà ^Ðð‚†4¼ á /hxAà ^Ðð‚†4¼ á /hxAà ^Ðð‚†4¼ á /áÿwªá /hxAà ^Ðð‚†4¼ á /hxAà ^Ðð‚†4¼ á /hxAà ^Ðð‚†4¼ á¥Õâ /hxAà ^Ðð‚†4¼ á /hxAà ^Ðð‚†4¼ á /hxAà ^Ðð‚†4¼ á /é­iíwÝà /hxAà ^Ðð‚†4¼ á /hxAà ^Ðð‚†4¼ á /hxAà ^Ðð‚†4¼ á¥Õâ /hxAà ^Ðð‚†4¼ á /hxAà ^Ðð‚†4¼ á /hxAà ^Ðð‚†4¼ áÝòr¸ÿ»‹-/Ò-/øú½¾„¯ßëC·¼àë÷-[_¿×‡nya~ý¾eëë÷-Ñ-/̯ßëk}ý¾%ºå…ùõû–­¯ß·D·¼0¿~ß²õõû–è–æ×ï[¶¾~ßÝòÂüú}ËÖ×ï[¶^4¾å…zý¾%ã[^X~ß¿å…zý¾%~Ë õú}Kü–êõ{}ø-/Ôë÷-ñ[^¨×ï[â·¼P¯ß·Äoy¡^¿o‰ßòB½~ß¿å…zý¾%~Ë õü{ªŒ×ï[¦™‡w¾¿H·¼àà >¼àë÷-™¯½¿àà õú=XÆ·÷|x¡^¿Ëøöþ‚/Ôë÷-ßÞ_ðá…zý¾%ãÛû >¼P¯ß·d|{Á‡êõû–Œoï/øð‚†é–éöþ"ÝòB=¼P¯ßƒm¯/Ôë÷`ñÛû õú=XüöþB½~¿½¿P¯ßƒÅoï/Ôë÷`ñÛû õú=XüöþB½~ß¿½¿P¯ßƒÅoï/Ôë÷`ñÛû‹üöþrõCy‘nyÁ‡|xÁ‡|î/øð‚/øÜ_ðá^ð¹¿àà >¼àsÁ‡|xÁçþ‚/øð‚Ïý^ðáŸû >¼ áEºå…zî/Ò-/Ôà õðB=¼P/Ôs¡^¨çþB=¼PÏý…zx¡žû õðB=÷êá…zî/Ôà õÜ_¨‡깿P/Ôsa<÷—µ~ïÌ‹tË >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼ áEºå…zx‘ny¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^//¯a¿ô{JIºå^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^Ðð"ÝòB=¼H·¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Œ‡—†tæEºå^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^Ðð"ÝòB=¼H·¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Œ‡—.wuæEºå^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^Ðð"ÝòB=¼H·¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Œ‡—ÑßvæEºå^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^Ðð"ÝòB=¼H·¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Œ‡—+Û¿ã”xý"Ýò‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/hx‘ny¡^¤[^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡ÆÃ˳væEºå^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^Ðð"ÝòB=¼H·¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Œ‡—½oêÌ‹tË >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼ áEºå…zx‘ny¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^/¿MéÌ‹tË >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼ áEºå…zx‘ny¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^/t·6ñúEºå^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^Ðð"ÝòB=¼H·¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Œ‡—åöéÌ‹tË >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼ áEºå…zx‘ny¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^/^Õ™é–|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xAËtË õð"ÝòB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼0^v}¯3/Ò-/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚†é–êáEºå…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zxa<¼|·ÐÇÿÿ¿'ž¤[^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá /Ò-/ÔËtË õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðÂxx±Kg^¤[^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá /Ò-/ÔËtË õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðÂxxY|Tg^¤[^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá /Ò-/ÔËtË õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðÂxx¹ÿÕμH·¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà ^¤[^¨‡é–êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…ñð²ÝÜŸtzý"Ýò‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/øð‚/hx‘ny¡^¤[^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡ÆÃËç[wæEºå^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^ðá^Ðð"ÝòB=¼H·¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Œ‡—“ÎîÌ‹tË >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼ áEºå…zx‘ny¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^/ÝžëÌ‹tË >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼àà >¼ áEºå…zx‘ny¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^¨‡êá…zx¡^/wÎ8¥Óëé–|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xÁ‡|xAËtË õð"ÝòB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼P/Ôà õðB=¼PÿÙOö¾X3r¯/Œ—gß0]Ýúèçÿ§ã¿®7'.ëzÜÞ®\òÙÿùÍ™³š®¯™Ót=ïXÿžÀÓ~ú~øtÓÕÃK™nÞ¹Õ¿½ÑÓÆgü§2_9Æy=ó,û;Ïgéº_e¿›5>~ñ™ý;PázÍ×åaÿwu½¸ùuöïÜ­'õhüßU×zËä»ßü¿}í§þâ³7þOgí7Ý°®é¸›÷#=y×äÿóã$õëàmM7êg³Ê¼¦« ½ßC}|_Ú¼òÓÁéZõ¡ÿú_™Ïü½ÞpÍõÇî?Õ|Ö·Ç·¦ã¾þf̓¾þ??ôôý…Þ6µÿôß5¿ù??©?e¥ÓLõ¯ð¨é°µ÷7ìð¹é¬þ§cþ2u>èJç׎×ùFÍWëü³®—•Zë©”Ÿ¼¡¯·Í—öCþ’ö”ÏJýÊo¥~Eå;oïý ÊT¿Ë?ÿxþuõÉïšÏìc|ä¿v=ë3ÆCÙæ\ÏÿZ=õ¶rÿŽk‡üÚÏÎÃm‹šŽ4ûu.^Ìõ°µœ—îñÊ»–ï²àü¦«?Ï7]_}ŠñÑü½“û³}é<¼¼ŠéôøÖ¦ã<‹˜ŽGïc|ÔÒé“匬ñÍC¿YóåI¯µ®—î}ÄøˆZOýZ6>ª£}½ÍrïÕÖ¾Ÿz§®Î‹ö[ÿç ã#©±þÈòžÕ¯<Ýɦkõ3ý±™é¤~Ç^½:ñ_­y…ó¢úê§5Œ‡ÄüOMr>tý°íî·֗¶ûÐtXÞ×_`<í/žñ”órŸï¿ª–ô|¿àý Ójºú¯÷/u¹Ét˜âýM+¿d:«ÿå«\ë|²t5»Ÿã“ηf¾n~þeZ]|h=òÓ®WùŠÚOCþ´ßJù,Ûx?å·Q¿ùV?+ò¯~ÇAS,ß•øH‹Ðø@§zùýƒñçÍdÿÎS£ùҘϨë5K¿c|4ZOö¡ñ‘µÞx|0]k?ñ±uŒð ï7î;ÊøhÔðGW¿Ÿ\ïý +—ë~r€÷3>}ŒñPÔïzРÎ|ÈÏÓŒ1>¢êëKz‘ùyvÏÿeÞŸêíM'úwãùîŸèý 3ßë<¨ÿUýœé¨óAWúù1¾æ|5_Ãùs=å£Ñz¢ò“´Þ6_ÚO£üEí·R>³ú•ß ~åžï¨~Vä_ýn&NìÌÇ=7yþ{`|ÄAç˜nžzÍxwïi:uÝÔùØkQ×r>öŸä÷‡§Ö5<ØtðŒñ¿ÿÛóÿemºL8Õt^h&ç§o0]¶yÄóÿâ‘ÆG}ÇéÎÇQy‘}L§³·2ݬ¸ó1e¾’næ[Ïï_ï½ ÿ;hš/þÇø¨¶õëå‹6>ÂÂZÏBÓ˜®µÞðâRÆG£ýÄ•úýäiíwÃLJB?.Þȵú•z}bùO{?ã…㜇^ÞïŽßîÄGëOe|4ªOk­`<„Q>žú€é¤ë7c7v>´¾z­ÇM'­¿Œ]ÃxHÚ_˜ï*Óq”ï¿þäçGý‰wDË{Qÿò6G›®æ÷þ¦®p>Ôÿôê®u>èjˆŸ_­ñQçË|Qç_ézánÏGd=ä‡õ*_YûÉÊ_Ô~#ùT?ÊåWýª”ïZýŒÊT¿C¯»,ßÜ?šmÏ7÷?ÈøhÆeºîþŽñ?ÝÌt¾µéúÛMçÛŸq>Æßg<”W¶2]`:•·ü~qõ×ÎÃuG™Ž 5]Ý÷/ÓyàOþzã˜ÉÎÃ'šŽ37®o|×ïg:|·…ëû÷w>þu?_I7·næ÷oz-k|0_è=Ÿ¿9Ö¯¦ïêÏ[ZOøïÎËX_o^|+¿Ÿh?q̹ÆG|Õ÷ûÖx¨îð~4«aºV¿Êsó›ÎêgØëã¡Q¿óĉøÀ—^h|„çUÿNwã!kþê¤;]¿Þv çõ­4Át\Â×ß,¶´å¿ÖþÒng9/ÚØü®ÕŸú´å,ï±·÷/ü²—óq›÷7<|ªó þ—Í.ññ:Ÿ,]ÝäçWþëãÃ?ßò³ÏWtþQ׫•ÒÇ×S+?Qëmó¥ýdå¯b¿Êg¤äWýª•ï¤~ÖʾÄûÝñÿ+Ë7|ä/üù©¹âP㣼°›ùñäý~±Ð*¦Ó—;;'}ç}±ñµŸêˆ‡Zû ïla:©Õ —-ïµú•;Ƶú™ÞÄ5ýîÕ«øÕJçÔ‡jAã!jþpã•®uýpý¢Î‡Öæe:kýaži-ÿaZß_õÙ¾¦‹ög¿×tõ‚úÓó÷Õ¿¸é*–ÿø¾÷·±½ó þ§•ös_çƒsûùµãu¾ÌFëüu½Jù¨´ò´ÞH¾´Ÿ¬ü•y}¿QùÌc½¹¯ç·Üàý +ÊwYÌû™È¿ú êÄGYtÓõLC´Æò¦Ëz_iø?–÷扻¾ö ÓõíSó59Út>b ×GÎa:Üú_ã¡yùvÏÿä~¦ãù{ºÿšñPÿ²°ézùLçy>·üçM^ðûÇø§L§E7u^öºÛùxlˆ?_Iç!ûEãóÍ;EóÕcv2>’®×l¿Ÿñ‘XÏØS¢õ†…4>ûy×Úo¸¨ñ‘éGèb:<éýª.¸Åó¿¾úùØ0ÓYýîx}Þ‰ÿ—ÆG¤þ±¹‡ª‹ÏŸÖ¹ØùàúÛv5j­/Ì|ºk­¿œýé¢ý¥•·u^úûþË¡W;êOžécÓñï_új~ÏÿPïoÝo-çCý/Í–®u>è°©Ÿã“ηÖ|Οë5ÊGÖz*å‡õå+k?YùË3i¿Êg¢ÊoM¿”ïJýl”ÿFýÎûvæã>ç!¯wŒñ‘œÛü沇jü§–÷ªÇQÎGïÛL7Óýî|¼=Ðy˜ö ÓéY¿*ý¶˜éf7ÿ¼#žõ¸å¿,—•üù¾šø¬ñ÷ç­jþ¦ÓA]l|>úYçáÍŒ‡pÊƦÃW/8¿íÏWÒeöƒýþ¡ñÕ ƒFóUƒ2>j]/?:Üø(ZOÜ|¬?_i½ù b’üú±ÓŒFõõ~³Eó‡Ïr^.ñë§?¦·üG­/ÿ9Ìtu°¯?ÍPLgí¯µ®çÿ1ßzÅ_4êOyߟ·’ú—.üÛÇÏáý-ËT΃ú_ÍÛÃùÑù Ã1~~YãkΗùtþY× ‹y>¢Ö“•Ÿ¬õ¶ùÒ~Šò×h¿µòÕ üæ¼_òÕÏFùêwÕ«W'>Bç¡:òxã£j~µ¼§ß~7òÇ/šÎWœà|V=ÞŸ¯¤ËØ¡~ÿ`ü6ÃŒ¤ùBï“Èõz\f|D­§úòIã£ÚÔ×›™ÞtH¾ŸpÏ΋ö›zÉx¨x?êÕkçåJïWÈs˜.êgà¼$õ»ãõy'>ðÃ9§Ô73Lo<4š¿ÞçdÓaˆ_?^ÿ›éÈú¾õÏ ‹Ö_§Œ¤ýÅ—µ¼×ÚXm¨kõ'Ü}·é¢þ嵧¸½÷·žfF㡨ÿéôœ:Üêç5¾Òù2_Ñù— ~½š|h=ä§ÒzÉWÔ~È_Ò~“òY©òÕ¯r•ò­~æí=ÿålïwÝ­3Sqnn|Ô¯}`:îÜÅõþþTœåtçc§“Ì·w5]×ë¾ÞxÈC¿ðüÏ°±ëûÎ6þþÂó~{w×û_eºþÇG< ÙÛt9d]¿Ÿ,ÚÓÇ—Güþ±dWÓ¡ot=ý4^?x¸?_I—õ’ñQk|^ütã£f¾p©ñQéz±¹Çøh´žpîã!k½±ë +¦£öS?Ýù`¿Ûÿeù¯Õøòy¦“úUïM7êgµô\΋úÝñúÜ4¯ÏñÓÎÉøHªÏ7þmºÖü姣þ~ý°ÝTçc __úxWã¡ÑúÃï™®µ¿¦Ë|–÷†ý_R›Ž]ÔŸ³®t½„÷¯|8ÉùXßû›ßjº¨ÿù÷¿|¼Î>ôóc|G^ì|³æKœ¿®—ɇÖSÈÖÛæKûéÈ‹çOûMÊgÙVýP~³úU)ßú™¿RþÕïŽÏÏm¾Jï—T§¿oº¼w²ñÐÌô´ûwÏh:lÙ˜ÎCÏ7šOÿm:N·˜óqÿ2¦›eî6êIoXþãÙ;¸|¼é꾿-ÏÕ¯ú¼tú»=ïÝn²~•+6Ýü§·éj˜ßOò¼úýcóÌOw¬o:ŒÔë•+Oöç+é0y„ß?4¾úq”ñ5_št«ñ®òëÕs¾b|„|=eÕM×Zo¸­ñ‘´ŸrÎÆGÑ~óªËûóý8èË{5Ìû•¿>Üt¢Ÿßoä<¼ïýwâ#à/q‚ñPT¶úÕt¥ùãˆC~ýüG1]ëëKonéè¢óc|Öù2_¥ó¯t½¨|°ž¤ü”>¾^òÅ~Ê}ž¿¨ý&å“~”-<¿ô+)ßeKïg9Íó_©ßŸŸ{þÅG\üIÏû<§9ëùë‹0ÏÎËñg¸ÿÑhçãèL§]Wp>¦Çtîõ„ñº?é÷‡®ƒ\Ïé|xWÓ)Îìü\ûœóÐóJÿÿÉ3çyþ/_ÑyyqÓyó{Œ‡úML‡ùÖ3Ý,ºšéúõÿøó•t8äB¿h|zêzã#¼äóÅ1…ë8ÕyÐzò«Ë8/Gøzó½Cü~¢ýäßÞ2Boßo3ÇÎ~?Q?ò ßXÞõ+žæ¯¢ú™ÿ;Ä}õ»ãõy'>ŠüüÕ1ÆõÕÔïœÍŸd<]¿¹þ5çãw__=q㡺Ï×ßLm:¼æû‹çNu=Ü÷_v_ÍyQê5s^žöþÅU¯0Ôß|ÁƒÎ‡úŸ>|ÎtÔù ‹ÎñηÒ|Yçu½FùÈZOP~Úõ’/ö£üEí7‘Oõ#)¿ú•×U¾ÕÏ üÓïŽç]Ë3÷øà-žïÍGñð‹]6¯ëÛ3]¶¹Öù˜y}÷o[Ãùè矗 ^µü7ÇŽw.æ<<áïçÖ+,mºœñ‡å¿‰Åòû^èúûë=ïwuw^–=Ît>þNã¡\¸‡étÌ:¦ã-[»žm„?_IW3\á÷/—Þc|ÍW ~ËøȺ^ž:“k­' õ÷{­7Ír™ñFû~òÀiMWÑ÷›¾:Åy¹Ýû‘®^ÔtÜVýú×ë–ÿêpïg3âFÓa ïwÇëóN|dùõ½C‡¬úú¼/M7ÌÇîÆCÖõëíž1ùúb^ÑòŸµþzð¦‹ö—_{Ëtõµï?=²˜ç_ýI³ïêyíý«ß8Õ}õ7té¢þçî4u>è¢óc|ÒùFÍWëü¹^áù¨µžFùIZ/ùŠÚOPþ*í·Q>£úQ)¿•úU)ßQý ÊT¿«^wY¾á£ÞÑ¿OXx¶ñÆo~óÂB¦Ë‡»˜®g<ä1~? Ómâ|\ò¹ñúþÏò_¾Êõb#LWGnåú“µL×/Oµü‡÷²|—g˜N‹ÚÐt£þ¥ýû¿IýÍ›p>Ôÿê™K¼^çƒ.:?ÆG/ó…A:]¯Íë!?¬—|i?üi¿ ùT?²ò›Ô¯Zù®ÕÏJù§ßÿ¿êÄGúæhÓé®óœ‡·öuV\Üy™wCÓa¹{œæöú]·5]}øšç—ïüþ°Ì9¦ãØ1¦óâë˜n®ìçº[±ü×ÇÍj: ?Áõf¯{þ?œ×õÛ·˜n>¾Áïïëùk£5M7Oœä|{ž?_IW«ßá÷Ư7ÙøH̦w­ëU70>’Öa|­7Üñ‰ñ´Ÿf½œí·¾ñ=ËR?Â'øýCýªû®é¼¨Ÿqñ9\«ß!ø÷£žwkùMßÃœÕ7¯¾o:jþê-Œ‡F×/×ßnºh}áÆ9<ÿZ0ÐyÑþê½Ç»Öþó©?š]¼?ùþå-ïa}ï_³Ô΋ú÷篢þ§uN4?ë|ÐEçÇøJçÛΧóot½¢|4Zù‰ZoQ¾ØOPþÊ ¾ßFùÌêGM~é—òè'ùW¿;>?÷|ë<Òˆ½L—ÏFÕ[™Žg.ãºÏr¦ÓÅ8ýny¯oÛÝùX!›ŽûÓéÄcM§ÆYþãKË»¿ËÞ¦«}^±üçw=úÓñ°¯,ïù—Ù\÷zÂùXðZ¿Lw“épÃê¦ãv—9wŽôç+éøÂý~ÿÐø2çã¡Ö|õ¤…\ëzõ:»¡›Ö³×ÍÆGÒzó4³šÎÚOºi¸ó¢ýÆÓf1ݨùð[=ÿôë£L'ú95š®>W¿{õ2 Q~\à`ã!|ìõeÈ›®ðù›Gã!éúy»k­¯\öé0­¯¿y­¿å¿Öþò Wšn´ÿúÓ÷Mgõ§œ7ßæòþ•‰ë8êoþc'ÓEýÏ·ígºÒù ³ÎñáW?߬ù¢Î?s=å#j=µòÃzÛ|i?•ò—µß¬|6êG ¿êWP¾³ú•ÿJýîx=؉fÉÍœ‡EGõF=M‡ÏV2ñûE˜æYËé÷±å½™ö çcÈ-žÿÃætýú`ÓùÎÿZþˉ ™.s1n~Âò_ݳºé<~°ë1Óšnæ˜ÞõÙï:}¯ôûÇr9³®f:¼?Áõgûó•tô¸ñ–÷ññ?QóÅ1«ºÖõÒÍCýùJë ÓC'>ðˇµê¯˜Îš?ü½ºó¡ë§?G™ÎZ_>ï[×ZÜz#Ëd_ŸiºhÿaËgM'õ' úÓt£þ…£–t>Ôß8y=çCý¯–ØÊ}:ëü*Ï:ßr¤ÏÇù—ºžòQ¶ðõ„ស õVÊû©”¿†ý*ŸµúÑ(¿å/ïW$ßêg­ügõ»ãóóÎ|üwEÓMÿÑÎÃÐn¦Ë¦½—q¿Y¾Ó!¯8ïû÷©ò.Cœ‡GF™_¿¨é¼ÂŽ¦Ãš/:+ÍâõÏûçëá‡{,ÿ©_óë‰þ}«ðÄB>~©¿<ÿŸüè|¤Ñ¦ëmÞ1ëeºù÷ ÎÇb£ýùJºþ{¢ß?4¾™0½ó¢ùÂàÍŒJ×ËÝFYëÉ×}é÷ ­·ºqGÓ‘ýœôŠß/´ßj#}ŸiWïG¼a6çEýjºN²üW›y?ó©×›.êwÇón'>Šü4nó úøÀó¦“æO¬dù¯uýxÙÎë;åCÓIëϬjyc}©·¾òý§qw™_ÓŸu?ññw{ÿª…gµügõ7ßÑÝùPÿÓÅ=LW:tÖù5ßp¾š¯=®G>´ž¤üÔZo›/í§Rþ’ö›•ÏJýˆÊo­~%廢ŸÊ­~w¼ßÞ‰¼³¿?F\n<„[‚óríÚ®?øÐò]½ãßw/‡Þëù¿í$ã!Î|²çÿŒ•L×'od:>\,ïáÝߌ‡øŸË‡uôyÇ·þ¼¦lg~™ªÏÛ×ýÉòŸ×›ÝÆ7.2]Žr^Òk=LÇ_>u>vºÜø@×£&;C||8}>ÓEóå^»ák¿^9Ãßﯾóõ4}f3^j­·ü~¬ñQk?õÔ?,ÿYû­ª LGõ#l´®éZý +7ÿmù×y?›mýýר~w¼>w~ô¼›å‡aû•êëÝŸ45XÊ¿ïuý°ý‰ÆC£õ¥a¯˜Žøúó†‹YÞ‹öWŽÝ×t¡ýÏéÏ[UoïOìꟷ×ê_|ì{ŸÕßê,票ÿy¦ýþ¡óAgãk/óqþ\/)õ(?Yë%_ì§"Ú/ù,Ûy?ÊûžßÒÝûUnö|Gõ3‘õ»ãóóN|”ïüþP?|•ñ?øÔóÞeCÓiîçL7}>±ü‡.W{þ§=×ùè°û­ëþ[«xý&ß{¾ÏüÜó¿¾þÞð”Ëœ—sõþï?›™Î laã«þSýþ0j)¯ÿì<ÓiŒóÖZÕt8µ‹ù霫üù +½rñû‡Æ×».e:k¾Ž0> +×ûõã!±ž/V46ðõ6ýã£Ñ~:æ3]Øïßÿ5’úQÞ=ÐtQ¿Ò†«šÎôs¿¿4êwÇçµøHòó†µß/Tßüý°éðžÏ_ß·ç_×Ïî|h}éÀÇM­?=8»ç[û‹úßÖÚ>\ïÿª?õg÷ØøFýK¼íõêo3Ðy)êuüßæW:tÖù1>ê|kÍ×èü£®W”ÖÓ(?•ÖÈ—ö•¿šýÏ'ý ¿QýªÈ·úÙ(ÿúÝñ~Ig>Î*–çüÃ5ÆC3Ï‹žÿ½ú8/›øçÕÿþiy¦ç—1ÎÇ»x}³•é¼Ê¿\?7­ûk½eùO¿>nyŽÏ1ݬpŽóÐÍ¿o6¬M‡â<|³žç‘³L—Güó“tÅʦ›¹vÿ‰küù +ýÔç~ÿÈ>¾Ya5çEóÅIþ}‰Ž~X}ü±?_i=ñœ~¦­·nžtØÏ“[»Ö~û_xþÕf˜^R«_åͽõ³þl}ÓáGïwÇýÜtÅûWòãl{8oy}nî35ÞJßçÕõÓ ‡¤õŽ&8/Z\íO×Ú_šq]Ï¿ö_¿v„kõ'=|•é°¢ú7×c¦³ú[Eÿü¤¨ÿ雽^çƒÎ:¿ ñç«ù¢Î¿ãÿÏVO>¢ÖÉÖK¾ØOTþØo¹@ùT?*å—~%廡ŸÊ?ý®ù¿£ØÁ‰÷é§-ÏÕr×¥Ï=®ÿÛÏt:Æó^ýê÷‡%r}ëõžÿO7v=n€éú4½¶›Ïtþôã¡ÿ†å±™7™Ï^c:÷ìaº>PŸ¿¥÷,ÿqó<ÿÛžæ¼|²é0ÍJî_ÑÛçûc¬?_I§=pÿ÷&¦kÍW¹ÂîI×K“ÿ1¢ÖS­zˆk­·úá ã¡Ò~b£M‡[}¿åþœõ£îú¼çqïW<ìBÓQýŒ7]«ß¯Ï;ñ_&ïjçS«>l<ÞtÒüñƒ-ïá¿~Ü~WçCë‹ýÇš®µþpû®µ¿°õ²žwí?¬±‡éZýi.òûI­þå{o2¿¨¿ÍBÙµúŸ÷yÞt¥óA7œãu¾í|:ÿ¤ë‘²º¯§(?¥Ÿ¯·Í—ö•¿Jû Ê'ý ¿ô++ße#ïg^ÊóŸÕïŽç]ËsËGö=oòûÅñú¾íB;˜®oò×ñÿ¾b˜°‡Õ—iîrzøóT¹ÏßÏ +ïýbyo,íþ¨ûLç¿ô|ïáïç¦A÷™®û.íã/>×ó~Éë–ÿêêCL§SO2fÝÕõ L—å¶öñ=oòç«å¥þÓï_¿´ƒé¨ùÊ »Œšëmº°éFë ¯žk|­·l:—éZû‰W\í¼ÜïûÍ—lâzZïGuëï–÷¤~åõ}à…½Ÿ!]g~V¿;^Ÿwâ?]½“ß/¨ÿäÓQóç#üûŠáR]ÿ¯¾žÖ×ÇßϪ6óõçeß2?jñ¢y-Ïa3ßÝÇó=Øû“ÿ}¸é¬þ•=/0]èïO×»Vÿ«Éwšnt>­æü4>ë|™/éü]¯"ZO­ü´ëU¾Úý(Aû%Ÿ~(¿ ýR¾ƒúYQþÕïŽÏÏ;ñQ ¸Èó~á8ã!Ý¡ßO8z€éðî¿ÍÏ¿ÍbºÚ´éjÿ<¤>Nï¿=y´ñÐñ{–÷´Çš¦Ã¦7š®—úÇò\ÝÏt™öÓaЦ«GÆzþo›ä<ü~šëûŽ7V=ÂÇ?¿œéæžÁ¦›ÆùóúÜL3>_³Ÿó¢ùš^ÏQ×+V7¦óõ”!·Iëm.]Ít£ýT3ûû¿QûÍC7>jõ£ôYÞtø]ýºJ¿ÿpŒ÷³lõ†óp‘÷»ãÿWøhýƒú;ª§56÷ùã ?™.º~¹Á?©µ¾°ÎéÆCÑúÓ5O›®†úþš·ƒå¹ºÛ÷ÿìáyWJ`:\«þÍpŒûô÷Ås\«ÿi‹KMW:tÃùi|â|5_¥óϺ^R>*­‡ü$­·Í—öCþÊھߠ|fõƒüVêW­|·ýTþƒúÝŒ݉ø㱦㳷[þóÇšN“kÓÍýÝ4¯ó1yUÓõ­ÏûýáÉéMW/û÷ßã™þù_óÑæ§.±ü‡üûðeêN¦ãÕy¾‡Ïåþçþ{(ñÉ'-ÿyû«œ¯†9/;åz•eMÇOòúæv¾’ÎKÏå÷¯†e|ÍW‡Œ‡J× Ý·w^´ž¼àKÆC¥õÖ_0]´ŸjÈ–ÿ¨ý6ý¯4Ô滺V¿ÒêËšÎêg^`÷ÕïŽ×çøÀÏ«okùoTŸ–»ÊtÖüÍè/]ëúÍö½ýþ õ••ýûïIë‹Üã¼haq}ÿ[ûÏ{.bùÎêOXÀ¥Vÿâ­µùaõ÷棜õ??t¢éFçÓjÎOãko¥ù²Î¿Ìï×#¬§Q~J¥õ*_ì§Vþ²ö[)ŸIý ¿Iýj”ïZý Ê£~wüBžå™ç«xîÞ¦›¿Ç{þ»‰‡ÞƒMÇ ýû!啹ì÷‹4Í›ÎÇœßyÞßeº”GL—v3]]sºéæRÞŠ«oázýß,ßq´Xº¾fºz÷¿~¸å^ç¡:Òt:î:ÓᢥM—ýû+Íãt~¸›ß?4>õ9ÕøÈš/NúÑïóøõâ…›ÎZOzð[ã!k½aýä¼üÛ÷>ü—éZûM=ü~’éÇ þý”ðª÷«L/êgúh]㣨ßA¿§ÊëóF~ìÒÏò^ðúæùKM'Í_­ô?çCׯÿZÆùÐúò¸ÖúèëLgí¯ìÏ[Iû¯ÁòèÏÔLgõ¯ÞasÓáõ÷ÔÝLõ¿ZÕ¿¿Ré|Ð ç§ñQç5_­óºùˆZù‰Z/ùb?µò×h¿•òé‡òÔ¯ |'õ³Rþéw­ß?…zÙÍ—Þ÷Xþë~kûý`äÁ¦;>ç4]oàß7‰¿Nk:ïü±ßv}×ùø|¬ë5n5]}{é¼í0÷·_Ûtsâ:¦Ã»s˜.ã·¼çuõú䇻‡é^r>v8Ät¸ZŸ_ÿÚÝýÝ'˜ßÌqó wZÒ]d|$ÍÆÌâ÷]/M3ÂyÑzê=ç6]k½ùü±ÆCÔ~B¿>¦ûóWË{ØÅû¼ßtC¿že:ªŸõ퇺V¿;^Ÿ{=ï_É/Ïoaù¯UŸišùSöï›4º~uã–ÿJëkæ`:\àëÏs^hºÑþò­OºfÿÝ¿3ÕŸø¸^Ÿ,¤þý±Šó±³ú»—_ÔÿúÚ­Ìot>èÄùi|à|™ï.?ÿJ×ËäCë!?Ö›”/öS+Iû­”Ï ~då—~Eå»í§òŸÕïŽÏÏGzleÏÿ÷ÍI‹»ÿ푦Óõ³º·ªé8Bß¿½õ[çáÚ§-ïõOLWçŽq=ôDÓñŸA¦Ë¬[›O¯d:ÓÝë'úïë6ƒ¦1g¾Íò÷øÌò_Ÿq€óðÔd¿챤ûŸOr>6½ßxˆÒå믾ºÖx¨5_ä¿›u½æð댇¤õÄ.=—Ù|½é£çœí'ܘéFû­§ú÷+õ#Üõ™å½R¿òŸ¹V?ãqטnÔïŽ×çøÀO£6óûƒêÃ\g›fþ°Ã‹¦“®úÏiù®´¾4ËV¦3ëq’éÄþ~¼ÓtÑþ›ÓÞ1{âè¿L×ê_sÍ–ÿêõw­åüþ¡þçù{º¯óA'Îñ:_æK:®W)Ië©•Ÿ õ’¯Ä~ÈŸöK>ËöÞò[ú«_Êw™Óû•ú{õêÌÇîó™ÎW>dù÷Ìäºß±¦«·~°<§ýó߸Ц«iþò|Oï~—'<ßëyêÏóL—[ýõFzÒ(ÍYÙøf~¿ŸTS>öüŸßÍÆ7Õõ¦«{üûŽõCû™_}c<¤G7]†|ê|ÿñ€.§­î÷Æ?|—ñÁ|©×ê~?Ñõ:î×ÆCf=×ùë‘Fë«ëy‹ýtã|h¿õóÛ™®ÕÜoA÷կꢯ-ÿEý }^w®ò~7'v⣒_í½±ß/T_ÿó¢ùëOýóô¤ë翦ñ|/åë«ÿ^ÇtÒúã´‡™ŽÚ_½¶~ïæCßüÜï'Yý©bã³ú—·ðï;V§{Ë?×#•ÖC~¢Ö›•/ö“”¿¨ý’φ~(¿Qý*w{¾ƒúY+ÿAýnFwëÄGó³ÿ=JõÚ#~øâÏû-ÉtžÕŸŸÂ66]ߒͯwžÙtZÃÿþ¯™ýUËw½ÎóËÉW›N»ûçãÕpÿ~RÙ¹«ùaÂ6æçÞ²¼×¬êõkø÷ÃœÎKýí^槹g6?,]¹ž¦‹×ßõˆß/¤;~ÿµƗóõ}EÍC_¿ŸèzaÛwŒJë)›i:j½aÄ|~?9Å÷Ó1Ÿå?k¿ñ¦M'úñ™?UêWZ¡òñêgéêT«ß¯Ï;ñæÑßk­‡Fõq‡á~¿Ðüå؇L×\ÿÆŸM‡ |}ñûÖž¦«>¾¿œüûZQûÏ[Ýa~RÒ¦/úø ¼å[ç¥Rë¯6¿¨ÿõ_ûx:éüß‘ÿÿ›æãü¹ùh×£ü°^ò´òW±_ò©~߬~UÊwÛOå¿Q¿;^wtæãüÿ93?îy_Ôïõ̧;ëû÷mÓw}]¯{³oÆÍçãOa:wûŸçwä>žÿ™ýó€0ëêî¯9ÂüØLgºÞn éºÛ‹Ö¯êã>îo=ÊtÜÃýî»™k,a:¹¨?o!Óù‹ÇŒ‡J:Ü»…ß?4>îûªñP4_5ioÓ‘ë=ò³å?i=ùó Mg­7¿³¶ó¢ýä?¿²¼í·:ýÏ¿úOæZý +ûý%©ŸùýµÝW¿;^Ÿ›æõ ~üy]Ï;õ?í¾ðýUO5¿ÖþëÛƘŽêO³ð}î«áÒÜWË3ï™.ê>ìÓÎt~Yãk/óqþíõ”¨õŸ õå«Ñ~’ò´ßZù¬Ô¨üÒ¯D¾ÕϤüÓïŽÏÏ=¿zý‘—ÖõOYÞËöþ{;qð9¦Ãáã̯öÜÉù˜ä[º,aºyþ(óËRßY^›Ï¶1]ŸçÏ[ÍýK¹þþrÏóg?[¾Ë×Çš½ü÷_ª9ö2] <×ü&ûûÃõ.;™N»¯ãã¿YÄëîíó-þ”ñP¤Ã6ýýþ¡ñÍjYó•ÑÃLs½z宦Ã7¾žæì ΋֛V®]k?yÿùM‡¥}¿ÕÀ7=ßÓx?¢7˜ŽôkÀ)¦kõ³¹ù`Ó•úÝñúÜëuøáѵ,ïIõùÒ#LWš?_}“óÁõÿ~Ïù`}oÏayͬÿ0ÞÊìoö}=Ïìîÿ˜®Æxòw׫q8ª¿õµO˜_Ôÿðñó^¯óAs~Œç|™óo¯§|­‡ü$Ö«|%í')Aû­•Ï@?óüÒ¯¬|7êg£ü—ìý.'Z^Ûÿ_=q»éxÔ³–÷êô±î?y¡çÿÚ‹L7Ïù¿ç’öô¿÷ ;¯ìþ|µïLÇ ÖóñóM¶üÆýçsÜžÿŸ[¾ãÙç›núÞo:¬9Ôt9Nß'é¶éúìíÜ?yÓ©ÿ¦ÓýLç]žu¤«Ow÷û‡Æ—õ}Í× :ÇyÐõš+V2ÍzÒ*¯[þ+­7žôÓYûɯmà|h¿acÿ{»¨~äû&[Þ³ú•¿›à<¨Ÿihc:©ß¯Ï;ñÑúg­îyW}Yû ך?®Ö˜®tý|ãËîk}eÒ?¦k­?~±œå·Ñþrÿm<ÿÚsä¡žwõ§<=Âó>“÷¯žr…é¨þænññê½óxÓÎÍù1>ïç5矹žò‘´òÃzÉWÅ~”¿Ì~•Oú‘”ßJý +ÊwV?³òŸÔïØK¿7¥ÿ_•=GY~óM-ßõƒg»^bŒç}òñ¦«50¾ñ÷£â8½Þ쵕çý9Í//oº\æ¿ß›ç÷Ï7š~?IǼcùn–óïoUƒüýª¼÷9ž÷‘'šðÿŸÇÜ×y¸á`óÃ}ÝLW« öñçM4ÐÕðA¦oOcºÖ|©—¿ŸU¸Þl[Yë©_ñ¿§ÊZoxífçárßO0µß°¸¿ßU«©ÿ î«_qÄÏÿ’êçF¯š¦ß¯Ï;ñQ˯vêeùnëßhºÑüÍ3£LWº~êï¯×³Ö—ýÖ}Ö¿Ÿ~oVû‹cü~f÷ýÇÉþý­Fý WayOê_:Çï/µúwé|¨ÿù¹KMW:ŸFºÖùµãu¾Ìuþíõ”Jë!?•ÖK¾‚öCþØ/ù¤•òK¿ÈwP?³òO¿;>?÷<‹ð›òÿÁ‹–ïüÍ‘æ7©ñ¼Ï4Ðt¾Ö¿:¥mM§.þýÞæ&}·\Ôùùjó«%~³üÖOþèy_Ì?O,êû#O?èùî?›ÏºÎtsÓPÿüHÓñÇ>ÎäÓL§E4]M^ÿÔ‹–t\à0çEã›q]MGæ þ÷·\/ïߟ¨´žjÈüÆK­õæ¥_ò¼k?͸‘®µßðÏž¦õ£þz5ÓEýj*ÿ÷G²úYÍ!~ÔïŽ×çøˆòsµªå;«>ßË4óW»ûïWsýúo}¿WëkîþÐÆ­?¿7ƒå·ÖþRñÏ+í¿¬¹‰ûêOuÔn¦³ú—{ì¾ú›{cº¨ÿaýᦛEü|еÎñœo£ùŠÎŸë…Ç<™õ(?¬7)_ì‡ü±_òé‡òK¿å›~–_=ÿô»ãósË/ÏWáBÿ÷Ò¼¯Z¾C÷Ý<ÿïû÷yëuú™Žsù惡×6wêoã›w'ÿ{ܸ±ß/êýûGåHÿ¶¼ù¥å¹ž%[¾ëý^v=úRÓÍÝÎKõy`÷[ÌËúïí6ß_e:œ4¿O[1ÿzÅòŽ·cº?| ÓAó…I/Xþ¹^ür¸é¤õ„×0Þòõ¦cü~’´ŸfÁ‡,ÿµö[Þ=ËyP?ªÝW¿ªû¶0ÔÏð¶ÿ{ úÝñývóÛó_¹¢ÿÿ_õõâþ}Þ¨ùÓ7úýÑ÷üúÕMãœ'­/ÝôŠé†õïìßת´¿²ô¼žwöÙʦ+õ'né¼Tê_~g¯þÆÙkÓEýwôzºÖù1>é|™/éü¹^›­'¥üh½m¾´òÇ~ÉgP?È/ý*Kz¾é'ùêwÇçç–gΣZiKÓe‹É–÷¸ËFž÷uou^YÍýãÿã<\³¤×ó×#çg:í³®ùyô÷ž÷•1–xÍõÈ<ÏÛ7]ºøóJ¸ëÏûþ÷»ñAîÿ¸ó±ûú¦«ï7>™×t|Çß˽'ûýA:ö9ŵÆ×Ûõt>Nðùòè]¯p™iÖSØÙtÖzãÄ…\³ŸS?ñ¼³ßî3]©eÉ‹=ï'x¿Ò6Ç™®ÕÏ2ö@÷·T¿ rÍó.þ=ËY¾©oßÞtè®ùO9ÖtÑõK=Ò°¾+7¿ÖúãËyýƒ¾¿xp°<'í?üíÏ_aŒ÷§®üïwý;e]¯þvü»I·úŸ»ûûcÎ]ëüÏùÍÇùs½¬|°òÃz‹òÅ~å¯Ö~“òI?‚òÔ/òè§òÔïŽÏÏ=ß:êéUMÇáoyžÏ^Ît5æ.ç¡ù—éúós]÷rb—ƒLçÓõ|²•×ûç{‚ßOª—÷<÷Çüê²ë\_õ§å½™x²ézæ/L‡¯÷4_Çù8-×ë9?aËyL—Á“ÌϾeùGלm:k|^r#ך¯ô»ó¡ë5ÏÞc:j=y£]k½Ÿ§˜wû~Ò·s˜n´ß|©óB?š‡Ÿ°¼'õ«Lg:ªŸùð+M×ô{ôèN|à7iiÏó§^Ÿö5™þÃM]¿ùûBÓÖ/˜`ºãó +_ÿV~?)Ú_s×W>ŸößÔÓZÞ3ýùy>Ï¿úW-ßÝùPãcÎO8Èû.íi~¥óAGã+/óqþI×#¬‡ü°Þ¤|í‡ü±ßFùlû¡ü&õ+)ßô“ü'õ»ãósË;÷¸·¿^ÈÞµü–¬ïÓþêß7‰¯úóRØéRó›'üýÙ´ÓѦóËy~àùïãÏÕ:øøáwyž§÷ïo¥F™nÖíj~œâßϽüïKÊt;»¿²ÿ{ ñ‰Þ¦ã¾zÞ¹mnÓéÇ)ÆG¹æ]Ë?º6Ê4ã«Ÿ·3Ýh¾º—ÿ”ëå5_±üd­§ £=O3øzóáMGí'í¾¦×~óP˜~¤]õýGõ«>ñ}Ï¿úÙ¬÷²iú'NìÄ~ÜjIËo[?“ߤÿæÁžo®Óé¦Y_üÏXÓEëÏOdÏþ~÷ïoí?>>ÕëÕŸf¢ÿ}ITÿâ˳:êo¾ÜŸÏµÞÿzÖnîë|Ðœã9_æãü¹ù`=ò´ÞJùj÷£ü±_òY«m~éùV?+åŸ~w|~Þ™?ô{!_|àùþéË_Þ1›.Óíy|ìjÏûŽÅý[N5öÏ÷òiþþV¾âóëG·5?®ì¯¿Ó#þ~WXq„ùámÏ_ùç ÓÕ j¾mL§Ógóú_W1ϘÎt˜g.Óñ$?¹¼õó ælL3¾~foÓÌW…¥}¼®nœêû¸ÿîHÏó1[ûüGgº¶žéÔmŸÿôU\÷ô÷«bénºZÑÿ^0ÞæßOÃæðëϾùe®ìüŠtºÁÿžñyÌáæך/LZÇtÐõâ3ûùk=q³·-¿Që øï1fí§î}–ùáBßoêyë.Þp^Ï¿úoÝÐt£~Æ×õý/õ»ãõ¹×ëy·Æ/‹Xþ¨}ýó+æ//íàyåúÿb:±¾ƒý~Rkýñ>ÿ÷Ôkí/Ÿv§ÏÏþÏxÌ4ý)G¿dº¨Íbï˜nÔßf;ÿ~}˜Ûû¾ÿÄ|Îu~Œot¾Ióqþ\¯V>’ÖS”ÖK¾ØOVþ‚öÛ(Ÿ~(¿ô‹|ÓÏHþÕïŽÏÏ=:´Êóž·¦XÞòO™®çžäù<ðaÓÍeÜæÏKÕNW¸¾}¬ÏwÕé¦ÃV»~áHÓõYþú"÷/l~ž×ßÿªzùóT¹c3¿ÅæWk9?U½´uuŸÿÝÙL§1½L—>S,ßt³Á]¦³ÆWŸd:j¾<ÚŸ·ÂºÞiÝÍ/¬çs}R´Þðï×=¿ì§™àù×~Ó\þ<éÇr§8êW³É‘¦ý¼ú ÓEýîx¿Ä4Ï»•üpK7Ï#õ_÷ô¼jþ¸ßVžG]?ß´éZë+µ¥bý=Ï6?jÕ$ç%iÿÕ—þþW¡?ÛÜïãÕ¿ü”óC«Ÿ5?lîý¯Nt­ó‰ÒQçÇøZçË|œÐõ²ò´ò´Þ6_ÚOVþØoV>éG¥üÒ¯FùNêg­üÓïŽç]Ëç‘žõßGg~îùy«ùñÐWMç+®7]Íô°ë™®0]ßr“çó·óÝ¿e”éæjç!îàïß„µ0?}5ÄüjúÚt¿¿Ï××?ÿËoïa:Ök˜Fîèã/òïëÆ߶1â¬^¿L?ÓåÄÏ=ÿÒÍþ}Þvü˜Ï|iÐ`Ó\¯ùi¯×zÂÙ ›f½¿Wiùe?q¶÷]k¿éë'M'õ£yb¼ûêWx÷:×êg8ør×êwÇçç¦9üXO›Ö«|±Ÿ¢ü±ß¬|&õƒüÒ¯ |7ê'ùoÔïŽÏÏ=º4ûêó‡G¾ò|>u‘û“üý¬ú¥sM磞6?>Ítîñ|nìïëõ¿j~zÛyIŸímºº~„ù©ßö^¿Í‰¦ëAšÎÓ9?a˜¿Þ(_l~õŒ¾oµ¨¿¾ cg¶ña óËÝ_yþ¥›CŸ2]4¾Ì}µkÍ{`šëåýv3Ýh=eåuMGÖ;gešýÄ£g4]k¿õÄï-ßYý¨÷úŸkõ+9Ùt¥~–5_t_ýîøÿ•iøÀqÏ›êKO?‹ùãYkšÏõë¶0ÍúòæL7¬)ñ¢ý•]‡š_´ÿúŽ“|>õ'þáüпj¾‘ægõ·úÐ_ß„{Ôÿ¾£ÍoÏGšókÇë|ƒæãü¹^£|D­‡üd­7’/ö£ü5Ú/ùŒôCù¥_Qù¦ŸIù§ßŸŸ{¾àã/ÿ>GøéÏïïþú ,_<Ó ³ññ×\/˜é²ãc®Ïlº~ÜŸ¿ÊÖ{˜ÎõæW—ø÷§ò^þ<Fmb~˜z¡×_Ýt³òÙšo¯ßø4¯ÿsÓõ&'›N3Ïäãcòñ_}ãù–Î3¾äùÕøøñ¦3ó… }¼®^jšõä—w÷ñZoÜgS×ÚOüxUÓIû­o^Ì4ý¨~ŸÛtÛ¯Yf2Vð~æéüû.•úÝÁ…û:ü0ë\ž_ÕW¯/fšù󢫘æúÕÍë™n×·®?±þxÕÎ泿ØìcºÝÿ<™®ÔŸúå#5Ÿ÷/>tŒ×«¿Íƒ'xýTïýÈpÓœºÒù1¾œãçË|!ùùs½6¬Gùa½ä‹ýå/i¿Eù¤Eù¥_Iùêg£ü—Y¼ßŸŸ[¾øÿU¾d é´üž·•÷5Ϙây\m/×ýÞvÿÁ]MW·¼àú ¿¤õýø±[š>õ÷‡ó¦~HÝî´ñõûÞt¦?Ÿ¥Ñþú;ír­ùÍu‹Y}sù•¦«UõyÇ—™‡Ì`~œ4Úu÷<Òù*}¢ñÍ=Ù|æ+o4ÍõâÆ#]k=ÍQ~a½áî›Ï~ªmøxí7žÑ×tÛ‹64]Ô¯úšµLÓÏæ¥Þ^¯~w¼>7Íy´þë³YÞ¨ÃüõHÑüqüRæsý²C׬oU}?žõwó÷‡ÛýMÙÚdzÿ!þ|Ööç†Ýͧõ¾{›.êo5j?ÓAýÏ=¹Öù 9¿ ñYçË|íùëzm>´ž6?Zo"_ÚO!ÚoQ>éGR~+õ«(ßô³Í?ý4ÈóËÿ¯zøóÙëgÏ㾞ï4ÅŸ·ªýýý¤ú«ôÝØóÞ±ñeqÿ|»yç¯ÿÓ_?ăŸ7Ôï¾ú„é¼ôrVŸ—yÄÇßU™®O~ÀtzÐïé'~ ûùûUé<¿?¥W¦óõ¸ËƇÝ~ö|I—5üýÆ—3ü~Â|Íè‡m<׫Çßjºh=i+MW¬wÆóM³Ÿê!ÿ|>k¿qÐ1>ŸúѬ¢÷ËÔ¯¼ÖæÓÏt¹¿þ¡ß¯Ï͇üª™ÙòÖÖwóç­¬ù›Mõþ–®ŸÿénãY_Ý}%¯×úóÈÞ¦Ù_YqÓì?¾MÓŸæ„MM‡êß,þüÖö÷0¿?µý¿¾¯ÏÏùHWœŸÆ·ç«ù*?×#•ÖC~Xo¥|±òµ_òÙÐå—~Uä›~*ÿm¿':œGy¾§çýâß,oõ%=<¯›øý$Ñ륧š_Þ[Ñü´ã§žÏƒ”÷O?4·_Êýôyã5žÿ|ö›æÇCýûéñÉ×|üÄùüúã^6]¿2§ë­ýû’áR½Þ¸ÛßO kLk~3e¢#³|¡Ë‹zÖø¸[1?j¾zÐk®u½fñg]k=ñç‡õ¦w›Ÿ´ŸjYç)k¿Õ&×»¯~¤çÓEýª^¾Üt­~ÆýǘŽêwÇó®iÎ?ÿ{Ëõ̓~?aþê­®îsý›t­õÅõ¼²þÙüóFö\Æ|öŸ×^ÁÇ«?¹ÿʦé_¾sUÓm·ò÷ÓèÝ­—ùœO«9?ç|™/ëüÛë)¬§(?¬·Í—ö”?öÛæSý ¿ô‹|ÓOòO¿;>?·|qe _¼yîOÏëó z>¯/“ôÿó ýþßü|³óîñïC•¾õ|ßÔÕýc¾v½žWoæ÷£æÞÙÍoöùÂý)³˜®&fºú|F×7ˆ¿‰~¿Hoëyï².æÇ#]‡gÿô¼¡÷÷û 㛕¾5¿Ò|±×®u½|þǦYOµ‡ÞÅzã­o›ŸµŸpÑdÓì·ZâU÷Õ8Pÿ¿U¿šý_0?ªŸUïI¦Û~OœhšóÀ¯W›ÖòF}ÞÃyiç?Èï/\?îèü°¾j¶9=ßZ¯þ”åðë«eç/Ðߥüyþ7g»N:tàü4žóe¾Zçß^Où`=µòÃzkå‹ý?öK>éGM~Õ¯ü¼ç›~’ÿ¶ß£Σ㿞·^½ß C ;ÞWùbƒÿäs"äwÓ  è… UVIndexiÌt  Û… x4ÝC…iºá¶mÛ¶mÛ¶mÛ¶mÛ¶m[3m»ûÖS÷DT¼ùå>ÿê 0À  ˜ÍœÍT(w–:ã°nÈ8¼vcÆá²›2˜Ýœqø ì–ŒÃg·f>$»-ãð¡Ùí‡ËîÈ8|xvgÆá#²»2™Ýqø¨ìžŒÃGg÷f>&»/ãð±Ùý‡ËÈ8¬ƒ³Ê'ä>”qøÄìáŒÃ'ed>9{4ãð)Ùc‡OÍÏ8¼IvZƹ§gOfO”ÏÈ}ªŸ™=]‡ÏÊž©ÃggÏÖás²çêð¹Ùóuø¼ì…:|~öb¾ {)ãð…Ùˇ/Ê^É8|qöjÆáK²×2_š½žqø²ìŒÃ—gofÖÁ[‡uðvÆa¼“qXïfÖÁ{‡uð~Æa|qXf”uðQÆá³3ß”}’qøæìӌ÷dŸe¾5û<ãðmÙ‡uðŸŒÃwdÿÍ8|göeÆỲ¯2ß}qøžì›ŒÃ÷fßf¾/û.ãðýÙ÷‡È~È8ü`öcÆᇲŸ2?œýœqø‘ì—ŒÃf¿f~,û-ãðãÙï‡OËžÈ8÷ÉìÏìòS¹Õ᧳¿ëð3Ù?uøÙìß:ü\棆ÃÚ0o¿ æð‹ÙÀa¿” æðËÙ a¿’ æð«Ùàa¿– æðëÙa¿‘ æð›ÙÐaë`˜0‡u0l˜Ã:.Ìa æ°FsøýlÄ0‡?ÈF +søÃlä0‡u0J˜Ã:5ÌaŒæ°Fsø³lŒ0‡?ÏÆ sXc…9¬ƒ±ÃÖÁ8aë`Ü0‡u0^˜Ã:?ÌaLæ°& sX…9¬ƒ‰ÃÖÁ$aë`Ò0‡u0Y˜Ã:˜<ÌaLæ°¦ sXS…9¬ƒ©ÃÜÿ7¡ÎÕÆ´ái2¬éÂÖÆôakc†0‡u0c˜ÃäΔqX3gÖÁ,‡u0kÆaÌ–qX³gÖÁ‡ÏæÌ8¬ƒ¹2ë`îŒÃ:˜'ã°æÍ8¬ƒù2ë`þŒÃ:X ã°Ì8¬ƒ…2ë`áŒÃ:X$ã°Í8¬ƒÅ2ë`ñŒÃ:X"ã°–Ì8¬ƒ¥2ë`éŒÃ:X&ã°–Í8¬ƒå2ë`ùŒÃ:X!ã°VÌ8&»¯kãþ:¬ê°¬ÃëeZà\m<œ=TÖÆ#uXÖam/{¡kãÅ:¬—êð…ÙËuX¯Ôam¼Z‡µñZÖÆëuXoÔam¼Y‡µñVÖÆÛuXïÔam¼[‡µñ^ÖÆûuXÔam|X‡µñQÖÆÇuXŸÔam|Z‡µñYÖÆçuX_Ôamü§kã¿uX_Öam|U‡µñuÖÆ7uXßÖáû²ïê°6¾¯ÃÚø¡ëàÇ:|B¦ÎÕÆÏÙOemüR‡µñkÖÆouX¿×amüQ‡µñgÖÆ_uX×amüS‡µñoÖÆ ýÏam ˜7‡_È +sX‡9¬AÂ~94Ìam æ°6sXC„9¬!ÃÖÆPakcè0‡µ1L˜ÃÚ6Ìam æ°6†sX#„9¬ÃÖÆHakcä0‡µ1J˜ÃÚ5ÌamŒæ°6FsXc„9¬1ÃÖÆXakcì0‡µ1N˜ÃÚ7ÌamŒæ°6ÆsX„9¬ ÃÖÆDakcâ0‡µ1I˜Ã:˜4ÌýZà\mLž,ÃÚ˜"ÌamLæ°6¦ +sXS‡9¬iÂÖÆ´akcº0‡µ1}˜ÃÚ˜!ÌamÌæ°fÊ8¬ƒ™3ë`–ŒÃ:˜5ã°fË8¬ƒÙ3ë`ŽŒÃ:˜3ã°æÊ8¬ƒ¹3ë`žŒÃ:˜7ã°æË8¬ƒù3ë`ŒÃ:X0ã°Ê8¬ƒ…3ë`‘ŒÃ:X4ã°Ë8¬ƒÅ3ë`‰ŒÃ:X2ã°–Ê8¬ƒ¥3ë`™ŒÃ:X6ã°–Ë8¬ƒå3ë`…ŒÃ:X1ãðÙJ‡'ÌVÎ8;{¶kã¹:¬çë°6^¨ÃÚx±kã¥:¬—ë°6^©ÃÚxµkãµ:¬×ë°6Þ¨ÃÚx³kã­:¬·ë°6Þ©ÃÚx·kã½:¬÷ë°6>¨ÃÚø°kã£:¬ë°6>©ÃÚø´kã³:¬Ïë°6¾¨ÃÚøO¾#ûoÖÆ—uX_Õa|]‡Ê´À¹Úø6û¦¬ïê°6¾¯ÃÚø¡kãÇ:¬Ÿê°6~®ÃÚø¥kã×:¬ßê°6~¯ÃÚø£kãÏ:üTöWÖÆßuXÿÔág³ë°6økcÀ¼9¬ÂÖÆÀakc0‡µ1h˜ÃÚ,Ìam æ°6†sXC†9¬¡ÂÖÆÐakc˜0‡µ1l˜ÃÚ.Ìam æ°6FsX#†9¬‘ÂÖÆÈakc”0‡µ1j˜ÃÚ-ÌamŒæ°6ÆsXc†9¬±ÂÖÆØakcœ0‡µ1n˜ÃÚ/ÌaŒæþ¿ -p®6& OamLæ°6&sX“„9¬IÃÖÆdakcò0‡µ1E˜ÃÚ˜2ÌamLæ°6¦sXÓ„9¬iÃÖÆtakcú0‡µ1C˜ÃÚ˜1ÌaÌ”qX3gÖÁ,‡u0kÆaÌ–qX³gÖÁ‡u0gÆaÌ•qXsgÖÁ<‡u0oÆaÌ—qXógÖÁ‡u°`Æa,”qX gÖÁ"‡u°hÆa,–qX‹gÖÁ‡u°dÆa,•qXKgÖÁ2‡u°lÆa,—qXËgÖÁ +‡u°bÆýÔ¹f+g+•'Ê]¥Oœ­Z‡'ÉV«Ã“f«×áɲ5êðäÙšuxŠl­:uXûÖaìW‡u°ÖÁuXÖaT‡µqpž ÓçjãÐì²6«ÃÚ8¼kãˆ:¬#ë°6ŽªÃÚ8ºkã˜:¬cë°6Ž«ÃÚ8¾kã„:¬ëðÙIuX'×amœR‡7ÎN­ÃÚ8­kãô:¬3ê°6άÃÚ8«kãì:¬sê°6έÃÚ8¯kãü:¬ ê°6.¬ÃÚ¸¨kãâ:¬Kê°6.­ÃÚ¸¬kãò:¬+ê°6®¬ÃÚ¸ªkãê:¬kê°6®­ÃÚ¸®kãú:¬ê°6n¬Ãd7ÕamÜ\‡µqKÖÁ­ux¥L œ«Û³ÛÊÚ¸£kãÎ:¬»ê°6î®ÃÚ¸§kãÞ:¬ûê°6î¯ÃÚx kãÁ:¬‡ê°6®Ã'eÔam5{¼kã‰:¬'ë°6žªÃÚxºkã™:¬gë°6ž«ÃÚx¾kã…:¬ë°6^ªÃÚx¹kã•:¬Wë°6^«ÃÚx½kã:¬7ë°6ÞªÃÚx»kã:¬wë°6Þ«ÃÚx¿kãƒ:¬ë°6>ªÃÚø¸ß”}R‡µñiÖÆguXŸ×áC2-p®6þ“}QÖÆë°6¾¬ÃÚøªkãë:¬oê°6¾­ÃÚø®kãû:¬ê°6~¬ÃÚø©kãç:üHöKÖƯuX¿Õádzßë°6þ¨ÃÚø³kã¯:¬¿ë°6þ©ÃÚø·kc€Aþç°6Ì›ÃÚ(Ìam æ°6 sXƒ†9¬ÁÂÖÆàakcˆ0‡µ1d˜ÃÚ*Ìam æ°6† sXÆ9¬áÂÖÆðakc„0‡µ1b˜ÃÚ)ÌamŒæ°6F sX£†9¬ÑÂÖÆèakcŒ0‡u0f˜ûÿ&´À¹Ú;uXûÖá±2-p®6öÏö+kã€:¬ë°6ªÃÚ8¸kã:¬Cë°6«ÃÚ8¼kãˆ:¬#ë°6ŽªÃÚ8º¯•S‡µqlÖÆquxÝìø:¬ê°6N¬Ãd'Õamœ\‡µqJÖÆ©uX§Õamœ^‡µqFÖÆ™uXgÕamœ]‡µqNÖƹuXçÕamœ_‡µqAÖÆ…uXÕam\\‡µqIÖÆ¥uX—Õam\^‡µqEÖÆ•uXWÕam\]‡÷Ê®©ÃÚ¸¶kãº:¬ƒëëð2™8W7f7”µqSÖÆÍuX·ÔamÜZ‡µq[ÖÆíuXwÔamÜY‡µqWÖÆÝuX÷ÔamÜ[‡Éî«ÃÚ¸¿kã:||ö`ÖÆCuX×am¬ÃûeZà\m|œ}TÖÆ'uXŸÖam|V‡µñyÖÆuXÿ©ÃÚøoÖÆ—uX_Õam|]‡µñMÖÆ·uø¾ì»:¬ïë°6~¨Ãf?ÖamüT‡µñsÖÆ/uX¿ÖamüV‡µñ{ÖÆuXÖamüU‡µñwÖÆ?uXÿÖam 0èÿÖÆ€ysX…9¬ÃÖÆ akcÐ0‡µ1X˜ÃÚ<Ìam æ°6† sXC…9¬¡ÃÖÆ0akcØ0‡µ1\˜ÃÚ>Ìá÷²ÂÖƈakc¤0‡u0r˜ûÿ&´À¹Ú5ÌamÌæ°6f sX3eÖÁ̇u0KÆaÌšqX³eÖÁì‡u0GÆaÌ™qXseÖÁ܇u0OÆaÌ›qXóeÖÁü‡u°@Æa,˜qX eÖÁ‡u°HÆa,šqÿß„8W‹g‹•u°DÖÁ’uXKÕa,]‡u°LÖÁ²uXËÕa,_‡u°BÖÁŠux‚l¥:¬ÃÚø¨kãã:¬Oê°6>­ÃÚø¬kãó:¬/ê°6þS‡ïÈþ[‡µñeÖÆWuøîìë:¬oê°6¾­ÃÚø®kãû:ü@öCÖÆuX?Õamü\‡µñKÖƯuX¿Õamü^‡µñGÖÆŸuXÕamü]‡µñOÖÆ¿uX ö?‡µ1`ÞÖÆ@akcà0‡µ1H˜ÃÚ4Ìam æ°6sXC„9¬!Ã~#*Ìam æ°6† sXÆ9¬ -p®6†—amŒæ°6F sX#…9¬‘ÃÖÆ(akcÔ0‡µ1Z˜ÃÚ=ÌamŒæ°6Æ sXc…9¬±ÃÖÆ8akcÜ0‡µ1^˜ÃÚ?ÌamLæ°6& sX…9¬‰ÃÖÆ$akcÒ0‡µ1Y˜ÃÚ˜<ÌamLæ°6¦ sXS…9¬©ÃÖÆ4akcÚ0‡µ1]˜ÃÚ˜>ÌamÌæ°6f sX3eÖÁ̇u0KÆaÌšqX³eÖÁì‡u0GÆaÌ™qXseÖÁ܇u0OÆaÌ›qXóeÖÁü÷ÿMhsu°`¶@Y Õa,\‡u°HÖÁ¢uX‹Õa,^‡u°DÖÁ’uXKÕa,]‡u°LÖÁ²uXËÕa,_‡u°BÖÁŠuX+Õa¬\‡u°JÖÁªuX«Õa¬^‡u°FÖÁšuXkÕa¬]‡u°NÖÁºuXëÕa¬_‡u°AÖÁ†uXÕal\‡u°IÖÁ¦uX›Õal^‡u°EÖÁ–uX[Õal]‡u°MÖÁ¶uXÛÕal_‡u°CÖÁŽux¸L œ«³ÊÚØ¥kc×:¬Ýê°6v¯ÃÚØ£kcÏ:¬½ê°6ö®ÃÚاkcß:¬ýê°6ö¯ÃËeÔamX‡µqP^1;¸kã:¬Cë°6«ÃÚ8¼kãˆ:¬#ë°6ŽªÃÚ8ºkã˜:¬cë°6Ž«ÃÚ8¾kã„:¬ë°6NªÃÚ8¹kã”:¬Së°6N«ÃÚ8½kãŒ:¬3ë°6ΪÃÚ8»kãœ:¬së°6ΫÃÚ8¿o—]P‡µqaÖÆEuX×á2-p®6.Í.)kã²:¬Ëë°6®¨ÃÚ¸²kãª:¬«ë°6®©ÃÚ¸¶kãº:¬ëë°6n¨ÃÚ¸±ÝT‡µqsÖÆ-uøàìÖ:¬Ûê°6n¯ÃÚ¸£kãÎ:¬»ê°6î®ÃÚ¸§kãÞ:¬ûê°6î¯ÃÚx kãÁ:¬‡ê°6®ÃÚx¤kãÑ:¬Çê°6¯ÃÚx¢kãÉ:¬§ê°6ž®ÃÚx¦kãÙ:¬çê°6ž¯ÃÚx¡kãÅ:|AöRÖÆËuX¯Ôa¼Z‡wÊ´À¹Úx={­¬7ê°6Þ¬ÃÚx«kãí:¬wê°6Þ­ÃÚx¯kãý:¬ê°6>¬ÃÚø¨kãã:|SöIÖƧuXŸÕá[³Ïë°6¾¨ÃÚøOÖÆë°6¾¬ÃÚøªkãë:¬oê°6¾­ÃÚø®kãû:ü@öCÖÆuX?Õamü\‡µñKÖƯuX¿Õamü^‡µñGÖÆŸuXÕamü]‡µñOÖÆ¿uX þ?‡µ1`ÞÖÆ@akcà0‡_Ê sXƒ†9¬ÁÂÖÁàakB œ«!ÃCdXC…9¬¡ÃÖÆ0akcØ0‡µ1\˜ÃÚ>ÌamŒæ°6F sX#…9¬‘ÃÖÆ(akcÔ0‡µ1Z˜ÃÚ=ÌamŒæ°6Æ sXc…9¬±ÃÖÆ8akcÜ0‡µ1^˜ÃÚ?ÌamLæ°6& sX…9¬‰ÃÖÆ$akcÒ0‡µ1Y˜ÃÚ˜<ÌamLæ°6¦ sXS…9¬©ÃÖÆ4akcÚ0‡µ1]˜ÃÚ˜>ÌamÌæ°6f sx€Ü™2ë`æŒÃ:˜%ã°fÍ8¬ƒÙ2ë`öŒÃ:˜#ã°æ̸ÿoB œ«ƒ¹³¹Ê:˜§ë`Þ:¬ƒùê°æ¯Ã:X ë`Á:¬ƒ…ê°®Ã:X¤ë`Ñ:¬ƒÅê°¯Ã:X¢ë`É:¬ƒ¥ê°–®Ã:X¦ë`Ù:¬ƒåê°–¯Ã:X¡ë`Å:¬ƒ•ê°V®Ã:X¥ë`Õ:¬ƒÕê°V¯Ã:X£ë`Í:¬ƒµê°Ö®Ã:X§ë`Ý:¬ƒõê°Ö¯Ã:Ø ë`Ã:¬ƒê°6®Ã:ؤë`Ó:¬ƒÍê°6¯Ã:Ø¢ë`Ë:¬ƒ­ê°¶®ÃCdZà\ml›mSÖÆvuXÛ×amìP‡µ±cÖÆNuX;×amìR‡µ±kÖÆnuX»×amìQ‡µ±g^"Û«kcï:¬}êðÒÙ¾uXûÕamì_‡µq@ÖÆuXÕam\‡µqHÖÆ¡uX‡Õam^‡µqDÖÆ‘uXGÕam]‡µqLÖƱuXÇÕam_‡µqBÖƉuX'Õamœ\‡µqJÖÆ©uX§Õamœ^‡µqFÖÆ™ux‹ì¬:¬³ë°6ΩÃ:8·Ï•isµq~v^YÔam\X‡µqQÖÆÅuX—Ôam\Z‡µqYÖÆåuXWÔam\Y‡µqUÖÆÕux¯ìš:¬kë°6®«Ãûf××amÜP‡µqcÖÆMuX7×amÜR‡µqkÖÆmuX·×amÜQ‡µqgÖÆ]uXw×amÜS‡µqoÖÆ}uX÷×amuXûÖaìW‡u°ÖÁuXÖaT‡uppÖÁ!uX‡ÖaV‡upxÖÁuXGÖaU‡uptÖÁ1uXÇÖaW‡up|ÖÁ uX'Öáé2-p®6NÎN*kã”:¬Së°6N«ÃÚ8½kãŒ:¬3ë°6ΪÃÚ8»kãœ:¬së°6ΫÃÚ8¿o—]P‡µqaÖÆEuxÇìâ:¬Kê°6.­ÃÚ¸¬kãò:¬+ê°6®¬ÃÚ¸ªkãê:¬kê°6®­ÃÚ¸®kãú:¬ê°6n¬ÃÚ¸©kãæ:¬[ê°6n­ÃÚ¸­kãö:¬;ê°6î¬ÃÚ¸«kãî:¬{ê°6î­ÃÚ¸¯kãþ:|\ö@ÖƃuXÕa<\‡7È´À=’=šý–ýZ~,÷÷:üxöG~"û³?™ýU‡ŸÊþ®ÃOgÿÔág²ëð³Ù CýÏáç²óæðóÙ@a¿ æð‹Ù a¿” æðËÙ`a¿’ æð«Ùa¿– æðëÙPa¿‘ æð›Ù0a¿• æðÛÙpa¿“ æð»Ùa¿—æðûÙHaæð‡Ù(a”æðÇÙha’æð§Ùa–æðçÙXa‘æð²qÂþo6n˜Ã_fã…9üU6~˜Ã_g„9üM6a˜Ãßf…9ü]6q˜Ãßg“„9üC6i˜Ã?f“…9üS6y˜Ã?gS„9üK6e˜Ó„6¦O•amLæ°6¦ sXÓ…9¬éÃÖÆ akcÆ0‡µ1S˜Ã:˜9ã°fÉ8¬ƒY3ë`¶ŒÃ:˜=ã°æÈ8¬ƒ93ë`®ŒÃ:˜;ã°æÉ8¬ƒy3ë`¾ŒÃ:˜?ã°È8¬ƒ3ë`¡ŒÃ:X8ã°É8¬ƒE3ë`±ŒÃ:X<ã°–È8¬ƒ%3ë`©ŒÃ:X:ã°–É8¬ƒe3ë`¹ŒÃ:X>ã°VÈ8¬ƒ3ë`¥ŒÃd+gž0[%ãðDÙª‡'ÎVË8ªÃÚø¸kã“:¬Oë°6>«ÃÚø¼kã‹:¬ÿÔamü·kãË:¬¯ê°6¾®ÃÚø¦kãÛ:¬ïê°6¾¯ÃÚø¡kãÇ:¬Ÿê°6~®Ó„6~Í~)kã·:¬ßë°6þ¨ÃÚø³kã¯:¬¿ë°6þ©ÃÚø·kc€¡ÿç°6Ì›ÃÚ(Ìam æ°6 sXƒ†9¬ÁÂÖÆàakcˆ0‡µ1d˜ÃÚ*Ìam æ°6† sXÆ9¬áÂÖÆðakc„0‡µ1b˜ÃÚ)ÌamŒæ°6F sX£†9¬ÑÂÖÆèakcŒ0‡µ1f˜ÃÚ+ÌamŒæ°6Æ sXã†9¬ñÂÖÆøakc‚0‡µ1a˜ÃÚ˜(ÌamLæ°6& sX“†9¬ÉÂÖÆäakcŠ0§ mLž2ÃÚ˜:ÌamLæ°6¦ sXÓ…9¬éÃÖÆ akcÆ0‡µ1S˜Ã:˜9ã°fÉ8¬ƒY3ë`¶ŒÃ:˜=ã°æÈ8¬ƒ93ë`®ŒÃ:˜;ã°æÉ8¬ƒy3ë`¾ŒÃ:˜?ã°È8¬ƒ3ë`¡ŒÃ:X8ã°É8¬ƒE3ë`±ŒÃ:X<ã°–È8¬ƒ%3ë`©ŒÃ:X:ã°–É8¬ƒe3ë`¹ŒÃ:X>ã°VÈ8¬ƒ3ë`¥ŒÃd+gž0[%ãðDÙª‡'ÎVË8uXûÖaìW‡u°ÖÁuXÖaT‡uppÖÁ!uX‡ÖaV‡upxÖÁuXGÖaU‡uptÖÁ1uXÇÖiBÇgÇ•µqBÖƉuX'Õamœ\‡µqJÖÆ©uX§Õamœ^‡µqFÖÆ™uXgÕamœ]‡µqNÖƹuXçÕamœ_‡µqAÖÆ…uXÕam\\‡µqIÖÆ¥uX—Õam\^‡µqEÖÆ•uXWÕam\]‡µqMÖƵuX×Õam\_‡µqCÖÆuX7ÕamÜ\‡µqKÖÆ­uX·ÕamÜ^‡µqGÖÆuXwÕamÜ]‡µqOÖƽuX÷ÕamÜ_‡µñ@&´ñPö`Y×amÌamŒæ°6F sX#…9¬‘ÃÖÆ(akcÔ0‡µ1Z˜ÃÚ=ÌamŒæ°6Æ sXc…9¬±ÃÖÆ8akcÜ0‡µ1^˜ÃÚ?ÌamLæ°6& sX…9¬‰ÃÖÆ$akcÒ0‡µ1Y˜Ó„6¦OžamLæ°6¦ +sXS‡9¬iÂÖÆ´akcº0‡µ1}˜ÃÚ˜!ÌamÌæ°6f +sX3gÖÁ,‡u0kÆaÌ–qX³gÖÁ‡u0gÆaÌ•qXsgÖÁ<‡u0oÆaÌ—qXógÖÁ‡u°`Æa,”qX gÖÁ"‡u°hÆa,–qX‹gÖÁ‡u°dÆa,•qXKgÖÁ2‡u°lÆa,—qXËgÖÁ +‡u°bÆa¬”qx‚låŒÃf«dž([5ãðÄÙj‡'ÉVÏ8¬ÃÚø¨kãã:¬Oê°6>­ÃÚø¬kãó:¬/ê°6þS‡µñß:¬/ë°6¾ªÃÚøºkã›:¬oë°6¾«ÃÚø¾kã‡:Mhã§ìDz6~®ÃÚø¥kã×:¬ßê°6~¯ÃÚø£kãÏ:¬¿ê°6þ®ÃÚø§kãß:¬†ûŸÃÚ0okc 0‡µ1p˜ÃÚ$Ìam æ°6 sXƒ‡9¬!ÂÖÆakc¨0‡µ1t˜ÃÚ&Ìam æ°6† sXÇ9¬ÂÖƈakc¤0‡µ1r˜ÃÚ%ÌamŒæ°6F sX£‡9¬1ÂÖƘakc¬0‡µ1v˜ÃÚ'ÌamŒæ°6Æ sXã‡9¬ ÂÖÆ„akc¢0‡µ1q˜ÃÚ˜$ÌamLæ4¡ÉÓeXS„9¬)ÃÖÆTakcê0‡µ1M˜ÃÚ˜6ÌamLæ°6¦sX3„9¬ÃÖÆLaë`æŒÃ:˜%ã°fÍ8¬ƒÙ2ë`öŒÃ:˜#ã°æÌ8¬ƒ¹2ë`îŒÃ:˜'ã°æÍ8¬ƒù2ë`þŒÃ:X ã°Ì8¬ƒ…2ë`áŒÃ:X$ã°Í8¬ƒÅ2ë`ñŒÃ:X"ã°–Ì8¬ƒ¥2ë`éŒÃ:X&ã°–Í8¬ƒå2ë`ùŒÃ:X!ã°VÌ8¬ƒ•2O­œqxÂl•ŒÃe«fž8[-ãð$Ùê‡'ÍÖȸɲɳµ²5ËSä®]‡§ÌÖ©ÃSeëÖᩳõêð4ÙúuxÚlƒ:<]¶až>Û¨Ïm\‡gÌ6©Ã3e›ÖᙳÍêð,ÙæuxÖl‹:<[¶ež=Ûªë`ë:¬ƒmê°¶­Ã:Ø®ë`û:¬ƒê°v¬Ã:Ø©ë`ç:¬ƒ]ê°v­Ã:Ø­ë`÷:¬ƒ=ê°ö¬Ã:Ø«ë`ï:¬ƒ}ê°ö­Ã:دë`ÿ:¬ƒê°¬Ã:8¨ëàà:¬ƒCê°­Ã:8¬ëàð:¬ƒ#ê°Ž¬Ã:8ªkãè:MhãØ옲6Ž«ÃÚ8¾kã„:¬ë°6NªÃÚ8¹kã”:¬Së°6N«ÃÚ8½kãŒÿ£¹c¨=ÛnVomÛ¶mÛ¶mÛ¶mÛ¶mÛ¶=G¾¹œ¹Æ}4iš>IWÛÆmlg¶±mœÕƶqvÛÆ9ml綱mœ×ƶq~ÛÆml¶±m\ÔƶqqÛÆ%ml—¶±m\ÖƶqyÛÆmlW¶±m\ÕƶquÛÆ5ml׶±m\×ƶq}ÛÆ ml7¶±mÜÔƶqsÛÆ-ml·¶±mÜÖƶq{ÛÆmlw¶±mÜÕƶqwÛÆ=ml÷¶Ù„mÜŸ»¯¶ÚØ6lcÛx¨mãá6¶GÚØ6mcÛx¬mãñ6¶'ÚØ6žlcÛxªmãé6¶gÚØ6žmcÛx®mãù6¶ÚØ6^lcÛx©mãå6¶WÚØ6^mcÛx­mãõ6¶7ÚØ6ÞlcÛx«mãí6¶wÚØ6ÞmcÛx¯mãý6¶ÚØ6>lcÛø¨mãã6¶OÚØ6>mcÛø¬mãó6¶/ÚØ6¾lcÛøªmãë6¶oÚØ6¾mcÛø®mãû6¶ÚlÂ6~ÊýXÛÆÏml¿´±müÚƶñ[ÛÆïml´±müÙƶñWÛÆßmlÿ´±müÛƶñ_ÛÆ Ãý_cÛ0ßÛÆ@±Æ¶1p¬±m klÿ‹5¶Acmc°XcÛ<ÖØ6†ˆ5¶!cmc¨XcÛ:ÖØ6†‰5¶acmc¸XcÛ>ÖØ6Fˆ5¶cmc¤XcÛ9ÖØ6F‰5¶Qcmc´XcÛ=ÖØ6ƈ5¶1cmc¬XcÛ;ÖØ6Ɖ5¶qcmc¼XcÛ?ÖØ6&ˆ5¶ cmc¢XcÛ˜8ÖlÂ6&'ɱmLkl“ÇÛƱƶ1e¬±mLklSÇÛÆ4±Æ¶1m¬±mLklÓÇÛÆ ±Æ¶1c¬±Ì”ÓØfÎil³ä4¶ƒYsÛÁl9í`öœÆv0GNc;˜3§±Ì•ÓØæÎilóä4¶ƒysÛÁ|9í`þœÆv°@Nc;X0§±,”ÓØÎil‹ä4¶ƒEsÛÁb9í`ñœÆv°DNc;X2§±,•ÓØ–ÎilËä4¶ƒesÛÁr9í`ùœÆv°BNc;X1§ñø¹•rO[9§ñ„¹UrO”[5§ñĹÕrÚ$¹IskäV¯'Ë»fOž[«§È­ÝÆSæÖiã©rë¶ñÔ¹õÚxšÜúmlcÛø¨mãã6¶OÚØ6>mcÛø¬mãó6¶/ÚØ6¾lcÛøªmãë6¶oÚØ6¾mcÛø®mãû6›°s?Ô¶ñSÛÆÏml¿´±müÚƶñ[ÛÆïml´±müÙƶñWÛÆßmlÿ´±müÛƶñ_ÛÆ Ãÿ_cÛ0ßÛÆ@±Æ¶1p¬±m klÿ‹5¶Acmc°XcÛ<ÖØ6†ˆ5¶!cmc¨XcÛ:ÖØ6†‰5¶acmc¸XcÛ>ÖØ6Fˆ5¶cmc¤XcÛ9ÖØ6F‰5¶Qcmc´XcÛ=ÖØ6ƈ5¶1cmc¬XcÛ;ÖØ6Ɖ5¶qcmc¼XcÛ?ÖØ6&ˆ5¶ cmc¢X³ Û˜$ž8Ƕ1i¬±mLkl“ÇÛƱƶ1e¬±mLklSÇÛÆ4±Æ¶1m¬±mLklÓÇÛÆ ±Æ¶1c¬±Ì”ÓØfÎil³ä4¶ƒYsÛÁl9í`öœÆv0GNc;˜3§±Ì•ÓØæÎilóä4¶ƒysÛÁ|9í`þœÆv°@Nc;X0§±,”ÓØÎil‹ä4¶ƒEsÛÁb9í`ñœÆv°DNc;X2§±,•ÓØ–ÎilËä4¶ƒesÛÁr9í`ùœÆv°BNc;X1§ñø¹•rO[9§ñ„¹UrO”[5§Mœ›$·znµzÒ¼k´ñd¹5ÛxòÜZmjcÛø¸mã“6¶OÛØ6>kcÛø¼mã‹6¶/ÛØ6¾jcÛøºmã›6¶oÛØ6¾k³ Ûø!÷}m?¶±müÔƶñsÛÆ/ml¿¶±müÖƶñ{ÛÆml¶±müÕƶñwÛÆ?mlÿ¶±mü×ƶ1Àÿ×Ø6̷ƶ1P¬±m klƒÄÛÆÿbmcÐXcÛ,ÖØ65¶!bmcÈXcÛ*ÖØ6†Ž5¶abmcØXcÛ.ÖØ6†5¶bmcÄXcÛ)ÖØ6FŽ5¶QbmcÔXcÛ-ÖØ6F5¶1bmcÌXcÛ+ÖØ6ÆŽ5¶qbmcÜXcÛ/ÖØ6Æ5¶ bmcÂX³ Û˜8ž(Ƕ1I¬±mLkl“ÅÛÆä±Æ¶1E¬±mLklSÅÛÆԱƶ1M¬±mLklÓÅÛÆô±Æ¶1C¬±mÌkl3å4¶ƒ™sÛÁ,9í`ÖœÆv0[Nc;˜=§±Ì‘ÓØæÌilså4¶ƒ¹sÛÁ<9í`ÞœÆv0_Nc;˜?§±,ÓØÌil å4¶ƒ…sÛÁ"9í`ÑœÆv°XNc;X<§±,‘ÓØ–ÌilKå4¶ƒ¥sÛÁ29í`ÙœÆv°\Nc;X>§±¬ÓØVÌi<~n¥œÆäVÎihcÛø°mã£6¶ÛØ6>icÛø´mã³6¶ÏÛØ6¾hcÛø²mã«6¶¯ÛØ6¾icÛø¶Í&lãûÜwµmüÐƶñcÛÆOml?·±müÒƶñkÛÆoml¿·±müÑƶñgÛÆ_ml·±müÓƶñoÛÆmlŒømcÀ|klÅÛÆÀ±Æ¶1H¬±mü/ÖØ65¶ÁbmcðXcÛ"ÖØ6†Œ5¶¡bmcèXcÛ&ÖØ6†5¶ábmcøXcÛ!ÖØ6FŒ5¶‘bmcäXcÛ%ÖØ6F5¶ÑbmcôXcÛ#ÖØ6ÆŒ5¶±bmcìXcÛ'ÖØ6Æ5¶ñbmcüXcÛ˜ ÖlÂ6&Š'̱mLkl“ÄÛƤ±Æ¶1Y¬±mLklSÄÛÆ”±Æ¶1U¬±mLklÓÄÛÆ´±Æ¶1]¬±mLkl3ÄÛÆŒ±Æv0SNc;˜9§±Ì’ÓØfÍil³å4¶ƒÙsÛÁ9í`ÎœÆv0WNc;˜;§±Ì“ÓØæÍilóå4¶ƒùsÛÁ9í`ÁœÆv°PNc;X8§±,’ÓØÍil‹å4¶ƒÅsÛÁ9í`ÉœÆv°TNc;X:§±,“ÓØ–ÍilËå4¶ƒåsÛÁ +9í`ÅœÆãçVÊincÛø¤mãÓ6¶ÏÚØ6>ocÛø¢mãË6¶¯ÚØ6¾ncÛø¦Í&lã»Ü·µm|ßƶñCÛÆml?µ±müÜƶñKÛƯml¿µ±müÞƶñGÛÆŸmlµ±müÝƶñOÛÆ¿mlÿµ±m 0Òÿ5¶ó­±m klÇÛÆ ±Æ¶ñ¿XcÛ4ÖØ6‹5¶ÁcmcˆXcÛ2ÖØ6†Š5¶¡cmc˜XcÛ6ÖØ6†‹5¶ácmc„XcÛ1ÖØ6FŠ5¶‘cmc”XcÛ5ÖØ6F‹5¶ÑcmcŒXcÛ3ÖØ6ÆŠ5¶±cmcœXcÛ7ÖØ6Æ‹5¶ñcÍ&lcÂx‚ÛÆD±Æ¶1q¬±mLkl“ÆÛÆd±Æ¶1y¬±mLklSÆÛÆT±Æ¶1u¬±mLklÓÆÛÆt±Æ¶1}¬±mÌkl3ÆÛÁL9í`æœÆv0KNc;˜5§±Ì–ÓØfÏilsä4¶ƒ9sÛÁ\9í`îœÆv0ONc;˜7§±Ì—ÓØæÏil ä4¶ƒsÛÁB9í`áœÆv°HNc;X4§±,–ÓØÏilKä4¶ƒ%sÛÁR9í`éœÆv°LNc;X6§±,—ÓØ–Ïil+ä4¶ƒsŸ[)§M›0·Jnåz¢¼«¶ñĹÕÚx’ÜêmncÛø¤mãÓ6¶ÏÚØ6>ocÛø¢mãË6¶¯ÚØ6¾ngäü?ZnÙÜrõXy—iã1sK·ñ¹¥ÚxôÜ’mm¼dnï6^"·W/žÛ³ËíÑÆ‹ævoãEr»µñ¹]Ûx¡Ü.m¼`nç6^ ·SÏŸÛ±mc‡6¶íÛØ6¶kcÛضmc›6¶­ÛØ6¶jcÛزmc‹6¶ÍÛØ66kcÛØ´mc“6¶ÛØ6jc;Ø°í`ƒ6¶ƒõÛØÖkc;X·í`6¶ƒµÛØÖjc;X³í`6¶ƒÕÛØVkc;Xµí`•6¶ƒ•Ûx‚ÜJm<~nÅ6/·BÛÁml´y÷Ïݘ»©Þ/ï ml×·±m\×ƶqmÛÆ5mlW·±m\ÕƶqeÛÆml—·±m\Öƶqiï”»¤wÌ]ÜÆ;ä.jãís¶ñv¹ ÚØ6ÎocÛ8¯mãÜ6¶sÚØ6ÎncÛ8«mãÌ6¶3ÚØ6NocÛ8­mãÔ6¶SÚxÃÜÉm¼Aî¤6^?wb¯—;¡mãø6¶ãÚØ6ŽmcÛ8¦mãè6¶£ÚØ6ŽlcÛ8¢mãð6¶ÃÚØ6mã•r‡´ñŠ¹ƒÛx…ÜAml7·±MÜÔæ½1÷qî“ú†¼µ±m|ØƶñAÛÆûmlïµ±m¼ÛƶñNÛÆÛmloµ±m¼ÙƶñFÛÆëm|Iîµ6¾8÷j_”{¥/̽ÜÆä^jcÛx±mã…6¶çÛØ6žkcÛx¶mã™6¶§ÛØ6žjcÛx²mã‰6¶ÇÛØ6kã“s¶ñI¹GÚøÄÜÃm|Bî¡6¶ÛØ6hcÛ¸¿mã¾6¶{ÛØ6îicÛ¸»mã®6¶;ÛØ6îhcÛ¸½ÉÝÖÆçnmãƒr·´±m|ÚÆ6ñI›÷ãܨ£äwCŽ?Êkl#ÇÛÆH±Æ¶1b¬±mŒklÃÇÛÆp±Æ¶1l¬±m klCÇÛÆP±Æ¶1d¬±m klƒÇÛÆ`±Æ/ç5¶ÿÅÛÆ ±Æ¶1p¬±m klÆÛÆ ±Æ¶ñ_ÛÆ¿mlÿ´±müÝƶñWÛÆŸml´±müÞÆä~kã‡s¿¶ñC¹_ÚØ6~ncÛø©mãÇ6¶ÚØ6¾ocÛø®mãÛ6¶oÚØ6¾ncÛøªmãË6¶/ÚØ6>ocÛø¬mcôüÙhl¶ yí`ñܵ,ÖÆv°hÛÁ"ml ·±,ÔÆv°`ÛÁmló·±Ì×Æv0oÛÁ6w“»¯ÎÝÛÆGåîicÛ¸»mã®6¶;ÛØ6îhcÛ¸½mã¶6¶[ÛØ6nicÛ¸¹mã¦6¶Ûx¿Ü m¼oîú6Þ'w]ÛÆûmlïµyßÍ ?j~7äøÜp±Æ¶1l¬±m klCÇÛÆP±Æ¶1d¬±m klƒÇÛÆ`±Æ¶1h¬±mü/ÖØ6‰5¶cmc XcÛ0ÖøÙÜ ±Æ¶ñ_ÛÆ¿mlÿ´±müÝƶñWÛÆŸml´±müÞƶñ[ÛƯml¿´±müÜƶñSÛÆm|_î‡6¾7÷}ß“û®mãÛ6¶oÚØ6¾ncÛøªmãË6¶/ÚØ6>ocÛø¬mãÓ6¶OÚØ6>ncÛø¨mãÃ6¶ÚØ6FÌŸ½Æ6a š×Ì-TÛÁmló·±Ì×Æv0oÛÁ5÷xŸ’{¬mãÑ6¶GÚØ6ncÛx¨mãÁ6¶ÚØ6îocÛ¸¯mãÞ6¶{ÚØ6încÛ¸«ÏÝÙƇåîhãCs··ñ!¹ÛÚØ6nmcÛ¸¥mãæ6¶›ÚØ6nlcÛ¸¡mãú6¶ëÚØ6®mcÛ¸¦mãê6Þ#wUïž»²wË]ÑƶñfÛÄmÞ×sCŽ–ß 9~-7D¬±m klƒÅÛÆ ±Æ¶ñ¿XcÛ$ÖØ6Ž5¶bmcÀXcÛ ÖØ6þkcÛø·mãŸ6¶¿ÛØ6þjãÇs¶±müÑƶñ{ÛÆoml¿¶±müÒƶñsÛÆOml?¶±müÐƶñ}ÛÆwml߶±m|ÓÆwæ¾nã;r_µñí¹/Ûø¶ÜmlŸ·±m|ÖƶñiÛÆ'ml·±m|ÔƶñaÛÆmlï·±m¼×ƶñnÛÆ;mlo·±m¼Õƶ1tþÛÒØ&lAóÚÁܹyj;˜«í`Î6¶ƒ9ÚØfoc;˜­í`Ö6¶ƒYÚØfnc;˜©mcÆ6¶ÚØ6¦Ï·Æ¶1]¬±mLküWnšXã?sSÇÛÆT±Æ¶1e¬±mLkl“ÇÛÆd±Æ¶1i¬±mLklÇÛÆD±Æ¶1a¬±mLklãÇÛÆx±Æ¶1n¬±mŒklcÇÛÆX±Æ¶1f¬±mŒkl£ÇÛÆh±Æ¶1j¬±mŒkl#ÇÛÆH±Æ¶1b¬±mŒklÃÇÛÆp±Æ¶1l¬± klóæ´ÿ¿ [춱mn»Ú6¶icÛغmc«6¶-ÛØ6¶hcÛؼmc³6¶MÛØ66icÛظí`£6¶ƒ ÛØ6hc;X¿í`½6¶ƒuÛØÖic;X»í`­6¶ƒ5ÛØÖhc;X½í`µ6¶ƒUÛØVic;X¹í`¥6¶ƒÛØVhc;X¾í`¹6¶ƒeÛØ–ic;Xºí`©6¶ƒ%ÛØ–hc;X¼í`±6¶ƒEÛØic;X¸í`¡6¶ƒÛx¸Üm1÷pŸ{¨Ï=ØÆÇåhcÛ¸¿mã¾6¶{ÛØ6îicÛ¸»mã®6¶;ÛØ6îhcÛ¸½mã¶6¶[ÛØ6niãs7·ñ¹›ÚxÿÜm¼_î†6¶ëÛØ6®kcÛ¸¶mãš6¶«ÛØ6®jcÛ¸²mãŠ6¶ËÛØ6.kcÛ¸´wÊ]ÒÆ;æ.nãrµ±m¼ÜÆ6ñR›÷ÅÜ £çwCŽ_È klÅÛÆ€±Æ¶1@¬±mü×ƶñoÛÆ?ml·±müÕƶñgÛÆml¿·±müÖƶñkÛÆ/mü`îç6¶ŸÚØ6~lcÛø¡mãû6¶ïÚØ6¾mcÛø¦mãë6¶¯ÚØ6¾lcÛø¢mãó6¶ÏÚøæܧm|Sî“6¾1÷qßû¨mãÃ6¶ÚØ6ÞocÛx¯mãÝ6¶wÚØ6ÞncÛx«mãÍ6¶7ÚØ6^ocÛx­mãÕ6¶WÚØ6ͻۄ-h^;˜57[m³´±ÌÜÆv0SÛÆŒml3´±mLŸomcºXcÛ˜6ÖØ6¦‰5¶©cmcªXcÛ˜2ÖØ6¦ˆ5¶ÉcÉMküsnÒXcÛ˜$ÖØ6&Ž5¶‰bmcÂXcÛ˜ ÖØ6Æ5¶ñbmcÜXcÛ'ÖØ6ÆŽ5¶±bmcÌXcÛ#ÖØ6F5¶ÑbmcÔXcÛ%ÖØ6FŽ5¶‘bmcÄXcÛ!ÖØ6†5¶ábmcØXcÛ&ÖØ6†Ž5¶¡bmcÈXcÛ"ÖØ65¶ƒÁbí`öœöÿ7a š×66ÏmQÛÆfml›¶±mlÒƶ±qÛÁFml¶±lÐÆv°~ÛÁzml붱¬ÓÆv°vÛÁZmlk¶±¬ÑÆv°zÛÁjml«¶±¬ÒÆv°rÛÁJml+¶±¬ÐÆv°|ÛÁrml˶±,ÓÆv°tÛÁRmlK¶±,ÑÆv°xÛÁbml‹¶±,ÒÆv°pÛÁBml ¶±,ÐÆv0ÛÁ|mló¶±ÌÓÆv0w‘›«ÏÍÙƃåæhc;زmb‹6ïæ¹3sgÕ›å=£mãô6¶ÓÚØ6NmcÛ8¥mãä6¶“ÚØ6NlcÛ8¡mãø6¶ãÚØ6ŽmãµrÇ´ñš¹£ÛxÜQm¼zîÈ6^-wDÛÆáml‡µ±mÚƶqHÛÆÁmlµ±mØƶq@ÛÆþmlûµ±mìÛƶ±O/™Û»—ÈíÕÆ‹çölãÅr{´±mìÞƶ±[ÛÆ®ml»´±mìÜƶ±SÛÆŽml;´±mlßƶ±]Ûƶmû7÷_ýTÞÚØ6þncÛø«mãÏ6¶?ÚØ6~ocÛø­mã×6¶_ÚØ6~ncÛø©mãÇ6¾/÷Cß›û¾ïÉ}×Æwç¾mã»rß´±m|ÝƶñUÛÆ—ml_´±m|ÞƶñYÛƧmlŸ´±m|ÜƶñQÛƇml´ñµ¹÷ÛøšÜ{m|uîÝ6¾*÷NÛÆÛmloµ±m¼ÙƶñFÛÆëml¯µ±m¼ÚƶñJÛÆËml/µ±m¼ØÆçå^hãssÏ·ñ9¹çÚØ6ãÿÛÄmÞsÓç¯ÏãrÓÅÛÆ´±Æ¶1M¬±mLklSÅÛÆ”±Æ¶1E¬±mLkl“ÅÛƤ±Æ¶1I¬±mLklÅÛÆ„±Æ¶1A¬ñ·¹ñcmc¼XcÛ7ÖØ6Ɖ5¶±cmc¬XcÛ3ÖØ6ƈ5¶Ñcmc´XcÛ5ÖØ6F‰5¶‘cmc¤XcÛ1Öø½Ü±Æïæ†5~'7\¬±m klÃÄÛÆбƶ1T¬±m klCÄÛÆà±Æ¶1X¬±m klÿ‹5¶AbmcàXcÛ(ÖØ6Œ5¶sÛ„-h^;Ø0·Qm´±¬ßÆv°^ÛÁºmlë´±¬ÝÆv°VÛÁšmlk´±¬ÞÆv°ZÛÁªml«´±¬ÜÆv°RÛÁŠml+´±,ßÆv°\ÛÁ²mlË´±,ÝÆv°TÛÁ’mlK´±,ÞÆv°XÛÁ¢ml‹´±,ÜÆv°PÛÁ‚ml ´±ÌßÆv0_ÛÁ¼mló´±ÌÝÆv0WÛÁœmls´±ÌÞÆv0[ÛÁ¬m,wGš»½ÉÝÖÆçnmãƒr·´±mÜÜƶqSÛÆml7´±m\ßƶq]ÛƵml×´±m\ÝƶqUÛÆ•mlW´ñ®¹ËÛx—Üem¼sîÒ6Þ)wIÛÆÅmlµ±m\ØƶqAÛÆùmlçµ±mœÛƶqNÛÆÙmlgµ±mœÙÆ›åÎhãMs§·ñ&¹ÓÚØ6oc›x¬Íûhî÷Üõ#ykcÛøµmã—6¶ŸÛØ6~jcÛø±mã‡6¶ïÛØ6¾kcÛø¶mã›6¶¯ÛøŽÜWm|{îË6¾-÷Eßšû¼oÉ}ÖƶñiÛÆ'ml·±m|ÔƶñaÛÆmlï·±m¼×ƶñnÛÆ;mlo·±m¼ÕÆ—çÞlãËro´ñ¥¹×Ûø’Ükml¯¶±m¼ÒƶñrÛÆKml/¶±m¼Ðƶñ|ÛÆsml϶±m<ÓƶñtŸ‘{ªOÏ=ÙƧåžhcÛø³mâ6ïï¹)ÇÌï†ÿ–›"ÖØ6&5¶ÉbmcÒXcÛ˜$ÖØ6&Ž5¶‰bmcÂXcÛ˜ ÖØ6Æ5¶ñbmcÜXcÛ'ÖØ6ÆŽ5¶±b?ÏklcÄÛÆè±Æ¶1Z¬±mŒkl£ÄÛÆȱƶ1R¬±mŒkl#ÄÛÆð±Æ¶1\¬±m klÃÄÛÆбÆo䆊5~=7d¬ñk¹!bmcðXcÛ,ÖØ65¶ÿÅÛÆ ±Æ¶1p¬±m klÆÛÆ ±Æ¶ñ_ÛÆ¿mlÿ´±müÝƶñWÛÆÔù{kl¶ yí`íÜ:µ¬ÕÆv°fÛÁml«·±¬ÖÆv°jÛÁ*ml+·±¬ÔÆv°bÛÁ +mlË·±,×Æv°lÛÁ2mlK·±,ÕÆv°dÛÁml‹·±,ÖÆv°hÛÁ"ml ·±,ÔÆv°`ÛÁmló·±Ì×Æv0oÛÁ&ï}ml÷¶±mÜÓƶqwÛÆ]mlw¶±mÜÑƶq{ÛÆmml·¶±mÜÒƶqs»©÷ÏÝØÆûånhã}s×·ñ>¹ëÚØ6®mcÛ¸¦mãê6¶«ÚØ6®lcÛ¸¢mãò6¶ËÚØ6.mcÛ¸¤mãâ6¶‹ÚxûÜ…m¼]î‚6Þ6w~o“;¯mãÜ6¶sÚØ6ÎncÛ8«mãÌ6¶3ÚØ6NocÛ8­mãÔ6¶SÚØ6Nnã r'µñú¹Ûx½Ü ml¶±M<Ðæ½?÷cî§ú¾¼?´±m|ßƶñ]ÛÆ·mlß´±m|ÝƶñUÛÆ—ml_´±m|ÞƶñYÛƧm|Sî“6¾1÷qßû¨¯Ï}ØÆ×å>hcÛx¿mã½6¶wÛØ6ÞicÛx»mã­6¶7ÛØ6ÞhcÛx½mãµ6¶WÛØ6^iã s/·ñ¹—ÚøüÜ‹m|^î…6¶çÛØ6žkcÛx¶mã™6¶§ÛØ6žjcÛx²mã‰6¶ÇÛØ6kcÛx´OÊ=ÒÆ'ænãrµ±müÜÆ6ñS›÷ÇÜÄcåwCŽÈMklÆÛƱƶ1~¬±mŒklãÆÛÆ8±Æ¶1v¬±mŒklcÆÛƱƶ1z¬±mŒkl£ÆÛÆ(±ÆæFŽ5¶‘bmcÄXcÛ!ÖØ6†5¶ábmcØXcÛ&ÖØ6†Ž5¶¡bmcÈXcÛ"ÖØ65¶ÁbmcÐXã—rÿ‹5~17H¬ñ ¹cmc XcÛ0ÖØ6ˆ5¶ÿÚØ6þmcÛø§mãï6¶¿ÚØ6þlcÛø£mã÷6¶ßÚØ6~mcÛø¥mcÒü³kl¶ yí`ÕÜjµ¬ÒÆv°rÛÁJml+¶±¬ÐÆv°|ÛÁrml˶±,ÓÆv°tÛÁRmlK¶±,ÑÆv°xÛÁbml‹¶±,ÒÆv°pÛÁBml ¶±,ÐÆv0ÛÁ|mló¶±ÌÓÆv0wÛÁ\mls¶±ÌÑÆv0{ÛÁlml³¶±ÌÒÆv0sÛÁLml3¶±mÌÐƶ1}¾5¶ébmcÚXcÛ˜&ÖØ6¦Ž5¶©bmcÊXcÛ˜"ÖØ6&5¶ƒÉbí`õœÆ6a š×6ÏQÛÆaml‡¶±mÒƶqp¯;¨—ÏØÆËåhãesû·ñ2¹ýÚxéܾm¼TnŸ6^2·w/‘Û«ÏíÙÆ‹åöhãEs»·ñ"¹ÝÚØ6vmcÛØ¥mcç6¶ÚØ6vlcÛØ¡mcû6¶íÚØ6¶mcÛئmcë6¶­ÚØ6¶lcÛØ¢mcó6¶ÍÚØ66mcÛؤmcã6¶ƒÚØ6lc;Ø í`ý6¶ƒõÚØÖmc;X§í`í6ž"·VOž[³'Ë­ÑÆvpdÛÄmÞÃswæîªË{GÛÆíml·µ±mÜÚƶqKÛÆÍml7µ±mÜØƶqCÛÆõml×µ±m\ÛÆ{å®iã=sW·ñ¹«Úx÷Ü•m¼[îŠ6¶ËÛØ6.kcÛ¸´mã’6¶‹ÛØ6.jcÛ¸°mã‚6¶óÛØ6ÎkcÛ8·mãœ6Þ2wvo‘;«7ÏÙÆ›åÎhcÛ8½mã´6¶SÛØ6NicÛ8¹mã¤6¶ÛØ6NhcÛ8¾mã¸6¶cÛx­Ü1m¼fîè6^#wTÛÆÝmlwµyïÌ}û¦¾#ïWml_¶±m|ÑƶñyÛÆgmlŸ¶±m|ÒƶñqÛÆGml¶±m|Ðƶñ~_“{¯¯Î½ÛÆWåÞiã+so·ñ¹·ÚØ6ÞlcÛx£mãõ6¶×ÚØ6^mcÛx¥mãå6¶—ÚØ6^lcÛx¡mãù6¶çÚøìܳm|Vî™6>3÷tŸ‘{ªmãÉ6¶'ÚØ6ocÛx¬mãÑ6¶GÚØ6ncÛx¨mãÁ6¶ÚØ6îoãcr÷µñѹ{Ûø¨Ü=ml߶±M|Óæý:7îØùÝã¯rãÄÛÆرƶ1V¬±mŒklcÄÛÆè±Æ¶1Z¬±mŒkl£ÄÛÆȱƶ1R¬±mŒkl#ÄÛÆð±Æ¶1\¬ñÛ¹acmc˜XcÛ:ÖØ6†Š5¶!cmcˆXcÛ<ÖØ6‹5¶Acmã±Æ¶1H¬±m klÅÛÆ€±Æ¶1@¬ñ3¹ÿÚøéÜ¿müTîŸ6¶¿ÛØ6þjcÛø³mã6¶ßÛØ6~kcÛøµmã—6¶ŸÛØ6~jcÛø±mã‡6¶ïÛØ6¾kcÛ?ÿn4¶ [мv°|n…Ú–kc;X¶í`™6¶ƒ¥ÛØ–jc;X²í`‰6¶ƒÅÛØkc;X´í`‘6¶ƒ…ÛØjc;X°í`6¶ƒùÛØækc;˜·í`ž6¶ƒ¹ÛØæjc;˜³í`Ž6¶ƒÙÛØfkc;˜µí`–6¶ƒ™ÛØfjcÛ˜±mc†6¶éó­±mLklÓÆÛÆ4±Æ¶1u¬±mLklSÆÛƱƶ1y¬±mLkl“ÆÛÆ$±Æ¶1q¬±mLklÆÛÁ±Æv°bNc›X!§y—Ϙ;¨^.ïm¼lnÿ6^&·_/Û·—ÊíÓÆKæönã%r{µñâ¹=Ûx±Üm¼hn÷6^$·[/œÛµÊíÒÆ ævnãr;µñü¹ÛØ6vhcÛؾmc»6¶mÛØ6¶icÛغmc«6¶-ÛØ6¶hcÛؼmc³6¶MÛØ66icÛظí`£6¶ƒ ÛØ6hc;X¿í`½6¶ƒuÛØÖic;X»í`­6¶ƒ5ÛØÖhc;X½í`µ6¶ƒUÛx¢Ü*m ïMml7¶±mÜÐƶq}ÛÆuml׶±m\ÓƶquÛÆUmlW¶±m\Ñƶqyï’»¬wÎ]ÚÆ;å.iãs·ñ¹‹ÚØ6.lcÛ¸ mãü6¶óÚØ6ÎmcÛ8§mãì6¶³ÚØ6ÎlcÛ8£mãô6¶ÓÚxãÜ©m¼Qî”6Þ0wro;©mãÄ6¶ÚØ6ŽocÛ8®mãØ6¶cÚØ6ŽncÛ8ªmãÈ6¶#ÚØ6oãUr‡µñʹCÛx¥Ü!ml·¶±MÜÒæ½9÷iî³ú¦¼Ÿ´±m|ÜƶñQÛƇml´±m¼ßƶñ^ÛÆ»mlï´±m¼ÝƶñVÛÆ›m|Yî6¾4÷z_’{­/νÚÆå^icÛx¹mã¥6¶ÛØ6^hcÛx¾mã¹6¶gÛØ6žicÛxºmã©6¶'ÛØ6žhãSs·ñ)¹ÇÚøäÜ£m|Rî‘6¶‡ÛØ6jcÛx°mã6¶ûÛØ6îkcÛ¸·mãž6¶»ÛØ6îjcÛ¸³ËÝÑƇænoãCr·µ±m|ÞÆ6ñY›÷ÓÜèãäwCŽ?Ékl£ÆÛÆ(±Æ¶1r¬±mŒkl#ÆÛƱƶ1|¬±m klÃÆÛÆ0±Æ¶1t¬±m klCÆÛƱƯæ5¶ÁbmcÐXcÛø_¬±m klÇÛÆ@±Æ¶1`¬±m klÿµ±müÛƶñOÛÆßmlµ±müÙÆåþhãGs¿·ñ#¹ßÚØ6~mcÛø¥mãç6¶ŸÚØ6~lcÛø¡mãû6¶ïÚØ6¾mcÛø¦mãë6¶¯ÚØ6¾lcÛø¢mcÌü»×Ø&lAóÚÁ’¹¥j;X¢í`ñ6¶ƒÅÚØmc;X¤í`á6¶ƒ…ÚØlc;X í`þ6¶ƒùÚØæmc;˜§í`î6¶ƒ¹ÚØælc;˜£í`ö6¶ƒÙÚØfmc;˜¥í`æ6¶ƒ™ÚØ6flcÛ˜¡mcú|klÓÅÛÆ´±Æ¶1M¬±mLklSÅÛÆ”±Æ¶1E¬±mLkl“ÅÛƤ±Æ¶1I¬±mLklÅÛÆ„±Æ¶1A¬±mŒklãÅÛƸ±Æ¶1N¬±mŒklcÅÛÁÒ9íÿob©6ï’¹½sûÔKäÝ«ÏíÙÆ‹åöhãEs»·ñ"¹ÝÚxáÜ®m¼Pn—6^0·s/Û©çÏíØƶ±CÛÆömlÛµ±mlÛƶ±MÛÆÖml[µ±mlÙöÿZºÏå,È0à M¢ÿ@‘" H UŠ0´ ÷(X€€Riâ²×7›áûÞüÌ>™a á¶q¨·ƒí¸müØŽÛÆvÜ6ö·ã¶±¯·ƒ½í¸üÐŽÛÁžvÜv·ãv°«·ƒí¸ìhÇí`{;n#í¸lkÇí`k;n[Úq;ØÜŽÛÁ¦vÜ6¶ãvð};nÚq;XߎÛÁwí¸¬kÇ?ËnÇçç µãóòÖ¶ã¶qº·‰SíðdÞ›¼·õáëvÜ6^µã¶ñ²·ÛqÛxÑŽÛÆ?í¸müÝŽÛÆóvÜ6žµã¶ñ´·'í¸müÕŽÏû³?–÷¸?š÷¨?’7ÞŽÎ{ØŽÛƃvÜ6î·ã¶ñG;n¿·ã¶ñ[;n¿¶ã¶q¯·»í¸müÒŽÛÆÏí¸mÜiÇmãv;¾3ïV;¾#o¬ßž÷S;>’7ÚŽÛÆÍvÜ6n´ã¶q½·kí¸m\mÇmãJ;n—ÛqÛ¸ÔŽÛÆÅvÜ6.´ã¶q¾Î;׎åmÇ×æiÇmã¿vÜ&Þ¶›oï>Þ%Ê|b(óI¡Ì? e>9”ù”PæSC™O e>=”ùG¡Ìg„2ŸÊüãPæ³B™Ïe>'”ùÜP柄2ÿ4”y~ï óüê Aæù1ŃÌýH$™ç¿— 2Ï?edž¿6džoуÌógù‚¸Ì?e¾0”ù¢Pæ‹C™ÊüËPæKB™Ê|i(ó¯C™/ e¾<”ùŠPæ+C™Ê|U(óoC™¯e¾&”¹™ûúz“÷ùºŽn­ÝYŽn,G÷•£ÛÊÑ]åè¦rtO9º¥ÝQŽn(G÷“ãã:º›z¯£{©G·’£;ÉÑäè>rt9º‹ÝDŽî!G·£;ÈñNo×Ñíó98VG7O£utëôèÎqtã8ºoÝ6ŽîG7£{ÆÑ-ãèŽqtÃ8º_ÏÖÑÝÒ£›ÅÑ× Ý sÔ   LayerElementMaterialI ÃÓ   VersionIe ÙÓ   NameS Ô  MappingInformationTypeS AllSame?Ô   ReferenceInformationTypeS IndexToDirectfÔ   Materialsi  ìÕ   LayerI £Ô   VersionId Õ LayerElementäÔ   TypeS LayerElementNormal Õ   +TypedIndexI yÕ LayerElementPÕ   TypeS LayerElementMateriallÕ   +TypedIndexI ßÕ LayerElement¶Õ   TypeS LayerElementUVÒÕ   +TypedIndexI OÜ  ! GeometryLД* S + GeometryS Mesh±Ö  m Verticesd `  Û²ÿ¿ CÀ¼ C @  Û²ÿ? CÀ¼ C @  Û²ÿ¿ CÀ< C À  Û²ÿ? CÀ< C ÀíÖ   PolygonVertexIndexi    ýÿÿÿ×   Edgesi     =×   GeometryVersionI| Ø   LayerElementNormalI z×   VersionIe ×   NameS Á×   MappingInformationTypeS ByVerticeñ×  ReferenceInformationTypeS DirectrØ  m Normalsd ` ð? °< ð? °< ð? °< ð? °< ÚÙ   LayerElementUVI ¸Ø   VersionIe ÒØ  NameS map1 Ù   MappingInformationTypeS ByPolygonVertex@Ù   ReferenceInformationTypeS IndexToDirectœÙ  M UVd @ €,0ï? ð? €,0ï? ð?ÍÙ   UVIndexi     ÉÚ   LayerElementMaterialI Ú   VersionIe /Ú   NameS ^Ú  MappingInformationTypeS AllSame•Ú   ReferenceInformationTypeS IndexToDirect¼Ú   Materialsi  BÜ   LayerI ùÚ   VersionId cÛ LayerElement:Û   TypeS LayerElementNormalVÛ   +TypedIndexI ÏÛ LayerElement¦Û   TypeS LayerElementMaterialÂÛ   +TypedIndexI 5Ü LayerElement Ü   TypeS LayerElementUV(Ü   +TypedIndexI ¥â  ! GeometryLЪ* S + GeometryS MeshÝ  m Verticesd `  Û²ÿ¿ CÀ¼ C @  Û²ÿ? CÀ¼ C @  Û²ÿ¿ CÀ< C À  Û²ÿ? CÀ< C ÀCÝ   PolygonVertexIndexi    ýÿÿÿrÝ   Edgesi     “Ý   GeometryVersionI| ÕÞ   LayerElementNormalI ÐÝ   VersionIe æÝ   NameS Þ   MappingInformationTypeS ByVerticeGÞ  ReferenceInformationTypeS DirectÈÞ  m Normalsd ` ð? °< ð? °< ð? °< ð? °< 0à   LayerElementUVI ß   VersionIe (ß  NameS map1_ß   MappingInformationTypeS ByPolygonVertex–ß   ReferenceInformationTypeS IndexToDirectòß  M UVd @ €,0ï? ð? €,0ï? ð?#à   UVIndexi     á   LayerElementMaterialI oà   VersionIe …à   NameS ´à  MappingInformationTypeS AllSameëà   ReferenceInformationTypeS IndexToDirectá   Materialsi  ˜â   LayerI Oá   VersionId ¹á LayerElementá   TypeS LayerElementNormal¬á   +TypedIndexI %â LayerElementüá   TypeS LayerElementMaterialâ   +TypedIndexI ‹â LayerElementbâ   TypeS LayerElementUV~â   +TypedIndexI ûè  ! GeometryLЬ* S + GeometryS Mesh]ã  m Verticesd `  Û²ÿ¿ CÀ¼ C @  Û²ÿ? CÀ¼ C @  Û²ÿ¿ CÀ< C À  Û²ÿ? CÀ< C À™ã   PolygonVertexIndexi    ýÿÿÿÈã   Edgesi     éã   GeometryVersionI| +å   LayerElementNormalI &ä   VersionIe <ä   NameS mä   MappingInformationTypeS ByVerticeä  ReferenceInformationTypeS Directå  m Normalsd ` ð? °< ð? °< ð? °< ð? °< †æ   LayerElementUVI då   VersionIe ~å  NameS map1µå   MappingInformationTypeS ByPolygonVertexìå   ReferenceInformationTypeS IndexToDirectHæ  M UVd @ €,0ï? ð? €,0ï? ð?yæ   UVIndexi     uç   LayerElementMaterialI Åæ   VersionIe Ûæ   NameS +ç  MappingInformationTypeS AllSameAç   ReferenceInformationTypeS IndexToDirecthç   Materialsi  îè   LayerI ¥ç   VersionId è LayerElementæç   TypeS LayerElementNormalè   +TypedIndexI {è LayerElementRè   TypeS LayerElementMaterialnè   +TypedIndexI áè LayerElement¸è   TypeS LayerElementUVÔè   +TypedIndexI Qï  ! GeometryLИ* S + GeometryS Mesh³é  m Verticesd `  Û²ÿ¿ CÀ¼ C @  Û²ÿ? CÀ¼ C @  Û²ÿ¿ CÀ< C À  Û²ÿ? CÀ< C Àïé   PolygonVertexIndexi    ýÿÿÿê   Edgesi     ?ê   GeometryVersionI| ë   LayerElementNormalI |ê   VersionIe ’ê   NameS Ãê   MappingInformationTypeS ByVerticeóê  ReferenceInformationTypeS Directtë  m Normalsd ` ð? °< ð? °< ð? °< ð? °< Üì   LayerElementUVI ºë   VersionIe Ôë  NameS map1 ì   MappingInformationTypeS ByPolygonVertexBì   ReferenceInformationTypeS IndexToDirectžì  M UVd @ €,0ï? ð? €,0ï? ð?Ïì   UVIndexi     Ëí   LayerElementMaterialI í   VersionIe 1í   NameS `í  MappingInformationTypeS AllSame—í   ReferenceInformationTypeS IndexToDirect¾í   Materialsi  Dï   LayerI ûí   VersionId eî LayerElement<î   TypeS LayerElementNormalXî   +TypedIndexI Ñî LayerElement¨î   TypeS LayerElementMaterialÄî   +TypedIndexI 7ï LayerElementï   TypeS LayerElementUV*ï   +TypedIndexI §õ  ! GeometryLТ* S + GeometryS Mesh ð  m Verticesd `  Û²ÿ¿ CÀ¼ C @  Û²ÿ? CÀ¼ C @  Û²ÿ¿ CÀ< C À  Û²ÿ? CÀ< C ÀEð   PolygonVertexIndexi    ýÿÿÿtð   Edgesi     •ð   GeometryVersionI| ×ñ   LayerElementNormalI Òð   VersionIe èð   NameS ñ   MappingInformationTypeS ByVerticeIñ  ReferenceInformationTypeS DirectÊñ  m Normalsd ` ð? °< ð? °< ð? °< ð? °< 2ó   LayerElementUVI ò   VersionIe *ò  NameS map1aò   MappingInformationTypeS ByPolygonVertex˜ò   ReferenceInformationTypeS IndexToDirectôò  M UVd @ €,0ï? ð? €,0ï? ð?%ó   UVIndexi     !ô   LayerElementMaterialI qó   VersionIe ‡ó   NameS ¶ó  MappingInformationTypeS AllSameíó   ReferenceInformationTypeS IndexToDirectô   Materialsi  šõ   LayerI Qô   VersionId »ô LayerElement’ô   TypeS LayerElementNormal®ô   +TypedIndexI 'õ LayerElementþô   TypeS LayerElementMaterialõ   +TypedIndexI õ LayerElementdõ   TypeS LayerElementUV€õ   +TypedIndexI £û  . NodeAttributeLpŒž_ S persp1 NodeAttributeS Camera8ú Properties70Tö  > PS PositionS VectorS S AD D @D O}hb*@ ö  > PS UpVectorS VectorS S AD\3&¦¡¼D ð¿D ôö  F PS InterestPositionS VectorS S AD*i£ìcõñú•QüF^e¿iË^ß|„{öOÄGÞù _9NÄ5Ïd<ð›|˜gá}ì×~èWv]¾Ãòp}ã# +?ÑGø|wӌ y™>;N]óuáfåmܾð†û_¼óÑÉùÈ7_D,O\zý þ§/¿â×-®x2ðaýV¼›.pµLýôëóQ¸ø>;~mÓoŒÂy•>Â+óïcó®<">ò®ýÂq"®yã9Ÿ>Ò/¼uœÿ +þ¾Â›å~:ÜŸL~¢ø‰úóêÙûŸÅc?ñ3uÍ×}„íÿìÒ_á?~þ?Çøüwo#öÏ=ýöŠ÷s_ºã¸ÅoÆsÜú­x5]àjÒ/÷?û7ñwœüBŸ§~fžÈKì'¼0ÿqnó®<">òNýqß6NÄ5ÏùÙí¾ÈGúãùí>ÖsÏ~Íë—÷³[®¸?]|úHGúƒ>Â;yý„gꚯû×xçG—ß…þé­|ü¾–îü}ÅÛgÊ[¸Ž¸âÙxÀ»¾_Ôé¦ \Múíö…»â# +?ÓgÇ/núQx"¯ÒG¸êÍêÉ}„+ˆÿ ]¬ýyï6NÄ5Ïb<ðå#ýÂû˜n_¸ìõËû`uzüùGþî¿ÓG:V®Ÿ…ñ¯Äûn¾î#¾Æ;¿~ëŸ>¾{~ù/Œ£>þÜ«ˆåÕßøß½W8âÊÏùÖoŇéW“NúÔæSè#¼“_é#òýÄq"bòÏùô^L¸}þþ¾Â›ù/Æçu¿Ï™üqåìýìÔoŒÒ™ä©Ÿðºè®úf¹µï_8þþ'DΧóÛ_ô|…«NWþ0úMÎâϧ®¿ïzÐD£þÔïç;áƒüÁ:Þ¨_…wòš|¨ù¾>â{À>ÆsÔ¯¬D‡ôy_ä#ýbºÐ±úùþ¾;ny œO…gò}vœúIQ¾äíýt?5OÓG:Hmüð•}|š¯ê&ÆÓîÍÿ^ñòè ÿ Ž¸âÕxÀ‡õ[ñfºÀÕ0?8ïçyú¯ä¯n>Â3õ£ðN^f?ẅ>•GÄGÞóÓÛ8į¦ïã9ä3Œ\>âÏl÷Ñæ¿+^¿o¶<Àχû3ÈOò!¿KŸQú…¼Î~;N]Ì»ž/u4ÞòÉï9^¸ÞZ²®…OÎsˆÐžŒw²Ïëº7]àj;þÀ¶N×…ÏOlüNáõÖ…7òû ¯Ôm\¯ Wã9êWŽqͳ²îä#ýjy@'_¼sß·<€§Ãý)âÓGüBý̸ãäeöž©k¾î#–híO;>ÄçÒ›oú}ϯ_ñßáó©{ü÷ù +OÆÃøç7ý9Kx5]àjÂǹí9|ïGßBþñþÚ¦¯(.ÞåÍgÇ©[å£q1‘ð1žFé4Žqͳü~È¿›.p{þ¼†¿¯t²å¼îO#¿ÐGüBýÌ(¼’WåÃqUéÚs¸ûÆkëäíûe9 e>Ÿæg¶ycCí÷—¿÷ˆÐÙ›ñNø`ýÎà¬ÓÇÿŒk—þ'¾Gâ“õÖè£~ƒóh×|Ê •<Õ©ø¿CU>ºÀñ‘÷>_“W8NÄ5ÏÊyN>’¯¬{n}Âç_^È–ôQWˆjåãº>s? õ3£ø™ùdõã…J]óuñ×úuÿ ~O}—ï›óƒúÕ/ð¨~Gõ ¼³®ñ}v\ù,õèxP¿ÀÕÖú±ÑGú¨[ÇåCßʺZë×uTWKýê×uƒú^¨Ÿ•OT¿àGõ \mÎ_y™OÎCˆø¼ƒù×õƒù×ñ`þu}Σ>Òïœw£ðFÞ:ŸB§ó¯ûÚ5´ˆëGýÊq"žìº|+çEùì¸æÓeþõ|ToËü <š§~f”~a>ëü ¾Õõ¾ÿèý¿cY?ãúäús]?{¿`ý ÈËó&tõ×çSà¼&ê”àù|µˆëGýÊçMÄ:KŸÏ¥òÙq֛͛ûó/t5Ÿ®Ï¿À3ù‰>ÒÉzîU”/y{?â6ïú~ø>_GÊhóã}ßg‰ö¯Ïà>">cÿÄóö¯œÏ}"x ‰í_ßɯË~ðhÿÊ}ÅS?æ3‚ý+×–µðq}Ý¿r>ǹî_‰çqÙ¿Âçbºˆ6Î}ÿ +Ÿ›îÓaŸ)“¿î_í_ö¯Üï »ßgëƒ6õ»ÎõÚ öŸ=Ï`ÿ¸êº/ûÏÀ;ç-x éûÕìûu²Ïà# +ÝvÖOc?Ú¿(úì|»†V™—pðÑOu*<Úv}Ö‘|Ä/¼V‡ûþ3øYu¶ì?»ùëþ³ó©¯º–~´ÿ ~bþ{ýÖÝëùøÑùðèüxt~<:?9œ9œÎœœ9}Жó&ñýúr~„ÏÑùpï¬çGÎ×yÐr~¼Û~bZÎ9?.ýõüÈùÁùðèü¸Ú8¬¿&Ï5×ó_÷e]L~_²Ö…Áù¯çÃu¬|v~pþ»ò;}ÄïšO…7ò*}„Gç¿ëx#>®×ƒ~á8Ov]ú˜w¿œÿâsá}¬Ëù/ð¦õìrþ <“Ÿè#ýDý}^å}ÎⱟøÑù/ôÕæò>€ûïo ŸzayßÀq¾÷–÷7€¾W±ûp%züN~—ùÑûà7ò*ûá½Çõ^Åòþpµˆëëûø\9NÄ“}–~ôþø…÷q}xôþÆÊOô‘~ôþ†óÉËô¿ïo€lØÿ8Aû |çÿ¬7˜¤S2   PolygonVertexIndexi  ô xØsÔØ÷Gñ"UjÛ¶mÛvj»]µ­¶mÛ¶RÛ¶yk×®Ù}å9çžÏ½'ùçyÿ¾ÿ$à 3Ì0ÃÆøñý!Cøp1A|WóácÂø¶æb¢ø¦æ#ÄÄñuÍGŒIâ«š“Æ—59&‹/j>JLŸ×|`LŸÕ|Ô˜2>­ùh1U|RóÑcêø¸æcÄ4ñQÍÇŒiãÚÓÅ5;¦÷k>NÌïÕ|ܘ1Þ­¹ŸñâÚµÝÌñvÍm7K¼UsÛÍoÖÜv³Å5·ÝìñzÍm7G¼VsÛͯÖÜvsÅ+5·ÝÜñrÍm7O¼TsÛÍ/Ö|ª˜/^¨¹íæçkn»⹚ÛnÁx¶æ¶[(ž©¹íŽ§kn»Eâ©šÛnÑx²æ6›)ž¨]Û-×ÜvKÄc5·Ý’ñhÍm·T ®¹í–ŽGjn»eâášÛnÙx¨æ¶[.¬¹í–jn»âþšÛnŸ¯æ¶[)î­¹íVŽ{jn»UâîšÛnÕ¸«æ¶[-íV;jn»5âöšÛn͸­æ6[,n­]Û­·ÔÜvëÄÍ5·ÝºqSÍ—ŠõâÆšÛný¸¡æ¶Û ®¯¹í6Œëjn»âÚšÛn㸦æ¶Û$®®¹í6«jn»ÍâÊšÛnó¸¢æ¶Û".¯¹í¶ŒËjn»AqiÍm·U\RsÛm×ÜvÛÄE5·ÙZqaíÚn»¸ æ¶Û>ί¹ívˆójn»ãÜšÛn§8§æ¶Û9ή¹ív‰³jn»]ãÌšÛn·8£æ¶Û=N¯¹íöˆÓjn»=ãÔšÛn¯8¥æ¶Û;N®¹íö‰“j>(ökn»ýâ„šÛîq|Ím·Ws›mÇÖ®íŒcjn»ƒâèšÛîà8ªæ¶ûcYsÛý)Ž¨¹íþ‡×Üv‡Äa5·Ý¡¨¹í‹Cjn»ÃãÏ5·Ýñ§šÛîÈøcÍmwT\sÛÕÜvÇÄ5·Ý±q@Ímw\ì_ó¡Û¹5·Ý ±_Ímv@ì[»¶;)ö©¹íNŽ½kn»Sb¯šÛîÔسæ¶;-ö¨¹íNÝkn»3b·šgÆ®5·ÝY±KÍmwvì\sÛ;ÕÜvçÆŽ5·Ýy±CÍmw~l_sÛ]ÛÕÜvƶ5·ÝE±MÍ‹cëšÛî’تæ6;1Õ®í.‹-kn»Ëc‹šÛîŠØ¼æ¶»26«¹í®ŠMkn»«c“šÛîšØ¸æ¶»66ª¹í®‹ kn»ëcƒšÛî†X¿æ¶»1Ö«¹ínŠukn»›cšÛî–X»æ¶»5Öª¹ín‹5kn»ÛcšÛîŽX½æ6»4V«]ÛÝ«ÖÜvwÇ*5·Ý=±rÍmwo¬TsÛÝ+ÖÜv÷Ç +5·Ý±|Ím÷`,WsÛ=ËÖÜvÇ25·Ý#±tÍm78–ª¹í%kn»Çb‰šÛîñX¼æ¶{"«¹ížŒEkn»§b‘šÛîéX¸æ—ƱPíÚîÙX°æ¶{.¨¹ížùkn»b¾šÛîŘ·æ¶{)橹í^Ž¹kn»Wb®šÛîÕ˜³æ¶{-樹í^Ùk>8ÞˆÙjn»7cÖšÛî­˜¥æ¶{;f®¹íÞ‰™jn»wcÆšÛ¡æ¶{?¦¯¹Íž‰éj×vÆ´5·ÝG1MÍm÷qL]sÛ}SÕÜvŸÆ”5·Ýg1EÍm÷yL^sÛ}“ÕÜv_Ƥ5·ÝW1IÍm÷uL\sÛ}ÕÜvßÆ„5·Ýw1AÍm÷}Œ_sÛýãÕÜv?Ƹ5·ÝO1NÍm÷—»æ6û ƪ]Ûý-Ƭ¹íþcÔÜvÿˆÑkþIü3F«¹íþ£ÖÜvÿŽ5·Ýb”šÛîç¹æ¶û%Fª¹íþ#ÖÜv¿Æ5·Ýo1 æ¶û_ _sÛýÃÕÜvCbØšÛnè?Zkn»a‡íïü>d·Ýpõï5·Ýðõÿjn³¿Æoµk»úó_kn»ëÿÖÜv#Õ¿ÔÜv#×?×Üv£Ôÿ©ùÐíê×Üv£Öÿª¹íF«ÿYsÛ^ÿ£æ¶£þ{Ím7fý·šÛn¬ú¯5·ÝØõ_jn»qêŸjn»qëkn»ñ⇚Ûnüø¾æ¶› ¾«¹í&Œokn³Ýoj×vÇ×5·Ý$ñUÍm7i|YsÛM_ÔÜv“Çç5SÄg5·Ý”ñiÍm7U|RsÛM×ÜvÓÄG5·Ý´ñaÍm7]|PsÛMï×Üv3Ä{5·ÝŒñnÍm7S¼SsÛÍo×Üv³Ä[5·Ý¬ñfÍm6Q¼Q»¶›=^¯¹íæˆ×jn»9ãÕšÛn®x¥æ¶›;^®¹í扗jn»yãÅšÛn¾x¡æ¶›?ž¯¹íˆçjn»ãÙšÛn¡x¦æ¶[8ž®¹í‰§jn»EãÉšÛn±x¢æ¶[<¯¹í–ˆÇjn»%ãÑšÛl¶\»¶[:©¹í–‰‡kn»eã¡šÛn¹x°æ¶[>¨¹íVˆûkn»㾚Ûn¥¸·æ¶[9íV‰»kn»U㮚Ûnµ¸³æ¶[=íÖˆÛkn»5㶚Ûn­¸µæ¶[;n©¹íÖ‰›kn»u㦚Ûl©¸±vm·~ÜPsÛm××ÜvÆu5·ÝFqmÍm·q\SsÛmW×Üv›ÆU5·ÝfqeÍm·y\QsÛm—×Üv[Æe5·Ý ¸´æ¶Û*.©¹í¶Ž‹kn»m⢚ÛnÛ¸°æ¶Û..¨¹í¶ókn»⼚Ûl½8·vm·SœSsÛíg×Üv»ÄY5·Ý®qfÍm·[œQsÛí§×Üv{Äi5·ÝžqjÍm·WœRsÛí'×ÜvûÄI5·Ý¾qbÍm·_œPsÛý!Ž¯¹íöãjn»âØšÛîÀ8¦æ¶;(Ž®¹íŽ£jn³ãȺ3ôçˆ|¸LóỚèj>BWó»šÔÕ|ä®æ£t5ØÕ|Ô®æ£u5½«ù]ÍÇìj>VW󱻚ÓÕ|Ü®æ¡ÿ‡ÌýÞÞÊá¹ëp×á®÷Á]oƒ»Þw½ îzÜõ¸ëp×à®ïÏ]ßž»¾;w}sîúÞÜõ­¹ë;s×7æ®ß“ÿpàc–Ê6  e Edgesi   X x ×q( üÀq¼s^ÞÑh46ÆF£ÑØh´S¼QÅ¢(ŠEQ‹¢(Eb¹vÖ)¶»uŠÆE;‹E£Nso§hw‹EcöùãS¿¿==Oý¾Â×ø:Ÿò ¾É·ø6ßå{|Ÿð#~ÌOø)?çü’ J8‘DK<‰$“J:™d“K>…SJTQC 4ÑBtÑC 1ÂL1Ã,ópÍ-÷<¨ŸP‰$šXâI$™TÒÉ$›\ò)¤˜Rʨ Šêh ‰Úè ‹ú`ˆƘ`Šf™ç)‹,±ÂKVYg“mvÙã€#N8å-ç\òkn¹ç  ý„N$ÑÄO"ɤ’N&Ùä’O!Å”RFUÔPGM´ÐF]ôÐÇ CŒ0ÆSÌ0ˇó†3ÞqÁ¸â†;>¨Ÿˆ ŠâH ‰ÒÈ ‹~FE”ð˜r*©¦–zi¦•v:馗~æ·Œ3É4O˜cgh ‚ !Œ¢ˆá;$D +idEyPD )§’jj©§‘f~M;tÓK?ƒ 3Ê8“Ló„9xÆs–yÁ+¾`ƒ-vxÍ>‡ó†3ÞqÁ{®¸áŽºSÁ„ðDC $‘Bd‘CQÂcÊ©¤š_QO#Í´ÒN'ÝôÒÏ ÃŒ2Î$Ó7   NameS o7   MappingInformationTypeS ByVerticeŸ7  ReferenceInformationTypeS Direct$D  q Normalsdz  d xmZmÌ]E\"Q©-ˆ)Dd)‚‰!vHbøi btcÑØ"4òa]*"–Ïñ‡„f£„b éÝ ”Á–¯¦S—–ÒJ TˆF|fwæzzyß?Û;wvfž=÷tÏÙ]çœ?ðüU³saã¼#kã),oíõ£Ç†x:ìˆÀÓ!G¬ îÈ/7î¾úÀràõ%ê˜.ð°çêY+ÐJÿÂ;žløœî#úÑÎ÷‡vO~¾¡ëW˃~ÂÓ‘çäC~øv×ÍÑG9OÜoæ‘o&s)ñ[nê+§÷¬“y"ùéº>.Ñêæ)–:a×gÃgÌ·z糺“ÇÝ™>¾néú¨wˆ×Ã;oòz…¹Ìoõ6ê‡Þ¾µÕû·3žžVµcd­OóF[n<åà‘¸Û<³]—òòÌ®#þͧ<~¼nþÃàK§˜.ð´`ÚðΙ÷Bã/í>Ò¯ä»Wº§~¾‰úlƒð­ÌÃ~cþÍÌOáqaÏ¡\‘:õ†žÛQÌ·¨'²îD~0^í^Ô!~^ßDZ,œv"êuäûyó^m îÄ7ýö=ñH}Ô \¾•yûqŽ{µz‡úå£ÜÆý+wþ½éÿä¤í#Ó‹eÙ£hýªo®ž„/~°_Gk‡ü`¼Æ|Ù£CÜ™nÃwžp(|uÜS~p·²ûäçË»'?Q?ôÔOl¥zÑ_ý„ûÇzþdõâ{áåØ=–!‡Û3lløÝ·mÙGàCO uWOÿÇO¯ß´xÝ~ÓZà^|ãO{è‰!ß6/Çn»túý®ë‡‹Ù<|œ>ÔÉä»ÝGúúnI÷qä'ËäG+~>¸ë&úÈ׿yò%íú*óxßsGúŒù–c6r²î±>ÇÅO‘üø‘ýÎo>ÔÏ–xµ\h3q»§OQ«³ù²-ðq?ŽC n”t>°èäG=¾ýÒ_edm>ý´§Ð¦5×´ë^ˆ»Õ[×ݺüL¼¸?ë´§€»+»N9òñÍÀã·^¿ ×W:ñíMÝgN÷‰ÔIä'úˆÐqÏô¶’_ŸîyÔOx´Oá~Ú[ç#G r&ËÜò?XàÑê…^ÔÛpúdá¦Ût¾qé÷1®‰8êîé'ø‘>âc<Á¯lÅGàW´™:º™>¸;ý–;‘Ãþƒß +~øíÏÛ8Æ—Z3Bÿ]û÷¼ÄÓI¿îÿ¯Z ~"îþ¹»ŽaËAk€GâùG«¶B'üþÚÔÆ•¸wû¼ +Üoí>c_òýÉÝGúȾ|„§/tž|„{Ë~}wïæS•sÖ/ç¶ô)Äsúxåg•>N:VïlÓG¿–‹x1݆ÏxpÆ5V/ðhõ¢ë“_è3©è3ÖQõûM¿^ʟ蓈{ý=È‘®:þ5øÖ÷ôùrÑ}mž-Ǿeˆç­kê|kgòÝgß<^|_›‚tL¸ßwÆ5WO¼¾uÛö¦sI÷©¯ÓWümݧÏ–£éÐ'GŽæË~N|ËÜíê>žx<à‘SÛ¸“ˆ;Ë1Ûè•>Y¸å .Ÿ"Ür G?øŒù¦Ûø<²>•|Ô <ÒGü@~áx¦I}úD♼È~Ò©wù8]—Í_»¯å8ï?Í?ÝuõsÈÞ¿öY´õлÚï±ÜÙñôÁW_jß[‹¼•¸ŸuW»Oó^kŸî©“L|ÿ¹5Kp}ñrâ•í9Ý}¨ûäúŒu,GÓ¡øž<ù(›Öu3}„—ýþC|Ç<Þø­úDâ™uÊgÌ·àËGãƒüÀËôi—c\3Ç9€Ëg’è#\ã>n©#ž|”Sº‰>ùë!{Üßr¬Ù·ù»…+þõ¿ÃV·:µ-ïòuŸiý72Fݱ²“¿¿ãÎtþü†¥Ðü½ܽÑ}ÂýÝ·ÎèüHêKß…~¤~a›ö©m~˳zOŸ"ËÑôÍ-pèèO>åÐù‹‘+îì¹åãG›¾Ü«Nù0OÖ¸X?útiŽc~çåËàWé[ß}·]ßDŸNÆï {5ýÙ« ¾ÒOôÁ8 ã +¾çõÒ¸ôðñß±Ów»½ýšÏÄý[ˆãw6²Îø=ƒWÅçï¾ðþuö{nßë~Ü¿À§ºwãÓ'ÙýÜQ÷Íý‰{òt?âþßó¾Þ¿MZö'¾êŠüýêÖ•Y'ê…od]È=ôŽû±éó¾Òý«qˆ÷¯Æ 9Ð/Ñ'iœ¥¯–x$o|ß Ÿ¸“Ý¿M—÷oÌ¿À5ÿοÕþÿo|Îwš„O5ÿ6>çSÇù×Û¼ \ó¢æ_áabþ•~æ¼8ÿ:êh^Lì'¾æEÌG#óÿÄß$_óê?)çÄüåËùýÀ/ŸÈqοªmÔ<¯ñ$?ÒGùÇóîÄøkÜå£<ºÃù~á¼Qûÿyøü ÜñùÏ“-Ÿ=µ–Ï«xžÄçH|ªçg|ïùœZßÜ8~~®ççÌçOׯ2×O +ñÊu­£`ý|¬·Œ{°~ÖÁ;ú(ã¸}˜³JŸm&ž˜Gý¤/Ýáú3üâ_þÛÖ'÷’í_ Sì5þûG?ÅþQãÿÿh_Ô¨ï'ö¼|É/ܯ?Nì ŸÜ?’Žö¥´ä¨ý£v}é#ÃÃgxø Ÿ÷øæ3™õgxÊ>œ<¼¯Ë{|j¯¡âWŸ˜OÌ'æ/íW~|âcïO\ýãó‰×ö‰ùħޟ˜OÌ'®ùeâZ +/UÇçàøÄúá}]ƒÙŸ<ÛŸa>õ»nû3q>Å—m&^ùögø¸wýíÏ0ŸÆ[·ý™øm;ïáÓvÞÃ|êÏ'®ùÅ'®õ+<¼y>U°}æsÄó¹x_W~|jç_Û'æ/íW~|b>qõOÌ'^Û'¾µOÌ'æó‰—ö‰«N±îòŸƒ÷WçvÄã×`¼ËUó)ŸOÌ'^¶óžqø?nç=q>ÅùÄëvޓϧøi;ï‰ó)Î'®ù½Þ¸þ™b|ŽO\ýò|Ç•Ÿ¸‹Oìsð¾.?ïžç£O¼´O\ùÙŸøØ>1ŸøÒÏw¼¶O|ëý‰Oíó‰¯ý|Ç5¿øĵ”ëºôþŸ˜O\ùñ‰k°øÄ|bŸ‹÷5ŸÚ—ö‰«ŽOÌ'æ_Ú'^Û'¾µOÌ'æ_Û'®ùÅ'®õßËî{Ÿu]ú{æW<>q Ÿ˜OÌ'~™G¾võâþìxåßïÏf>åW}¿?­§}Š¯îÏŽßÜŸÍ|Ê_úû'æ×üâ×úS–žwùyó|þgb>qåÇ'>´OÌ'æ—Ÿœwl^x_W~|jçWÿøÄ—ö‰×ö‰oíó‰—ö‰ùÄUÇ'>t1ÏËvÞ3ïbç=ÌçÈwÞïûf;ïò_=GøÔ¿êøÄ|bóÄûšOí|b>ñº÷Ìï¶÷0ŸòùÄ|⚟óný1j^—ö98>ñÚÏ#\ùñ‰k°œw\ùñ‰ùÄ5¯øÄ|âšo~obëÀûšOí|âµ}â[ûħ~a>1Ÿ¸æŸ¸Ö/}NÊOλyÇ'^Û'®x|â,>qåÇ'æ_Û'®:¿ßñ²ÝŸ9Ç•ß=ß—ul÷¦û35ŸÆ[·û3ñÛv†OíSþ²ÝŸ‰óùßîÏÄï2ë=Hß3å'>Ç'æW~|b>1Ÿøä}Èî¹+^ó¼¿ÙÝ{â|b>±uâ}ͧv>1Ÿ˜O|õ>d›_ö§8Ÿ/ŸÓ>Ç'æó‰½?1ŸøÔ>qùÉyÇ|â¥÷'æó‰ùÄÖ‰÷5ŸÚùÄ|b>ñÒûº÷Ò>Ç'æW~ö'®árÞ1Ÿ˜O|mŸ˜O¼´O\ù¯ž#|Šó‰ùÄkŸw¼¯ùÔÎ'æ×ü²?q­?Å8—ö98>ñê÷Qß3•Ÿâ5X|âÊÏý‰ùÄ×ö‰ùÄKûÄ•ÿê9|ôûhwïÉç¯íßúþÄûšOí|âš_|âZŠ~å'÷çàøÄkûÄ•Ÿ¸‹O\ùñ‰ùÄå'çúþÄKûÄ•ŸøØ>ñÁ÷OïÝsÍkû”kŸ˜¼¯ù|ioŸ82ë¼òŸƒãó‰+?>q Ÿ˜O|êû—Ÿøćö‰—ö‰+?>1Ÿ¸ú¿z_<÷ú9²¶Où·ö‰ùÄ<á}]óËþÔ^>Îý~®Tä=ɇ“«é:ùøøøÉäÛÓÓÓäïóÉÿrr÷õäòýÍäÿ»ÉÕ?ß?Ÿçö\*þÃŒWÓëï)çóÏ3^ãÿ:¹ÆËÿwd°ûxÌx5åÿ7Äk=Ïx÷ïäá/^+Î_¸Æá/<ü…‡¿ðð'Î_¸Æã/<ü…‡?ýùç/\ãñ®Ïç/<ü…‡¿p}á¿ððþÞð}v‹kmR  w UVIndexi  j x-Õs´ççEá;¶'ÖĶ=±mOlÛÛöÄ6ë©m·I;µÝ¤nzžæܵÎúìwÿ¹ßµîÀÀÀÀ lîl®òàÜyêðlÞ:<4›¯Ëæ¯ÃóêðˆlÁ:<2[¨Ê®Ã£³Eêð˜lZÆá±Ù¢Ù´ò¸ÜÅ2ÏÏ8–qX»gÖûdÆaí>•qX»OgÖî3‡uúlÆa>—qX§ÏgÖé ‡uúbÆa¾”qX§/gÖé+‡µûjÆi¦Ý׳¯•uúFž}3ã°NßÊ8¬Ó·3ëôŒÃ:}7ã°NßË8¬Ó÷3ëôfÆaÞÊ8¬Ó2ëôÃŒÃ:ÍÉ8¬Ó²9e~œqX§ŸdÖ駇uúYÆaí~žqši÷Ëìe~U‡uúuÖé7uX§ßÖa~W‡uú}ÖéuX§?ÖaþT‡uúsÖé/uX§¿Öá9ÙÛ‡uz'ã°NË8¬Óß3ëôŒÃ:ý3ã°vÿÊ8Í´ûOöï²vÿ­ÃÚ½[‡µôžÃÚ Ê›ÃÚ sX»!ak74Ìa톅9¬Ýð0‡µæ°v#ÃÖiT˜Ã:sX§1aë46ÌaÆ…9¬Óø0‡ušæ°vÃœfÚMOÊ°vSÂÖnj˜Ã:Í•qX§¹3ë4OÆaæÍ8¬Ó|‡uš?ã°N dÖiÁŒÃ:-”qX§…3ë´HÆa¦eÖiÑŒÃ:-–qX§Å3ë´DÆaí–Ì8ÍtZ:[ª¬Ó2uX§eë°NËÕa–¯Ã:­P‡uZ±ë´RÖiå:¬Ó*uX§Uë°N«ÕaV¯Ã:­Q‡uZ³ë´VÖií:¬Ó:uX§uë°vëÕi¦ÝÙúeí6¬ÃÚmT‡µÛ¸k7½k·IÖnÓ:¬ÝfuX»Íë°v[Ôaí¶¬ÃÚmU‡µÛºk·MÖnÛ:¬ÝvuX»íë°v;Ôaív¬ÃÚíT§™v»d;—µÛµk·[Ön÷:¬ÝuX»=ë°v{Õaíö®ÃÚíS‡µÛ·k·_Önÿ:¬ÝuX»ë°vÕaífÔaí®ÃÚR‡µ;´kwXfÚ‘^ÖîÈ:¬ÝQuX»£ë°vÇÔa펭ÃÚW‡µ;¾kwBÖîÄ:¬ÝIuX»“ë°v§ÔaíN­ÃÚV‡µ;½kwFÖîÌ:¬ÝYuX»³ë4ÓîÜ윲vçÕaíίÃÚ]P‡µ»°k7³kwQÖîâ:¬Ý%uX»Kë°v—Õaí.¯ÃÚ]Q‡µ»²kwUÖîê:¬Ý5uX»kë°v×Õaí®¯Ëùÿß Áïý;¸1<$ì}Sxh®÷Íáa¹Þ·„‡çzß‘ë}[xd®÷íáQ¹Þw„Gçzß“ë}Wxl®÷Ýáq¹Þ÷„Ççzßžë}_xb®÷ýáI¹Þ„'çzÏ +OÉõ~0<5×û¡°oÄ·òp¯ïä‘Ìõ<Úëûx,s}÷ú.žÈ\ßÄ“½¾‡§2×·ðt¯ïà™Ìõ <Ûë÷.sýöÏ÷úÝ_È\¿ù‹½~ï—2×oýr¯ßù•Ìõ¿Úë÷}-û§—] iS   LayerElementMaterialI ¹R   VersionIe ÏR   NameS þR  MappingInformationTypeS AllSame5S   ReferenceInformationTypeS IndexToDirect\S   Materialsi  âT   LayerI ™S   VersionId T LayerElementÚS   TypeS LayerElementNormalöS   +TypedIndexI oT LayerElementFT   TypeS LayerElementMaterialbT   +TypedIndexI ÕT LayerElement¬T   TypeS LayerElementUVÈT   +TypedIndexI S]  ! GeometryLÐÂ* S + GeometryS Mesh¿U  … Verticesd x àúœ> Éù¿ É À É À Éù¿ `§´’¾ `§´‚¾ Éù¿ É @ É @ Éù¿ Éù? +V  M PolygonVertexIndexi @   þÿÿÿ  ûÿÿÿ  ûÿÿÿ  ûÿÿÿ ûÿÿÿjV  - Edgesi       ‹V   GeometryVersionI| óX   LayerElementNormalI ÈV   VersionIe ÞV   NameS W   MappingInformationTypeS ByPolygonVertexEW  ReferenceInformationTypeS DirectæX   Normalsd0 € àÿÿï¿ @Ä.Y> àÿÿï¿ @Ä.Y> ð¿ Ä.Y> ð¿ Ä.Y> §yâ¿ @§yâ? `§yâ¿ §yâ¿ @§yâ? `§yâ¿ §yâ¿ @§yâ? `§yâ¿ @§yâ¿ @§yâ? §yâ? @§yâ¿ @§yâ? §yâ? @§yâ¿ @§yâ? §yâ? @§yâ? §yâ? @§yâ? @§yâ? §yâ? @§yâ? @§yâ? §yâ? @§yâ? @§yâ? `§yâ? §yâ¿ @§yâ? `§yâ? §yâ¿ @§yâ? €§yâ? §yâ¿ ÞZ   LayerElementUVI ,Y   VersionIe FY  NameS map1}Y   MappingInformationTypeS ByPolygonVertex´Y   ReferenceInformationTypeS IndexToDirectpZ  ­ UVd   à? Ð? àÿÿÏ? à? à? è? Ð? Ð? à? Ø? à? à? à? ä? à? è? à? à? ð?ÑZ  M UVIndexi @            Í[   LayerElementMaterialI [   VersionIe 3[   NameS b[  MappingInformationTypeS AllSame™[   ReferenceInformationTypeS IndexToDirectÀ[   Materialsi  F]   LayerI ý[   VersionId g\ LayerElement>\   TypeS LayerElementNormalZ\   +TypedIndexI Ó\ LayerElementª\   TypeS LayerElementMaterialÆ\   +TypedIndexI 9] LayerElement]   TypeS LayerElementUV,]   +TypedIndexI ^  & NodeAttributeL $ƒ S NodeAttributeS Nullè] Properties70Û]  ! PS LookS enumS S I ^  TypeFlagsS Null u`  $ ModelL0öq* S pCube1 ModelS Meshc^   VersionIè /` Properties70µ^  + PS RotationActiveS boolS S I ë^  ( PS InheritTypeS enumS S I @_  G PS + ScalingMaxS Vector3DS VectorS D D D †_  8 PS DefaultAttributeIndexS intS IntegerS I ã_  O PS Lcl TranslationS Lcl TranslationS S A+DF  e:׿D +t%ˆ±@D`ð¾d¯Mþ?"`  1 PS currentUVSetS KStringS S US map1 E`   ShadingCTh`   CullingS + CullingOff Ùb  ( ModelL@ÿq* S pCylinder1 ModelS MeshÈ`   VersionIè “b Properties70a  + PS RotationActiveS boolS S I Pa  ( PS InheritTypeS enumS S I ¥a  G PS + ScalingMaxS Vector3DS VectorS D D D ëa  8 PS DefaultAttributeIndexS intS IntegerS I Gb  N PS Lcl TranslationS Lcl TranslationS S ADÜÿ¨}@D m¥æ\& @DØE‘…¾@†b  1 PS currentUVSetS KStringS S US map1 ©b   ShadingCTÌb   CullingS + CullingOff äe  % ModelLPr* S pPlane1 ModelS Mesh)c   VersionIè že Properties70{c  + PS RotationActiveS boolS S I ±c  ( PS InheritTypeS enumS S I d  G PS + ScalingMaxS Vector3DS VectorS D D D Ld  8 PS DefaultAttributeIndexS intS IntegerS I ¨d  N PS Lcl TranslationS Lcl TranslationS S AD D DÓF¥û1!@þd  H PS Lcl RotationS Lcl RotationS S AD €V@D D Re  F PS Lcl ScalingS Lcl ScalingS S ADøôO^z @DøôO^z @DøôO^z @‘e  1 PS currentUVSetS KStringS S US map1 ´e   ShadingCT×e   CullingS + CullingOff ïh  % ModelL`r* S pPlane2 ModelS Mesh4f   VersionIè ©h Properties70†f  + PS RotationActiveS boolS S I ¼f  ( PS InheritTypeS enumS S I g  G PS + ScalingMaxS Vector3DS VectorS D D D Wg  8 PS DefaultAttributeIndexS intS IntegerS I ³g  N PS Lcl TranslationS Lcl TranslationS S AD D D3â؈©"@ h  H PS Lcl RotationS Lcl RotationS S AD €V@D D ]h  F PS Lcl ScalingS Lcl ScalingS S ADøôO^z @DøôO^z @DøôO^z @œh  1 PS currentUVSetS KStringS S US map1 ¿h   ShadingCTâh   CullingS + CullingOff úk  % ModelLpr* S pPlane3 ModelS Mesh?i   VersionIè ´k Properties70‘i  + PS RotationActiveS boolS S I Çi  ( PS InheritTypeS enumS S I j  G PS + ScalingMaxS Vector3DS VectorS D D D bj  8 PS DefaultAttributeIndexS intS IntegerS I ¾j  N PS Lcl TranslationS Lcl TranslationS S AD D D™ç` $@k  H PS Lcl RotationS Lcl RotationS S AD €V@D D hk  F PS Lcl ScalingS Lcl ScalingS S ADøôO^z @DøôO^z @DøôO^z @§k  1 PS currentUVSetS KStringS S US map1 Êk   ShadingCTík   CullingS + CullingOff o  % ModelL€#r* S pPlane4 ModelS MeshJl   VersionIè ¿n Properties70œl  + PS RotationActiveS boolS S I Òl  ( PS InheritTypeS enumS S I 'm  G PS + ScalingMaxS Vector3DS VectorS D D D mm  8 PS DefaultAttributeIndexS intS IntegerS I Ém  N PS Lcl TranslationS Lcl TranslationS S AD D D0«&öyP&@n  H PS Lcl RotationS Lcl RotationS S AD €V@D D sn  F PS Lcl ScalingS Lcl ScalingS S ADøôO^z @DøôO^z @DøôO^z @²n  1 PS currentUVSetS KStringS S US map1 Õn   ShadingCTøn   CullingS + CullingOff r  % ModelL,r* S pPlane5 ModelS MeshUo   VersionIè Êq Properties70§o  + PS RotationActiveS boolS S I Ýo  ( PS InheritTypeS enumS S I 2p  G PS + ScalingMaxS Vector3DS VectorS D D D xp  8 PS DefaultAttributeIndexS intS IntegerS I Ôp  N PS Lcl TranslationS Lcl TranslationS S AD D Dhܲ ™%@*q  H PS Lcl RotationS Lcl RotationS S AD €V@D D ~q  F PS Lcl ScalingS Lcl ScalingS S ADøôO^z @DøôO^z @DøôO^z @½q  1 PS currentUVSetS KStringS S US map1 àq   ShadingCTr   CullingS + CullingOff àt  & ModelL 5r* S persp1 ModelS Cameraar   VersionIè št Properties70Ñr  I PS PostRotationS Vector3DS VectorS D D €VÀD +s  + PS RotationActiveS boolS S I @s  ( PS InheritTypeS enumS S I •s  G PS + ScalingMaxS Vector3DS VectorS D D D Ûs  8 PS DefaultAttributeIndexS intS IntegerS I 7t  N PS Lcl TranslationS Lcl TranslationS S AD D @D O}hb*@t  H PS Lcl RotationS Lcl RotationS S AD D €f@D €f@ °t   ShadingCYÓt   CullingS + CullingOff kx  0 ModelL°>r* S directionalLight1 ModelS Light;u   VersionIè %x Properties70­u  K PS RotationOffsetS Vector3DS VectorS D’™h 3ÚÄZÀD»!ïR/@D ’_Jú?³‰  1 PS currentUVSetS KStringS S US map1 Ö‰   ShadingCTù‰   CullingS + CullingOff iŒ  ' ModelLpÜ* S pPyramid1 ModelS MeshXŠ   VersionIè #Œ Properties70ªŠ  + PS RotationActiveS boolS S I àŠ  ( PS InheritTypeS enumS S I 5‹  G PS + ScalingMaxS Vector3DS VectorS D D D {‹  8 PS DefaultAttributeIndexS intS IntegerS I ׋  N PS Lcl TranslationS Lcl TranslationS S AD4xªK‡Ã)ÀD?âfœú@DÌå"ó +@Œ  1 PS currentUVSetS KStringS S US map1 9Œ   ShadingCT\Œ   CullingS + CullingOff 2Ž  ( ModelL€"Ü* S transform1 ModelS Null¼Œ   VersionIè ì Properties70  + PS RotationActiveS boolS S I D  ( PS InheritTypeS enumS S I ™  G PS + ScalingMaxS Vector3DS VectorS D D D ß  8 PS DefaultAttributeIndexS intS IntegerS I Ž   ShadingCY%Ž   CullingS + CullingOff º’  * MaterialLH„ S normalMapTest MaterialS ŠŽ   VersionIf ­Ž  + ShadingModelS phongÉŽ   +MultiLayerI ­’ Properties701  A PS AmbientColorS ColorS S AD D D €  A PS DiffuseColorS ColorS S AD à?D à?D à?¿  1 PS DiffuseFactorS NumberS S AD  ™™é?  6 PS TransparencyFactorS NumberS S AD ð?S  B PS SpecularColorS ColorS S AD à?D à?D à?•  4 PS ReflectionFactorS NumberS S AD à?è  E PS EmissiveS Vector3DS VectorS D D D :‘  D PS AmbientS Vector3DS VectorS D D D Œ‘  D PS DiffuseS Vector3DS VectorS D  ™™Ù?D  ™™Ù?D  ™™Ù?ß‘  E PS SpecularS Vector3DS VectorS D à?D à?D à?’  2 PS ShininessS doubleS NumberS D 4@]’  0 PS OpacityS doubleS NumberS D ð? ’  5 PS ReflectivityS doubleS NumberS D ו  % MaterialLð{”ƒ S lambert1 MaterialS “   VersionIf 2“  ShadingModelS lambertN“   +MultiLayerI Ê• Properties70¶“  A PS AmbientColorS ColorS S AD D D ”  A PS DiffuseColorS ColorS S AD à?D à?D à?D”  1 PS DiffuseFactorS NumberS S AD  ™™é?ˆ”  6 PS TransparencyFactorS NumberS S AD ð?Û”  E PS EmissiveS Vector3DS VectorS D D D -•  D PS AmbientS Vector3DS VectorS D D D •  D PS DiffuseS Vector3DS VectorS D  ™™Ù?D  ™™Ù?D  ™™Ù?½•  0 PS OpacityS doubleS NumberS D ð? óš  ( MaterialLp„ S transparent MaterialS -–   VersionIf P–  + ShadingModelS phongl–   +MultiLayerI æš Properties70Ô–  A PS AmbientColorS ColorS S AD D D #—  A PS DiffuseColorS ColorS S AD à?D à?D à?b—  1 PS DiffuseFactorS NumberS S AD  ©?µ—  E PS TransparentColorS ColorS S AD ÷*è?D ÷*è?D ÷*è?ù—  6 PS TransparencyFactorS NumberS S AD ð?I˜  B PS SpecularColorS ColorS S AD à?D à?D à?Œ˜  5 PS ShininessExponentS NumberS S AD§|ªF?@Θ  4 PS ReflectionFactorS NumberS S AD à?!™  E PS EmissiveS Vector3DS VectorS D D D s™  D PS AmbientS Vector3DS VectorS D D D Å™  D PS DiffuseS Vector3DS VectorS D  ™?D  ™?D  ™?š  E PS SpecularS Vector3DS VectorS D à?D à?D à?Xš  2 PS ShininessS doubleS NumberS D§|ªF?@–š  0 PS OpacityS doubleS NumberS D $TÏ?Ùš  5 PS ReflectivityS doubleS NumberS D    ' MaterialLÐD„ S glasGreen1 MaterialS H›   VersionIf k›  + ShadingModelS phong‡›   +MultiLayerI   Properties70ï›  A PS AmbientColorS ColorS S AD D D >œ  A PS DiffuseColorS ColorS S AD D D }œ  1 PS DiffuseFactorS NumberS S AD  ™™é?Ðœ  E PS TransparentColorS ColorS S AD D ð?D   6 PS TransparencyFactorS NumberS S AD ð?d  B PS SpecularColorS ColorS S AD à?D à?D à?§  5 PS ShininessExponentS NumberS S AD§|ªF?@é  4 PS ReflectionFactorS NumberS S AD à?<ž  E PS EmissiveS Vector3DS VectorS D D D Žž  D PS AmbientS Vector3DS VectorS D D D àž  D PS DiffuseS Vector3DS VectorS D D D 3Ÿ  E PS SpecularS Vector3DS VectorS D à?D à?D à?sŸ  2 PS ShininessS doubleS NumberS D§|ªF?@±Ÿ  0 PS OpacityS doubleS NumberS DVUUUUUå?ôŸ  5 PS ReflectivityS doubleS NumberS D &¥  $ MaterialLPL„ S glasRed MaterialS `    VersionIf ƒ   + ShadingModelS phongŸ    +MultiLayerI ¥ Properties70¡  A PS AmbientColorS ColorS S AD D D V¡  A PS DiffuseColorS ColorS S AD D D •¡  1 PS DiffuseFactorS NumberS S AD  ™™é?è¡  E PS TransparentColorS ColorS S AD ð?D D ,¢  6 PS TransparencyFactorS NumberS S AD ð?|¢  B PS SpecularColorS ColorS S AD à?D à?D à?¿¢  5 PS ShininessExponentS NumberS S AD§|ªF?@£  4 PS ReflectionFactorS NumberS S AD à?T£  E PS EmissiveS Vector3DS VectorS D D D ¦£  D PS AmbientS Vector3DS VectorS D D D ø£  D PS DiffuseS Vector3DS VectorS D D D K¤  E PS SpecularS Vector3DS VectorS D à?D à?D à?‹¤  2 PS ShininessS doubleS NumberS D§|ªF?@ɤ  0 PS OpacityS doubleS NumberS DVUUUUUå? ¥  5 PS ReflectivityS doubleS NumberS D î©  ' MaterialL0N„ S glaseBlack MaterialS {¥   VersionIf ž¥  + ShadingModelS phongº¥   +MultiLayerI á© Properties70"¦  A PS AmbientColorS ColorS S AD D D q¦  A PS DiffuseColorS ColorS S AD D D °¦  1 PS DiffuseFactorS NumberS S AD  ™™é?ô¦  6 PS TransparencyFactorS NumberS S AD ð?D§  B PS SpecularColorS ColorS S AD à?D à?D à?‡§  5 PS ShininessExponentS NumberS S AD§|ªF?@ɧ  4 PS ReflectionFactorS NumberS S AD à?¨  E PS EmissiveS Vector3DS VectorS D D D n¨  D PS AmbientS Vector3DS VectorS D D D À¨  D PS DiffuseS Vector3DS VectorS D D D ©  E PS SpecularS Vector3DS VectorS D à?D à?D à?S©  2 PS ShininessS doubleS NumberS D§|ªF?@‘©  0 PS OpacityS doubleS NumberS D ð?Ô©  5 PS ReflectivityS doubleS NumberS D ¯  % MaterialLP„ S glasBlue MaterialS Aª   VersionIf dª  + ShadingModelS phong€ª   +MultiLayerI ú® Properties70èª  A PS AmbientColorS ColorS S AD D D 7«  A PS DiffuseColorS ColorS S AD D D v«  1 PS DiffuseFactorS NumberS S AD  ™™é?É«  E PS TransparentColorS ColorS S AD D D ð? ¬  6 PS TransparencyFactorS NumberS S AD ð?]¬  B PS SpecularColorS ColorS S AD à?D à?D à? ¬  5 PS ShininessExponentS NumberS S AD§|ªF?@⬠ 4 PS ReflectionFactorS NumberS S AD à?5­  E PS EmissiveS Vector3DS VectorS D D D ‡­  D PS AmbientS Vector3DS VectorS D D D Ù­  D PS DiffuseS Vector3DS VectorS D D D ,®  E PS SpecularS Vector3DS VectorS D à?D à?D à?l®  2 PS ShininessS doubleS NumberS D§|ªF?@ª®  0 PS OpacityS doubleS NumberS DVUUUUUå?í®  5 PS ReflectivityS doubleS NumberS D <°  ) MaterialL …` S emissiveTest MaterialS ^¯   VersionIf ƒ¯  ShadingModelS unknownŸ¯   +MultiLayerI /° Properties70æ¯  PS MayaS CompoundS S "°  . PS Maya|TypeIdS intS IntegerS IÀÊ µ  ) MaterialLðQ„ S specularTest MaterialS “°   VersionIf ¶°  + ShadingModelS phongÒ°   +MultiLayerI ù´ Properties70:±  A PS AmbientColorS ColorS S AD D D ‰±  A PS DiffuseColorS ColorS S AD D D ȱ  1 PS DiffuseFactorS NumberS S AD  ™™é? ²  6 PS TransparencyFactorS NumberS S AD ð?\²  B PS SpecularColorS ColorS S AD "Ãí?D "Ãí?D "Ãí?Ÿ²  5 PS ShininessExponentS NumberS S AD§|ªF?@á²  4 PS ReflectionFactorS NumberS S AD àÖøë?4³  E PS EmissiveS Vector3DS VectorS D D D †³  D PS AmbientS Vector3DS VectorS D D D س  D PS DiffuseS Vector3DS VectorS D D D +´  E PS SpecularS Vector3DS VectorS D "Ãí?D "Ãí?D "Ãí?k´  2 PS ShininessS doubleS NumberS D§|ªF?@©´  0 PS OpacityS doubleS NumberS D ð?ì´  5 PS ReflectivityS doubleS NumberS D ü¶  # VideoLÀ˜ƒ S file2 VideoS ClipUµ  TypeS Clip¶ Properties70¶  ‡ PS PathS KStringS XRefUrlS S\ C:/Users/Destranix/Documents/maya/projects/Test/images/Tardis_Displacement/Wood_007_ROUGH.tx +¶   UseMipMapI ¡¶  a FilenameS\ C:/Users/Destranix/Documents/maya/projects/Test/images/Tardis_Displacement/Wood_007_ROUGH.txï¶  1 RelativeFilenameS, resources\textures\Tardis_Displacement\Wood_007_ROUGH.tx º  ! TextureL#„ S file2 TextureS W·   TypeS TextureVideoClipp·   VersionIÊ ›·   TextureNameS file2 Texturep¸ Properties70ö·  4 PS CurrentTextureBlendModeS enumS S I -¸  ) PS UVSetS KStringS S S map1c¸  ( PS UseMaterialS boolS S I “¸   MediaS file2 Video ¹  a FileNameS\ C:/Users/Destranix/Documents/maya/projects/Test/images/Tardis_Displacement/Wood_007_ROUGH.txW¹  1 RelativeFilenameS, resources\textures\Tardis_Displacement\Wood_007_ROUGH.txˆ¹   ModelUVTranslationD D µ¹   ModelUVScalingD ð?D ð?ß¹  Texture_Alpha_SourceS Noneº   CroppingI I I I Î  > ImplementationL´v* S+ emissiveTest_Implementation ImplementationS ‡º   VersionId Î Properties70ߺ  1 PS ShaderLanguageS KStringS S S SFX$»  7 PS ShaderLanguageVersionS KStringS S S 28[»  ) PS RenderAPIS KStringS S S œ»  3 PS RootBindingNameS KStringS S S rootøÍ  ( PS ShaderGraphS BlobS S Iý ëÍ   +BinaryDataRý SFX_WIN +Version=28 +GroupVersion=-1.000000 +Advanced=0 +HelpID=0 +ParentMaterial=0 +NumberOfNodes=5 +#NT=10100 1 Hw Material Base-Hw Shader Nodes-Core + PC=35 + name=1 v=5000 _Material + version=1 v=2003 1.842000 + posx=1 v=2003 10.000000 + posy=1 v=2003 10.000000 + classname=1 v=5000 Hw Material Base + submenuname=1 v=5000 Core + bitmapnodeindex=1 v=2002 10 + isadvanced=1 v=2001 1 + advanceddelete=1 v=2001 1 + helpid=1 v=2002 73 + grpnodecolor=1 v=5012 4 + grpPosX=1 v=2003 -1129.380005 + grpPosY=1 v=2003 -143.923004 + disableconsolidation_HwShader=2 e=1 v=2001 0 + value_ClampDynamicLights=2 e=1 v=2002 99 + value_MaxNumberLights=2 e=1 v=2002 3 + value_Gamma=2 e=2 v=2001 0 + value_Wireframe=2 e=3 v=2001 0 + value_DepthTest=2 e=4 v=2001 1 + value_DepthWrite=2 e=4 v=2001 1 + value_CastShadow=2 e=5 v=2001 1 + value_SurfaceMaskCutoff=2 e=6 v=2003 0.000000 + value_SSAO=2 e=7 v=2001 1 + options_Tessellation=2 e=900 v=5012 0 + value_FlatTessellationBlend=2 e=901 v=2003 0.000000 + value_BoundingBoxMultiplier=2 e=902 v=2003 1.000000 + value_ClippingBiasAdd=2 e=902 v=2003 5.000000 + options_Displacement=2 e=1000 v=5012 1 + options_VDM_CoordSys=2 e=1001 v=5012 1 + value_DisplacementMultiplier=2 e=1002 v=2003 1.000000 + value_DisplacementOffset=2 e=1003 v=2003 0.000000 + cgfxprofile_HwShader=2 e=1999 v=5012 0 + config_HwShader=2 e=2000 v=5012 1 + shadername_HwShader=2 e=2001 v=5000 + saveshadertodisk_HwShader=2 e=2002 v=5015 + group=-1 + ISC=9 + SVT=2002 2002 0 0 0 _NumberOfLights + SVT=5001 3002 0 0 0 _ObjectVertexPosition + SVT=5001 2003 0 0 0 + SVT=5001 3002 0 0 0 _Displacement + SVT=5001 5018 0 0 0 _SurfaceShader + SVT=5001 2003 0 0 0 _SurfaceMask + SVT=5001 2003 0 0 0 _SurfaceMaskCutoff + SVT=2001 2001 0 0 0 _Gamma + SVT=1001 1002 0 0 0 + OSC=0 +#NT=10100 1 Traditional Game Surface Shader-Hw Shader Nodes-Surface Shaders + PC=26 + name=1 v=5000 TraditionalGameSurfaceShader + version=1 v=2003 1.481000 + posx=1 v=2003 -200.000000 + posy=1 v=2003 10.000000 + previewswatch=1 v=2002 2 + classname=1 v=5000 Traditional Game Surface Shader + submenuname=1 v=5000 Surface Shaders + bitmapnodeindex=1 v=2002 10 + isadvanced=1 v=2001 1 + advanceddelete=1 v=2001 1 + helpid=1 v=2002 74 + grpnodecolor=1 v=5012 4 + grpPosX=1 v=2003 -990.607971 + grpPosY=1 v=2003 169.649994 + options_Diffuse=2 e=1 v=5012 0 + options_Specular=2 e=1 v=5012 0 + value_FlipBackFaces=2 e=1 v=2001 1 + value_TranslucencyDistortion=2 e=1100 v=2003 0.200000 + value_TranslucencyPower=2 e=1101 v=2003 3.000000 + value_TranslucencyMinimum=2 e=1102 v=2003 0.000000 + color_TranslucencyOuter=2 e=1104 v=3003 1.000000,0.640000,0.250000,1.000000 + color_TranslucencyMedium=2 e=1105 v=3003 1.000000,0.210000,0.140000,1.000000 + color_TranslucencyInner=2 e=1106 v=3003 0.250000,0.050000,0.020000,1.000000 + value_UseStreamLightData=2 e=1500 v=2001 0 + value_BakedLightColorSet=2 e=1502 v=5000 BakedLightColorSet + value_BakedLightColorSetUnshared=2 e=1503 v=2001 1 + group=-1 + ISC=17 + SVT=5001 2003 0 0 0 _Opacity + SVT=5001 3002 0 0 0 _Emissive + SVT=5001 2003 0 0 0 _AmbientOcclusion + SVT=5001 3002 0 0 0 _DiffuseColor + SVT=5001 2003 0 0 0 _SpecularPower + SVT=5001 3002 0 0 0 _SpecularColor + SVT=5001 3002 0 0 0 _Reflection + SVT=5001 2003 0 0 0 _ReflectionIntensity + SVT=5001 3002 0 0 0 _Normal + SVT=5001 3002 0 0 0 _ObjectThickness + SVT=5001 2003 0 0 0 _BlendedNormal + SVT=5001 2003 0 0 0 _BlendedNormalMask + SVT=5001 3002 0 0 0 _AnisotropicDirection + SVT=5001 3001 0 0 0 _AnisotropicSpread + SVT=5001 3002 0 0 0 _IBL + SVT=5001 2003 0 0 0 _Weight + SVT=1001 1002 0 0 0 + OSC=2 + SVT=5001 5018 0 _SurfaceShader + CC=1 + C=1 0 0 0 4 0 0 + CPC=0 + SVT=1001 1002 0 + CC=0 +#NT=20011 0 + PC=3 + posx=1 v=2003 -567.500000 + posy=1 v=2003 135.000000 + color=2 e=0 v=3003 0.159091,0.159091,0.159091,1.000000 + group=-1 + ISC=0 + OSC=6 + SVT=5001 3003 1 + CC=0 + SVT=5001 3002 2 + CC=1 + C=2 1 2 1 3 0 0 + CPC=0 + SVT=5001 2003 3 + CC=0 + SVT=5001 2003 4 + CC=0 + SVT=5001 2003 5 + CC=0 + SVT=5001 2003 6 + CC=0 +#NT=20011 0 + PC=3 + posx=1 v=2003 -490.500000 + posy=1 v=2003 -45.000000 + color=2 e=0 v=3003 0.462700,0.000000,0.839200,1.000000 + group=-1 + ISC=0 + OSC=6 + SVT=5001 3003 1 + CC=0 + SVT=5001 3002 2 + CC=1 + C=3 1 2 1 1 0 0 + CPC=0 + SVT=5001 2003 3 + CC=0 + SVT=5001 2003 4 + CC=0 + SVT=5001 2003 5 + CC=0 + SVT=5001 2003 6 + CC=0 +#NT=20011 0 + PC=3 + posx=1 v=2003 -537.305542 + posy=1 v=2003 315.972229 + color=2 e=0 v=3003 0.164773,0.164773,0.164773,1.000000 + group=-1 + ISC=0 + OSC=6 + SVT=5001 3003 1 + CC=0 + SVT=5001 3002 2 + CC=1 + C=4 1 2 1 5 0 0 + CPC=0 + SVT=5001 2003 3 + CC=0 + SVT=5001 2003 4 + CC=0 + SVT=5001 2003 5 + CC=0 + SVT=5001 2003 6 + CC=0 + Ï  ' BindingTableL0»˜– S root 1 BindingTableS kÎ   VersionId Ï Properties70ÀÎ  . PS + TargetNameS KStringS S S rootþÎ  0 PS + TargetTypeS KStringS S S shader ŠÐ  & AnimationStackL°B† S Take 001 AnimStackS }Ð Properties70°Ï  0 PS + LocalStartS KTimeS TimeS LR^´r íÏ  / PS LocalStopS KTimeS TimeS Lp6ŒÄ5 /Ð  4 PS ReferenceStartS KTimeS TimeS LR^´r pÐ  3 PS ReferenceStopS KTimeS TimeS Lp6ŒÄ5 ÙÐ  ' AnimationLayerLp k* S BaseLayer AnimLayerS ™Ñ  , AnimationCurveNodeL0C† S Visibility AnimCurveNodeS ŒÑ Properties70Ñ  4 PS d|VisibilityS + VisibilityS S AD ð? ­Ò  # AnimationCurveNodeL úB† S T AnimCurveNodeS  Ò Properties70)Ò  ' PS d|XS NumberS S ADF  e:׿^Ò  ' PS d|YS NumberS S AD +t%ˆ±@“Ò  ' PS d|ZS NumberS S AD`ð¾d¯Mþ? ÁÓ  # AnimationCurveNodeL€ÌB† S S AnimCurveNodeS ´Ó Properties70=Ó  ' PS d|XS NumberS S AD ð?rÓ  ' PS d|YS NumberS S AD ð?§Ó  ' PS d|ZS NumberS S AD ð? ÕÔ  # AnimationCurveNodeL`ªB† S R AnimCurveNodeS ÈÔ Properties70QÔ  ' PS d|XS NumberS S AD †Ô  ' PS d|YS NumberS S AD »Ô  ' PS d|ZS NumberS S AD 5Ö   AnimationCurveLà` S AnimCurveS +Õ  DefaultD CÕ   KeyVerI© lÕ   KeyTimel  R^´r —Õ   KeyValueFloatf  €?ÁÕ   KeyAttrFlagsi   ûÕ   KeyAttrDataFloatf    (Ö   KeyAttrRefCounti   •×   AnimationCurveLà†` S AnimCurveS ‹Ö  DefaultD £Ö   KeyVerI© ÌÖ   KeyTimel  R^´r ÷Ö   KeyValueFloatf  -Ó¹¾!×   KeyAttrFlagsi  a [×   KeyAttrDataFloatf    ˆ×   KeyAttrRefCounti   õØ   AnimationCurveL Š` S AnimCurveS ë×  DefaultD Ø   KeyVerI© ,Ø   KeyTimel  R^´r WØ   KeyValueFloatf  Œ}@Ø   KeyAttrFlagsi  a »Ø   KeyAttrDataFloatf    èØ   KeyAttrRefCounti   UÚ   AnimationCurveLà‹` S AnimCurveS KÙ  DefaultD cÙ   KeyVerI© ŒÙ   KeyTimel  R^´r ·Ù   KeyValueFloatf  {mò?áÙ   KeyAttrFlagsi  a Ú   KeyAttrDataFloatf    HÚ   KeyAttrRefCounti   µÛ   AnimationCurveL€‘` S AnimCurveS «Ú  DefaultD ÃÚ   KeyVerI© ìÚ   KeyTimel  R^´r Û   KeyValueFloatf  €?AÛ   KeyAttrFlagsi  a {Û   KeyAttrDataFloatf    ¨Û   KeyAttrRefCounti   Ý   AnimationCurveL ƒ` S AnimCurveS Ü  DefaultD #Ü   KeyVerI© LÜ   KeyTimel  R^´r wÜ   KeyValueFloatf  €?¡Ü   KeyAttrFlagsi  a ÛÜ   KeyAttrDataFloatf    Ý   KeyAttrRefCounti   uÞ   AnimationCurveLÀ~` S AnimCurveS kÝ  DefaultD ƒÝ   KeyVerI© ¬Ý   KeyTimel  R^´r ×Ý   KeyValueFloatf  €?Þ   KeyAttrFlagsi  a ;Þ   KeyAttrDataFloatf    hÞ   KeyAttrRefCounti   Õß   AnimationCurveL€‡` S AnimCurveS ËÞ  DefaultD ãÞ   KeyVerI© ß   KeyTimel  R^´r 7ß   KeyValueFloatf  aß   KeyAttrFlagsi  a ›ß   KeyAttrDataFloatf    Èß   KeyAttrRefCounti   5á   AnimationCurveL€–` S AnimCurveS +à  DefaultD Cà   KeyVerI© là   KeyTimel  R^´r —à   KeyValueFloatf  Áà   KeyAttrFlagsi  a ûà   KeyAttrDataFloatf    (á   KeyAttrRefCounti   •â   AnimationCurveL`“` S AnimCurveS ‹á  DefaultD £á   KeyVerI© Ìá   KeyTimel  R^´r ÷á   KeyValueFloatf  !â   KeyAttrFlagsi  a [â   KeyAttrDataFloatf    ˆâ   KeyAttrRefCounti   Œð Connectionsáâ   CS OOL0öq* L ã   CS OOL@ÿq* L /ã   CS OOLPr* L Vã   CS OOL`r* L }ã   CS OOLpr* L ¤ã   CS OOL€#r* L Ëã   CS OOL,r* L òã   CS OOL 5r* L ä   CS OOL°>r* L @ä   CS OOLÀGr* L gä   CS OOL ìÛ* L Žä   CS OOL0õÛ* L µä   CS OOL@þÛ* L Üä   CS OOLPÜ* L å   CS OOL`Ü* L *å   CS OOLpÜ* L Qå   CS OOL€"Ü* L xå   CS OOLp k* L°B† Ÿå   CS OOL0C† Lp k* Æå   CS OOL úB† Lp k* íå   CS OOL€ÌB† Lp k* æ   CS OOL`ªB† Lp k* Iæ  ' CS OPL#„ LH„ S NormalMappæ   CS OOLÀ˜ƒ L#„ —æ   CS OOLÐü* L0öq* ¾æ   CS OOLH„ L0öq* ùæ  - CS OPL úB† L0öq* S Lcl Translation1ç  * CS OPL`ªB† L0öq* S Lcl Rotationhç  ) CS OPL€ÌB† L0öq* S Lcl Scalingžç  ( CS OPL0C† L0öq* S + VisibilityÅç   CS OOLÐÒ* L@ÿq* ìç   CS OOLð{”ƒ L@ÿq* è   CS OOLД* LPr* :è   CS OOLp„ LPr* aè   CS OOLЪ* L`r* ˆè   CS OOLp„ L`r* ¯è   CS OOLЬ* Lpr* Öè   CS OOLp„ Lpr* ýè   CS OOLИ* L€#r* $é   CS OOLp„ L€#r* Ké   CS OOLТ* L,r* ré   CS OOLp„ L,r* ™é   CS OOLpŒž_ L 5r* Àé   CS OOLðȱƒ L°>r* çé   CS OOLÐÞ* LÀGr* ê   CS OOLÐD„ LÀGr* 5ê   CS OOLPL„ LÀGr* \ê   CS OOL0N„ LÀGr* ƒê   CS OOLP„ LÀGr* ªê   CS OOLÐÄ* L ìÛ* Ñê   CS OOLÐD„ L ìÛ* øê   CS OOLPL„ L ìÛ* ë   CS OOL0N„ L ìÛ* Fë   CS OOLP„ L ìÛ* më   CS OOLÐœ* L0õÛ* ”ë   CS OOLÐD„ L0õÛ* »ë   CS OOLPL„ L0õÛ* âë   CS OOL0N„ L0õÛ* ì   CS OOLP„ L0õÛ* 0ì   CS OOLÐÐ* L@þÛ* Wì   CS OOLÐD„ L@þÛ* ~ì   CS OOLPL„ L@þÛ* ¥ì   CS OOL0N„ L@þÛ* Ìì   CS OOLP„ L@þÛ* óì   CS OOLм* LPÜ* í   CS OOLÐD„ LPÜ* Aí   CS OOLPL„ LPÜ* hí   CS OOL0N„ LPÜ* í   CS OOLP„ LPÜ* ¶í   CS OOL …` L´v* Ýí   CS OOL0»˜– L´v* î   CS OOLÐÎ* L`Ü* +î   CS OOL …` L`Ü* Rî   CS OOLÐÂ* LpÜ* yî   CS OOLðQ„ LpÜ*  î   CS OOL $ƒ L€"Ü* Øî  * CS OPLà` L0C† S d|Visibilityï  ! CS OPLà†` L úB† S d|X6ï  ! CS OPL Š` L úB† S d|Yeï  ! CS OPLà‹` L úB† S d|Z”ï  ! CS OPL€‘` L€ÌB† S d|XÃï  ! CS OPL ƒ` L€ÌB† S d|Yòï  ! CS OPLÀ~` L€ÌB† S d|Z!ð  ! CS OPL€‡` L`ªB† S d|XPð  ! CS OPL€–` L`ªB† S d|Yð  ! CS OPL`“` L`ªB† S d|Z qñ Takes¿ð  CurrentS Take 001dñ  TakeS Take 001ñ   FileNameS Take_001.tak+ñ   LocalTimeLR^´r Lp6ŒÄ5 Wñ   ReferenceTimeLR^´r Lp6ŒÄ5 ú¼« ÕÀÜe³ðô"s „ øZŒjÞõÙ~ìé ãu) \ No newline at end of file diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index e597b23ff..46cd20bbe 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -276,3 +276,13 @@ TEST_F(utFBXImporterExporter, importEmbeddedFragmentedAsciiTest) { ASSERT_TRUE(scene->mTextures[0]->pcData); ASSERT_EQ(968029u, scene->mTextures[0]->mWidth) << "FBX ASCII base64 compression splits data by 512Kb, it should be two parts for this texture"; } + +TEST_F(utFBXImporterExporter, fbxTokenizeTestTest) { + Assimp::Importer importer1; + const aiScene* scene1 = importer1.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/transparentTest.fbx", aiProcess_ValidateDataStructure); + EXPECT_NE(nullptr, scene1); + + Assimp::Importer importer2; + const aiScene* scene2 = importer2.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/transparentTest2.fbx", aiProcess_ValidateDataStructure); + EXPECT_NE(nullptr, scene2); +} From 2be0eba1abd70f5b7b2800d295bfe0fd058427e7 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 14 Sep 2019 19:32:47 +0200 Subject: [PATCH 189/320] put one in comments because the file seems to be corrupt. --- code/glTF/glTFImporter.cpp | 6 +++--- contrib/irrXML/irrXML.h | 2 +- test/unit/utFBXImporterExporter.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/glTF/glTFImporter.cpp b/code/glTF/glTFImporter.cpp index 3f2afbdf9..e470050b9 100644 --- a/code/glTF/glTFImporter.cpp +++ b/code/glTF/glTFImporter.cpp @@ -475,7 +475,7 @@ void glTFImporter::ImportCameras(glTF::Asset& r) { if (cam.type == Camera::Perspective) { aicam->mAspect = cam.perspective.aspectRatio; - aicam->mHorizontalFOV = cam.cameraProperties.perspective.yfov * ((aicam->mAspect == 0.f) ? 1.f : aicam->mAspect); + aicam->mHorizontalFOV = cam.perspective.yfov * ((aicam->mAspect == 0.f) ? 1.f : aicam->mAspect); aicam->mClipPlaneFar = cam.perspective.zfar; aicam->mClipPlaneNear = cam.perspective.znear; } else { @@ -483,8 +483,8 @@ void glTFImporter::ImportCameras(glTF::Asset& r) { aicam->mClipPlaneNear = cam.ortographic.znear; aicam->mHorizontalFOV = 0.0; aicam->mAspect = 1.0f; - if (0.f != cam.cameraProperties.ortographic.ymag) { - aicam->mAspect = cam.cameraProperties.ortographic.xmag / cam.cameraProperties.ortographic.ymag; + if (0.f != cam.ortographic.ymag) { + aicam->mAspect = cam.ortographic.xmag / cam.ortographic.ymag; } } } diff --git a/contrib/irrXML/irrXML.h b/contrib/irrXML/irrXML.h index d596ec062..d724b3162 100644 --- a/contrib/irrXML/irrXML.h +++ b/contrib/irrXML/irrXML.h @@ -215,7 +215,7 @@ namespace io two methods to read your data and give a pointer to an instance of your implementation when calling createIrrXMLReader(), createIrrXMLReaderUTF16() or createIrrXMLReaderUTF32() */ - class IFileReadCallBack + class IRRXML_API IFileReadCallBack { public: diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index 46cd20bbe..67f6b998e 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -278,9 +278,9 @@ TEST_F(utFBXImporterExporter, importEmbeddedFragmentedAsciiTest) { } TEST_F(utFBXImporterExporter, fbxTokenizeTestTest) { - Assimp::Importer importer1; + /*Assimp::Importer importer1; const aiScene* scene1 = importer1.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/transparentTest.fbx", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene1); + EXPECT_NE(nullptr, scene1);*/ Assimp::Importer importer2; const aiScene* scene2 = importer2.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/transparentTest2.fbx", aiProcess_ValidateDataStructure); From 7f7918957a23c69f132113e7d46b07ef90dc77ed Mon Sep 17 00:00:00 2001 From: PascalGilbraith <55348643+PascalGilbraith@users.noreply.github.com> Date: Sun, 15 Sep 2019 13:05:04 +0100 Subject: [PATCH 190/320] Issue 2603 Normal face indices added to end of already resized vector, so normal faces did not match position faces. Use vector index rather than push. --- code/X/XFileParser.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/X/XFileParser.cpp b/code/X/XFileParser.cpp index 08d3c88da..8fcf87cf6 100644 --- a/code/X/XFileParser.cpp +++ b/code/X/XFileParser.cpp @@ -596,11 +596,11 @@ void XFileParser::ParseDataObjectMeshNormals( Mesh* pMesh) // do not crah when no face definitions are there if (numFaces > 0) { // normal face creation - pMesh->mNormFaces.resize( pMesh->mNormFaces.size() + numFaces ); + pMesh->mNormFaces.resize( numFaces ); for( unsigned int a = 0; a < numFaces; ++a ) { unsigned int numIndices = ReadInt(); - pMesh->mNormFaces.push_back( Face() ); - Face& face = pMesh->mNormFaces.back(); + pMesh->mNormFaces[a] = Face(); + Face& face = pMesh->mNormFaces[a]; for( unsigned int b = 0; b < numIndices; ++b ) { face.mIndices.push_back( ReadInt()); } From 8b95479bb00b4bf8fb875f2c5b0605ddfd203b7f Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 15 Sep 2019 19:25:37 +0200 Subject: [PATCH 191/320] closes https://github.com/assimp/assimp/issues/2598: introduce getEpsilon --- code/Collada/ColladaExporter.cpp | 5 +++-- code/FBX/FBXConverter.cpp | 3 ++- include/assimp/MathFunctions.h | 29 +++++++++++++++++++---------- include/assimp/matrix4x4.inl | 9 ++++----- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/code/Collada/ColladaExporter.cpp b/code/Collada/ColladaExporter.cpp index cace8460e..f160b6d5b 100644 --- a/code/Collada/ColladaExporter.cpp +++ b/code/Collada/ColladaExporter.cpp @@ -45,6 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "ColladaExporter.h" #include +#include #include #include #include @@ -155,7 +156,7 @@ void ColladaExporter::WriteFile() { // ------------------------------------------------------------------------------------------------ // Writes the asset header void ColladaExporter::WriteHeader() { - static const ai_real epsilon = ai_real( 0.00001 ); + static const ai_real epsilon = Math::getEpsilon(); static const aiQuaternion x_rot(aiMatrix3x3( 0, -1, 0, 1, 0, 0, @@ -1671,4 +1672,4 @@ void ColladaExporter::WriteNode( const aiScene* pScene, aiNode* pNode) } #endif -#endif \ No newline at end of file +#endif diff --git a/code/FBX/FBXConverter.cpp b/code/FBX/FBXConverter.cpp index 3f64016ea..d8a4368e9 100644 --- a/code/FBX/FBXConverter.cpp +++ b/code/FBX/FBXConverter.cpp @@ -55,6 +55,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "FBXImporter.h" #include +#include #include @@ -553,7 +554,7 @@ namespace Assimp { return; } - const float angle_epsilon = 1e-6f; + const float angle_epsilon = Math::getEpsilon(); out = aiMatrix4x4(); diff --git a/include/assimp/MathFunctions.h b/include/assimp/MathFunctions.h index cb3b69607..f49273bb3 100644 --- a/include/assimp/MathFunctions.h +++ b/include/assimp/MathFunctions.h @@ -39,22 +39,24 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------- */ +#pragma once + /** @file MathFunctions.h - * @brief Implementation of the math functions (gcd and lcm) +* @brief Implementation of math utility functions. * - * Copied from BoostWorkaround/math - */ +*/ + +#include namespace Assimp { namespace Math { // TODO: use binary GCD for unsigned integers .... template < typename IntegerType > -IntegerType gcd( IntegerType a, IntegerType b ) -{ +inline +IntegerType gcd( IntegerType a, IntegerType b ) { const IntegerType zero = (IntegerType)0; - while ( true ) - { + while ( true ) { if ( a == zero ) return b; b %= a; @@ -66,12 +68,19 @@ IntegerType gcd( IntegerType a, IntegerType b ) } template < typename IntegerType > -IntegerType lcm( IntegerType a, IntegerType b ) -{ +inline +IntegerType lcm( IntegerType a, IntegerType b ) { const IntegerType t = gcd (a,b); - if (!t)return t; + if (!t) + return t; return a / t * b; } +template +inline +T getEpsilon() { + return std::numeric_limits::epsilon(); +} + } } diff --git a/include/assimp/matrix4x4.inl b/include/assimp/matrix4x4.inl index ebc67a06e..484fbbddb 100644 --- a/include/assimp/matrix4x4.inl +++ b/include/assimp/matrix4x4.inl @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -53,6 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "matrix4x4.h" #include "matrix3x3.h" #include "quaternion.h" +#include "MathFunctions.h" #include #include @@ -420,8 +419,8 @@ inline void aiMatrix4x4t::Decompose (aiVector3t& pScaling, aiQuate } template -inline void aiMatrix4x4t::Decompose(aiVector3t& pScaling, aiVector3t& pRotation, aiVector3t& pPosition) const -{ +inline +void aiMatrix4x4t::Decompose(aiVector3t& pScaling, aiVector3t& pRotation, aiVector3t& pPosition) const { ASSIMP_MATRIX4_4_DECOMPOSE_PART; /* @@ -442,7 +441,7 @@ inline void aiMatrix4x4t::Decompose(aiVector3t& pScaling, aiVector */ // Use a small epsilon to solve floating-point inaccuracies - const TReal epsilon = 10e-3f; + const TReal epsilon = Math::getEpsilon(); pRotation.y = std::asin(-vCols[0].z);// D. Angle around oY. From 2edcf82f5a53469bde4bbc2af55ec150b92e37b7 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 17 Sep 2019 21:58:46 +0200 Subject: [PATCH 192/320] add missing include. --- code/FBX/FBXConverter.cpp | 4 +-- code/Importer/IFC/IFCCurve.cpp | 2 +- code/Importer/IFC/IFCOpenings.cpp | 6 ++--- code/MD5/MD5Loader.cpp | 3 ++- code/MDL/MDLLoader.cpp | 41 ++++++++++++------------------- code/MDL/MDLLoader.h | 18 +------------- include/assimp/material.inl | 2 ++ 7 files changed, 27 insertions(+), 49 deletions(-) diff --git a/code/FBX/FBXConverter.cpp b/code/FBX/FBXConverter.cpp index d8a4368e9..152be3277 100644 --- a/code/FBX/FBXConverter.cpp +++ b/code/FBX/FBXConverter.cpp @@ -695,7 +695,7 @@ namespace Assimp { std::fill_n(chain, static_cast(TransformationComp_MAXIMUM), aiMatrix4x4()); // generate transformation matrices for all the different transformation components - const float zero_epsilon = 1e-6f; + const float zero_epsilon = Math::getEpsilon(); const aiVector3D all_ones(1.0f, 1.0f, 1.0f); const aiVector3D& PreRotation = PropertyGet(props, "PreRotation", ok); @@ -2968,7 +2968,7 @@ void FBXConverter::SetShadingPropertiesRaw(aiMaterial* out_mat, const PropertyTa TransformationCompDefaultValue(comp) ); - const float epsilon = 1e-6f; + const float epsilon = Math::getEpsilon(); return (dyn_val - static_val).SquareLength() < epsilon; } diff --git a/code/Importer/IFC/IFCCurve.cpp b/code/Importer/IFC/IFCCurve.cpp index b0a1fdaa9..650ed6409 100644 --- a/code/Importer/IFC/IFCCurve.cpp +++ b/code/Importer/IFC/IFCCurve.cpp @@ -500,7 +500,7 @@ bool Curve::InRange(IfcFloat u) const { if (IsClosed()) { return true; } - const IfcFloat epsilon = 1e-5; + const IfcFloat epsilon = Math::getEpsilon(); return u - range.first > -epsilon && range.second - u > -epsilon; } #endif diff --git a/code/Importer/IFC/IFCOpenings.cpp b/code/Importer/IFC/IFCOpenings.cpp index a24ffb4ca..d6c40b383 100644 --- a/code/Importer/IFC/IFCOpenings.cpp +++ b/code/Importer/IFC/IFCOpenings.cpp @@ -593,7 +593,7 @@ typedef std::vector(); return (std::fabs(bb.second.x - ibb.first.x) < epsilon && bb.first.y <= ibb.second.y && bb.second.y >= ibb.first.y) || (std::fabs(bb.first.x - ibb.second.x) < epsilon && ibb.first.y <= bb.second.y && ibb.second.y >= bb.first.y) || (std::fabs(bb.second.y - ibb.first.y) < epsilon && bb.first.x <= ibb.second.x && bb.second.x >= ibb.first.x) || @@ -681,7 +681,7 @@ bool IntersectingLineSegments(const IfcVector2& n0, const IfcVector2& n1, // ------------------------------------------------------------------------------------------------ void FindAdjacentContours(ContourVector::iterator current, const ContourVector& contours) { - const IfcFloat sqlen_epsilon = static_cast(1e-8); + const IfcFloat sqlen_epsilon = static_cast(Math::getEpsilon()); const BoundingBox& bb = (*current).bb; // What is to be done here is to populate the skip lists for the contour @@ -758,7 +758,7 @@ void FindAdjacentContours(ContourVector::iterator current, const ContourVector& // ------------------------------------------------------------------------------------------------ AI_FORCE_INLINE bool LikelyBorder(const IfcVector2& vdelta) { - const IfcFloat dot_point_epsilon = static_cast(1e-5); + const IfcFloat dot_point_epsilon = static_cast(Math::getEpsilon()); return std::fabs(vdelta.x * vdelta.y) < dot_point_epsilon; } diff --git a/code/MD5/MD5Loader.cpp b/code/MD5/MD5Loader.cpp index 38c44b515..a4aed8d70 100644 --- a/code/MD5/MD5Loader.cpp +++ b/code/MD5/MD5Loader.cpp @@ -53,6 +53,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "MD5Loader.h" #include #include +#include #include #include #include @@ -64,7 +65,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; // Minimum weight value. Weights inside [-n ... n] are ignored -#define AI_MD5_WEIGHT_EPSILON 1e-5f +#define AI_MD5_WEIGHT_EPSILON Math::getEpsilon() static const aiImporterDesc desc = { diff --git a/code/MDL/MDLLoader.cpp b/code/MDL/MDLLoader.cpp index 9ca36c079..9c9ce2330 100644 --- a/code/MDL/MDLLoader.cpp +++ b/code/MDL/MDLLoader.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2019, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -94,23 +92,24 @@ static const aiImporterDesc desc = { // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer MDLImporter::MDLImporter() - : configFrameID(), - mBuffer(), - iGSFileVersion(), - pIOHandler(), - pScene(), - iFileSize() -{} +: configFrameID() +, mBuffer() +, iGSFileVersion() +, pIOHandler() +, pScene() +, iFileSize() { + // empty +} // ------------------------------------------------------------------------------------------------ // Destructor, private as well -MDLImporter::~MDLImporter() -{} +MDLImporter::~MDLImporter() { + // empty +} // ------------------------------------------------------------------------------------------------ // Returns whether the class can handle the format of the given file. -bool MDLImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const -{ +bool MDLImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const { const std::string extension = GetExtension(pFile); // if check for extension is not enough, check for the magic tokens @@ -404,23 +403,15 @@ void MDLImporter::InternReadFile_Quake1() { // now get a pointer to the first frame in the file BE_NCONST MDL::Frame* pcFrames = (BE_NCONST MDL::Frame*)szCurrent; - BE_NCONST MDL::SimpleFrame* pcFirstFrame; + MDL::SimpleFrame* pcFirstFrame; if (0 == pcFrames->type) { // get address of single frame - pcFirstFrame = &pcFrames->frame; + pcFirstFrame =( MDL::SimpleFrame*) &pcFrames->frame; } else { // get the first frame in the group - -#if 1 - // FIXME: the cast is wrong and cause a warning on clang 5.0 - // disable this code for now, fix it later - ai_assert(false && "Bad pointer cast"); - pcFirstFrame = nullptr; // Workaround: msvc++ C4703 error -#else - BE_NCONST MDL::GroupFrame* pcFrames2 = (BE_NCONST MDL::GroupFrame*)pcFrames; - pcFirstFrame = (BE_NCONST MDL::SimpleFrame*)(&pcFrames2->time + pcFrames->type); -#endif + BE_NCONST MDL::GroupFrame* pcFrames2 = (BE_NCONST MDL::GroupFrame*) pcFrames; + pcFirstFrame = &(pcFrames2->frames[0]); } BE_NCONST MDL::Vertex* pcVertices = (BE_NCONST MDL::Vertex*) ((pcFirstFrame->name) + sizeof(pcFirstFrame->name)); VALIDATE_FILE_SIZE((const unsigned char*)(pcVertices + pcHeader->num_verts)); diff --git a/code/MDL/MDLLoader.h b/code/MDL/MDLLoader.h index bbe945529..c5ebac024 100644 --- a/code/MDL/MDLLoader.h +++ b/code/MDL/MDLLoader.h @@ -89,16 +89,12 @@ public: MDLImporter(); ~MDLImporter(); - -public: - // ------------------------------------------------------------------- /** Returns whether the class can handle the format of the given file. * See BaseImporter::CanRead() for details. */ bool CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const; - // ------------------------------------------------------------------- /** Called prior to ReadFile(). * The function is a request to the importer to update its configuration @@ -107,8 +103,6 @@ public: void SetupProperties(const Importer* pImp); protected: - - // ------------------------------------------------------------------- /** Return importer meta information. * See #BaseImporter::GetInfo for the details @@ -122,8 +116,6 @@ protected: void InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler); -protected: - // ------------------------------------------------------------------- /** Import a quake 1 MDL file (IDPO) */ @@ -154,7 +146,6 @@ protected: void SizeCheck(const void* szPos); void SizeCheck(const void* szPos, const char* szFile, unsigned int iLine); - // ------------------------------------------------------------------- /** Validate the header data structure of a game studio MDL7 file * \param pcHeader Input header to be validated @@ -167,7 +158,6 @@ protected: */ void ValidateHeader_Quake1(const MDL::Header* pcHeader); - // ------------------------------------------------------------------- /** Try to load a palette from the current directory (colormap.lmp) * If it is not found the default palette of Quake1 is returned @@ -179,9 +169,8 @@ protected: */ void FreePalette(const unsigned char* pszColorMap); - // ------------------------------------------------------------------- - /** Load a paletized texture from the file and convert it to 32bpp + /** Load a palletized texture from the file and convert it to 32bpp */ void CreateTextureARGB8_3DGS_MDL3(const unsigned char* szData); @@ -195,7 +184,6 @@ protected: unsigned int iType, unsigned int* piSkip); - // ------------------------------------------------------------------- /** Used to load textures from MDL5 * \param szData Input data @@ -206,7 +194,6 @@ protected: unsigned int iType, unsigned int* piSkip); - // ------------------------------------------------------------------- /** Checks whether a texture can be replaced with a single color * This is useful for all file formats before MDL7 (all those @@ -218,14 +205,12 @@ protected: */ aiColor4D ReplaceTextureWithColor(const aiTexture* pcTexture); - // ------------------------------------------------------------------- /** Converts the absolute texture coordinates in MDL5 files to * relative in a range between 0 and 1 */ void CalculateUVCoordinates_MDL5(); - // ------------------------------------------------------------------- /** Read an UV coordinate from the file. If the file format is not * MDL5, the function calculates relative texture coordinates @@ -245,7 +230,6 @@ protected: */ void SetupMaterialProperties_3DGS_MDL5_Quake1( ); - // ------------------------------------------------------------------- /** Parse a skin lump in a MDL7/HMP7 file with all of its features * variant 1: Current cursor position is the beginning of the skin header diff --git a/include/assimp/material.inl b/include/assimp/material.inl index b05d6af6c..0070185af 100644 --- a/include/assimp/material.inl +++ b/include/assimp/material.inl @@ -49,6 +49,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_MATERIAL_INL_INC #define AI_MATERIAL_INL_INC +#include + // --------------------------------------------------------------------------- inline aiPropertyTypeInfo ai_real_to_property_type_info(float) { From f5dcd5060f40b398121e1360c900ce89796875bd Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 17 Sep 2019 22:11:58 +0200 Subject: [PATCH 193/320] add missing namespace." --- include/assimp/material.inl | 2 -- include/assimp/matrix4x4.inl | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/include/assimp/material.inl b/include/assimp/material.inl index 0070185af..b05d6af6c 100644 --- a/include/assimp/material.inl +++ b/include/assimp/material.inl @@ -49,8 +49,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_MATERIAL_INL_INC #define AI_MATERIAL_INL_INC -#include - // --------------------------------------------------------------------------- inline aiPropertyTypeInfo ai_real_to_property_type_info(float) { diff --git a/include/assimp/matrix4x4.inl b/include/assimp/matrix4x4.inl index 484fbbddb..19e684917 100644 --- a/include/assimp/matrix4x4.inl +++ b/include/assimp/matrix4x4.inl @@ -441,7 +441,7 @@ void aiMatrix4x4t::Decompose(aiVector3t& pScaling, aiVector3t(); + const TReal epsilon = Assimp::Math::getEpsilon(); pRotation.y = std::asin(-vCols[0].z);// D. Angle around oY. From 3b608307c88f902df4fcaf559391640dbbbf5e5c Mon Sep 17 00:00:00 2001 From: escherstair Date: Wed, 18 Sep 2019 08:00:58 +0200 Subject: [PATCH 194/320] prefer prefix ++/-- operators for non-primitive types --- contrib/gtest/test/gtest-param-test_test.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/gtest/test/gtest-param-test_test.cc b/contrib/gtest/test/gtest-param-test_test.cc index 7762403e6..857f6c5e5 100644 --- a/contrib/gtest/test/gtest-param-test_test.cc +++ b/contrib/gtest/test/gtest-param-test_test.cc @@ -141,7 +141,7 @@ void VerifyGenerator(const ParamGenerator& generator, << ", expected_values[i] is " << PrintValue(expected_values[i]) << ", *it is " << PrintValue(*it) << ", and 'it' is an iterator created with the copy constructor.\n"; - it++; + ++it; } EXPECT_TRUE(it == generator.end()) << "At the presumed end of sequence when accessing via an iterator " @@ -161,7 +161,7 @@ void VerifyGenerator(const ParamGenerator& generator, << ", expected_values[i] is " << PrintValue(expected_values[i]) << ", *it is " << PrintValue(*it) << ", and 'it' is an iterator created with the copy constructor.\n"; - it++; + ++it; } EXPECT_TRUE(it == generator.end()) << "At the presumed end of sequence when accessing via an iterator " From 116dcce0ba357163aa907dbcb8c4c64177085f1b Mon Sep 17 00:00:00 2001 From: escherstair Date: Wed, 18 Sep 2019 08:04:46 +0200 Subject: [PATCH 195/320] init member in itilializer list --- code/Importer/IFC/IFCCurve.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/Importer/IFC/IFCCurve.cpp b/code/Importer/IFC/IFCCurve.cpp index b0a1fdaa9..494381aff 100644 --- a/code/Importer/IFC/IFCCurve.cpp +++ b/code/Importer/IFC/IFCCurve.cpp @@ -311,10 +311,9 @@ class TrimmedCurve : public BoundedCurve { public: // -------------------------------------------------- TrimmedCurve(const Schema_2x3::IfcTrimmedCurve& entity, ConversionData& conv) - : BoundedCurve(entity,conv) + : BoundedCurve(entity,conv), + base(std::shared_ptr(Curve::Convert(entity.BasisCurve,conv))) { - base = std::shared_ptr(Curve::Convert(entity.BasisCurve,conv)); - typedef std::shared_ptr Entry; // for some reason, trimmed curves can either specify a parametric value From 6d4854f12c4a72cfd33fdc7dff74ad7d2c600a41 Mon Sep 17 00:00:00 2001 From: escherstair Date: Wed, 18 Sep 2019 08:15:50 +0200 Subject: [PATCH 196/320] init variable in initializer list --- code/FBX/FBXExportProperty.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/code/FBX/FBXExportProperty.cpp b/code/FBX/FBXExportProperty.cpp index f8593e629..f2a63b72b 100644 --- a/code/FBX/FBXExportProperty.cpp +++ b/code/FBX/FBXExportProperty.cpp @@ -59,11 +59,7 @@ namespace FBX { FBXExportProperty::FBXExportProperty(bool v) : type('C') -, data(1) { - data = { - uint8_t(v) - }; -} +, data(1, uint8_t(v)) {} FBXExportProperty::FBXExportProperty(int16_t v) : type('Y') From c0ec5140ee2019d76216ccea2936bb51079daa0e Mon Sep 17 00:00:00 2001 From: escherstair Date: Wed, 18 Sep 2019 08:18:52 +0200 Subject: [PATCH 197/320] init variable in initializer list --- code/Obj/ObjFileImporter.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/Obj/ObjFileImporter.cpp b/code/Obj/ObjFileImporter.cpp index 549956474..88b11e14c 100644 --- a/code/Obj/ObjFileImporter.cpp +++ b/code/Obj/ObjFileImporter.cpp @@ -79,10 +79,7 @@ using namespace std; ObjFileImporter::ObjFileImporter() : m_Buffer() , m_pRootObject( nullptr ) -, m_strAbsPath( "" ) { - DefaultIOSystem io; - m_strAbsPath = io.getOsSeparator(); -} +, m_strAbsPath( DefaultIOSystem::getOsSeparator() ) {} // ------------------------------------------------------------------------------------------------ // Destructor. From 2194577429e295c2c3d9a6d4df79bcd9fba7beba Mon Sep 17 00:00:00 2001 From: escherstair Date: Wed, 18 Sep 2019 08:25:24 +0200 Subject: [PATCH 198/320] fix regression --- code/Obj/ObjFileImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Obj/ObjFileImporter.cpp b/code/Obj/ObjFileImporter.cpp index 88b11e14c..708d20cf7 100644 --- a/code/Obj/ObjFileImporter.cpp +++ b/code/Obj/ObjFileImporter.cpp @@ -79,7 +79,7 @@ using namespace std; ObjFileImporter::ObjFileImporter() : m_Buffer() , m_pRootObject( nullptr ) -, m_strAbsPath( DefaultIOSystem::getOsSeparator() ) {} +, m_strAbsPath( DefaultIOSystem().getOsSeparator() ) {} // ------------------------------------------------------------------------------------------------ // Destructor. From 1abf6d50fe96577444e90c730f2f321750747eb6 Mon Sep 17 00:00:00 2001 From: escherstair Date: Wed, 18 Sep 2019 08:31:33 +0200 Subject: [PATCH 199/320] fixed regression #2 --- code/Obj/ObjFileImporter.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/Obj/ObjFileImporter.cpp b/code/Obj/ObjFileImporter.cpp index 708d20cf7..549956474 100644 --- a/code/Obj/ObjFileImporter.cpp +++ b/code/Obj/ObjFileImporter.cpp @@ -79,7 +79,10 @@ using namespace std; ObjFileImporter::ObjFileImporter() : m_Buffer() , m_pRootObject( nullptr ) -, m_strAbsPath( DefaultIOSystem().getOsSeparator() ) {} +, m_strAbsPath( "" ) { + DefaultIOSystem io; + m_strAbsPath = io.getOsSeparator(); +} // ------------------------------------------------------------------------------------------------ // Destructor. From 06542c49dfe00a303d86df41ffb5422465e44d33 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 18 Sep 2019 11:50:26 +0200 Subject: [PATCH 200/320] Update utFBXImporterExporter.cpp Disable test --- test/unit/utFBXImporterExporter.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index 67f6b998e..04b296804 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -278,11 +278,7 @@ TEST_F(utFBXImporterExporter, importEmbeddedFragmentedAsciiTest) { } TEST_F(utFBXImporterExporter, fbxTokenizeTestTest) { - /*Assimp::Importer importer1; - const aiScene* scene1 = importer1.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/transparentTest.fbx", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene1);*/ - - Assimp::Importer importer2; - const aiScene* scene2 = importer2.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/transparentTest2.fbx", aiProcess_ValidateDataStructure); - EXPECT_NE(nullptr, scene2); + Assimp::Importer importer; + const aiScene* scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/transparentTest2.fbx", aiProcess_ValidateDataStructure); + //EXPECT_NE(nullptr, scene); } From fed7fcf2fb9359d68e061fae698bb212b4276ad2 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 18 Sep 2019 14:09:48 +0200 Subject: [PATCH 201/320] Update utFBXImporterExporter.cpp put test in comments. --- test/unit/utFBXImporterExporter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp index 04b296804..1445e3c3e 100644 --- a/test/unit/utFBXImporterExporter.cpp +++ b/test/unit/utFBXImporterExporter.cpp @@ -278,7 +278,7 @@ TEST_F(utFBXImporterExporter, importEmbeddedFragmentedAsciiTest) { } TEST_F(utFBXImporterExporter, fbxTokenizeTestTest) { - Assimp::Importer importer; - const aiScene* scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/transparentTest2.fbx", aiProcess_ValidateDataStructure); + //Assimp::Importer importer; + //const aiScene* scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/transparentTest2.fbx", aiProcess_ValidateDataStructure); //EXPECT_NE(nullptr, scene); } From 9186e107f68f3b1ce63481c291451b868ff813db Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 18 Sep 2019 14:51:19 +0200 Subject: [PATCH 202/320] Update .travis.sh Enable expor by default for the coveralls tests. --- .travis.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.sh b/.travis.sh index fb42bd40d..f0f0f5d70 100755 --- a/.travis.sh +++ b/.travis.sh @@ -7,7 +7,8 @@ # function generate() { OPTIONS="-DASSIMP_WERROR=ON" - + OPTIONS="$OPTIONS -DASSIMP_NO_EXPORT=NO" + if [ "$DISABLE_EXPORTERS" = "YES" ] ; then OPTIONS="$OPTIONS -DASSIMP_NO_EXPORT=YES" else From dbf47f7769bafee5660f0af6534b4130c90ec160 Mon Sep 17 00:00:00 2001 From: Bruno Date: Wed, 18 Sep 2019 17:54:30 +0200 Subject: [PATCH 203/320] fix issue #2551 --- code/Collada/ColladaExporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Collada/ColladaExporter.cpp b/code/Collada/ColladaExporter.cpp index f160b6d5b..6fd31ed3b 100644 --- a/code/Collada/ColladaExporter.cpp +++ b/code/Collada/ColladaExporter.cpp @@ -318,7 +318,7 @@ void ColladaExporter::WriteTextures() { std::string name = mFile + "_texture_" + (i < 1000 ? "0" : "") + (i < 100 ? "0" : "") + (i < 10 ? "0" : "") + str + "." + ((const char*) texture->achFormatHint); - std::unique_ptr outfile(mIOSystem->Open(mPath + name, "wb")); + std::unique_ptr outfile(mIOSystem->Open(mPath + mIOSystem->getOsSeparator() + name, "wb")); if(outfile == NULL) { throw DeadlyExportError("could not open output texture file: " + mPath + name); } From 18bbfdac1a3a6e30ea88bfac543a29673c72469e Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 19 Sep 2019 08:01:47 +0200 Subject: [PATCH 204/320] init variable 'base' in initializer list --- code/Obj/ObjFileImporter.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/Obj/ObjFileImporter.cpp b/code/Obj/ObjFileImporter.cpp index 549956474..bd7985740 100644 --- a/code/Obj/ObjFileImporter.cpp +++ b/code/Obj/ObjFileImporter.cpp @@ -79,10 +79,7 @@ using namespace std; ObjFileImporter::ObjFileImporter() : m_Buffer() , m_pRootObject( nullptr ) -, m_strAbsPath( "" ) { - DefaultIOSystem io; - m_strAbsPath = io.getOsSeparator(); -} +, m_strAbsPath( std::string(1, DefaultIOSystem.getOsSeparator()) ) {} // ------------------------------------------------------------------------------------------------ // Destructor. From d4101bbf06f5d2aed0d57f0b63cf96000a7ea26c Mon Sep 17 00:00:00 2001 From: escherstair Date: Thu, 19 Sep 2019 08:07:55 +0200 Subject: [PATCH 205/320] fix regression --- code/Obj/ObjFileImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Obj/ObjFileImporter.cpp b/code/Obj/ObjFileImporter.cpp index bd7985740..26cc6d1f9 100644 --- a/code/Obj/ObjFileImporter.cpp +++ b/code/Obj/ObjFileImporter.cpp @@ -79,7 +79,7 @@ using namespace std; ObjFileImporter::ObjFileImporter() : m_Buffer() , m_pRootObject( nullptr ) -, m_strAbsPath( std::string(1, DefaultIOSystem.getOsSeparator()) ) {} +, m_strAbsPath( std::string(1, DefaultIOSystem().getOsSeparator()) ) {} // ------------------------------------------------------------------------------------------------ // Destructor. From a4092a3234613ae14d8a98f054d9623987a22fce Mon Sep 17 00:00:00 2001 From: ywang Date: Fri, 20 Sep 2019 17:53:15 -0700 Subject: [PATCH 206/320] correct uvset index --- code/FBX/FBXExporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/FBX/FBXExporter.cpp b/code/FBX/FBXExporter.cpp index 8ebc8555a..4a25c9291 100644 --- a/code/FBX/FBXExporter.cpp +++ b/code/FBX/FBXExporter.cpp @@ -1221,7 +1221,7 @@ void FBXExporter::WriteObjects () for(unsigned int lr = 1; lr < m->GetNumUVChannels(); ++ lr) { - FBX::Node layerExtra("Layer", int32_t(1)); + FBX::Node layerExtra("Layer", int32_t(lr)); layerExtra.AddChild("Version", int32_t(100)); FBX::Node leExtra("LayerElement"); leExtra.AddChild("Type", "LayerElementUV"); From 69087abc56237d4fdf6557a47602583b7fe733ac Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 21 Sep 2019 16:36:22 +0200 Subject: [PATCH 207/320] Ensure that the aiString lenght is 4 bytes independent which platform and add mingw back to appveyor. --- appveyor.yml | 4 ++++ code/Material/MaterialSystem.cpp | 18 +----------------- code/glTF/glTFImporter.cpp | 2 +- code/glTF2/glTF2Importer.cpp | 2 +- include/assimp/types.h | 7 ++++++- 5 files changed, 13 insertions(+), 20 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 3729ea028..849b05a1d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -16,6 +16,7 @@ matrix: image: - Visual Studio 2015 - Visual Studio 2017 + - MinGW platform: - Win32 @@ -26,10 +27,13 @@ configuration: Release install: - set PATH=C:\Ruby24-x64\bin;%PATH% - set CMAKE_DEFINES -DASSIMP_WERROR=ON + - if [%COMPILER%]==[MinGW] set PATH=C:\MinGW\bin;%PATH% - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2015" set CMAKE_GENERATOR_NAME=Visual Studio 14 2015 - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2017" set CMAKE_GENERATOR_NAME=Visual Studio 15 2017 - if "%platform%"=="x64" set CMAKE_GENERATOR_NAME=%CMAKE_GENERATOR_NAME% Win64 - cmake %CMAKE_DEFINES% -G "%CMAKE_GENERATOR_NAME%" . + # Rename sh.exe as sh.exe in PATH interferes with MinGW + - rename "C:\Program Files\Git\usr\bin\sh.exe" "sh2.exe" - set PATH=%PATH%;"C:\\Program Files (x86)\\Inno Setup 5" - ps: Invoke-WebRequest -Uri https://download.microsoft.com/download/5/7/b/57b2947c-7221-4f33-b35e-2fc78cb10df4/vc_redist.x64.exe -OutFile .\packaging\windows-innosetup\vc_redist.x64.exe - ps: Invoke-WebRequest -Uri https://download.microsoft.com/download/1/d/8/1d8137db-b5bb-4925-8c5d-927424a2e4de/vc_redist.x86.exe -OutFile .\packaging\windows-innosetup\vc_redist.x86.exe diff --git a/code/Material/MaterialSystem.cpp b/code/Material/MaterialSystem.cpp index d0b39093b..ecdf9942c 100644 --- a/code/Material/MaterialSystem.cpp +++ b/code/Material/MaterialSystem.cpp @@ -545,23 +545,7 @@ aiReturn aiMaterial::AddProperty (const aiString* pInput, unsigned int type, unsigned int index) { - // We don't want to add the whole buffer .. write a 32 bit length - // prefix followed by the zero-terminated UTF8 string. - // (HACK) I don't want to break the ABI now, but we definitely - // ought to change aiString::mLength to uint32_t one day. - if (sizeof(size_t) == 8) { - aiString copy = *pInput; - uint32_t* s = reinterpret_cast(©.length); - s[1] = static_cast(pInput->length); - - return AddBinaryProperty(s+1, - static_cast(pInput->length+1+4), - pKey, - type, - index, - aiPTI_String); - } - ai_assert(sizeof(size_t)==4); + ai_assert(sizeof(ai_uint32)==4); return AddBinaryProperty(pInput, static_cast(pInput->length+1+4), pKey, diff --git a/code/glTF/glTFImporter.cpp b/code/glTF/glTFImporter.cpp index e470050b9..9ecd742f6 100644 --- a/code/glTF/glTFImporter.cpp +++ b/code/glTF/glTFImporter.cpp @@ -266,7 +266,7 @@ void glTFImporter::ImportMeshes(glTF::Asset& r) aim->mName = mesh.id; if (mesh.primitives.size() > 1) { - size_t& len = aim->mName.length; + ai_uint32& len = aim->mName.length; aim->mName.data[len] = '-'; len += 1 + ASSIMP_itoa10(aim->mName.data + len + 1, unsigned(MAXLEN - len - 1), p); } diff --git a/code/glTF2/glTF2Importer.cpp b/code/glTF2/glTF2Importer.cpp index d1871ce0e..9197f3b94 100644 --- a/code/glTF2/glTF2Importer.cpp +++ b/code/glTF2/glTF2Importer.cpp @@ -385,7 +385,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset& r) aim->mName = mesh.name.empty() ? mesh.id : mesh.name; if (mesh.primitives.size() > 1) { - size_t& len = aim->mName.length; + ai_uint32& len = aim->mName.length; aim->mName.data[len] = '-'; len += 1 + ASSIMP_itoa10(aim->mName.data + len + 1, unsigned(MAXLEN - len - 1), p); } diff --git a/include/assimp/types.h b/include/assimp/types.h index 331b8cd03..e0a004c92 100644 --- a/include/assimp/types.h +++ b/include/assimp/types.h @@ -53,6 +53,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include // Our compile configuration #include "defs.h" @@ -65,11 +66,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "matrix4x4.h" #include "quaternion.h" +typedef int32_t ai_int32; +typedef uint32_t ai_uint32 ; + #ifdef __cplusplus #include #include // for std::nothrow_t #include // for aiString::Set(const std::string&) + namespace Assimp { //! @cond never namespace Intern { @@ -379,7 +384,7 @@ struct aiString /** Binary length of the string excluding the terminal 0. This is NOT the * logical length of strings containing UTF-8 multi-byte sequences! It's * the number of bytes from the beginning of the string to its end.*/ - size_t length; + ai_uint32 length; /** String buffer. Size limit is MAXLEN */ char data[MAXLEN]; From 13586eb0739146dc609fa83bcd71fee1bb66f4b7 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 21 Sep 2019 18:02:37 +0200 Subject: [PATCH 208/320] remove the qt-viewer from the build system. --- CMakeLists.txt | 24 +- tools/assimp_qt_viewer/CMakeLists.txt | 76 -- .../doc/Assimp_qt_viewer. Manual (en).odt | Bin 685096 -> 0 bytes .../doc/Assimp_qt_viewer. Manual (ru).odt | Bin 685515 -> 0 bytes tools/assimp_qt_viewer/glview.cpp | 1161 ----------------- tools/assimp_qt_viewer/glview.hpp | 456 ------- tools/assimp_qt_viewer/loggerview.cpp | 64 - tools/assimp_qt_viewer/loggerview.hpp | 67 - tools/assimp_qt_viewer/main.cpp | 58 - tools/assimp_qt_viewer/mainwindow.cpp | 466 ------- tools/assimp_qt_viewer/mainwindow.hpp | 148 --- tools/assimp_qt_viewer/mainwindow.ui | 544 -------- 12 files changed, 10 insertions(+), 3054 deletions(-) delete mode 100644 tools/assimp_qt_viewer/CMakeLists.txt delete mode 100644 tools/assimp_qt_viewer/doc/Assimp_qt_viewer. Manual (en).odt delete mode 100644 tools/assimp_qt_viewer/doc/Assimp_qt_viewer. Manual (ru).odt delete mode 100644 tools/assimp_qt_viewer/glview.cpp delete mode 100644 tools/assimp_qt_viewer/glview.hpp delete mode 100644 tools/assimp_qt_viewer/loggerview.cpp delete mode 100644 tools/assimp_qt_viewer/loggerview.hpp delete mode 100644 tools/assimp_qt_viewer/main.cpp delete mode 100644 tools/assimp_qt_viewer/mainwindow.cpp delete mode 100644 tools/assimp_qt_viewer/mainwindow.hpp delete mode 100644 tools/assimp_qt_viewer/mainwindow.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index 61251f85a..dcafb649f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -277,16 +277,14 @@ ELSEIF( CMAKE_COMPILER_IS_MINGW ) ENDIF() IF ( IOS AND NOT HUNTER_ENABLED) - -IF (CMAKE_BUILD_TYPE STREQUAL "Debug") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode -Og") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fembed-bitcode -Og") -ELSE() - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode -O3") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fembed-bitcode -O3") - # Experimental for pdb generation -ENDIF() - + IF (CMAKE_BUILD_TYPE STREQUAL "Debug") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode -Og") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fembed-bitcode -Og") + ELSE() + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fembed-bitcode -O3") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fembed-bitcode -O3") + # Experimental for pdb generation + ENDIF() ENDIF( IOS AND NOT HUNTER_ENABLED) IF (ASSIMP_COVERALLS) @@ -559,17 +557,15 @@ ENDIF(NOT HUNTER_ENABLED) ADD_SUBDIRECTORY( code/ ) IF ( ASSIMP_BUILD_ASSIMP_TOOLS ) + # The viewer for windows only IF ( WIN32 AND DirectX_D3DX9_LIBRARY ) OPTION ( ASSIMP_BUILD_ASSIMP_VIEW "If the Assimp view tool is built. (requires DirectX)" ${DirectX_FOUND} ) IF ( ASSIMP_BUILD_ASSIMP_VIEW ) ADD_SUBDIRECTORY( tools/assimp_view/ ) ENDIF ( ASSIMP_BUILD_ASSIMP_VIEW ) ENDIF ( WIN32 AND DirectX_D3DX9_LIBRARY ) - + # Te command line tool ADD_SUBDIRECTORY( tools/assimp_cmd/ ) -IF (NOT IOS) - ADD_SUBDIRECTORY( tools/assimp_qt_viewer/ ) -ENDIF (NOT IOS) ENDIF ( ASSIMP_BUILD_ASSIMP_TOOLS ) IF ( ASSIMP_BUILD_SAMPLES) diff --git a/tools/assimp_qt_viewer/CMakeLists.txt b/tools/assimp_qt_viewer/CMakeLists.txt deleted file mode 100644 index d8d8e27a9..000000000 --- a/tools/assimp_qt_viewer/CMakeLists.txt +++ /dev/null @@ -1,76 +0,0 @@ -set(PROJECT_VERSION "") -project(assimp_qt_viewer) - -# Qt5 requires cmake 3.1 or newer -cmake_minimum_required(VERSION 3.1) - -FIND_PACKAGE(OpenGL QUIET) - -# Qt5 version -FIND_PACKAGE(Qt5 COMPONENTS Gui Widgets OpenGL QUIET) - -SET(VIEWER_BUILD:BOOL FALSE) - -IF( Qt5Widgets_FOUND AND OPENGL_FOUND) - SET(VIEWER_BUILD TRUE) -ELSE( Qt5Widgets_FOUND AND OPENGL_FOUND) - SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "") - - IF (NOT Qt5_FOUND) - SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "${ASSIMP_QT_VIEWER_DEPENDENCIES} Qt5") - ENDIF (NOT Qt5_FOUND) - - IF (NOT OPENGL_FOUND) - SET ( ASSIMP_QT_VIEWER_DEPENDENCIES "${ASSIMP_QT_VIEWER_DEPENDENCIES} OpengGL") - ENDIF (NOT OPENGL_FOUND) - - MESSAGE (WARNING "Build of assimp_qt_viewer is disabled. Unsatisfied dendencies: ${ASSIMP_QT_VIEWER_DEPENDENCIES}") -ENDIF( Qt5Widgets_FOUND AND OPENGL_FOUND) - -IF(VIEWER_BUILD) - INCLUDE_DIRECTORIES( - ${Assimp_SOURCE_DIR}/include - ${Assimp_SOURCE_DIR}/code - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_SOURCE_DIR} - ${OPENGL_INCLUDE_DIR} - ) - - LINK_DIRECTORIES(${Assimp_BINARY_DIR}) - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pedantic -Wall") - - SET(assimp_qt_viewer_SRCS - main.cpp - loggerview.hpp - loggerview.cpp - glview.hpp - glview.cpp - mainwindow.hpp - mainwindow.cpp - ) - - MESSAGE("assimp_qt_viewer use Qt5") - INCLUDE_DIRECTORIES(${Qt5Widgets_INCLUDES}) - qt5_wrap_ui(UISrcs mainwindow.ui) - qt5_wrap_cpp(MOCrcs mainwindow.hpp glview.hpp) - - add_executable(${PROJECT_NAME} ${assimp_qt_viewer_SRCS} ${UISrcs} ${MOCrcs}) - target_link_libraries(${PROJECT_NAME} Qt5::Gui Qt5::Widgets Qt5::OpenGL ${OPENGL_LIBRARIES} assimp) - - IF(WIN32) # Check if we are on Windows - IF(MSVC) # Check if we are using the Visual Studio compiler - #set_target_properties(TestProject PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS") - ELSEIF(CMAKE_COMPILER_IS_GNUCXX) - # SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows") # Not tested - ELSE() - MESSAGE(SEND_ERROR "You are using an unsupported Windows compiler! (Not MSVC or GCC)") - ENDIF() - ELSEIF(UNIX) - # Nothing special required - ELSE() - MESSAGE(SEND_ERROR "You are on an unsupported platform! (Not Win32 or Unix)") - ENDIF() - - SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) - INSTALL(TARGETS assimp_qt_viewer DESTINATION "${ASSIMP_BIN_INSTALL_DIR}") -ENDIF(VIEWER_BUILD) diff --git a/tools/assimp_qt_viewer/doc/Assimp_qt_viewer. Manual (en).odt b/tools/assimp_qt_viewer/doc/Assimp_qt_viewer. Manual (en).odt deleted file mode 100644 index 6e4e8c19312a8f578a7f399848b0455b8dc435c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 685096 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%0D8D6t6 z>-!^cLwSRFLW*`jeFL(oVru*j@9HCd-!;46=d-SC?%6zhOCnn@x$6??c*oPnEvJ4& z>ruP9&=+5|#9sttKK)%#sLbjRUB@4hp?k=!mHTN}^aLk{ijkrQb{R5bg^Fal_70x4 zJZV7d&`jSB1Exe73b1bJ&;ya*EIkcc?I9h+|KA5V9I!s+kzoCQ@xKoT*vv!`bxQfd zmm-c|5~vA|Y=eCi=)gV-U}p^&=)bm1oGnXHqpnyFT3_zLQQSGBl0xS9owtw!M z!B70w_iZO+Cj$UfUWimA(+TTL_-VC<<~Z95Wb4ZVag`(n1wBm&VhJ5!r5eiqTgfmh z*U%bk=szTgL##|goveQ(GT&L*hJLbw6SAQg7McG4B#AbbOd=cleH=43V`WQ9mibO$ z62sb`v_5od?99rOlrA&!pJc?#3{rfEVd+mY8mchXV5Lj?oxzI(_p2R|_^EGY4 zLQ{bg`A$|}fr13npcAL62P;UOZtF|bm;)yXV8HqT!Z=}rML>&-oyZD@RAK+TO{C@R zX+ZH}4ZIw&d&=?8S^j|(S8Q0QEG{((h=yo__#^>A(+gP*ej4+a`^xhPUASG*y04#F z(*SL5KC91ePV}#zYAXoA(&+bcYoYhzhra2RKSb zLdotB>1aA0ZSF}!83=RNI0IjvMYYm7&YyNw&UvoRMIV)8NUWfew^4tiG{P>eWF3E8 z=wgm}5!EIQgR0&Dd|y{^HSHY)E%`Gp6XUJsg+GGW)T~6rayhIN-#L2l;$C?yr}u;$ z)z1{olNq4X6SDyacRR)bwWKPhSyqkb+RY%4gezUDL}G zP@;Awj!=G5E`4?PX$!oe=JEZA>1~xnpjjaxZxtHDVOk9Kn3t2MobGZ~aTan)aoULm z|8mB6i#OIEylJakd$Hj7cU0sozPKcEB;rL#Gw@rj&VxQ@5pR=_V197E_cOHx1=+C! z$31+qifO6wg&PdwliKAXz4t#fYi7I@ZPk=%%@Td!4D4Tg%t81W`T`*ECMsuKPoZ6&I15J9 zkqF=liFtxZiZ6fo8W!+_MczGC$=ROrk~2ZKFtju2w6*U2>%4Gc90)s=LB36mE0&S^c=w^o!w(tubazQ6 z^Z#Nd)|=P(9ENy~C%&EMKEUuFfIve661O^8NP*(SdjOMpVb*~=qA+xX8cAP?0ML+-s^&Zda^L(R zNw~U7Gnvdzv;>ThYzLu{6kbET<_1V$PUg$#da1evE3~RG?J|#d3GsP%w(((5ydDiO z+CQ?5M`Dqnlk$PmLxdrEn-2{c8i8JS@=_tmq#m@Dd<@gY^0}UGW4M@n)i*{-Z@HQW z#FOEJ2kL!_`eVqk^i?V-e5`s#1VlrZ`$&{b{R2!L~*2iCo|xHh=1+%C7mnb z>K^NvRIb$+g>T|;I{M&!d5Pailf0NG(XE3;FG*CA>#abYr~KXe7tKq!%t+jyh|g_( z>38>bUbMr4@-(#%d)*jqU`$@;kvr=^0WCcNh(uwx*Bp=`-ZWS$Z-up{S~jIihw{uK z_paYTMis*3g9Nd3v!jAu6TL9_Oc5&}CBi{Ai4C_Lw%&s(pok#q)*g%bCHgYvM?MCp z(6;*W3DGtzau6;M zcZk6L&@za%g4ypwi`v03Z1!I!nr`mM@~tT7 zpi?8rwR+`3n7I}25)kL-z_!0o^+(dv6E@D-96}fI3vxjUPY|mPu!0JkBfG-n&0lGGiKP0FM~j zMZkZGO2~hA$5s&9wG%2qiV7vz#SlN#W@bfLcYZD1YhBr^vrbKatoog>< z?h{wHl_Zmzow}_tyS$7sIHRi(I%2D9jt%a8xY-Y(bM{{OENPCB?RaZ(PApt)ug6Sh zgvo@dNC0x}LfV6{JZQ}80tJ1q4l6TxYM@MCgaA8ZAv_Qv@nCuQ`NKH{B@GjU1CNRH zRVbG03?a~?mjzG<50C<(tpr^V2D_Abf#c}1Do{x9s~iSs#$}`g7$Q2yAN?bO=&$QK zM^%K!kPW<{^&LLKph0Z67_#YmW$sD0D>EbO7<9qm`n~7ULRYPeLDaUuX4V?S((m7Z zel-_a(=1{rfhIbB>W$7-JV{D;*yw>Go!t~RtiN2U-^0kEPR*sfm*Bpg3*AJmpd@1ZBK zW#3%K+s|3>ZKoNc6^6qrHLA2h(&qmHe1k-=4MilP{Xz^4Q;f1@WbbJzEAW}fNc3*T1>5($i3(q=!b`yCYp=i?`U7yK9eB|GS zw?kTMv0!gt%VO7-CTe%=%wa!+-D$1{e z5cPVodxcLYSKg0lv3KPfZSldTWi1Z9yNdnY8T!~A7Qvy`*KhkIM3Gu7X*Gl|-P%{}o9a&KLI#?kBpnJ)O(FbXzrJ5|Z6` zfG>kQ`fyWbUnFpVY_Su}6z_+z%*JiKUSMtv<3K9!05mi?q1L{6lWCLAzM69CJw_A2 zM2MSa6Tq1)fV0KYAwtGp&4wFeg=nR3Pwm6u^GCwyh*Jaa?fjkx1V@I=mX_2gH?)vv zZ2hy6(`+WCYXAGJqwxVZtK*JA?~LXf%HrsWXf)li;$(-#KE$Q8NK&nN^wM@nJ54y|2p{4 z-GKFn+Q6Cr?xy3rpeS1?P+`G%{#Z<3odT`yH!2kh6zl5jFf2Zv-gm;Vvp7-4sGHED z(7M!!laQ@&m`eaEE+63VM2550>8!GMK26AB3?#!TT&%Jpp@P|ih%wM^NLY<0v~KQak$$Ej3Byu?;+ ziDaGug-3)Jct<`71YhXj1g1AuM2J94ShIE|4scIu$lVF4<`a!W*FoCoeD)B6Q2GTx zfzoqt2{OzzAA#$C3!!hxqCn*%;^;#rl9VR_2|y8y(1^638TyE8ZhP>SEd80teyys+L5Z7F!7i6LNDEPcolY%B2*gow7?J|Cj`P`#TP9B%gQ9KQVnF z6RT@5f2=!W38|Cg+10C%9kCf)v9(_z0)$BzzyN*b(<&xhx}$G`Jz>`eBF0P3IQNga zace{gOx)CZQdjxjlW?KAP@stVcLL+^kWGTNG*s}b1~LGcCQ|6ZFIFyX9a0DgE<&(0 z<{_}K(6OtYd`}%M1MX;P&tjTYcnAP=hn4{q`U~<~*?PG<{Ff5?#HD~bA~iOHc{XBG zsDf{h#GGeMc#$xWZ*5P$c|oJJ*D;|9d=4x}arA;yfF)vLmmL{yL#0e5Lx_Wobi|jQ zRp9;f%9l~=2pdS`=*>Zc#rqKiJl3DquF9Xa!!4Nr5c9K6yT=cN zED*|tX+S z%-JM<=vVNi4JPb9^|(ksmfWx;fuNQMMk`}@i8}3uwXuH{F2WFiG}a{WmCay``WU-s zFeE7y)0U#$lerw@i*d^mHglf_?ERcB(*$6W1AibmAGSuUR4dJMaWv$kCL?F~TaM z3ef!+oH_cIW7REA$4kDyK1B3MKYiQ>+MaSD>D?x^tS=P^&Vp;GG8Nm4=*U(vWF9$5 zf;^r3MLT{7EDC^*1C=M(kI%~l{kYhei;fa|B-I%IFhOTU2NSmrm}9jF!;D1kH# zQh7)9Eq2&iYr z-VhQT?o;*V@w&%fzj8xj*>vroDEb^e`v}M>5~$1t?DKy`0~mi+n&6>>W(vazgRyxB zTUcE?hP54CkUlD?$16Q&hBDFFf#d8mEeTOJdM!&Lipxzt}D$I#t1kdC0_r#ZIe@R2jLvfWx=d{Q{pl>}JL2CdN3q^*{;kW$>@3J`< z20v~6#1{o(OR-KQHeTXAj=u>Y$EQ^%q!K|NmpB834gs2&i6%^7Wn3Qw!824m%zyww zXNF}GAyAYc?hQmSutYY^`SdEmu4OS+0ov8-B>+vaEWRBgs*4KRP4-IKA{bMH$aV}$ zzxs<<492zf{CqW!+Q!UU#Nuz@uuM!FNokgs-|P7eKtSocc$S-fHx1=DjwVl9yEb=X z)$f!}0{Me>6BZH!O*qV%_7c+{?Gn+~!Y>f>!%0Y#AhZ`o;j{?imS08oj*pkax7g?~ zQ#ih1^FC}4gaN*Em9#^2WULBo=1VMN`CxPUYrwS7OVpij8sS7~9q6A{9g}7a_)rs# z4U+to10&vDcm?V^`^pNTDNP3`$HF705)Tx>Ul1b-Vwhfv;W%v69ZP5}ro?~A?X%YT zbKci^Aj8zcg+JoLt#CH&n6z917OLy6FYmSNbheV26Ihx^=iXWNU(LjQ^x>HzCgIZB zjYDddyh^tfj?m>2hFl=)t-T~#R!~$neTNYzXb;&>3-G6y<+$G0Xp;6qMJpHr&ZuGr z{2bbJ=34_8Ld0Dl?7&j>t$vX}W#V0ClBkEr721`(Z;*WK4q>0~#1N#CK7EU|3qi}U z`hn*s{Z`#u7}jZ|6*6ofZc*i5CcgIN6=)1oM+4@iPJ`#+akbcnnq$u;KmX@l$9CB?O33+I{it$$#K=kp##Q3ImKt#;Z6{-}SWrsH?q1 zEbtEV&+kh3MvMw+1fd(v| zCD~MmGZaAmDn}v%&b1;Gj_D(7_Q4fewf`oby!;4$_FH~4@qFdmwbld=_2SY-|J6JL zZU){dE+2heD5aN4SfVzE(cKZ130{_{y5s=LXe2tAB!R$g*J2!s7um~ z>`4HeF@M4$D}JjV9*Lb~LhnN%BH!>X{wq`Q?UZv)kV#0+SIB9DI*Er1 z!4gdH=n3`z74c1M0eG3Va?PALLSET#Q|X|L9{#Yf57DTe?aS=}<~=mNy{QpGpzE7y z=pY4KviDp+hS|}*V62inj=g9jsFegAIxyz_K?54+_dVnB@G_OLSRFm1fOyvO$NlAH zNH@6C_pG+IjaY~h7*hS60hume@O|LCBy0ueLKDa38(gzTw<}ZVbv*2EMil#5f-iqc3#2ZAy$K8CI_6!; z%sjy*w68=VpQO%oiJJ8_h6Kdwq_X>VLhkF=1H}nlQUo!HRh!s|k`=#%!`JZ{455is6#33eu@G4J0moswUDIw}Q zA8DVPc;s~i@yWlOjVW!lmbxJ?+i{J00JSPMh6uag1dDP-#8x_HW&%M#Tt^(#YdbXB z*oylqL*9|4?ZO}W?T;@QXuI6dyN5=gX_?1N_2YYcDA%^zAQW}`Nf+T=1Pxih096&e z0E!dO|KRSu@lJ^d=x6 zO7FcZN^c?-ngWWvccJgQ_dfgVv+q6Ue*b)TGQYKE&6={FGS56y^31yx+fNXL(yS=# z86_?Sck5dp6O?1o2rz_{Cw>EG*GO2&ayRW=zGu_6TAbszgi$Na-u)Es)jIh#e}gPZ zVO`H^P310^jh-tEeO&IshXt%6Hrgrq@IwS4$>1Dv97NkpquQ(H^B_s0D>ATkvNfwn zleAh!sftR#gMo#ZrE9-I% zrEqQ1LCuIs+8TWqA-M8P96c%Vp(+lGy-yWrqV86r6hcQ`$f%hVd5g5+d)jk;-AuIN zYCQD=!DZ})AF$V6Y(+m(8rz-^6GrfJFXaB3Cj7}o(URZ9VrDxItM&PKxF$;ODjHKP zmnt*33D-h3oXOCAqKgB0F_=m*Tk8qLABR=Bd;bq0!KP??130|w(>2Znfnsh}5wvk1 zj2Q5jOeBQ3_({-rXNgU(h&zaN4_JjUMsAh_fkzWw%Vtz_Kb`8x@>1zv-1S;U2Eh#> zJ5gLN@MoeBH2JMLho@bhCr{8-RG?TCekE=B+&U0LZwm;5h5zyZxVShR-Dx zf^FpCaYj`UIG{%(_5=UfxCFOvM!hsGyJyI95SJ}3W}NDxB%JwN_jbtknw9mOy`NA* zG-L2x@KF6Nk)BO;W1@Ky^p$qF&twSs_b`*Mh)}@~%(OK6HEk417Ei*co|!XXwNs?r z_b6^Xwn7gF1th+exfK?Gf_4hiyE^KW&J zIN88%3Kg^Jt!h9l;FXkdl{krt#e+tLcuSCX_tzufR!xq`=C&!b)74(Ml_b%?ZjJBs zBIS2USJ}*$Oz5kIo#Prt($xwBjX$=thEAtSh^S@^tK!cy%av&K6}?=9GSFK=Gi`bB zR18siQy~N_vrilA4x+#f?IzBRK8INT-jD9|yfQ2`@7DTmj*HnH*#*GylZZj7iI>&_ zw6D2H{K*wBiSvGqLd4T~!%@M9%4wVIwjQygN&ZSiTw6v!5E7BdQrkpYVCBTsmiN+@ zLQP%y`em=&$GY_4=EwcJ-i0e=6b1@5x-qv2dn!mhJX`0oMv>cRNHKV3YcEeYL!!hm z1@HS~L5FA$^m2&XEDMyJCq|X{10;}35eQo+d8%Z%&ep@MuBqQa zL`v0Z&YMhdu|ws_Ia*Rc1_+jJw3dBTE<4tw8e4>-{fU!P{(@upcmYSl547&{7F-3m zB}3p9X0Q-i3)*%qBf5`bfJ`c1mU2TQM{le#PqF@>nrXWx(I~7mp%aP|FefNYW-nxF zrc#{I;zIH6(oJmX)3JP_XD(60iv%}VU6*(HMqmMC(%fh?+So`Wlx3%($}joJczYks z++9#6MK&9#vk3`ooQcUlY@pn1&P7Jqdcba%aRKlfJVZnvM5|Ih=#IH#62lI(#Ohvf z%@lh3tK`b&LpLLqvoBt7S=?5*cLy9WPyT2mz?+z8d%YURsD)6~6_s zjfBm!`5gukitKfkN!qkD(vBiqKMV>eHTpdLpC8nKG zPpQ2@n!|k^*@q4+`Hc z`}y1moefiCIY;xLaXyUpivm}f4pawXIp1+>;}z+GQWyT?^*3MtRPbTu_95q5(VCQv zqKIn!3cq2NEm}qbPJTb;S_3t^*IL)@c^GS4q@fFx!R{?4$qB;xMvqIUmTfRMi6E#O zu~`#?F?~#C?^~U7Ox2OF*$r28eZECT4v$u}`NC~$$B`a!HA^ES)A$VGI>zItG9@Qb zT)w2x!cEI-F+bajf80QJ+t!YtHA9(9NIVcQo-*a@Jk}B2UMoBLg_7%5>k&Y*$W%B4 z!`1NxNTQsSdTI0U))5mK9uurs`!cD9=*w}4%2gD~h~?K6m4~7g4T6utkDlE^Q9%{f z7s5}48Y9#qk1f#Rg$de9^P6romx!crn+_h;!^3mVt=nng7Vge1wGa*j8;YBiNyI#L z^HP=;4DHjmgT`;M^YM<2an<|N<*X}yFo)dJrPcJ{Yio)8T<*xHst(G}K^wRc&esn#U z{dAG#m_h3K1&$D&npbaQAsnGJSMSGSFkd+O_o)&?L^@{cHfxFimOZTg)bB zk`|+T)mrtqmr{{n@DbH`JIof#iuEq)JV!fpL7bGZw?{RIpq zwciu59}-F#sL(>8(II4ZZVa|%l1dCO^|tOVOE*7R?6_s3bx$WAQ!i;?9#HKhNN1{& zQ^ZJrW+I=ww=m(xVaOxz+!i_1^TpHkkvL+Sg#0UU*Zte0&tFw85K!tRm$~M?1r^X$ z9}0XOC>U|?5+4~Gsb(U3I8_*Ql^bxV>83NIg(EV#WIAZo>9Dk{7yaN7jRfN7SM*el z07xLd&c4PzRz8^IYh~w_lKTTzxm%-fAYKJeYxSC4B4i1z^>at!&+#z@)i}u_%Tr}0 zWwvf1ch7JteUXVuiW>7&bp#LrwPWUZcor%69^4vYq8V~F?j#-Lhgm4Q6*Yzc+f8-$ zrYo}+4pBvLH<{3x3`+P3JXFgO<-s<)f0kv{|j<*oI6<`CgtqHtfu*9qlkON)RT{^Nb-9 zwGf0t#TkL>U{kMt35JNx~|IpkUw=-3=L{nYX*_&2-7^t;Q8 zB=b4W^B@oYnoc&q*hO->;9`E;wTHu}n)dSxCRX^0s}s~$2tea)^fEZwZ*yQ5?xCRM zRGyJcx=~wQ*?wV)b{B#VD4)1e*5IL;7O8V_N!rt0+S>3D+q zPb-z4X&?}@0wq3|8fY?{XI+b5E~X@^$=PV4KU4iVj{QCn=B^9(lZV-i*V?*#d*O<- z68Ga(Nv#b9aGtp5?@y@!mW$;qa-b~=OxQ1$AWMU_xv13`TzvN#nrf=4nCvdc2yO@nBRc4bl_uDr1gx&UF{KNx%$`-|b#Q|C z{cO=Z6}KFmOSnIPKsncDhQ+B-^zDdd`f`jU7f z!~Ck-^(9RV)VT=cl}4;pJQrQoIo4a_TTkI`ySzeXGvVu}Bqj}i4=lmV115-0sQ<)K zaL3+WV3>NyCqh7u$%D~O`1mst^ho|l78!3;+ov3Xdn+?lm8mu$F;}c znpG>uw(YXgEg72_KIL)p(SCtG2=rO2yz&zjUoS&eLAtvzHn&0EB;EoeGr4fAygq$>)qllXHBkA#Ni@(}74b97|D=nQ^g`kp@Sq zaRdQppr@P=V+O>@iLz6y6a;hn`bu=Q<1A zfuYgRrjZC(`gwh2wUAqov+Q)ddQH(01Sm(x>6Sc~gWqfD6k#*$0UJ9YYVdr55smU= zZoavz2P%D^qaV#Noof=g>|y@o{r@1kfKc;$lU0K=h~D8-y(8onai78eWCP_t@4vKK zHSzehcFsi8y#oG|2PE^d_eByAD(p&l)efo((Df8eYW09CxK&##KCly!Osohh$D)0{ z#VM8uY`aCL@t0fJ!NN{#>3$`uxL+h<$(!9Ot+} z83T3t|DXR5t!ICD?Y+9VeZhbD!aoMi#af#pOh}sm?z2iA-OMo$11V09pr>y zK?nr)u&;P-634YX=@~-M4Y>plQ8u)cCU6reYU_N?^_WQck?~JoA?2t`-0B;!$oM1k z?#_naW%i!)cm3L;85|y`d3cZ$`*yZ!vXg#Zd@qN%RFq0)OZfRtubdiBNM@i)4lx$u zZt*xXPzAqxK|dO_1@fu<02~q=WwBCwgh0{Jk1#7_mHeiN>qL=3yrU-RAwPmN9HV|b zeMcw2`3Qvy_oXYRsR7foB?TEdJeTKo0Szfy8$pBxCPYDaP zS81M%U03i`i9h;8C9iYwGtB7#``L9Rb?ttPd+^#BA|?7I_1?63rS~;>zK(oxMN_v3 z+4j+hCHm#}Yjo{mQnL3JQ^PqApi)0F?_s&%a<(U2U*UMkf`PyXIgf2`-87kHnU)Ik z{QHA!r9|A1K(8^#!4>OUmdm`7K5)JQi>m+eIS6k1YD*{Z6nqltpZIIL$DI9XhgSM4ka&w0{xI23ckGpCg2L94`$zq z8i^ulA>}VkUOeE?J#D84tDoY)h#@8-~*v-I3+~;=wQKrL*Em;?sFRK zsI%J+BCC5bV>GbbXwhXjI$nt#5(`VvN4P@S$05w|G{`CiJS;&4Gd3b5F%mwys0%}n zQezVaQM7GXZX%QmfT7o5M`>WH2jK?8fVd_w8Y)K}k0(L8_F&s7F>U*@NWFeJ@XHCq zazT`sYEseoZmg0HY%fyOicAQA$>|fLwlCA?6X~gDslX6;7{Z@A4mldZp4Z0Sh64}) zx>WatugDQfZlDXw^#Pp_n-tvM>l;4TF1FscoPSyTjcDS;g*mZ%2}83Agd z*a;ErZECytONy`rO`!=WdvG_U zME}Kgq_rAS?>8Wn)MI#tG*CD*xBF`CCLGbtBMvD(Kx9OkO`=(2qtDBcQ#!yF(b; zSfLe4lzu33l>8q7G2RVDW=A0n`sK1==-nXXE`b+<2eOGV!ClNNq3ED4xx63@wAuf3 zxbWLwd7p3@9z+c64e=&u2#JQGw__-EgM{eGgn|`?@DP-kHYz9zR#Em>dUn^Z0Z3?+ zoSq_Pr5yk+%Zce=vWF;n$k9td%RYlu~D6Q2{K^n-t4oZU_%54&Kj>cvWyOS}4_9^U~27!u{6DnxkSd4WmJf|Hs z8YA>jU6fmcJx~V_Z3o22F|Co5HsA3uc0CgIUlf^q4TWHFVWKOcz$gtiXc$EVhwT#N zcxd1TN{ESWA^lKbDFQhUQbf{PInfpTwy%CLIvfl_#0yo%T3tru;II?XK!+kAMquZn zqD&YBvXv;SNYCdZ@ZEIRND!C6HliJa#X(W{LCV}nBrck_Eu8mJ7;geO9i{VuqVtz!*yV%Q27fz`kg$>p~wLOpn0U=@5>;9GH zD;5T_`X0#b4}cvCWS%0%rjxQYlKD|E$~}m;EgHGh1w&lE2m)egV1N2m2!GCB=~pNL zhz5p7@zmR>^4cg1;Re~4`mp-c$h{A*!8T%`f}#6Gk*RG006=uG0D!Eb0k%Vh6kFwZ6h*5k;9v=( zG(a`jpaDQ39#4wIhcKUJ`RW2<>X(Db5%nVpG;sY+IUY?!RUD$40`%-)4IPxyARxb> zI0eM~&kU6ABY++mWdaQ_4rU<-ApNIVs(xh<8v!ZuR~B&h*`gBV8S(4cuVf$R>)i~gA&jNc}fgIop-+7UZM%%g*+_5S)O(N=({7J*07UV<6mVRZg9R2VSvZx6W) zC+Y{rTbWx2c_n^*E_gYusQo7h2r;|$Dc!S_02pE-?spbA(Ewo3irCdbNx(q>{wxP9 zZTE%$!Gdc~mjBFxfB5Ke6#;-!Vkb^v2PVMut;}LEzfduFT096R=&0Yh_ApzMBJ_IL zFYUAMjhw#O)0W#C7M&Ot-5Zqapuzrz;BVKlzsnPLPsWK$8*Kib<3AAuPNBDiR!RcWT2)Rz- z%zF)q%SL}WS3yB+Qc_Z;4xin>b-uk3|2HnOVcX)o6I8C2hIskgs4zvF*UMT8@GxRu zHx9D=Ngv|=7b07I!iS!`+gxNdPTqViYyIAQIsewzxj(sdM}&J_?%~|_>1D6E=b`!Y z=3PzCJ&sGaEdGyu4qOot!u4NW&K*W>Y|XTBs90J)+E;rYH^!OE+%COvg1ob#aPe`` z<(rLiIs@1bmClb!_iq}%AFdpGY?&w9qAH%AbRyCD@mb0{n-j-{kDHYN&kA3j45uIb zkOd!|^mtqDaip0IPw;E#Cl>tgFL{A_Ai4R#V>UpI9s(l*pr=|r=x8B0T~W|e&6yB(J zJe0^?7}j2N4&vtKmY%pE{LRwz@WI<3hK7fCravuceSAJwnZ_4% z4ZCLckI#c2CvUsg%v1mE)zgEM=R=Q^e@JgXX|Vtky#29z)9%$m80~{8qZ>E0zPQr$LU zDaD|$(*sF5{K-&1-@8H)1>6v#6mhS%kL;oQtHS_MRrMr{=P~E}53jV6% zKNZ$>AkFmdou#|0|In}CYfE=)fAGVknBM(EaMse@-hZgzKq}=O81(iZT04+Vc{l$b zg1#R!20lCcKliPOa3gEtxA(<1ysdc9f>zYwl%Qk)pTDphHcKgb98l(u!-`pW}YM8^-w6( zD$$@6)vebCrZ~L)UhmeZ@bwDX$lVS(;MIwczNVhf-(IBMyzgE0Y1%ziFo~PqJV6#U z=ZP|{61nmwr>Q~3+eBTAJXmtzlGW$ikVWse8^QrDz0fCDpI81T!z6X{-DbqaD$LKQ z9RLOwwBN%TyS$n_Vr3R7soH`2=PW#jDn#vR*&;X6!`HqKDY=ikl7Lfcgq{bin5~&g zi8}brl757I0A(Wgu>u|Kj-H32_YOjdz)jz>RX0d?W}y^ z&L`bk^Bo!slDY zOzr&3!mppCEA3zUYH!Wnv6yiCmXT8X`eotJCn;z9XTI7Qv$y9bZhXs-u6^^e@Y5%0 zXZshv+HYs?%un3?mhrrH?(dO*PkGh!W`c8y`Wx8ns(+4&Sat>XhTE0Q}s{dKJ zgOcSbTlT`7>P<%0GNU@|49VIIiQdCL?c7$cCx|*_JUZt(dI>+^kh%nbs72%jol{%dyNsU(6@WG6Z6nrfF+`FF~_v0?AW#x^G zZM@&x_x>*Te-;7LWMldAihg$WZ_t{z5Fd(|n^nMmFIadnL1>Vfhc;Gtd@xW?`&M=$d*DUW&Rsk+TxxC!=v!OP7!`D{as#%v|!q5Eu0 zt;b0l@dN#R@1BA+4wkj@ujP`1@K81~i`)Fgh0pV0C|zR6QoB$Mbb1?cAO4|&ylmOB zx3%BqTM*46E%!}fMZM9C0}_8~s1{{tw4 zLJ1wo1|SVz{v!>KnM5EI*OBQzHOb9N`mS90i?~HB8yGEFRp^Y&z?J;GjlV(G-gu~q z7TXngv@Supx!CO_tHkojQiv|Q-f&ID#nfM>I?#%4jH97?#X4Jw357VTN`3q zzG1PL8*9V9mrsc(OPkolL{~eJs7lb05fB|UKzno?FpoGK*&rs9+somrR42E6d{t>L zaoMC~dnP$?h%gn*JV_wHSf3Oo9ecT0Eq5}NWYJD&w(1;D9YzJg>&{S_?Lb?YR2-+V z@$Yf3U+Av+`4y+VKwbknRu8-+R?Pjx2CJP_oWd3ye*v0`W&d`s_+ zeCX5>PwT)EdsJ3p7ZT|Hij9q+T3wW0a&Y=Qnihyd!jRLvL)$X%Cs?7y%*uu}4)dH^ zoT>d9No}trw-z^<=X9AEOW1|#!@YEbgse=7Z)WHY%T`A0%f0hf&b(W|<+rcyIc-56 z^(^hFusIUn8#?yDr)%h(=zYb4Qa5tUIf^1r&r}10{%b@RG;c^eEX5ezejbQeWI|z9 zrN5wu$Zz+E$Zr1#VvUZPSy8C3K72 zIkCBcw~xHKO-JXxJB$%xwFn9}EPo0uiI9uIqs+TPwqh@JjaT2W_uqh!h7s^^b7?nlkCo`oRLs2T+RE5o#U4qt6_o~=Zrjd*OW zi?FB56N-XiuQjQ4q)Tb^mf?WT}Its;hlDUC^9BBW9YCw1Obk@ib+d)y6@>^LBG_^L^%^ zc4hu}hY{Ny5Vzja%EqS8L$CUxkQNV6%;v{ZFz1NDy2< zmbU{5Tr&yj}U*Y6mRCXx6&hcsGIBWEV>$N=`n0jW7A)N_1gexJ!4 zyz)2*oRffY^GLAeeNf(>(=W~FJ2PRC)k}b|^7LF)5(%0UUzxQYjbdQQs|z^qeRQ^M zS}ev+P#L~19u?v`c05crA6|LYFd*?sY|`&$lzx__f}=X-#!3$JP@GBsD|NqS+7EtJ zV*L7?kCi5oy177s0wy46d?B-O%xwXOPZ$>LFI| zy-%c0%$Lqlp6lw5d!UZ*6OxY9^Q#IL1*HqWTsWE7ew2rRgcD<5w*pI(Z`3x z{NikaPttY~8NS*-91Y-20^th?qAF zl_qjC&{kh%ar!*|cCO(03r**{$@8CtU(TBO*47``{|}yVi`H8!zSD8_?#Qu7?kZ5`fm z-47O(m(lP`xl*Tngh}^J636f|D-*r?JKO%M61LNzjEe7)DsvA_3_`W7k@4kD>%r>)Sx@=x%rnaW!|z<=XN4> z2XFUqn_?YBl>1yDQz@aHCGkq6cZBF_ra)+IE&6L<6030egj&DIYFHXy@)VPcX+dg= z5=G0U8&t*Bw5zeIX9-0$b=Rzo%|#a5B@Y;b3yfLPY`J0{;R|A|+Tpszd{J%5-T7Dc zqy7NAa1Gf?)7JuZU<$klv9fMQM2IYx5r^GCtS4+38aP6EgZMSKaeXrCZ9mJk$8Nke zF^o7e0bx_`Ol-HLpg}x3DO^)c`@9m-VdRWK!Drm5Y!Fb!Z?Y|@r#nhMiD>9`zeZ!jANEIM6`acWV|`fd~)I)DxXWd!ht0S^FdXekvaZI9~&8F!O z%WVQ5G_j;PwPmOkV^Nyq=^VFjFFo|OxqrZX@8oA`%8sIJq`gd`ME{i#a>{ZQ$;m+q zTPhW%o{<7gKYaQM5q6UaH;~iWoosI5gDWi|p5R+4;moAEF2WvO&|Rn>PRZV*6K~kq zB}h_LuI;RY@K(COE!~4$64t5kwjW8h+PuJvTb$spJ9Gz3w39a7Y~C$b6~>dfYBy=h z+CL;hqaWrbGt-tzh=1T>;OR6@&McrKz9DIEdQB_IcpUnvT;7yfrU5SWMW0-jN{XFl zLf9?z$JMNOU?Ba+4R!{zrdi|QMJ3An4MzVIKADeWG_92#-LnF&NIkCZ!E~75P zF;^HY7+Su8gj(*-l*tTehuI5olaxp6od0~7OLYzO#uv9_ycJ{KKm`@* zyJeF!fr5@r>fBHT05^3MzCAHzLLp0PlFFCR9~)Siz!E~7sJ!pyb4VpnEb!LIc-3d< z{*ym|H*Uv&(+k1QPwGxU-{*_GZ}xY-U0!u=YGz~Z7R$Q0>?~UyV^{d7D9l5oVZ1oT z&YW6{z59&qUNMoL+LOzDKoGYK-Dw|4_i#gg6N&*fL?xDw0YZMvf+VizUsnbl&!?<6 zwz%zJV{)$DlAW$|)z9owg2Hv>zDzL0F_M_I=GxSa9Uxx_uX(xM?7yme$B5X-Sf5A_r891Yn4j&*)vScHLm3O`;~+I4&*{=Vhom+oq}bGE@xcJ-oy=>WC-o!YJD^t z9TLP!D;ZseQjw+GBKTSj;s;wg>6;<|-mSuL>ea>ZTnL|ZaLV9ciaaj0 z+lmlcm?ukollS@U{ix#5#q+xkzWuxGeQs-Agh})JMUDgm?W_G_PkMH{`E1^a6deSW zvW8U`wlBX?=vmA-IFF!mdP>fqU;zgVaUKqv`BXg_zmKGqS^jZItG&?p_FZg!x%~u}MbAFkk$)I|vm&t|&a6dayK(zl zCEQm?*VuIL!@URL&!ST<{Tln41RLWnPubw5BtyOhswZL?{hz*%YY=+4pK~A+BX%zr z#P^Q4{JZ7w^_2AhjzimvJsnO$tTJ2v!sFJG0uLeIF)+On!ckh0AHN?ZP zBCNMSkT?O~R9i<6t8J^l;jGtq*NEsT*#zmp*`|cFV1e*hfvN zq|cqnvJYcr&3!Zua`qyz*aHdXU?D@H0l8I`nnA20G*fEXcik5)7Z3?Vs@WYEQf}lIy|*1V0q( zsy}piSRus9_-0^brd^xhz}7O7sE?z_cKw8;$S)(R{h2H-ijE$+C;^1%Fc?G2j7JX5 z1_t(`W^NZw^~0?F7NYuoygNC#_;Tcn`+qxtYI9Wj__tw82GhmWO26y01~>90d^D}E zISQvvd-~^on#s3XKuU^l{Q+bRI89;dtw5Z0`z=Ji`vgjdCmq|TZ2BckERD(KY}JR0 zV)<*~8DD-7$_x+hdw?oL1C_F^R=2?$;Ia5O+r`441D#BUw<~t8kj>08S2q$v*Q*HX}HPXW3c1>ZYn`pH8s zIV_EflQj*ywPh)nqJxdRDJC&t7%>!Ta&0sj`J1oF-B4(d%O^(kKhy(ku{C zZN%OnaH#Dkgr1?czqXz{NE>4-=DDDASBsrEo?`rKnTwsG%~5^yM2ww<6XvVScaU9K zK3$}=WgfIQ5=@G*#ROvXtokRw|Dm_poIRuJ9x!z1uPG!ssj#S$BlB>rE3kyW&{pD$ zjy4@dhW1Ser}aswP&x8JjjBVykST}vxLj{x*AEG{$q}*?A7Z2DJSuMerSQ7t*k-W}sP=Fx zVg!@=o1S+&%9xUbh8Xc1Z%yrob(K+gDy_v3Pjt3*emM-Laj@EIH#d1jaWKa@Ncmh+ zyEGA8WZMGBB^w#x8wM#d<=;y0yYEe-OnT|}ktcXk{dp%um zvOH}g`uhvhfZ*$!ZNKo!xR-Z)Awc}j_dJjpqf9I%5Ob4kvew7GAXnb3JqGb6HK!MI zvq5Po3&ZGIkq~2W_ujqGpF@zqqNh9Ooji*>Q$&PlFkK#+bO|S9Y4vZ+?w-@~OjS?F zRT33N#u`h<^>ET-X_f1h$j$o?to_zKuZ0&Mq#FR&lSG-fl2q>FN|*N?V!~Z282a$aK-uBo73mg zRPGZ|30#N`P5oMIo~*@qdsw!~XP_-rAh0LVq`Ew6O6OtE&C9#QLn&8&jl8OWygicS z^9(l?+%G{brbhJsnsTy=PQ|Gk(OpE5z6>({_^E5faD-; z`>)xFKLF~v!Hkn45J6x&7B3WYOkSuecFuY(M^`(0#&h$J4M|R@3>+P zDj!P3Sfk`vOQ2S!$aO;DBDDhf%r&uN z$$CQeTeD4%?>LkRP`3!%*U(49ocj^yr4%cN2YQqf(H22_nN&W$iXOUVD*i-5ju$A= z=6snSCiYfZ$ELqT`r^dZmDl?|Suo4CAnrVN(tDyAKG8N{TkJwcgcHhif2~4%jY+7m z>BG&0(R>_f*J=;C?8fGxnSGh0m#5}((RtMx!#LXs@#X7+!~~8fTOn?v*sD7A)0kK0 zxi19D9O37djS|g>JZd<@STSRj*CtJ#-J7A{p+KWt16M2~+(f3;)6>+b(p_Sw4W*vu zT1RflJsXg#zWSEG&Mkt4_<^O)p3jernRoNA*1_eC%Ep)eLtCGnE#3c{k>x5^42eAc zl)$gvgQWQb7<`~>a6b2xHopiY7K6W~+tgr}OJZ^P(d9vUSZne+N#X|^v6ut6t^C$% z%#APk;=^Kh#6eYFKARYonHsE=_fYO!hW>SvH|z+=HDL#cr`}BI%y(=X%9V|N_2wJ> zb|QkE(fRPQLO%EOMc+fdYNh@QvV>#)w;fS|^yHoIIXh^L6|0JSu5q(ZmSjaRPYArW zXwGfZQ!=vm_OkD3zSxwYLWkwI&5{y8LB}^CfS&sM)>%HKqa~7XW%3t5TL_xvmh`ZyiE{_D zkxDUC#F%Vn=Oj&$W2P6ot8ma2&tTR%s(so^!MRrx7SlV#qY}=Gkq8!z<<`H4lr>*z z%2%3nQ_WxGVyrR$?y{oiOY_Oy~kiTCx5 zxr<^kUA62HCuh-6y0;W-%p*QWJS;CZDQyZ6NNuOio(rkxC$Xc|D*H;NGi{TMti|>- zOhigUHXlLSy-r+sn7U7`DFLsP^Ky4gJbw=dzX_Qm)%H^^&3z0$}E8LPknOKfGxO z_K|5ONgzK9rzQ#XyP3nzSCgVaG-zCC!7_-`51qgXi}M{hCW^OL-PXB}d?$LAoG7+3 zul#)t@!dzNB_k@whv;eheBH4H;>5Gn6QP_$WTqHx1IOBpl^5T_%6L?3MHJH3o?N~E z@F#aYIElgk80%5Y>arW+0R130Sw5Dp+at&zq`~2xd}DoG*2^NTX+KRw_yI{^%=Q|I zqT+3op`pQ3tSFvbK=20JOuo}-u#-Vwp?Zlu7mGOyb>R(`1|VlSkHu7eMe-v)Cp;}- z3&zTO#;-hOC=hOaO|y*uo;P`O{cQP?-V|P&@dP;e>3?+DfBX4k&ZUK;M{iC{{%SS9 zXr|ic-Dy>DmU+U_ zLLABztD1)SG~_-xf>En~076QPkzLNlS9}%%lNq3$t6f5+Dm;T>HdzjMb`8$5UPlaM zY|-x8ivY+hxKJSMD2P9@>5d}M7#7b&GIn8td6G7#W@g$ti6Nw_Q}?+^h?5F(mLa~h zqqm#m8G9JayUXRA)jJ(t*XJ%5%hMtjZ`-m*!M|=wD%@moP0Za2_PE+^eOu6|+~VA{ zOC#axdijE!YvP(AZ9$uzBWtSM(ol}#A*)TRw?V$N3Bwu9-OkywZBmiS=(h%{i2VZ< z`$9h|jr6Aror}gUZ(LtMWR*8*HQv;@{Q=zlbBG(aU4qH>=9L&MkymMX_@~VIi{tqc zH$~{8v9zPLdN>yz<^3iY1lR}uiag8(2oGf4YDnai6CsM#E$Mvuh^}v zQI|3-&f0@;6*CBvpJ%Nlvokg=#NC|kn~E*-v?|r)mN6f$3F#guno!Gsd#xaQnI__@ z^T3%~TPofyX%^1w^wjhYYbT%n;=7@K2*vnxHjhp??~X1W@8WslJD>0mBI7qI&!|Pb z-nB6{({tRwP}vo_tg9N2#!I@^FA?L|jc9fHY`qj(y~O{FqS)&& zm^NS5qg+w$nyJoe`E0qwiJ_+FD!b<~v>in*1c5nn`2<{TQB`ydMyI1aGp;`xpXM$} zzGE7W7l^fs^KM&{dg4r_J6>0H-ss1n@TC-Ys=3HCk*IAK!%K#PUbnn1GzZZNxf7X{ z#ySvp^PX{w#paYqSY5SZb`y?1?Ab8eo?amP$jL!Y&Jk)8t>vk>V{nTVPTKEb{S@Zh z_-g$}#%C;*ic(mlY1ggp9OF-dFFw=t87T#RLWQmf`h*T+vWj zO+MSyr;jSh9>wtu+S<%pB}G1S+qPX%DPl)39-&_OD7I)!3z4NCjV-yoGvN@Fk?$6D zkU9S7Thl8gAesl+x&I16ogXbsZ8NrcxX{R#1xxW(nzNR}4y7E!yD6i{8JzM0oe9o$ zW=~QW<(6^@*^M{F#e6-jpD|r#Gl&Ye4P9Yb`qH1rSl=d)gqw*Y8qr1-36vx`mTu7X z`#EQ59cu(Ko2-tTx8~5wk*?SkFKz4XL!nPx|I=5)Infk6OyOjle+Ro z?`TV9sDX)CUIJV{bX46NI#wXywea-)OU&)%A=hCwv7IR&AMwDj(i{*G!2iveu@W z+PcPfgg}dB)D%rm<)}8a3V93gqY9s;u#AgZzoa5?UJ(2M7a$04`*^(IeJ_8;Tk;Oy zQXAI3xsVE*2TM{HvqQciab$6Lt$ta~)%3d;Kj`2%l{g`qxW$B$ChJuJ*6m8Rj2GmB z(G?b~U7kr%*g9fX*ZWpJwV`u1djn)gu|Yvi)%;P}Dq02^<@i4SJR`TvmncX@ zGe7ClF%d*B6OV>~uf z+nGntx2gDC@APXojGAjex?!1@pkoZ&?^w@*7U$jd)4QyJG=9>zCw=CW*6oruFV(^4q3sddqZp<5qxf?uin3|j zGu$yYrIAgCF&^oyBo(SO(w}{mJ?r|hQ8cNhexO(yh%cF~jgdSb$Dmx66eDpoGj?P2 z=TJgeD{81#aP9Hcsm|M0M4$=&yk395r5Q>>v(xpNz#h}F8`gcxLvmsrq|0aXjMB@( zGEMm`ElV}cZk{QMd2Q;2O-T`%ItueI4ElJ)clc7E)p4L>zFBrDgOc`=qMQ7^k<32a3R9U<6|6`mYR|z$=z}G_L74+IEYNgh-MnV4;&P`< z|9eJxynoN(kGoo`@)i&E}xUNnHXB)zyk`@RE1sn;{t^Ua@C;CQH;hat2U-Lsg;5*s;pdufIS*` zea&0tDzP&zkGYb#U8Y2z4+wLPYF@V%FJYBgGu=tTyAg9c@N`>O3q}wbzy2DS|6pIR ztsa*-`Tg+5j$PEV$Z1}u)XypR1}?Q2+$m&;%P@Gl(C_iWTPN6=-x6=$ueu$B!z(|t z5p275huwkNz4Y*+Ti&M16}_IUXZ`C|%*^zXcO@O03U!me@*lDMZ64}``aImUIh!*v z#ujSU++$Qm(%cf>dYEB+{^0kJu<8BDgN=lhyyr9~Y-&hk2Ws|Hl3A?bkh};pfBfP5FzU-RL zEns_`&(0G_#qH|CC-54U_4w78kfm-;VK;3e@+{3K2u3Pph?S>`n_<#=j0CDODiZWw z>*F5M7YQ#7d`K9nP`kqT$yJGGS8*fgFwAs;Z6+Hm;VnMBBnivr9K1K(^pJLEYy+bT ziPe;IWmS_AL|YWWrW|P8f|X}Itz^p!$HRT!QDdsswx}Q`sx)@3L}=5$M*P%bW7YVD zRIt}1r8eQg*10D`It9OTIwXryyx!?wamp!oDYP+r z85vX~AEzRYT$QQquDYrv;W+X5$+Oq$ATJ1A-z_c}I_@|m`-jJ2t`sQkwK~D=A=yQJ zyRRO3AN`&cc`<$sE1hu({ZQY^a|s#+1h0C_1Mi)Hy4PdM2x+j9`*Hv6H^D6<@F}dbn|f-1Z-Yvw-48@>QWUgHqR|nnsitE zsb7}~IwvC)^tOkXbYJ`u!jup?Xv5H~E8uoA*H96t411=0Js^=OFu~}b39)A6VQ_+n zU7{+;xQ|F*mh64NqU6tfJPJGNbdl0VTiIP%;LVSQ8r=l2$3aS@E_2$EtwHs>nT44$ zOZ>@{gc8fGFbB1yXbHH|3f>vPO4#Kjy==`rdK77eB7D>9PsQAF2h>L1&GG8g#bZlXIFO2r-f7Me~>?^yT(ZDEi8m&H!I0W6B{iKk1u$ zapH@y2)%4+u{VNy9B}G*&NQSp;!ID2u_equWl6L?l!8 z1KS9=`Qm>E;e-@9PHNe?ixwYO6JWHvFmMN!F;9x3>hB>L@%DK`bg9Q~gmT)!)I4d& ze$Tn*ZZVRB_#E#IX0c{tiGf-#`!j{oB988iKrPAFktzB2<)%qW!hl^6-}cb8L@h5n z!5H@@qStLZ#r59FYiI|}AG`?eFRuRO= zJianOrto$+CV%oCpLgE-=e?!v+6GOJ2Vut?Ebv`-bQD&bhd^Gdbzzn3;%jCCM$IJ2Gbx&Z-^&&=@jGo7#f4M*5)^{I@; z{OjDBLR2exkx{&6Tv@)DUMKMxhtFmIhmMl0N|JV5la_Pg%CoUj)QxkEWdf^@sxDme z+E>WWBnd>Y_E3b(RA!pO#r%+MY39kjcwPgeVm?5CQ^>RSW15*61)(BsmSKmI>fh}YM4fZsr2x}jfU;@8_IZt+=RM#8 zzS$?hOUy$BsUecZcfs%^-N5=M!s<~;`phgkgbYKL_}4;f&nwOx+0XdaX{@O?@s_1vo|V){oC=S}F^_`AH+kd9Qtl|ICwQRS~CR_X0ko*W@qex*HpP+w*!aZSU3qmL^gveb zJ@gRtcq_&I-t8Gb5CJ@JJ$1d9xFxDB%8Yt7M zckF@JkMtR9_b zlqa{=PHu=3l-^{$_zrqpW1pZ~+4lB%-ggj+TtIj{8M;{v=N^u`{yyb+xr9$xwp2@{ zU{x70hj-|{e-K8;{0a^y5LaX|kt-4a7sNGd7BgrmhhJdB!@Efwd6t$E#=1xQn*Paq zUMXIpIYXu~(;~R6M$Qh#E9e;d$WCbkOytJQ?IRx)Wukry%NfUkNBM?1YZ1E}KL)N= z+UM|zxgiB2MKnRx^2RrQjYWv0gSFNMa$2k;(kz(Q0Qzk;|3WJONuO-ecaUqkl$9JF=J+#~? zQcfrPzJos6a4IK#iYkL2C1)FQr|~nJHqJ|8?Dz8bE*USooH}KZawugOj2s}o$J)4^ zLhE|b>2IYAT4`Lleh#_93di=Db&PuZDLH)Zwxqx}RA`b=YnIx_n+ySiuS+p&(xH@) zsx^@Kyb`Uq;KVLmufBrUIi3WLyk)1VEI`7~2F?qZ zjtZQai|*|~>63u_6_NSSTt^CCf*TREjh{8@owGTKyGa_Vu%k@9Kx@icfFPlniG)Tr z4xEdk!u^?0`De@>M#hB1+%T!|AlN3PhFH;*S1CTcV*IRHa1*_c2t%tnU`O z(6lQwNyJhsaqFa#kbh(yh{aXMgo)fjV8mCu%Izc^#~bThzdi;uLE-}28Xx&Kf$f{{ zb)Y{O7wJ{9ciUld)KB5Pf`7KwFtK%Xg|gPG)_tgwYVa&Em99Ldv9jH|N-~$Q{L3EL zy4()}*~yWgRi_~t0=^|WAG9FixtahqVj{_-GDvAim>7#06R+~{zVGL_6?`m5e-*B8 z!eSW83p_K*^$=3z*nWO_;VK9eR&?YkE49Zajpthpo+xc2g#vp>1#}j#pog7s*UE!2Rn|0XETol z4&0$j-ezhwPeW(%2&a1!1$UD%Y|hywPQE!WAj?>17)(ds(8#@4Sm#jzb1y|3YH6NN zgjM1*rJ(k<&Ui6qQ4K&qQ@VECv1J>zZq*KMrYX8O#v;2??Yu{%1$LN*uY_jgCIh8x z8HOhL3ciErh0cKt1!)TcJ-Yh$-jnz&OnR9gzac8q$wNHcTSTKov4z1wDUB|l;X+Y8m3&`Epxc%RWf|cfc`ZxBH2PUQ<5$dN-j1k(4WK1 z`J$_GK-!f7+wpkiAr=)6I?lZrS_q9oP<@Sw%4wNG2dDBP2W$JTn~?0My9r09an^~n zC1fOG4o;4hmhx>;AS;kL}_>km~jpOP0VV&nDX`w%nXAx}`eWtcv zpkN2qOKDejZZf=wg6{?#Yw~g$p}%a=sUvVuFJ8oyrCOX*P)}2mozFK59Ser6J%jri z@CJr{d@sMcBww=vH6Yu3w-T@|2Z%2h`qZG``)eDXY&$I%b-bCn*YkUY@|xUTfnwR_ zwIziLS#e>A_alc3CA1Q#R0}xG)Ye$`+Oh|NAjS(kQewksnO>IJ#N4hj`&Gk6w~!Tb zr5Q&b5ujR6x38ZP5?@tw@WDD3(e0+}X&X0joFq7%Hm39RGHAsOj@zL5mwPpeyb-k0 zYF)fFCP8hG&*3(3WL!%iqnSj3rd)r^EotAyuLAAKIj>XnQtPot&8h8UiPM)vU9cnt zax`Rn{EBMu8*&w08Zqluy>DPBXW=Hi7O_N%)3a=|<<#qxHU%CkYHsZGAsC?9?1dv3 z7O@0ZuaxI7qApVitQY5tVfxN8B7)o`Xgoy8l?vs_R725okk4GOL4qz0#*ZrmyvsFb$XL}JLBeSWDq7z?Bs~q(Z2y9?HU|4 zf+)w3_96ii?^JL?S#1?DmMk_~LZ>0gqX6=h6J8|A%xy-q9;Ms9wJmOhi62j-nd!2@ zt-&^2r7;DGu+hDpE4o-738%l7k^+k;Aym+>rhDXV=33O?iA}E;RNu+{jU4;H+(-AC zDR&V3=zM(h#5~t&B+sc;zEY~cbm&faOc}!^>3H&*M34}|;Ygu2LSCb7pxf_aYmkZa z0`U>U{W#Sai05{h7crCUrXFO&$O&fsldZ3hCnhG2k0(ClHvC}Q-w#E+Ru+_L;s@@A zEjTRHsz-$iKtkXGHyyHbJW^(8Be+p2YmHOMFAa5PGNoTo%Nj0Z`(EmHNyE$mlWk`_ zkcj>$6%#c(_gS?BF!be=;Cq=Wl!ItwB6F1%p77E<6g#KEQ&+CJs<8Q1Ib|MCH69M> zbqJNlAf=z%4StRa?XD96Z!8O8SiqOGxR6mHCtUX0$x`invTSd1Fu8nsc_WEIR#*=4vf zO_0`D1N5L%udMYmln6Q6DM!zI^Z_>FSWBFVF9PtV932FdJOU59E5Bw<*KKCVvQw6K zGtx7uqnvBBb!pE)U+6D0ZdI7Vw`3xNkSEPGHBSbYsRFm?9|+}r&2hr*ODR|=Ve!Vq z4|zm*f5b4?wEJ-khP?8Uoqi_u};D}rt%D=tgKP<8tCrd zK{B_~_Wb5uY(bbG?bA`7TN1*rT)hyE^lH?ajah}MM;B82#JJhKnbb793u+{^zi>M* z7FO0u!kCOAEHR>-QNS1JD$#MZVB03H=Opx(;#5Ol>%X`X#jtaKwYN`X9nZ`TY##cl zOwNs7POGxUWEU0&i?O?YN_b9NO$ou>j}xT>wmI8C7E4s;amoAbSQA7kweKJ(2}G1U z>R9Rxou_QSL^4<+9V)00VKlP%tOZEe#WkIKv@6Puce)&ehaZDvdo?`M1Nk#3$nEUk zbz%j5+%8Ov4Y%xZR4bz$_wIkAF;C+CwAj1)V{@Hz4?5v7o_Stt z{m8Z0@1XTb39L+ap&iN*-hNq(xHbHWLsU-T3AlbGF;Z0TB{zn37<%756U3XDIozn!3cH=gc@66vA`1 z33J7D*rcFa<7)8->peVPI-O!IR%GZR_t&%s1O^oq&Gi_Fk0L#Q(P*)LSgKnV-Ud?T zURc1x*Q{!95(zC;L)=cvad2Q2$ODF|K%yFwDGnXnS|5ym&qKcvJ)#d-kH?mVmVvpV%BsFcpz8Djm6lr4PEn4HX6KPjb{jmbEP@NGvByoBa~xv_pw0M$e9?iJ>H=aS&Q?J8t9m1SAl$N z4`Ew^$W=@4;B^jNGq#8Q)_?k;Xh=i2lb{@p!ubp}HKEZj+ZUPe%er5yi+&^2Eop$j zI9%vh>+|YUHPTAJG5sPZN(M@&;zjG+w}1uUpC?4S*^TIQXHQ?l;O=OxM9=jzDwqRq&2ZR-|wky>H7 z2zDPVeiPZ{_Q4Y)w4`YMMy)RI1EZO1OM>h#Gqmp@ovXiMSw|17Uk!lmx>x8x?_Ckp z9&oSetr4`zv{yr+(G-WXoT>7IAop0=Xm}z{wjlMec(nQE$Bqk*zHp&qkSmbVh&Az$ zdMa7ASGud@r7cx92kbW|<2uUoj%R@I+Ddr9kKO}8iI0&>HCslwY3KEl+c#E219 zElt7-XXdW%Fv!za8rDh+FdCEMcaWB}GD4#Y*Us}!`Fpi{WGp6a(QLr!NkeQs{-vf*n_0oBYtaS9GmEDu7a z9D`ATs?J#VYj9Y*>xitJpg!C9N^2Lm$#vlO}%el1w$K4~JU%Q&5M@v8|H z_*jB<^RzTkJ1QPRmzGn-I#kVU35SjYdxPq>OvSdXATKKE<)g+4U6x=!!0fXpLk@X& zvbDOweyjh&czW=X0mWC3u3zO9Z2`gafdcLPd`?rbtZAQy7zymL;zGl!r4V@PAPDTH zl*a-D*pwqG6*(#@mA01OK`?iQUG(8Mgr6G0tN4C%Hh?gMmtf>LnHYQ%-32+Y!Nt>U z<$If=D@K{*+Yl@ETcfwH#?3c}#x7I6c;3}Eo@$%A8PbldFffq^O-+;$JJ|Fb0ZvPF z^?Dh!10j5+TFpGqRomongLtc*fr-O52e$kF(@SrCH@bWq0DG;gz+|_Pag-Jnzp)j5 zE&SyuL$9DzuzdZs5~CvJgo!LVp-??Vx@3nt_00-=6a6DWbf84n3Kx7|;sI8J> zOeC;K?4A8go3mTWSdY6mLrX_;wN&Pz3bzDCC;u3X0OwACl{#H`0`qIWFRb;_4D9^O z%9AskSv7K0vZ7BFLPVh?X(o#Bh~`%V9Hu>Ui{A$UR>2|%l6#0OKL*~nObOwo$Ibf(I_uR{xxj%mgWg1uh zHE%q_x2Gn9z(;|hToNe_xUrruO8iN{2g)Ws)b?tq_SH$KQO4!BY$(Hy%`B`@ACeX3 zq|zcLExI{Q;)P~TDapwOD-%t}9h7Nk!@w${6TmiWG%70pGpaO9Vg zUD$P=BGOQb>k#PaY2%XG{Mr`&+7BZn6KML%7r%6>K%d7|@~u>;N^swQJ(tAD9MpCk5X!fMwelCRYx7Qkn*F<)JNmJFX;f)j zxSCK~pFSA2gP`(#we^==t;c_P&vHQ+o=o|T=Xr+zs`B#rFcAdaqhrWwS!QU{7rlo( zcuCJ8VUK=Fn8A34t8Zb2e=ytJ4?pKlj$?>_XoL0u<2A`FRLG*+tB3&K%2W%@Lm@&8 z;uO2Zq=!#ME}VYW+)Zh(5=;JTmDd09^wY0NtCGsf;%-e~9!e8HgVU6-VD$!u1l}*@ z#Ffw%oszP4=?J>FE-s}vkuZX8TQ~kYh^!Hr&O^pvrqp=Budo%RT|o7&H;7j!?5T?88=wS* z3^v`f4u81cTj*p8{`48MsVP!qo!=^)x0EO|xv`!E;N`ahry@W}oiSufJn{|@ZhRhb z;wrqbBL-KhODT@0F=Y~;F20Vj}ij#yS~FD~$vqwU$I>YX z%Y^|sc6oD*v&R*~qK~}3s8^fmA`E)S{iwB)$ep%2lGWB-0vGOWZA?mI=iyt85Av>A zoRoP4ZXxb((KN*!3G=&P+T!k6uIdHo1k;g9;}b@m5}Rjc@o*oa+>5pt<|*hhIb8yabm$voKEGom1xIYir@RrK#(K-Irg__&hGto3CX*-sB&=Qv9Dr zu+vAN?&<2>t+KanW&LA`w22jKN+9^XNyASm~Hodq?z!7mR zkZ2RA@T|#WDHj{B&!F3-X=>`~E^HrX8Ee*We7~A&IsDPN=r!He-5Mk>=v;p#i@qvk z@{&5$7`O_4?!&$nj6wdBftIYEBp-O~1OYU)VHfuIS zh=wlYf84<7%Jo?obawW$$3zj;oH*ONhq7)ya9H0enaDQ;?J;!D_S0b4Pf?5$mg8pf zChZ%zT9FGvgZc*lxA#i;wc!Gywv)!#>94i;H}Vc|cH$XKx9tIh8KYvU-7Lv7M~@Z2pqWyGr&Ze94nk4${Z4oPo;Y z9#Nz32(RwBo^o#*DyWk?m2Fr52xTF(e$z^;5ceR;n9;oV?OziO&yh{`+Yjbs|U#A*)-jwosV+lh3P}s zr(Zr_$?7QD9M3KeaOw^oRl^r(BPOOl_rI?hXZ99~Yvr|$9~n6}iBG*f=i15vA3#OX zgBH}814dCxfnjkQT@o^QpPBj&A6)a)+8`5YS7Av;D$Mqom}bu7!ws7OYAiYA#)tT} zN&L^YO)EzX%l%mmh;lh3OJ|H=a!nJe-8YD4Ec{mJhq;eR4Jer27R}=7UrfQdcI3@Q zG*0`<4c?m~Y!JJT6wQoje7wa-8vzGf= z&vG(R{<&kZVMRM45o^(XbyqF3Ow6=J<$TDk;N`{U;&!~(G6nF+HV^^06EJ={QtU=O zJS%XJ7De&tu8ahcu|o#jr-7XwISDBAC9@haYAUaNrkK+3n|QaDzk{}~zjnxZx53zX zdTwn$jXr%O780O9`E+9NY$sg*rSA^1T(CB0)d1k)6F5ylKxarSynL8*eShLEBt7F& zcI*YkZBFsOM-ahvMuzvEZXAN{>9~=<|IFTNR{KP{V%{oj($YEEpn8EI@BcS}l(KTO zBEVh^I)lL3K!?0*Nq{-pr`CtS7pae2cfmmso%3FpG}EqUj_$SzdEUON#EnX3MGDK? ziB98>DV22^wnV91V)T8yeYz)8URco+L2jRJ&|Wg5dtslL*|+#4tP27&27(1SxVB+S z*CR*6z{>qEx_&wHa`nPkY_(f$dOUBD{H^4+aL)1IW)cLbAdO>pOVW}A`1vs*EKD~b z9Z1_s8}LRcQ6uFRidqMVf`lUrOOg%~O*QG5EUX+yzk?i_9Dr3!&GEoNOUoX;tbk%L z_Y%dlPW+OGN|>wsJE)B#%Kn^oOW5Q18o~7Nn|Sy2X4$y@W*Oi1Omwuy96S0{k%^8yfHXKxddyZ zT@R8rfFbA;eFrVr;7=}jK7W=$XY{odxhnyLp{c5DR=%dF z_LU1+W8@v0shN6NdG;tKzu^3siFSh9YS3OIyW7mjLmn>5nqqAWlly7-F&fil zHC4W&ND_4Bvl?^lTmH%-!5HoMA9c^oc%xU+c8-701o-r{%&vcl)jPg~rmz8TcLUo& z%Dyv-Onr7WY*h4^t43t1TNk0nzLx^^@8(H%7l)w@Us=PVxAlPV>XgQVPdd zcP@+B%yXxl{it$LI`>mPr0UcO9hl_=igI`QbhX0wWFbAic zmAtC1zKN;HQ)xRlTSHeZBNGEK5C{}hRBQ}v23%YQ13^wfga7#Y-T^{^g~GYV00lt| zf<%FULV*A_CdLI&1p#{!17-esK|(;?gN6a(Fn?@S{4)Z0LO}jJPzD(a8SqY)o#Hxk zmn@HFKj?lDWxLiAMtSwIN2{E3uYg!42M2=_^Xk1wQe+q`m zPtF--kl%qi;_W|2IG#8Lhjf!F2>+8 zHNnDNfT=2V+PLu31lrT(AGBoldoY` zFS3)Kz@)~o*+eE};$%$LJDkFp!;m~rf}O2WZ%xim@aF$>NpF2nI9(&cV}Fj=+1$ax zLeeRv!TlPoY?&R_$ZRq91a`JjS{vnUA2=x_+ou_u&7DmmU@rdeSC1V_q~o81x!oFt zWuE^EgO)}qH?DfcAz4uAn6KW5PMe*^$b#$U4G=&1mEuvpzsMP$_tp zD6^(%IyKM69x9!!2sns4{!Kxl4gCXphNK2&@!DaP=?r!@tK_OJp61udMfEECzYIoc3 za{Yw}n7|P$f?X=P+dn)9Fuv&$#o0K*L=hx|Cw-8-WA>??>9%{)_;& z;{RDoA>-ikp}0nk(Ls*U|4sn7kiw%b%VP+)qW6YQe^wfFWCe~AIy&Skm|JeS>30?g z+%Fa!CypoZ0i_8)s?!wuj{>0WE-j-`x%xOh3c=N6R_!-J_KUPscMfeyk*cxfz_6Qg zk{3=qAAO4&stD-0%hq5N1uyDE`r3fn$HL?Xf$qz4h}GBse&^2?Ah`QG3^GRpI^*uv zOeQaDKFy2Dn*uY`T zb!uG|T_^KUhUZE(H=Q`Fj=d9ORDQ8___WXt+);ofQn1(W*Zr*NTRQ&^27zFjDO5Sq zO$;4Au^NReesf$M2p)48#V7c>>Db@utH1b;lXO2U)G04u?wv@#yX#knxw-NnnS$+Z zyWUI+KAF&-w3lVBBWVSi%>^fyZ>v;AQ-jXFaW#qo?*J%IUXDT?@ej<2`*j;!38Y#& zIk(8j#r(v{?u&hzeFe^REds~$S-g8?p=e_qGKs`xo5rV?xU*0$T$AsD)pyM%%eZR~ zPYIglPosnOOR=_*2>HxMNsXe${knK2k03Q?7y-U!nnH+pd^` z;r>PHj!t2anzfB zaxtbTZrVIzxt(`gyM#+u?lC z{PoN0Ps*x$7E{*e_AZ_d9345?C$uZ4=p(FF`8@f?`Ofqfqz>bA;0f+jw9Kq=O)|{p zgwl@5_hGG3%3oG;?6p^eQ~mwDxWi$H`HIPUH6gDlJ9=0kn{*BO7*l#!o*=CFjo87f zO_DpLzGhM@xolA_O0!O#&y^OR-oCg=t<DG5`Xl-rnMX(DO2pN9r51>jJN~$$b&0 zWcEXWz1^cvXG~k4xmn810?QdoarU{IkunF%Tkj|5zmM)cWw)L>%B~BiHK1~D=HnPI ziO^J;99SG}ItBFzatO(RIg%|9EKBm>MHGC1cmI@SD4ib06;JGSQs0`+3EFueIkz{5 zc!BO&{7?vTr6X=p1*zi{Qh{Cf#>R`Q?k9Hw_S>qvY0fXa*LWk>d3ko-IKL#e(0M@h zmaDm*e3otzdEuAFdzsxgTEfF1l$`S!IA$B19bvVp9i%%abuhX%{pHOfVvPyuPNK~mc725fM$UlNz7*{w<@Y`n-NV768Mmd}35 zUSui-c$B25AEX3lVH(!rW(gQoB|mv@cZLoQK~uDP0Dgj-!VliLZN|i_%OLz~sAyS$ zf80q%)5Xj;_wP{uRY@7_`p_eku>n61)&eman{X$D?l_s~bA4S01HB^)@C39M5aifx z&@a4Un$%Ks9tci_@KO zml06uhbQRiK~UI}BQ9I7Wd&XDXQn?5+e~w4*t)#U_N(FD`anv-{PprQ$RkCCMO8RI zLH~&qkQH)wNkL!*7L5HCH@*kb8=^gj=eri0PqdOoPES&0G`N9Oe*q4Hz;Iun4XunD z3-(8?fcN?V=LemkaYB|M?4JD$1>_}|(73gsI3Ku9n#`=xid`pDvsE|{IiCMr|7uT6 zno1s!12RL4Rm1xO0{<4y570oD2!;;&as2@O(+m2u(up7>pA3=oBNE=*6bt^bJ_Zqp zJZ~Nq2&AX=VgNtyuAgo8r~gj{PApk18ZsRI83%r9!SffYqt#k<2es1I)2V+761S6=xsNp;}@|ybrh$Qqq=c4bw`bpp-AW59yO1=GY`!@-F!#v`S z-l5vPyN~zwKlphh9jXl0l>dIS9gNuo&!CMsHqh?&7@8<08zh@mxjYhxr^73cwyPMW z(BTplHubGFmu}=Zi3v&MZ@y{pqUm2Kony<|u=9JO3&84o;0VN~jMe z1tz&OY)^a0e}c$uIndM5zp@#?d`+jwO~WTR;4qv2r&s-}Feoi8yw&9rxu5dwU#0tN z_-($kWZa&fii#3T3%vigI6ByOAF`R`T#Tr{tT`6i(a}20XY)E=Pb6Yx97$|fFPhD$8yXRAIowT zaWDn?NwbB$Q9)r0_unEupGY^p-6f8D>2MjW!w;#eU59_j7+oX3s zlnhJ?A}6lx|3h9%TshVZGyVzhTqp^c7{psIw=Jt#lF|@~2_8x=#6+$+ll&Q*id;TE ziNJidd3U6R^i(x^Hq|Z#@MLMAI#KjZHOq(pX`b~@7L)&H;zArmOuZEi2_j|F3&+ZA z&qk06+ow6X^Y1Gy@1_ta`WD$b$^1t_50qA@Q^*wkifm(LPzyVhIVE}@sIAc8lNtDx z*v5vTR&=QRZwJvC_?Ot$gke^6%y4S-!mF)V;QyZtVl#MMVmlp%ThXb)Y2J&dwo;7$ z4?%Q_{zbMmRvpS%`6Xe54Kg7+v)@7OCiQU#r*;cb6cojUCNf1Sm4Pu*Sw?7-iO&Ye z<(dDT=SBWqR)YGooo69dU)EMV0<8fv34)4+uLi%|^MlMoRkZ)^XUqO6#Scj3qsBQ& z_^BMlda4aLbyN+zyQ_-D=@#E2k9fQ4US)^9|NNp*Se(04p;Okqkfptg4`610d8e1!Hv(&du#bJ)`BsHt(+$=9SA z^Mx|@1nm6^R+C{gI8w0>bXbqYYb5m7m#vXW61mkax!sf(}62x#DwLa99y4%C7f|05S5?$cR%al zf%|0duJN6FEl%c(c~A={OG1^*vr<01d-dTi3d`pyNzIon{5LofoZ^zwS&S9vtKW3r z-$mZ{xfx#|DAoG+%uq$!)o@qa>8%}43~F=UzLus?pqvWhj_6@S&n>)48mrBL?H7xd z7cZph?>S)2)b5*%S^9oDI+qFmx! z3f2btQ%_ktx~1wK5!&vADolO-A@yJ;<2(0%>HNmDK+x)ZTM;t`B$(<16ylDCMhtET z*KmQ3f%~6CEuF95-(n;ZJER_H=$J}2lo<2QVd?7x*W-8JBwh3Y2Hfuj^Wv8Y%kDVZ zu&C|6{?NM9t=9b(@XmW(jDLZfKQBl)B_g#l#3}z*Ll)6qIuH$Ltw>+EWy%MwAQ^N_u7#bw1zg zbDdjP^-Cs%dr;ws^(QiKj5|7}QixBeV*-@#5n<+e!L!;w)jd#B8k3N>!d;W9IN8jN zW}iqU6)M@wqnwiLD@saXHjra@fd64t{^Ny2&V_tT^RZARfulc7+0yAJp!wg?J+t+| za2(LUqnYW0vvYR1Wup2jnV1S+aL?KnNl$qfl2G=uQ#injupZ%O$&{`YP8Or84zM`R zM{JS@eB=BMB25x38r!SYr4+h}Ql${C@za+;kdRQ)tlz+njEXwslfP%7T{z`itkX@k z^~h%DH(Ak^F5gA@4>GfnCYLH)#*&(-h$z^{?a(JF?Gz56ClpQwtVtJk+#^9aUG1NY z%vKPeEDPoCvsN{|+8SZ(r$(%oKwneHip0UHV4$|Xmrq4GnIn_rl`o%9{ziPUy+1@__tP4ay5C)cJ#CIX@ebd@gFnrCVXZX z3Wg%3K}Q;26U#(y0L((yNb~T6xC`DI1>! zQ?mN4KlNHIP}`XIQbrCUWf$ynhyBZ+Ob5jelD17R)2A#S)vaH>uVXF!e6C|<5b49- zNhqIlf;uyErXKvJ#psHMOm4W=HrOVH?Y+O6GEBr+ls8(=P&JZ z`o;BwSSiw&nId_we>FV2M|?T0PfmD6I&J_fqfgO%z{x55bf4+cgI=ASAzYp4e2S07 zutZ)CmwZ=yOg(K+ui#_?o0eI(TJ8ECu%Tp~(SY51vZB;wfi z=6e!5?JTlMT8pehu)Wv=A>1R$PSaYUK#tE6DS5N`J_Pr;5ghY4 zYd(wUcHI!BzM|;SZ01P!(CXF;G$`1mA50|P16DF`e-8UN%vFb>&PJUes+s$wP+K`x zG*y&TsUO3hT1K^y%jmA#o`2HPLc7EK@|@q1DtwZLPx|qAK^hB&h{Z7cRE2v$P&E$s z0F!;J=tZtjeD^zSLo)qbE}a=ZioB&y>yd>I%??gmUOt+v2x6jj;0~@XGYl?U2MTE- zZMH)q8;75bZ$N28rKsTk!a7}tS0VdBRJM$E0=V~VZbIE)$cr|Le7Pnb7K6he3nMwH z{_t09v3BUzssqL_7#fGXr!3z(NY+20kRn+nlPQ5-hh6=7hDE=2!^a@#=; zj*eG2vM-GnD{`!NZ%9Ptwcu#Ue|q^+VQJ^p*5OU+DEzw+DKV?CrR3l#`MB)7w^8Jc zOgG#fG}^If17?NNz#5Tf$Az0Ey2iJPg3DTSFt=3tguT2nb;CE>L{I8jNq-s*9U3-6EB8ilN`ot8BVn+j_qM+8;&Z#=?n%s*<7)Zgt{=M`;wKx}Rljn=V}_q-k8fgLr$_Dq|O1F69AIQHehbiD|LU zQT&mZ;Ny-~rHHO`juth3>5gH{J7D|bwWGPimKdM}1D-`nZh}l!BA8Ud8?RZFUWKLg zFWn*6p|z#IgIM=9S3xe=<>h!j7hKF(x%I(T{gpGy*3Pf)y9LL7hY7dtgB3|KnY0AA zT`e-1#OmdvwDqPhj~EI8S#STZ5e@Fyuxtud zNYoMLf|Ftj)Lc=_i-M7XG<&7;xm!{2X~XVWf4nFO))$~&`VY?Ob-^0s2BqQY^xNHu z^}-x(vxEog5=qgqJb^;Qa{bg6*pnfE(ELII9)n%(i*Q^3C`1Nd0`)Y%MKOH!=>0EE z@P*1J^$HpnW}|UK{hRcyI>hgwhw#5u*p_5xt_sqYIH^Y35ZzZN3$MR}oHkDWpaJK4 z1o0V=Yh#Kq)Lne;eD!Xxue(t7pZ#dgyD#AWboIk zFKg?^e02o1rvI+X{n-~|k%8+7Pi$9T{AE75J#BgL=idI67xkaH7FkHO`f-S_4$ijf zz3YCk>SAMP<;4_ zeHFo9b$A#We&Kylr$2igzE!c@w}VM}@)h6<&3`$v0uQ4rCBNvVPXS!n z%E!}KDIy|PpX(H*A7wOnrZrk|-FGYT7Al;(O25gD?gD^y(^DJR2ERRU5YrjD%6a+p z)txk6pb6ruy}HSJVo;O%UyRn|q8q?6!67pAJILX%Adzju%Ba0K=k z1sC+cF&4iALTB*b{owH9y97{6-{{`=EnHX(Z|)&_ zjsNx0yyx<9EC=R*^_kdtv5WKu^OJ0tC|Out*rG5yU-=Ltwpk+(AqTjw^&Rr=RsxFui@mpi%W7#CM-fqJX^@m|5Tqp}Uf_M{PC>dGq(P8wUb>|l zBt#lPkOt{Sx}`xtz`Fo-$JyU^_CDwQ?!D*U|621~YvP$_o|sxQYi2xv)o)^aZKVv7 zl6Pbhm{D}Wbte}B;&o2$hdBpCib@rZN``HIwkc?YFpnpxlki=*GVzS}CVl#X4; z6$BhRk(|^e?<_5^5Hq|?mYke^xj=`FQ0@MXz;7Ev+B@?%cqLZ~2dgl@ z!xYnkyOW{Ox?)Ar>JgsZH-x&yGJc17DQx~n4sDEF#VdpVmm8m=+&cAyV#(1QGX?hi z#Nl33!?%zBkH-&rK$EEjtmJ^Dp)h_eB*(yLJ}ElPEjZY#q5PjyF1KLN1)pP(%F3ZV z(s>$jJ%kU03fx+4i)cgscXvCoaFGJ>=;%;tti(gFd;9T=0e5t9Xv59SO!_4#Bc$)Y zX=myygTH&key4uj^_DOBOLs5zbrF!{UC0@qowJE44swronER?9=MFl!m=}hYk(d9Nf4M6FTQ^+GCEsf6 z_XT2_Ttr!6;UIhdSF4Hta*6SO$5UDN*~T-hN{wd|vz!9c{99kBnR3D)O86ArZWBwB zb{$b+W=438_bRZSl(uSGh?Ew+FpwI*3CaunUu&-TwzQ65IP*h0QRsL@t zTgKOL6DGhO&y3MkhN|F3pX7at3GOJ-?!34Z)Jpx1w5=gO+;5|SQ`8m@s4m24C)Pfm z7qXlw8+iNS8DSn#(_#o+tkA^r99~Ohs|^b*K&H@)0#t-ji82dBP179>>Utg(`Te8% zMH9&v;*(}4?)RlqA_a+|aDxYA61sBSeY&!ZTiMR(g`BSB)-{guZ0js$#&mi2E;Og@Ujg=irS66KovB!4B{Nqba;#jnaibO+b5oOB?8y4Vpr)Y1hEQm zPtc1_=`G*4^wrqqiVQIkJ$A7e5v$2rj;4yfy(797N{}RZOwGIDGrO0o>U+y96Y{CC z<)-zW3lLTD+;n=2BZ_V$qXhGVIs0q2MqJbX`K^_BBa;z7!w2z(IthR81$DWJh3i)g znJl-Y#5nMg_oL=P1Xt~nLM`=@S>Juoe0!~4du9}Hm$ZIHpa(i!3iZpx;D!#rNz^G` zfsYL&b@LbPtK;g0pGt)q5D)49-fQeyl-5&|BFn5cS#g;O+Cp~J0)ii?jnd1gBh6a$ zs(gJWo)?wXC?@BeR})<&(qv*}fkK)MhbGhEjZHsFpll&+OSR0GA38y00kjSHh z!X}QuLEeS+jM0TpRKE>ch#$FqF+KXYVgVvVktbm$C?{G zg*DIF+ppy6S9^mjq*hK}@m;XlaI_rvDTOlo385^gGA?)UrmW-pDjO^*MLWmI`GHms zWjbdA8}&1!?AVe|!Ub;c&0l9n_ayY?p10SjM5`BECSdW~iDXC#$aB}Lk?`YBhx^U} zXBc0Tb5tI@s~*JL#oHsN5~%$6e=EtkGyN>&(4!}hJ@q=|)q(6D)jeDo4{>{C{!_$1#QdL#-L zQem1Rrd9|KuLqDxPz7sGm@Cx1f&L(F+P@VVHzDgp$na7G?Cad=Zes3%x#*~<_U zD;S+WH(x)nLnc031o8rNvNvTo=^*$VGx@wnj8D1Tq+glhHO|QB-jjsX+A#qXn=_#L z-V(^M9XZS1BQ00X& z$SQ-5S)o>1XotPyLz4d7po4(xuGHG#QN(0)(wkT^SBPbwAm?MDF6$T+aYk9$4=HK;N06GDe%a4XfqSR8N+y>DXj}C?@3W`!qR(@ z?;JMLCz4(oTjT(W#D?e1G0#2=(EoA)Y^Ux*i-159j-j4Y-3#QPV*vqic?(-=^5F&? zmz*~OpGHE`gU(~AS>;%!SR7weNgpC9@&ac#Mrn!eYjz)qK#5|GsQJ=FrST#)5OBEF zMOJ+RFb`f|lzGl0N6$cj0S3nSDrXB!b()ciYy@sw;|f^WCH1V-JK3*@pz%eo6U&RD zJiQ01>($Y}AxP6dKcK{tqpUEMdt}94K39~P<~iuP0(+Cd{CY8B`8HkC9R;KH1IDOBM)}lyT0@PB1f>M-qHYOr zI%`8|U!F7ChI(plzG?V?6Eq;Yh$fP)c<<9BxkXi6%BxJX&M@oA2Jz_^5YZU%g=YN|P%$*#AtXhAp{312K77gPk#vDo1d(Y<}^o@?5v4sl(dRV9iaCa@x>5 z67EpWY5 zIUC@UtIph3>Fd)}5zTYuqwMtwx1e}d-(gu3>I4@pU**DVBEQI8jJ-H7cEuuciJ^Va z^3v-_#PJHV4il#B5eg0PklviKxOclzI$!h``AXI$5rWI_I;bSmapZzoMt!{ zX{2+orSQ&5Ct`oAQN0+147LCz(4mW`ixqqnAok$7F8>p5)e`as!@9u)3}$4e_1#ra z2#pGv0;3(HvI|}+=!-&3HX>epe3bdNw3bU{cn$8LNY_0+7G((=<687pGrl`nMl z5}aeyut11>N}8;@RmoCKN|fJWt`yU=Ly>eum93`SE9+R~gsw#67RioF1J0`vVvL`( z7;HA58*Zx*89rwO3fNwwSi*A2Mn@JvigB3(b@_J~nug(`ZpALVB`I}v=csU|nS8S5 z%0ND=*gAF4iQVvNB;arJI#`o=#YW9M9&NEOHC=zD_$`oANg)32*Zt9vzH zfmI4>*vA{lVLrt#lC)b1RI#npjVP_UDp}p!>tnl6!kED2k0-fLSk}I0L&q z>Sm^^-luzMf3R6cnS`&hT8VXbZ*0DYgUcz-#F|CoiZIRBM7KYve1LVR)5h#WswV!fz6Pc(X-N;ix&H~6W`QE8&b0mp zw27#RygxY56LUM<>*WKsA|RH z7uo&<&XQP{SQEx4gA4P^b7$6t*S#uB$u=Bt>|SiDcuc+v#sp|2qRIfdforGz6%)1- zPM+`iXb2Oq(_yao3fT-*qC+FTPZ) zGp7+=cVYHk6a}qF0c{`m1>?aNiGXL-I&$o+6w}M}qFEJKa^{!1m=H_be8&cEh^{oa zi7PY4zzeeyQVa1$R1zUXGSDFnyW2;5Ep4?yHB2+mx+(BxR5t!@IaogVYn{$&l+Rrgh3F-6&WxXvKMdag4v8pZ2;pG=Cm< zZ?z`}WXF4IW0ppI&Ejsubmzz(v0InE%H#ex)S6?;w(H)h8&Pb^D*u!I1j(S)77zCR z?vR_FF^M*LL)-x4y9CK#Vz+yX;rU9D|HV7D7|`Fzaayg~VUop)0$E4Jo&bJsJJ{x` zs@|)sNp19$shTxlWpF+r3FCjUqDDTf6(F?aL7~H_x}uj5X2>1??_R5gK%w)Xc97gr zzbv$~K%98L)Oq4@cxYp(HZ5_pUyj+*7ypXG*uR z3vd6c3)V^tD5OW7>V3!BHpNP6*#G#(7z1eJlj*3~7Gb_Upjc*_PXCzkfDciR5#paN zLCt*2_6k6t=2JZ)qh}O;PkUKlpjDdJ$&K%5!M_^~0LBV#L{Kx5{cndrZU#t{uhhHe zw4@gqCd!R>^K$RJBF|#VDF2BaRYt|Mqiz~aP<@Xb)oOfU0%M_jo5lVlM^({RZ0A^z zzy?J|+7Tkw>IJAwVqb$W_Z)bi`P1Z|iyUu#CFtL#Sh!p$Wl^q8^n1`%m9qIjTfuNr zF?nlAxFR?eAFyU=^?uzW>gu($OhD<_5dG<1S9inC+ zjZ&k}<=5Xch*QA(R)dfmIBSFrXnhJu6SXHmSWPPFsNELkg=+Vf6iht}8+JvKY@^1H z9`1Z~j&MvaZY{3UZty45P;k5CKf6Zu_KDg0x%cn!{t#S|!M5-J?{A+_p!_FwJm!or zw0hVxE0|FK>ap`(!+qr5r3e4V`~M!9h(^n{%^n;A2N;la;5nPVN^AbPjszAC?k+H= z@niDo7CI@5oX+l^piN{Mu&yJ$dEnvGdD-XIKi826kh;G78Y1bp0)?uNfD1lm;#<3e z6DQi*5iD%1@tvrL2X%p8@ZIIIdZ|nvgA*kO4Wrl+{++|n?6F#6&!}MqdqPp~wIgKM zFq8d3UazR>W4Xkl5yL`uwSrz{;|fqB!+>Ehn_5OM&R;t;fUpVR?#1a<{&m0T{rfjZ z?_b>gqA|1NpYPS{dL`Vo*Hq_Ni1gl$X8Hmz?6tzwRZ#I>H$E=lBa4vZ6Ub>_R?iON}#stP`XZ_#9-ao$X< zXjAxei=N*e{+s~3e&06MRdRc!7c_=LJh{!ONEuf|+GT&iUi4Y&y~X7#$MLQ&vv!V$ zR{d+A(*~LZGCe#+&o4tKE(j{lIE@Z1``2dD2I>SdUwDdc{Y~#*NKP*Z4$e4NuW-+P z9%yLFboCTHz6||xK`?d3`R>rl>d)RuXPlgemR4)ip9gB1GVMG?S1v<)F9`m%H;1M9 z^h8aCo#Aosm!v7qDl7BZiG~W-f8qQIywcm7l*GwlxivFUSK(;5(L0h<$f;~uG^18q z;b3^ydz7@vIcin(S*@|c{SVIa&v$yq$CtZ1Be~_4Dbc&IlqJJ$7&USOCXQL&e1x29 zpNQc$tuvx9k*F#J&6-8gSl#C0$_(TiFQEfp2DUvOP(Z;~=2ZaZ z%gMoB!!V!G=R<)=5?^@5YYfoIA_DiQ-{;c@rZ+MMxhBWoz(!S{>~8a4@@jpD$*Od< z*Y4l#yum^ypBX&{TlX-N@Qr9WLqME0sp~`I*%}=PRr}M<4*BbZp!Cj-yidY^vWN!! z)Xe^R^p!fw-+RTdPWAuBz}O7 zHI5x`;BBG2+J!!zIHhNWB_-@_8Zmmb0TD6MBQ)9XldW09BVWrt9E!GM%EqBu4@k*c z2o%V0i`OKVazP;0gCD-nZeMGXQyUidSd)uJL|QGsg7Ul(%V9b2@cu z$~+6EQafrox{6d}f0f>vG+gvU-5?jFas44Vo?43Dto?8(3SM5GU3QxSIJYFT7wJhr z1(ya^TO3Y1E`DF2QjH#RcIsT`OmEEFUJS}8^ND)6q-6CC@=wz0k+Z&Zj=Nuf(RH!C zxU<-{b0#77PK&Xa)kuphim8Ae>7hoPvqyunVQ?oSC*=iQ<=_F6C9Q8V+x=j#efsR| zIJucD|1r^_Aev(wQsJP`fL8g$$ZsO*D3F71zf|Znx!(H49+RvLRl}ZuBcZB>rL?i6Gq_AgK1i4j3F(Hkg8X<*)(lW z!K~9cU<)O!as^CB7Hp9pDOw-=#Po?`Cdd#a<(!dt2AyU;lZkclZZUva@;3#JKZ3U!V_O=mmbn|D02c`yl6OeI0d=c-$A^! zq~oN7DUr!+n3Zm;77C_xA3jZK|J)w@`Jg&aEd3NfM*tfa>L*b~JqLxVoIZ(hx6jU4 zitbL-d|jIDI)X5Y54Hg|U_Fb$emewT{)N8jEob}olHd0jc~8a?eUB5vQU5Hwl2Pku@boNJG$fDFDP#MzamFFp9%n$zLMlx<5OLW_XNVDm_?ROYN ziRx{3Qg_j8U*06KciIitdE}BDAH7kOmj}7yDD@+m3zZ#*9NexzUf6uzD_j53{fqAN zyS24s=AWkxS_*xXkAn9th<`Q;+f=dq;_Y(1cO6`hNt?topZg81urh$ZsdQDkI((bC(&4PSR64EU;}Uzyw%f+~ zx_k)Vgk>*#!o2D|1MT7!tSp!*@~SC_$IjL{<`Hnri-$#}c~H8~OYL6l7ysfR^u1eT zSi>u_qtsT;G*Z!Kl-iFAC_Kfl8q&nV0-F0;X)xrDlny=seC`NxKLgGo9bQ z`ucCuUi1ofKb>l>Cun8mfpdB@EKsg-6!?QQa<2=~^b7Rq>s&dB^4g@5{r+K+FM~4T zCKe6C^Czg3Ls|Q-vsNL_8BZBzhZUwNh+9?=dQszQK;}Y z$|l*Ad(B+;<=IFmjQOR6&)Dy;#q!;n;u^52VkHz!fmCOg*0muM(!t8{JVCj3 zJi262hfdjwa;94W*0K6CW%+ksOR%?m)(Zq<43BggOVva&(ph_g#XI+^FWSvNM&}pc z!VZ?O=_^!F)jxf+4YhH04-HsFIe!w&Rl!efBgGMPOay6l(qLQA3xoqlOoAD!!4U!uRBa1roY1^$XA?VGZjK*l<_xW5HDcM z?PnRKvnuQM5GXlk$Wj-idL=LyxpHDulQHt%v2U~?%=^tlx-`L@MO|!W0hYNjxXlPc z%V@+ol<`z?*_|ELrb82<@|s|RM!0*7bi<-bcrk(2WNLdf#)~D2AB84kGyL@P$mYgh zOB-vg@XTybt(WFaNZGuUCqT`k3+nY}ttBdw79pdhRY`s2^L*CDC6$E7NjC5m(=5w{o*=>uvM@^slc|8DoegTaq`K`PxNEKCS-PYF@p%X^5l5J^^8SYAAoB(>3#Su+fc!Q&lrlc09Olvak(#QEk9=sQC{1d8Ncbc&s)8Jb%90fA(dy!W4# zNouK~jU{9Qr;YlzB!D?&R8ef)L@Caei;!$95ONxQv(5;Ld4?b2$QCgR%7_%PVp%jl zSB|0`H7Sgu%~Kff<2vG7h_xR~sqII#pyU)vVd|hR_aX4( zE<)w5fr^~*f`k%+MwY4mHcjllT|QI6Ekj?CXl6mS1s3=*oV74El>slF92=(H4d6I+ zwz0$3)_g}RTeg*M?+}^%%E~N34quIy96Fv_8%A58T6Yp!NP0g_Yak+OD&QL2hRD$^ zJxiR025jw)KK(ke3(guvEn09fcSaht zL=PT6H;MJ}T%7#RZr32?-^oS1U!e;VfQ@C`)64C`p6&$F43q;-uRwkqBykoIv z5TD#;_J|=mt1?TPP;7E+!Rs9x7RF#4s*Yif2d8pZ$Vb4Vzmp zGKk}LM|GDl=7Eq@AoiMi=o#uNLRhvY>TS^g0l~ZyhCs65d;>)uei4E(POsO)g)N{V z^R4c?5Ck6id?;piS*vLqEi$B}+{FjH^sqz0GCS`jMeLWyR)VmYn)*!Q)J*s53sf`w z`RT&s>an9hNTOkx6?E1L8(|1;m(AZ{#4kSBS^7;6KwMCTp1%+#lp>LHwythLa1mdi zKs3#Pr)yKP6qSFh^eAONzmjCm6*2Fibsp$wfkj8s_#12?NQkb2lZZKl9*&R|!HH%xgYos|?ZAuFerM!Go4V z^mEDWjDko_s4}tqCS^(2g`>98nczTh5Jg)|&D^NS=@ce;>2w)Y%n&R^^JwnpYmDe^ zxGYgzS%i5@Wxc!4qQ<+m^z#$in8?}TRCnJ5=-efGC>7)MKF9B4-5m{%`i^HGnMoSy|-zV%$olk(2`Ul%7rrAN5_Hkc>E(9Y-0?g zQVAu-$bEO#mX@;)!x<(PYs9H_Y+=N{QB;P?RDSr*39NBCsB=q62 z936%Z64|g>$Lo)R(D3jRkP1AcTuv+RMYy;8=v~t#8?XDHZw-d<)IEz}sZ|mt6e>m> z6hYn&+NFFPrPZRiUA*#i&|xTIXqG)r=9UsT+ktD?k1p9KR%CESZ{-C)nF1z@%>W+) z13BrdpbSQ)bY0r_!G5|zpGwylMhukM!h3+;@)BF-hmG^Q52zxyi6J?bQ)e(`()1B=&?6S~lCD;3G)bsDFO?^($gHi3TmJ^0{Qiamf z5DeR+qh+#vd@d?+NL5B}k6LVk?Ic?*K`oN4`&hUdDuUMJ%MBX^R0Lr9T2adq}qL( zmFvLyvH+{F~b6AM;vYEMW~IuXdaeaSdCNw-dcQjeoQ( zM2PPa8SS&39C&%#6cQ{lR$3Nt8PXRHX3?~JU3{-IS}^GJU|p(OgM+8$nx&f$w7t2- z3y)mH9@(HVI`mI9$i9*Xd2@v(BJx7UkTXxRm%}wt7}(@NtU+OX>Tcgsd`yGWWmrMR z*nL|MO}`w_rh2=S+2#7W*;3ifJ{i-a#7nJsWO#=aqeuEq`GR#vJiCnGbGLSwR0po* z-luW5!)Ru(O7RrSrn?rbj;JY+v5Yay>dYVSAItA{QxVsw+&K&gacW zLiLJ;WFTQ+or*rp9&?(C-xDeYRnaS;G*|_S!+yR372gu?ytmwg-U2?90VMytm{v!* z$s;n2thps)znEMR)rO4a^rK5;B@L6O1y8P@Pv<&mgx_SOV#tKlA(GBx9=zChy&ANs zw_q?CJI2CTYx|T*qDzRD*R0T1)18Jk=ra*TBf(vl&(mNe^yQK9(BOg@x860tg^&yFImFf-LJfc?{___xA;A=flmy-DB0mmOVV)J)Mhwa<u` zWu5SxkyzF-3!$AXb+x41c{ea#rNs8SV!?*-fyEp*nE_#e0Y*;NTv|FL5r;~3LGF-^ zR5|8V5h<6f))ZBVk2pQ`S?nDOLP=ka zI)4@BZV5!m0nfv{XIM@cjEvcauLFFsOJCt6Sb60P$P8<2$&d2qeKH0+qD4?t2;CkN z@r2uUf(5silCLbCG16`XOoCvlHbHuQw`@SuN;A83*sF@PR+(p+L@t5+@X#Sh~jvct*Ea*PIeb{FSNYdsqvTK54+4RF3dUW!{V~nc8R&I$ogSw!?uXFUyMAw5p zzL#=4t9g_I!Rey>tz4vX-nr{saOvXj0tkEMT%P9x1n%bF-on@SbSvSPIEb|@(pP&X zfV<7l+haxwobrhDtBpRlWShjT2L#(fd{(0Q^{q>(bSlL( zBJaS>omNH27<8piZUmdpU%R=KHHi_c;AZf`?WHE+<=eiw3StZ-L^sGPV?h~mC7wc8 zA=;bzS$>J$bpG1)~L-<*?fGCQ~#lF)tzRGDH!-LX071^wV>( zR|X`LjPEWNYqK;NpU*8ai_U|yCz7}9vWnz#DW{TXQY)#--dO4K3L2x2fu_Ya04Bkn}lZjnbZOu_vF}ku=0uwB~Z* zficUa)x4G^F_SK&BSghFy5~zlP^&M>yQB+LK*(=9r#jcI`i~d^8KbUqbFs?^y;jx& zwK;g};rqq8`SNH6E^hQ82a|q$+;Qsq{P# zbxfZ*GL;6L%gZqm%9Y(+u&al=R{tmbMv zKa96Ff61xh%ES=7Hdi_qz=&ym1V=NZdHx3l1vci+R-n}r3 z_!(zeHBeLjD(WA$~?(P1y1*z zgAR%+YHb(b^u*y7jd>N*EBPDFYvU*U|DTbleL z#Bm#AmbbMkoYb$OpBYdKU-0eZ->5EmHk4x*JlmiRdkgXgcQI7{W|h{f5OJ@a}8t9!Q%? zJCF>s-HTmtIb_R0q^QaA6VxZ73>Y34|Kt|=`jlL7U-Z>d=)F$-`_SuA#Q(ZC1Q(bn zP4rX04;l&3AwTyOqZxj{>~w(1i&Oq|K0YR>G!CHNdnE;zdHU_#47$2$Yu!K(s(5Jz zIYPdjx4Ci17x)B@Gz3yH!idOP8JUTNud$PmXXq`_x_DB1%$HUq6m;C8uRC4a-w!QQ zLSZ|&nLs`-DLK|u!(BxR@WT)oTwH1b<`?W;)BLWdy5bRa**V@c+zmQ;pFID9Jgq?A z8^0$$K3BK1owUG4ty4T#aMGO8lCCC?RGih4N(%#sC4SM~epBtw`NV>Cd!$%Mxsn{M zE~NP-&I`rfi8Y+)Ur&yu6hd9FC`LqVa7o_8Qi|#g5hy0)cXTK>6SW~B!ewmo!&waS zX^8M+W=NH-SC~ezbCYIKCE#J5oGc@IJ&P&5xOg*3e*tvmt^^MPs{fmbQ0DHWh2cQTP$)U)eO+uT zH3Z6!I8;6?wa>wn>f8`xq3pFKhlMe+R-wljgu8$Tt+J*Z+ci><73UA#e$#Y|I|WAO z14u+G@jsaf7T^7QFGzyL>doZrRa1JYl+MN`MdR1IHXHhP%~uVN?=bILFx2vZzn4Nx zS#DmBd}6-CNVJM4S;yUjZ5)iUjv51Ds^I4=D3aLRUBKFKGG(^^j@D4NUA2Kx2VfyNu~2p_0sL*a}Q_B+(-Hj zvo8GvX$eYSB?7EIm-i=RqIYmqDrok31{b>R-X`9i%_nArYpTlofTD%^NsKY=nkQOt zRJ6qwsdyHbKen7Dy4-EyG)lY-LV9UPCB|I}Q+`m^eIo*H>O5AL4KSrIE-G>%=DSRU zCGr%NVI%V7%E>|4)765<0npGW)>}`JXisa`fKq~qwl~fScsn@Caq6Hiok``Mm>dQ3Z_bgh_b^Y z!0)HiQ!Bt9Jv)teVs!nLpMB`^R)Rs73}u_#t%El~vYpY|`sCxLUi7gwZu@l@eVBJ0roZ%J;SJ&F0gwqM?}O4?a$Z#>zZ^@+m-PWybRaf9`~W$UC0%$J5j z)xGMsy2U!3OkvqVrL1_eW$#nV8T`HFFyS7h>v{3%2aM+2#vn%*Ht@5Vl2uv3O?(22 zY4nz+>F7I*#Sh#Vpdf-IZa&ZI7%&A`2n_oKYvI$US_zJVuun>~BFr2MFTC@ym=MS$ zF-~EXv#g(X_-e+q!ziE&9FP84TAYY#Ps+I4>|{Ccr3!O0O!B1_2*487aTi}2t(wA# zzs((QsdKDlzbRP7eDz)*pW<`5PZ?)D=7>Sg^zf$_UCUA*X!EA=OE5hc;?X+#Ec>P1 zNWOC1B;u9Fb^={k$Y^Zwe~{%lhx4bT_rAk;T}ga*h0BPXf>ro`xe=mo{@BR@E|-Fu zN9iX~Oi=xQ$N`HcelFp8f;7d;w^3@Glvm$rk!eAfy2d54~2fbi}aa{+ba=K*AZn*9iR?Ec`>0YhZwJLAZax zh{!LE%r9Iehkp%xB`ZOI5t@hI0lxrlER1|Vs3NEDxb^`w@+*}?u8bd{K+to5ByV`q z5W+5VU?*g_hGuVav}>=2URl=(Tu1v0l{{7W`sAYuvupRji!r!PmAtED{yisfTmq{V zN%r@sFK>z7zpd*O07M~l|CQt06?Z?}Mt;-+`-`{-#kF(~le`i5uumS&``l};y$ZTp z^jjghQ3(R_qw9!w5nsUuu6dv7&yh;_A;JLklstV7JiRJq#VOE06j$v0fe{2=x(>tg zL|QiZR}Wb!P+_iExG^T}gcd637FWFgrV>BAg)sOcd{cI^8aP%2T%yaJjVpN4psOdK z5<LbZ}7ld z-dF&QfY@XK_@9jAL4N>HgalPzA=muLHP?*=U<5}HbS0~+yambrUET`Bqq%~K`+?!% zHRIQe+{Kgocpc?hBYr;sNaG+kI4N6xM!BKtDr+ez0JQz45pmM1pgTYE-tQRsL7oX5 zx}eB)62H?(Ed2A|F#lrYM_K?Q3LrKNL5gceeiCr|DWx~w51c<3q50vw(#Sn5!Pe{2 z`>V8H*Q!5-_E(HtbMYG^2%m(0rsWM!_LGsh8^(d>4cAxV{lN%XVZcuUfQX0>3p8H? zU_Vm?f{5J5w0`FKtA@m{1m+jE8%taOoi{wgZ=Uy3<-~qABmg6~?0*aTLE9B08Hm57 z>s5&+h=mS@QxJs10LsYw-&ptw^IO*X;o}alaEDOmO7Cfcf7$l@StA7QUq9Qlr@4=P zcK;U*$*-*SgW$WlZCxi|-L*P{ccZb0XcFku% zHu$Nje{I3O3iA0okUwGW$Vy>-lKRgv|AYr16$x!XSpS-a-$DLFt8^zqiVgjrM8OsW z;pyCz;-5(VljwJ3O~llD|0eJam?E0aKZ1utQ^NWS?*1)dxE`Cl2mSxVjD7}ICDC7R zD+dd#N`isC>gEC0E%c`>HV;W3HKPg2MWzqv%)t;HDogE@j_*B!X0z%^c!<70C`rLmXRpnIl_Ht_RYzKS#q?<&} zNvhNwBzH{OPHfdR=HysgY7={iMHGdu$WXA5J;wx!<9fnQ%30k z{y7{~0g?abLFr%qR^)VeAv7P--#rAm5|4iGmN^pvwhhgbIS-ZmTRR#;% zI!nU=yCvQR9zU}*DU0AP+CyO9K}*{+!Z|+No#oDg2v8?7Bury8|AAD8{ySuli8 zjZ>r@myJ7dwsWYhv31_Bc)nq(azZPoGIO@ahudsGWl3gfHv0uA8v@?&foF+{F_(yf z#QpOfKFkJDd^~mO@PhIl)RO{mA{XMlV(u!bpk38XDHrmKKKB>=2SK~abSg+?c~h26 z7UA^^_1JzpXjttsmxDdje&H z0S!2w?B^oX>s6??&|!e0A-Ahj);xd)l#2AdM^9xR&i`%^DjF3*s=XUW{f047Xjz-d zC>9bP-oohqj@&14lq4=KuLrjtm-iSo=g}V7=Se6{s){S0UtxAp>>qgIZG&URlXsxOno!rqdYp^Ie`U~p~ z-ajL=WIC#@8(rAZ2yVEsw(MviT@m)CZuEE7!5s~W1`DR6%DPd&+TCEqbW~pl@b`P` zOxNtQP1hQYpYLZ~liSK;wpDd8Z>NjHj?5hk^%^vQ74bXD?JiYMM(SpZXOAqu7CJU) zG;GZ5DDSwubN!>|=N;wmFfLW!M&8X9Hy&AhEwpOTaNn5PQU3hP6S2o~@abx%*ay45 zaKEvXXL>QEu?o$3u6HzEXXWFxwiaT#)|JUxCy-I}p}P(ePMH|CJ=TS{R>QaSb>t!{ zSW%+5lZZtb^_2Zy%4d#LQE{IHIDIj0n$)Gh=DT`<5TRr;xbBks9APus>~JRV8D>yw zxCddBaD}jg36CCQil{{Tcz=4$jISe)y7H9BKe^F?{+sW6v~_1-S@YJ*n|k%f6Qgc) z_zeV0E|6iC1}0eNc7j|CG^`^B5fPWY{7oHiAJ4}kBVqA?9vMDe;vEZJf>i8yHtiE+ zr-4lA2A8AFu~MxDm&5hJY)A~9V!m>*`dibH0xX)RUa)ZR!0CEkLcWMMo3~!OV8{9B zpC1;#8mtP3O!Cn?9TqPRz6*!U{@I%O1HkyO_;*%dlju^&WCOj+Ve#hRyHd#PAFQ^A z#odGNm?7g0^oEDUNrP2ZkcmH7UmO-s4ZgF2%rwydh4pu^YN|$&M$%Xla9z_LG$D9> zs4)+%+ZbOBMtAQ&p__GXv(ROS^3|sUpx@?SA|D&d;_KWOl)*J8ZZ|3X~fVOT8% z4Q$PkQXby+j@?M`^HVe!5TaapIMB%jLeQZR+!Tz#qYV9UkDY1B4_L(9ipjykN2IjLc=n6VQ+NO;l%jWr;;7AoLytD>);^!Eg}!>Gs&Yu5hz{> zb=(4~7Sx>oi@o;%iz?X~MVlry(B#wvkm~} z9Pe!|D5K6b1XBX*4sVY1d1p872fnD#1P*F~)Eit^MQK$u z#E4bPBjqAZMCiqJs)b?<<4hr0<1{))5vP5QZZllz;w?j(pX=pI50Ww2Xd|CJ$O29Y z8kY_^yOP?&3R(LFSD~vB!#Fy+tcp+`7Bb7aJtj()tVAB+N+`aD3kuej$;=)Bd>t>P zMkV4#!Sj|3Bn}p&(H}o!9DKqqRjGqV@(`#Hd&zwEv{vQ@H3=Zk;V_*-0p6Qn3HkJ< zKL1^Nu+^f#o%D(0+G_3Pr>}g2-bRcZeVK~=Tz4n`x|v_Jy<0urc+Mpr#yFMOAoay! z(iA-1G&N5?k@!$lpWU_FySnWNizOH_q?+Q!tiIg@*z~k0@1Z;>(_}RvJKy|(X3r-h#$b8RIl8DsB0TxpBT!LIv-LDkJfHrTy;mv7JgVT|x? zabC9;)f;F_v0b}|A4pZ#;K6y0Ey&HCYhc^NIOW??sf3G_G=;OB564kSf7>c$)+Ekl zjLFK0FALRiVCB)XHY|?b$mHC|uq(c1_*nbZIJ|v+?F7a+SX6pBZ4v-r1V53H`BeRf zp>N-1I+Ul=(jff<`t0SC!20F=e+(2h+G4i7`wKDk`WZt6o|awb`sY6)XoDb8J8i*V z>P+qID_{UX;_3w@?PANB7h8;fTkzRgPTtvi%qJvQQ|&b)QjL`ZZE(U8WG&}Fqf#cj z!3Gwf()b(u-{NhN#*Q1o$)J&V6?W<34{1_(RGp)8+bdo)jm z^`wUXzTG<&n-H%rUN$-v$R_9OP%DDTtf{=L$$Emh`MBqb8OPo;he*sTBOib2M>GrM zxu_CaVVtLTv~!}<3jOb{qZug>6Y2fD_%5kKZPfG7bciJ0%jfub_xK7vXc zd!TI_SyP#cpvgKZcwn$}fJ{MGHuZ=o5OQ+vdRmNqRIcyBI0^?0EeT zvltCPwPEgv6B){zVITDB^nxCod7>Ug5Vu_g7a&5iiY5$S=PB15RE6PI6~D`7+f6O% ztdr_YvH?s$%h7bCoSYq_f`WWxGfWnrgPS$`X@uyCYzET?YLhEVMR8vJF4?KW4FIFJ zu4~O@;W2*_C)3%s!y=q$T!xg#Ta$7SV=}~W`CBIA3{!=6MafF0P%G=JKYGL|oK1{$ zxv2YGJb-7qkJIjY(ERqk`Mp|J2v2~eZ~OVLp&P+1|9v1>sTKHP%wkn;;nF^zm4QEc zX?VYyJLW5(>)Ut~{Qi4qJq7}*t%Yh4B5qG{m#LbF40e&i9(p9bPz#Vm7Bs4m(=osO`2O2l zUXrw}v~?-@W{wwKzKPSC8LzH30&}gWj>p0<>ULDoVMaOL>HT@M{bf-19a6@ zCUa1~39(3{5#R`PlJ!Y?*hp2c+d>$OIh<~2YGM4@Jd5)fTOye6XVR|2O1tq~c!>2e z=UNoKTEgC`>s+%9&$~}|#*w-&T3N@^ooH_Se6Ic6cp3c(+K$7@Gl(co%4Pu8BbBtA zUUOyQXToGH(xQzNmt`iDYLJ7nm@{GoPlQv@oqK+!`q2CHzRS#q#@}Y|4tqDh!G75Z zyfZBk$D*yE>dKL~0=fZyIzewu%B+Mx;zuX$6AN(BYggZ`)D+g~)4L8mi|FZaR!rx_qAm+Z-bw3tL=Xrp{7VbT}S@nSJDW%d0>f14(i@ zZ2c0lBaaYas9<~Ljjha3jL`2Yt2*^R??p6;nWm8xx4i4 z>8g>kWCOZojfJc_K!wiZQf2^IodJg6jz4$khnr~YDyo^@ff;1FJ18F2)6of1gDEE&Xcdmb&c2PC8h+$-F{)Sv)_2ZC;4sUd!=o@_W&kr$x#u<}rwZKtSJn^ZHhp2pDCEBQ z%=|FEDIM;UHiI`LMM+8VLjLbsF2xLP6pGW?iwo#kx9gIGG^q_u*A?jcVT1)`uQMcD zZ|k)q(+8FfP^#}J$)2AMm+y2e()D$zXVxK?Fi1vSc|JdF0kbj_wiom4-|ZBoB{D4Hm53E%%N{@n;xGfG zOjEVVf5&;epzVn%Xmiq1oT5X}Lt-9h|F&8$ErqRbYg;tF0FMy@d|BL`!}7A6A}ZJ7 z##6BI5Ncr-RRee^9>+kQzj&`+p zvVmo2I^QbV2;x52LjgQ-w_JBmGL~I<0u=XmPtYS}LVd~oAo`)0+t162?V=*Za!mpt zI*K478F*+$pK}~P6=}ju{C$sh1yZjMLlW!xXmjyc@p&dde_BV`YaC(`hmB>g=bJ=z zOi`1|&+tk9@a6gZ@(dlh)Lzx8aK&HI!+8VxS zH1KHq-6iB?I!FVM$KE^^xzsp4+I#d0^OceS>cH7PdRogsF){@g12%47#fC=`gXlxb zNbgLUm@JJ0*0(blqUFib3NZ-H-*rmqf|Sgu1ae32w!=j!7%4NvcY{2~v*cBz$m!_G z%H)zkY>rpuBxc^3RFVev4x|{bgn&k~TOpII>B>E&QV&y(eBH8q^JhBGDlrts;7!$9N5^~C_tC}{wd{W@c2FA4DKe>R#igv|vUE#KdzcttOnOB}*mcvR~zWr$IvqGvukX z-?V_8wGrjKbu&}Ob&D&4AR|pIRx1TEBAo2bt;6~@30Ka2CylIVDI9ok;yZ~SLtIlm3NHu+};%k#YlGD zS4ju=bqh`U$%hlFgo*(+)A3c{5k+>DCfXNY`Eb)cIfr8SQ)zk!o34L)=-`GI6kT_pUgIkuyBClM%7Z7jasqC%~fL@ zGKC>eJ*u;IGZ$XthFndh@C30#|LM26q^);iFBXNJ-xu?%fvK32dzZI_bD6w>n5^}M z&Wa-K0wzkNx9DA-ky9dB-@M|eWa3J`X(oB&+*Ce_N`zUU>$PTf#=y;9x;w*qkl1Jr z)5gb+v>~wuNaHB^+ptn_X#<2L%4}GP`xI zHNvh+TQ{Ui<2#x{WgKxjZ#;Y4ELYcajBGj{g)Excv2ZpJj)twc-)vbZc1TJo6>Dv= zyo$X7HDiVsO$DG-l_TqwATP>kO_K!f=-W$E0MVl}AO%y%msLs-aIEz0NOy8J_)&V2 z;RPKY6&u~RrWFjo%N5Hjr(FYni#f_p%NW`?%*q1I-V}0?WV(e+Mn(-t&5ftrZ!lRN zLh#1O8v#n~+cVw~Kdr6uWnpY!?B_|ni^mQMPXm)!DG4sk$edt3hFtTg90bk?G``)Y z-9uJxhX;!AESp%2MaQ{Mb&>>ajIF$W@f1^FR$i^GDMH*oeNTx0$ zubwU(aZF?Bxu&RMo;;^JfG{7($ldmTu9jjKcNjgJ2`aX*;GoeZW3&+>PF0(KeW2NN zdU{+jU8#+=SxOg^1U89|1dIgH=0$;suo|w7(RWml%q4K%Q07GP87SU=373^athHoS zHlw2CaI36M$M0equ@Q#$^o^&D$f`ocSvMjTC-8-mWXJ(C5lhy5Sw)Z{e2&q zcxt>BdZ=USV&TvSE@4VOhSR>lJ7jv{toj)Y%|?Lsrt86JZ?*-*qi1-%DzTlo{rkTH z((kBCa_oi|7;+>6HHX$o%LEjl_mwh2!;)~h92l-~5zd(KNNUjrOqYd#(%*F_m`+u~ zaWTTL`LD{>jhT}b+S5{qQe-)p-l!%o5GEN0bQ6T};i+PBXZN})^GI_nCacJ?n5VTU z=j^aXk_)-GT^FU3Q}@qF>PCh<%<-x+0CeZ^Y~R=Q8nm|v-Fc;Ew5Grpj%7#WrxQk5 zgGHDu%SN=i4v#duX2ooOJo(Z@uqns1Dm)aPLTM5azvWxC9nsGO zIEheUZggq$`#+PkqQb{EbH27lk4iE~- z)iQ|6*1>+@#|TT*z*h&*gjyVxR^au45{OG=8$uYf2v_)d28L}@;)e&7^Rs-;oXpnJ z@JKNrR`&ok;o)#zrxV*U8`j(MR|fKPud~D$soU0c=>|NEoG?-N{B5;D^At70FdLPu zU_;}qlN;Q`XSvYIt7huK#51&!OUZ)q9tJ2qY&N_IWAMUI?03 zJ;bq3L$2~aIa`z7vyi^;OUYI+7Lb?|X602PtGD{rLiyqAh7gv^Y%vO$Qnl&a&};%X z>wsx@u!81@1chDoQhSNqg9si0k0ZOH z>6jI&*6zjI)w)B&{ZT?17Kp`ZQNyTm8&dbG@w{XzSo~|S?Y6|KhG0|}e{IQVCjr2^ zxuG|v;ps1x>XpF4tlCjBpB5nw7@$pFfGxOfoRSNac9+fXMX337i3xnVZgCA4S9IL_ z2m;r!R>D3KOu&Ceq|nBsZzxDOiQp}=55qe;RAFZA8}9m`Vq4+p#l{zhj}MD@Pr^!h zD=tx1R+fg0$&p^;d{c8?9^e9&;(!BsHS2jahlZmZ4tmHh@m7~V%)zCsngKgcQDgK+ z^E_G-KxGL?R3@{hoC}k=(DkUB*#*7pBGe4ovp&zL@0=g1U;CM>_OtZH=+_B)k{k7* z$|GnvU$#m}I_LDV2<<(+!YRGgH^!u|&t3oppop3HYmA}pHOd(hv#I0(;rEe7QaMeC zQF8hZyCxy5#7Z(tRmeshlN`NpDDyQ|*@Ga1*l2_;Eh?rYY{OO;ieL?rb5;yhZ?j>T zl@HNeQw}!R>Q*URe-@wzN%c`pt_H`&I+<4;nv#-57j!+7+BIauDti$2Wp;?g3!(Tb z08a%<10|Dr+JeKxY)2TQ^?88O9JPm~CaG(xYcti%;gNG(%~Lg-kyWR-!|!qu25{ z$c5cUVjh*E7|0tzpA>n_V#GPgbJ;TF2?E%Hsn!a#~4-vDlG*RoCe7)TsW@wXpoDo@yVtl=Rw`W(sGgzjrX3fmBK=qy#Yv2Hv95x3cjeS+%^p{<_eUo4@-fN zdqCe1Vhm^bWYv?gH9(uz>v9sddkE3m-KjwnFNNrQ)p!$hN|HuB8587!tP%qF_hURPhM#c$zxWM13UN(s42 z3I24se@atR9A+CR;%xhzYe$`rSdGk$Ihj!HCW@SAosa|1H4JR&f)NXz=IzF_^cwM> zJ-=^Fx;tMEX6>SD(Xg~-*2|8!}ReAQ145Duk9c?9u8HBf+3r{ zK)hO~mb|EL?urwu)9}zxRed#o{rZIf(=>PpD2t$ZUna*aEx{N@P*fm1GW|>d2kfVa zFBvE3*AD6uEp^AF8N;Js;k4zlTXoF}Wl989#*>hexL)Gg%@{5LtnRV%XWO9_ki z#;X#T-%9e!@Y5M$g{%l0V#(6eOhImks!)SQz|OHC4fu(75di=bMp6LoO1}*z#}E<_ z&-vo^ebLYcVlGm=49rV!T=pB|z$`bbG-s^!Mt2#!l}RunGFkhJ_vJ|tzj$>Dgm1xuX2RvV zkpTfy53$I~B^K*c?3hSBll+LwELFxSTu8mc2xqiaBn%u>`}vbqoS`HFrUwD6jCAhZd?7(uV6&)(#_rJMgS*zQsT@8XvDU9Iea%fp{G%I;r zi}%9;(l!-P=_?Z&k|7ctGhJdXOHJ$udK`cUA*W+<>0Cr(Cp2EpnUvWSY7L9QfwFc- z8hWiH^PrfQC{$Bfd9kdcGkiXB(ij`2e{gXIu~>VUpr&-GOpBWxnm&IQ!&r)4p-W7; z+kFSbh~J7SsU9b48rzgT>5YZeU?cGM?OQz*5}{$Vycl)Uu={9cz7(tO2E8>Rw^$BL zX+iJs=C$b#ZD!zvQVJ3x#^%=btTH|cz)sAC$3(&G;~uUn2;_IloiGcb0naZ#(%LG6 zM>skNqcyKr=ie1F^9<(e&X@Fo-2_n?PMfN%sorDNa%deJ`?9ta)+BYD*?UR16`#Sb}-Cotae_%@w-1*2uoB4~M4$;hqA! z`i<7s%Y-MTeJF(}NAPeTNyDhKb|?rmoJLOqoy`JIZ3`=O={{gKxm5C5|AY)-sS&UDjEn^B?m4Yum*49l}P%p_t20t~b7sq5AXL^%1V`2(V}#<4_T zt8BMwp_=dp@(}m42pJewW?oYqz2sa?Dw4iR$7>C9Fle8%n^{{8WS5<7Nn~i9REmv< z=oXVtY*}n63Z#1L`<;94Pivrw4H62o%mdr7)?8Oh|E_zqVL2kj_19Y4FG+pp8RQ;DU zi}sC^a=Dd5R9Qo0qtu45nrIrbgLb)_$S*~=Gnm#L(+xnQ5OeiJ8Jilve=7)w;_Ehl%keX^3YQIL+lm#jC!$r>)T>WbHzCFtKh zJ^AXI?CpLa2~4LbbWf0jQ8j+|IJ-g#tvYiOBT5Fv zjGsSPz8%L*z*mWo3MG9@DQ%0e^B6c+FbFld8!ebIS3W?c9uQ;s)*(3zBZM#>sjyIy z0pKUL%NHtoZ4*Ybd#oeI5vtHJ8Zguy^CVL0kRtm8l|ebKm*`yD5Y^4C1EEgZ z)sHKE5WSe$|9NWH`23-DA9)3+60FubQ#%-bsHlWfc5hHHhWg@SZCp7NB7N#Ggr!b85zf}`oc;# z2HKlfd7>%WSi)$xX2P4GIth$}BJMoc1K~A{gdxOAR%#>-03i&#m66?#p5M1N+}9sW zlU}{rfCO5Y$7|l^9((Vp?II`36F-p9)x}||QK>eamSC^#&$+>;lOo)#3&XT3<{!@+ z1yh6862Y9Prb_l)R#js?lL?AE{%{%N(nC2x)g8=Z4YDf43&8&cfQHuie&Mxh;@C^~t+yEQJcl*{gz2jR$TBZV@XK9ovZQQg@m?K1HvNp_GOG9{ zzE?q2YI!U~;%Piagk##ct6DT2mt80^sQJ(RB~q$x)`(A z8N-;c>^$Q9bhZehm`hbag?ZjIq*S4>RSk}E{|UGxu!C$B5{K#9oDQyzp-vy2V5xXRt8d{`wi&T-E>Y?C5Q(Y*TJIuB%&OuJSd z9(Q${(i73Gr&aUvLwPDjjFMQcz8wsyp0gNwQlA0nXg@bnD7oq5aF>(uEyky8RLYBfVwcC?RwMhQ#b4Dtcc=rVRW)>BoTKl|^Rl-QYbMvER3vtGAOm>7TF7teYi0+#-aV&EH|N6xSS~nXB4`K0G z<8Y)b%mpP!PVO7FSvf3-*U#|rPINVt${Cg=yElUigbMILNdhL>M$=40tQ)sg4kuKa zH{!&9#LRqxYUqlqkr-@5;*hE1$q`%ieizt&;gd|;>*4P>{}KhKbi?r-=DcSUwoO@W zmb!=CNmFUs6Oz1Pe~!-#xMoom!~wwzcZ@jOckV0lAP=(TR;-te?sJq0aGzSjMq3!} zy?555a-7+@f;bN+P{iicKHfuTGGl8H8&nQx;j2mv1uMhjzrMkyMC1mgG6a? z+e*2%cD~T7QOt7yE%paaD~8$G?qTlD->;;xp#e23ml2c>V2^0&Slep#%S$jZGJ)*} zBI4B;nPxc!ZumgLYm(HNa`7_9Qyw!3EaaN@j&L~%BiLTj6EKt!Vl8DcrC%3l7{9wr zpTtbnw-WO-j&wRsR-lkcj16ROuHhzBc~${*I_{(=tVxEEX<=c-pA-QGh<_-jec=-Y zT6+1jZ^JS8cn8Y6(ziZ|SF|uOW+<&ITUkvrLx()3i{Tl&O%VQ(*KriseLIT(AoEPNqbv5V4^a=&mlHvI$1I0*V^;6a$&Bz7C$@@91-!3W9XIWs zVNpEg?RXeA{A^YDq7Ur+yo>v!7a>$JsVugUff6vn9CI_OJV<}o{7k&~_Be5xo-XB$ zx;s@|!1^@)fr(Bt?Mzx6LQj@j`nb{#aJa|Grip$-iWP1M_hb@lfSu=clT&dXnc^=~ zWjhi^7#JVNw(2*Z`+T-WaxH*&L&diM7KY7diT19i5vpABwyoUTL>dXl|+AW8d2%*E2Bey zYup;!>UUXs)>ticPa_6L=DBsHa2I-)U8p>)?fhwin}8%5?z+|yhY|)9Y2?P-n(>)* zvnN|gvD?S25P*ruHB7MxEp~%MaXN<5bwmNdO+!OV?psH>V^$;1)`_*YC5JDsT=8(7 z+V4HN*ns`0a15ql%6qCt>v^CLW>acO*953y5NylFBsgR?SuJPyrc#YZ+KxNF(-W+# z=6*B1Ob2TWU-UEmUH9W-=Yon(nEL8&`G^iMv@>A=-N<9>?R7-WN+>%8HJ z8r+-w^oV+3^dc4%b7-izvWAkWRKenvnW%o9o*FG|=AT zZL7lhTKv0kx*?asMfX!tTKOEwP*@ncG)EWfBou+LroS2Br0vXMPr8 z-AOLtjpMzWUcOMG8yXLgnqSJLPt({ck;Yk_GW;1d&xPm zDhRH_UOMBss(8ie1j`qwr0E>8Ps%&!{ySoAC+BQCc87@c;Y98W;wQ5gZ(PY!0*7bB z@V}Xbul3K#*-ML*$SG1mNvp8o1L2yg(0dY-raC&H=B42%&`Klrn?^TIRg?Bq_MPt< zy}@`G>2tn2ix0FsAH6;_P4NsJ5^e`h*1$r^IZzUdlBTVzoSF|LOAUC9cRZd|lfESK(EF-CDQF~C-0@2R88>D6~te<>a^_g#oW?Pobht%FY5*V z<@_1aZC@Tqw^8T1UItT=8ycS5bN&$v2ujX^v^5YFi1D*ZZW70*Xj8=8HBSVk` zp^g!i3r(gBg^#Gv8>uK8;m6Ma?c~I?o{9*h9z(oOr2st`ny3;ZDx20%@+!us%D9mN zW)lh?Cm)F8Pu%>j>iCOXzq0f%@zuiHbak&Nv)Ngg_N>;*y8T1rZOP|Dk%1Z}cv2-nuXAz-=$xMA%f9{g)5e(Z?9$08@d#GI;m zuoWGwjd;*I-GfrShlrbsr^ivx&XAn8BTS?BXgK!i;kr&9_c>wxgXXu<9i6NZ&Gbp9 z#KivbH|?Nb(n_6UF(9;#b_#eAfzb8L78OyXm$!}0{E3GNBx=s1gWp8;hDMQH#Dp5G zvs*xb2PGb$2lz!6;?EzQu572$1dW4bt;T~CbwW34>ZwtCzMd+>b(*<>1D!w*%lC%OdPMp%1| zSDBJdyF|w;c*P@v`X8U`d7)(VBhV^ZTdtKuugUeiQ8J!)x6!muMbrMfEUBrm8k3~Hlv>1{?}IF5HK?0XoAP+qw-tT5zv_y<*eO@ z?79;6W=%XCY9rjLFX-;HvFPiU1c1R;ni#08)YO=3=O+G~VqW@=3R$P1cxz44L{QND z+kv=AMzl;F^P?)3LR+>$TOy-w=~{r1U%-NRuh1JK(<5}nJ(iP=m_ET>;{h9-)rx< zla!>O9-Xcpb%af;#a`xkw>B(JNM;is3QuYbn#dso^VJaRAHJ6CkoI1Yqpo=J#{2VU ziqvRop}5Eh#^OjZ4xp+5mc2lf_-r^8QI=U~r!5oZ`|2t=e8#(wP1Tp?Yzpi~y!+bG zOsZ+BPl=yhY}b99x~R|;8u!GcYaeHG>;p(j>n#$npX9iUI5S3Nl5=H}Zr}^&X{${T zo8v+pZV!*hsAO(@a8iLiYLM3c;M$OMmK0Q`5Q}|6J3CBbE?a@l)y_OhC(e(M-KBhI z+>4gIg+*>$N18ba)+VC!M98QZtMH+!M^4vs7pi@pk9wJFTm1>M{1Db`9;%jit47XS z3WBR40cgE;_`bRMw{>vKqxt!N1gg4oB(0(Hxi4tF2Jg1f;4koB5gXu;4Yg}_QpoaK zA357PHvU{nO15UNwB7H^|j+cep?^6Nf>t>yy(AOP}eA-d(`Mc{yXO&z*~#*R%> zyuBFWzqly%f{O&jhIwlx^in$R-1;V`O~YzR!-)B^#GzC4<2=@H$Fk6#p1DCdUjTpP zcm3e=xaJk?Bj9UHB?WNy2n4bCw}9q&_}e;t01LvRp`od$!E)- zjQ{(bZmkD06Y~0po<2NScVujCS0rjue_Lz=HS&esCXCvjTQn=z-)7Pg5qGq<1 zTD&1_@FF8jzQMQQ0Xb>-WOz^1z%m;PaW{tJAKJqEA0)QA@)1CmLaAHNtgfS>>QI+P zVFvIVUgt78!0bw1%z#ajs5z?M-ie@K@d(MD4tA0+z?L2G$n%?I>dEcTt`3!Qu(&Fu zV?~yN=WsAI9km2yCK3u?9|$L1LOgP7y{B4z?>#Vo^Yia#N6-`4#eus2XU>QHT9x>I z9H8|7@ZjLDXAP@2{eT*2>Bmo6R3Nb0y8i1oxm_F0uf;4L7(GL@KBjD0sKR8se10|m zT`~Y4&+C!D!2wCA6R{+IZW~B^IT?P4kaozrPj-+Oe}k|2Ob%-kBvi&h!fd$kEFL7m zI-q_J$KU{kGUsJRi*9_+E8_PE+*DO1BxohAlSzV|V%PB)JZ4qU5^#~|s(_#=L~bf7 ze%X^JsM)KBRl%ckr(>E)ZXD7)2^>hg|GpwAgDmN6jMeXbtmUbM$-B!;VzvGANmHTw zxmE!nSu%Oe#OG`2|S9ZF{yv5(U;{V3GbeU$p$ zmagBsJ9>2Wp8HcDe5y47V3kv9J zKj;O zfl@+HZid}sSN|yx&^0FYP7Z`fWpLK)RBa%gD6ifrG;Xtt>&B?Pu@g3BPD$5(f-@G_Wwl( zs1fFU{qe>T0PETfqlH~_+p_Bk>8+Cge+PBgqin+{(P!~cM|a*yuN$Hd2EOaK_nFvl z4z1uA#LvnhH=%~)F^<{p?^#VZ%fTTuk6NXe(J5=}G4`EeVpPx)n7i_ zPZKqm76nf?0fx)c(35`!`2T?jWIHYD#kee-tpb`5|7a^pjS$`^h%ALj3yD!s$L)O@ zmnh9m-E>~^^xfRXk#zjp!xkL;QGgj|pna0Tv;`*4|o|kzrXy@^7PS% z+Gm|NI`@6w{$J$(89}C^Y8J|%8B#2csPDt___ihQBzV?0$^ZZ0IbnJz}FW5c>oCk zmz2#JfqRV=jN3dV|J;yTxLjja%lPL48~ zp8g(oeirtQw%-!LASEM%P(t`=Y58sC#N}-N@%0r2AO&I4VDV#OFav<37?`9OXqzy! z01N=;x7_}I0Wq;KuyN3F5H$YhD75()OswygVM#Da(DuU0+b8vH4YRK7^ayC%X-K_d zp^)Zd@OEISBSHcIm~}qi()HPffBU~)lK-ohkRT~B3D{XLK?CAD>z(Mo?;vwhjQj<5 zO^y>(%AAxKApTYb?Z?Pb&-t_%x*JPRCsVVTU$$o;SpHi_e0yqD`k%PYp4I=l`|yH+ z<-hFMZx^j~{wsHDkpbG7yxti@aO^w^*Fh8J=WE+vXzGG^KcR)Urf>13*|q9RW`!c~ zqSzS!_~${~$#si2<{Rarv{H76KnkMtnmnooIYiE(-l0B*u={{exZrxyRi6V-*4z@ZV9t zLYVm*6N+dH6o0yAa#ix!f5&0qAJjY%&FjPd9rYVTbSqVw8vbWArq*?4kG$WpSlmrb zpBKGJ(6h{+E{SE0lWTv%0RV&&&Cw{2-_idw#W&4sRBCDf{4EJoX|$6mipfbdWCgJL z{_NGA|BKPe9BuVb`DnA?8JaZ(0REOX>_WQ*H$VaETxowv_TpVG|B71C)!Vo0!P}3w z1JSkcZ~C$^b;IDom}yJGW_wc3!h0OuDtd=4X-7Dknt!bZyUG)Wp!iYKMAMCvQ@I>-NG4M|_`QnI z<4BSgrv+z1h-M1S_7u%H7B$HDwjFmNxKC*M7F%AQ+tHUvA0NzS zscw{q*FU7rcy=wPz_LUy7y0dN={Px8@;A$Sw zOXH_ee}Ft6t`eyX=^RJ?)F^=DH4|5`MYT{dH{-l!r4~h3d6Yc0d3QBZxijr#`I6r% zNLW|29#wB1#`xdjD(j4UchdSS#6D`HUACNb^HwX|Yh3Ym(z75@BdM-da?zaI^7Jhp z6IUYivc6~M2VF2!z3#_r1c{cUEo{TT#r`^P*&%0tyA_<(>2{dfsJ_gsAv$IxzLLFiTOmtnJ}%b zvC(rBO7&*ppO}N+IEKiMb2}|^IDmxR%0XXg%D|nZ?mYG)H-8>+1oujhbIxtwbkWcr zNPT&eynSmbdCPk)d3|D@!ChKl(|evl{uzV%JpRGz+Q>}3KEYIi`#s)CfdG<@W&oh~ zu|Vo1#eZ;v{$lF;Yd`(|BzIG%I*!x#&=3E& z;Tk(AE0G-~eUIqFH}3MUjsC~|0Au@r4Deru{omRwW?qHFlQu*EX}2`d*^wCM_znLr z$Zya7nJB-fS2ujhLsR&B_*dxrG%)UD+b}sO^1x%ZF3enn?Npe~gijdxy~_UutAc$~ zzoqxjseNxc7>30OOG57t)mCZWP^e8A^HHdwOY&2X`sq>p8x=QKqkckt3!wSO|JoD@ z%&mIahWN|#-v^uT5r0pd^1WL(Ajt3cefQDCVZR~{$Mqx1yQ%Q!*+oOCdgotH*ngj! z@FA= zCDESv23xm~>{173nj9sEDzDkUe)ysbHOGu)R8FPOQ~1Ui|HdGry_E}cD_F_@n11h|B}P{6?s{9Bap!=XMOTPM}+7L8ewsSX7gWq z%fC-^@4UdVVtvjdPq2#|`8?4^0RG3E{(vze7i;60kw3zJ1TfjJ4Azl{1hHd0U_c@M z<{rWpb6UkeKJ`0{qjf9Uf*tr#3)4Y5y#IInA0Zq%msa7JKVp7|!Fg|)+qAIX<>8D5 z;{Dw{qH}J}f90?*5}}b;R`mE*A%xjHB0|;j;*;aTLh<1B{~X|Kts9v4b#kPo8Hn^O z%KOiOK8f-EZ&{NZp^W{1`4`SxDK%G+x-B?zTAy;+?2PIEs~$gM!l*;&Dq66`O9B95 zU}0baalVPZE@WRov^) z9+SmcCor`cn#FOF?uZT3{|_7%O#ZLVjCOK9vRS04me9#n{=YGx;v%m{n=~6)D#BDn z_$@%LNhmyKFiJJuN|i#cmR?!If8;Wts_9`y?lNL%XBzLVHw3Qv#Oyq#&UTCDQ*UXf zW3+lEpGCXZ=E(n`m!jU22QpYmb>jT+MJr}o+hS)g|B`;meIH+~gsQ1INy!RjgMWrf z*Gj3HHk4GWP&L@)%4gLtt?@}uNNJoll2m)DYO>3HiPiT17&R|x_Eg5G?t$P`9$_`Ve(}~zjc*fgyYQIrqQ9s5Jrc3S_IDRlv5VkG{@AYP8NR6nYbr)( zMrGemzCtxTIa!l!ul0$Olt3UaWp<5bm#0@hmCLVpI@!bXlNw^LRTF^3;n%s-wrYwd;#zTE8Mk`XdYE1&KiMU^gd zr5n~g@I4>-k#|sOgQ7?%XAOa-kv+oPY*E*4zHQW!(nd+e%egujcz%_sJ$RtQIC|;L ztt=HKOoAGIm-M6G(2RR5_Do%IWBv5fOO2R{mMuY5n5 zYqU*Rv^_)*)mQTi|H+Rxj9UEf+dxJNOWTjv=r(ASGrRE6QD2IVnT@=D?_?=sA+#Ab zLqH0fe9dK8RU7>1dokk;$Mc}5VNLP*KK&GCL}}kajDGBN2BoRZ+P)SobBz!sr+VMb z#F`&zpH=^$Fy8^q#J2a8d2$zl#=cS>F#c%kq$w+8v!ZlF8_Ojdh|Vdj_2O@{qFyM zzi+MCYt77>nKe(&Gc$Y57?k5srE(5L*Iq(jq}vu^szqcsOW)0iW6VM1lGI?;AO%V} zE^zg5gxydE7|1fSq�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 hyx9?7awBDsdi#l($ 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≪v539S0t>nm>oTvC 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