summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorAndy Nichols <andy.nichols@qt.io>2025-06-10 12:58:18 +0200
committerAndy Nichols <andy.nichols@qt.io>2025-06-10 12:59:03 +0200
commit488a2f7af2920295ada886f113a0d563dab79b8d (patch)
tree60618a0947d45081caf6c5038cee9706e4af4ae0 /test
parent647f94648c0ae24b9c6684383a9dbbc0e2fc23b7 (diff)
parentfb375dd8c0a032106a2122815fb18dffe0283721 (diff)
Merge tag 'v6.0.2' into qt6_assimpqt6_assimp
Diffstat (limited to 'test')
-rw-r--r--test/CMakeLists.txt11
-rw-r--r--test/models/AC/ref/README.md6
-rw-r--r--test/models/AC/ref/screenshots/sample_subdiv_ac_solid.pngbin0 -> 268184 bytes
-rw-r--r--test/models/ASE/ref/README.md18
-rw-r--r--test/models/ASE/ref/screenshots/MotionCaptureROM_ase.gifbin0 -> 7023262 bytes
-rw-r--r--test/models/BVH/ref/README.md16
-rw-r--r--test/models/BVH/ref/screenshots/01_01_bvh.gifbin0 -> 2507650 bytes
-rw-r--r--test/models/BVH/ref/screenshots/01_03_bvh.gifbin0 -> 3838515 bytes
-rw-r--r--test/models/BVH/ref/screenshots/Boxing_Toes_bvh.gifbin0 -> 4503296 bytes
-rw-r--r--test/models/COB/molecule_ascii.cob6
-rw-r--r--test/models/COB/ref/README.md4
-rw-r--r--test/models/COB/ref/screenshots/molecule_ascii_cob.pngbin0 -> 248304 bytes
-rw-r--r--test/models/CSM/ref/README.md4
-rw-r--r--test/models/CSM/ref/screenshots/ThomasFechten_csm.gifbin0 -> 1526563 bytes
-rw-r--r--test/models/Collada/ref/README.md6
-rw-r--r--test/models/Collada/ref/screenshots/human_zae.pngbin0 -> 646451 bytes
-rw-r--r--test/models/HMP/ref/README.md4
-rw-r--r--test/models/HMP/ref/screenshots/terrain_hmp.pngbin0 -> 141244 bytes
-rw-r--r--test/models/IQM/ref/README.md4
-rw-r--r--test/models/IQM/ref/screenshots/mrfixit_iqm.pngbin0 -> 1575656 bytes
-rw-r--r--test/models/IRR/ref/README.md14
-rw-r--r--test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr.gifbin0 -> 1408538 bytes
-rw-r--r--test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_AnimationSet0.gifbin0 -> 4414852 bytes
-rw-r--r--test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_Irr_GlobalAnimChannel.gifbin0 -> 1202540 bytes
-rw-r--r--test/models/MD2/ref/README.md7
-rw-r--r--test/models/MD2/ref/screenshots/faerie_md2.pngbin0 -> 853999 bytes
-rw-r--r--test/models/MD2/ref/screenshots/sydney_md2.pngbin0 -> 591732 bytes
-rw-r--r--test/models/NFF/ManyEarthsNotJustOne.nff (renamed from test/models/NFF/NFF/ManyEarthsNotJustOne.nff)0
-rw-r--r--test/models/NFF/WithCamera.nff (renamed from test/models/NFF/NFF/WithCamera.nff)0
-rw-r--r--test/models/NFF/cone.nff (renamed from test/models/NFF/NFF/cone.nff)2
-rw-r--r--test/models/NFF/cylinder.nff (renamed from test/models/NFF/NFF/cylinder.nff)0
-rw-r--r--test/models/NFF/dodecahedron.nff (renamed from test/models/NFF/NFF/dodecahedron.nff)0
-rw-r--r--test/models/NFF/earthCylindric.jpg (renamed from test/models/NFF/NFF/earthCylindric.jpg)bin624832 -> 624832 bytes
-rw-r--r--test/models/NFF/earthSpherical.jpg (renamed from test/models/NFF/NFF/earthSpherical.jpg)bin422120 -> 422120 bytes
-rw-r--r--test/models/NFF/hexahedron.nff (renamed from test/models/NFF/NFF/hexahedron.nff)0
-rw-r--r--test/models/NFF/octahedron.nff (renamed from test/models/NFF/NFF/octahedron.nff)0
-rw-r--r--test/models/NFF/positionTest.nff (renamed from test/models/NFF/NFF/positionTest.nff)0
-rw-r--r--test/models/NFF/ref/README.md4
-rw-r--r--test/models/NFF/ref/screenshots/cone_nff.pngbin0 -> 512075 bytes
-rw-r--r--test/models/NFF/spheres.nff (renamed from test/models/NFF/NFF/spheres.nff)0
-rw-r--r--test/models/NFF/tetrahedron.nff (renamed from test/models/NFF/NFF/tetrahedron.nff)0
-rw-r--r--test/models/OBJ/folder/mtl_different_folder.mtl13
-rw-r--r--test/models/OBJ/mtl_different_folder.obj31
-rw-r--r--test/models/OpenGEX/texture/Concrete.tgabin0 -> 524838 bytes
-rw-r--r--test/models/PLY/cube_binary_starts_with_nl.plybin0 -> 451 bytes
-rw-r--r--test/models/TER/ref/README.md7
-rw-r--r--test/models/TER/ref/screenshots/RealisticTerrain_Large_ter.pngbin0 -> 1507869 bytes
-rw-r--r--test/models/TER/ref/screenshots/RealisticTerrain_ter.pngbin0 -> 932991 bytes
-rw-r--r--test/models/USD/MotionCaptureROM.usdcbin0 -> 133113 bytes
-rw-r--r--test/models/USD/README.md8
-rw-r--r--test/models/USD/ref/README.md4
-rw-r--r--test/models/USD/ref/screenshots/MotionCaptureROM_usdc.pngbin0 -> 101549 bytes
-rw-r--r--test/models/WRL/HelloWorld.wrl87
-rw-r--r--test/models/WRL/README.md6
-rw-r--r--test/models/WRL/earth-topo.pngbin0 -> 102593 bytes
-rw-r--r--test/models/WRL/ref/README.md4
-rw-r--r--test/models/WRL/ref/screenshots/HelloWorld_wrl.pngbin0 -> 820902 bytes
-rw-r--r--test/models/X/ref/README.md7
-rw-r--r--test/models/X/ref/screenshots/BCN_Epileptic_X.gifbin0 -> 1356453 bytes
-rw-r--r--test/models/X/ref/screenshots/Testwuson_X_anim_Wuson_Run.gifbin0 -> 2639740 bytes
-rw-r--r--test/models/X3D/HelloWorld.x3d57
-rw-r--r--test/models/X3D/README.md4
-rw-r--r--test/models/X3D/earth-topo.pngbin0 -> 102593 bytes
-rw-r--r--test/models/X3D/ref/README.md17
-rw-r--r--test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_irr_xml.pngbin0 -> 856840 bytes
-rw-r--r--test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_pugi_xml.pngbin0 -> 180360 bytes
-rw-r--r--test/models/X3D/ref/screenshots/HelloWorld_x3d.pngbin0 -> 950873 bytes
-rw-r--r--test/models/X3DB/HelloWorld.x3dbbin0 -> 1551 bytes
-rw-r--r--test/models/X3DB/README.md6
-rw-r--r--test/models/X3DB/earth-topo.pngbin0 -> 102593 bytes
-rw-r--r--test/models/X3DV/HelloWorld.x3dv86
-rw-r--r--test/models/X3DV/README.md6
-rw-r--r--test/models/X3DV/earth-topo.pngbin0 -> 102593 bytes
-rw-r--r--test/models/X3DV/ref/README.md4
-rw-r--r--test/models/X3DV/ref/screenshots/HelloWorld_x3dv.pngbin0 -> 940411 bytes
-rw-r--r--test/models/fuzzer_data/clusterfuzz-testcase-minimized-assimp_fuzzer-4751812606885888bin0 -> 1966 bytes
-rw-r--r--test/models/glTF2/AnimatedMorphCube/LICENSE.md15
-rw-r--r--test/models/glTF2/AnimatedMorphCube/README.body.md12
-rw-r--r--test/models/glTF2/AnimatedMorphCube/README.md36
-rw-r--r--test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.binbin0 -> 4284 bytes
-rw-r--r--test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.gltf282
-rw-r--r--test/models/glTF2/AnimatedMorphSphere/README.md20
-rw-r--r--test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.bin185
-rw-r--r--test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.gltf276
-rw-r--r--test/models/glTF2/MorphPrimitivesTest/LICENSE.md17
-rw-r--r--test/models/glTF2/MorphPrimitivesTest/README.body.md21
-rw-r--r--test/models/glTF2/MorphPrimitivesTest/README.md50
-rw-r--r--test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.binbin0 -> 1512 bytes
-rw-r--r--test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.gltf331
-rw-r--r--test/models/glTF2/MorphPrimitivesTest/glTF/uv_texture.jpgbin0 -> 49535 bytes
-rw-r--r--test/models/glTF2/MorphStressTest/LICENSE.md15
-rw-r--r--test/models/glTF2/MorphStressTest/README.body.md62
-rw-r--r--test/models/glTF2/MorphStressTest/README.md87
-rw-r--r--test/models/glTF2/MorphStressTest/glTF/Base_AO.pngbin0 -> 178434 bytes
-rw-r--r--test/models/glTF2/MorphStressTest/glTF/ColorSwatches.pngbin0 -> 208 bytes
-rw-r--r--test/models/glTF2/MorphStressTest/glTF/MorphStressTest.binbin0 -> 388084 bytes
-rw-r--r--test/models/glTF2/MorphStressTest/glTF/MorphStressTest.gltf999
-rw-r--r--test/models/glTF2/MorphStressTest/glTF/TinyGrid.pngbin0 -> 186 bytes
-rw-r--r--test/models/glTF2/SimpleMorph/LICENSE.md15
-rw-r--r--test/models/glTF2/SimpleMorph/README.body.md17
-rw-r--r--test/models/glTF2/SimpleMorph/README.md41
-rw-r--r--test/models/glTF2/SimpleMorph/glTF/SimpleMorph.gltf189
-rw-r--r--test/models/glTF2/SimpleMorph/glTF/simpleMorphAnimation.binbin0 -> 60 bytes
-rw-r--r--test/models/glTF2/SimpleMorph/glTF/simpleMorphGeometry.binbin0 -> 116 bytes
-rw-r--r--test/models/glTF2/draco/robot.glbbin0 -> 11896544 bytes
-rw-r--r--test/models/glTF2/ref/README.md16
-rw-r--r--test/models/glTF2/ref/screenshots/AnimatedMorphCube.gifbin0 -> 232556 bytes
-rw-r--r--test/models/glTF2/ref/screenshots/AnimatedMorphSphere.gifbin0 -> 673552 bytes
-rw-r--r--test/models/glTF2/ref/screenshots/MorphPrimitivesTest.gifbin0 -> 1237834 bytes
-rw-r--r--test/models/glTF2/ref/screenshots/MorphStressTest_cycle_animations.gifbin0 -> 2552330 bytes
-rw-r--r--test/models/glTF2/ref/screenshots/SimpleMorph.gifbin0 -> 92753 bytes
-rw-r--r--test/unit/AbstractImportExportBase.cpp2
-rw-r--r--test/unit/AssimpAPITest.cpp2
-rw-r--r--test/unit/AssimpAPITest_aiMatrix3x3.cpp20
-rw-r--r--test/unit/AssimpAPITest_aiMatrix4x4.cpp20
-rw-r--r--test/unit/AssimpAPITest_aiQuaternion.cpp2
-rw-r--r--test/unit/AssimpAPITest_aiVector2D.cpp2
-rw-r--r--test/unit/AssimpAPITest_aiVector3D.cpp2
-rw-r--r--test/unit/Common/uiScene.cpp2
-rw-r--r--test/unit/Common/utAssertHandler.cpp2
-rw-r--r--test/unit/Common/utBase64.cpp2
-rw-r--r--test/unit/Common/utBaseProcess.cpp2
-rw-r--r--test/unit/Common/utHash.cpp2
-rw-r--r--test/unit/Common/utLineSplitter.cpp2
-rw-r--r--test/unit/Common/utLogger.cpp52
-rw-r--r--test/unit/Common/utMaybe.cpp2
-rw-r--r--test/unit/Common/utMesh.cpp2
-rw-r--r--test/unit/Common/utParsingUtils.cpp66
-rw-r--r--test/unit/Common/utSpatialSort.cpp2
-rw-r--r--test/unit/Common/utStandardShapes.cpp2
-rw-r--r--test/unit/Common/utXmlParser.cpp2
-rw-r--r--test/unit/Geometry/utGeometryUtils.cpp2
-rw-r--r--test/unit/ImportExport/MDL/MDLHL1TestFiles.h2
-rw-r--r--test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp2
-rw-r--r--test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp2
-rw-r--r--test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp2
-rw-r--r--test/unit/ImportExport/RAW/utRAWImportExport.cpp2
-rw-r--r--test/unit/ImportExport/Terragen/utTerragenImportExport.cpp2
-rw-r--r--test/unit/ImportExport/utAssjsonImportExport.cpp17
-rw-r--r--test/unit/ImportExport/utCOBImportExport.cpp6
-rw-r--r--test/unit/ImportExport/utExporter.cpp2
-rw-r--r--test/unit/ImportExport/utMD2Importer.cpp2
-rw-r--r--test/unit/ImportExport/utMD5Importer.cpp2
-rw-r--r--test/unit/ImportExport/utMDLImporter.cpp2
-rw-r--r--test/unit/ImportExport/utNFFImportExport.cpp4
-rw-r--r--test/unit/ImportExport/utOFFImportExport.cpp2
-rw-r--r--test/unit/ImportExport/utOgreImportExport.cpp2
-rw-r--r--test/unit/ImportExport/utQ3BSPFileImportExport.cpp2
-rw-r--r--test/unit/ImportExport/utXGLImportExport.cpp2
-rw-r--r--test/unit/Main.cpp7
-rw-r--r--test/unit/MathTest.cpp2
-rw-r--r--test/unit/MathTest.h2
-rw-r--r--test/unit/RandomNumberGeneration.h2
-rw-r--r--test/unit/SceneDiffer.cpp2
-rw-r--r--test/unit/SceneDiffer.h2
-rw-r--r--test/unit/TestIOSystem.h3
-rw-r--r--test/unit/TestModelFactory.h18
-rw-r--r--test/unit/UTLogStream.h3
-rw-r--r--test/unit/ut3DImportExport.cpp2
-rw-r--r--test/unit/ut3DSImportExport.cpp2
-rw-r--r--test/unit/utACImportExport.cpp2
-rw-r--r--test/unit/utAMFImportExport.cpp2
-rw-r--r--test/unit/utASEImportExport.cpp2
-rw-r--r--test/unit/utAnim.cpp2
-rw-r--r--test/unit/utArmaturePopulate.cpp2
-rw-r--r--test/unit/utAssbinImportExport.cpp2
-rw-r--r--test/unit/utB3DImportExport.cpp2
-rw-r--r--test/unit/utBVHImportExport.cpp2
-rw-r--r--test/unit/utBatchLoader.cpp2
-rw-r--r--test/unit/utBlendImportAreaLight.cpp2
-rw-r--r--test/unit/utBlendImportMaterials.cpp2
-rw-r--r--test/unit/utBlenderImportExport.cpp2
-rw-r--r--test/unit/utBlenderIntermediate.cpp2
-rw-r--r--test/unit/utBlenderWork.cpp2
-rw-r--r--test/unit/utCSMImportExport.cpp2
-rw-r--r--test/unit/utColladaExport.cpp10
-rw-r--r--test/unit/utColladaImportExport.cpp2
-rw-r--r--test/unit/utD3MFImportExport.cpp2
-rw-r--r--test/unit/utDXFImporterExporter.cpp2
-rw-r--r--test/unit/utDefaultIOStream.cpp2
-rw-r--r--test/unit/utExport.cpp2
-rw-r--r--test/unit/utFBXImporterExporter.cpp33
-rw-r--r--test/unit/utFastAtof.cpp5
-rw-r--r--test/unit/utFindDegenerates.cpp2
-rw-r--r--test/unit/utFindInvalidData.cpp2
-rw-r--r--test/unit/utFixInfacingNormals.cpp2
-rw-r--r--test/unit/utGenBoundingBoxesProcess.cpp2
-rw-r--r--test/unit/utGenNormals.cpp2
-rw-r--r--test/unit/utHMPImportExport.cpp2
-rw-r--r--test/unit/utIFCImportExport.cpp2
-rw-r--r--test/unit/utIOStreamBuffer.cpp2
-rw-r--r--test/unit/utIOSystem.cpp2
-rw-r--r--test/unit/utImporter.cpp4
-rw-r--r--test/unit/utImproveCacheLocality.cpp2
-rw-r--r--test/unit/utIssues.cpp12
-rw-r--r--test/unit/utJoinVertices.cpp2
-rw-r--r--test/unit/utLWOImportExport.cpp2
-rw-r--r--test/unit/utLWSImportExport.cpp2
-rw-r--r--test/unit/utLimitBoneWeights.cpp2
-rw-r--r--test/unit/utMDCImportExport.cpp2
-rw-r--r--test/unit/utMaterialSystem.cpp10
-rw-r--r--test/unit/utMatrix3x3.cpp2
-rw-r--r--test/unit/utMatrix4x4.cpp2
-rw-r--r--test/unit/utMetadata.cpp4
-rw-r--r--test/unit/utObjImportExport.cpp16
-rw-r--r--test/unit/utObjTools.cpp2
-rw-r--r--test/unit/utOpenGEXImportExport.cpp2
-rw-r--r--test/unit/utPLYImportExport.cpp89
-rw-r--r--test/unit/utPMXImporter.cpp2
-rw-r--r--test/unit/utPretransformVertices.cpp2
-rw-r--r--test/unit/utProfiler.cpp2
-rw-r--r--test/unit/utQ3DImportExport.cpp2
-rw-r--r--test/unit/utRemoveComments.cpp2
-rw-r--r--test/unit/utRemoveComponent.cpp2
-rw-r--r--test/unit/utRemoveRedundantMaterials.cpp2
-rw-r--r--test/unit/utRemoveVCProcess.cpp2
-rw-r--r--test/unit/utSIBImporter.cpp2
-rw-r--r--test/unit/utSMDImportExport.cpp2
-rw-r--r--test/unit/utSTLImportExport.cpp16
-rw-r--r--test/unit/utScaleProcess.cpp2
-rw-r--r--test/unit/utSceneCombiner.cpp2
-rw-r--r--test/unit/utScenePreprocessor.cpp2
-rw-r--r--test/unit/utSharedPPData.cpp2
-rw-r--r--test/unit/utSimd.cpp2
-rw-r--r--test/unit/utSortByPType.cpp9
-rw-r--r--test/unit/utSplitLargeMeshes.cpp2
-rw-r--r--test/unit/utStringUtils.cpp2
-rw-r--r--test/unit/utTargetAnimation.cpp2
-rw-r--r--test/unit/utTextureTransform.cpp2
-rw-r--r--test/unit/utTriangulate.cpp2
-rw-r--r--test/unit/utTypes.cpp5
-rw-r--r--test/unit/utUSDImport.cpp54
-rw-r--r--test/unit/utVector3.cpp2
-rw-r--r--test/unit/utVersion.cpp10
-rw-r--r--test/unit/utVertexTriangleAdjacency.cpp2
-rw-r--r--test/unit/utX3DImportExport.cpp24
-rw-r--r--test/unit/utXImporterExporter.cpp2
-rw-r--r--test/unit/utglTF2ImportExport.cpp49
-rw-r--r--test/unit/utglTFImportExport.cpp2
239 files changed, 3707 insertions, 200 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 7b7fd850a..392951b29 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,6 +1,6 @@
# Open Asset Import Library (assimp)
# ----------------------------------------------------------------------
-# Copyright (c) 2006-2024, assimp team
+# Copyright (c) 2006-2025, assimp team
#
# All rights reserved.
#
@@ -86,6 +86,7 @@ SET( COMMON
unit/TestModelFactory.h
unit/utTypes.cpp
unit/utVersion.cpp
+ unit/Common/utParsingUtils.cpp
unit/utProfiler.cpp
unit/utSharedPPData.cpp
unit/utStringUtils.cpp
@@ -100,6 +101,7 @@ SET( COMMON
unit/Common/utBase64.cpp
unit/Common/utHash.cpp
unit/Common/utBaseProcess.cpp
+ unit/Common/utLogger.cpp
)
SET(Geometry
@@ -148,7 +150,6 @@ SET( IMPORTERS
#unit/utM3DImportExport.cpp
unit/utMDCImportExport.cpp
unit/utAssbinImportExport.cpp
- unit/utUSDImport.cpp
unit/ImportExport/utAssjsonImportExport.cpp
unit/ImportExport/utCOBImportExport.cpp
unit/ImportExport/utOgreImportExport.cpp
@@ -169,6 +170,12 @@ SET( IMPORTERS
unit/ImportExport/Pbrt/utPbrtImportExport.cpp
)
+if(ASSIMP_BUILD_USD_IMPORTER)
+ list( APPEND IMPORTERS
+ unit/utUSDImport.cpp
+ )
+endif()
+
SET( MATERIAL
unit/utMaterialSystem.cpp
)
diff --git a/test/models/AC/ref/README.md b/test/models/AC/ref/README.md
new file mode 100644
index 000000000..0034c2600
--- /dev/null
+++ b/test/models/AC/ref/README.md
@@ -0,0 +1,6 @@
+# AC 3D model reference images
+
+## sample_subdiv.ac
+Note that there appear to be some small holes in the surface in a few places
+
+<img alt="sample_subdiv.ac (as solid)" src="screenshots/sample_subdiv_ac_solid.png" width=180 />
diff --git a/test/models/AC/ref/screenshots/sample_subdiv_ac_solid.png b/test/models/AC/ref/screenshots/sample_subdiv_ac_solid.png
new file mode 100644
index 000000000..61a14edac
--- /dev/null
+++ b/test/models/AC/ref/screenshots/sample_subdiv_ac_solid.png
Binary files differ
diff --git a/test/models/ASE/ref/README.md b/test/models/ASE/ref/README.md
new file mode 100644
index 000000000..2f6d7aa5f
--- /dev/null
+++ b/test/models/ASE/ref/README.md
@@ -0,0 +1,18 @@
+# ASE 3D model reference images
+
+## MotionCaptureROM.ase
+
+### Model is pure node animation of separate rigid meshes, no bones/mesh deformation
+Note: this model has no bones/skeleton; the body is formed of separate rigid meshes
+for each segment (e.g. upper arm, lower arm, upper leg, lower leg are all separate meshses)
+and animation is entirely driven by changing node transformations over the animation timeline,
+rather than deforming vertices via bones and associated weights.
+
+### Artifacts
+Animation has known artifacts, as stated in [MotionCaptureROM.source.txt](../MotionCaptureROM.source.txt):
+```
+NOTE: The errors in the middle of the animation are caused by problems during recording,
+it's not an importer issue.
+```
+
+<img alt="MotionCaptureROM.ase" src="screenshots/MotionCaptureROM_ase.gif" width=320 />
diff --git a/test/models/ASE/ref/screenshots/MotionCaptureROM_ase.gif b/test/models/ASE/ref/screenshots/MotionCaptureROM_ase.gif
new file mode 100644
index 000000000..a4978b11b
--- /dev/null
+++ b/test/models/ASE/ref/screenshots/MotionCaptureROM_ase.gif
Binary files differ
diff --git a/test/models/BVH/ref/README.md b/test/models/BVH/ref/README.md
new file mode 100644
index 000000000..57d4496b9
--- /dev/null
+++ b/test/models/BVH/ref/README.md
@@ -0,0 +1,16 @@
+# BVH 3D model reference images
+
+## 01_01.bvh
+Three hops forward, turn around, three hops back, turn around, three hops forward
+
+<img alt="01_01.bvh" src="screenshots/01_01_bvh.gif" width=180 />
+
+## 01_03.bvh
+Climb step ladder, hang on bar, climb step ladder, hang on bar
+
+<img alt="01_03.bvh" src="screenshots/01_03_bvh.gif" width=320 />
+
+## Boxing_Toes.bvh
+Boxer warming up, throwing punches, getting hit, going to canvas
+
+<img alt="Boxing_Toes.bvh" src="screenshots/Boxing_Toes_bvh.gif" width=180 />
diff --git a/test/models/BVH/ref/screenshots/01_01_bvh.gif b/test/models/BVH/ref/screenshots/01_01_bvh.gif
new file mode 100644
index 000000000..604be85b1
--- /dev/null
+++ b/test/models/BVH/ref/screenshots/01_01_bvh.gif
Binary files differ
diff --git a/test/models/BVH/ref/screenshots/01_03_bvh.gif b/test/models/BVH/ref/screenshots/01_03_bvh.gif
new file mode 100644
index 000000000..88c0a4408
--- /dev/null
+++ b/test/models/BVH/ref/screenshots/01_03_bvh.gif
Binary files differ
diff --git a/test/models/BVH/ref/screenshots/Boxing_Toes_bvh.gif b/test/models/BVH/ref/screenshots/Boxing_Toes_bvh.gif
new file mode 100644
index 000000000..faba5edc5
--- /dev/null
+++ b/test/models/BVH/ref/screenshots/Boxing_Toes_bvh.gif
Binary files differ
diff --git a/test/models/COB/molecule_ascii.cob b/test/models/COB/molecule_ascii.cob
index 9185e741e..f4f4c783d 100644
--- a/test/models/COB/molecule_ascii.cob
+++ b/test/models/COB/molecule_ascii.cob
@@ -1170,7 +1170,7 @@ Object Mode Off 0
Mat1 V0.08 Id 497131204 Parent 58548212 Size 00000083
mat# 0
shader: phong facet: auto40
-rgb 1,1,1
+rgb 1.0,1.0,1.0
alpha 1 ka 0 ks 0.1 exp 0 ior 1
ShBx V0.04 Id 497131205 Parent 497131204 Size 00000605
Shader class: color
@@ -1758,7 +1758,7 @@ Object Mode Off 0
Mat1 V0.08 Id 497168220 Parent 57850740 Size 00000083
mat# 0
shader: phong facet: auto40
-rgb 1,1,1
+rgb 1.0,1.0,1.0
alpha 1 ka 0 ks 0.1 exp 0 ior 1
ShBx V0.04 Id 497168221 Parent 497168220 Size 00000605
Shader class: color
@@ -2346,7 +2346,7 @@ Object Mode Off 0
Mat1 V0.08 Id 497153380 Parent 497235148 Size 00000083
mat# 0
shader: phong facet: auto40
-rgb 1,1,1
+rgb 1.0,1.0,1.0
alpha 1 ka 0 ks 0.1 exp 0 ior 1
ShBx V0.04 Id 497153381 Parent 497153380 Size 00000605
Shader class: color
diff --git a/test/models/COB/ref/README.md b/test/models/COB/ref/README.md
new file mode 100644
index 000000000..3fc4b137b
--- /dev/null
+++ b/test/models/COB/ref/README.md
@@ -0,0 +1,4 @@
+# COB 3D model reference images
+
+## molecule_ascii.cob
+<img alt="molecule_ascii.cob" src="screenshots/molecule_ascii_cob.png" width=180 />
diff --git a/test/models/COB/ref/screenshots/molecule_ascii_cob.png b/test/models/COB/ref/screenshots/molecule_ascii_cob.png
new file mode 100644
index 000000000..2852c5f28
--- /dev/null
+++ b/test/models/COB/ref/screenshots/molecule_ascii_cob.png
Binary files differ
diff --git a/test/models/CSM/ref/README.md b/test/models/CSM/ref/README.md
new file mode 100644
index 000000000..5b757f49f
--- /dev/null
+++ b/test/models/CSM/ref/README.md
@@ -0,0 +1,4 @@
+# CSM 3D model reference images
+
+## ThomasFechten.csm
+<img alt="ThomasFechten.csm" src="screenshots/ThomasFechten_csm.gif" width=180 />
diff --git a/test/models/CSM/ref/screenshots/ThomasFechten_csm.gif b/test/models/CSM/ref/screenshots/ThomasFechten_csm.gif
new file mode 100644
index 000000000..365aea2f8
--- /dev/null
+++ b/test/models/CSM/ref/screenshots/ThomasFechten_csm.gif
Binary files differ
diff --git a/test/models/Collada/ref/README.md b/test/models/Collada/ref/README.md
new file mode 100644
index 000000000..92f74960a
--- /dev/null
+++ b/test/models/Collada/ref/README.md
@@ -0,0 +1,6 @@
+# Collada 3D model reference images
+
+## human.zae
+Compressed Collada file (.zae)
+
+<img alt="human.zae" src="screenshots/human_zae.png" width=180 />
diff --git a/test/models/Collada/ref/screenshots/human_zae.png b/test/models/Collada/ref/screenshots/human_zae.png
new file mode 100644
index 000000000..8d7945c3a
--- /dev/null
+++ b/test/models/Collada/ref/screenshots/human_zae.png
Binary files differ
diff --git a/test/models/HMP/ref/README.md b/test/models/HMP/ref/README.md
new file mode 100644
index 000000000..aa5ccf1d5
--- /dev/null
+++ b/test/models/HMP/ref/README.md
@@ -0,0 +1,4 @@
+# HMP 3D model reference images
+
+## terrain.hmp
+<img alt="terrain.hmp" src="screenshots/terrain_hmp.png" width=180 />
diff --git a/test/models/HMP/ref/screenshots/terrain_hmp.png b/test/models/HMP/ref/screenshots/terrain_hmp.png
new file mode 100644
index 000000000..d7c8dcb0c
--- /dev/null
+++ b/test/models/HMP/ref/screenshots/terrain_hmp.png
Binary files differ
diff --git a/test/models/IQM/ref/README.md b/test/models/IQM/ref/README.md
new file mode 100644
index 000000000..78986b04d
--- /dev/null
+++ b/test/models/IQM/ref/README.md
@@ -0,0 +1,4 @@
+# IQM 3D model reference images
+
+## mrfixit.iqm
+<img alt="mrfixit.iqm" src="screenshots/mrfixit_iqm.png" width=180 />
diff --git a/test/models/IQM/ref/screenshots/mrfixit_iqm.png b/test/models/IQM/ref/screenshots/mrfixit_iqm.png
new file mode 100644
index 000000000..cb57f1694
--- /dev/null
+++ b/test/models/IQM/ref/screenshots/mrfixit_iqm.png
Binary files differ
diff --git a/test/models/IRR/ref/README.md b/test/models/IRR/ref/README.md
new file mode 100644
index 000000000..b4860303e
--- /dev/null
+++ b/test/models/IRR/ref/README.md
@@ -0,0 +1,14 @@
+# IRR 3D model reference images
+
+## scenegraphAnimMod_UTF16LE.irr
+
+### Animation "AnimationSet0"
+Dwarf animated; primitive objects not animated
+
+<img alt="scenegraphAnimMod_UTF16LE.irr" src="screenshots/scenegraphAnimMod_UTF16LE_irr.gif" width=320 />
+<img alt="scenegraphAnimMod_UTF16LE.irr" src="screenshots/scenegraphAnimMod_UTF16LE_irr_anim_AnimationSet0.gif" width=180 />
+
+### Animation "Irr_GlobalAnimChannel"
+Primitive objects animate; dwarf not animated (Animation playback sped up significantly)
+
+<img alt="scenegraphAnimMod_UTF16LE.irr" src="screenshots/scenegraphAnimMod_UTF16LE_irr_anim_Irr_GlobalAnimChannel.gif" width=180 />
diff --git a/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr.gif b/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr.gif
new file mode 100644
index 000000000..778d7f1bf
--- /dev/null
+++ b/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr.gif
Binary files differ
diff --git a/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_AnimationSet0.gif b/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_AnimationSet0.gif
new file mode 100644
index 000000000..4db9e7042
--- /dev/null
+++ b/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_AnimationSet0.gif
Binary files differ
diff --git a/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_Irr_GlobalAnimChannel.gif b/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_Irr_GlobalAnimChannel.gif
new file mode 100644
index 000000000..fea75b2ae
--- /dev/null
+++ b/test/models/IRR/ref/screenshots/scenegraphAnimMod_UTF16LE_irr_anim_Irr_GlobalAnimChannel.gif
Binary files differ
diff --git a/test/models/MD2/ref/README.md b/test/models/MD2/ref/README.md
new file mode 100644
index 000000000..7f4b49c43
--- /dev/null
+++ b/test/models/MD2/ref/README.md
@@ -0,0 +1,7 @@
+# MD2 3D model reference images
+
+## faerie.md2
+<img alt="faerie.md2" src="screenshots/faerie_md2.png" width=180 />
+
+## sydney.md2
+<img alt="sydney.md2" src="screenshots/sydney_md2.png" width=180 />
diff --git a/test/models/MD2/ref/screenshots/faerie_md2.png b/test/models/MD2/ref/screenshots/faerie_md2.png
new file mode 100644
index 000000000..e2385ccea
--- /dev/null
+++ b/test/models/MD2/ref/screenshots/faerie_md2.png
Binary files differ
diff --git a/test/models/MD2/ref/screenshots/sydney_md2.png b/test/models/MD2/ref/screenshots/sydney_md2.png
new file mode 100644
index 000000000..b8616a8f6
--- /dev/null
+++ b/test/models/MD2/ref/screenshots/sydney_md2.png
Binary files differ
diff --git a/test/models/NFF/NFF/ManyEarthsNotJustOne.nff b/test/models/NFF/ManyEarthsNotJustOne.nff
index 1f41dc198..1f41dc198 100644
--- a/test/models/NFF/NFF/ManyEarthsNotJustOne.nff
+++ b/test/models/NFF/ManyEarthsNotJustOne.nff
diff --git a/test/models/NFF/NFF/WithCamera.nff b/test/models/NFF/WithCamera.nff
index 765dddc27..765dddc27 100644
--- a/test/models/NFF/NFF/WithCamera.nff
+++ b/test/models/NFF/WithCamera.nff
diff --git a/test/models/NFF/NFF/cone.nff b/test/models/NFF/cone.nff
index 20d02b259..f6f063ae4 100644
--- a/test/models/NFF/NFF/cone.nff
+++ b/test/models/NFF/cone.nff
@@ -1,6 +1,6 @@
#red
-f 1.0 0.0 0.0 0.5 45.2776 0 1 cantfindme.png
+f 1.0 0.0 0.0 0.5 0.5 45.2776 0 1 cantfindme.png
tess 4
diff --git a/test/models/NFF/NFF/cylinder.nff b/test/models/NFF/cylinder.nff
index 85a8ce79c..85a8ce79c 100644
--- a/test/models/NFF/NFF/cylinder.nff
+++ b/test/models/NFF/cylinder.nff
diff --git a/test/models/NFF/NFF/dodecahedron.nff b/test/models/NFF/dodecahedron.nff
index 6ab505178..6ab505178 100644
--- a/test/models/NFF/NFF/dodecahedron.nff
+++ b/test/models/NFF/dodecahedron.nff
diff --git a/test/models/NFF/NFF/earthCylindric.jpg b/test/models/NFF/earthCylindric.jpg
index da9688b44..da9688b44 100644
--- a/test/models/NFF/NFF/earthCylindric.jpg
+++ b/test/models/NFF/earthCylindric.jpg
Binary files differ
diff --git a/test/models/NFF/NFF/earthSpherical.jpg b/test/models/NFF/earthSpherical.jpg
index 3419e8071..3419e8071 100644
--- a/test/models/NFF/NFF/earthSpherical.jpg
+++ b/test/models/NFF/earthSpherical.jpg
Binary files differ
diff --git a/test/models/NFF/NFF/hexahedron.nff b/test/models/NFF/hexahedron.nff
index afa62deb4..afa62deb4 100644
--- a/test/models/NFF/NFF/hexahedron.nff
+++ b/test/models/NFF/hexahedron.nff
diff --git a/test/models/NFF/NFF/octahedron.nff b/test/models/NFF/octahedron.nff
index eac88e7ad..eac88e7ad 100644
--- a/test/models/NFF/NFF/octahedron.nff
+++ b/test/models/NFF/octahedron.nff
diff --git a/test/models/NFF/NFF/positionTest.nff b/test/models/NFF/positionTest.nff
index d0715a00a..d0715a00a 100644
--- a/test/models/NFF/NFF/positionTest.nff
+++ b/test/models/NFF/positionTest.nff
diff --git a/test/models/NFF/ref/README.md b/test/models/NFF/ref/README.md
new file mode 100644
index 000000000..ae107c4c4
--- /dev/null
+++ b/test/models/NFF/ref/README.md
@@ -0,0 +1,4 @@
+# NFF 3D model reference images
+
+## cone.nff
+<img alt="cone.nff" src="screenshots/cone_nff.png" width=180 />
diff --git a/test/models/NFF/ref/screenshots/cone_nff.png b/test/models/NFF/ref/screenshots/cone_nff.png
new file mode 100644
index 000000000..f5aff6745
--- /dev/null
+++ b/test/models/NFF/ref/screenshots/cone_nff.png
Binary files differ
diff --git a/test/models/NFF/NFF/spheres.nff b/test/models/NFF/spheres.nff
index 80972cb43..80972cb43 100644
--- a/test/models/NFF/NFF/spheres.nff
+++ b/test/models/NFF/spheres.nff
diff --git a/test/models/NFF/NFF/tetrahedron.nff b/test/models/NFF/tetrahedron.nff
index 78c3bdf79..78c3bdf79 100644
--- a/test/models/NFF/NFF/tetrahedron.nff
+++ b/test/models/NFF/tetrahedron.nff
diff --git a/test/models/OBJ/folder/mtl_different_folder.mtl b/test/models/OBJ/folder/mtl_different_folder.mtl
new file mode 100644
index 000000000..9fbaa3d78
--- /dev/null
+++ b/test/models/OBJ/folder/mtl_different_folder.mtl
@@ -0,0 +1,13 @@
+
+# Example for github issue #2355: {OBJ} mtllib with a path == can't find texture file
+
+newmtl Whatever
+Ka 0 0 0
+Kd 0.141176 0.184314 0.411765
+Ks 0 0 0
+Ni 1
+Ns 400
+Tf 1 1 1
+d 1
+map_Kd image.jpg
+
diff --git a/test/models/OBJ/mtl_different_folder.obj b/test/models/OBJ/mtl_different_folder.obj
new file mode 100644
index 000000000..afffa41b0
--- /dev/null
+++ b/test/models/OBJ/mtl_different_folder.obj
@@ -0,0 +1,31 @@
+# Vertices: 8
+# Points: 0
+# Lines: 0
+# Faces: 6
+# Materials: 1
+
+o 1
+mtllib folder/mtl_different_folder.mtl
+
+# Vertex list
+
+v -0.5 -0.5 0.5
+v -0.5 -0.5 -0.5
+v -0.5 0.5 -0.5
+v -0.5 0.5 0.5
+v 0.5 -0.5 0.5
+v 0.5 -0.5 -0.5
+v 0.5 0.5 -0.5
+v 0.5 0.5 0.5
+
+# Point/Line/Face list
+
+usemtl Whatever
+f 4 3 2 1
+f 2 6 5 1
+f 3 7 6 2
+f 8 7 3 4
+f 5 8 4 1
+f 6 7 8 5
+
+# End of file
diff --git a/test/models/OpenGEX/texture/Concrete.tga b/test/models/OpenGEX/texture/Concrete.tga
new file mode 100644
index 000000000..99df7364f
--- /dev/null
+++ b/test/models/OpenGEX/texture/Concrete.tga
Binary files differ
diff --git a/test/models/PLY/cube_binary_starts_with_nl.ply b/test/models/PLY/cube_binary_starts_with_nl.ply
new file mode 100644
index 000000000..0eed84a5c
--- /dev/null
+++ b/test/models/PLY/cube_binary_starts_with_nl.ply
Binary files differ
diff --git a/test/models/TER/ref/README.md b/test/models/TER/ref/README.md
new file mode 100644
index 000000000..e1994ebd6
--- /dev/null
+++ b/test/models/TER/ref/README.md
@@ -0,0 +1,7 @@
+# TER 3D model reference images
+
+## RealisticTerrain.ter
+<img alt="RealisticTerrain.ter" src="screenshots/RealisticTerrain_ter.png" width=180 />
+
+## RealisticTerrain_Large.ter
+<img alt="RealisticTerrain_Large.ter" src="screenshots/RealisticTerrain_Large_ter.png" width=180 />
diff --git a/test/models/TER/ref/screenshots/RealisticTerrain_Large_ter.png b/test/models/TER/ref/screenshots/RealisticTerrain_Large_ter.png
new file mode 100644
index 000000000..e5c6ff5c2
--- /dev/null
+++ b/test/models/TER/ref/screenshots/RealisticTerrain_Large_ter.png
Binary files differ
diff --git a/test/models/TER/ref/screenshots/RealisticTerrain_ter.png b/test/models/TER/ref/screenshots/RealisticTerrain_ter.png
new file mode 100644
index 000000000..b39185275
--- /dev/null
+++ b/test/models/TER/ref/screenshots/RealisticTerrain_ter.png
Binary files differ
diff --git a/test/models/USD/MotionCaptureROM.usdc b/test/models/USD/MotionCaptureROM.usdc
new file mode 100644
index 000000000..01598ca0d
--- /dev/null
+++ b/test/models/USD/MotionCaptureROM.usdc
Binary files differ
diff --git a/test/models/USD/README.md b/test/models/USD/README.md
new file mode 100644
index 000000000..500a0cad1
--- /dev/null
+++ b/test/models/USD/README.md
@@ -0,0 +1,8 @@
+# USD model files
+
+## MotionCaptureROM.usdc
+Converted bundled .wrl test model:
+ https://github.com/assimp/assimp/blob/master/test/models/WRL/MotionCaptureROM.WRL
+to .usdc format via website:
+ https://imagetostl.com/convert/file/wrl/to/usd#convert
+(As of Oct 2024, animations have not been verified as present or correct)
diff --git a/test/models/USD/ref/README.md b/test/models/USD/ref/README.md
new file mode 100644
index 000000000..0da8dfa1c
--- /dev/null
+++ b/test/models/USD/ref/README.md
@@ -0,0 +1,4 @@
+# USD 3D model reference images
+
+## MotionCaptureROM.usdc
+<img alt="MotionCaptureROM.usdc" src="screenshots/MotionCaptureROM_usdc.png" width=180 />
diff --git a/test/models/USD/ref/screenshots/MotionCaptureROM_usdc.png b/test/models/USD/ref/screenshots/MotionCaptureROM_usdc.png
new file mode 100644
index 000000000..d924ccaa6
--- /dev/null
+++ b/test/models/USD/ref/screenshots/MotionCaptureROM_usdc.png
Binary files differ
diff --git a/test/models/WRL/HelloWorld.wrl b/test/models/WRL/HelloWorld.wrl
new file mode 100644
index 000000000..e6c71b6a5
--- /dev/null
+++ b/test/models/WRL/HelloWorld.wrl
@@ -0,0 +1,87 @@
+#VRML V2.0 utf8
+# X3D-to-VRML-97 XSL translation autogenerated by X3dToVrml97.xslt
+# https://www.web3d.org/x3d/content/X3dToVrml97.xslt
+# Generated using XSLT processor: Saxonica
+
+# [X3D] VRML V3.3 utf8
+# PROFILE Immersive
+# [X3D] version=3.3
+# [X3D] noNamespaceSchemaLocation=https://www.web3d.org/specifications/x3d-3.3.xsd
+# [head]
+
+# Alternate encodings: VRML97, X3D ClassicVRML Encoding, X3D Compressed Binary Encoding (CBE), X3DOM, JSON
+# META "title" "HelloWorld.x3d"
+# META "description" "Simple X3D model example: Hello World!"
+# META "created" "30 October 2000"
+# META "modified" "9 July 2023"
+# META "creator" "Don Brutzman"
+# META "Image" "HelloWorld.tall.png"
+# META "reference" "https://en.wikipedia.org/wiki/Hello_world"
+# META "reference" "https://en.wikipedia.org/wiki/Hello#.22Hello.2C_World.22_computer_program"
+# META "reference" "https://en.wikipedia.org/wiki/\"Hello,_World!\"_program"
+# META "reference" "https://en.wikibooks.org/w/index.php?title=Computer_Programming/Hello_world"
+# META "reference" "https://www.HelloWorldExample.net"
+# META "reference" "https://www.web3d.org"
+# META "reference" "https://www.web3d.org/realtime-3d/news/internationalization-x3d"
+# META "reference" "https://www.web3d.org/x3d/content/examples/HelloWorld.x3d"
+# META "reference" "https://www.web3d.org/x3d/content/examples/X3dForAdvancedModeling/HelloWorldScenes/HelloWorld.x3d"
+# META "identifier" "https://www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter01TechnicalOverview/HelloWorld.x3d"
+# META "license" "https://www.web3d.org/x3d/content/examples/license.html"
+# META "generator" "X3D-Edit 4.0, https://savage.nps.edu/X3D-Edit"
+# META "reference" "HelloWorld.wrl"
+# META "reference" "HelloWorld.x3dv"
+# META "reference" "HelloWorld.x3db"
+# META "reference" "HelloWorld.xhtml"
+# META "reference" "HelloWorld.json"
+
+# [Scene] ========== ========== ==========
+
+NavigationInfo { type [ "EXAMINE" "ANY" ] } ### Default X3D NavigationInfo
+
+# Example scene to illustrate X3D nodes and fields (XML elements and attributes)
+WorldInfo {
+ info [ "Example scene to illustrate a simple X3D model" ]
+ title "Hello World!"
+}
+Group {
+ children [
+ DEF ViewUpClose Viewpoint {
+ centerOfRotation 0 -1 0
+ description "Hello world!"
+ position 0 -1 7
+ }
+ Transform {
+ rotation 0 1 0 3
+ children [
+ Shape {
+ geometry Sphere {
+ }
+ appearance Appearance {
+ material DEF MaterialOffWhite Material {
+ diffuseColor 0.980392 0.976471 0.964706
+ }
+ texture DEF ImageCloudlessEarth ImageTexture {
+ url [ "earth-topo.png" "earth-topo.jpg" "earth-topo-small.gif" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo.png" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo.jpg" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo-small.gif" ]
+ }
+ }
+ }
+ ]
+ }
+ Transform {
+ translation 0 -2 0
+ children [
+ Shape {
+ geometry DEF TextMessage Text {
+ string [ "Hello" "world!" ]
+ fontStyle FontStyle {
+ justify [ "MIDDLE" "MIDDLE" ]
+ }
+ }
+ appearance Appearance {
+ material USE MaterialOffWhite
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/test/models/WRL/README.md b/test/models/WRL/README.md
new file mode 100644
index 000000000..744d2485e
--- /dev/null
+++ b/test/models/WRL/README.md
@@ -0,0 +1,6 @@
+# WRL models
+
+X3D is a modern superset of the old (VRML) WRL format
+
+# HelloWorld.wrl
+Downloaded from [HelloWorld.wrl](http://www.web3d.org/x3d/content/examples/HelloWorld.wrl)
diff --git a/test/models/WRL/earth-topo.png b/test/models/WRL/earth-topo.png
new file mode 100644
index 000000000..1749cb835
--- /dev/null
+++ b/test/models/WRL/earth-topo.png
Binary files differ
diff --git a/test/models/WRL/ref/README.md b/test/models/WRL/ref/README.md
new file mode 100644
index 000000000..ff0205010
--- /dev/null
+++ b/test/models/WRL/ref/README.md
@@ -0,0 +1,4 @@
+# WRL 3D model reference images
+
+## HelloWorld.wrl
+<img alt="HelloWorld.wrl" src="screenshots/HelloWorld_wrl.png" width=180 />
diff --git a/test/models/WRL/ref/screenshots/HelloWorld_wrl.png b/test/models/WRL/ref/screenshots/HelloWorld_wrl.png
new file mode 100644
index 000000000..54cfd704c
--- /dev/null
+++ b/test/models/WRL/ref/screenshots/HelloWorld_wrl.png
Binary files differ
diff --git a/test/models/X/ref/README.md b/test/models/X/ref/README.md
new file mode 100644
index 000000000..4a3944ab9
--- /dev/null
+++ b/test/models/X/ref/README.md
@@ -0,0 +1,7 @@
+# X 3D model reference images
+
+## BCN_Epileptic.X
+<img alt="BCN_Epileptic.X" src="screenshots/BCN_Epileptic_X.gif" width=180 />
+
+## Testwuson.X playing animation "Wuson_Run"
+<img alt="Testwuson.X" src="screenshots/Testwuson_X_anim_Wuson_Run.gif" width=180 />
diff --git a/test/models/X/ref/screenshots/BCN_Epileptic_X.gif b/test/models/X/ref/screenshots/BCN_Epileptic_X.gif
new file mode 100644
index 000000000..fb275c7c2
--- /dev/null
+++ b/test/models/X/ref/screenshots/BCN_Epileptic_X.gif
Binary files differ
diff --git a/test/models/X/ref/screenshots/Testwuson_X_anim_Wuson_Run.gif b/test/models/X/ref/screenshots/Testwuson_X_anim_Wuson_Run.gif
new file mode 100644
index 000000000..4f25c0bac
--- /dev/null
+++ b/test/models/X/ref/screenshots/Testwuson_X_anim_Wuson_Run.gif
Binary files differ
diff --git a/test/models/X3D/HelloWorld.x3d b/test/models/X3D/HelloWorld.x3d
new file mode 100644
index 000000000..030e2f36c
--- /dev/null
+++ b/test/models/X3D/HelloWorld.x3d
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.3//EN" "https://www.web3d.org/specifications/x3d-3.3.dtd">
+<X3D profile='Immersive' version='3.3' xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance' xsd:noNamespaceSchemaLocation='https://www.web3d.org/specifications/x3d-3.3.xsd'>
+ <head>
+ <!-- Alternate encodings: VRML97, X3D ClassicVRML Encoding, X3D Compressed Binary Encoding (CBE), X3DOM, JSON -->
+ <meta content='HelloWorld.x3d' name='title'/>
+ <meta content='Simple X3D model example: Hello World!' name='description'/>
+ <meta content='30 October 2000' name='created'/>
+ <meta content='9 July 2023' name='modified'/>
+ <meta content='Don Brutzman' name='creator'/>
+ <meta content='HelloWorld.tall.png' name='Image'/>
+ <meta content='https://en.wikipedia.org/wiki/Hello_world' name='reference'/>
+ <meta content='https://en.wikipedia.org/wiki/Hello#.22Hello.2C_World.22_computer_program' name='reference'/>
+ <meta content='https://en.wikipedia.org/wiki/"Hello,_World!"_program' name='reference'/>
+ <meta content='https://en.wikibooks.org/w/index.php?title=Computer_Programming/Hello_world' name='reference'/>
+ <meta content='https://www.HelloWorldExample.net' name='reference'/>
+ <meta content='https://www.web3d.org' name='reference'/>
+ <meta content='https://www.web3d.org/realtime-3d/news/internationalization-x3d' name='reference'/>
+ <meta content='https://www.web3d.org/x3d/content/examples/HelloWorld.x3d' name='reference'/>
+ <meta content='https://www.web3d.org/x3d/content/examples/X3dForAdvancedModeling/HelloWorldScenes/HelloWorld.x3d' name='reference'/>
+ <meta content='https://www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter01TechnicalOverview/HelloWorld.x3d' name='identifier'/>
+ <meta content='https://www.web3d.org/x3d/content/examples/license.html' name='license'/>
+ <meta content='X3D-Edit 4.0, https://savage.nps.edu/X3D-Edit' name='generator'/>
+ <meta content='HelloWorld.wrl' name='reference'/>
+ <meta content='HelloWorld.x3dv' name='reference'/>
+ <meta content='HelloWorld.x3db' name='reference'/>
+ <meta content='HelloWorld.xhtml' name='reference'/>
+ <meta content='HelloWorld.json' name='reference'/>
+ </head>
+ <Scene>
+ <!-- Example scene to illustrate X3D nodes and fields (XML elements and attributes) -->
+ <WorldInfo info='"Example scene to illustrate a simple X3D model"' title='Hello World!'/>
+ <Group>
+ <Viewpoint DEF='ViewUpClose' centerOfRotation='0 -1 0' description='Hello world!' position='0 -1 7'/>
+ <Transform rotation='0 1 0 3'>
+ <Shape>
+ <Sphere/>
+ <Appearance>
+ <!-- https://htmlcolorcodes.com/colors/off-white -->
+ <Material DEF='MaterialOffWhite' diffuseColor='0.980392 0.976471 0.964706'/>
+ <ImageTexture DEF='ImageCloudlessEarth' url='"earth-topo.png" "earth-topo.jpg" "earth-topo-small.gif" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo.png" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo.jpg" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo-small.gif"'/>
+ </Appearance>
+ </Shape>
+ </Transform>
+ <Transform translation='0 -2 0'>
+ <Shape>
+ <Text DEF='TextMessage' string='"Hello" "world!"'>
+ <FontStyle justify='"MIDDLE" "MIDDLE"'/>
+ </Text>
+ <Appearance>
+ <Material USE='MaterialOffWhite'/>
+ </Appearance>
+ </Shape>
+ </Transform>
+ </Group>
+ </Scene>
+</X3D> \ No newline at end of file
diff --git a/test/models/X3D/README.md b/test/models/X3D/README.md
new file mode 100644
index 000000000..dd843871e
--- /dev/null
+++ b/test/models/X3D/README.md
@@ -0,0 +1,4 @@
+# X3D models
+
+# HelloWorld.x3d
+Downloaded from [HelloWorld.x3d](http://www.web3d.org/x3d/content/examples/HelloWorld.x3d)
diff --git a/test/models/X3D/earth-topo.png b/test/models/X3D/earth-topo.png
new file mode 100644
index 000000000..1749cb835
--- /dev/null
+++ b/test/models/X3D/earth-topo.png
Binary files differ
diff --git a/test/models/X3D/ref/README.md b/test/models/X3D/ref/README.md
new file mode 100644
index 000000000..dc80e3064
--- /dev/null
+++ b/test/models/X3D/ref/README.md
@@ -0,0 +1,17 @@
+# X3D 3D model reference images
+
+## ComputerKeyboard.x3d
+
+### Working (using IRR xml parser)
+ComputerKeyboard as of 29 Sep 2020 git commit `6a4c338`, using IRR xml parsing, renders OK:
+
+<img alt="ComputerKeyboard.x3d (IRR xml)" src="screenshots/ComputerKeyboard_x3d_irr_xml.png" width=320 />
+
+### Broken (using pugi xml parser)
+ComputerKeyboard as of 1 Dec 2021 git commit `1614934`, using pugi xml parsing, renders with
+missing meshes and obvious artifacts:
+
+<img alt="ComputerKeyboard.x3d (pugi xml)" src="screenshots/ComputerKeyboard_x3d_pugi_xml.png" width=320 />
+
+## HelloWorld.x3d
+<img alt="HelloWorld.x3d" src="screenshots/HelloWorld_x3d.png" width=180 />
diff --git a/test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_irr_xml.png b/test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_irr_xml.png
new file mode 100644
index 000000000..787e8e7f6
--- /dev/null
+++ b/test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_irr_xml.png
Binary files differ
diff --git a/test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_pugi_xml.png b/test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_pugi_xml.png
new file mode 100644
index 000000000..aaa45fb6d
--- /dev/null
+++ b/test/models/X3D/ref/screenshots/ComputerKeyboard_x3d_pugi_xml.png
Binary files differ
diff --git a/test/models/X3D/ref/screenshots/HelloWorld_x3d.png b/test/models/X3D/ref/screenshots/HelloWorld_x3d.png
new file mode 100644
index 000000000..581a2988d
--- /dev/null
+++ b/test/models/X3D/ref/screenshots/HelloWorld_x3d.png
Binary files differ
diff --git a/test/models/X3DB/HelloWorld.x3db b/test/models/X3DB/HelloWorld.x3db
new file mode 100644
index 000000000..ba2f5c67c
--- /dev/null
+++ b/test/models/X3DB/HelloWorld.x3db
Binary files differ
diff --git a/test/models/X3DB/README.md b/test/models/X3DB/README.md
new file mode 100644
index 000000000..9e83c8dd0
--- /dev/null
+++ b/test/models/X3DB/README.md
@@ -0,0 +1,6 @@
+# X3DB models
+
+X3DB models are compressed X3D models
+
+# HelloWorld.x3db
+Downloaded from [HelloWorld.x3db](http://www.web3d.org/x3d/content/examples/HelloWorld.x3db)
diff --git a/test/models/X3DB/earth-topo.png b/test/models/X3DB/earth-topo.png
new file mode 100644
index 000000000..1749cb835
--- /dev/null
+++ b/test/models/X3DB/earth-topo.png
Binary files differ
diff --git a/test/models/X3DV/HelloWorld.x3dv b/test/models/X3DV/HelloWorld.x3dv
new file mode 100644
index 000000000..1da5c4fb5
--- /dev/null
+++ b/test/models/X3DV/HelloWorld.x3dv
@@ -0,0 +1,86 @@
+#X3D V3.3 utf8
+# X3D-to-ClassicVRML XSL translation autogenerated by X3dToVrml97.xslt
+# https://www.web3d.org/x3d/content/X3dToVrml97.xslt
+# Generated using XSLT processor: Saxonica
+
+PROFILE Immersive
+# [X3D] version=3.3
+# [X3D] noNamespaceSchemaLocation=https://www.web3d.org/specifications/x3d-3.3.xsd
+# [head]
+
+# Alternate encodings: VRML97, X3D ClassicVRML Encoding, X3D Compressed Binary Encoding (CBE), X3DOM, JSON
+META "title" "HelloWorld.x3d"
+META "description" "Simple X3D model example: Hello World!"
+META "created" "30 October 2000"
+META "modified" "9 July 2023"
+META "creator" "Don Brutzman"
+META "Image" "HelloWorld.tall.png"
+META "reference" "https://en.wikipedia.org/wiki/Hello_world"
+META "reference" "https://en.wikipedia.org/wiki/Hello#.22Hello.2C_World.22_computer_program"
+META "reference" "https://en.wikipedia.org/wiki/\"Hello,_World!\"_program"
+META "reference" "https://en.wikibooks.org/w/index.php?title=Computer_Programming/Hello_world"
+META "reference" "https://www.HelloWorldExample.net"
+META "reference" "https://www.web3d.org"
+META "reference" "https://www.web3d.org/realtime-3d/news/internationalization-x3d"
+META "reference" "https://www.web3d.org/x3d/content/examples/HelloWorld.x3d"
+META "reference" "https://www.web3d.org/x3d/content/examples/X3dForAdvancedModeling/HelloWorldScenes/HelloWorld.x3d"
+META "identifier" "https://www.web3d.org/x3d/content/examples/X3dForWebAuthors/Chapter01TechnicalOverview/HelloWorld.x3d"
+META "license" "https://www.web3d.org/x3d/content/examples/license.html"
+META "generator" "X3D-Edit 4.0, https://savage.nps.edu/X3D-Edit"
+META "reference" "HelloWorld.wrl"
+META "reference" "HelloWorld.x3dv"
+META "reference" "HelloWorld.x3db"
+META "reference" "HelloWorld.xhtml"
+META "reference" "HelloWorld.json"
+
+# [Scene] ========== ========== ==========
+
+NavigationInfo { type [ "EXAMINE" "ANY" ] } ### Default X3D NavigationInfo
+
+# Example scene to illustrate X3D nodes and fields (XML elements and attributes)
+WorldInfo {
+ info [ "Example scene to illustrate a simple X3D model" ]
+ title "Hello World!"
+}
+Group {
+ children [
+ DEF ViewUpClose Viewpoint {
+ centerOfRotation 0 -1 0
+ description "Hello world!"
+ position 0 -1 7
+ }
+ Transform {
+ rotation 0 1 0 3
+ children [
+ Shape {
+ geometry Sphere {
+ }
+ appearance Appearance {
+ material DEF MaterialOffWhite Material {
+ diffuseColor 0.980392 0.976471 0.964706
+ }
+ texture DEF ImageCloudlessEarth ImageTexture {
+ url [ "earth-topo.png" "earth-topo.jpg" "earth-topo-small.gif" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo.png" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo.jpg" "https://www.web3d.org/x3d/content/examples/Basic/earth-topo-small.gif" ]
+ }
+ }
+ }
+ ]
+ }
+ Transform {
+ translation 0 -2 0
+ children [
+ Shape {
+ geometry DEF TextMessage Text {
+ string [ "Hello" "world!" ]
+ fontStyle FontStyle {
+ justify [ "MIDDLE" "MIDDLE" ]
+ }
+ }
+ appearance Appearance {
+ material USE MaterialOffWhite
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/test/models/X3DV/README.md b/test/models/X3DV/README.md
new file mode 100644
index 000000000..83c951c6a
--- /dev/null
+++ b/test/models/X3DV/README.md
@@ -0,0 +1,6 @@
+# X3DV models
+
+X3DV models are as simple WRL (VRML) models with the version number upgraded from `2` to `3`
+
+# HelloWorld.x3dv
+Downloaded from [HelloWorld.x3dv](http://www.web3d.org/x3d/content/examples/HelloWorld.x3dv)
diff --git a/test/models/X3DV/earth-topo.png b/test/models/X3DV/earth-topo.png
new file mode 100644
index 000000000..1749cb835
--- /dev/null
+++ b/test/models/X3DV/earth-topo.png
Binary files differ
diff --git a/test/models/X3DV/ref/README.md b/test/models/X3DV/ref/README.md
new file mode 100644
index 000000000..25f3e93d9
--- /dev/null
+++ b/test/models/X3DV/ref/README.md
@@ -0,0 +1,4 @@
+# X3DV 3D model reference images
+
+## HelloWorld.x3dv
+<img alt="HelloWorld.x3dv" src="screenshots/HelloWorld_x3dv.png" width=180 />
diff --git a/test/models/X3DV/ref/screenshots/HelloWorld_x3dv.png b/test/models/X3DV/ref/screenshots/HelloWorld_x3dv.png
new file mode 100644
index 000000000..0860c7a85
--- /dev/null
+++ b/test/models/X3DV/ref/screenshots/HelloWorld_x3dv.png
Binary files differ
diff --git a/test/models/fuzzer_data/clusterfuzz-testcase-minimized-assimp_fuzzer-4751812606885888 b/test/models/fuzzer_data/clusterfuzz-testcase-minimized-assimp_fuzzer-4751812606885888
new file mode 100644
index 000000000..36861a7e3
--- /dev/null
+++ b/test/models/fuzzer_data/clusterfuzz-testcase-minimized-assimp_fuzzer-4751812606885888
Binary files differ
diff --git a/test/models/glTF2/AnimatedMorphCube/LICENSE.md b/test/models/glTF2/AnimatedMorphCube/LICENSE.md
new file mode 100644
index 000000000..f480b9838
--- /dev/null
+++ b/test/models/glTF2/AnimatedMorphCube/LICENSE.md
@@ -0,0 +1,15 @@
+# LICENSE file for the model: Animated Morph Cube
+
+All files in this directory tree are licensed as indicated below.
+
+* All files directly associated with the model including all text, image and binary files:
+
+ * [CC0 1.0 Universal]("https://creativecommons.org/publicdomain/zero/1.0/legalcode") [SPDX license identifier: "CC0-1.0"]
+
+* This file and all other metadocumentation files including "metadata.json":
+
+ * [Creative Commons Attribtution 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"]
+
+Full license text of these licenses are available at the links above
+
+#### Generated by modelmetadata \ No newline at end of file
diff --git a/test/models/glTF2/AnimatedMorphCube/README.body.md b/test/models/glTF2/AnimatedMorphCube/README.body.md
new file mode 100644
index 000000000..b6a21c084
--- /dev/null
+++ b/test/models/glTF2/AnimatedMorphCube/README.body.md
@@ -0,0 +1,12 @@
+## Screenshot
+
+![screenshot](screenshot/screenshot.gif)
+
+## Description
+
+The cube contains two morph targets in it:
+
+ * **`thin`** : moves the vertices so that it becomes super-thin
+ * **`angle`** : moves the vertices so that it forms a ramp
+
+The animation loops, morphing between these two states. \ No newline at end of file
diff --git a/test/models/glTF2/AnimatedMorphCube/README.md b/test/models/glTF2/AnimatedMorphCube/README.md
new file mode 100644
index 000000000..ca314920e
--- /dev/null
+++ b/test/models/glTF2/AnimatedMorphCube/README.md
@@ -0,0 +1,36 @@
+# Animated Morph Cube
+
+## Tags
+
+[core](../../Models-core.md), [testing](../../Models-testing.md)
+
+## Summary
+
+Demonstrates a simple cube with two simple morph targets and an animation that transitions between them both.
+
+## Operations
+
+* [Display](https://github.khronos.org/glTF-Sample-Viewer-Release/?model=https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/AnimatedMorphCube/glTF-Binary/AnimatedMorphCube.glb) in SampleViewer
+* [Download GLB](https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/AnimatedMorphCube/glTF-Binary/AnimatedMorphCube.glb)
+* [Model Directory](./)
+
+## Screenshot
+
+![screenshot](screenshot/screenshot.gif)
+
+## Description
+
+The cube contains two morph targets in it:
+
+ * **`thin`** : moves the vertices so that it becomes super-thin
+ * **`angle`** : moves the vertices so that it forms a ramp
+
+The animation loops, morphing between these two states.
+
+## Legal
+
+&copy; 2017, Public. [CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/legalcode)
+
+ - Microsoft for Everything
+
+#### Assembled by modelmetadata \ No newline at end of file
diff --git a/test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.bin b/test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.bin
new file mode 100644
index 000000000..7b14a1793
--- /dev/null
+++ b/test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.bin
Binary files differ
diff --git a/test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.gltf b/test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.gltf
new file mode 100644
index 000000000..b1b720147
--- /dev/null
+++ b/test/models/glTF2/AnimatedMorphCube/glTF/AnimatedMorphCube.gltf
@@ -0,0 +1,282 @@
+{
+ "accessors": [
+ {
+ "bufferView": 0,
+ "componentType": 5126,
+ "count": 24,
+ "type": "VEC3"
+ },
+ {
+ "bufferView": 1,
+ "componentType": 5126,
+ "count": 24,
+ "type": "VEC4"
+ },
+ {
+ "bufferView": 2,
+ "componentType": 5126,
+ "count": 24,
+ "type": "VEC3",
+ "max": [
+ 0.0100000035,
+ 0.0100000035,
+ 0.01
+ ],
+ "min": [
+ -0.0100000044,
+ -0.0100000054,
+ -0.01
+ ]
+ },
+ {
+ "bufferView": 3,
+ "componentType": 5126,
+ "count": 24,
+ "type": "VEC3",
+ "name": "thin"
+ },
+ {
+ "bufferView": 4,
+ "componentType": 5126,
+ "count": 24,
+ "type": "VEC3",
+ "max": [
+ 0.0,
+ 0.01893253,
+ 0.0
+ ],
+ "min": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "name": "thin"
+ },
+ {
+ "bufferView": 5,
+ "componentType": 5126,
+ "count": 24,
+ "type": "VEC3",
+ "name": "thin"
+ },
+ {
+ "bufferView": 6,
+ "componentType": 5126,
+ "count": 24,
+ "type": "VEC3",
+ "name": "angle"
+ },
+ {
+ "bufferView": 7,
+ "componentType": 5126,
+ "count": 24,
+ "type": "VEC3",
+ "max": [
+ 0.0,
+ 0.0198908355,
+ 0.0
+ ],
+ "min": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "name": "angle"
+ },
+ {
+ "bufferView": 8,
+ "componentType": 5126,
+ "count": 24,
+ "type": "VEC3",
+ "name": "angle"
+ },
+ {
+ "bufferView": 9,
+ "componentType": 5123,
+ "count": 36,
+ "type": "SCALAR"
+ },
+ {
+ "bufferView": 10,
+ "componentType": 5126,
+ "count": 127,
+ "type": "SCALAR",
+ "max": [
+ 4.19999743
+ ],
+ "min": [
+ 0.0
+ ]
+ },
+ {
+ "bufferView": 11,
+ "componentType": 5126,
+ "count": 254,
+ "type": "SCALAR"
+ }
+ ],
+ "animations": [
+ {
+ "channels": [
+ {
+ "sampler": 0,
+ "target": {
+ "node": 0,
+ "path": "weights"
+ }
+ }
+ ],
+ "samplers": [
+ {
+ "input": 10,
+ "interpolation": "LINEAR",
+ "output": 11
+ }
+ ],
+ "name": "Square"
+ }
+ ],
+ "asset": {
+ "generator": "glTF Tools for Unity",
+ "version": "2.0"
+ },
+ "bufferViews": [
+ {
+ "buffer": 0,
+ "byteLength": 288
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 288,
+ "byteLength": 384
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 672,
+ "byteLength": 288
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 960,
+ "byteLength": 288
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 1248,
+ "byteLength": 288
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 1536,
+ "byteLength": 288
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 1824,
+ "byteLength": 288
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 2112,
+ "byteLength": 288
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 2400,
+ "byteLength": 288
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 2688,
+ "byteLength": 72
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 2760,
+ "byteLength": 508
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 3268,
+ "byteLength": 1016
+ }
+ ],
+ "buffers": [
+ {
+ "uri": "AnimatedMorphCube.bin",
+ "byteLength": 4284
+ }
+ ],
+ "meshes": [
+ {
+ "primitives": [
+ {
+ "attributes": {
+ "NORMAL": 0,
+ "TANGENT": 1,
+ "POSITION": 2
+ },
+ "indices": 9,
+ "material": 0,
+ "targets": [
+ {
+ "NORMAL": 3,
+ "POSITION": 4,
+ "TANGENT": 5
+ },
+ {
+ "NORMAL": 6,
+ "POSITION": 7,
+ "TANGENT": 8
+ }
+ ]
+ }
+ ],
+ "weights": [
+ 0.0,
+ 0.0
+ ],
+ "name": "Cube"
+ }
+ ],
+ "materials": [
+ {
+ "pbrMetallicRoughness": {
+ "baseColorFactor": [
+ 0.6038274,
+ 0.6038274,
+ 0.6038274,
+ 1.0
+ ],
+ "metallicFactor": 0.0,
+ "roughnessFactor": 0.5
+ },
+ "name": "Material"
+ }
+ ],
+ "nodes": [
+ {
+ "mesh": 0,
+ "rotation": [
+ 0.0,
+ 0.7071067,
+ -0.7071068,
+ 0.0
+ ],
+ "scale": [
+ 100.0,
+ 100.0,
+ 100.0
+ ],
+ "name": "AnimatedMorphCube"
+ }
+ ],
+ "scene": 0,
+ "scenes": [
+ {
+ "nodes": [
+ 0
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/test/models/glTF2/AnimatedMorphSphere/README.md b/test/models/glTF2/AnimatedMorphSphere/README.md
new file mode 100644
index 000000000..d626d5cab
--- /dev/null
+++ b/test/models/glTF2/AnimatedMorphSphere/README.md
@@ -0,0 +1,20 @@
+# Animated Morph Sphere
+
+## Screenshot
+
+![screenshot](screenshot/screenshot.gif)
+
+## Description
+
+The sphere contains two morph targets in it:
+
+ * **`blob`** : moves the vertices so that it becomes a somewhat amorphous fat, blob shape.
+ * **`ship`** : moves the vertices so that it looks a bit like a spaceship, the goal being
+ to just make it a much more complicated morph example than the [cube](../AnimatedMorphCube/README.md).
+
+The animation loops, morphing between these two states.
+
+## License Information
+
+[![CC0](http://i.creativecommons.org/p/zero/1.0/88x31.png)](http://creativecommons.org/publicdomain/zero/1.0/)
+To the extent possible under law, Microsoft has waived all copyright and related or neighboring rights to this asset.
diff --git a/test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.bin b/test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.bin
new file mode 100644
index 000000000..5bc8fc640
--- /dev/null
+++ b/test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.bin
@@ -0,0 +1,185 @@
+īŋŊīŋŊ=īŋŊuīŋŊ>fīŋŊaīŋŊīŋŊīŋŊ=īŋŊuīŋŊ>fīŋŊaīŋŊīŋŊīŋŊ=īŋŊuīŋŊ>fīŋŊaīŋŊīŋŊīŋŊ=īŋŊuīŋŊ>fīŋŊaīŋŊīŋŊ7īŋŊīŋŊīŋŊīŋŊ`?9sīŋŊ>īŋŊ7īŋŊīŋŊīŋŊīŋŊ`?9sīŋŊ>īŋŊ7īŋŊīŋŊīŋŊīŋŊ`?9sīŋŊ>īŋŊ7īŋŊīŋŊīŋŊīŋŊ`?9sīŋŊ>nkīŋŊīŋŊ"?kīŋŊEīŋŊnkīŋŊīŋŊ"?kīŋŊEīŋŊnkīŋŊīŋŊ"?kīŋŊEīŋŊnkīŋŊīŋŊ"?kīŋŊEīŋŊīŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!?īŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!?īŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!?īŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!?īŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!īŋŊīŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!īŋŊīŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!īŋŊīŋŊwīŋŊīŋŊīŋŊQE?īŋŊīŋŊ!īŋŊīŋŊkīŋŊīŋŊ"?jīŋŊE?īŋŊkīŋŊīŋŊ"?jīŋŊE?īŋŊkīŋŊīŋŊ"?jīŋŊE?īŋŊkīŋŊīŋŊ"?jīŋŊE?īŋŊ7īŋŊīŋŊīŋŊīŋŊ`?6sīŋŊīŋŊ7īŋŊīŋŊīŋŊīŋŊ`?6sīŋŊīŋŊ7īŋŊīŋŊīŋŊīŋŊ`?6sīŋŊīŋŊ7īŋŊīŋŊīŋŊīŋŊ`?6sīŋŊīŋŊ=īŋŊīŋŊ>dīŋŊa?īŋŊīŋŊ=īŋŊīŋŊ>dīŋŊa?īŋŊīŋŊ=īŋŊīŋŊ>dīŋŊa?īŋŊīŋŊ=īŋŊīŋŊ>dīŋŊa?īŋŊ*īŋŊīŋŊ_īŋŊs?4īŋŊīŋŊīŋŊīŋŊ*īŋŊīŋŊ_īŋŊs?4īŋŊīŋŊīŋŊīŋŊ*īŋŊīŋŊ_īŋŊs?4īŋŊīŋŊīŋŊīŋŊ*īŋŊīŋŊ_īŋŊs?4īŋŊīŋŊīŋŊ ęŧĸīŋŊīŋŊ>mīŋŊt? ęŧĸīŋŊīŋŊ>mīŋŊt? ęŧĸīŋŊīŋŊ>mīŋŊt? ęŧĸīŋŊīŋŊ>mīŋŊt?īŋŊīŋŊĮŊeīŋŊ}?IīŋŊĮŊīŋŊīŋŊĮŊeīŋŊ}?IīŋŊĮŊīŋŊīŋŊĮŊeīŋŊ}?IīŋŊĮŊīŋŊīŋŊĮŊeīŋŊ}?IīŋŊĮŊīŋŊīŋŊËēīŋŊ=dīŋŊ~īŋŊīŋŊīŋŊËēīŋŊ=dīŋŊ~īŋŊīŋŊīŋŊËēīŋŊ=dīŋŊ~īŋŊīŋŊ5īŋŊīŋŊīŋŊ=bīŋŊ~īŋŊA+>īŋŊPīŋŊ=bīŋŊ~īŋŊīŋŊ5īŋŊ< īŋŊ=bīŋŊ~īŋŊf+>=fīŋŊ=bīŋŊ~īŋŊRīŋŊīŋŊīŋŊīŋŊ=fīŋŊ~īŋŊRīŋŊīŋŊīŋŊīŋŊ=fīŋŊ~īŋŊ[ë›ŊCīŋŊ=bīŋŊ~īŋŊīŋŊāąŊu)>=hīŋŊ~īŋŊīŋŊīŋŊīŋŊīŋŊ3īŋŊ<bīŋŊ~īŋŊīŋŊīŋŊīŋŊīŋŊ3īŋŊ<bīŋŊ~īŋŊZīŋŊČŊ)<dīŋŊ~īŋŊQīŋŊČŊ+)īŋŊbīŋŊ~īŋŊ īŋŊīŋŊ4īŋŊfīŋŊ~īŋŊ īŋŊīŋŊ4īŋŊfīŋŊ~īŋŊãąŊīŋŊ)>īŋŊbīŋŊ~īŋŊ\é›ŊvīŋŊīŋŊfīŋŊ~īŋŊīŋŊīŋŊīŋŊīŋŊę›ŊbīŋŊ~īŋŊīŋŊīŋŊīŋŊīŋŊę›ŊbīŋŊ~īŋŊE'>īŋŊxâąŊdīŋŊ~īŋŊīŋŊ-īŋŊ#īŋŊīŋŊdīŋŊ~īŋŊ!<īŋŊīŋŊČŊbīŋŊ~īŋŊ!<īŋŊīŋŊČŊbīŋŊ~īŋŊ#<<īŋŊČŊbīŋŊ~īŋŊīŋŊ-īŋŊ<'īŋŊīŋŊdīŋŊ~īŋŊT'>=īŋŊâąŊdīŋŊ~īŋŊT'>=īŋŊâąŊdīŋŊ~īŋŊīŋŊīŋŊ=īŋŊę›ŊbīŋŊ~īŋŊ~īŋŊ=īŋŊīŋŊīŋŊdīŋŊ~īŋŊ1īŋŊ=īŋŊ)>īŋŊdīŋŊ~īŋŊ1īŋŊ=īŋŊ)>īŋŊdīŋŊ~īŋŊīŋŊīŋŊ=īŋŊ3īŋŊaīŋŊ~īŋŊ_īŋŊīŋŊ=+)īŋŊbīŋŊ~īŋŊqīŋŊīŋŊ=M)<dīŋŊ~īŋŊqīŋŊīŋŊ=M)<dīŋŊ~īŋŊCīŋŊ=4īŋŊ<aīŋŊ~īŋŊīŋŊ=īŋŊ)>=fīŋŊ~īŋŊwīŋŊ=rīŋŊ=bīŋŊ~īŋŊwīŋŊ=rīŋŊ=bīŋŊ~īŋŊīŋŊīŋŊ=īŋŊīŋŊ=fīŋŊ~īŋŊīŋŊ#īŋŊÂēīŋŊ=dīŋŊ~?īŋŊ#īŋŊÂēīŋŊ=dīŋŊ~?īŋŊ#īŋŊÂēīŋŊ=dīŋŊ~?Y1īŋŊīŋŊīŋŊ=dīŋŊ~?{+>īŋŊRīŋŊ=bīŋŊ~?s1īŋŊ<īŋŊīŋŊ=dīŋŊ~?īŋŊ+>=YīŋŊ=bīŋŊ~?īŋŊīŋŊīŋŊīŋŊīŋŊ=dīŋŊ~?īŋŊīŋŊīŋŊīŋŊīŋŊ=dīŋŊ~?īŋŊę›Ŋ;īŋŊ=bīŋŊ~?īŋŊâąŊl)>=bīŋŊ~?īŋŊīŋŊīŋŊīŋŊ3īŋŊ<aīŋŊ~?īŋŊīŋŊīŋŊīŋŊ3īŋŊ<aīŋŊ~?qīŋŊČŊ+)<dīŋŊ~?{īŋŊČŊ))īŋŊaīŋŊ~?īŋŊīŋŊīŋŊīŋŊ3īŋŊdīŋŊ~?īŋŊīŋŊīŋŊīŋŊ3īŋŊdīŋŊ~?īŋŊâąŊ{)>īŋŊbīŋŊ~?īŋŊę›ŊKīŋŊīŋŊdīŋŊ~?īŋŊīŋŊīŋŊīŋŊę›ŊdīŋŊ~?īŋŊīŋŊīŋŊīŋŊę›ŊdīŋŊ~?īŋŊ+>īŋŊVâąŊbīŋŊ~?f1īŋŊīŋŊīŋŊīŋŊdīŋŊ~?īŋŊ&īŋŊīŋŊīŋŊČŊdīŋŊ~?īŋŊ&īŋŊīŋŊīŋŊČŊdīŋŊ~?='<īŋŊīŋŊČŊdīŋŊ~?īŋŊ1īŋŊ<īŋŊīŋŊīŋŊdīŋŊ~?īŋŊ+>=VâąŊbīŋŊ~?īŋŊ+>=VâąŊbīŋŊ~?īŋŊīŋŊ=īŋŊę›ŊdīŋŊ~?īŋŊīŋŊ=KīŋŊīŋŊbīŋŊ~?īŋŊīŋŊ=t)>īŋŊbīŋŊ~?īŋŊīŋŊ=t)>īŋŊbīŋŊ~?īŋŊīŋŊ=īŋŊ3īŋŊdīŋŊ~?īŋŊīŋŊīŋŊ=7)īŋŊaīŋŊ~?īŋŊīŋŊīŋŊ=8)<dīŋŊ~?īŋŊīŋŊīŋŊ=8)<dīŋŊ~?īŋŊīŋŊ=īŋŊ3īŋŊ<aīŋŊ~?>īŋŊ=īŋŊ)>=dīŋŊ~?īŋŊīŋŊ=MīŋŊ=bīŋŊ~?īŋŊīŋŊ=MīŋŊ=bīŋŊ~?īŋŊīŋŊ=īŋŊīŋŊ=dīŋŊ~?īŋŊīŋŊĮŊeīŋŊ}?FīŋŊīŋŊ=īŋŊīŋŊĮŊeīŋŊ}?FīŋŊīŋŊ=īŋŊīŋŊĮŊeīŋŊ}?FīŋŊīŋŊ=īŋŊīŋŊĮŊeīŋŊ}?FīŋŊīŋŊ=ęŧŗīŋŊīŋŊ>kīŋŊtīŋŊęŧŗīŋŊīŋŊ>kīŋŊtīŋŊęŧŗīŋŊīŋŊ>kīŋŊtīŋŊęŧŗīŋŊīŋŊ>kīŋŊtīŋŊe*īŋŊīŋŊcīŋŊs?'īŋŊīŋŊ>e*īŋŊīŋŊcīŋŊs?'īŋŊīŋŊ>e*īŋŊīŋŊcīŋŊs?'īŋŊīŋŊ>e*īŋŊīŋŊcīŋŊs?'īŋŊīŋŊ>īŋŊ꓾īŋŊīŋŊs?FīŋŊīŋŊ=īŋŊ꓾īŋŊīŋŊs?FīŋŊīŋŊ=īŋŊ꓾īŋŊīŋŊs?FīŋŊīŋŊ=īŋŊ꓾īŋŊīŋŊs?FīŋŊīŋŊ=īŋŊVīŋŊīŋŊێ>mīŋŊtīŋŊīŋŊVīŋŊīŋŊێ>mīŋŊtīŋŊīŋŊVīŋŊīŋŊێ>mīŋŊtīŋŊīŋŊVīŋŊīŋŊێ>mīŋŊtīŋŊīŋŊHīŋŊīŋŊīŋŊj?DīŋŊīŋŊ>īŋŊHīŋŊīŋŊīŋŊj?DīŋŊīŋŊ>īŋŊHīŋŊīŋŊīŋŊj?DīŋŊīŋŊ>īŋŊHīŋŊīŋŊīŋŊj?DīŋŊīŋŊ>\īŋŊ īŋŊīŋŊīŋŊīŋŊ>fīŋŊaīŋŊ\īŋŊ īŋŊīŋŊīŋŊīŋŊ>fīŋŊaīŋŊ\īŋŊ īŋŊīŋŊīŋŊīŋŊ>fīŋŊaīŋŊ\īŋŊ īŋŊīŋŊīŋŊīŋŊ>fīŋŊaīŋŊm7īŋŊīŋŊīŋŊGX?sīŋŊ>m7īŋŊīŋŊīŋŊGX?sīŋŊ>m7īŋŊīŋŊīŋŊGX?sīŋŊ>m7īŋŊīŋŊīŋŊGX?sīŋŊ>E=īŋŊīŋŊ?gīŋŊEīŋŊE=īŋŊīŋŊ?gīŋŊEīŋŊE=īŋŊīŋŊ?gīŋŊEīŋŊE=īŋŊīŋŊ?gīŋŊEīŋŊo9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!?o9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!?o9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!?o9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!?s9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!īŋŊs9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!īŋŊs9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!īŋŊs9fīŋŊīŋŊīŋŊ=?īŋŊīŋŊ!īŋŊ==īŋŊīŋŊ?jīŋŊE?==īŋŊīŋŊ?jīŋŊE?==īŋŊīŋŊ?jīŋŊE?==īŋŊīŋŊ?jīŋŊE?j7īŋŊīŋŊīŋŊGX?(sīŋŊj7īŋŊīŋŊīŋŊGX?(sīŋŊj7īŋŊīŋŊīŋŊGX?(sīŋŊj7īŋŊīŋŊīŋŊGX?(sīŋŊ[īŋŊ īŋŊīŋŊīŋŊīŋŊ>dīŋŊa?[īŋŊ īŋŊīŋŊīŋŊīŋŊ>dīŋŊa?[īŋŊ īŋŊīŋŊīŋŊīŋŊ>dīŋŊa?[īŋŊ īŋŊīŋŊīŋŊīŋŊ>dīŋŊa?īŋŊHīŋŊīŋŊīŋŊj?IīŋŊīŋŊīŋŊīŋŊHīŋŊīŋŊīŋŊj?IīŋŊīŋŊīŋŊīŋŊHīŋŊīŋŊīŋŊj?IīŋŊīŋŊīŋŊīŋŊHīŋŊīŋŊīŋŊj?IīŋŊīŋŊīŋŊīŋŊWīŋŊīŋŊێ>kīŋŊt?īŋŊWīŋŊīŋŊێ>kīŋŊt?īŋŊWīŋŊīŋŊێ>kīŋŊt?īŋŊWīŋŊīŋŊێ>kīŋŊt?īŋŊ꓾īŋŊīŋŊs?FīŋŊĮŊīŋŊ꓾īŋŊīŋŊs?FīŋŊĮŊīŋŊ꓾īŋŊīŋŊs?FīŋŊĮŊīŋŊ꓾īŋŊīŋŊs?FīŋŊĮŊ.īŋŊīŋŊīŋŊīŋŊ?iīŋŊE?.īŋŊīŋŊīŋŊīŋŊ?iīŋŊE?.īŋŊīŋŊīŋŊīŋŊ?iīŋŊE?.īŋŊīŋŊīŋŊīŋŊ?iīŋŊE?tÕžnSG?sīŋŊtÕžnSG?sīŋŊtÕžnSG?sīŋŊtÕžnSG?sīŋŊxgdīŋŊīŋŊīŋŊīŋŊ>bīŋŊa?xgdīŋŊīŋŊīŋŊīŋŊ>bīŋŊa?xgdīŋŊīŋŊīŋŊīŋŊ>bīŋŊa?xgdīŋŊīŋŊīŋŊīŋŊ>bīŋŊa?ZīŋŊ<#X?\īŋŊīŋŊīŋŊZīŋŊ<#X?\īŋŊīŋŊīŋŊZīŋŊ<#X?\īŋŊīŋŊīŋŊZīŋŊ<#X?\īŋŊīŋŊīŋŊrīŋŊ īŋŊīŋŊīŋŊ>mīŋŊt?rīŋŊ īŋŊīŋŊīŋŊ>mīŋŊt?rīŋŊ īŋŊīŋŊīŋŊ>mīŋŊt?rīŋŊ īŋŊīŋŊīŋŊ>mīŋŊt?@4īŋŊīŋŊ`?īŋŊīŋŊĮŊ@4īŋŊīŋŊ`?īŋŊīŋŊĮŊ@4īŋŊīŋŊ`?īŋŊīŋŊĮŊ@4īŋŊīŋŊ`?īŋŊīŋŊĮŊ@4īŋŊīŋŊ`?īŋŊīŋŊīŋŊ=@4īŋŊīŋŊ`?īŋŊīŋŊīŋŊ=@4īŋŊīŋŊ`?īŋŊīŋŊīŋŊ=@4īŋŊīŋŊ`?īŋŊīŋŊīŋŊ=līŋŊ īŋŊīŋŊīŋŊ>mīŋŊtīŋŊlīŋŊ īŋŊīŋŊīŋŊ>mīŋŊtīŋŊlīŋŊ īŋŊīŋŊīŋŊ>mīŋŊtīŋŊlīŋŊ īŋŊīŋŊīŋŊ>mīŋŊtīŋŊ\īŋŊ=#X?PīŋŊīŋŊ>\īŋŊ=#X?PīŋŊīŋŊ>\īŋŊ=#X?PīŋŊīŋŊ>\īŋŊ=#X?PīŋŊīŋŊ>IgdīŋŊīŋŊīŋŊ>dīŋŊaīŋŊIgdīŋŊīŋŊīŋŊ>dīŋŊaīŋŊIgdīŋŊīŋŊīŋŊ>dīŋŊaīŋŊIgdīŋŊīŋŊīŋŊ>dīŋŊaīŋŊ~ÕžqSG?sīŋŊ>~ÕžqSG?sīŋŊ>~ÕžqSG?sīŋŊ>~ÕžqSG?sīŋŊ>1īŋŊīŋŊīŋŊīŋŊ?gīŋŊEīŋŊ1īŋŊīŋŊīŋŊīŋŊ?gīŋŊEīŋŊ1īŋŊīŋŊīŋŊīŋŊ?gīŋŊEīŋŊ1īŋŊīŋŊīŋŊīŋŊ?gīŋŊEīŋŊīŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!?īŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!?īŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!?īŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!?īŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!īŋŊīŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!īŋŊīŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!īŋŊīŋŊîēžīŋŊīŋŊ.?īŋŊīŋŊ!īŋŊ{yīŋŊCr=?EīŋŊīŋŊ>{yīŋŊCr=?EīŋŊīŋŊ>{yīŋŊCr=?EīŋŊīŋŊ>{yīŋŊCr=?EīŋŊīŋŊ>zīŋŊīŋŊīŋŊgEīŋŊ>fīŋŊaīŋŊzīŋŊīŋŊīŋŊgEīŋŊ>fīŋŊaīŋŊzīŋŊīŋŊīŋŊgEīŋŊ>fīŋŊaīŋŊzīŋŊīŋŊīŋŊgEīŋŊ>fīŋŊaīŋŊīŋŊaīŋŊīŋŊ.?!sīŋŊ>īŋŊaīŋŊīŋŊ.?!sīŋŊ>īŋŊaīŋŊīŋŊ.?!sīŋŊ>īŋŊaīŋŊīŋŊ.?!sīŋŊ>īŋŊīŋŊΞīŋŊīŋŊ>fīŋŊEīŋŊīŋŊīŋŊΞīŋŊīŋŊ>fīŋŊEīŋŊīŋŊīŋŊΞīŋŊīŋŊ>fīŋŊEīŋŊīŋŊīŋŊΞīŋŊīŋŊ>fīŋŊEīŋŊbīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!?bīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!?bīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!?bīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!?bīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!īŋŊbīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!īŋŊbīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!īŋŊbīŋŊīŋŊīŋŊīŋŊD?īŋŊīŋŊ!īŋŊīŋŊīŋŊΞīŋŊīŋŊ>jīŋŊE?īŋŊīŋŊΞīŋŊīŋŊ>jīŋŊE?īŋŊīŋŊΞīŋŊīŋŊ>jīŋŊE?īŋŊīŋŊΞīŋŊīŋŊ>jīŋŊE?īŋŊaīŋŊīŋŊ.?sīŋŊaīŋŊīŋŊ.?sīŋŊaīŋŊīŋŊ.?sīŋŊaīŋŊīŋŊ.?sīŋŊgīŋŊīŋŊīŋŊiEīŋŊ>iīŋŊa?gīŋŊīŋŊīŋŊiEīŋŊ>iīŋŊa?gīŋŊīŋŊīŋŊiEīŋŊ>iīŋŊa?gīŋŊīŋŊīŋŊiEīŋŊ>iīŋŊa?zyīŋŊ?r=?OīŋŊīŋŊīŋŊzyīŋŊ?r=?OīŋŊīŋŊīŋŊzyīŋŊ?r=?OīŋŊīŋŊīŋŊzyīŋŊ?r=?OīŋŊīŋŊīŋŊi=īŋŊīŋŊīŋŊf>kīŋŊt?i=īŋŊīŋŊīŋŊf>kīŋŊt?i=īŋŊīŋŊīŋŊf>kīŋŊt?i=īŋŊīŋŊīŋŊf>kīŋŊt?OīŋŊ!īŋŊeīŋŊD?dīŋŊĮŊOīŋŊ!īŋŊeīŋŊD?dīŋŊĮŊOīŋŊ!īŋŊeīŋŊD?dīŋŊĮŊOīŋŊ!īŋŊeīŋŊD?dīŋŊĮŊNīŋŊ!īŋŊfīŋŊD?eīŋŊīŋŊ=NīŋŊ!īŋŊfīŋŊD?eīŋŊīŋŊ=NīŋŊ!īŋŊfīŋŊD?eīŋŊīŋŊ=NīŋŊ!īŋŊfīŋŊD?eīŋŊīŋŊ=i=īŋŊīŋŊīŋŊf>jīŋŊtīŋŊi=īŋŊīŋŊīŋŊf>jīŋŊtīŋŊi=īŋŊīŋŊīŋŊf>jīŋŊtīŋŊi=īŋŊīŋŊīŋŊf>jīŋŊtīŋŊ]EīŋŊīŋŊ}īŋŊīŋŊ>fīŋŊa?]EīŋŊīŋŊ}īŋŊīŋŊ>fīŋŊa?]EīŋŊīŋŊ}īŋŊīŋŊ>fīŋŊa?]EīŋŊīŋŊ}īŋŊīŋŊ>fīŋŊa?Cr=īŋŊ{y?BīŋŊīŋŊīŋŊCr=īŋŊ{y?BīŋŊīŋŊīŋŊCr=īŋŊ{y?BīŋŊīŋŊīŋŊCr=īŋŊ{y?BīŋŊīŋŊīŋŊvīŋŊfīŋŊīŋŊh=>sīŋŊt?vīŋŊfīŋŊīŋŊh=>sīŋŊt?vīŋŊfīŋŊīŋŊh=>sīŋŊt?vīŋŊfīŋŊīŋŊh=>sīŋŊt?hīŋŊDīŋŊKīŋŊ!?uīŋŊĮŊhīŋŊDīŋŊKīŋŊ!?uīŋŊĮŊhīŋŊDīŋŊKīŋŊ!?uīŋŊĮŊhīŋŊDīŋŊKīŋŊ!?uīŋŊĮŊhīŋŊDīŋŊJīŋŊ!?sīŋŊīŋŊ=hīŋŊDīŋŊJīŋŊ!?sīŋŊīŋŊ=hīŋŊDīŋŊJīŋŊ!?sīŋŊīŋŊ=hīŋŊDīŋŊJīŋŊ!?sīŋŊīŋŊ=īŋŊīŋŊfīŋŊīŋŊh=>oīŋŊtīŋŊīŋŊīŋŊfīŋŊīŋŊh=>oīŋŊtīŋŊīŋŊīŋŊfīŋŊīŋŊh=>oīŋŊtīŋŊīŋŊīŋŊfīŋŊīŋŊh=>oīŋŊtīŋŊBr=īŋŊ{y?BīŋŊīŋŊ>Br=īŋŊ{y?BīŋŊīŋŊ>Br=īŋŊ{y?BīŋŊīŋŊ>Br=īŋŊ{y?BīŋŊīŋŊ>kEīŋŊīŋŊ}īŋŊīŋŊ>bīŋŊaīŋŊkEīŋŊīŋŊ}īŋŊīŋŊ>bīŋŊaīŋŊkEīŋŊīŋŊ}īŋŊīŋŊ>bīŋŊaīŋŊkEīŋŊīŋŊ}īŋŊīŋŊ>bīŋŊaīŋŊīŋŊ.īŋŊīŋŊa?sīŋŊ>īŋŊ.īŋŊīŋŊa?sīŋŊ>īŋŊ.īŋŊīŋŊa?sīŋŊ>īŋŊ.īŋŊīŋŊa?sīŋŊ>īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>gīŋŊEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>gīŋŊEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>gīŋŊEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>gīŋŊEīŋŊīŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!?īŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!?īŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!?īŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!?īŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊDīŋŊ]īŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>iīŋŊE?īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>iīŋŊE?īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>iīŋŊE?īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ>iīŋŊE?īŋŊ.īŋŊīŋŊa?*sīŋŊīŋŊ.īŋŊīŋŊa?*sīŋŊīŋŊ.īŋŊīŋŊa?*sīŋŊīŋŊ.īŋŊīŋŊa?*sīŋŊīŋŊīŋŊÕž0gd>dīŋŊaīŋŊīŋŊīŋŊÕž0gd>dīŋŊaīŋŊīŋŊīŋŊÕž0gd>dīŋŊaīŋŊīŋŊīŋŊÕž0gd>dīŋŊaīŋŊqSGīŋŊmīŋŊ>sīŋŊ>qSGīŋŊmīŋŊ>sīŋŊ>qSGīŋŊmīŋŊ>sīŋŊ>qSGīŋŊmīŋŊ>sīŋŊ>īŋŊīŋŊ1īŋŊīŋŊ>kīŋŊEīŋŊīŋŊīŋŊ1īŋŊīŋŊ>kīŋŊEīŋŊīŋŊīŋŊ1īŋŊīŋŊ>kīŋŊEīŋŊīŋŊīŋŊ1īŋŊīŋŊ>kīŋŊEīŋŊīŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊīŋŊ.īŋŊīŋŊīŋŊ>īŋŊīŋŊ!īŋŊīŋŊīŋŊ8īŋŊīŋŊ>kīŋŊE?īŋŊīŋŊ8īŋŊīŋŊ>kīŋŊE?īŋŊīŋŊ8īŋŊīŋŊ>kīŋŊE?īŋŊīŋŊ8īŋŊīŋŊ>kīŋŊE?nSGīŋŊtīŋŊ>sīŋŊnSGīŋŊtīŋŊ>sīŋŊnSGīŋŊtīŋŊ>sīŋŊnSGīŋŊtīŋŊ>sīŋŊīŋŊīŋŊÕž+gd>bīŋŊa?īŋŊīŋŊÕž+gd>bīŋŊa?īŋŊīŋŊÕž+gd>bīŋŊa?īŋŊīŋŊÕž+gd>bīŋŊa?F#XīŋŊFīŋŊ>CīŋŊīŋŊīŋŊF#XīŋŊFīŋŊ>CīŋŊīŋŊīŋŊF#XīŋŊFīŋŊ>CīŋŊīŋŊīŋŊF#XīŋŊFīŋŊ>CīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊaīŋŊ >mīŋŊt?īŋŊīŋŊīŋŊaīŋŊ >mīŋŊt?īŋŊīŋŊīŋŊaīŋŊ >mīŋŊt?īŋŊīŋŊīŋŊaīŋŊ >mīŋŊt?īŋŊ`īŋŊ04īŋŊ>~īŋŊĮŊīŋŊ`īŋŊ04īŋŊ>~īŋŊĮŊīŋŊ`īŋŊ04īŋŊ>~īŋŊĮŊīŋŊ`īŋŊ04īŋŊ>~īŋŊĮŊīŋŊ`īŋŊ.4īŋŊ>~īŋŊīŋŊ=īŋŊ`īŋŊ.4īŋŊ>~īŋŊīŋŊ=īŋŊ`īŋŊ.4īŋŊ>~īŋŊīŋŊ=īŋŊ`īŋŊ.4īŋŊ>~īŋŊīŋŊ=īŋŊīŋŊīŋŊiīŋŊ >mīŋŊtīŋŊīŋŊīŋŊīŋŊiīŋŊ >mīŋŊtīŋŊīŋŊīŋŊīŋŊiīŋŊ >mīŋŊtīŋŊīŋŊīŋŊīŋŊiīŋŊ >mīŋŊtīŋŊG#XīŋŊGīŋŊ>=īŋŊīŋŊ>G#XīŋŊGīŋŊ>=īŋŊīŋŊ>G#XīŋŊGīŋŊ>=īŋŊīŋŊ>G#XīŋŊGīŋŊ>=īŋŊīŋŊ>īŋŊjīŋŊīŋŊHīŋŊ>AīŋŊīŋŊīŋŊīŋŊjīŋŊīŋŊHīŋŊ>AīŋŊīŋŊīŋŊīŋŊjīŋŊīŋŊHīŋŊ>AīŋŊīŋŊīŋŊīŋŊjīŋŊīŋŊHīŋŊ>AīŋŊīŋŊīŋŊīŋŊڎīŋŊīŋŊVīŋŊ=qīŋŊt?īŋŊڎīŋŊīŋŊVīŋŊ=qīŋŊt?īŋŊڎīŋŊīŋŊVīŋŊ=qīŋŊt?īŋŊڎīŋŊīŋŊVīŋŊ=qīŋŊt?īŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊīŋŊ=īŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊīŋŊ=īŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊīŋŊ=īŋŊīŋŊsīŋŊīŋŊīŋŊ>īŋŊīŋŊīŋŊ=ێīŋŊīŋŊVīŋŊ=kīŋŊtīŋŊێīŋŊīŋŊVīŋŊ=kīŋŊtīŋŊێīŋŊīŋŊVīŋŊ=kīŋŊtīŋŊێīŋŊīŋŊVīŋŊ=kīŋŊtīŋŊīŋŊjīŋŊīŋŊHīŋŊ>@īŋŊīŋŊ>īŋŊjīŋŊīŋŊHīŋŊ>@īŋŊīŋŊ>īŋŊjīŋŊīŋŊHīŋŊ>@īŋŊīŋŊ>īŋŊjīŋŊīŋŊHīŋŊ>@īŋŊīŋŊ>īŋŊīŋŊīŋŊNīŋŊ >fīŋŊaīŋŊīŋŊīŋŊīŋŊNīŋŊ >fīŋŊaīŋŊīŋŊīŋŊīŋŊNīŋŊ >fīŋŊaīŋŊīŋŊīŋŊīŋŊNīŋŊ >fīŋŊaīŋŊīŋŊGXīŋŊb7īŋŊ>sīŋŊ>īŋŊGXīŋŊb7īŋŊ>sīŋŊ>īŋŊGXīŋŊb7īŋŊ>sīŋŊ>īŋŊGXīŋŊb7īŋŊ>sīŋŊ>īŋŊīŋŊ1=>iīŋŊEīŋŊīŋŊīŋŊ1=>iīŋŊEīŋŊīŋŊīŋŊ1=>iīŋŊEīŋŊīŋŊīŋŊ1=>iīŋŊEīŋŊīŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!?īŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!?īŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!?īŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!?īŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!īŋŊīŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!īŋŊīŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!īŋŊīŋŊīŋŊ=īŋŊH9f>īŋŊīŋŊ!īŋŊīŋŊīŋŊ>=>gīŋŊE?īŋŊīŋŊ>=>gīŋŊE?īŋŊīŋŊ>=>gīŋŊE?īŋŊīŋŊ>=>gīŋŊE?īŋŊGXīŋŊ[7īŋŊ>sīŋŊīŋŊGXīŋŊ[7īŋŊ>sīŋŊīŋŊGXīŋŊ[7īŋŊ>sīŋŊīŋŊGXīŋŊ[7īŋŊ>sīŋŊīŋŊīŋŊZīŋŊ >fīŋŊa?īŋŊīŋŊīŋŊZīŋŊ >fīŋŊa?īŋŊīŋŊīŋŊZīŋŊ >fīŋŊa?īŋŊīŋŊīŋŊZīŋŊ >fīŋŊa?īŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=sīŋŊ>īŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=sīŋŊ>īŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=sīŋŊ>īŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=sīŋŊ>īŋŊ"īŋŊīŋŊm=fīŋŊEīŋŊīŋŊ"īŋŊīŋŊm=fīŋŊEīŋŊīŋŊ"īŋŊīŋŊm=fīŋŊEīŋŊīŋŊ"īŋŊīŋŊm=fīŋŊEīŋŊīŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!?īŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!?īŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!?īŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!?īŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!īŋŊīŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!īŋŊīŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!īŋŊīŋŊQEīŋŊyyīŋŊ=īŋŊīŋŊ!īŋŊīŋŊ"īŋŊīŋŊm=fīŋŊE?īŋŊ"īŋŊīŋŊm=fīŋŊE?īŋŊ"īŋŊīŋŊm=fīŋŊE?īŋŊ"īŋŊīŋŊm=fīŋŊE?īŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=#sīŋŊīŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=#sīŋŊīŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=#sīŋŊīŋŊīŋŊ`īŋŊīŋŊ9īŋŊ=#sīŋŊīŋŊ īŋŊ==aīŋŊa?īŋŊ īŋŊ==aīŋŊa?īŋŊ īŋŊ==aīŋŊa?īŋŊ īŋŊ==aīŋŊa?ZīŋŊsīŋŊ:,īŋŊ==īŋŊīŋŊīŋŊZīŋŊsīŋŊ:,īŋŊ==īŋŊīŋŊīŋŊZīŋŊsīŋŊ:,īŋŊ==īŋŊīŋŊīŋŊZīŋŊsīŋŊ:,īŋŊ==īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<oīŋŊt?īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<oīŋŊt?īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<oīŋŊt?īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<oīŋŊt?]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊĮŊ]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊĮŊ]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊĮŊ]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊĮŊ]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊīŋŊ=]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊīŋŊ=]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊīŋŊ=]īŋŊ}īŋŊīŋŊīŋŊīŋŊ=īŋŊīŋŊīŋŊ=īŋŊīŋŊīŋŊīŋŊīŋŊ<kīŋŊtīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<kīŋŊtīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<kīŋŊtīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<kīŋŊtīŋŊZīŋŊsīŋŊ:,īŋŊ=<īŋŊīŋŊ>ZīŋŊsīŋŊ:,īŋŊ=<īŋŊīŋŊ>ZīŋŊsīŋŊ:,īŋŊ=<īŋŊīŋŊ>ZīŋŊsīŋŊ:,īŋŊ=<īŋŊīŋŊ>qīŋŊīŋŊ==dīŋŊaīŋŊqīŋŊīŋŊ==dīŋŊaīŋŊqīŋŊīŋŊ==dīŋŊaīŋŊqīŋŊīŋŊ==dīŋŊaīŋŊīŋŊīŋŊīŋŊīŋŊ#īŋŊoīŋŊt?īŋŊīŋŊīŋŊīŋŊ#īŋŊoīŋŊt?īŋŊīŋŊīŋŊīŋŊ#īŋŊoīŋŊt?īŋŊīŋŊīŋŊīŋŊ#īŋŊoīŋŊt?[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊĮŊ[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊĮŊ[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊĮŊ[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊĮŊ[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊīŋŊ=[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊīŋŊ=[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊīŋŊ=[īŋŊ}īŋŊ(īŋŊĮŊīŋŊīŋŊīŋŊ=īŋŊīŋŊīŋŊīŋŊīŋŊkīŋŊtīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊkīŋŊtīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊkīŋŊtīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊkīŋŊtīŋŊZīŋŊsīŋŊq,īŋŊīŋŊ7īŋŊīŋŊ>ZīŋŊsīŋŊq,īŋŊīŋŊ7īŋŊīŋŊ>ZīŋŊsīŋŊq,īŋŊīŋŊ7īŋŊīŋŊ>ZīŋŊsīŋŊq,īŋŊīŋŊ7īŋŊīŋŊ>nīŋŊīŋŊ=īŋŊfīŋŊaīŋŊnīŋŊīŋŊ=īŋŊfīŋŊaīŋŊnīŋŊīŋŊ=īŋŊfīŋŊaīŋŊnīŋŊīŋŊ=īŋŊfīŋŊaīŋŊīŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊsīŋŊ>īŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊsīŋŊ>īŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊsīŋŊ>īŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊsīŋŊ>īŋŊ"īŋŊīŋŊmīŋŊkīŋŊEīŋŊīŋŊ"īŋŊīŋŊmīŋŊkīŋŊEīŋŊīŋŊ"īŋŊīŋŊmīŋŊkīŋŊEīŋŊīŋŊ"īŋŊīŋŊmīŋŊkīŋŊEīŋŊīŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!?īŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!?īŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!?īŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!?īŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊQEīŋŊwyīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊ"īŋŊBnīŋŊkīŋŊE?īŋŊ"īŋŊBnīŋŊkīŋŊE?īŋŊ"īŋŊBnīŋŊkīŋŊE?īŋŊ"īŋŊBnīŋŊkīŋŊE?īŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊ#sīŋŊīŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊ#sīŋŊīŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊ#sīŋŊīŋŊīŋŊ`īŋŊīŋŊ9īŋŊīŋŊ#sīŋŊsīŋŊHīŋŊ=īŋŊdīŋŊa?sīŋŊHīŋŊ=īŋŊdīŋŊa?sīŋŊHīŋŊ=īŋŊdīŋŊa?sīŋŊHīŋŊ=īŋŊdīŋŊa?ZīŋŊsīŋŊp,īŋŊīŋŊ6īŋŊīŋŊīŋŊZīŋŊsīŋŊp,īŋŊīŋŊ6īŋŊīŋŊīŋŊZīŋŊsīŋŊp,īŋŊīŋŊ6īŋŊīŋŊīŋŊZīŋŊsīŋŊp,īŋŊīŋŊ6īŋŊīŋŊīŋŊīŋŊīŋŊ4=īŋŊiīŋŊEīŋŊīŋŊīŋŊ4=īŋŊiīŋŊEīŋŊīŋŊīŋŊ4=īŋŊiīŋŊEīŋŊīŋŊīŋŊ4=īŋŊiīŋŊEīŋŊīŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!?īŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!?īŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!?īŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!?īŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!īŋŊīŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!īŋŊīŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!īŋŊīŋŊīŋŊ=īŋŊh9fīŋŊīŋŊīŋŊ!īŋŊīŋŊīŋŊB=īŋŊjīŋŊE?īŋŊīŋŊB=īŋŊjīŋŊE?īŋŊīŋŊB=īŋŊjīŋŊE?īŋŊīŋŊB=īŋŊjīŋŊE?īŋŊGXīŋŊi7īŋŊīŋŊ(sīŋŊīŋŊGXīŋŊi7īŋŊīŋŊ(sīŋŊīŋŊGXīŋŊi7īŋŊīŋŊ(sīŋŊīŋŊGXīŋŊi7īŋŊīŋŊ(sīŋŊīŋŊīŋŊgīŋŊ īŋŊbīŋŊa?īŋŊīŋŊīŋŊgīŋŊ īŋŊbīŋŊa?īŋŊīŋŊīŋŊgīŋŊ īŋŊbīŋŊa?īŋŊīŋŊīŋŊgīŋŊ īŋŊbīŋŊa?īŋŊjīŋŊīŋŊHīŋŊīŋŊ3īŋŊīŋŊīŋŊīŋŊjīŋŊīŋŊHīŋŊīŋŊ3īŋŊīŋŊīŋŊīŋŊjīŋŊīŋŊHīŋŊīŋŊ3īŋŊīŋŊīŋŊīŋŊjīŋŊīŋŊHīŋŊīŋŊ3īŋŊīŋŊīŋŊێīŋŊīŋŊVīŋŊīŋŊkīŋŊt?ێīŋŊīŋŊVīŋŊīŋŊkīŋŊt?ێīŋŊīŋŊVīŋŊīŋŊkīŋŊt?ێīŋŊīŋŊVīŋŊīŋŊkīŋŊt?īŋŊīŋŊsīŋŊīŋŊ꓾īŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊ꓾īŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊ꓾īŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊ꓾īŋŊīŋŊĮŊīŋŊīŋŊsīŋŊīŋŊ꓾īŋŊīŋŊīŋŊ=īŋŊīŋŊsīŋŊīŋŊ꓾īŋŊīŋŊīŋŊ=īŋŊīŋŊsīŋŊīŋŊ꓾īŋŊīŋŊīŋŊ=īŋŊīŋŊsīŋŊīŋŊ꓾īŋŊīŋŊīŋŊ=ێīŋŊīŋŊVīŋŊīŋŊoīŋŊtīŋŊێīŋŊīŋŊVīŋŊīŋŊoīŋŊtīŋŊێīŋŊīŋŊVīŋŊīŋŊoīŋŊtīŋŊێīŋŊīŋŊVīŋŊīŋŊoīŋŊtīŋŊīŋŊjīŋŊīŋŊHīŋŊīŋŊ6īŋŊīŋŊ>īŋŊjīŋŊīŋŊHīŋŊīŋŊ6īŋŊīŋŊ>īŋŊjīŋŊīŋŊHīŋŊīŋŊ6īŋŊīŋŊ>īŋŊjīŋŊīŋŊHīŋŊīŋŊ6īŋŊīŋŊ>īŋŊīŋŊīŋŊ\īŋŊ īŋŊfīŋŊaīŋŊīŋŊīŋŊīŋŊ\īŋŊ īŋŊfīŋŊaīŋŊīŋŊīŋŊīŋŊ\īŋŊ īŋŊfīŋŊaīŋŊīŋŊīŋŊīŋŊ\īŋŊ īŋŊfīŋŊaīŋŊīŋŊGXīŋŊc7īŋŊīŋŊsīŋŊ>īŋŊGXīŋŊc7īŋŊīŋŊsīŋŊ>īŋŊGXīŋŊc7īŋŊīŋŊsīŋŊ>īŋŊGXīŋŊc7īŋŊīŋŊsīŋŊ>īŋŊ`īŋŊ?4īŋŊīŋŊīŋŊĮŊīŋŊ`īŋŊ?4īŋŊīŋŊīŋŊĮŊīŋŊ`īŋŊ?4īŋŊīŋŊīŋŊĮŊīŋŊ`īŋŊ?4īŋŊīŋŊīŋŊĮŊīŋŊ`īŋŊ=4īŋŊīŋŊīŋŊīŋŊ=īŋŊ`īŋŊ=4īŋŊīŋŊīŋŊīŋŊ=īŋŊ`īŋŊ=4īŋŊīŋŊīŋŊīŋŊ=īŋŊ`īŋŊ=4īŋŊīŋŊīŋŊīŋŊ=,īŋŊīŋŊīŋŊnīŋŊ īŋŊjīŋŊtīŋŊ,īŋŊīŋŊīŋŊnīŋŊ īŋŊjīŋŊtīŋŊ,īŋŊīŋŊīŋŊnīŋŊ īŋŊjīŋŊtīŋŊ,īŋŊīŋŊīŋŊnīŋŊ īŋŊjīŋŊtīŋŊB#XīŋŊcīŋŊ4īŋŊīŋŊ>B#XīŋŊcīŋŊ4īŋŊīŋŊ>B#XīŋŊcīŋŊ4īŋŊīŋŊ>B#XīŋŊcīŋŊ4īŋŊīŋŊ>īŋŊÕž5gdīŋŊdīŋŊaīŋŊīŋŊÕž5gdīŋŊdīŋŊaīŋŊīŋŊÕž5gdīŋŊdīŋŊaīŋŊīŋŊÕž5gdīŋŊdīŋŊaīŋŊmSGīŋŊxÕžsīŋŊ>mSGīŋŊxÕžsīŋŊ>mSGīŋŊxÕžsīŋŊ>mSGīŋŊxÕžsīŋŊ> īŋŊīŋŊ?īŋŊīŋŊīŋŊeīŋŊEīŋŊ īŋŊīŋŊ?īŋŊīŋŊīŋŊeīŋŊEīŋŊ īŋŊīŋŊ?īŋŊīŋŊīŋŊeīŋŊEīŋŊ īŋŊīŋŊ?īŋŊīŋŊīŋŊeīŋŊEīŋŊīŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!?īŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!īŋŊīŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!īŋŊīŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!īŋŊīŋŊīŋŊ.īŋŊīŋŊîēžīŋŊīŋŊ!īŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊkīŋŊE?īŋŊīŋŊ1īŋŊīŋŊīŋŊkīŋŊE?īŋŊīŋŊ1īŋŊīŋŊīŋŊkīŋŊE?īŋŊīŋŊ1īŋŊīŋŊīŋŊkīŋŊE?kSGīŋŊtÕž+sīŋŊkSGīŋŊtÕž+sīŋŊkSGīŋŊtÕž+sīŋŊkSGīŋŊtÕž+sīŋŊīŋŊÕž0gdīŋŊdīŋŊa?īŋŊÕž0gdīŋŊdīŋŊa?īŋŊÕž0gdīŋŊdīŋŊa?īŋŊÕž0gdīŋŊdīŋŊa?B#XīŋŊcīŋŊ2īŋŊīŋŊīŋŊB#XīŋŊcīŋŊ2īŋŊīŋŊīŋŊB#XīŋŊcīŋŊ2īŋŊīŋŊīŋŊB#XīŋŊcīŋŊ2īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊeīŋŊ īŋŊqīŋŊt?īŋŊīŋŊīŋŊeīŋŊ īŋŊqīŋŊt?īŋŊīŋŊīŋŊeīŋŊ īŋŊqīŋŊt?īŋŊīŋŊīŋŊeīŋŊ īŋŊqīŋŊt?īŋŊDīŋŊkīŋŊīŋŊīŋŊīŋŊīŋŊ!?īŋŊDīŋŊkīŋŊīŋŊīŋŊīŋŊīŋŊ!?īŋŊDīŋŊkīŋŊīŋŊīŋŊīŋŊīŋŊ!?īŋŊDīŋŊkīŋŊīŋŊīŋŊīŋŊīŋŊ!?īŋŊDīŋŊlīŋŊīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊDīŋŊlīŋŊīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊDīŋŊlīŋŊīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊDīŋŊlīŋŊīŋŊīŋŊīŋŊīŋŊ!īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊΞkīŋŊE?īŋŊīŋŊīŋŊīŋŊīŋŊΞkīŋŊE?īŋŊīŋŊīŋŊīŋŊīŋŊΞkīŋŊE?īŋŊīŋŊīŋŊīŋŊīŋŊΞkīŋŊE?īŋŊ.īŋŊīŋŊaīŋŊ-sīŋŊīŋŊ.īŋŊīŋŊaīŋŊ-sīŋŊīŋŊ.īŋŊīŋŊaīŋŊ-sīŋŊīŋŊ.īŋŊīŋŊaīŋŊ-sīŋŊkEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊbīŋŊa?kEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊbīŋŊa?kEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊbīŋŊa?kEīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊbīŋŊa?Hr=īŋŊvyīŋŊ8īŋŊīŋŊīŋŊHr=īŋŊvyīŋŊ8īŋŊīŋŊīŋŊHr=īŋŊvyīŋŊ8īŋŊīŋŊīŋŊHr=īŋŊvyīŋŊ8īŋŊīŋŊīŋŊ
+īŋŊ<īŋŊīŋŊīŋŊ>kīŋŊtīŋŊ
+īŋŊ<īŋŊīŋŊīŋŊ>kīŋŊtīŋŊ
+īŋŊ<īŋŊīŋŊīŋŊ>kīŋŊtīŋŊ
+īŋŊ<īŋŊīŋŊīŋŊ>kīŋŊtīŋŊ=,īŋŊ=aīŋŊs?īŋŊīŋŊ>=,īŋŊ=aīŋŊs?īŋŊīŋŊ>=,īŋŊ=aīŋŊs?īŋŊīŋŊ>=,īŋŊ=aīŋŊs?īŋŊīŋŊ>īŋŊīŋŊ==oīŋŊ>fīŋŊaīŋŊīŋŊīŋŊ==oīŋŊ>fīŋŊaīŋŊīŋŊīŋŊ==oīŋŊ>fīŋŊaīŋŊīŋŊīŋŊ==oīŋŊ>fīŋŊaīŋŊ
+īŋŊ#īŋŊīŋŊCīŋŊ}>īŋŊ:īŋŊ īŋŊīŋŊīŋŊ0īŋŊīŋŊ:īŋŊ īŋŊīŋŊīŋŊīŋŊ9īŋŊīŋŊīŋŊ:īŋŊ īŋŊ
+īŋŊC:n>īŋŊ:īŋŊ īŋŊPĐ´īŋŊ4Đ´:īŋŊ īŋŊuīŋŊīŋŊ0N Íą
+īŋŊ#īŋŊKīŋŊÔēbīŋŊ:īŋŊ īŋŊīŋŊ>īŋŊīŋŊC:īŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊ8īŋŊīŋŊ9īŋŊ īŋŊuīŋŊīŋŊ0N Íą
+īŋŊ#īŋŊīŋŊīŋŊīŋŊīŋŊfv`īŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊĮšīŋŊ īŋŊīŋŊ>īŋŊPīŋŊCīŋŊīŋŊ īŋŊuīŋŊīŋŊ0N Íą
+īŋŊ#īŋŊFīŋŊÔēīŋŊīŋŊīŋŊīŋŊ īŋŊJĐ´īŋŊgĐ´īŋŊīŋŊ īŋŊyīŋŊīŋŊaīŋŊÔēīŋŊ īŋŊuīŋŊīŋŊ0N Íą
+īŋŊ#īŋŊīŋŊCīŋŊīŋŊ>īŋŊīŋŊ īŋŊīŋŊīŋŊĮšīŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊ
+īŋŊīŋŊ.īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊuīŋŊīŋŊ0N Íą
+īŋŊ#īŋŊīŋŊīŋŊīŋŊ9īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊC:īŋŊ>īŋŊīŋŊ īŋŊwīŋŊ:\īŋŊÔēīŋŊ īŋŊuīŋŊīŋŊ0N Íą
+īŋŊ#īŋŊFĐ´:aĐ´īŋŊīŋŊ īŋŊ@īŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊ>īŋŊ:FīŋŊCīŋŊīŋŊ īŋŊuīŋŊīŋŊ0N Íą
+īŋŊ#īŋŊīŋŊīŋŊīŋŊ:
+īŋŊĮšīŋŊ īŋŊ~īŋŊīŋŊ:īŋŊ8VīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊ:2īŋŊīŋŊ9īŋŊ īŋŊuīŋŊīŋŊ0N Íą
+īŋŊ#īŋŊīŋŊ>īŋŊ:ØĩC:īŋŊ īŋŊ=īŋŊīŋŊ:YīŋŊ:īŋŊ īŋŊBĐ´:)Đ´:īŋŊ īŋŊuīŋŊīŋŊ0N Íą
+īŋŊ#īŋŊsīŋŊ:"īŋŊīŋŊ:īŋŊ īŋŊ
+īŋŊ#<īŋŊīŋŊĮšīŋŊīŋŊīŋŊ:īŋŊ <īŋŊv&īŋŊPīŋŊīŋŊ:īŋŊ < īŋŊCīŋŊi>īŋŊ:īŋŊ <rīŋŊīŋŊ īŋŊīŋŊ:īŋŊ <īŋŊīŋŊīŋŊ9~īŋŊīŋŊ:īŋŊ <īŋŊīŋŊC:]>īŋŊ:īŋŊ <
+īŋŊ#<@Đ´īŋŊ&Đ´:īŋŊ <9īŋŊÔēWīŋŊ:īŋŊ <īŋŊ>īŋŊÕĩC:īŋŊ <
+īŋŊ#<īŋŊīŋŊīŋŊīŋŊ.īŋŊīŋŊ9īŋŊ <wīŋŊīŋŊīŋŊīŋŊīŋŊSīŋŊīŋŊ <īŋŊīŋŊīŋŊīŋŊīŋŊĮšīŋŊ <
+īŋŊ#<īŋŊ>īŋŊ>īŋŊCīŋŊīŋŊ <7īŋŊÔēīŋŊīŋŊīŋŊīŋŊ <=Đ´īŋŊYĐ´īŋŊīŋŊ <
+īŋŊ#<pīŋŊīŋŊRīŋŊÔēīŋŊ < īŋŊCīŋŊīŋŊ>īŋŊīŋŊ <īŋŊīŋŊĮšīŋŊīŋŊīŋŊīŋŊīŋŊ <
+īŋŊ#<
+U.īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ <īŋŊīŋŊīŋŊ9īŋŊīŋŊīŋŊīŋŊīŋŊ <īŋŊC:īŋŊ>īŋŊīŋŊ <
+īŋŊ#<līŋŊ:LīŋŊÔēīŋŊ <8Đ´:TĐ´īŋŊīŋŊ <0īŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ <
+īŋŊ#<x>īŋŊ:7īŋŊCīŋŊīŋŊ <īŋŊīŋŊīŋŊ:īŋŊīŋŊĮšīŋŊ <līŋŊīŋŊ:RīŋŊXīŋŊīŋŊ <
+īŋŊ#<īŋŊīŋŊīŋŊ:"īŋŊīŋŊ9īŋŊ <x>īŋŊ:ĘĩC:īŋŊ </īŋŊīŋŊ:OīŋŊ:īŋŊ <
+īŋŊ#<7Đ´:Đ´:īŋŊ <jīŋŊ:īŋŊīŋŊ:īŋŊ <īŋŊīŋŊ0īŋŊīŋŊ <iīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<iīŋŊīŋŊ:xīŋŊīŋŊīŋŊīŋŊ <īŋŊOīŋŊ@ ;īŋŊīŋŊ#<īŋŊOīŋŊīŋŊWīŋŊīŋŊīŋŊz;P^īŋŊīŋŊCīŋŊīŋŊīŋŊu;P^īŋŊīŋŊīŋŊĮšīŋŊīŋŊīŋŊ:īŋŊ īŋŊīŋŊίaīŋŊīŋŊ:īŋŊ īŋŊ[īŋŊ.īŋŊK^<īŋŊīŋŊz;īŋŊ>ėēŊu<īŋŊīŋŊz;īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<iīŋŊīŋŊ:īŋŊīŋŊ0īŋŊīŋŊ <iīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<iīŋŊīŋŊ:īŋŊīŋŊuīŋŊīŋŊu<iīŋŊīŋŊ:īŋŊīŋŊzīŋŊP^<īŋŊOīŋŊxīŋŊīŋŊīŋŊīŋŊ <īŋŊOīŋŊīŋŊCīŋŊīŋŊīŋŊu;P^īŋŊ^īŋŊkīŋŊg;P^īŋŊīŋŊCīŋŊ}>īŋŊ:īŋŊ īŋŊīŋŊīŋŊĮšīŋŊīŋŊīŋŊ:īŋŊ īŋŊīŋŊ>ėēŊu<īŋŊīŋŊz;oīŋŊgīŋŊīŋŊīŋŊ <īŋŊīŋŊz;īŋŊīŋŊuīŋŊīŋŊu<iīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<iīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊ;]:īŋŊīŋŊU īŋŊ
+1īŋŊ;]:īŋŊ^īŋŊkīŋŊg;P^īŋŊīŋŊCīŋŊīŋŊīŋŊu;P^īŋŊ;īŋŊÔēCīŋŊ<īŋŊ īŋŊ;bīŋŊPīŋŊjīŋŊīŋŊ;īŋŊ īŋŊ;oīŋŊgīŋŊīŋŊīŋŊ <īŋŊīŋŊz;īŋŊ>ėēŊu<īŋŊīŋŊz;AĐ´īŋŊīŋŊ@īŋŊ;jīŋŊīŋŊīŋŊV1īŋŊ7īŋŊ;jīŋŊįģĨU īŋŊ
+1īŋŊ;]:īŋŊuīŋŊīŋŊīŋŊīŋŊ;]:īŋŊAĐ´īŋŊīŋŊ@īŋŊ;jīŋŊīŋŊ;īŋŊV1īŋŊ7īŋŊ;jīŋŊīŋŊ;bīŋŊPīŋŊjīŋŊīŋŊ;īŋŊ īŋŊ;;īŋŊÔēCīŋŊ<īŋŊ īŋŊ;;īŋŊÔēCīŋŊ<īŋŊ īŋŊīŋŊbīŋŊPīŋŊjīŋŊīŋŊ;īŋŊ īŋŊīŋŊīŋŊV1īŋŊ7īŋŊ;jīŋŊīŋŊAĐ´īŋŊīŋŊ@īŋŊ;jīŋŊīŋŊtīŋŊīŋŊīŋŊīŋŊ;]:<īŋŊU īŋŊ 1īŋŊ;]:<īŋŊV1īŋŊ7īŋŊ;jīŋŊīŋŊ;AĐ´īŋŊīŋŊ@īŋŊ;jīŋŊīŋŊ;īŋŊ>ėēŊu<īŋŊīŋŊzīŋŊnīŋŊgīŋŊīŋŊīŋŊ <īŋŊīŋŊzīŋŊbīŋŊPīŋŊjīŋŊīŋŊ;īŋŊ īŋŊīŋŊ;īŋŊÔēCīŋŊ<īŋŊ īŋŊīŋŊ īŋŊCīŋŊīŋŊīŋŊu;R^<YīŋŊdīŋŊg;R^<īŋŊU īŋŊ 1īŋŊ;]:<tīŋŊīŋŊīŋŊīŋŊ;]:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<uīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊu<uīŋŊīŋŊīŋŊnīŋŊgīŋŊīŋŊīŋŊ <īŋŊīŋŊzīŋŊīŋŊ>ėēŊu<īŋŊīŋŊzīŋŊīŋŊīŋŊĮšīŋŊīŋŊīŋŊ:īŋŊ < īŋŊCīŋŊi>īŋŊ:īŋŊ <YīŋŊdīŋŊg;R^< īŋŊCīŋŊīŋŊīŋŊu;R^<xīŋŊīŋŊīŋŊīŋŊ <īŋŊOīŋŊīŋŊīŋŊzīŋŊP^<īŋŊOīŋŊīŋŊīŋŊuīŋŊīŋŊu<uīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ<uīŋŊīŋŊīŋŊīŋŊU īŋŊ 1īŋŊ;]:<JHJīŋŊN^īŋŊ;]:<sīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊ;īŋŊV1īŋŊ7īŋŊ;jīŋŊīŋŊ;nīŋŊgīŋŊīŋŊīŋŊ <īŋŊīŋŊzīŋŊ1īŋŊīŋŊiīŋŊīŋŊ;īŋŊīŋŊzīŋŊT^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊ īŋŊīŋŊbīŋŊPīŋŊjīŋŊīŋŊ;īŋŊ īŋŊīŋŊYīŋŊdīŋŊg;R^<īŋŊU īŋŊUīŋŊP;R^<JHJīŋŊN^īŋŊ;]:<īŋŊU īŋŊ 1īŋŊ;]:<īŋŊīŋŊuīŋŊīŋŊu<uīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊAīŋŊ<uīŋŊīŋŊīŋŊ1īŋŊīŋŊiīŋŊīŋŊ;īŋŊīŋŊzīŋŊnīŋŊgīŋŊīŋŊīŋŊ <īŋŊīŋŊzīŋŊ īŋŊCīŋŊi>īŋŊ:īŋŊ <rīŋŊīŋŊ īŋŊīŋŊ:īŋŊ <īŋŊU īŋŊUīŋŊP;R^<YīŋŊdīŋŊg;R^<īŋŊīŋŊzīŋŊP^<īŋŊOīŋŊīŋŊ īŋŊīŋŊ[:<īŋŊOīŋŊ īŋŊīŋŊīŋŊAīŋŊ<uīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊu<uīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊu<iīŋŊīŋŊ: īŋŊīŋŊīŋŊAīŋŊ<iīŋŊīŋŊ:īŋŊ īŋŊīŋŊ[:<īŋŊOīŋŊīŋŊīŋŊzīŋŊP^<īŋŊOīŋŊ^īŋŊkīŋŊg;P^īŋŊīŋŊU īŋŊ\īŋŊP;P^īŋŊīŋŊīŋŊ0īŋŊīŋŊ:īŋŊ īŋŊīŋŊCīŋŊ}>īŋŊ:īŋŊ īŋŊoīŋŊgīŋŊīŋŊīŋŊ <īŋŊīŋŊz;1īŋŊīŋŊjīŋŊīŋŊ;īŋŊīŋŊz; īŋŊīŋŊīŋŊAīŋŊ<iīŋŊīŋŊ:īŋŊīŋŊuīŋŊīŋŊu<iīŋŊīŋŊ:īŋŊU īŋŊ
+1īŋŊ;]:īŋŊKHJīŋŊO^īŋŊ;]:īŋŊīŋŊU īŋŊ\īŋŊP;P^īŋŊ^īŋŊkīŋŊg;P^īŋŊbīŋŊPīŋŊjīŋŊīŋŊ;īŋŊ īŋŊ;T^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊ īŋŊ;1īŋŊīŋŊjīŋŊīŋŊ;īŋŊīŋŊz;oīŋŊgīŋŊīŋŊīŋŊ <īŋŊīŋŊz;īŋŊV1īŋŊ7īŋŊ;jīŋŊīŋŊsīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊKHJīŋŊO^īŋŊ;]:īŋŊīŋŊU īŋŊ
+1īŋŊ;]:īŋŊīŋŊV1īŋŊ7īŋŊ;jīŋŊīŋŊ;sīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊ;T^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊ īŋŊ;bīŋŊPīŋŊjīŋŊīŋŊ;īŋŊ īŋŊ;bīŋŊPīŋŊjīŋŊīŋŊ;īŋŊ īŋŊīŋŊT^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊ īŋŊīŋŊsīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊīŋŊV1īŋŊ7īŋŊ;jīŋŊīŋŊ1īŋŊīŋŊjīŋŊīŋŊ;īŋŊīŋŊz;<Öģ7īŋŊ;īŋŊīŋŊz;īŋŊ@ãģĻ@īŋŊ;iīŋŊīŋŊ: īŋŊīŋŊīŋŊAīŋŊ<iīŋŊīŋŊ:KHJīŋŊO^īŋŊ;]:īŋŊtīŋŊīŋŊīŋŊmīŋŊīŋŊ;]:īŋŊīŋŊV1īŋŊīŋŊV1;P^īŋŊīŋŊU īŋŊ\īŋŊP;P^īŋŊT^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊ īŋŊ;ЧīŋŊīŋŊɧīŋŊ;īŋŊ īŋŊ;<Öģ7īŋŊ;īŋŊīŋŊz;1īŋŊīŋŊjīŋŊīŋŊ;īŋŊīŋŊz;sīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊ×ŖīŋŊ×Ŗ;jīŋŊīŋŊtīŋŊīŋŊīŋŊmīŋŊīŋŊ;]:īŋŊKHJīŋŊO^īŋŊ;]:īŋŊsīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊ;×ŖīŋŊ×Ŗ;jīŋŊīŋŊ;ЧīŋŊīŋŊɧīŋŊ;īŋŊ īŋŊ;T^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊ īŋŊ;T^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊ īŋŊīŋŊЧīŋŊīŋŊɧīŋŊ;īŋŊ īŋŊīŋŊ×ŖīŋŊ×Ŗ;jīŋŊīŋŊsīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊJHJīŋŊN^īŋŊ;]:<sīŋŊīŋŊīŋŊkīŋŊīŋŊ;]:<×ŖīŋŊ×Ŗ;jīŋŊīŋŊ;sīŋŊīŋŊīŋŊʧīŋŊ;jīŋŊīŋŊ;1īŋŊīŋŊiīŋŊīŋŊ;īŋŊīŋŊzīŋŊ<Öģ5īŋŊ;īŋŊīŋŊzīŋŊЧīŋŊīŋŊɧīŋŊ;īŋŊ īŋŊīŋŊT^īŋŊīŋŊīŋŊīŋŊīŋŊ;īŋŊ īŋŊīŋŊīŋŊU īŋŊUīŋŊP;R^<īŋŊV1īŋŊīŋŊV1;R^<sīŋŊīŋŊīŋŊkīŋŊīŋŊ;]:<JHJīŋŊN^īŋŊ;]:< īŋŊīŋŊīŋŊAīŋŊ<uīŋŊīŋŊīŋŊīŋŊ@ãģĻ@īŋŊ;uīŋŊīŋŊīŋŊ<Öģ5īŋŊ;īŋŊīŋŊzīŋŊ1īŋŊīŋŊiīŋŊīŋŊ;īŋŊīŋŊzīŋŊrīŋŊīŋŊ īŋŊīŋŊ:īŋŊ <@Đ´īŋŊ&Đ´:īŋŊ <īŋŊV1īŋŊīŋŊV1;R^<īŋŊU īŋŊUīŋŊP;R^<īŋŊ īŋŊīŋŊ[:<īŋŊOīŋŊoīŋŊīŋŊfīŋŊīŋŊ;īŋŊOīŋŊīŋŊ@ãģĻ@īŋŊ;uīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊAīŋŊ<uīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊAīŋŊ<iīŋŊīŋŊ:īŋŊ@ãģĻ@īŋŊ;iīŋŊīŋŊ:oīŋŊīŋŊfīŋŊīŋŊ;īŋŊOīŋŊīŋŊ īŋŊīŋŊ[:<īŋŊOīŋŊīŋŊU īŋŊ\īŋŊP;P^īŋŊīŋŊV1īŋŊīŋŊV1;P^īŋŊPĐ´īŋŊ4Đ´:īŋŊ īŋŊīŋŊīŋŊ0īŋŊīŋŊ:īŋŊ īŋŊīŋŊV1īŋŊīŋŊV1;R^<dīŋŊPīŋŊīŋŊU ;R^<T^īŋŊīŋŊ;HJ;]:<sīŋŊīŋŊīŋŊkīŋŊīŋŊ;]:<īŋŊ@ãģĻ@īŋŊ;uīŋŊīŋŊīŋŊDīŋŊīŋŊīŋŊīŋŊ;uīŋŊīŋŊīŋŊoīŋŊīŋŊīŋŊ1īŋŊ;īŋŊīŋŊzīŋŊ<Öģ5īŋŊ;īŋŊīŋŊzīŋŊ@Đ´īŋŊ&Đ´:īŋŊ <9īŋŊÔēWīŋŊ:īŋŊ <dīŋŊPīŋŊīŋŊU ;R^<īŋŊV1īŋŊīŋŊV1;R^<oīŋŊīŋŊfīŋŊīŋŊ;īŋŊOīŋŊ_:īŋŊīŋŊ īŋŊ;īŋŊOīŋŊDīŋŊīŋŊīŋŊīŋŊ;uīŋŊīŋŊīŋŊīŋŊ@ãģĻ@īŋŊ;uīŋŊīŋŊīŋŊīŋŊ@ãģĻ@īŋŊ;iīŋŊīŋŊ:DīŋŊīŋŊīŋŊīŋŊ;iīŋŊīŋŊ:_:īŋŊīŋŊ īŋŊ;īŋŊOīŋŊoīŋŊīŋŊfīŋŊīŋŊ;īŋŊOīŋŊīŋŊV1īŋŊīŋŊV1;P^īŋŊiīŋŊPīŋŊīŋŊU ;P^īŋŊKīŋŊÔēbīŋŊ:īŋŊ īŋŊPĐ´īŋŊ4Đ´:īŋŊ īŋŊ<Öģ7īŋŊ;īŋŊīŋŊz;oīŋŊīŋŊīŋŊ 1īŋŊ;īŋŊīŋŊz;DīŋŊīŋŊīŋŊīŋŊ;iīŋŊīŋŊ:īŋŊ@ãģĻ@īŋŊ;iīŋŊīŋŊ:tīŋŊīŋŊīŋŊmīŋŊīŋŊ;]:īŋŊV^īŋŊīŋŊ=HJ;]:īŋŊiīŋŊPīŋŊīŋŊU ;P^īŋŊīŋŊV1īŋŊīŋŊV1;P^īŋŊЧīŋŊīŋŊɧīŋŊ;īŋŊ īŋŊ;īŋŊīŋŊīŋŊM^īŋŊ;īŋŊ īŋŊ;oīŋŊīŋŊīŋŊ 1īŋŊ;īŋŊīŋŊz;<Öģ7īŋŊ;īŋŊīŋŊz;×ŖīŋŊ×Ŗ;jīŋŊīŋŊЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊV^īŋŊīŋŊ=HJ;]:īŋŊtīŋŊīŋŊīŋŊmīŋŊīŋŊ;]:īŋŊ×ŖīŋŊ×Ŗ;jīŋŊīŋŊ;ЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊ;īŋŊīŋŊīŋŊM^īŋŊ;īŋŊ īŋŊ;ЧīŋŊīŋŊɧīŋŊ;īŋŊ īŋŊ;ЧīŋŊīŋŊɧīŋŊ;īŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊM^īŋŊ;īŋŊ īŋŊīŋŊЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊ×ŖīŋŊ×Ŗ;jīŋŊīŋŊsīŋŊīŋŊīŋŊkīŋŊīŋŊ;]:<T^īŋŊīŋŊ;HJ;]:<ЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊ;×ŖīŋŊ×Ŗ;jīŋŊīŋŊ;<Öģ5īŋŊ;īŋŊīŋŊzīŋŊoīŋŊīŋŊīŋŊ1īŋŊ;īŋŊīŋŊzīŋŊīŋŊīŋŊīŋŊM^īŋŊ;īŋŊ īŋŊīŋŊЧīŋŊīŋŊɧīŋŊ;īŋŊ īŋŊīŋŊV^īŋŊīŋŊ=HJ;]:īŋŊ1īŋŊīŋŊīŋŊU ;]:īŋŊwīŋŊgīŋŊDīŋŊ:P^īŋŊiīŋŊPīŋŊīŋŊU ;P^īŋŊīŋŊīŋŊīŋŊM^īŋŊ;īŋŊ īŋŊ;pīŋŊīŋŊīŋŊRīŋŊP;īŋŊ īŋŊ;īŋŊīŋŊ īŋŊdīŋŊg;īŋŊīŋŊz;oīŋŊīŋŊīŋŊ 1īŋŊ;īŋŊīŋŊz;ЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊ=ÖģīŋŊV1;jīŋŊīŋŊ1īŋŊīŋŊīŋŊU ;]:īŋŊV^īŋŊīŋŊ=HJ;]:īŋŊЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊ;=ÖģīŋŊV1;jīŋŊīŋŊ;pīŋŊīŋŊīŋŊRīŋŊP;īŋŊ īŋŊ;īŋŊīŋŊīŋŊM^īŋŊ;īŋŊ īŋŊ;īŋŊīŋŊīŋŊM^īŋŊ;īŋŊ īŋŊīŋŊpīŋŊīŋŊīŋŊRīŋŊP;īŋŊ īŋŊīŋŊ=ÖģīŋŊV1;jīŋŊīŋŊЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊT^īŋŊīŋŊ;HJ;]:<1īŋŊīŋŊīŋŊU ;]:<=ÖģīŋŊV1;jīŋŊīŋŊ;ЧīŋŊīŋŊkīŋŊīŋŊ;jīŋŊīŋŊ;oīŋŊīŋŊīŋŊ1īŋŊ;īŋŊīŋŊzīŋŊīŋŊīŋŊ īŋŊaīŋŊg;īŋŊīŋŊzīŋŊpīŋŊīŋŊīŋŊRīŋŊP;īŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊM^īŋŊ;īŋŊ īŋŊīŋŊdīŋŊPīŋŊīŋŊU ;R^<pīŋŊgīŋŊ@īŋŊ:R^<1īŋŊīŋŊīŋŊU ;]:<T^īŋŊīŋŊ;HJ;]:<DīŋŊīŋŊīŋŊīŋŊ;uīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊu;uīŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊaīŋŊg;īŋŊīŋŊzīŋŊoīŋŊīŋŊīŋŊ1īŋŊ;īŋŊīŋŊzīŋŊ9īŋŊÔēWīŋŊ:īŋŊ <īŋŊ>īŋŊÕĩC:īŋŊ <pīŋŊgīŋŊ@īŋŊ:R^<dīŋŊPīŋŊīŋŊU ;R^<_:īŋŊīŋŊ īŋŊ;īŋŊOīŋŊS^īŋŊīŋŊīŋŊz;īŋŊOīŋŊīŋŊuīŋŊīŋŊīŋŊu;uīŋŊīŋŊīŋŊDīŋŊīŋŊīŋŊīŋŊ;uīŋŊīŋŊīŋŊDīŋŊīŋŊīŋŊīŋŊ;iīŋŊīŋŊ:īŋŊuīŋŊīŋŊīŋŊu;iīŋŊīŋŊ:S^īŋŊīŋŊīŋŊz;īŋŊOīŋŊ_:īŋŊīŋŊ īŋŊ;īŋŊOīŋŊiīŋŊPīŋŊīŋŊU ;P^īŋŊwīŋŊgīŋŊDīŋŊ:P^īŋŊīŋŊ>īŋŊīŋŊC:īŋŊ īŋŊKīŋŊÔēbīŋŊ:īŋŊ īŋŊoīŋŊīŋŊīŋŊ 1īŋŊ;īŋŊīŋŊz;īŋŊīŋŊ īŋŊdīŋŊg;īŋŊīŋŊz;īŋŊuīŋŊīŋŊīŋŊu;iīŋŊīŋŊ:DīŋŊīŋŊīŋŊīŋŊ;iīŋŊīŋŊ:īŋŊuīŋŊīŋŊīŋŊu;uīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊuīŋŊi>īŋŊ:īŋŊīŋŊzīŋŊīŋŊīŋŊ īŋŊaīŋŊg;īŋŊīŋŊzīŋŊīŋŊ>īŋŊÕĩC:īŋŊ <īŋŊīŋŊīŋŊīŋŊ.īŋŊīŋŊ9īŋŊ <īŋŊīŋŊuīŋŊ×ĩC:R^<pīŋŊgīŋŊ@īŋŊ:R^<S^īŋŊīŋŊīŋŊz;īŋŊOīŋŊ īŋŊ īŋŊWīŋŊīŋŊ:īŋŊOīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊu;uīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊu;iīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:iīŋŊīŋŊ: īŋŊ īŋŊWīŋŊīŋŊ:īŋŊOīŋŊS^īŋŊīŋŊīŋŊz;īŋŊOīŋŊwīŋŊgīŋŊDīŋŊ:P^īŋŊīŋŊuīŋŊŲĩC:P^īŋŊīŋŊīŋŊīŋŊīŋŊ8īŋŊīŋŊ9īŋŊ īŋŊīŋŊ>īŋŊīŋŊC:īŋŊ īŋŊīŋŊīŋŊ īŋŊdīŋŊg;īŋŊīŋŊz;īŋŊuīŋŊn>īŋŊ:īŋŊīŋŊz;īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:iīŋŊīŋŊ:īŋŊuīŋŊīŋŊīŋŊu;iīŋŊīŋŊ:1īŋŊīŋŊīŋŊU ;]:īŋŊ"īŋŊīŋŊīŋŊXīŋŊ:]:īŋŊīŋŊuīŋŊŲĩC:P^īŋŊwīŋŊgīŋŊDīŋŊ:P^īŋŊpīŋŊīŋŊīŋŊRīŋŊP;īŋŊ īŋŊ;EīŋŊīŋŊīŋŊīŋŊ:īŋŊ īŋŊ;īŋŊuīŋŊn>īŋŊ:īŋŊīŋŊz;īŋŊīŋŊ īŋŊdīŋŊg;īŋŊīŋŊz;=ÖģīŋŊV1;jīŋŊįģ¯@īŋŊ%Đ´:jīŋŊīŋŊ"īŋŊīŋŊīŋŊXīŋŊ:]:īŋŊ1īŋŊīŋŊīŋŊU ;]:īŋŊ=ÖģīŋŊV1;jīŋŊīŋŊ;īŋŊ@īŋŊ%Đ´:jīŋŊīŋŊ;EīŋŊīŋŊīŋŊīŋŊ:īŋŊ īŋŊ;pīŋŊīŋŊīŋŊRīŋŊP;īŋŊ īŋŊ;pīŋŊīŋŊīŋŊRīŋŊP;īŋŊ īŋŊīŋŊEīŋŊīŋŊīŋŊīŋŊ:īŋŊ īŋŊīŋŊīŋŊ@īŋŊ%Đ´:jīŋŊīŋŊ=ÖģīŋŊV1;jīŋŊīŋŊ1īŋŊīŋŊīŋŊU ;]:<!īŋŊīŋŊīŋŊTīŋŊ:]:<īŋŊ@īŋŊ%Đ´:jīŋŊīŋŊ;=ÖģīŋŊV1;jīŋŊīŋŊ;īŋŊīŋŊ īŋŊaīŋŊg;īŋŊīŋŊzīŋŊīŋŊuīŋŊi>īŋŊ:īŋŊīŋŊzīŋŊEīŋŊīŋŊīŋŊīŋŊ:īŋŊ īŋŊīŋŊpīŋŊīŋŊīŋŊRīŋŊP;īŋŊ īŋŊīŋŊpīŋŊgīŋŊ@īŋŊ:R^<īŋŊīŋŊuīŋŊ×ĩC:R^<!īŋŊīŋŊīŋŊTīŋŊ:]:<1īŋŊīŋŊīŋŊU ;]:<EīŋŊīŋŊīŋŊīŋŊ:īŋŊ īŋŊ;_:īŋŊīŋŊeīŋŊīŋŊ īŋŊ;R^īŋŊ
+īŋŊīŋŊīŋŊīŋŊz;īŋŊuīŋŊn>īŋŊ:īŋŊīŋŊz;īŋŊ@īŋŊ%Đ´:jīŋŊīŋŊnīŋŊįģŽW[īŋŊjīŋŊįģĄ īŋŊīŋŊīŋŊ8VīŋŊ]:īŋŊ"īŋŊīŋŊīŋŊXīŋŊ:]:īŋŊīŋŊ@īŋŊ%Đ´:jīŋŊīŋŊ;nīŋŊįģŽW[īŋŊjīŋŊīŋŊ;_:īŋŊīŋŊeīŋŊīŋŊ īŋŊ;EīŋŊīŋŊīŋŊīŋŊ:īŋŊ īŋŊ;EīŋŊīŋŊīŋŊīŋŊ:īŋŊ īŋŊīŋŊ_:īŋŊīŋŊeīŋŊīŋŊ īŋŊīŋŊnīŋŊįģŽW[īŋŊjīŋŊįģ¯@īŋŊ%Đ´:jīŋŊīŋŊ!īŋŊīŋŊīŋŊTīŋŊ:]:<īŋŊ īŋŊīŋŊ×ŗjīŋŊ]:<nīŋŊįģŽW[īŋŊjīŋŊīŋŊ;īŋŊ@īŋŊ%Đ´:jīŋŊīŋŊ;īŋŊuīŋŊi>īŋŊ:īŋŊīŋŊzīŋŊR^īŋŊ\īŋŊ<īŋŊīŋŊīŋŊzīŋŊ_:īŋŊīŋŊeīŋŊīŋŊ īŋŊīŋŊEīŋŊīŋŊīŋŊīŋŊ:īŋŊ īŋŊīŋŊīŋŊīŋŊuīŋŊ×ĩC:R^<īŋŊīŋŊzīŋŊ=QīŋŊR^<īŋŊ īŋŊīŋŊ×ŗjīŋŊ]:<!īŋŊīŋŊīŋŊTīŋŊ:]:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊ īŋŊpEīŋŊīŋŊuīŋŊīŋŊīŋŊR^īŋŊ\īŋŊ<īŋŊīŋŊīŋŊzīŋŊīŋŊuīŋŊi>īŋŊ:īŋŊīŋŊzīŋŊīŋŊīŋŊīŋŊīŋŊ.īŋŊīŋŊ9īŋŊ <wīŋŊīŋŊīŋŊīŋŊīŋŊSīŋŊīŋŊ <īŋŊīŋŊzīŋŊ=QīŋŊR^<īŋŊīŋŊuīŋŊ×ĩC:R^< īŋŊ īŋŊWīŋŊīŋŊ:īŋŊOīŋŊ īŋŊ#īŋŊīŋŊ&īŋŊīŋŊīŋŊOīŋŊīŋŊ īŋŊpEīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:iīŋŊīŋŊ:īŋŊ īŋŊpEīŋŊīŋŊiīŋŊīŋŊ: īŋŊ#īŋŊīŋŊ&īŋŊīŋŊīŋŊOīŋŊ īŋŊ īŋŊWīŋŊīŋŊ:īŋŊOīŋŊīŋŊuīŋŊŲĩC:P^īŋŊīŋŊīŋŊzīŋŊīŋŊW[īŋŊP^īŋŊīŋŊīŋŊīŋŊīŋŊfv`īŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊ8īŋŊīŋŊ9īŋŊ īŋŊīŋŊuīŋŊn>īŋŊ:īŋŊīŋŊz;R^īŋŊ
+īŋŊīŋŊīŋŊīŋŊz;īŋŊ īŋŊpEīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:iīŋŊīŋŊ:"īŋŊīŋŊīŋŊXīŋŊ:]:īŋŊīŋŊ īŋŊīŋŊīŋŊ8VīŋŊ]:īŋŊīŋŊīŋŊzīŋŊīŋŊW[īŋŊP^īŋŊīŋŊuīŋŊŲĩC:P^īŋŊwīŋŊīŋŊīŋŊīŋŊīŋŊSīŋŊīŋŊ <īŋŊīŋŊīŋŊīŋŊīŋŊĮšīŋŊ <īŋŊīŋŊuīŋŊ>īŋŊCīŋŊR^<īŋŊīŋŊzīŋŊ=QīŋŊR^< īŋŊ#īŋŊīŋŊ&īŋŊīŋŊīŋŊOīŋŊ īŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ īŋŊpEīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ īŋŊpEīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ: īŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊ īŋŊ#īŋŊīŋŊ&īŋŊīŋŊīŋŊOīŋŊīŋŊīŋŊzīŋŊīŋŊW[īŋŊP^īŋŊīŋŊuīŋŊFīŋŊCīŋŊP^īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊĮšīŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊfv`īŋŊīŋŊ īŋŊR^īŋŊ
+īŋŊīŋŊīŋŊīŋŊz;īŋŊuīŋŊīŋŊ>ėē™īŋŊz;īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊ īŋŊpEīŋŊīŋŊiīŋŊīŋŊ:īŋŊ īŋŊīŋŊīŋŊ8VīŋŊ]:īŋŊ"īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:īŋŊīŋŊuīŋŊFīŋŊCīŋŊP^īŋŊīŋŊīŋŊzīŋŊīŋŊW[īŋŊP^īŋŊ_:īŋŊīŋŊeīŋŊīŋŊ īŋŊ;DīŋŊīŋŊSīŋŊÔēīŋŊ īŋŊ;īŋŊuīŋŊīŋŊ>ėē™īŋŊz;R^īŋŊ
+īŋŊīŋŊīŋŊīŋŊz;nīŋŊįģŽW[īŋŊjīŋŊįģŽ@īŋŊYĐ´īŋŊjīŋŊīŋŊ"īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:īŋŊīŋŊ īŋŊīŋŊīŋŊ8VīŋŊ]:īŋŊnīŋŊįģŽW[īŋŊjīŋŊīŋŊ;īŋŊ@īŋŊYĐ´īŋŊjīŋŊīŋŊ;DīŋŊīŋŊSīŋŊÔēīŋŊ īŋŊ;_:īŋŊīŋŊeīŋŊīŋŊ īŋŊ;_:īŋŊīŋŊeīŋŊīŋŊ īŋŊīŋŊDīŋŊīŋŊSīŋŊÔēīŋŊ īŋŊīŋŊīŋŊ@īŋŊYĐ´īŋŊjīŋŊīŋŊnīŋŊįģŽW[īŋŊjīŋŊįģž īŋŊīŋŊ×ŗjīŋŊ]:< īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:<īŋŊ@īŋŊYĐ´īŋŊjīŋŊīŋŊ;nīŋŊįģŽW[īŋŊjīŋŊīŋŊ;R^īŋŊ\īŋŊ<īŋŊīŋŊīŋŊzīŋŊīŋŊuīŋŊīŋŊ>ėē īŋŊzīŋŊDīŋŊīŋŊSīŋŊÔēīŋŊ īŋŊīŋŊ_:īŋŊīŋŊeīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊzīŋŊ=QīŋŊR^<īŋŊīŋŊuīŋŊ>īŋŊCīŋŊR^< īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:<īŋŊ īŋŊīŋŊ×ŗjīŋŊ]:<īŋŊ īŋŊpEīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊ>ėē īŋŊzīŋŊR^īŋŊ\īŋŊ<īŋŊīŋŊīŋŊzīŋŊīŋŊ@īŋŊYĐ´īŋŊjīŋŊīŋŊ<ÖģīŋŊV1īŋŊjīŋŊīŋŊ1īŋŊīŋŊīŋŊU īŋŊ]:īŋŊ"īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:īŋŊīŋŊ@īŋŊYĐ´īŋŊjīŋŊīŋŊ;<ÖģīŋŊV1īŋŊjīŋŊīŋŊ;līŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊ īŋŊ;DīŋŊīŋŊSīŋŊÔēīŋŊ īŋŊ;DīŋŊīŋŊSīŋŊÔēīŋŊ īŋŊīŋŊlīŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊ īŋŊīŋŊ<ÖģīŋŊV1īŋŊjīŋŊįģŽ@īŋŊYĐ´īŋŊjīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:< 1īŋŊīŋŊīŋŊU īŋŊ]:<<ÖģīŋŊV1īŋŊjīŋŊīŋŊ;īŋŊ@īŋŊYĐ´īŋŊjīŋŊīŋŊ;īŋŊuīŋŊīŋŊ>ėē īŋŊzīŋŊīŋŊīŋŊ īŋŊxīŋŊgīŋŊīŋŊīŋŊzīŋŊlīŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊ īŋŊīŋŊDīŋŊīŋŊSīŋŊÔēīŋŊ īŋŊīŋŊīŋŊīŋŊuīŋŊ>īŋŊCīŋŊR^<nīŋŊgīŋŊrīŋŊR^< 1īŋŊīŋŊīŋŊU īŋŊ]:< īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊxīŋŊgīŋŊīŋŊīŋŊzīŋŊīŋŊuīŋŊīŋŊ>ėē īŋŊzīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊĮšīŋŊ <īŋŊ>īŋŊ>īŋŊCīŋŊīŋŊ <nīŋŊgīŋŊrīŋŊR^<īŋŊīŋŊuīŋŊ>īŋŊCīŋŊR^< īŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊR^īŋŊīŋŊīŋŊzīŋŊīŋŊOīŋŊīŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:R^īŋŊīŋŊīŋŊzīŋŊīŋŊOīŋŊ īŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊuīŋŊFīŋŊCīŋŊP^īŋŊtīŋŊgīŋŊwīŋŊP^īŋŊīŋŊ>īŋŊPīŋŊCīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊĮšīŋŊ īŋŊīŋŊuīŋŊīŋŊ>ėē™īŋŊz;īŋŊīŋŊ īŋŊuīŋŊgīŋŊīŋŊīŋŊz;īŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:"īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ]:īŋŊ1īŋŊīŋŊīŋŊU īŋŊ]:īŋŊtīŋŊgīŋŊwīŋŊP^īŋŊīŋŊuīŋŊFīŋŊCīŋŊP^īŋŊDīŋŊīŋŊSīŋŊÔēīŋŊ īŋŊ;līŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊ īŋŊ;īŋŊīŋŊ īŋŊuīŋŊgīŋŊīŋŊīŋŊz;īŋŊuīŋŊīŋŊ>ėē™īŋŊz;R^īŋŊīŋŊīŋŊzīŋŊīŋŊOīŋŊ^:īŋŊīŋŊ īŋŊīŋŊīŋŊOīŋŊBīŋŊīŋŊ$īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:BīŋŊīŋŊ$īŋŊīŋŊīŋŊiīŋŊīŋŊ:^:īŋŊīŋŊ īŋŊīŋŊīŋŊOīŋŊR^īŋŊīŋŊīŋŊzīŋŊīŋŊOīŋŊtīŋŊgīŋŊwīŋŊP^īŋŊfīŋŊPīŋŊīŋŊU īŋŊP^īŋŊFīŋŊÔēīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊ>īŋŊPīŋŊCīŋŊīŋŊ īŋŊīŋŊīŋŊ īŋŊuīŋŊgīŋŊīŋŊīŋŊz;nīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊz;BīŋŊīŋŊ$īŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:1īŋŊīŋŊīŋŊU īŋŊ]:īŋŊT^īŋŊīŋŊUHJīŋŊ]:īŋŊfīŋŊPīŋŊīŋŊU īŋŊP^īŋŊtīŋŊgīŋŊwīŋŊP^īŋŊlīŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊ īŋŊ;īŋŊīŋŊY^īŋŊīŋŊīŋŊ īŋŊ;nīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊz;īŋŊīŋŊ īŋŊuīŋŊgīŋŊīŋŊīŋŊz;<ÖģīŋŊV1īŋŊjīŋŊīŋŊΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊT^īŋŊīŋŊUHJīŋŊ]:īŋŊ1īŋŊīŋŊīŋŊU īŋŊ]:īŋŊ<ÖģīŋŊV1īŋŊjīŋŊīŋŊ;ΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊ;īŋŊīŋŊY^īŋŊīŋŊīŋŊ īŋŊ;līŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊ īŋŊ;līŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊY^īŋŊīŋŊīŋŊ īŋŊīŋŊΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊ<ÖģīŋŊV1īŋŊjīŋŊīŋŊ 1īŋŊīŋŊīŋŊU īŋŊ]:<R^īŋŊīŋŊTHJīŋŊ]:<ΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊ;<ÖģīŋŊV1īŋŊjīŋŊīŋŊ;īŋŊīŋŊ īŋŊxīŋŊgīŋŊīŋŊīŋŊzīŋŊnīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊzīŋŊīŋŊīŋŊY^īŋŊīŋŊīŋŊ īŋŊīŋŊlīŋŊīŋŊīŋŊnīŋŊPīŋŊīŋŊ īŋŊīŋŊnīŋŊgīŋŊrīŋŊR^<`īŋŊPīŋŊīŋŊU īŋŊR^<R^īŋŊīŋŊTHJīŋŊ]:< 1īŋŊīŋŊīŋŊU īŋŊ]:<īŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊBīŋŊīŋŊ$īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊnīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊzīŋŊīŋŊīŋŊ īŋŊxīŋŊgīŋŊīŋŊīŋŊzīŋŊīŋŊ>īŋŊ>īŋŊCīŋŊīŋŊ <7īŋŊÔēīŋŊīŋŊīŋŊīŋŊ <`īŋŊPīŋŊīŋŊU īŋŊR^<nīŋŊgīŋŊrīŋŊR^<ΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊ; ×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊ;˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊ īŋŊ;īŋŊīŋŊY^īŋŊīŋŊīŋŊ īŋŊ;īŋŊīŋŊY^īŋŊīŋŊīŋŊ īŋŊīŋŊ˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊ īŋŊīŋŊ ×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊR^īŋŊīŋŊTHJīŋŊ]:<pīŋŊīŋŊīŋŊwīŋŊīŋŊīŋŊ]:< ×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊ;ΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊ;nīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊzīŋŊ<Öģ@ÖģīŋŊīŋŊzīŋŊ˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊY^īŋŊīŋŊīŋŊ īŋŊīŋŊ`īŋŊPīŋŊīŋŊU īŋŊR^<īŋŊV1īŋŊīŋŊV1īŋŊR^<pīŋŊīŋŊīŋŊwīŋŊīŋŊīŋŊ]:<R^īŋŊīŋŊTHJīŋŊ]:<BīŋŊīŋŊ$īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ@ãģ°@īŋŊuīŋŊīŋŊīŋŊ<Öģ@ÖģīŋŊīŋŊzīŋŊnīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊzīŋŊ7īŋŊÔēīŋŊīŋŊīŋŊīŋŊ <=Đ´īŋŊYĐ´īŋŊīŋŊ <īŋŊV1īŋŊīŋŊV1īŋŊR^<`īŋŊPīŋŊīŋŊU īŋŊR^<^:īŋŊīŋŊ īŋŊīŋŊīŋŊOīŋŊkīŋŊīŋŊtīŋŊīŋŊīŋŊOīŋŊīŋŊ@ãģ°@īŋŊuīŋŊīŋŊīŋŊBīŋŊīŋŊ$īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊBīŋŊīŋŊ$īŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊ@ãģ°@īŋŊiīŋŊīŋŊ:kīŋŊīŋŊtīŋŊīŋŊīŋŊOīŋŊ^:īŋŊīŋŊ īŋŊīŋŊīŋŊOīŋŊfīŋŊPīŋŊīŋŊU īŋŊP^īŋŊīŋŊV1īŋŊīŋŊV1īŋŊP^īŋŊJĐ´īŋŊgĐ´īŋŊīŋŊ īŋŊFīŋŊÔēīŋŊīŋŊīŋŊīŋŊ īŋŊnīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊz;<Öģ@ÖģīŋŊīŋŊz;īŋŊ@ãģ°@īŋŊiīŋŊīŋŊ:BīŋŊīŋŊ$īŋŊīŋŊīŋŊiīŋŊīŋŊ:T^īŋŊīŋŊUHJīŋŊ]:īŋŊrīŋŊīŋŊīŋŊxīŋŊīŋŊīŋŊ]:īŋŊīŋŊV1īŋŊīŋŊV1īŋŊP^īŋŊfīŋŊPīŋŊīŋŊU īŋŊP^īŋŊīŋŊīŋŊY^īŋŊīŋŊīŋŊ īŋŊ;˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊ īŋŊ;<Öģ@ÖģīŋŊīŋŊz;nīŋŊīŋŊīŋŊ1īŋŊīŋŊīŋŊīŋŊz;ΧīŋŊīŋŊwīŋŊīŋŊīŋŊjīŋŊīŋŊ ×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊrīŋŊīŋŊīŋŊxīŋŊīŋŊīŋŊ]:īŋŊT^īŋŊīŋŊUHJīŋŊ]:īŋŊīŋŊ@ãģ°@īŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊFīŋŊīŋŊiīŋŊīŋŊ:īŋŊ īŋŊīŋŊb:īŋŊīŋŊOīŋŊkīŋŊīŋŊtīŋŊīŋŊīŋŊOīŋŊīŋŊV1īŋŊīŋŊV1īŋŊP^īŋŊīŋŊU īŋŊpīŋŊPīŋŊP^īŋŊyīŋŊīŋŊaīŋŊÔēīŋŊ īŋŊJĐ´īŋŊgĐ´īŋŊīŋŊ īŋŊ<Öģ@ÖģīŋŊīŋŊz;1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊz;īŋŊīŋŊīŋŊFīŋŊīŋŊiīŋŊīŋŊ:īŋŊ@ãģ°@īŋŊiīŋŊīŋŊ:rīŋŊīŋŊīŋŊxīŋŊīŋŊīŋŊ]:īŋŊGHJīŋŊY^īŋŊīŋŊ]:īŋŊīŋŊU īŋŊpīŋŊPīŋŊP^īŋŊīŋŊV1īŋŊīŋŊV1īŋŊP^īŋŊ˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊ īŋŊ;P^īŋŊīŋŊīŋŊīŋŊâģ› īŋŊ;1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊz;<Öģ@ÖģīŋŊīŋŊz; ×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊpīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊGHJīŋŊY^īŋŊīŋŊ]:īŋŊrīŋŊīŋŊīŋŊxīŋŊīŋŊīŋŊ]:īŋŊ ×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊ;pīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊ;P^īŋŊīŋŊīŋŊīŋŊâģ› īŋŊ;˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊ īŋŊ;˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊ īŋŊīŋŊP^īŋŊīŋŊīŋŊīŋŊâģ› īŋŊīŋŊpīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊ ×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊpīŋŊīŋŊīŋŊwīŋŊīŋŊīŋŊ]:<DHJīŋŊX^īŋŊīŋŊ]:<pīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊ; ×ŖīŋŊ×ŖīŋŊjīŋŊīŋŊ;<Öģ@ÖģīŋŊīŋŊzīŋŊ1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊP^īŋŊīŋŊīŋŊīŋŊâģ› īŋŊīŋŊ˧īŋŊīŋŊÔ§īŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊV1īŋŊīŋŊV1īŋŊR^<īŋŊU īŋŊkīŋŊPīŋŊR^<DHJīŋŊX^īŋŊīŋŊ]:<pīŋŊīŋŊīŋŊwīŋŊīŋŊīŋŊ]:<īŋŊ@ãģ°@īŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊFīŋŊīŋŊuīŋŊīŋŊīŋŊ1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊ<Öģ@ÖģīŋŊīŋŊzīŋŊ=Đ´īŋŊYĐ´īŋŊīŋŊ <pīŋŊīŋŊRīŋŊÔēīŋŊ <īŋŊU īŋŊkīŋŊPīŋŊR^<īŋŊV1īŋŊīŋŊV1īŋŊR^<kīŋŊīŋŊtīŋŊīŋŊīŋŊOīŋŊīŋŊ īŋŊīŋŊb:īŋŊīŋŊOīŋŊīŋŊīŋŊīŋŊFīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ@ãģ°@īŋŊuīŋŊīŋŊīŋŊDHJīŋŊX^īŋŊīŋŊ]:<īŋŊU īŋŊ1īŋŊīŋŊ]:<īŋŊV1īŋŊ@ÖģjīŋŊīŋŊ;pīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊ;1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊnīŋŊgīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊzīŋŊYīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊP^īŋŊīŋŊīŋŊīŋŊâģ› īŋŊīŋŊīŋŊU īŋŊkīŋŊPīŋŊR^<TīŋŊxīŋŊgīŋŊR^<īŋŊU īŋŊ1īŋŊīŋŊ]:<DHJīŋŊX^īŋŊīŋŊ]:<īŋŊīŋŊīŋŊFīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊnīŋŊgīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊzīŋŊ1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊpīŋŊīŋŊRīŋŊÔēīŋŊ < īŋŊCīŋŊīŋŊ>īŋŊīŋŊ <TīŋŊxīŋŊgīŋŊR^<īŋŊU īŋŊkīŋŊPīŋŊR^<īŋŊ īŋŊīŋŊb:īŋŊīŋŊOīŋŊīŋŊīŋŊzīŋŊV^īŋŊīŋŊOīŋŊīŋŊīŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊFīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊFīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊzīŋŊV^īŋŊīŋŊOīŋŊīŋŊ īŋŊīŋŊb:īŋŊīŋŊOīŋŊīŋŊU īŋŊpīŋŊPīŋŊP^īŋŊ\īŋŊ}īŋŊgīŋŊP^īŋŊīŋŊCīŋŊīŋŊ>īŋŊīŋŊ īŋŊyīŋŊīŋŊaīŋŊÔēīŋŊ īŋŊ1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊz;nīŋŊgīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊz;īŋŊīŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊFīŋŊīŋŊiīŋŊīŋŊ:GHJīŋŊY^īŋŊīŋŊ]:īŋŊīŋŊU īŋŊ1īŋŊīŋŊ]:īŋŊ\īŋŊ}īŋŊgīŋŊP^īŋŊīŋŊU īŋŊpīŋŊPīŋŊP^īŋŊP^īŋŊīŋŊīŋŊīŋŊâģ› īŋŊ;YīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊ īŋŊ;nīŋŊgīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊz;1īŋŊīŋŊsīŋŊīŋŊīŋŊīŋŊīŋŊz;pīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊīŋŊV1īŋŊ@ÖģjīŋŊįģĸU īŋŊ1īŋŊīŋŊ]:īŋŊGHJīŋŊY^īŋŊīŋŊ]:īŋŊpīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊ;īŋŊV1īŋŊ@ÖģjīŋŊīŋŊ;YīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊ īŋŊ;P^īŋŊīŋŊīŋŊīŋŊâģ› īŋŊ;P^īŋŊīŋŊīŋŊīŋŊâģ› īŋŊīŋŊYīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊV1īŋŊ@ÖģjīŋŊīŋŊpīŋŊīŋŊīŋŊÔ§īŋŊīŋŊjīŋŊīŋŊ\īŋŊ}īŋŊgīŋŊP^īŋŊīŋŊCīŋŊ īŋŊuīŋŊP^īŋŊīŋŊīŋŊĮšīŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊCīŋŊīŋŊ>īŋŊīŋŊ īŋŊnīŋŊgīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊz;īŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊz;īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:īŋŊU īŋŊ1īŋŊīŋŊ]:īŋŊsīŋŊīŋŊ&īŋŊīŋŊīŋŊ]:īŋŊīŋŊCīŋŊ īŋŊuīŋŊP^īŋŊ\īŋŊ}īŋŊgīŋŊP^īŋŊYīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊ īŋŊ;+īŋŊÔēEīŋŊīŋŊīŋŊ īŋŊ;īŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊz;nīŋŊgīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊz;īŋŊV1īŋŊ@ÖģjīŋŊīŋŊ9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊsīŋŊīŋŊ&īŋŊīŋŊīŋŊ]:īŋŊīŋŊU īŋŊ1īŋŊīŋŊ]:īŋŊīŋŊV1īŋŊ@ÖģjīŋŊīŋŊ;9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊ;+īŋŊÔēEīŋŊīŋŊīŋŊ īŋŊ;YīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊ īŋŊ;YīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊ+īŋŊÔēEīŋŊīŋŊīŋŊ īŋŊīŋŊ9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊīŋŊV1īŋŊ@ÖģjīŋŊįģŸU īŋŊ1īŋŊīŋŊ]:<mīŋŊīŋŊ$īŋŊīŋŊīŋŊ]:<9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊ;īŋŊV1īŋŊ@ÖģjīŋŊīŋŊ;nīŋŊgīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊzīŋŊīŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊzīŋŊ+īŋŊÔēEīŋŊīŋŊīŋŊ īŋŊīŋŊYīŋŊPīŋŊrīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊTīŋŊxīŋŊgīŋŊR^<īŋŊCīŋŊīŋŊuīŋŊR^<mīŋŊīŋŊ$īŋŊīŋŊīŋŊ]:<īŋŊU īŋŊ1īŋŊīŋŊ]:<īŋŊīŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊzīŋŊnīŋŊgīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊzīŋŊ īŋŊCīŋŊīŋŊ>īŋŊīŋŊ <īŋŊīŋŊĮšīŋŊīŋŊīŋŊīŋŊīŋŊ <īŋŊCīŋŊīŋŊuīŋŊR^<TīŋŊxīŋŊgīŋŊR^<īŋŊīŋŊzīŋŊV^īŋŊīŋŊOīŋŊlīŋŊīŋŊīŋŊ"īŋŊ īŋŊīŋŊOīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:līŋŊīŋŊīŋŊ"īŋŊ īŋŊīŋŊOīŋŊīŋŊīŋŊzīŋŊV^īŋŊīŋŊOīŋŊīŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊzīŋŊ[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊzīŋŊ>īŋŊj0^:īŋŊīŋŊ īŋŊīŋŊ+īŋŊÔēEīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊCīŋŊīŋŊuīŋŊR^<
+U.īŋŊīŋŊīŋŊzīŋŊR^<īŋŊīŋŊīŋŊ.īŋŊ īŋŊīŋŊ]:<mīŋŊīŋŊ$īŋŊīŋŊīŋŊ]:<īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊ>īŋŊj0īŋŊ īŋŊuīŋŊīŋŊīŋŊ[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊzīŋŊīŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊzīŋŊīŋŊīŋŊĮšīŋŊīŋŊīŋŊīŋŊīŋŊ <
+U.īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ <
+U.īŋŊīŋŊīŋŊzīŋŊR^<īŋŊCīŋŊīŋŊuīŋŊR^<līŋŊīŋŊīŋŊ"īŋŊ īŋŊīŋŊOīŋŊīŋŊīŋŊ0īŋŊ#īŋŊīŋŊOīŋŊ>īŋŊj0īŋŊ īŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:>īŋŊj0īŋŊ īŋŊiīŋŊīŋŊ:īŋŊīŋŊ0īŋŊ#īŋŊīŋŊOīŋŊlīŋŊīŋŊīŋŊ"īŋŊ īŋŊīŋŊOīŋŊīŋŊCīŋŊ īŋŊuīŋŊP^īŋŊnīŋŊâ¯˛īŋŊzīŋŊP^īŋŊ
+īŋŊīŋŊ.īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊĮšīŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊz;[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊz;>īŋŊj0īŋŊ īŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:sīŋŊīŋŊ&īŋŊīŋŊīŋŊ]:īŋŊé̐īŋŊīŋŊ īŋŊīŋŊ]:īŋŊnīŋŊâ¯˛īŋŊzīŋŊP^īŋŊīŋŊCīŋŊ īŋŊuīŋŊP^īŋŊ+īŋŊÔēEīŋŊīŋŊīŋŊ īŋŊ;>īŋŊj0^:īŋŊīŋŊ īŋŊ;[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊz;īŋŊ>īŋŊīŋŊuīŋŊīŋŊīŋŊz;9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊi īŋŊ/pīŋŊīŋŊjīŋŊīŋŊé̐īŋŊīŋŊ īŋŊīŋŊ]:īŋŊsīŋŊīŋŊ&īŋŊīŋŊīŋŊ]:īŋŊ9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊ;i īŋŊ/pīŋŊīŋŊjīŋŊīŋŊ;>īŋŊj0^:īŋŊīŋŊ īŋŊ;+īŋŊÔēEīŋŊīŋŊīŋŊ īŋŊ;+īŋŊÔēEīŋŊīŋŊīŋŊ īŋŊīŋŊ>īŋŊj0^:īŋŊīŋŊ īŋŊīŋŊi īŋŊ/pīŋŊīŋŊjīŋŊīŋŊ9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊmīŋŊīŋŊ$īŋŊīŋŊīŋŊ]:<īŋŊīŋŊīŋŊ.īŋŊ īŋŊīŋŊ]:<i īŋŊ/pīŋŊīŋŊjīŋŊīŋŊ;9Đ´īŋŊīŋŊ@īŋŊjīŋŊīŋŊ;[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊz;y>īŋŊ:īŋŊuīŋŊīŋŊīŋŊz;īŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊiīŋŊīŋŊ:>īŋŊj0īŋŊ īŋŊiīŋŊīŋŊ:é̐īŋŊīŋŊ īŋŊīŋŊ]:īŋŊnīŋŊ:&īŋŊīŋŊīŋŊ]:īŋŊīŋŊC: īŋŊuīŋŊP^īŋŊnīŋŊâ¯˛īŋŊzīŋŊP^īŋŊ>īŋŊj0^:īŋŊīŋŊ īŋŊ;9īŋŊīŋŊ:DīŋŊīŋŊīŋŊ īŋŊ;y>īŋŊ:īŋŊuīŋŊīŋŊīŋŊz;[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊz;i īŋŊ/pīŋŊīŋŊjīŋŊīŋŊ>Đ´:īŋŊ@īŋŊjīŋŊīŋŊnīŋŊ:&īŋŊīŋŊīŋŊ]:īŋŊé̐īŋŊīŋŊ īŋŊīŋŊ]:īŋŊi īŋŊ/pīŋŊīŋŊjīŋŊīŋŊ;>Đ´:īŋŊ@īŋŊjīŋŊīŋŊ;9īŋŊīŋŊ:DīŋŊīŋŊīŋŊ īŋŊ;>īŋŊj0^:īŋŊīŋŊ īŋŊ;>īŋŊj0^:īŋŊīŋŊ īŋŊīŋŊ9īŋŊīŋŊ:DīŋŊīŋŊīŋŊ īŋŊīŋŊ>Đ´:īŋŊ@īŋŊjīŋŊīŋŊi īŋŊ/pīŋŊīŋŊjīŋŊįģīŋŊīŋŊ.īŋŊ īŋŊīŋŊ]:<nīŋŊ:"īŋŊīŋŊīŋŊ]:<>Đ´:īŋŊ@īŋŊjīŋŊīŋŊ;i īŋŊ/pīŋŊīŋŊjīŋŊīŋŊ;[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊzīŋŊy>īŋŊ:īŋŊuīŋŊīŋŊīŋŊzīŋŊ9īŋŊīŋŊ:DīŋŊīŋŊīŋŊ īŋŊīŋŊ>īŋŊj0^:īŋŊīŋŊ īŋŊīŋŊ
+U.īŋŊīŋŊīŋŊzīŋŊR^<īŋŊC:īŋŊuīŋŊR^<nīŋŊ:"īŋŊīŋŊīŋŊ]:<īŋŊīŋŊīŋŊ.īŋŊ īŋŊīŋŊ]:<>īŋŊj0īŋŊ īŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊy>īŋŊ:īŋŊuīŋŊīŋŊīŋŊzīŋŊ[īŋŊ.īŋŊT^īŋŊīŋŊīŋŊzīŋŊ
+U.īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ <īŋŊīŋŊīŋŊ9īŋŊīŋŊīŋŊīŋŊīŋŊ <īŋŊC:īŋŊuīŋŊR^<
+U.īŋŊīŋŊīŋŊzīŋŊR^<īŋŊīŋŊ0īŋŊ#īŋŊīŋŊOīŋŊ}īŋŊīŋŊ:!īŋŊ īŋŊīŋŊOīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊ>īŋŊj0īŋŊ īŋŊuīŋŊīŋŊīŋŊ>īŋŊj0īŋŊ īŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊiīŋŊīŋŊ:}īŋŊīŋŊ:!īŋŊ īŋŊīŋŊOīŋŊīŋŊīŋŊ0īŋŊ#īŋŊīŋŊOīŋŊnīŋŊâ¯˛īŋŊzīŋŊP^īŋŊīŋŊC: īŋŊuīŋŊP^īŋŊīŋŊīŋŊīŋŊ9īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊ
+īŋŊīŋŊ.īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊC:īŋŊuīŋŊR^<RīŋŊ:tīŋŊgīŋŊR^<īŋŊU ;1īŋŊīŋŊ]:<nīŋŊ:"īŋŊīŋŊīŋŊ]:<īŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊu;īŋŊuīŋŊuīŋŊīŋŊīŋŊgīŋŊg;īŋŊīŋŊ īŋŊīŋŊīŋŊzīŋŊy>īŋŊ:īŋŊuīŋŊīŋŊīŋŊzīŋŊīŋŊīŋŊīŋŊ9īŋŊīŋŊīŋŊīŋŊīŋŊ <īŋŊC:īŋŊ>īŋŊīŋŊ <RīŋŊ:tīŋŊgīŋŊR^<īŋŊC:īŋŊuīŋŊR^<}īŋŊīŋŊ:!īŋŊ īŋŊīŋŊOīŋŊīŋŊīŋŊz;T^īŋŊīŋŊOīŋŊīŋŊīŋŊu;īŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊu;īŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊz;T^īŋŊīŋŊOīŋŊ}īŋŊīŋŊ:!īŋŊ īŋŊīŋŊOīŋŊīŋŊC: īŋŊuīŋŊP^īŋŊSīŋŊ:yīŋŊgīŋŊP^īŋŊīŋŊC:īŋŊ>īŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊ9īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊy>īŋŊ:īŋŊuīŋŊīŋŊīŋŊz;gīŋŊg;īŋŊīŋŊ īŋŊīŋŊīŋŊz;īŋŊīŋŊu;īŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊiīŋŊīŋŊ:nīŋŊ:&īŋŊīŋŊīŋŊ]:īŋŊīŋŊU ;1īŋŊīŋŊ]:īŋŊSīŋŊ:yīŋŊgīŋŊP^īŋŊīŋŊC: īŋŊuīŋŊP^īŋŊ9īŋŊīŋŊ:DīŋŊīŋŊīŋŊ īŋŊ;]īŋŊP;kīŋŊīŋŊīŋŊīŋŊ īŋŊ;gīŋŊg;īŋŊīŋŊ īŋŊīŋŊīŋŊz;y>īŋŊ:īŋŊuīŋŊīŋŊīŋŊz;>Đ´:īŋŊ@īŋŊjīŋŊīŋŊīŋŊV1;>ÖģjīŋŊįģ U ;1īŋŊīŋŊ]:īŋŊnīŋŊ:&īŋŊīŋŊīŋŊ]:īŋŊ>Đ´:īŋŊ@īŋŊjīŋŊīŋŊ;īŋŊV1;>ÖģjīŋŊīŋŊ;]īŋŊP;kīŋŊīŋŊīŋŊīŋŊ īŋŊ;9īŋŊīŋŊ:DīŋŊīŋŊīŋŊ īŋŊ;9īŋŊīŋŊ:DīŋŊīŋŊīŋŊ īŋŊīŋŊ]īŋŊP;kīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊV1;>ÖģjīŋŊīŋŊ>Đ´:īŋŊ@īŋŊjīŋŊīŋŊnīŋŊ:"īŋŊīŋŊīŋŊ]:<īŋŊU ;1īŋŊīŋŊ]:<īŋŊV1;>ÖģjīŋŊīŋŊ;>Đ´:īŋŊ@īŋŊjīŋŊīŋŊ;y>īŋŊ:īŋŊuīŋŊīŋŊīŋŊzīŋŊgīŋŊg;īŋŊīŋŊ īŋŊīŋŊīŋŊzīŋŊ]īŋŊP;kīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊ9īŋŊīŋŊ:DīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊU ;1īŋŊīŋŊ]:īŋŊEHJ;Y^īŋŊīŋŊ]:īŋŊīŋŊU ;kīŋŊPīŋŊP^īŋŊSīŋŊ:yīŋŊgīŋŊP^īŋŊ]īŋŊP;kīŋŊīŋŊīŋŊīŋŊ īŋŊ;O^īŋŊ;īŋŊâģ› īŋŊ;
+1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊz;gīŋŊg;īŋŊīŋŊ īŋŊīŋŊīŋŊz;īŋŊV1;>ÖģjīŋŊīŋŊoīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊEHJ;Y^īŋŊīŋŊ]:īŋŊīŋŊU ;1īŋŊīŋŊ]:īŋŊīŋŊV1;>ÖģjīŋŊīŋŊ;oīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊ;O^īŋŊ;īŋŊâģ› īŋŊ;]īŋŊP;kīŋŊīŋŊīŋŊīŋŊ īŋŊ;]īŋŊP;kīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊO^īŋŊ;īŋŊâģ› īŋŊīŋŊoīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊīŋŊV1;>ÖģjīŋŊįģŸU ;1īŋŊīŋŊ]:<BHJ;V^īŋŊīŋŊ]:<oīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊ;īŋŊV1;>ÖģjīŋŊīŋŊ;gīŋŊg;īŋŊīŋŊ īŋŊīŋŊīŋŊzīŋŊ
+1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊO^īŋŊ;īŋŊâģ› īŋŊīŋŊ]īŋŊP;kīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊRīŋŊ:tīŋŊgīŋŊR^<īŋŊU ;fīŋŊPīŋŊR^<BHJ;V^īŋŊīŋŊ]:<īŋŊU ;1īŋŊīŋŊ]:<īŋŊīŋŊu;īŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ;CīŋŊīŋŊuīŋŊīŋŊīŋŊ
+1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊgīŋŊg;īŋŊīŋŊ īŋŊīŋŊīŋŊzīŋŊīŋŊC:īŋŊ>īŋŊīŋŊ <līŋŊ:LīŋŊÔēīŋŊ <īŋŊU ;fīŋŊPīŋŊR^<RīŋŊ:tīŋŊgīŋŊR^<īŋŊīŋŊz;T^īŋŊīŋŊOīŋŊīŋŊ īŋŊ;_:īŋŊīŋŊOīŋŊīŋŊīŋŊ;CīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊu;īŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊu;īŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊ;CīŋŊīŋŊiīŋŊīŋŊ:īŋŊ īŋŊ;_:īŋŊīŋŊOīŋŊīŋŊīŋŊz;T^īŋŊīŋŊOīŋŊSīŋŊ:yīŋŊgīŋŊP^īŋŊīŋŊU ;kīŋŊPīŋŊP^īŋŊwīŋŊ:\īŋŊÔēīŋŊ īŋŊīŋŊC:īŋŊ>īŋŊīŋŊ īŋŊgīŋŊg;īŋŊīŋŊ īŋŊīŋŊīŋŊz;
+1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊz;īŋŊīŋŊ;CīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊu;īŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊ;CīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊuīŋŊīŋŊīŋŊ7īŋŊ;>ÖģīŋŊīŋŊzīŋŊ
+1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊlīŋŊ:LīŋŊÔēīŋŊ <8Đ´:TĐ´īŋŊīŋŊ <īŋŊV1;īŋŊV1īŋŊR^<īŋŊU ;fīŋŊPīŋŊR^<īŋŊ īŋŊ;_:īŋŊīŋŊOīŋŊlīŋŊīŋŊ;nīŋŊīŋŊīŋŊOīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ;CīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ;CīŋŊīŋŊiīŋŊīŋŊ:īŋŊ@īŋŊ;īŋŊ@īŋŊiīŋŊīŋŊ:līŋŊīŋŊ;nīŋŊīŋŊīŋŊOīŋŊīŋŊ īŋŊ;_:īŋŊīŋŊOīŋŊīŋŊU ;kīŋŊPīŋŊP^īŋŊīŋŊV1;īŋŊV1īŋŊP^īŋŊFĐ´:aĐ´īŋŊīŋŊ īŋŊwīŋŊ:\īŋŊÔēīŋŊ īŋŊ
+1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊz;7īŋŊ;>ÖģīŋŊīŋŊz;īŋŊ@īŋŊ;īŋŊ@īŋŊiīŋŊīŋŊ:īŋŊīŋŊ;CīŋŊīŋŊiīŋŊīŋŊ:EHJ;Y^īŋŊīŋŊ]:īŋŊpīŋŊīŋŊ;wīŋŊīŋŊīŋŊ]:īŋŊīŋŊV1;īŋŊV1īŋŊP^īŋŊīŋŊU ;kīŋŊPīŋŊP^īŋŊO^īŋŊ;īŋŊâģ› īŋŊ;ɧīŋŊ;˧īŋŊīŋŊīŋŊ īŋŊ;7īŋŊ;>ÖģīŋŊīŋŊz;
+1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊz;oīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊ
+×Ŗ;×ŖīŋŊjīŋŊīŋŊpīŋŊīŋŊ;wīŋŊīŋŊīŋŊ]:īŋŊEHJ;Y^īŋŊīŋŊ]:īŋŊoīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊ;
+×Ŗ;×ŖīŋŊjīŋŊīŋŊ;ɧīŋŊ;˧īŋŊīŋŊīŋŊ īŋŊ;O^īŋŊ;īŋŊâģ› īŋŊ;O^īŋŊ;īŋŊâģ› īŋŊīŋŊɧīŋŊ;˧īŋŊīŋŊīŋŊ īŋŊīŋŊ
+×Ŗ;×ŖīŋŊjīŋŊīŋŊoīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊBHJ;V^īŋŊīŋŊ]:<nīŋŊīŋŊ;tīŋŊīŋŊīŋŊ]:<
+×Ŗ;×ŖīŋŊjīŋŊīŋŊ;oīŋŊīŋŊ;Ō§īŋŊīŋŊjīŋŊīŋŊ;
+1īŋŊ;rīŋŊīŋŊīŋŊīŋŊīŋŊzīŋŊ7īŋŊ;>ÖģīŋŊīŋŊzīŋŊɧīŋŊ;˧īŋŊīŋŊīŋŊ īŋŊīŋŊO^īŋŊ;īŋŊâģ› īŋŊīŋŊīŋŊU ;fīŋŊPīŋŊR^<īŋŊV1;īŋŊV1īŋŊR^<nīŋŊīŋŊ;tīŋŊīŋŊīŋŊ]:<BHJ;V^īŋŊīŋŊ]:<ɧīŋŊ;˧īŋŊīŋŊīŋŊ īŋŊ;īŋŊīŋŊ;Q^īŋŊīŋŊīŋŊ īŋŊ;jīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊz;7īŋŊ;>ÖģīŋŊīŋŊz;
+×Ŗ;×ŖīŋŊjīŋŊīŋŊ˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊQ^īŋŊ;SHJīŋŊ]:īŋŊpīŋŊīŋŊ;wīŋŊīŋŊīŋŊ]:īŋŊ
+×Ŗ;×ŖīŋŊjīŋŊīŋŊ;˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊ;īŋŊīŋŊ;Q^īŋŊīŋŊīŋŊ īŋŊ;ɧīŋŊ;˧īŋŊīŋŊīŋŊ īŋŊ;ɧīŋŊ;˧īŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊ;Q^īŋŊīŋŊīŋŊ īŋŊīŋŊ˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊ
+×Ŗ;×ŖīŋŊjīŋŊīŋŊnīŋŊīŋŊ;tīŋŊīŋŊīŋŊ]:<O^īŋŊ;MHJīŋŊ]:<˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊ;
+×Ŗ;×ŖīŋŊjīŋŊīŋŊ;7īŋŊ;>ÖģīŋŊīŋŊzīŋŊjīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊzīŋŊīŋŊīŋŊ;Q^īŋŊīŋŊīŋŊ īŋŊīŋŊɧīŋŊ;˧īŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊV1;īŋŊV1īŋŊR^<YīŋŊP;īŋŊU īŋŊR^<O^īŋŊ;MHJīŋŊ]:<nīŋŊīŋŊ;tīŋŊīŋŊīŋŊ]:<īŋŊ@īŋŊ;īŋŊ@īŋŊuīŋŊīŋŊīŋŊ@īŋŊ<īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊjīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊzīŋŊ7īŋŊ;>ÖģīŋŊīŋŊzīŋŊ8Đ´:TĐ´īŋŊīŋŊ <0īŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ <YīŋŊP;īŋŊU īŋŊR^<īŋŊV1;īŋŊV1īŋŊR^<līŋŊīŋŊ;nīŋŊīŋŊīŋŊOīŋŊ]:<īŋŊ īŋŊīŋŊīŋŊOīŋŊ@īŋŊ<īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊuīŋŊīŋŊīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊiīŋŊīŋŊ:@īŋŊ<īŋŊīŋŊīŋŊiīŋŊīŋŊ:]:<īŋŊ īŋŊīŋŊīŋŊOīŋŊlīŋŊīŋŊ;nīŋŊīŋŊīŋŊOīŋŊīŋŊV1;īŋŊV1īŋŊP^īŋŊ]īŋŊP;īŋŊU īŋŊP^īŋŊ@īŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ īŋŊFĐ´:aĐ´īŋŊīŋŊ īŋŊ7īŋŊ;>ÖģīŋŊīŋŊz;jīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊz;@īŋŊ<īŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊ@īŋŊ;īŋŊ@īŋŊiīŋŊīŋŊ:pīŋŊīŋŊ;wīŋŊīŋŊīŋŊ]:īŋŊQ^īŋŊ;SHJīŋŊ]:īŋŊ]īŋŊP;īŋŊU īŋŊP^īŋŊīŋŊV1;īŋŊV1īŋŊP^īŋŊ0īŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ <x>īŋŊ:7īŋŊCīŋŊīŋŊ <eīŋŊg;eīŋŊR^<YīŋŊP;īŋŊU īŋŊR^<]:<īŋŊ īŋŊīŋŊīŋŊOīŋŊP^<īŋŊīŋŊzīŋŊīŋŊOīŋŊīŋŊu<īŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊ@īŋŊ<īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊ@īŋŊ<īŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊu<īŋŊīŋŊuīŋŊiīŋŊīŋŊ:P^<īŋŊīŋŊzīŋŊīŋŊOīŋŊ]:<īŋŊ īŋŊīŋŊīŋŊOīŋŊ]īŋŊP;īŋŊU īŋŊP^īŋŊiīŋŊg;jīŋŊP^īŋŊīŋŊ>īŋŊ:FīŋŊCīŋŊīŋŊ īŋŊ@īŋŊīŋŊ:īŋŊīŋŊīŋŊīŋŊ īŋŊjīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊz;īŋŊīŋŊ <xīŋŊgīŋŊīŋŊīŋŊz;īŋŊu<īŋŊīŋŊuīŋŊiīŋŊīŋŊ:@īŋŊ<īŋŊīŋŊīŋŊiīŋŊīŋŊ:Q^īŋŊ;SHJīŋŊ]:īŋŊ 1īŋŊ;īŋŊU īŋŊ]:īŋŊiīŋŊg;jīŋŊP^īŋŊ]īŋŊP;īŋŊU īŋŊP^īŋŊīŋŊīŋŊ;Q^īŋŊīŋŊīŋŊ īŋŊ;eīŋŊīŋŊ;^īŋŊPīŋŊīŋŊ īŋŊ;īŋŊīŋŊ <xīŋŊgīŋŊīŋŊīŋŊz;jīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊz;˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊ8īŋŊ;īŋŊV1īŋŊjīŋŊīŋŊ 1īŋŊ;īŋŊU īŋŊ]:īŋŊQ^īŋŊ;SHJīŋŊ]:īŋŊ˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊ;8īŋŊ;īŋŊV1īŋŊjīŋŊīŋŊ;eīŋŊīŋŊ;^īŋŊPīŋŊīŋŊ īŋŊ;īŋŊīŋŊ;Q^īŋŊīŋŊīŋŊ īŋŊ;īŋŊīŋŊ;Q^īŋŊīŋŊīŋŊ īŋŊīŋŊeīŋŊīŋŊ;^īŋŊPīŋŊīŋŊ īŋŊīŋŊ8īŋŊ;īŋŊV1īŋŊjīŋŊīŋŊ˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊO^īŋŊ;MHJīŋŊ]:< 1īŋŊ;īŋŊU īŋŊ]:<8īŋŊ;īŋŊV1īŋŊjīŋŊīŋŊ;˧īŋŊ;tīŋŊīŋŊīŋŊjīŋŊīŋŊ;jīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊzīŋŊīŋŊīŋŊ <xīŋŊgīŋŊīŋŊīŋŊzīŋŊeīŋŊīŋŊ;^īŋŊPīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊ;Q^īŋŊīŋŊīŋŊ īŋŊīŋŊYīŋŊP;īŋŊU īŋŊR^<eīŋŊg;eīŋŊR^< 1īŋŊ;īŋŊU īŋŊ]:<O^īŋŊ;MHJīŋŊ]:<@īŋŊ<īŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊu<īŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ <xīŋŊgīŋŊīŋŊīŋŊzīŋŊjīŋŊīŋŊ;1īŋŊīŋŊīŋŊīŋŊzīŋŊ8īŋŊ;īŋŊV1īŋŊjīŋŊīŋŊ;īŋŊ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊ;?īŋŊ<;īŋŊÔēīŋŊ īŋŊ;eīŋŊīŋŊ;^īŋŊPīŋŊīŋŊ īŋŊ;eīŋŊīŋŊ;^īŋŊPīŋŊīŋŊ īŋŊīŋŊ?īŋŊ<;īŋŊÔēīŋŊ īŋŊīŋŊīŋŊ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊ8īŋŊ;īŋŊV1īŋŊjīŋŊīŋŊ 1īŋŊ;īŋŊU īŋŊ]:<īŋŊīŋŊ;īŋŊīŋŊīŋŊ]:<īŋŊ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊ;8īŋŊ;īŋŊV1īŋŊjīŋŊīŋŊ;īŋŊīŋŊ <xīŋŊgīŋŊīŋŊīŋŊzīŋŊīŋŊu<īŋŊ>ėē īŋŊzīŋŊ?īŋŊ<;īŋŊÔēīŋŊ īŋŊīŋŊeīŋŊīŋŊ;^īŋŊPīŋŊīŋŊ īŋŊīŋŊeīŋŊg;eīŋŊR^<īŋŊīŋŊu;-īŋŊCīŋŊR^<īŋŊīŋŊ;īŋŊīŋŊīŋŊ]:< 1īŋŊ;īŋŊU īŋŊ]:<īŋŊu<īŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊu<īŋŊ>ėē īŋŊzīŋŊīŋŊīŋŊ <xīŋŊgīŋŊīŋŊīŋŊzīŋŊx>īŋŊ:7īŋŊCīŋŊīŋŊ <īŋŊīŋŊīŋŊ:īŋŊīŋŊĮšīŋŊ <īŋŊīŋŊu;-īŋŊCīŋŊR^<eīŋŊg;eīŋŊR^<P^<īŋŊīŋŊzīŋŊīŋŊOīŋŊīŋŊ <}īŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊu<īŋŊīŋŊuīŋŊuīŋŊīŋŊīŋŊīŋŊu<īŋŊīŋŊuīŋŊiīŋŊīŋŊ:īŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊ <}īŋŊīŋŊīŋŊīŋŊOīŋŊP^<īŋŊīŋŊzīŋŊīŋŊOīŋŊiīŋŊg;jīŋŊP^īŋŊīŋŊīŋŊu;4īŋŊCīŋŊP^īŋŊīŋŊīŋŊīŋŊ:
+īŋŊĮšīŋŊ īŋŊīŋŊ>īŋŊ:FīŋŊCīŋŊīŋŊ īŋŊīŋŊīŋŊ <xīŋŊgīŋŊīŋŊīŋŊz;īŋŊu<īŋŊ>ėē™īŋŊz;īŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊu<īŋŊīŋŊuīŋŊiīŋŊīŋŊ: 1īŋŊ;īŋŊU īŋŊ]:īŋŊīŋŊīŋŊ;īŋŊīŋŊīŋŊ]:īŋŊīŋŊīŋŊu;4īŋŊCīŋŊP^īŋŊiīŋŊg;jīŋŊP^īŋŊeīŋŊīŋŊ;^īŋŊPīŋŊīŋŊ īŋŊ;?īŋŊ<;īŋŊÔēīŋŊ īŋŊ;īŋŊu<īŋŊ>ėē™īŋŊz;īŋŊīŋŊ <xīŋŊgīŋŊīŋŊīŋŊz;8īŋŊ;īŋŊV1īŋŊjīŋŊįģĒ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊīŋŊ]:īŋŊ 1īŋŊ;īŋŊU īŋŊ]:īŋŊīŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊ <)|īŋŊīŋŊiīŋŊīŋŊ:īŋŊ#<īŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊ <}īŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊīŋŊu;4īŋŊCīŋŊP^īŋŊīŋŊīŋŊz;īŋŊAīŋŊP^īŋŊ~īŋŊīŋŊ:īŋŊ8VīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊ:
+īŋŊĮšīŋŊ īŋŊīŋŊu<īŋŊ>ėē™īŋŊz;P^<īŋŊW[īŋŊīŋŊīŋŊz;īŋŊ <)|īŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊ;īŋŊīŋŊīŋŊ]:īŋŊīŋŊ īŋŊ;īŋŊAīŋŊ]:īŋŊīŋŊīŋŊz;īŋŊAīŋŊP^īŋŊīŋŊīŋŊu;4īŋŊCīŋŊP^īŋŊ?īŋŊ<;īŋŊÔēīŋŊ īŋŊ;Y:<īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊ;P^<īŋŊW[īŋŊīŋŊīŋŊz;īŋŊu<īŋŊ>ėē™īŋŊz;īŋŊ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊiīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊįģ› īŋŊ;īŋŊAīŋŊ]:īŋŊīŋŊīŋŊ;īŋŊīŋŊīŋŊ]:īŋŊīŋŊ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊ;iīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊīŋŊ;Y:<īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊ;?īŋŊ<;īŋŊÔēīŋŊ īŋŊ;?īŋŊ<;īŋŊÔēīŋŊ īŋŊīŋŊY:<īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊiīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊįģĒ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊīŋŊīŋŊ;īŋŊīŋŊīŋŊ]:<īŋŊ īŋŊ;īŋŊa2īŋŊ]:<iīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊīŋŊ;īŋŊ@īŋŊ;MĐ´īŋŊjīŋŊīŋŊ;īŋŊu<īŋŊ>ėē īŋŊzīŋŊP^<īŋŊW[īŋŊīŋŊīŋŊzīŋŊY:<īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊ?īŋŊ<;īŋŊÔēīŋŊ īŋŊīŋŊīŋŊīŋŊu;-īŋŊCīŋŊR^<īŋŊīŋŊz;3C-īŋŊR^<īŋŊ īŋŊ;īŋŊa2īŋŊ]:<īŋŊīŋŊ;īŋŊīŋŊīŋŊ]:<īŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ <)|īŋŊīŋŊuīŋŊīŋŊīŋŊP^<īŋŊW[īŋŊīŋŊīŋŊzīŋŊīŋŊu<īŋŊ>ėē īŋŊzīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊĮšīŋŊ <līŋŊīŋŊ:RīŋŊXīŋŊīŋŊ <īŋŊīŋŊz;3C-īŋŊR^<īŋŊīŋŊu;-īŋŊCīŋŊR^<īŋŊ <}īŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊ#<īŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊ <)|īŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ<īŋŊīŋŊīŋŊīŋŊuīŋŊīŋŊīŋŊY:<īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊ>īŋŊ<"īŋŊīŋŊ:īŋŊ īŋŊīŋŊīŋŊ@īŋŊ;+Đ´:jīŋŊīŋŊiīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊįģ˜ īŋŊ;īŋŊa2īŋŊ]:<īŋŊīŋŊ;VīŋŊ:]:<īŋŊ@īŋŊ;+Đ´:jīŋŊīŋŊ;iīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊīŋŊ;P^<īŋŊW[īŋŊīŋŊīŋŊzīŋŊīŋŊu<b>īŋŊ:īŋŊīŋŊzīŋŊ>īŋŊ<"īŋŊīŋŊ:īŋŊ īŋŊīŋŊY:<īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊīŋŊīŋŊīŋŊz;3C-īŋŊR^<īŋŊīŋŊu;ÔĩC:R^<īŋŊīŋŊ;VīŋŊ:]:<īŋŊ īŋŊ;īŋŊa2īŋŊ]:<īŋŊ <)|īŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊīŋŊ<īŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊu<b>īŋŊ:īŋŊīŋŊzīŋŊP^<īŋŊW[īŋŊīŋŊīŋŊzīŋŊlīŋŊīŋŊ:RīŋŊXīŋŊīŋŊ <īŋŊīŋŊīŋŊ:"īŋŊīŋŊ9īŋŊ <īŋŊīŋŊu;ÔĩC:R^<īŋŊīŋŊz;3C-īŋŊR^<īŋŊ#<īŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊ <eīŋŊīŋŊ:īŋŊOīŋŊīŋŊīŋŊ<īŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊ <)|īŋŊīŋŊuīŋŊīŋŊīŋŊīŋŊ <)|īŋŊīŋŊiīŋŊīŋŊ:īŋŊīŋŊ<īŋŊīŋŊīŋŊ:iīŋŊīŋŊ:īŋŊ <eīŋŊīŋŊ:īŋŊOīŋŊīŋŊ#<īŋŊīŋŊīŋŊīŋŊīŋŊOīŋŊīŋŊīŋŊz;īŋŊAīŋŊP^īŋŊīŋŊīŋŊu;ĶĩC:P^īŋŊīŋŊīŋŊīŋŊ:2īŋŊīŋŊ9īŋŊ īŋŊ~īŋŊīŋŊ:īŋŊ8VīŋŊīŋŊ īŋŊP^<īŋŊW[īŋŊīŋŊīŋŊz;īŋŊu<b>īŋŊ:īŋŊīŋŊz;īŋŊīŋŊ<īŋŊīŋŊīŋŊ:iīŋŊīŋŊ:īŋŊ <)|īŋŊīŋŊiīŋŊīŋŊ:īŋŊ īŋŊ;īŋŊAīŋŊ]:īŋŊīŋŊīŋŊ;VīŋŊ:]:īŋŊīŋŊīŋŊu;ĶĩC:P^īŋŊīŋŊīŋŊz;īŋŊAīŋŊP^īŋŊY:<īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊ;>īŋŊ<"īŋŊīŋŊ:īŋŊ īŋŊ;īŋŊu<b>īŋŊ:īŋŊīŋŊz;P^<īŋŊW[īŋŊīŋŊīŋŊz;iīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊįģŠ@īŋŊ;+Đ´:jīŋŊīŋŊīŋŊīŋŊ;VīŋŊ:]:īŋŊīŋŊ īŋŊ;īŋŊAīŋŊ]:īŋŊiīŋŊīŋŊ;p]īŋŊīŋŊjīŋŊīŋŊ;īŋŊ@īŋŊ;+Đ´:jīŋŊīŋŊ;>īŋŊ<"īŋŊīŋŊ:īŋŊ īŋŊ;Y:<īŋŊīŋŊīŋŊīŋŊīŋŊ īŋŊ;īŋŊīŋŊ<īŋŊīŋŊīŋŊ:iīŋŊīŋŊ:īŋŊu<īŋŊīŋŊu;iīŋŊīŋŊ:M^<īŋŊīŋŊz;īŋŊOīŋŊīŋŊ <eīŋŊīŋŊ:īŋŊOīŋŊīŋŊīŋŊu;ĶĩC:P^īŋŊgīŋŊg;9īŋŊ:P^īŋŊīŋŊ>īŋŊ:ØĩC:īŋŊ īŋŊīŋŊīŋŊīŋŊ:2īŋŊīŋŊ9īŋŊ īŋŊīŋŊu<b>īŋŊ:īŋŊīŋŊz;īŋŊīŋŊ <\īŋŊg;īŋŊīŋŊz;īŋŊu<īŋŊīŋŊu;iīŋŊīŋŊ:īŋŊīŋŊ<īŋŊīŋŊīŋŊ:iīŋŊīŋŊ:īŋŊīŋŊ;VīŋŊ:]:īŋŊ 1īŋŊ;īŋŊU ;]:īŋŊgīŋŊg;9īŋŊ:P^īŋŊīŋŊīŋŊu;ĶĩC:P^īŋŊ>īŋŊ<"īŋŊīŋŊ:īŋŊ īŋŊ;aīŋŊīŋŊ;PīŋŊP;īŋŊ īŋŊ;īŋŊīŋŊ <\īŋŊg;īŋŊīŋŊz;īŋŊu<b>īŋŊ:īŋŊīŋŊz;īŋŊ@īŋŊ;+Đ´:jīŋŊīŋŊ5īŋŊ;īŋŊV1;jīŋŊīŋŊ 1īŋŊ;īŋŊU ;]:īŋŊīŋŊīŋŊ;VīŋŊ:]:īŋŊīŋŊ@īŋŊ;+Đ´:jīŋŊīŋŊ;5īŋŊ;īŋŊV1;jīŋŊīŋŊ;aīŋŊīŋŊ;PīŋŊP;īŋŊ īŋŊ;>īŋŊ<"īŋŊīŋŊ:īŋŊ īŋŊ;>īŋŊ<"īŋŊīŋŊ:īŋŊ īŋŊīŋŊaīŋŊīŋŊ;PīŋŊP;īŋŊ īŋŊīŋŊ5īŋŊ;īŋŊV1;jīŋŊįģŠ@īŋŊ;+Đ´:jīŋŊīŋŊīŋŊīŋŊ;VīŋŊ:]:<1īŋŊ;īŋŊU ;]:<5īŋŊ;īŋŊV1;jīŋŊīŋŊ;īŋŊ@īŋŊ;+Đ´:jīŋŊīŋŊ;īŋŊu<b>īŋŊ:īŋŊīŋŊzīŋŊīŋŊīŋŊ <\īŋŊg;īŋŊīŋŊzīŋŊaīŋŊīŋŊ;PīŋŊP;īŋŊ īŋŊīŋŊ>īŋŊ<"īŋŊīŋŊ:īŋŊ īŋŊīŋŊīŋŊīŋŊu;ÔĩC:R^<bīŋŊg;8īŋŊ:R^<1īŋŊ;īŋŊU ;]:<īŋŊīŋŊ;VīŋŊ:]:<īŋŊīŋŊ<īŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊīŋŊu<īŋŊīŋŊu;uīŋŊīŋŊīŋŊīŋŊīŋŊ <\īŋŊg;īŋŊīŋŊzīŋŊīŋŊu<b>īŋŊ:īŋŊīŋŊzīŋŊīŋŊīŋŊīŋŊ:"īŋŊīŋŊ9īŋŊ <x>īŋŊ:ĘĩC:īŋŊ <bīŋŊg;8īŋŊ:R^<īŋŊīŋŊu;ÔĩC:R^<īŋŊ <eīŋŊīŋŊ:īŋŊOīŋŊM^<īŋŊīŋŊz;īŋŊOīŋŊīŋŊu<īŋŊīŋŊu;uīŋŊīŋŊīŋŊīŋŊīŋŊ<īŋŊīŋŊīŋŊ:uīŋŊīŋŊīŋŊ1īŋŊ;īŋŊU ;]:<K^īŋŊ;4HJ;]:<ɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊ;5īŋŊ;īŋŊV1;jīŋŊīŋŊ;īŋŊīŋŊ <\īŋŊg;īŋŊīŋŊzīŋŊiīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊzīŋŊīŋŊīŋŊ;I^īŋŊ;īŋŊ īŋŊīŋŊaīŋŊīŋŊ;PīŋŊP;īŋŊ īŋŊīŋŊbīŋŊg;8īŋŊ:R^<TīŋŊP;īŋŊU ;R^<K^īŋŊ;4HJ;]:<1īŋŊ;īŋŊU ;]:<īŋŊu<īŋŊīŋŊu;uīŋŊīŋŊīŋŊ=īŋŊ<īŋŊīŋŊ;uīŋŊīŋŊīŋŊiīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊzīŋŊīŋŊīŋŊ <\īŋŊg;īŋŊīŋŊzīŋŊx>īŋŊ:ĘĩC:īŋŊ </īŋŊīŋŊ:OīŋŊ:īŋŊ <TīŋŊP;īŋŊU ;R^<bīŋŊg;8īŋŊ:R^<M^<īŋŊīŋŊz;īŋŊOīŋŊY:<īŋŊ īŋŊ;īŋŊOīŋŊ=īŋŊ<īŋŊīŋŊ;uīŋŊīŋŊīŋŊīŋŊu<īŋŊīŋŊu;uīŋŊīŋŊīŋŊīŋŊu<īŋŊīŋŊu;iīŋŊīŋŊ:=īŋŊ<īŋŊīŋŊ;iīŋŊīŋŊ:Y:<īŋŊ īŋŊ;īŋŊOīŋŊM^<īŋŊīŋŊz;īŋŊOīŋŊgīŋŊg;9īŋŊ:P^īŋŊYīŋŊP;īŋŊU ;P^īŋŊ=īŋŊīŋŊ:YīŋŊ:īŋŊ īŋŊīŋŊ>īŋŊ:ØĩC:īŋŊ īŋŊīŋŊīŋŊ <\īŋŊg;īŋŊīŋŊz;iīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊz;=īŋŊ<īŋŊīŋŊ;iīŋŊīŋŊ:īŋŊu<īŋŊīŋŊu;iīŋŊīŋŊ: 1īŋŊ;īŋŊU ;]:īŋŊN^īŋŊ;7HJ;]:īŋŊYīŋŊP;īŋŊU ;P^īŋŊgīŋŊg;9īŋŊ:P^īŋŊaīŋŊīŋŊ;PīŋŊP;īŋŊ īŋŊ;īŋŊīŋŊ;I^īŋŊ;īŋŊ īŋŊ;iīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊz;īŋŊīŋŊ <\īŋŊg;īŋŊīŋŊz;5īŋŊ;īŋŊV1;jīŋŊīŋŊɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊN^īŋŊ;7HJ;]:īŋŊ 1īŋŊ;īŋŊU ;]:īŋŊ5īŋŊ;īŋŊV1;jīŋŊīŋŊ;ɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊ;īŋŊīŋŊ;I^īŋŊ;īŋŊ īŋŊ;aīŋŊīŋŊ;PīŋŊP;īŋŊ īŋŊ;aīŋŊīŋŊ;PīŋŊP;īŋŊ īŋŊīŋŊīŋŊīŋŊ;I^īŋŊ;īŋŊ īŋŊīŋŊɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊ5īŋŊ;īŋŊV1;jīŋŊīŋŊYīŋŊP;īŋŊU ;P^īŋŊīŋŊV1;īŋŊV1;P^īŋŊBĐ´:)Đ´:īŋŊ īŋŊ=īŋŊīŋŊ:YīŋŊ:īŋŊ īŋŊiīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊz;7īŋŊ;0īŋŊ;īŋŊīŋŊz;īŋŊ@īŋŊ;īŋŊ@īŋŊ;iīŋŊīŋŊ:=īŋŊ<īŋŊīŋŊ;iīŋŊīŋŊ:N^īŋŊ;7HJ;]:īŋŊlīŋŊīŋŊ;hīŋŊīŋŊ;]:īŋŊīŋŊV1;īŋŊV1;P^īŋŊYīŋŊP;īŋŊU ;P^īŋŊīŋŊīŋŊ;I^īŋŊ;īŋŊ īŋŊ;īŋŊīŋŊīŋŊ;§īŋŊ;īŋŊ īŋŊ;7īŋŊ;0īŋŊ;īŋŊīŋŊz;iīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊz;ɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊ×Ŗ;×Ŗ;jīŋŊīŋŊlīŋŊīŋŊ;hīŋŊīŋŊ;]:īŋŊN^īŋŊ;7HJ;]:īŋŊɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊ;×Ŗ;×Ŗ;jīŋŊīŋŊ;īŋŊīŋŊīŋŊ;§īŋŊ;īŋŊ īŋŊ;īŋŊīŋŊ;I^īŋŊ;īŋŊ īŋŊ;īŋŊīŋŊ;I^īŋŊ;īŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊ;§īŋŊ;īŋŊ īŋŊīŋŊ×Ŗ;×Ŗ;jīŋŊīŋŊɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊK^īŋŊ;4HJ;]:<jīŋŊīŋŊ;fīŋŊīŋŊ;]:<×Ŗ;×Ŗ;jīŋŊīŋŊ;ɧīŋŊ;jīŋŊīŋŊ;jīŋŊīŋŊ;iīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊzīŋŊ7īŋŊ;0īŋŊ;īŋŊīŋŊzīŋŊīŋŊīŋŊīŋŊ;§īŋŊ;īŋŊ īŋŊīŋŊīŋŊīŋŊ;I^īŋŊ;īŋŊ īŋŊīŋŊTīŋŊP;īŋŊU ;R^<īŋŊV1;īŋŊV1;R^<jīŋŊīŋŊ;fīŋŊīŋŊ;]:<K^īŋŊ;4HJ;]:<=īŋŊ<īŋŊīŋŊ;uīŋŊīŋŊīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊ;uīŋŊīŋŊīŋŊ7īŋŊ;0īŋŊ;īŋŊīŋŊzīŋŊiīŋŊīŋŊ;1īŋŊ;īŋŊīŋŊzīŋŊ/īŋŊīŋŊ:OīŋŊ:īŋŊ <7Đ´:Đ´:īŋŊ <īŋŊV1;īŋŊV1;R^<TīŋŊP;īŋŊU ;R^<Y:<īŋŊ īŋŊ;īŋŊOīŋŊaīŋŊīŋŊ;bīŋŊīŋŊ;īŋŊOīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊ;uīŋŊīŋŊīŋŊ=īŋŊ<īŋŊīŋŊ;uīŋŊīŋŊīŋŊ=īŋŊ<īŋŊīŋŊ;iīŋŊīŋŊ:īŋŊ@īŋŊ;īŋŊ@īŋŊ;iīŋŊīŋŊ:aīŋŊīŋŊ;bīŋŊīŋŊ;īŋŊOīŋŊY:<īŋŊ īŋŊ;īŋŊOīŋŊ7īŋŊ;0īŋŊ;īŋŊīŋŊzīŋŊ 1īŋŊ;bīŋŊīŋŊ;īŋŊīŋŊzīŋŊG^īŋŊ;īŋŊīŋŊ;īŋŊ īŋŊīŋŊīŋŊīŋŊīŋŊ;§īŋŊ;īŋŊ īŋŊīŋŊīŋŊV1;īŋŊV1;R^<īŋŊU ;JīŋŊP;R^<;HJ;G^īŋŊ;]:<jīŋŊīŋŊ;fīŋŊīŋŊ;]:<īŋŊ@īŋŊ;īŋŊ@īŋŊ;uīŋŊīŋŊīŋŊīŋŊīŋŊ;;īŋŊ<uīŋŊīŋŊīŋŊ 1īŋŊ;bīŋŊīŋŊ;īŋŊīŋŊzīŋŊ7īŋŊ;0īŋŊ;īŋŊīŋŊzīŋŊ7Đ´:Đ´:īŋŊ <jīŋŊ:īŋŊīŋŊ:īŋŊ <īŋŊU ;JīŋŊP;R^<īŋŊV1;īŋŊV1;R^<aīŋŊīŋŊ;bīŋŊīŋŊ;īŋŊOīŋŊīŋŊ īŋŊ;W:<īŋŊOīŋŊīŋŊīŋŊ;;īŋŊ<uīŋŊīŋŊīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊ;uīŋŊīŋŊīŋŊīŋŊ@īŋŊ;īŋŊ@īŋŊ;iīŋŊīŋŊ:īŋŊīŋŊ;;īŋŊ<iīŋŊīŋŊ:īŋŊ īŋŊ;W:<īŋŊOīŋŊaīŋŊīŋŊ;bīŋŊīŋŊ;īŋŊOīŋŊīŋŊV1;īŋŊV1;P^īŋŊīŋŊU ;LīŋŊP;P^īŋŊsīŋŊ:"īŋŊīŋŊ:īŋŊ īŋŊBĐ´:)Đ´:īŋŊ īŋŊ7īŋŊ;0īŋŊ;īŋŊīŋŊz; 1īŋŊ;bīŋŊīŋŊ;īŋŊīŋŊz;īŋŊīŋŊ;;īŋŊ<iīŋŊīŋŊ:īŋŊ@īŋŊ;īŋŊ@īŋŊ;iīŋŊīŋŊ:līŋŊīŋŊ;hīŋŊīŋŊ;]:īŋŊ=HJ;I^īŋŊ;]:īŋŊīŋŊU ;LīŋŊP;P^īŋŊīŋŊV1;īŋŊV1;P^īŋŊīŋŊīŋŊīŋŊ;§īŋŊ;īŋŊ īŋŊ;G^īŋŊ;īŋŊīŋŊ;īŋŊ īŋŊ; 1īŋŊ;bīŋŊīŋŊ;īŋŊīŋŊz;7īŋŊ;0īŋŊ;īŋŊīŋŊz;×Ŗ;×Ŗ;jīŋŊīŋŊkīŋŊīŋŊ;ŧīŋŊ;jīŋŊīŋŊ=HJ;I^īŋŊ;]:īŋŊlīŋŊīŋŊ;hīŋŊīŋŊ;]:īŋŊ×Ŗ;×Ŗ;jīŋŊīŋŊ;kīŋŊīŋŊ;ŧīŋŊ;jīŋŊīŋŊ;G^īŋŊ;īŋŊīŋŊ;īŋŊ īŋŊ;īŋŊīŋŊīŋŊ;§īŋŊ;īŋŊ īŋŊ;īŋŊīŋŊīŋŊ;§īŋŊ;īŋŊ īŋŊīŋŊG^īŋŊ;īŋŊīŋŊ;īŋŊ īŋŊīŋŊkīŋŊīŋŊ;ŧīŋŊ;jīŋŊīŋŊ×Ŗ;×Ŗ;jīŋŊīŋŊjīŋŊīŋŊ;fīŋŊīŋŊ;]:<;HJ;G^īŋŊ;]:<kīŋŊīŋŊ;ŧīŋŊ;jīŋŊīŋŊ;×Ŗ;×Ŗ;jīŋŊīŋŊ; 1īŋŊ;bīŋŊīŋŊ;īŋŊīŋŊz;fīŋŊg;īŋŊīŋŊ <īŋŊīŋŊz;īŋŊīŋŊu;īŋŊu<iīŋŊīŋŊ:īŋŊīŋŊ;;īŋŊ<iīŋŊīŋŊ:=HJ;I^īŋŊ;]:īŋŊīŋŊU ;1īŋŊ;]:īŋŊKīŋŊ:YīŋŊg;P^īŋŊīŋŊU ;LīŋŊP;P^īŋŊG^īŋŊ;īŋŊīŋŊ;īŋŊ īŋŊ;JīŋŊP;]īŋŊīŋŊ;īŋŊ īŋŊ;fīŋŊg;īŋŊīŋŊ <īŋŊīŋŊz; 1īŋŊ;bīŋŊīŋŊ;īŋŊīŋŊz;kīŋŊīŋŊ;ŧīŋŊ;jīŋŊīŋŊīŋŊV1;2īŋŊ;jīŋŊįģ™U ;1īŋŊ;]:īŋŊ=HJ;I^īŋŊ;]:īŋŊkīŋŊīŋŊ;ŧīŋŊ;jīŋŊīŋŊ;īŋŊV1;2īŋŊ;jīŋŊīŋŊ;JīŋŊP;]īŋŊīŋŊ;īŋŊ īŋŊ;G^īŋŊ;īŋŊīŋŊ;īŋŊ īŋŊ;G^īŋŊ;īŋŊīŋŊ;īŋŊ īŋŊīŋŊJīŋŊP;]īŋŊīŋŊ;īŋŊ īŋŊīŋŊīŋŊV1;2īŋŊ;jīŋŊīŋŊkīŋŊīŋŊ;ŧīŋŊ;jīŋŊīŋŊ;HJ;G^īŋŊ;]:<īŋŊU ;
+īŋŊC:n>īŋŊ:īŋŊ īŋŊsīŋŊ:"īŋŊīŋŊ:īŋŊ īŋŊIīŋŊ:WīŋŊg;R^<īŋŊC:īŋŊīŋŊu;R^<`īŋŊ:īŋŊīŋŊ;]:<īŋŊU ;
+īŋŊC:n>īŋŊ:īŋŊ īŋŊfīŋŊg;īŋŊīŋŊ <īŋŊīŋŊz;w>īŋŊ:īŋŊu<īŋŊīŋŊz;īŋŊīŋŊīŋŊ:īŋŊīŋŊ<iīŋŊīŋŊ:īŋŊīŋŊu;īŋŊu<iīŋŊīŋŊ:īŋŊU ;1īŋŊ;]:īŋŊcīŋŊ:īŋŊīŋŊ;]:īŋŊīŋŊīŋŊC:īŋŊīŋŊu;P^īŋŊKīŋŊ:YīŋŊg;P^īŋŊJīŋŊP;]īŋŊīŋŊ;īŋŊ īŋŊ;īŋŊīŋŊ:;īŋŊ<īŋŊ īŋŊ;w>īŋŊ:īŋŊu<īŋŊīŋŊz;fīŋŊg;īŋŊīŋŊ <īŋŊīŋŊz;īŋŊV1;2īŋŊ;jīŋŊīŋŊ.Đ´:īŋŊ@īŋŊ;jīŋŊīŋŊcīŋŊ:īŋŊīŋŊ;]:īŋŊīŋŊU ;1īŋŊ;]:īŋŊīŋŊV1;2īŋŊ;jīŋŊīŋŊ;.Đ´:īŋŊ@īŋŊ;jīŋŊīŋŊ;īŋŊīŋŊ:;īŋŊ<īŋŊ īŋŊ;JīŋŊP;]īŋŊīŋŊ;īŋŊ īŋŊ;JīŋŊP;]īŋŊīŋŊ;īŋŊ īŋŊīŋŊīŋŊīŋŊ:;īŋŊ<īŋŊ īŋŊīŋŊ.Đ´:īŋŊ@īŋŊ;jīŋŊīŋŊīŋŊV1;2īŋŊ;jīŋŊįģ—U ;
+īŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊ/;īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊ=;īŋŊtpīŋŊīŋŊwīŋŊ:
+īŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊ;fΤīŋŊxīŋŊ:;
+īŋŊīŋŊīŋŊīŋŊīŋŊ:
+īŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊo;īŋŊE0īŋŊ\īŋŊ:8īŋŊ;DīŋŊ(īŋŊīŋŊ9īŋŊ:3īŋŊīŋŊ<~īŋŊBīŋŊ
+īŋŊzīŋŊīŋŊ;īŋŊīŋŊ;<īŋŊīŋŊīŋŊ;4īŋŊ;'GīŋŊīŋŊuīŋŊ*;
+īŋŊzīŋŊīŋŊ; īŋŊīŋŊ;%
+īŋŊzīŋŊīŋŊ;ZīŋŊ:<JLīŋŊlmīŋŊ;īŋŊ]<qīŋŊ$ÎŦ;īŋŊīŋŊ;<īŋŊīŋŊīŋŊ;
+īŋŊzīŋŊīŋŊ;
+<
+<īŋŊīŋŊM<īŋŊīŋŊ`īŋŊīŋŊīŋŊīŋŊ;-<-īŋŊīŋŊīŋŊīŋŊīŋŊ;
+īŋŊīŋŊīŋŊīŋŊ:
+īŋŊ䕚:
+īŋŊīŋŊīŋŊīŋŊ:īŋŊ V<
+īŋŊ䕚:īŋŊīŋŊīŋŊ:īŋŊYīŋŊ +īŋŊ:īŋŊ]<qīŋŊ$ÎŦ;
+īŋŊīŋŊīŋŊīŋŊ:īŋŊ VīŋŊ
+īŋŊ䕚:īŋŊīŋŊ×ēīŋŊYīŋŊ +īŋŊ:īŋŊīŋŊīŋŊīŋŊ.īŋŊīŋŊWw;;
+īŋŊīŋŊīŋŊīŋŊ:
+īŋŊ䕚:
+<īŋŊīŋŊMīŋŊīŋŊīŋŊ`īŋŊīŋŊīŋŊīŋŊ;YīŋŊ:īŋŊJLīŋŊlmīŋŊ;
+<
+īŋŊzīŋŊīŋŊ;YīŋŊ:īŋŊJLīŋŊlmīŋŊ;
+īŋŊzīŋŊīŋŊ;īŋŊīŋŊCīŋŊīŋŊīŋŊ;īŋŊ]īŋŊrīŋŊ$ÎŦ;īŋŊ VīŋŊ
+īŋŊīŋŊīŋŊ:īŋŊ;īŋŊ VīŋŊ
+īŋŊīŋŊīŋŊ:īŋŊ;īŋŊl=īŋŊ(`īŋŊīŋŊ~ ";
+īŋŊzīŋŊīŋŊ;īŋŊīŋŊīŋŊ&
+īŋŊzīŋŊīŋŊ;
+īŋŊīŋŊīŋŊ:īŋŊ;īŋŊīŋŊīŋŊīŋŊ"īŋŊSīŋŊīŋŊīŋŊīŋŊ:īŋŊ VīŋŊ
+īŋŊīŋŊīŋŊ:īŋŊ;
+#īŋŊīŋŊīŋŊīŋŊīŋŊ`īŋŊ>9KīŋŊĐģ$īŋŊîē”Û‚:īŋŊīŋŊīŋŊīŋŊ"īŋŊSīŋŊīŋŊīŋŊīŋŊ:
+#īŋŊīŋŊīŋŊīŋŊīŋŊ`īŋŊ>9 īŋŊīŋŊ:īŋŊīŋŊh!īŋŊ:
+#īŋŊīŋŊīŋŊīŋŊīŋŊ`īŋŊ>9
+#īŋŊīŋŊīŋŊīŋŊīŋŊ`īŋŊ>9
+īŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊ/īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊËēīŋŊīŋŊīŋŊīŋŊ īŋŊw:
+īŋŊīŋŊīŋŊīŋŊīŋŊ:
+īŋŊīŋŊīŋŊīŋŊīŋŊ:
+īŋŊīŋŊīŋŊīŋŊīŋŊ:īŋŊīŋŊīŋŊdΤīŋŊxīŋŊ:;īŋŊ=īŋŊ~tpīŋŊīŋŊwīŋŊ:īŋŊīŋŊ/īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ:
+īŋŊīŋŊ
+īŋŊīŋŊ
+īŋŊīŋŊ
+īŋŊīŋŊ
+EīŋŊ
+EīŋŊ
+EīŋŊ
+EīŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+<
+<
+<
+<
+<
+<
+<
+<
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ
+īŋŊ;
+īŋŊ;
+:
+:
+īŋŊ;
+īŋŊ;
+:
+:
+E:
+E:
+E:
+E:
+
+
+  
+   "! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ
+  
+   "! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ
+  
+   "! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ
+  
+   "! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ
+  
+   "! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ
+  
+   "! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRPVUTWVTZYX[ZX^]\_^\ba`cb`fedgfdjihkjhnmlonlrqpsrpvutwvtzyx{zx~}|~|īŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊīŋŊ
+  
+   "! #" &%$'&$*)(+*(.-,/.,210320654764:98;:8>=<?><BA@CB@FEDGFDJIHKJHNMLONLRQPSRP
+@īŋŊīŋŊ @īŋŊīŋŊ@@03@RU@tw@īŋŊīŋŊ@īŋŊīŋŊ@īŋŊīŋŊ@īŋŊīŋŊ@""@@D$@bf&@īŋŊīŋŊ(@īŋŊīŋŊ*@īŋŊīŋŊ,@īŋŊīŋŊ.@ 1@.33@PU5@rw7@īŋŊīŋŊ9@īŋŊīŋŊ;@īŋŊīŋŊ=@īŋŊīŋŊ?@"B@>DD@`fF@īŋŊīŋŊH@īŋŊīŋŊJ@īŋŊīŋŊL@īŋŊīŋŊN@
+Q@,3S@NUU@pwW@īŋŊīŋŊY@īŋŊīŋŊ[@īŋŊīŋŊ]@īŋŊīŋŊ_@"b@<Dd@^ff@īŋŊīŋŊh@īŋŊīŋŊj@īŋŊīŋŊl@īŋŊīŋŊn@q@*3s@LUu@nww@īŋŊīŋŊy@īŋŊīŋŊ{@īŋŊīŋŊ}@īŋŊīŋŊ@ īŋŊ@"īŋŊ@.3īŋŊ@?DīŋŊ@PUīŋŊ@afīŋŊ@rwīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊˌ@īŋŊŨ@īŋŊīŋŊ@īŋŊīŋŊīŋŊ@ īŋŊ@"īŋŊ@-3īŋŊ@>DīŋŊ@OUīŋŊ@`fīŋŊ@qwīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊ˜@īŋŊŨ@īŋŊīŋŊ@īŋŊīŋŊīŋŊ@
+īŋŊ@"īŋŊ@,3īŋŊ@=DīŋŊ@NUīŋŊ@_fīŋŊ@pwīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊĖŦ@īŋŊŨ­@īŋŊīŋŊ@īŋŊīŋŊīŋŊ@ īŋŊ@"īŋŊ@+3īŋŊ@<DīŋŊ@MUīŋŊ@^fīŋŊ@owīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊĖŧ@īŋŊŨŊ@īŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊ@"īŋŊ@*3īŋŊ@;DīŋŊ@LUīŋŊ@]fīŋŊ@nwīŋŊ@īŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊ@"īŋŊ@)3īŋŊ@:DīŋŊ@KUīŋŊ@\fīŋŊ@mwīŋŊ@~īŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊīŋŊīŋŊ@īŋŊ@"īŋŊ@(3īŋŊ@9DīŋŊ@JUīŋŊ@[fīŋŊ@
+-?
+īŋŊg;t?3īŋŊīŋŊ;w>~?īŋŊīŋŊ7< }?}īŋŊ<,īŋŊ{?īŋŊ=īŋŊ<z?īŋŊ%īŋŊ<īŋŊ>x?īŋŊīŋŊ=īŋŊ#v?īŋŊC=HīŋŊs?īŋŊīŋŊk=3Aq?īŋŊ īŋŊ=d~n?LīŋŊīŋŊ=īŋŊīŋŊk?īŋŊīŋŊīŋŊ=`h?īŋŊīŋŊīŋŊ=īŋŊe?īŋŊīŋŊīŋŊ=īŋŊa?OīŋŊ>-īŋŊ]?>?īŋŊY?īŋŊ(>VīŋŊU?ÍĨ8>īŋŊīŋŊQ?īŋŊīŋŊI>
+īŋŊD?TīŋŊ>īŋŊīŋŊ??hīŋŊīŋŊ>L?;?īŋŊ,īŋŊ>īŋŊi6?īŋŊīŋŊ>īŋŊ}1?īŋŊīŋŊ>īŋŊ},?3(īŋŊ>īŋŊk'?rkīŋŊ>GJ"?īŋŊīŋŊ>īŋŊ?īŋŊ?īŋŊ>īŋŊ?īŋŊīŋŊīŋŊ>īŋŊīŋŊ?2`īŋŊ>īŋŊO ?AīŋŊ>īŋŊīŋŊ?īŋŊīŋŊīŋŊ>īŋŊīŋŊ?īŋŊīŋŊ?īŋŊīŋŊ>īŋŊīŋŊ?īŋŊīŋŊ>īŋŊO ?q`īŋŊ>īŋŊīŋŊ?īŋŊīŋŊīŋŊ>īŋŊīŋŊ?!@īŋŊ>īŋŊ?QīŋŊīŋŊ>*J"?īŋŊkīŋŊ>īŋŊk'?n(īŋŊ>īŋŊ},?īŋŊīŋŊ>īŋŊ}1?īŋŊīŋŊ>ji6?,-īŋŊ>/?;?īŋŊīŋŊīŋŊ>īŋŊīŋŊ??īŋŊīŋŊ>īŋŊD?CīŋŊm>īŋŊ&I?8e[>īŋŊM?aīŋŊI>tīŋŊQ?.īŋŊ8>=īŋŊU?
+(>(īŋŊY?a>īŋŊ]?īŋŊīŋŊ>īŋŊa?{īŋŊīŋŊ=īŋŊe?HīŋŊīŋŊ=īŋŊ_h?f
+z?īŋŊ>īŋŊ<%īŋŊ{?\īŋŊ<īŋŊ}?īŋŊ8<s>~?fīŋŊīŋŊ;q?\īŋŊg;ÛĢ?=JīŋŊ:īŋŊīŋŊ?īŋŊīŋŊ9vīŋŊ?
+īŋŊ^?
+īŋŊ>?
+īŋŊīŋŊ>
+īŋŊ>
+īŋŊ>
+>
+g;
+īŋŊ#īŋŊ
diff --git a/test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.gltf b/test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.gltf
new file mode 100644
index 000000000..69f451fc2
--- /dev/null
+++ b/test/models/glTF2/AnimatedMorphSphere/glTF/AnimatedMorphSphere.gltf
@@ -0,0 +1,276 @@
+{
+ "accessors": [
+ {
+ "bufferView": 0,
+ "componentType": 5126,
+ "count": 1876,
+ "type": "VEC3"
+ },
+ {
+ "bufferView": 1,
+ "componentType": 5126,
+ "count": 1876,
+ "type": "VEC4"
+ },
+ {
+ "bufferView": 2,
+ "componentType": 5126,
+ "count": 1876,
+ "type": "VEC3",
+ "max": [
+ 0.009999998,
+ 0.009999991,
+ 0.01
+ ],
+ "min": [
+ -0.0100000026,
+ -0.0100000035,
+ -0.01
+ ]
+ },
+ {
+ "bufferView": 3,
+ "componentType": 5126,
+ "count": 1876,
+ "type": "VEC3",
+ "name": "Ship"
+ },
+ {
+ "bufferView": 4,
+ "componentType": 5126,
+ "count": 1876,
+ "type": "VEC3",
+ "max": [
+ 0.0313265175,
+ 0.0226246975,
+ 0.008465132
+ ],
+ "min": [
+ -0.0313265137,
+ -0.022857653,
+ 0.0
+ ],
+ "name": "Ship"
+ },
+ {
+ "bufferView": 5,
+ "componentType": 5126,
+ "count": 1876,
+ "type": "VEC3",
+ "name": "Ship"
+ },
+ {
+ "bufferView": 6,
+ "componentType": 5126,
+ "count": 1876,
+ "type": "VEC3",
+ "name": "Blob"
+ },
+ {
+ "bufferView": 7,
+ "componentType": 5126,
+ "count": 1876,
+ "type": "VEC3",
+ "max": [
+ 0.008781092,
+ 0.0,
+ 0.0
+ ],
+ "min": [
+ -0.008781091,
+ -0.0007655843,
+ 0.0
+ ],
+ "name": "Blob"
+ },
+ {
+ "bufferView": 8,
+ "componentType": 5126,
+ "count": 1876,
+ "type": "VEC3",
+ "name": "Blob"
+ },
+ {
+ "bufferView": 9,
+ "componentType": 5123,
+ "count": 2880,
+ "type": "SCALAR"
+ },
+ {
+ "bufferView": 10,
+ "componentType": 5126,
+ "count": 217,
+ "type": "SCALAR",
+ "max": [
+ 7.19999456
+ ],
+ "min": [
+ 0.0
+ ]
+ },
+ {
+ "bufferView": 11,
+ "componentType": 5126,
+ "count": 434,
+ "type": "SCALAR"
+ }
+ ],
+ "animations": [
+ {
+ "channels": [
+ {
+ "sampler": 0,
+ "target": {
+ "node": 0,
+ "path": "weights"
+ }
+ }
+ ],
+ "samplers": [
+ {
+ "input": 10,
+ "interpolation": "LINEAR",
+ "output": 11
+ }
+ ],
+ "name": "Globe"
+ }
+ ],
+ "asset": {
+ "generator": "glTF Tools for Unity",
+ "version": "2.0"
+ },
+ "bufferViews": [
+ {
+ "buffer": 0,
+ "byteLength": 22512
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 22512,
+ "byteLength": 30016
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 52528,
+ "byteLength": 22512
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 75040,
+ "byteLength": 22512
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 97552,
+ "byteLength": 22512
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 120064,
+ "byteLength": 22512
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 142576,
+ "byteLength": 22512
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 165088,
+ "byteLength": 22512
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 187600,
+ "byteLength": 22512
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 210112,
+ "byteLength": 5760
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 215872,
+ "byteLength": 868
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 216740,
+ "byteLength": 1736
+ }
+ ],
+ "buffers": [
+ {
+ "uri": "AnimatedMorphSphere.bin",
+ "byteLength": 218476
+ }
+ ],
+ "meshes": [
+ {
+ "primitives": [
+ {
+ "attributes": {
+ "NORMAL": 0,
+ "TANGENT": 1,
+ "POSITION": 2
+ },
+ "indices": 9,
+ "material": 0,
+ "targets": [
+ {
+ "NORMAL": 3,
+ "POSITION": 4,
+ "TANGENT": 5
+ },
+ {
+ "NORMAL": 6,
+ "POSITION": 7,
+ "TANGENT": 8
+ }
+ ]
+ }
+ ],
+ "weights": [
+ 0.0,
+ 0.0
+ ],
+ "name": "Sphere"
+ }
+ ],
+ "materials": [
+ {
+ "pbrMetallicRoughness": {
+ "metallicFactor": 0.0,
+ "roughnessFactor": 0.5
+ },
+ "name": "No Name"
+ }
+ ],
+ "nodes": [
+ {
+ "mesh": 0,
+ "rotation": [
+ 0.0,
+ 0.7071067,
+ -0.7071068,
+ 0.0
+ ],
+ "scale": [
+ 100.0,
+ 100.0,
+ 100.0
+ ],
+ "name": "AnimatedMorphSphere"
+ }
+ ],
+ "scene": 0,
+ "scenes": [
+ {
+ "nodes": [
+ 0
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/test/models/glTF2/MorphPrimitivesTest/LICENSE.md b/test/models/glTF2/MorphPrimitivesTest/LICENSE.md
new file mode 100644
index 000000000..5ed346890
--- /dev/null
+++ b/test/models/glTF2/MorphPrimitivesTest/LICENSE.md
@@ -0,0 +1,17 @@
+# LICENSE file for the model: Morph-Primitives Test
+
+All files in this directory tree are licensed as indicated below.
+
+* All files directly associated with the model including all text, image and binary files:
+
+ * [CC BY 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"]
+
+ * [CC BY 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"]
+
+* This file and all other metadocumentation files including "metadata.json":
+
+ * [Creative Commons Attribtution 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"]
+
+Full license text of these licenses are available at the links above
+
+#### Generated by modelmetadata \ No newline at end of file
diff --git a/test/models/glTF2/MorphPrimitivesTest/README.body.md b/test/models/glTF2/MorphPrimitivesTest/README.body.md
new file mode 100644
index 000000000..984ccd1d7
--- /dev/null
+++ b/test/models/glTF2/MorphPrimitivesTest/README.body.md
@@ -0,0 +1,21 @@
+## Screenshot
+
+![screenshot](screenshot/screenshot.jpg)
+
+## Description
+
+This model contains a simple mesh with two primitives: A larger red primitive displays a grid covering 3 of the 4 quadrants of the model's area, followed by a smaller green primitive covering the last quadrant.
+
+Each primitive has a morph target that creates an elevated area within these quadrants. The model's only mesh contains a `weights: [0.5]` instruction that should cause these morph targets to be applied at half strength, raising the center of the model as shown in the screenshot above.
+
+## Common Problems
+
+If the entire model appears perfectly flat, it is likely that the morph targets have not been applied as requested.
+
+If the red area or green area is missing, particularly in the Draco-compressed version of this model, it could indicate a problem with decompression or with support of multiple primitives within a single mesh.
+
+## Author
+
+Model by [@ft-lab](https://github.com/ft-lab).
+
+
diff --git a/test/models/glTF2/MorphPrimitivesTest/README.md b/test/models/glTF2/MorphPrimitivesTest/README.md
new file mode 100644
index 000000000..80dacfbcd
--- /dev/null
+++ b/test/models/glTF2/MorphPrimitivesTest/README.md
@@ -0,0 +1,50 @@
+# Morph-Primitives Test
+
+## Tags
+
+[core](../../Models-core.md), [testing](../../Models-testing.md)
+
+## Summary
+
+Tests a morph target on multiple primitives.
+
+## Operations
+
+* [Display](https://github.khronos.org/glTF-Sample-Viewer-Release/?model=https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/MorphPrimitivesTest/glTF-Binary/MorphPrimitivesTest.glb) in SampleViewer
+* [Download GLB](https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/MorphPrimitivesTest/glTF-Binary/MorphPrimitivesTest.glb)
+* [Model Directory](./)
+
+## Screenshot
+
+![screenshot](screenshot/screenshot.jpg)
+
+## Description
+
+This model contains a simple mesh with two primitives: A larger red primitive displays a grid covering 3 of the 4 quadrants of the model's area, followed by a smaller green primitive covering the last quadrant.
+
+Each primitive has a morph target that creates an elevated area within these quadrants. The model's only mesh contains a `weights: [0.5]` instruction that should cause these morph targets to be applied at half strength, raising the center of the model as shown in the screenshot above.
+
+## Common Problems
+
+If the entire model appears perfectly flat, it is likely that the morph targets have not been applied as requested.
+
+If the red area or green area is missing, particularly in the Draco-compressed version of this model, it could indicate a problem with decompression or with support of multiple primitives within a single mesh.
+
+## Author
+
+Model by [@ft-lab](https://github.com/ft-lab).
+
+
+
+
+## Legal
+
+&copy; 2018, ft-lab. [CC BY 4.0 International](https://creativecommons.org/licenses/by/4.0/legalcode)
+
+ - ft-lab for Everything
+
+&copy; 2020, Frank Galligan. [CC BY 4.0 International](https://creativecommons.org/licenses/by/4.0/legalcode)
+
+ - Frank Galligan for DRACO compression
+
+#### Assembled by modelmetadata \ No newline at end of file
diff --git a/test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.bin b/test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.bin
new file mode 100644
index 000000000..7f269e17a
--- /dev/null
+++ b/test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.bin
Binary files differ
diff --git a/test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.gltf b/test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.gltf
new file mode 100644
index 000000000..bd3ad0e31
--- /dev/null
+++ b/test/models/glTF2/MorphPrimitivesTest/glTF/MorphPrimitivesTest.gltf
@@ -0,0 +1,331 @@
+{
+ "asset": {
+ "generator": "glTF Converter for Shade3D",
+ "version": "2.0",
+ "extras": {
+ "title": "multiple_primitives",
+ "author": "ft-lab",
+ "license": "CC BY-4.0 (https://creativecommons.org/licenses/by/4.0/)"
+ }
+ },
+ "accessors": [
+ {
+ "bufferView": 0,
+ "componentType": 5123,
+ "count": 72,
+ "type": "SCALAR",
+ "byteOffset": 0
+ },
+ {
+ "bufferView": 1,
+ "componentType": 5126,
+ "count": 21,
+ "type": "VEC3",
+ "byteOffset": 0
+ },
+ {
+ "bufferView": 2,
+ "componentType": 5126,
+ "count": 21,
+ "type": "VEC3",
+ "max": [
+ 0.5,
+ 0,
+ 0.5
+ ],
+ "min": [
+ -0.5,
+ 0,
+ -0.5
+ ],
+ "byteOffset": 0
+ },
+ {
+ "bufferView": 3,
+ "componentType": 5126,
+ "count": 21,
+ "type": "VEC2",
+ "byteOffset": 0
+ },
+ {
+ "bufferView": 4,
+ "componentType": 5126,
+ "count": 21,
+ "type": "VEC3",
+ "max": [
+ 0,
+ 0.20000000298023224,
+ 0
+ ],
+ "min": [
+ 0,
+ 0,
+ 0
+ ],
+ "byteOffset": 0
+ },
+ {
+ "bufferView": 5,
+ "componentType": 5123,
+ "count": 24,
+ "type": "SCALAR",
+ "byteOffset": 0
+ },
+ {
+ "bufferView": 6,
+ "componentType": 5126,
+ "count": 9,
+ "type": "VEC3",
+ "byteOffset": 0
+ },
+ {
+ "bufferView": 7,
+ "componentType": 5126,
+ "count": 9,
+ "type": "VEC3",
+ "max": [
+ 0.5,
+ 0,
+ 0
+ ],
+ "min": [
+ 0,
+ 0,
+ -0.5
+ ],
+ "byteOffset": 0
+ },
+ {
+ "bufferView": 8,
+ "componentType": 5126,
+ "count": 9,
+ "type": "VEC2",
+ "byteOffset": 0
+ },
+ {
+ "bufferView": 9,
+ "componentType": 5126,
+ "count": 9,
+ "type": "VEC3",
+ "max": [
+ 0,
+ 0.20000000298023224,
+ 0
+ ],
+ "min": [
+ 0,
+ 0,
+ 0
+ ],
+ "byteOffset": 0
+ }
+ ],
+ "bufferViews": [
+ {
+ "buffer": 0,
+ "byteOffset": 0,
+ "byteLength": 144,
+ "target": 34963
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 144,
+ "byteLength": 252,
+ "target": 34962,
+ "byteStride": 12
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 396,
+ "byteLength": 252,
+ "target": 34962,
+ "byteStride": 12
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 648,
+ "byteLength": 168,
+ "target": 34962,
+ "byteStride": 8
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 816,
+ "byteLength": 252,
+ "target": 34962,
+ "byteStride": 12
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 1068,
+ "byteLength": 48,
+ "target": 34963
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 1116,
+ "byteLength": 108,
+ "target": 34962,
+ "byteStride": 12
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 1224,
+ "byteLength": 108,
+ "target": 34962,
+ "byteStride": 12
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 1332,
+ "byteLength": 72,
+ "target": 34962,
+ "byteStride": 8
+ },
+ {
+ "buffer": 0,
+ "byteOffset": 1404,
+ "byteLength": 108,
+ "target": 34962,
+ "byteStride": 12
+ }
+ ],
+ "buffers": [
+ {
+ "name": "MorphPrimitivesTest",
+ "byteLength": 1512,
+ "uri": "MorphPrimitivesTest.bin"
+ }
+ ],
+ "images": [
+ {
+ "name": "uv_texture.jpg",
+ "mimeType": "image/jpeg",
+ "uri": "uv_texture.jpg"
+ }
+ ],
+ "materials": [
+ {
+ "pbrMetallicRoughness": {
+ "baseColorFactor": [
+ 1,
+ 0,
+ 0,
+ 1
+ ],
+ "baseColorTexture": {
+ "index": 0,
+ "texCoord": 0
+ },
+ "metallicFactor": 0,
+ "roughnessFactor": 1
+ },
+ "name": "red",
+ "emissiveFactor": [
+ 0,
+ 0,
+ 0
+ ],
+ "alphaMode": "OPAQUE",
+ "doubleSided": false
+ },
+ {
+ "pbrMetallicRoughness": {
+ "baseColorFactor": [
+ 0,
+ 1,
+ 0,
+ 1
+ ],
+ "baseColorTexture": {
+ "index": 0,
+ "texCoord": 0
+ },
+ "metallicFactor": 0,
+ "roughnessFactor": 1
+ },
+ "name": "green",
+ "emissiveFactor": [
+ 0,
+ 0,
+ 0
+ ],
+ "alphaMode": "OPAQUE",
+ "doubleSided": false
+ }
+ ],
+ "meshes": [
+ {
+ "weights": [
+ 0.5
+ ],
+ "name": "mesh",
+ "primitives": [
+ {
+ "attributes": {
+ "NORMAL": 1,
+ "POSITION": 2,
+ "TEXCOORD_0": 3
+ },
+ "indices": 0,
+ "material": 0,
+ "targets": [
+ {
+ "POSITION": 4
+ }
+ ],
+ "mode": 4
+ },
+ {
+ "attributes": {
+ "POSITION": 7,
+ "NORMAL": 6,
+ "TEXCOORD_0": 8
+ },
+ "indices": 5,
+ "material": 1,
+ "targets": [
+ {
+ "POSITION": 9
+ }
+ ],
+ "mode": 4
+ }
+ ]
+ }
+ ],
+ "nodes": [
+ {
+ "children": [
+ 1
+ ],
+ "name": "ãƒĢãƒŧトパãƒŧト"
+ },
+ {
+ "mesh": 0,
+ "name": "mesh"
+ }
+ ],
+ "samplers": [
+ {
+ "minFilter": 9729,
+ "wrapS": 10497,
+ "wrapT": 10497
+ }
+ ],
+ "scenes": [
+ {
+ "nodes": [
+ 0
+ ],
+ "name": "Scene"
+ }
+ ],
+ "textures": [
+ {
+ "sampler": 0,
+ "source": 0
+ }
+ ],
+ "scene": 0
+}
diff --git a/test/models/glTF2/MorphPrimitivesTest/glTF/uv_texture.jpg b/test/models/glTF2/MorphPrimitivesTest/glTF/uv_texture.jpg
new file mode 100644
index 000000000..7f63873f9
--- /dev/null
+++ b/test/models/glTF2/MorphPrimitivesTest/glTF/uv_texture.jpg
Binary files differ
diff --git a/test/models/glTF2/MorphStressTest/LICENSE.md b/test/models/glTF2/MorphStressTest/LICENSE.md
new file mode 100644
index 000000000..2e9a26b9f
--- /dev/null
+++ b/test/models/glTF2/MorphStressTest/LICENSE.md
@@ -0,0 +1,15 @@
+# LICENSE file for the model: Morph Stress Test
+
+All files in this directory tree are licensed as indicated below.
+
+* All files directly associated with the model including all text, image and binary files:
+
+ * [CC BY 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"]
+
+* This file and all other metadocumentation files including "metadata.json":
+
+ * [Creative Commons Attribtution 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"]
+
+Full license text of these licenses are available at the links above
+
+#### Generated by modelmetadata \ No newline at end of file
diff --git a/test/models/glTF2/MorphStressTest/README.body.md b/test/models/glTF2/MorphStressTest/README.body.md
new file mode 100644
index 000000000..704ebd1e7
--- /dev/null
+++ b/test/models/glTF2/MorphStressTest/README.body.md
@@ -0,0 +1,62 @@
+## Screenshot
+
+![screenshot](screenshot/screenshot_large.png)
+
+## Description
+
+This model has a base mesh, plus eight morph targets. The base and each of the morph targets has
+both a POSITION and a NORMAL accessor, resulting in no less than 18 vertex attributes being requested
+by a typical implementation. This number can be too high for many realtime graphics systems, and
+the client runtime may take steps to limit the overall number of morph targets and/or limit the
+number of active morph targets.
+
+As such, this model is not expected to render correctly everywhere. Instead, it pushes the limits
+to see how many morph targets can move at once before problems become apparent.
+
+## Animations
+
+Three animations are included:
+
+---
+### "Individuals"
+
+![Individuals animation](screenshot/Anim_Individuals.gif)
+
+Each morph target is exercised one at a time, and returns to zero strength before the next one
+starts to move. This offers runtimes the best chance of success, as vertex attributes need only
+be allocated for one morph target at a time. Even so, systems that pre-allocate morph target
+attributes may place an upper limit here, allowing only some of the test blocks to move.
+
+---
+### "TheWave"
+
+![Wave animation](screenshot/Anim_TheWave.gif)
+
+This animation tests a wave of morph targets being activated simultaneously. This does require
+a high number of vertex attributes to be available. If glitches in movement are observed,
+continue on to the "Pulse" animation for closer inspection.
+
+---
+### "Pulse"
+
+![Pulse animation](screenshot/Anim_Pulse.gif)
+
+This is the most stressful test, with all 8 morph targets reaching full strength before any
+begin to subside. Some runtimes may place limits on how many morph targets can be active at
+once, resulting in a distinctive visual pattern here: Only the first N test blocks will
+appear to move, where N is the number of simultaneous active morph targets allowed. Test
+blocks on the right will remain frozen in the starting position until the first few blocks
+on the left have returned to rest. After the blocks on the left have returned to rest, they
+could relinquish their vertex attributes to blocks on the right, allowing those blocks to
+"catch up" to their assigned positions in the animation.
+
+It is also possible that there could be a hard limit on the number of morph targets, regardless
+of whether they are active or not. In this case, only the first N blocks will move at all,
+and the remainder will be frozen the entire time.
+
+---
+## Implementation Notes
+
+BabylonJS has shared some technical details of their "Infinite Morph Targets" implementation
+in [this YouTube video](https://www.youtube.com/watch?v=LBPRmGgU0PE).
+
diff --git a/test/models/glTF2/MorphStressTest/README.md b/test/models/glTF2/MorphStressTest/README.md
new file mode 100644
index 000000000..71eb60540
--- /dev/null
+++ b/test/models/glTF2/MorphStressTest/README.md
@@ -0,0 +1,87 @@
+# Morph Stress Test
+
+## Tags
+
+[core](../../Models-core.md), [testing](../../Models-testing.md)
+
+## Summary
+
+Tests up to 8 morph targets.
+
+## Operations
+
+* [Display](https://github.khronos.org/glTF-Sample-Viewer-Release/?model=https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/MorphStressTest/glTF-Binary/MorphStressTest.glb) in SampleViewer
+* [Download GLB](https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/MorphStressTest/glTF-Binary/MorphStressTest.glb)
+* [Model Directory](./)
+
+## Screenshot
+
+![screenshot](screenshot/screenshot_large.png)
+
+## Description
+
+This model has a base mesh, plus eight morph targets. The base and each of the morph targets has
+both a POSITION and a NORMAL accessor, resulting in no less than 18 vertex attributes being requested
+by a typical implementation. This number can be too high for many realtime graphics systems, and
+the client runtime may take steps to limit the overall number of morph targets and/or limit the
+number of active morph targets.
+
+As such, this model is not expected to render correctly everywhere. Instead, it pushes the limits
+to see how many morph targets can move at once before problems become apparent.
+
+## Animations
+
+Three animations are included:
+
+---
+### "Individuals"
+
+![Individuals animation](screenshot/Anim_Individuals.gif)
+
+Each morph target is exercised one at a time, and returns to zero strength before the next one
+starts to move. This offers runtimes the best chance of success, as vertex attributes need only
+be allocated for one morph target at a time. Even so, systems that pre-allocate morph target
+attributes may place an upper limit here, allowing only some of the test blocks to move.
+
+---
+### "TheWave"
+
+![Wave animation](screenshot/Anim_TheWave.gif)
+
+This animation tests a wave of morph targets being activated simultaneously. This does require
+a high number of vertex attributes to be available. If glitches in movement are observed,
+continue on to the "Pulse" animation for closer inspection.
+
+---
+### "Pulse"
+
+![Pulse animation](screenshot/Anim_Pulse.gif)
+
+This is the most stressful test, with all 8 morph targets reaching full strength before any
+begin to subside. Some runtimes may place limits on how many morph targets can be active at
+once, resulting in a distinctive visual pattern here: Only the first N test blocks will
+appear to move, where N is the number of simultaneous active morph targets allowed. Test
+blocks on the right will remain frozen in the starting position until the first few blocks
+on the left have returned to rest. After the blocks on the left have returned to rest, they
+could relinquish their vertex attributes to blocks on the right, allowing those blocks to
+"catch up" to their assigned positions in the animation.
+
+It is also possible that there could be a hard limit on the number of morph targets, regardless
+of whether they are active or not. In this case, only the first N blocks will move at all,
+and the remainder will be frozen the entire time.
+
+---
+## Implementation Notes
+
+BabylonJS has shared some technical details of their "Infinite Morph Targets" implementation
+in [this YouTube video](https://www.youtube.com/watch?v=LBPRmGgU0PE).
+
+
+
+## Legal
+
+&copy; 2021, Analytical Graphics, Inc.. [CC BY 4.0 International](https://creativecommons.org/licenses/by/4.0/legalcode)
+
+ - Ed Mackey for Everything
+
+#### Assembled by modelmetadata \ No newline at end of file
diff --git a/test/models/glTF2/MorphStressTest/glTF/Base_AO.png b/test/models/glTF2/MorphStressTest/glTF/Base_AO.png
new file mode 100644
index 000000000..567255a7f
--- /dev/null
+++ b/test/models/glTF2/MorphStressTest/glTF/Base_AO.png
Binary files differ
diff --git a/test/models/glTF2/MorphStressTest/glTF/ColorSwatches.png b/test/models/glTF2/MorphStressTest/glTF/ColorSwatches.png
new file mode 100644
index 000000000..72da1c22c
--- /dev/null
+++ b/test/models/glTF2/MorphStressTest/glTF/ColorSwatches.png
Binary files differ
diff --git a/test/models/glTF2/MorphStressTest/glTF/MorphStressTest.bin b/test/models/glTF2/MorphStressTest/glTF/MorphStressTest.bin
new file mode 100644
index 000000000..53ebd6724
--- /dev/null
+++ b/test/models/glTF2/MorphStressTest/glTF/MorphStressTest.bin
Binary files differ
diff --git a/test/models/glTF2/MorphStressTest/glTF/MorphStressTest.gltf b/test/models/glTF2/MorphStressTest/glTF/MorphStressTest.gltf
new file mode 100644
index 000000000..560cb2b1d
--- /dev/null
+++ b/test/models/glTF2/MorphStressTest/glTF/MorphStressTest.gltf
@@ -0,0 +1,999 @@
+{
+ "asset" : {
+ "copyright" : "CC-BY 4.0 Copyright 2021 Analytical Graphics, Inc. Model and Textures by Ed Mackey.",
+ "generator" : "Khronos glTF Blender I/O v1.5.13",
+ "version" : "2.0"
+ },
+ "scene" : 0,
+ "scenes" : [
+ {
+ "name" : "Scene",
+ "nodes" : [
+ 0
+ ]
+ }
+ ],
+ "nodes" : [
+ {
+ "mesh" : 0,
+ "name" : "Main"
+ }
+ ],
+ "animations" : [
+ {
+ "channels" : [
+ {
+ "sampler" : 0,
+ "target" : {
+ "node" : 0,
+ "path" : "weights"
+ }
+ }
+ ],
+ "name" : "Individuals",
+ "samplers" : [
+ {
+ "input" : 42,
+ "interpolation" : "LINEAR",
+ "output" : 43
+ }
+ ]
+ },
+ {
+ "channels" : [
+ {
+ "sampler" : 0,
+ "target" : {
+ "node" : 0,
+ "path" : "weights"
+ }
+ }
+ ],
+ "name" : "TheWave",
+ "samplers" : [
+ {
+ "input" : 44,
+ "interpolation" : "LINEAR",
+ "output" : 45
+ }
+ ]
+ },
+ {
+ "channels" : [
+ {
+ "sampler" : 0,
+ "target" : {
+ "node" : 0,
+ "path" : "weights"
+ }
+ }
+ ],
+ "name" : "Pulse",
+ "samplers" : [
+ {
+ "input" : 46,
+ "interpolation" : "LINEAR",
+ "output" : 47
+ }
+ ]
+ }
+ ],
+ "materials" : [
+ {
+ "doubleSided" : true,
+ "name" : "Base",
+ "occlusionTexture" : {
+ "index" : 0,
+ "texCoord" : 1
+ },
+ "pbrMetallicRoughness" : {
+ "baseColorTexture" : {
+ "index" : 1
+ },
+ "metallicFactor" : 0,
+ "roughnessFactor" : 0.4000000059604645
+ }
+ },
+ {
+ "doubleSided" : true,
+ "name" : "TestMaterial",
+ "pbrMetallicRoughness" : {
+ "baseColorTexture" : {
+ "index" : 2
+ },
+ "metallicFactor" : 0,
+ "roughnessFactor" : 0.5
+ }
+ }
+ ],
+ "meshes" : [
+ {
+ "extras" : {
+ "targetNames" : [
+ "Key 1",
+ "Key 2",
+ "Key 3",
+ "Key 4",
+ "Key 5",
+ "Key 6",
+ "Key 7",
+ "Key 8"
+ ]
+ },
+ "name" : "Cube",
+ "primitives" : [
+ {
+ "attributes" : {
+ "POSITION" : 0,
+ "NORMAL" : 1,
+ "TEXCOORD_0" : 2,
+ "TEXCOORD_1" : 3
+ },
+ "indices" : 4,
+ "material" : 0,
+ "targets" : [
+ {
+ "POSITION" : 5,
+ "NORMAL" : 6
+ },
+ {
+ "POSITION" : 7,
+ "NORMAL" : 8
+ },
+ {
+ "POSITION" : 9,
+ "NORMAL" : 10
+ },
+ {
+ "POSITION" : 11,
+ "NORMAL" : 12
+ },
+ {
+ "POSITION" : 13,
+ "NORMAL" : 14
+ },
+ {
+ "POSITION" : 15,
+ "NORMAL" : 16
+ },
+ {
+ "POSITION" : 17,
+ "NORMAL" : 18
+ },
+ {
+ "POSITION" : 19,
+ "NORMAL" : 20
+ }
+ ]
+ },
+ {
+ "attributes" : {
+ "POSITION" : 21,
+ "NORMAL" : 22,
+ "TEXCOORD_0" : 23,
+ "TEXCOORD_1" : 24
+ },
+ "indices" : 25,
+ "material" : 1,
+ "targets" : [
+ {
+ "POSITION" : 26,
+ "NORMAL" : 27
+ },
+ {
+ "POSITION" : 28,
+ "NORMAL" : 29
+ },
+ {
+ "POSITION" : 30,
+ "NORMAL" : 31
+ },
+ {
+ "POSITION" : 32,
+ "NORMAL" : 33
+ },
+ {
+ "POSITION" : 34,
+ "NORMAL" : 35
+ },
+ {
+ "POSITION" : 36,
+ "NORMAL" : 37
+ },
+ {
+ "POSITION" : 38,
+ "NORMAL" : 39
+ },
+ {
+ "POSITION" : 40,
+ "NORMAL" : 41
+ }
+ ]
+ }
+ ],
+ "weights" : [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ ],
+ "textures" : [
+ {
+ "sampler" : 0,
+ "source" : 0
+ },
+ {
+ "sampler" : 0,
+ "source" : 1
+ },
+ {
+ "sampler" : 0,
+ "source" : 2
+ }
+ ],
+ "images" : [
+ {
+ "mimeType" : "image/png",
+ "name" : "Base_AO",
+ "uri" : "Base_AO.png"
+ },
+ {
+ "mimeType" : "image/png",
+ "name" : "TinyGrid",
+ "uri" : "TinyGrid.png"
+ },
+ {
+ "mimeType" : "image/png",
+ "name" : "ColorSwatches",
+ "uri" : "ColorSwatches.png"
+ }
+ ],
+ "accessors" : [
+ {
+ "bufferView" : 0,
+ "componentType" : 5126,
+ "count" : 24,
+ "max" : [
+ 2,
+ 0,
+ 0.5
+ ],
+ "min" : [
+ -2,
+ -0.10000002384185791,
+ -0.5
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 1,
+ "componentType" : 5126,
+ "count" : 24,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 2,
+ "componentType" : 5126,
+ "count" : 24,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 3,
+ "componentType" : 5126,
+ "count" : 24,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 4,
+ "componentType" : 5123,
+ "count" : 36,
+ "type" : "SCALAR"
+ },
+ {
+ "bufferView" : 5,
+ "componentType" : 5126,
+ "count" : 24,
+ "max" : [
+ 0,
+ 0,
+ 0
+ ],
+ "min" : [
+ 0,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 6,
+ "componentType" : 5126,
+ "count" : 24,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 7,
+ "componentType" : 5126,
+ "count" : 24,
+ "max" : [
+ 0,
+ 0,
+ 0
+ ],
+ "min" : [
+ 0,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 8,
+ "componentType" : 5126,
+ "count" : 24,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 9,
+ "componentType" : 5126,
+ "count" : 24,
+ "max" : [
+ 0,
+ 0,
+ 0
+ ],
+ "min" : [
+ 0,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 10,
+ "componentType" : 5126,
+ "count" : 24,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 11,
+ "componentType" : 5126,
+ "count" : 24,
+ "max" : [
+ 0,
+ 0,
+ 0
+ ],
+ "min" : [
+ 0,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 12,
+ "componentType" : 5126,
+ "count" : 24,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 13,
+ "componentType" : 5126,
+ "count" : 24,
+ "max" : [
+ 0,
+ 0,
+ 0
+ ],
+ "min" : [
+ 0,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 14,
+ "componentType" : 5126,
+ "count" : 24,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 15,
+ "componentType" : 5126,
+ "count" : 24,
+ "max" : [
+ 0,
+ 0,
+ 0
+ ],
+ "min" : [
+ 0,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 16,
+ "componentType" : 5126,
+ "count" : 24,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 17,
+ "componentType" : 5126,
+ "count" : 24,
+ "max" : [
+ 0,
+ 0,
+ 0
+ ],
+ "min" : [
+ 0,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 18,
+ "componentType" : 5126,
+ "count" : 24,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 19,
+ "componentType" : 5126,
+ "count" : 24,
+ "max" : [
+ 0,
+ 0,
+ 0
+ ],
+ "min" : [
+ 0,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 20,
+ "componentType" : 5126,
+ "count" : 24,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 21,
+ "componentType" : 5126,
+ "count" : 1504,
+ "max" : [
+ 1.875,
+ 0.5,
+ 0.25
+ ],
+ "min" : [
+ -1.875,
+ 0,
+ -0.25
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 22,
+ "componentType" : 5126,
+ "count" : 1504,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 23,
+ "componentType" : 5126,
+ "count" : 1504,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 24,
+ "componentType" : 5126,
+ "count" : 1504,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 25,
+ "componentType" : 5123,
+ "count" : 7200,
+ "type" : "SCALAR"
+ },
+ {
+ "bufferView" : 26,
+ "componentType" : 5126,
+ "count" : 1504,
+ "max" : [
+ 0.04999995231628418,
+ 1,
+ 0
+ ],
+ "min" : [
+ -0.04999995231628418,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 27,
+ "componentType" : 5126,
+ "count" : 1504,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 28,
+ "componentType" : 5126,
+ "count" : 1504,
+ "max" : [
+ 0.04999995231628418,
+ 1,
+ 0
+ ],
+ "min" : [
+ -0.04999995231628418,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 29,
+ "componentType" : 5126,
+ "count" : 1504,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 30,
+ "componentType" : 5126,
+ "count" : 1504,
+ "max" : [
+ 0.050000011920928955,
+ 1,
+ 0
+ ],
+ "min" : [
+ -0.050000011920928955,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 31,
+ "componentType" : 5126,
+ "count" : 1504,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 32,
+ "componentType" : 5126,
+ "count" : 1504,
+ "max" : [
+ 0.050000011920928955,
+ 1,
+ 0
+ ],
+ "min" : [
+ -0.04999999701976776,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 33,
+ "componentType" : 5126,
+ "count" : 1504,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 34,
+ "componentType" : 5126,
+ "count" : 1504,
+ "max" : [
+ 0.04999999701976776,
+ 1,
+ 0
+ ],
+ "min" : [
+ -0.050000011920928955,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 35,
+ "componentType" : 5126,
+ "count" : 1504,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 36,
+ "componentType" : 5126,
+ "count" : 1504,
+ "max" : [
+ 0.050000011920928955,
+ 1,
+ 0
+ ],
+ "min" : [
+ -0.050000011920928955,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 37,
+ "componentType" : 5126,
+ "count" : 1504,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 38,
+ "componentType" : 5126,
+ "count" : 1504,
+ "max" : [
+ 0.04999995231628418,
+ 1,
+ 0
+ ],
+ "min" : [
+ -0.04999995231628418,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 39,
+ "componentType" : 5126,
+ "count" : 1504,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 40,
+ "componentType" : 5126,
+ "count" : 1504,
+ "max" : [
+ 0.04999995231628418,
+ 1,
+ 0
+ ],
+ "min" : [
+ -0.04999995231628418,
+ 0,
+ 0
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 41,
+ "componentType" : 5126,
+ "count" : 1504,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 42,
+ "componentType" : 5126,
+ "count" : 281,
+ "max" : [
+ 9.366666666666667
+ ],
+ "min" : [
+ 0.03333333333333333
+ ],
+ "type" : "SCALAR"
+ },
+ {
+ "bufferView" : 43,
+ "componentType" : 5126,
+ "count" : 2248,
+ "type" : "SCALAR"
+ },
+ {
+ "bufferView" : 44,
+ "componentType" : 5126,
+ "count" : 59,
+ "max" : [
+ 1.9666666666666666
+ ],
+ "min" : [
+ 0.03333333333333333
+ ],
+ "type" : "SCALAR"
+ },
+ {
+ "bufferView" : 45,
+ "componentType" : 5126,
+ "count" : 472,
+ "type" : "SCALAR"
+ },
+ {
+ "bufferView" : 46,
+ "componentType" : 5126,
+ "count" : 191,
+ "max" : [
+ 6.366666666666666
+ ],
+ "min" : [
+ 0.03333333333333333
+ ],
+ "type" : "SCALAR"
+ },
+ {
+ "bufferView" : 47,
+ "componentType" : 5126,
+ "count" : 1528,
+ "type" : "SCALAR"
+ }
+ ],
+ "bufferViews" : [
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 0
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 288
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 192,
+ "byteOffset" : 576
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 192,
+ "byteOffset" : 768
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 72,
+ "byteOffset" : 960
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 1032
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 1320
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 1608
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 1896
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 2184
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 2472
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 2760
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 3048
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 3336
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 3624
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 3912
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 4200
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 4488
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 4776
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 5064
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 288,
+ "byteOffset" : 5352
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 5640
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 23688
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 12032,
+ "byteOffset" : 41736
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 12032,
+ "byteOffset" : 53768
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 14400,
+ "byteOffset" : 65800
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 80200
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 98248
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 116296
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 134344
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 152392
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 170440
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 188488
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 206536
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 224584
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 242632
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 260680
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 278728
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 296776
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 314824
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 332872
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 18048,
+ "byteOffset" : 350920
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1124,
+ "byteOffset" : 368968
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 8992,
+ "byteOffset" : 370092
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 236,
+ "byteOffset" : 379084
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1888,
+ "byteOffset" : 379320
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 764,
+ "byteOffset" : 381208
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 6112,
+ "byteOffset" : 381972
+ }
+ ],
+ "samplers" : [
+ {
+ "magFilter" : 9729,
+ "minFilter" : 9987
+ }
+ ],
+ "buffers" : [
+ {
+ "byteLength" : 388084,
+ "uri" : "MorphStressTest.bin"
+ }
+ ]
+}
diff --git a/test/models/glTF2/MorphStressTest/glTF/TinyGrid.png b/test/models/glTF2/MorphStressTest/glTF/TinyGrid.png
new file mode 100644
index 000000000..81d040a68
--- /dev/null
+++ b/test/models/glTF2/MorphStressTest/glTF/TinyGrid.png
Binary files differ
diff --git a/test/models/glTF2/SimpleMorph/LICENSE.md b/test/models/glTF2/SimpleMorph/LICENSE.md
new file mode 100644
index 000000000..a94108529
--- /dev/null
+++ b/test/models/glTF2/SimpleMorph/LICENSE.md
@@ -0,0 +1,15 @@
+# LICENSE file for the model: Simple Morph
+
+All files in this directory tree are licensed as indicated below.
+
+* All files directly associated with the model including all text, image and binary files:
+
+ * [CC0 1.0 Universal]("https://creativecommons.org/publicdomain/zero/1.0/legalcode") [SPDX license identifier: "CC0-1.0"]
+
+* This file and all other metadocumentation files including "metadata.json":
+
+ * [Creative Commons Attribtution 4.0 International]("https://creativecommons.org/licenses/by/4.0/legalcode") [SPDX license identifier: "CC-BY-4.0"]
+
+Full license text of these licenses are available at the links above
+
+#### Generated by modelmetadata \ No newline at end of file
diff --git a/test/models/glTF2/SimpleMorph/README.body.md b/test/models/glTF2/SimpleMorph/README.body.md
new file mode 100644
index 000000000..02bb773bc
--- /dev/null
+++ b/test/models/glTF2/SimpleMorph/README.body.md
@@ -0,0 +1,17 @@
+## Screenshot
+
+![screenshot](screenshot/screenshot.png)
+
+## Notes
+
+This is an example of a glTF asset that uses morph targets, as described in the
+[Simple Morph Target](https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_017_SimpleMorphTarget.md)
+section of the glTF tutorial.
+
+## Data layout
+
+The following image shows the data layout of this sample:
+
+![simpleMorphStructure](screenshot/simpleMorphStructure.png)
+
+
diff --git a/test/models/glTF2/SimpleMorph/README.md b/test/models/glTF2/SimpleMorph/README.md
new file mode 100644
index 000000000..41f27498d
--- /dev/null
+++ b/test/models/glTF2/SimpleMorph/README.md
@@ -0,0 +1,41 @@
+# Simple Morph
+
+## Tags
+
+[core](../../Models-core.md), [testing](../../Models-testing.md)
+
+## Summary
+
+A triangle with a morph animation applied
+
+## Operations
+
+* [Display](https://github.khronos.org/glTF-Sample-Viewer-Release/?model=https://raw.GithubUserContent.com/KhronosGroup/glTF-Sample-Assets/main/./Models/SimpleMorph/glTF/SimpleMorph.gltf) in SampleViewer
+* [Model Directory](./)
+
+## Screenshot
+
+![screenshot](screenshot/screenshot.png)
+
+## Notes
+
+This is an example of a glTF asset that uses morph targets, as described in the
+[Simple Morph Target](https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_017_SimpleMorphTarget.md)
+section of the glTF tutorial.
+
+## Data layout
+
+The following image shows the data layout of this sample:
+
+![simpleMorphStructure](screenshot/simpleMorphStructure.png)
+
+
+
+
+## Legal
+
+&copy; 2017, Public. [CC0 1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/legalcode)
+
+ - javagl for Everything
+
+#### Assembled by modelmetadata \ No newline at end of file
diff --git a/test/models/glTF2/SimpleMorph/glTF/SimpleMorph.gltf b/test/models/glTF2/SimpleMorph/glTF/SimpleMorph.gltf
new file mode 100644
index 000000000..50091894f
--- /dev/null
+++ b/test/models/glTF2/SimpleMorph/glTF/SimpleMorph.gltf
@@ -0,0 +1,189 @@
+{
+ "scene" : 0,
+ "scenes":[
+ {
+ "nodes":[
+ 0
+ ]
+ }
+ ],
+ "nodes":[
+ {
+ "mesh":0
+ }
+ ],
+ "meshes":[
+ {
+ "primitives":[
+ {
+ "attributes":{
+ "POSITION":1
+ },
+ "targets":[
+ {
+ "POSITION":2
+ },
+ {
+ "POSITION":3
+ }
+ ],
+ "indices":0
+ }
+ ],
+ "weights":[
+ 0.5,
+ 0.5
+ ]
+ }
+ ],
+ "animations":[
+ {
+ "samplers":[
+ {
+ "input":4,
+ "interpolation":"LINEAR",
+ "output":5
+ }
+ ],
+ "channels":[
+ {
+ "sampler":0,
+ "target":{
+ "node":0,
+ "path":"weights"
+ }
+ }
+ ]
+ }
+ ],
+ "buffers":[
+ {
+ "uri" : "simpleMorphGeometry.bin",
+ "byteLength":116
+ },
+ {
+ "uri" : "simpleMorphAnimation.bin",
+ "byteLength":60
+ }
+ ],
+ "bufferViews":[
+ {
+ "buffer":0,
+ "byteOffset":0,
+ "byteLength":6,
+ "target":34963
+ },
+ {
+ "buffer":0,
+ "byteOffset":8,
+ "byteLength":108,
+ "byteStride":12,
+ "target":34962
+ },
+ {
+ "buffer":1,
+ "byteOffset":0,
+ "byteLength":20
+ },
+ {
+ "buffer":1,
+ "byteOffset":20,
+ "byteLength":40
+ }
+ ],
+ "accessors":[
+ {
+ "bufferView":0,
+ "byteOffset":0,
+ "componentType":5123,
+ "count":3,
+ "type":"SCALAR",
+ "max":[
+ 2
+ ],
+ "min":[
+ 0
+ ]
+ },
+ {
+ "bufferView":1,
+ "byteOffset":0,
+ "componentType":5126,
+ "count":3,
+ "type":"VEC3",
+ "max":[
+ 1.0,
+ 0.5,
+ 0.0
+ ],
+ "min":[
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ },
+ {
+ "bufferView":1,
+ "byteOffset":36,
+ "componentType":5126,
+ "count":3,
+ "type":"VEC3",
+ "max":[
+ 0.0,
+ 1.0,
+ 0.0
+ ],
+ "min":[
+ -1.0,
+ 0.0,
+ 0.0
+ ]
+ },
+ {
+ "bufferView":1,
+ "byteOffset":72,
+ "componentType":5126,
+ "count":3,
+ "type":"VEC3",
+ "max":[
+ 1.0,
+ 1.0,
+ 0.0
+ ],
+ "min":[
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ },
+ {
+ "bufferView":2,
+ "byteOffset":0,
+ "componentType":5126,
+ "count":5,
+ "type":"SCALAR",
+ "max":[
+ 4.0
+ ],
+ "min":[
+ 0.0
+ ]
+ },
+ {
+ "bufferView":3,
+ "byteOffset":0,
+ "componentType":5126,
+ "count":10,
+ "type":"SCALAR",
+ "max":[
+ 1.0
+ ],
+ "min":[
+ 0.0
+ ]
+ }
+ ],
+ "asset":{
+ "version":"2.0"
+ }
+}
diff --git a/test/models/glTF2/SimpleMorph/glTF/simpleMorphAnimation.bin b/test/models/glTF2/SimpleMorph/glTF/simpleMorphAnimation.bin
new file mode 100644
index 000000000..bbd0ee686
--- /dev/null
+++ b/test/models/glTF2/SimpleMorph/glTF/simpleMorphAnimation.bin
Binary files differ
diff --git a/test/models/glTF2/SimpleMorph/glTF/simpleMorphGeometry.bin b/test/models/glTF2/SimpleMorph/glTF/simpleMorphGeometry.bin
new file mode 100644
index 000000000..70b73c2c8
--- /dev/null
+++ b/test/models/glTF2/SimpleMorph/glTF/simpleMorphGeometry.bin
Binary files differ
diff --git a/test/models/glTF2/draco/robot.glb b/test/models/glTF2/draco/robot.glb
new file mode 100644
index 000000000..81679a60f
--- /dev/null
+++ b/test/models/glTF2/draco/robot.glb
Binary files differ
diff --git a/test/models/glTF2/ref/README.md b/test/models/glTF2/ref/README.md
new file mode 100644
index 000000000..63be83f11
--- /dev/null
+++ b/test/models/glTF2/ref/README.md
@@ -0,0 +1,16 @@
+# glTF 3D model reference images
+
+## AnimatedMorphCube
+<img alt="AnimatedMorphCube" src="screenshots/AnimatedMorphCube.gif" width=180 />
+
+## AnimatedMorphSphere
+<img alt="AnimatedMorphSphere" src="screenshots/AnimatedMorphSphere.gif" width=180 />
+
+## MorphPrimitivesTest
+<img alt="MorphPrimitivesTest" src="screenshots/MorphPrimitivesTest.gif" width=180 />
+
+## MorphStressTest
+<img alt="MorphStressTest" src="screenshots/MorphStressTest_cycle_animations.gif" width=180 />
+
+## SimpleMorph
+<img alt="SimpleMorph" src="screenshots/SimpleMorph.gif" width=180 />
diff --git a/test/models/glTF2/ref/screenshots/AnimatedMorphCube.gif b/test/models/glTF2/ref/screenshots/AnimatedMorphCube.gif
new file mode 100644
index 000000000..5c73ff8af
--- /dev/null
+++ b/test/models/glTF2/ref/screenshots/AnimatedMorphCube.gif
Binary files differ
diff --git a/test/models/glTF2/ref/screenshots/AnimatedMorphSphere.gif b/test/models/glTF2/ref/screenshots/AnimatedMorphSphere.gif
new file mode 100644
index 000000000..6e33d01b5
--- /dev/null
+++ b/test/models/glTF2/ref/screenshots/AnimatedMorphSphere.gif
Binary files differ
diff --git a/test/models/glTF2/ref/screenshots/MorphPrimitivesTest.gif b/test/models/glTF2/ref/screenshots/MorphPrimitivesTest.gif
new file mode 100644
index 000000000..fbd100620
--- /dev/null
+++ b/test/models/glTF2/ref/screenshots/MorphPrimitivesTest.gif
Binary files differ
diff --git a/test/models/glTF2/ref/screenshots/MorphStressTest_cycle_animations.gif b/test/models/glTF2/ref/screenshots/MorphStressTest_cycle_animations.gif
new file mode 100644
index 000000000..877b78f20
--- /dev/null
+++ b/test/models/glTF2/ref/screenshots/MorphStressTest_cycle_animations.gif
Binary files differ
diff --git a/test/models/glTF2/ref/screenshots/SimpleMorph.gif b/test/models/glTF2/ref/screenshots/SimpleMorph.gif
new file mode 100644
index 000000000..d883b352c
--- /dev/null
+++ b/test/models/glTF2/ref/screenshots/SimpleMorph.gif
Binary files differ
diff --git a/test/unit/AbstractImportExportBase.cpp b/test/unit/AbstractImportExportBase.cpp
index 80e53500d..eaa72781c 100644
--- a/test/unit/AbstractImportExportBase.cpp
+++ b/test/unit/AbstractImportExportBase.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/AssimpAPITest.cpp b/test/unit/AssimpAPITest.cpp
index 5797bde80..e15217e70 100644
--- a/test/unit/AssimpAPITest.cpp
+++ b/test/unit/AssimpAPITest.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/AssimpAPITest_aiMatrix3x3.cpp b/test/unit/AssimpAPITest_aiMatrix3x3.cpp
index 3a12b1e55..54e9719ea 100644
--- a/test/unit/AssimpAPITest_aiMatrix3x3.cpp
+++ b/test/unit/AssimpAPITest_aiMatrix3x3.cpp
@@ -3,9 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
-
-
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -42,6 +40,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "UnitTestPCH.h"
#include "MathTest.h"
+#include <array>
using namespace Assimp;
@@ -158,3 +157,18 @@ TEST_F(AssimpAPITest_aiMatrix3x3, aiMatrix3FromToTest) {
aiMatrix3FromTo(&result_c, &from, &to);
EXPECT_EQ(result_cpp, result_c);
}
+
+TEST_F(AssimpAPITest_aiMatrix3x3, operatorTest) {
+ std::array<ai_real, 9> value = { 1, 2, 3, 4, 5, 6, 7, 8,9};
+ result_cpp = aiMatrix3x3( value[0], value[1], value[2], value[3],
+ value[4], value[5], value[6], value[7],
+ value[8]);
+ size_t idx=0;
+ for (unsigned int i = 0; i < 3; ++i) {
+ for (unsigned int j = 0; j < 3; ++j) {
+ ai_real curValue = result_cpp[i][j];
+ EXPECT_EQ(curValue, value[idx]);
+ idx++;
+ }
+ }
+}
diff --git a/test/unit/AssimpAPITest_aiMatrix4x4.cpp b/test/unit/AssimpAPITest_aiMatrix4x4.cpp
index d57026348..403072182 100644
--- a/test/unit/AssimpAPITest_aiMatrix4x4.cpp
+++ b/test/unit/AssimpAPITest_aiMatrix4x4.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -41,6 +41,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "UnitTestPCH.h"
#include "MathTest.h"
#include <assimp/MathFunctions.h>
+#include <array>
using namespace Assimp;
@@ -262,3 +263,20 @@ TEST_F(AssimpAPITest_aiMatrix4x4, aiMatrix4FromToTest) {
aiMatrix4FromTo(&result_c, &from, &to);
EXPECT_EQ(result_cpp, result_c);
}
+
+TEST_F(AssimpAPITest_aiMatrix4x4, operatorTest) {
+ std::array<ai_real, 16> value = { 1, 2, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16 };
+ result_cpp = aiMatrix4x4( value[0], value[1], value[2], value[3],
+ value[4], value[5], value[6], value[7],
+ value[8], value[9], value[10], value[11],
+ value[12], value[13], value[14], value[15] );
+ size_t idx=0;
+ for (unsigned int i = 0; i < 4; ++i) {
+ for (unsigned int j = 0; j < 4; ++j) {
+ ai_real curValue = result_cpp[i][j];
+ EXPECT_EQ(curValue, value[idx]);
+ idx++;
+ }
+ }
+}
diff --git a/test/unit/AssimpAPITest_aiQuaternion.cpp b/test/unit/AssimpAPITest_aiQuaternion.cpp
index fe28bc9d0..b9766eb68 100644
--- a/test/unit/AssimpAPITest_aiQuaternion.cpp
+++ b/test/unit/AssimpAPITest_aiQuaternion.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/AssimpAPITest_aiVector2D.cpp b/test/unit/AssimpAPITest_aiVector2D.cpp
index 8831016cd..14755415e 100644
--- a/test/unit/AssimpAPITest_aiVector2D.cpp
+++ b/test/unit/AssimpAPITest_aiVector2D.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/AssimpAPITest_aiVector3D.cpp b/test/unit/AssimpAPITest_aiVector3D.cpp
index 67ad11bb6..cbe230306 100644
--- a/test/unit/AssimpAPITest_aiVector3D.cpp
+++ b/test/unit/AssimpAPITest_aiVector3D.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/Common/uiScene.cpp b/test/unit/Common/uiScene.cpp
index 5002b5dd8..d0de43b0f 100644
--- a/test/unit/Common/uiScene.cpp
+++ b/test/unit/Common/uiScene.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/Common/utAssertHandler.cpp b/test/unit/Common/utAssertHandler.cpp
index 53bf5c929..8f3cc42c7 100644
--- a/test/unit/Common/utAssertHandler.cpp
+++ b/test/unit/Common/utAssertHandler.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/Common/utBase64.cpp b/test/unit/Common/utBase64.cpp
index 910a908cb..53dd864ec 100644
--- a/test/unit/Common/utBase64.cpp
+++ b/test/unit/Common/utBase64.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/Common/utBaseProcess.cpp b/test/unit/Common/utBaseProcess.cpp
index f70dae07b..a620c7970 100644
--- a/test/unit/Common/utBaseProcess.cpp
+++ b/test/unit/Common/utBaseProcess.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/Common/utHash.cpp b/test/unit/Common/utHash.cpp
index 912aca11d..668994baa 100644
--- a/test/unit/Common/utHash.cpp
+++ b/test/unit/Common/utHash.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/Common/utLineSplitter.cpp b/test/unit/Common/utLineSplitter.cpp
index f62a00c74..2320ea599 100644
--- a/test/unit/Common/utLineSplitter.cpp
+++ b/test/unit/Common/utLineSplitter.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/Common/utLogger.cpp b/test/unit/Common/utLogger.cpp
new file mode 100644
index 000000000..a72f2d48e
--- /dev/null
+++ b/test/unit/Common/utLogger.cpp
@@ -0,0 +1,52 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2025, 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 "UnitTestPCH.h"
+#include <assimp/Importer.hpp>
+
+using namespace Assimp;
+class utLogger : public ::testing::Test {};
+
+TEST_F(utLogger, aiGetPredefinedLogStream_leak_test) {
+ aiLogStream stream1 = aiGetPredefinedLogStream(aiDefaultLogStream_STDOUT, nullptr);
+ aiLogStream stream2 = aiGetPredefinedLogStream(aiDefaultLogStream_STDOUT, nullptr);
+ ASSERT_EQ(stream1.callback, stream2.callback);
+}
diff --git a/test/unit/Common/utMaybe.cpp b/test/unit/Common/utMaybe.cpp
index c66b8f603..b50205339 100644
--- a/test/unit/Common/utMaybe.cpp
+++ b/test/unit/Common/utMaybe.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/Common/utMesh.cpp b/test/unit/Common/utMesh.cpp
index 7baaa92a0..a93b05d80 100644
--- a/test/unit/Common/utMesh.cpp
+++ b/test/unit/Common/utMesh.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/Common/utParsingUtils.cpp b/test/unit/Common/utParsingUtils.cpp
new file mode 100644
index 000000000..f7e36ffcb
--- /dev/null
+++ b/test/unit/Common/utParsingUtils.cpp
@@ -0,0 +1,66 @@
+/*
+---------------------------------------------------------------------------
+Open Asset Import Library (assimp)
+---------------------------------------------------------------------------
+
+Copyright (c) 2006-2025, 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 "UnitTestPCH.h"
+#include <assimp/ParsingUtils.h>
+#include <assimp/fast_atof.h>
+#include <array>
+
+using namespace Assimp;
+
+class utParsingUtils : public ::testing::Test {};
+
+TEST_F(utParsingUtils, parseFloatsStringTest) {
+ const std::array<float, 16> floatArray = {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 7.54979e-8f, -1.0f, 0.0f,
+ 0.0f, 1.0f, 7.54979e-8f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f};
+ const std::string floatArrayAsStr = "1 0 0 0 0 7.54979e-8 -1 0 0 1 7.54979e-8 0 0 0 0 1";
+ const char *content = floatArrayAsStr.c_str();
+ const char *end = content + floatArrayAsStr.size();
+ for (float i : floatArray) {
+ float value = 0.0f;
+ SkipSpacesAndLineEnd(&content, end);
+ content = fast_atoreal_move(content, value);
+ EXPECT_FLOAT_EQ(value, i);
+ }
+}
diff --git a/test/unit/Common/utSpatialSort.cpp b/test/unit/Common/utSpatialSort.cpp
index a75daebce..4cbe2aa91 100644
--- a/test/unit/Common/utSpatialSort.cpp
+++ b/test/unit/Common/utSpatialSort.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/Common/utStandardShapes.cpp b/test/unit/Common/utStandardShapes.cpp
index e1843d6c5..d8597d3eb 100644
--- a/test/unit/Common/utStandardShapes.cpp
+++ b/test/unit/Common/utStandardShapes.cpp
@@ -1,7 +1,7 @@
/*
Open Asset Import Library (assimp)
----------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, 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
diff --git a/test/unit/Common/utXmlParser.cpp b/test/unit/Common/utXmlParser.cpp
index b566aa381..a06712767 100644
--- a/test/unit/Common/utXmlParser.cpp
+++ b/test/unit/Common/utXmlParser.cpp
@@ -2,7 +2,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/Geometry/utGeometryUtils.cpp b/test/unit/Geometry/utGeometryUtils.cpp
index 345946132..292bcb5d9 100644
--- a/test/unit/Geometry/utGeometryUtils.cpp
+++ b/test/unit/Geometry/utGeometryUtils.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ImportExport/MDL/MDLHL1TestFiles.h b/test/unit/ImportExport/MDL/MDLHL1TestFiles.h
index 0fff3411e..187a0e307 100644
--- a/test/unit/ImportExport/MDL/MDLHL1TestFiles.h
+++ b/test/unit/ImportExport/MDL/MDLHL1TestFiles.h
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp
index f6e03cb09..17c2ac6a4 100644
--- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp
+++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_ImportSettings.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp
index d0345e3e4..140bbdf5d 100644
--- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp
+++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Materials.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp
index 1029a6138..f361a1005 100644
--- a/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp
+++ b/test/unit/ImportExport/MDL/utMDLImporter_HL1_Nodes.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ImportExport/RAW/utRAWImportExport.cpp b/test/unit/ImportExport/RAW/utRAWImportExport.cpp
index 9981ed2f7..01734e076 100644
--- a/test/unit/ImportExport/RAW/utRAWImportExport.cpp
+++ b/test/unit/ImportExport/RAW/utRAWImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp b/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp
index 1ddde44a6..f6b85af90 100644
--- a/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp
+++ b/test/unit/ImportExport/Terragen/utTerragenImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ImportExport/utAssjsonImportExport.cpp b/test/unit/ImportExport/utAssjsonImportExport.cpp
index c32b0f160..bec77b79d 100644
--- a/test/unit/ImportExport/utAssjsonImportExport.cpp
+++ b/test/unit/ImportExport/utAssjsonImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -57,18 +57,29 @@ public:
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/spider.obj", aiProcess_ValidateDataStructure);
Exporter exporter;
- aiReturn res = exporter.Export(scene, "assjson", "./spider_test.json");
+ const char *testFileName = "./spider_test.json";
+ aiReturn res = exporter.Export(scene, "assjson", testFileName);
if (aiReturn_SUCCESS != res) {
return false;
}
Assimp::ExportProperties exportProperties;
exportProperties.SetPropertyBool("JSON_SKIP_WHITESPACES", true);
- aiReturn resNoWhitespace = exporter.Export(scene, "assjson", "./spider_test_nowhitespace.json", 0u, &exportProperties);
+ const char *testNoWhitespaceFileName = "./spider_test_nowhitespace.json";
+ aiReturn resNoWhitespace = exporter.Export(scene, "assjson", testNoWhitespaceFileName, 0u, &exportProperties);
if (aiReturn_SUCCESS != resNoWhitespace) {
return false;
}
+ // Cleanup, remove generated json
+ if (0 != std::remove(testFileName)) {
+ return false;
+ }
+
+ if (0 != std::remove(testNoWhitespaceFileName)) {
+ return false;
+ }
+
return true;
}
};
diff --git a/test/unit/ImportExport/utCOBImportExport.cpp b/test/unit/ImportExport/utCOBImportExport.cpp
index 705cda38d..05a8e3e91 100644
--- a/test/unit/ImportExport/utCOBImportExport.cpp
+++ b/test/unit/ImportExport/utCOBImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -63,9 +63,7 @@ TEST(utCOBImporter, importDwarf) {
TEST(utCOBImporter, importMoleculeASCII) {
Assimp::Importer importer;
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/COB/molecule_ascii.cob", aiProcess_ValidateDataStructure);
- // FIXME: this is wrong, it should succeed
- // change to ASSERT_NE after it's been fixed
- ASSERT_EQ(nullptr, scene);
+ ASSERT_NE(nullptr, scene);
}
TEST(utCOBImporter, importMolecule) {
diff --git a/test/unit/ImportExport/utExporter.cpp b/test/unit/ImportExport/utExporter.cpp
index d94f179ed..607a38189 100644
--- a/test/unit/ImportExport/utExporter.cpp
+++ b/test/unit/ImportExport/utExporter.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ImportExport/utMD2Importer.cpp b/test/unit/ImportExport/utMD2Importer.cpp
index 975b8f641..6fd9428ff 100644
--- a/test/unit/ImportExport/utMD2Importer.cpp
+++ b/test/unit/ImportExport/utMD2Importer.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ImportExport/utMD5Importer.cpp b/test/unit/ImportExport/utMD5Importer.cpp
index 6fe558565..4af416de9 100644
--- a/test/unit/ImportExport/utMD5Importer.cpp
+++ b/test/unit/ImportExport/utMD5Importer.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ImportExport/utMDLImporter.cpp b/test/unit/ImportExport/utMDLImporter.cpp
index 43cdf9a1d..ec8480d99 100644
--- a/test/unit/ImportExport/utMDLImporter.cpp
+++ b/test/unit/ImportExport/utMDLImporter.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ImportExport/utNFFImportExport.cpp b/test/unit/ImportExport/utNFFImportExport.cpp
index b989578f5..411b49982 100644
--- a/test/unit/ImportExport/utNFFImportExport.cpp
+++ b/test/unit/ImportExport/utNFFImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -50,7 +50,7 @@ class utNFFImportExport : public AbstractImportExportBase {
public:
virtual bool importerTest() {
Assimp::Importer importer;
- const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/NFF/NFF/ManyEarthsNotJustOne.nff", 0);
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/NFF/ManyEarthsNotJustOne.nff", 0);
return nullptr != scene;
}
};
diff --git a/test/unit/ImportExport/utOFFImportExport.cpp b/test/unit/ImportExport/utOFFImportExport.cpp
index abd1fe154..90e050c73 100644
--- a/test/unit/ImportExport/utOFFImportExport.cpp
+++ b/test/unit/ImportExport/utOFFImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ImportExport/utOgreImportExport.cpp b/test/unit/ImportExport/utOgreImportExport.cpp
index d3234c036..37ff98c48 100644
--- a/test/unit/ImportExport/utOgreImportExport.cpp
+++ b/test/unit/ImportExport/utOgreImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ImportExport/utQ3BSPFileImportExport.cpp b/test/unit/ImportExport/utQ3BSPFileImportExport.cpp
index d8738eff7..728d934da 100644
--- a/test/unit/ImportExport/utQ3BSPFileImportExport.cpp
+++ b/test/unit/ImportExport/utQ3BSPFileImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ImportExport/utXGLImportExport.cpp b/test/unit/ImportExport/utXGLImportExport.cpp
index 080290e1d..616e3be5d 100644
--- a/test/unit/ImportExport/utXGLImportExport.cpp
+++ b/test/unit/ImportExport/utXGLImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/Main.cpp b/test/unit/Main.cpp
index 573c26a96..48022be0c 100644
--- a/test/unit/Main.cpp
+++ b/test/unit/Main.cpp
@@ -1,7 +1,6 @@
#include "../../include/assimp/DefaultLogger.hpp"
#include "UnitTestPCH.h"
-#include <math.h>
-#include <time.h>
+#include <ctime>
int main(int argc, char *argv[]) {
::testing::InitGoogleTest(&argc, argv);
@@ -14,12 +13,12 @@ int main(int argc, char *argv[]) {
// ............................................................................
// create a logger from both CPP
- Assimp::DefaultLogger::create("AssimpLog_Cpp.txt", Assimp::Logger::VERBOSE,
+ Assimp::DefaultLogger::create("AssimpLog_Cpp.log", Assimp::Logger::VERBOSE,
aiDefaultLogStream_STDOUT | aiDefaultLogStream_DEBUGGER | aiDefaultLogStream_FILE);
// .. and C. They should smoothly work together
aiEnableVerboseLogging(AI_TRUE);
- aiLogStream logstream = aiGetPredefinedLogStream(aiDefaultLogStream_FILE, "AssimpLog_C.txt");
+ aiLogStream logstream = aiGetPredefinedLogStream(aiDefaultLogStream_FILE, "AssimpLog_C.log");
aiAttachLogStream(&logstream);
int result = RUN_ALL_TESTS();
diff --git a/test/unit/MathTest.cpp b/test/unit/MathTest.cpp
index 6069df22e..1091036eb 100644
--- a/test/unit/MathTest.cpp
+++ b/test/unit/MathTest.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/MathTest.h b/test/unit/MathTest.h
index a09024370..896805f8b 100644
--- a/test/unit/MathTest.h
+++ b/test/unit/MathTest.h
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/RandomNumberGeneration.h b/test/unit/RandomNumberGeneration.h
index 0383332e4..e5d1fd9b6 100644
--- a/test/unit/RandomNumberGeneration.h
+++ b/test/unit/RandomNumberGeneration.h
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/SceneDiffer.cpp b/test/unit/SceneDiffer.cpp
index 6cbc33dde..d558e9805 100644
--- a/test/unit/SceneDiffer.cpp
+++ b/test/unit/SceneDiffer.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/SceneDiffer.h b/test/unit/SceneDiffer.h
index 06065bd5f..2fd6c6376 100644
--- a/test/unit/SceneDiffer.h
+++ b/test/unit/SceneDiffer.h
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/TestIOSystem.h b/test/unit/TestIOSystem.h
index 8791f9b92..60459ba5f 100644
--- a/test/unit/TestIOSystem.h
+++ b/test/unit/TestIOSystem.h
@@ -3,8 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
-
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/TestModelFactory.h b/test/unit/TestModelFactory.h
index 2ddf37e3e..1dfda4f88 100644
--- a/test/unit/TestModelFactory.h
+++ b/test/unit/TestModelFactory.h
@@ -3,9 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
-
-
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -49,18 +47,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace Assimp {
-class TestModelFacttory {
+class TestModelFactory {
public:
- TestModelFacttory() {
- // empty
- }
+ TestModelFactory() = default;
- ~TestModelFacttory() {
- // empty
- }
+ ~TestModelFactory() = default;
static aiScene *createDefaultTestModel( float &opacity ) {
- aiScene *scene( new aiScene );
+ auto *scene = new aiScene;
scene->mNumMaterials = 1;
scene->mMaterials = new aiMaterial*[scene->mNumMaterials];
scene->mMaterials[ 0 ] = new aiMaterial;
@@ -89,7 +83,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/UTLogStream.h b/test/unit/UTLogStream.h
index d35de8bdc..76171a706 100644
--- a/test/unit/UTLogStream.h
+++ b/test/unit/UTLogStream.h
@@ -3,8 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
-
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ut3DImportExport.cpp b/test/unit/ut3DImportExport.cpp
index 4cd538c46..fe83bd8d9 100644
--- a/test/unit/ut3DImportExport.cpp
+++ b/test/unit/ut3DImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/ut3DSImportExport.cpp b/test/unit/ut3DSImportExport.cpp
index a2da3607c..6de78c0f3 100644
--- a/test/unit/ut3DSImportExport.cpp
+++ b/test/unit/ut3DSImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utACImportExport.cpp b/test/unit/utACImportExport.cpp
index 4fdb68651..c3c0e4506 100644
--- a/test/unit/utACImportExport.cpp
+++ b/test/unit/utACImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utAMFImportExport.cpp b/test/unit/utAMFImportExport.cpp
index 996614572..4fca9bd14 100644
--- a/test/unit/utAMFImportExport.cpp
+++ b/test/unit/utAMFImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utASEImportExport.cpp b/test/unit/utASEImportExport.cpp
index e2d1bfa59..690a1fe4e 100644
--- a/test/unit/utASEImportExport.cpp
+++ b/test/unit/utASEImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utAnim.cpp b/test/unit/utAnim.cpp
index 613f7f03b..4075ebb7d 100644
--- a/test/unit/utAnim.cpp
+++ b/test/unit/utAnim.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utArmaturePopulate.cpp b/test/unit/utArmaturePopulate.cpp
index 9f4545c6a..493445e6f 100644
--- a/test/unit/utArmaturePopulate.cpp
+++ b/test/unit/utArmaturePopulate.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utAssbinImportExport.cpp b/test/unit/utAssbinImportExport.cpp
index 5eb2f56bd..3b24b3225 100644
--- a/test/unit/utAssbinImportExport.cpp
+++ b/test/unit/utAssbinImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utB3DImportExport.cpp b/test/unit/utB3DImportExport.cpp
index e84313ad8..b549d66e3 100644
--- a/test/unit/utB3DImportExport.cpp
+++ b/test/unit/utB3DImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utBVHImportExport.cpp b/test/unit/utBVHImportExport.cpp
index 94636c7bf..5d5b0c488 100644
--- a/test/unit/utBVHImportExport.cpp
+++ b/test/unit/utBVHImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utBatchLoader.cpp b/test/unit/utBatchLoader.cpp
index be1ac30ad..2552802e2 100644
--- a/test/unit/utBatchLoader.cpp
+++ b/test/unit/utBatchLoader.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/utBlendImportAreaLight.cpp b/test/unit/utBlendImportAreaLight.cpp
index cc6e1e1a0..bc9e4af2b 100644
--- a/test/unit/utBlendImportAreaLight.cpp
+++ b/test/unit/utBlendImportAreaLight.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utBlendImportMaterials.cpp b/test/unit/utBlendImportMaterials.cpp
index 416fb3236..f38f8c039 100644
--- a/test/unit/utBlendImportMaterials.cpp
+++ b/test/unit/utBlendImportMaterials.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utBlenderImportExport.cpp b/test/unit/utBlenderImportExport.cpp
index 0eda7b661..eeaf1cd37 100644
--- a/test/unit/utBlenderImportExport.cpp
+++ b/test/unit/utBlenderImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/utBlenderIntermediate.cpp b/test/unit/utBlenderIntermediate.cpp
index b76c48b44..c9b4c2057 100644
--- a/test/unit/utBlenderIntermediate.cpp
+++ b/test/unit/utBlenderIntermediate.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/utBlenderWork.cpp b/test/unit/utBlenderWork.cpp
index 2ba6329ca..3773251e6 100644
--- a/test/unit/utBlenderWork.cpp
+++ b/test/unit/utBlenderWork.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utCSMImportExport.cpp b/test/unit/utCSMImportExport.cpp
index 8ef14e282..c4b4e5d4c 100644
--- a/test/unit/utCSMImportExport.cpp
+++ b/test/unit/utCSMImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utColladaExport.cpp b/test/unit/utColladaExport.cpp
index e0a62b338..d7f450b7b 100644
--- a/test/unit/utColladaExport.cpp
+++ b/test/unit/utColladaExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -79,7 +79,7 @@ TEST_F(utColladaExport, testExportCamera) {
EXPECT_EQ(AI_SUCCESS, ex->Export(pTest, "collada", file));
const unsigned int origNumCams(pTest->mNumCameras);
- //std::vector<float> origFOV;
+
std::unique_ptr<float[]> origFOV(new float[origNumCams]);
std::unique_ptr<float[]> orifClipPlaneNear(new float[origNumCams]);
std::unique_ptr<float[]> orifClipPlaneFar(new float[origNumCams]);
@@ -114,6 +114,9 @@ TEST_F(utColladaExport, testExportCamera) {
EXPECT_FLOAT_EQ(pos[i].y, read->mPosition.y);
EXPECT_FLOAT_EQ(pos[i].z, read->mPosition.z);
}
+
+ // Cleanup, delete the exported file
+ EXPECT_EQ(0, std::remove(file));
}
// ------------------------------------------------------------------------------------------------
@@ -220,6 +223,9 @@ TEST_F(utColladaExport, testExportLight) {
EXPECT_NEAR(orig->mAngleInnerCone, read->mAngleInnerCone, 0.001);
EXPECT_NEAR(orig->mAngleOuterCone, read->mAngleOuterCone, 0.001);
}
+
+ // Cleanup, delete the exported file
+ EXPECT_EQ(0, std::remove(file));
}
#endif // ASSIMP_BUILD_NO_EXPORT
diff --git a/test/unit/utColladaImportExport.cpp b/test/unit/utColladaImportExport.cpp
index 4e92c6930..a508be5c9 100644
--- a/test/unit/utColladaImportExport.cpp
+++ b/test/unit/utColladaImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utD3MFImportExport.cpp b/test/unit/utD3MFImportExport.cpp
index 77655c0ad..d924086a7 100644
--- a/test/unit/utD3MFImportExport.cpp
+++ b/test/unit/utD3MFImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utDXFImporterExporter.cpp b/test/unit/utDXFImporterExporter.cpp
index ee0c57db6..80852ae4e 100644
--- a/test/unit/utDXFImporterExporter.cpp
+++ b/test/unit/utDXFImporterExporter.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utDefaultIOStream.cpp b/test/unit/utDefaultIOStream.cpp
index 2a2d7a894..b9707fb16 100644
--- a/test/unit/utDefaultIOStream.cpp
+++ b/test/unit/utDefaultIOStream.cpp
@@ -2,7 +2,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/utExport.cpp b/test/unit/utExport.cpp
index ebb664fa4..d4cff6610 100644
--- a/test/unit/utExport.cpp
+++ b/test/unit/utExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utFBXImporterExporter.cpp b/test/unit/utFBXImporterExporter.cpp
index 5cc40d216..6f4c8285f 100644
--- a/test/unit/utFBXImporterExporter.cpp
+++ b/test/unit/utFBXImporterExporter.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -311,6 +311,37 @@ TEST_F(utFBXImporterExporter, sceneMetadata) {
}
}
+TEST_F(utFBXImporterExporter, importCustomAxes) {
+ // see https://github.com/assimp/assimp/issues/5494
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/embedded_ascii/box.FBX", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ // The ASCII box has customised the Up and Forward axes, verify that the RootNode transform has applied it
+ ASSERT_FALSE(scene->mRootNode->mTransformation.IsIdentity()) << "Did not apply the custom axis transform";
+
+ aiVector3D upVec{ 0, 0, 1 }; // Up is +Z
+ aiVector3D forwardVec{ 0, -1, 0 }; // Forward is -Y
+ aiVector3D rightVec{ 1, 0, 0 }; // Right is +X
+ aiMatrix4x4 mat(rightVec.x, rightVec.y, rightVec.z, 0.0f,
+ upVec.x, upVec.y, upVec.z, 0.0f,
+ forwardVec.x, forwardVec.y, forwardVec.z, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f);
+
+ EXPECT_EQ(mat, scene->mRootNode->mTransformation);
+}
+
+TEST_F(utFBXImporterExporter, importIgnoreCustomAxes) {
+ // see https://github.com/assimp/assimp/issues/5494
+ Assimp::Importer importer;
+ importer.SetPropertyBool(AI_CONFIG_IMPORT_FBX_IGNORE_UP_DIRECTION, true);
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/embedded_ascii/box.FBX", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ // Verify that the RootNode transform has NOT applied the custom axes
+ EXPECT_TRUE(scene->mRootNode->mTransformation.IsIdentity());
+}
+
TEST_F(utFBXImporterExporter, importCubesWithOutOfRangeFloat) {
Assimp::Importer importer;
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/FBX/cubes_with_outofrange_float.fbx", aiProcess_ValidateDataStructure);
diff --git a/test/unit/utFastAtof.cpp b/test/unit/utFastAtof.cpp
index 50c26ca03..3c34565fb 100644
--- a/test/unit/utFastAtof.cpp
+++ b/test/unit/utFastAtof.cpp
@@ -3,9 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
-
-
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -122,6 +120,7 @@ protected:
TEST_CASE(0e-19);
TEST_CASE(400012);
TEST_CASE(5.9e-76);
+ TEST_CASE(7.54979e-8);
TEST_CASE_INF(inf);
TEST_CASE_INF(inf);
TEST_CASE_INF(infinity);
diff --git a/test/unit/utFindDegenerates.cpp b/test/unit/utFindDegenerates.cpp
index 405c35230..6325ed740 100644
--- a/test/unit/utFindDegenerates.cpp
+++ b/test/unit/utFindDegenerates.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utFindInvalidData.cpp b/test/unit/utFindInvalidData.cpp
index ab845b35e..0c931787a 100644
--- a/test/unit/utFindInvalidData.cpp
+++ b/test/unit/utFindInvalidData.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utFixInfacingNormals.cpp b/test/unit/utFixInfacingNormals.cpp
index 54fef7b59..54d822822 100644
--- a/test/unit/utFixInfacingNormals.cpp
+++ b/test/unit/utFixInfacingNormals.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/utGenBoundingBoxesProcess.cpp b/test/unit/utGenBoundingBoxesProcess.cpp
index 18b15c31e..f7d130055 100644
--- a/test/unit/utGenBoundingBoxesProcess.cpp
+++ b/test/unit/utGenBoundingBoxesProcess.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utGenNormals.cpp b/test/unit/utGenNormals.cpp
index 4a1db0216..baa056cf9 100644
--- a/test/unit/utGenNormals.cpp
+++ b/test/unit/utGenNormals.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utHMPImportExport.cpp b/test/unit/utHMPImportExport.cpp
index 8171bb26a..1ae18b7a9 100644
--- a/test/unit/utHMPImportExport.cpp
+++ b/test/unit/utHMPImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utIFCImportExport.cpp b/test/unit/utIFCImportExport.cpp
index 06009be2b..30698dda6 100644
--- a/test/unit/utIFCImportExport.cpp
+++ b/test/unit/utIFCImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utIOStreamBuffer.cpp b/test/unit/utIOStreamBuffer.cpp
index 381716040..ddd4bf98f 100644
--- a/test/unit/utIOStreamBuffer.cpp
+++ b/test/unit/utIOStreamBuffer.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/utIOSystem.cpp b/test/unit/utIOSystem.cpp
index 5bc9996b0..0e537d11a 100644
--- a/test/unit/utIOSystem.cpp
+++ b/test/unit/utIOSystem.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/utImporter.cpp b/test/unit/utImporter.cpp
index 2470283c0..ca482faa9 100644
--- a/test/unit/utImporter.cpp
+++ b/test/unit/utImporter.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -299,7 +299,7 @@ aiImporterDesc s_failingImporterDescription = {
class FailingImporter : public Assimp::BaseImporter {
public:
virtual ~FailingImporter() = default;
- virtual bool CanRead(const std::string &, Assimp::IOSystem *, bool) const override {
+ bool CanRead(const std::string &, Assimp::IOSystem *, bool) const override {
return true;
}
diff --git a/test/unit/utImproveCacheLocality.cpp b/test/unit/utImproveCacheLocality.cpp
index 269721eda..1349ecf1b 100644
--- a/test/unit/utImproveCacheLocality.cpp
+++ b/test/unit/utImproveCacheLocality.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utIssues.cpp b/test/unit/utIssues.cpp
index 2611ffdb9..0bf9956b6 100644
--- a/test/unit/utIssues.cpp
+++ b/test/unit/utIssues.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -55,7 +55,7 @@ class utIssues : public ::testing::Test {};
TEST_F( utIssues, OpacityBugWhenExporting_727 ) {
float opacity;
- aiScene *scene = TestModelFacttory::createDefaultTestModel(opacity);
+ aiScene *scene = TestModelFactory::createDefaultTestModel(opacity);
Assimp::Importer importer;
Assimp::Exporter exporter;
@@ -69,11 +69,15 @@ TEST_F( utIssues, OpacityBugWhenExporting_727 ) {
const aiScene *newScene( importer.ReadFile( path, aiProcess_ValidateDataStructure ) );
ASSERT_NE( nullptr, newScene );
float newOpacity;
- if ( newScene->mNumMaterials > 0 ) {
+ if (newScene->mNumMaterials > 0 ) {
EXPECT_EQ( AI_SUCCESS, newScene->mMaterials[ 0 ]->Get( AI_MATKEY_OPACITY, newOpacity ) );
EXPECT_FLOAT_EQ( opacity, newOpacity );
}
- delete scene;
+
+ TestModelFactory::releaseDefaultTestModel(&scene);
+
+ // Cleanup. Delete exported dae.dae file
+ EXPECT_EQ(0, std::remove(path.c_str()));
}
#endif // ASSIMP_BUILD_NO_EXPORT
diff --git a/test/unit/utJoinVertices.cpp b/test/unit/utJoinVertices.cpp
index 9dbe87536..a2fa3a253 100644
--- a/test/unit/utJoinVertices.cpp
+++ b/test/unit/utJoinVertices.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utLWOImportExport.cpp b/test/unit/utLWOImportExport.cpp
index 78572a7db..30e7a64ee 100644
--- a/test/unit/utLWOImportExport.cpp
+++ b/test/unit/utLWOImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utLWSImportExport.cpp b/test/unit/utLWSImportExport.cpp
index 3f9c62361..73a6bc76b 100644
--- a/test/unit/utLWSImportExport.cpp
+++ b/test/unit/utLWSImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utLimitBoneWeights.cpp b/test/unit/utLimitBoneWeights.cpp
index 5a543aa2b..ffaaa53cb 100644
--- a/test/unit/utLimitBoneWeights.cpp
+++ b/test/unit/utLimitBoneWeights.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utMDCImportExport.cpp b/test/unit/utMDCImportExport.cpp
index d5b8dee0b..e72186a70 100644
--- a/test/unit/utMDCImportExport.cpp
+++ b/test/unit/utMDCImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utMaterialSystem.cpp b/test/unit/utMaterialSystem.cpp
index 4d335a979..fb664e419 100644
--- a/test/unit/utMaterialSystem.cpp
+++ b/test/unit/utMaterialSystem.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -260,13 +260,15 @@ TEST_F(MaterialSystemTest, testMaterialTextureTypeEnum) {
case aiTextureType_METALNESS:
case aiTextureType_DIFFUSE_ROUGHNESS:
case aiTextureType_AMBIENT_OCCLUSION:
+ case aiTextureType_SHEEN:
+ case aiTextureType_CLEARCOAT:
+ case aiTextureType_TRANSMISSION:
case aiTextureType_MAYA_BASE:
case aiTextureType_MAYA_SPECULAR:
case aiTextureType_MAYA_SPECULAR_COLOR:
case aiTextureType_MAYA_SPECULAR_ROUGHNESS:
- case aiTextureType_SHEEN:
- case aiTextureType_CLEARCOAT:
- case aiTextureType_TRANSMISSION:
+ case aiTextureType_ANISOTROPY:
+ case aiTextureType_GLTF_METALLIC_ROUGHNESS:
case aiTextureType_UNKNOWN:
if (i > maxTextureType)
maxTextureType = i;
diff --git a/test/unit/utMatrix3x3.cpp b/test/unit/utMatrix3x3.cpp
index 54bbece7d..d8b1b2757 100644
--- a/test/unit/utMatrix3x3.cpp
+++ b/test/unit/utMatrix3x3.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utMatrix4x4.cpp b/test/unit/utMatrix4x4.cpp
index 510900e82..7826d66db 100644
--- a/test/unit/utMatrix4x4.cpp
+++ b/test/unit/utMatrix4x4.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utMetadata.cpp b/test/unit/utMetadata.cpp
index 76afd52ef..123bc5a1f 100644
--- a/test/unit/utMetadata.cpp
+++ b/test/unit/utMetadata.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -229,7 +229,7 @@ TEST_F( utMetadata, copy_test ) {
// bool test
{
- bool v;
+ bool v = true;
EXPECT_TRUE( copy.Get( "bool", v ) );
EXPECT_EQ( bv, v );
}
diff --git a/test/unit/utObjImportExport.cpp b/test/unit/utObjImportExport.cpp
index 8e9b4e633..16723df9b 100644
--- a/test/unit/utObjImportExport.cpp
+++ b/test/unit/utObjImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -525,3 +525,17 @@ TEST_F(utObjImportExport, import_with_line_continuations) {
EXPECT_NEAR(vertices[2].y, 0.5f, threshold);
EXPECT_NEAR(vertices[2].z, -0.5f, threshold);
}
+
+TEST_F(utObjImportExport, issue2355_mtl_texture_prefix) {
+ ::Assimp::Importer importer;
+ const aiScene *const scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/OBJ/mtl_different_folder.obj", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+
+ EXPECT_EQ(scene->mNumMaterials, 2U);
+ const aiMaterial *const material = scene->mMaterials[1];
+
+ aiString texturePath;
+ material->GetTexture(aiTextureType_DIFFUSE, 0, &texturePath);
+ // The MTL file is in `folder`, the image path should have been prefixed with the folder
+ EXPECT_STREQ("folder/image.jpg", texturePath.C_Str());
+}
diff --git a/test/unit/utObjTools.cpp b/test/unit/utObjTools.cpp
index f1437ff32..019d7da94 100644
--- a/test/unit/utObjTools.cpp
+++ b/test/unit/utObjTools.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utOpenGEXImportExport.cpp b/test/unit/utOpenGEXImportExport.cpp
index 51da9e237..dd3821ab0 100644
--- a/test/unit/utOpenGEXImportExport.cpp
+++ b/test/unit/utOpenGEXImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utPLYImportExport.cpp b/test/unit/utPLYImportExport.cpp
index 54d7e4328..630d38d35 100644
--- a/test/unit/utPLYImportExport.cpp
+++ b/test/unit/utPLYImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -89,7 +89,7 @@ TEST_F(utPLYImportExport, exportTest_Success) {
#endif // ASSIMP_BUILD_NO_EXPORT
-//Test issue 1623, crash when loading two PLY files in a row
+// Test issue 1623, crash when loading two PLY files in a row
TEST_F(utPLYImportExport, importerMultipleTest) {
Assimp::Importer importer;
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube.ply", aiProcess_ValidateDataStructure);
@@ -109,7 +109,7 @@ TEST_F(utPLYImportExport, importPLYwithUV) {
EXPECT_NE(nullptr, scene);
EXPECT_NE(nullptr, scene->mMeshes[0]);
- //This test model is using n-gons, so 6 faces instead of 12 tris
+ // This test model is using n-gons, so 6 faces instead of 12 tris
EXPECT_EQ(6u, scene->mMeshes[0]->mNumFaces);
EXPECT_EQ(aiPrimitiveType_POLYGON, scene->mMeshes[0]->mPrimitiveTypes);
EXPECT_EQ(true, scene->mMeshes[0]->HasTextureCoords(0));
@@ -121,7 +121,7 @@ TEST_F(utPLYImportExport, importBinaryPLY) {
EXPECT_NE(nullptr, scene);
EXPECT_NE(nullptr, scene->mMeshes[0]);
- //This test model is double sided, so 12 faces instead of 6
+ // This test model is double sided, so 12 faces instead of 6
EXPECT_EQ(12u, scene->mMeshes[0]->mNumFaces);
}
@@ -141,6 +141,27 @@ TEST_F(utPLYImportExport, importBinaryPLYWithRNNewline) {
EXPECT_EQ(2u, scene->mMeshes[0]->mFaces[0].mIndices[2]);
}
+// Tests of a PLY file gets read with \n as the fist character in the BINARY part
+TEST_F(utPLYImportExport, importBinaryPLYWithNewlineInBinary) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/cube_binary_starts_with_nl.ply", aiProcess_ValidateDataStructure);
+
+ ASSERT_NE(nullptr, scene);
+ ASSERT_NE(nullptr, scene->mMeshes[0]);
+ ASSERT_EQ(8u, scene->mMeshes[0]->mNumVertices);
+ // Make sure the first binary float was read correctly
+ ASSERT_FLOAT_EQ(5.967534f, scene->mMeshes[0]->mVertices[0][0]);
+ ASSERT_FLOAT_EQ(0, scene->mMeshes[0]->mVertices[0][1]);
+ ASSERT_FLOAT_EQ(0, scene->mMeshes[0]->mVertices[0][2]);
+
+ ASSERT_EQ(6u, scene->mMeshes[0]->mNumFaces);
+ // Also check if the indices were parsed correctly
+ ASSERT_EQ(4u, scene->mMeshes[0]->mFaces[0].mNumIndices);
+ EXPECT_EQ(0u, scene->mMeshes[0]->mFaces[0].mIndices[0]);
+ EXPECT_EQ(1u, scene->mMeshes[0]->mFaces[0].mIndices[1]);
+ EXPECT_EQ(2u, scene->mMeshes[0]->mFaces[0].mIndices[2]);
+}
+
TEST_F(utPLYImportExport, vertexColorTest) {
Assimp::Importer importer;
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/float-color.ply", aiProcess_ValidateDataStructure);
@@ -160,7 +181,7 @@ TEST_F(utPLYImportExport, vertexColorTest) {
TEST_F(utPLYImportExport, pointcloudTest) {
Assimp::Importer importer;
- //Could not use aiProcess_ValidateDataStructure since it's missing faces.
+ // Could not use aiProcess_ValidateDataStructure since it's missing faces.
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/issue623.ply", 0);
EXPECT_NE(nullptr, scene);
@@ -192,7 +213,7 @@ static const char *test_file =
TEST_F(utPLYImportExport, parseErrorTest) {
Assimp::Importer importer;
- //Could not use aiProcess_ValidateDataStructure since it's missing faces.
+ // Could not use aiProcess_ValidateDataStructure since it's missing faces.
const aiScene *scene = importer.ReadFileFromMemory(test_file, strlen(test_file), 0);
EXPECT_NE(nullptr, scene);
}
@@ -207,5 +228,57 @@ TEST_F(utPLYImportExport, parseInvalid) {
TEST_F(utPLYImportExport, payload_JVN42386607) {
Assimp::Importer importer;
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/PLY/payload_JVN42386607", 0);
- EXPECT_EQ(nullptr, scene);
-} \ No newline at end of file
+ EXPECT_EQ(nullptr, scene);
+}
+
+// Tests Issue #5729. Test, if properties defined multiple times. Unclear what to do, better to abort than to crash entirely
+TEST_F(utPLYImportExport, parseInvalidDoubleProperty) {
+ const char data[] = "ply\n"
+ "format ascii 1.0\n"
+ "element vertex 4\n"
+ "property float x\n"
+ "property float y\n"
+ "property float z\n"
+ "element vertex 8\n"
+ "property float x\n"
+ "property float y\n"
+ "property float z\n"
+ "end_header\n"
+ "0.0 0.0 0.0 0.0 0.0 0.0\n"
+ "0.0 0.0 1.0 0.0 0.0 1.0\n"
+ "0.0 1.0 0.0 0.0 1.0 0.0\n"
+ "0.0 0.0 1.0\n"
+ "0.0 1.0 0.0 0.0 0.0 1.0\n"
+ "0.0 1.0 1.0 0.0 1.0 1.0\n";
+
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFileFromMemory(data, sizeof(data), 0);
+ EXPECT_EQ(nullptr, scene);
+}
+
+// Tests Issue #5729. Test, if properties defined multiple times. Unclear what to do, better to abort than to crash entirely
+TEST_F(utPLYImportExport, parseInvalidDoubleCustomProperty) {
+ const char data[] = "ply\n"
+ "format ascii 1.0\n"
+ "element vertex 4\n"
+ "property float x\n"
+ "property float y\n"
+ "property float z\n"
+ "element name 8\n"
+ "property float x\n"
+ "element name 5\n"
+ "property float x\n"
+ "end_header\n"
+ "0.0 0.0 0.0 100.0 10.0\n"
+ "0.0 0.0 1.0 200.0 20.0\n"
+ "0.0 1.0 0.0 300.0 30.0\n"
+ "0.0 1.0 1.0 400.0 40.0\n"
+ "0.0 0.0 0.0 500.0 50.0\n"
+ "0.0 0.0 1.0 600.0 60.0\n"
+ "0.0 1.0 0.0 700.0 70.0\n"
+ "0.0 1.0 1.0 800.0 80.0\n";
+
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFileFromMemory(data, sizeof(data), 0);
+ EXPECT_EQ(nullptr, scene);
+}
diff --git a/test/unit/utPMXImporter.cpp b/test/unit/utPMXImporter.cpp
index a5aba923b..4610296fb 100644
--- a/test/unit/utPMXImporter.cpp
+++ b/test/unit/utPMXImporter.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utPretransformVertices.cpp b/test/unit/utPretransformVertices.cpp
index a7b21c893..9c6a5bbeb 100644
--- a/test/unit/utPretransformVertices.cpp
+++ b/test/unit/utPretransformVertices.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utProfiler.cpp b/test/unit/utProfiler.cpp
index a9a54a934..07026ea56 100644
--- a/test/unit/utProfiler.cpp
+++ b/test/unit/utProfiler.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/utQ3DImportExport.cpp b/test/unit/utQ3DImportExport.cpp
index 4fb71bb69..d5a9e16a0 100644
--- a/test/unit/utQ3DImportExport.cpp
+++ b/test/unit/utQ3DImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utRemoveComments.cpp b/test/unit/utRemoveComments.cpp
index f101b7d9e..82d9178d1 100644
--- a/test/unit/utRemoveComments.cpp
+++ b/test/unit/utRemoveComments.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utRemoveComponent.cpp b/test/unit/utRemoveComponent.cpp
index 5fbfe612c..affff813f 100644
--- a/test/unit/utRemoveComponent.cpp
+++ b/test/unit/utRemoveComponent.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utRemoveRedundantMaterials.cpp b/test/unit/utRemoveRedundantMaterials.cpp
index 5c9983859..519181924 100644
--- a/test/unit/utRemoveRedundantMaterials.cpp
+++ b/test/unit/utRemoveRedundantMaterials.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utRemoveVCProcess.cpp b/test/unit/utRemoveVCProcess.cpp
index fdb4049b9..548fd975a 100644
--- a/test/unit/utRemoveVCProcess.cpp
+++ b/test/unit/utRemoveVCProcess.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utSIBImporter.cpp b/test/unit/utSIBImporter.cpp
index e2deb85c2..dc5c9180b 100644
--- a/test/unit/utSIBImporter.cpp
+++ b/test/unit/utSIBImporter.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utSMDImportExport.cpp b/test/unit/utSMDImportExport.cpp
index 6e2bc08e7..131070f41 100644
--- a/test/unit/utSMDImportExport.cpp
+++ b/test/unit/utSMDImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utSTLImportExport.cpp b/test/unit/utSTLImportExport.cpp
index 7e2c29168..11f5d0969 100644
--- a/test/unit/utSTLImportExport.cpp
+++ b/test/unit/utSTLImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -106,10 +106,14 @@ TEST_F(utSTLImporterExporter, exporterTest) {
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/STL/Spider_ascii.stl", aiProcess_ValidateDataStructure);
Assimp::Exporter mAiExporter;
- mAiExporter.Export(scene, "stl", "spiderExport.stl");
+ const char *stlFileName = "spiderExport.stl";
+ mAiExporter.Export(scene, "stl", stlFileName);
- const aiScene *scene2 = importer.ReadFile("spiderExport.stl", aiProcess_ValidateDataStructure);
+ const aiScene *scene2 = importer.ReadFile(stlFileName, aiProcess_ValidateDataStructure);
EXPECT_NE(nullptr, scene2);
+
+ // Cleanup, delete the exported file
+ std::remove(stlFileName);
}
TEST_F(utSTLImporterExporter, test_export_pointclouds) {
@@ -162,8 +166,12 @@ TEST_F(utSTLImporterExporter, test_export_pointclouds) {
Assimp::Exporter mAiExporter;
ExportProperties *properties = new ExportProperties;
properties->SetPropertyBool(AI_CONFIG_EXPORT_POINT_CLOUDS, true);
- mAiExporter.Export(&scene, "stl", "testExport.stl", 0, properties);
+ const char *stlFileName = "testExport.stl";
+ mAiExporter.Export(&scene, "stl", stlFileName, 0, properties);
+
+ // Cleanup, delete the exported file
+ ::remove(stlFileName);
delete properties;
}
diff --git a/test/unit/utScaleProcess.cpp b/test/unit/utScaleProcess.cpp
index 5772d4883..5a1197998 100644
--- a/test/unit/utScaleProcess.cpp
+++ b/test/unit/utScaleProcess.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utSceneCombiner.cpp b/test/unit/utSceneCombiner.cpp
index 055b54f5b..be218c468 100644
--- a/test/unit/utSceneCombiner.cpp
+++ b/test/unit/utSceneCombiner.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utScenePreprocessor.cpp b/test/unit/utScenePreprocessor.cpp
index 5e3dd95ce..999b0c75c 100644
--- a/test/unit/utScenePreprocessor.cpp
+++ b/test/unit/utScenePreprocessor.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utSharedPPData.cpp b/test/unit/utSharedPPData.cpp
index f70d352ff..5959c23c6 100644
--- a/test/unit/utSharedPPData.cpp
+++ b/test/unit/utSharedPPData.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
diff --git a/test/unit/utSimd.cpp b/test/unit/utSimd.cpp
index 3f073b475..d60258925 100644
--- a/test/unit/utSimd.cpp
+++ b/test/unit/utSimd.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utSortByPType.cpp b/test/unit/utSortByPType.cpp
index ff8b717ef..2c1ceca33 100644
--- a/test/unit/utSortByPType.cpp
+++ b/test/unit/utSortByPType.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -43,6 +43,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "Common/ScenePreprocessor.h"
#include "PostProcessing/SortByPTypeProcess.h"
#include <assimp/scene.h>
+#include <assimp/postprocess.h>
using namespace std;
using namespace Assimp;
@@ -202,3 +203,9 @@ TEST_F(SortByPTypeProcessTest, SortByPTypeStep) {
}
}
}
+
+TEST_F(SortByPTypeProcessTest, issue389327770Test) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/fuzzer_data/clusterfuzz-testcase-minimized-assimp_fuzzer-4751812606885888", aiProcessPreset_TargetRealtime_Fast);
+ EXPECT_NE(nullptr, scene);
+}
diff --git a/test/unit/utSplitLargeMeshes.cpp b/test/unit/utSplitLargeMeshes.cpp
index b8bab7193..85b3a464b 100644
--- a/test/unit/utSplitLargeMeshes.cpp
+++ b/test/unit/utSplitLargeMeshes.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utStringUtils.cpp b/test/unit/utStringUtils.cpp
index 7cb11797d..d6f4ca6ba 100644
--- a/test/unit/utStringUtils.cpp
+++ b/test/unit/utStringUtils.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utTargetAnimation.cpp b/test/unit/utTargetAnimation.cpp
index 2711e895c..a67495110 100644
--- a/test/unit/utTargetAnimation.cpp
+++ b/test/unit/utTargetAnimation.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utTextureTransform.cpp b/test/unit/utTextureTransform.cpp
index 2711e895c..a67495110 100644
--- a/test/unit/utTextureTransform.cpp
+++ b/test/unit/utTextureTransform.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utTriangulate.cpp b/test/unit/utTriangulate.cpp
index 2df0ce6cd..75821b5b8 100644
--- a/test/unit/utTriangulate.cpp
+++ b/test/unit/utTriangulate.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utTypes.cpp b/test/unit/utTypes.cpp
index 45a4b5517..b5c91c2e9 100644
--- a/test/unit/utTypes.cpp
+++ b/test/unit/utTypes.cpp
@@ -1,11 +1,8 @@
/*
---------------------------------------------------------------------------
Open Asset Import Library (assimp)
----------------------------------------------------------------------------
-
-Copyright (c) 2006-2024, assimp team
-
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utUSDImport.cpp b/test/unit/utUSDImport.cpp
index 2f4ffeaf4..040e5d3aa 100644
--- a/test/unit/utUSDImport.cpp
+++ b/test/unit/utUSDImport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -49,18 +49,42 @@ Copyright (c) 2006-2024, assimp team
using namespace ::Assimp;
class utUSDImport : public AbstractImportExportBase {
-public:
- virtual bool importerTest() {
- Assimp::Importer importer;
- const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/../models-nonbsd/USD/suzanne.usdc", aiProcess_ValidateDataStructure);
- EXPECT_EQ(1u, scene->mNumMeshes);
- EXPECT_NE(nullptr, scene->mMeshes[0]);
- if (nullptr == scene->mMeshes[0]) {
- return false;
- }
- EXPECT_EQ(507u, scene->mMeshes[0]->mNumVertices);
- EXPECT_EQ(968u, scene->mMeshes[0]->mNumFaces);
-
- return (nullptr != scene);
- }
};
+
+TEST_F(utUSDImport, meshTest) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/../models-nonbsd/USD/usdc/suzanne.usdc", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_EQ(1u, scene->mNumMeshes);
+ EXPECT_NE(nullptr, scene->mMeshes[0]);
+ EXPECT_EQ(1968u, scene->mMeshes[0]->mNumVertices); // Note: suzanne is authored with only 507 vertices, but TinyUSDZ rebuilds the vertex array. see https://github.com/lighttransport/tinyusdz/blob/36f2aabb256b360365989c01a52f839a57dfe2a6/src/tydra/render-data.cc#L2673-L2690
+ EXPECT_EQ(968u, scene->mMeshes[0]->mNumFaces);
+}
+
+TEST_F(utUSDImport, skinnedMeshTest) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/../models-nonbsd/USD/usda/simple-skin-test.usda", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_TRUE(scene->HasMeshes());
+
+ const aiMesh *mesh = scene->mMeshes[0];
+ EXPECT_EQ(2, mesh->mNumBones);
+
+ // Check bone names and make sure scene has nodes of the same name
+ EXPECT_EQ(mesh->mBones[0]->mName, aiString("Bone"));
+ EXPECT_EQ(mesh->mBones[1]->mName, aiString("Bone/Bone_001"));
+
+ EXPECT_NE(nullptr, scene->mRootNode->FindNode("Bone"));
+ EXPECT_NE(nullptr, scene->mRootNode->FindNode("Bone/Bone_001"));
+}
+
+TEST_F(utUSDImport, singleAnimationTest) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/../models-nonbsd/USD/usda/simple-skin-animation-test.usda", aiProcess_ValidateDataStructure);
+ EXPECT_NE(nullptr, scene);
+ EXPECT_TRUE(scene->HasAnimations());
+ EXPECT_EQ(2, scene->mAnimations[0]->mNumChannels); // 2 bones. 1 channel for each bone
+}
+
+// Note: Add multi-animation test once supported by USD
+// See https://github.com/lighttransport/tinyusdz/issues/122 for details.
diff --git a/test/unit/utVector3.cpp b/test/unit/utVector3.cpp
index f13521894..bdf41c6cf 100644
--- a/test/unit/utVector3.cpp
+++ b/test/unit/utVector3.cpp
@@ -2,7 +2,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utVersion.cpp b/test/unit/utVersion.cpp
index 57a3a57db..078bfd7be 100644
--- a/test/unit/utVersion.cpp
+++ b/test/unit/utVersion.cpp
@@ -2,7 +2,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -48,20 +48,20 @@ TEST_F( utVersion, aiGetLegalStringTest ) {
EXPECT_NE( lv, nullptr );
std::string text( lv );
- size_t pos = text.find(std::string("2024"));
+ size_t pos = text.find(std::string("2025"));
EXPECT_NE(pos, std::string::npos);
}
TEST_F( utVersion, aiGetVersionMajorTest ) {
- EXPECT_EQ( aiGetVersionMajor(), 5U );
+ EXPECT_EQ( aiGetVersionMajor(), 6U );
}
TEST_F( utVersion, aiGetVersionMinorTest ) {
- EXPECT_EQ(aiGetVersionMinor(), 4U);
+ EXPECT_EQ(aiGetVersionMinor(), 0U);
}
TEST_F( utVersion, aiGetVersionPatchTest ) {
- EXPECT_EQ(aiGetVersionPatch(), 3U );
+ EXPECT_EQ(aiGetVersionPatch(), 2U );
}
TEST_F( utVersion, aiGetCompileFlagsTest ) {
diff --git a/test/unit/utVertexTriangleAdjacency.cpp b/test/unit/utVertexTriangleAdjacency.cpp
index f5ad492ef..341241e07 100644
--- a/test/unit/utVertexTriangleAdjacency.cpp
+++ b/test/unit/utVertexTriangleAdjacency.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utX3DImportExport.cpp b/test/unit/utX3DImportExport.cpp
index b0b6802b9..e60e335ce 100644
--- a/test/unit/utX3DImportExport.cpp
+++ b/test/unit/utX3DImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -73,3 +73,25 @@ TEST_F(utX3DImportExport, importX3DIndexedLineSet) {
ASSERT_EQ(scene->mMeshes[0]->mFaces[i].mNumIndices, 2u);
}
}
+
+TEST_F(utX3DImportExport, importX3DComputerKeyboard) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/X3D/ComputerKeyboard.x3d", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+ // TODO: CHANGE INCORRECT VALUE WHEN IMPORTER FIXED
+ // As noted in assimp issue 4992, X3D importer was severely broken with 5 Oct 2020 commit 3b9d4cf.
+ // ComputerKeyboard.x3d should have 100 meshes but broken importer only has 4
+ ASSERT_EQ(4u, scene->mNumMeshes); // Incorrect value from currently broken importer
+ ASSERT_NE(100u, scene->mNumMeshes); // Correct value, to be restored when importer fixed
+}
+
+TEST_F(utX3DImportExport, importX3DChevyTahoe) {
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_NONBSD_DIR "/X3D/Chevy/ChevyTahoe.x3d", aiProcess_ValidateDataStructure);
+ ASSERT_NE(nullptr, scene);
+ // TODO: CHANGE INCORRECT VALUE WHEN IMPORTER FIXED
+ // As noted in assimp issue 4992, X3D importer was severely broken with 5 Oct 2020 commit 3b9d4cf.
+ // ChevyTahoe.x3d should have 20 meshes but broken importer only has 19
+ ASSERT_EQ(19u, scene->mNumMeshes); // Incorrect value from currently broken importer
+ ASSERT_NE(20u, scene->mNumMeshes); // Correct value, to be restored when importer fixed
+}
diff --git a/test/unit/utXImporterExporter.cpp b/test/unit/utXImporterExporter.cpp
index 807e3ca83..fe25199c1 100644
--- a/test/unit/utXImporterExporter.cpp
+++ b/test/unit/utXImporterExporter.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp
index c29d17d33..bce57976a 100644
--- a/test/unit/utglTF2ImportExport.cpp
+++ b/test/unit/utglTF2ImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.
@@ -897,6 +897,27 @@ TEST_F(utglTF2ImportExport, import_dracoEncoded) {
ASSERT_EQ(strcmp(generator.C_Str(), "COLLADA2GLTF"), 0);
}
#endif
+ const aiScene *robotScene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/draco/robot.glb",
+ aiProcess_ValidateDataStructure);
+#ifndef ASSIMP_ENABLE_DRACO
+ // No draco support, scene should not load
+ ASSERT_EQ(robotScene, nullptr);
+#else
+ ASSERT_NE(robotScene, nullptr);
+ ASSERT_NE(robotScene->mMetaData, nullptr);
+ {
+ ASSERT_TRUE(robotScene->mMetaData->HasKey(AI_METADATA_SOURCE_FORMAT));
+ aiString format;
+ ASSERT_TRUE(robotScene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT, format));
+ ASSERT_EQ(strcmp(format.C_Str(), "glTF2 Importer"), 0);
+ }
+ {
+ ASSERT_TRUE(robotScene->mMetaData->HasKey(AI_METADATA_SOURCE_FORMAT_VERSION));
+ aiString version;
+ ASSERT_TRUE(robotScene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT_VERSION, version));
+ ASSERT_EQ(strcmp(version.C_Str(), "2.0"), 0);
+ }
+#endif
}
TEST_F(utglTF2ImportExport, wrongTypes) {
@@ -912,8 +933,8 @@ TEST_F(utglTF2ImportExport, wrongTypes) {
TUPLE("/glTF2/wrongTypes/badString.gltf", "string", "name", "scenes[0]"),
TUPLE("/glTF2/wrongTypes/badUint.gltf", "uint", "index", "materials[0]"),
TUPLE("/glTF2/wrongTypes/badNumber.gltf", "number", "scale", "materials[0]"),
- TUPLE("/glTF2/wrongTypes/badObject.gltf", "object", "pbrMetallicRoughness", "materials[0]"),
- TUPLE("/glTF2/wrongTypes/badExtension.gltf", "object", "KHR_texture_transform", "materials[0]")
+ //TUPLE("/glTF2/wrongTypes/badObject.gltf", "object", "pbrMetallicRoughness", "materials[0]"),
+ //TUPLE("/glTF2/wrongTypes/badExtension.gltf", "object", "KHR_texture_transform", "materials[0]")
#undef TUPLE
};
for (const auto& tuple : wrongTypes)
@@ -931,6 +952,28 @@ TEST_F(utglTF2ImportExport, wrongTypes) {
}
}
+TEST_F(utglTF2ImportExport, wrongObject) {
+ // Deliberately broken version of the BoxTextured.gltf asset.
+ using tup_T = std::tuple<std::string, std::string, std::string, std::string>;
+ std::vector<tup_T> wrongTypes = {
+#ifdef __cpp_lib_constexpr_tuple
+#define TUPLE(x, y, z, w) \
+ { x, y, z, w }
+#else
+#define TUPLE(x, y, z, w) tup_T(x, y, z, w)
+#endif
+ TUPLE("/glTF2/wrongTypes/badObject.gltf", "object", "pbrMetallicRoughness", "materials[0]"),
+ TUPLE("/glTF2/wrongTypes/badExtension.gltf", "object", "KHR_texture_transform", "materials[0]")
+#undef TUPLE
+ };
+ for (const auto &tuple : wrongTypes) {
+ const auto &file = std::get<0>(tuple);
+ Assimp::Importer importer;
+ const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR + file, aiProcess_ValidateDataStructure);
+ ASSERT_NE(scene, nullptr);
+ }
+}
+
namespace {
/// This class provides a fake schema to the GLTF importer.
/// It just checks that the file has a top-level "scene" property which is an integer.
diff --git a/test/unit/utglTFImportExport.cpp b/test/unit/utglTFImportExport.cpp
index 9d1cebc54..71dc36c3e 100644
--- a/test/unit/utglTFImportExport.cpp
+++ b/test/unit/utglTFImportExport.cpp
@@ -3,7 +3,7 @@
Open Asset Import Library (assimp)
---------------------------------------------------------------------------
-Copyright (c) 2006-2024, assimp team
+Copyright (c) 2006-2025, assimp team
All rights reserved.