pax_global_header00006660000000000000000000000064144446332640014524gustar00rootroot0000000000000052 comment=af74a6f676a932ad312ce374c8ebc75fbb2f1a00 vedo-2023.4.6/000077500000000000000000000000001444463326400127175ustar00rootroot00000000000000vedo-2023.4.6/.circleci/000077500000000000000000000000001444463326400145525ustar00rootroot00000000000000vedo-2023.4.6/.circleci/config.yml000066400000000000000000000044471444463326400165530ustar00rootroot00000000000000# Python CircleCI 2.0 configuration file # # Check https://circleci.com/docs/2.0/language-python/ for more details version: 2 jobs: ############################################################## test-vedo: machine: image: ubuntu-2004:current resource_class: medium environment: MPLBACKEND: "agg" DEBIAN_FRONTEND: "noninteractive" steps: - checkout - run: name: installing vedo command: | sudo apt-get update sudo apt install libgl1-mesa-dev xvfb -y pip3 install vedo pip3 install matplotlib pip3 install scipy pip3 install --no-deps . - run: name: Run tests command: | cd cd project/tests/common source run_all.sh - store_artifacts: path: test-reports destination: test-reports ############################################################## test-dolfinx: docker: - image: quay.io/fenicsproject/dolfinx:dev-env-real environment: MPLBACKEND: "agg" DEBIAN_FRONTEND: "noninteractive" steps: - checkout - run: name: install vedo et al command: | pip3 install vtk pip3 install . - run: name: Get dolfinx cmake compile and install command: | pip3 install git+https://github.com/FEniCS/fiat.git --upgrade pip3 install git+https://github.com/FEniCS/ufl.git --upgrade pip3 install git+https://github.com/FEniCS/ffcx.git --upgrade rm -rf /usr/local/include/dolfin /usr/local/include/dolfin.h git clone https://github.com/FEniCS/dolfinx.git cd dolfinx mkdir -p build && cd build && cmake -G Ninja -DCMAKE_BUILD_TYPE=Developer ../cpp/ ninja -j3 install cd ../python pip3 -v install . --user - run: name: Run tests command: | cd cd project/tests/dolfinx source run_all.sh - store_artifacts: path: test-reports destination: test-reports ###################################################### workflows: version: 2 build-stuff: jobs: - test-vedo #- test-dolfinx vedo-2023.4.6/.gitignore000066400000000000000000000004361444463326400147120ustar00rootroot00000000000000*pyc .DS_Store .vedo_recorded_events.log .vedo_pipeline_graphviz* docs/examples_db.js docs/index.html vedo.egg-info build .jupyter .ipynb *.ipynb .ipynb_checkpoints examples/notebooks/.ipynb_checkpoints *png *jpg *tiff *tif *npz untitled*.py bug_*.py prove speed_tester.py data www vedo-2023.4.6/CODE_OF_CONDUCT.md000066400000000000000000000057501444463326400155250ustar00rootroot00000000000000## Code of Conduct ### Our Pledge We, as contributors and maintainers of the vedo project, pledge to make participation in our project a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. We are committed to creating a welcoming and inclusive environment for all. ### Our Standards Examples of behavior that contributes to creating a positive environment include: - Using welcoming and inclusive language - Being respectful of differing viewpoints and experiences - Gracefully accepting constructive criticism - Focusing on what is best for the community - Showing empathy towards other community members Examples of unacceptable behavior by participants include: - The use of sexualized language or imagery and unwelcome sexual attention or advances - Trolling, insulting/derogatory comments, and personal or political attacks - Public or private harassment - Publishing others' private information, such as a physical or electronic address, without explicit permission - Other conduct which could reasonably be considered inappropriate in a professional setting ### Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ### Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing the project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ### Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [this email](marco.musy@embl.es). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ### Attribution This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.vedo-2023.4.6/CONTRIBUTING.md000066400000000000000000000034161444463326400151540ustar00rootroot00000000000000## Contributing to vedo Thank you for considering contributing to vedo! vedo is an open-source 3D visualization library for scientific data in Python. It aims to provide an easy-to-use and flexible toolset for creating publication-quality visualizations of complex 3D data. We welcome all contributions, including bug reports, feature requests, and code contributions. This file outlines the guidelines for contributing to the vedo project. ### Reporting bugs and requesting features If you encounter a bug in vedo, or would like to request a new feature, please open an issue on the vedo GitHub repository. When opening an issue, please provide as much detail as possible about the problem or feature request, including code snippets, screenshots, or other relevant information. ### Contributing code If you would like to contribute code to vedo, please follow these guidelines: Fork the vedo repository and create a new branch for your changes. Make your changes, including adding tests and updating documentation as necessary. Submit a pull request to the vedo repository. When submitting a pull request, please provide a clear and detailed description of your changes, including the motivation for the changes and any relevant background information. All contributions will be reviewed by the vedo development team, and we may request changes or ask for additional information before merging your changes. ### Code style When contributing code to vedo, please follow the PEP 8 style guide. ###Licensing All contributions to vedo are subject to the MIT license. By contributing to vedo, you agree to license your contributions under the terms of this license. ### Thank you! We appreciate your interest in contributing to vedo, and we look forward to working with you to make it even better! vedo-2023.4.6/FONT.LICENSE000066400000000000000000000167011444463326400144760ustar00rootroot00000000000000Files: vedo/fonts/Bongas.* Source: https://www.1001freefonts.com/boogaloo.font Copyright: 2011 John Vargas Beltrán, with Reserved Font Name Boogaloo 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name Bongas License: OFL Files: vedo/fonts/Calco.* Source: https://www.1001freefonts.com/calling-code.font Copyright: 2017 Ryoichi Tsunekawa, with Reserved Font Name Calling Code 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name Calco License: OFL Files: vedo/fonts/Comae.* Source: https://www.1001freefonts.com/comfortaa.font Copyright: 2011 Johan Aakerlund, with Reserved Font Name Comfortaa 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name Comae License: OFL Files: vedo/fonts/Glasgo.* Source: https://www.1001freefonts.com/class-coder.font Copyright: 2017 Walter E Stewart, with Reserved Font Name Class Coder 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name Glasgo License: OFL Files: vedo/fonts/Kanopus.* Source: https://www.1001freefonts.com/kelvinch.font Copyright: 2016 Paul Miller, with Reserved Font Names "Kelvinch" and "SIL" 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name Kanopus License: OFL Files: vedo/fonts/Normografo.* Source: https://www.1001freefonts.com/tecnico-font-19886.font Copyright: 2017 Cristhian Gomez, with Reserved Font Name Tecnico 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name Normografo License: OFL Files: vedo/fonts/SmartCouric.* Source: https://www.fontsquirrel.com/fonts/courier-prime Copyright: 2013 Quote-Unquote Apps, with Reserved Font Name Courier Prime 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name SmartCouric License: OFL Files: vedo/fonts/Theemim.* Source: https://www.1001freefonts.com/theano-didot.font Copyright: Alexey Kryukov, with Reserved Font Name Theano Didot 2020 M. Musy Comment: 2020 subset and polygonized for vedo with name Theemim License: OFL Files: vedo/fonts/VictorMono.ttf Source: https://www.fontsquirrel.com/fonts/victor-mono Copyright: 2019 Rune Bjørnerås, (https://rubjo.github.io/victor-mono) License: MIT Files: vedo/fonts/Quikhand.ttf Source: https://www.1001freefonts.com/quikhand.font Copyright: 2020 Qwerks (http://graphicriver.net/user/joiaco) License: public-domain License: MIT Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: . The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. . THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. License: public-domain Files in the public domain have no restrictions on use and may be used, modified and redistributed freely. Licence: OFL SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 . PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. . The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. . DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. . "Reserved Font Name" refers to any names specified as such after the copyright statement(s). . "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). . "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. . "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. . PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: . 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. . 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. . 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. . 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. . 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. . TERMINATION This license becomes null and void if any of the above conditions are not met. . DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. vedo-2023.4.6/LICENSE000066400000000000000000000020531444463326400137240ustar00rootroot00000000000000MIT License Copyright (c) 2017 Marco Musy Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. vedo-2023.4.6/MANIFEST.in000066400000000000000000000004131444463326400144530ustar00rootroot00000000000000include vedo/* include vedo/fonts/* include examples/advanced/* include examples/basic/* include examples/other/* include examples/other/dolfin/* include examples/other/trimesh/* include examples/pyplot/* include examples/simulations/* include examples/volumetric/* vedo-2023.4.6/README.md000066400000000000000000000251561444463326400142070ustar00rootroot00000000000000 ![vlogo](https://user-images.githubusercontent.com/32848391/110344277-9bc20700-802d-11eb-8c0d-2e97226a9a32.png) [![lics](https://img.shields.io/badge/license-MIT-blue.svg)](https://en.wikipedia.org/wiki/MIT_License) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/vedo/badges/version.svg)](https://anaconda.org/conda-forge/vedo) [![Ubuntu 23.04 package](https://repology.org/badge/version-for-repo/ubuntu_23_04/vedo.svg)](https://repology.org/project/vedo/versions) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.7734756.svg)](https://doi.org/10.5281/zenodo.7734756) [![Downloads](https://pepy.tech/badge/vedo)](https://pepy.tech/project/vedo) [![CircleCI](https://circleci.com/gh/marcomusy/vedo.svg?style=svg)](https://circleci.com/gh/marcomusy/vedo) A lightweight and powerful python module for scientific analysis and **v**isualization of **3d** **o**bjects.
## 💾 Installation ```bash pip install vedo ```
additional installation details [click to expand] - To install the latest _dev_ version of `vedo`: ```bash pip install -U git+https://github.com/marcomusy/vedo.git ``` - To install from the conda-forge channel: ```bash conda install -c conda-forge vedo ```
## 📙 Documentation The webpage of the library with documentation is available [**here**](https://vedo.embl.es). 📌 **Need help? Have a question, or wish to ask for a missing feature?** Do not hesitate to ask any questions on the [**image.sc** forum](https://forum.image.sc/) or by opening a [**github issue**](https://github.com/marcomusy/vedo/issues). ## 🎨 Features The library includes a [large set of working examples](https://github.com/marcomusy/vedo/tree/master/examples) for a wide range of functionalities
working with polygonal meshes and point clouds [click to expand] - Import meshes from VTK format, STL, Wavefront OBJ, 3DS, Dolfin-XML, Neutral, GMSH, OFF, PCD (PointCloud), - Export meshes as ASCII or binary to VTK, STL, OBJ, PLY ... formats. - Analysis tools like Moving Least Squares, mesh morphing and more.. - Tools to visualize and edit meshes (cutting a mesh with another mesh, slicing, normalizing, moving vertex positions, etc..). - Split mesh based on surface connectivity. Extract the largest connected area. - Calculate areas, volumes, center of mass, average sizes etc. - Calculate vertex and face normals, curvatures, feature edges. Fill mesh holes. - Subdivide faces of a mesh, increasing the number of vertex points. Mesh simplification. - Coloring and thresholding of meshes based on associated scalar or vectorial data. - Point-surface operations: find nearest points, determine if a point lies inside or outside of a mesh. - Create primitive shapes: spheres, arrows, cubes, torus, ellipsoids... - Generate glyphs (associate a mesh to every vertex of a source mesh). - Create animations easily by just setting the position of the displayed objects in the 3D scene. Add trailing lines and shadows to moving objects is supported. - Straightforward support for multiple sync-ed or independent renderers in the same window. - Registration (alignment) of meshes with different techniques. - Mesh smoothing. - Delaunay triangulation in 2D and 3D. - Generate meshes by joining nearby lines in space. - Find the closest path from one point to another, traveling along the edges of a mesh. - Find the intersection of a mesh with lines, planes or other meshes. - Interpolate scalar and vectorial fields with Radial Basis Functions and Thin Plate Splines. - Add sliders and buttons to interact with the scene and the individual objects. - Visualization of tensors. - Analysis of Point Clouds - Moving Least Squares smoothing of 2D, 3D and 4D clouds - Fit lines, planes, spheres and ellipsoids in space - Identify outliers in a distribution of points - Decimate a cloud to a uniform distribution.
working with volumetric data and tetrahedral meshes - Import data from VTK format volumetric TIFF stacks, DICOM, SLC, MHD and more - Import 2D images as PNG, JPEG, BMP - Isosurfacing of volumes - Composite and maximum projection volumetric rendering - Generate volumetric signed-distance data from an input surface mesh - Probe volumes with lines and planes - Generate stream-lines and stream-tubes from vectorial fields - Slice and crop volumes - Support for other volumetric structures (structured and grid data)
plotting and histogramming in 2D and 3D - Polygonal 3D text rendering with Latex-like syntax and unicode characters, with 30 different fonts. - Fully customizable axis styles - donut plots and pie charts - Scatter plots in 2D and 3D - Surface function plotting - 1D customizable histograms - 2D hexagonal histograms - Polar plots, spherical plots and histogramming - Draw latex-formatted formulas in the rendering window. - Quiver, violin, whisker and stream-line plots - Graphical markers analogous to matplotlib
integration with other libraries - Integration with the [Qt5](https://www.qt.io/) framework. - Support for [FEniCS/Dolfin](https://fenicsproject.org/) platform for visualization of PDE/FEM solutions. - Interoperability with the [trimesh](https://trimsh.org/), [pyvista](https://github.com/pyvista/pyvista) and [pymeshlab](https://github.com/cnr-isti-vclab/PyMeshLab) libraries. - Export 3D scenes and embed them into a [web page](https://vedo.embl.es/examples/fenics_elasticity.html). - Embed 3D scenes in *jupyter* notebooks with [K3D](https://github.com/K3D-tools/K3D-jupyter) (can export an interactive 3D-snapshot page [here](https://vedo.embl.es/examples/geo_scene.html)).
### ⌨ Command Line Interface Visualize a polygonal mesh or a volume from a terminal window simply with: ```bash vedo https://vedo.embl.es/examples/data/embryo.tif ```
volumetric files (slc, tiff, DICOM...) can be visualized in different modes [click to expand] |Volume 3D slicing
`vedo --slicer embryo.slc`| Ray-casting
`vedo -g`| 2D slicing
`vedo --slicer2d`| |:--------|:-----|:--------| | ![slicer](https://user-images.githubusercontent.com/32848391/80292484-50757180-8757-11ea-841f-2c0c5fe2c3b4.jpg) | ![isohead](https://user-images.githubusercontent.com/32848391/58336107-5a09a180-7e43-11e9-8c4e-b50e4e95ae71.gif) | ![viz_slicer](https://user-images.githubusercontent.com/32848391/90966778-fc955200-e4d6-11ea-8e29-215f7aea3860.png) |
Type `vedo -h` for the complete list of options.
## 🐾 Gallery `vedo` currently includes 300+ working [examples](https://github.com/marcomusy/vedo/tree/master/examples) and [notebooks](https://github.com/marcomusy/vedo/tree/master/examples/notebooks).
Run any of the built-in examples. In a terminal type: `vedo -r warp2` Check out the example galleries organized by subject here: ![](https://user-images.githubusercontent.com/32848391/104370203-d1aba900-551e-11eb-876c-41e0961fcdb5.jpg) ## ✏ Contributing Any contributions are **greatly appreciated**! If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". ## 📜 References **Scientific publications leveraging `vedo`:** - X. Diego *et al.*: *"Key features of Turing systems are determined purely by network topology"*, Phys. Rev. X 8, 021071, [DOI](https://journals.aps.org/prx/abstract/10.1103/PhysRevX.8.021071). - M. Musy, K. Flaherty *et al.*: *"A Quantitative Method for Staging Mouse Limb Embryos based on Limb Morphometry"*, Development (2018) 145 (7): dev154856, [DOI](http://dev.biologists.org/content/145/7/dev154856). - F. Claudi, A. L. Tyson, T. Branco, *"Brainrender. A python based software for visualisation of neuroanatomical and morphological data."*, eLife 2021;10:e65751, [DOI](https://doi.org/10.7554/eLife.65751). - J. S. Bennett, D. Sijacki, *"Resolving shocks and filaments in galaxy formation simulations: effects on gas properties and star formation in the circumgalactic medium"*, Monthly Notices of the Royal Astronomical Society, Volume 499, Issue 1, [DOI](https://doi.org/10.1093/mnras/staa2835). - J.D.P. Deshapriya *et al.*, *"Spectral analysis of craters on (101955) Bennu"*. Icarus 2020, [DOI](https://doi.org/10.1016/j.icarus.2020.114252). - A. Pollack *et al.*, *"Stochastic inversion of gravity, magnetic, tracer, lithology, and fault data for geologically realistic structural models: Patua Geothermal Field case study"*, Geothermics, Volume 95, September 2021, [DOI](https://doi.org/10.1016/j.geothermics.2021.102129). - X. Lu *et al.*, *"3D electromagnetic modeling of graphitic faults in the Athabasca Basin using a finite-volume time-domain approach with unstructured grids"*, Geophysics, [DOI](https://doi.org/10.1190/geo2020-0657.1). - M. Deepa Maheshvare *et al.*, *"A Graph-Based Framework for Multiscale Modeling of Physiological Transport"*, Front. Netw. Physiol. 1:802881, [DOI](https://www.frontiersin.org/articles/10.3389/fnetp.2021.802881/full). - F. Claudi, T. Branco, *"Differential geometry methods for constructing manifold-targeted recurrent neural networks"*, bioRxiv 2021.10.07.463479, [DOI](https://doi.org/10.1101/2021.10.07.463479). - J. Klatzow, G. Dalmasso, N. Martínez-Abadías, J. Sharpe, V. Uhlmann, *"µMatch: 3D shape correspondence for microscopy data"*, Front. Comput. Sci., 15 February 2022. [DOI](https://doi.org/10.3389/fcomp.2022.777615) - G. Dalmasso *et al.*, *"4D reconstruction of murine developmental trajectories using spherical harmonics"*, Developmental Cell 57, 1–11 September 2022, [DOI](https://doi.org/10.1016/j.devcel.2022.08.005). - D.J.E Waibel *et al.*, *"Capturing Shape Information with Multi-scale Topological Loss Terms for 3D Reconstruction"*, Lecture Notes in Computer Science, vol 13434. Springer, Cham. [DOI](https://doi.org/10.1007/978-3-031-16440-8_15). - N. Lamb *et al.*, *"DeepJoin: Learning a Joint Occupancy, Signed Distance, and Normal Field Function for Shape Repair"*, ACM Transactions on Graphics (TOG), vol 41, 6, 2022. [DOI](https://dl.acm.org/doi/abs/10.1145/3550454.3555470) **Have you found this software useful for your research? Star ✨ the project and cite it as:** M. Musy et al., "vedo, a python module for scientific analysis and visualization of 3D objects and point clouds", Zenodo, 2021, doi: 10.5281/zenodo.7019968. [![embl_logo](https://user-images.githubusercontent.com/32848391/58046204-e9157180-7b44-11e9-81c9-e916cdf9ba84.gif)](https://www.embl.es) vedo-2023.4.6/docs/000077500000000000000000000000001444463326400136475ustar00rootroot00000000000000vedo-2023.4.6/docs/changes.md000066400000000000000000000002411444463326400155760ustar00rootroot00000000000000## Main changes ### Breaking changes ------------------------- ## New/Revised Examples ``` ``` ### Broken Examples meshio_read.py navier-stokes_lshape.py vedo-2023.4.6/docs/colormaps.jpg000066400000000000000000005202521444463326400163560ustar00rootroot00000000000000JFIF''C     C     q  1q!A"2FG BEQr#%&'367DV$45CRTUWabHScd8Xesvfgt Y  1QRSABCT2D!abq34EUcd"#$5r%e&s ?$H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H뉔dꔾu Z_VM*ɑM0 ^$!. r7ڹ{NMT5L(/t"P:g2E8{ML[kī'͹ڌ؉!mML}֧\fDs"T39{N̉"drYlZ RSGԧ\fď2=kR%h%H\K8MqZZlm.N'M'JKyeؿVڒħA3x>?\WZZ[źR_Vڒg!1v:?\CMio*Z*@gp:WtQ=/M Z[T]K +GugCfTWKf˔aq?׾ӯ*kYٮ/T^KyMș>gPMI3z]N7L\)?5 ]=O;2w2.~XYIrr|λRMf ~ǔZ>ir*juLl\JO9ZW f֕}l= h R_19Z|\skʜNCJUS)qQfcQxދTmRKX~*q? ˎ6\zDGz_X޻@yY9mSlǯEײrj.:BR_Vڒ;,c{n?/ !e`jRVݖ]ou.B-A*CPS)Hkm!:B/A*Cvl3%p.:FlX0#R2HٲcEj&D32z.͛! ޛ8_C[NJLfĠh' e){=U>[uhb&G-jf!m K:kڠ|vyfcGjgD+n NWO;qre2Eu͉DɒYpJw5M;qLio3bQ ][q7˝9֖6%$ 2n*_TYs0f,WZ[Ȓ2 lx_NvF2$d)qX;SihØ^Zd!Y|<%+EcJ5Nj&Иv^^;K-WdU; p ዗G*ۦ + HNdDJ`Dݲ"\RRkz9BfnTt~5AX(224LY֢4 |ݡ>IنLMEr@@@6YMUD]z9*@c"u"Tp)J`C7B]#Qu~3 #/Ia 0HªbP9 _9ZdW-=r(p}j8ˬ#:nJ4zL ),ՊDŏ*rK.졧ܷ^F%y}tuLss`c2Y9bXQulZX-d{B\0utt.IVHdP;KBRf TDiҧe w|; h+1=*+m%iR +ZDnQ,Ig_[dtZ^?(D_Z^Zm!-dgNz01eZ^Zm#.JIwuE6]sKmr/1s X^.bS-dϭ"뛐?4Q|(nݣ qtE'J1rGkraMܱ$6CFGk*#mE<:+L޶p˒4;^<^.jƙ71%#Cw`kKVN:*x޶dAqe6a=55$ FG<ߘֲwKIJXx ZvI(5U&ԟ"?Յ*yc2U7MrEpܲDF?Մe(YHpշn Y#Vî)6Gsn\M!p[mg;,[ WV|| mA?јmm x>no?C"_[Y_[zD~F-E'yMݒ k-CI}ǶP?C#2Z⣼QN-혎LeжDQ~3CN#? [-1Gtͭ.E"֧l݇{Aea-w*KOYR(ɋԗ+Q-lR. %ɍKOY?02"*>lN % K$돥V"r;3҈d&wFh%,*J(=da5(CCQ~K.F>rݞ}^>se7YvN`;#R^D8Md;HUu @KӅyoNHTtg?$'TIdq.'?CYY:fZB~HNr`rg.}O1 ?ENJm+q5 @ $HYjOLuW2(zGA@.)3 p(v.йהIRm{,6qu٢N(Z81@6` Dq6fR+k̕StIݷ@Q3 ]f.b )BbDÜ;+X塭$g1LU"QW@AU($P `K`ԶWi RoO5=;\4Qj)𙊐H90x4oNsMDɚ^&E5Pq80!01}>'Կb_y_8Ga4IJF(Іgѧ ɹYSI>hԆoroCBkԆoOC>kӆn~#I2@R6kFk.k3lD ؀c 3hsELeu6gs{1أ!eB\z(8QUF-QYE4UqA\FchG:Ab31tY4Tq9MݿX}!k#9K.*/)DF\C^ށ#q$T5308g=ܙ&ͣr^c)hHҧ~5!CAz(h3&ɡN;k&_AcoKi$xQg^ xQg^xQjt<#sZj9EM'/=#TKW֌7M9O $H]{i,ڐv[2eX@J<$J6SӉ RESME%8MDS&1NC@Z+hZn$Ճ*|Lx`̈́8RLhA1JLp 3JP&4)\Odl2jqED .`р:6JMgTuvǼ&ճ"HcCps`KBؼ鹵=uufRiLC*DS IڙQDQ !mhkY-2 l??9L0ǟhDJUb+q֙OB\*DkwXJu,MvǓeQ\mKy11- }@Ɣ:byr5 lDui~Z70.pŕ#31@@ۇl[iqA.:Bz6UgqA+wdtYff7j1P+9l܉+Iی힣6NZO0xjL`ip4ɉ^N数c&n3BJ+p(xաwr5cQ}"̪fѫ2N-|\R|̫hk=[VI9p>Qȱ=|Akch:GHEqRA Jkdw%C :B*A J #_XmF: r\z)xoֳk^1ۋGw}o׎_@TĜJyكnwďOCl?jzR̽9~a {W:^LIdw1\dE3r\iæ> 4Ɯ:{S#`U; Qq .ٌ[dӇXL/T]ĵÃqr]g~E/o "llL). J}xꌈljxhjlr֙8!(vjS -{m }<яT;̈K :y%G\Wv`dPJS \joD<稃U .VU xxzlȴu1}kW+f~aKfyUB}Tu-k?ey8)x|U>5$E(w z+η )vd*,V 1Ll=C؍*A&~vrOVlqJzk1[*:"l?j%\[fi8z(EC3d_UtjF.]V ziQXTt\h\ڔS(ҵn7a&&uI#\L5ׂ̮q*+ImƔ<1!IM(9&V녪Fa)\2_xbPSL*L1n9q;YgwM()&VԷ6..Qq.ً¸ˑRJ enk+= 8,Xر*[q"V덾U lO\讏<ޤq[v@U|WE'ѩ*j66Vdcqifz(2& =kM~}\pڐx!e=~ *|uiVyspҡB7ێy(V!g!_T<"uhckLN{Mg!hw涡< ֡xw͉T纴4vaDY? | 8nJ=զy9ʗhz$H @ Q7֮w2骴ّ7U) ,8 +;^W3^fySv*׋H ls-I; csL:Epylc՛̉͟=BUM8 }DUQD\5*1K% 62LeI0`ig122 yF0O[_[3Hߥ ?N'#~gyBяCsiGx)P<(Z1 !'cIǟIǞ)ǟp)(-8A Ohˁ)OANxڂo@S7`獨&Eyv  0l65jB76kӄ2ohԄ5V4cRAF|PsŒx02b S/(9-rAVaJc>JĀ $HQ~5Ug*d@T1!`( 8b rIVMW*[Y=hN7E9_2Jfa3in*[{f`pe }IsO.ZB貕œVF:9H%9)Ny@0[ŕ ^O)|˪|3U r VQ6B%S g@lg׻rG[* 4ĵLAc%P19 c9e(ѧjFx=jYX=3xb`\1j.,2FEV$\{Jǹŋsrn.<&x}imp{X R{!X!yD8˭D3 Cy4~RbR82VܿBco"y~'}*Rr?k[} Ȥ#5C7-feU5Sao Rm9H>~S[PN)?idr{{f, czm_gd/`[ mw"Bq*6a:j6п-k+[B"y>ۑS6 8XK;F0nFw3d -kX}&͉KrCnɐex6^64HQ䆕7d [ 5!IEIqTۉꏃ{wMĩ.(>J }m_څ@I*cĽZ W1*B {J7"uƌHN(1~V8r9ե:Wew`mWmA Ms`__%2K]m+,G/lBMrlm{]بkU~f K;c[M2p- Tbeʘևr\~6KSa5!eE$aIqR. Ad!<W65H{hX _K<]5DmcţXkNj'9b`(TIZ= ifْn- K)ɠhR{q!7`m0Mγ$KjTh?K$ܒ;$0cRiׅ$4RtquJdIF$ċOR-\[uMPS4uKT7R_K2~XZT/5?KְT?K]I'n/.2va^iGS*GMzI]VZ^](n/.Ye;_)skK Z~rQݗhCc: JLB 79$%/xч,_Y].,(kxRFdEߒ+UsJ,?y0ܒRwO׀#Z8[DQ49w5) OXkZo(TimEa qhOXo\smm{_.]fίDx-6KqoBDx "[(=ͷx"0}z(v]GOXo@so "0}z8u;hb[(>Ro(: DMIw՚6рU0I]?9'Bf+CvxIZWh/BfV t"ǩ|btҴ7OɦXʹqjv!KVRA22o+5jo#9؄hZiZ)52öC/-OW;EJۅNQHnhijo#9،jS.b)vxBv_#9،x#Ғ axBv*O#،h޹j<-th6#,eũO9j]rDmiyzv 4UGRerCuKq"\J jkʋ6#,+qx'k+`F>Iqh]q#B5jP}hhD=Z%\kBjT BUᦓ؊n.î5*&U JUVيNiNî5!DberVM1:-Aҫ,:Vx)Z@U5يoiuH5˦X/ JrnWf*鎧uƬ9TO+m%+U8MT]c0~Lq{7\3Jki/o bt:lPTeaY]km%Z!JTmL,:k;+m^)9/Ci,:|2WZIxƳp'"(E=Z%\-g%׵P\lEt] ea YmckKڊCT^F&X녬ܾ঴/MIwNV⻦`kZ^PkG]TGsPf,'Y[A {RhÔLRUthZiZܿ87F9h镋R]VP{;_?8?\F81S+V*:#3A:Ȯv#F7TRًdAU"#iCELG), $H @  pLيmEjdCr6.V@ VuhSv"*d= h T+V P̓FLXLZEFQrmj p&",dOA\e{TaK8Q1.WjBjnH ی~ygڍzU<̤qڒO$ mFǔPxySNSjscuHMa'5*C|bBJq0#71f~XqN% 0v7l%>͚.'X5 y[=&vld]OE1kz3`]PךYR5&9<亦+ Jx: RKTӓk?D 25*$ĩ ]ZG:[GћLfDԨ%\gNf&Aˈ ]PMOt鵸8xΈ&E2*E7?/qbDR#R͟rqSu$iֵ/CU\XI1Mqf$WZ[h̳G~TqLiך0ʈXYkTqFkQУ $H @^[RRRJ̐>WuƥNS)Z:|hiv1E:Ig 3A+wa5,$%:pbm[A_I!gN9jITUv52#D"ɘ2 sGy A-uʯSV"Fv{Lra19.PAp&*2!@@ǔ {Ǐ/g8aˬ#3&z.{xő1 3!W_SfO+;pٴpΞzTP|P&i[ܷ fu/~M@G9CVܺh~1wL|mdNJȊjA*}'f%@:b6oô&\G=CuFeeɶ#.ɓWbԥوu861f5f|x?}H)}0ͳP,hv ܨxX1 Oq+-xڎnTP-T1 fXܨiYP1 b2JиmʋW΃KaQً\2_M+K:zVCóp4Ҵ+iȵx $i~>=QM+BE+5(i˃[ꃄAJЮȥ g9D;), nd VѮ̢wT c8cl%h=TQCP|sg2N_Uٶ"g`/yisVC6_܃qe٦5xd>_S/TŖP?u19ĵN;<:)>~ cu^#v>pӉv}Stv;!IUygM%ɶ"Q{ZLwS`p;1ME^jԣtiE@~GF+b︩"ZZYoGq(T︲ Kf2F\LvG6mʅTz.& ;#ZʊfZiMqp.zbGl= Q?YG 2@ $iיe2pGOE Hn0`%0(@軙?Qm#S,ѥZosӝ≷+S6 ,9flӁ u;*yJ]ںB^񀲧r[2).cSpW5L)I<eI2YtSI 9xD P ];~yS)~:3T,h 6'Tb &QU4fW ~EO7RYܡ*"eK3ᚡJ|LP)"8XצVId$45G6YfʝQ "D@ i};_=}+0݈H&!1uLRzuLSՋ2bɉ.x[ŠJqEB/w1MĐ%-1Q JP 8l' 2YMT$kI5uQ#99{ЕR_ cy |NDgJiQuQ% /#ҼvtN_D 5+G%Now$tNw)r9GxL~/M+L. dVrs ښ/<=_)h5Nw0-6(3Zߚʥ8^i(-hN_EyO?AXU-N_D/$5-_D8;ʦi(_G7,LN41$s~gӟ[1%=›oQ4=BpTͿD"&nGb!Pyf𣊑.!l_̩S5˔sYyIN„:SU>oyiIOvOUt*;=JC3/qUt%ʫqa4{ f?⣨uʮ o#{H4 çW*w\Egco}Q/s"_(J̝%|s2# YؙƺsbM9_!g_Yi.sGyM?d r"̒i'7)djq$Ct+3Gqs|M?dnxE9Dz*3yir)d6'Til=NNG7FE\JLuDzK3"#!I I<71S7yK&F^DwuqELbO :͜L1@̽םF;BN^wC9 ɛY9l>D_o9'ȋѓ7y3 9= NMy?5X~NI%>N>-b??H F⧵ݢUU1# &?K1jt($H GY+xwOUM՞5T]NʩiZ#R,rȬڠW/L@`2Af  -\IyAۆujje%FFyenpY7* e( %Z޽fgdSzbR&0خ& U~ 1L$2g)! ׾ m;2}jYJ%4`ǘ>p$]azT) I”L إ>swmk{4Tu yrK3Ma#cǕ1œL+ 6_}Vsr!W_y7"F?+R/~ Q*ԨۂEa QӮNcj65ULͰ}}Tu Wu~_Y ;"GD>& }6[cS, w7laNȹ{6UVZM y62% "\b7o9#F»q(m线s s'F7n͉$rc}}~>4G L( wMч*r?8_}h2A3Qr!r{߸-M]Ȇag7"Nbn ~Op&i: o}!}}CIk/2Q-~a%:_o}"}/Ik/#3%񚏤t,SK`~^Đ1ȢCoH,gFk+J/a BM^>36De19ίm$!6%%ږ"s^&Jn3bS1mKyEX[7JSka!qOclL'nHPE.ND-%sn) &ӡev2; wfSswattuWLtۊ)!Y].%ә_ͷ݆l.uZ[1%6VvO'eIy_q.L~@QYpy=Z .WZK]mEuh\my.?F>a.ùz w`麴nj4!D埐6_n!Y]W M {tڍxQ2!Ű_gѲsj/)tP. F{Qr2LYzNnCW]Ѳf*5{(1i(m^"MZ Os^?2$Sm>6K*%=4܆ۋ zRK,R]'??qn٧/5*R{1!lȂgRwvb* V|]ߧņ1*IDȒ$H @ I_W3ZVKv髜 qy-xx QLJ`3QU6;.;j pݚ BR,gL֨ܮE[%\ & cߨ[\k`JWljYJ>Ie싃LɢgG7`%zLΜu.333P1V|ۂid$)ALē>` Ρ7$ILx sqFW3 s@p c:v-DUqPǓيj2ef,7TeǓي/c")BZ)[y=mQ]1e3- S{s'2)1\BT}NMR|}Zԧܱ2- S}MQ|έ-ǢLi/3R;71SMcS:JEe`4%M R i%y_JnocZdũLx+m%A}M>O[f5*&U1⽫Ph fscZXiYa?~g>N[f5!ǂ+C%~H^Sf1ѳ˒9ߢ/qE]plreEN4܊uEGQ4V}\hELӠ'{N_Va&UNʧTU} IİqU Mҗ?TSu JHqӜA)ٰzVꊎn}Ƅ9)ZO@cs*^ NOǞ?TYAɖR/f}ckKF=9V J&YXp6i-﹏E2D֗96~e1V>ea 05Z96}cF::u2}\-f h`4)f,'Y[x:iZ 58~d1ReKV&g<2NhDhZIZyT-(I+(5+;1"QibJ!b3I+='<e56b!DNj!^P#>~a̽ƦZkD+|JlŦs ULѕp1i!OYC$H @ꎢ4{8vF[U^v9p QOR8,*8WwTJj+~dkTl\T̓L&p R@EZ\\6:BySTeYBIh$ *=OhuO˜BG)PeH ƦO$) A8f|Q9 1 GK&SU9*j:}%|iL3E AuR>(N(b -VTΞRRiʢFgOgĀLbUNp9H|ܥ)1 r":۩& SZټW7?0gal1ќ>ǐ`o[ո\Y31n= |cY=A٨j SWpu߾wظlm%S)ܯ=K@^bT1IA ~ヌظIuOեH=#>Tw1ob$,6ԃ4E>U4^C[dM#ܼYT޳-᯽ҏ6{#6^j[e.+4D G):nx>o`K.j9M^1v{Զ\Vtm% G){:nt>ٞ`R)q]fj9I)m鹍51.麵d{Jj[e.+,αk G(۴:nl>o`I MKlwN K(:nh>؞o Kֺ G(k!s1yHJj[e.+:ֺ K(+:ned> KΤg5έCDtܪ|~yԶ\WZJw\KxbW玛W KΤ!~.hp:A%5-Jio Jܡq*SR)qYԵ!io F܁peyܰRI&'L͐|zn7aܰRIXi2n} HehTo3xp/=Vꆣ 'NШ|ڀk2>Z,6} xN;+ByU)Y}jJCnV:di/)3j7K5_ա+R^1"'L4xe^Z!nV:jGN'T%m*U2ׂǖ^/3b'+8>ڕZ94ek%mixJ~gP_ tuU*G3/^R^gEN_ |uU*Cv+ /N!/3&h:*VGЕzvZ@z^#m}++ zvZ KͤU2<3)dX#RYEiUJ;%BE5F_ vuT~^{v3+ K еSx^{v- rFe~Id!QmU 4V{v.\YZB|%!P)yEihR"<۴-pZirEekpRY%mTMs*'OB$FV!iMPS7yDhJtvBȲ/ x:n#y}>"2l@NꝩyDk;۴/jG!?GTMApʈwhkp"Ns+vɾI󴃶(N0 !zNnRien7Ɇlކ蜟u\-naI'+kv -oDtN QkwhIgo0oa]VWDwpz1zN4h[#Ydִ`ꛎ!%ݢ`"lZ3ߕ :!ya/H'"{[#6SWRi" NI/?/7>l[ۼ219^wz^5;[e7WjIx@޴ȣZnP"@ \JŢ ||[2fP!A52(,(8qkU^ݚiCG+IBk2Dpc2‡a8%0>ԹBWVijaCL7eDLp7S43W 2N zVi$ZKg' PY'Rz2)PUQL3;PD@9PYGN;*ito3VPiɫbi?IaE^&qET9R8Q3nVгՖ[zwK;WNALjl yˉ``S%s[6u5#QV5ƛ!3IPhv>("Ccj]GR\dִJSy.,aQ9 j&9*Ls̒nuMLjZlUfPb9:~S2B640GhB.BF5+jך*8}1Qu!Fd+(6J)F(EuB)C,8\]MK u HM7,,Sq.R'5B B ##" RB҈)ahԲд YhZ0,4-ZZ4@0!a&aG `]01xAbN riyM- z"E8r,4BŖxg (q H %C? +QS:aUH8+'t^TO`~<]DT$)) Pİdi,T8IԞTO9:⥛,E\.h""D 4`y&UUT7t)Q:@8gI2E~ EN;!l $:1R2gN *i@-^eUAY0Mizn^^)(lF1Jr(sDÈM•x`ʦv~*E_@2is3 cCI4K)Sgs)cgvEHL㐠\P>% 1/zNg_.hEs$|iCS9AȁsUD3 rl)k)tN=AUHU\5]A`(s~i!gm]s%23g2 q7@}Ds4z{,梳d\bOgD+^$1I0}B3_5Q{%r$WRu!*ܨг)WI>wS_K7+_x ;j'؎p uܰ}/(kmY} Ҥb)]΃Q~Qmȕ7hbɟл'G8w: o(ەjf{{;oyv><ݧ΃[*; FdZ̺]^6"Z:oa@FA)ZˡVk_1fZr]֝ WCFXqqzO/ل::{AZ&~; BӐVi ^ rң ZvF/ JY4<:Tcu3.Z-ݑ"am W=*2wRwuQ.ȑ}yh[wZZSEזZ[oZ96Z3ӥV{+_Yl*97d-,z&UJ7P3?ټ9dW7SDήY+*Do,6vEpb$[w3ZvBfhP= Oһm%i /4Of(8 pHAVxŠ^HP#0-̪amu'(9(F&G/)6O8ﭷq4ג'5(G~j=mv"I]g5(N_@v .jvbIŋF%QAhV4ى$:5uģ95SlPZuD^^XĐzr(:8d:I$1$'*~~s[}$P3%G/+$TNsV (ÇYmDוZ2rx2>ѥ-F[PĢ$f:rx Υ-+ԛjP<pă0=c{,vhۆ %fia4{һvq~@k^1ۉ'Ħxb7+ܷYCLwuws)1o[Z(%e J2U2+ gUvUIZuRNWw\CNFOϺpԑin?njINU#f37fn*./ IhY׸ ;VD;@} HӕEl6j4 ŬxnВCwj X3 2@.6&AK ( uM+CD $H 76L2Ĩ'l:u?em7KYϟMVDQEbDA02"C D& k&饬׫u c+;;hQhY5@ r5`7)]%Ճ( n]bjޥMԞ8Q6֟$JV8aJc1NSٰЯyE>W:M&A͌*u)r$ [w%YtUgԜihdИ.!U"S Kڊ YTտn}p*sZ?FQ:o7ᓖ^,p!TL͒X0^jll!oS9nx[O;hۚ-4Ê5mZbFZaaZbFZbF$eM\xٱJ^H\ԸfE)zzcM QHR!X!HChCzbЇ 4u5YՄ8gSZWS^!MhCz" Bׄ8iSZS d= & ZutYa4;1a/}Ya$pLd9D*r `mjm1ƷP_81S?Yca>DDG`5ɥ˸i5hf\tIO`RpJ8MTrx暥)0q,!f2)$5NЄ!*P C(P901FHCї ivdN>G.'1oqԞT!J!JlTnSJZ~Kw#rPNՇ}Yí?hōgXhKP}eݴ`G֨b9`?OOjCU0m_fu o%2̐{5L;[WjU4}]e9J֢[uo&8x=e:.[jIR=)y}%aF~xQ [j)6,OJ;)(6del\%~beE}6PJCۊ.ꈣk_?X{KHM$.ͷRrm}19)?XI9ݲd:;|k8umܿ#;`7U0rEyd:#pjYjϹ Tb`JL6rҨ R74j9y$M%amQpoTM10N^j;$$; 5*?Z5IT(毳OI&IvYKP&䢨Bꓫ+_gdLeǒT]10&\ZI%$@rêJ05JDe-L$HM]Rw4:yS6 "CLPr9^c&lG"djTWUi!SyA/1jf$5* LD͂i32VUiqSEШN'n.T:Ԓl\\a0M&/OOS`2b`$4#Rb":?uMî\}dĠ(y!%MbGe4SZr#&-'$&ԗ H;>>9ԕ":fFTX0!(1"?Ik'ɩsTm:#̐db9KY|T:\LJQBeZϒGJ$uCn2bxy òC嬟$fg:䁵1prH0kֳܵLs:EڌuHCmHktNC@MjQ ²tYjSt?>\ Jea.Bu!ǒPyA+.#.!7r[(Y‡ed7ZMdâdԊphkX G e$;-cXiaCaT벱.-cKE/OT0mTD7 ;#.%YO;ږ;Σ39I}k@jaԷ0AvS./lYJFvVKy_*0f_Z]dGeDd1|LC0r! : R " ]8H qHk[:e J&Zԑdѻrظb*"!EK μ>T&ajfo]u2f:Rrna HP4v y~f*[=LYTC$RRR$ fRBDR* nL s &3*Rn%. 7/8TN_4<lL Km Ra`2)v*ASnS պU[4tfs22IܹYcL,L|ҀжM.uyT+qUvC/Vm6#&NfR2?C.q^2ebԧ'av=|Cq DըSMx9E~NP3&amX[!=Ɣ?)))cx9~{ӆ|jyˏVK`n /{7q,4S.Gh|[*iC^fȠc=F9t皘dEOT#l+@0r8EܯK$5w r)ap-]>wn_XW0rV*rۚ<@wl䶵;fFܐ[wV]흕ֶ^srY+SrZ0m1ְٔL_b0#ɮHʹkޯT1}$F֗Fb[;՞y1}B\JsQK njVyնcr.9H YP'9kfhá4+î#3I+7'%oF:"OVaS3P5S4ate}\Cv0oN͋V5?Thãg,u7m0BE3 2灭F8`E\$ZrSI7M0BV4p7ThCLRCtKX51^2ebԤ1q- PP>cJRƃP3hc*) c !5Ƅ4T@,$HR'yj*&Ar"J!標rbi֭)S2śEf3?xH (Q66 slӒpz)z/ZT\[Tl!sDLD iOYY]%KVu+H*)򓵖;tHL@Vb)8( BF(}DQQw5AhEbCLXLU0PJ"8LD@9QL)+dƦ%C EaH aaRљPS5]@VO?U*6O&dla-L*RP(LLEJ(ሀG+r()ҵdR}4bmEܙ V1 BU UT DL&]եCHI8 7sxnva3 tb>}䄤 P[[ǻNj.,x璪2F6"nw[cō avl-%MuSyeVu EðۈyBu]6K w˝OVa \z.͛%ĻRaUuGuhvp7^ frwnO,9ۊvXmn fqnuյIqU\We-p~P6l#߭GwqUl[p7~ fq.qեGwqUt/2nvl-NϝEgqUzKC8]..%ԭʡ򳍸MKlց:.͗VߍAgqYR6\/ e {\ WT)qq*9j'늮in}NWT)qij'G?\Uu=KȽ9mSlĨ&t*)ؽ,%ğL'?\TvS]v/hk)/mIqqg!ߺt^?h_ն˛*; )ν~еJ늮jw_/@եHZY,n'v6x: R6|?fNt-$늮!OW %Htx4 @ 4۽M_!*ufYEX' {&"TG0pwޛ8RD.'ٜZfZJIFiT1Hq*,~! @@:kh&󩌑JB F׊c`eLDC9S6x/=$<"]nIH1jS$L 'W53`.qSaܚQӦSRbdT08~VE) I#-%U8w'Z[?{H*2#,QN !Yc*&Pso-;~q7)jSG;773ǿL+g78ny~1niKᛙH[ꙻ_bǏωsg-d_ ַ9wqWʞ/+vE9.alC2]˻^s>u9.љ,[0kGUNC`m/vcY\>w&^zd<*o]Yb7q]QlQT`E-07q]P%m\'.oId[f>Cw_(<_s}Z[*m:*@u zNm'-%jwE{ٶ-p'ɮ-%jж㪣 W\7WJٴ-p'ɮ-%jb WvP%m 'ٮ.%jmCw݆42iD }Y]UlEwau;m7hZO]ZK@oGlEuºzvnп8}Z&"lB (nеæ{/xxFT6"-M Ate7"#|]EE/2o@=ZKPgKjpAlBNQk,qe (a< f_ZmZyBc kPq; Bb;mZӯq-z:A֓Wm8Fc-%@;T6"r+m_?v~%H??4X꜆WY=}nhkMGKImQ(,WY=}rhkMGKm7 {FZiJ?gZ[rۥ!pي"AkLKInlK{D˺~Ĵ ƒSPي% ZaN7gZ[|ۅ(: M}zhwTOlu__ڠ6wTcİ ae.:+jZYV5Љ}twHʯ ~.Ʈ걬xL;馇Tuj ZQz[%M:_ݪ\/EZJ(5::+_2ݪ\Ai5lx'%=01]hXedZK-%P@: |d^%d#\{d+X-%"PD:|9 yQωii"OIS߃v _r/Qωi)@O$hkSE"Y.%,Ԝu;Y&){/ZZdә@/BZ%;t_KUEu+'wOZJoMechdp_ Sއ+3OĴ =2 o Y庯HpŀBq|+nc $H/mIyUI#ͦ,Fr.2 19>n '8C >e;ByODx%?S(JpJaj)B(NT!>hZPj)r Q*s Q*)DB\ s”R'ĨBP)(/& N)B %BS/KD)D!8ZPJ%B煨 OT8RPJ!B QJ)E(Bz!j!B(OT!>xRPJ%Kj)BS(NT8ZPhZPJ%B(NT%-BĨRp ”J QJ)DJpQI$Hnmcr'$r)t"9ITS))J$(y`Ea+ Hѧj&}5vo/g``UcTN $&*br)ALL *Pԥ7 *J}JZrw'4rϚEb EB(A+I1sq0=*ŞUulZi*|LnUD6a@1@J ɤ,xw1jE$+vrdP.0@ImTΝ@ESpP.0L3PG-ɦ.Ja74#P2X$+*nTpR h=CJQ@9V][5Cوq!_Nno*'Ss&.\_"=>g5#=Uqn1iW/I/ɫeq椮Mv_Ue~1ae7s 2N6CT,;Sd7_eq5$Z\s,;.4 2ZN6NV_Te~1q%;s d-pRGIզJ_Te~1q%< dApRCIG ꬰ.$'a#, QO6N2_Ue~1q%?s lApR}ip&_Ue~1q%noHa~jQO'? >.bKrF[\t[vN }}Y]ėXna]#. QO'>ՙeߌ\r7#eJ/J%m>'ՙeߊ\Iu2Zy_Ve~)y%; n/<ԢtVێ|;O˿!7eJ#J%m>eߊ\IuǐnH. PQ+nχ vYw]eyt_>Z۲sy}]]َaEApRҋ[vCyzYw[f^05(]( 2˿;5H. КQke>痠e~!q%փke \˃yzYw[hQZ J-l9:, -[(Z\sjuzY_/N[j9qZJ5lyYeW5g WVˎ|)ίB+ĖaEApWVˎ|(NBʗla5i SV˃6qz&Իe.aEApWt S6.$ [-ak9wG^.q%jk\(ø>'mK^ImZQqτ R햒[oyp[DpgJ=pNy8j]Km0߅-pS4mz6Իe\ƩzEApW4+q=ףmK\Ie 5H ྔp9mv-Qtx iLWd<^cj]K(a:E_+1\;y6ԻEќ>" )1\+y6ԻE=(B=)\sͯ1.q%1}"-pWkq9&ڗhSӞF +:S5¸3KmKyq%1"-pWtkq>^kj[ˉ,6jp;^kj[ˉ+95k3\+q[yy%0E8iMW Yo}Ėyc)p7JjWo}ĖI90D03Jj7+ˉ,$-pWppoyq%a{$ Retpn9&WGܣiI$HnS5Vzژ++r E&b@@@p*r~Үp}-r@MXh~R L9@ttr%%]ZU<9% ."sCqNjomnzM*MFdq& `HsC6[I~{YT֓Jph_;DȉE31$0)ih 25$2 񁃹x8vKb& * l %3;p'[-ĢrK5.Zbջ$VKɊPK̠qT f5u޼3WQBd6\ZF8 %8B"P Bi-,[>_%'ҋ*|( KH‰A4 ,b% Q)IBp \P!(R@J1(KP8R@Bj Rh(/N5(/N!8Z@BcBS Q-IB\Ђs”b%!=0R@j1( N>xR@j1 Q-Izp)腩4/NP %8Z@”j' Q<)F4!8RBj5 ”b Q)F B|Qnq0 $ 42K]KL:LȮEU%!r @-MK?%2ƛa$f)턔Ӵl$b1]LXQ s%l0=Ǡ2+\އu2JY|e9nͼɪuPEE "R0#>3Eڈf2vI&ldlRE4L0p@ nBMY 䵓"d,LT+"hy77k4m@nRTQvh)bKH+Knʩw"Oid*I 9xد;HG:d6z1A0 ]JrwcZ*),=ҡ}.+;m8Fkmt~޷ ǺǍLXrB] & -`jϿ/N%l!螭ωq2ߝ[pJ14V͂u4;>%vv> +΄Nsf=^e;tR54[6q.&[tSWɽ 8.&ZӱilU>}%|йl'WgĴjO~— ^9"ó^L'tH4sOWeo-&YsnTR>wCΘ2x>j} \;!\z++ZL?[vgBW|g²E"x>jP_gdtq2ŞxCTM%pNN*nHA ˶6RRK-!I'C ˶ˉ{ϣTM!p^%F0lWO45J—h[eHeeʮ|=QLS{ \ӡmC*²eS>)-S{ \5 ۈ|&RژV]\LÏέ%71:mu. +..&T^)F@-1eeʊ~=ҡ^a_*tt0lPO~ oa+BQۈ*I²e=?S7ެ ½6+/.&Ssz Jrz; 9eXLjdUաm>T*^~8§z-Gðۈ/SB\L* MBV; !OT-&RUK b)-GXVCSHT<=2 ꐻ6dT-.Q"GM!ҒBGP|~$H @1JV&S1r&PZMYt|EL0 7ՍdҋQSE/5щ*f#:ri1T[<1a6*#2'!4rkR9]{"^s,DqǗKfОwΪr涪MO,+fi3MRDi͇帉3O4`۫,XOJW/npTkQeT%n\HجL1NpLmҎni\sp'ƦIW( TT!&HJ%G8G8²jRSʣvWZ?ge6nva sG a[-ۚxxJcLxcCw(>ɓ% 6u {՛F"ZIE 6u \*{Vm dwEqi(?AY-e&4dwCMqmO@=6,ƭj.&Mp<V.j Y-dukQy2qaஶu h>fХխJ\Lx-fо5Z:]ukqGBu]6,֩)zy;]֞^n+T/]3hZMjR'l+?{7q]CCu]6,ީ)y2zƳw(n e֏:.O'˨ /{p~ e▎Ժ.O'ۦl{q]i#Bxu.Kɓ{JӴO[6\[;uZq]m▌Ժ\?[jp讵odVX[ !i/C-?u懃.phεoS[b.`%i7öŭHbCW(<՞Bu޲mR4W}2䇃ʯnpmZW};r~_nҴXe)hG\#>wZRC2o=%e'dn0x?|bx..NxO\Euu촗ZϲӲ +K-sm%օ:Y{Fs֐6^)hJSD닓7;ĩbK- JuXqrvnBFstkAҽV%\K;_x/lEuֶRTUaWh'lBr[XRTUa'h+ƈ!I.=N/fӵi'K_b+Fg5ԢogL_fnqKRپ[ J{Ŷa -pnQ{7^@>M[f龥}䶵xwOWfߢ({F߲^Ǹل,(+R\n%ķF71]b-OݓOkǰ? $H @qTM>:3QrH,%AUDˀiL8b8yg$r*YG4g0*&,e%UQ쁈g/j? x@v<S54tT*[Y" D1bĸ +Krjng2bmfMj9(c444 AfU\򞸶s1x32'j"Exnx@ q3Տ@wqȪk 9.3s7ʹn=%T\X&KeEEקn,ٴr8QiPHRnr%!e7x%czJZ<gW'^zpcE\ɥ%=x\M9[bM̜c㆜e`hqFzU_Q大b6Va5r!-r;ἎՒf箐 i%P?yP%$5~,3gDr9ZvPg#]&wrLXwb$ܦ>OJZvy5 Or"J}jzjlIʂ= 9<51gHTUTS()蒐 1'ַD<:%;]TÆ!#Pd$̬7jjɐ#,Ӛ\_J(*2ޯO;l1YM|}`Bc&LʘӼ{uū*U3aFboc23/ܺ+3c[ϷF(XK+,j߹|KY@]>1MmpܾL>}r/ƻE?G'ś7Qz?I1#OX q?&NLeخDVE3;ea ^,g2gtQܦs0:xv.ELst@chP5 ""?bAq}J*[JW%N91X*BG@dTS)mG0v/ xȮn4c{\ rDbG]VѢ$"/'RWvK\[l* DoRW?b-EA!ƅ+ ŕZ1Mە~Pk3ߚ.P{uw`&7c?,ToЪ%M>%z)2OKNwofo;;QL}\qbLDDwҪy>)5F"h7|(;L Y=̬emJ iP#BPTJGYH{qϋZ>?E߹^7Q[nU$o˧&$P?z` EL`Hѥaʬj/.,gYIΌWҧ\;ݮO8;E*g*\)?D^OKO50Ȋ)s!楪䂤N:bW>kCMEĈOU/)d% 2k["+u:!iڣ<{Y\`!?wy?ŕjj~@Zv<$ʖQ5.xt;5Rr#eڌOϘ 3Sh) $Oo܈oюXj=qiz#7T#wIXѤ q?3,F+>E[ G[ŌSU,GhNY6}.wc:Jc@c7&!i]$G}Gbo}j*[ァwĊU |te%OEo܈vF#މUS+͆ @ $HPR3Sc&G#*"3#"sYˤH0Nc%zK@ߒi-Yc,d}0 MS 8 #L%f*zn)2eFcvwm* TTS.W

ngmgՏ%Op[aJB$#- V4gDT7bTŏŗ%6uԶ!m% ȦHG 4 ?0}!7 q=sOIDW,:̥.p¶LsnI叨ax)Bib 1yxoFbIbw"}dzs?pj(Kt,TsjSʖQlI7^&/O=[5>Pk=2Yj68za@ b2qZ֯ƻۓ$ibRgl'?5Wd9gז9TM%*#n<,'@Rkd%n?U'I(Yn6ɸtʨ=unf3 >LRtDʪ$Ί'۰G `C\O9Кa9= n#W|<̅O0l#s:R#Zp.<{\z$Yv#_r@ [&-/`'H#8G')GLqzI kE_4lجv=c5qDʛwa``7j0Q.=oއ'z&&dEOW>d3D$^QG*v 9D:V~73 8Xqf1 B;p߻̧j} сa4\s3fQ_6Ո qD|&ˍ>C|JZFAJb: #RMElE^F3-8&c#\Z{%ɥ feA/ lGڡ9?<]$Entak8_Ga\dudLòtrmlfu9H<L127IҰ1LIO>G+E*ǃ'\޿sO>QeprWn% % %?Rjt'(9:Cf~N*"|"H2]k`JqzXe18}2G$LH@T"Tw=+ڎLKn[4< )n aTdo?hy79&Ac*&~TԴă3 ={=+͓t됣 &0xcGRԴæY!8nO}3pfY&.F&5=ݢYikųx^N]R@rԏMEcqeEv%P'1DÔ&Lw5v>Ȧܞa]RsO4$xᆐ@Ruzf"|CWBR$Nw<ۓZTZ5jtG}ׁ>^mL_b|J1nFbθCYϚ۬&]F0؈PknXIJJ)튫qo?)X=˸_/>Zn)J 7j9|(X[{ p]jF./O<RPpaɍ<1G.pu)ET%>P*&V>3"e#Zy?pݶJ+:C3h!rt3!9Vr1Dj#?7JR*"fb'ѫ B;RTW*Yv9=SARTmۧ;_/Ec]b.&tbiZy;l ?(0$`łe-thvE{yyQ\ >"7}E8=en5tNR?>=L>$gIņӆ>slT@VSm ~q ʅ5z 씓hٕ3"ekJajC>Vjbr}7+j_!WQn MOp)X0C%_/;4Ҧ/D˱rXSG'އW nl&W64Dj{ (l#s&"nثS\pn;S&騵*L)Z^=ͩ9 ΨHM)# "^gk"/]05 l Ɖb{rãܢ\^VոgLT?x`Wt̬f'VLi9N]Oׯaa4E%F#WМv;UF"5V9\g2yɭS>c1 R=:(~R0rvZ::k/ڽ~A\kE9-䷃!kjQ%nC&#`И1) "7.'NipbtXoOg-t^,Ưmb`EHXkwp 'OxZNߵ\"G.)x1,BZ8:JR=z'"DX6VLYlQ ꭻYşRBtj(}Ni ʼ LX+P\G0ؕL^ԕ5O&udҦ,̱ÕHW\MUMLJT$(g9ouG¯F7B?2iPG*ko{X1A~I֩c(]K'&}_֡PJ$}MZêUIz +lo5'D4~HhŸcAy-U{3 kq}RG/?FsM1+8y5Z'p_D}GA/[~֧9Ke?ky ~4߬KOg>?pXmx'#wK߰!댘>ߢ?nW7Ü=r̨}gE>t ;cW IĨ>?oG/O\éY6~?}AG\ X 2,?cSjOT{?xyâɿGPG,y==7w.z*O fTSzd ~8^QMw-P!i:_Y__ԊK% Q>差aM/Fh=7Vڂ? _Xm跃Z?3Bzm?>lNyЇof@waޞMZêU(z~?h¿A>O}~E?_+_鏤`҇ )IQ?N!J~7_ѯ&~NӓOaoQQkkSn玲??d7?E~пI'PL?o8xs=-pK#tg/AǤZz@ $H'y.L+z3yEIȪir6 ȪSC&8P9A%09O`R3J܀5FEQB5f4S@PDr$&FS@liIpJc5a#`ÈVqq5U-TǢmQsr}97gZ_ ?7r*t6|B9c*e?miavW7tT8 cʰ pR6[|Y"vQtKqgF!G(2tCM-Q<$S bo4w1AEO2.읿)\\ OD CƎ:J`Rߤ3iu][=_Mw]cYbMA+zdtه3%6?F'8cJ\py[ ~`*#hci_w0fE4PK&(⋻~),#TL"cB}JGЮGBzkWzrxn5ʭL@CKp~vqgFreOd%'uBZRdη\ 1p##JmUѢO0IynV4Ly"jfTI:"HI1+!Č͔>GIR1|"pzɚ_zL ~,s'JG&O(NE_q d~LPR"?-? `@FSh?- EŤtD6aiɀ?3Hx1}'sM); 0+,-1G$9VS;>yAQxq,ͤ666g'Pwrģe%菘GL)`5(>CrFC|v^9O-VX@qt,M>'H`"a>!K~SyL_C/ZZ[B1HPnjm0GMcqjCm ( *čOsZ e p Qp$4}oP8 3iǐ߱5YGc[,gήG0&K y|œ(:]H/lȢ@ sڎ!>N]~:ǚ浈>!傝aA!hKeA 5M4JIo?TRҪd4Ǚ\AGT('ITXi6')lm8w} j&Ⱦy~m]<] #pCp6BM65ҥ UV UŏfrGJTQQ3/(tt\Z[ fd9xeH8e( &3#2CSOÌ+9l_D]SH2͓U&b632:i޼OR4u3Kߖcͻ(p&֦EDE(#N!U4]؏K_0}_hrk>o\݀9G+I 5,V.>訝dz@-NWԱWj}\J|q%0Ggn*OqrR0(o˗=JX {^ A踳,|xX1釰|rU4U`=?NcZ읫_ŒQ>̢J:LHoTܪwn~n.MZ$(T0!G~_)Hp]'ofTtЗw;erat]n珏˜ƫW'f$ TLv#ښS IҸ a!.k<<-?Ia>j:@U% 1+䖀F~s* Rmؿ[OBGݎ$H 2m1ocTbbP(@<ɑ9͊(lWFW3ZqܡWmܴRh 53CJM.c.`?34wTM)岉Ću/@fr lNVF@r!*9;RZN];2mJUeKY2"h(6L+3u`>apON!EYly$cRJf5BmJ``mDM`Dˉ`l 06@smZW[IYtEgI1+veBwnSɡg+H? "Цɦ.s@p(CU6>lIzCğ@G==O@Є,!JPǹޗ>HrG|Ґ7eK"a+|h*GNOz<:]=cL*o[F3>h=4 J\y z9yȖkcnh]ď\SH˙vq'Izebw97Xr΋"ň9t;l9=mPpArFݑ ?r\͂`j.I1)z1>$|D5Q㿍^Odn=;ԂtId5ay4ߖrcn8)$]iז/7g YAjWFf{F \"Xiט\(=G/'=2Ov*Z^Yg$̔jlZV'+?HͮVU[cU设O%ْ`}3!\+0F{ْ݀=A!2l) blE TiwYIAM0ޅ-9EͲv?YI?K9)2aDnYxKxQhrf T?Ir )t(DSliE4َ3nORÆ4n_[N~);؞L%?xl5WM@qE4=m/xlWMTqbJ-.ѵ+PD]̋Кi.(?rQҽ퍚U2wg[1$DL8y"׀Y 6M<\bDky|?(3NGKXWۺ |D\dEUMxu0Pl L[z|BbF J! #e%2J|@bE.(i8&ʓP@eDt䗇a a3ߖNg&ΖTHj%Q&7$+ yy_Ng:cсFeĤXܒlxH~Y(^JkT(ʉL}Rg^dyW咃٠Bmij Rt.&rI@!ȿ,mOQ4j'qp#/{Hя#hBmǨ>H @ $Hѯdnݘe rTi Η$u&xe5@9Yȱ0-@qF֪}.i nY-(].V+LA\D2`<o6ַ/K>U|Kkq|%pE6nva sG JiGG{X0v,H|&K7<מ^0i-2C.O%{/wQ,;mR‰%{OwQT; e M/^PI]{{8MA&Y]6+Qry0^@K\y8U閐ڳhR)ara`?Zj^YCx(ɦMw|֦ tW~` q%&#,.@3mjǛ~+{Vmq$f$7TY>]BUk9KAAYeD$TVxk{밻Fmq(V+rIu\3߄2.ћFTJ"\ﲷYYKPj%s裡]/2P}\(촗q0^\7P"xgSRbygc)ݓG g%vcŏ r=+B,,n%3e56c+ڹׅeٿd:Nz}ƦcELy hT0do/%+;I>S1"zjk¡)T)} <ܪuF,YxˑRzI2İӦgCrW$'Y[xTU eaMҗ?TcE\]en5QɖٰzVHd}\lBL]en/N}~ŋDRKKօ)2a9 =-ysF,j\,:^dũKӑ̃?TbE)u'}Ƽ(Q+V v\Q{7𚩕\DQi!~ɭ șTy47Tf ݓMxЛX܂hlpH,3iݓOAn]2mh%yL é<,n&)T#FzlpLGSE:<,^p 4+*0rH&1}9M'EqLi]U9› `2uƔ:VL ĮXlpC\_@RR%\iæ(3o;X_eJİ8tfmWv68Q/BR,:N;D&Y]/;ѳj1(qԒe}\i 2$wgkgaBêLb/â).+qD= fЕݕ RG;*}:[HxMA&Y=6om86U"utle+qy005Y?]Dگ j2Fi\(U>)=6duG-b> wM:1"%'av\N`qVCwMպ1#a '!mock7qe0SR䚇mWɪ8ZuS7qi񓘵)U-6{S @ 8*V5<ګcMHԎd^Ѡ$GQQ@*pa |$Z2|ʯS"K͑P2+:UqgB XH*'ԣY6vCXFĝP f}nPD깦z[$2 w,d :R]aL $*3(7@HJQRn!Em:Je,n\Ҡ$ūRjVĖ8!@\Ps k.Ԣ޾075jvL6M7 :9((9"yQ0G0@8_Wpj)qOqqĿU ss3v}U#H$ țXxcEŏc?}}b;,9o68ܚ};GWhT(]6MҒj@/p럻EeBٲaƁ 21*@/1h;Ew`ԡvl01ҽpc[Ȫp6\aULޛ:k|xyAQ=RfˌHb&G-a^[!^;Ȫ6\bEj5N:Nv⳨Z/ðیXӳI+-CG.v⫨j3ðیXdKxZ7n1AÍ6-)>&mׅv+>j?+ۊDZbť$3ۯ JߝD>6qEQ]qS$Kn%+[aePqY\WeeD9uB>qIld-3"fUZz:k{4[e.:1"UY1[j3#*!6\M)cE2o^R\m|'R\1)_E1BGME6oڊ/T[Nr/h(V,h:ޫs-=~:g1MPӚm9J FrΦ#6ņT[m׆%T΄ygRqEȅ4Zmׅ%RL(qIZm1IuxJu}5}G[e-HĶ PqMJRayi'A]&֥RsuşL{qQj^e#;}^fYEߺ]1MkR9֖ LwsgMLkZ&W,WZ[ɖ..~鹝c[sS :ErgZKy8- Wɐjxe=}^_e$,cΡ pCSve=}^^e#e+s\ԥ n){:(=}]pz p!bw(O١m§7(T5Lډ#;}^^CQV'ss+]> SEIHiך0J)rCۅNj\pj6qJFw^NЇAQ Nf˄ήt\p07qJBs\Kye% fȡ߯L.vIHNkio4a dvl:_U!vyIs-<,ɛ"ww.Vğ:hrA_9D~s\Ky})떏C>Gُ @ <7ɢ}hM.k+AI[8O\2;ėNBBdr  EBTUK7K%ZpIt8TT:fA00@LIg'E~.%R˥pQ8+ 0kJdv-Q@Tt̂K臲٣H$'t#s(3q&' ҹ5VR3YAWH[NΫ&S"̞$id7$ pf G5G|';ҪZ㺩_*IiIh+g1q7kss)*#F+/d2d@+ ' \ # y@9mZ\꿢h~' >3q-M0'byp(ߠĉ~[\jQ4;|ߑŋ.Ly3CC' gT.>eNZ:},n٣$7ÒYz(ˉZg*}-gi'sdY]%T(߫dUQ))HD//-_ 8 (D4_ Ҵ/JH8|V$+~_? =biՅNoFM'1cK5=(OÆy;o][b?\EQ)k0K˦YId|rKogEaC,~0埀P9&|WN?x]R?gd[Kzn![P88* YhhɉGI9^. &Li+ur[)f~JRWKĹVPxۨ.LYMv])YN. G'魨+w0ŽLr}MJRSMlcފ.&Q)9SLNSCQK,|ʋzQ>3hb`?ZV4g>f;hf;%#*ĭtwf* (dem]Kt-*!9&]"-hw7.z4cNjʔ7); EvٴXLOYmvÒMfX)>ћC֠]hcRӦ01MOA=2셥Ea+.Ю; e|XmvBSM<쓰F[fkZ]QJLISيϦ(=m`$XvdZґvbڲ0>{+vih?%~j_0;V^_&?|蜺fҠO-+C.JFjM9?<Cs( nd)i !rR0;V^f Rivɀɀ30{0:K9E.JBj0bN&"ng@:k\զ0vNjvQ ?iSu\ )bxt=tȡݒzh*L_uJB9*O]7L 9KXT-+)'!_];H ;$~*OQٺEfcq"qF<0]NIsh@P"q$+~:>Oݳ1nu>Qb45Ef;(J]lsn]>xJZ5~դ[\ P6PANp'Wkr/^.]xM՝f&ĥ#C&/V.mI3n6 y~tKw2ޘ(l$nYwY1_*߉eXMsrUàO{knX+eazk R|:ǂhcNL?.M?`:OU٦**OcY7>#U.ZqPdV=+Pʶ7U<ͥ*'Yo-en ֎1̪hۈ<Ѥ./kd*;2GWq̩(1qjϦUoYo egN;}GG6'Sσ=~!>~-$H S7JWAV"C-vY˦;H̒^RR`*f@T 5%1E) h f+:.Nu*eUHJe Gi^J*}FbKf1}XaRg@ ^,r!D{Yُ$%oj-3f96)$ 8#Ӊx> L0@OHw~ff4ܹ~ƽv&(U>@B qD11@5;ט1RVCbZއ#]glil(QA|RPbq,Lt=V=lTWoD]<;O02Tɡр18yy^=l)E?ؖj,_ANEHCL[;N3k˓<8 ?ڭ-DJ693rb&=fN_7%1#G&ӕ)31qF,2R^Y~b_:Uqa?G%UWL:~1pת>c2'!, D_OJaCVʇ87 ̋GQ-ɋLm7kh/+AٌT4\l3Ly嘋i rAيnA5~!QEycFVPA+}o{' 5~!QIvXCV㜵Ov1& LzPh&7,HV6ٌQf*yU b{ Q̚VQjƩ3Wn`̶GLW U)\LqRTMxgLnKd׳<&8>OPYC>/$OFǪmtd>npAg섿 puaǪJ5%GYZuxD~Ȩq)̘omQ:J׮p! "CF۲w($mPs]bW ofHqꇶРIܡRj\w,7f $(C %סCCzט ~5pKL򱃰Be٢Cz46~5{ye!?f7'~"q&"C2?.,"g⟃rqDڋn-~a ӇvICl7J(\'PC4tb3-2$K aK%zU8ҶĊ} ~ F;$K Q3lW}F?[iM(2ﲟkS+hDžF2H_4fV~ o.ʱ gp/+1 zTf}&#s{YKpYo\jrL%#v, Ƽ1 u~θӇ=rL6ۿׅFN,aګ&2'w~䲮҇=OI[wпHI}hv£,E7v W3 s/$+S^l8SǶW8'?Jf&HC.`Vw{9Vz'r_bO,tdżB %ɉM }UTJLLm'u2fSB7o9V-h|3NYZ\Tvҳ9Ym6"lSJx&%YZ%Hy0=Ãmsץ-ی9o-\[SɽF/.ĶÃgqGף/FD\WO\MF8׶=iL;F5"y!| l@r,pUV>oH37`M=5dr`nE#[ڤK47E7Udjy;5`=-nWVwїif|:ݲA|X6^ٷs'Umd:E[D/j}4O3O>}Zl>WMnӈəlݫT ML\V)ACsĂ% ѢwG -]7>Iji;ɜ'SMWQ DDD78 i;srw~ʴc-s+%/+|Eڹ@KupTO8405[v*ޞe9"f#OUhI8INf0B4U,fVt鑤JH֮7wM$fR R|ru]!4'k"xKƄ08 ĸ橁3Bsj6t7d2Gt2&nV 0]!He1Dx!/r&(0E_hl2Μ1x2[HO-By@\i`HHS;cA& EDdT\3U,E+pq;Yw0VT5͝,` D ;^@ 37Ls>~Lr6Y1JͮWL+hclF4S9J)d1W#/)%|эmrhƊyㅻܧ狌<(<\ajcN.03u1q独<(<]a9@Ҁa?*\ ǥ)Ǧ ǥ ǥ)ǥ ǥ)ǥ돥 zHMfgѵڀjs>xڂo59i܉esZ9 Q +̵qo:Iѯ)@5aϚ!.6d -r$k¬&)us6! #yM$RRe M˘;`iS% Iff1f!Hd("h8vÈܡYY[&[$Gh!U: $*(%.8yqfVZ%me:e.ƷfNDQiCrH TLـ%Z̢m1OeTzN&lv놯LbAQh;?gyeKɛ&R<`&(Bpg  )q@ٸr)9uvۄk9#j&."`Pä CN <p덳5 GRugU2;8һrgq/VY4v<~cɋ'}Mi<24 =ߥ.3}v?h$y/WdXP^vXqmy/1@Bְ(FcEOr혱YچdI\!<=h>0ŘoLJ zP2Q*._ L;edx;2ޑk[׸NT8zj5b=5+4_k?1dELc٦5~X: d;qi^)|$oFɏ8:[f_r`ɶq \^wd^rۋL¨kWi6l.رx\~t#k- !nm9u`|ܛMHPxD)P&yd%퐷C風OÍ4'吗2壥{%3-)hw咁%ga-)Ťj7pxJۿv>y.CE%갓Z뿅v>y.jCU !(zRI>y.RC]$A(itMOK/ }\dGSVQ `p2}XkH"}+ڍ8/ gdZyAr.)=K۾vQԗ'+q WdЅLa_̣hOVTmkB %bZMVB~Z&SMܨ&̢OVR}kB5ɲjXhN/~ M `JF, _Zm6MXTR^k p-\A*NoMb Zb%;ݖI _'Л`݁EI;bj%Y}2Yk~: JwFRl㻱v`}䥧;t߃2me5.WMqw`d9ۮɹq;#F.͆@Ȫu7 `-sɾPx(~*YvMOht+nͽ T7U9?zMvqɭ*sv ~%ڀKn33 Ivqɍ5v9@&8YT˼Xd2R3=\o*92NLv0[Ea`7^u)[E2OL`9L+X8~7h|J&JBgMʔ6zfIؽ,IMv`9X. aƦifdmז[%)7{'c'{1oC?ⳝP|ЖhwM.Uߕ~m O'mV#lH @ $HmeY2RPSD+6m,T[ɕ)P8`) \7 E;0C-f|{(L*Dds9n"$dEq#(a9Q2%P4l)ʫ{T܉4S6P2HɄg&3$@82l/j  Ozirm?b;fsq6R<^Ǝ+n"cZ ޱnžcźTNjcœNY.|-< :}>+~jͣjgP1uɜ#-HIw[GB.I]6YjktΣ*딸Fî9sc97Lًe=N/f9)HYp'C\\f,:LPñ⒋ٿdqVNh)V唉aqrH߲ZyדُC/ER--î+. SF/fVN|zIz>u2}\)pb7'ojqvcKLXN\n!)@w71LZR?#vONɷUُI.ܨ%pW?쟲 R{_q+^#*\''CaJlǥ^vmPTq$lBh3o7`0dXuƫ1wl6;$k§(7o7Ptea\sfڤnq ,.ї(zE2˾ˮ5Yfzڤq D; fѽLen5YO\ٶ´6u6 5g7HMXNMaMxS\m5V|tѽRaXɞÍ5p 7ejԣF6ukn⣰!f܍6k._Zy) (fLA\nt*5qMMAu=6K/;,b%h5k.mW S~PzhͣKRMk sJ r7["z.ї^,-6krKAHb)hn e磗(5o67h5ɜE'SG\6 ܳFVSyfF(5o6-gv+=8U?lG2m&.ћ@7qb<%"i/'ћ@DZTyy󲫏Vփ (f9mU>Esr<ljXM=C#SkQɅT=6b._/ s"ԣ[X?Bj͠e,--Y7[30#97Tn=61 @ $H NCޫ&**EJVefJ1YS@1C * L7 NVGYd9LtB'IdےXѓv,HS8) 9PWtYVPRj108h?nS3c&ALA<\U_WdN3gf.vnq3 #Q4u(d]vֻ=-.,x,ȟ{جܪ_|.Sw|,>cCW%fE".W-jZ\oX}={bOP3drjXL//^{ 2Hٲ^bc-.R׃\{y9BI(]./V|7$.͗ Z\./V{Ϡhn.5)+jVoc=n/Z HRyhhvqyJ  u'}G'2n.JYz4 }_|O7*OWe MSjBevi3FH@)qyt-2쏅 gNR:2ErmEݎ_g3#*jB(e.-.QW_}g3',TQr,uV^#>$ĨW,,6u~՗{ωdjДZ啇a(kM};Fs19 ̠Xvqar2gb&B:\6t"a dvmA]!Xy}3'*֥` eŅr}/:F{DLZԽ5# eŤD|$^unjVd`l,-E][|tio/3O L-%=[[Ƞɤ֖0S-fio6Vu*,޹֖LD=6KI}`ƫ|yZFs\JfD2HA왲\Kr-[[ZSZ[̈7B&I=6B7'Vyu֖&.PɒJf͒7Ai9s-DZ E!vl X5_o!|g=uɋBiV^븢\ ˎ'1h52KCۋWtOo!kJOio2br ][pA/=~dŕLRoU7\z-LX#.NWK;pKy"!y.yIp).NȊNWcߵIwp).NɊ&E.NWC߭Gwpi.Nɉ"dr֥݊{n4Y}^dD"-jխMgPY-iOۯ2bLH'u+a*ʮ6kMҝf%^dELio/%ҭGʫQ-&%%<#ӯ/NVc|ʋzKnȋJ)f%^^KY}O+)^ۯ2Sdmׄ's+ۅ;JyS$^rx>3[j-[uLJ~L{G'r똭 Zvq-*&iv/h1 H @ $H5Oen^I<` 8rE傃1@@DT؜"&(jO TniS-pǎy*әPJq`B8.d#kSR+t`giWrDe3I:d+5sAp ߚU`_ڶ(K;tX'ϟ0.cK_w|omGb,nn,{.6uU ~M$f{4-646{k./Pwm^)]FcMf+Ҵ.'QiGUJMs.RhBr+ByU0uT݆$~6M;kjUFM_ rIhnQ\;jkkUBMS }N=x Nwz^ZO3湶uT ~݄_TcĴ%o/z^\O3*؎߫'S辫ljmUG/{o.'Ys\{f:~McX4qR|>lA'G~!a|J…蹥rN-LBy;n?WOב;-3Z9m7'S.3&C?̞gM~QRqRvN/+k]<`t1 ]>2qW\mkpyi&$?̾g~\~z)^ 73/5~!a|Ϛj#n?W LZQZ F-.@tTG^51ekqES(vɐ5rM5]EW LkYZP*1 Fݲ[MWDQkSV2-!Zкj'ʋn!k1[/Gm!j#ʫn" -4@e6 -Z]5}Uvo%2[T9k "kôI@g̹Tʇ򲻘_-D~H,$ kJnak;KqA >ʙ$4/<ԏ!Z[~Ha\Pbi-ѳV24&u\.A%"e&y4״xۨXivJU :˶LixwQ3z+KP~ S]f>up++0.AM$#3MƷ5aZ]=O$ iMɷ<ʛ.AN0 ϴO=G̙  ]tO2 W/O=b!4XivJO'១n% WR11'!Z]=Gp Q Bwvmuԩ<\;d"^R~+L']fR:VR2wBbH"~$H_l9gR+(njpLLa(⩸wvsT֮Gm,l\ UpEG:LLQ,PD٠^Pe'\J&sI\C8P˲~) @'@psZ6*P0do:1UH(t(CN~Rb0`mꮷ$&dD5@`gPGM<8LG06Qھzi=JoZKHLO&GzFnUr Dx9"Kf6bu9e"dĶ;w KL v`UJS7 g昹,( 4^Dr4"2҃Q/&f5#lcVcfcDdLDմ@ [腩m~hRѿ4)@bL!ĐbD!Nz$4Eg @"@"j1Y1Vp N*8sK9S9犏hOa,tUqm-4HDWqmEu--4HB<%K,S@Դ}(ܠ+Z.[@ _8XAcs 玏A[xr z-q!   <熴{M~c܌Zae6YESF=Q @qmѓ*^EUoLc"g!ʢJD Er9@|&tg2e\Zo;>Na&9dJID#骡UPAR= >xIU&N읖`zp`p `@L337 M%NM&ɼq=TSZK`8"T OM2; a4WQ*u{gD)sMnDNyqgp2D9H9JTTDuPʼ4QP5tdt`\X2FIC(W%78DI&J4U5dYBJ_YۗD R&\EgXa=y s|:PF1wo!G^dò+{SHY Ƅ:>qr+=T8';=@Gw4s=ZX#PPڄ*|(JQڸZɠ9KFPYO_fRЫ}n%sZu%]'mr> o8.\:i X??/3d|l_Vs}jL!0;$ leh:_\o!KM?dgd/\][,x˫ԋ)f(엙XR%닰.W*k \ԃ /QKI q|Q%Tv,XNo#"]gakyS) m,7B2w~?+ ϖ."J#ierz#d8XtqvA7'iis:o"H7$0z PAdp_2J7o9VM8Hp|(oW@KcNS Nbv@A{؁xQ%=pֺM2noNHixWzlށ| (뇤Y\0vs`}٘@ $q4ST&Rs͐xLtsDA!("` R]EFR.)|..3]>X^h҄-KKp)ayRԄ@a#J,.Xd 4,.8BԴcRBGF$*b0 CqsF$an2qF!ʴa)1# CpsFa7OHe|щj@Fan2mqj'2_ )=j ?QYX#\m57 EgMaL~pi<%Y;S]El].Ct,=0v#S]ʑE&G"t,9.efotk%&;j]*MbYg{pE%nf@ %N|G-#5*މI1 ZQIyGjgİ촄jj)Y1 Z!Iyggs|J-!5ڦ ZL~v|pi"qT>#IgTW(iy1դ Teo&2?5ڷF\M66"<{:&Y[Ƨ9޿3ڷϮ @ $H2fնJu܎G$wRM1!&(fhRQ3{R֕UBϩv mR}'VZtb^ R:`HWi?F }rR{X{FFAjQ\.CVᮛ{oz}~khAjQlikn{VmH1tVHcl O<7a% נ$bhJ6kaqtz5qMEB]6$+R[X۔\qUhk7a av$hCfJ9mVnqM!v%DZ堪$uOh e䷨+Pյ\Su7Eu}o$ߢ ZZ1j@'qL}jI!Ej6uGC\Su1Fvy$55qƐZIYmHọVޮ.RzGҔXewp6mojcLN\mJG^Mنh:cM\mFK^M1نhOC[vbʹF;0խ!?.5Sf)vWZIyk Ӳ,`)7-m5s Zsr> m5/mhOrͤS2,kn~+JЖ%5k(~\1b5nдҴ$feVVIFZ.](1InsV H`QM(C/]0 -QKsS\EPuaj\dF'986X~=Pj.244%h.^TDpfu$nRً9Z Rꅫɘ %h.ZC4׃sB)mr6\97p>M XoZNrqO0Mꅬ(+Qq҉6^.Z8I&C0&\e!&3-%ڀqC4Lم1tV.Nxz&)b-`EZNA=axj)mZ)umZD fr:l^6ԥRjz;m\G)iꖭ Yx RLQPrְ)9}RGխJ\e5EC[ @p'!k+VꔸrpF^-^VâGT-ef5nK]//i *R 1uKqu!v-h ؅έ-a fе{;_8P8/en.D=6Y"8P5HNلz՛BpXSZY[j =~kh\& yVnK#5u(нk sMգ'[M]en-7 y2{Vmgcgh @ $pLUvNʨ}F'sշTLso)H`ia9*Χ:; oG &%NY…7PuLjЗh)s'Y` %ArJwJ %\>p%1y=~`Ro9=)IHK=ޠb512LUApH`sVNI[X3復D E ~%0Bfy@9DǞk̬-XRud5=,χyl1 H/-acoGbD\JMխ#!q)fQ:YKM&ta{ W;9u\We2o%6Z~u.,6|.鹵^o"~\eFhvpѥ[Xbi-e_ðۇL6V%cEZRgUa޻aT:玷QoVa;m5N:Nv+1MkR4wVaݺc[ԃpn1ZZ*ۇll` k*u͜m¸T}c[-GvXmæw2?uWO\} :d[pī uS;s%*cXѲ:YmæUPn꥜Ppc[Σ,ۇljcPMG[v<*cX$-Z,d:)Ic[ϑNRjt8c9juņ^kR哢mjޣLr~sf#ijSt%F陴̞ MkRjҤ6?6GZ뇶4]%JnA*A37뇤XKYQahHЏ+ %PRpl=vr2qU\w5p*{UJD,:Ga:X~0QRca)Us+0t`Rԙ uSuQ)^n8>r7\1fdLDj\pfTWX4kj\p= NO l(z)Q]Ѣ-j,^8M߆JuÛTuMkQ[x'sMs`BJkZUq}4 OUڇ6 5XHJG7 Oڋ-!]f5o;5Qq§Pն:Z[ĎM^P*j[)/mIq]gf иXTjXlRMiociQrIJe.zZ[ŋ1·CT1$uMIs-~]tn2K$޹֖jRn4Զ\u'^ˌpjʱӅAq JA1?m˄ olJZ"YM9*T^`*I9<br8Þ|@ yV1K{p)TMcp,8 ~?7aM8b*5SpjO&;/xl$djjq•̴-i acҶ aK :n&G$mj!BV ={- ZqFcx}ٽlwP_Еԣ~#v>7~lĬt1lwqCWZ]N7g6ieOj,޶p#8!+,5J'ߍ"o[5Xm ]cX5OX޶g";.J*[#Vjlڦ?: ögRJLjɽ$O 5!OXm Τz|F(QS߃F@OXi ]LK>#g2C['CWN*O0Bzk,Nd9.;-!UK}^#Pd9"Ki WuA)ʀ>d:.3- !)h~h:/e+9ը%6HrLk[i+yPJM3C莣7,+kB^E33LC~49rւ}=LJ$ 4+??$-$IKP֠C["XkM8gҨC3E,/88!aꆤd̢JQhkp;0Ԏ+P^C[ن$'5j/Z86?6dRiꄬ_{d?7d!C[6u^"IuZԺ>?[s)sdH=t8siFDkP8ϕI5:'KצkR'g.ɷPҬN|Dt;^n|l~h ;0~51,Jvdq!>6&u1,Jv-k .DK>$~j.;0:w14ۨgPC._%gCN׆C0ĦgĒQC-qsYES}^-^3-x d!^-iL~Lj/ֲ׀Gnђ]V;R*Lj߬e~8Ѧ͆wzK#FDN dLT&,\@yMXQW$KѯE_>nz@ $Hd 9’̧;*}ONGbfi735Dg$☉L#|bEVq:}+y5ys$"Ś7EBDtqL s G0@@6&ArRy[YaNLIVɜ'1 Nn\@9~eR壤*j5kJJ0Q3#)H#9 b @rn9 vi#ZSJӖ4Ȝ)9Y۴M@L&sU  r;PLɸUi,(܆fq7$p& 9gj)@;|p@|x(OimFS϶ E'AHH7iM4EEuGLBJYBB(TBY)]vВG-aJQpݦ^9i RʹD~h3m BmhQxͿ4M nPaWPb\=u FҫD[WRXew5!P~xԅXEwېjF-qB!]!ENWQ;xsEz<9H@PsZ`ށigzDSF~H @ 2f dZ3eL)kYG$y]58<9@s0 O^zYs)AL8co^#JUTFOJx[&&7Bf|@ܘjZ\q[Y[VLLJP+S8LI28)ot]Ehŧ:+Ϻ1 ]o-isj}Vcw["P˭ V=ϏqHG]oVu5Kxѩmiu! Φ)^V6Bjo^XYԽ'~6(j/IJ!ybwRԏ+Y^0EF{CRJ^X^F{WΕ#9a!Er,Of3^:sКkCR'p^F0AЌ˧F!g&WᩱrNd9(;;,f&VNd=(G?ٸR̝ . 6Kn~Nh9Ҝwu–4O!1h8n!%W#p3,]29 XRw,ˤ.r*\!bI1 %qYlWXPy1ĮzeѹJƇo+ {WqeVΤ@!cw ֟H]\M"?;j s]q='!fe9QjZP19@#Hs'y]R\dj sq4r,sVPrUܕ\M&#fN 9GxcoC䪟+]L̝e'xmlj+MbML'#{p74OfC+Nډf-gh=Nn.9W_rV;PĜp/4OfSf9sЯj'fӑ^h!q~Oo}x}'xðܹWAeQ.2NFaE*qp~BYJRu9^aE+qptsmDNk;$'xz&9+I^wgƶ7d^q0㜝,y߾-7͔yg#>oQ\ih\֕?cUpsJ6:"Ji]ViTfLZh6MFE(=mT!8J^\`.N-R)Lb p""LW)+8 NxYyՉ!Q‡<PCxQw4*d.b@ $Hܚ*e;;(ľb؎Pp14@ս+MI" j/OJHljz<2k.& r8R\[arT/LVةD"Y.dJflhR)@@Iݨ2ጎ@5IR/җ;RG)H]̖fD)S)qP ,(U19G1'kSrg,UL1H*EZhZ.fq_OR,5"jN  X*?HZG ?"q$A*Ba\B̹ys: XU1Qa%cbnd)35Bj"ܳE**33Br*fdJvzZu#&n+!%@+?n\~dK[`JGLVCm@ M[?1%uNDR9l\~w䃭uu&;m?j^p o}═uM+BMK@<%pu9ߴ/qR(+qU.8tеyo~ K,fȠ?94th_3mV2 W, o]%(YH'#}j5 ^\~t!thZu"bC< ێyIfoGWen.| -ѵӥۉ&R9mò1[QMn&[Hos \]iqk L,~oCuð4-X륋R kh7);(/ZˋrPbaD7;CNz^L~6ueCS 'W*7hK, q H{L ^Fu&Z ,-Sl˽;47 MS,]*4m6=^_ԦfW*'}sHlD $H @fstom1*FY9Cvȡ9K(El\DA psgkarrILfVlVȕLG8%Cag6ǚGN^j8p/p7 %c,TDeie̔K۬R䦒Iv=t'rb7UN0dGq3p `yV欯lU'Dg|la4+KVMʬcƨ,MjhZIYwYe0B]"鶕{^whZIXoYm[k]6ڰ tK~oYmػ]6 r{F4gZmYS6 r'[ M+ALxjmٛL3*Cp I+B7ö́ uR\)bJТZ_Yel m]lL3ڄ5\lB,=$RArL2o66Ұ&ԔkB#4)iڬ iyk- ݳ:]HIi/b^svUtZ*(rP]ʮֶ^7kHOG2 lكvWMk[i/E'uGV|Ժ/fT5?TsvUJ= Z5?TCtVbVf!;ihid5n^4%cBJ= sj}Qh%bJbߓ4_+ƂU΅ɴ\?SF8!\ɶX~Trg-" gQUC1AL>o+3uy~VB Tfr1]Zq)H_1]~e#Ja +QE "eRc"V \.:7TTt RV0i;ԉ֥vaz9ㄹQQҳT ?E/OMG%oGScEWIenߢ \3cjTVY)S+P'<68If#0Ժ/z ѵ pS%va+!9u( RE;6Lل9}R(T)- Z:wP.AjQ[uV8Rӱ-[f!Ӻu7 RJIOT}bQu7 RZqŽT1(K^6Ԣ60]D:6"IGj]en!h-J*shhQ'sI K8ǔł+qȸBGbD\!}`p럻Gt޵֖6FST)p rD9n%X:箷Yi s-!)m9æcx"s-G[e.#zn;uΤﴷm%e`\i*q:s֔׾9(,_e3ow\ԣrn+-+HuuGP-fFZcnn++Huu䒍2n7-ePJԏY}^I(C,kY~:zKne [\cVOG\}RR?b[uVYmV 'Cb9#b[u2n*c-I8siZC>ۯ|[pݥkQ j |Ym)?m׈Z>OR)p]>6uSj,6,Rjtb&ҝqay]2K(Tsq5|:ܟ/2^M?quk:Ut%\qu+ҺSt ZTfτy^/2jazGV/A*@N ]?}7\]dm5J E*@.V\]dhZԬPz)PJo\ 8E嬬ٙRtYA{J M£ibWC3Z%@vc݌5|1¡S1%NkM kS1fσncbP&R#"1[1f58?\5!2TtV⥜g )Q8 5;S l(z)Q$g{3 OTچ6 =]Vq¡CR - WAq¥Q4 A*@9iDpgad1 AJήeb\ph1%%HtL֥ ʡ Sgq4!H%yvmRÍsejҤ&A p mwSӝzJ[jK#S0븤6UAxyl%Ú<,j5O"dMl6fAt mʬCU@ylR̈́L(;s@Q@ ²Idsp@"BxcmjfS5Z,ҪO33~l◷(P0 "|;hV2E0_9 IĆaOV<-!ur&,y~\_!h9b|Cёu9mcӤe~WMcWjrl=0b:mN{k+>cJS٬R,Mm~eCSEK*s A)LǢ:"`r]_(Br񉎡ln.RC kz|B YQ"!CT~l4sc0ַ쉤V@jS~hKZ&^1~jK[I&pܨz8Ġ514br(bCݑpӑ?YB熟 o M'a"~.qm>?}tC$`^ŖP?>Xk&xcC)2^Nl@OD?GJVeP'&T/.R^I%wZl1CRNGTHgy/?EkZ_]S~s]R^5#RYL~ 9)T溤bL9N$eh ehjMNEbu6>h [Ew3mԼ=0.&A.hBQ1]rp!J愩]G$U<ªXUp4D=*h$Nt`ޙx{/H:Gwl',\0oKd=ʷe=Q]g%׏I<'L/ R6i"kUYhSh=sB˪!è=V Z-Y{Vt,<>ټ4x>իf0Do+7˼cV-a5OqXY{޽t(@jN/RTRrD/+9.NO JRNHW2Izt14o*. d;PĦ(o*h`w=MQ͉Us'9w&õ O m7G5ed.-%\2nGVL|\ù]9y]a;’v;_6nSC9N!ͦ !i%0qs]R^+{P5]0=,T("Xsћ\!NkKbUyX<̈.'1&5V8 M(TDw@k+!s%|uIE^tpQ:$RmX@rvk'h*GOA&br( #w./z6piȿ^D טhNEZKtls4IE:^ū˭5_-"i2uIx'5{/)fZt >bSuIxӚ-=q,iNK5%֝NkKni68^ȱ%3yZs]R^)sM!9K#/ꉥ-yxID:H㞭uDғx‰4:sչrioTM)KȽ׊\+NcnЩ㜵Jbi= yk)}MFd8-vz *ى5_q0EyB茙A;1KݡbKÎrҍ fe$Y$ݡr%ccO ̤ hTdt 9i6wne&Q$Th$H_R<I1O^i4Qnej q؛L"ʙnU3D10CH5 Dެծ՝Mf%] ت(Z%:\ B( {BՖUKyN4BiqH8W]""#]iWf0}-0Xc]&N.7;}8= sLhuZAlHג+9v̲Rdg2[,3p`:jQ6I0A4qudij%z'$ϛN&9j5$kHJHa”bq9& mGT&޷< De<`ݤRx4/$vInDT\TtD!D4)D(鞈Bp%D(r+nךR()J.R-9jQxٶ3oBmDoBMHQx ƕXiYEYiYņ\ZsR p|[=s3m8Ԏ&VQ?1GsǏu\x|_JDo*?Y;6,iJ&9=zcF! I|tVt8z Q4u5e3W6tm5mjGEjCӣmA5oFOk UsD!0B$> -jy]вu!}o6ܺߌbt,Cu!|> j2*uCs#5H2+:Dxv|HzcF^5I>2*)X=~FMwxHz6x@b3ouˣ0<-ioX*:7i1msФe_#BUu ֣[|-P?cĪŷ1Bp5KG?cĪ+ŷq50Q$?cĪ3Dc52Q7]׀z5&wRĸhVjR 1nn3(NgT+q iF8" %dNƀd:0:AA/uoɌ)df.PECEFꁲ3zY[9V?9-Ni:'Y[jZI1p-RcV⫘h8-x>?T[l}ZԥgBNM%OꋌũJEjQz@pتuEAթJAjQz@pGS56b!DNjTtu֥-GT ]?2])1uKpz&p棩1e\7enBTÎ}Zj#7uVF bt:ljDp K—60uKٍ8Q\Y[.mdlpgVjC2+C!9uPVÎmB:.6#N8VKK]8Q58؍(s+m%xsR+p[A^rP(YҚKpf,Y[T/%OW;ŝֶ^kBLR<8uG\G8lbdũA tP5On6WZIy +V6N%-V" :$np$?ֶ^lBEL@ $HGCR[sHJ)zucRfɯ ux$9F9[Z:w!O2ҵߑl(48q0rrp)n[5dtE5-Y DK&NΙ@gRWG6u 1prlj(MO_J%UffZ vt' sPJDյ UVG 2' ϚE G+B <%e"'eLՒy5dNI<0IN\vX*TD#l7W:JZ.Bmƻ 3]33;7oXw+a*jPwk}9ORsƹc_JnA(=p{ݻ8*7R녬GQjgQzwߍ XZĬG-bs ԹK&%bZTPf=~ZƉIkQr,1l=~RƋMkQ[v\pLCS:[]5D,m5D+*>G7kZYkZ]U)sQ6֥uukx<5LVڈpkZtƱխGW&.8U3_n9#ij!fu] Т8VjLFZ_ ֺ%yu뒀ZannijCMk]io;q¹TM#ZԂk]io_U!vyHt9f]^P.XčIkQ|:kZKx{rˎ S{bEI٭k-8\5T4IkZZ[Kt.mfbD~1:VW.h7ؚ=KX:;:3nl:*Gؖزc93?-j}썓 $H ̟^lSTJӪLTJhฮDHbJpsi F N1^q)HLHHٱR!r)80O5ܠ89ЋN‰-='%QxԶʉm N#.xj<qM"T <Uvԥ>,`-)f ?Q U 8b`-)K":=}6Q%"Rc C<@9'{fGbĠ.vO>}#6~ghψŶNrĴߋ(:B?i=$rduVD8O z#FNJ::nkN^$TlHS{؅;'^)/y-7Ҏ=ZӒz_uV 䖉aFJm0uUOK\,(Ž#L'֎-iwRF\l:zzOMKf!rZ}xqm$%"nf&h:tu%x\q{7\1A @nݷU2=QtҴ˒J7f(-GM׷cF!R:ĭ/;Ĕ䑍پ3*0}-х̎+K6$#vO`{E'CCĎ+KNJ>7dU4A4uT(uֶ֗t>+Znm::m#m<ڧGpEPuʹ\pbWx! ZZC^MZ;#vO1+CHuNڅ/Gi\:nqpXuNڈ-1GuZmi}ܺ ;GT _QexgEq*0`8>5Cjam}#_RYSDvkLQj)p~,:S5}>>3Kmnî0>8U]p( o*gU2}p( m▀::IUjy( m▁sXsRH-1D=o %u\ y[51ͨcꄭ/Du=o #u\ zi%1ͨ$cꅭ1C=o !Zp1+lF8~ )i՗ZխN kh~w#f+(o;V^!h \/^L2u"a"sBڲ @Oh-lsg2_Uq:?KJob7T*:^)(UHYxNT+lz$)o9<߲-_$Zlsgt/m1's'~ȵF59_ۈzOQvhmO|"6{J_ql܂䛅4߲,q=[%䘒\P6o~ȹ3>:_Zҋf!v싕8.j?hzD\i Χ+{@4n?j2|1د8G)kYǚ9UQ~#["@!-6,T^amy uPh HZq7$-Y .2jGs $-aK1oHIak\d+Ȍ]9Fž!%녬)c!W24twqq"B$#bu .2yy& ste>wqu$n!td󻸸O "A$$nb^uwwJ?#`})MK7ra(,ʯ-¤Ȓixb3 Mܥy{Xtrrs "KW\w=q][F'+-L-ȗ%w$#*9hʱ=p ۑE51-TWW K ¼1nFUh9fM&BwE.L/4L[Z!&p5 c+A2^dQ(I2x']#,ΘyR/-p ̕6ɼ'T#-ꊮT \"sej1oOqT#.ꊮT Zw -T[M!کq:F_]5<;-[vX{+a]5-#n[(SVwЩ]8*f!ӸUʒkxz'ET)bL}WNa?*K)UOY>1EGNa'*@KЧ=_-: $9<А[BzZD8& Y"T$6;"۪#$EGMӜBEBzT}"ߪ V,p*:jH^ M?:I.噮GMRܩBIIzNE 5¸O!C$ǡ4ߤR. `zkqQ4.!& }"TGL^tp)f{q(?uB9yU*:bosV!ڙH|pJ11{K)s/T\$"L d兕A~E` &GW d2wX=^f `d|pHoN˙qK&GǮ /fV /K~L[.#; ɨh2:2:/q 'fV_%2:'qu?4!єjdX7o ʂAr2)_Gt¤s"9ITȮ!qaH^lcB)W53(hmjd e8H @ ^U;eWT!x4 HCX~G p>UU$k*V`fҟ-TA;څj7"*6\ʙ2xR$QKQ.hvM@.⬰K °3 &m46mR 1sC80K$ΒQA72*.ܸ&!AQ\*gr@YuJP9@EaPJv]/bĥY*G ˁ\pcE\jt%SJ@yC D.EuUl NTU,*3 mm>OJ;ӱ *r ܫjS9LB@Nl+l :OIԶBJ]`B|/0!8R)y)ԺJ^`Bp/0!8RX)K OHԼNob9k^I-9 ᦘCz:"ɠ妈H8i_I-yɠRy/&8gAM1En+pѶb3m BƍCm֔4m iAF)fz) HCpIbRC;fT̖T_I' N&OQ9jH Ha9nw!INcp q'֢X^WqNݲ08J"9UlXЎC1 JMG<Tqq W qKd+\ғdeu+I/w7&z*,U)D!G`^j~vSWR.qN#;m8F"9?1es*턹I`U XlReaWkBeMKI^, j>!LXlw # Beue˸p 4P7kYir?/')QaO׾i28袾>"SA*,Ab%eҠa Qa|Ni2Sg7mEѱ:KE˕Ac` 5m2"[eˑ_tQoնhn-[ G ۫mE1W#[/O.g<.ʆ@wSj"k~YHaYd{h7Ʒ^L)fU&m-bB2mzyw̃E6 eU}v?i^^3`g-jϿuxvP{piWףsh- j;=0_G< 4ZKNjVE/&_SjmPjez+=$/O/ڈ4ZZ7> n}~cK@*nkclU>%vh= }~cBR@*%aBI(= &,i!TpwmCT_""Cd@垘Sd`.ʨ!D]ѤFfWh2M REwL0{4#,hm'5IHK&I \l [T5JJ@L0;4[& jswDR讴$^G `b, XzrHH|u۰0C+A\D}G۰Vu8*+FgV_'wXm]T4jbR0;?Ŵ݀ԲZp53W{ \,rz+t[M G*JޔSUw<"cv~U G'KvPbPp\55W{WvkVv,KMK(e^o"0*v"Znz7>t57SyW`)Zl74Ea EhV=⫰^M:G֛!9ʚYKR'ۋ̧b/±UvJ'=z7Vl}-%n/2z@'=ե\ՈjHQuסeYt:=Õ@ԙ)/D>%GQPS*׊*-Qj/2uWm^%WQʵ!P8SJhz&y6'*~fj9HNʼQU,*i QyE$HLY{Gk*ҳO;gEz!kff041z{-4G4Ҫ UÂEZp ,Rz* kt⊚ M.%NSU07p=>D1k K޳EZbr%KNn-64]NG\Iyq2eAu"EҒKSɚA`EZ-h{-%xGS[y,mZ &UVn6ԥrz-6dwVn6ԥ4oYeZL.x+}84}K-o.&Mp<V^n>ԥӔWZm&V֞|>jRi+Cˉ?{q 1ZzpdvC}gy!&5kROnZN`<V^cVꔰ!;m%Dq5{_wNez7T8l_Bxŵ%[iX{ R7\2[sJ<ޯ r{>qz'T<.ћC62wVTu;u<.ћCFJ9mVnqQ\VC]6l. rW;MTVBxѽ˦\TuHw[q!v4uC\T}I/>ˮ#?\2 4]D.6"ZO>î8]/FVu@*_b+ JuXqU!v= aYB|kEwPtUa]NQ=nhÑ-'=/ւKnP-Z]4gchM yVSRۄԊRf!uZ}nV♎*R*TO mI.ECFɩzҩ[F-\`1p82`BL`f"9AIqqMe38g ٹp6F>nm6pKCD@eQzMcԒ5ʊMSCtѨSt}D˜b53#nz>_ob Mie1x>h}n5V ynv>ob;g$n`IJæWC!vqf@rW#!~u&٢e+|w JM!E* G(:nl>b;{=)5cy,G-dz)PZ9AQ[Z'؆IkaAhtMͬ G}H0R N>uay4&!h%H!EZԒ@ RWqAcEZԞA*@į7;D7kZIx: R#|nH鸕h ijM%%H7 DxDm5I$ wt ˎMkQ-V bWH#ijM%jR#y.-yT#">֤V_Vڐ-_9ۅ}b֤V_Vڒz=ԾYs1Z1ԗv[ԃqXi)-mIpR7bj1񻍸 :IjR\խMgQm8TƱխN[T)pRWJ k|ln"sVI9]Sli\C~>5_n!uo&RKҹ髧E2gZKy46\ɫMY=q3ubHje. JUڅɭk-FSR)pRW'c%<6kZKy4Զ\D9jioGk]io'$-#^㦥ڈ,ֵ֖i!'m-:ov:o\Ky4Բn FMC6g+zZ[ɶԲn ND?v|>o\Kxģ ۂSjY}Gkio%XP- |q2bQ9uZZYmճ;{M8|֖kGYe..%W<N>Sj9uZI[e./%S;~l=֧\>s\KxԶ\\JuJu5δYMKlĩwS9uRJe./%I7M{pps-JWT)qru}5}8|֖K'-m 4~j=A\Kx-mIq#I$Hȑ*$g&rL ̬S8}MFLy,le$Ƀ(Q%K\@C`Rvw s/+6i9˥Ӆ&&EQELIHDPÄ OZ>'DH{-4eeU!p7YA"g %U^kfeo_HQuGEE{(*bQf7 ~Fvjɑ[KMXʞ\Mө*Vg T939əC5dP vogowAv%TUYSM2fL68\Kˎ IW,[G}7O+>~gh&!NYH1cIJ_7M>>&'MYW~4I„' /} \,d$VaKɝ"i`n.U2ulD,(By8 LqXn Ԋe:hٮ—R鼖XnS+{ሓ}V- %f]7{.+2ܸ&7"RCivYwq]lV{k&{5/NKZ}EwIb g:nBIe_n N'%;7,/X:Z$3%+A,(w-p˱õKS٨JVV˱lõOu7vjlUL]3Cu"Mu8ݚk`][j:BD8:;~,znBRrS.CCI#̧);o+ uTE؈H}fI12Pܬ<&Pb!V $zno JUUvbZm.%㧩9`S8$. \wq5%*XhA=.Ae V:2zno N}phq<.C@p{DR#v~!)QSV\%Rzzn-:B^ѣr]Z=\I)W'F$;T1 -`q6wUc!:I5iIvb<WkK/UcĽ:E5aJl7NAkJVcļnjS0وR}zj֕-9pi2 $AKJOLjA(i01̂~PRҩY/N @:OOE*|B=#O2E-*LK>%ꎉ̘ڝGwF')~٢f|B B8 u9ŢvưӢ}GϞ$H ]W1]Ϛ:ϐUfL 6&FQEtCG@%JeGxkzҞJ(|c?.1$FMb*C-*p`SbGU5 w)Ks:;2*( 5|,83T3 sHKkO4E)L&2'e݂t#/1S5L4Ćs4\.5\$YM1ٻniUEL@DŽ0 Q.Ѯ% W\L%lНc.fez MR*&PPW{P ֻyLM&2*\ք{GSSԤ9S+g*>bWM'͜`%&PɞnGl?#tLDkKٴzIrmǤ,bDz9qzP9݀5Q#P1- b'PƠRZ"F Bqa!qyCPе5 \=abǡh~c1 ?Dy冟f9K-$yiROx<Ǒ,crdy)h(%a*qB SIi)tBZ:a+!a ACEC)C]Er]”bVp!\%F-g Qx+ɴUy]FVpݬQyQVMGY'ݐp(8γ$H %C? +QS:aUH8+'t^TO`~<]DT$)) PİdՒ3Zz_V21Yɸ\]R8Q)DS р i4DʂRcќ僔Hs)pBd%YRf(C# '~X鲩' +KVU39;QMD8!)TǃCOn 3JP$ruJגIR3*Ѻ ~< HQL(8Xa0y@ 'z&WUbeg9A.l[OHH$Y<E:LɝTrTxDR s3 $շփmTҙcyLƛ bc$\2j2*\#(!:F5@b|fh|jCr&'s}a#KM܁iO2+&]!$던/OEM)(%:"-,6!EFwxȕxUf]%Ƽ)a=㨩ȕx'Xdl%){Ïb"UkhNtM}9W9Idq k y/8'5*/%{hJtOp0r$shJK_̕$j4a%ȒjwΘJKprE ^ēF0irCJhJFНYG\Wu e>pur1.q*ܕMeqQ.*0\eKXZ%sh-YO\T}NZ\ZfKE}&/Ŕ;+qu*-,%%1§e|qvKl)^y~ LgDl&~X+\e)MF-!aSA\_'BJ$lHSˑ}e2ɮObz7e}(~iH?ixBr{2ʒwn,6sy^!r=&uF o%n62fr$-'#+]nJc!Kb7,Tg Wj6'w+.6bnr] r'.nI1IO!,Npj.WPm6W3݈ܯZш(^I.؊nTV$UP_B3R_I6E%+9c\N%Q)G+Z\)])+9d ң [ϭ XH JYgUJ6"~L)cj>-+9g9W*1؊ntʱ+m–cIYAQSuB&U[.XCg/3ߥF[Mmw`RZVs::Tg#ɗ~=xZVUIlE'JeJSw%imw.j؊o&>JSy{wj-w.j؊nLL1BV~ ۼ5YoCqTtR{E2^!i c4/nm}ˊbreIJh~J ;I'ZelWZBڼ5sFrl'O`:el!i K4?jm&^yIيN0cy]ԅ!PTw+ML> gI+F{W[вVt=܃@lϢU¸FsxŽ(g&&nAbLW dFgxŽ//r6!F4{P F7*'}b@ 8 zZaSMijRpn%eL^6^2 Y¢R3 (yMj[s(e[VT16MbV0fgtD @a.U5QR fO*?lIXA፞T@22=7Jk)Dҟ1I.gJ艈s "|@@È*]#/%Rq4Rd VSA)E0s4 mwy3rͮDwnM]S %% M. T `#QШbr`DDͯ}Q$C*mP?hbɔ#%T`\^5zO,Pda"=}li{ rp2L*@!y>wAnP>X'Eq4 nAJ\nAJ^mč"R'py#rAj\H܂)KpE(ReKPQkB F ! k F bQ8Մ4!MhA{!>h]9iQ1K3ܥZ\`鞈\``.4`c#"!YDRPWJ GGldE+89ȊVpb1c")UFDRg!JF2"dE+89#")YFDB-Ǣ9 oќGhBƍfB# $HS(l TQUL) DyF8e˚QyHS%pO2JT'!ND CC˛Q2QJFK4-۹`rt|!@ pn\Ȉ0u3KtRe_GzzETX 9ݶ8(T RS } g0gK=RTpVL$Ј mږt;,үez(B]8@cӣe^!Ie2|YpF{B#vF6-,4bnDҙږ𤲏d>lj \#O_Dng3j[“%᪑.*0=z/ihno),Y TwUy;HESs.+a/]D.2^zd>-8j  zN&yZbo5RBۉ_IίLKxZ7ZKy \?56q6tﴷ{YMkU0]Cϼ \.''W"[PocA].h7=ieuq}f% J65SSm;hȓQmZ7KinU>ba5(Vmڳkq{E F>mjZye7#v( R?m)4[#g:nC%h`$pF~W}nB68Hj8׹Tš둻E N{ǢTņkXS]r7hi]}EQQ%SC2څ%sHn))p䢥]qY4څ%r n0*Q4$]qUOZmBҸD0IRYisJqQѦb[PZd5K~lkTݒiBҮn).QZ%rm=8;-IVd/P:zfQԌtδW&nd!„ЫYUu+<3-IU$H$a.P}UVZ^{ZKxZU"fLجz; k[’oI!Cٲ-ibַ9L})*ٲC4ֵ)f\جޡfqֵ-9CR!L:wzMR1АI) 17%l5'[AQ0 HibM\R EMAjj\M#=rZ&% AY =}1t @#ʲFo,TNWi<њ]BETT C sJk:[:򚷕c(7,B&H*'pLH"\p6ºz3VvHfSn+4eE:QJC 1)ĢC66⧽yLNyLC"]اS #wD.V2#`W s1ulTtbdTHE-`G @:diBITD+6fS\-/j U9@ܢb!]BY>,'?$}KFt`S.T( S+OG `J:&gsZjv5Uh Jduhd9 qG4 ɾ(ZuC̥l e D!Vx3\CIRpi e5qṣj c V/ij8N>i0u,qtˀ՟nh11(6vWs\Kנ{q;@rbY׳:ULAdx>u{W}6#1zIX G&ikuHCɶO]ۨbFf G'mMr^=$ PrsAi9CJn(j9;݀kk`u XEZ1,i{\yFi%egKZ1,i5{]y{sV>(b6膛gY相LVVcVĬ- 6ڰkqI! 1uKpb6"6 r{9yƭ-Xm\!wqEߢIY[[ <U'[1tVhCW1Ua'[xZxZ1-qMUnGխJ]*ejԡٛAUG;T2%g.i*p+RLRhCELCM S3:҆Cui*@;Ien4beT F UF(qII[[q&W%hMQy%XdtnK Wh9h4%%h#> 29{ MjLAJФJ'K1 m:iZ(b41O0bY:iZ^77 2cBbV75s%OMCL{P M+BكLhP I+A +PZ2Yi+,=$Z‰#)|Y9*ٝQ4V% -+u!DZ19{oɏT!U3l7A2pb QP,ʑacf Mr߂8XkW0jXitt @s,L0IgEGP`H)$w*@ˬ&YD"i8r@ yVR LRh'7Pl A(!y 9UL ½-NV4e:AXS>i] TP9)MDiq(i|qK̩7&YV$CquLD03G &Ԯh5BjgmܨAJ"lD艀Jb8NgJsXՒ\)SfTPJU9L00h$Vi,Wjm'i,bQqLQ3sRbTՋTNlrnWb選" Pܥs֏)H p0pq(T4 S u,@Yp͓pPNSL)! 47/vka YTv\c3fp˝|1 a`9V- K*kaWST@qjv8}3xynz>o`r"jlﷰRIv+S>ewC\g5麕e{"[ O([:nj>o`rcc J]Y5+sļ&lj7掛W {5r9nX>=uQt|xyzn Uyq BZs;1_ru8߯GMsS\]C\خGkZum]JtuЭ9k|jn FCۀQU'5n5Z:j}5Uv:Km@WH驧#kʜDq'ԫtSazPb5D:j |ePϦvjLيm@s:'#3)N1*n:fχ'&h}~1pb}~1tt?7\z~n-)n:Vj u IåS '0 `@=e;2%;OKHRIUiXQLR"j k1C0^A`diZ-9fIw xL@8gΘ9܀E9JU5CRRyj~~ܽç@P+ H$/D) WvUgi957yj}CԭZvĪIT9sU0 p 8r*Jjm;]_IjXx9*5(<54R7'U"D@7;ϓ+wA GJT}3)ZPW% * (2`E iy`-Jr[/1;5^?Q(M8|$ @ & @9nS'6ѥSKsrʣ)JMl̉"@(;O@$7P]:*Q:Gl_T-Y @)u*QɪUe)' gR2P;P3nQ1@9&(q_`~N"ߢ=oHY8>Fӌx<07'y2"ox!f H)qTAv`Y%lR#m ;1V){T7=$-+tﲗS?ك}%o;覇Tv`ߡ%aiP^i00nW1V>:7+I+ J"O =$)*H u<1K$)*\2As$ Jo*Nd9hq ġnpz`u/ ġnpĥYfJ1)s%.u) &pz#ø-$3LuƁipC @ *Q0#$&jd*e pݩ/Jtn: KU#l' b[8y `X~uGԲj2n]N0ɴp(ax)s3 NZ ~J6ڰDjLZ  "),1@yJp@@@?j2EOEĢhZ[GO%dDR$'$9@ v\ `n/@D"HĐB$I#&艠 Z#ĐR1$bhDj8DR !"@I!LCr!"@9B"p`pr1qN!"@`D⇷CLDz18$9 #R!G(P99 rHKD5 @ $DF r1hk?IڍHlVjqK5Q3 L$HQ91BC)L``A+c8a(s2hk0"b*Ho d#p&y3ssˎ 洒Kmg4-F`HMQ*kP(J`Ly1G@Cs%'<%BQ= يĦwr#SyEȚ!1 IeKST:\iQ̜h A"TPݪ]"l ަ_[K8Mg z#\N=^u:꫺2LDYj -+, )L%)D@UJ&Օe^YDTS#*c8Xh*hgj\)0dJ[*Lr~_L-":6;b(LA*  ` \JWM2 d*;#0!` &"`<h1Ւ|BFBF BGD49 #iP0rrP Bo#!FB BBF CH@iЀPQЀрQ @ '3?M@d~>/&]Y{D@ eŝ5P),qW_[aU RYjbX ?v,5Q?%V#),qYE|X0F|Wy),ِGtVXa)6 K(|LlQy!-,s_mU9RY@gx2᪝- >-j|dտ Rҽ=T Fwx(j|d R_w Rov& R%us~s()pZWC *pZW/P+pRW8~i-PRW;h5Ky{tj()*;jc<}!_ JJ(-*>cJSORgzS+ Ml;hjo`X=jCM jKILslRO1!H-%L5 H @ $H{e,ǣt JNxFiY'JqP3s3qRЖO(i9Dw7*y3vB^8P͚9d(IӦAGm\iWҨIp6)`T[71S >**MlmCPQW #ŒRn9{n E҂`ґF E#: @CH@ @ e&gRk,?zaO,uCfFS$kNBҭ^L(3uE6cùUc)qTI2)m̩,ΕJJldLT8 Ȏq EB`q  QTUJQ=Lf n$!eAA@"q3{Q9SVReU[ :R'4&\6D&+#t {qL3 c7::Xї g*dNvį[f (D^R1!1) qpռ5L+j5E8YpuLp*fڟԲW G):nz>o`r"jlﷰZYI]]g5-֮G+QwhDqe{Q" ynl>`r3_n FUڀQuX'cdTr>1[j FGp>0[j JGME6g#ZC@U,h>Wj F}W<3-N1r88&l}~1j:fG' f.LGKCu͟Gҙ1v~n9%a֠p:WP~`:U8qsL$H T4VTԽD9=7QɄEP:e@D `@pǐ`}o)J҈HQ9$ܹwi2%ɬ@dMUA1TLcg )+vMTpFDJ) *(pb 8"ġq6YUA(4yrY$vcb( n) L&%7!"#-Zr c1<?Dʰ=@` qDJ9@ݪ=H&ȹj$9[q˗MܘEɌ7)( @;L);!L.2X3wR3Id!L2%1LQۇ+9b:{P; p L"Rq80 y;\_&D{o_cx p}3ɧ12 Xܟ@W3box%,Ŀ`GUwȀCa, ZY?ÎoA>(uVYՍU@id^%FJɎwZYɺˎwbYqgGUZ;-UX EpcIN vw0ZY'(v@skUL;-,¥U(`]rѶ#L.CuUer_ vuT#ɩxHCM-S@Hꞎ K'A:c :CҰÿz uNwa~Xꛎ Fý/~4pwc}wdPuLͻJ#KpZVi{䦇TRV{Sl@IZWOjRV}:%mӉ0v;0Rv}5C%A:/rv`w%愴u.;0RTcu,;0ZTu*=PBt)Pz è'P :=PJrԇQ`, $HfW)um,⛤$tyrtrE"0b g2 _EZՍ<[uf O.EԱӢ:(7"U8 `_Oq)ʦHK&3=`9Bo7z !b($t=e0fʕ(iZ /A#\J.zQL4/lt0~_q v*nsNL*B5L.ċ&j f]S @@PlnQG8WW:-7+ij> I"3NDJu !NTՒ|o @;`D0o FѴ4o7 @ rr0 r09`D0o`~x`1o x`4@ p @ 9DZQJd&ӚF 6 : vB( SLS戎 d2񳭮 U u ʍLfDAJ]N$J#8t]SPs 7-M 1*@ (((@)p0JKzmQIZFng0}5B&V+(h锂RÀvۧb[kzYOMgN#' StbbJaIB3>\'Y\s4n^t! 2* b8m6mu"o &a@Ol05"MeAw^Sb 8n%y伫q1|EI( SxY:/#/BuE);4҂^VַЯ}1$#*wM( 6)*7#eI1$L^sk[2BW}&lĒ^s{&76ַIädQ$Wi3mk)`w*ޓIz\C3Imk/w*ޮuGxgI'd5k%pT#'ꃈftZ-pnm9vCr]K26sZ& T#)ꃈtZC&SdY4r{28gIփNsk[QHʺ)&ַZ:spbR|uFW)&ַZ":sथ;t#mkq+; JSh5gTs4qb*w'k2ިLi7 !9Sഥ3e%o}8LXBk2i7+(@04􌻪&pw'* |s7 ++k#OI;T Ek!GN/{:1(W"FPqL}$︂j$KLڍmģSI;!1aq*,̡i #W:ws32_=e%7?1j./Ӿ/ MH!s}xl<}GzϺA;;!_KΐB#gOw2~!g= \sΟ fe NcLo u8#;™KӘS^J9_fPH@LA8~t;B}$,ǤpwgC!{'Ðs#W1^tG7g )s؎s`sҝP7 0-[)8rprwh\Gn !|D @ $|ۦI>dfj:kML]nY )iOfD'Ub%TMtrgꆼ16+WEwA^jaisĥ I y$ҩ4ԓԼ 261T9H1+q` {CXH},$՛Y߶LPʘ" {z<ᓼeV] Q꺎`Ir](pX5C6(+@A)L@) cegN?cQ_P>O8Lhj\ ! A5<1 zc <eC@J採]9U F8!sJDԹ11 K !CP)YhJ F"VpZZ#u F8VpZ:b*!CPPb -CCQjDDbZ"P)-#Rh@ RhDRH@b H-.x@tDT%ISII$T: BZFF @ $h2mm-P'>jFQ mjyk8Ҿ׀Jw־t6i9Z\Zc NV5SYbַ^%vZ[zێqk[L-c J45Hn9Ɠzŭo(Vt!Y5oD7V%rُ5Hn#ӚkZ)h:N. J38jG4ֵR04Z\fn%.G4ֵZP3ipRU#wF1v RڈzC%}Si+Niw\JpԦT:~"eE S9ӋkVY)}3f.O7=(DN%HTJd `HR@f@0y6- >Uq{g ٹه14 *"*^{Z\Ge95\M]SPK3I+6F9:ݒmk+b;1"JL}[cZu a%cVMC]c=^%O2\RWtC iTWe-,؏-ԭ#+}iMe]Ucyt,,6rVjYmFhvpZ9AAsA{ ijZm FuXvqzy@1YypkZm EXvqy/ ȏд_UaXykZm EuH}n.Nr|MkQ͠螩eߛ>k|Zkh*'Bqrw揄X䠨 eHK:n5\>?w,}b֧xp6\#U[RLkZKh eێ:nV>=upc[ vl9 q9kuo!|.gX#pj7BrgZKy.!:.͗!x-wSrgZKxq vl FףG.v<6kZKyh fj7n5H>8qZZ[ĭD8]. F66kZKx螩 e]:tU8ۃk]io%!l5Y ZZ[ĭ EuHvpj25tuێp٭k-V; 9Wz>3_n5uBgUa#qjUOKmDvkZKxPoVapƨVډp٭k-z; -婧#|2gZKy]h;2n JMI8-މε֖tWesRn>Wj$:Z[EuvXmIV&v\.gX+FHC,k:tv71ukxQZYmVY}1&5o*Բ\Y=1̇يmCj>ըԶ\S:1juf>kRj[e. JRpĘ6\G63Wb6֥u6\A5foG$xkZR_Vڒध1YA᭏MkQ +Vڐ1)t Ht4 Fntr?~7\1"ZC%Hx~njE-KXE*@>r8o\1"?:XPR޸qݝD6hEɼ\G~8-a2a#Z_a#ZȲaW8fŢ @ $q5rukTW7^]6k戵1L6Q%Ll0aj VOfUiI9Ef*5AtntRtDXf0t)zuo+*}b $AF]IpU> Bs'Qaת<7QS4iM,N&L@QvjX33uf9@Z{/gKwRIIW*8LUFWcJ:p6n^\y¢,Z^jis&6h"f0fb8y2?&[aCP ՜kH 0'!1*}gݹz),yO@Րn;ו+=iOVc!<ġ#^T}b O#Q/k&:/p(ҿpꑬx'ЗÝUx\qaDHݟH_6XuV?Z:2}ņ#S~Jy#foGΝOS# ~duUӾv).&Ixxkcbo.nδ3{id^>nήnv' G'P/Kb:_>C3{idF⣞lĬuU<؟=+=nUAq6'OkdJc:eb\lR'!pQĬ~(><ؤ>OkdJ\>1h<4|\szCDq4 J :^=+pz~6Ru"Il Xh%+FSfD.Ѭ&JV ߽:%l\)l&BvZ8uMw͹߲W\(EAI[*DuMI0r{2wvj"MK߅&:%dM-e6e/}|`r'}— ee6 ebI@N"wW\"^% J!{覇Ts2w%p_V)BN6po/ J!{SJm9 N@վ)*LD:|P_'}VbADL Z^KS7'O?dM(p`躤)*xĤu:4&?8%溤%)CY`s"iGGO)i(KZLé쉤o;,%ZBSz`u/"i%?+p?Yy%f?~$Ag!"~K>h:$/32mR$e~#8Cs)iZtGQi3s~4I!8yT @ >gw6ZFw}]]_T9uM-@tzGI+)s?&<,۫a>.֣E#`)&À5ٯ.-y t%4GԺ&dިD]`SHl 98{P[("c7H"$1j=¸J01)mHTI1+E|IP7 H:8r4A(GdAqC _IXq$>ЄZhB|,!>xb<1 - N%e1hahDDT{Bщ4 J FӁiC7) CD9[ļ`e)<`9J70C~h OJҀ)<)(  J’^4''鈊P"1-hDE(jqJ@Z!R @Z!D(rZ"S@'Kӈ/N"p!8 Q@ $Hs[QkEJPʉ.$3`:#CQ(4!H@dOuePy4sG#yUAE*B)HL"*i@052J,tIBa/u#;Yr e1@P4Dq(l&yVUE%B_D)TvA7djͦLl@R/@ɜ~M`O4;>s[d3xn77E)쁉_{|?cpŹǺŋx7Lǽlr,ld7qyaXEȰ}Hz{NE/,6G 9qq'oOOb )ȵ%7"-!2K؈8 r-IyaQȰ>$a="ԗ!\/&JCG8 Z#i/$K#܅DG+R^1%09e[d=^D|/i-i1Ɍt LG}THXVj&k22./$j&c]uGD eӘhվ-o'T#,ꉦNcM  K}bTK2ިaL-IGVio Já[iwTI0 s#°4چ#GXkivI0 s!04cBtPkxZTu \0V&]fpy%-*ḞrfQ<`֤rh'gCV3-*Va+\Ts86@ Jܩ[t.瞐5kRmV@V:ETsX6N>Jt ="Ӫ; ZԛEgAwl%:Rَj4V&])U턧HqЭYfQ<֤*ZX^Jt}Z3^0ukRm+Jr?h)*6ߎ~6َAjM)U\A-Rw^bԛEujQ72I|ũ6v{WyzLߪ9d6)/NB!ptSpA)Z<YIyRm Y)︽:b NE<郠&о5CBG9-I-dsd4)7&ttk)uG|ℼթ6v@]}Q$/5jKpHӾr0iHJrVZFΝ g"u)k_Ae"N2=̉q=d8,L\Fawu)F/5?Y 9PeؒRL^Edx݊c>|;)Gr? 7>əIrҵ7Ԙ-)``i5^ɦpD%F9R$y$u@ͥe4K9jtΪ+s̙0DUJINFP=C]$ZgOB1M] tPˠnÄH!F6ȦU]tyWRL%&L`հ"x1n*q(()0 " mbE(ä30,ƟsԶj\ay" [aq!J[`B}@!dM Dd"pdߞ AFm Df4Dɿ<@Rhɴd&#fDT`4EE(j\Q*@ZQ*@RDPKPY!QDЬyhUpr4*5(!8 PB!=A*^MAJIA4R h^9A!Ú)K AJ='i.&Z@PRB \^xkErp֋QjI$H7BYOܪ~z&G!8j*LPDhl$ 5*8N4i4Fx4;#m(t l11 S8ij^;7ʮtӽo'rX]y2ԭch-Ll"$D18 0լ!WhU3w[@7|)BPɔL J^@5Gm:R_Zy;nIʩ'2iˮtPp9H@YHfU%ENPM_iĂk1hf8uE!4 7 Ď-6|K huDL9QB0 81H*{"+OK*e1\X9nE\Sg`LS9q8J&`i% HktA5d;#e&{rggq'ֻ*")+!Ö7Ź=_rb("Q4QV?\oc|_y ٠ڋ-~.&X~vX5Q3A8z?i\LJ8,E!н4Qi-צ;Ot_qYC նi(\L>E#еjdE3lCxGj'F#kMN·,F'D#;ZN k%:a|rD;>"au6CcxrǹōQ1Yu ~כJ}EM8][Z{y\Qmmˮ*:>їuigV)hC⣩/CÐp-)< rakFje]Lѝj0FՁj0'늎޳oB@9ik- Z2ˮ*:-ԨJ4sz0:ҴXe Rrӳp+BҒaxJtMF=6 1+::KIuZm)Qu,hWCîxJTu@!َ-HuwuVײo Njl8-!'e):Nx}ȧTsJi/ J<=TI(CîҚK’g!P=~QtW}\!geuNMS1iEwuuֶ^?5=9iFOwun[XdS0.v?TM(.R֗'% nbQڇuf+BI ț6{P.RAJй9K M J:wP.RAJи77T9(KkV<Gj]enBJй9sɛzY[hZIZ~La#7uVI+.#!:0Mjen a%eɳ\4 =s:Y[Fi%ejISs8Tkиdse&5nnnrP??9nE=9%ZԢɜcH @pMT'ETZz6R\3EUPMLÔ%Dl hyJeSVZBjVu0_p%@)Yq)E!HD)wBQAۀiRMw<t1U&7ETq )ΩHCr$ex3HR^5Ur4Ku6^:EB(va)F)Dl0kw*zKtӋ4ed3٠N6"qC7&"P{Pک8-aJMWՖ[ +SI&AbgJ8l2*C^[qCS= #jB$C[++y!jefJH擷),ڪrSe%)`0yEe b`N2y8|gٹp4`ұbCFn'z (v,YQ9æV*/BV~oZ{hC,7;BV:rQYm_+:n%Z>=u-#9ush--+r~UX֖͢ -;qT>Kޭn FWJ>8sZVÊ(ޭn Fc6kJaxq=աmzt֕-iZC>ۯ;oVa#u+aZʡsgpnQoVat+AZ jGۯ9oVa's+|>4_n#ԏYmל7Cۃ5xcVOGk8ޒ1-kDZƫMڈ%b[u։,6nV:jm]f%^Ah?n JjimR]f%^-h?n B9jI-ODŭGvXm -E6gODŭ!a%ZTCڎ1Iy]d[pRU@:gAjQ$).ۯ+%e]>3ɐ1MRYmוԲ\W<3-MRYmוBOR)pZUDCq0e)J^1-je. NQmۯRKæh}~{iZGۯ9mSlI惦fM)nԗ%<,6, Rs , R/ߍHNi׉Yx: R%4z:^8g5δX/$*nrOMioahH^k- =7|A$ֵ֖[=\8Wɝk-4Rݮ?ǩIc[Ŭ6f@9XS٩c[n̮jsfZspe]\a}5Hn)߄a혍 sC,߆tֵ#LePܽ{cDZԆ$fC}zEāQ$H ͕VMuDH RI?JQeAS]d &"S8 0d=ymƞ%VhI܎r2d$ :FK 'LyLw+.#uTJ fi JcJ&6m /%&{PIÆ&MBUlٸ@ J:z@L*:*[hy2=/TN*9fdQjĂQ %VuT Z:+~RwRH½U7BVNGBɸKVKAW߀䧝f;?sJK@W߁.>wQB7…UD u),|&qP\-h3RV7UUրi|1{iX[?Y93ߎ8|1{IPT\G v>^1iYuO>s;Otԣ~R6|SqriZuz~)+HREyH-8J?g(wFH-8N?g)CҏSariZmz~)+hBHy@=kMT%nH^A41$xniZeW#v~!)[XuL I0^/[{V^LjRtduL I0^/[.ȅWű{T6dBnlx'G&^0 `nZEZ-$:|u? `d6dJ,xK$^dCuC1`]+<ψBtau={pn*z+k!g]g%:} L:T=;=bnԾψBr$ө@vPTV+4K&LʇS 'O׀vB&_MeuCBDN+0SXzg.N,Mt;^;n&p% ]׀[-##pZ^jQq&gK5(Ҳ׀TZF٭ J*& WAj/");l::FW/t̩'!"'H+Ej3*DPxjQN{k!]?lӞ] RIm~1e3(45NrWGS2f$?`H ޕe* ꭒO4frJ 3r&9s\P(OH+;FRY`)JpKN$A%/̪PLD Jg9]Mۿ)g"iXJUd3β"iP D "`.EWԑ.`YIE۪MId&,VTS8+*0q 3 6 ~LmE0B G3WeT@AqP`L00$q$S2-.fi9YU&dCQS! SOUU5ayTʧ2>?9&v pf@E@Ys8 PKPAdU"Y@(""bGHK_]ہ**t춋'唊hf33 H2"q)8A(gXjllӹ! ǍSm NP%8JhBp)h( JJhbz!*X@a,)8BhbPдB腩 "-(" qQ)"CS F$T1x Pyh)CP oA*1(RZu J1-֕jPHWP4 9u NҺһ1agһӇB'%8sE)zpP Ú%KAJ\^xcH@Yiy 0/N1g$HeOjiOuJ^3;lq JLR s$cf` `iiU-&֜kK6rDZ7Ye(T.|"؈r&[o&]ǚlFJ,f@!H bqWPϙ=l2[Uk:fNWW ѫ.T!EDb@Dq 9T6:guJ s)# u rKp'nE&s@! Cbm]TURiM#zI"r:4gvh *)瓄8`v}=W)o+VWL+K60L>q2b`P'DɎP 3C p&)Y9"I˘8uHD1^bED 3C ƔV5$fYc5p-FhLKwO D1wgxn1SЦ7)ŏ&/9j:EVw19)ގBђ;ҥ$%\9 yBOZ.Ow\s%ѥK%`!(Tέ.9'7s/HJ: D}iqυ'DWl9Kx:BS.g'DWl!9L\wBSy ﭷZrtIe!9Lw:BUZ=y_[n$W Y_ NiP!nHJGGg}myaK+)Ln- _\Ah7;mēT Js - _\C(ﭷ O,K+)ߘOq3%m]WBV|iQkω[vH5e)Q.O /Yk(RcfG<t`}[vN|5F_WK+Iy147YgWBS5 ~zxM0:D'>#/@W5 ߧDͣ+nφ(%@j}^'L '>@W= |xM02>]Y_ HǛχOHk[vCj* e)1ޞ)LNd¬UR JanGG+>E:GݐQ Tm7-LN{n؋ХKt'n-L}i 1Jl%$(Q5O ɧ=զτH%^RMh\4YD纴9z$ I3$/(V!Eү|%6OLN{M{^*eJuē哞dO^*RcLoDJSQ4%ӜtyWCiHJsZ\sW1*HG!=<M(HKq8ī/# 71iCANr\sܼ1s4!'9{@*7%IC, I 3T4].JWّlvQ9TJuNuAT `RO(٢rZ2@̥4 0 UL/l9(`\EEI,܅oԒIC)i\M pt4͜*8hc}njW$⍯I/$`5gQ9&p:S8QLHnKK>mAVs +ʆ[+8qYMډns03JL,y̓m8SS=_>x# K@(ZQ³-i@#$Gz]DI j:p7 B& Dp9b7C<5-- i4 Jш5 Z&C Ahjc9玠oc9[D4=x41945451hhjZ"P8O@M B㤐=BCP$ !it @@M ˢ I SIe@ 9}cj掑U}T2lɄn^n\.dQ!8><@l0uuB)K$iZHKf bMEE')H)i07n~STi*TRRppRÔ9V4sh] jAfhє48vTPSM$4((RS 66u7rU28~e_0:rS& pq]ͭ .w'4 ɝ8a=UTk@LT@8 DJ2^f. ŲNhʪDœ嚔 ` L( ST S9,y0;9rbH`1S8 XKyD[DVݑ -e&{rggq'#/0I];j:#|ԨJҿe TDwߚڄ/<;>! q;8o1 Zcxv|BSx5R_߾cj'~>-j:8/AY O*V5RQ8Ьx%wH_M LjRyObZ No1J[hV5H>29ßڼNquhVdbN3óǼH5JwcN$5'sqF RXi6D;>!I\{ԥTR;M^|B=A[i2w1&e}MS_\i2wM&[eiGR; 2BUțjcIIF̝Id%:?R@D6dbGnY}% :lxĎ`qD55Q$;$VڂS!+ MKE;AP}-%b 1ptIؿ'&SA*/%Dq ?#bI9d"hEğ~eIIEo%bI5=4RN ?b5KĒj!4rhEĚۡ?Iɢd#;-ə G qcD,+QH[ pR_H;3+ZHI,"pOݩ_64 @2]tU3.>eP읾rb5* \r%Q%H\S9,[)W!_Ieo+7g5jbe%` :G2@a00 kuMvyҦ92C?9)GL~,QKWO@H Q7R8Z{؊hj:e9o1`,DY5$B@1|Jorrs:N}EI݇ tS7&@Ofc[Rt>Ify[DƉRk(rtf,PLXLSCsK]f-r5rteP)3r pLy@i ٌ޾MƂph#( DK #}U-]pJҳʘ׌Z?ge6nvi sG USg<1$V{j,y> dvMS;2yUխJNdqկǛ #5uJN\4GpD,ީ(Ry=]Plk?{7qV|(JY>0[gYߢ(5.B膛iXߢ(gu.'`xiՇHoJGgu.ahiMԺaU{Ej/Ծ:w+RJ>sR+pZ6N}UnMC5/#e i*#uo14V$Y[7Ďwq.ԡ'5.g.i*p+EjS_9u-A_9؈1tV:Y[Qui*@'q"-JwNj]en F!6 "-JG5.jpʈ3zY[p-)</)Sۺ4Ӱj1AjQ%5u5 TfrlxoagY٭b֡)v9nj>؞ob88ֺ O({>+O|O7kR]Z'- ՘ay\VֺO(;f^]"88g5έBR8ܺtwyƹĭ%;u%;tMʬsq֖7"D7nΠ֖7DwoΧx|֖o帕hIs-I^:nX>=u4?7u- qGM\ bi-dzo\Kxb7H!DZÇMioF^U;ȊƋ7u5 _9k|tn9EZ:ݯMqRwKZZ[UЏ-mQmwkZZ[Ѻո!񳍸Nj9u5ZƠۈtֵ:s-@qE;m5G6zo\Kxj7*5l|fGFZjOM]ioBUPpkZlֵ֖nV:jmL]ioFr>0[j##ij5&uo JMG7g1ֵٹc[AP͇D8L}b֣RjcX1Ң39] Zsfc F}G:وkZ#VGLd>Sj SVlm5Cc3v\GLkZ9jM9:*cXIkP9难d#5obi-aITQ4z>?\skZ5"Z’LyfOc[ƤG(Zs'Cu8\αխQΡ)N&s.gZg Nl~qSu8\ε֖I}Sus:Z["r.(n :*;uo&¿11uky4.Mu1ukxBܬ!ʩc.cXxjkf5o HfE[3XHXUû7{f#ij̪f0NjbB¨n^ XlhKZĆd9?bi-a $H @k]XQU6Nv9ȁMSbs0: 0gwӹ+HfԋAxJ\ DM ڈb +y*(k73E=bLxB@)/1XH@rR;XV6|i#:. TZ-D\vpfgcVCDUwRr kIsnj&5D6$P8g@R[\\i#&̵~ؒ04@D()8"4 R&xL+c ~?73цy=XeB3n,yWcIn!ʎb;mh2:0ˎc-ZO#2:oO)hô^G luU_J)!&HF VtuU"fBuvώc&oBVNׁzy$&9b'q(N ߀Jy(k}H ߀By*<0AU|L>oVRl/aU|LGZVɀKv⣜Y3ܷ1=jfjUQQ*^orI$!BMQSTs4֡[ K'BŮU7AӫZZo1_ uTOh-Kq/ ߀ZVJG?Z\ε ߀ZV?\l:/q ju8jĬY 2܎ CV:_Yo-+$|$P|\sGV:IE"z+~Y\k~:H֧\5(OXo-+:|!Cz7 Z%bmEBlG<ߤ5kSr'CHv7 \1z'O׀ZV:!~C IõD;GT6">ow:᭑Mt;^I[CJ@uMf#sIe!ߍ&:zG I?׀ZT"%ﺕS@و?ÒO-*!ﮘS0وOh l_RTj!E6:!z{2w5‰I"S`17'}RUtXJT%@:TGpԖ]$%:i"O9dbKVH ̹Y FKgj51Znk94)Ē?m#Ɍ$\Un LOsTgƗb ب`690L3D˄i۹S];ͦ2bzYРdȉa0ZUQ6r,L)pJ*k%kŲF01#Z[tg[T䦑uV;ɴv)/Šى`0 @5֓TlO)Oz0|Jx%B%+Z:bHWPbHWPtCS4B*J^J@ņR)C! Crhjܡi AuG45.h@a*9 j0Z@yj=B!J[hr,5,=JeihZ@D-0Ii( J 9Ӆ KD@& RZ"!8$ KDAIr|áI%(BqsTRQD 5*K*]8vƖ$N@EN2$ Qfq.5 UV%P4ej=]2PP| P0< ""S0K?Ӕ帔UKAiKbIЀUAUHl B8,jbkIKoe7iaVT34oͪnj?ldp<.iJL Xsk%޷N9]=>qR(xe5+tI @) C@ jd?I7c y,*J_ <LRGk1J@EdLiF0YUE]G)1K4 @0#ooUL $2et> P:d1 J$mmlV L3 1*8T)p C@q 1QNе= c|? qfhՐ=Us/ˏ\C-*Ki'#!&n!mkq2Qt@^xsI|GsOM zzBO6;P yK(냉'S ӨS %uxwI~ w]'Sd xK),sp|Ok.%O1/zDN+{$I׸\J%9 x:K)%<︒y U}p>KQ| okYi*|9wK*$rysokYqjw?UIY$D\2Z\J&Nb] cקK_2i$=%ķA4=O kPR5Nܧv:BW>$=a- F% _\ww>4=a-/;{]uOIw [Z[o|XұS;oJ`-؇j5WOq\xy0ޕbIPShD̝"a#k]ҡp??Xy0#k]Ң94~dasZ섑:3O7fshmkt~<="+I7泞lNzV! Is 療qnNzV&-3#kY!n"t0x(q,t'}%8^ 2?5NJ|4vSa~k9Q&]<?sc'*w^BI9!~OdxTNI?7̃|p(ʝa{+ pXʝ$tA~B<&t. KNls&b;L^@b8Nl'\N)s~B;Bqnn7/ (t'DĀ $Hȧ]et3RY/;Y:AQTPDDB&)MDzSUA^MYͮ9D™Zhc2D"lG1"tDLsVʵmIJG<uPO߬+2i`3#c!p1 +0"U̻6w+v''BLug+ƅZHÊp&z˙n*N#f"f #yY]w sUoPe8͗#1NP+.q1@x Ph%BIAA Rh& R8OE @ {eI[ӳ93SQBfڪ|F%b t](tqUU!sG ̝Nr$|H1 qPS%@ίjQZIyM*#"E+R@H$UeJP1rjm;CY>}-kfE!HH% b.YU2'1\iUR 6'2c  h׮v>UPrKo_<UP1#-!)펙(1Ô`ԊlJ΃c(M=IcڔfN` L( )Y[|I WM,2 p$)(C(@H l1T =ys1![`CW՜WH˙i0/o9ϢǗ\Ƥ5L><=|{!gXkNՄ'`Ei8zzztXoVKĵҾJy_x 3_ׁɒ3(RY\j:!Ĭĵ3(RYX,j:#ĵs|N)>%fU'f%tﴡ)eH'gU _ׁ6&iBux Gk8dzKjR^H7)n%>y2LĶ%scxa Gkf%^PMn҆P7+n%iHDRvӆT7,nq&ۯ J2>5RDx5ϵGiNۯ J3v5RἈcuϵG^ۯ J4>5S!kuC)^ۯ F5v5SaqkuGi^ۯ F6pN kuGnۯ N6v5Sqs5Rj%^o[[OGu~ԯZmׅ%wTj/i^ۯ J>h0# Cu~xQ-C Z:9tZmׄu7xHj8д_q'_mׅ%u=сO] IkKq'_m׆%sn(q/k94Y}^(HOÈt,q7z:n)Mލ( |,q75’Ep,Q/{9ƳӾӯ N(Mwˆ?/ux{\KxRuGt5KGA{#sZ[“ !9O !`q\e83- U7{Dx +i k-)UeHdp(?WzVS}##5ukxJU ,547q3ukxJS҉Pjkb<osŭo/$T56 7qXqfJ 0pkZhA^8Dej^I!MkR? ϡ7f9EZ@ԔGyfcM%ѯ䣛3Ik-+ro87 JZWnj$s{ncgR,Q!/ăpӛg,*d7(st0ds@D @ [̐%{:uTbÙ56E&,_gTpl8PP*〆O* O]"kJLgReرA D rx |ÈFl/%\')QP0!(Ci@<[: 'I*f^3Yj8 'ٹن14 {/oFƨYj>#!k!Dk[Q\{{wRZZK͎M+ O' j{OwQ1ײ^sbY:ݐY[Ii/!BJ1,.iհ{\{񄞹 VuCmhn>O\IyI+ G'mf^n>S\IxVV!ypMsm%V#4l5ՇM>wҚKŬFi%a؛cn*CJk[i/!ftFܐn C[i/ npl 6:vWZIy s%en(anp+m C\#%W&p 1*p+ ֶ^Ch+CTLb#嵭/!9G]4EH'qr֗ F!\GZ^@5 W[rѵk؈,Ծ5;_Z8؈p}ckKbPd!?ZXbPm`i)x} J1(Z6ޮ 4 P@T Rk`8#;7oc6N[T)qbi-aie#wGM׮G3=RK4rc7Vlwje.8bi-aIevD9nn>a͐Զ\w}=ka{J>OR)q&PTt}Ò2n &P7Lt}ۯ Jb8s YMKlx֐Qj1񻍸O6\K)n1[΢8ۄRJC>ۯ FփƮ6 )-mIq4:.md:j}JR\K'.U`:j뙯 YXԁƓaxjW% -A*BmnV:jmt,6׾ӯ FGMM9T3uW8I8-=Bs\Kxb5J:j)=]l̅OͯLKxZ5F:j 9]71eZZ[R>UڊD,6rkZKxrtt&CQUŦZU;Gjug*)eQפukxr4GnuS*NRf#ijE61d+,G-eNjz<n]&YlhKZ: ~njYlG-a)scuV~ohĩdFGcUh;H"%7{bt%</[ :1CIb"Y9f%rdUd;rRx^%iҶJY,PYQXWűsֵ%< \uV%/բ9\HGeUx!LMljXZ@@Tl꫇qƽ%$ۍ![]lzS–qW}mZvQPSViuOI7=b J̪^h7J;T#ۃmvBҳ*@*ʩF"cc:&޾*Uv j䮔&gM&y%Y\E9 B2 c ƪBZ\YJM0Sge)IG$1$ 8 yWU;YRtTEts7k Wn)L|L(?+)ڽ+Im4k"M[dWI˗9MDQf8&Sc 2nA#t!a.Mźu%bb7(ڪoN ٳ5mW2i, >xy_̓h}llcKx%ѧpZpIisJr)({D(b\+8-@qC)b$T1-0 B"D5$D5 tΠr$@!1-#Rh, Q4@ Rhߞ%G49Rhr<Е”kCQ@4 @j' 5iDG JQ&Ih@#P8$K4N"I ӈ/N"P & Izq iO"u ӈ4J MQ\q @ 4[i4ڞq(72Is1tULÈ 8'o,ê͒!r%4eJɠ2 NR98mG#ZV/[MVIՐI܊N$Y9rDHfRKpg'!@8Kuns BCY͐#yJ.̈VꦿnD)NmN %3Zrٔ'qiE&aU (ؤ3t L/5I,|{!_AE7MVK  dSf!R$m6K-)Y[nO!\(Rf a DG< ; c|/ fhߢCLxb1i'@j7ˋ/x27fF{GW? ;o_Oa3If Xo L)='%bQ?Mo-B^:O~u`)% Dԗ_VzxA]HY셤õĢ G{CQg=jGn%3=k98^{C l@VN @9OK9y +s2#Kr[sb;x:g.!Xsq؎!3sp9ӎ(\@iGt[i87 ӄst>?IoAв$ $HrGl.-6/e$tR]PfU!~ En[88R:;7wQܜY)fռq⚮H퇄E@ E=SS:5[.Y_/;IiGpu*( (i$'L.p *W]֏%U~@4vȋ[vS b*= ;fUeлuW/e҉I T8l`*" L"/6֋?=}_ߢϯ<L(Zp1xrPĴCWpRPPtCЮ$膴R A*5zzF!8b PP @4Bb (֌慩4C0KHB{CЄas”!jYh RC Q F4)G1-D5- Q K@j 5h酨 KLAFZQ-FRZt)8 i0BP@D ^p:\p%:2 $H$VڑU4)LTxdP1#Jcsgty 4->M\5nȂl=VÜ"+$lnP -,0U-Pan£2G : 8঱ rPGP\TC"! :VdjVT~5|ʜH̎qDLW.x8siITj C%&Ck9y3jw !82i!1N Q(^ەf4{oFvaq-i7-%Ě`)J8@uco()9=O2X7rݫ%Lݲ9XF6qĂNQ ƱvC|W=s3m8ԏQBI6s|=ŋ\Yq1iFbb;<1㴲H z!kZ<ҮԲψJyWo`5Qᾉ ]׀ ,%RF#fU P-x ZaCT ToAĵ!i'AψJyP>j{J 6ψJYN$>-j{J b- NBRțգ To`Fuq㺴+!)ZPJ#OXo;BPϦpJ# ";wVc)< 襃{"9KաX J7+XpDxz[~?f5Ssb9?do5S%Dxf-tlx#yM Tw"9 ` J5SۈK~ ` F7 rAb%s,!i]F#xq|K^xX6h !.-dܝ!ytj!_XjRó^jC: Rڄ,X:עe6ޅ,a XZJQ2ψBuqN Rڄtj9lļsqV Rڄtkx/^xoNpmBzcIk[% ^Jj RqƗz5'ڼKө$uxcKom^%Au8cKbNExD}!A }q)Wy'AɃS0q|}m)WzsD?eu8>i49KyWCPq|}epS,c\>62\Yr?p$!aflu'cg% I5(`ԜZID?x2 HMD$ZImR_wyi&X5%b\"!-奘t'`%t;ҼG#Ē# /Ŏ:\E,ķn$Hrۓd2e3 wL&S|voQuŌsv (mW47: ӧg,M{>fS+FXB.erpq9 SL`(4KfvS$N!EO3 eM"/+~WFsS(da>ЄhuPAM\de&Lae#7 G<`]*JA5MR+^O/#(\UYbb)S`q1ODVeenGmLQY59[ Sp |2򀪟HVn3GMLRA)Z< R' D{b<^j+ŭ4,yMl1@DZ`Ѹ9U>sSPbEH{UqcȘK'lk0w'5ʹIduNB醛eY相Oki/3ZY[Ѱ7D1V!}&zKԺV{bRzKGj]en Jn*M) -s-%uu.bXiUhx'2ZZK-=}1rCMNq12^GgW4ˮ FA4MH'qҺKqt/>ˮB4]D6" ;+mjek+PF!Rb!euC-f]4ShJsq)jE@[Q6l. v&ȪN#C8D.i4&ݻשil4p0% z/yS\ZIRiБdIdU8Up(r0-˺i>8F.o0cpᎌGՏy<\*_qtv,{xljy*$is5,hLA"k8Xqb*'Cۏ;(D(]6L.vGEuHvqQpzP6l}]TYsJ+CqU fəo}SyeG(n):.͗׸M;q$; 6\f[^??/\V; 62Ý}VUu FuXvqgrwum86⛤MVY>Vqz7CۊնN|n#oVa-A*C2*Ơ򳍸oVas3-ѭ1~m:gZ[ p_ߔڈd[qMԄ/׾ӯ3%ª'^Q[j#Œ:YmGRSu典5V?T(C,⣩In̷s<[#eT}+H'>ۯ,%T|ӟ(C,⛩zI=f%^fZAmeLRij%^XQ8Q.2n*::Kn̵N8NDTݳNB/E?.zoLτj#Wv/*z(YE.ᇦϺ~E5q,lCPE2 nzmLτJ'Wv*^-mB=5}xeewyFefEJ ^qGIJݲQ+IJݳ R׺n#TN%vQKĩf/p?iuD~h\K-+Dfa ~jS~q| Z[W\6WdW7Sv*9yFa|SqyEjTݲAyFA zSqyEjTݲEy6ˑ%zԧ}qĩewa4]RmD;?h\JW\"^kM0ȦLu/ETݲҫuIyr+:{K#~Qz*n؅0ȺLu/FhDewR{2.FzeO}sϪ3B%M+:yde\TG<4"TݱˑpS_sЉSvΚb)r7)W<4"Tݱ dV锃+b>{Ѻeg92=Wt)dZ2tF>*C Ld^[s֎}M1W??QdY/tGh>F^Tȹ$A鄋 ncyEuc*V$1#Bۘtvn],Zd'V ?t-G>@/9a`I=ж#!;6ֻ&A`{ms ?A7h^sk]0Z[u}M+;gdȹ,U| nwEw`[L%>ϒmG ݢm V0v&BۨB4[LX_ߗWuCA7hןlLUX}&睒6Q$:ݰf2ϤWuGA&]Oie!"U˫y#hNiu!vdT=]]sΩԛEwy6iaeRQuwQ:dt_Rmƚ^roݲ˫y%hKiaZN58})Z/6/qzXVfeҦe?WwKE&Y|S3 `d>sh+ >,O3 %_WwOE&]|m?˓HfJ,#,M gWif\j YU7q9e4]Rmw\!^ H @ $H ln<"@ r~ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @ $H @vedo-2023.4.6/docs/colors.png000066400000000000000000010340451444463326400156650ustar00rootroot00000000000000PNG  IHDR aZsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxlIOlBz#P"HJ(R." " Hw$$@zl{]ٚ<CfΜyٙgZ4oJ`1c1c1c1c1cER0c1c1c1c1c c1c1c1c1c11c1c1c1c1cH&Buc1c1c1c1c q?c1c1c1c1cO"DH*qQ̏Gd1c1{*)QC#H],l>ڐ $U#{tUUytZ-:D9Vc1c1"@O:#"< Xnnbn¹QTB"^_-WWt E|qsUpJV)ȱba1c1c<"tzR)L_D@& ĭ}%wQhdvuy dd5Qt0.q3,c1c1@D 11n"=t:6-DT DS'OT)H$ `ӣot D™ $RJ$R,?sӮA"X͏Gd1c1{RERRԁ2J]u<3/ںo7JvFosnN8lRz!@*s+\eHe1%Zȝ gi^]B4pw-7 {Жj r'moNUA J5] 3K*Z dr'©*F{GEqQ1:Hr8[ʷ\f"k;e6?muӨRiKQ.Hw{iY(fAg%? _H-فKd1c1cO =t(meۀoI͸izF:pG2.o?DmIBPxqѷ]4*dE?ht+pm2z Q%1}ϸ+n )u5Ⱦv[WTpa|˧{>+^P>sPB: ph"aDG/d1c1AѣaT$իR vVE}."#"p9-'">uѺœҹmQж+.1ֻ1c1coѣ8/j>r|di!&T" q ]P~/tP@M䮨YrA%5:FT /C,FJ $\e`=6uRcJ4ͭLL:QB+["uA oW8 ڹk^;ZU1N^m!cQH+"8XR} KQ ɸeدz Dr{ƨI 'O?4[t%B!ʧ<"lfErpQ)`L=¸O|KDuñm~&nfC}>lS=6˷<^5{Lz^!K:(w Hpvuώi"@ Oe A@cD{?wՐ8Bd1c1{섐 [bBBpUN A"<$xtt3PgC'c~d1c1cLpF]6 ]qґb@{G|.mh7?ZC_3~_ 8Եӡ\8JM{b ½Qj :ןkp'(3ao+,5r7Æb˵.b;띛 EeXq(N@!> k]FqQ{?\XQ@ӛ\6⟓{#ƫ!bd8=ׁTg~E~)x|BЩK; P goE^ jn-\jyթ8> Rwq)SIwbȿr4KaX0jW@ 5֟]Jh q p MOǰ$^oBo5?${3킭 ةn59x'2_{Cw{|~ oJ^ƾ5K,~v g3Py@na$ =0/wΉ`,],3|c1c1m: i2#A?\|2j~;v촙K۶ml zƴ)g..+į1a17 1c1c%Nu| cB\u"!OAKws#1(bႍ H}аY,\2ZW7#|727^>c1AUo#t=~!+Y]s,&uoY%mn{$,<]TDbh hU(P9CТrqd{Ң(ty/\C"T&@].WqmtnP!pI=6si(ɹkwb;,"(0VV$;Jyr46PL]N,KJP'@^u-]S2rK-(_Kd|)w|9u (xGE]maQ HHΡL(P5E[ϙuH>lPW@S\B+j(b܉XuUod[^rZ:Bpyۼ' n!c1c1أZjB)^_~ ;ےkĥK 2u<֯Nk3FtB@GtCLwB&0_:~Z y3p@c1cDA D#^#ـpE xZHׁKwf[24m ;esWh^i3c MbugvQ"hx`.mK =;BNYs}c_E ]h8cbl6hA9%Mª:4_Cgә}(,ϧb5=d2 fѫQ}T/ ԈT(/AĻ&$c3iXbAsX>͇૙FB2WWd;-FYr׽>rMp"8  J'%||\@:1FsB<ໃJ@&u\˳Z6tSmb#ۋB*tqL^LfN5[ M99M?S7 oFRbV_\c!,,. x"4BL:n[1c1cQB2hZ5;AtZ~9Vt6 5%*FHeв&AĖ--^ AmL301c1c=($Ud S88+q$7Z%2 ^(Ğ/Savy x!$i@B(vɆdۏ3PMPRP: 1`ΏXv%7An}ԑZ Z.Q(N}#]f -?$ad쨧k7N/olj 1u)BAUTlI˹qOm% n+sjKmt1مtnxq F!EVKHh M}mYa;e ^hD; _;w={sq]!TKYCzp]Y@{q5&|GNŒùKuGc1c1V4 Z޽l+VQؖc%?&Zg)?V*O_]u A_eix@c1cHN>Nj61p*;J JޟYzԪ7^ i bhD\.]JQ$C$=JJ\Jc%ڎ:L R_?Ґ#@@D]F> Lz@ 6F~ӣXGYG"]S:\QAHkxY Jup ]~!ʌDWvU#}rOiJP$I{׫QXN OO4j(hS&ޘ6>r iPI.@.LK A@HnYh+ןrd/`X@8opj {/qE +AIz.G;rqylФ$ވ'|evo { NXGcګ+e#X5aK(,B'.&M\.jJO1c1cD"Je1<<܌Sk6yJ$PC$6KGİZ~UZse;]ƌr0YS܏5ȽkI~1c1c1Rx|?4FrXW 9S:N(p$sGZnGǾ+ <̽P4IWf#6γ T|wrDvQ!޷㪦&'|;khRwvl6InM!L_[d_(&Գ.yTß` ξRڎtC,\FV$"g _C&!%\M{[ i~C}Q>.%Ñ.Kh 8p2+s SmOSWʗ218Xu1Ec1c1! puu1vvh[΁TVÞV1Lb-j"L~ks16 *DkΜFi=2"c1c1{$b;hѡ.2Bξ?qjcxm[]Ml'"&~z^/ǦCm1Y<}:kps@s5V~o^AMw9tEBEHuwq66 '#G$C~s; ]>* *կ!(j'xth{k {"M;-0Oi*(ϟ9e bzp jAFJ:2-z6/_ B:+?9dCخLwLT'hV̤=\>;R|YCHreym/voޑx9/C&v<}0c1c=zr)22n~ D00t̼ ']-ײeͼl=p&=p/qɄ(Iz ;rsqy@c1cnjSwRۗ*IǞgPb,}!9j֔ wp@ ݍX!c^ Bdρx~vCjdU¹v-Ewpz,_st?tV{w@|-Jhp9["D[q`::Vl[prs+hOxUȹygHbجwI}G@½V= ql<,..MC\gB+q7e Np Oi1\K uA\p&je<2STڙK.%pr-)j7MŴ?T\ $?ڈmdkP wo&!R0<X5@R/i<2e.pi=|h oMݫ1ߖ1=0up+_.v|5RwoZ_?_WcUic1c12jhpM(ͩz˒J~/ dƴ## ʯH㧻z @_Yu9PUw(*+(Suud1c1cO6i8~6ZƺOf` أz-ᒱ N[kz<얇N(ιld0>>0߿ac1c1PTWom7I$tA"1}A,Rbpbv+6vە&b~ 7c1c19>r$A@P:d??n}#qx#Bgo/ 8q;e1c1{tI]b||jg70L \΅+:=] ^, u4LY|/?X犍np`6+0c1c1{* ƩFpD@ީ? ?w. /tټ e1c1{I2x#??􄛫 r@B,FAa!$^CTR*ʥN*ԖvIqK\Q,u:)c1c1c1c1c=QtZ-4:nrT ' RO&|1c1c1c1c1ƞ02 {#=x c1c1c1c1c#2c1c1c1c1c!;2c1c1c1c1c1c1c1c1c1{ ǎ#Q;˃R?VU':qcՉN\XuǪ?VU':qcՉN\Xu˃LEԭ[caO5jpcՆN\XuǪ?VU':qcՉN\XuǪ?VU'Iuc1c1c1c1c1c1c1c1c1c;2c1c1c1c1c!c1c1c1c1c= c1c1c1ƞ:HHH@hhh䗓WI~:TwO\[ݺu{U='[o3fTw1c 'OD`` |}}q 2!"4o  ~~~o 8 cO7BPׯ_ XvikiiiG``C:x]hlɒ%P(VP~~>ZlPbs`7͛u7o|>]N>P( 4lذBݻsP(/>H*>||]a1{(=ʕ+P(zFgΜ]|j5cg}2ۼp(*ɯf͚8r m?~|쯺X!<ռqQ~9{-[`֭(BƪZFV; c0/$w IDATD2~)fΜ3gB;c̘1U{zm֭AV?}t֭^,X8&N5k`Μ9PTU.{߭!V VPbS6lFc7>'Nرc "aÇF˫жaaax1d 2 dO{׫40F?]_ٳ'oޗEFF"-- zo=7;99a˖-vq8~8;M .ҥK;f7|S!-{@tt*hKcutqq /PZn}o߾U.]Tw' }d29oFD"f͚VתU h񸹹9Nnݺ8F  o[N=&L @tidzUAcU˱~?]_y QFj׮HII &M8$$$૯2Y- 8͚5CDDڴicj׮]Ahh(222[o!&&;v-[[޽} G KSNEtt4"##޿J$&&b޼y 믿n7(**رcѴiS4mcǎ5la޼y8 /vڡUVB@\\IϚ5 )))hܸ17oɓ'5I0`W^ɓѸqc_2{gcȐ!sqJѸqc$&&bΜ9fYl3h ?}4bccMڛMNN ł 7X7>Xƍ߿?"##1l0#00GFdd$VXa^Ra„ hԨ0m4cРAv;co߾};fϞ]ő1Vݱo߾1{(:2nҥ ѭ[79r,VŬYУG"22zٳgMҽ;&S(m޼}Edd$w1ihAѣx{6mq:u  1.5j a̙38p ѰaCՋ^Gll,0p@DFF⫯˜1c8]d'OGdd$zT4D۷GXXuÇ[!))){N'=h ( DEEU8N:!,, ;wQ2t$)?JTbԨQhݺ5ѢE Z,݈#Sk4Fvb  3W~u֡C E.]pB( 4jzu:d/]NNBBBM6SN Anp9{a{ԟ8W^yHHHȑ#1x`̟?ߘ&>>޸ԩSe>YfRDTT{nkGNp2rJ<3 C׮]qAtt邰0o?4* AAAO?d4nӦM3 xe2%bӦM-Ɵa>"z\\ 4h/j*h1cFF3L%ϯp>mO ܹ;v0ovqqAԩS(ԩSP*x7еkWlڴ ӧOI>YYYXh cǎ!%%GFzz: ==v횱}n&u?FZZ:3f௿͛n:8pJ?NEEEؽ{7vލBL6؆ 407_|RSSqi,X30f\t ?;x<ŋCRaĉo1|L2֭3yQN޽Gtt4{=ӧضmΜ9c^{YhGEEɓ(**P|eoZZϟxJ%:~ [nݻw'4i'OBT⭷믿-[`8CNHH cӦM۷sNl۶ ׮]J¢Ew$>{z{3$w}۴iӌoNɈ7i3{饗P(gΧh`,[ HJJ¶mLz̙3Ǽy0cLq4{q1{Beff%(ѣGi̘1ԢE իW-/ b ٳ'Đ?oM7o޴MQQM<ڴiCԦM1c9Ǝk… $($"өS{233R(,,DQ=zХK^pJIIEN3NTҜ9sk׮zHcǎm۶>H>i43Y׶m[v͚53Y׫W/%Kq]v`_iҤI믿ԩS)<瞣;Қ5k(''ǘpm 3fNǏ'???ڸqc-=4h4~zuxѣGA4l0ھ};ݻƏO m`3KDQٳgӷ~K(RϞ=СC4eJJJ2=pє)S˔N'___Z~1ݼy(11֮]K.\+WRTTPTTDYYY$"]rbiii&۪T*:rɲǕ+WHEJJJ 6iɒ%Fn|)'QJJ H%%%駟?OԶm[9r$]~n(RJJuN`E5jd\jI&VZY>--~mj߾=Sf7ޠM6\{٣ZszKK.Cѕ+W諯"???***2IVnݺСCiÆ ?PjjIZueΝ@ӧOt4֭Z|9>}-[F$ɾݯ!Gӝ:uDQg}VZE^{vZuͥ{4iB1114`JKK@~͘Ν;畠 ""ڻw/Ӈ"""I&4{lz=ԫW/p֭͝;jY԰aCj޼9Lڵ+H 4?͆U?{߿gΜaÆQ֭)((ZlIGM6QTT9rĘR*Z*7=z233f8j޼9M>ON)))axU nݺرciѢE4sLJHHnݺW*Ԯ];иq{ݻmSرcIEׯda +WO?5vrVZѫJ$"-]l>Dg~hܸqk[z5hтDQ#FVZE.H/"YƸnʕC(ҀhӦM&qϜ9)..~**X-Zodْ%K^״Z-SNNݺuDQ۷oEڴiC׮](yfjժSkۢELϝ;jkm+=z= 9:vhe\bl1?~!{4|pGmtA{1Ib ־ 9zm6-Z:wsdtܹ3Q=wޡ{DQ$m5ٳ)22|4uT눈>R(HoM6Fe7䇐ǀWUvv65)((Xg-] fL(Ҙ1c(>>Ξ=k1MǎM~%*R]ud^MggO{z{Wĉ4m4:umܹC3g4ҫjx#66éK.$" }fRWwOGIH7RSS7GG+ˑFC~]g!}f?)Jݻ7H_}gUzԻwo:wǭ^,}-Ey:nppg됣=]f̘A& ԣG϶@Zf7,X@(ҧ~ju„ NOTZ dm6-V=տbx>%%%х L>bE-q{=z_C:XݼylyNNӉh׮]dr|9Q̙3ƿ kd,տQ!!!ZhQ4A~O(ODDGW_}HP/jՊ֭[g(iq􄌌 [RFFndl/CJyyyGC 1Io/1cЈ#iĈ4fY~L*z=]͛GڵK.Qy4l08l)SА!C8ˈ#}]z7tUz7L꯵}4nܘ,YByyy4k,uR|>k~Ĉ;o-.K|@t̤A^|Ώ*`E1222`ׯ'ZM&a9r}[t;RAAA&zJe8sU:RO"[׿Ke_pvkXUMϏ7nL;w4.sN+V0ٮ2R*[ Ѿ9ѓI[1ƿ1vXl۶ :oM=}vhҤ ?pm6m˜1cdW^1cwnu?}UVC+f𹸸?DRZU7o\x,m`` z ///(..6֏ۼ E+WJ2.W*Xd :vP!!!رc>l\hg! }gV5[ڵkXjΞ=gbʕ6vc8q"ykʲNR)zXzK!C`׮]&RSSsJU/Ft۷d[nU:?G}!|G8#?~<7nl,%%ƍC~~>3gիg3f^ŪFEWvѣ777x{{WI _~%[Ğ={#--dӧ+?GC|z8lقYq >#_н{w3_^^^ڵ+.^h/!!j¦M*`СBhٲ%f BBBϞNNN 5cMe+̞l/=,BaV1tP,^yyy9s&hqZƳqwwG͚5իW7ڻwo\p3g}a|HKK͛7q) >cƌ1oiЯ_?\z,cܹ?>u X,gix{{J3L؎TyL0^^^ر#nݺA&K.O>&L@ƍ1a 44 6رc Ftt4Əo;//IIIPzիٳgcرHHH_|ڵk 駟믿FDD Pr&L:u* )) :uBbbz[ 777$''e˖pssl5cŊ5j`…G&M0o<|Wz-GTT}Y8pzd`֭Cڵ{}ԪU )))HHHҥKK/4ir9}Y޽;d2^ykgr~bbb܉'b̙hժt:r9x +~,X?8йsg$%%AVcJ}zd[{s믿 4ȸQn]<3ԩYg[o/'^zP*QfMdggrߓ"[&Qq%W\TGT/3WvwYo\YfUkl2w\t:| IDAThݺq hݺ^VZ&U_ߩKQF<~r7o޴ڳK.4im۶N}˖-[Fh:4+{tYzhܹ&Νkvm 3:F@7R!Z={R׮]ͦ1\XvKXbI3{fj:qb,տBE8”(t Q Xh…te:<L7e8@3I^PVVeee(NCeV4 EDDG}D.\TjӦ h"a+..VXa1$$d*Zm1o9_EI{#o W 8C/::~YV^iӆБ#GhՔL(޽{M ȑ#$QAT:-(ApƍN'T*c˗SLL I7oƍUGutiQt N-V=oh m۶NOd^ӑ{Pp82#oT{2̕=Zߔ/G[l1˳bbbwl6aEe>k׿?bcciɒ%to(::DQ41oX^z֮];:,Iq;s&M?y]}7 +G?Q-[L<ȸ~wh'?/~zgtQG _w |߿з;CcCW}>>qsH*}~߫طeF޽[s>X;Sn?q]tEZ`n]}Zbկx^y.X@RoÆ [U}QuYxk;w .駟>/X{QOO6oެ6]q xCm۶3ϔ$s1/?Oe˖i׮]ַ59dz]yk?۞9?GSSM6iΜ94i@̓?:/~Q;vq[nEw?|=Ї>C9D\s[MMMZt>Ϗ5 _yyԧ>5?\֭ӹ+tŋlܸQ~&OSJvޭzJ'x:]ve&q4i~x -_\'O%\}cJ}W^y}s?g秝v$i޼y~ !SwܡJk׮9眣 6he(ڳgvڥ/| 7o^YGu? L7`ݷr)zg$m֬YZn\{yԹ瞫oYo /Pwy@_٩_2e.rKKuC~Sxf<5Ww.MȮ]F}:m>/WXQKF,G}tc/r#Ȱ+xŭ[{~}gΜYQkGgpM_r%lo#M3MaÆbss~i|+]w5C<{կ,YR7o^}{_mq\.77MqŊŶ%KNj[l)uYU/b#]j_W=S9sfu:_2塇*nذR3gN/qŹs;;;;mmm~ցwO~⩧Z;wn/[8wbkkkqÆ _/ G}t3,|_|7.pl׿>obssskϻ:::8믿^3g~,F΋dH?iպ a]uUŋ/xw^{x5w޽{T>vx;wR\~}qkmm-_~._&Zٶm[17nX![\dvW6?ƅO=裋'xjk_Zqܹc9ϧA7sǁ\j}V^8A<9s۰oÆ =PGH[nݰn޽ō7_a??޹R99a7{%I_~w߭3fH:( ϝ~+ty穩IO?xhɺtglꪫt=hٲe:5sL=뮻tAoާ\<>;Goc՟ɟ0ŚRf̙37Ĩ6"?V^ 6Mc~;N{ꡇұ*$A.l]z}~>w\~~4IF9Ο~G}~?v駏{644'{K 'co-׾6@]s5jnn)"{G^{u饗?g=;tK٣/rw}>ѬY>w^G?-ܢݻwo?ڀٳGO>?>}z$'> viz߯.L;.%~ l799s??>;iʔ)z'tj:_^׫Y/@O|}_vl6g}Vo6FݻW֭]wݥ38CK.HR_=+YoF]vemcH͔[nա*}vܩݻwoŋVA|к 8d%H*t%L?Ho+ǫzJvիҢƲ&\dŊZn>[o3? lN3u#VZ|W_OW9xRܸq IwܡoY?яozHҏc]yڻwn|71ۿɓbԧ>K.D^xhΝSN]wݥ~zyfr9՟w??{ݫ_tM7)86~ /?QuAiժUz%¸Ң=+WOT}}~iWҩӧk˖-G? .@˖-~:o|Co񆮿1W'?[vRww7Dڵkn喁؆uuuiΜ99s~=PtM {U ^ϙ3g{tw3~q/~^ڵk>O.ܹsd_ntI:SҢm۶顇3<:haÆ z߯۷E˖-iNf{g>|#ڻw͛o]]t~_o}Kg~я~t }{N[Vw߭nI{̙3tR]Ғ%K&7nԟٟI*r.r=#?sIROOr!Mw-[7xC={9|z[*Iz]h;kVg*}8,X@˗/N\p>聯[zn?Am\uuujoo׿y<_[y.W{x-]t`v뿔d4}tm߾}UȜaɒ%?뮻N:cҢg}V?Ţ.Bz#KH&2:h˖-M}@-o_7xCب窫qm۶IL:%ޱ}7kƍ6m.\+Vs'?Ivmn]y|ϧzJ\pZZZtwh3K:5o<}6 ?, {Lsvޭ)SGjݺuzҢEZ[[ b$mmm=$z'N[O<>oWȜc߆ ^6l͛5sL}N8QgM;Rn&:ٺu+뮻N_ooxKC\,?X*7v>O#gl\`%K,?Xe-[6 T1lݺu#ϖ-[۫N;,`nzO_s)/2˿~H}Q꫚4i6Dl۶Mo~Zv>OuibW<$矗$]K4k,Ґ2̥`"ʰj*Wcw|I]xᅣ ZZZt[ ݫ/~z-\@Ts)2<%9[G08غP>H HI|ǎz /Pm۶~[lyqmgg|WkkkEkp^m[ee֊~7?3<]?U+!6J۱_xaL6o~n_y|?\Ekpю;GK>۶UzeKe'7os|Q*ZF|ckg?wʟNQ 5 )RF_ ?ٲ3e.:G%gcǎza+TyΖ?Tx%3jm8P;vЋ;_T ?y/"?Qk/jzq׺^ *-ώk;OꐟY-E sRߊ2%}@J_*2%oN*`ΝT ?\F?ݹdF΢8Pe˖3L_ntQCW{{u9xvQݷ|喇eXߢc˙x6tQt::p_Rw&;h::ޮV{r&>ݽ{']ѱHLyzuL1:Ny~,D\꾕MD,RDz oQݷj.ZL˖i[ޢc?&oTmt:.%/Rw֘|喇8~}L_NhBu}}e"M|喇ǫ㸓4X3![uNDԱC󏚯qսtQdu,ZVͧWR5&;|^iQG}>DKKL7xׄWRi0 C yQuC nqjaq}?@ nq}@T?P}C HP C O@ =.; C- =.;id U7~&@ nqtQuC 7 dܿoNPuCk76n 1vtthҥ< D c.=ѱ&v-]z<Àvt,ҥQum8CKرCKO$v,['رt)CM EZz|a@Tp;޾XK?a@Tp;;IKv"Àv,RPumXLK '?Tp:-B| fYo0 C ' fgX༡ðM"'k%n #%8́^EBa N%8́Ey, 8.8;PE' &n qֆn TXȉZɟ#t'X gRa<' k_Up.tl믵oYG0X' o/ B8.럽KÀ6-rl@am`  gRa޼XZiϞu7JnT\Q\+i} no?ִ6_iAI_qV\/=.}imH &Ik${\p{|zۏ@u~s\0C]+]+~,:.z$=IIܾջ~~${\pz7TSi7${\p[1i׻w} nO#iӏ5JMM5k${\k|TEĈn.'퀒յ‰l7t;$uu]@P { $kaov@I꺰ˉ퀰7t;$urb; (I]+V8 n . G}˝{ =9NlG%I]gv@|\pw9O$u-_v@|\k?/wb; " b\,@4F\v??(SN'Q}YseS}?f+Q}m#FX+1>?u7'I8ȏkFQY|`h/F{n|~|~z|4NfJ'ȟq% cp =c*^Akn8chh%C?n̿k;4%cq|5q}6mܟ'Q@y쯙5Jc'p1Q^ܛ{Vҳ*oT;~,rSfIR0mEF?F3I?SQݣި8. *?uDlwȏ\b0qi"5ڍN {Fn+78vS!8"Dl >p a>@hFFFmCppعNCSఋOy nA a<y nA a]4@hHB_*cMX"N jM EY=oqUEx*/s4<ڢκ:QW!%I\.Q5Qk:e#6䯌 ZHG8Ƴ0ߌR3oD)yne-GIs? Jɿu3GʇUMJތ SF:Bz+A4T[2˸_lDJI;|8uDcm쨣\ W?T@0!D0L;БLa. tlD2qKa30 d)N H/r6- pijK([.*O.W @\γ.KO.#hʳݺqU/w\ȹ8 o\<ߝqsq%E//}rf]B99ns ~/F*?H @-=&(ZP?ݺL@6wdJO|'U d8KOt$NOG_2e#)F)5$Q6%}7@vR:6^( ~#oe_ev1פGc u pX4XA: LR!4? a'F ;A: R2d 4պ8,/~T1@1@1o]߯.}@n` v|!v)e~!%a>GÐ/_9R% ʖdK2@Lfu p dd!KCI< 0/dD;\`3d ,?Xd<0K%K2dF0K%6lW @s /[>;0[>;зY>Nj]y Glx.ƅ›`"G\x+0/qṸpN a%/wo\x.n0.d DY(.&( Kâκ8?XZ DMv&_؉_؉XWE.nClDf؉D ;a,U: ,aZ!a' 3%aa pKa30 2CavBa( j. E ;a,U:iډK<\z@wF'K;=I? ;<=$ɓː?ɥh%O.EgɓK ׿եKKYP1/yrJQK' IKJ $$(K6.fY ;:0n`);N#H"MHɦ`$OVUu pW?XtDY .N )\=Afu>j]$9{u h8_,_m{޺H \ܲúH 4պB G߭qw+8pGb3Ⱥ8,YEI%aQк8,%a-#-$_؉?`'Z؉[Ey_؉'[Ey!n3Do]%a {v; ~=/ C~!%a awu b,U: ,Lƺ8,4?Xd=,e<;z;`RP# a(#_ɈvR yu p<ށ ;;a?X@xl`!o*/x+<6ìK<Ž@KΟ`%aa8׺8, ۬Kpu pXβ. p./mΦpvu pXvY΢p?"9(.&( Kâκ8?XZ DMv&_؉_؉XWElH%aa'/pj@a) y ;a. Ca?X , 32Ca_`'Tu pX(_ E ;\`ciۭ Ӟ.N{ƺlup, 0yC_.yɺ.0DR@[..x:ru pX.4,'ː?ɱ r/C:NNӬKra,U# @lKl6k]Br3K8e{:Kt0Nlu Ͱ.?f$EvzI"1IM6_3GRdS0w_";)}sf0Nn͠MRΠHK HՏ%I5g>8,K }`AHn`)@  L }C)Drj]vW?XF ĸo]v|޺8Y;@l!v.Cag qj@[&.dx ;2n`)@ԓ?0C2 2 Ca(#_ɈvR5g>fKò%aíKò8,;v,eg=/ xl@ ;\`)s .Nj]up& h?`0e~o]\/,mz޺l@" <0c4xG0q pK4;^=#XațJ ;d 2#aa%aa`K$(Kâɺ8,(.V;Qvv)e`(Ru pX$_؉D ;\`Z3 xaZPA[qt^'_2aƺ  %`RzGas:/ / ”Nd3)}$S:/º>ɐ$`]BUy_6RNy$A:~/)?@$C..ɐy%a@n`)w8\N.XHG ;"ru<YD ;9W?XV ĸdYlwl6G t;YN l0D`)@Nb dCYNV%a\`Zc2}ߺC%TO/_Z]4XPժՁA:߁2zW @rٷju`t)?Ձt~ Қ2!o9{J0-oc L_^~z`TAJ72^w^!U%TXF˯@)˹Z c'@+V@ĸ|?A2~u pt?X=;~? ~=/S+CKnD2? \`Zc)2@L&G Ga'SO`' ?X7ʤ`$C@ʈv2~T1@Y.<ϳ.*_2x^:BL&t%CJoxMoZ:H'tKojJt^ƛl]AudX ѺìK 6'tNdRdHKj-11EQd]EM%aQXEQu p@؉DMM.R-v"W?XfĘ0.!&^.Iag! Y_Ӻ'!%; p}^.Ma3ퟑ0 W g"]BK^~ٺ'u<$m]B5XE+IAa!$i@ \?S..x ;g]tr@eG ;9a(Wiu pXN/pj@|ݥ0D`%xK,?X%5?!D`k6@_6.fIKlu pNa'?2$C CI ;Ya'F0~T11A`]LNvа,;AwiP0vC0hu pX _ D ;\`cbc}ߺ8y~u pv%#7?C~=/ C~!%a>a/l!~Tb0"0L&c]BUE20L&$0ou E&#h(o]F?EgYKwe/2ioeR>Dg_;GeRh!_,#%`Fy8(od0R?,W?w_,@yb1u y%TUWj a6ί$gZR-lgKLxSSgÂ7ٺ g wn! an/RB0,OYPUqw8ߗ?,x)g@ fb1rJక+WX?XZ\క+ϴ.[nYC`iy\w^`]L_Yy&<vȟb1ɤ䊢Ⱥ#EM%T( KL&qI(._|9poE ND ;Q@HW / |$eF0HxU$_[__U;f^:&nmc֦)ȸŅ1GQsAKMk-hp+Z0͡wNZ y5_j-php1Ǎ/M!hu 51_^~k.C1ck-C1c۹֚;W?G_988888888888888ȟ{b5(q 0lq +,?X`X`X`X`XVX"111111D|>o]}ߺZA|ߝ߯.60;t|~u ı?叢s+/NG'CGK/nz߶9%`uoKuXPS9ƉC'Ŋ3Ǻ ՏML&c]qõ?oe2n=&^<0H&3ɺ" wKƱ,/寑#N2nMIfc_F0HƱ@ȭ/9p+] _T;`]&_6 lp pJpYZ)/׼?,e>X3m*;#%i1YബGKc-ex{ K0Kn_ȟZ/l+Lq h. p p4rc11v_Ls`K`cl+TLq @l*/ǰrG"88,q 0,q 0,q 0,q 0,q +,?X`X`X`X`X`XVX"8q pmEQ$I Pmmmڊ&IRjk;¸{䯶4w0V$f\=?Z-G9ڎ Z[QS_j;VԷ9d6ck+;7"RZԷ/?Z\kQ߱ԦÍ1U6r pmEMZ[}P'Wk_.%(RrfK'LA dyq pwvZhQԤ0 e͖ e2z DL Ìr9oP ?NI۬I(SNR.Wl4ud&b;VswwպD`_.')$ߗ2ۿ}su5F ;<d7 p)Rerz}k7gՓVi'<QS P.Q6hhРL}zߡ6w P(yoo4M﬑^8є`_n\X0YH:ɛl[_}m[hѤI &)W7II}_&M_w2&s_.'"5*TrJ́Te4UxPw)TrʪU _2PwEJq "5)T2 :jeT/OCڽf TI}W1or☿Dt<<[[1W9:[ VI UR)Y[ 9I UR;ˈ[ R쫜1kˈ[o}`b8xtZ`_p o+ UL]w$r}/}SX8O2bk־BC3W9 ;o]Fl W84D`_+׭ˈ[ }[쫜¼F1xk_A}/}SNF1xk_A%1WIy5kˈ[ZV ]([`b`[sK01x}vߛ}lϻ {`[sK01x}vG9 ck\G7h}vs? ώ4>;9%<>;6G ckG_ N~>q`[̱.8mMs Ko=e2*}ɑ/)ҙ?%E&"%G:W}_%F*־Hgڗ[#Ә"%G& [#5ZPqlK?%F:־H_ߏIܚ^+>l?a [0揭}C5fkRcڇT`a,<}Ku>}?5 #!锘E~}lCJ{g`FQ~}lCJ;CݻuQ7>>5ckU:x`[P.u?^f7>\S/657>\gѢ7i~}lCO=?.R~}lCJ+H~}lCJ{Ufڇry 7CV5 "锘#%GѢE$/ Uyd-ڗ&-Zt$AE־4H^vjѢZ %_#Z}m|Do_ڗxF-}/[/q۴Iڗx߳;}[/qۺUv"}i|R~"}i=E }/[/y5lKo5}ckZr?Xںukw!IlK]w%IlK}鐼Qڗ_Gn!q{`k_*$.־TH^_BJ_־TH\^/־tH\}}}鐼 J寯ek_*$/%\ҁ֭[sl1K ,1K ,1K ,<.z[`ð"˰Y *iVV_m}1mQo+wKKr˵lqI3 0s`f 9s^ǣ1s8={>| @$~ t @B @P@(P (  @(//ǩW^BH? "!@$ DBH? "!@$?N]E*իW/B(? "!@$ DBH? "!@$ R^C$  AH? "!@$ DBH? "!@$@B @.K.|EERttSߞ|  (,,6Nqqq~]|wv:~hRSS)&&?uy0bׇٳb}?~|'G,j?Ob(k@I>M;vj=}Yf>^XXHVGm6;@ŋSPPÊ q) 9 "Z~=QPPiZ:vX'D>|;}駟hKqqq; \5FC;v]4dȐNܙoNZy•܅#gwCN\?9\V____, pqe~Y8u_iM_%$p]J1.pɒ%pBZfє]~њ5kl*FE+ܹYs}g`f?̤O?֮]KSLU-: u{@ 3WҞ={lϞ*\i^@-=TRRb8Gr}W?N"@0DDoS.嬿Rש_'f8;M`AAEFFR~~>SO=EǏ'NG/i^{ c^Tz͞6mK/DIIIަkjjG$"##iԩf۽⋔Doy ""2}(,,o˖-#GR\\ 6yjjj$":uٷ͛G 8ϳ>KٔL_|1͙3炪rY׮]IѸ.T^dmץK @'Gl>SͥCRLL ^7=o}9~8]tEQll, >6n(+o(::N8AG G555oy9+--SN=C pӧ谬Z%jiÆ >#"-ӿ/_vv67LDD/ш#d~<Ϗ~''Gj.]mWj"ș3Y?ۚ?wy:x0:#@+Gch' /sL>~Μ9L?igwMB7|3:u|MM ͞=)==^y6y4?ŔH:Nv|oV3w)11ȑ#tuQ\\r-DDD :hȑPtt4tM6ODTUUE3gΤ Ƞ3gY߇gVVGI|}}iJh ZDr[,3(--h)((ƍgzμJJJ5I~o%I ]8..m[{Gxƌ|Y.//[ov$9sĉ[oqzzzXYxƌ\ZZgΜn_yʲߖ_MMMw^_N׿Ǐ禦&>}4{ʙ>k׮1cptti??khS+h$IpB_~eNKKc^ϯ*rtt494f[9"".]z322xƍvJe۳gO8MeLL mW\\ӧOg^qqq}Ns5k[k&7>Kl?[ȑ#cfZNOOcǎYWwmaj=j IDAT\cc#'$$Vӧsll,KA899WXa;rS?9JKK922###⼼޹s8::tz_q!7pGI_c0>V򯩩X4mg< 6u:O4K ⤤$nllr5fF{k.mU\?{̒$qpp0۷tNzY~֒~ʮRm'u~O0>[_>r+V0+o~'kkk^kٳ7syy9r-4hgkYگ=z4[9{af qxΝ\]]ͻvqƵY>srMM }xŊ|- 9E$Ӝ+> q\SS555|>X{SSS5+V˞c@f C$z'3IIIf}vߠf6$=t8qdu-k= sСv䎜Ĵ;p8"" fv<8ql_N'P2KW__ϕxee%?l7xݶ74Β$qu… ?`fC\tt4g\RR›7o椤$^xi?Æ yӧ׬Y_|1kZ6uuuv_˓w}TdWTT999m1G,gcSLᢢ"~X׷)$tW򯱱/"9s&߿?3k3H_8$$o޼y3oٲgϞAAAi&vG#G>_~%oذLf~CBB;˗c=,I^m۶%I{wsϟ?of>~]ٮԯt:7oq833S59HVl2>w_lӚ,?^hl+{^ff~XUUU|^xT7e޶mϝ;Gq~3M|Gm6kxܸqVjcQg%Kx۶m|A~988,Wz- ֭[X$¾o855x ;:y/w^]YlyDz1[a| 򯶶tr,i<7;eO{̅sN~Mƿ=Ǖۮ1>`fٳgSW^̓63c^O.K'7_伿P^t?#""ȑ#fǕۿd-_0,Ϲv-! /u%I>rod-kY妟/tagKYگko3l0>tcjw|d礤$/ɗsrrX~>JLz\כ=hZ79:? 111<}tu;3fdNII3fƏ `tY9--xggV6l0m[^^γf#Fpdd$1g͚es7!!FbbX/\njjↆ6lٸ?0b`[{,!!o koٸ?~'-ìe'I7ϟ?o]VVZcI{ `cc#oxaa߰lWTTѦoa3s^^D dv&Ln8771 >h}mZD13/ZGxz̞᎜UДϟM6qBBy[ȑ#g\]]0;~GoOl埥A`SS'&&%%%9$II>zh~뭷{yȐ!SRRxѢE|A.++F>sL4,5k֘~޺uk1xO<ɒ$Y]Yʿ%I'O۶mGDDm&O3fhSvwr^^^644eee61M< ÇÇ}}ruHÇlA,埭Y^?snnnvVj8rԿ/ߡC8::KJJxСQ(g;suuu,IرwevQOq x̖cݻwsHHVƃ|=pJJ GDDpvvv훚866ׯ_o{弼6m$VIII!w/u>g^]ٺgOǬ͟Z|m,}7f/ZH1Z?fO֒v<%%_}Uqӧی>'}gΜ#F0/z6\f7#9WvMOY^;ʅͿc3hXzzz"͊:20.`?[/Kq1Vn}7#G/E]dz*={?c|@{Ο?ϟ9Kqqqųfロ8??lÇs\\2̙8''%ǐKƻd=|/!Ǐɓ'{m6-[ܹs̙3oVڵkӶm[niӦwPPRcc#:tΝk^KϧQYY-^nV_9uUTTPrrIIImj^*:}]#"?Iכ=f={)((쿥KZSZx汷A{Ց9}뮻GZѣUVVwm/ǎRhh(`oh.}k3緻}#.wҒ;^6>}j`Q=Joѫf8eFD諯"//6{nCuu}Y{{Bl͟ق4(Kɓ'qiZp!}wf+zcqtڼy3g#WV={ʂ_>,΄ 詧*jhh5kwaz~ԨQt=Б#Gt}G`` }GTQQAJb;vPuu5mܸx /;3,[TTTdv-#^O7nٳg̙3iݺumG{b "zWK.i&7o͞=6nHDd<YfV"ziԩRQQiZzG;ǍGͣyرc/5^}Uz{.]w̿кbI2ٰܾW_̆˛ogNHH0.%>>yٲel(8&& 1VSkX$6m33x,I03sL~/U`^}f6mKSN5mqFxW_}ꫯP~933yСo޿4hP,X`wff&GEEqnn./ZCCCyҤIlX 7l8p -[lqTq"W6+rlXu5G}fÇO% OVmklmLN|+Wr繘mfvҥm~Oq L+y455qii)/^8\zr] >(O4{1뮻ݧ=0,9v-! /Ͽ㴗]w]/Ly̙911 xӦM}/lO8$$'N̆;\$''? 2~)'&&rRR?^{׭[YYYӦM??m74nmm-?䓜Ʊ˗/7kٰb<<WVVi;v,믦߷ 9̶%Ijs¸㋖'bYǰQڽ[ֶmnv֭[9"",}HIIi}f*yyy|׷yξV2^H,5sD~^{cccY${9yݺu?|l2NHHUVqII _ 0 9,,.\{7[ܹsc$Ϝ9gΜ1Oz=b2[δI2J}sll,?Co>.**Ç$If r_{x>)=~We)Mi\RRb=3믿noݬiy"kqFFoذ97ns}%I/nUUU|?>1l_ /E+_|_y6lڵ&LhSp稘lc<5._SSӦOpg򯪪{9ӄcIԩSn0aBuuuf]Nצx疃ɓ'y̶O:\(7>Y:& ;_wǏ}K'GH?Q˗ɑO=z͜-;wy8hcǎ$I"֌:8q9_:FMMM\__gϞs皪cA9]{9==ӦM㢢"SUo.\999Ç `&^t)6###yԨQ`vOV\ƍX朜3gݻ EQQQ,Iaaaf'OP B:t(GFFr^^Y옷v[I"uqff&GFF_}kZNHH0+t:ܙ3;`OJ_ ,ߵ^3iollŋsNNGFFrNNf6IOO7;Vo;qzz:yfOfk?̣F∈6l?|if6L?ᤤ$k)tT̶㘘$ǎW\qK111fݕ۷oKW]u\\\seNgVw^ iӦڵkyӦMOrRRgffxѼh"^lu]ɓ'P~gyǎ.sMny۶mm۶6rg;Ixզ 2G@ ;)Sxڵݧrϳ؟466rBBw8>>Z-\ZZQQQf䜏s\9۝>}L,|A eI8)) 0n^9c<}v1bGGGĉK/%I2gSS/[GK=sfy qPh,v ڻ=1dffW_}q]\m6؉u_.\II w)))@w"O>(ݛRRRhܹ":,ɓ'ȕ)SÇESz@ 3RBBٳ4pTR:u."!""OOOGyͶi޼yk.H0a߿x_h4d{'رΝK7pmذyڿ?=C7x#}M唒b9sЍ7hw|r$^OAWhJHHjUVQBB+B89r$;v***(88;޽"v=(;(0>pJȿCQVVߢC+--/VZE:קDB]˗?LDDGؠDn?|'MDLK,}}?A[n1.:~8-[tbz|ܹ믛M7DǏBӧi۪**(( IhVh:/ɓ@P>Wl@'NS=O?8+󯦦:DUUUxb駟~]MuGӏ?HRBRra|J?P>@t?~<ݻ(_g߹soAK,nݺ9xCH?R={6nH ;Y IDAT Dd({衇LP֭[G7t͚5 $*++iӦMt7ٳiԩK;w &Fҥ }GitmQPP?N4x`w޴rJz KJJhDD4e GLLk׮5 tI+ٳg]wuTVVF!!!4tPExׯ<==IӲeP&մyfRZlSPP\)K/M?gffҮ]0V暭9gzFOL=DDԥKzg/Lw֍f̘A;woz) \1@= DBH? "!@$=hРAe  +p)))O?%\<<.ztOOc+ݕCFSn_G<3>=Bt/rsr(>Qϼ =)!VI(wp.Ɠ>oG<3O 9M8rss ϼ=):bBj.f؁ODxJȱnB|"gP.D!7h_ 9MO9)~1w?rl?4rfR|\,%''Cgrl7qdS||%cC=jc+ݸDL8O?O/ZeuZJKHp(S$5lvZ};uᔖL((6ӎ* /$"C1.BGi)iҡ q|>~-uєVWիP CɥOwJ6\8t:JKL#]ʄ>sωP (-- :jŎʹbaoBj.£(-1tQXP&mCPŻiEn"2BB(eP""":LZm!(֊ ŴbC1uQ!2tXP&md{#hחE;ˢDd(ESJJaʢV~={"2tB:]2iVM+w%&.$RI?U h""2b")% =0qk6.50:JG))iV@p C!f: (Dz-#j^MV|(e۷mN!ꀠ}ODK ?ꀠ|,au@Pc!;OvQbN: (VXc3юD͋9ꀠ+w&prPL )ꀠ_ *AꀠBMꀠ+w&ڽhaV0b"rA9l\N?+iu@  )ZHd(,bV Eru@"CA` X:E  :t  &MAAh: ?cAh: `lVNru@"CA`AA?-W$2Bh: 0eX:E W)ZHd(̟<Bh: 0?VǂNru@"CA`ec: t NFD)W(Tַ 6qv4>(lEv|5(k}`~?tol\O?pַ 6v|PNvpv _8WW08]Wh|QNv gpַ 6 tַ 6? ol\Pol\PQ2;'#VN4Y[073/ŀtKٙ[07{8egAӵ:`nNeA:`\ʾ(ŀtK8koua}Q[0'=d\t3,desfҐ̋P N994dH&t1\?pV1dkouriH?<t!!2(Q  D%4aTh}""xx[??ゞe[O˟mjÿŋvܺz޿yzyY|Σn=l=VümQZj7h[78_HQsz멱޿w޿zѿ]L?[78_OQsF~Ziu3Ͽ?q""o+_~kz[]O}翧Y9eyh}y"mn#H\~[>m}|mգչ""zZou4{F~v`Kÿ랷kٞcG۷_ݭ\ "ѿGXo'h彘[xFu?6 ȕ_L cO@0`@~;_@cy5[l0uUvj\Rt[Ίy{Dzos}8nO}#7@رACT#:P^K/h! Xg@D*?Gu$KtbRE*6Stb7.xC E X@͢PDFT,W+:P`!ExFT,"{Ad X'@?!iG:tBG3ގ1t}@oᄁC;iݨ@OO!8 OyH!gSOy;>A X>#5 %:P@7+(O@Tg?!qX'@70(O@?6 }n qbF3MMUC" P `cI!UZpAt@D}E Dù!Q@j_;{: 0 zsi!|AseC"ںsC"\i%@WtBTch|;,krE*65K':PiC+R :P+.ؤIC8q@&bę(:P E*6~h@M":Pq8q0TtbcFN$EQ75hzLCנ5hzc |G[8O F+k?W+k%3ǷO!  JW@?f.hA^#5E 0 oo\q|  A  A dxF @[hȻc0P ] `+@X@^}E*x{q*A oy%3+H޸y{A};'|4ETL.P @ _>(_O8~nXEtb~}ݯCٻo;3YI2ɐH@ $J D ">VDą>Z\j+.(USW_Qk]WpAAȾ<_@fΝWۙ;wNf~8܀9AX,@ł_Kt`d^&ȱĠȱĄ_ |s aXP{aQ.9>C3q?cFTdR#l䘣##3c 2` 101)?chc2!@@ A)@ G1a Q)?'>INN ,9jh(XrRt``?9 ?HJNIJH ,) r0 rprp/Ԫ}t``m;6Jֶ!j y!Ck,XSSt``[1r7n q?A[C;ҸK:0#?!ޏp2 AQ)h h9Jtt``J,(8-A HA `2 I 8D*h rbtF4! A1cRC;"YM4~r㫥Cϑ 2/O:0C+++ 4  @PQ_*9Q!K)X!*_QM|<.,B͖$B@ceY(1IGqq!9Q0>PmΖ! jN! 0 ִ4ǿА%B@4p Qy$P3_ '7@N8SbXpX""CģJ7ȱ7! '9, LcA,cA |c1!ȱD r, ̽0r̨ ns^!͸r̿1*2)fʔ3C/>7&xa ++0ɕC/1ʳC/1}w0) 'H^"{C/LοK1g^=wvB S/<{T S.na!JLx/_)x{`m!L cf 0#C/ Lb͖iG(JxfMմ]GG(a^Жi# Q¼`?k?M۵78pG Xڮ[ DJPl*@ $(aοm DkCIP¼jLm y@[tM۵:H%+ڲjڮ >M0LM۵5 l VW٬kmm p$7lk=t8;JD_ִ]+'!V 9ZqWBlbd3y!M-H6nt``CT9 r&MBI1rkIV?V:0!ף!ȩ?S??S?FfY:`̘l _؇3-prjD8Yu|tӯxmyBO*C8ӫC8L:3zU?SfUQ_]" (~&FIpW~Itg ,?"R:OH!eK u1QnR0%N!(nt`P J( Ϳ*0EF: 0(EQh^<0E9sH( 0 CUhcRX}aA)BO (t H( ]7UxA(tӥRf]vt @ jjFJnlI!EM8fHDT]BQ9[:@՜*BPTW#Ț&BPTGQVdtA>ee$F`O2¿Q!=ÿ Q!ɺEPU#C7¿ QuutFz1CUG?=/N:?=JMtXƘ 58Z3Jn:5#S:p#5*Z:fBNLbXV5)1~ӧdšD L""GJ H pDDY!ZeeeHnEP?}J6!(CPsjpYӣS ( _t)9pW; $Ih $ 0HB`6 mA$Ih $ 0HB`6 mI7 ʊC$%YCSC$ x -JKC$OcT&"*-EMbBtASZӛHc$O 07$@:8NA*KI-*)$ QI &!J p7 IH6F@"M%TT{})H]Bq.+ʼ;R$`o>N h`EY;v)c\DDeޯڎ6)cTȿ Ev_o Ev:VxϿ EvqqY_Qۀ`mb7Z R$`g>@"8S-8[\qVTy}h";Kqn;x0H -|Z1H%>V:)/>Hb  0HB`6 mA$Ih $ 0HB`6 mA$Ih xtmA$Ih  m0A$@$Ih $ 0HB`6 mEw m 8-@l9!@f͖2N ""[M:cDDl\%$BPrzb1C*_=DkC@-ЉlV`YV ZrC.̊n-?=1%BPl'fn٬87OWjND?=1)l>zg6h6kSdzg6@c/c]!Ť,䟞"u=㟾 64zb?c2@X{3Y@!E1@?E1k`MzDDJT8` z\wEQ[/ JQbiaA)B &J( -`t`P  JQkRΓ JQ3gt`P 02Xf9F: 0(Eٗ)(t aA)Bpt`PucjRst`PЬnDw &O>W:8FQ `"uCcU$"<`&MQIu!1JttA7JoοzD; +RL?P Vvtpb DDA/>EPuCcVN:8F1 q %€qӋXX'bO/bvOIh$  $$a$ +HB$?@$@8tma̘D >i@CM~A6zQ_-ևD >TI map`D >I m4ʠh G6zQWm01J:h%!@`}ȏAC!@`}U=t;©X{{@$e%I jc {"1f ~ eDDU"1lstb_[C@$e5J MDb\ִ4TwͿWVdtb"1,փG"1(c!":ֽ"1ƼLDT=jc-"1d .s0s Quuc- Wzq+AUwk@ J4_ĸAL(FSj5jOHM5КW:K5p%nkFt-kV/>TŸ )q,k:οR"YjEISUU:1 QƬCD.HD!=p?yɦ!1_ո7q'V$"qiƭ@?$Ih $ 0HB`6 mA$Ih $ 0HB`6 mA ʊC++:U:0C+-. JK rpI0rJ C+)ɗ    _@Pi VTK`hIIDUa,)t*p;J:Qe!Z[UOR'r䟤ĄDU+)12Q:Q?IϿ%%6K 7$%0QE9ORBo\EYt`DDe!ZBq[OZBplDDo G8h,+!h,+ XV >!B`Yq}oA XN\ C`Qq_6L=C6bmeY}meY""C6,!B`YSumA$Ih  m0A$@$Ih $ 0HB`6 mÛb65fL lI"<3}1e pDQNT e)nD6V_MDDlJFWe|eS)+p48*ȚFC9"(3*S6@*+lIWiT_fT"e(C*>V/g$eD[QΚI=)#Um0Lz\'/`[~IgաL3g$ G#_zD$2v."E}Q5Y8yh\J""JMR̀G86޺::HƌI!-RS()sUBBBfsRc|v'EvIδt.KUZB"K 9HOmo9j@:VC9Q1MI"Kd՛^p> IҪ)ۜMJ*%)+}c!shL7I*s(˜JJ%)Xc"sBJK޻coښ'2/iiL Db6IQHEԶߓ18r0eEdQJd %FvNGē%B)8pBZYYeffRJJ %&v_\\Y,2L(ȿťԲ'  IDAT4*2Iޝ2Rԫ)0w<{oJ-HҊ{FPFH:g%[3=#3uxoRᄴ=)#'Ѓ- =ɬ$SlOR!Vrxt8!01(ԛLsqܧ)1g6rX:_OfJVJHk!9S )WWQ\HJJ\IDIJgo|ǩp;g$R~qfdu5!9bbd*)5JI )oɤXH5QlmZ$;J俤ЭUJh OـD/<'nuWbuRHG_]ub ϻUJ:+aa_ALV+lY}ݧhtյj_Qtaa_wϻU: ObЯU -X}J |U: ZX>,>mߔCV+;u ؓU;`a_l @OV/L#",N%DbƓU:X}ػU:`a_A`V;9'O82l9!躰Ur2CuaɱYCuaɱeۤCuaɱe>Tc1huY؇}rlVc.C>961>TcuaɱeYCuaɱdI >Tc6>TcGׅ}'f5>Tc_ׅ}'''ǘ]j_w lۡj_0B;:&tUBG8Q/tcj_CվaV/P/tUB~}#P/t7}#UBG8?P/tp,}#:1Bj_w (t뭗w%Oly駈'FQbitZH|Tϖ 2qSM6o'OUrL7Ý(t'wIⓧ}9ɝ b( Ϳ*CSվL""JOL N(t5_W'OUr:MEEQh^yڗݹȪo__Qnp)-Ye:* 5JBC5'OU+CϤ^k'OUyW [NЅ(t [CS>ڹ1-7vÉ(t Hⓧ}pi}b( ]7+OY{uӎݏС( ]{tzrҡj_M%"$(B.}ҡj_fT]hlsv3n4ݹuNvF3y9t׽ NKD;^T7I|}qhk0 M/A;^T_/оohY̤qeUFUL4I|}qߐ!CЎ`&?';g_78.x v=rEDO^{A4AvS_7/1UdYЎ`U NG;^7/h }Ў`'׉//+B;^8I|}q_IaَWBȜ1YU@A>%mQ| U@/?TU@P| d`T_9}K ۰jC>%T_U@P| dj)B7t6/1cR\jKQbiިSiI;⺰U_qY؇}/EQhNz^W_U_5ӊƵ~2>eaE/_aV,C>(4t=C]jKQ9s&K~eaE+MV^WⲰU_JBk~g>T)J,]VWHouE}{,C>(t?&F,C>(tF^_ﲰU_%ˏtY؇}/EQhi\Ng$,C>(4uOO:[Z>Tӏ:Ԍ A @Kj[iwoT VCչU تUъ:j[uUc A*E\}lՎ6jzA,)j%6j zMD}|#G wWED7=zPodpZ3e"B>ՎzܹB`qP]vQƏC_s˿c_T P/L\>B.ڎQ/,\:B.j_Xh#"Bվ0rAD}a"H3˿c7P/<\CվjwP珏P/<\5tj_xصkWhU?qH? @$,IX$aH? @$,IX~0AX a @@! B ,AX E$hjj/X: 0 O<Pfffcݔi1ի)%%RRR(55m t3gҷ~K~!%''Q^hڵwѣGtrJjmmuZ>Cl?|)9bo锒BYYY9rmݺ5Qv! Rt6I=ozݲe|tG| 5л]vQFF0t?q@Wcǎu\a@N;wMWpD^pꫯRKK cΝ^kZ3j(ꫯ/ f "͛7YgE=z-]T:f;%KPssmRSSiݺuA ,Zaڨ-Hѹq/=={L:!л$Zjp < F%=jxbZx1utt]@уccc\ODٓ,I6ouhMѣ%$$PRRIݣn4h9Cƍ?DYihTQQA4|ǯ{=*((ڱc]veTPP@555DDDӦMLiT^^ bfZB߰a(33n&w}7YV2duHiСTTTDv~Р#"zdNߩgwS?OyyyǼ|Z~o_o߾."4h駟NuYC< 5iذa裏R{{kZs~2}tZT__OtSQQvmm8@_=RII ]q{nMMMt7SQQ7yꩧ(??ߥTU6lBl~?S]]Sii)tO6> )''nJ^x!ѕW^#")33nˣ+W:=ӣd*((M=d2)"0@\kWhGx{?8Qyn-= _38 F܊K.""GŇUU~Ǎ_51-O}Wz~߾}??~niiUVqiiv97|G?njywW.<埪7{ǪK/t|1cq|nnn￟Nxok<+LwO|vO>[ZZ7䢢"s<_|G/kkk{ugu[uV^~6b>o;= oǿLR+ۿ~tVUn׮]ͩ|-׬Yóg|.//w}u?3Ϙ1 x|E/̪rff&ٳOΪrJJ oٲ׬YӦMSO=~p쳵/^&L'~wii2??[[[y̙'~Sr+**vm磗/v'{\wUUW_}Ω*}jj7|kjjjrmm-w.ݝ5fS_wz~opuu5ggg xӦMNzݤ%_9Owg3O5_Çf &+)))<`noo{kT>}:s|.**^zß<5~p?UUyƍa?|E 4ܹ.\t)#<Ÿ~)\ ޽{8p/_k׮͛7_WNKK#G8oɒ%\^^/2oܸyఫO>xѢEi&_T~577YUUnhhpi_~x loPM8Ӯ׭[wy:֭[{wx\PP;vpaa;<̝u!m|aKxtL.5} g͋}=%Pkz_~OÇwY`u߶yf}Z?__/_݀cUUt]YTTt={t 8o]G<v?쒟O6rqs=z(l OGqzz:_qsʕ+yʔ)lZW_?Oϫʓ&M˗ѣYUU9r$X/rf˖-lxҤIb ~ꩧxĉkÆ mW^v-s\5kw}|W833oݺGɷr +oĉyСN?`<q~~>O˗^z){]yʿ#F7̻w憆~xq_ޮ۵S+^co{;;w~+**/osͰ{zѣ—]xw߱?rGG۷{ᬬ,ooaUa>k׮)SpmmvqMTvZZدsO?긮iZϿZEyOC)ϟjEEErJ/Gu6oZ޷UUϱyĉvZ^hmw=q96mV{r.))zyࢢ"~৞z'L<|k@f檪*Vƍ /\.--oN_9r$}ѣGyӦM. v[rAAyo߿}O|~%|uXyy" *;v\cc#3_+J~'yݼe***x۶mNۺu>l|>w|o OWUUYfy\6n`?aUU}pl{ee](g̘A o IDAT3:tKw_}YVUWXxl۶m+W>+))x7ov޳gIyoZ)vZZ17w999.srrWUU9nF;w׿ɈurJq}]4hf>>:ڕGU_^@ǃQF˙#FpGGN?|ܷo_uqMN_ѹ???]ngff:Dοvtgih~18OK5nٲe#wiSc`_:- D;Z?;r⋬*ysٲe%%%z?!Cpjj*?m۶s=Ǚs3fI&G/> 6rÇ;mk֖ɾ_svvt 8#t\hO:Ç_wYfqcc#766Y\6uի^~ᇹܩt%K3p\d۷qƍ/8~)3M񗕕˹7owNK|D}}^+}=ǯ9r׭[siry͛Gn}>_p/_NܢE+nmm^{g͚xK. .`UU]~!~~튊'w \x۶m`'Nț6mv޴i{Nzo?}.hy6`qtAi{\Yh~;k֬w ξ}r TUuTu7oooZ.--ut꫹'oݺu|yq9%%SSSyذaj*vݮebe\}sƫfU\uf.))G};+7Υ2ןq7ZHQV:F߱cwyw999aod:PU,XMMM/25J{3k|G~?j|TU /޲e _z饼`|2dj=<|yyȐ!@佻 dWޮ+f}Lj{嗹jgիKz<~]r%3?#mSSSi֬Y믿g͚5Nݻ]s?]|xDDtac۷o?\͝; iT\\L?͘1 @DD ,h2dUVVRtt4-X.\HDDOt7;ԩDDtѥ^JDDw=cGDDyyyG7tҥK}GD4|pѣѣ8 ]vM<.B߿?5>:uϿoʔ)IG3gRqq1]t95\)|Aͥ/rrr(22|䏷_;i…TTTD .CRNNz@DD{.]~ԿnVQFԩSϦ:sh˖-T\\8ѷr -^ FI\p,X@SLǓj0`Ҝ9s&NH+qܵw}.y#8K|.b}}=>g]KKz^뮻lB>,}ww3<5Eiٲe7?O .7^ Nڵk顇_K.yS촌+#t$&&RLL }NC {tUWc=FGy~S=3ʟGDݗF.ǿtZ~k7lpB?Grr2]xC=Dcǎ}I8?L&=cԯ_?*++~""ڸq#\3g 4/_Nsi={0:Oy.<՚/ݝZZ_>NZo把 ~WyƍrJs9i޴oCCꨀj@g{(?G׹0oL^hY^z5СC59##)Gבo3YUU~۵]w|ꩧigUUNexWZŵ999X3޶yoy~R?яr7n̵?|smmm38#w=r7[.}P}}ܪUr+"=ܜ;O*n@ÒG`up5BTt;sgr_|؅C=4vo_%O\ccc駟=ӹgy&w466o<8v?~|?r\~V[[[cX?A?qkjj:)WN8O?kllc?Ϟ=l^zi/} _}_an幖ܶmۦ\}^L6_rr_1ŞtWl];rHs+W̝y晹zDsO8;rѣK暛s?яr{eٱFR}1Q;k\jU{=}iN~;v,pO?=O?t=wYw?S\(ߓs嚛Oj\.pO /0f͚>lLW\ccc׿N8koo/Px`&hl믏=J1 /s]v٤I\]~뮻[XY35> ѣk&w嗟˗/_JXl ~)ܹ3wJcm= \.ggܓO>kll=SOOsoۓ^{sOַUt|(3L1wmMz{5b?s/&6:eO~klO;s ]vY T׿@."]tEꫯ ŌoK'^8g}կGyDvد&}B٬oL>Xu]ڽ{N8:~~Sz{{߯a}չ瞫,nt]?~\{՞={$IP45 Ar1=Ò~XjjjV__x<.IzҢJ%I?c=ŋKoV7nTCC}Q;vlg2IRKK֬YsR,g/X}}}ڼyZ[[/{U.?Yرcھ}$iD"jllԁ~w?'kڰa.r͝;W۷oΝ;'ݿ'?I d2ڱc}YIWmڴIǎU&Ci:re˖iҥoY۷o%\-[]۫- Nlj$zt񱯍<`׮]z'oO;O .ׇ?aqЇ>v]r%S\u 7[V\O?]/o߮_~YS;B|QsaI+rR=gs }O?n]|%7g׮]Tݻ%I,DR߱c}O:r~__V\[ڳg?뮻N}}}'?lT{!?Xr!}Yx O7xc\)\wu'?Yt.Wu C2/Rԧ~J3w~wF8M̿;wj``@G$>򑏨G]zZf^~e=Cjnn֟ɟGUMM.]}۫^{M~tĉIquYzG&}ҭު'|Rկ֦իWoT,{_|E ȑ#;w>O~}ԱcTSS;S7n,5&+T}vw}wW_}UguXz׻NzknI?H$a}ƍuiGկ~Y_1'?UW]5\8W_Oc޻wnV?ԯk544hɒ%ڼy6nܨʿԞzHGNj_sد/o6nI?)_twoP9z/ĉjjj9眣ZzΝ;Gʿtwk޽x<뮻Ns~_tkǎz'$c暱ףѨn~c_я~TsժUD_R?Ougѱcte骫R__ߤ8_z%]Vǎw߭ /$7(ݻw;܀%?X{饗tWڪ=:B\V^=i |?՞7?X"`%?X"`i'xBb@P`rƪ IDATڳg̙d29ssݻ/}mSWWjnn>>>W4ղe488=ǞuMה[oӒ%Kt}iΜ9;ݻw .?n|I p3g~~D"'o>/[nErK77ڷonf@Prǎ?,IzРxfw߭;wJy>|Xӽޫ͛7ĄSG (%K襗^r>n;tvܩ^zIǏWccZ]:3Lb?'}Gsmڴ5C ҥK}v0N~:Xf@@h߷o|I_7Js[J^yբ;nZ[Kۯ77ofIΞ=ݯ^ʫ~ H\\o>ooߞ=%~w*pz׿W~S{.Z?kk)i ._NUJ/%PW^}ߨD"V;5Gᅯ[7 GSwo.WFqڷ7Q7ިD,fG)Iމ%ٽݳ8S"W[3׿ԴJ|xoɟ۰aCٵkW.ɘ{fny5k3ս|u8dfw?jUտWK/R9%ϻM~v]t_FK.V ߩ3K}&?;.Z֫w&Nmݦ}s&?;߯%K:SbM~vmx2},=Sg[sJ;&?;6ޢ i^:Sbyu綻L~vЭ[ dbuwsw*n}s9kT_/Yn?L~vЭR_z-\O퟿U_|;ȿw1A׿hz.u/T~vT oz-^T+[o׶S>-^X+|*nVmF;}}C[ŋw*nvm۶g]__x@?3dmÀVg6t"575XXߟSIfl{zRgg;hB`=rߏ}?o.jWOo:u2H %$ͱ%py'z也H7fgY:;L,Rs3ljS裏Gfӣ|:ܚXXyNR0٦e\t"575s=E=y{Ifl"tsSO{;ovt[Y?ls; G&) ؑmQOYv3HMSNߪ?URK=Kz]lE"N/l/w*2<8UOx!ۿh:Գ,ev0HM-=[j|RGWzz{]EjjTغC;oPOo_jǎڱc K==fߩ۱cv}}POO`?@X340LDp5LS t@#HG*)++7_:NX3w^R8"87Jm3`~DVw$ (id]"8ƚO0LDp6~QI t@GPt@GPxam62M1 ;nI_u"8vlݡڡ/d`"8̀җF `"8F4AH`(7_y%QJMW逨|C-W2pF#*|C~逨7mt@TR!p˘8%1~:o-LDE(7 逨|Cw31~:ox?PJ@2~:o逨|Ct@TR!pLDE(t@TR!ppp*耉G& QvNL$4& H&x 7 ]6q]tDNL$4N& H$iDM\<:05q]t/(G%bIPvG&bqQvNL$CM\<:0CyM\<:0& X htT׮YO3 nkzzչ4즚ؿnV_qcB(kVw>̀(^b7t5 8oL5uZQvSM@Wqj:`_V>f@TzkU4c즚HRsVf@T֯ת .n}Un}}j7t>ZeSL3叇&OloWOw3zۆE+ޢXiX༉ĺL}/]0uѲ^egY3Ꟶ٬zzzXiojû)٦eN ΤoELX^'g26q:`C==N d8ZmCZ;p:-9ˉuT/*b!kf.,ub]+go!f@㯵AM=Krb]pgmt.:.o&NPOo3Ꟶ;:ĺ`ٛ8C===[@kkN^ܽ|qtf w/?8:#HG*u+\t!TX3w^낻v1PIM\d # ~ I' >68 ~+* (ǯ ^46X3 8~]pw7(f/1I' + (}{__ܽ/+ (m{ ק$O/ ~ix@t(1{ӾVW[}酯_N?mwOpl?σwIa ~pï 53'C7כֿ~}~]O¯ϟ6$;_z^ ~o_2=}mӟy ͯ-|1iӧ>v?N=N(TGP+|n O/|}3c-P'>][f~_9:.>=IIIr9ʮ~-C$D_=QG3W GR߻D>O~9ݽ馂.=2A̯;8H#S[)I7Ed_ 2n !fz}~ <}bOOm}JO)ݘF(~8C{fx<nz#ԿꩧoYK~fHw|n =SO=zJ7X .!P#\)E`چBph{m+W&88=km+W&83ϜP#\933mC\F6Yg!P#\i%+5mC\Fr4= q, qJWu_=}C\+m\}6j+GܳB7(iB+m+V&88kŊ b)m\bŊi 5 cJxJ2u*Ժ|F:l>ѠXm*r R3|pJ1?]Հ7IEg1-$A ''Q!9_D#/Pvٙ'l_"s꛸!R Z!Dv̼ה.E5KK*ީ_AC8NL_RR25h:MwJ ȿM[ٮK9KgnKAY\$< IRZ@VP17_r_R)iWԿY ;8v>;qn$P<c?8R ;,řC%?X" G#Z&>::8r8ZD}p}!`D !`D4aFD8|us!`KwC_ՈȽ/W=̿!`DÇݛxN vϳkϱk;iVާP=Z[[CZ5!a-దt:8?jАupXܛ~Nz(mNS`'.mH 57}UdA ; hL ZeR| vRPJ]!a,hTvR])T;TiiL4hx|fƠ?/xRQJ Լ:J R_X"> _fJ d<ా>Q\f`պ9 vb j[z90~G!a|T?#`\0/I/@TϣN&"XZ7W:_#aǛG  ssWLTh؉rCQqCGW:D?؉D"?؉DJ[h hĬxL ((a(꓀e EQ(a(ZLa ,E88KVPħNg D"? vl{upX:8,{_f!a3Cò]!aY?`'m6sm!a.d ;,vx6@GYXkoziX$CÚ N`AC!aib=줇J[?IK_hDiFЂvC !a&a!Ƨea'HRbZ RLkTW:8,N*UC{Xup؁{CuX?oۿMషpvb\Co!a0}$`(Q&N=(a(Kͫ+'bg;):8,g9$#j0\x v-qx;x y`sSu(R2 DM !H`knnEJf— ȿHZPrLU d2iB57/EJ$kC(&_P$u%Hhj*cB5e1^-̿*Mob\` M-\ MMԿ?7"8ukDp@ C$vbb!aD 8bQVÎ᳁ xupKZyIxI&ŽQ` 0ղv|`ȋͣvqX;^;0a'vPT IDATa'BP0S`'pP`')}3o̤!atupX!c ; v2 N&`p; _ɤ8K_4P`oP`on3o,[jo~j{/[!aoupY}7!a{up[Gup/hupkd Fk$`(ZVN 0I@؉ѨupX0CX KN`("CRDsC">v">+a'N(W٣Ei<శశc!am5| vZ[[CZ5!a-దt:8?jАupX~;!줇!a4v?T2iTA黩/t39Â6R)Pʂo0dH X:H%ɿ Ȥ$_!?%Կ H: !oB7R]! TW8D/J7PSD1jWgF,gCÒp~ .K:8,NP\sC-?؉ĭCq4@4(`'6JfH@IZ1*pF0$upXvb9!a1t5XHW# Lߧ@7&{txx]8'&>zx#A!uH΢8\HPH,Ek%6/guwh#A!X:߱eᜀH?Y ES!lGpa9p6#Gb/)P⏿GH?3Bz%!7ex!f#eyֿY<;BRue1GH?37$+O3oG  ,cKP`'V3:8}0?VcG,Pj?T?X4:8̛ŤFԼd8'"<;L)6+ >W0H@;y\`Bp;QN`(*!`(H;8H;Hy y`<Ej9(cIDC:2Ag}/!瓥FC(x t`_5DWNU4v#9Lū l{KQ;z2GD=Rٮw2GDp'`"9L% l>|̑`*h:vQ_H0h'f;zߑ  lq  lkQ;|/">SQ0g"VWH0HWgeS!]&MDpOfH$o$O|U!a/>l!a7o|!agip:8lpe!al#`iX nagp;sVU4c10vϳpwxY[|ueSU3U[M?&Ix:LL 0(uݵXG]=_Zwup?†lZ0(u?ߵa@U4Ju!` LX)4:āhA 8u&JQCCu1pQuB)%i`E!` uaz0LʍX)8CR"ȿNY)(I7RQˑjJYPSQ*H_UJ[}B0tԍm!` ncuB1jBE-SHͫ"ۭC}R-9F7/SH!TD{B0#q9VDu%bBE)LqFq͵";(Hs5WqGߪR3WM ka5`Xb 0,X K%ka5`Xb 0,X K%j%:L1Hzϲ$&I9Wmw!`dMuc&H&!TL9g[ I7VKRO9!`bV$|w?V,sCKzC19Z_5r+xQmbԿj78TzWX 7&KҊԿjտԿjU@WMyn5q0N/@M<_5y!TT-pP&?6] !׆a2Mn6J&}m HZ`f6|A$ʤ$X3ksRiꍓvC0Cs;&}О+h$8E3e.׿JuC0~T7C$`ERUؾpuKGm@h_f?U{BjZ`muKͫL{{uΫHjoZ} ;Cp^oL{Btx._{z촷rPuf?{q㯵Z`g-pxH۩qUbs6X K%ka5`Xb 0,X K%ka5`Xb PzCzϲ9;=g/9lఞsCVvV,[:8Kx;+zwup؊?YvUXJF]A(I+{yb)VIsp R:S+Wid:S+Wrl)sCpZX`j%L%|?zWrR,1:S9Z:S-_K1ͳT?K~\- uzg3U`[:Yl+kmŒ?[s5buXl+pkmŢ)Lؖ`[~:[/kM9`[^`S^ʳkmy5v<%ka5`Xb 0,X K%kXa%ka5`Xb pUGLX\Y#] Znw@Kx~_jIFb pzeaq4X\Ym5 "ju|X\iL&fhZyjnq{JkI'ebY5ۍjJ'$ITLM c pe5Oj9c k5hHTa=#R#ٔiN7k++=4RJyS])-X`=WV:=RR]ZJG_* _pt gu8yZED[#uɫW;83w?Cv[hm9ZKnH~d:)IFޭCYhm)d:Tb:y:E}p5}^u8VQükꔬZl^b5͛<>CYhd2W"o4}_)u{TFp5[L~HZCJKq_/>u8<4OqUlѫy4WSDs#>kt[p!oi0RR)yɤ"">o5nڦd;J+ՕR%.!k^ʓG#V5۶ݤ;N)R<"^JT$W$Bht m۴|GR37);n>;ܬg>;!>;n>;C01}v:n71N/g'>q571Nv׿g'7}v>>;٬o\cSdWMSJ)Ooⱘu%Ծwaj_pL cj_`qJ}}1/8xԾ}wej_p161/8x}cj_P2̿N+@<}_qWPf4Ծ3%IMɄYl85 dfMkޔ }p>cʌ֙$`.߬`ʌV?6l믿^=u(3njEFccYl85#p֡h} u}_?Ou(3nj_kC~\c}Yl85kO[24?= SoN{zu(3nj_Hk/p|ׇݢuu(3nj_7h|=nj_HeȿezBoY254eF}_rv7ԾfڨAϿk֡h}Mr˴ebé}_^{v@fj_SHP&jǎԿi55Կ o@4J櫮2om[`xyr=O0wv3x]}W76u|{[Mcm;6:^l޼ټpoҥu櫯4澥+jY̓3om[:^l4om[mec7_2yx]3x=澬ֳ1l"Kޣ'4澬Ngcl1omˮ_:^ n4omˮϲ1[Guyhs_6 :^ ybT5LLʻdv% IDAT}I9p13)`a&C>̤kڇs 0S0r^03)}I9װ23)g13)`a&>̤>VcjfPcj4-k,_Mjcjf=m^T~_[|Τ>a|צg~cڇ}_YD&51 [C:}-ukLjcjf}]5qxY>a|^:_=6הNLjcjf=]6Tkh>̖l-zmkX44}-u[wФ>aB{gҚ7}-u-h,&51ϿKUPzRcS0[Ko޽I}LlR;NOjcj_ӧukV٧~"}uko#SPڇJ[7F?ڇ[׻J?/ڇʻ ڇJpCv~ILC]طQ/>odj* '}vޑ@.ߨo4`1ֿ|?~>T^ƍ}%1߿Q?Rڇ ?œ]v8Ծpؽ{2/ Ծp\˿$}!\˿C$}!;xHA˿?DO/S Ibj_H.?B$1/$GޝUU8"IyeD$%^ʴ4ߺMڜx3Ҝ4SVΤjC Lx`sוs{yk8kSpq>X32?HKL#-1?HKL#-1+㏴?HKL#-1?S_ HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD^tI::uܴ(iGZb%iGZb%iGZb%iGZ:ui]rQnnn`V%iGZb%iGZb%iGZb%i EA֭ -Z0H3?㏴#-1HK?㏴#-1HK?㏴#-1HK?㏴T_ HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDDDDDDDDDD䀘HDDDDDDDDDveo&ѣG-ר]~III2{DDDDDts]QFi] "":N ___ڣ> 88X :v վ]v͖-..F.]bgXS\\Y,g9:s _Xn] 5˗zquF<|}}R+=y `ɒ%U&^D"5ı2KQjl{~ٕv؁"+R5y7FNNgI׷F~Wȸ_\nt3Ommwk<5&|NEr[NjEpp0p CN>VX>c?]fXص.Toa׮](//Giiٲ%%%())~n[NU]|iiiDEEaϞ=Vǚ[nczXz޽;~wڵ "R8ivepٽ9s&_^+=y `Ȑ!޾XWlKM*c~=l6϶GuXr~d|U:êUlUgϞksqB[nmgWf܄ϩ^7o])1cDϘNڵ+V\ Iff&V\r\M'zzz"&&ukԨڴic#99v վze˖hݺղزeKܵkpȑj^zhѢEMڟsHTWZjUϱ7nz۩z*=j9+m۶Wu{@@eXlKM*c~=l6϶Wy˲ P :xѿDDDP;#4šSNxWPPP^B||<ڷoh?3gDLLw}Lbbb~zBxx8,Yݻ#,, ]t9sPVVfu?ڶmp>}GF۶mk׮YݾoeՃgl/Q nr^lq]q>"{?u5ȁ5i кDzM4A~TMIIIHHH̙3o-X ԩ~s8p{/ tdO>`O>x" Byy9ڵkgv;K.EJJ )ݒt)w ???e׬Y>} ""X`DD={"""zš5klކnIK5 6*#F !!QQQ>#ѣͶV)// !##1m>^!"ر?3>l,vލ{111HLLĘ1coTv!** Cž}ʎ9`*~ #F@tt4Njw%%%Fhh(.\$''~0ؗ>:"5})5NM)~~Lyy9,X`p^`zݾ}{W^oCE||8vEu[X?{jKm+Sӿ+WGG>} ___׬YLc "wx*))iЭ[7?6؞ .\0aڵٳ'п߿_řwN/Ƶk/bΜ91c /f<38|0>sڵ V•+WONӧOasرسg-2M<{яIXw}",Yrssc9sc(**}݇~aڵ:u*7nlujX;ND駟"##߿?~WrEEEx'׳,]Ԩ-NAA"""닠 "_۩S`|ݻ7ѣGZʠΫ.J~E9zPt/2LFhU{]-Ϡj빐=;t-e֭C>}ЦM;v0*?n|vݺu{ W\1Y;CO8}trrr0`DDDgϞo@6Wq$$$kϓ?|}}ѱclW'UKzzL0A<(3FEzʨEQ˓tݻ|Wr9}ÇK\\Ç;wN~aGl3,,L&L +VEɠA$22R/zTKUŲj*$''GE?rDFFJϞ=eٲe#~ 2Deǎ&C剩LQe^*Ν3[f޼yҡCY~ҵkWQEc:("CY{9Сvѣ(+//חIOO^{MΞ=+zjԩ<˗KRR̝;W.]$""Ǐ@Y`C$$$DN8aT=zHNNlܸQMرcByy?ިw}'W_I^^+7/Gb.tdYz8p@ϟ/f۪WٳǠ͹vرèڶm˫*G'OʬYO[)**dy'WZZ*&M,~6 s{w%99Y֯_/yyyKd&[;^5!"ru*--5_gb.l"裏ʲed2|p 5'Nȝw)/|7ː!C$--͠}9yZOKdd?^O.>LuݖrM<߼y$!!AK?dҥҮ];s~9O_Gܹs%88XeJJJd߾}(O&N(k׮lٿkbAA("d٢( 2D~gy饗$>>Ϡ\K{[c5e*3חR7jmj>3f2yEDX)**rvC~GQ?u5g6RqZG\?[D]~ʕ)-{… %22REB}9ݹѣ,[Lo.lOm]~C1cիe?˩P[nݢ(t].]*9992|pׯſ0E")))ѿަMQd5ٳg-^Om}ZEӧOѣGSOS۰^[;kU3gJRRXB<(K,hsyEO$''G=*-"'۷Sɓ'syrټy("۷?\v)~իe_eQ^ٳ%**J>#پ},^XbccEQqFSuLşgP>Z{w޶nt#rOӿKpp,^ho< cƌ1}K 78|p;ڵkHyC{n6Z] l߾ݨ(+3'!!AΝ+G .HYY;w``DWק~Ztbr瞓 }O?m.eo.ڵ3Y7s1U-۫W/={A Jjj}9k sΕ^zܖv]wɸq~_tM'|"reLiƨjWVV&qFg 2gq>\edd[oeZyy?*--'Oʅ ԩS(,(ɑ#G,ϖrMy _||+`&N("]t1y]c,Yb֮(+EEE(9sFu}\EQ9c7G9tVOM_J͹SjTfcKXY̔KvL^cccE-}ÇEQٴi\xQ"## _jY9J&F9.5g[\ff={s$\c 6ڦ~V^qW-g`񸜅@sܹZv۶mkЎM17W9)իVTߦ}N8!m۶U}s[ێ*L_YYDFFo/^lt.ϟ?/O<$$$HHHmմ/"gyFd߾}&p9X۲esΕ޽{%twu98bgk{em)֭3xOꪼ-5cU{O3([ U9=;xo[rݻ 2D֮]+_}ݢ(deex~Su_.z@ygd…2m4}.ի|rQEs2yd CiKYIW䮻^xA>c2eDEEɄ nt%KNdԩ2uTIKKHIii\Rf̘!ȬYDQر;V222֗?}KBBL6M>36mK||ڵkEQyGdFܺuL4IEիWKaa|W㑴c.RRR7۶}(qrquRE֭[']t'7|ffj^9{T\+  m1 #/lذA#Oo87Q ((HnvߜxOڷo/W^\222 yۦmO`rL}fCt`HHAƾ.iTʙ۱c}-']t+Wm%v2ӧ%88X֯_/OpoR渰PE+WmQsaaa&c?%%yp$ ^͕0۲460<3\ &̙3e֬Y2p@yeŊCY܏_]l|ğH5ǥ>lkQm%ݻ ^Sʯ[귫ݯTBm9[U7p̙ҭ[7*ϟygx'cǎEQL,f\'&&'|"rQy֩E[=*eeer!^}UsEzz:>s|ghРQz|Վ ~2eZh;7y-[:PRFPPѣޖ.6Ϝ9W̙3nnn/bڵxgзo_gƍq믿Fpp=1X&o>$$$ OOO> +>yyys駟ƀToYܹiiisrrbvtʕ+h޼9ԩSFгgO<w-`ܸq3g>f2VZs뭷:w}׮]pwwGVlަo}\k׼'Xt)nv#GЧOiԨ:ݮk^^^_}˖-~'|7 xzz~-]PS5{^}s&ƺѲeKVZӻwo̙3 /Caa!wn롹 .D˖-1f|hРFsΡiӦԩ^כI&!33z+&L}5k}v5 Æ Ûoɓ'_F`` >4j_X#<Ǐy4hx |«jp,m~رc!"ۙ0a~a=seZB&MT~',Zmڴ`3pI>v:QFdž ~g̘1wmS^k׮… 񁇇}ldǏGf?7n= 2*_w*--?h̷Yfx饗0tPӧOQ~}|2???ݻѾl]=,--5z:~<}믿bo_nW@=%kqxzzb̘1cȑ#uL"]}7n ŋb fwN:FEI&F>֬Y];0yᩧ\^^?:u'N;999&v6l7 +**¡Cy| .aÆhҤ!XII \bT7s=xѪU+4k =Ѿ]&MzA9OOOl/Fff&lقo]t?^x| yDGG'N@֭շ^z©Sp=`ѢE=cԩv܉כ  /*|AͲs-Z ;;={Č3ϟ{kwwwDFFشirssdKFۏ?< BCCwyG1FnMQFӘ"001c|A9r.ի'Ne˖hРp&򍯵kZWXXfݿGM@jFK9wjXM5})[Rg^zx^unCBB<==rJ<32jؕԵ~>j^mRS{Dm?[Myh֬cʔ)F՝B߲HPoW߂xz L*/^l{=zmxxx7x:t0VUشik#G4YTkdee!++ZWMӱ{n۠Aϕ5hF¸qSO!22999xǏ׏?Ę1cpq[*pRm_tmn{F󑐐W8 Ə_|aaaضmLb6wuyϖJ~ׯ &`x}ߏ[.ퟪiwm9Ϯ3(5njMxmCƍ^z &M4ox'W>|W^5HթWUM袦K/ĸqвeK:u ۶mÞ={ ՂPquK|\~&ߏĵkאEQT$N6 7oFFкuk(kעG8p}]mT7x{{K.رcʵg]tދÇҥK ۶m5k ))I>Z?l<#ؽ{7ogj TT}իW_~K^ ^tIVXa03gm۶Ȏ;ڵk&???? +))NE???ydܹҫW/0ʹTrss%''G/_.HNNΝ; /++]w%_̝;WDQYx~Yb%55U>S_dKXXtŶ9ɀ)xMfr쌌 }ɓ',#˔Ȕ)S$66Ve̙SlKDD~{}(nĶmۤ{"2uT4ڵ3Gdd{)L/Vҗ;wyynj΍AAAJ||˴i UsEDkx7oHxx~R%--M$))I&L ?C0gϞ@ ŋK.]$44T233eeǍg#""k׮ ҥKOڶmkʕ+_~)ҵkWyWF_piF~7tPźNiidggK׮]%$$D6ܖ8l"":ug}V<33\Rbٳg̙3W^6oL>}W^2w\YhL8Qbcc_͛_BLv-999(,_\>^ڷo>"֯wuAӖWZ333R"XM5})5qf3#Rіϟ?_v*ҵkW7oQ[8qDyWDDdΜ92tP{Ʊ3rODAM?^mUS{\gߗ˂ $==]BCC{Gt=ʁ_Ev/j[XXhr KըVٳ$HhhѣG 66RMDԎr|9]+..7|So_~gQEЯ*.-[HϞ=EQXe׮]'儾k}{רql֖駟_~.mp T"S^h"Ȑ`INN{N?v)b[Tm<;+k?sϠDߩ7QS"k_yy8p@ҥKrٲel(%SSS [cn[^W[6%%E-[fT}E-ˍ^$00(7@y3Hpp|?''GBBBHݺuI& / 'O)SȰado s7o< &ȼy$&&FEٳg=ϗrٻw糗/_ڵk6H.]D9rA/";Ȏ;>HU_QٳEQyWpAyyyb20??_BBB :A2rH;7xCcQ\\,)))O`ٺudee.qqq2zh9~A]?پ}A͛7K׮]%,,L(۷o0 0j'T D{dÓj{ܹs(?YΝud?[v[¤[n/˾}`;t |ΝCii)~mt޽6wO.hݺu׿F!>>-nݺɓ_yֈ98Rt>{#pK.xꩧvDDDG޽YfaZVDdo uPTT9s`Μ9FΝ/`֭\ڴi;#aÆ?7q oٳ "kܸqm5h<vڅ^u!,,LuLL6 5·~F!::.DL2nnnLȁc-[Yf᧟~Bqq1 / 88w ['N.2lذo&֭[?ݻ7z)h¨^QQQHKK7#F_~4[7xuOK?#JJJpy,Z}|RGnŧOɾ]ꃩHHCTt㴮NhoO&vtCZn_ۿt,X@}; 1 QQmuuEh:|Α(0cdߎ.[ ғu{:|*MRlԌnXT{g?~ɾ]NHmp^뽷fWjoG)R%#*:_57-,Z&vte!5"ۖ/oaɌ%RvCdt4b9W-3z KLdߎÐ!F[̘1˖-dߎ.)) ;wFdd$bcC}or}%wd@$AXhggSW}/T$!]4~ڸl/6. "0$" 1*UpX[n[T$ ._[(~Vז/sˊSV;D".?(9Qum[sP v*1kϱm*C""wc0me~#yÐ!@\"ANNd`!,,̡Ɵ5M$%~b6Eg.U886.ۋ؋Mf$DZ1;qqlވ؈7"f$DZ IDATO ?'.P73HC `sqb6Eg\lF.>Cl0; 9]2 88|-Ţ3H"X|c2cgGE2 0; 9˖a;\v0; 9]2W$D;LtBg*lT+*T$fZQyv@"!0kX/H@EB`wsv,g*T+*T$f jEAqv@g*ىVTH^jEwXT+*T$1_g*jE}qv@g*lT*T$5G@EB]wU'gd \nv@/OO&dQ\nv@ՆfdB ոffB ոfbQ\nv@//T.ӫ Ȑ\nv@/O/&$P\nv@//O&$P\nv@/oռfjCuPu`^LWu`^^LȢWu`^ތ?yU 3]Ӓұƙ0-=R:&1ƙ0[R:0j22dqfLHCJZ jӺvCJ*?yfL똆)Ɛ35;`ZbR:0jғ9TL)i?yfLm$^晚0[2R:gjvnHd@qfL RӘE5쀝uC4!0{ E $ ]#|i uH4B"Ѻ .!m !1%lZ* ABbK,ܺ5?U0$" zZWgU$"]K,|k+Ɵ U$".&%+5߄Hа%ĸrrEsM!M c\b-y5}BdEoB`6:eCHD ۹F׊/Z'fW$F ]K,|+h!1 Y?CE2`pD]$89]B3`rtɀrqmc49;]2৫60\.G5m㲽؈X5 oqmF n\yx-F.`cFlF, Ӹv6~aWi8Ttɀ WD`cj\;rvdo_ccTtɀ cxK5ksv.6#ac9B5L h"K5m˗؂\,U^.մd@`qE,ۖ/T*%7~\p,m_ \p,Q %~yEBtcck dVEtH{ NkۃGrCYz쀤@wX@Y.1; i5t? 0 WyΑ7 Wyn_^.1; ir) K̎Eګ\pN=KrnZQysI{Ug7}v6^; kjG傓wu]gdMhib>Q%yY^i /7~35n:,njCe,ǟ)dI[T_#׼)Z?VA 7i`:LlMS-P1TpZy-HܛuiUDV"MD` h^Eao^^<&Y6ռnlbGc˿~ճ~ӆoTݿ{yEmS WkVڿV?+_s_Sw7q36AtZ6M_c7r[yi# W0g,E;-nj-*⯑6̳k`9~Y}w+VsӪu+֭ -nj/Ali>r`3'ws3ҴBﮗ~0 Ij" \Odf[ 1g)ήIp䲒`>0]e%!l›D8&JRn1g)ήIp䲒{&MWIpzI6@҃H#f,%Dh6!R"]e3ZߚH#דlBD8&Je6!R"}UzMg$8rY-ZMg$8rYwqل8Kn5GioVvkp8 e+rr^ei⯥u0(MoڐZ-Xyx[vDU s Pmjyc9`G 'Fk(:ۍ̻ {(Vvl7P*EKo/5|C&Eǫ~{] 7WxYQ;~Z_qjs<ji65XRA{{>ᲟuA +3_: [_nk7+Pkbyf8GmmMa9jGF)ZW.ly4o+_fѼMU qc6"fZW.|}}T!ݭ=sd2&ͼ,,yFTOT+!4ouȅ5պ ši]ra.9K㯨WWu˦i]wu=)*@7xuj]B@7x4v㯮pk+{o!.i] /[W4GsP |]H2@74kuj]A1㯮poWZu7_@7m[7CDDDDDDDDDDDDDDDDDD4MRbyCX瘚;ykțֺ T >>ZW.Us@yrϓ#j9fa9fi]#jKs15q@^;9f:KGԬѭZW.8Zֺ voɭğ?g$M9K9&i .DuG-f-#S3ofvGq/iǽs$cr@rLn-]o `;raPS&n6mjmq$11l֬Q=@.g' 5e)IC\%@HC#p BҒ`%y7Ժ uȅy#5Һ <^?N&M-f2yAb=MqԺ =@q`GqI;L@ -51i͓^IKn-8iǭa @.)HCM44 Z\㏴)Ҏ';!iGZjт?N i'_H;?%L! iGZ39W9 .Ӻ t[CכWw Jk]a.vSuH ùPP\uWl /j]g,8o]3]ߺ­-\ ZWnp%y;UuWJ.j]=rD* M˕ZWnh㯬L* M?{wUu7~Mܙ3$1@HPP("ֶi.j>ZkkyVkkS֥}ikuVVEd–'!̜ϻ/^Ν|9ss---!`Y }_>B!)2.z"!bvXd`vXX? ڷG @ ۦAOpRvXpvXvvt`1ϗQ̀ #/i'T[, i*h'؟C4K(@qžߐ=Jn@OR;X,P^,毮˫@ h>=B(?ȿCAS4j]\㖗k2_q3#r{Dv)C|fn ^-/< sO@gΖ/K{! {|%88lD (,ȟ@%t,fxqAOl ?, ħ,D=A!b`1k޾iv{ ȿ`kmۻ^;8g̔ڦDDhb; kln"ogײ~4vl"sm!@D|; P۪je^ "N/[[ɿlCPe/ -Ϳ-[C|9SFhM,6eH`)!bShMYpv䱓C&'gQ!bCŎvv1i!b睢,6a`kE-B_C2g7|viؐbKAVp$[pp´CŜ=Eaz Q̀"|!  iB @ϥpnC2' Bdq !bEAQߠ@@ 8|.zs\V@?hb@hb"hrl =lA MER,Vrz z0 Ey`Րr`1j6L;XjTIAOU ׿SY[,VUN =UCCŪ0 =?UVVjE|E4E]BOY;X,ԝ, =RV_P3vXpRvXpvXvvt`1ϗsR…l =a(TM=!-EڐvXz = @S@qk)W zJn@Oբ'jP䯮p5!b[־,e|!Ek}zE;Xmk}(kC6Y;Xlu!b?ح,i=۴ivH)_@"t㖗k嬀=e!bn?a"h s =n9+BO@!bRn@T;XWBASJA8)?'3: #kCH9/w e_w)Wʪr9mEi9ߪ[/W;/W 0|>gCH#CGGCHS+j|!e?(?VA!\i+%!\NI_\ PX4 v?b?s_$ P;É08̿@*+*&(dFD <~E0%Yz|||A+A8l=~ .+'L=NaX;X S&g)?'  Q =PH;Xz|.8sz(@&t18!& + @S+bEyYX2pvXvX`?)];XU Llpa~n[\8B ByE(ZҢ8R<8x _.Ug)&rA~ɿ\sB$? #\6? C_.p%?c%7yߜ(!-U!!Eq1\ @ )XJW =nyv[7@#ʴCГ b-@䆀CAvqr^fuA“@A~n P(w``1w0+A;zYz!bp~n $=[p^Apv3D;X)!@z`8|lmi l_n+?-b2-ŞmMchc[@5H~@'5i %_2<Ϳp׿m zD (wmەHO3'RBZC_vؗHS/ICiqh'rI2v#%9p8]\h)**JysVB )2nz"!bvXd`vXX? k f&'(=I!bI!bک!bӵC|>_ΝS h`pa~n,OG_iݷM;+iDDZTV;JղMHvٵcvV ȮOvWC@]];+jq%?K}JnڶO;+ +C U!d?kWWkvܩ(PDASnzr`1 Q, )P/BO@!bRn@T;XWBASJA8i;73; IDAT @UCAM"CAM4zh&_h&?h"z _vX@(PB7 =!b`.H=|Iz!bGCCh_8H;XX,攐PE4/$,P=b?s_THvS 8b`bzvnfvA"!![C/A?L7 =>EbV@" D丬=N1[@#ۂ H ASsB?0`@Ν SFh8|y~1nv#oʒ! _( 47k8|vi5yv) qn&p, &pY1M6C@N('vv#ce3'+ ]X;CHNq߄%KC@Ey~m! /Ɋ!垎۵mK#Ao^nN~Xjtܮ}[ zYMMUmv9q]Ҫq@+ T &͑7y mӐ+V1}o׿;[[ z{ OOCoA]Uݹeg#AoH;鸝{9 UC?ܶ7͑7E=R9[ؽ/͑7yGiϕ۾}{#Ao~CŚ,t4-],ִI;XT?i:zN$!bMK?Y|[`Bj-^xvS?Yt=-J0,_>/YvCdZVti C@"!"Ҏ^CH`_ kvAVa B̿dPi~&BePsOfgC CHK N!e@TҎ^ӵCH;柳KuÀ:ovKr]Wμj0`;S; Xu]9+À\ו'/r,MArƧr]W]}vpeeaRʲم:\ו_,庮v 0`)uK.r]W,YdEȬ_靋…CȈY'k^ p""2k_6 U[͝z!#f͝zۉeP%GiQߎ5F6@$"2i!_PDd\/|=bx3J7ȭsC@/!d9_6 Wi3ȿ䯮!#f̘za ""!!;?ȿ,eMU fMVUv\h\;c)׸vFe!d!CC@/vC+j^R0l(whr; S@!d_vqdh/_PBF e/+J,?e%Ԓ:T;q?kfwNYS("0zv8@-0EDF`ih6"Ӫa8pw`2a\v8;؎DDew=_}]v8@+ԏ$_;o۱H8_='݂+7f ڿэ!A!dL}#m%!d/8%ߘ1!֬("2![2 :T5!~HeU7!~}_-IDd܄ q3Cq#2f܄X;G)@H1 PwP$oQW >$2/;[4ko5C/bOj7wl4 h2͉رHcC[e(tr i?&2 k1 柷ݛHЩآKP} ENEEEi=V 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 }Pmmmmmmmmmm.YWX]U!j./""h?u]dZUYHjЅ؞-DhϢ-@DDjjC@jj*ɿlb""55\fǵg VaU! @;o6q!ib%8a2&NȲc9-˿j?ɀznvge˿PP;t U C@>>/Bv ys]7.Ml+@&?릈ӊ.NȮ @B MNЮ]g;(_V)= Keź@ ȿaR3/9N; Xu]9ꫵÀ:L0`)ur]W\; X |6>^; Xu]YvaRne3iK+.,庮>b0`)usWhK+^rv뺲d0!YW("Ҵ lصHC~]_hfeVMKj WmZڤs\V@i:/[XD-l[PDD/[ضH) C~߮-ED¶-EDX;W$E!dj\n,^xvدŧb@[t-X8h"u+ +t66DAMlMlCMlCM4B4 04 +4=mCľ/g mEeevl"!`ihmCdT pvkmCX,? RV_aljsmCP6!8P;lCP6!P;U;lӧkmKsdmì=nR^B4k?#2+l̚KwB$ U[͝gYV;5d`Fj&9"W=ۿ[w(Db`;o̚K7l-@u?۶L Y("2kn.*Db/@{~7\w%sz޶gB$r+2s?H(A9_^H(A͌o>H寮A͌3z%Xʊ V_,1*nyvj*|n7@*+iGif萡!Xoo7bvֳah%/^" H@;5Z6Avj2WbqqMSjq Isd CCCCCCCCCCCCCCC!k EDFk=R;Xzƍkנ,0zCGS0Z;X~/C MS?Q;X13F;YVkXSv5j ػ@@IVwi7nq(w B?m@? PUۻȸzO_;U3)vl`nkO;U,o/&g`vVXz `f{"X8Ǵc`]HD;UlmuiX6|.׿lmu^6HvXS qB!b`]E)**Jsd CCCCCCCBCC/4 04 04 04 04 p~58"3"\Oٽg@g=ɬȴPU?\i7E3"""*h pfE; IIKeZd 9LJ*h8""A~@aL m3+Tq,9Lڽ/jtk d`h pf%(""2P*Gm3+8u+ ePn pf 'HR & pfjR"cO.""*)$8|>_CPڟ/ ;GduHAGa_P-(  @)@zc!?ٟ??ٟemoƃmzprZda'$PQ/>L'[s.Hi"\Ec__qB!q\W9ӹ m&CiH6$n+\G+/u#>_+e[[v89-Rw&G*KכmoҲE;`] H6}s8߁:ۥew(W:_|g]6wؠNN ~D%I#wq?"0q|@E6jBH@;&S\ N@;P6?{guVprZ? WgߺWZBq+ _Z A~NPp8B)rrm~﷤e^prZp *_X*Ž/9q un|׵WVPjRĉt|  K@oȖߡO.*񕕉SґERKQ($s{Gl٢NN|qq"0`@OĈa(GZ]W;¾Tk=Rn10VU?Ba_44A0VUX/eƍ۴b]W+߿e2}0An#uվq"Ba_*5}u? R^nade"Ba_*Տ!uվ~"Ba_*7;0VUՇ}T?nL#ku]/:&}S?^~ϴZ]W;B RqL#ku]\/uG7I>u]cl RQ"u]dX/46Ad ۑΘ1c{#ku]oUõ ʉiuKqv-c>=UCCPѵUTRǪ}z AE>VS=Z;] XO_>VSSU}ڧRǪ}zjjZǪ}zjUikajo>VSmi׵UTW9ҵUTؙ] XO] XOOu] iվTʉk(j_cվl CH9VPH;cվܑǪ}"/UrF0?VA7UrF0}厼?Vj_UrGͿVV,Oȿ\㺮幇vjP_w $oNjIojKkjH6 ڇDҹ !!tnCȪ}H$Ǫ}H /!tڇDҹ 0!tnʪ}H$Ǫ}H$Ϭڧ'g ]7 sǎI>.RгU; {a!Y_%ȴzj庮̹jٕ*}ڇduuѮi(c>$u]|zI=.Rwr>VC\וgnٝ= Xr9[Ȟp>VC\וcO#BQǪ}H2iOrPsA>VC܀+3b}o>VC\ו_hIr}ڇd+3 &`pR>VC\וg'I=.P;Ga!Yʴ/}I[z}ڇd+SNMq>Gae}O ooVCM_Kj2cڜ@VCM;W_Ȫ}ȴisC=$"ڇ̛6{<UiS'N?j2ojTyLVCM(]DX7u8y|X6~<)O!/O""ڇ̛2nu[G !&;GUȋj2mҤI+~֭3%lsVׯɿgվsqUC_V˿""ڗ'r/hI兜?ٟڗr.aվq]&h~,X v Y^^.nB<}o8 Gt裏],]G>gtN:nz\٩L!y\z|GH{{{87tdb?oeb sR=OtܯHTwڳgc@_~2p@)))tby9@ ]v[oq<+ K~$E/RSS#wu̞=[eڴiX'""k׮O|rG<裞MԩS^9+dRZZ*"Ɛ!C7O?W^y5JF!""?=Zjjj>|32zh;wHV%^z=ZƏ/7p_Ddǎb 0aL0AVX7p5׭WfΜ)ӦMZ)--O:{[[[eʕ2fihho|RUU%~zɘ1cdĉ?ID$a<>益?ylӧH{{{y33;0 iƉgڵ"\p5Jן(D峥KJUUz2|pַ% ,aÆ=6~J5~L4_K~ٳGG-555h"YpkoD앮)^MɌNvvPHx≸}Ѳl2YlYB.?m|uWH}}|k_e9󥱱QƎ+?ٰaCreI}}?^x;'?ɰa|Yxy|^[3]w7nihh0_0555fcJF͐!CLkkͤILCCC03555f̙n3ݞ/1w6Gu4~ihh0&L0>h&r믛}ѣGh4jƏF{}o>sm3gsu[;vFܹ3Ǜh4j>o>+ѨYhyW̎;?oN;EQ3{lƬY<쳱']˃~饗>l޼lڴ|ӟ5? fɞ7>d>rSO5M{{y… u]~/[ 2<7f{v}7ܭc}17>F7eee&cc:vz9s17/z<>w6W]u1c9rc1NW7gΜ^lٲlݺ|syu~ƍO7_͛cK+:>?tM=sD'/_ĻxW?nѨя~d^|E3bcL'`?㪫2/6W66m2?OMyy~Ư^-H_23Ƙ^{,_܌9[>a„1̡M8vͦTUU|̝;TUUW_}5O(^va?|3m43ds1ǘy7y9|v2#K:EQ믫=?ty7677رôk,_<.̜wyf֭f֭泟!z{_mܸ 6,6l`&Nh= ^Rq~$́SCCyc{wѣGw{>SWW9[o455ɓ''&?1{/O>HW1cz|>Gkk1O4U/}|}ꁓGovg_{{_jѨill4/?o~jsǎ^k&vLg˴͛7ǞsƍҼ+cn3~xּ殻4jݱق 9c~s'x"vD}w6۷o7hԬ^l߾uBW^?kx}^㦛n2#F0?я̳>kN3fFA?466[sƍzu\x P_^i-ן(Dxthܹٳ'DO2%?]tn6ƘG}Ԭ]_[+x~cf̘a.2a}vL8єŎ:bLTc_yv}fժU30Ow}-[[oլZʼ[3=ƊɌüu>H&>/IśYf9c?g{rFMYY 'O{ Oc-)SfOnVXanܳf2hG;c^usYgÇFS8t^; n{_]p/~1Hcƌ1---oݺ zMޟxچT^_z/Cɼ^=4hwm˜x≦L6͜{W6̬YLUU9͙giz fذa ,0Ӝ{ 6,]ԼW^1UUU&1cγw^3nܸy( }^Y^'{}^*׺kxԩS3l@/͝;Ğ1E:Ԯ7{93t<6c?w7l?_GoN:$/B3s̸1ۤpƌ }^/֭[ghߖ=M7gwqG/t>O_DnvX̚5+6sE%OW.Bn_n?,3rȑW_5oF'4[l1ÇﱢL>7~n?{wѣ1{?avi|ͤ&X&OmueٵkWIFx9nݺn@y睱oڵx{A Gfڵk=Ou{_KDo2_4|wLCC|ϾsLSOu7l͛gZMMM}LMMMo͞=zc-[ff̘a#O^a^M^:Hv\6V7oYdy衇o~s駛h4j/^-[{'^Wا~L<ٔ_5k=cj,Yb~icLǍ?TTT/q>|7n\cq|ffرs1{lHd]6~> `1[ve={WͤILkk9c'Z|l_ɼ?'7I?^da:koƍ /v5˗/WVVv[cjSZZjj>Ϙo| .0uuu&O}S---k&7uTswvp;wnl_ױGl^^Y^_z}dWJE{5c} /3k֬PQQaNϬY̯>ϽsNsuיѣG `N=TC믿>.Yر\q5 .d/r1JJJDDdРA""gϞ=\y7u=#璎'v!7nn?ohh 6Ȏ;@Ν+>Z~yeڴiRXXҘry'oo!_夓N5kQG%ꫯʏ~ν|rw#o|r-t˗ʪUM|I׿.6mR;e߾}o׿rKKKWnOt˕W^)*W^yx≞K_\~&۷I? ' ]t]V֯_/\rI爗>DO>'/lݺUVZ%gc&[1ڄ ^#1OE/[l~[W_|P,X 6HKKK3G\3:^Ɖ/^$y$/^/sL6L|A)**_~Yv)o!=m;8W"|+""8_ &srUWK/$2yd OYg%>` >\f̘!""?d޼y@n*"">viOECEF +**d~yaoذ!?|ZJ*++~΂ٶm[gk׮q\YY| _ǟ?OI?mhy뭷<ogеr:묳믗oQ,X GydH$ / '""͓{L}QYr<#?QfϞxr)"g}9R.]*reW_-+WzYrL:Ujjj䨣۷?.G5JF%7t|3KYg%#Gٳg3<#˗/=5\#+VF'H$Vdo[~哟Haa455ʕ+{ޟ38C e޼yr9HCCh"9<ߖ|饗矏M 4H|>_}6pB_"/dƌr '~;ye"Q0:`|O=T5bhd?Tu^sc^Z1=sʏc9/KZG+Wueܹl2Y` ' "+V;ںuL8Qt\ ߉_D/QO"q3QgK.9sHMZ$s9'K4~7_K~\tERWW''|444ȵ^+ IDATͱhƯ^*ɌVZ%7x^Z{=yS\|eT$s˅^(8BuܔUq]z+{xT7o5L2k2929M29 a !HP lS{uֶۭmwZwmwn]P bwնnA(R CQ  L`k. 3k=g=7~_c۶m8tqmfF2,[ {~fY̘1DbO=1f|>477<=|B*'~ߠ_=n@AA:;;1i$w}Xtg+|>̙. /im|hܛn 1}t;v >_~y~;nFCCCyS?_%ʮHRϫo'lܹ򗿌}g??@iiI=ذ:z(n&|;,Cv&ɤ2jFs>Me k| jkkO{5\3gp xꩧ|A<3xN=Ν;~/ z衇/wa֞B'?#GFK_qF瞳fΜiEQk{衇X,fs=͛^{zGoѺKݒQ5m1cn:kӦMŋOkukັ,˺;6駟UVYrIg˖-'m!+ |OOǭkͧR9֑#GNſΝ;OTjkkV\i;֊+6;xFk̙eY󭆆zU*-TYZ*-al?EԩSwƍjllށ~C^c?\hU__o=3֋/h[m,˲n+HX?j]kS_۷ZfIcStqoVwwF_|>UTZ{Z/7?Ǐ~#zᇭ֪UVsso޽'p~g544XC 󯡞L]#oRn:F^xڿe}_fϞ}g4bY{;;?GMuc}ߴѨ5cƌnjF֦MNÇjkرCm sܐϚEPeY^z[`Iwq?5c +[s̱~tܱcUUU5p^^***h4j% ּy󬚚sϵ/ mb1롇Onqk޼y֓O>yF^˲+VXSNuEY?U^^n?|o ZV]]5k,o^{Q3yp'#GXz5aٺ;N[8y&O|=zOӊbɓPI=NKL zCꫯ>M%7!kqdy*9vӟԚ5kǭYfY{i]wu7lYe}J]*9xqȑ#֞={[nŚ7o-!i>k-\ЪMfs=']?=js=֬Yk̙=c=z|GVСCֱcǬ9sXOzÇo}[ɓcZW\qsYh7nܨWVmmiX,vv Wwiֆ Nz_*?R~#{Z/9hG=ٳjkʔ)ֿ˿X{֮]k[UUU-˲|3/Ty<7x>'yP7V &Ye]6ds(v\9ݱcŬh4jqko109a„!?WEÝRzjkV]]d^.+Bu)f>;?hu'U7\?~z׬Ǐ[yf^n6:C4h{VCCu[eYG /ƖeYӦM;l:M$ W\?F3Izu+e=?4?RYo߾ao4-ZdYeM2Ū^ykƍCoN4:^-Z{il7,ٺ~*H] 9b]uUC3Ѩ:kSN#n$;/%\-[d ===o׮]?~<6l؀H$hgd׮]8sO^:`K+۰d|v, عs'݋ӧt,ez;?n&梥rKvZ7DGGDvG4'#sbqEN?Rpettt̙3~?vak >,F<~*[q=Dze .<=7x#{1X6m/ŋqN$Gӱi&u]X`iu] o++W?Qg)++Cmm-{{W^/9r x9w1B"dggKF""RD Ρ9re/UW]ɓ'رcO~ &x{Upс=7f͚R}߫WX& 7,''PSS矖_"VXc娩;3ॗ^Bkk+/^{駟Ƒ#GN;vEEM>""/8q_א/pWcʕ|Ǐdz>'8xY㫮+GyW_}5 _O-ROy䑓jllD]]暴# 6+ݻQYYӧoeV\/| |hnnƃ>EwI+of|k_LDDD4:===7wy'."XDDDD1C!"'D"8pn}(((@GGn&dee p?7|;X|9W^^;o{#wORZZ]w݅|+9-oAAy|[ªUՅR;wu͛Xf Z;vc755aʕgwFDDNX ,@kk+*++ob͚5O4 с믿~;M3g;wċ/z YYY ó>;;v[ou^^>OC2]qx'} O?4ƌ^z ;v@nn.z{{|Q[[k_yǮ]pر!e}x 8-+X `"nKX$GX$GX$GX$GX$GX$)]]]뮻rJlذhjj5\s=߷zjqxWm6sҥKF{uŰ ?`'xi&`ԩ~ χs=HR*}k׮C,]@Vc=g}?Oߢ{.bdeea޽8r[zzzLX$GX$GX$GX$GX$GX$)\hBv$R?8> ++ شiz{{xG0f̘~DQ~tuu+SOaH$={6: /կ qn@uu5~mvmo`…0c zf===pfOU""""""""""""""""""Xx1^я~?~ߟs=hii޽{ m݆}C8|0V^͛7uo[tuu~m<8p`Ŋx3@v$+I$H$H$H$H$H$ UO~G?{gO|#A<JIbh!{6mڄ~8t;h.$""J.$""""""""""""""knn>-%_t"""""""""""""""""""=.$""""""""""""""""""r!.$""""""""""""""""""r!M]۶a7ر#mYNgox4mh҆ʊ}ڊMon<߿cgj杞 ֙Nzeh9,J竪뭷 Ft i|Uuuw{ߛ[Y: S' m<{{+翿O8;k][bƳfI륗VZZGho@e%g <߻`˖-ikގv`֭ؼۻxֳۖמjϞLSΛΩWgw{O4YkO~ @b׏g 3xA873xAbΚ jwVOi0dvh9l7hokdv>ml7S'8qG6jw睇NFjw>Gjwmh6Srw,POHjwvGjw)MG{TNDjw)3g}4nL?P8S::Ydvlډ)SwJJJD޵m.ZcS֦ ឞX_Z 51ႌ.pu׉66:O2 PO~NԧuBc5DepAxmۆ?qcQ]9oV\$rlӺ|91k<dtAŵ"Ǧ>-WΟj WMȱϤ 0stG3 PKEM}Z::1slG"]#_[+Xu-fΚHF_>O477#a̙'_9mۺlHg坨c_'ߧf96I̛:̜;6cSDT1|5sƉ$|U>oO§X"rlꓘ4 UqL5.@:vm= gp8{m fp͋C gpD_.t=?@.8:v^?.t=~@.81aǒ?.tKi N$Ky :v'*P\(P\,:vp9 IDATϿ0dpMMװ]npc[Q[]vdwL45vH]0lp 0ڊzk% nܿ;`?v&Z]0np'"^WvdwL$Zc`v& qvhmA vhiAG.wDK ⵬?v6"^# nܿ;`Sb"u(0l%{5RL<MjDo6#(^OzQ^Sx5%ĺh/aӔƤUT8M6ml؀RLGSUJBS8s[UT'} l9ͫ^V(&45b95(.t'>P-ńWv|?V>_׋sr`Wx'~Vt)&wMC&cXr^t [/,6 $&q(zCJ,|ϒ`Xl[='BUGbu(d&8+-MzI$څv[/jlɓ1Eh&b*WJ*8kxkkxk$OLqSPT1yŒ^z;wTUU slh7?'}4;xэgg<b84׆I(*LPG4&7Xׯdz=gOqӦsQYrŁ7?`wWǸԁ2/gɩ$_4&/xaϫ @e8g,Էw"͈L~S[|1%;gq_/vILF}S "Qz} )J>7 ~$/ő$Py,P9`WMKeEp@BDJk&=/E0/<9{/ 9(/FZ-Ndfa_(8Kls8`7_[7H, pMr qONiзn8o_Y̏Xi0"8o!p"Z]8Pv{ 7&y~{O,6"8BapnFΖk >Dq6|ZFZX7#M|I?56??Ja.73kg}JFZX75=7kc({o^,8| 8n#"#և~#_?'7QۻxI5  8n5M^#/ ÿ'7kgU`8x`' (|8HzX~4F?d+Vx,6"8!Њ"3/u37_nA_&-lqϿK,S] ǎ+<+OaEpPpA N"8YZgN"8rp-3ù ,S] [$y2`~r}6:NEpd#/NtT>_GGxϋ9i?Y8]yJtvOy>n/2e O~ϥLOpǫc>g|W(f /~{QG}ƝYTJ?Ep@i}~.Nm\"E%()PT =)-EQ9z&br).AQ$#i(a="DBY(sBdE( A*0M'ٍNA𑜡% >BPBi[@ n|Dv* Gd`qdEBS0V$$a$#&b=$Gb'dL÷n'?DvKr4>CI$''?DDDDDDDDDDDDDDDDDDDj@5; ܺHi6I$d(G:);$-0ɝ|>tR$;$-/$GcMO $֦hr=_k24 &!Z#(xm Mh~![ZMur4 s#UKh"o/&OHGQ05i!FD#UKh@tjnn@1N4 %E*1ot_<.!K#(Z#UbG#(hHGH$o:-Pd] %Crr-$w lFr@mtRX f{k KG FtR뽵WV&Ĥ#´:0-<"""""""""""""""""""@p.A $@J3<X `r@ytRf;4#tP:)KG ӻ hhHaZ0$G3ہ5wwtR؎HG ضM:)l{Ha9#Aۏ@ cIG xG:)gn#º#º@ {W:)=#gn_H|`MUt@v)o@@M,oYnH$(!#9Haz^tR_Oo $` `+ho-'wE shFzLDDDDDDDDDDDDDDDDDDB\HbdH>Dr I2|O O =.\0.$"܁#4$G;»y4*F[Br$~H$H sY$or Ha~=$$ɗ$G Kr\%99!-)@ KG EKJ#x%IRɉsGreHacy%9cʤ#D9#9hT:)lL$g _HИ2)-)r2.:w$A:HiC6InrGrAr#¸ I|>0Iw$IZ._H#9M&""""""""""""""""""r!,k6/Ay&AL׫JGP{l{stݶI *_ב#;W:-3KGe&35btwKGPHGenK۲et麺?8]:K#ټwtqb6o?(Ayb6>*AyZlꑎ<-PT2/,**@) 䈗KJG'}m`q1-zt+5rZiW\s@A:BrFv,..@)aiW\\"Rd+q=`q)nEq _Yt+*-|t+khuҮ/޻G j궀#yAx G@:)P03nLHazGr-$MS:)L7Ha&J"$H#rhFe"""""""""""""""""""@JY ;1x#9HlB ZH^I IG Z`{x0;_AtR_phF_xGȅRfpdP:)̐@J3|HQC?Gr#<0@ Ha"^I$G$G shFw G18IHEO1 hT}Dr I2|O O =IG ss#)I/I/xI//_:)L39Lr4=/G)3r$IsFrt&Az>'I#9~ I?@ !0.$I|.'9Z_/ qp X]\Caur k{ls'>\K;֟{xqB7=8bPtg[w?IGHgzo@Ë;C B`khz_wGH\H)&潽M~HNЃ{Ε@ 3KG tRRH@ u/ /)@ Ha00-`NL) THNBr$u#fsGrHaHtRQ$G# T:) I IL:)IG iuHaZ ߖ]=JIP0$'~!94; ;@ytRf InHaQ(#&JV\,发@ 9Gr4Þ0]uW}Ha@ ;wtR؁{Y$qCtR##z@ }_:)W:)lCHa@ wtRÜ&9{9a%HNU$''IPH$9#9?I y%9<$?H$H$4#9p rcdGrlLlL0,@ 衐tRnD#t]@ A+(@ KrͰgw)%o HatRPpGBHb=#IG uTAr~tR_Ehy\Jr0Hf3]e"""""""""""""""""""@JR!9$qcdsGrt>Nt>N0[ntR_g LI/I/xI//_:)L39Lr4ݞգ9lGr @9T#9:[ =$Ge$ JG tR$_>-/ry8Grr49 9fO_H$?dIb$Ib$Ib$Ib$IbM| I^H.8T#9$霨 A C9Ha$lIr|>tR$;$-/$GcMgUw}O:)l{Ǥ##$?{?%^}JG tRؾ}#;|X:)lHa{@ ׸j $(Ӥ#¸I 9L#9AGsJG E˥#ŒzM:)̈D#@tR/)@ Ha00-P`g2(2!9 @9#9Z@A:)(@HaQ*$_$WV&Ĥ#´:0-og;^kXeHaHa#ZqGrZs/ytRؤ #š#&^)7O:),ѹD:),1#HaI차*G,$g jlGrH$' f0 2˥#0%)Ha~_:)_n0D#ъ#´1HaZ!Hfׁw\ iDCrH$ p@dHG ftR^I IG FD:)Lu0_ w%90$G+ _qgR:%p5 ( lBr 4a)?r6?X$GHG yyHa~ݾHD#a `+h.'9Z-?\ugy{#>*<2vGW]Z߷$GWݐ 9 :Z=`ٜTJ}gsRQ,O}{{{mNB*UצٜTRz޽{mNB*Og9 (VW{}b)cGlNB*J3_Uuj/׸j @2!99a `d-hH4$HkHa\0nJG 0IEa0_^tRfrh}/G#2r# @9L#9z6$G sY$or Ha~=$$ɗ$G Kr\%99!.$""""""""""""""""""0:T:%{|hItJB[DKJ#Ptl4DKYN9nz|WV!]cyu2(G:ƔIG$(N{f4@I|>S믓Lo8/ǔLKi9LxE9s2Mow< )\GΖiHa.=9[p\0htRQIG tR($G׽̿H:)KG Z#´ #´@ϻ˔T %Br$){9[0?@ D#Œr.$9z8,flOOr$"10N:)L WTT(ԼLQ!'*)*S~NŬ?2?2? KG]q ϩWS%_X\\,tHGarϹ~tTr{o;A_KS`l^TSic#خzHs[i`:)o]6'!MЖ4QC4[M@i 흝z:SYN*TӦHGSMuO*N#dL{{t:_IGȘ)Sxuw4|uO6M:B )ts-WS:849!us49*- y¦:'{r64;nxf;֟s۰:Gp\sHXv^q9HG8v=P!!xs]WG!t"s_<.!X+jq?*/qlZc8Hm)s9+ۍ2'2G# 7R`ʜ`Sjk#dHm)s7R`\#0R`(q#Qrm)s- 0eL:Bƍ2IGȸShu2n69Z7kz;sPorYx#9ftJG Rp9rY̜;]:)lHa3gL3sLx%938Bffs8GrO\Ro5Z@R(@XUt $ [?0l 1[8Q\:X N Ī#Tx,V#Ft ~_:8N/WdU b"XΠ发 9W@4 6$mI$&IlL$ 0Ib`6$mI$&IlL$ 0Ib`u8r $Ə@;@b$ @' 1?iF & ( LhOZ@`$%%Lhn<, &1?iz;@bDC!bZ#(O7"$ u]:DktJ܁sE@:Imj4@ Ͽ8"Mp0iBtPL qtA-ͼJ3|َ'O_KҌBu-?izH4=#ALK+oH#ii,Ay~HNTm mJ{m4-fο]<'M ;4c0xo ! x[GҐjjc64o~[( f69  cDŽҐjjܳJC pρwҐjjܳ{PRPm{JC pwwPRPmJC 𻽽BiH5C~w!4ϔC~/^K3r]c`Y} ``i* 4ç0K3 ,]'+:6-͕ meuu[`l,M拨 6|auwX//_:(j? ,Mwjkj#(QVKGP'Kq֟(Xt[@?IzZ֟$=WKGPT{`N:tQ8O_IG+IZJ嫽?YZH/_Dijױ$_Q9/ j_HVT@¦O@O,I +dHR8?H$)GL~ A?#I?d9zipy1+2q/IPo@.3G:tL3e](CY3ۙ]w4M˾U4M,VYK?@:LĒ.,w4MK~J:~[`ŋKP瓎 4M,Jjh&^st eiXxc(K˂9,Ec-˥c(Kq%8MrtRؒ<%-@ [?%˖KG -ttReˤ#/D:) I.T:)e?EK82M:H8ro0μ\Llyj{p2ɼed /7۰f^p\<8zOe gD"m3OTHGp 2OU!<"<_<.1X+j*/lyZ sؑP_>B:'d!`N'9Y0rad)Tmߐ   @ʷ=U_>tOu7?N tOg#AB?ß ×ݟ|S~)!@v6YXgdgΆ|S~曥xBp\jk(/QR0 G"o{6e(`-ٻ?6n^t-JVDAu`Q2:(; WQ,*kYZy7YnҴI~ϧMrsI|s<'B̿=_k4m M[Uz7+4kf!д]#4mm~k;4 h&|~ߪe|M ͂4 MoM[D-Фys_*u%yKx7ivhڬ 63&6m&MѤ/[ ҥKnWhڴ)6m&M4ibeRl<M8$MqPK4lV.nWhFڡq+cA 4@#??_*ueWxm2((:o#Vh2ZU/ݡQX?4jFmB(8( w~>oU2M njF7Q34jfFZQ]uE{h.}&:V3OS U\v{ZoZRn]Z}Z>52\սO.P'}2?-rU|&:V3OSeVrUZLt@gܧ&@v}Zhz#ٹ2Gѹ%`>}{MUqݻun>XO_}jL7XO_7&W\sK}2߯EUe.ݯsK}..ַ!:a>}EDDzNU>sK} 6Vֹ%`>}G@I-}jo?WsK} ?rJ߆褾Us'HeͫV XeͫFj_=WkU%`վ[6תqUo]ؼj_Xeͫe˪}.l^/0,Xeͫ'GWx2UCBΪ}.l^?0Wx2Un$j_Wka}.l^yǎgվz[6<,Wx2U݈EVwu`}caONsGnWI/}GNI/}̓/}̓/}̓/}̓/}̓/}̓/}̓/}̓/}̓/}̓/}̓/}̓/}̓/}̓/=Uc##nU"¢nU"I5{UehfjW?;Uefj UcbR֛}L^2zW}K]Xo1{՗񯽪}L^2zW}K]Uo1{՛S}+٫>.7{U5uq9^rYJb'&F7.K.KIJB SZRS ߍdV-s9^rYߍdV~xe:҅}/,5=}=/,@5/ %{:>5?,RR3Jxe))).OMr䲔tr&xeɝ:&ݔxe6供"or2CF&p}͒s9^r!5 ,(3)-]cV)5ߙ=f>KcVMjեtlcV-fYRFf6%jեt{U.edfbY Q]jե ۷U.ggY Q]J©?4=f>K8e̪}Tҳq>f>K8Y5(..v/w%V=Ū}^%<2Na>/wį%<2JNj8ugUXՏŪ~'V#=UHOGzbU?XՏĪ~'V#=UHOGzbU?yM%""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@L$""""""""""""""""""@.\wG8q͛7׻'Gzb'Gzb'Gzb'ĉhxeA>y`^'Gzb'Gzb'Gzb'yh( ڵkw[G0H7?#=1HO?#=1HO?#=1HO?PHDDDDDDDDDDDDDDDDDD䁘HDDDDDDDDDDDDDDDDDD䁘HDDDDDDDDDDDDDDDDDD䁘H>ܹsѣ rWbܸqz7|Եkא;"66VէOStԩ޷y@Qkj`aa!;vNJJJеk5ԩS@TTTCADӧNҥK8rHMhAK{UÆ 36wطoG:ӧOЩ(;v,^~e?\u=`9rwyG{wj۶->s}=y8<0a&Ltny=S;?g۳>us=ze8aԩtw5{駟̙31sLTVVjXh㌈n߷ɓ5%ƺ+P^eؼ IDATV4h6mڠ]vvҪU+|5nm\T?]v /^M 4hkBCCѹsg=4i@lذ⮻rxT9۟6lZjUQ EwވAnn.~mTTTN8coFBBw5kh>Ƶk0k,t iii[ŋ߿?sa˖-HOOGpp0n6>^u JtLldggcʔ)N ^ _EDD`#998y$?"99}5 _}}ڴiHOOGN+hn;i?"G5N֪yuv,_۶m1qDL:SNջ9:o:N8pIo:t9f͚SNz7TG Xǰwlo}+1rH9mTɓ'ݾ_㲕SNEjj* 1b/ۛuԾѣG#22?,S--ώ  z뭚馛pwԛTkr/ ܹ˖-C>}Jm 2dʼnNDp7#'',y']:?l*~u ٳ' }]Ӿ._{ yyyD.]xb7°o>TVV"%%v 1R`\U;vD<#G">>Į]nwDDDhZСC;v, E͚5ժO=zht>)ဈ~.|SD>b˖-Vݾ};ƌ tC ;wbbbUV_~{n}i~^g>YZr%._EoߎW^yK,믿x#a̘1//`ҤI4icL<'|m۶a(--?KBQ< Bff&ydee>3@QQՉ3fҥKظq#6n܈/o[7qD?~pq?~FLL // ._{vVZhڴwHMML6 ƍN-O.k~z3IIIիkӧO#666mйsg_'NDrr2_ZO˵g5jRSS?6ϟGǎ7bԨQG~mK2T9';_ݻsOXܹc^C\\ _X_uw?MDTy:n8#))b?ZZh_SϷXbm۶!44d+?<,"OЧODGG#''=L./ruLyy9f͚!C %%;vİa,枳Mo^l;wرcD 6 }˗/#))I󸠰zi^VsGGybUXX#Gcǎ4hJKK].鿴Z/^D\\gϞ5ucǢcǎxW0yd$''#==~i'} NW_}køz*>#5_v4}GYY.\BL0SLmQ9?'ZV\\,("K~ݲe$!!A>#ٱc|ᇒ ȥKL},6m!CȐ!C,w5)**EQŋr[VV&[nEQd?I>sdÆ Ο?/ϗ͛7W^P}>|X>0=o>#G}MqqT;wJhh(R/22"`ݻ[=fEEϲdQf*++%//O}QٻwlٲE?(2iҤWw^m8p$$$H~?͛7ˊ+dС.[n^rZ.\ O?KttO?-.\.??_E`9|ݻWƌ# ҩS'yW-?y<) 2h Y`͛-UEm&ӦMIHH˙3g!!!믿ǎKZZdddɓ(ݻWG5d+[/tY֬Y#ŲzjΖٳg<~_,Oe޽h"IJJv$44TO.Ǐ˛o)!!!b v("{ŋ͛eԨQrmYOkjV)"'Oxҹsgٿd<߭͛'={J)//<8pduIIIIq[l~~Zj3gxeڊ7JHH1B~myWwޢ(tbǏ͛EQy'$!!A~a={L05?uEQ䮻KEQի,X@K׊""ׯ08q]V֮]+'N0Y~>g\\̘1C.\(vtE*++]jj=zgyFN>-/^+VHΝ%$$b;u<ݹsgeϞ=2o}Zx ˳G x@Kog`Yvj9XBeڴitR1cii>ϧ"q:z%11Q{19sL0AN8f+ZyN:w9~6ZΌ/(2{lyEQ:tl޼YOn171]7|#""/\U׮]Mqރ*U97q5={HLLɔ)S,[YY)ǎ3W^-{{ʾ}իv@U_矫οT5_v4uYk׮U;gGgs>q;}of/;ƌc/s*gr*++e…2tPINNpȐ|P;`Mbqk1!"2jzMza0d`ݱZ b 6HllTTTX=~BO's z>&N(={4=VT۷ojuj|_goԩS9rDEDW^2k,ٹs\|Y8LNN,_f$++K֮]+K,LxNM8j˗/}GONNcN@y [׽{w>}s.]AI=KMv9pc;2 [QE#"sNDDi[gu&/r͜9Sw5=>|=Ү&9{k/322^ʹs礢BΜ9c|o7Z-3g4=+#FtQERRR$>>^nVQEƏ_oꂣ@{ >ͯw:ֻwo?9Rz!zjS3 ?7lsee$$$Haa{쑾}ZƳ gݾ r9~;wNN8Qmҷo_紌 t"s̱x߼y9s\ݻwÇZkLCk(L1Sǎ?X"##eСߛޣރ3Uk׮IAAɓ?^xA$33tp׮]f5JQyfsrrE2ڧ^eGZ矝y\}?ʙ)S(2zhY`YlLC$""B(SLs̙3SN2p@̙3xb:K!Ɯ+n(h=㘻{宻ݻw˥K䧟~O<)f9y2 w&V+**tL <쳲n:)**'Oڵk5jȒdrEKKKe?{Ř>gqIٳ_.w(" .{W_nzO?`VcǎÇ[LF͎ي?-:(l:7Wϟv#Kuٽ{})";v|lgm~}zhﳩWkΝ;M+++OIM_As^_nݺUF!III,!!!+˖-ު}%&&FDpW?MǿiRRR*-V8] U595ɓ.Ȋ+L"""lQvkkZ;Oj_{dĈr9ɑ.]Ȏ;dĉ??}d\Ţ(=ZY3×4ٳC?EQV;ti}嗒P"J\\y*"ΝEQS s걝kuϙÙEHBB\6Zf͙񇯟'm,X '|b~*?ls&\e3gΔj;vHxxp}o%Lx UVܗ8+`JIkxmOնa],3"vQ}6lhlӧׯĉ͛#00v۷ǘ1ck7q}YEE~ߙ]hܸ1-Z⡇B>}tq{@>}~j7ncQyy9V^{-Zxe˖6m w?jcڵ>}:L7j*Fj0a5jdz]lk׮Ŕ)SдiS7ɓ-V۶mѢE Oo۶ -Z@6m:f6mЬY3lٲڶ!!!xqj_}SJusmwy'Ə$ >:u3<L:iii:u*uX$&&ŋX~=a0s1f$%%wpw?tP"&&999m۴iRRR…~͛7GNNv͛駟6={6LN:Zn L:~MhSN?틑#GbhԨn֚'( 4?mqƵ$S^z(".׼{i7j͛oGq}ټ?** #ܽ?_ϣ[nO=JKK1|]ڥOڵ+7n ={Vv;oJKKMϝ8qۥu~=k|'ѣnV|g(,,h?_qnӦ m6EEEEׂZY / >ŋc׮]صk-ZTmܹs1j(4ob;L0\ Ϋؚ.//j嫜?j|o6?믿+?jnȐ!h߾={=s"_yyyHIIqz5_|tt35nXn$}93Ϡ]vի뇴4t~3f 1Bsٽ6KSgxxb |1b233,<SN=eofZ|֭oIIIv׮]]ե>#INN˗KqqJZZZLbWNZU-WVV& R ,cZ,=S&e֭Ǵ7|S-ԩS-QQQ%52LYW\T cGYǎ*\tI^z%SteeIII5j6<Òbu)c5\g-;f%%%(?~yG/-챵OGDzѣGmʕ+ԯcZ^zIPN8!VjKLjϧO.)))? CL-\P"""wޑȞ={dҤI2l0vs9\kj/0j˓3gV{~Æ ;Xݗ}+mיknݺK/Txf͒\M{Դ::N_*"N.^(G3fH~~… M}aLL3ZUwӾNK@kD#GE ֞Sǹ]v5Zׯ_y'e޽a޽("Ν3mu"}~m'k׮͛7K\\Xh=_q^[x IOOŋˮ]d͚5r]wIzzzUDij ,ٴiu֙*Y]>{AURVVVꖣqAeekfkVֱyOk|U{+Wxo-hhmŋEQS%%]eeދznOyO=OoܸQEVe*[W8گ–X`y^ꖧ?;wg%{ϝ7R/cƌZOL%""BM&k׮۷˗_~)8-m#}\z1%W\1m7l0 0bH^^DGGK޽孷޲89sTJ?**J.]${PQERRR P;۷DEE-"O>l^tIbbb}j2[l|o];ׯ("yqj{e&L +VW_}U+V۵k(q!DΝ;Mϙ*++H6o,K,EQdͲyf駟,J'[oU>sٻwlܸQ~a)((p}vm-R?y$%%I׮]ߗ7 IDATʒ%KGZ]~]"##eV߳yfVQ'wu[>*w'Ihhl۶k?#;:f1KyѣDEEIwީZ2y%++KeѲaQRten=z?/{c!Htt\xQH%22R:w,SL'OZ>ų g#|wǎV ?)nV)((sG}$_$55UBCCޓSNWQQ!r7ܳgDDDѣeʕvZy$55Utbqsˣ>* Ȝ9sL/i9nee;:f/AK|ݶmHxxiKMjhm}EE$''+++$ NΞ=+111D-4ϓ.\x_*""#G,T!z_~E-r u{yR_.ϟӧK߾}nFsW$^tI 'm֞ҥ,^ڶ/_gۣm/ uᅲp=o&qqq/0Jzzb SGxiEQ$44T9lj'LU 8I:uJ,IJJcOjG_/44T6mT;zǤk׮!2rHYp͛Cdվߋ/m&hF-C 6H^ΙN]ob… u t^%y/k7tPӤnBB?ѩul"Æ INNÇˊ+,6MW{gS5epp,ZHN<).;v쐳gJll$&&Jyy׊[l#FHrrmٲb3gΘ&۷o+W&a~%pٲeV__p("O>+|QZtYY3 YfYޙ\j?x<#GKH_"QQQ'O̙3u---ŕ+Wo";;ѵv,oK|M68x`=:tZUm۶Ł5GX>|X>۵k3g:3f:t(pQ|^ׯ_|h׮ 44]vѯ_?}􁿿?~|ر#ׯ_ǪUVB˖-ѡC/^ڵ?Ο?5k֠t,۷L: Bnn.z `ݺuhժ`ܹx衇\+-iWImz7:u¢EnCiާ?kT=޽{MbN`۴n>ۧ8:Tc?1g̘k׮hD5rE}p|'՞_lgǎ|e˖V֞kРƎcZk֬o .w܁S[_x3???~qr~{eO<`߬Y0gV lٲwqBUÆ ٳMϞ=_|_59#11CE߾}Ѹqcg+W 11 ao V?}ڷoPYYLuV۷ 0rx 86m)?!))  Qpw~K/9ݞf͚a> DDDDDDDDDD Xzz:8w35ԻDDDDDDDDDDDDDDDDDDD<&y &yFz%%%՞?[sY̙3n_qqmsssPi7I' cTII J[snǜ޹ Dh8㯦v{ܺ3NjǏj6g_BhX[ ՞?[s77ߩn_㚷흏 Vn^s{91^Т翾}تBy)8GiI).\7Νuoq׭g7+-)ks98yn=z!007(--ksbMsx挛'Oin99 @hH[JKKqgN\u㯦JmN5VZRZ'?>G^GH85UZZ+_w?|?7?k֭'*5N(>DF+--A?|C_Ү];]o`ӥ ;;HNNֻ9.9u#-^}/\c{:C7g#>!)?WX9g.tF|b<x/bu93d@VNO'$!95]D{i6VPc{:C.ĎHNKջ9.=^_=t\o`ʕ deeq[oM\sY]TƟ+|e|] ݐե:"9%MD{m|n.tIqq@\l,nKkVRc{8dfvB\\, z7%P`.t]z k.:v!+z-~o.t D\8xs['V~˱=]Bb&23sϮx嗱t9KEf7+l^.t ] qqaH۷o=۱}vdp DGG:Fz7cm+BѶ"dpRn#h!?W} 10,& cYP 'WmE>`L !-1qΡQ`ొE_~  CFccYP"Ტɀaqq0df":.5ЁW`@XXǿNjˊ~(B7⯳aQa0F^Ǎ(q#c2`Xd )C:x;Ŏ{BB`HLDTd$j۹s/v4_bbBCC`0$!**5jU;]߮`L !-Q1Q`ڽa7vo  Cqڴk"@z7޹wn`L VԨl ؽac2`ht4 /jӮ=Uw~;`L qꀺ&{ɀj5EoHCMT)zCu@j2J)zCu@d@`P< jP\OjB{zt#aH1rm1&û0LFXL8 X.Mz7 aL !-' nӮMyjB<baH۴OojB<`9П8o< -OojB<̃aQa0|b6m&{ݘ CJO,ܦukԄ#).a!!0$&rS?`!' f?5!CaHyCjB,@BnBCa0rmZۘf`Q| 3 !' nӎԄ0&FGÐ`\prZέ#oWRXyr傓Stny;5uX.oɀX.lзqdRRR[r`CXd5r`Td5\.ؐj 8b\!vL$̗ NII'#̗ 6 oIzo'̗ 6d Izv9'̗ 63P0|OT$/l0R0_.F^I2 I' zꀤ?ׯ_H3_.8K@ۇDu@ҟr ~CDu@Lԙr ~Du@ҟr ~CDu@ҟr ] vku@&@LLmE%`ulҥ*++FlDm|Mk*ğkg-lNb[i8>mnqA5skj/5ՁǗ/Jk۴ z`Khhu_oySqa-@~۪ml6~jN Y 7knu&7|ef_(}[_ğݷVxٛ语$8-wa3!^"\%O#q̈́8{pG>玼6%¹7 |Րěm&K$89w6ig3!^"[gy6Gpg;m&K$89wd3!^"\$s0 IG0l]6^"ߒb3!^"\$1fBDZI#yTi腮]  a"8As3fMq&y]3h1+"$8qKL4*Fc\Yh6Ywh즗z< E-owz} Λ/eΕ S\6m IDAThAPpi)u.XuqC¥EDﭦF&Lh`1YR:'hzVE.'~~nН,4*cX[oOV)CwBfC% >[m8ic pˇ_4'_&P SC:Feĉir݀?RF2N8)I_m(2K)rMMi 'RR>^&MjNc4HV6JY*ןO-M; BCwTֿ/՗Ks4FʤIt>􃒒 cy_B(u# HYP:Ÿ%-s= H'gBvpz0qG_hf׀H]@:§R ;g&pf+{npȿlk_:K;Z{jcF:_;㔆CȸGC1n}fN_pFݰٵv8 ~S;c'l7[w5,og^*Ў :p;;imK{VAP:%9%A?zS0V;aQ\b'- FR??rƍaX𧠌fOnA@Ŝ" [@0UP:rşB8nPQ0@ k0,8iG0,X|*4|_F8 ==n~vs(܄'7'V?h J )4*)N*0  KCC"e999!bn.#X/s`1X;Xql=&7wFb&N)TB(Byf&g=հ=A 4#('q )H;Xu97'w.@M h # "N@hEzWDAWLAWD!x@W=/"PTg(44y|S;ccvjcܑ_ֿlZv8ͳ]!;kc ߸߹Gq./[8y!g};vطIe ;گ ׁh>ֿa_Ɏ{C@5,}>/6= `17׾kn9Cr@|v=0+c&!{iV } Yd JO#%B%-si9jCl@_,8*ov9ۀCu;y\zRz܂  ?NiX;aC[aؐa/8k-Q@0g#(H9O(|>ì*Ў`p ? 8HiA >D R778#?N =NX`1-,8\28yAG_h `O0@3X;"@ C M۵C$37KְڶgmQ "n~v*ۣDFib[! "nYv*mۦ_6p ,v"YmV >zbmݺE;[pQv lb vɖCYK;\n%BpXN}?=yd`f`[CŚ,|L`拖k574kjh4I3k5mktvXܹ!bfkEFC#X/s`1X;Xdk@d7wx?8P%8Pv%v)BSHAO 8B[\,f`d7'wx/@ hu0DXP4QMX(D ֣)4#?qEn,z MN=HM|:AMt&:BShx匿CŪǓSUOAOUA;XV;XavXUUvXUB;XR;X2z@OUUT;XN;X??rrrC\A[=nb`1X;X]>U;X䄹\=N^v4BChEcX(T:OɞI(&w,=nav;H;X̙P,_hr?/ MA7Z;lQMe|o-;C,C"GC{=`zAA[wi[!bov[;hz|sv{8Bo[M9!bNiX;X̭h1Q\'w?$ M0x *Ў6+f E? ǍDNIrsׁr?pJJ$`vr$$xO_8h0N9_8a7opN^ƍ ޞ*w? bq"Tlc9E(x qLP(_;a7?#vcǑ/AS#MM+q=?q˴Cov[V,MA,F>T>fP?%{j|@$-#A p=?qKC\@;X)- `Ob&N)T@"(Byft&g'pA(&wS=N!i1|z $7+PU@qMB(@( p!b4KA1CF,6zc?=fv2`28B@2?Cn_,hz^yv+;}@;Xl!b&g߶jq_&wk%`^~S;Xm۴C^z/A@c4#?q En,2z%zXg!~`hb04 {j|@$%''G;Xͥ.sˋCSC~MNKuiA)T JJ}}b@5nA-?㖒Th9a`1",F@hrFqz\ M0rP/Bf(0j|@$`v[B@qƍ `[z4#>g$@hrGP=N!=N>0R=nq7'7=dF4u0| ,((Q,P^yvHBP; xE#Yܼ`| h@CPGq'/<+ \D A?D0O<\vdPzu_ @QrrrC`v_?.s"˧j= sz2`1V?h j?Cxv`P0'ưBQ4mO޽{C=ui`% {tb%DDwk`%^;uvVr&^DvVr&hhTu 4a""]8h٣8"4pcρC7Z; 럊ʞ=C""ATDDt*5`k(\zRz܂ `14,VDCM(.AKha&:BS(L>_h hGP!@C?h"&?h")z¬PAM4ìX^`hrs=N =NX`1,8\&8yAG_hb04 ="@ C(҄PFBhqFLAA_,xCܲR`1'@a& )4(("tCS0mO 1 M=n~vh9!b&:BOA*qM<`3:B \YE; ) xM?_; vL3C`6_\; -.!dnAe37?>G; MlРoRѤI_6 I3kqnvJOqҩ!`(/l;W; eTICPB/ɊgϞ4GB$ vU'? n;VE}iq<Ҫ69?͑` n;V5LH~4G8^׿{4G}pU4Gip5ɝ{ ͑` ȀUT$u=U{L~wJs$H;VF,tR`K?,t_YUVzg999!WDe+77DDb/[6!`nb+.p˃6x]>U;c^DorYq.d-'L;+q9kYxviYlv^`w_sV/JY]; X*y5aRa/, W/ =YxvTdaR=Ea@AV̝;W; ""s?He#:=FXKo~;[XBF=cv;֎O]H; PBFN5HjsCܰ99Fn~v1g,0;"gȒ? 0ov1{l06 gRY;̞Me%'Af{S]]`K`x/ZQ/_Mv[PBFTGkCҰvQ]܊v7;0XDd|x0gT\K!`NWUiرsVaHu l QYʎJ0PvQ,B=g1`hb 041 M&Cc1`hb 041 M&Cc5""!8tiܢc`6ֿlXSi8cCȘVpĎ""-Ӧj8h1--?-#ED[dG6p'ϞICq9455iPD];'ThI 6ijc6"{)!8Pv7xvoY'/YnK޽;C ƖH""C/ȿLsFdV:+C ,ZNw=Hi1] EBƴNz}$C -+!cZ[?fM߶ %2)g֞oρ E'מ)C3C ƞOm_T:mo>eOB봡8f=6;;f(Ϟ3.lږ :e(ą Yf 041 M&Cc1`hb 041 M&Cc1`dUc1`hb 041 M&Cc1`hb 041 M&% kkkC@/999!dT6zqs%"g&gWנzqKCȨh}v CȨh_6qJCȨhG6qDV:/4XD$Z[zqs;&DkjC@/v~"hrͲ?s&{F:vI4UBydT*Fy-8i}yvŶ@& b/8_]ɷi^B bvev[sm?MlS7diV iGY\2vU`GO<Ų@?gQv-Y&daҥKÀ<ϓ,y,aRɒUWkKjKy'K\; X9 wێ X fm>ֿJA֚={~vؓ@lfisͨ2;?'"2{sB$s߀#k8!X䟶\/JisK-οZTh:ZҰvjkY԰gk@5C3*k/ϥQZDd|Uvֳwguv-?5! T(_ubfv`hb 041 M&Cc1`hb 041 M&Cc1v@f`-!b-m2evXK[vX˴!b--?4Oik4I;XI;X];Xzh5& .lcTe`v@Mn#DDZOeXSk`5`vZOU[b`qcCPCd呴kC[`?MNmSxXG_6O#EDZq*xNc)Td5B!#PF KVu`]Έ^Ҏ1\1z2T1XAcue!b .ؽe .'@{c 6 +4+1.d c Yf 041 M&Cc1`hb 041 M&Cc1`άߜSFc3+6uedHh18ʈ\h18=Qh18bqɈc pf{ .Q;^9}άX?qdĈc pf9亅(#YN^ٱ?Kd7N9},ןYD08b]G"L ;ze & 08TD8c pFSKac-ee"K` pM=rEܱic?}vp|-''ϗH>h 1}X$N5Xcmx_l >$'-w+N+nɱsr)t-$dۮ[XQ〉/7Dbq1u?Cۣ-4,nIO{q++@Ol UuSi2"θRLbqXn:ٶmv8溮8su?]'v' ;:+4-p)pw#ɶνW&N^yEk8aqs %Hȯ~%۶nל ^qٺuv8 B t7=OFx\Oa_TBE=$T)(P(Ol o-]'e-va)QǾGl ȖШc_ 拄B1~cեSW\,|>bc7lJPiOa_뼿.fZ~ZuoLn>Fӵ/ӵ¾,!0V}u=](>-Sɺ^}BaiikurvYw׾u=oL*봃b}Ms}æE֭#3P> Osk)7>]}çyJmad>]z¾aMmMA6hzu US7ܚȆhzu 9eno4 w׾o45ʆ?#{TM/Y(AE>9wa]D\zѵOOA; ڧ'Z_ޅ}tmtUG>=Ѩ^}t3zѵOON; ڧ'ZSwVFk#ѻ}zvk[}ҵOM4jg/]D,Ϳޅ}tS[¾,7|QM&Wkx?WT°kxE! ;W}/](x_GQtEL>?Gkxҵ?x}Ͽ]o .]*w%y,>Pk_o䨑jx'K>y_ߥJBuYٳ8dɪe%,ˈjpbzֿ eCIh}#*{p)bÉIbu3sCb>eيZXq_qYb<Ajҥ*7@9ck+Vȃ⾺:Zf>:x50cڇD9}H$mڇD9}H$cڇD9}H$_!tkI`!tkI`!t^kI`!kH`!tk I[[[ʏ]G>(d))?.^׫}Hy2eyR{[ӯ}Hy2eE䦔.WG>g;CoGSz[^ܯ}Hy2嫟Sz|j>!Uɔ)'C]&8'+kRe L6MI@!ӦΘ*G9""tCM?Mе7ub9@!ӦΟ#ݷZDڇk_P̱@!#"tCM5US=G>dZisE^J>dZ{|!ZM>dZy"O#"tCk_ڇ km)"}ȰyD/tCG{B׾@uҞk4.-t탊}PQ|JTgUΣkTֈ}PQRsq}P)Y&t탊ⱕ"c?I>(E}QTԓtJdet T7NDѵ*",]"\T!" *(& ?h(& ?hX?hH?h(& kPݻcy)(("&?h"&?h"&?h"wyGkK-4DAM4DAM4DAM4TPP 9HDƎ ,UTTDA M4DAM4DAM4DAM49QQQQ5kh@Jtvv }Q)//rzkٳGfϞ}2/m۶e ꒺:o us,h`[\jjjR~l*_GJy7Á򩢢Bx㍴޶mGM Xn*Ǐh4c2SOIEE !]NdFv_뭬9&ȡCdܹa$t!O_lb|'NEZ*)=vR^^>|x9rD9r2/1c?0&ԿO8k׊1F:ΰ?<E]$> U_-444ȷm1{w 'T ;Vxr4-[|]\2uTyGgp^W{!3NdNÕv,7xxݭÞ={dΜ9 wa_/9R}Ѥ %$ 7Z"]^w5ɧ?錼^qqlܸ1#` )?^;TB_ E_y]IuNÙ8NRAwAyWoԨQ.QFtߡd>7o^SY"*++RJKKS~q}dNo~SDD˕A&曲k.w#{P($'Ou{=ٻwvA:߿_/ȼy󤦦FfΜ)w}IЌ35~3YhʬYkSO=ߧ?>1ioo'ʊ+lذA,_|ˤIdժU.`[A_"3FRc}aD{ꩧ_SO_-ɟ,lyf袋9|yy̘19NwvvJ]]3ϔ:萗^z}1D,X !O=TIyyTUU+"2yd)//ӧ$:?C|Ç_~,rK~r-Ȃ N,X rtww;(//z(~>_'N.r!Go<,^XeŊ~$cNYf9K_wd#bJeĉ|G iii6ϗx{)//<IWɞ礒^IN$GYr 7Hkk̚5K~e„ ra9t444h>3RQQ!555gϞ>#g- `#"=ݛc68|K{{|'x_܉d>C `%z_DO~,ӦMK/TnzRy7YbLOɓU֬Y#cǎ!L8o.3eD̎;oSYYiW_}ռ榛n2桇^3H̘1<_6zihh0cq|+_17h|c3w6{nDQ /cy衇Luukڵk_o&L`"ټysJaD{asϙZnݺuXg6wuYriii1զ|5oրϵdD:{Luu4o1'wM$1bڶmihh0HDQc1oygʹi̷~ڵkͪUL{{0a0̡CN1X͟?|+_1۶m3{5=1csdӟL$1 .4w}ٴi Ͳe9S}g6ol~ӟ>Ƿ_TWWo=~+bhO&W^ytww;w۷o7hOJT̙3V]]]6пO6-~{$1>k̬YLccK|T֧TG7|l޼D"ay޽{OGag1W\q9sinn6_|_:S=?7& mXwe.23m4bV^mySSSc***R ʿTۢE=c~ߛ+V+V{d^|wב#G/e2{5H|[2?яL$1+W46m2_̌3M>_Sn'}@Ø*d/4ɞ%ɜ`x4664/;?d׿d׍d=iﭷ2\rI|]}}nF IDAT3snsws9477j3}tsWۻpꫯZSYYioSO=մכ0ӧO7?y޽|_6 ,0f_rx `*++K/dZ3{l3azj;I,va~򓟘zʼko6555}ckʕ+ƍ5\c\O>tP~ׁ1Ƙהܹsc=fq3w\DY׿Ưֻoݺu0[l1?2e[1lܸL2߿c_m_܉d~>bֿZ~g5)AgOy_2 $vm0Luu?ms]w /Do38|_5ٰaYr3gN'07?яw]pBD̜9sW_534sٴiy衇ʕ+Muuy %er3oF=:t<}֦-[M6 xNe1&X3͛SO=e.RD??ѣGs=ga[W/{D"s5v9묳L$1gq;E]'R릡{;4wqYre|o[1&c_wwwb?Ϧr~/e3`Ν;nѨ3gND~ݦ<}nŋRcY|>9.rs\>}w7%K}Ğ/mgDo?_Ü9s7~ͼy=-믿n"yw㷭X\r%f}nM48tww}C뮋g̙?azNyݣG)Sċjs%cz&Nh>g _MGG+7lnF3uT1sE"ou]cdoW^yY`A|җd/>R9{w{X|۸q7G߶pBsmc MwwٰaCd~.A6P_D"s%_OD"oD"fĉf+_jf͚~ϑzOɈD"}IJtf>np fΜ9v"ǻ۷{cno{53g4mmm檫2]w5kV A ?|c~iSSS3k&'<^d#b1:tD"ŝ?T+L{{yO/`H*9/4o:cσdwOgo}>c1v۠׾ZRY7]zPPouYfʕffڵ7HĜs9},_\}[n1O3qD~o߾}?yNW^y9s1_Ї>dZZZ}]f׿usw릭ʹů18p ĉͬY̗ese:jժq"EC?ikk3h4^p"m[n5Hܹk$Zb+kii16m |K,w=;0g6|ɼ/D"淿ٵkillz& Zp;5Xܽ%φ0}/~֠T'1XZo ,X`_mN0ȑ#6w1Hlݺ}>}k}n۷oY|?~/B~O czɅ ZAt,6mdl1=W?ͲeLccihh0k֬w^o}ˬZL:L0,[\y gnFs9瘉'iӦ.z=%̺3}:Ğ#Q 1=Ͽ??믿?c[Wrg"y嗍1=MƏ1>OO}S}L?~y/d. 9sK/dg?0JO}e4uuu)&GYw5; ڵA:em)SyN3as 7cz>5FͶmD}"{e+=z̘1L0ٳ|5)c0C@ŔJ6hO.ڵ˜yf`ix;pԘ{w*&o|-vꫯȜ駟6ijj2妢̝;<}q:Vl?kH|nw}&D֧TXL.CO 9Q=Tn u޷\IsLyl4Xƻεz;}@FUj :T_wG2^xaYјGkk됯?y_$1=1=~#cuO|fҥҥKͧ>~Ͻf͚>{{lO>ߚ5k>1+}g}ZL]  ={H$ҧ~߾}'O]]݀k̙3?onWb>O|"=KI&fTt"Yָ7PZoC{A'\+QΝ;>9S]]_5{nK/-zAcBbC5>gV^_yxϾz}qFj"}z5͛g͛PUL$B`d0յ'C@:t477~Wyͻk>l{]Wqb)b/RY*>7b~_˃T}Hd ɿڲeh,o~O0a}ѣM֙ @Bق"DmjRWm-mGkk[iEmVkU!V Z¾#ܿ?Œ I&0kfL&3W\s5j(qkcq7389&7Gٰa233[}Ne7_-Z'v@i/Nhs`q]ʋf׿թȸё*q2UqݻhڴiGx%Kt=V7oVff~돨}J9I ' Iʒx8##C˖-G߿0@ ,ٳJҗfRƑ{LÇtdǙ<8ɀԯ_?]Vcƌ$-R]]2339tg~3g]w%Iw/\;wԩS;\{4DS3:'1,c\}hu?LD}WkӦMz衇TZZ*IZ~f͚ۺw5Ĵ4p ݻwoqO1tPvmɓ'뭷Yg:}ܹsկ_?꣏>jv>Х^;wꦛnҜ9sԫW/I~gteꫯ1`0ܭ[K.Q}}>ܾ}~h…]@8x`4E;DҫW/=?I6msN?̙ӑ/%*'?<۷XQGڛ_s{Ñku`vv}_;CǒOsss?kۼy~z '5oǎ-׷o{ꪫկ~U_F>@ .ڵkK//Y]w2335e}Zj^z%z%Iwx# +W'?~_8u7/G}KlPm}@ ÇwfUTT1cCo6߿_oF A\r-Z.LW֢EKOOWffz!}+_ ?>Cs=8q\+W/}ho[}E]K/Tƍ~zhsBmn:|LL4O֮]]vSOm=z׋~W}k޽JRII٣AeM/~ ͛7Oׯ׭ުnݺSFFz={H٣>}h޽>KB222hzxbMk {OZZ-Z3flڴ)<~~D֭?UVǚO>YW^y>h;V@@?o=_{{_WߟhjFD;ueK>&IT~~fׁxR?O|HKKSqq~ki{N֭_~NPMMӕvқoQFQξ}裏c ?VZZӟT[lѷm]p>֭[7UTThkt-[oՇ~kVW]uU|Z`vܩ?_!Q{+Wx^GǞصk,Y w__ ;3F}z#_s-YĝtInذa3t=q#Gl}{%PC{/^8믿~,3<׿ul2Okgy }nh)զ[ :}wO=v7x5jT[y.++}o{egg{\YYrwyg8[y .egg+WZf͚o=\;餓C=]vE\~v֭n̙su;w ?~YYYnժU->?GtnEE8qbσ7jԨ--rqzƍnС.++ 6ر/w7ǻR=.++۴\ve/oksVy:thB>ch"WQQ )-ZP\yy۳g;p:uۚ%UEZʔ)[wϟ~9s_n̘1-ָ:;,9K{[nݾ}%O:$׿ׯIa#R9~nΝnݺub=m/ӧBw'o~jh#8Fq/۴i>|tEw?rrr\~~۰asιG}4\#UG? oo=Vǔ.,;vpW]u;cܤIc=沲Zn裏ѣG1cƸ{6p;ܤIСCUW]:ꫯvsu]n۷7ګ\VV֊,+O5'#-um/j5j*rJ?eee+W+WW^yueees;tv;c⚞3Ffrv{wWQF\w6K}Y/|= /lG}8qo{9?]ynn19xU4ߤIZ=ֵeeeN8M4?|mNsYYYnm~1['Hǫ?,K/^zɭXE68ƍ>OG}}nر.++=tdy7'g͚|IW[[{9կ~՝vi-5kִ:deeG}ܹ3]jmݑի]~~/sϹ^z].;;Eܑc_Ӭ>敊 IDAT'hvv-/ŋq\p+((p/?W]]ku Z;o߾ 6eee\f}vWPPಲ\^^[zuܹsȑ#ȑ#ݜ9sfVZv~,??D_ݝwynȑ͜9~n˖-~ ˖-sÆ jv&LOrss}Ѿ_w'}*pŽ}k$;v+  _ps@ZXXGv-jd \VV_ct?ݣ> \qq'nTH[܉'N:$tR/|wgk;rSgc>|{ꩧ=qdjo'رÝs9k#=޵wS⪫r{;x`ǿ$߰_$?KK/\.;;4{#F 6n>v@說Zܱc;%\29k%#"e`gYƸ)W rss/K,q3gtÇwSLq7pCxAaaao97l07aՅ'&z-ٳg׶xwBߣkM8 :ԕ}s8Q hKg),,tgyf3fL߻w/SD[ ݳm-7sO >}ӟv/>|kAь=6lwhmDnnn׭oQo0t]t{~~5;6wt\E?l> :_nӦMȕ??UV9sc9{wǫwz뭷d:ugOؾ}vޭo]w\t"͚5K?OԫW/tIӧ|>^x]~۷OK,$-YD Gm۶i咤K*##C3$Ms::oïO:-Mjʔ).H?կ/ Y8p@ׯ>Hr˭˂߿_9]p 5~x8p@sFlJ]q?t_^O?txU\\*+]cUqqq'9眣lI}̠A[[>~vi*//O?9>Oܿ^Ҏ;T]]{Mm۶-|=1M9R˖-[O78UTTXܑ~5AK,i[Gμ>O{B;DӦMӴiZ<ӯ;|plx[ƍC -saoZj-[`0ء:tx m۶M~[.e"effjQ?O ik~A4cϠAZG]G*L[?ֆ?#G}ǖ.]:s9edd 裏F|nuuu.(])4)W[[͛7___'OV=KC[jZtƃUUU;<}3ъ+4g? )1Рo~hҤIt'kϞ=;4k,Iҭުǭvyy{ݻWwu|I[:p5n8uY0ay5]Kt 7VΊ?=\o$??gy&0^ZUUUڿ$iKtR]|:pw_W&wd|x,X_|Q;wTqqf̘ٳg+333MtTkk'xB~^~e۷O4ґ<776}cnXBTii*͞=[TTTz`#H"^m޼Yyyyprٳg+ԩSo>I3cǎՆ pB͚5K'N￯ŋL[n7߬^5a]{JKK$[:uݫ=zhsիW/y睚>}zLh)َ9AmݺUԿ_R^+CgŋK/m6O>Y<@gW^O?]8vm~A-~lRK4z!OػᆱJڵKw 9uo :,Yօ^w}WS^^8 ͛7O{:`^l tЊ+K\={d+#~_~ᇒ.sN>IRVV~_k_ϟ[nEEEEӧy{~_jOS]}պu:xv-IuwwQEEnFtI1@ƺ $&avڥ{G;v޽{[oiҥ:ss5{k]im۵mK󿭛b6xmߏ0}ӔO{_#/[]]2dɛ/.-1ydW2XƪHeeAr:Ѕ,ݵPjw+).Qr,Xf]N.-1ydWR\ƿ _g,OT/M;ٕ?]&Rm]NT&JiTT\Z)[+UW?eɮLƍWQ.SP&JJJ4n83ukw+).ָG)wy)#Fkܸ?θ֟jww+\qOV1*Mw+-_{'c48t֝ eKL;j\y_'ݵ-&1TcǕXA)w|j体]y[Y`P1cݥjL;+ʱ* )83_JLW ~*XVkJj ` ([[VkkJj 2([[[ƿC_i ֮X+/^?]9E E,5580'@cUX8yu Ik5Zvɀ99y TX8NRffu IkڵZPQRAD+sK@yjݡ#F:$3;ۺUlj80gpY&*NR7RNkTFcQ|Lrr,:v]ɀ9WH4֭}]oDIrrrU,Sڐ\OUhj-80g( ɥE]+VΈ eVg7y? dHJC3H5]Pj8mLtJ͘MW'N6%(5N:w.K4]Mj5uԤ[ )@8|ꀁ@woZ0 ÷ HcC]phuLD]phu@ @V \F]phuq:HpvpvrCV÷ HpvVL#oZ0-=?۵VgKKOK YH=?&zLkƗs1qcu\qqcr?_kpƟ8ɀV7$?&"Z[pܸ?x.F#Z[pܸq?~<qci|9C:qc58nn1 0^Z[p\q⯵ǕkqǑ?]kWc++U>iVg'c!%Zz|__п.cIذQ/XihаIV_,kVMٽ[=z{ܹSdʗL65h՚U벿UZٽCc԰iVY.;4oCVT?fh[ZbZ ծ]{iiq}omܠ/Ԙ75lP_}YK?UVvvǿTFX{QC^,YJRqVXahРիWkɒ%W|Ѩa&^FK-ժCWаQ+gaV^%KL6nO-6yo4Z3Zښ5} O/``mڸAkVSKzsmvq^~EFM fkZקk_/oаQkVKUko~chWᇵg?Ӫכ=S~VҦW6ikg˴Uz7={ȟf?VDXhuHj]pYYж8O<-ve2Bs<]S#veA?WhutQmC XÒo\6XBVW?%vee#C X]]-veePQݤmLx sZ׍n]ph/ؕB,{RR?ok^*vZpyucn$ET+пn3ư2xAZժV5t_ėE65.dD$iƴ*,,`]KK$I3PaA!C5ݮ7u M .9~$iڧ>Elk]pI8IҴPap F5.q̴ip n\RL6MiSK4.xġӸ.ti|vqLtc3fK4.T4mƌCC|5.xġM6C]vIΝbJZ5SNUAq#"L<IqFP9$ȈFx y HK<| {IqF8Qse vqB7"8 /䴿D|NFkgF _8wďGQm~׷alk˃%%O2G2#{``@ď"k ߀~>-ILVR7''͏ddG~1狜] M$DG,#b8)mD"|~&I9α2#KRF?Nۧz񱗟ns#vjII%}NNNvrFFm@ Z~=G+.srr#۾6#I}rMt#_!_Jk"M}H'ENݙHG;40s:8DHvNv菐@ \t;rI3ssf9!$҉ 6'E7Ip'osB\pSۜi"\&KL"Mcbaܹm͝}nG3gv'?_sۜi"\\&sΝsV"McbnsBܑ;sLC,V"M$8xlnsBRH1"t@{s?Q\T2F4M,Xj5_ʂ'T +SѰ_wydёoQQʎc5^bc+RYbt***EL:p@GߌtytmjL TV InFDE*++c5^/AHYa"It vn`;+7U"I`bHduK@d0 5V@@+"YѶxJ+1PXɊ a]R 4G[6[ۼ;Z+r.!)pGl޼պyya[C[v.!K[$[?Hjlă.͵m&{#$K 4˷%i8кtFt b" &_J[#D K\%$OI[O b%X-%_zj\GL b"-7)F_aRN @˅3J HVۂ fe IDAT|~ i edXW/#~1$@A4 e=z[WOmnl KD`(=ݺx#9@2볮^֝ 8O?x,u.F`(^F`)3|C`?3Y񧱒!p%K,Csv,qKC4+n`]ߺtTAČGN HQ܀,?XMB b#RFQ 䓛k]AI'uGQt~HBLHtҭ+uc]<S ezZWOK-X efZW/#~%ݔza,mm]$7oml]$N`]$I= 0QWWg]</,mi]$緮D]F ɳ Xu/1x4QFu&I`bf_q'(.VR\b]<vJn]a|apC|u Con]<>.{aH,}@aIYW/c `bO dXWO%`%Cˈ,!L O2du 0K2sK@[WsY% ZXWsG[1i]<,s_Xζ.+9H$V`DR0*u 0K|~u 0%`%_X%D`?X`y@_u}+Ѧx?`][O il K23+?XcrS= @Wb<%&` e?&YW/ۺxm* ,uc@X%Cˈ,1 qd/Ql]<ĺxXI1?ݺDg]A\.tO %%e% ԾWRB;40T<ºDuqU|HQj%% ނuKpyK@$uqU<7v_cb 蘄lJEy9yQ=o-q^SPJЪ>`N^AT۲uG| AR|h?$D79ўm@F<_C.`(wxn_)`nn~T۲e[+AR| <Ė+E{e+31">#~uq3"w+ #.K;+UfZYe]UVVZ|b]T?&2Q>O7UX"ޕ%i %&Nh]<&NatB+ HI%5=R@I8qu hU´q5q"C*O.l]A0#!uK%iGFKG7 i Ą #*K{~~u |ay_[&+CZx` `I/1y%_X,&@u]D/)`<-hcKU/Npq4u]fPlz?Lj/<㎋qg #ú.3vD%@%%%%%%%%%%%%%%a%= 5Pbb$Xb`Xb`Xb`Xb`Xb.X%, 0, 0, +,?oI % K1R"T4 Ta0TtBKµqE`  &m,Iw%寸غ4n]A*(..My+~/9 wt#?X"O X+R4oMxLxݽ5o 8K, _Zͺ.E_b/x+~/9 7ijeu(ϧSˀG5º xWX_Y|.TY1ź xTWa\kʅ_.5e,2Q>OSN.4WM7Y}º x󖄛(IUfZYe]؈0/$ky7~/tAg]<,?/ߺxX~xsuf.]P9pa_Hk.a] lG7lu ͵L0_sލK]666666666666666D!a'JR0Xj]<,X.,e%ÂeK#KC K\1%Âee%?`Piyu r_!/' `=ju 0?X=nu /ݺS0T>=?[ ݞ%XE`hT9)SF3T"ּDy<g]efZW`jq?g wXX_oa`c6zX`mamamamb`kllؚ622+06Ƽ?g %-A%%%%%%_X, 0, 0,۰Km 9, pPw,)=׶6]{O8$azU7KeYHB DKl Klg51X::۶6]-n=nGٖ_W ]^_R"]56]l޼ƿG % k;?D_W%6˪kT__o]<& e]. ?t6Ru[v[6N?HX7MlK@mzXu6[ܺmӣ'v#-u?̈́~JuuIr=ɅCHhjY m\]\u]+ p5` {R$Y`c>6˗-V]Fr\Ɖ}qCHh˖>hc mzߑ!Dмyrs22t)B۰\WzxdqbUCStIIįC (5nƺ xT4e5ˬˀGKKƺ xTpXU?d]Ekjľ RS[wb&ꧬH`ľX ., fu`T\1b}}1,+eH`ľX Zlu iݛ<ĪX( SiyjHdMW mľ)-/U l[UB;v3/f_;8I1xXaAu 0?X*^d]XLaGbo:Uz>V!RM'jM'jM'VjG,[`>V3SP\`]h4!J%@?"D`ɟ.!X/iҬK=VKyeվdC D`HUFjڗ,ªiIRJj_Rgīy K]I1ijeu(ϧSˀG5º xWHoٺj_ƿfԅNVhNrLGbի:UˡRUSISe#=1HOe 0g2JP/g#=1HOe gmYxe +gM1HOezYe +gM0J AՔ)USlHOεk#m{{yY'q>smFw['q>sm❶f}dgggsA Ĺvmu \8aU8kٹ6BJN[3q>3❶fH.9 IDATidɹvmfC8kɹ3d2CaXYN$@XXi9FXhin9FX(?OXLG`@G,,%YXXQ /HOa?3}T£|Y|xYӨ|2HG]Yv 'Q9cU=*ٙ~'>wIt\Ft|!/o.xGzb'g0uGPtl^Qc˗9k ΚF`U=*t?HWL#"""VGzb銉W'鈉'WQ%@""""""""""""""""""J DDDDDDDDDDDDDDDDDDD*!&UBL$""""""""""""""""""HDDDDDDDDDDDDDDDDDDT 1b Q%@""""""""""""""""""J DDDDDDDDDDDDDDDDDDD/_ֻTM9ssՠjGzb'Gzb'Gzb'GzbΜ9W^ջTMs=`^'Gzb'Gzb'Gzb'{튢QFzׅ:u0H7?#=1HO?#=1HO?#=1HO?TC HDDDDDDDDDDDDDDDDDDT 1b Q%Tm/^:] ""*,z | """"*T^ׯ_ǐ!C&`0.:l8q_t)\\\Zi?̙xzz]"*Fzz:ˬ:u5~ &U"VZEfsTLR+۷`0`0iH߮]ꪶ.\(lnn.ڶm[׷B]sDTYFv^r[c^^^[uDők:t P6z}Si&xzz1|L4I}PPPԔb|AGrTt߯['d#G Czz:֬YSF5#-zҔءC,_"ܲS0 رcGߥK,_F~T==cXbN?nܸw54l%k 6Ē%Kʬ=y$:vj?[3< ׯ_wzprrĉ1i$L4 F999zWJ<_"##~j.,, wƮ]`4Wd7n:^YFS\_rmڴ)qaϹQ={`׮]ü[n'5j˗kN;woz;מ8PؿTu8 | D>ٹB}Gܷ0+*Tqݮ]w݅ȲKrrrB:uJPTF ԫWOjT:/"bbbwU4l%kNNNhڴi?''YYYe[g [PЮ];_~ekB<_Pn2=UNNNhРj͛K}Zji*wu;vʞs' 6\~wuvv\ڵkHMMcuD믿:|zB^_8|T{3M:T Gxx8V\@*Sӎv\r/[.GϦMlZōkNU#K2=֭ 6A/@W׬Ynݺ={,2+:v숐̞=[-wUKh׮<== Zŋ񁏏q={ğiU˗sEn0sL 44Ԣ{ŠA@[]$h=̝;CϞ=}v~ To該՗G}T:dܮ]PbV}y߿ isSNY|?PأGbС@ӦM1l0u;v .{%|}[{rz,++ ~~~pqql/lӧOKF|h֬"""_~~~V3̛7hժ6nhz`TܬY2lQyj,5J֭[cɒ%vs#009>͛g72o<5nܸ`x{{c@-n:CDiѢGzjt!-"hٲ%bbbXZ̙3'еkWsXbaokVuq`ѢEܹ3qơYf6g:+zg8d 88x]tA˖-^^^j_xwȚqYIc͛<ظq# \\\ТE L} k-ʔ4ތTM_vͪYqq䱿1;`֭:솕Aff&ꊷ~aaaj= ħ~j->`˖-xH9ÇJR.//}ѴiS_~68p}hpEre@DhDӦM_kI&ҥK-ޣKJJ {1XEaU7779rDs{̀Zh93>ܹsRʕ+]~mYd{/HJJZnΝ&<믲i&-...n:Ȝ9sDQ1c//Ȋ+*gf4e߾}?(Vj4e({' ,=zHttFҵkWҥrE}SΝ;'oҢE Yv;wNy2ercQEz)׿dժU2o<ٰaZҥKʶm$55U>3quul۷OE8Ypl۶MG/_.ˁd Xs˖-*;vLN>-SN +W>>Ү];:Pl ViAΝ[J||[/''GgW=SF?DQEΝ;eڴi#V<?#;[cEQ$((Hrss?ݻmVy9~}~⢎m{U-[Cѣ ҦM5k|(ҦMo1u>}JPy*?d.M6ˁ{(Y]'ٳGn1n~e߾}T8믿iӦ%Ç3gH6mx(~KMr(_lݺU,X (Ž6-=aͮ_ U,s\uWTe\VXmk׮-ZիW5|}!ƛ6lPG(ׯ_Ν;˯~&%EJk/+/sɯ*2gۿ*pFٻw("oVv*?.ǏOOOv횈h,...ˬY䣏>-Z(+]ĉҩS'y뭷dٲe$}6mX~e˖2f9z,^Xmޏvto;w^{M%$$Dlsܱfٚ`z6VЩSdjj3X=~ 2DBBBEٳgK"*'N*22jR1؊?u˔)Sdƌj?m6ywEܷСtʒ+WJ-, h_̛7OvRLSGuչsf`ttL>b9!`/Ç|F)]taY,}b *H`(2{l_%ٳgʭYFڶm+F* V/[l߰aZݐ3_dwE… K/IDDxyy7I 7}l+nnntb|Vջwoyg3zhرe`-X7 777RoQٳ.w}'Kxx={V姟~EQ$**Jƌ#)ꫯJ^I&r 1]yxxH޽7ߔٳg%00PFYQoQ_>|FH6mdV4ikj{I`r&M؞/ Çhk oΝ!o7BztQ'7xCz>XݻEy{۔o%QRVIhYfž>,]tHOk=[}yq#I2.2|W婧R_>\Njq,{Ǥgey CѣGEQٴi\tIZfյ1<`}Һu"Sך'.\EQ䯿>ڶmkҬY3/k-g'O/ʙ3gDQIKKxom۶m//"q8*OJVpiժL0A&L mڴ>ҥK?az`4k׮ҷo_ILL%KȀDQy衇,ʦDF-G(_\rErsseɒ%˓KװKQ\_ݱc޽*٭{l/m&i2fU^uyWm-=SGu/7 tUfok-gzqc=xh4l4+;vQl5gϞE1e ib[K5tP߿矒-w.kIۼivxA曘NrZWw* ZG &ݻwݻw+"{~3f~/ fޛ-]TʥTJ|po5ɶvҥKM5P]~oiݿ־<<<$((]**> jVҶ)߭~Vҧ-kZE*\ٺ~z]'J+ݻw_~^]ONư9IV`I3+jF;vȀ$88X\\\`0H۶mej!CȠAȑ#-v*YP߈ysbӋȐ!C,uYn?Vv[&M`5]^~"NU^ Z#{ۋus_ݻw}ԯ*>I*VmEbb3+<O϶f/իWk*o۶mb0$::-##CzKAׯEQm۶jĖ7[b|]Z… ڬUL%%oii_333K~Py0P%%Tx\e,ya𐌌 9}XݫwLj~ZǛ#G/RN*>Kʰa:w?+ico7::sJ$Y<죸rNRk-'bk}Y\!1''G?lڴIRSSի 8*OJVXҷo_2dH,waN>-??_^~eIHH(;x`ӧE%}y [lT%%^i7lٳgS֮]+gϞ__"g,=SGuչsK\*8//j[ڵ1p@<۝РA^P5ׯ_崺>.護ۑe˖<*{jݻ`׮]U6lh>ׯ_uRݱ~8`U`0XCVh_Æ q]wah׮}#//IIIXhjժeo~!??vZl Pƍ1{lŋhܸ1j׮r/ܷ$"޷߱:99ڵk>651cOG}/FڵoTDkr IDATޯ_?ƍ6G)?"""ӯYf8<^w}4Ca>S>}Æ ̙3Ѻukg>%EѣGHMM-mgzzz}X1c s=K.xlٲe฿jժ iذU?AO>A|||wLZ9s$ WZ믿={Zo}݇#Gk֬p$''[|G0Kj ڳg;w-_#Hwymڴֹsgx^u]xWոjժ6lhFf41eL8O<ƍ5kr]H_-h;C^@1ydӦML<?^zaڴiGQFz?fSoii_6lkƮ],[>]i|}>;sLECX111Xh.\xtjov3f1bg1(i޸qcիW*)<\s Qp,\AAAcǎ[n̙3ǏǴip5ԬYSV,-{PzFZvmyXt):wpY\~~>~W,^PZ0vXѣ/϶m0uTԮ]"K.aٲeʹWiܸ1 /ٳ'JU7{h=>Ϊ_>7n Zl;v?www8qrfK.xd4lrֶm[L<x'n9QF <39r$pYY/"Faq/.\ . 33j...6mv܉ `dLl5]zU6|pXr%Ґ[_MYf!55)))駟ꫯvvm2d}Y̛7[nW_}?ϟKKKCNNl< ׯ_p|~]w0]\4g<3 '|+V`ر.nݺw}guԱn<w_nsP=o<"y!,,Vo8̜95kĠApr=~urqFa= vDRRܹsO"00&MŠ+0i$C ͛]V7yyy .^ .X|7nܰY'裏bܸqسg;1cX܏o1eݺuѠA,Xٳѷo_|L4 m۶ի‰',O??bprr‰'/tڊA;99aĈEuϮ:o?-隬4c2ǎY_ :z(v؁vY۶m)OQm[+77fZ#[[vLQԮ]ǡCcȐ!x駭sa8r;?*CV|}}sٽ;3gٳѢE x{{# zŸ;{,rrrgsiKf*xmil|[oGypUdgg[6z_eĈصk̙{hyav57|#...2rHo_QEONak_~E֭['ZLcy@0a,]Tƍ'nnnR9tl۶M~gQEm&۶m}K>|XE+Wۮ_.{챘j%;wZMuN+j Լ<9stA}2sL勲mNa5%66V|}}͛7/ȪUDD!deeIjj:shhz|(͓vډ_ms˗K=$ @|}}C;Ç>-͕'Jf$((HqٰaJqӻV'Z.8va7nOOOٶm͟o۶MԸ)zcǎW>nMѺutt,\jyI͒? SQEu]v`wwwIOO%KNקUYQ\>rcǎYfj7n%44T/X 77WDQLEt]E___-[$..N]v2au9MZ# @hm۶M:t C֭[s"[lt͚5S/Һuk H1-m2gСx{{KoQvsssesn^߿Z⯴>1EQ,=::ZV^mUرcVe[nm7B){gm^^^Wf9߳j_%raquuEQiӦV-6o,]t///iժrQg֯_/=z___iݺ̜9b_ZCkkuDue ࢖4/׳g"(ڗU\!㏋,YcQQT 8PE'NX,??_"44Tg F bTR̆H```iҤ15鯤%KDߴ/EL1KllxzzJ-d̘1_Os-ҫW/Yp iҤZcǎV}`[KkViiK˞={ʳ>kZSЙ3g`0Xl+ii6j(ywDDdƌү_?s227+n̞'ӦM6mڈ4kLF){yU;p("K,lq%1WZ%FQu։`^xA-Z$s̑^z`h֭<2k,eԨQ*7HZZsˁw???ɱ8oG)v%-?[m߽{Q}((/_cǎ͛>OOOm~ ٷo> <޽{-m۶Z_*񗟟^{yyInn`͛7˅ GKhhh *龊eĈ6a-S=\CsΉ@(f͒\jjxxxEtAIHH&MH@@tUN*.]اrҿ ֭[ˌ3,ZyzzJffdff&{k׮e޽zjqqqwww?t萸(ZM{] CI#Ŷ'NHrrzذaҽ{wYYYңGy'm/܊{o11|۷o7]_*[/==]<==>eip?}v0`4iD4i"\feҼys~jgΜQWϟWoG}fm6f`k?^gʓO>)/Ҷ)Z¬,y5%>h)C*]Ut>V񗑑!ȅ TqOq)&9Ro;X=zʱcǬ{7ݩlGdN@IKm|(Ev[e%*E>g+WTm>0b6>>^Eٮ]l֍*+rUUee׻t ߕ+W...?ٳgCt"""-[5R볏?C#~~~.O=T9rD[bbbdr95Y< QZZz>;w 6Xϑy ]I ڵ u[VVKBBB,>y? ֥{`h# yP5kh4K/dKQY_S1;wnkV@'''  ׯcǎaڵ_|tb1MKiذ!RSSfis*cɒ%ʺaԩŖY p1_xW+XlZkȑXz5ڶm=zGʕ+d)7u~A'ZliQSN1bz{֭[777q;w.vVZ0-vZeVZN˾4^V ׯ_Ǒ9s uѻZTiO\$uy}+Znm_c OOO$&&QV-(,[W^Aǎ1h <jm%^{5$&&k׮xGcݺuعs'лw`I7zGrי 6XR*7x˛oݺƍC5X; sA>}0dEhhբR6l-[)S CZvZ;{z)[F¼yƨQrbشi^x̚5K].55/-*oU C]%r0ggg l޼gZ}j ?C`ѢEVۗ/_n{y>92On͍7{NBѩS'899!99\g :t@ƍ}{1<h֬1{l{Uo">>qqq!"Xzfڵøq㐒FaÆ سg`ܹxqw ݒL\v SNEm.MӹsZ-??:t(~g?ggR<0g={`РAx"жm[+j"U|%߹s[o] tCڵr/_ĉi&pwwGLL ^yԩSGA\\rsso6z)DDD ==_5u֭[ɓXr% |M$%%f͚FѣGDEE!==ǏHvT}|TƍHJJc5jOOO}+FU\egg?ĺupI}2dӦL<~:EEEaٲeV~fݻ#!!?0lقGy1`ʕxꩧ`4m]v`BeUOKVl2=5kDxx8ƍǛ&ҟ&''C~~CBBҥKڵC\\rrrpmaر>|86n܈ܸq5kѥK$qa˖-0 ȑ#ѯ_?_j=.\'lj'иqco߾ҥ j֬ϘVoyGiiih޼ SNE^xdm۶8z(7o۷#** nnn8~8vLϫ߰qF_|:u`&MΜ9 ?D:u駟f̘>/_Ƌ/ ֭֭['6lPtRm)S?]w݅;CZNN^~e5,11[nU_ۊYOOO$$$DO=VXoAAAprra0ttFBppc>,r8[WUrUYekFNo^zzWnAe?zlѣGѩS'bŊ:u*n݊\hosիWcС65899ᣏ>#<@˖-x_>bbb[o`0X?~<ۇƍ#::oW_zSNHHH@.]pw ))I/Cel5kf1y'1n8kDVq݋nݺY㏗U|Gze[M4QEUCE?'驪ŋM6#PU?ش$8qӧOǚ5k~ԪU !!!xg͞}goiӦ .\_0|p5IN:ؾ};j֬HdddN|gѣիWze1SO=e1 ̃>/ޏʉOD'''ԯ_NNNDZZNȩbG³9JiڿLִlQQ'驲T5v+ADDDDDDDDիW1{ldee!''GŚ5kп&QI&!//͛7׻:DDDDTYD4jԈVԘHDDDDDDDDddd`믿pwcǎœO>wՈٳqy;0`x{{Y=F?'ڵkv9ӧOVZxUQFGVg & :uұfDT14qssCRR Jѣ2e _:u*o?\zGǑEQO`лzDDDDTEըQvһDT0Exx8;w5DADDDDDDtj]"""""""""""""""""""*!&UBy+Wpe/\tq.fd8t5::TGd =s_کt::TGEǟۿ_FZCv1qQ^=Ɵ^[7ͱv1qP^]Pn߅*ub(Wrstv\޼scݪc9#i;ڿL[w 9)l?l\ފn;ߙth:uǭ2?v_{s:Q+rF{muև2_9nk{se{23?>g63a m:Jfff9şcg;>ifUӹsr IDATQF|)H~s.ǮFD6 Dpx)uI9bpS*GǺ;7(aazWTϐ<']]E"]4|Tꔊ7yg˱+;vѶ|֌)<z("Ě/1㓏,]]耈mP1ӉH^4EDL,|֌>G⥺CDtK )1/d.ǮCѲkwuJEj"W- h _`7a[3ɿ,ؕ_H$"-S?C/t9vef1c֌!9?J/(͢`/oi__͘:ɉu9vef&w \]<|2)獠0xrv"FRDʲLɀ?EDϏi`л VʚeHY )뇠x2jdPB)I; >h O_5raWZ)W"eJd@χV\xWZ)D7ZAaQciR$#eK2S2AaaiHaWZ)[g"ePljpQZ);w#end@67gԈWz) ed@)9;Fr󅓮UtRDoPOo?Qӻ VH_H$ n qv"M5f[Z)#evd@)|5WZ)w /(7OƟ^=H9xsOWF5ֻ VH9x)憠xzyUuM$HRaM*HGʲH|uU*S2`RaNLۄUav@(\0ʚ909ѴB\TɀɉX.ܤlƿL"\.ٻj+3m{֦6iK^-R*PS@S=ꑃT@( MRRʁjP(-/̐4[g-+gZ!""s-; ܰh8ˊs\püE""2+B_q s'/; 0TÊs\pÉKβ; 0MDD枾Ԋs\pôoYVt&u@]Њs\pC.#(Ts\pø,+B_q 㺯-XhEw@9.a4+A_q Mo9.cB+B_q McEDd1ܘ- Ƽ$P9Yox( k+""+ωܲ }Qō|u!F/LG5^DD* '`y~,ˍ%(;n?~?HF5?,>f>,~U^cscI^(/ctro{U"r}1_אK\eq8H}qc㾗oyYD>񟶆#$*ˢẺ}Ia+q)"E__htW|m^CeTE8s⬏%q8-nwOjw;oy^DY5T}LeyҘ-+%N 8ȏ+BqS9,wYq7NO MٲOĦh`~_yDz'%q'nsmGaT"PwhE1/)J0qc8yCZ!1Α_ű(^EϱwH.X*-#Ƶֿ8'1׿)A?} uqSY#n9qE81=nO_CcCTVFHX>4YR;?b?1Ώ92#q E/U7EpVGCEԂXp[[u .V!\J`Q b ll15zA\B-:fNZ.%EpNq ꘻ jA\B* E-U"8XcIXp[[u1/jA\7SWt|q RStt̋ZsKYl .v683jA\BL(jGIYgeԠa2vPF-ѻ Q2$+#drDIY*a dlO!MjkG0 J|¡QU2vH]AxIiG}24:Z;GP AJ}rW"chs9$D2 -\jdl}-z>) O*jje>`VRoXveA>tiԈj;> aA|2$oDS`82ER*T`,QqFئQ) ˊ31C$#dlSS A²RJ m(DE5fiE 8dj`bIs70 Y(rс* E> 3?( p E ;nܧ*훅v^Am?@zPKC@X}?ŠE}v(o~V ؾG;D[3r+ھA "h3,,ܾkGve[;dp2ء T J$/ GRp,[Q _F*bp,J 8ֿ U㿌pEE ֿ _(*fH(_fV/CAS_(q0<@;جL;، T`d(%(*]` E =AM4Ș[;wk0׾[iG ;m=@zFv+p[aܺW;D[ާr #H\~\ ׿;C@X}ضخ7x6pA:mgϰ֭gd٘;C@X翜xGO:cC P4avYx`<`#J9"gvY!}baIx _( jG~(ʲ.K#Pyv "Rd ݬhGbn ""ܣDD]TlޡDD$oV bmm'dY] ""AK-\󄠥/ `m޲M;dhGb?X0B;XQ;XrTvX:`ʑS9?詬z*YV;XF;Xz*^;XN;XjHdqvلf#ͪ#͆֎6+afPG ($4 b`vYPPE](""Ef|Z-q Ee|Z 9"gvY!RE9EA_(\E?;km<lq/ =l۸svFN?h]!bjGml|gvƷ#6 =zW;Xl-!b7,qFSt#͆WiG e `(*.׎6+ J#Y(lP=H;, Et@vY1 D 0ߌӎ`'2?pVTVlVZlV\lV`dPTfyP@dl"( E>,Bю6%) QĕkGс b`3OAEAQlE9t AfA_( rtEb ,hrE'PTEAQ^vYeSE /QM&?h p E~,,6T;X|vXYyvXY9/BSPzʆr=T6tvXzʆBOA/4AMee6S/LM!biG߱W;Xl7CֿG;Xlf`o,~v7^[?Cֿlj_vA,C@ dL 8fP[lE9`#͂Pd!1?(|8$@$fqvلf#ͪ#͆֎6+afPG ($4 b`vYPPE](JA?iD4iG%CȿPӨAJ ^AJjD pI)oF(֎ %8>=+e?3D!9|7C}eeO?e_D;$§ɿ i 2Dl6J;l(`̟!˵#͊8.AQ> "{vY|Z ׎6b":B_;Q   s2D)"?(r8"`|?( 4 ֎6 EAOG"CAS_(b0S/,*-ÍF #H҄H AleDQI!PMqD&)*)NKa$ȟKj;x8 &'Lz 9۽` #ALv)? <IۛHO;&{?5Xu{Rb ?5A_OO;%?5Y9Dr,$J˪QĔkG2'%ppEvY2D ` /EAvDAQ!)գ)(&ן#!N 8B`,U'"k/*r)ٵwvv 8]#TWDdn_ȮݜrYOMٵ>]wi`ThG Ҏ6J(* kGqE%fPKeҎ6 B׎6b":B@OjDAM4DAM4DAMCAM49=m^ 0E0JhGX#YД3X;l/E<`3?h p EFCSYvYivYqvY'PhGrE|JX@hʦPd" )+G;,(JKS@kGс b`3OAEAQlE9t AfA_( rtE~! b6,ZbyVüE! #N8>n}v߉yZϏiX #HioDK ZC@,>0ӂ>q|^0nv#X<_oX @rV9!Ͽu =n災 +'*G&gSQ#<۟@п| =HЯR>?>_jz=S l5 =n])5 ]{R ws'*zNNud"";wr" =nΝ)yeKC;i١,~!bKY})~ƇCڗAO鋵CӾzAOB?CM Ok_P;(D[\Y\Aʹ3քa#H9_ӎ X}_-|xN@΢?ю m[؝HeGۑHҗT c1`hb 041 M&Cc1`hb 041 M&S".Cc1`hb 041 M&Cc1Lhb 04AcQ!|ҪA;dVQ䟧Uݨ!'מ""u#9ǶS ,;9R;hGVu#Y<%ϲocBsiGVu#=%h[)Aˮs)A{FyN^;g9Ԗy-.=UYVEyjGVu1E䟧AyL^viEyL]nmW[dekN 쿞bY ?h vKymJWr\W.V; Xq]iR0`)u3Àו?,帮}?p\W>rvJےӴÀו ÀוSq]i[D; Xq\i[a0`)qm>@GWq Hj4\H! ̵H{2fY63;C@Xwv+p""KY<""K9| 3x3r #H%kwbcW6g kH"_Z.b]DDr3,&ByJGgdYxyFeEC]!& M4hb 041 MAM4d c=b"kG1Q;^;<T0#֎@c=?siG1Qh`}yua gX}R111` G~/`Ȳ{C}wE)'@sܶsB$ku>m=j#P:w^۶ jxvjZm]f<iB$+֎@M~*bbN>m[wSbԴq% -^Ns֝;"X""';+Db;߀iM!-gmgM+K EDZgm6?UV/6>mݺC!Y8m$VvjGhUC#"R]_O]u J#P˵yF Tװ Zְ?kG,?( 6wd 041 M&Cc1`hb 041 M&Cc1`;xPDiD`ISCŚ&MkԬ,2Y;Xi"4?ijf !bM?i =MYi=MxzXi8b.l ai6M; wHTOUT5OAU-EDLnESU9MWU~v'ʷ|p,,"(o4"k~׽R7`O5z@; յE qdͯûzu+ JӸfY(Dճk_ LӸ Qٵ/Xm qdͣûzv ߿M/Qqf^0J;= ڧA;= ڧn׳}jFY: ga]ԍga]X,k#Cѳ}jFZ,k,kkga]ԍtYG>5u= ڧߞ}tSc׳}jCѳ}jͿ}72-.aѵ/c! đ14tC)L>đ1tC)L>đ?!]Gj}-G>-u\Wt-k丮4-V$?9ay>!IJSrOѵIr\W~@d}O[G>$q]i:\mMCG-k丮4ͻVdѵIr\Wf/$ǀ8ѵIr\Wf]+"IѵIr\WNrѵIr\WMN9ѵIr\W&;hy>!IJS ?1۷}H|bO -k84@O[G>$+&pA_>!IH ?1ܡga]<#>4ϛ)Ov}A>Yҵi|)ҵivt}A>Y9"vҵiYȺ/ڇ4kn9AD6t}A>Ys4]f-}QKΈ+NkT85"M>pjEZN>pD6AS9B;NZdt g;С"Cҵ*e"CNIqT8"RN>p0AEdk8CDd]).kod֕ ?h(& ?h(& ?h(& ?h(F@( Q@ D @2d @(  ڹsv o-aR4DAM4DAM4DAM4oˠ}IQQv,P~~BAM4DAM4DAMР,U^^,FAM2( PSTTDA M4DAM4DAMt hG @2d>˖-ژO:xL:Uƌ#FJYptttH]]֮݀]dI?O?; wؾ}i\7`>s>|8rrr瞓uɾ}R\4w:th@^u]y9%~d͛7Kmm']vɉ'¨K^Xr}ڽ{9R*++瀽_,RQQ!#F8=ݻWx㍨˫~X***j@} RUU}o۶M;v!5jT…Yf|̳>+-ѣG˘1co?Ǡ~w^с'9 a-gUUU<&Kdك!k~eYzv@׿J]]TUUɛoo" IDAT2@yy?&#Gȑ#GR8#=cHK_<|G8p܏z>j\:;;)NN'ʟgy0ٲzs1 1O~Rf̘!?WyI?ZD<v풙3g&+뮓뮻N:;;c^Hdx{P,wٽvgx@iԨQo~S:;;zX2}Z @_r)Ș1cdrKgggB/o/'p=ZN:$y#{RWW'7x477ԩS{} r ' F%Ki&z}nAeOFn?x\2sL8q||+gϞ_򗥥E&O,7tSRDzl21btttѣdѢE 7ptuYbL6MM&+VI+'^'qz|ii<)^ևv)SHEE,\PDO?]VƏ/FM6'?I?~̟?c]:^#ɸqd̘1~',f͒F>m}k>\O.8,)**z͕ɓ'*<%eeeR^^ʀ*((Hm۶ɖ-[.qI]]&/k9:P d8p@W<N>[>},#,,k~V\\,O=v@38'ߗ^zlڴ阿]Q |A;_nM|Az\9׿/|A/D뮻СCsNYz\tEbŊ]w<3r{9Olݺٵk^Z;^Ͽ+W__^x/~!w}s""]6m$O>YF%,s8p@/ȍ7(v?[nEDb+O?<Ӳgτ?doJ]]1Yp<]rrr"q^+d׮]۾/ 7 O=Kr뭷#}}K/$K,0zhپ}{ǽrˤII:::!reҥ2a3ftttȺulذA>lillEz/e2ydg?+^xa&^s9GY>яʟ^Ezj9e̘1xbٽ{۷OƎ+UUUO9#~$եddI'߯k9SA̙#?#""ӦMj9e̘1|G9=z\2g9rducʈ#I&'1F^9SdĈ2gw9P&M$駟s%Kbw;e„ ""5"1 7+"RQQ!uuuvʤI"oٳG.yĉ'(=PRL<9߿?rigyYQQ!+WXO=SԩSeҤIr7Kmm444dk%sM0]]cdC^ ;hPȼ曽n{ԩS}^}U܌?כٳgy\(20s^7xqo{z~cc B}>}1Ƙf~w{=?c:;;M(23>~^ӦMf„ ~ş)ystuvvw& ɓ'O2z9rYjU;v0wuy̆ M7d޽{Sz1?#+O&z֭3Pȼ+l۶-;ywM}}y1lذB!3o<0K.5K.ݻwٺu BfÆ }OWюe};'l:;;͑#GٳSO=??ߴiSԟxxu]fҥL>,]ԬY㣭~-{=s '+VW_}<f̘1& G?TWWO}S7ygUW]e***O<yoaN9/}<#3gy9sL`GfܹfΜ9h|=_>Dߚ5kLEE9sʕ+_oOnByڵkMuu?ox O󦺺ڬ]6M6{΄B!}455.\wu梋.2o4ɫ}k{1 .43f8<4/y$cΝ̟?h_O8Ѽ[1V_"sǏ߫eӦMH8wyh_Nj?SDn_rioo|m6seI&G X̙3'r_HΝk.c1g}ikk3U9zg=󦮮Vů0p!3uTO|,Y֧o2xP("{={~O|L\≖o Bf͑۞{9S__ommҥ /S~̟?9rļ[f=t}qP(dnzC`:E˿Yfkmo:uYbE䶙3go}[}uיٳg= N:ɼQc Bo|)VN&O*BYz5kK}  n{~CL(2_;}L(2[l1f„ 淿m 93Ξql޼لB^6q>oZky7M(Z( yx L/F{\pP{֭[%\bZZZL}}5kVfرfݺuW_5P<3fǎfёul s4Z$obOțGCPM 6DѣͬYYgeL(co}TVVzO||k_3'L}}47pC?L(2s1ַƍ{Ν;M7d,Y-~ߘ:3qDOFn_n?n#8xY`1W\q5\)Ly>p*ܴiiii1&M2\sя~dbZZZ"ǎ> B /4?xygE -^<6.^5dc9Hxb߻k>s=\{}Yj*++)ܸqO~b̙gi}s]Ž9b~oфB!s-PS3g~ȇV\9V4W63f0'N4_ ̘1c̉'h*|Ԙ .L~WUU*f_ϼ {oBz殻2_|0:(ON;ͼ fǎЇ>doأ34{5?+*Wj>я7|޽۬Zʜzꩽ>7|9ͫj*ĺ;̧>)c1]v9skf^usP(d9p~xW\q?moo>O+"O3E/B5#G||r|o3{5cmڴՙlڴɌ5O%zwYgeonZ[[͌3K/d>ϛkM"~/~uw}Yt={v ֧o2^dzO2u]ȑ#fÆ fŊ}+8ptvv~ش|]?{E˿sךgylذ۷Ogm̿ۿ.=/%}Xn]{%_OOcǎ>wa7nq;v= ^z)fLPȼˑ]5Oՙq_=;YggwmBP.Gߛ=_/-.Z7?oIgOX=0o8Xk\`;<+{^x泟-bN?tsUW~|˱huK߰ʿ6SSSݻw|#& x_W#p;4]քB!3k֬>EZ駟ܾ`s'G޻w;{z]p}'V]uU& va3}t/~1ru]g*++{u7Ƙ^zԘ}sQƒdO||CwЇ>d>OFn?h>G^rek,+:.7Z?+zD &ϞG"~Hя~dBE? B/KۓYz ՙ|0fn̈́B>{M(2v["=߱QP,_<ҭטLR&}8z& o|} ^}q_sx$'pHs9G,rKKK\z饲dg>#""k׮˸qDDdܸq2n8/""^{\}2qDe̙2j(ijj={G?Q9DD__DD䬳/\&L ~ȍ7(˗/H=O~l29dر2w\W_}+ϗ>[-Z$ SO=5c˖-y扈8x/+R󥵵UNKN;4o+ɩ*<^Z-Zg~/9MD3ϔݻwȑ#[׿\W]uU$Xo==z\p2j(xNW;wTNN3Լy4~ܻ3ٺ"cy睧:K[liw3<#Iz'U\\s9GOe˖>$kժU:z?GyDO=v!IZbLИ@@[n|?X{b{${>Z?a>q4o<]tE5jT:h"]uUafRqq.\G"!vڽw2i$9% / ߯iӦlٲEƍtҤ@ u<ŋ;MMMO~g⋝[nS]],~.8Іꔖv 'wW8`Ybf' :>qݰaڵ?zⴴ8@贴D%] ` ʿÇ;O|ٴi"0]t|Yf__ 2YfMs,9r>|s;8uuuΰamuu#Gtz)gƍ… 뮻.2t8E?'8oK<}QmڴI{5k֬O<M>]#GO<x@^{.\/|X?֮] D{5sLڵKSLQFF,Ygz$:!lڴI$iÆ :p$iذa|kWz:kJ͛Cdgg"2vWǏ":.X@&Mwܡ;S#F!{|'%\"I*//%fffԶm4x`M81I/rqFꦛnիkFk׮՜9sԿ=U\\;#29~xu]7N]vyO7|~W unlCE>9^TT[9rHbgݺuѣΰa:}풒HXjɒ%ΐ!CHM69EEE k֬9a%ߊ+~;'?ҥKN9NKĉ;Yn ][k֬q3sv?NYY_)//w>SgΓO>L2WFjww;ÇwJo=㔕ul˖-ί~.;qo֩U/3m4[niwc=wy,[y7bkqޘKwބ=xvt픖:_|zz ͮN pfϞ?i-z:F%,^}{q~߶t_s8qy뭷^xCbQxOݻx| fIiǍ7Vo$鬳:N|Cȑ#?6oެul{vH?X"`hWTTL=s8qbGjΎmm 2D{ntj֭ڹsgUViƌ*++s=c~fΜ-[.coUVVr=3zjO… #鑺b98qN8VuuuݫI&O>ь3TZZ={hŊz7UUU_|Qkҥ:z$G^ԨQwp׫H۷o/K9ŋ+???ᆱK/TYYYڸq5zhݻW=&MtjX$'|_֏~#kzW>W:'%]ݻj*8qBRsϗ%txݻw_﯁jժUAOW~^}U577__OF+))ї.Fqt 7h*))~;ԧhXǨcǎiҥ3gA\s>l /k_Eߵk~kܹѝwީnMZ`q8p@_Wu 7HSOiܹ%\s9G|VXG_v8qBǏןg=裚9s-[V~a?!3O+B}^zN޻w}QڶmU^^믿^]vYdڵku5״{ϡӧGɱt=zW"[VWW{UNNN /8p`dعsjѢE~N;-_=ܣ,3F=H￿t]wu?g}VO>||I͝;i+-駟_X$O_cU__'|A͙3G˖->S>}}OW\qwss|AÇ 5eM>݂U)A 跿nݪ>LC ѸqtWEX=,.K,DK򯾾^of~JKK5k,͘1]ŋ[o\ڵkqƩEԯ_?ۿMuj۶m***RyynvUVVvy3hҥױc4e? H-l٢/XU__sGW_}٣F:$B!u{K=:/|c֭Ft߮o=i+W9͛ȖwXj^u͛7aTǬ\RvK/Ն  H V%I .Tu _?|lċ3` 7wqrС$߾>_˞>_+k ^k1<]0׎/?xa a3?.1xo_|%|EsL99UPP(t;Ra]_N::OEc>Z999\)cN^^ɋ/xf~cn(ʂU1bu8.Scت * #ziƆ&v5jʂe1:^I[`n>\cU,H҂gM^Fh*+cSJGi/<}5d`T-xY5\in 5v8Qւ>v`pƎ UTWo;v|h` |_z#c[`566A;64Wr6L;mִi6Z XPXTR:Og(//:jڼ^MK - ȿkڼYM7K -*(,P OouȿBW z /_o5AMmZ XPPԚ车ujjj?TPP ꏞ`jjjO[MMMjjj\PP ꏞc警B J%%Aƈ_zi6J -,((Ry2oz_$cA^rHY ŀ /IJpbn^ոh͚WM^!{~ VCoC/h"_xlfk#$2khh=mI*`wllxIR+F4.qJj]0D wgk\BR+F0.+Kj]0D wl\XRhG?$Z;LccdE466Jj]0D uZӯvcLcC wll\"vXZ `Ebu:k.68Km ~a$vJJJ]v7kԑH۵$NRk@uH.NIv`Lh]\0j]\0$N@r.8-IJJlk]p0ZS[{JJJ!:Ni?_$VZSPpv F}<779|Q~ϋ?c ]>VtVw7 91ǐ‹)(;3 z~Fb~/ʅno= { >cMu)EhNm^0z[h4.2é!:}^韺I?u~fh; vL|O'#b; 򱼼Q_7t_G;_^9 J<8 ;FJ H}8\%p?U9XJҲ:exG˞! {ZXki!`7lTeu0D-JX0y =e<{_H%$li\3\% | D@ F@OV>+Ӂst?u0(}nݨ:F%B,DddYGOK-g2Q2ɗo<rM5ݼ:H=!@i!Úwu#Exl<,5sK0A*\s"9y5(a#CFRpa  CC!Ø?;eف[ D@ F@OQMR@|qXɠ,сd%o<2 ϱVPTl<:xXAAuBv?`,Z+(f<?X*(g+M.,Q|qޠF2K,@ (`[#,QwuvY۱mu;[۱}u۩?`gm!vlg;;(ahٱ`\5 ؂?+ z2_op+IDATuUFuqob~`?Xϳ1˰ ywn/ SN^]#&iX1@ n$/,Q|qޠXإp:| D@ F@oPQ؂ ?`<yE=謳C4A! ;?X4v ʷ K,1|`6u[C5mla,1KD/,q%?;2#ʰFK$_u4N5b,Xʴb%ou4.Sp*p!{l St  (`h<Su C@TWpHUpa,Q`#/ ;`:xX08:D5: +C@T)q"a?һ Msb:C HE1w`GΥw;#tD((5$8t.%ʄHui^|cEtD((q[P1׿xF1/⯠ WKʺnڕ!꯰VW_o  l|>NT3: xWͤ˭ÀG|~\B>O50F(.USu(ϧ)aB6BWcKT="Й!I\h:$ CT]RDHjvCUW_f:5:h:0_TE!SD.H4ȿT_b$KEECC@ HsC@REB1NQQu,ek%%%%%%%%%%%_,#Cyd `I*a:FI*F _I!ȿTv?X*/[4zo$EG%7 ѣ>o߾$E/"`cgCo%GPSYY}')xQe儨S~Xd@t;/REBu;vGR5-Jl [l KlK, +, K, 0, 0, 0, 0Rn`IPVFuIElA(I%!?X*)!RKʕ UR/xC%%%!JJ!$oZA? }\uC@;}H*/Ր@Do-'R ? Y?XXvXvREB1}>jjY T0Q>O5ÀG|>LU3r0Q>_5PS%ʿKÀG|~/نY`zb8%H?)[a[v`ȿ@?X"Rw`!@)*::剄+*b"YVl Kl Kl Kl Kl Kl Kl Kl Kl Kl Kl Kl ](I#FZ+a<:xK`%_X"`:xXy9Ny9/씗[ Rz`1!x[Fu?kN*GFY˰Te%g+˃dg?VY9:˷?k^?? t6ּmeZ`mamamy}e`[^?v L mL #;ywq4nZԗ jKRfԷL{NYZqmnncUhQK H*tvm~knܼnh psGѸ]B %o$(4%)# v`SТ>B мDRsZopmw7Gi 0?$[m9ْI 7%} $G҂۽ v`S^wB5H9S\ )7sD6w'K}].+;/3OzI,mW'u/oB o>um`X'؆;:}}9 ]\ ׯ\Q Ztu/@RN.4)t!+DwgN.ja_xq߽ntimbدklܝ>:}}#|iG%҃+zu+6*Kh=VFV럮't5_x"܇D))-FpBIWv:y,(%%^ݎ7@"yTPRRb<$h*^ -Hnۧ?ͻTHz\meo}(=~mca_I[/g]ܗ>̿,K9p !$@},KE~u v1_6ga_a%HUS;M::tѵ/?MBo֡Ġ}>'vu(ϧI m#6,s;ϯIK:bJ ڗ?>_5LC׾CnTsIuP]b<IY'="ϧ)>%]u?c)r]i"2RA|)P,I} 2 Dmڇa5,|~׋기O}[޷1 :ϯ1 :SyEu ;>_啽 :Z(zYtX׷Sy9?_uۛmg¾A ulwL F;¾窫Oc$j}H$m}HѣCE?!*GUh5}HѝtC0%*+/tCrUVm]\SYٛ`Hz$i]`7!|>u0nHH᮲ i, t@t/ 5?u%0? oD@?.@\ p!B,X b .@\PXڵko<%?X"`%?X"`%vڥ<0DMwPIENDB`vedo-2023.4.6/docs/documentation.md000066400000000000000000000246021444463326400170460ustar00rootroot00000000000000 [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://en.wikipedia.org/wiki/MIT_License) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/vedo/badges/version.svg)](https://anaconda.org/conda-forge/vedo) [![Ubuntu 23.04 package](https://repology.org/badge/version-for-repo/ubuntu_23_04/vedo.svg)](https://repology.org/project/vedo/versions) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.5842090.svg)](https://doi.org/10.5281/zenodo.5842090) ![](https://user-images.githubusercontent.com/32848391/46815773-dc919500-cd7b-11e8-8e80-8b83f760a303.png) A python module for scientific analysis of 3D objects and point clouds based on [VTK](https://www.vtk.org/) and [numpy](http://www.numpy.org/). Check out the [GitHub repository here](https://github.com/marcomusy/vedo). ## Install and Test ```bash pip install vedo # Or, install the latest development version: pip install -U git+https://github.com/marcomusy/vedo.git ``` Then ```python import vedo vedo.Cone().show(axes=1).close() ``` ![](https://vedo.embl.es/images/feats/cone.png) ## Command Line Interface The library includes a **C**ommand **L**ine **I**nterface. Type for example in your terminal: ```bash vedo --help vedo https://vedo.embl.es/examples/data/panther.stl.gz ``` ![](https://vedo.embl.es/images/feats/vedo_cli_panther.png) Pressing `h` will then show a number of options to interact with your 3D scene: ============================================================ | Press: i print info about selected object | | I print the RGB color under the mouse | | y show the pipeline for this object as a graph | | <--> use arrows to reduce/increase opacity | | w/s toggle wireframe/surface style | | p/P change point size of vertices | | l toggle edges visibility | | x toggle mesh visibility | | X invoke a cutter widget tool | | 1-3 change mesh color | | 4 use data array as colors, if present | | 5-6 change background color(s) | | 09+- (on keypad) or +/- to cycle axes style | | k cycle available lighting styles | | K cycle available shading styles | | A toggle anti-aliasing | | D toggle depth-peeling (for transparencies) | | o/O add/remove light to scene and rotate it | | n show surface mesh normals | | a toggle interaction to Actor Mode | | j toggle interaction to Joystick Mode | | U toggle perspective/parallel projection | | r reset camera position | | R reset camera orientation to orthogonal view | | . fly camera towards last clicked point | | C print current camera settings | | S save a screenshot | | E/F export 3D scene to numpy file or X3D | | q return control to python script | | Esc abort execution and exit python kernel | |------------------------------------------------------------| | Mouse: Left-click rotate scene / pick actors | | Middle-click pan scene | | Right-click zoom scene in or out | | Cntrl-click rotate scene | |------------------------------------------------------------| | Check out the documentation at: https://vedo.embl.es | ============================================================ ## Export your 3D scene to file You can export it to a vedo file, which is actually a normal `numpy` file by pressing `E` in your 3D scene, the you can interact with it normally using for example the key bindings shown above. Another way is to export to a template html web page by pressing `F` using `x3d` backend. You can also export it programmatically in `k3d` from a jupyter notebook. ## File format conversion You can convert on the fly a file (or multiple files) to a different format with ```bash vedo --convert bunny.obj --to ply ``` ### Some useful bash aliases ```bash alias vr='vedo --run ' # to search and run examples by name alias vs='vedo -i --search ' # to search for a string in examples alias ve='vedo --eog ' # to view single and multiple images ``` ## Running in a Jupyter Notebook To use in jupyter notebooks use the syntax `vedo.settings.default_backend= '...' ` the supported backend for visualization are: - `2d`, the default a static image is generated. - `vtk`, in this case a normal graphics rendering window will pop up. - [k3d](https://github.com/K3D-tools/K3D-jupyter) use with `pip install k3d` - [ipyvtklink](https://github.com/Kitware/ipyvtklink) (allows interaction with the scene). - [trame](https://www.kitware.com/trame-visual-analytics-everywhere/) Check for more examples in [repository](https://github.com/marcomusy/vedo/tree/master/examples/notebooks). ### Running on Google Colab Start your notebook with: ```python import vedo vedo.settings.init_colab() ``` Then test it with: ```python import vedo print("vedo", vedo.__version__) sphere = vedo.Sphere().linewidth(1) plt = vedo.Plotter() plt += sphere plt.show(axes=1, viewup='z', zoom=1.5) ``` ## Running on a Server - Install `libgl1-mesa` and `xvfb` on your server: ```bash sudo apt install libgl1-mesa-glx libgl1-mesa-dev xvfb pip install vedo ``` - Execute on startup: ```bash set -x export DISPLAY=:99.0 which Xvfb Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & sleep 3 set +x exec "$@" ``` - You can save the above code above as `/etc/rc.local` and use `chmod +x` to make it executable. It may throw an error during startup. Then test it with, e.g.: ```python import vedo plt = vedo.Plotter(offscreen=True, size=(500,500)) plt.show(vedo.Cube()).screenshot('mycube.png').close() ``` ## Running in a Docker container You need to set everything up for offscreen rendering: there are two main ingredients - `vedo` should be set to render in offscreen mode - guest OS in the docker container needs the relevant libraries installed (in this example we need the Mesa openGL and GLX extensions, and Xvfb to act as a virtual screen. It's maybe also possible to use OSMesa offscreen driver directly, but that requires a custom build of VTK). - Create a `Dockerfile`: ```bash FROM python:3.8-slim-bullseye RUN apt-get update -y \ && apt-get install libgl1-mesa-dev libgl1-mesa-glx xvfb -y --no-install-recommends \ && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ && rm -rf /var/lib/apt/lists/* RUN pip install vedo && rm -rf $(pip cache dir) RUN mkdir -p /app/data WORKDIR /app/ COPY test.py set_xvfb.sh /app/ ENTRYPOINT ["/app/set_xvfb.sh"] ``` - `set_xvfb.sh`: ```bash #!/bin/bash set -x export DISPLAY=:99.0 Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & #sleep 3 set +x exec "$@" ``` - `test.py`: ```python from vedo import Sphere, Plotter, settings sph = Sphere(pos=[-5, 0, 0], c="r") plt = Plotter(interactive=False, offscreen=True) plt.show(sph) plt.screenshot("./data/out.png", scale=2).close() ``` Then you can 1. `$ docker build -t vedo-test-local .` 2. `$ docker run --rm -v /some/path/output:/app/data vedo-test-local python test.py` (directory `/some/path/output` needs to exist) 3. There should be an `out.png` file in the output directory. ## Generate a single executable file You can use [pyinstaller](https://pyinstaller.readthedocs.io/en/stable/) to generate a single, portable, executable file for different platforms. Write a file `myscript.spec` as: ```python # -*- mode: python ; coding: utf-8 -*- # import os import sys sys.setrecursionlimit(sys.getrecursionlimit() * 5) from vedo import installdir as vedo_installdir vedo_fontsdir = os.path.join(vedo_installdir, 'fonts') print('vedo installation is in', vedo_installdir) print('fonts are in', vedo_fontsdir) block_cipher = None added_files = [ (os.path.join('tuning','*'), 'tuning'), (os.path.join(vedo_fontsdir,'*'), os.path.join('vedo','fonts')), ] a = Analysis(['myscript.py'], pathex=[], binaries=[], hiddenimports=[ 'vtkmodules', 'vtkmodules.all', 'vtkmodules.util', 'vtkmodules.util.numpy_support', 'vtkmodules.qt.QVTKRenderWindowInteractor', ], datas = added_files, hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='myprogramname', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True, disable_windowed_traceback=False, target_arch=None, codesign_identity=None, entitlements_file=None) ``` then run it with ```bash pyinstaller myscript.spec ``` See also an example [here](https://github.com/marcomusy/welsh_embryo_stager/blob/main/stager.spec). If you get an [error message](https://github.com/marcomusy/vedo/discussions/820) related to a font which is not shipped with the vedo library you will need to copy the `.npz` and `.ttf` files to `vedo/fonts` (where all the other fonts are) and reinstall vedo. Then add in your script `settings.font_parameters["FONTNAME"]["islocal"] = True`. ## Getting help Check out the [**Github repository**](https://github.com/marcomusy/vedo) for more information, where you can ask questions and report issues. You are also welcome to post specific questions on the [**image.sc**](https://forum.image.sc/) forum, or simply browse the [**examples gallery**](https://vedo.embl.es/#gallery). vedo-2023.4.6/docs/fontlist.png000066400000000000000000005475631444463326400162430ustar00rootroot00000000000000PNG  IHDR`ksBIT|dtEXtSoftwaregnome-screenshot> IDATxy|T&32 1k@ ?jTP>"jq ZSZRZoUPjXR@ٷ$#!a͝89wL2ǃι瞻yᢋ.@AADJAA m  HhAAD@B   $\H  H5|raƌz8Q@(:B!$c%.QS.$msssR  H 4444࣏>J;n;m].W:΄MKKKxdNp8n'n2cTۉU9C-j[{nUFc]W`0 ,ځ@ iq ^Dw D.Fc2-2߮#'m2XW]d52 !՚DFl!Q&yFnO]2;l4vU40ٶhTXWWw! Q\q1;x_ ',ذw=~xIc/xRi xz'0:ovΫ|-pSbDQE~N10!QC FsƮJMMvDݻ76oތ7&vH.+Pм\{E-r ۾{祜HN Ǝ-19pU nn;v g@F#*LӦlsæ"Ǝ<NG˕GSr{yW5"/שˏ5- JmU,~%@iLAAtݞTL{tXhC%ll֬/?ͮǽhwRol:nOv)d^EZDܜ肋xmx*fTgiIlܮsx#g]3t v=xգuʮv-7Ol0O R'#xI@Yi%F kx(69!v<ڱ^$x2sf#1#WjUKꑗsN3}8W5&圄1Mzpqyo`<ӹ(3!!D zp* ϰKG ?'tYdDFN铥lmΚ:y |5XD)*Z0uR"&"!B z$p8}WՕS=(*)M]sg:(GςU Aqxs)S{5<~dS(^Q+W>YK^Ú'M8ןGɟ=r]l,@n1W"l,sA34i](gM `/5 uFyj 唗sބiWViۯo$b())ӌ{~S;o ,I X1euj2d2[O:=We?soI|sd7>쬐6%a,jjd8u8X}ͫha-h X50<;JOh_73ez%b^E Eis.Ӫ*Z૱iެ/W\D^11+)#QO?$;,',v RfK`$%ʡW;˘.)cG°*/ |5+j,]tHSYCT#7~ %E8xȩjo~_{NpP}٫ˡOVT@w=Bo>|X>#Ʀ15ҒNLAB3_Ś%4Xe<;΋)_昦|`yYsf5 ecwӯjDvV{+]իϞdt^E M $O2|߿KnGVODq;}s*Zp7U@ϲW}8fC,b690,3*Z0~t hRqY=dY܅a:Ł'Ϛq#cWO<ϖžo=6c]p{?'9۾+--p&^u}W5όU*D%aPVZ/QUO?xC RxX~Q󐫺 oZ̚f,BWjL;CĂۛq Q^z?VxUPc}rsn>goہeLyofJ+1v!x,yQ{~y:(:30g.sC7a](+o؊i,{Շ?78Y?nzIO?x^Oʟ^Í?di5L?rNgAyYOsKr|\s<V~%_RF>,]Yݧ*%D;{F⯄E]}6|4|AYe;m;? i0"Gh]DA'ErUoβ lʄ6mK7l=o7 "S :xEy&TV}6oؤP |k'20ĠS_ΛcT"\/zk<>|Q +Rf*@JX;&ʿ+Fhzm"^jmcӲʸ„_GRGk_e\%ElQ~0o#7^ݼ]v27C=>\ 닟1fnj۽mz*>o5- *cJFIqO$yx|}=h9)T7ī?wKG+Zw'G딟_z:Eu,jDҧ gxZ8 *Fw<A$Gbav$}I's,Yxzsze6+Ț6H^iiauVaxp@$>]D2vӌpr0u{Jvtv\ͮ$ |G :a%=ͮVٺ3$'ӏA~HR6,8_W 9d6A$\0N.;'? h;o`_1%Q+b(:Mۓ$ 4ɌaIpͥ_b~3LL_CږZfO||\}a]s?@t]Ͼ[wo0%ʳB m͸Z{M׏.>A'~|Mf\}LfogCV/%lyNд,surcBoy9d93wiFbbrE9P_U{ڌIb{FKz߬qʳ#:Ġʈ:`$HL65J3^0]R6/ ٽ4@y>實tB/?ue+1w.jwkHal%{G^G4{h D1ת1U>木SĠSs3PyP>9+~#*K%xLǭw/Q#>넳r]Xkˍ0!Wxf9\?wgl"F|qfHcq:D\q.mA'~NbUv̪x2(l?x45sfFJo@Y1 ys ^.G-sKG̃ U//F|>_=AtN_H *kEjEp*ゼ͉9bЉ*\2 /W#Wظea pW~x2KCV"7b) XpEJ@!D*+gGB>PkAh^AcZTs$q1@i#@Nsj꾩ĶݱE3ϯ'Wzsi2;>P"[ksƷ72QO OubvCGiiaω'ӯ1}۱}ns5 $e%=.4E^L^|Y%&Ӱ/ۏGeB+NxcllثYsuͺ"#|{DKCeg!0p[qC:Z|!Q6R>7;~yᙖF"At=SpyP(c9!qK 2Q'LbЃQM3䄪_ę:N䢦_(o.%:V:!Ø5/y0eY].H3s7RVm]&&A<ܾgxo , Qd/}QUS3~u0vb䐈Fx 3N' u5<`Q6l.WO"ENgf"}QX/ E>V4x`P$ܫ]D'`l͛EcF/O0gz\sP5eyz/s*(TrcA(ʔ땉\:ܷ pQq=|~fL`MD]pͽr+WSֲ. h*l2XVLO=#ڔCD6m697?P[wfbڕtͮˍ h C5l5G293Ag'iii)g$uēǜqu{EaS8krB9+S<ԟ/fx#?FpoI"}SEӂy5.jij1jDщM"G-o8~˶hp# yBnv=^~i :SvL ag>>qV{;ݮ& *-3*ɔx2x~>pjУ>^9/z~~M;uShOوE"%cEIJuWG!1҉cE[7*{vx={}U̘3KY&9b{ƜT0wff3܅yxx_"ŢtBD~vA'v{@աXV?sv{>=g4vd;ڃM Di)jcV*^bv RY#l2 T(|O7ĠL?&EW<+wghʫ2 ؑ՘3sA=?繫f̱X{iy2xɭ/jW~~ ﳷQXΗ_n%]|8">xէYFMy oE@mj BN)@|-q{X0&/| jvLFY؅Ue'Se㙇~b8ܮ(/ \m#)M0mVcBϛg\"{ \mW ؑ1E]rC8X6q[ZLJ(op==tM?Z[ŊU5ڳ8O׈r}?̄!ƳVj0YϾJV{ګ|l=P 'rPv`ԤE];#rcHݍ[W{'URz.-ʍl<_rlT+DW0zU%V}l|cGVcHozPv ADt+9Xmo6Cx{8Fc`5SAςzdDPb[CɈ௟%tm?kLlSWoZ}O/ua挸3|+O=V7U9n8Wo\m `wiDpÍj{+b$ZoU }(ڣ~۫;)Dbljsy_{{dP*1b97žنqey ѹL2#e [T^ҡxH {_|5v>`./jiw*_Ak. 6ADhiiIiW)gf<#gWgw|~ISX :B% 5%KxйYD"9R)X09E8v:JݣY؅ /cύm b|Htb;UZW{˥z67uuDCj:7V'NA݉S$Ժ,/ LwkVۼlg]rV}gp9"-ZBAhwXh&NΣLJOMlŸTM|ƃC߲KA4bjK$) 477j'HnG==w Rm-DAAl6IB  8l)/)DryAA:%0ߐ   )l妦K#AAG  8q\SVEә2AAѝHKK~B   z:]%;c8F>}4Uj3&  p8vgن3ޙ]QB3g$  ) Ԅ{?=m,==Yzƈqby,n%qm">Ohe2X tvtHOLw3AF"c30(&᪣+e ,AqGYZ8Q{-+h( AD)N9=ݠ(KHђhH<5,՘`}.QsqhiiIy&PAFKHejXwxĒqTQ z.6I:P(˅δAA455HD,f+5'jĊ荁XSfRkz#aԙ(K 0|FQn()״& n EYRGQ(Yt-]љKw0Zv{m:AANG%!(K0@fffL: m  s12`.ږHAAD6y  NZZiwgE6AA:ڔ:BAAl.)AJm  %##K&  a\.Wڭ&  :%[ZZ`ZS  8deeB (u   "Z,ՊH AAe9ڝڑH.C>N$x.(P/_l:`Z/|AA$@(꒶;-0Ғړs/`Pg["U|O_E(0w.{m-0\9m+6}:Α 2o:tMn`doDXw<%]# H$F%Nh >%aC<7P:Ђwbpik?@܉s6tqfKbh(!$ve 6lEvM4~ x[Jl[P2P.P>ԂwwD"Nar [\ H tvdHN"70է$,,Fq(oi3ev $QӅB] VO""0gl34E[./Jzj{ 8Y^O6e?  ݎ`0%m$up$cfCv+$\;\>F$ 'Z$,e/r%}x@"7w59~r]:@"/ȍ#l76Gpyv%MdGXp=$Y.'/z Y#&v7wG1._+,x*0@@YȂ<%i %"(h.& XXʶl?9En`P bXG*r+ 4ec' u[b}@F eN0H WvIxeWr(j~Mc59(?>} Ch;7l##[/T(Ą\O]jŬ}#1yTEZ C+r\&Ql&4wA s<|13 0RC` J6Nx>2>xsq[n@ٶ<Mf 7'%5j\G[]*F (4Je$l~_sϋe"Txωإ"S9' _Dρ"A.l6[D 9!#$|Mb箚>5wf"[hV))]Y@0nJ +ng+nǵJi HcWqGTL?PlMc,LyQ5m. EnnvvO%ȸ :\[0,G0UV]ļz1j+<4c"' Vy+|KG {ogc\’Q9!m"8ރ{ |'F ^&Ȣ9;%|~s݉%R}]}\yO(fvj {~>f]՞(Es-h KVTd[F G@ |]/4>f ( .టDe)>dѶHOrفIB6DSu L' <>ɢEK߂^m5#wէu0p!ى %'2}mfB y_ЕUNIn?,0myl$q0b\}iDcOCx++dX#1ZCiDc0G:UޟaöZ ?lNeљ%S1j+!}:ÊM*b{a")ہ;D19W-8bn<1is"6[}opB>ؙgzaj2cb46WG}! zc8|q^e w[q2gBQ {zk4QC4-=x,w$k̍r *LCڗ)/F:9/ < lђ& i&_HrS>Aq6JP&_ <8O,0O-~D >=cO=0OH ]C*Ϋ?>$DP-#,gCs!24E^ %hlebP_QL$o4ebH[]4+1{b?!0cRP7հk=c_nxn Jm**oR=UfTw@h@X25FN̋q%[;L=1ɂE_Ѷ-F`ɪQGRA{%Bbx~}*ᢒ7ǹuTyrF籟?أ53+oln_ۤٲBe{^sᨦ/7[lcςuuӏf)SɎ_{))"ju积}o4y<1 La\&": m4`"+-¤>'j_Tǟ+ b r MQ>P#v=wKJܨ|ǚYFj_e?xh1Xpx#+)” ̓1޽V4yj>ܓw%Jf!h3 {?nn_" FOs6~M& j?EF_;Vnʈ>L#T6C^KXd(x[GwW括 }kY^NAq:Yc9f:SǸf |frۃi1% d[ԐkƯ3}(ԕy& u`/1b5mwP(w| E@-nT^2N@ȧU,V|: M{\,)aa #j>Mc,xn0>W_%?G_ls!AT ^ic"Y].#vryja=?SY4uWK_W'Xd]p{Oo˩:) t~Y/Sv7_| ,#_l(^rO';jY>e"kB=JXdA/)!$Fb뫺t%:WC >ᓺRvqX+$\؟cQ5?$g-DɹlRq*SRykr9 0㐧;8|ƞfQKO=C{bw|Bp&/c>7q\}xҭCM.]lDzǎsU ]p[yg)i6VN3 &]C!#QbN}Q m UVVFY/]rx =7O;#s x fԥLDiyHO"(yÖ^m<>ɂ_]n5d3cZ/ ͝Nޫ^]XT^f*{ k }rƿ<}|pf:ry#C.]D~yIz;ъ[$7 ͇x KĽ76.56 u Lg^!j_g{c£{1K-9(| +Z5l1<9{Sb`X4s?})N6 m{ΰj;ʎF4uz9ӗ9ff}۫#ߞ0@0-ّqO8Q,m6spԂw*`[ 8uFyC0/7^%kA;|G̽~}|v5H'ou'roE1k^酣O;!wbxʧ ui5UQC i3|]F Zqf?6;NU;aSٌyeBO=ymq"M6J5jf(pYΪ {t~0u|0̞U(֧{kl>Atze532$<ƲRz\+N$Ò<+|Vx8]a>{ɹ,_Yyp9KfD+* w@=I{SPB ^i6: OoJKL$KB;k~f;"i62rcm{%uޢڶV&cE 3^_~WSESՋaJe|jf/EeF]Y F$8mɷ^[ݶ>7Aa?g=P,|/ܘH?҆Cmy8ݩϾ8yo$7Ŗ&Fc+W\^bQ?Ӓ^84";Н I3.Zg2!54rl8x2&RUxDUQ+.t((ͪqxL(~u hY@zs 4f2&;ߚqqcL@2͆ζC:TlE[-CM.ʈO3( x{)ru oоL_)=zEV|7Y?YƉV( ݒx3ڌ'$D+[I/A$h6*aq^(C NJ>6%E }ҍ}x'yb֚ڔ_F6-`_x[+t> c4{[~m1p/xago=V044ke}3>c;KvDb~Ԕ%;l1.+dy-}ve, mݳ_C(mCr"AtGBP]˝hsMt*PļSHe:%E&7/k$UuU}yZAv*s-јdirEWKX$[h, !2"o?EN; 㷛˜;ъ4&6&xZ[',u\3(u,߫ͫ@:j~T ͊j+[5r\C³"˫%\aݥVSE ̌ 5M`^cX0@#`4:K{ySr̿-oO═c도5"6akg mŽ0CuX ޸X&Uc6^Sr Zz~v> R51*p8[L(CIG~]e/~|M zN{O$ 56l>,i&Sɱf  (`b,u© D# 'Pz~ ,_HMm95UtZ(fcI }-G\wEp+v=^M`s +4 1X\7PceWce6<I6nn+>ewFqac , ;7CE]Ήe%_]yn8J/^eWT+sHXn?g\ '[q2O1Wǰ3b+tF\#KEX0qׂ dKEfmh .ngլ2DRꅋG{;ъ?ͰX3[C UZ\Rs֚b21#B{^ٵ8.Y]>IlljVňM*XSʼ5|~ǩ}t#m" @hI1[fm2MТY/Jx~}poZ٤?`̫9m5'"|9mB/3J>ن'%haa9_S+~@exwjr lD+P*a-J@=ۍ殛iܕ35 ŒwF7Q 0p@hhj$nؗ Rݣ-(-Ȃ(y)*hOuf|$X/Dd(^piP< PRbM ۪l5ueT9ZQ:Ђq!?X,c3+#jx+G= j,O]IeNX%O7[ eJ\j]B'H,&{.ʦ#f0*"G%j[72'H8,铪"bkY_͒[2]2AA}466v>R"CjkkwT40҉?S8N-?Xbe(fX5P  ~$)uBDhjj`K襧k>ƂhF8P~ >]= K  z]_S֋?}C fBZZɑNUT!Y1q@AAlJheHèEeOfQ1Bv K?J$S#AA$KZZZpz" "U-QDҏԆBG>ҏ L,)K!MPR~ԝ)~DqA#A1zzQ{gz]1Ot# ~DDOGy% zt3`Ew4:P=Dy!&X&voxBxD۴?;T7!vyۿMYЊiv,Q#yE,I]6DAw6|نtFG@`cV;#x4Mecז".G?{eWU{Zs/U@[MD1oLkCNsD$@&,gw4j>F<]DO macWFy}yNc|^wGpp4a^)xo`p|6Cq# 7hupmFAY82>9gQSmDqt5"Fp[<&8Y>XjqRW,[2pj\zdDѺ4ԽP(N'MhP6i8 !cd0(=zhC/(^ !BeGOyq8ps٨eO*_4хaCڎVx`"  FrdžQB(=&ɍ' u'=9q#q5bl-\hx1?W{ wOqݯ ub51nW Z4*jU- ,"\h:<`S,Rvb/~nG52i AL<2"ʟNhW&~N? c?6, } |{Ԍnv_(yX<\ä>:C<}]~s>>~o8dx2l=a֌|:F#QNK3ޤ g~2=!]]OO҆j1~;1^.M&RE64Be J[@kР6`2GW 3࣮< 6 G$9*_;Aj ~\Țם'W OIn^&^L,v͚ `Eoq`3§qnxދصj6k79bFGj,)H/Vjun5Bqr v3ڀ/,Xn- aQ9kMƽ)~,wl"ٌBmy΅xÇz[ %00b׋Fa_}DK@dwu8VtI;pM J NGOD*!!M:nP%c"qP\^/E8^Ntԑ&: 7cjgG0/A P@u1jS%su,-A42ч:P c5<7jq㧶eP_7nAD1Nm6M I3s8wue JyjokzJvE&]$Zn.u4jDb.@Sch/<1՗t6cU8qo,< ,{L' ւ)ݸ`?L`ZE i'E< _p_M}H]h"oo Sd7V:בb`/'z02wff$\&ה,BPgb5K@<3l ^3f` ![I;,ru [,RoL #KlH|ixuᆪ]9ڲ $Wkb[OrAš.| +mZ'B\Ʉfqart[ʑo?i@՜`Ĭ/*^͏vOZdd/&-xiCŶ{v_[ABqbF˝Cf<i[zc PF_6沉ɗ&o5<.x2*٥i!BI;rY/8" ?T?i 9&/*A @) S/g".3E} 7y+J>l1x`x`9FuQHh.n#2WRX]֬`b򖇏ֻY6,-$. =@sA@h|ԝk(2ӆ|P0jkn@뮯Dž A熊w\iTawu{"knXD&@sΰō [H~%2j\T8Dž.5cGg P_zM0nh9#lD?FEjɟ޶2SA_ew`__W(.QGD wM1#I.{#=磊)#E;->xzI>){2\-US(8ffJ6&gcj4jb^+8&"wBM۾];vQ q׸K)̟Ydy}`P|?eէRk|JS?\_ RPm}NfCӸ:BBZf^ =sXiM%W\SMZ6 IDATr0yAe J&ZV-փFAK~(ŷM]8l1\{y/tuޠPu:^0I.=[9L8/ u(Kg Q%,L 7k޸(8rawxl<3Q,U?5X^v*iO8q|$]u_>C?b>;3S*É;[Q^iT32Y٩ĹXV8fpx3m8e(7t}D @g\M%H&Y\PlGd^SN,mLu$ݿkuׇrGa 79Ҋ`#0튚N0l17^Hğr8+`saG  [}faG&DD˝z$E|2;z)~hO؛jf (mNs]&?fb-aY#C22b̚$cbM|ͦ5#if̟L).oƵUlˎ$}2ac+/u*^l1rv.'w\#up]Ƌǎ\j&3ޓs8Yk}x_`ibɢp=~Bj/ XQ[[w9oSW-?hK$qjVhM,7;&6xB\ /-k#[<'(Nj9n5ЃH?>hFM\a#aYluuy / @xydCŌ1 %%M9Vo7.,C`寧 sV]gEŁտ:BxЦ,lCo.7yggy.wx2EQ"WOIu5vk8Fy~Z hx+g aj3Pƛi-=S2{ ħ25}S aXWłiX6cX`"  ހMãzL>򊁿%S9vuyq-9̘q?y⟿lf5KV xoZ5@I uZi CZ K,T5QXb)u:i䦅b]$GÍKWh+.:, e$LfSh8V p>\x[m#KXCa# oG49>e"ϝ\lc xm_Lmw4>\p2#"s+z-Vqؾ[ /}lIyJ%T1 +'(AtHnuRM.O彺bukVtܡѺg׵ɖ2X Vc?ьɳ9_qt1Lf䂚gb[:_;Ñm) xIOq@)m&t:tr:֑iܖ}*=|!ί/pǺܖnҾ*6k㖒t"px`_î.S?aT_`_84x X`eb G‰髱)NڇI>ngƬ@V Y>,잨U0S 1"^agA~:pܙ)!y*e^4 R@ +?gaEy=`xZg8F/うR7˼zL>TIbGhZRοYvli :7FޯZ[^bL׮5,)FtHG;k=vP9֌׮0b̒skc 0q(s20abT䅼x6xvN q(>hXknElFɀ~'p`!BqB)EZg& hm95Xڗ}c wP}" F4!6+zC{G4_XZic a2!q_Q )>"fy9J2 ' s813AGn$E_agyh(j b%&0\ oQ 6x:6 sP,_LV6s+A4vd E9l*[x-Q)g,8WGZeap>~g2833,{KkekFaqt_AtS1c뮟 k^#$h>z'XbS [A2\^&t_ws"W__szoV(Q#SFCֿn X11I rB)-{ }Zgx:6AE7뽦{Miu: UqChs:hVr}J[2fؾSy/BRcpqX,7'R[ A3b`RBKn,k7=ᛎf wpO  Vlj-}~Fw;eѢFBV@e}?9|&HK3'm'2['NY1XfP|8ӌn, ]Vr>[~hBP(3 q UK GxL+[,1b5&雞~Ԧ@qZ6߬b;b24 _ B8C0 3;l}\TtFkM7D:Fc9l[50Ra$QxԄ{]#{: /y'h[XD0&,,)^7ﶧmXnOD oz1L#˙`#`UJGF B8UΚ[}XE*:#g\BqOʊ' />,>9+_`*ۀŁZV rZFzpѻӱvŠ<mD[+=!ևݺ$&:^?>]#XQl< 0U4j/Yppx:0 pvŕ6 e, & eQ( řaj vEYѺFACxcb/ AM^Fs3T:Og u LdŊJ¿Y5q~E?Tcwʹ~>  _Dz.ќ$Dd5*~H\'hόq)Q6ᵼ=$"uDAo3ҎWшuώ[/V$YZR:{};0af*fVoV/0)j8/x0j:ebXY1`]IkWCZ[~ݱ٫3ӁM <=%|-wUM,tu8OR@R7` E{X3nb׍b|ԥ9]ǯ != 7h[ =WL8cN <̄2-?*"2(C#(v43۹q}ՌSW WvXIԛ= ţ̡ˎZM_L%t97)VBՠ&bH&,,vt|M{K ս?q\ݚ2Mn-5KBUD<7)CeO#.2&bmՀMǺ {]~[ٟc9j:_ڪ> N8u U7FFv'F/NgT'blllv5+kQ ~!|ж{Hcꄜ̌䅧x#_ rVXŎV Jm$u^#Rd 6iX yelG-񵺬y#+&.s贊+~W:8-$:'фu'Js8|&{ p]d0𔯡Le.~Xk/#=v/ Y;D8r$n `M1l(<r6zbТ/]@b/_hX;aa^Au6f7/([st J<=S m ^74}uo62q]<65žq2X!mۚ`]n/:9G)ٮꔳ=1 5 %;ַ_P.yZ+엄#Y^Sd<2nh5|F5T G%+kI$::|W"F|:,^Ӂ<Ѹ5bh HnjȒvRЎ&X(:F$ j/jAv un[Kv$%a^$$Xx] |y;"R@`qi~ce83./|wz9Y[B("b:[?U;~P㸲FY縹b~灢Ma]].,bv2w,?'F= OGN"1>{t}oecӘUs.qKkCjvIf6-Iw{zݽwm`C3[Z^Pl\]̺0GKZҐ:F7 i5Ph\ IDATG) ۍN0D8vX:_Z(E`78a`|VLh++Fn-S׺/xp~܊racIZ}z,_jXgpBǚ^ jk뉊eߗv9)_p2I^ugb:rjs顬s_߈:*d/VێكK{+6>vBlἇ˻m,/UK{+X^#16TdkNKrHWs*_C) -:֏[uw&l(XAh98ˍ/g-w%]6j:+tTh+N}pX?n;nFB$txn ;o:ڮRe>9q\[`u#׺׮.#]#fY,WgӰDώ"_ 4NLFs)ω½:hyӭ2"_2Ub{G1li9SH\=~C捄ye}(,tj8_Lt ICNKD#[F3Yu( =O Ik{"QZ.]~B+#8T1q/?;>#&aX!,fB+̗Z3[DՉdv=NB .QGֆί+:p2G[ՄL Ȳ.M+#{uGLQIZ`#'sAڞ*qynO\G'5V,d= PjK/VDgw#]]`cXXwѤփƬ:BeRGk'DZCzK{+0niWR:b{ z60k~HJ' ""ž~D=],Fpۘ{DE9R5&m?Mao0I7iXYaoVLs\X82°Wg(#,y}e&[J10H7_'y<}m!E_bfCte84s&epv{rOh4,qX ǨP$,Ԅ]~_dV.%ݫ3+l-ۙ3kQvVߗr[EVS?"lW^k6xkg3>>w%ёh #xdu 0Q$QXےIVcl79`}Ō2q(gcՌq5njLَ[Lӣk8-hm,˂e)i(72'r`<]qtz8 ^mmOȉ":ǵ2_;=>V0 r`|`ƖPEg6M\p`u-n$\t9X[5#ۂCx]A= G RyqcC3Uьsunk~Mc\G pAȋ׈ }]n񻞔u.De:a G ׻DY-Cvy֚6'2ruY\^SG q_}E5`"XP<5!E=&}S &8nw2 Bto٢VcMm} Kecw'< "?bXPlqu=`jGsʣS OQs^,h0)@ߎ*mϼ h j~LXW58`-8J8vIom4J@O@3;6I\, VL ~X»/y59 N Mh,zK3ՁU1 P o#3]/UKV0 WLkiLEh+>܇;+Vs/:pk'F(Җsc , 5Q݄\ϥLM˫y'2fyX傃rm,RX a-/M~ '4> R,J, WY92FͲՁ@F?ߗ2].wPk:ϗa3b/1PԿ[gQ֑3v0wzgW4P/7;w~KbnLJRL-ظ#E4>sTF׍74-s3kvEwD1oR!?k֫ȚpY⺼j`x`w ȓ|_Fu6* Ur n)TPbۋBeXQ@;V^s5R3D6ٌ`Ȫu~˅C8>;n2`,NU{ꋢ7/f@q AݹKGg(kKm8:.4l8DX6h.,79SU/N%!{\qט w] P}QJ48͸)vp;4,Hd p!'maD>;S&J+)qu0A#,Y4|*7U0k_~cbb%`O]tY8aptj m>أ3,h0{s?c̈́Zř`L 0eb4aq@KH&ybmVC]U,= -;w9]V$l = !f^wg| 7pmmKm,&2a'^G!Y/%Zg*ep _dq|xY4|)l =O#gx)xr/B幼R@Q؟v5&̔GgX[bޫiUnՋpdu~~DfSɠHl)`S~G3:DjQ~>!ш#tzmD^Ɍ a}^t2IU+ RoV#7셜`!;|={u>N0z ]pKA0^'ii5tp9^kw!'XZ"\#{liXѐo#6]"k.2X>>Nج`ZT{yg%Vk1=m|vq W^i EN#ϮS$- @+x}B$wŬ}{tnp9#=Vb7RdVM4mc9ߑw>`xNql/:81,{q V"+i昸51 HݮP#}fPHe r@MZ L?7kS60m%gl˸ Q** n%F}l몿~LI`Ƿ煜.$t[dW (1=k66&.4{a3J|9](:QϨ#/k&@h6 q"#Kf41=hw5 Z-)^idh'J4 Ǫsqa59xjAաʪ[bop-!tqI`h΢ŸZ[VV /)dMA! sQb(ύ+F[wiH tlc3Vжm[YGVBsKbrBų`U؎0~k:WL-ßS^[9AKJ|%dK>kX%޴euE"lrx_ xC"nΰ4N(k=j#iԽd$m2r=W6,.M#EVAU}m՟Hx$ vdy,^49A=F$YByLefQ]r8Й) Àm*P(fNeMg(kTn_x?22}25g#͊ihm>N~WQo٫ќ SA f5%[,]?C?/!E*_MOukZwlfIp@s>iQ7KئqL _hKǃ:@Vce#_wVf-51~M.)^%i!i,b)ݫ4:*ǕuDPuq&XFo>&{wDo9>8Sit9XLƳG V=iVFRgL+ke!6\!+|61 %d9QF$Em6dXH?~M0Q}Sі`YОOnڪY81ʐo6=,dϏˢUL@)E:=Y[뛵5) B#AJY5 thE?@ b#P^Y$eG] r kdevq;reg?6ey#gYHd{X?|3\hޙ\8k-Ɍ"-xhcX',߭6>PqDv ugRlq~$;IJ+ BqsXc plQfq"$)nߣ3Ixi GgrwbߟeOx~$BOwN~>P+Msr]y^[RR`||| {P( Eg9Jx3Yۤːbf#}}}q(3rN e,ri |uk'M۶]3sS\ BP(:(rV ljԎg=TS%W( L%5vG[q9UG\uv\hN/VP( J+P.ݳh+ C |%ӁhSBP(`⁷R?99_/+(o~cP( )J+ӿmmg?x\AG/K(~~6,>_VPX S68W( B3_'iGW*lǣx˹{(U/л<{8_:|y -V( B1,(eY¾?5(J0]G83vkcp|l|n>7'n]wà֣4xoBP(NNv3D>)L;ѮVu% G'o?{͜pTF]HA3;1VGD}}0߁S( bߟ}0#Bn b f2'g7ů,Ě~0tw/WoI7[{SjҟLBP(8eY 3Ihɻ IDAT^; Zw_x69ZI":}=_%Uk裂ʉmw26#  8~x>or{,^]fOmNP( řp9:cccLO hE~šfzo9}P\އ3>"n|z/k⍕Gk[_ZCx{5dg p]_{Vg0ޕ[޲A[2X[g,+8w>aw{ABP(Z!me6951=6,smű)G_bȹ5\o8e$Rwi. zP0mTuYJ炻 '5\t}\9Zg Ulk8~ovipSMºZQw>3:g:;A s-믺P\iٞg'0st)) Bhھad\`aUԖ eXwno'nT^ؗhE]9f۴wSWa5/E'y~ǂwpU>HN`i,D 56!I||~w폍c+Y}2;/{WW'{ `7r>-JRna3a59q~3ᒄp$'ppLs䒁d;lvo՛vUJGU*-m}.զ=<%=z6=Xr\.F @e֑7nވT8>M lj0@gF2$ mZDE jb o&0)ԪM5>}?z 9!EcML~gCgTb0?_AqZ?x$L qyڤ" &ohQq׏pDDIDyP֛p$ ~j/I$vf&?zT'7$/8,Ę` @Bu2l*@l8cQuayE"m>$ ɀjgu\fGlw:dt_;W:@ 0Ldz1-#v l'DBd{߆TWY/c poDj/1S:)X׸W6L"Gk,0ZF# Ԫ$RrkM1x9K/:/,sX(ɎƇf3-,jXΛ|bWvF1*~sLNQv\Cz*@#g5&x֢z|ن ZmCҊc@ 2s<ڙLVF{MUedoM6/brK)Y|fL`$@s$C`'LN &lL!a[6,D*Stž$I]6A؟Tfo#<+=J o&*㉋֛ݠ&0³!X^`Me5o=o gߣ?&6ĘAf( sEJ}z.n>Nl"+T,],ufG6lȳՖ:d}Z؟H]HIP@ CӴR{2uDX › p=҆U8)Ms6~w*Zlhu(PZ| o&wh,+]ax6Ah{8$j~s4Ϧho^] j`q 8;fXq]Ь_|=q539>JXT':9!;>+t84JVK{xz&N z& Ep~/Y "W9+ p\X6. Đ`8kHIrBnmB""[t! 4?*V"׏JJ,鳙>˗lDu2tؐzk0{(" { ləz¹`X8ɴ7z$_N40&{8DeM?)Ng5^G4_߆5f]hS)^Kf݌  N37BVO/x Hb}%p" jJd ;lYDנ v.V]ԽتQ rߒ(S"1=$^l* U@%[_Q avm"IP,_}"f T'}H}սgm(Gд^B{i~j́EM6G*eY8Pq~/jvsfZH\p,+ KP=.{u ꝛJkD|z;'=EՐ\;9g-iٲM,/Z!@ ԃt:]UD[FW~Yy ?v̕h+<$A6} IsM! ‰$bV.#2Jrj{bH~r({ ŰG%dҊOsТ{Pd1SKdJ1%iV1]U ‰$\ޟHPu>,#1?7 ]w LICP-9! wbh"{?nR}Wu΃k-(|p\C1$'~8!(l Ai%y4\lCg{+ۚ|)'X| 46d"R?n+']RY (+o g!XfkFfu{"Ha[2_%?]!LVLnJT)h6};%|ʉ2rR|jlb2w7fB4oX^eSlru6!0͡(jxkI//q7_+c*JdjF SG6&Jm%}}XyFPG w2rra|]&OՈC곘$fxU? jRp;ߴw!Lr R5}WyuDLDa[H31QTm(qRQZBi4>4[H3=."!J)s{c^RQbH+v[C=ҦmF)/Rՙ.T'p}3W{5{! ٬4p:KOv)ϞxG4RykA;>>pA\ M ),PKQ ؕND _T'J&LؓD,8Xov2LCQUypm`M0ƿf7O d\YàkANȂ4[R٭~lmu3adGEX.iD~#zu#M9.c=.?́LD|բW\>#3M~#)`fxh}}̡* nvfW:;NeņT;n{a.SNF֒!a[Yz2ȱ_UxX:lpP mً?4|3&Wz-LT4Ux~Jul"Xq$UE##\߬}~${Rbͬ1Ty0Y01&r{ njEC{Yr6u>7vC#z6p&xP9B/@cɁ W2C \Lruy==:a ,Q8~TWA=7c}P,RAE13%`{ K;l2 8mA~[C6E.D~އ7s,{#m*|~yޯBp!Y> z hRy!G!:;6DBú NqCgY{dͽ A'>;z疃}/e8}눂(]w|\n|=>˃qSrDET;l/L x2WNr9H?FU`b^r9'`;I}TmzAu B\.ClhQNul%DDx7s q?*7Iq}Z[Lԋx7?b<Z | Ln s lK Mo~Kn2ǕLffx6 Y>&B',{CbH@.:׈^gTY.ϸeL )X/qB4=V4&վ [Gz/N oT{1?\A>,w~/#3-˅u $gLyt: Xop^CDJ/{'\?])aҋ29Dv{0tqGSGaڋY,{}H3H~ѽW>#"lhA}WuϕDۋll8mɦ Djg#bM%4xs:;܋Qd6*R͖?y.d#P~9!n)Z|g\7MO?TR /%Iז-ym2XnrP>cbL0f,ȻsVzG춿h~{1ĐnL)H" ۣ3:L^ 21Q7PMjFX/w?TD|18iaj~!i-@fT {]={C^ɯH%O$ڏ~! -@H&O3Aic}$[!|]'RP~f :vW{Budr\V%pUU!vS{`9T׏da_8,hDm}zKQʵе5ԣM->f T-f z$~yVy5+<4heW?A4&8ne_"YR: nQ\C#Q2|[U%M1GC 0)x6źϜEY`C'5׭_ϯj ̐d}*R,L 3XY.I`Z(% Su }IM-UDinmV]O_VM; %kEV_P[;;|[, 'N W bTXؖPxsodGǣܟ?cbZȑPyO,wqlsYP&Ƅ_լ.sl+C@]e6oĸ` vw]L%36+7$&@r^X͖$@[a 2kť!C_io64/ɏ"w5*3C:y±ƋGm<۪oIYwPEc륁F.Q dF6 }j]L7D%ߤPff9 tΛ=4%&2"gUVLb 2*.?lU4lF *gz}ONT:Houyci9bdݭ{ym %Y.CrOw^M~di8u &$g,'`aBdb*9Ua^) ŪJ7FLě6(\R>ͺ2"4|8,j$wa{čUD5" M~6Rd=əLDԵ_'n8Gp ?z8Dֳ2~3HJ+پޫ6[=(x*lK 2{ - 9b͟H"-(دk,y?@,Ο?M` ϳϲ<`D'N!s0߅@ũ Eh g"D`O6ػ1MՖtHr젴?Yrc ~M;e?PE*{1؂x6v+8R 0{(Zހdp^mH ۤZ8& ?+K< q7_χk0w {W#?, )3S\E q]t/q)%J&V g]N$qORG9]ɂ"'b#V0 lH~p(l,u`4B(bH)Ѹ6XF:ȉ^? gh ͆t~ݹKA>Bhzo/F!dc0vV%$D{] D,.4]qQK J`'qM2 dH LDۻ IU>JD IsXe^NEVPc<\ٍ_.4)ķH'ۥѩAu*_o]jơm`9HNHW )N*H]@lPՀF'6xzB2\$ޘ*Zνok;w4kf^"#/n 9N%1T' *7{"ws:&L,μ6E O?nN0>#c@n}#fJI#Aؖ(9FyMRbĪ*ǭkl# HQq#O\ݒu¶č(?-Epje6 qXr%!,G{qYd'? l=KBҝ'X*QRI?H_iӵ,iN>?ྭ0 Lfd'03+<ڄIxJ[塞峈l"T0"Ǒ6Ⴂ&<5˝pK]Bz]uOZʕ,N\E%SmI>?kAdX٦l"c/L*d_~ )l9hL:GzUzrRVngA N}Rs {04& -lK Pn̈́]j…M3KhO(US8F>9>Ƅ`ʅLT<V40&=\ő{~2 ]jgC kh`M0(=EX,$Sc/N&DhLfBS\/IiFQsF7Ij=*<!@?uS4Mk, (y'ئRT`2D4z |-?\yN8]M@ X,E{N6T.N(2 ?S.0Z`Y,˂a455D:MӆX,^J|" B@ L[b?B91" \X,yмtG4%B@ ?!XB{*ENX;|y@  EQckǙL6m҅v!B@ P 44y@ aXf^D[EXz0A'p!AQ^;E ki @ E!Lͱ!B@ BnԕIN$M8 B@ ᘙB@ h!B@  " @ 8eG:'C%DP9uhM y@ a ' mRB!O 3Vh…@(mVdy{[ h|J ʿ Ád29eǧr\]P6D"vO+ Rt:yID@ b HL[D[\z@ Si!B@ LģM uh#@)!O X,UdS7<( @" cXp* J@  " "ELqp@B[E8NbV*&4kť ɾK;t!mqkc#6k߱}RI,Xk 4XO~_O3(KeɀEuF> x1@ 'T1"FbNf?g`wbђ>X,Ym-#hB~X,Y7ˬ4JD E s=97,㹈F͊gh: $ W댌Zj%3JR @ a&Pf( HbBk493$JSIȩG9BosӰK,k}rX:R84<@ Ѩ \ʄEKJqŪK1#Í8~ԥ\'*ְ&ʞ)p<=Q7dD @uB-)" Eޥ{p)T@ ˲ɗʯ5A2 V+*=@Ym@\\mMUQ:œ1w~$V¥Sd,aE@0%>p 6 Y!i & 3%X- |Bcc׀d҄xׯ5Bǫl9K/V`.>J[,YP,Ԅ+~NdDTVO§M^$ ๼}@X6 ]#Kq͵Toǁ} ZZh+ cdȢ2ׯ=2>YLO%ǯ9@ UhiBӍ^B +,cN7ŲbarbY?4SXы>nS4&Yʴ& $z0^d'$-s_|TPG"nلEK8ce1Q7AHq` GKO"a*Xל2s^~VF߁ &N@8af#ܹ(iy.\tRzsDnǂEE} 웣ZppmKn{݈F>?V>#7O fJ mU.A,F~} r S~%#R8|-.ַspPX܅ta<5 x̊۽L`ђ}@UYl +[ףP/8O nG"13uª2 á9Xp;.a4C}.`8 >$~m6)\P)Z};G{[09]o|!'Op0u_U,"p2ʝa OSylu_>qΪD#fؘшGDxŽm4)28WGhXף]XM @ 3%V`ȧqm d18J$(]].,wlW{ݝ_: $D8߆5] sݱ +TȰ3}9m}Q72 _'=g 71eҕOv$uit`MW@Iڄ=;fgxű#x˼oT~>Yv"L9MN'" BbK՛{Ϳkh (vrU =Q!mS{aa4'O^20L/4t%:ZeV/~0~; _ϳسۇxC!,$=JC!vUsƉ@0=%nz?W?U=cxFG[ȶJcm0yR~^qrh'5ɓzv$c m3`ko8YPD+8uՊ\JD{K?Wl{%eΰfJ?u_zC.=lшRUl,ia>#R8}Ҏ$̔cϳ02-+[ZXĴ 2$#fYD#Ɵ>?gzBZ焪:u_D'z>Ez{`5ho+̄ZF/a2.JH@<&s&R@ J`jֽZѮ&r:Pkn4?Ż1\uN"d;6`"7u=~8]<(KUN t%֝B x}P {޵ ˥qA .}]+<@ HP9L/цP(eA%[f{ ebMWv{<Ϣu@$l rs!2e/[n,6?\jR[XǬ*+G$hkU2.5U}F@z|~ʞrɵ'?q1eE68fҎʅg)v[ < Q4O'MaPW-v}S(ke'޹(S Õ(wuF̞ÙQC4bIjKJ QvbtԌcGfi733bVWh:} }9z}Mcx>~r~Źt_=WH'paXL&HD`Ż^f9&ZSjUkbT2yfؘF4H։M>酿ɪ RrV<;ܙuUg/7) ji#`iG/"q-*ݶ^5P2.#I+%@YtVk\ȪW?#R32S N EQS{u?EJ={!NzQ͔a$KGUa+HbN-dⳏ0IzH_DyX 7]{v,AtMG~qsXڑTU= R jv]1CVx̬;hvxm&y iD uO$Eh\*9 W&ﲅ|^j*c'p3StӧhjL9ZXîMF󚞪EFpP30l]ׇgU= KnGO "4P6.ά6!eʳ^Ȑqȟ_svj˴ȟ='Rk$u/4q"<i.OyUh<_~B-gj5ށNٻ;JEEKÆ"3͌mU;E} sGfmwk72d_7q5A֧o hVB9 /0`Fy"5eQY Ŵ4~Qt  8DrZW}102{X9;cGfat sFp8S`,OHkG"nݮhkkJO *}DJyPz@"@,"ڈx+- u\L"ޥe(B,ILޜt{EXڡ^&E̠G+r5}-dy{r8sʌ3<ůӣsr%ǰŻ;\p# ߙGsr*I ͢hF@ڦ(7~OOZ`[@ymCsPAraV(vPLEe|1 p +.@3!4`kmÇ>}EY$hIfDŽ'=3*%{gPL&֞(ZL(R]nN 7(*|*ՀT҄:`!kPb&bjy?{aOb>x>$H(8v-iڔ.,Zҏё6=T@h4-=ϙr`hӏV)|׊K;@- qEoOvpcZe87|X{"#9uW%MgP[:?޺6ME8n!P)6mZX*9FWW̊ޛNJ/X,l+d9{t@ L"dɌRP(~VMlnl+Ϣ[?JY8]9ˡymLEV;f&-/+]H"K;027|c| ^+|#8 . -AyEcц}힇];p3>Ѕehi1na<7vW*"|dˍ~j W>xF?Wd_8.'eH%MS)D?XV b2Ν;Kvzۍʲ&ҥK5ۤiCwp<ϫ{"@$R]5Pr5j{a|ی3S Afђ~,Z2waǕWMW. qQT? >7|X[b'Ygݞ@ 8^$ +/%!lÇ@0chY*UC8s{vazo  L3%+0ˣk/ Z18 z a/bQF,Gߧx>J;pn0_0"fsH$ZD wCQ) wyRB]omM{1nwhݞwk,XVx}\v];Kɲ3LLHS,\UYrq r r`<{M+*,c<gNQXzIݞP,.pUax9iBh+JzV3c2oSޓFbؑ1"iֽ<@)"LySkfI-K j N L %Nit2'+.,[bH XH!h3nFH~lG> Ufp|e?jƙS vpU$vᓽ f0PNjD\C_,nWf^z%$]ΒjE(Եƿr5ˁBj}ipTR 8b|=!/v"1 kd^kn,XU;0#p$Pk.݁/+%nwwqWO U9b<2djhvprݦ ʫhků_H;O]-+VJGR9{02(4ϡ6 aN'xo"_H:m*ybK []瞜>đCvoDur:+[=|FүkZrAh4:cvupw:Z{2ԵhM6J4S_O-)fm--ctxI)S(d3Qv0fR9T5b(,{3Z'ASS ]/pz~:D͔.3 %*Vu9WZ49]9r i 4X{.w8ZpsvWu?M+<땢<2%G,ٜ$4`Ʊ#-J<]Ep$F.^Y&&CۋLKk:{7#@:pMpnC@@WYeA FZr]}}56!e_np-xρe "-R= ʒOx/D63 6; %Xi8kN/_x8\Ia§ #m0GZk{^ppN]pp'!J׻yYzpRuEƪךIh0 Zbp//+'8,C L#&K;\Ҳ(ށ7G:g =H w// fT>3< u9o@0Z[[ wYEe żM$@8?xwr>HQ-]D;};f=6=)ݍL"9r)lۆ)¤# Z w'0D.w'}K"N6dPb2vmnN W^2l܈ѣxp;wN´>b^qi0bXH$4 w@JP%@zgj˲ND[ݍ .uɣG@ L!]B^m7ϝw,hB,co;sIۑ0cS}:a0U½" B=BHD]]#D6l\H%h~֭ ,@ U^zѾ};عsab ͰkH ?Uݨ BiKYYafEٮ} x~iD-^w{w"T5i\O>f+Ѳq#Ķ|}< wމm'Zts3v쀥 YҾ~[?:D&PY1eˤO.uڽ:ji9'}a;:I&1ޗ'U@ " CO0y5ØXb4  +d#{k;jT۶)¶}v/r/!? nNx~-7b7y' H };__F{l[ni?!mOqe0,RǏx| /SI 8B-[?1`?޵ka_ WjM W^Z]]3f@@;` MJefZzvD|^y1?q8PlW@FWm?:*o*\01 G*Bj쩧t-^ c쩧 l[>;:xs-7*B;oض6yEGE"{lA&Uzbń}ԲeRy4rpBif/FW0c("JaSTptk5y8Z9R˖s$N j,܁{ ZQwq9E 8`CIbЍRniv#6vr4U-@\p\D~>/ *Q:zTs޽[ؗ/0 ><ڷoWo~&w5l]@F\w77onK'0n<$ G0\DJB!w…bCxٲ!8-[:X_*( 7ܠg}2[/m~]hڰܹ#$d KnW( KEʢ(3 rXG&ݔ G;h d-V,( #F𽽰-^ {p ,"܉;`_\y}a8/ػ_0DZWq yط%KJE]wyFE4/iVVu-L4L8 1/+X7Wɶ2_IF%Y}t #G@}iD{M=~KBy<Nsm}01 F v-o]~轊:_hMO> ZOaSoHQxY;yt)+]/.#Ȅ!sq:sЛlj5k47mB~$X. hA˃T'җb{(C|D۵z5M`vf//(˚|C> X:w0r%)>dw{㍊^{-"~-[x%,ӟJiAN_7((,]VaPpx#+W>ѡ. ʀ'sl:PVńnU~{/3?{*%wb =?]|R"2gy']S_\# @ f> p/GBSׯ'6G""C>GUz, ga_օ !mݪwWN׭ _@"/(bkGNdb1p,_1+]mw:/+E1_)o^-g3g|yD{>tK.S "qH9;T$Deقm~A_wO>mbͬ[o{xSu}氒I BE!-vpU)r^[ᨃ"K8#(}-ϫ( ޢedf8%B) M6ߏC9s]^jV桇cH 6TN]'̇"ϢE8YX5kPPyZnw8O2йs'l|KLD1?Cp )k-U* FBJ$rL7Apxu޾ n>n:^}CSOrrOH}i:_w7`0 ѕ_yVVLbg8fhz(bqX1"L$wl*C< qibq &Il`aRJh/m#G7 w8ZF&z=Fϰ56 j\'G} ]}uu,Z^ϳȄ L$(Z8ʥO>AFE+*pl75Ҫnr:}8.*puay]]yY~MH swæ8q3U&3f[o1WT q5fd+.~Z(ٸGW.ik@O'ھ oHSR".NHOȝORRҐҝ&v$h3( fs-"g6da!THvaꞶ6?T^L ~1*в|xMvXi}: 9xPp|]U^27mW 4# Y1 ]o&'?9F} p1BoG}klzuAcsp\ŋu'V+YUUtZ*gf̙il 54)ttHGH((O?O?EBA\讯Gݎ 0\nG^yZlى,6Gqmn?1)eep#=n K!$F#k|>}7 5iCm 0k@ٳZcuu8i6Cx1TPknj!MJi+uu8"sB$!inڌJDnr:4'G iܧN!PPpK$qG2^}{g6qDi$p17Ö.x M<)}#Q0!hXˣ<-C>; >(R:~bik@W\L+fHFl J1GҫB|9x٦WNǠU1L[I9ȑP~e]ߍD4Lt.TIz IH< q#N/!Q(0lRWT )x< y2\)usmjBBAOF#c\ ܩBp+B4ӣ>0lRרܹH|ΞřJf ѓNyY4r46۶ Nߠn 3'm4B.$4Oo yz:}65f G(ЕBEN!*BEIO͛QQljezOc# '.cv4s}Gϙb.N'/GMPk!F#{.^|/,s[2I>`Ak~,pc3% |v{ќ"""wVV\㏨ȍbħB5z4~8_zUz$F  JFpc+V`'Nr_^ 0i)."7c*{]8M8wԡC8YXa4e#p \޿IEE$ᅬٳi i$ 7sx򦳪L[$Ay6iRA&Z{/d^}_Oҫ"dWw54±p->ŋ+ Wk5}DkH :Ћ~bx9_}CI&윂GJi)|/LNºu!2xEϟGwgB"NC pϪTEϷߢtBWZzB;uJ *= h>P(Ċ`C`pE4Ov\裛Bvp8SWCеs'Ã@%/lÞv$WD4?,ߦ P2>^Vb0lv }-<5'uVHFɄo{];w"2`yZFt<\gφg/ƨO>T賯h [F#<(g΄n5P(v%D Y8Oc0>YUU0 JTƈ %Od+SBU^^Ȁަ&^S\᯿ +$xث3ik@=a]dj>YD}3= |ifYRgODD$:*Eh{!w"w>&klތo <23!jEGh9ppbO^+rso _A?g~+\ mQtO<o%<0~\6 M^pͬl+# A_\ yZ.n$hu,z~LZ;-[>&NM^ahz7Ucl!U{tLmQ|v LDBȳMQ= }| t!6D`ȕNvQL3(!w:a Yর <,5:FŰatgS+ E /RlM\||pA׃(Ex6A en.. 3(8lف*`(Ag6CKJs@CWV 讯jh? gEFEE`?e/"U1c@C3iG@5~ ʕ+`X""B͛wSq^971]޻8wף>a] 35i?y0زY B?nYա?~6jz5kpqqrwGnz52**M~v;+WE?s&Ѱ`L& uZu+ P9?> vm^[ U^lR]vBl8~#o@ڵprMM l|]JYҎa%KN;)￟ bH+vΝKL{l_ Wk+}Yi `F톽_ /@ަ&k6#}Z"sB8-_sgEon˯EDngL&q"H TDl?o-2HJ/u]n55H)-嚚p4[z^;w$ uwܲeH7),ǎ277 F#<ˑ8~<\Id3hχ%1\VFeZ%̞ yZzhW|Y^[\Z؜3ios`Kݍ޺:$uJ0ν޺:!Gs3lnXo̟U~>P ,ѓ˗c2!}\H \ڱ^-5 rK+r!xnaPMhy,ȭ] gp TO=h}yfw޻Boٲ06 Hzq089cf3OT^]paGr~D#ٳ>w.ݎ{>#֭ōo1h|6TTD|Nǎğ<镕hXLxZ[C-hB5 3x87gWUU!mM)Jf4"y_}U~>n7Z-ٙ!io4{[rY}kɓE-r!fmUCɭ>H_+WC `L&K0 dF->Ko]]H3Ҷ{o`my啈"8!MJfC2k{ʪja1 ynf3WK`FÖ-?>Z~5ii4~Z`L&^=Dd _\8C{уj5MV7nl8dSϖ{4?N7pCYܫ2kj\k/YZ!1>z@n qb\t͙J";/X٨pi0""32 X['ˡ9~+᧒kc2A1qZ} (srs3tH2#5=ގ!mۼy efT8{*?#ޤ?oʜWQ2h[u8U~$TTĩS!Uaml|aUUp47Souo]mp)S[W;, `L&*yq "n y8u*$ v"c^`Z ŋ866 5RZxzlҰ);4hut "WaL&h&NDۺuQuQW zA-0zIwZ@STDD(oe WB&FdM?`ܹU2(njK&™ P%8uqr 祇{`2B0?%r}=vLq2hB[*]*+i:.͸Z[ˣ-O]cRbARQon/cD>4tx pllP &\)#azMf4">z-MJnDK'p o6>r^۶!m,NO[ 3gi֬?|w3HrPjw9sZI'Cݍ͛H((}Hӣ4hXDQ.r!Js"_d@w[ 8~ >Cȗ zdVTk8ɩ lVfDnu-] ]q1$ /Z!qdw- t}.6'MBfEEVp-޽t[!0k 7P*vv7RN>_z x%߾qcg\STDsȬ@SOxv{ҫT}Oomj\pEP^DvG*VeP+C>3r$\g }+W4eT5=MM!2d"'Gж|kj| iSHph>"Zm#v⡇i$MAC3q-몪 Fy\ش ؼ)vҫd"Gs3.sOǑ#5{efGdDPc̟8/r5Gkj%$ m,?,۷G=G"~&%KhȌFH5@|FYۑ$|[}~[(P !\|뭰 W}=INNR M+C3%PR!>@_K T1'i &kjx,8S'% ͛ss&XE9sgBA99y3\(]t5). y]m ٟ}Q;vq\ $J'>o6` O(EDp[WS !tލ3fEDD"m6( >5$Irm+D>F1[dMidEo]n74'R\"v{|Zj2Tř t^-H&%Rg@g!&PAg#\t^ Áq1~WmB*I' ]f4"_7Ȫf<"""CW}=-:\\D""ՇcPЄt“*nr:0B3>N(/ w?ZMxnD:;mdBrٲ"^gq9ó>II;cf8S(UUAvPXrp!c zNz@V/Io˪vmK;&J}Zy9f<>fS\q;BrB[zʕA{|,FBAROw!Q(hVH2Ϗ.\χdrdX,詭Zp#tʕ+.X]q1zk͐ǒp[W #>K;v9g>oxm-]_~ql|2#w47C,tZ+WsQ\Lo=r@hes\Fw!; ٳS_۹b|v;~4G*M&d(g ?;WԩKLDmwduMi2AWVYJ ZMՇ#""""99|>4 l61`pyjBSXGs3:l+),2'':&@^.n]>0@9r|h} N[u?gݜ7k6#mTq) qA!ZM Q:tBxe[ׯG߁|.mD a? d"$J%]45!aχj' sf¹? W`Rg̠..$ ͛{Li2A;e {{Ӄ~=`ojZ`,M }K? >u.VEDDDvwǠ 턄Qh1Zgφd"7}k6@+joH~I(WX,KW_R])SCVM l_}E(S""6t:0ٰ~ ̓ |N*1!N y`,aGCw ЯZKuu6J 49Ȩ i 8Vf3/pdF#2ضML'- B=u*TC.\/P̙tteB(ƍÈ^KyB[`VHFM @}*IZ0w6'NiӠ48idiiڱCP| Yd %US(BF~m[dWh ]MNE Ai20 7nTFc0zœ9MEVίZ2ښb:2h~^UdBo~xv\=eeԞ*JJnkvh"yAk|Pۋ`[E$M!\*M&Gĩǩg WƏ0O> 6oJr ]cPLR6c:^di'~z~ f3X,P兜di嶇mLHѠ֛<_MIt> ^q}{zxgLosolhoS!@")gyk7mvws< ê!hвlCWVFS<3n7.ۻN aǨXnV!{.> 4K%mHTI1{o}$4[/+Lv6ړJۆ4r$\*=t Wk+ sT:ρU ijϏj(:xk6gh ies_Sq;쨧Ð&^RX,|]=mA=u*2++=E^y c a=êi?E/>G^M&jlc0`kѣa?k xϋnʔjBDioPrQ)4b܇ "^ oWf̀"U !N%0ӹ( yF䓜u7;HԵw/4!ȬD#ī; qZ'}t'~*$/C*f…c6qi 饰V$t7b(Ȩ k I1%k5 wsӦO3iPpdQdژ@DDdh! uD1@Рul"FqlK79s ho8R&tIY_˫WG˴i< =yn]?ǟ|2Dxp>֗_VDꊊ?f X1),Ľ55!#4g n C]]9$qH3UDž`?ېdvu͍o"%R'Ii62vA[!J2~Ȱ(HTT;W#$W{UUp=JMBz{f65,TY:ίZ%(xdijqH_Z`] =MM ל'N@ ۈ6k&A=u*o1ǏňXawB]#d}}VT*rB[h@'LIGJZZx ln,&Uҹ\m߸=Rs8ى<[ 6Q+dBŁ'xЕ"}@i2AWRۍMֽ{RZ"d:]$h Iܪ6{ԄĂZ}z 4jh d4奇]k H)-EeßGBST˖^T_$*? =Sv @c5RZ `zgX5 ~OL1ǏCP@Va;#XHσbl? IDAT=U6k_ڱ3f+ >}ǎAi2!!U16~b-,48w:CEDDn/zŊMҎ qm?y'&`AmGT/uU&S+ӎmmꐦDFHwa\Oc#nw*0r$8~^F*[MN$eExH3r,&0RډRZ ɴ\eBZZ8XzC] 'Lo?@yz_ }Gn.XÇi6<xkj?6(Ag#.%.b֭C CΝ1cɁ_z 55EmUb]z!DBR sw+!f{A-p;+VV86z4OK@5~<G %U['a8y2DLz$x n7+r{kk+ 둳o@V47t)/] /IN9VGHDsVH죫w`8i#ȌFd3{kkYr>$˝k}QI|W9b}$RE1BX?s&<8qՉ !25%mK@P.j5J V2V*>P/'hILr'bᆪ{!R' t3f-%Q(x\/5Xڱp/nZ C]]3 Q(pyWB]]ݰY q !b^]lWk+5Ѳp!F (j%$׮c68VyVdiiP琥cpDvyVL4Rː)fS2CDœ9lZ-߱9c1{bP+iiiWl6\.8Xyv춈Lϑ#w872Z[Vc%lڐp2Y_zȌF vaR_|' \:lKi 0Æщw =))M«_^)S@ *;C~1xM8>e4rHR` t}%Oq+ cF=82&Θ?ଯGݴO \$;p(nTYͅFa:cK;v;@^սMPеCh_#W e лXPۍee!Ԥĝ;v@*Xбy3f3&流1J!b.An&cǐx1t$& jE[&, TkKᄺF톕q8/"r7.e nK ݎ$eF#CmHj情bom-kkij8TUՒ Ȁ7D\&O$vzI'j$gPaҥKLUUH>B2eF#ǏDQ ht"d!QKuuﭭbFi2A2O$UUH? GpE\(˝T߃-6w*?R9삇0kMXh 4wPM\s$(Bp@Ԡy/^ K)C<6f{Xr|v{`є^We%Z.$3s'oPXuISa"y{kka0`p47/'!!>VFGkZ TzBXxTWSdg#' @yZOC…H//1#FqtȈ`7x\cdVVBg=/p $puށH,([qgbAR~xYbU W8Y0I9X,p'R󷲤#x((KJxV,!Xz--tQ, F#/# B\`s!IHfzugf q=T"uD*urx6"Թ u SȝJ֭CfܷqLDƍ43R?{(ՉҾqc`Z̪Ă"#CZe=` OkBTWCWR`GnM&5d?m` R;$=8 BkGk^h a۳w8۷w`f u\A|8X/D4nQD{Љdj_=Xj!Ui.Z VXRa\K N>|*3@5f /O;eJ+}'N q=rZmVӧcy=jď}]5RսgVSde&h <*|}9ϩ ow7;N3b$ -\ƈB bNjo%%^] ƍH)-UV d?$4"ဲݸtf}} #=%hUw}ۈlBs#Q ħM~!B=R I~^[ȝE8>rlܸKJZ"i$$="ܿaBWTkcCn 4el%|M3Iow{84=WKˀ^!VS**m_|~zGNǴEоh ,<aCkZ!7.`w2paFXzh̭so4^manڒ,9V;m w !MI +d8ы rh;-B}7Z' xe" u`bu`]nٺ]&6YR\--.UJnM(8zqxHݻy6JeI ?a:2ʔPeI {w 6k[ٺ wO[:b57}FmH1B;j?|D$~yLl4e@Jė=k*U|En+nP"$΃J~ȵMi 0Bl0׊P}_|Ac $ |v;Β͚EGRfb!7㺓RAE'tZ̙H<|,}ݐ(t#DFe%۶ Hr>aG-dMmhݗТ2s ˇu`v__XHb򋈈0PL0Vgz7WdVUrcq7ZX6n$0*82ܜpgؼ1chʌ5&~y^͚^?v$vCb;Ezy9z}~dXt}%۶ 5 à)_* m;2ЈF.b򋈈ȵ@@\T%jƍS1L":&^оq#zn#Lrv6\ DGUROD@76"~x|R8aB [4(8̵W;  lXpU^4!KLs3oT*l6ۭ>D+"2n\L~Ds-Cpa%%PBI U P,~\t::a'c:z?Bfe%T}.DkWk+9sq_ oWYYFέw}eD Tq1Ʊ1~i1 m&;c`#DT*iC!-Fឮ0DD7:%ZDcR1EDDD\H@;rhs6Be@J,l!X׭I$Ϙ&++D;CsYF Ud@ h."+N3Q6W_Mh:`;tB,)i22'_~u;kgPV?=}~͎pd""wb򋈈gcژ?jFm }x!xũbƍC#j 2?l0LRZIh|'z=ov@ gueI D;~­[>NFoq*ЖFDZc!ǚ3SG1 m~YO\^¼GdnvK4D."2jtGsM,d +Q4}%53nK&Bzzx7 i`] WZ#EDDn[Ç_\5f mm;pmT;ز%dpѣ(z֡NCyy9֬Ys%A01vu] E =#ǿF\==?5 %eBw)+׊ukF'qcǎ V.2 s~򋓽4t:E.""rM[!d4 ν6JuyZڀUW w 1c7z*ܹ *(NȏocOL~K|z +a8t| {aϣcz[nm:}!{'Pi^<EDDbBzrr2J%M~ '=6Cź"""rorHHH,lE{ ύxy +qL}V ido;gP60G rEkRkq> Qf'޾@z|TQ{ܞGٝS_>+2QP?tVEDnTD# iiiH`ǃ*ԉE"""w!8C! 9 4Oz ǡ=}&HABԕ ') Dt ?B%+DҐ_э•5 W{P7AOI]O3Ywge MH1$\<)x>(_DDn"72+ry/Dn8NQ2J(%>P$‚'7{ϡmѾ /s *P@~h#;?7}N;V w&mOa%$>w&$XNl*v%r'g(ӽ_*U7; ,j#BC" *8GPdApe=89 y(Qi<44 44"kSQt*U8C'J~u_*ٖ zD }۷(~{mBFQepK*`l7`Ii/8.9GvThzo5.66@a`i>,9F!=($/_EEe`/!O=LPpώ.=!`̛\uAP|aWCӴd0=XmB#[H\P"v?t+n\s=|?p bbY'U/M gn Swz!!lHֵS1y$0 W A纀cKs1LFh btZ_|_?0-1(EKk>|쳌7T/B]u~QQt:5 7I9o8] ;{'>m{D8xBp v?ï듈{۳G7I|NtoǮ=mK$ӖAm"E$@b6kҽ9u$f\+sAؐs){<$?`}!ff Vh;W***A9dh2{/*w(n2#ހ@Rx'-`me`А|Ta {A ùZ2rw^h3yJRn&@Ԝosv/8rb [O).T憻2qз}v%-L%%$YX\)^%iv,'w#z R|>=Jr[m;ФF17Qbǘm<3V9**D[4:ȉT_Tr%t:\vng6h`s"4[wfth|m? L_ M,Y˿d1 r ቿvW6 O^ϨJ=}Ack|ER&ʥ&" bŒ43B1~5Cax 0=m VnH܊;vQ]NOf/“H4>~pJ9xfn9 OlE]C׈ "7=KRB 7rpTϊGg\6+!;J 2l\fVTTT2s)_Y4/**= m=^)dg!HtQR-*}OvdIh_=yh/Ru$1eA<N?iU1쑬w !]kTwmtl؎" ]R#њ`ILG>N;E tgA!}stlP_ ӥ_֕M_4CYARoF9Z_GDž*UT~%Ec˕ EQ`Cڃ!RȌ7 d"@lomv687XRD,+osIPa;4S(xI>WB[ ;5qނ3uNѾQRA!'K8ݶ%m[<3V[>M>@t\Xy+f Oj;GrJƄR,xZL(.U}vGbȘ9}d****t:t:q^}fu~D:>X4+$IJ}U( B1׈H)7Zo]Fh Oid8o:2fHHu#D9GM1Uvdіcgi}O9`Bތ`0D#j_a@ oWSNX ALVVoQSR&֚5M_{kۅ+cm *U_9T- 5m4aqS^u )iu(}Y7p#|xP#1[:PQB/d-ԕ uOWg`yo 8T&?(T̆` VW\-+ dK6WP'I Y.|#JQIoB[\UHT}G3lJvl9E`;.~B3f\\wҽ-#;Ӟ6$S#u"J6"J02fD,eXtzhݭy˧).h خ7{%B;dC-e @ "LpyC1"'ΝpKlMh]E[֊oZ k&= c>_<(ש ƙBjN@KQ?$Գu~Bn#\˪zTGSu ShpIU*h J6B[q\K^AGR@DM݋$-O5(= ןΟ"o2qCԔF%5aYhod#z30'%EYV}Y Kc}D6GD׉l50IkcpHHMrE0`p\َ/: 1K!\5+aҙ$!upyC۞X9T0'\Y͓KVo+Ƥ {+Sz:dcXTrHrx3-µ[TwGahg#l 3WcǠB^;,^dt>_lPH [d[N} &\̀Ye0L$WvjQȊBNgsdh#aPׂe77 MR*ߺ]/$۾3/8a{ ?!/d@"@:}m͇Au6;pq;Y=zR$Ih'"+zreW.,(a6B]H 0 VQR۴ 58Q.ԝ?k}G+Jb 5^AyP |*Ҙ9xh#a\eowzpTEEER/Ǐ˲ܳ H$JBdȆZem!ǿOG0) Vo?D@>~&k'9ww9ѻGS }۷SA$-r]Ⱥ&AL׽`5@Ηם?&9/os]|9.ՠ=m7;!Dslu XSP!ܷ.$4R-C.J2NpxP l*y+HD ^EEo{` w*tMA{;d)N"19UQL&Co`ϟq:EdD23K.yMI|O z1*廣Lq9t(noMJx,ȝL.Ak3ِSi]h( [8Ԅ{L_P$cy Ux-z;aQSEEerمʥ#\|Zy낢] F=N"BrPހ> Q#6B=,i+(Au6.'\LHf1/߷Qxjrvh,1i5T܌eżkLlE*f%4} |B瘊·@פ{W=%X6ET@E MӃ:= #FrVE劅MYm_s- aLYvAZuKs ȷρN&[NkL5 Ymv(^h{1Jێ|,'w^#"aew&I`w'"aCqlI uѺf'zԜsaQvcIqȘ9p^;,y%./s61؊Gc[ HP@ށkҽwWM ]Jhx*%sh ߕ'΃Efք~ZZ_ȖS&#ʶsbRQ97Ām^:5"EwXVq #))縷"XF>=%_3{Z᝹ 9[_;Q rPLK1ZRh;/5i-Tt%R'gΔA6'RYJdDIbB9;$]Ϡ=EGGz \/+ة/J9GvI2f+CGr,'S)Q5e`-*;O_Xz ,Iux6|wT< fȞmg3x%[Ng7Q`g<=XE֚(jR{b~_lpn`Ch J8To)Z(%ѼBDㅆK"SlFWgLP:SiźLԝL;KnΖGyƽPi% ;Y?Gԡ7>A290f람"d4FŐlgrjbR!CNإ pѵ04NFA)u pEd}W&+:*dCH xu.crhĿc2̆!MZ{`H>uZ/@sLH^gGW#nhB>fp)1ʴ54} #&hA/Ϧq:#tA_ܓ瘊mg%X\Pp96Mg^Ґ; aоI4TBXd%iPALg*:+D8H`.6{KzXgD߷.~qBkq:z HS"K>"al QCLo-й[E {p";p#T J"1+ME.ڟm1eu|VueGWC,{H%#S KR?n?~-w?!M_"RzB% A \{-E|??y. W*E 4M_&{-R+p *r$#;@6} .\c 'g6)`r(XT*AΑA3 WJCXT+ZrFg>ɢ:cVςв!hup]ͱT_+d^j -"2^ }rl\ S0g|nm,..~` Vؿ؂ z;I@*DFwU;aK>_(*jiBgqoݾJ$3{=tSp$[eiCd8р*_3m>b6,ĖT@ќݶ)4!7ӖwfkAnp0w%O̔r;AZ$;Dv{-#d,1[uY}]GXU#ڗ,j/6ʖ'"LWA0oiA@Ԝ@xg_d&GVup-y%w3HM>B4ImZ{k>u1C^X؂@,vގndC-Bf; ޲JI^DNc*<w(N $BBk) t^hޓ*/(uD:# Gٞ0S y oelsLL) 4z{tF ;J!bȑM2|/{Nj; aO'嶼j16w?2f:[[x #ok+Y%2fNmT (.}r@b@j?wCMG?~•+GrPs#ipTrP{7` Z*TɳsOx,&@ħ#ev]l6KWnj^`4AT"yps{br[#;X>/րrytDWqa0c-nmWJAfF!p;xxܓt HWb[[T||c @{|[KrbX @Q2BAqakyR}Qc<=ׯϠX,&rYxY CwОٟGe/1*"qs HhSaiT88G:o}oK [`>Y zzPc9-VG?!D5@גW "Z+$ N*`K`|l[еUF,l(=%:v.h Wn}s7= #}8a7m@Ap*m ZIw/ +=G; S3`95w`ע}쥢h-G\`ELo_r~OSr*Cgpch[/ޖH le mgSڨ}%:f@?Ag=ςeeU`psHtzDѰA%ݓwGpɫ0tJܷ.~M_MD)Q7ѱsz֣&{蜵 XlD 杹c;d r)>߷ su/a{6}o垧`.ڀ mc-;a1Ȧ{\SBH4 U@?1ڈز38)xF̧D6=sT!0\[UFz9e8anVv?_n}M۞Dk9.ɠKE%2LV-(]sA2} GLe@6HwWôIlHQଧG z>AŨEr:~4j9k5yW6z"E["neo`mѶpTS + Ӷ'A(5nzwWgՎ6^y@r?2tGlirÕ+";7߀%͠}x ;a1%|lV箃gͰսާf$gCc&gXp̈WdE&`=)& ]K^S0o wG᝙{ƋʋǷrdL\ߘ YOy=[ Ai=~!b9 XF6n(=+gf` mea2eWNoh.I'/T/稂{$Xo-up3,1u۾E1Q*5Kq7mSʀ$IxwfQIwQk;FTfVբ f8'A'HS$%#f)pnDsg Ql p֢ľ| xc|B6u+*i}u ؇%{*]y]d.~i <|,ܡ s۷ XQL ~Ų)}Va9 +U]&Tў]*$)QSLN&X !J{=tOB:/ i)[g*~ɽIP fڴukCg &Ꜫ ~HDgu HvnnU٨X"f+g8,>r_?2a]t RўvD́6te#8wWǵ0'{3LDSCB ``$f)-z LnZ&p':dS\j/I^J~zS+ tTDѢkM}P6C |`;c?䢺eR.Y*y*J*`8]< FZy'ça59kO"tCn[ BV~35C 3l$]R.$: gU?vHd.I"]' Ẃ6 FKt]qyNRqn?Hqֲ[ϯ@Ogq?an=-+E-!_[)Rhރ( -*DsNց^+yje\ul~4%/!nAh 9ruvt lԁ9;a1DQ DI*YWs=Ofp"pΐE5ZAܒ蜵 iM% =a<(K$ta"/c-uѸOu;T-ynuR”r3|0K^6St-|E#an= Zw*!5RbB[BZ7,L^z-ikY&ӟ=#s~9?A܈ 6MѱsVa~A0|œQQm ׃9tP[䈧b~w5*x-CMv|bwZ\*8àmillQhH=^Ů^#w ^ g=TTU^hj:9f G *! #,,u+,k!N'Y){i_8G\<q/QF]hp0tK|6\ќb'ᘴ1c{̥FZՈiK=^wݶmJz:eKLZE {wr wGzW4MB;@ 6Bt.fLr& T[(EK S)Q@:s!I_,M' tDT mn7й[vԡ~Ȼփ޵d 0m{wW+p*8YQzDI?:ٲz*m> dTTkfҽo{lwNhNX2lY wlhQ*WeP_@h\.Uh ~W{9ǑK:6% N+1ﮆ~?ǵhai(E~:ڀ0cuK ki7=Mg폼ݯh= vt n0+KAtGM%}\/e1 S|/q|ghB>hؐDnp?g [A$Γ03Kuۣ0g>{7:k عUI)B35l9wcلXtQ;q NG]s=;~c<,;O5';|^U[)W 7'E(4xUTTA(UF##lWskZ?t8Γ>/crTqUj{Bμ}oCfLd{zp^mkxO^Ú/َػEQ "F(8+ꓨbG׀ ^;ymC˒P|bǢ[W yvd.x/ؙ?ɸԜRCތi:O"d+%"x]8g;{.xM8(i#e[+v8ř;@܄3j؉K/I;{]5Lr+,1{_1{9wˀ\҄ !WQ( 3+|^mfs_婨\=fq* up7ER8״,܀B_AqU i>+h</g˒.@T "2 P": a WGVEE$`#`0j#n& ,"C!#v# "`/Ohce'up0~D9oWZ֦.K<M[`pCOeOC=u؄Kb6"Fb቞ y}][t͇2{-l>(ȖF^»nFWga!8:e-#7Cifʿ)S۷}\?ϭkR%[0ߝvB:~ $`?^ygyw!Ӝ!S8Q4t_;AQ1:@1-[lgJ47A> ^OV\ĝ:I]z)Ra&"hh_oM+*t,Þ]ZG*xZh Pz+'΅9e1{9SƖz5~1c\Ӗrz?#oDE(]= N] 2Mcϧ٤Fv.:SBS!G\.}onAbGbG]H ȑR$Y%|zJdn{~/>Tܦ:EL-ɤhx&-B𔕊))Y sJ&/GAot]rz5Iz,GrE/'8@V:7pH t5z2 @ajGhYY>y ף0 B-K 7OOTRL*053m8JB%}z; ,|XN^pLI$ԖY/ W̑,T0ȺMu0: AZZ2YtGjj/8?GD²o"XȪpnK C{Chu[+db.d&z.84չ%5P*ՔɕV[V GE]{TPy1'V.W: M!"3=](Izkf:I$Bpqէ0d(ϕVy(y̨w4)}3X.jP!WT"O=RXhiGpl5IbX|/Utb1{9"Fk `T+Ē'gq6 3?f/zPHdGEYW_5j4mZӥ/vWHdі*Crš*W d }Ny`|> ]ӗ&LH~ l1E#2k58R2p v"h(g'/e G@_'.ܓuR.KO%jtѳp8Vg^ܶ$턦-V#RJ oi3LAlJVv(NfPpEfaQ-O[ \EDS,ͻg Fl;#qIF("{7ܓvDV0ע`ߖW1)\iZD$O+A 6EQ=^VTj\epA4etҦy)SV"8u G! )ZH(61 3VLs dscE_2wS>md㣭xq,Er}#XGi1{ddĘ]$?^|'l8UvQ-1q {;+(%7;!N\ME'v&9;;Ⲭ3 P hLeS@\SdrX+P*N6?ޗ|`H*@4Ձh b{H|Z]qt4Ta8w k b"$}YEGd,<ො([`8;B[pI]#}k-񀄣 )~Zo'w+[q賤.mlPJ]鳛S+ B" % ى5v`xo1,Uh YXػASKqpy_u˕^K FX,vwʲ,L&b*^}֊>?Yv**F OuԞ:')wıPx/g+F>Qzhoaк5X|oyv܈i >2ԟt@'ϣmO` ݞ D}{p po?1q[vbbNwQp#_` Hw(:~FLGAw4Py"񝈎QEn| Am e+;i \;%+uNK@e?nA-P'7b4 eUh :z,KKKZ+UT Î_ t(4'@9A3]1ڔ] n(= |B"L3_,AAO"+ԶR"cp?:7̓1D)v?zًt M}g r<@[@Dܡ`\$pz?Y}4|ǡ ej6]Di!pv/ ncϖHPZq˛[z{-n?ADO{_ZoE;1ZwmqR5g,3G}_܁صUJF3 tUtRth:Od5{> 0i>8SR=|Aׄ h.x-[_VSz##& aC0/3 ݞ~Pxq A=sNvt{^D׍wJģ 2Jן[-~2BH@Š[_@AͧxS[0_7<в9ք mm&$hA瓅zN\ s C}?K5kw7Zg#i7Tݾݝt;!B 0($ &@ȂʪQ!:@8@ǯQeQe 0%"[#1+,}ԽU];!z]O=d3z̾-7/\ O&7tL4Dhg2|yGGGhE1G0ts[QL1HpZ[~Ji+UL-QDOENVu6#n"uΠ{.:~wkc+Gl6y5lsreBbIbK8,Ew |ٗa诮guM%,kt}[i~N6 Ly^M93 ߃TARxw}乊-nXԾS:L̾]l8<4Bih7zǎڵkYvm-CJM]6p8jG}6|,ްjQ:S$B>l/*ťnVΠc-/;*y,-%ӱ'KY$F왫ڹLs*DnҴzElkvD ڬ#gpA˶'E+2dȐ]h VUGiTO۠Hf&U-''7YQT*(#03|{qןT1ڶp ]}FnzI-,VKt@Mb;{~Þ_D= uv›S=?yk9:GnExS͈r7\CzꟿjizbvspXus19,c2ъ!.Z|ܡw+3PFҭ#ֱG_u'3lob%N+Ww ?L9\N Q=Q[ֳ`=JTtN~yt|CQ16 ѷ|Q^Ś_jvթvIkk+6;!6#[ho z'=7o.ZXeGd0Hy:f8oϕWz֙\(#_u뎃>T9ftIm{1ڋ*Ցɏn&ޟ%4U&u%˟DFX5زeK$ihp:9큋Vt8vZc$`H-Xq()'(g&bA EvK,U=_Ĉ{ss{sR,A}}nnWBFo m/' aJ5i!r+Yvv"7mTG_7Z@ кPh Ĉ4r8Ls0DmLnr1'+\MܛPc>DMPWrsowU74yl>{)kKc#5p6g>C<:?|:C^hز>7T^)_tKN~n;BMEM}19z^F[V :M2 ( G⸿ъa<*]18}=mվSЭ2xz>N_ǒe?٬9O\(O/f$vgql K u~^uHnc9E|պ}T%>w=X!#6N(5twuQNϠqZA<$3)F2hZ_FazI >!qlhr?DoUC<-1毒7{~C+$ktXhYonԶh*!^~d6#_Dsɏ(w#!־HLG +KTch !C4: #1!ԥ qBDlM#Mh0Xַb' D~U q03prYzpI}^vIF{M}Ǿ8,ں퇽0rʪrw:hlsCVZE&0!-_Ǟid2O Yf@[ l#FT6^6T})l 'u Z3RC6Z/ۯߵKw$D1!گF;tk\BvazID4oXD:l7"\ ޱ,Nmyh B|!2kC9)E@αv`sP+'GӁ nZC?!abBEz~p8϶;>/l$5,k_Qnz{^|M}DZa9 w ݇˰?o+?fFuh"h; xq ZoA4Zkhzx\`Z'oמB~xvAʹvHy,Z?RLG %cLF1y!.C9h&B=R'F,g7O J]Ut{>pܬXQ_0Z]wݕt:͡יLU~ yPoz͋TR[Crc}SX;+ {~?Vr[y2[v7ǭV[[[nDʹ@NmB)j=\ 7C/. NG v\Q [h'_@ʋ4J-@skKykNlGcy-vl)/F F (QML|XlA-h}#U qBcpm8n8܇](ֱqF79hbMUo!&ZG~!&[;FZn0B6I.A p`BBD6Rwy z_g'{Qg68)OC0~ Z  p`8kގRl1!VmoI8;*gpx8?ъ|ذaiƍG*ʉBT=wCOc6778֑F6+JM^}oק"%!ƤDEab+;k)7)-!>Y>C֙YTi~_l8!QJKyYY1bZR !F)c Wv8ez49\ֹW=w8 >jg.A:yR!L%i+xUxޢZb/~JelkvyBtbDtJWx[pdC)&0WbJ0!ƣԒ%D%1zoKl@FψT_6Y>=ɵ2)O߯K9$aLC鴫;; ͹`](]e'"f A![Q"OBc}FC PXh 1CcJd(֙He|iَc<䄶y"oS9yʰ? Zl(yO#qDO0J1ݞ-5Ly7z{ ġ1{Nqt"(ǶVL455%Nus4559v%jhWC l9qj,ɖ_ ,'Oj6)2e!>ݑuD9R D2k[lw-QgJ=^MJ.Hz~l! +W#oTi-# np#PR֓γ 3tؿ̍ؖ&nڴ@wsDu vv$$a <k}=A*RF16 J"vY (G1VC+U]ÑLx#Њva׳baU< pIu$pg"D^*ws2Yƣ.h}JL8y^ c6.du֯^M%| I6<1g_19O|kloX?1)O+:FȚx4{#PKe>lQ68$Wq g.? +vN;E+:'Z4qB{`qMR ªyWT7R~!w|{IBLFjW*c#`IkޠL~|~FGi^RC6cȍLf/A>[I~a쾘ɰџ0)!@;Z^$ʣ>$U_^;C8w8YG=D TēJy '6Ze p=GLjxh @6"kOGs5Uk~!N#^e1C T [*))h Vԅ&)3VhSfѮˁ08a&|G <.7QޘW]]'̶V,LnqъF֭=m4 ڽ 2Q4Hy"0لMUKƶP&M +%LmY{!!JܚBo'cQhn*ш:%M.ݣc(En< Xkǿ|a j&P H9v#L11s2Cj_Sr|N;;'+Zs/---Nh;#&ؖDCVĊ[94Bh= WYi*fi^+I;o!.V013x^I"TZ@ fJM85]A~00NCmୢf|:&l8hE %;R)6oaTh;NP7oD)!vGhxx3CMt^4J 6 lFyT.My I0Lwj}t )y0f,E<_ƼiL&N5l$R7pr81ъ7:}r  ڙLT*ը;9JUXۚnB܊@ ߯R'䐏[agr.&VLP8 'qzƫjZfzsU^>׉Ga&;Yy `R~NwD8"du.B`FmB h=x 8)ybP}Y[{9q+J%pZ8Lӟv<^e욒cNL&f[e|ZvAp'Z_ۇREU: !>k;cBp2(qRNBʛLK 7+:VM۷ii? {nt ~UZ QϠ5gEcк9g7NS H9 //h 8oW*R~_UKH}rn6zh^V'aӦMNh;vj?B{ygy'k(u.B9إ}>tۀ7ihў;dc)O!OaL^ħ(x9w&o܃uv`K~c"N;vdY:::Xvm#ᨓ `ƻH!6bn(#19+ĸo6rR~,6|/ o_f9K6{ BLá5`/v a`HÁUr~"Aԍp6Ȳ],ҍ;N~4bN멶Z8&@ bqjsⓇ[m%8m_{ *~. G@hJ7)_'"Ř"y)bdI-&/[Zct|7H?YQ-MMMNh;v<w\P>$4Rx\ۡOy&q2RN.nNL{+X/cғzv-D?l[71pl'W͟jRaJFGQx^M HyU*ojַqND!z5G4y]opfbCXLQ'k5856YMLk⠲O0jEʯ"^߱1bci}%J47h{ys da| ֭ *Hv S^Q~[M然ᄟn7ъi} 9xڮ#: )O$B:)'LК!31)Q:vR/{4y2h:U{mډxQ|umdc*40jqѲ`^mZ\ |ϕ(5pOddc,{@h![StmAEbg,A^@sr0QڍG!Qȷ1b:| #:~ׁ7-1 )'ܠO L)1׷|M{~jѕzzUwf:#خ.ƯF$xf H9}O#JSFR !Axl+v'`<.@G?ޜ/D #Ǻ*̣K3yR3bxޱh:E$Up\K~ !|;;l~(8}}skᨏR?$-~- &"0Y[wcọ-FgVUhCCxhF_k ?޵טfLu2|>^%e&gdh}mnRYO#8^ykmsmL[.xT{e1qOysrNA P| ymphGȃgY9%ld!^~#.BE+b˕Z#D;/gha}}'N" }}Y[~MGgʊlߟH*RI^p@ +H9,Dc>HԼcg)KRt׷}}{~lvg( AĊmWQ*xWXg^mkL6y\]\/'jۓ y2 {]3f˭ܹN.ߟO*| Rb.JԹHy|C*9R)6k1_?'7AigB'vsOsu2yR?ĊS[z&pKXI"Z/-b^*?1dJ=MGh}_N'އ?Y.qc٧kƚy3B웻( >&g|`r֪R8f"]`j4cRi֣v2Vx=O5~n3⺎YjUQ5 h:=0Gvy7J݉DA24C_DDDL*!v_u$q6̴q{Dz8Jut3>ƨ՘nӉXZQm>@OTף Ry-rPʣ4n1;;(5"1!D쓟k+`;b*͇¦(phJE睆G[9A ϻlԹO,clpRzrcc,3 ~ hv$|u';/>Zn}_`J=^$΍ߺ/;>smfߦb5m#_-wy`!935\HA#Ogg'[Ttd0v*j"ii^ _%U bQǣ7G0ϠKSd_/BALÄ[Xu&ur lq^1h\dILD.lFʏ^Gm%wiǡŸb2 9B[7a 9((ow8KuI&}q"nQ@V̥<!NCL4h/Me1״Vܯ?O h;&Pyk"9m /f:osV+V}hVr, Mnh]UhMiSI yUE͂JA랜}FmYaCe2՞ט"a)1anXh*"0Y_,.!APu"_57LBVz=egظiE3BBPI͏=t8477;v-N礼 :o*'o:qvgZl);&Byg"Dn|2|)HHWC++-u1RNyGscY)Al5b܏>ti(0@h6%1ZMñp=l0N^0>^ 'jWk}Eo`ҹX뿂]5DE6nfƛg&~΁")V<ާ}z;i  31y qatM|&g dbO#e"w~?8vVvΎASS6m B;ʚ5kXfMUۏZZZ=ztQ&w0߰a===ZS.4[BkJJ|Z":zWKIn&Z+sNO'Wy $ y(%UA>ԺxrևRˋr>S}E*cJoQjZAIa&/Fqpclֈ}.bI7:Bε]QM'X0X`>J-#@ Ap{Lc*v JRJGq6G(F_#ůEHy%?!1Wb0O;'yr|Q)oIO,HUfUIye.1Ik}3}}7J-. ]dV+M:!!l_nxJ\vdYڜކ^իW//I 8!9>Kz!LQ-H96qtwn_ciٟ[|)J?rJU./ETsb$Ap[ks~xa}=RÞ1yؓl*y4IaGZUԗj[_RybD|_?[D إ?63P%z6:6ZV6}R mGqr")ybGf0>(mxޏi(Zara`/n&'\R/ٜtNLsLMsH9=LeeDq־`٬&:8I6+ۚB"夲6!Ơ**[J&D1 )&zhn(8R~=f+e ZߌR'ydߠ^T4I/!i؋Tj!|7U VOQIf911^1lSX=f2wt1QҔ:ݍEH9ti@aG0A&)m'uL'\)ªM!M8ےv'˫XRɺT\e)b\B@]Sv !FE1 g8MMarŻmtW^MЬHP9^S:S(lT>{2p=,t2Wpl ^{5^{9r$tvvbÿS˻ܱWZߋRB){W_՟KqKm9H2%}}o%&٤Rkޡ͛7p h{W1q9qgf3y+k6a3dÎhQp &˜j1cJ{{{:thYKq8U\'.;Z16'J'[-,|BK<8 4N4`GB!CT>?ֹ}+`Yp6+XE,z^F`$];tusZ^w ;eV\zͰ[ntX0Fy47U'0@rtѬZ*;;]NN-6 R1nIr';R{ZYF0aCŶݭswfULO)jwX6dn\ϦM>GN$&t:;븳9#ޭ:|ג5DĿ0qtoO+ڟIF ߕO|S?'bk8`ϱUoa.=r‘~ɯRkØ9y&GN8Vŵn2$677'YI6p8;7 a-H੗c?ŗOW^_W~<'qLܝ‘%5DDxM;`O|Yu\YX!c0vay|H7yO,,墓ϡ-F4 NAk4c'нy߽׼O{FɅuaYJ7S07,} ]n6/s┏ /GEI:R\Lb;ʮm 7,.Xx>,`0u}7^悅Z=7&_}9}⥳xۿcʬ0UW%/ 0eQ.O_x}_s(]Ƒ<2fcyL8pB8{/%“/f-VX]$.8kK佑|N ^8c!~~s5Oۜk)b#c)15j8i1>~+WM{^tZ90ݟf/.8Mi1/H!'%Ӑ~<yt6k>X6/wqLOâ4%ܤozik/Q]W+mzAF%Z$ @ 0G.o$dbdLœ1>e*"5xxƎOٟB=G_#I,UxYf Q۩ٙ0\7l|]~<"fiqX4d9sJ^mH9YjO .+΃З:nP߸ޥ?YZER6! I,Sk$g@ۨ@xxxqh"t'888Юj~텽}=qss于/s/ 5E}YF5By ckv"55G[8sYͲ8~lD#Q۩I"M~nL|AZfu$?>8/Mqy1O5r,QQKai16H&&a7sRr E.¿Qk8r6c9G i,9+@ yYH}ثxh]>sOOO1RQ/l,eee֢)..iE %V{u'Cu1_oEx٦kF}gr?&ڿes'?eiR\^6C.HR#O1nd4Nc q*؈8{u$DOc5:kxlx3r'W뇳Y/X۾y9MJ)Q#&=9k6Ց*Z"@:Me4}}HqeThb"c=6"|Q@qq1>>>zE $Bh_'_{C&tjo,b>4c?1 ჲL~sX&qR|Dfik[`ˋ>X;X+qGM&GegȷG<|hI;ΡHݗOq:|A·x)64乓ύLx>GmMxp8)Siu}|B$Wǻ7yo.+݋.!?G<;XY**iurͱ 'sb7GdoΛOACWN 8IId*LDLJEMMMwOK-ѯ_?/H[RTQaa Gj=Ff?6[r؈8)}6%"6X5W1wi(qݲ$NDZm͑:vj\Mo^JB26"ۏ˓#SqQYUZc=A.*E6/ʛϼo,!&()8t,rvjsh(tZ;wߗy3ݟz)׋I|(ż `{,ާ`EqZހNʋ,5.4)j{?vjylHaL@HpހƮ%s[^ V٘DN'k)&QEV-rDڝ_k-~9h*x+)+;u_ i:ԑsC,5zҘe9q+YpJ|o7vǥO80U5|Y!֎%l&|u$__ЁCx:\a-./VOVԥ9*WY=GrxkLmMjʾ̽,[ȘaE s'\LM$Nm·Db7ZTnV$gX6rT7g7tZ.90mS$B҅Ag6>&$ح c9G9[7k06ٓ?5- 6C !rٝNԨKtB["{/a}+j)*/܂\J*/Ş[x#mݩmL됊1g#v}}=...7C {{{\|!8sv(c;W= W< ?so'(j|EfmGkLȳ~')՗:$0R=KR5-p 1ٗSȢ@q2$bP۩9pܾ̽,/_ Aثe?k,9{5?(Wu=c!Rܝ[r @_G1-zBh.~{:2~xB-1jhyg'ҭ7^ˋ7Us+-o'8yy\:ʢ;(y1VOa#Yg3ۼ0*p4!!\MguA{67孧ٕ*[G)eAwO~-̟Fҏy~,ag(,-@qAq*+"꾱r-&!z,s s%oZJblFƏSǩ*N F58c&SEy_ ?}NMhNbRɧ_RyfFu乓 e1sbJٶr#5-?сa7$kX+ۏsyټϊ7Uc8b7r"xݙxxu6ʊ+q7ݩ(()`csP۩7bo=LȉLZ\dk0kͤ:,}:ahll6x􈊶hDRu4:DWD57~ vvYGWbPNMaiBHn>_o발1G>Dh-1/rˋ|gŶ?OQY5#0/[/m;\!!?NsoKJ\q5Pj"[?ُ͑/$V]#]Z(\kzܿ-z\^'Vms>AwYj;;;.?ZWWWc0(//1zёFB`0:'>>>/DOn NQjc۪{zi'c/+hҾHcѬ$&" g _898)q2!~ATX`bd j;5.&i7ZS&PÜ9Šw2}6q<0d|A1r9MVǚWw ,!Yo^TfO佑r{{8P\^LA 'I898__b4hX#j#tv2#k픨'$vj}?y9G8r/=?3ʟFOEUg3,lQO|,#s;{q/[IWc#l,4Mboo/-#/_/)~Q^QjFoB|-a?s)A#,D͌8"UX; *!G|r/k֢-E_gh9HGQYKS2<0Iؿ,ʤsϸѨԤg9G׏?wgyo$uJdK[aQYSfEޜn#P,X<@|d2\\!` gqY c0Us s- ?o?Rtʺ0,`~sk;!g2-z: ;k -|Y[$!]W(認E}ak#?E~r!q*}<:[Ѫ#t|gީx_wŸmlmӢvEc0,ƭL2}9G8s#0@j~quϽ͡T$p5R1CsT>Bq҉/!p2f'_ HrQ  < =HqrU{dKFBt;w*ъjyGyD<]=ykǛ?E {mX0F&s4爢-zO"[_-_ ]Ih4[։pN!{BtOޖ LGZFB֪7 kJiIR=h"wmQ|SN*>ʌfѓ?YzEt.V;N-|0 B@],z#::qv <EeE>oʕ;a-Uݥ4/*+&[HAm[ EO=ydA*U:a۵c;QYSi12123=/7j}qm$&$o;sO~&, % /v}){:}4Gs09Vo C ӧguzBw ]v[n ?58s ̣9GAz4Qɒ|_wuϽm PNMVF'~)s.(2'n0| H~躄ikсafK (5q9¶3ڴcg{È}#HMrH|$!?lT\&;mԣԜ˖Ǐ 4쏧+<~'ێյ#mUUUwOApu\VrAOÚu@JIݗB}cQ۩8Od%>>df:ni:Nѕѫ?=_et`!CsIy~$I 0fL 1=]=)./m28Ģi 2"ۏ9z v@Rԑ6VCNN5jۻ]?yUUu#n5{[&†;1">A`$x:ol_ˑs׶w?xTqo&&DF1/})/-&bkkKeee}wOC tF,~rIKB zc~s?aC:4Z2ߡԏR9V[%o{Lznhh@txdM<^Kl䛺oX~y%\P‘F@*9rWWWEܚB!=Έ,{& $> "?|)/ -lmmߛHڝ%k)>6n LGLjQ쌓SMF#B z<\{ 7=W 00Z+vT$m" :*ʽ'l,UUUFy@YECCjokHPֲ=&Jp*|^!$A7PTTDQQQvOn.ʅ\ =%:<>:~j^NJM* -MhOdٺ1Ο'PN88["“LM`BAM-7r#EO.jkk{E bXoꢉ֍#Z7^`[vNrOc8FC('kOQAG"׾.lʠ-vzm'PK_**ȯϷ*l:%]m\p~/:@R%vT;%M% JWjZhhhhi\=Fhw00-2S4iD:!#Ż}I,7*\zV_I:==ن1J;o0CѠ$|lØ``__hn:&SXD~}>zG yyhhAg~r 'AG1BV{w?v݆=P 8XY^lȆ+~n(H6nK|yaawAȽ/w/8-ab^pZhl448s/?~Ry#cID&s.-,n-'kqNJ/ݴzi@ DEQۨo˪9BD6C7b7+ƙgsm7sx+uZ!Yb\`!lLј\HW+^ϫUю,*)5$&_t4G ]u-Q. uj7J+F4CX=PP**ܿBKϼ3x6KII%^@>ːquҪӪO4^-6yIiRGic)kK_ք\ ]ޝWк1B'3g`w :I)pwɖ xغq6.d- tŭ+p:bT>goc`e.fw\JK AI*[g[L,y1 &/B穹RCVm {df1!(wrrjs ފchTE&yu,z#p=mp~L){VF~}>r2HmEͭTM#hmSFݕ:br-=zpPu$DFhF :lIDRrZ&rO**QWz6)SjR?[ tT ?@ t=Fh N msŐ0ϬWZRn b 3!MﱡrG㥨IJRjuuE (~z\ RT*Fcۅ@7)壵(o@fX(&׆QP#l*OWLpyH15WOXIO6 *Z,^~Rˊj{[]n18Rs$_ ;x#eGt0`|пϑ#rQT)ٺAQCG~U.+񹺨Stf L@Yc9V}3]mMQ.5 *((~r@!T*Cz7`s[[[z|jRlSuW iZM~M_V{E*M_6t6%A!xXgXq&X3E3(m|,+G|^AC(cRKseM =sqܹ gggϩT*9U^Oyy9բJ.‘vOІ]SѾlI_D L֍c;w*|`ދ@~C>^mmÜ9ṡ<{kv*˾6)n(wqhwBTX?]; x9JEMM `'\ =QT[3.nvnwiL, R Tw5?\rihebڷ)D9g(oaUa6 +d&ppM^SӷR ݟ'Z7oj;}'tF,KUrsQ.EW!Aq+^JG.nv]nRyfƱc.r߽HH@3M7D8Fh,PuW׵Ssn/EcXjE3@v9Ao1񓛋r'LJF+I %"R:5&k6pW<QQSTEMO{AG"7bB -tźV ~)t:{oG mC[_nܚ-g|F Y$kjR(i*aCVqbuI=!m>l1NĹĒgcyJYL/VߗWƏQPʋa(*寸G7Ԗܰc]5)+۝j =%t-yE 4UdK.7]fv,Qۨ-r5SYxmQQsQKVx32j2}Bo)"[M$^q]e5Lk|WBQ ùiU* Ȼ_q)LsI`5r0_%݋\D y7~j UB`v3~rNG~r '<==i\7=JhF``pvvo=Iϱc hQڑlĜ⹼>Mz6oņmYlC6`QNQPnf#uW,7Ԥv PG"IT4VPl?R#u0}dYy*/ZjM>l䛺oR׍T6U gS >*ٵsa7r;/֍W(s'7m&J#CE;uWE H~6 jϺ" G zΜ9C]]+i .(jR)uxؚo>Fc>PQQVq@QiObEd}X<)Uͳ/u漟Kd|UxS*L{?i瞄ܙp$*OY\$u5E Ex1dyR' F ض˰]D:qj?vQy"AE Q. Fxo4_wʻ`›&h֢\TN֐bu}u;aaD|tAL'q+)]gw)Z>O[α&٥*mhcѶʋ [ %)s*+ߏY"D fpS'ζCNLfn9^|ʛoHNsn6㺎'Ltiz. !{w}JՊ`B ŵ⒠{I"*_:m XPk+ < T^XIO&HPoeFJ]=  y<LO'uMhXf\:^oIVcـt__w+w\NA/<00GGG'Mqrr?LIGxyyッC4!ZS,^W\V1X=7gjpNyـt-||\V s Ӳ[necuݬ+^/@&+R4+ۆ1߼;AVmj>>m~%/eŮ]?qmeCeMY/z_僺-P̆,"T]k~#1!Nlk],LBB=,/z;6pxhqb'S @2x$+zbcTkk>{(wvvfȐ!gE =Nhu4n)B gJ~cEBۺoRKn;m&26;ceůMQcg goʼ~4^Ns4cƒYyc˅/ِauVUB_&00p>CLjvmdylvwP\GiCA/3Z7Zy}}O^[[WTBh n+r" vy–KҚϯ_/Mp0`Fٌdf_S^8ʝK;!?ݝ#k2\qΘ.C+(j(Eo]s&=*_x[s.X'ZmD_V];t 61q$9HJq9 Is&&r<@!. әXk-WT k(-Ug]GrAgpSMg"y<46:gcCkdqiΪW,dMMwmPwZMLa:؟Ƒ}w쿜]OhuwJk|g^q20^12H=PkyD:EZiWL_ѳ{\RyQPFC<IjUp >*6Zҫy]o2dBBtźү_vvO~U*%!``b6fy7b˰[nUFڏ`tt}uɮtnxnS_|,B";˵:tkQۨRb>S vn#{U+,𜏗ʋ%[wN->,L쇠ocb y |[-3fTK׍T!;BOM~itOtͦA ] eНV0-Y~Ef<[<73x|Wf'YnC_{ǖ.l"Ϙh84a ~0 \4K,LtszǪqx00|Uf5T4Vb낮]Ps+՜5<_WYNUAcozWyT**++zЖեx]Ȇܟl\ ~1p@+j:bO㘢ti spړ-}ِա4l7yaDZeuSPPp>CncLpyGGfϑ}"T68XWW))c ŊjH>u42P{B13Z^߬.nFGCc>j5hhwՙru=q ̴&*ۨh`CI,_u}܆\I.2b]1oE}YӾ(m0:% h -9?[wl;6QgCiY_.K*^]HS㘝4BD AkES ToZ,!ubkyy-ScE{f })*Z*+p~G-vlJ/W>WFccX99E"!m۹a;;5O'ITi4U8WQP @Qc{\_;{"4#NAtQ'KT[^)T<=h 7;3%oRfDPpRe1c 5Vq(+ ̘Baz< Ό$%:^(Lo>rz?wqe40WWfQiޟ`~?h$%h'lWIxJC(:mcM^lg>Xi׼c_ñۢ}Y|AS4-M46X}z ZPcYZ$$$:坾#$G m^mCڱW#lK $be C9%JL[yXXCV6# rV*ʷqo 'OT HH@:7VeTfeX("X AYP f\ý#\.oڊAA(&xXj5oBeJS%~!CJ p0/V$$< ???3QB 2,{O.~LO"ԼNJT ºk~$ڟ;JMMM DV'HHW[iYLIXY!! ĶQ7Y*j,5^pV-I}lLHhO"{~Uy^(b|kcEdhbuHH2`rr߰2PmA Ml5"%$~@׷a'vSSS"%E*yD<;"G[%A.q;$NQ_G~t{~mF W^"t()Sl(Fr@\j'q8}UuiS꧐"ݏ"[ $$ %xkIJa܃p?XyBM@63ڇqv3q |U&"V*MȆBrlGAFe&+azt4mnDɗt"T=ljƓ v[ɘr-DcKypKx6%U*r ~ ZH?05LUm$Mێ|b'opƆ H+{m4Mjb`(a,OBJ^VH@5fh0 IlAA ~h|UÕ4 Pȶ/{ u}sIrsБF<\@zԚkEVnn\Ezӽq0P APjʰ3좄GV%ݠm{tm!]9<I֔&|$iAծ$;s`vwl@ Xj=ڱO يH:zN ho܀ }&Mav  0o )osL~:fo ~Oh{xto0,М ɪ}TFNH#{=){H('~R(vZT !i§2/m+!+9T*qQ,|)ԍ&UtG͵r-t};JH)4MwIY7n܀BLSZo/h5,cP|Q&̟mBz7:$@2mW@MEĕh;(..nq6 򦦦VWpxnjhGbr$cW^gc;7LhqWa]p.zCgὊn*|ʑ?`XkfI< :y/cP jxvp]p.yJ] EOx& y5Ħ8?'< /mtvw=w}Oh~DIu sjrӶ<$$)5 g`ah #dbqtg簄DW;nOZ0F»[y S(9mB΋ NFSX̝i@u %rd702E!acޱKyq~w$]N@䝑7Ay ѪhqNސy e2X&T)Di(Cw?;-L.vqx'a^#C=,"|4am+l-4Hz= DZ8dy*Ϊ0/l.~3^p* Qmy>c׻⓰]G"sȮ"͋&VZ33u:{jRQ4V[x/oZZ"ѵR֑=f74մ`_sԴu C0 O?eFl⍮@q&qHIwʥBouX\ XHP0& K%Ƕ"/~ q,vyxk)٭}7tH\qfexjUEU-39XeÁMsmސ'˟폏j5WV8y^93q=zVצS5*`1qs<>W]Gmb\ddg>]V\ʌW9lY}(5wcYu%%:J-o H{BG@ mZšRr Y̢B*0*|!)Tޒ#F>veErL@2 s5Bo˚k>_\*3z$=Jq}u&:o ZBD`Aow-9jK%XcT<JQrua,X+cM=Ol/wEb]N*\ r^ ra$A.&V.GOr͞RW5d4PZDHUv3=H)WmoUՙ]]uLB^':?GCW_k(-u4RCiAS4@E~q9TM ӯLj _u_k *LU"9 +?pIEf0--N$ZVEmmmG]HV;wΒF9i^՜ԸnIuzNV DSWa]I q;eU~iHN#/_-aq4B;!1Q&D0sE[n1fTUSߣtiݰ W"‘zr XcEIkAjE ^^^ =I~Bo0W[LW.iO- @+(FV ]\je]z1~EA^d<1|T+@ݸJzeX T"M;i$q)j;rC?U~?XS̤tT*DWpx5T y 1hQ&|/M6AdQ5=8D#U`X1h ,RPѭ;;p}qPeC7sM4>ڎj?1q3wYcC$ (aJD^kqBd2vDNpg8V(б$j03GQ< 7U)GU5@;XE6o w/nq{tߞDsû[VJ#3]W: BۋCE9g葑nlIMb1*]nG#WXkGq3+e7WO$BWMw8< &dzWJSΈB^qܵ®$:u(Z0Ԅ[r$? r~³q=zUBJ,Xp h cwk[|ĹMh.*~+DuErdV(èx izi|{D~vn!Xښi!7"Aa$A.&Z[BowoQn*ކ-쓽N@ꡦPSj ,<  -pU"U}PitoPJ|L Jǃݎh6ϴLQV94W*q|_c矟=CbY4HդJQ.$;c2װkN&[b|%>wFlS6W%!x9"òʅ3>APm+KQΗ3?Η,ocQk+!m<漟zgV,2CMs05,~:ę $%BY`H"Q-VzI5VRJɑ=9$%l!CߩN$%<֖>X E~2 yk,D49X Ã+UWz+7G((7p;Dap;$S2rwdxЖpRE!T4RDZ9,~V!#݀"IHM" !qJPWO9D\EǣďV>[?lߏoWbkb+KȚ¢NYLУrбZˣ.Osģ[rGI' *Zw88;ˣpJt#SA= NaUco"p9jăZ">k̵Ȼiyi2<(BC2 'N @G}M8pPهu]n"/ǢpQn"Z;X z GnX;sgAU5C߉ƽ!,XL|LBHNɾXElr\|Do/|e9>`&^vwMۉ IDAT]IH' ,L7[[zT*F :lڈ E˛rz>IœO8ͅj$b#5*m 0&L(87i |D{I(},zX va ULyт,XlܦSr@t#F|E?psʰl!;Ш9VX(GG8"Oʑ̌?>oy-/Yc>fcdW%ֈĺ14zCim_ůvnKfiD_arEa /Hl5:Jtlz 1QK^\c ^ $' [7{HQU U BQ1.%Kv)V@_/gt?pa;Q()5hO n۰/x+GLLjr6c*BqBh4߿!ND@NBflc^|wRJ9B, EYV+-qPi#&&)PVmDIEGIXgX]u{Tgdge~DI\£h  D޽E J% rvWZ0L*] r[ޭ^l|@J0*D60R2 Wp~vG1)F)r m[˿Q|QHO1"(År^rj/m떶q}cbaqflتtz:ܭa^v~V!8fݠ$X ^ OAJnú6Gsf- } Y! UJÒڥwc`0HB[%D:A[QɢL86лYdGe`߹}-겖 qqZa dM㳯6%1YHt 4 NUL󚐔8,zGGPU-áo&>Cx {$%: ;;vMBܮ m ;>*,2,l0Ps**娮PU-CM RV5Vjqc!<MsxrXZZ]bѤ -e7ab-%qz"27ظM#r{ I[yXX|||Dh4aH\B"w^%p&w1Y"#̈>> `U (W1R-> 5@8xEFfI멱Km%'%IsXp[%^^Lo5E%z!E= 52wgqk:tdWDT+J45rn|,]~]RƮSPRE/X0h7j$I&(THbo( ai,y"$QqH^Cf_Qbɻr|݀D?jˋ:TWY;-=#'%bTydY&c,;שfƘGLA>#GZb .pHH r???DGG K\BBJtN'V昑4(\BV> '( ;_^yQ v"O+(<9uȴ p1MRcb("$clp5!ޭΝD3mY~5Ο1#2Œ??qZD&&G e22LLvy#8L̠r_TI'of7pwJH)%nwgwh;)3(8ISQ[[ J/> A$A\x2(C]'~ν/^ҫ'Km CMaƆUzKcɻ{v&&QV.N*L`~9o/CR",ʭ缨GdYqf~ֆHab7L002? W:$s>#E%<&MAH\T*ݤAh`b?_׉`xwVN8"{ kUb;>D\S w/Fxi9=:?+02bd 'NߝJ8 ;<ΣDq`xlR8a51è%\#- o/x[>ZH:/SعY R-#JnB}%J<:_ӌ+L8w= wycbq嚣WZeG+'s_F.C%&<-Eya:ot+h'$[_aA}f*44á&Ҳr}^**xp L&.TP£NW]:IK}$-LLt!,L!V昑5E'ׇCE` .;_Bs+J<ci5;0m CT"à&7Qw"/2O5wy'ytwwL`DMxyRv bP|دXɜq8V5Iv&ܭ{v!Uydy5.ւ?EFӬTTz3^Q'2YSW&&ɱTU[@X$ 5a;r<1Fv&1Pq$%<IKx B:"Ѿa0pPW@ ]Z=9ˆ*! ,)фryy_n7zFv&48l mҶ=2nj( w0v_J&40mvK%$Q @aT,*oɑ`@? d͑nO3adX[fk;;F3* qi'!nmc&&N>f3f\8nFZMdkIvw ϞrDqf5ȑ8O`2 .od%ȵn9qu۴5;((TVu̝Jal cYirt :S`ɻ X~Z!%:DL_V'hS2;p+`Axf_+HO1Y9oUbti Ț¹6:1E\, oSv\$%l uHck?8Tܔ5F_R` 7Wpv쓁.PUMa #lnVʐt)&SxwGO!3$_R t۱O+#-t#B{l { O4a;F%X@8Q!رb41FF'b=$Ľ;Oج9ߵ6لԡ揕~s5&ͬl5'>Zv Ѓq4Ə5з cXqFLL`> cdFG&(0*aGOGO)ШF=z#~39N)ۀ~\;K ^#e 7e8\ ǎ}gXIpf+.qXF0Y.rMr8sV2̟"9h;W鞻%2ϟ[ܮ_~"A q[An40 [_{;ѕFZް cX;g!, N:J #&FHĩDHXL-NkȰ= .vo1"-6ل:~:O#(E+zK˹A%͠Og[? ֛#L- D S2=E,^akf{ޜi,r^4eRzc%P"^vQ9@U5%GXv?s1 X}.ϽgĴ&GcXoSbH ch%YE9T`d<iJ[șCa^T[(ylk7$+PUM e.p>gco-嚜n˜^{(!G18sVko5\<Þ&?PFt`T7'g52Kx6qqqj"A///Iw  mo 7dYS 8x-FS>7iG~i,JJ#V}ؾHw+bƎ}Dl\.N#g_(E7YSY4\t8xa9s,XFrMHŀVqwP-poQl*o46\T`>{u\@Z23CyFj[xD{p o)e eqE?+q[y !6kjhGl1f%+ ݮݷsilznjoqw9Pqÿw`E?+~+i,VA"5^ڭA&{yٿqFX滍nXi2k*n$}.0 J%4"M8-nӣGC$y#hWF`K`?rL%bv*oqoIPD ~sksu\~$A~hZ)}/0LPۯvaAc(-7j Xd[F y9-<-Flô&=ܙ'=o 52e@E%%ܐ6EG"74wOr"2‚ |#~jѬ!ǘ5=B!)Q[rQQObTU&;rnٟ_^R|uDa /Ln!VbjZ2 (<9qyؾף#MXFf>u"qv;E1O#2\^w4_Kgκ` LijIO/(p>)a,șcg3)SoѪؓׄY󵢉ьL3fd1}(.ī:Vq[An4[߫ h4Жw|V ̱`*Q.#_Uqz 7VqرzCo-ʚF˙?!rK?a@?r>Q(ǰNHkٶt*1^9=؏,-y# _թNl1󞶆YSYD ytuC[JĀiT^k}g׭(G^XĞ8.p?IKO!ʑ5E˄(V Q3r^$M滶.dŋDyKG7a64H \ +MP6nS<"8Rܺ8orM.C:.ׇD`?w!}o>RpnED磭 r( `w);)M&hZww5?D: IA}8- 7TrHy 7߻0(kQ8آpY>^BXL!E/h+?h#1:Ɇm=~8_WO+OwUtaJB9!YYB[g kl%>ʅs(-DxC+HWÑJDq0AIߎ +M \ 4 ٱLX& LKf1Q#&il񳉎p\櫪)7=L7n:B~ҞƌL3IȚAD'XcGc/ (<</NǓbT^$X!uTbJg4MK{dJ%%SS+J5͹2IԸ̰dr2#26Y A Q4 ,kPHG(?Rxr[rU͂C.- DU'x !,șc#ՌOЫF$<.С0kcaH"nCiXpa$Ծ>{ hsppMitqW潩@f 0!RPZ2'ȫK3ǂF|ڥfbr4T4 T۽79U c{aVG8Kng+XK dbՋE zxw#aR ^S2BcJR1oXk}9BE c1,s+i Ht N0ANӴ`*xЖpOkoxC84^=IWI??Nm8@*n<,C8xUh@ECH7 N p%r\;(딘iv9db3e%hBf޴BT`> (%zLT3Xى]g=o?kP*A9!:Y%XbI,ڦgùYInOZ24[]l{HYTRK|`oKKf1mI`GVnV9'4þ/m'2lz ;> }fMeâ]Ǯ>.'))$=)"Xa{ē47&ɱa ;>9-""^)L0ת{"ѱt&A.ERD=- g0uV- ooi+䨮O$6-*THπ1D> wHJ!Cq5,)̾ @J]<%qj5DE8wDd2<<34,/[HoP['7d-g |RJDiu/esx IDATr7kBL_^#f!q=k'NrX0hal9cP bvR -Vx?{LYD\Nr>fդ6$jRS+̶T C`ݚ2)-"aon6#*:dž$Z ȕJ%o <։kﶶGp^Tw(-'|}TH0z[pk$)}gBmۛxIv@SE;ma #Z¹#WرF?_WɝvHjwN W u'J9FH"\|}XNȈǚ3ǂnjθUcH0qSU5E{'N0bGA8h5d!JeKFa7Ȅ&+/tuݜT.$lXiBL By4-ljΠ])Ȼb#l|f#-[@_E?+D!|YW"p)_)~#runq/, x{$ NxӶ$8~7Poƶ[B2R ?5a` mW$vz3qij5 7#Ca%I<\5:$Z c)h*lX<|xlGTHxB_+hq񂝧ԱBIT/2Țbz8#~GGDw?Uclz (m4a*'0Wv/spߝTBA{0{G mPZ~L^BnuhE$j530AjlolAoiAjD(m{*.GZ2K,.ҷ벣}t2 )B( gAFkH\ Fʵ(ĀUejÛURDR8?u6:>iVmU}*ܬrLUw8m/ɗsgλ |}XmΞ^2DgJ44ʐN79 K+򫅴N|*3%r 3Da+ccc0L}Hm4KZ;mK}trǛS2"aYaШ/FH 0g2-oX벷̊ r:~X\M|V$bP|Iad N*"4CM sg@ #sjU RZ"dA9F%Xhd{Rq}C;gTM0V~#gӼ cq* ilXi©z^C?aڅ(`iwCī> ڲșcA3Ҟ:}>-3ć͂M4!.֚}}X%-~OrSZ^9r7A(JFBa ##ãHepe(8\@$j1*Aqqe—q+q7Ov-M%\yc9<kΣټ5MA%+07ALYSb{nYS~(z,L*x 1#?$-(JtFB8466"//Ox_~֭4 8T*^Gcc#~׎: 7,^#{tIITiX[{:[ʱ ʡְEMyC n!MD qcr9q.#Xӌ8xX[0vuGo5bZB`X:Gc;XV[u:{_7^3ooZmsXggȝF:O~,N@εok ZFƛ0k*gR7o T\$/_e "@r*%W| "79?35q~5"S7 I qpA,NQB׻hvT '0P(_~iu> 4h ƍF#d2"7JG"ۺ>َ b#9P9ĀZŮ/-οwiM4awU7vi90h ^PX$G\)d̢s2!E:bjh8ߪ@@xmۣ5sn/!, '=-ɞfD\bf(Ue=Jˁ~nAjk&}u!}< P9lͧq(0bA(Un_/qo!3Qn='onFX(y|km]moЫ\s;ڈ h=}r*VHmnV|@#h|'VC}"d Jm̻_hxf3Y}~7~ Ua#Fm'}<iiDt,,+a 4ۯ1p-4V|I? }C"9'Bx{9>/py|ĸG]w++&D5os"xYy;^(GrQ7w=^+2? :zG I[xXX|||ZNGhO\#7f|w6#^/5rs !jcTDШa| 6nPZȯ.U͘9,]@J~w!}<2_g|/ÌL32̨w{eH KJN)z ~:n0#: Ὢ(J=y:̚uy HOV&LUѩ'E|}X;HL/N: wZcGИ?f?rC?WrȞ3g>9u}-fSf|q]l;ٸʌO6^)~F|Zwwn %5䖐 JKK;zG &(7 No wϟxv}!'҂ u^Dسňp5u*52lz KP8qZ|]BlWaf ^;Äa&9lː>DEolԫkőYX{$ 3'qXB^bi~C+:"}IX=62#kfMc -+lǙ>^R焮%"Yl\eFujdU%T< ?_9N">B@dӑwF7״쓏WQ_z@|oȣE MlWsoB9u[?{oU}3}N&+$,e1TDTG[RAV`K-ՋW{j^6 (ؔm&}93䜙3L2 G9sd|7#gQ i} _YBfAD1t^Haxgsˀok"lF1bӳvlzvy^7[DxgXQHO 3l!Ʀgx.Ŧ!dbxӃT:!BE"o}L#^z~^i8]^Mw[0"lKK˨ڑ@8!zLmϿ!_0ƇQ"a Ry׎=:OV{156\=@ΦrPuN\Mq4B2u6uL <M"T<#FH#M}~,ʽQx᷀VCw2)\wR>$#~L~GC`L).bXH!!!aeh#Th T\.joi>2(9wqwOYRE7wveb QQ34s[,j.E#F4pkbj/'Ya^ZhmZ0Broo($6R8p~-턡7!N_ Wy(1އ.cl1^8Q0vicb2Dj"9F zʽI ОsOfQ8&DaI$(9*~sx~K4!!.V{E㾅&;"g31JvA c|g2NK m[$.Ͼ7-$w8>vBq =KQ)ܙά~1[]:Ĝ;(FNAPG#VhSdVq!JKK A7Ihfz39_E7=#&,xO(t5Wݘxg嶺S)\Qxfzo|b,Xu*FGhQܗ̓zƯ[e=@@k59Sn(vO#'u?}AA\+%ϭY+)5㼘| H &ps#ɈоPVK 6)S_'b&31̔If gvo/O|}zzln^֭hߴt1]A*I` ̐*Hվm P.ܙ}ƽ6r~̚!3~Y;Ol?M r)~4Dz`m^2px4Op]_|nHeVE*Jyꅩ[ĩRdR?JCr p1b6a21ΌU%biBL/Ϗ?l{7U-l؜;X YGhǿtHl:=0I`r}{S7O9j/O` K}c4OsBB+B;d%?}B0MwDѯ?Tl3܉, 'NKf)/P x-Ff%&X̜;7?F̀Y<(OJ@*rMJRoPLz|Å fҤI08LSQ}*6:S(]LA1r+va}Q^ ><}4n]Q4\3>K{lO>ƅh<Φ31fM 1ُ9YL}d?f{فA¾hzbv qC)@D5tߨhr+$b˼&+뼝wۢ\>>ͻ0:gNvT FC8aص'*AX0ƋT}waգ><\b<!w K\o?d ow1Jv4y|>Ύjz.K n< o2Fx<"ν~ʂMҰya<~scQn7wb(ɋL5v&ܼ1N)e* XAM:-]V?qC!T ?La {U]{+&Ʊoİآp8χS^2)̖([]Ǿo]8υ9%2l)>TU |6=M/L6Դ9oA9CXu.OYPkA5l@8a@ _˭ѕmF@Dc_E>rOt4L{:`Ui툂q_oP}W][ؓ1~RŠs!6(P™q!FGޏ;N{^Ijzfl5:gcѨ/C;pI; 6j~ wqݐH"oP34@[Y'avzq~]0[ K6\ T?j4ϏTq?J?R{b4EE,w¢z;G} ZbG,kcBkAmZVhR z^5QxЮZ<<# Gj-7Swz|PnX2qZ' B|/ .և(jt(nq{wxpr PK=8qZm;FO p#8܇1oɐ'묬}34HHxlx 0hsS%XЀVUv",l *`" RTpQ>fkq|V :\fenk6k 7?DF"y[70k] IDATBb1vœ9`7ټZoۼ=@ 77b@8QgEI^ 3VCUSp[ 8O] ۹^>v 109(tZ)ĩŰ˨e()6 g rt}8XWB8ftmfll!.և35f}7+^L'@F>u QDhÈ^'BFrOYa#@U-.aoF&swkxϵ|F<Mn^ݓ B-v>^e*sx`+ꠒסŷiG#;AmA8aJ0q3QHa !KBBY4B{ljd(A6C /.T db[=yZy4tKQ1;#N#&!bp# L$f m ث?7[(Ѷ0T-;\hr#5&ЄWns3BHŔdsS%x%"3(Q>-S/ĺ{xfeauyQCM$b;n6lood"bp60( x<08bulPHD?-N8wpl@ ҏsB[csitQ>޾mu0ۋK1%M.v#Y+e鐨]uls<ƫȰiQM."ONJ9.L||e(ʦ}kpC/܆q@d2"o&lq2d'H=MXY"Naxf`wfq3yZ#RU!<\SLUEf`vrX?h`Ml29 c0 m)GZټ0{Ԧ"tC!b@ #Q){#T,MV";Ai*,݂KىMVor*XcEs1$g{ɅQJ)=g ||%y1l '\E2p! wcMoZZ2ˍ I ,)8\oWZQhxBu}?KŜ, kٰЇ9/'"J]];LLRe J )ҤȌa_ N_4W|~%؃^_h[+ƙnk' 4,"w{XN{ +8RK?6'I=SySD@_Ye3_"8^-ƂsaW0f\wC*atA8@ F& >B)*qxC)᳋ݬPIh6Y?ֆq0RH$Z}ox26EQPT},wcQ p|Xetl/LyĜ$LMSwfT#Q#S쾮t:QE&kw/WT4#UO eH|W;]1=q&(?9gbr/.J$EZqqrLP*cí g.:5B1N ‘F 744 #ZhS\>܇A:!akW$0'K8q±wy ox6Mn@E2ǣbvR3ۭx؄\eH f08fE80zPV[oFx#z8=£{]lFIz6xl"2Ssړ1_ G3 ڄ)z)l4) Rjr1N*Ie@| ÅT:t }8lf ZqQ A&6J߬ec!SVB-&c=@E嵰1wv{LH$/m(ɋf7kRublZ6bWAH'+Ɨ-[p݂q1N 3ꅶ/0v!J1pkA -zIl;ӤXO't;x~#^ FcuyK7V|aY9N/62<JbqURh좿PcbaR]5Xi E<,DLJ36_m'sMnn.~+jb<}ѪFtE@YB`fh ρ"GQFv'cUwBüƞR? _>9DzB4)6ߟlFX萹&pe E/Emqj1:Ԙ_3M d b\*j1N%d=U?0ɱPHDqG5Q /x@3j]Y]>T|:{L,Ÿ:T59,**acQYf@^:$ F R`렕GcV4ߙ&?128<>8<>XҩW9ϱa~,&$ɡFR{v E1`Q^LPbvN/sXn]uWqg)뺀!qƂI8aB*ÈD" ?qx|iu I%tA TӖ;{b*S7_Yi; J?2 mx#W"I#{rŝ!ь[OtA?wMԡ_e_ǟ: SD ENÜ, db _CqЙN?jqF3rDnVucBr=I7 ULbIA,.:pŁ$wOԣn%s#_>9lE7ߠD{5\A`5ԭ?Ve V,矎{_}F !{6wd~6 )@jA+'⿿ǽ1B 5^;=ZXOdžpȈ8ɵP1^<,3sDFm@8aHJp\}ox26aɱ(HQC\6oª1?mGA2k5<ʙy^$irF3FWLd[pT c`'=Վ_\t`#$U\NF5]g:X+ C-!GӫWa~,)= CWlThomzf| #Fjq#\h;N#G%01IV>~8 OI@fA ˀ8ZCF-?0SFv z)rB~qXȈCVea{}^p"5frO\$/sCp5R*YJ swo.f uz M%iQl`EĪY:I Z-T7;˭B_) q]WSuVv"R^;ٍw$b./:|BJgo3(?4 eg(k-ޙ&Ŝ, >X17M]n+̝iR<4=c!T"G7}CƈڄN{s~kITiJvHUS5is`nڇxImxXi`3^$e".npc n(<]onjLE?db.M.ArOH8BR`zg-Vf5y.A&sFV tLu3]8b cQe/> #L3'ㄑ jׄhr#'QV;l՟cl:Hԛ\DTh4bv F2ffj ƱŁ[fĜD$i$3p8pD =9ƮKxhz,2Z$ 5^AK[XyMwOsDz"CI$ jXNң49qtbvgLKt|X8>*90^1@Ȅ #6xGPj.MpȈõV_qv,0 xӉX9 `3M'ٔL+ (,V7 :Έ:XƻLhJq] [3ꐠَ3 Օ]9v<49=c b#E|PmÃy*$i$q*x4mSQg Wڎcf|P}橰 UM6i3oTYf@Z7趬-?IL5 LU b|8#ZŚf"s.Vj(/0;diajz wgQM8"nH`@0b|`kU?~8 3xx+hbζ橰~a .<*JWcp@XCW{}c?t &%+kV6 ~ hAτJYN'stGs6aV6̏ND7 Z)cq F}MmJw5Þ9^orۚV'ceȊlYe$={1+ĆR*b> `Dئ&"NvcSI p2gH 4¦4ʽ8nrd|:xbN"@ I\*c[ >ҩqhxE6T~c 5'EN+JEmɱغ$7aSIV'//BM[+ bn"+/rPE63ѳFVs("İ' HJ`uC 1~cIOWHb 6|Z<[N[r-c . &T|3bdQT۰p4"v@G^6gp3񬜩Cz,hf1 1**խ#33(q;B2Z̞^-=2~SlwmPiB^`6@?w/tbv$h`|z&=XCl# &fdɆ4YOcb7 RTP3x v IDAT335jz0߻1` ny"Z4=Q/f;RXJw54QϮzݙ&Ef'209YEnvtؼ%DL$yƌP*t( ob~W(`@SSS'yMuQ.qz:7ϠaoGI^,gYy6K4cb\2|Xeģ=d/"\n'8 tZ0;cd~,Wa\luݼm>:kD$+Lqrq_bgl0)t(3+{wˢU=b܁5Ǡ, E㗻q?ġBA uFԻ5+Pordy:³p ><$GTÝG1ت#>"Ah_>i&} 9g8~ق5n&\eczo" sd%^rP0)yKs>9swbzȎw(Px<=2mߏKF_p-ˑzG#nԴ98Td1$ljtpFL,-KQ`VbY@_Q|LeX.ىr?F{Rj`Fpކ;- (P>-k {QEKV s4EXd'4s.j7žUEmS~3~ׁn,>aNk`'thTN {n0+:9:Y\lupDyU eSY9 (ɋE ?kX:ՆguYglQ[CH … p})))ʂN^Gtt4 RɄ(tttbK,K;!*hCz<8כ\ ݬ7jx_5a+J @{Sc;F8 )*z(Da:m1;aE׬=pͼ38?Sc U'LB?c9/}z7*td8฿PAD7V5|LjwTpQ-o\3 㭂6swMCP?wO Izhxu$<23H/hf#ϠdTzo,_EzѰ8qJ8a@bfg hjjj=o<@FF &@, NNv!dNވK+[.%ɸ77} P[LRṷ̈̀Z<8~ق%YO7{x+bN **.^CYŃDexZU,{ߤ]?؉;,_xdB?12T5PAAvCŲ|I ZY +?Y)6 VoINZ) .k z>+LbJb0]zt;0o߆0: 1va6#2Tov=&MB||>E7)m,ڷ_C6mL1-7 3ʪY:.J\"‡UFugMםؿ"s1pPgbvC!zr^ZFԻyڑS${W%y6ŸVTG#^hE_bG?lLU`**l.;w܂-к~=Iwظ  tkF4`B+@ .1q2b⑙ L,baQ.]g*S03SEa:m Z<+(ɋld*kP")'#f}l=7b,]+9ae>ECGaWL `/{Շ,$?>'25aL5F3,˧lo;֊M%ظ v0]%hxPQYNJ5Ǡ$/o/'&6} x^^T*ofny)ĭV+\.{r??&n3T$Hude"Tr&!@gכ\8RkF$AIZW@q%$+^f;M8lZK?j?C Gc߷)XY8_F疩o/2^aj d{:KQAmDǩv3h8:t;M%lct8]ofv)&?zMp_޸ǦN#I#,&"<4 ĭ^l+,WaN/[x~N<1' IA6 ]sSOcvP+5Nqj#B`'ZO¦TrCCL$By޼ylrJTT&L\LD˅n8NbOThQ~to[P.EcVyK~Ҁ79xs I .u81>^6rL K {scPdTv 7BT$=jp Z)x ;P1; }M9!=[+a~Ҁl-stns[Wґ͛ ~VT֡([IH"F!tv兾yQ mN("襼iBOA+XvNYm3J. 2pqL̲|Zn$*$s_P0Fp ќf}/Hm7Jb@JR)h6䔴4D""MedI_Zq%|`CAjt9(]I~O kn*INJ.%XUBŷNg6TNBQ&l4Z]Xl^̮20*@ ]i3M*~؂f;NCvr&4Gty|]j2m@Stf / [~ҁfԶ;cX5AJ~E*\?+^3Q|Lz;0TH$" IN05v첅c`-] taX5dl+qzV[aj?!B{0)&4lzzJCgy@p?SlDXGpQC>H3(|8\kCiQEO cLJV{:U<-f+L Z, W hޛx]:eFplj<'Et{qx;Gx` {>$Zy44pOfxUj6b~"ˑz7\:$9:6MEzT:sdMB"nM ڷ#KJJx`ߏz"fj\ǣGgnM fvxd;Dc`\ jrPHPsbLIQ:/?tbSI: ӥg鱲 d$i$wG=0%M!2dgEoʣi^B8HiN5% >-^I';^%wdC,$j$7x|=dbN3_<Z=Ɂ`]ywMt}47 dMXzt:rL>E71)Ğ20nDh8tg6. w]W$NCŃ%Nab..@U :Nl!CgR*b6 fnl.8L㫛(E%t9'm()q2~VJ{RWqLPc`"o}=:E44h4vc5 hxz]!d%/3x뽉L QHErλMt2Hp0>'|KK?>;uɱ0)B>HO]fভO+sA!PJqj8|-Pv :x|}47.0b!V|l\1L.+$QD ۢl5 J^kbh1Ӗ|gm,ɣbo=܁xbN m<,@nL}nt-+?n%=ã{0E 6FDhF)ĭV+, F#*F/ ݮBc#6~2.`dԴ98q$t;K5Vͩ1>ͫEpގr6n(Kluy9đjle!8A(CfZ0gx8-Jʏ*2_$'n8s! }r, L sϐ~F}C_\=j89*fA10;ybB 5zma_!,ި{`4䶶6L&477ahOg^9,qzҁ&,L|w'12O+d{b 'd`2Й"cYC=oqؿ"m DZ;>N]zlKbqQL e,bAgx1$%f07-ҡi(wZJ;agjB{rc]YId&v+;=GBG}HqpՅxvvX􉟕aF#zf̎W^в/|jܾ=Ρ0m#eFA,6{bAB ɵ96l?6݇ xӝӆ2cU_ÏoasegBtV ~:µ "NEĜx M5FaʴC4_=9ZHǢ̠FC"\yA|Uh۽Ηe?pFM>^:1N{_d7Jpui6pV%mp gTOg\҉rA mjNY(m0<\pFvE{zGl0Z7(Hz9(3^fYF9T>OT/f˝' |9vI|6N"aUZkB;-͒x߯-6\TY'tqX@8#G ܹ)h###ԜȔ%H)L]@׷}0"ZCs6o0w습v<e IDATv->?'i] .nJ:KA>!5:Ek,S}*V['<6дM˲_d)AB 6l)v*rKLN(ĕ/ix;Ns'kxGy?6=^I1ycؔ4hGtL(,]ڒ-%q?&E&" ~{G) Rj,8ʴYyh Ď:4cΡ ֚6 :-H1J8̀wtjؽņ[.䡢ß]jCJ.=l]_"6TfªgUO ݫQ=aD~ZmMhO4X{ {Y<͂Rw6 =?9BVg,7Hh J4x<ڰhD[oi>vtt( 0v4rHw_C>pO0ᲩƈRE`PڠZ,f׊y*PjPԠF;WO HFDA{K` ~_&h3*QO@i ʦäa_o3]ca;K@X.5Tcăpj\3}˲$ XY|!r x<>⋔֎bv[$~9 x-I̠ƭ))B_8@;thhZԙ}܄\ 8v';ՍOGu?}8qo ,%~fڤFD=G5M}&X,^gPU>Hvs#$Ӈ2ѧ4d ,"/m\qx<|Aę3gf|kAII L&F#xGCC$ysO OYDlO{0${|Gk,B{G{v?8֚py<~4kżu>|ዊ|Z=yxBSxU'd5 jxBSŸi(two~tx8 _ī'ǰD<(Q\4`>?œ7rԧqmQbB<.wX<,P(4%9A\6rMMM$W|RsJ0D  !H̍ g7>g%!$*qbԜ[tEo@p֌|fI %xVoBjcg}p9̒.1Xg$tzNg7rU0HomQrmhb _Y7-#i"?! A+ǎqZy)B\̉_d[t wTK_lEdE|&IBcr>Yɥ I ?ang\38F;9]IY`YCc!^|z*3GYYVgU8p|Dݷńb ` \r%%%RNG);[5b*3B`1=_|-=\ %͢v&b%zte+w*1&~(Oi/Ǩ>ĵZɹ7*8ܯY&-d3ngAc߱cTBn orV?be%\ΐ&bIq9x0F8Ƈ~8OȅިbTGGw~_a<07.͵C-FP2kp3XgdwV+Ed*LG'o*:G"[pU8ũ *Lj4ךpMi be0 zzz68$ XVVl6TWWK8|>v166ǃ!+!r, C!c)%)}= L>w YBst*协W%~͚+Lw _|5B|Dn1}6ʞ˗$[6ct"$?& c{xDF055=K A( qݎjFL&T*80 Vz|2"?Z[[V8hA2Ds imQ.ܘ4qs(/#ixɓJ& fǙ3gf||B,C0D(B @<G__B E{=Q3.}}˿d>S<8A,^XE(~26A$*9qA$ eɣi&A|5Y1=4ZxIENDB`vedo-2023.4.6/docs/logos/000077500000000000000000000000001444463326400147725ustar00rootroot00000000000000vedo-2023.4.6/docs/logos/embl_logo.py000077500000000000000000000021651444463326400173120ustar00rootroot00000000000000"""Create an animated logo""" from vedo import * from vedo.pyplot import histogram settings.use_parallel_projection = True exa = Polygon().scale(4.1).pos(5.25, 4.8, 0).off() his = histogram([-1, 1], [-1, 1], mode='hex').unpack() exah, cmh = [], [] for h in his: cm = h.center_of_mass() if exa.is_inside(cm): h.c('green').shrink(0.9).add_shadow(plane='z', point=-.4) exah.append(h) cmh.append(cm) v1 = vector(9.4, 5.2, 0) v2 = vector(9.4, 2.7, 0) t1 = Text3D("EMBL", v1, c="k", font="VTK", s=1.5, depth=0) t2 = Text3D("European Molecular\nBiology Laboratory", v2, font="VTK", vspacing=1.75, c="dg", s=0.6) plt = show(exa, exah, t1, t2, axes=0, interactive=0, elevation=-50) for ti in reversed(range(100)): t = ti / 100. for j, h in enumerate(exah): cx, cy, _ = cmh[j] - [4,5,0] x = t*-4+(1-t)*6 g = exp(-(cx-x)**2/.5)*2 h.z(g) t1.pos([sin(t)*-10, 0, -0.41] + v1).alpha((1-t)**2) t2.pos([sin(t)*-15, 0, -0.41] + v2).alpha((1-t)**4) exah[13].c('red') plt.show(exa, exah, t1, t2, resetcam=0, elevation=t, azimuth=-0.02) plt.interactive() vedo-2023.4.6/docs/logos/lab_logo_maker.py000077500000000000000000000011201444463326400202760ustar00rootroot00000000000000from vedo import Volume, Text3D, show, dataurl, settings settings.use_parallel_projection = True vol = Volume(dataurl+"embryo.slc") vol.mode(0).c('b9').alpha_unit(1) t = Text3D("Sharpe\n~~~Lab", s=40, font="Spears", vspacing=1.4) t.c('k9').rotate_x(90).pos(200,150,70) cam = dict( position=(227.421, -911.244, 192.438), focal_point=(217.166, 126.841, 116.242), viewup=(0, 0, 1), parallel_scale=110, clipping_range=(754.990, 1403.38), ) plt = show(vol, t, size=(700,400), camera=cam, bg='bb') settings.screenshot_transparent_background = 1 plt.screenshot("logo.png") vedo-2023.4.6/docs/logos/logo_vedo_simple.py000066400000000000000000000003561444463326400206760ustar00rootroot00000000000000from vedo import VedoLogo, settings settings.use_parallel_projection = 1 settings.screenshot_transparent_background = 0 vl = VedoLogo(frame=False, c='k') vl.show(size=(340*3,115*3), zoom="tight") # vl.screenshot("logo_vedo_simple.png") vedo-2023.4.6/docs/logos/vedo_qr.svg000077500000000000000000001153251444463326400171640ustar00rootroot00000000000000 vedo-2023.4.6/docs/pdoc/000077500000000000000000000000001444463326400145745ustar00rootroot00000000000000vedo-2023.4.6/docs/pdoc/build_html.py000077500000000000000000000014511444463326400172750ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import datetime from vedo import __version__, printc cmd = "pdoc vedo -o html -t . " cmd+= f'--footer-text "version {__version__}, rev {datetime.date.today()}." ' cmd+= '--logo https://vedo.embl.es/images/logos/logo_vedo_simple_transp.png ' cmd+= '--favicon https://vedo.embl.es/images/logos/favicon.svg ' printc("Generating documentation:\n", cmd, "\n..please wait", c='y') os.system(cmd) os.system("chmod 755 html/ -R") printc("Done.", c='y') printc("Move to server manually with commands:") printc(" ls ~/Projects/StagingServer/var/www/html/vtkplotter.embl.es/autodocs/") printc(" rm ~/Projects/StagingServer/var/www/html/vtkplotter.embl.es/autodocs/html") printc(" mv html/ ~/Projects/StagingServer/var/www/html/vtkplotter.embl.es/autodocs/") vedo-2023.4.6/docs/pdoc/custom.css000066400000000000000000000003311444463326400166150ustar00rootroot00000000000000/* You can add additional CSS rules in custom.css. */ /* https://github.com/mitmproxy/pdoc/tree/main/pdoc/templates */ .modulename { color: rgb(41, 27, 0); } html, main { scroll-behavior: auto !important; } vedo-2023.4.6/docs/pdoc/module.html.jinja2000066400000000000000000000314651444463326400201340ustar00rootroot00000000000000{% extends "frame.html.jinja2" %} {% block title %}{{ module.modulename }} API documentation{% endblock %} {% block nav %} {% block module_list_link %} {% set parentmodule = ".".join(module.modulename.split(".")[:-1]) %} {% if parentmodule and parentmodule in all_modules %} {% include "resources/box-arrow-in-left.svg" %}   {{- parentmodule -}} {% elif not root_module_name %} {% include "resources/box-arrow-in-left.svg" %}   Module Index {% endif %} {% endblock %} {% block nav_title %} {% if logo %} {% if logo_link %}{% endif %} {% if logo_link %}{% endif %} {% endif %} {% endblock %} {% if module.members %}

API Documentation

{% endif %} {% block search_box %} {% if search and all_modules|length > 1 %} {# we set a pattern here so that we can use the :valid CSS selector #} {% endif %}
{% endblock %} {% set index = module.docstring | to_markdown | to_html | attr("toc_html") %} {% if index %}

Contents

{{ index | safe }} {% endif %} {% if module.submodules %}

Submodules

    {% for submodule in module.submodules if is_public(submodule) | trim %} {% if "cmaps" not in submodule.name and "vtkclasses" not in submodule.name and "cli" not in submodule.name %} {% if "version" not in submodule.name and "backends" not in submodule.name %}
  • {{ submodule.taken_from | link(text=submodule.name) }}
  • {% endif %} {% endif %} {% endfor %}
{% endif %} {% if module.members %}
{{ nav_members(module.members.values()) }} {% endif %} {% block nav_footer %} {% if footer_text %}
{{ footer_text }}
{% endif %} {% endblock %} {% block attribution %} built with pdocpdoc logo {% endblock %} {% endblock nav %} {% block content %}
{% block module_info %}
{% block edit_button %} {% if edit_url %} {% if "github.com" in edit_url %} {% set edit_text = "Edit on GitHub" %} {% elif "gitlab" in edit_url %} {% set edit_text = "Edit on GitLab" %} {% else %} {% set edit_text = "Edit Source" %} {% endif %} {{ edit_text }} {% endif %} {% endblock %} {{ module_name() }} {{ docstring(module) }} {{ view_source_state(module) }} {{ view_source_button(module) }} {{ view_source_code(module) }}
{% endblock %} {% block module_contents %} {% for m in module.flattened_own_members if is_public(m) | trim %}
{{ member(m) }} {% if m.kind == "class" %} {% for m in m.own_members if m.kind != "class" and is_public(m) | trim %}
{{ member(m) }}
{% endfor %} {% if "shapes" not in module_name() %} {% set inherited_members = inherited(m) | trim %} {% if inherited_members %}
Inherited Members
{{ inherited_members }}
{% endif %} {% endif %} {% endif %}
{% endfor %} {% endblock %}
{% if mtime %} {% include "livereload.html.jinja2" %} {% endif %} {% block search_js %} {% if search and all_modules|length > 1 %} {% include "search.html.jinja2" %} {% endif %} {% endblock %} {% endblock content %} {# End of content, beginning of helper macros. See https://pdoc.dev/docs/pdoc/render_helpers.html#DefaultMacroExtension for an explanation of defaultmacro. #} {% defaultmacro bases(cls) %} {%- if cls.bases -%} ( {%- for base in cls.bases -%} {{ base[:2] | link(text=base[2]) }} {%- if loop.nextitem %}, {% endif %} {%- endfor -%} ) {%- endif -%} {% enddefaultmacro %} {% defaultmacro default_value(var) -%} {%- if var.default_value_str -%} {{ var.default_value_str | escape | linkify }} {%- endif -%} {% enddefaultmacro %} {% defaultmacro annotation(var) %} {%- if var.annotation_str -%} {{ var.annotation_str | escape | linkify }} {%- endif -%} {% enddefaultmacro %} {% defaultmacro decorators(doc) %} {% for d in doc.decorators if not d.startswith("@_") %}
{{ d }}
{% endfor %} {% enddefaultmacro %} {% defaultmacro function(fn) -%} {{ decorators(fn) }} {% if fn.name == "__init__" %} {{ ".".join(fn.qualname.split(".")[:-1]) }} {{- fn.signature_without_self | format_signature(colon=False) | linkify }} {% else %} {{ fn.funcdef }} {{ fn.name }} {{- fn.signature | format_signature(colon=True) | linkify }} {% endif %} {% enddefaultmacro %} {% defaultmacro variable(var) -%} {{ var.name }}{{ annotation(var) }}{{ default_value(var) }} {% enddefaultmacro %} {% defaultmacro submodule(mod) -%} {{ mod.taken_from | link }} {% enddefaultmacro %} {% defaultmacro class(cls) -%} {{ decorators(cls) }} class {{ cls.qualname }} {{- bases(cls) -}}: {% enddefaultmacro %} {% defaultmacro member(doc) %} {{- view_source_state(doc) -}}
{% if doc.kind == "class" %} {{ class(doc) }} {% elif doc.kind == "function" %} {{ function(doc) }} {% elif doc.kind == "module" %} {{ submodule(doc) }} {% else %} {{ variable(doc) }} {% endif %} {{ view_source_button(doc) }}
{{ view_source_code(doc) }} {{ docstring(doc) }} {% enddefaultmacro %} {% defaultmacro docstring(var) %} {% if var.docstring %}
{{ var.docstring | to_markdown | to_html | linkify(namespace=var.qualname) }}
{% endif %} {% enddefaultmacro %} {% defaultmacro nav_members(members) %}
    {#% for m in members if is_public(m) | trim %#} {% for m in members|sort(attribute='qualname') if is_public(m) | trim %}
  • {% if m.kind == "class" %} {% if m.own_members and "shapes" not in module_name() %}
    {% endif %} {{ m.qualname }} {% if m.own_members %} {{ nav_members(m.own_members) | indent(12) }} {% endif %} {% if m.own_members and "shapes" not in module_name() %}
    {% endif %} {% elif m.kind == "module" %} {{ m.name }} {% elif m.name == "__init__" %} {% else %} {% if m.name.lower() == m.name %} {{ m.name }} {% endif %} {% endif %}
  • {% endfor %}
{% enddefaultmacro %} {% defaultmacro is_public(doc) %} {# This macro is a bit unconventional in that its output is not rendered, but treated as a boolean: Returning no text is interpreted as false, returning any other text is iterpreted as true. Implementing this as a macro makes it very easy to override with a custom template, see https://github.com/mitmproxy/pdoc/tree/main/examples/custom-template. #} {% if doc.name == "__init__" %} {# show all constructors #} true {% elif doc.name == "__doc__" %} {# We don't want to document __doc__ itself, https://github.com/mitmproxy/pdoc/issues/235 #} {% elif doc.kind == "module" and doc.fullname not in all_modules %} {# Skip modules that were manually excluded, https://github.com/mitmproxy/pdoc/issues/334 #} {% elif (doc.qualname or doc.name) is in(module.obj.__all__ or []) %} {# members starting with an underscore are still public if mentioned in __all__ #} true {% elif not doc.name.startswith("_") and (doc.kind != "variable" or doc.is_enum_member or doc.docstring) %} {# members not starting with an underscore are considered public by default #} true {% endif %} {% enddefaultmacro %} {# fmt: off #} {% defaultmacro inherited(cls) %} {% for base, members in cls.inherited_members.items() %} {% set m = None %}{# workaround for https://github.com/pallets/jinja/issues/1427 #} {% set member_html %} {% for m in members if is_public(m) | trim %}
{{- m.taken_from | link(text=m.name.replace("__init__",base[1])) -}}
{% endfor %} {% endset %} {# we may not have any public members, in which case we don't want to print anything. #} {% if member_html and "vtkmodules" not in base | link %}
{{ base | link }}
{{ member_html }}
{% endif %} {% endfor %} {% enddefaultmacro %} {# fmt: on #} {% defaultmacro view_source_state(doc) %} {% if show_source and doc.source %} {% endif %} {% enddefaultmacro %} {% defaultmacro view_source_button(doc) %} {% if show_source and doc.source %} {% endif %} {% enddefaultmacro %} {% defaultmacro view_source_code(doc) %} {% if show_source and doc.source %} {{ doc | highlight }} {% endif %} {% enddefaultmacro %} {% defaultmacro module_name() %}

{% set parts = module.modulename.split(".") %} {% for part in parts %} {%- set fullname = ".".join(parts[:loop.index]) -%} {%- if fullname in all_modules and fullname != module.modulename -%} {{ part }} {%- else -%} {{ part }} {%- endif -%} {%- if loop.nextitem -%} . {%- endif -%} {% endfor %}

{% enddefaultmacro %} vedo-2023.4.6/docs/tutorials.md000066400000000000000000000000241444463326400162130ustar00rootroot00000000000000## Tutorials To do vedo-2023.4.6/examples/000077500000000000000000000000001444463326400145355ustar00rootroot00000000000000vedo-2023.4.6/examples/README.md000066400000000000000000000004511444463326400160140ustar00rootroot00000000000000# Example directories Check out more examples in the above directories. ## Get Started ```bash git clone https://github.com/marcomusy/vedo.git cd vedo/examples/basic python align1.py ``` ## Search and Run any of the built-in examples with commands: `vedo --search align` and `vedo -r align1` vedo-2023.4.6/examples/advanced/000077500000000000000000000000001444463326400163025ustar00rootroot00000000000000vedo-2023.4.6/examples/advanced/__init__.py000066400000000000000000000000031444463326400204040ustar00rootroot00000000000000# #vedo-2023.4.6/examples/advanced/capping_mesh.py000066400000000000000000000026731444463326400213210ustar00rootroot00000000000000"""Manual capping of a mesh""" from vedo import * def capping(amsh, bias=0, invert=False, res=50): bn = amsh.boundaries().join(reset=True) pln = fit_plane(bn) cp = [pln.closest_point(p) for p in bn.points()] pts = Points(cp) pts.top = pln.normal if invert is None: cutm = amsh.clone().cut_with_plane(origin=pln.center, normal=pln.normal) invert = cutm.npoints > amsh.npoints pts2 = pts.clone().orientation([0,0,1]).project_on_plane('z') msh2 = pts2.generate_mesh(invert=invert, mesh_resolution=res) source = pts2.points().tolist() target = bn.points().tolist() printc(f"..warping {len(source)} points") msh3 = msh2.clone().warp(source, target, mode='3d') if not invert: bias *= -1 msh3.reverse() if bias: newpts = [] for p in msh3.points(): q = bn.closest_point(p) d = mag(p-q) newpt = p + d * pln.normal * bias newpts.append(newpt) msh3.points(newpts) return msh3 msh = Mesh(dataurl+"260_flank.vtp").c('orange5').bc('purple7').lw(0.1) # mcap = msh.cap() # automatic mcap = capping(msh, invert=True) merged_msh = merge(msh, mcap).clean().smooth() merged_msh.subsample(0.0001).wireframe(False) # merge duplicate points printc("merged_msh is closed:", merged_msh.is_closed()) show([[msh, __doc__], [merged_msh, merged_msh.boundaries()]], N=2, axes=1, elevation=-40, ).close() vedo-2023.4.6/examples/advanced/contours2mesh.py000066400000000000000000000010571444463326400214720ustar00rootroot00000000000000"""Form a surface mesh by joining contour lines""" from vedo import Circle, Ribbon, merge, show cs = [] for i in range(-10, 10): r = 10 / (i * i + 10) c = Circle(r=r).rotate_y(i*2).z(i/10).x(i/20) c.linewidth(3).linecolor('blue5') cs.append(c) # create the mesh by merging the ribbon strips rbs = [] for i in range(len(cs) - 1): rb = Ribbon(cs[i], cs[i+1], closed=True, res=(150,5)) rbs.append(rb) mesh = merge(rbs).clean().cap().color('limegreen') cs.append(__doc__) show([cs, mesh], N=2, axes=1, elevation=-40, bg2='lb').close() vedo-2023.4.6/examples/advanced/convex_hull.py000066400000000000000000000004311444463326400212000ustar00rootroot00000000000000"""Create the Convex Hull of a Mesh or a set of input points""" from vedo import * settings.default_font = 'Bongas' settings.use_depth_peeling = True spid = Mesh(dataurl+"spider.ply").c("brown") ch = ConvexHull(spid.points()).alpha(0.2) show(spid, ch, __doc__, axes=1).close() vedo-2023.4.6/examples/advanced/cut_and_cap.py000066400000000000000000000006461444463326400211220ustar00rootroot00000000000000"""Cut a mesh with an other mesh and cap the holes""" from vedo import dataurl, Plotter, Mesh, Sphere msh1 = Mesh(dataurl+'motor.byu') cutmesh = Sphere().y(-0.4).scale(0.4).wireframe().alpha(0.1) msh2 = msh1.clone().cut_with_mesh(cutmesh) redcap = msh2.cap(return_cap=True).color("r4") plt = Plotter(N=2, axes=1) plt.at(0).show(msh1, cutmesh, __doc__) plt.at(1).show(msh2, redcap, viewup="z") plt.interactive().close() vedo-2023.4.6/examples/advanced/cut_with_mesh1.py000066400000000000000000000011061444463326400215750ustar00rootroot00000000000000"""Cut a mesh with another mesh""" from vedo import dataurl, settings, Plotter, Volume, Ellipsoid settings.tiff_orientation_type = 4 # data origin is bottom-left vol = Volume(dataurl+"embryo.tif") iso = vol.isosurface(30, flying_edges=False).normalize() # mesh used to cut: emsh = Ellipsoid().scale(0.4).pos(2.8, 1.5, 1.5).wireframe() # make a working copy and cut it with the ellipsoid cut_embryo = iso.clone().cut_with_mesh(emsh).c("gold").bc("t") plt = Plotter(N=2, axes=1) plt.at(0).show(iso, emsh, viewup="z") plt.at(1).show(cut_embryo, __doc__) plt.interactive().close() vedo-2023.4.6/examples/advanced/cut_with_points1.py000066400000000000000000000006701444463326400221620ustar00rootroot00000000000000"""Set a loop of random points on a sphere to cut a region of the mesh""" from vedo import * settings.use_depth_peeling = True s = Sphere().alpha(0.2).lw(0.1) # pick a few points on the sphere sc = s.points() pts = Points([sc[10], sc[15], sc[129], sc[165]], r=12) #cut loop region identified by the points scut = s.clone().cut_with_point_loop(pts, invert=False) scut.c('blue',0.7).lw(0).scale(1.03) show(s, pts, scut, __doc__, axes=1) vedo-2023.4.6/examples/advanced/cut_with_points2.py000066400000000000000000000007621444463326400221650ustar00rootroot00000000000000"""Select cells inside a point loop""" from vedo import * mesh = Mesh(dataurl + "dolfin_fine.vtk").lw(0.1) pts = [ [0.85382618, 0.1909104], [0.85585967, 0.8721275], [0.07500188, 0.8680605], [0.10143717, 0.0607675], ] # Make a copy and cut it cmesh = mesh.clone().cut_with_point_loop( pts, on="cells", include_boundary=False, invert=False, ) cmesh.lw(0.1).c("tomato") line = Line(pts, closed=True).lw(5).c("green3") show([(mesh, line), (cmesh, line, __doc__)], N=2).close() vedo-2023.4.6/examples/advanced/fitline.py000066400000000000000000000016551444463326400203150ustar00rootroot00000000000000"""Usage example of fitLine() and fitPlane() Draw a line in 3D that fits a cloud of 20 Points, Show the first set of 20 points and fit a plane to them""" import numpy as np from vedo import * settings.use_depth_peeling = True # declare the class instance plt = Plotter() # draw 500 fit lines superimposed and very transparent for i in range(500): x = np.linspace(-2, 5, 20) # generate every time 20 points y = np.linspace(1, 9, 20) z = np.linspace(-5, 3, 20) data = np.stack((x,y,z), axis=1) data += np.random.normal(size=data.shape) * 0.8 # add gauss noise plt += fit_line(data).lw(4).alpha(0.04).c("violet") # fit a line # 'data' still contains the last iteration points plt += Points(data, r=10, c="yellow") print("Line 0 Fit slope = ", plt.actors[0].slope) plane = fit_plane(data).c("green4") # fit a plane print("Plane Fit normal =", plane.normal) plt += [plane, __doc__] plt.show(axes=1).close() vedo-2023.4.6/examples/advanced/fitplanes.py000066400000000000000000000012531444463326400206420ustar00rootroot00000000000000"""Fit a plane to regions of a surface defined by N points that are closest to a given point of the surface.""" from vedo import * apple = Mesh(dataurl+"apple.ply").subdivide().add_gaussian_noise(0.5) plt = Plotter() plt += apple.alpha(0.1) variances = [] for i, p in enumerate(apple.points()): pts = apple.closest_point(p, n=12) # find the N closest points to p plane = fit_plane(pts) # find the fitting plane variances.append(plane.variance) if i % 200: continue plt += plane plt += Points(pts) plt += Arrow(plane.center, plane.center+plane.normal/5) plt += __doc__ + "\nNr. of fits performed: "+str(len(variances)) plt.show().close() vedo-2023.4.6/examples/advanced/fitspheres1.py000066400000000000000000000016651444463326400211210ustar00rootroot00000000000000"""Fit spheres to a region of a surface defined by N points that are closest to a given point of the surface. For some of these point we show the fitting sphere. Red lines join the center of the sphere to the surface point. Blue points are the N points used for fitting""" from vedo import * settings.default_font = 'Kanopus' settings.use_depth_peeling = True plt = Plotter() # load mesh and increase by a lot subdivide(2) the nr of surface vertices cow = Mesh(dataurl+"cow.vtk").alpha(0.3).subdivide(2) for i, p in enumerate(cow.points()): if i % 1000: continue # skip most points pts = cow.closest_point(p, n=16) # find the n-closest points to p sph = fit_sphere(pts).alpha(0.05) # find the fitting sphere if sph is None: continue # may fail if all points sit on a plane plt += sph plt += Points(pts) plt += Line(sph.center, p, lw=2) plt += [cow, __doc__] plt.show(viewup="z", axes=1).close() vedo-2023.4.6/examples/advanced/fitspheres2.py000066400000000000000000000017141444463326400211150ustar00rootroot00000000000000"""For each point finds the 12 closest ones and fit a sphere. Color points from the size of the sphere radius.""" from vedo import * from vedo.pyplot import histogram plt = Plotter() msh = Mesh(dataurl+"cow.vtk").c("cyan7") pts1, pts2, vals, cols = [], [], [], [] msh_points = msh.points() for i in range(0, msh.npoints, 10): p = msh_points[i] pts = msh.closest_point(p, n=12) # find the n-closest points to p sph = fit_sphere(pts) # find the fitting sphere if sph is None: continue value = sph.radius * 10 color = color_map(value, "jet", 0, 1) # map value to a RGB color n = versor(p - sph.center) # unit vector from sphere center to p vals.append(value) cols.append(color) pts1.append(p) pts2.append(p + n / 8) plt += msh plt += Points(pts1, c=cols) plt += Lines(pts1, pts2, c="black") plt += histogram(vals, xtitle='radius', xlim=[0,2]).as2d(pos="bottom-left") plt += __doc__ plt.show().close() vedo-2023.4.6/examples/advanced/geodesic.py000066400000000000000000000010421444463326400204330ustar00rootroot00000000000000"""Dijkstra algorithm to compute the graph geodesic. Takes as input a polygonal mesh and performs a shortest path calculation 20 times""" from vedo import Sphere, Earth, show msh = Sphere(r=1.02, res=200).subsample(0.007).wireframe().alpha(0.1) # msh.triangulate().clean() # often needed! path = msh.geodesic([0.349,-0.440,0.852], [-0.176,-0.962,0.302]).c("red4") # path = msh.geodesic(10728, 9056).c("red4") # use vertex indices # printc(geo.pointdata["VertexIDs"]) show(Earth(), msh, __doc__, path, bg2='lb', viewup="z", zoom=1.3).close() vedo-2023.4.6/examples/advanced/geological_model.py000066400000000000000000000125031444463326400221420ustar00rootroot00000000000000"""Recreate a model of a geothermal reservoir, Utah (Credits: A. Pollack, SCRF)""" from vedo import printc, dataurl, settings, delaunay2d, Line, Lines, Points, Plotter import pandas as pd settings.use_depth_peeling = True # Load surfaces, import the file from github printc("...loading data...", invert=1, end='') url = "https://raw.githubusercontent.com/ahinoamp/Example3DGeologicModelUsingVTKPlotter/master/" landSurfacePD = pd.read_csv(url+"land_surface_vertices.csv") vertices_175CPD = pd.read_csv(url+"175C_vertices.csv") vertices_225CPD = pd.read_csv(url+"225C_vertices.csv") microseismic = pd.read_csv(url+"Microseismic.csv") Negro_Mag_Fault_verticesPD = pd.read_csv(url+"Negro_Mag_Fault_vertices.csv") Opal_Mound_Fault_verticesPD= pd.read_csv(url+"Opal_Mound_Fault_vertices.csv") top_granitoid_verticesPD = pd.read_csv(url+"top_granitoid_vertices.csv") # The well path and different logs for the well paths well_5832_path= pd.read_csv(url+"path5832.csv") pressure_well = pd.read_csv(url+"pressure5832.csv") temp_well = pd.read_csv(url+"temperature5832.csv") nphi_well = pd.read_csv(url+"nphi5832.csv") # Since most of the wells in the area were just vertical, I split them into two files: # One file with the top of the wells and the other with the bottom point of the wellbore wellsmin = pd.read_csv(url+"MinPointsWells.csv") wellsmax = pd.read_csv(url+"MaxPointsWells.csv") # Project boundary area on the surface border = pd.read_csv(url+"FORGE_Border.csv") ############################################# ## land surface: a mesh with varying color printc("analyzing...", invert=1, end='') # create a mesh object from the 2D Delaunay triangulation of the point cloud landSurface = delaunay2d(landSurfacePD.values) # in order to color it by the elevation, we use the z values of the mesh zvals = landSurface.points()[:, 2] landSurface.cmap("terrain", zvals, vmin=1100) landSurface.name = "Land Surface" # give the object a name # Create a plotter and add landSurface to it plt = Plotter(axes=dict(xtitle='km', ytitle=' ', ztitle='km*1.5', yzgrid=False), bg2='lb', size=(1200,900)) # screen size plt += landSurface plt += landSurface.isolines(5).lw(1).c('k') ############################################# ## Different meshes with constant colors # Mesh of 175 C isotherm vertices_175C = delaunay2d(vertices_175CPD.values) vertices_175C.name = "175C temperature isosurface" plt += vertices_175C.c("orange").opacity(0.3) # Mesh of 225 C isotherm vertices_225CT = delaunay2d(vertices_225CPD.values) vertices_225CT.name = "225C temperature isosurface" plt += vertices_225CT.c("red").opacity(0.4) # Negro fault, mode=fit is used because point cloud is not in xy plane Negro_Mag_Fault_vertices = delaunay2d(Negro_Mag_Fault_verticesPD.values, mode='fit') Negro_Mag_Fault_vertices.name = "Negro Fault" plt += Negro_Mag_Fault_vertices.c("f").opacity(0.6) # Opal fault Opal_Mound_Fault_vertices = delaunay2d(Opal_Mound_Fault_verticesPD.values, mode='fit') Opal_Mound_Fault_vertices.name = "Opal Mound Fault" plt += Opal_Mound_Fault_vertices.c("g").opacity(0.6) # Top Granite, (shift it a bit to avoid overlapping) xyz = top_granitoid_verticesPD.values - [0,0,20] top_granitoid_vertices = delaunay2d(xyz).texture(dataurl+'textures/paper2.jpg') top_granitoid_vertices.name = "Top of granite surface" plt += top_granitoid_vertices ################################################### printc("plotting...", invert=1) # Microseismic microseismicxyz = microseismic[["xloc", "yloc", "zloc"]].values scals = microseismic[["mw"]] microseismic_pts = Points(microseismicxyz, r=5).cmap("jet", scals) microseismic_pts.name = "Microseismic events" plt += microseismic_pts # FORGE Boundary. Since the boundary area did not have a Z column, # I assigned a Z value for where I wanted it to appear border["zcoord"] = 1650 borderxyz = border[["xcoord", "ycoord", "zcoord"]] boundary = Line(borderxyz.values).extrude(zshift=120, cap=False) boundary.lw(0).texture(dataurl+'textures/wood1.jpg') boundary.name = "FORGE area boundary" plt += boundary # The path of well 58_32 Well1 = Line(well_5832_path[["X", "Y", "Z"]].values, lw=2, c='k') Well1.name = "Well 58-32" plt += Well1 # A porosity log in the well xyz = nphi_well[["X", "Y", "Z"]].values porosity = nphi_well["Nphi"].values Well2 = Line(xyz, lw=3).cmap("hot", porosity) Well2.name = "Porosity log well 58-32" plt += Well2 # This well data is actually represented by points since as of right now, xyz = pressure_well[["X", "Y", "Z"]].values pressure = pressure_well["Pressure"].values Well3 = Line(xyz, lw=3).cmap("cool", pressure) Well3.name = "Pressure log well 58-32" plt += Well3 # Temperature log xyz = temp_well[["X", "Y", "Z"]].values temp = temp_well["Temperature"].values Well4 = Line(xyz, lw=3).cmap("seismic", temp) Well4.name = "Temperature log well 58-32" plt += Well4 # defining the start and end of the lines that will be representing the wellbores Wells = Lines(wellsmin[["x", "y", "z"]].values, # start points wellsmax[["x", "y", "z"]].values, # end points c="gray", alpha=1, lw=3) Wells.name = "Pre-existing wellbores" plt += Wells for a in plt.actors: # change scale to kilometers in x and y, but expand z scale by 1.5! a.scale([0.001, 0.001, 0.001*1.5]) ######################### ## show the plot plt += __doc__ plt.show(viewup="z", zoom=1.2) #plt.export("page.html") # k3d is the default plt.close() vedo-2023.4.6/examples/advanced/gyroid.py000066400000000000000000000014701444463326400201530ustar00rootroot00000000000000"""A textured gyroid shape cut by a sphere""" from vedo import * # Equation of a "gyroid" (https://en.wikipedia.org/wiki/Gyroid) x, y, z = np.mgrid[:30,:30,:30] * 0.4 U = sin(x)*cos(y) + sin(y)*cos(z) + sin(z)*cos(x) # Create a Volume, take the isosurface at 0, smooth and subdivide it gyr = Volume(U).isosurface(0).smooth().subdivide() # Intersect it with a sphere made of quads sph = Sphere(pos=(15,15,15), r=14, quads=True, res=30).triangulate() printc("Please wait a few secs while I'm cutting your gyroid", c='y') gxs = gyr.boolean('intersect', sph) gxs.texture('https://vedo.embl.es/examples/data/images/marblings.jpg') plt = Plotter(bg='wheat', bg2='lightblue', axes=5) plt.add_ambient_occlusion(10) plt.show(gxs, __doc__, zoom=1.4) # Video('gyroid.mp4').action().close().interactive() # shoot video plt.close() vedo-2023.4.6/examples/advanced/interpolate_field.py000066400000000000000000000041511444463326400223460ustar00rootroot00000000000000"""Interpolate a vectorial field using Thin Plate Spline or Radial Basis Function""" from scipy.interpolate import Rbf from vedo import Plotter, Points, Arrows, show import numpy as np ls = np.linspace(0, 10, 8) X, Y, Z = np.meshgrid(ls, ls, ls) xr, yr, zr = X.ravel(), Y.ravel(), Z.ravel() positions = np.vstack([xr, yr, zr]) sources = [(5, 8, 5), (8, 5, 5), (5, 2, 5)] deltas = [(1, 1, 0.2), (1, 0, -0.8), (1, -1, 0.2)] apos = Points(positions, r=2) # for p in apos.points(): ####### Uncomment to fix some points. # if abs(p[2]-5) > 4.999: # differences btw RBF and thinplate # sources.append(p) # will become much smaller. # deltas.append(np.zeros(3)) sources = np.array(sources) deltas = np.array(deltas) src = Points(sources, c="r", r=12) trs = Points(sources + deltas, c="v", r=12) arr = Arrows(sources, sources + deltas).color("k8") ################################################# warp using Thin Plate Splines warped = apos.clone().warp(sources, sources+deltas) warped.alpha(0.4).color("lg").point_size(10) allarr = Arrows(apos.points(), warped.points()).color("k8") set1 = [apos, warped, src, trs, arr, __doc__] plt1 = show([set1, allarr], N=2, bg='bb', interactive=0) # returns the Plotter class ################################################# RBF x, y, z = sources[:, 0], sources[:, 1], sources[:, 2] dx, dy, dz = deltas[:, 0], deltas[:, 1], deltas[:, 2] itrx = Rbf(x, y, z, dx) # Radial Basis Function interpolator: itry = Rbf(x, y, z, dy) # interoplate the deltas in each separate itrz = Rbf(x, y, z, dz) # cartesian dimension positions_x = itrx(xr, yr, zr) + xr positions_y = itry(xr, yr, zr) + yr positions_z = itrz(xr, yr, zr) + zr positions_rbf = np.vstack([positions_x, positions_y, positions_z]) warped_rbf = Points(positions_rbf, r=2).alpha(0.4).color("lg").point_size(10) allarr_rbf = Arrows(apos.points(), warped_rbf.points()).color("k8") arr = Arrows(sources, sources + deltas).color("k8") plt2 = Plotter(N=2, pos=(200, 300), bg='bb') plt2.at(0).show("Radial Basis Function", apos, warped_rbf, src, trs, arr) plt2.at(1).show(allarr_rbf) plt2.interactive() plt2.close() plt1.close() vedo-2023.4.6/examples/advanced/interpolate_scalar1.py000066400000000000000000000012401444463326400226050ustar00rootroot00000000000000"""Interpolate the scalar values from one Mesh or Points object onto another one""" from vedo import * import numpy as np mesh = Mesh(dataurl+"bunny.obj") # pick 100 points where we assume that some scalar value is known # (can be ANY points, not necessarily taken from the mesh) pts2 = mesh.points()[:100] # assume the value is random scalars = np.random.randint(45,123, 100) # create a set of points with this scalar values points = Points(pts2, r=10).cmap('rainbow', scalars) # interpolate from points onto the mesh, by averaging the 5 closest ones mesh.interpolate_data_from(points, n=5).cmap('rainbow').add_scalarbar() show(mesh, points, __doc__, axes=9).close() vedo-2023.4.6/examples/advanced/interpolate_scalar2.py000066400000000000000000000021511444463326400226100ustar00rootroot00000000000000"""Use scipy to interpolate the value of a scalar known on a set of points on a new set of points where the scalar is not defined. Two interpolation methods are possible: Radial Basis Function (used here), and Nearest Point.""" import numpy as np from vedo import * from scipy.interpolate import Rbf, NearestNDInterpolator as Near mesh = Mesh(dataurl+"bunny.obj").normalize() pts = mesh.points() # pick a subset of 100 points where a scalar descriptor is known ptsubset = pts[:100] # assume the descriptor value is some function of the point coord y x, y, z = np.split(ptsubset, 3, axis=1) desc = 3*sin(4*y) # build the interpolator to determine the scalar value # for the rest of mesh vertices: itr = Rbf(x, y, z, desc) # Radial Basis Function interpolator #itr = Near(ptsubset, desc) # Nearest-neighbour interpolator # interpolate descriptor on the full set of mesh vertices xi, yi, zi = np.split(pts, 3, axis=1) interpolated_desc = itr(xi, yi, zi) mesh.cmap('rainbow', interpolated_desc).add_scalarbar(title='3sin(4y)') rpts = Points(ptsubset, r=8, c='white') show(mesh, rpts, __doc__, axes=1).close() vedo-2023.4.6/examples/advanced/interpolate_scalar3.py000066400000000000000000000012501444463326400226100ustar00rootroot00000000000000"""Interpolate the arrays of a source Mesh (RandomHills) onto another (ellipsoid) by averaging closest point values""" from vedo import ParametricShape, Sphere, show # RandomHills already contains the height as a scalar defined on vertices h = ParametricShape('RandomHills') h.cmap('hsv', vmin=0, vmax=6) h.add_scalarbar3d(title='RandomHills height scalar value') # interpolate such values on a completely different Mesh. # pick n=4 closest points and assign an ave value based on shepard kernel. s = Sphere().scale([1,1,0.5]).pos(-.1,1.5,0.3).alpha(1).lw(0.1) s.interpolate_data_from(h, n=4, kernel='gaussian') s.cmap('hsv', vmin=0, vmax=6) show(h,s, __doc__, axes=1).close() vedo-2023.4.6/examples/advanced/interpolate_scalar4.py000066400000000000000000000017441444463326400226210ustar00rootroot00000000000000"""Interpolate cell values from a quad-mesh to a tri-mesh""" from vedo import Grid, show # Make up some quad mesh with associated scalars g1 = Grid(res=(25,25)).wireframe(0).lw(1) scalars = g1.points()[:,1] g1.cmap("viridis", scalars, vmin=-1, vmax=1, name='gene') g1.map_points_to_cells() # move the array to cells (faces) g1.add_scalarbar(horizontal=1, pos=(0.7,0.04)) g1.rotate_z(20) # let's rotate it a bit so it's visible # Interpolate first mesh onto a new triangular mesh eps = 0.01 g2 = Grid(res=(50,50)).pos(0.2, 0.2, 0.1).wireframe(0).lw(0) g2.triangulate() # Interpolate by averaging the closest 3 points: #g2.interpolate_data_from(g1, on='cells', n=3) # Interpolate by picking points in a specified radius, # if there are no points in that radius set null value -1 g2.interpolate_data_from( g1, on='cells', radius=0.1+eps, null_strategy=1, null_value=-1, ) g2.cmap('hot', 'gene', on='cells', vmin=-1, vmax=1).add_scalarbar() show(g1, g2, __doc__, axes=1) vedo-2023.4.6/examples/advanced/line2mesh_quads.py000066400000000000000000000012501444463326400217350ustar00rootroot00000000000000"""Mesh a line contour with quads of variable resolution""" from vedo import Spline, Grid, show import numpy as np pts = [ [0.0, 0.0], [1.0, 0.0], [1.1, 4.0], [1.0, 1.5], [0.2, 5.0], [-1., 3.0], [0.4, 2.7], [-1., 2.4], ] shape = Spline(pts, closed=True).color('red4').linewidth(5) xcoords = np.arange(-2.0, 2.5, 0.075) ycoords = np.arange(-0.5, 5.5, 0.075) xcoords += np.cos(xcoords+0.6)*0.75 # make quads shrink and stretch ycoords += np.sin(ycoords+0.5)*0.75 # to refine mesh resolution grd = Grid(s=[xcoords, ycoords]) # create a gridded plane msh = shape.generate_mesh(grid=grd, quads=True) show(shape, msh, __doc__, axes=1).close() vedo-2023.4.6/examples/advanced/line2mesh_tri.py000066400000000000000000000013331444463326400214200ustar00rootroot00000000000000"""Generate a polygonal Mesh from a contour line""" from vedo import dataurl, load, Line, show from vedo.pyplot import histogram shapes = load(dataurl + "timecourse1d.npy") # list of lines shape = shapes[56].mirror().rotate_z(-90) cmap = "RdYlBu" msh = shape.generate_mesh() # Generate the Mesh from the line msh.smooth() # make the triangles more uniform msh.compute_quality() # add a measure of triangle quality msh.cmap(cmap, on="cells").add_scalarbar3d() contour = Line(shape).c("red4").lw(5) labels = contour.labels("id") histo = histogram( msh.celldata["Quality"], xtitle="triangle mesh quality", aspect=3/4, c=cmap, ) show([(contour, labels, msh, __doc__), histo], N=2, sharecam=0).close() vedo-2023.4.6/examples/advanced/measure_curvature.py000066400000000000000000000026101444463326400224140ustar00rootroot00000000000000"""Calculate the surface curvature of an object by fitting a sphere to each vertex.""" from vedo import printc, Ellipsoid, Plotter,fit_sphere import numpy as np msh = Ellipsoid() printc(__doc__, invert=1) plt = Plotter(N=4, axes=1) plt.at(0).show(msh, "Original shape") # Use built-in curvature method msh1 = msh.clone().compute_curvature(method=0).cmap('viridis') msh1.add_scalarbar(horizontal=True, size=(100, None)) plt.at(1).show(msh1, "Gaussian curvature", azimuth=30, elevation=30) # Use sphere-fit curvature msh2 = msh.clone() # Set parameters and allocate arrays radius = 1.5 curvature = np.zeros(msh2.npoints) residues = np.zeros(msh2.npoints) # iterate over surface points and fit sphere for idx in range(msh2.npoints): patch = msh2.closest_point(msh2.points()[idx], radius=radius) s = fit_sphere(patch) curvature[idx] = 1/(s.radius)**2 residues[idx] = s.residue msh2.pointdata['Spherefit_Curvature'] = curvature msh2.pointdata['Spherefit_Curvature_Residue'] = residues msh2.cmap('viridis', msh2.pointdata['Spherefit_Curvature']) msh2.add_scalarbar(horizontal=True, size=(100, None)) plt.at(2).show(msh2, "Sphere-fitted curvature") # Show fit residues msh3 = msh2.clone() msh3.cmap('jet', msh2.pointdata['Spherefit_Curvature_Residue']) msh3.add_scalarbar(horizontal=True, size=(100, None)) plt.at(3).show(msh3, 'Sphere-fitted curvature\nFit residues') plt.interactive().close() vedo-2023.4.6/examples/advanced/mesh_smoother1.py000066400000000000000000000007151444463326400216140ustar00rootroot00000000000000from vedo import dataurl, Plotter, Volume plt = Plotter(N=2) # Load a mesh and show it vol = Volume(dataurl+"embryo.tif") m0 = vol.isosurface(flying_edges=False).normalize().lw(1).c("violet") # Smooth the mesh m1 = m0.clone().smooth(niter=20).color("lg") plt.at(0).show(m0, "Original Mesh:") plt.background('light blue') # set first renderer color plt.at(1).show( "Mesh polygons are smoothed:", m1, viewup='z', zoom=1.5) plt.interactive().close() vedo-2023.4.6/examples/advanced/mesh_smoother2.py000066400000000000000000000010301444463326400216040ustar00rootroot00000000000000"""Smoothing a mesh""" from vedo import dataurl, Mesh, show s1 = Mesh(dataurl+'panther.stl').lw(0.1) s2 = s1.clone().x(50) # place at x=50 s2.subdivide(3).smooth().compute_normals() s2.c('light blue').lw(0).lighting('glossy').phong() # other useful filters to combine are # mesh.decimate(), clean(), smooth() cam = dict( position=(113, -189, 62.1), focal_point=(18.3, 4.39, 2.41), viewup=(-0.0708, 0.263, 0.962), distance=223, ) show(s1, s2, __doc__, bg='black', bg2='lightgreen', axes=11, camera=cam).close() vedo-2023.4.6/examples/advanced/meshquality.py000066400000000000000000000020621444463326400212210ustar00rootroot00000000000000"""Metrics of quality for the cells of a triangular mesh (zoom to see cell label values)""" from vedo import dataurl, Mesh, show from vedo.pyplot import histogram mesh = Mesh(dataurl + "panther.stl").compute_normals().linewidth(0.1).flat() # generate a numpy array for mesh quality mesh.compute_quality(metric=6) mesh.cmap("RdYlBu", on="cells") hist = histogram(mesh.celldata["Quality"], xtitle="mesh quality", ac="w") # make it smaller and position it, use_bounds makes the cam # ignore the object when resetting the 3d qscene hist.scale(0.6).pos(40, -53, 0).use_bounds(False) # add a scalar bar for the active scalars mesh.add_scalarbar3d(c="w", title="triangle quality by min(:alpha_i )") # create numeric labels of active scalar on top of cells labs = mesh.labels(on="cells", precision=3, scale=0.4, font="Quikhand", c="black") cam = dict( pos=(59.8, -191, 78.9), focal_point=(27.9, -2.94, 3.33), viewup=(-0.0170, 0.370, 0.929), distance=205, clipping_range=(87.8, 355), ) show(mesh, labs, hist, __doc__, bg="bb", camera=cam, axes=11).close() vedo-2023.4.6/examples/advanced/moving_least_squares1D.py000066400000000000000000000016271444463326400233010ustar00rootroot00000000000000"""1D Moving Least Squares (MLS) to project a cloud of unordered points to become a smooth line""" from vedo import * import numpy as np N = 4 # nr. of iterations # build some initial cloud of noisy points along a line pts = [ (sin(6*x), cos(2*x)*x, cos(9*x)) for x in np.arange(0,2, .001)] # pts = [ (0, sin(x), cos(x)) for x in arange(0,6, .002) ] # pts = [(sqrt(x), sin(x), x/5) for x in arange(0, 16, 0.01)] pts += np.random.randn(len(pts), 3) /20 # add noise np.random.shuffle(pts) # make sure points are not ordered pts = Points(pts, r=5) plt = Plotter(N=N, axes=1) plt.at(0).show(pts, __doc__) for i in range(1, N): pts = pts.clone().smooth_mls_1d(f=0.4).color(i) if i == N-1: # at the last iteration make sure points # are separated by tol (in % of bbox) pts.subsample(0.02) plt.at(i).show(pts, f"Iteration {i}, #points: {pts.npoints}") plt.interactive().close() vedo-2023.4.6/examples/advanced/moving_least_squares2D.py000066400000000000000000000032141444463326400232740ustar00rootroot00000000000000"""Use a variant of the Moving Least Squares (MLS) algorithm to project a cloud of points to become a smooth surface. In the second window we show the error estimated for each point in color scale (left) or in size scale (right).""" from vedo import * printc(__doc__, invert=1) plt1 = Plotter(N=3, axes=1) mesh = Mesh(dataurl+"bunny.obj").normalize().subdivide() pts = mesh.points() pts += np.random.randn(len(pts), 3)/20 # add noise, will not mess up the original points #################################### smooth cloud with MLS # build the mesh points s0 = Points(pts, r=3).color("blue") plt1.at(0).show(s0, "original point cloud + noise") # project s1 points into a smooth surface of points # The parameter f controls the size of the local regression. mls1 = s0.clone().smooth_mls_2d(f=0.5) plt1.at(1).show(mls1, "MLS first pass, f=0.5") # mls1 is an Assembly so unpack it to get the first object it contains mls2 = mls1.clone().smooth_mls_2d(radius=0.1) plt1.at(2).show(mls2, "MLS second pass, radius=0.1") #################################### draw errors plt2 = Plotter(pos=(300, 400), N=2, axes=1) variances = mls2.info["variances"] vmin, vmax = np.min(variances), np.max(variances) print("min and max of variances:", vmin, vmax) vcols = [color_map(v, "jet", vmin, vmax) for v in variances] # scalars->colors sp0 = Spheres(mls2.points(), c=vcols, r=0.02) # error as color sp1 = Spheres(mls2.points(), c="red", r=variances/4) # error as point size mesh.color("k").alpha(0.05).wireframe() plt2.at(0).show(sp0, "Use color to represent variance") plt2.at(1).show(sp1, "point size to represent variance", zoom=1.3, interactive=True) plt2.close() plt1.close() vedo-2023.4.6/examples/advanced/multi_viewer2.py000066400000000000000000000042061444463326400214530ustar00rootroot00000000000000from vedo import settings, Plotter, ParametricShape, VedoLogo, Text2D settings.renderer_frame_width = 1 ############################################################################## def on_left_click(evt): if not evt.actor: return shapename.text(f'This is called: {evt.actor.name}, on renderer nr.{evt.at}') plt.at(1).remove(actsonshow).add(evt.actor).reset_camera() actsonshow.clear() actsonshow.append(evt.actor) ############################################################################## sy, sx, dx = 0.12, 0.12, 0.01 # Define the renderers rectangle areas # to help finding bottomleft&topright corners check out utils.grid_corners() shape = [ dict(bottomleft=(0,0), topright=(1,1), bg='k7'), # the full empty window dict(bottomleft=(dx*2+sx,0.01), topright=(1-dx,1-dx), bg='w'), # the display window dict(bottomleft=(dx,sy*1), topright=(dx+sx,sy*2), bg='k8', bg2='lb'), # CrossCap dict(bottomleft=(dx,sy*2), topright=(dx+sx,sy*3), bg='k8', bg2='lb'), dict(bottomleft=(dx,sy*3), topright=(dx+sx,sy*4), bg='k8', bg2='lb'), dict(bottomleft=(dx,sy*4), topright=(dx+sx,sy*5), bg='k8', bg2='lb'), dict(bottomleft=(dx,sy*5), topright=(dx+sx,sy*6), bg='k8', bg2='lb'), dict(bottomleft=(dx,sy*6), topright=(dx+sx,sy*7), bg='k8', bg2='lb'), dict(bottomleft=(dx,sy*7), topright=(dx+sx,sy*8), bg='k8', bg2='lb'), # RandomHills ] plt = Plotter(shape=shape, sharecam=False, size=(1050, 980)) plt.add_callback("when i click my mouse button please call", on_left_click) for i in range(2,9): ps = ParametricShape(i).color(i) pname = Text2D(ps.name, c='k', bg='blue', s=0.7, font='Calco') plt.at(i).show(ps, pname) shapename = Text2D(pos='top-center', c='r', bg='y', font='Calco') # empty text vlogo = VedoLogo(distance=5) actsonshow = [vlogo] title = "My Multi Viewer 1.0" instr = "Click on the left panel to select a shape\n" instr+= "Press h to print the full list of options" plt.at(1).show( vlogo, shapename, Text2D(title, pos=(0.5,0.85), s=2.5, c='dg', font='Kanopus', justify='center'), Text2D(instr, bg='g', pos=(0.5,0.05), s=1.2, font='Quikhand', justify='center'), ) plt.interactive().close() vedo-2023.4.6/examples/advanced/recosurface.py000066400000000000000000000021431444463326400211550ustar00rootroot00000000000000""" Reconstruct a polygonal surface from a point cloud: 1. An object is loaded and noise is added to its vertices. 2. The point cloud is smoothened with MLS (Moving Least Squares) 3. Impose a minimum distance among points 4. A triangular mesh is extracted from this set of sparse Points. """ from vedo import dataurl, printc, Plotter, Points, Mesh, Text2D plt = Plotter(shape=(1,5)) plt.at(0).show(Text2D(__doc__, s=0.75, font='Theemim', bg='green5')) # 1. load a mesh mesh = Mesh(dataurl+"apple.ply").subdivide() plt.at(1).show(mesh) # Add noise pts0 = Points(mesh, r=3).add_gaussian_noise(1) plt.at(2).show(pts0) # 2. Smooth the point cloud with MLS pts1 = pts0.clone().smooth_mls_2d(f=0.8) printc("Nr of points before cleaning nr. points:", pts1.npoints) # 3. Impose a min distance among mesh points pts1.subsample(0.005) printc(" after cleaning nr. points:", pts1.npoints) plt.at(3).show(pts1) # 4. Reconstruct a polygonal surface from the point cloud reco = pts1.reconstruct_surface(dims=100, radius=0.2).c("gold") plt.at(4).show(reco, axes=7, zoom=1.2) plt.interactive().close() vedo-2023.4.6/examples/advanced/run_all.sh000077500000000000000000000005331444463326400202760ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo ############################################# echo Press Esc at anytime to skip example echo ############################################# echo echo for f in *.py do if [[ "$f" == *"geological_model"* ]]; then continue; fi echo "Processing $f script.." python3 "$f" done vedo-2023.4.6/examples/advanced/skeletonize.py000066400000000000000000000006131444463326400212100ustar00rootroot00000000000000"""Using 1D Moving Least Squares to skeletonize a surface""" from vedo import dataurl, Points, Plotter N = 9 # nr of iterations f = 0.2 # fraction of neighbours pcl = Points(dataurl+"man.vtk").subsample(0.02) plt = Plotter(N=N, axes=1) for i in range(N): pcl = pcl.clone().smooth_mls_1d(f=f).color(i) plt.at(i).show(f"iteration {i}", pcl, elevation=-5) plt.interactive().close() vedo-2023.4.6/examples/advanced/spline_draw.py000066400000000000000000000042251444463326400211660ustar00rootroot00000000000000from vedo import dataurl, Picture from vedo.applications import SplinePlotter # ready to use class! pic = Picture(dataurl + "images/embryo.jpg") plt = SplinePlotter(pic) plt.show(mode="image", zoom='tightest') print("Npts =", len(plt.cpoints), "NSpline =", plt.line.npoints) ##################################################################### # This is a simplified version of vedo.applications.SplinePlotter ##################################################################### # from vedo import printc, precision, Plotter, Spline, Points, Text2D # # class MySplinePlotter(Plotter): # def __init__(self, **kwargs): # super().__init__(**kwargs) # self.cpoints = [] # self.points = None # self.spline = None # def on_left_click(self, evt): # if not evt.actor: # return # p = evt.picked3d + [0, 0, 1] # self.cpoints.append(p) # self.update() # printc("Added point:", precision(p[:2], 4), c="g") # def on_right_click(self, evt): # if evt.actor and len(self.cpoints) > 0: # self.cpoints.pop() # pop removes the last point # self.update() # printc("Deleted last point", c="r") # def on_key_press(self, evt): # if evt.keypress == "c": # self.cpoints = [] # self.remove(self.spline, self.points).render() # printc("==== Cleared all points ====", c="r", invert=True) # def update(self): # self.remove([self.spline, self.points]) # remove old points and spline # self.points = Points(self.cpoints).ps(10).c("purple5") # self.points.pickable(False) # avoid picking the same point # if len(self.cpoints) > 2: # self.spline = Spline(self.cpoints, closed=False).c("yellow5").lw(3) # self.add(self.points, self.spline) # else: # self.add(self.points) # plt = MySplinePlotter(axes=True, bg="blackboard") # plt.add_callback("key press", plt.on_key_press) # plt.add_callback("left mouse click", plt.on_left_click) # plt.add_callback("right mouse click", plt.on_right_click) # plt.show(pic, mode="image", zoom=1.2) # plt.close() vedo-2023.4.6/examples/advanced/splitmesh.py000066400000000000000000000004741444463326400206710ustar00rootroot00000000000000"""Split a mesh by connectivity and order the pieces by increasing surface area""" from vedo import dataurl, Volume, show em = Volume(dataurl+"embryo.tif").isosurface(80) # return the list of the largest 10 connected meshes: splitem = em.split(maxdepth=40)[0:9] show(splitem, __doc__, axes=1, viewup='z').close() vedo-2023.4.6/examples/advanced/timer_callback0.py000066400000000000000000000005151444463326400216710ustar00rootroot00000000000000from vedo import * from time import time def loop_func(event): msh.rotate_z(0.1) txt.text(f"time: {event.time - t0} sec") plt.render() t0 = time() msh = Cube() txt = Text2D(bg='yellow', font="Calco") plt = Plotter(axes=1) plt.add_callback("timer", loop_func) plt.timer_callback("start") plt.show(msh, txt) plt.close() vedo-2023.4.6/examples/advanced/timer_callback1.py000066400000000000000000000023201444463326400216660ustar00rootroot00000000000000"""Create a simple Play/Pause app with a timer event You can interact with the scene during the loop! ..press q to quit""" import time import numpy as np from vedo import Plotter from vedo.pyplot import plot def bfunc(): global timer_id plotter.timer_callback("destroy", timer_id) if "Play" in button.status(): # instruct to call handle_timer() every 10 msec: timer_id = plotter.timer_callback("create", dt=10) button.switch() def handle_timer(event): t = time.time() - t0 x = np.linspace(t, t + 4*np.pi, 50) y = np.sin(x) * np.sin(x/12) fig = plot( x, y, '-o', ylim=(-1.2, 1.2), aspect=3/1, xtitle="time window [s]", ytitle="intensity [a.u.]", ) fig.shift(-x[0]) # put the whole plot object back at (0,0) # pop (remove) the old plot and add the new one plotter.pop().add(fig).render() timer_id = -1 t0 = time.time() plotter= Plotter(size=(1200,600)) button = plotter.add_button(bfunc, states=[" Play ","Pause"], size=40) evntId = plotter.add_callback("timer", handle_timer) x = np.linspace(0, 4*np.pi, 50) y = np.sin(x) * np.sin(x/12) fig = plot(x, y, ylim=(-1.2, 1.2), xtitle="time", aspect=3/1, lc='grey5') plotter.show(__doc__, fig, zoom=2) vedo-2023.4.6/examples/advanced/timer_callback2.py000066400000000000000000000043731444463326400217010ustar00rootroot00000000000000# Create a class which wraps the vedo.Plotter class and adds a timer callback # Credits: Nicolas Antille, https://github.com/nantille # Check out the simpler example: timer_callback1.py import vedo class Viewer: def __init__(self, *args, **kwargs): self.dt = kwargs.pop("dt", 100) # update every dt milliseconds self.timer_id = None self.isplaying = False self.counter = 0 # frame counter self.button = None self.plotter = vedo.Plotter(*args, **kwargs) # setup the Plotter object self.timerevt = self.plotter.add_callback('timer', self.handle_timer) def initialize(self): # initialize here extra elements like buttons etc.. self.button = self.plotter.add_button( self._buttonfunc, states=["\u23F5 Play ","\u23F8 Pause"], font="Kanopus", size=32, ) return self def show(self, *args, **kwargs): plt = self.plotter.show(*args, **kwargs) return plt def _buttonfunc(self): if self.timer_id is not None: self.plotter.timer_callback("destroy", self.timer_id) if not self.isplaying: self.timer_id = self.plotter.timer_callback("create", dt=100) self.button.switch() self.isplaying = not self.isplaying def handle_timer(self, event): ##################################################################### ### Animate your stuff here ### ##################################################################### #print(event) # info about what was clicked and more moon.color(self.counter) # change color to the Moon earth.rotate_z(2) # rotate the Earth moon.rotate_z(1) txt2d.text("Moon color is:").color(self.counter).background(self.counter,0.1) txt2d.text(vedo.get_color_name(self.counter), "top-center") txt2d.text("..press q to quit", "bottom-right") self.plotter.render() self.counter += 1 viewer = Viewer(axes=1, dt=150).initialize() earth = vedo.Earth() moon = vedo.Sphere(r=0.1).x(1.5).color('k7') txt2d = vedo.CornerAnnotation().font("Kanopus") viewer.show(earth, moon, txt2d, viewup='z').close() vedo-2023.4.6/examples/advanced/timer_callback3.py000066400000000000000000000032541444463326400216770ustar00rootroot00000000000000"""Create 2 independent timer callbacks:""" from vedo import * # Defining a function to be called by a timer event def func1(event): # Check if this function was called by the right timer if event.timerid != ida: return # Rotate a cube mesh and set its color to green5 msh.rotate_z(1.0).c("green5") # Update text and print a message with the event and timer ids txt.text("func1() called").background('green5') printc(f"func1() id={event.id}, timerid={event.timerid}", c='g') plt.render() # Defining another function to be called by a different timer event def func2(event): # Check if this function was called by the right timer if event.timerid != idb: return # Rotate the same cube mesh in a different direction msh.rotate_x(5.0).c("red5") # Update text and print a message with the event and timer ids txt.text("func2() called").background('red5') printc(f"func2() id={event.id}, timerid={event.timerid}", c='r') plt.render() # Create a cube mesh and a text object msh = Cube() txt = Text2D(font="Calco", pos='top-right') # Create a plotter object with axes plt = Plotter(axes=1) # Add the two callback functions to the plotter's timer events id1 = plt.add_callback("timer", func1) id2 = plt.add_callback("timer", func2) printc("Creating Timer Callbacks with IDs:", id1, id2) # Start two timers, one with a delay of 1s and the other with a delay of 2.3s ida = plt.timer_callback("start", dt=1000) idb = plt.timer_callback("start", dt=2300) printc("Starting timers with IDs :", ida, idb) # Stop the first timer using its ID # plt.timer_callback("stop", ida) plt.show(msh, txt, __doc__, viewup='z') plt.close() vedo-2023.4.6/examples/advanced/voronoi2.py000066400000000000000000000010161444463326400204270ustar00rootroot00000000000000"""Voronoi tessellation of a pointcloud on a grid""" from vedo import dataurl, Points, Grid, voronoi, show pts0 = Points(dataurl+'rios.xyz').color('k') pts1 = pts0.clone().smooth_lloyd_2d() grid = Grid([14500,61700], s=[22000,24000], res=[30,30]).ps(1) allpts = pts1.points().tolist() + grid.points().tolist() msh = voronoi(allpts, method='scipy') msh.lw(0.1).wireframe(False).cmap('terrain_r', 'VoronoiID', on='cells') centers = Points(msh.cell_centers(), c='k') show(msh, pts0, __doc__, axes=dict(digits=3), zoom=1.3) vedo-2023.4.6/examples/advanced/warp1.py000066400000000000000000000017361444463326400177150ustar00rootroot00000000000000"""Fit a surface to a set of points""" # Thin Plate Spline transformations describe a nonlinear warp # transform defined by a set of source and target landmarks. # Any point on the mesh close to a source landmark will # be moved to a place close to the corresponding target landmark. # The points in between are interpolated using Bookstein's algorithm. from vedo import Grid, Points, Arrows, show import numpy as np np.random.seed(1) surf = Grid([0,0,0], res=[25,25]) ids = np.random.randint(0, surf.npoints, 10) # pick 10 indices pts = surf.points()[ids] ptsource, pttarget = [], [] for pt in pts: pt1 = pt + [0, 0, np.random.randn() * 0.1] pt2 = surf.closest_point(pt1) ptsource.append(pt2) pttarget.append(pt1) warped = surf.warp(ptsource, pttarget, mode='2d') warped.color("b4").lc('lightblue').lw(0.1).wireframe(False) apts = Points(pttarget, r=15, c="red5") arrs = Arrows(ptsource, pttarget, c='k') show(warped, apts, arrs, __doc__, axes=1, viewup="z").close() vedo-2023.4.6/examples/advanced/warp2.py000066400000000000000000000015671444463326400177200ustar00rootroot00000000000000"""Warp a region of a mesh using Thin Plate Splines. Red points stay fixed while a single point in space moves as the arrow indicates.""" from vedo import * settings.use_depth_peeling = True mesh = Mesh(dataurl+"man.vtk").color('w') # a heavily decimated copy with about 200 points meshdec = mesh.clone().triangulate().decimate(n=200) sources = [[0.9, 0.0, 0.2]] # this point moves targets = [[1.2, 0.0, 0.4]] # ...to this. for pt in meshdec.points(): if pt[0] < 0.3: # these pts don't move sources.append(pt) # (e.i. source = target) targets.append(pt) arrow = Arrows(sources, targets) apts = Points(sources).c("red") warp = mesh.clone().warp(sources, targets) warp.c("blue", 0.3).wireframe() sphere = Sphere(r=0.3).pos(1,0,-.50) sphere.apply_transform(warp.transform) # print(warp.transform) show(mesh, arrow, warp, apts, sphere, axes=1).close() vedo-2023.4.6/examples/advanced/warp3.py000066400000000000000000000071171444463326400177160ustar00rootroot00000000000000"""Take 2 clouds of points, source and target, and morph the plane using thin plate splines as a model. The fitting minimizes the distance to a subset of the target cloud""" from vedo import printc, Points, Grid, Arrows, Lines, Plotter import scipy.optimize as opt import numpy as np np.random.seed(2) class Morpher(Plotter): def __init__(self, **kwargs): super().__init__(**kwargs) self.source = None self.morphed_source = None self.target = None self.bound = 1 self.sigma = 1 # stiffness of the mesh self.method = "SLSQP" # 'SLSQP', 'L-BFGS-B', 'TNC' ... self.fitTolerance = 1e-6 self.fitResult = None self.chi2 = 1.0e30 self.npts = None self.ptsource = [] self.pttarget = [] def _func(self, pars): shift = np.array(np.split(pars, 2)).T # recreate the shift vectors z = np.zeros((self.npts, 1)) shift = np.append(shift, z, axis=1) # make them 3d self.morphed_source = self.source.clone().warp( self.ptsource, self.ptsource + shift, sigma=self.sigma, mode="2d" ) d = self.morphed_source.points() - self.target.points() chi2 = np.sum(np.multiply(d, d)) # /len(d) if chi2 < self.chi2: printc("new minimum ->", chi2) self.chi2 = chi2 return chi2 # ------------------------------------------------------- Fit def morph(self): print("\n..minimizing with " + self.method) self.morphed_source = self.source.clone() self.ptsource = self.source.points()[: self.npts] # pick the first npts points self.pttarget = self.target.points()[: self.npts] delta = self.pttarget - self.ptsource x0 = delta[:, (0, 1)].T.ravel() # initial guess, a flat list of x and y shifts bnds = [(-self.bound, self.bound)] * (2 * self.npts) res = opt.minimize( self._func, x0, bounds=bnds, method=self.method, tol=self.fitTolerance ) self.fitResult = res # recalculate the last step: self._func(res["x"]) # ------------------------------------------------------- Visualization def draw_shapes(self): sb = self.source.bounds() x1, x2, y1, y2, _, _ = sb maxb = max(x2 - x1, y2 - y1) grid0 = Grid(self.source.center_of_mass(), s=[maxb, maxb], res=[40, 40]) T = self.morphed_source.transform grid1 = grid0.clone().apply_transform(T) # warp the grid arrows = Arrows(self.ptsource, self.pttarget, alpha=0.5, s=3).c("k") lines = Lines(self.source, self.target).c("db") mlines = Lines(self.morphed_source, self.target).c("db") self.at(0).show(grid0, self.source, self.target, lines, arrows, __doc__) self.at(1).show( grid1, self.morphed_source, self.target, mlines, f"morphed source (green) vs target (red)\nNDF = {2*self.npts}", ) ################################# if __name__ == "__main__": # make up a source random cloud pts_s = np.random.randn(25, 2) pts_t = pts_s + np.sin(2 * pts_s) / 5 # and distort it mr = Morpher(N=2) mr.source = Points(pts_s, r=20, c="g", alpha=0.5) mr.target = Points(pts_t, r=10, c="r", alpha=1.0) mr.bound = 2 # limits the x and y shift # allow move only a subset of points (implicitly sets the NDF of the fit) mr.npts = 6 mr.sigma = 1.0 # stiffness of the mesh (1=max stiffness) mr.morph() # now mr.msource contains the modified/morphed source. mr.draw_shapes() mr.interactive().close() vedo-2023.4.6/examples/advanced/warp4.py000066400000000000000000000151701444463326400177150ustar00rootroot00000000000000# Morph one shape into another interactively (can work in 3d too!) # from vedo import Plotter, Axes, dataurl, load, printc, merge from vedo.shapes import Text2D, Points, Lines, Arrows2D, Grid class Morpher: def __init__(self, mesh1, mesh2, n): ############################### init self.n = n # desired nr. of intermediate shapes self.mode = '2d' self.mesh1 = mesh1 self.mesh2 = mesh2 self.merged_meshes = merge(mesh1, mesh2) self.mesh1.lw(4).c('grey2').pickable(False) self.mesh2.lw(4).c('grey1').pickable(False) self.arrow_starts = [] self.arrow_stops = [] self.dottedln = None self.toggle = False self.instructions = ("Click to add arrows interactively on the left panel\n" "right-click to remove last arrow. Then press:\n" "- m to morph the plane\n" "- c to clear\n" "- g to generate interpolation") self.msg1 = Text2D(self.instructions, pos='top-left', font="VictorMono", bg='g2', alpha=0.6) self.msg2 = Text2D('[output will show here]', pos='top-left', font="VictorMono") sz = self.merged_meshes.diagonal_size() self.plane1 = Grid(s=[sz,sz], res=[50,50]).pos(self.merged_meshes.center_of_mass()) self.plane1.wireframe(False).alpha(1).linewidth(0.1).c('white').lc('grey5') self.plane2 = self.plane1.clone().pickable(False) self.plotter = Plotter(N=2, bg='light blue', size=(2000,1000), sharecam=0) self.plotter.add_callback('left click', self.onleftclick) self.plotter.add_callback('right click', self.onrightclick) self.plotter.add_callback('key press', self.onkeypress) def start(self): ################################################ show stuff paxes = Axes(self.plane1, xygrid=0, text_scale=0.6) self.plotter.at(0).show(self.plane1, paxes, self.msg1, self.mesh1, self.mesh2) self.plotter.at(1).show(self.plane2, self.msg2, mode='image') if len(self.arrow_starts)>0: self.draw(True) self.draw(False) self.msg1.text(self.instructions) self.plotter.show(interactive=True, zoom=1.3).close() def draw(self, toggle=None): #################################### update scene if toggle is None: toggle = self.toggle if toggle: self.msg1.text("Choose start point or press:\nm to morph the shapes\ng to interpolate") self.plotter.at(0).remove("displacementArrows") if len(self.arrow_starts)==0: return arrows = Arrows2D(self.arrow_starts, self.arrow_stops, c='red4') arrows.name = "displacementArrows" self.plotter.add(arrows) else: self.msg1.text("Click to choose an end point") self.plotter.at(0).remove("displacementPoints") points = Points(self.arrow_starts, r=15, c='green3', alpha=0.5) points.name = "displacementPoints" self.plotter.add(points) def onleftclick(self, evt): ############################################ add points msh = evt.actor if not msh or msh.name!="Grid": return pt = self.merged_meshes.closest_point(evt.picked3d) # get the closest pt on the line self.arrow_stops.append(pt) if self.toggle else self.arrow_starts.append(pt) self.draw() self.toggle = not self.toggle def onrightclick(self, evt): ######################################## remove points if not self.arrow_starts: return self.arrow_starts.pop() if not self.toggle: self.arrow_stops.pop() self.plotter.at(0).clear().add_renderer_frame() self.plotter.add([self.plane1, self.msg1, self.mesh1, self.mesh2]) self.draw(False) self.draw(True) def onkeypress(self, evt): ###################################### MORPH & GENERATE if evt.keypress == 'm': ##--------- morph mesh1 based on the existing arrows if len(self.arrow_starts) != len(self.arrow_stops): printc("You must select your end point first!", c='y') return output = [self.mesh1.clone().c('grey4'), self.mesh2, self.msg2] warped_plane = self.plane1.clone().pickable(False) warped_plane.warp(self.arrow_starts, self.arrow_stops, mode=self.mode) output.append(warped_plane + Axes(warped_plane, xygrid=0, text_scale=0.6)) mw = self.mesh1.clone().apply_transform(warped_plane.transform).c('red4') output.append(mw) T_inv = warped_plane.transform.GetInverse() a = Points(self.arrow_starts, r=10).apply_transform(warped_plane.transform) b = Points(self.arrow_stops, r=10).apply_transform(warped_plane.transform) self.dottedln = Lines(a,b, res=self.n).apply_transform(T_inv).point_size(5) output.append(self.dottedln) self.msg1.text(self.instructions) self.msg2.text("Morphed output:") self.plotter.at(1).clear().add_renderer_frame().add(output).reset_camera() elif evt.keypress == 'g': ##------- generate intermediate shapes if not self.dottedln: return intermediates = [] allpts = self.dottedln.points() allpts = allpts.reshape(len(self.arrow_starts), self.n+1, 3) for i in range(self.n + 1): pi = allpts[:,i,:] m_nterp = self.mesh1.clone().warp(self.arrow_starts, pi, mode=self.mode).c('b3').lw(1) intermediates.append(m_nterp) self.msg2.text("Morphed output + Interpolation:") self.plotter.at(1).add(intermediates).render() self.dottedln = None elif evt.keypress == 'c': ##------- clear all self.arrow_starts = [] self.arrow_stops = [] self.toggle = False self.dottedln = None self.msg1.text(self.instructions) self.msg2.text("[output will show here]") self.plotter.at(0).clear() self.plotter.add([self.plane1, self.msg1, self.mesh1, self.mesh2]) self.plotter.at(1).clear().add_renderer_frame() self.plotter.add([self.plane2, self.msg2]).render() ######################################################################################## MAIN if __name__ == "__main__": outlines = load(dataurl+"timecourse1d.npy") # load a set of 2d shapes mesh1 = outlines[25] mesh2 = outlines[35].scale(1.3).shift(-2,0,0) morpher = Morpher(mesh1, mesh2, 10) # generate 10 intermediate outlines morpher.start() vedo-2023.4.6/examples/advanced/warp5.py000066400000000000000000000115771444463326400177250ustar00rootroot00000000000000""" Takes 2 shapes, source and target, and morphs source on target this is obtained by fitting 18 parameters of a non linear, quadratic, transformation defined in transform() The fitting minimizes the distance to the target surface using algorithms available in the scipy.optimize package. """ from vedo import dataurl, vector, mag2, mag from vedo import Plotter, Sphere, Point, Text3D, Arrows, Mesh import scipy.optimize as opt print(__doc__) plt = Plotter(shape=[1, 3], interactive=0, axes=1) class Morpher: def __init__(self): self.source = None self.target = None self.bound = 0.1 self.method = "SLSQP" # 'SLSQP', 'L-BFGS-B', 'TNC' ... self.tolerance = 0.0001 self.subsample = 200 # pick only subsample pts self.allow_scaling = False self.params = [] self.msource = None self.s_size = ([0, 0, 0], 1) # ave position and ave size self.fitResult = None self.chi2 = 1.0e10 # -------------------------------------------------------- fit function def transform(self, p): a1, a2, a3, a4, a5, a6, b1, b2, b3, b4, b5, b6, c1, c2, c3, c4, c5, c6, s = self.params pos, sz = self.s_size[0], self.s_size[1] x, y, z = (p - pos) / sz * s # bring to origin, norm and scale xx, yy, zz, xy, yz, xz = x * x, y * y, z * z, x * y, y * z, x * z xp = x + 2 * a1 * xy + a4 * xx + 2 * a2 * yz + a5 * yy + 2 * a3 * xz + a6 * zz yp = +2 * b1 * xy + b4 * xx + y + 2 * b2 * yz + b5 * yy + 2 * b3 * xz + b6 * zz zp = +2 * c1 * xy + c4 * xx + 2 * c2 * yz + c5 * yy + z + 2 * c3 * xz + c6 * zz p2 = vector(xp, yp, zp) p2 = (p2 * sz) + pos # take back to original size and position return p2 def _func(self, pars): self.params = pars #calculate chi2 d2sum, n = 0.0, self.source.npoints srcpts = self.source.points() rng = range(0, n, int(n / self.subsample)) for i in rng: p1 = srcpts[i] p2 = self.transform(p1) tp = self.target.closest_point(p2) d2sum += mag2(p2 - tp) d2sum /= len(rng) if d2sum < self.chi2: if d2sum < self.chi2 * 0.99: print("Emin ->", d2sum) self.chi2 = d2sum return d2sum # ------------------------------------------------------- Fit def morph(self): def avesize(pts): # helper fnc s, amean = 0, vector(0, 0, 0) for p in pts: amean = amean + p amean /= len(pts) for p in pts: s += mag(p - amean) return amean, s / len(pts) print("\n..minimizing with " + self.method) self.msource = self.source.clone() self.s_size = avesize(self.source.points()) bnds = [(-self.bound, self.bound)] * 18 x0 = [0.0] * 18 # initial guess x0 += [1.0] # the optional scale if self.allow_scaling: bnds += [(1.0 - self.bound, 1.0 + self.bound)] else: bnds += [(1.0, 1.0)] # fix scale to 1 res = opt.minimize(self._func, x0, bounds=bnds, method=self.method, tol=self.tolerance) # recalc for all pts: self.subsample = self.source.npoints self._func(res["x"]) print("\nFinal fit score", res["fun"]) self.fitResult = res # ------------------------------------------------------- Visualization def draw_shapes(self): pos, sz = self.s_size[0], self.s_size[1] sphere0 = Sphere(pos, c="gray", r=sz, res=10, quads=True).wireframe() newpts = [] for p in self.msource.points(): newp = self.transform(p) newpts.append(newp) self.msource.points(newpts) arrs = [] for p in sphere0.points(): newp = self.transform(p) arrs.append([p, newp]) hair = Arrows(arrs, s=0.3, c='jet') zero = Point(pos, c="black") x1, x2, y1, y2, z1, z2 = self.target.bounds() tpos = [x1, y2, z1] text1 = Text3D("source vs target", tpos, s=sz / 10, c="dg") text2 = Text3D("morphed vs target", tpos, s=sz / 10, c="dg") text3 = Text3D("deformation", tpos, s=sz / 10, c="dr") plt.at(2).show(sphere0, zero, text3, hair) plt.at(1).show(self.msource, self.target, text2) plt.at(0).show(self.source, self.target, text1, zoom=1.2, interactive=True) plt.close() ################################# if __name__ == "__main__": mr = Morpher() mr.source = Mesh(dataurl+"270.vtk").color("g").alpha(0.4) mr.target = Mesh(dataurl+"290.vtk").color("b").alpha(0.3) mr.target.wireframe() mr.allow_scaling = True mr.bound = 0.4 # limits the parameter value mr.morph() print("Result of parameter fit:\n", mr.params) # now mr.msource contains the modified/morphed source. mr.draw_shapes() vedo-2023.4.6/examples/advanced/warp6.py000066400000000000000000000020111444463326400177050ustar00rootroot00000000000000"""Press c while hovering to warp a Mesh onto another Mesh""" from vedo import * def on_keypress(event): if event.actor and event.keypress == "c": picked = event.picked3d idx = mesh.closest_point(picked, return_point_id=True) pt = points[idx] n = normals[idx] pt = pt + n / 5 txt.orientation(n).pos(pt) tpts = txt.clone().subsample(0.05).points() kpts = [mesh.closest_point(tp) for tp in tpts] warped = txt.clone().warp(tpts, kpts, sigma=0.01, mode="2d") warped.c("purple5") lines = Lines(tpts, kpts, alpha=0.2) plt.remove("Text3D", "Lines").add(txt, warped, lines).render() txt = Text3D("Text3D\n01-ABCD", s=0.1, justify="centered", c="red5") mesh = ParametricShape("RandomHills").scale([1,1,0.5]) mesh.c("gray5").alpha(0.25) points = mesh.points() normals = mesh.normals() plt = Plotter() plt.add_callback("key press", on_keypress) plt.show(mesh, txt, __doc__, axes=9, viewup="z").close() vedo-2023.4.6/examples/basic/000077500000000000000000000000001444463326400156165ustar00rootroot00000000000000vedo-2023.4.6/examples/basic/__init__.py000066400000000000000000000000031444463326400177200ustar00rootroot00000000000000# #vedo-2023.4.6/examples/basic/align1.py000066400000000000000000000015061444463326400173450ustar00rootroot00000000000000"""Align 2 shapes: the red line to the yellow surface""" from vedo import * # Load two mesh objects, a limb and a rim, and color them gold and red limb = Mesh(dataurl + "270.vtk").c("gold") rim = Mesh(dataurl + "270_rim.vtk").c("red5").lw(4) # Make a clone copy of the rim and align it to the limb # Using rigid=True does not allow scaling rim2 = rim.clone().align_to(limb, rigid=True).c("green5").lw(5) # Calculate the average squared distance between the aligned rim and the limb d = 0 for p in rim2.points(): cpt = limb.closest_point(p) d += mag2(p - cpt) # square of residual distance average_squared_distance = d / rim2.npoints # Print the average squared distance between the aligned rim and the limb printc("Average squared distance =", average_squared_distance, c="g") show(limb, rim, rim2, __doc__, axes=1).close() vedo-2023.4.6/examples/basic/align2.py000066400000000000000000000020031444463326400173370ustar00rootroot00000000000000"""Generate two random sets of points and align them using the Iterative Closest Point algorithm""" from random import uniform as u from vedo import Points, Arrows, Plotter N1 = 25 # number of points of first set N2 = 35 # number of points of second set x = 1.0 # add some randomness # Create two sets of random points with different colors pts1 = [(u(0, x), u(0, x), u(0, x) + i) for i in range(N1)] pts2 = [(u(0, x)+3, u(0, x)+i/3+2, u(0, x)+i+1) for i in range(N2)] vpts1 = Points(pts1, r=8, c="blue5") vpts2 = Points(pts2, r=8, c="red5") # Find best alignment between the 2 sets of Points, # e.i. find how to move vpts1 to best match vpts2 aligned_pts1 = vpts1.clone().align_to(vpts2, invert=False) # Create arrows to visualize how the points move during alignment arrows = Arrows(pts1, aligned_pts1, s=0.7, c='black', alpha=0.2) # Create a plotter with two subplots plt = Plotter(N=2, axes=1) plt.at(0).show(vpts1, vpts2, __doc__) plt.at(1).show(aligned_pts1, arrows, vpts2, viewup="z") plt.interactive().close() vedo-2023.4.6/examples/basic/align3.py000066400000000000000000000022141444463326400173440ustar00rootroot00000000000000"""Generate 3 random sets of points and align them using Procrustes method""" from random import uniform as u from vedo import Plotter, procrustes_alignment, Points # Define number of points and a randomness factor N = 15 # number of points x = 1.0 # add some randomness # Generate 3 sets of random points pts1 = [(u(0, x), u(0, x), u(0, x) + i) for i in range(N)] pts2 = [(u(0, x) + 3, u(0, x) + i / 2 + 2, u(0, x) + i + 1) for i in range(N)] pts3 = [(u(0, x) + 4, u(0, x) + i / 4 - 3, u(0, x) + i - 2) for i in range(N)] # Convert the sets of points into Points objects with different colors and sizes vpts1 = Points(pts1, c="r", r=8) vpts2 = Points(pts2, c="g", r=8) vpts3 = Points(pts3, c="b", r=8) # Perform Procrustes alignment on the sets of points # and obtain the aligned sets # return an Assembly object formed by the aligned sets aligned = procrustes_alignment([vpts1, vpts2, vpts3]) #print([aligned.transform]) # Create a Plotter object with a 1x2 grid, 2D axes, # and independent camera control plt = Plotter(shape=[1,2], axes=2, sharecam=False) plt.at(0).show(vpts1, vpts2, vpts3, __doc__) plt.at(1).show(aligned) plt.interactive().close() vedo-2023.4.6/examples/basic/align4.py000066400000000000000000000020671444463326400173530ustar00rootroot00000000000000"""Align a set of curves in space with Procrustes method""" from vedo import * # Load splines from a file (returns a list of vedo.Lines) splines = load(dataurl+'splines.npy') # Perform Procrustes alignment on the splines, allowing for non-rigid transformations procus = procrustes_alignment(splines, rigid=False) # Unpack the aligned splines from the Assembly object into a Python list alignedsplines = procus.unpack() # Obtain the mean spline and create a Line object with thicker width and blue color mean = procus.info['mean'] lmean = Line(mean, lw=4, c='b').z(0.001) # z-shift it to make it visible # Color the aligned splines based on their distance from the mean spline for l in alignedsplines: darr = mag(l.points()-mean) # distance array l.cmap('hot_r', darr, vmin=0, vmax=0.007) # Add the mean spline and script description to the list of aligned splines alignedsplines += [lmean, __doc__] # Show the original and aligned splines in two side-by-side views # with independent cameras show([splines, alignedsplines], N=2, sharecam=False, axes=1).close() vedo-2023.4.6/examples/basic/align5.py000066400000000000000000000021741444463326400173530ustar00rootroot00000000000000"""Linearly transform a Mesh by defining how a specific set of points (landmarks) must move""" from vedo import dataurl, Mesh, Arrows, show # Define the original set of landmark points # note that landmark points do not need to belong to any mesh landmarks1 = [ [-0.067332, 0.177376, -0.05199058], [-0.004541, 0.085447, 0.05713107], [-0.011799, 0.175825, -0.02279279], [-0.081910, 0.117902, 0.04889364], ] # Define the target set of landmark points landmarks2 = [ [0.1287002, 0.2651531, -0.0469673], [0.3338593, 0.0941488, 0.1243552], [0.1860555, 0.2626522, -0.0202493], [0.1149052, 0.1731894, 0.0474256], ] s1 = Mesh(dataurl + "bunny.obj").c("gold") # Clone the mesh and color the clone orange s2 = s1.clone().c('orange4') # Transform the cloned mesh by moving the landmarks from landmarks1 to landmarks2 s2.transform_with_landmarks(landmarks1, landmarks2) # Create arrows to visualize the movement of the landmark points arrows = Arrows(landmarks1, landmarks2, s=0.5, c='black') # Show the original mesh, transformed mesh, arrows, and script description show(s1, s2, arrows, __doc__, axes=True).close() vedo-2023.4.6/examples/basic/align6.py000066400000000000000000000015631444463326400173550ustar00rootroot00000000000000 """Align to bounding boxes. Force the Mesh into the empty box.""" from vedo import * # Load a mesh and color it silver msh1 = Mesh(dataurl + "cessna.vtk").color("silver") # Create axes for the original mesh axes1 = Axes(msh1) # Create a wireframe cube at a specified position cube = Cube().pos(2, 1, 0).wireframe() # Clone the mesh and align it to the bounding box of the cube msh2 = msh1.clone().align_to_bounding_box(cube) # Create axes for the aligned mesh axes2 = Axes(msh2) # Set up a Plotter object with 2 subrenderers plt = Plotter(N=2) # Show the original mesh, axes, and cube in the left renderer with the script description plt.at(0).show(msh1, axes1, cube, __doc__) # Show the aligned mesh and axes in the right renderer, viewing from the top plt.at(1).show(msh2, axes2, viewup='z') # Enable interaction and close the plotter when done plt.interactive().close() vedo-2023.4.6/examples/basic/background_image.py000066400000000000000000000015211444463326400214500ustar00rootroot00000000000000""" Set a jpeg background image on a separate rendering layer """ from vedo import * # Create a plotter object with 4 subrenderers # and individual camera for each one plt = Plotter( N=4, sharecam=False, # each subrenderer has its own camera bg=dataurl+"images/tropical.jpg", # set the background image ) # Load a 3D model of a flamingo and rotate it so it is upright a1 = load(dataurl+"flamingo.3ds").rotate_x(-90) # Display a docstring on the second subrenderer plt.at(2).show(__doc__) # Zoom in on the background image to fill the window plt.background_renderer.GetActiveCamera().Zoom(1.8) # Display a logo on the first subrenderer plt.at(0).show(VedoLogo(distance=2)) # Display the flamingo model on the fourth subrenderer plt.at(3).show(a1) # Allow the plot to be interacted with and then close it plt.interactive().close() vedo-2023.4.6/examples/basic/boolean.py000066400000000000000000000025411444463326400176110ustar00rootroot00000000000000from vedo import * # Enable depth peeling for rendering transparency settings.use_depth_peeling = True # Declare an instance of the Plotter class with 2 rows and 2 columns of renderers, # and disable interactive mode, so that the program can continue running plt = Plotter(shape=(2, 2), interactive=False, axes=3) # Create two sphere meshes s1 = Sphere(pos=[-0.7, 0, 0], c="red5", alpha=0.5) s2 = Sphere(pos=[0.7, 0, 0], c="green5", alpha=0.5) # Show the spheres on the first renderer, and display the docstring as the title plt.at(0).show(s1, s2, __doc__) # Perform a boolean intersection operation between the two spheres, # set the color to magenta, and show the result on the second renderer b1 = s1.boolean("intersect", s2).c('magenta') plt.at(1).show(b1, "intersect", resetcam=False) # Perform a boolean union operation between the two spheres, # set the color to blue, add a wireframe, and show the result on the third renderer b2 = s1.boolean("plus", s2).c("blue").wireframe(True) plt.at(2).show(b2, "plus", resetcam=False) # Perform a boolean difference operation between the two spheres, # compute the normals, add a scalarbar, and show the result on the fourth renderer b3 = s1.boolean("minus", s2).compute_normals().add_scalarbar(c='white') plt.at(3).show(b3, "minus", resetcam=False) # Enable interactive mode, and close the plot plt.interactive().close() vedo-2023.4.6/examples/basic/boundaries.py000066400000000000000000000013171444463326400203250ustar00rootroot00000000000000"""Extract points on the boundary of a mesh. Add an ID label to all vertices.""" from vedo import * # Load a mesh from a URL, compute normals, and clean duplicate points b = Mesh(dataurl+'290.vtk') b.compute_normals().clean().linewidth(0.1) # Get the point IDs on the boundary of the mesh pids = b.boundaries(return_point_ids=True) # Get the points corresponding to the boundary IDs bpts = b.points() # Create a Points object to represent the boundary points pts = Points(bpts[pids], r=10, c='red5') # Create a Label object for all the vertices in the mesh labels = b.labels('id', scale=10).c('green2') # Show the mesh, boundary points, vertex labels, and docstring show(b, pts, labels, __doc__, zoom=2).close() vedo-2023.4.6/examples/basic/buildmesh.py000066400000000000000000000014161444463326400201460ustar00rootroot00000000000000"""Manually build a mesh from points and faces""" from vedo import Mesh, show # Define the vertices and faces that make up the mesh verts = [(50,50,50), (70,40,50), (50,40,80), (80,70,50)] faces = [(0,1,2), (2,1,3), (1,0,3)] # Build the polygonal Mesh object from the vertices and faces mesh = Mesh([verts, faces]) # Set the backcolor of the mesh to violet # and show edges with a linewidth of 2 mesh.backcolor('violet').linecolor('tomato').linewidth(2) # Create labels for all vertices in the mesh showing their ID labs = mesh.labels('id').c('black') # Print the points and faces of the mesh as numpy arrays print('points():', mesh.points()) print('faces() :', mesh.faces()) # Show the mesh, vertex labels, and docstring show(mesh, labs, __doc__, viewup='z', axes=1).close() vedo-2023.4.6/examples/basic/buttons.py000066400000000000000000000022641444463326400176720ustar00rootroot00000000000000"""Add a square button with N possible internal states to a rendering window that calls an external function""" from vedo import Plotter, Mesh, dataurl, printc # Define a function that toggles the transparency of a mesh # and changes the button state def buttonfunc(): mesh.alpha(1 - mesh.alpha()) # toggle mesh transparency bu.switch() # change to next status printc(bu.status(), box="_", dim=True) # Load a mesh and set its color to violet mesh = Mesh(dataurl+"magnolia.vtk").c("violet").flat() # Create an instance of the Plotter class with axes style-11 enabled plt = Plotter(axes=11) # Add a button to the plotter with buttonfunc as the callback function bu = plt.add_button( buttonfunc, pos=(0.7, 0.05), # x,y fraction from bottom left corner states=["click to hide", "click to show"], # text for each state c=["w", "w"], # font color for each state bc=["dg", "dv"], # background color for each state font="courier", # font type size=25, # font size bold=True, # bold font italic=False, # non-italic font style ) # Show the mesh, docstring, and button in the plot plt.show(mesh, __doc__).close() vedo-2023.4.6/examples/basic/cartoony.py000066400000000000000000000027271444463326400200360ustar00rootroot00000000000000"""Give a cartoony appearance to a 3D mesh""" from vedo import dataurl, settings, Plotter, Mesh, Text2D # Enable depth peeling for rendering transparency, # and set the number of antialiasing samples to 8 settings.use_depth_peeling = True settings.multi_samples = 8 # Create an instance of the Plotter class, # which creates a default camera needed for silhouette() plt = Plotter() # Create a Text2D object to display the docstring at the bottom-center of the plot, # using the Bongas font with a size of 2 and a dark green background txt = Text2D(__doc__, pos="bottom-center", font="Bongas", s=2, bg="dg") # Load a mesh of a human figure, disable lighting (reflections), # set the color to pink, and set the transparency to 0.5 man = Mesh(dataurl + "man.vtk").lighting("off").c("pink").alpha(0.5) # Load a mesh of a teddy bear, scale and rotate it around the z-axis, ted = Mesh(dataurl + "teddy.vtk").scale(0.4).rotate_z(-45).pos(-1, -1, -1) ted.lighting("off").c("sienna").alpha(0.1) # Show the meshes, the default silhouette of the teddy bear mesh plt.show( txt, ted, man, ted.silhouette(), # default silhouette of the teddy bear mesh man.silhouette(feature_angle=40).linewidth(3).color("dr"), bg="wheat", # set the background color to wheat bg2="lb", # set the color of the gradient to light blue elevation=-80, # set the elevation angle of the camera zoom=1.2, # zoom in on the plot ) # Close the plot plt.close() vedo-2023.4.6/examples/basic/cells_within_bounds.py000066400000000000000000000013331444463326400222260ustar00rootroot00000000000000"""Find cells within specified bounds in x, y and/or z.""" from vedo import * # Load a mesh of a shark and normalize it mesh = Mesh(dataurl+'shark.ply').normalize() # Set the color of the mesh and the line width to 1 mesh.color('aqua').linewidth(1) # Define the lower and upper bounds for the z-axis z1, z2 = -1.5, -1.0 # Find the cell IDs of cells within the z-axis bounds ids = mesh.find_cells_in(zbounds=(z1,z2)) # Print the cell IDs in green to the console printc('IDs of cells within bounds:\n', ids, c='g') # Create two Plane objects at the specified z-positions p1 = Plane(normal=(0,0,1), s=[2,2]).z(z1) p2 = p1.clone().z(z2) # Show the mesh, the two planes, the docstring show(mesh, p1, p2, __doc__, axes=9).close() vedo-2023.4.6/examples/basic/closewindow.py000066400000000000000000000024521444463326400205300ustar00rootroot00000000000000"""Closing the Rendering Window Press q: Control returns to terminal, window will not close but become unresponsive""" from vedo import * mesh = Paraboloid() plt1 = show(mesh, __doc__, title='First Plotter instance') # Now press 'q' to exit the window interaction, # windows stays open but not reactive anymore. # You can go back to interaction mode by simply calling: #plt1.interactive() printc('\nControl returned to terminal shell:', c='tomato', invert=1) ask('window is now unresponsive (press Enter here)', c='tomato', invert=1) plt1.close_window() # window should now close, the Plotter instance becomes unusable # but mesh objects still exist in it: printc("First Plotter actors:", plt1.actors, '\nPress enter again') # plt1.show() # error here: window does not exist anymore. Cannot reopen. ################################################################## # Can now create a brand new Plotter and show the old object in it plt2 = Plotter(title='Second Plotter instance', pos=(500,0)) plt2.show(plt1.actors[0].color('red')) ################################################################## # Create a third new Plotter and then close the second plt3 = Plotter(title='Third Plotter instance') plt2.close_window() printc('plt2.close_window() called') plt3.show(Hyperboloid()).close() printc('done.') vedo-2023.4.6/examples/basic/clustering.py000066400000000000000000000016431444463326400203530ustar00rootroot00000000000000"""Example usage of remove_outliers() and compute_clustering()""" # Import the vedo library and numpy from vedo import np, Points, show # Generate 4 random sets of N points in 3D space N = 2000 f = 0.6 noise1 = np.random.rand(N, 3) * f + np.array([1, 1, 0]) noise2 = np.random.rand(N, 3) * f + np.array([1, 0, 1.2]) noise3 = np.random.rand(N, 3) * f + np.array([0, 1, 1]) noise4 = np.random.randn(N, 3) * f / 8 + np.array([1, 1, 1]) # Create a Points object from the noisy point sets noise4 = Points(noise4).remove_outliers(radius=0.05).points() pts = noise1.tolist() + noise2.tolist() + noise3.tolist() + noise4.tolist() pts = Points(pts) # Cluster the points to find back their original identity clpts = pts.compute_clustering(radius=0.1).print() # Set the color of the points based on their cluster ID using the 'jet' colormap clpts.cmap("jet", "ClusterId") show(clpts, __doc__, axes=1, viewup='z', bg='blackboard').close() vedo-2023.4.6/examples/basic/color_mesh_cells1.py000066400000000000000000000012601444463326400215640ustar00rootroot00000000000000"""Colorize faces of a Mesh by passing a 1-to-1 list of colors and transparencies""" from vedo import * # Enable depth peeling for better rendering of transparent objects settings.use_depth_peeling = True # Generate a torus and assign a linewidth of 1 tor = Torus(res=9).linewidth(1) # Generate an array of random RGBA color values for each cell of the mesh rgba = np.random.rand(tor.ncells, 4)*255 tor.cellcolors = rgba # Print information about the cell arrays of the mesh and their shape printc( 'Mesh cell arrays:', tor.celldata.keys(), 'shape:', tor.celldata['CellsRGBA'].shape, ) # Display the mesh with the assigned colors and the docstring show(tor, __doc__).close() vedo-2023.4.6/examples/basic/color_mesh_cells2.py000066400000000000000000000014001444463326400215610ustar00rootroot00000000000000"""Colorize a mesh cell by clicking on it""" from vedo import Mesh, Plotter, dataurl # Define the callback function to change the color of the clicked cell to red def func(evt): msh = evt.actor if not msh: return pt = evt.picked3d idcell = msh.closest_point(pt, return_cell_id=True) m.cellcolors[idcell] = [255,0,0,200] #RGBA # Load a 3D mesh of a panther from a file and set its color to blue m = Mesh(dataurl + "panther.stl").c("blue7") # Make the mesh opaque and set its line width to 1 m.force_opaque().linewidth(1) # Create a Plotter object and add the callback function to it plt = Plotter() plt.add_callback("mouse click", func) # Display the mesh with the Plotter object and the docstring plt.show(m, __doc__, axes=1).close() vedo-2023.4.6/examples/basic/colorcubes.py000066400000000000000000000032201444463326400203250ustar00rootroot00000000000000"""Show a cube for each available color name""" from operator import itemgetter from vedo import Cube, Text2D, show, settings from vedo.colors import colors # Print the docstring print(__doc__) # Set immediate rendering to False for faster rendering with multi-renderers settings.immediate_rendering = False # Sort the colors by hex color code (matplotlib colors) sorted_colors1 = sorted(colors.items(), key=itemgetter(1)) # Create a list of cubes for each color name cbs=[] for sc in sorted_colors1: # Get the color name cname = sc[0] # Skip the color if it ends in a number if cname[-1] in "123456789": continue # Create a cube and text object for the color name cb = Cube().lw(1).color(cname) tname = Text2D(cname, s=0.9) # Add the cube and text object to the list cbs.append([tname, cb]) # Display the cubes and text objects in a grid plt1= show(cbs, N=len(cbs), azimuth=.2, size=(2100,1300), title="matplotlib colors", interactive=False) plt1.render() # Sort the colors by name (bootstrap5 colors) sorted_colors2 = sorted(colors.items(), key=itemgetter(0)) # Create a list of cubes for each color name cbs = [] for sc in sorted_colors2: # Get the color name cname = sc[0] # Skip the color if it doesn't end in a number if cname[-1] not in "123456789": continue # Create a cube for the color cb = Cube().lw(1).lighting('off').color(cname) # Add the cube to the list cbs.append([cname, cb]) # Display the cubes in a grid plt2= show(cbs, shape=(11,9), azimuth=0.2, size=(800,1000), title="bootstrap5 colors", new=True) # Close the plots plt2.close() plt1.close() vedo-2023.4.6/examples/basic/colorlines.py000066400000000000000000000024521444463326400203440ustar00rootroot00000000000000"""Color lines by a scalar Click the lines to get their lengths""" from vedo import * # Define the points for the first line pts1 = [(sin(x/8), cos(x/8), x/5) for x in range(25)] # Create the first line and color it black l1 = Line(pts1).c('black') # Create the second line by cloning the first and rotating it l2 = l1.clone().rotate_z(180).shift(1,0,0) # Calculate a scalar value for each line segment as # the distance between the corresponding points on the two lines dist = mag(l1.points()-l2.points()) # Color the lines based on the scalar value using the 'Accent' colormap, # and add a scalar bar to the plot lines = Lines(l1, l2).lw(8).cmap('Accent', dist, on='cells').add_scalarbar('length') # Define a callback function to print the length of the clicked line segment def clickfunc(evt): if evt.actor: # Get the ID of the closest point on the clicked line segment idl = evt.actor.closest_point(evt.picked3d, return_cell_id=True) # Print the length of the line segment with 3 decimal places print('clicked line', idl, 'length =', precision(dist[idl],3)) # Create a plotter with the mouse click callback function and show the lines plt = Plotter(axes=1, bg2='lightblue') plt.add_callback('mouse click', clickfunc) plt.show(l1,l2, lines, __doc__, viewup='z') plt.close() vedo-2023.4.6/examples/basic/colormap_list.py000066400000000000000000000022751444463326400210450ustar00rootroot00000000000000from vedo import * # Set the number of colors to generate n = 256 # Initialize some variables i, grids, vnames1, vnames2 = 0, [], [], [] # Loop over all available colormap names for name in colors.cmaps_names: # Skip reversed maps if '_r' in name: continue # Generate a list of n RGB color values for the colormap cols = color_map(range(n), name) gr = Grid(s=[50,1], res=[n,1]) gr.cellcolors = cols*255 gr.linewidth(0).wireframe(False).y(-i*1.2) grids.append([gr, gr.box().c('grey')]) # Add a text label with the colormap name to the left of the strip tx1 = Text3D(':rightarrow '+name, justify='left-center', s=0.75, font=2) tx1.pos(gr.xbounds(1), gr.y()).c('w') tx2 = tx1.clone(deep=False).c('k') vnames1.append(tx1) vnames2.append(tx2) i += 1 printc("Try picking a color by pressing Shift-i", invert=True) # Create a plotter with two renderers plt = Plotter(N=2, size=(1300,1000)) # Show the grids with the white text labels plt.at(0).show(grids, vnames1, bg='blackboard') plt.at(1).show(grids, vnames2, bg='white', mode='image', zoom='tight') # Enable interactivity and display the plot, then close it plt.interactive().close() vedo-2023.4.6/examples/basic/colormaps.py000066400000000000000000000012771444463326400201760ustar00rootroot00000000000000""" Example usage of cmap() to assign a color to each mesh vertex by looking it up in matplotlib database of colormaps """ from vedo import Plotter, Mesh, dataurl print(__doc__) # these are the some matplotlib color maps maps = [ "afmhot", "binary", "bone", "cool", "coolwarm", "copper", "gist_earth", "gray", "hot", "jet", "rainbow", "winter", ] mug = Mesh(dataurl+"mug.ply") scalars = mug.points()[:, 1] # let y-coord be the scalar plt = Plotter(N=len(maps)) for i, key in enumerate(maps): # for each available color map name imug = mug.clone(deep=False).cmap(key, scalars, n_colors=5) plt.at(i).show(imug, key) plt.interactive().close() vedo-2023.4.6/examples/basic/connected_vtx.py000066400000000000000000000013051444463326400210320ustar00rootroot00000000000000"""Find the vertices that are connected to a specific vertex in a mesh""" from vedo import * # create a wireframe sphere and color it yellow s = Sphere(c="y", res=12).wireframe() # select one point on the sphere using its index index = 12 pt = s.points()[index] # find all the vertices that are connected to the selected point ids = s.connected_vertices(index) vtxs = s.points()[ids] # create a red point at the selected point's location apt = Point(pt, c="r", r=15) # create blue points at the locations of the vertices # connected to the selected point cpts = Points(vtxs, c="blue", r=20) # show the sphere, the selected point, and the connected vertices show(s, apt, cpts, __doc__, bg='bb').close() vedo-2023.4.6/examples/basic/cut_freehand.py000066400000000000000000000054371444463326400206300ustar00rootroot00000000000000"""Interactively cut a mesh by drawing free-hand a spline in space""" # The tool can also be invoked from command line e.g.: > vedo --edit mesh.ply import vedo from vedo.applications import FreeHandCutPlotter #### This class is a simplified version of the above, shown here as an example: ####### # # class FreeHandCutPlotter(vedo.Plotter): # def __init__(self, mesh): # vedo.Plotter.__init__(self) # self.mesh = mesh # self.drawmode = False # self.cpoints = [] # self.points = None # self.spline = None # self.msg = "Right-click and move to draw line\n" # self.msg += "Second right-click to stop drawing\n" # self.msg += "Press z to cut mesh" # self.txt2d = vedo.Text2D(self.msg, pos='top-left', font="Bongas") # self.txt2d.c("white").background("green4", alpha=1) # self.add_callback('KeyPress', self.onKeyPress) # self.add_callback('RightButton', self.onRightClick) # self.add_callback('MouseMove', self.onMouseMove) # def onRightClick(self, evt): # self.drawmode = not self.drawmode # toggle mode # def onMouseMove(self, evt): # if self.drawmode: # self.remove([self.points, self.spline]) # # make this 2d-screen point 3d: # cpt = self.compute_world_coordinate(evt.picked2d) # self.cpoints.append(cpt) # self.points = vedo.Points(self.cpoints, r=8).c('black') # if len(self.cpoints) > 2: # self.spline = vedo.Line(self.cpoints, closed=True).lw(5).c('red5') # self.add([self.points, self.spline]).render() # def onKeyPress(self, evt): # if evt.keypress == 'z' and self.spline: # cut mesh with a ribbon-like surf. # vedo.printc("Cutting the mesh please wait..", invert=True) # tol = self.mesh.diagonal_size()/2 # size of ribbon # pts = self.spline.points() # n = vedo.fit_plane(pts, signed=True).normal # compute normal vector # rib = vedo.Ribbon(pts - tol*n, pts + tol*n, closed=True) # self.mesh.cut_with_mesh(rib) # self.remove([self.spline, self.points]).render() # self.cpoints, self.points, self.spline = [], None, None # def start(self, **kwargs): # return self.show(self.txt2d, self.mesh, **kwargs) # ###################################################################################### vedo.settings.use_parallel_projection = True # to avoid perspective artifacts msh = vedo.Volume(vedo.dataurl+'embryo.tif').isosurface().color('gold', 0.25) # Mesh plt = FreeHandCutPlotter(msh).add_hover_legend() #plt.init(some_list_of_initial_pts) #optional! plt.start(axes=1, bg2='lightblue').close() vedo-2023.4.6/examples/basic/cut_interactive.py000066400000000000000000000011661444463326400213640ustar00rootroot00000000000000"""Manipulate a box to cut a mesh interactively. Use mouse buttons to zoom and pan. Press r to reset the cutting box Press i to toggle the cutting box on/off Press u to invert the selection""" from vedo import * # settings.enable_default_keyboard_callbacks = False # settings.enable_default_mouse_callbacks = False msh = Mesh(dataurl+'mouse_brain.stl').backcolor("purple8") plt = Plotter(bg='blackboard', interactive=False) plt.show(msh, __doc__, viewup='z') cutter = PlaneCutter(msh) # cutter = BoxCutter(msh) # cutter = SphereCutter(msh) plt.add(cutter) plt.interactive() plt.remove(cutter) plt.interactive() plt.close() vedo-2023.4.6/examples/basic/delaunay2d.py000066400000000000000000000014041444463326400202170ustar00rootroot00000000000000"""Delaunay 2D meshing with point loops defining holes""" from vedo import * # Generate a grid and add gaussian noise to it # then extract the points from the grid and store them in the variable gp gp = Grid().add_gaussian_noise([0.5,0.5,0]).points() # Define two internal holes using point ids ids = [[24,35,36,37,26,15,14,25], [84,95,96,85]] # Create a point cloud object using the extracted points gp pts = Points(gp, r=6).c('blue3') # Use the Delaunay triangulation algorithm to create a 2D mesh # from the points in gp, with the given boundary ids dly = delaunay2d(gp, mode='xy', boundaries=ids).c('w').lc('o').lw(1) # Create labels for the point ids and set their z to 0.01 labels = pts.labels('id').z(0.01) show(pts, labels, dly, __doc__, bg="Mint").close() vedo-2023.4.6/examples/basic/delete_mesh_pts.py000066400000000000000000000017531444463326400213420ustar00rootroot00000000000000"""Remove points and cells from a mesh which are closest to a specified point.""" from vedo import * # Enable depth peeling for the scene settings.use_depth_peeling = True # Load the apple mesh from a url, set the colors and line width msh = Mesh(dataurl+'apple.ply') msh.c('lightgreen').bc('tomato').lw(0.1) # Set a point and a radius to find the closest points in the mesh to it pt = [1, 0.5, 1] R = 1.2 ids = msh.closest_point(pt, radius=R, return_point_id=True) # Remove the cells from the mesh by their ids # and clean the mesh by removing orphaned vertices not associated to any cell printc('#points before:', msh.npoints, c='g') msh.delete_cells_by_point_index(ids) msh.clean() printc('#points after :', msh.npoints, c='g') # Create a sphere object with the given point and radius, and set transparency sph = Sphere(pt, r=R, alpha=0.1) # Show the point, the sphere, the modified mesh, the script docstring and axes # then close the window show(Point(pt), sph, msh, __doc__, axes=1).close() vedo-2023.4.6/examples/basic/distance2mesh.py000066400000000000000000000012461444463326400207240ustar00rootroot00000000000000"""Compute the (signed) distance of one mesh to another""" from vedo import Sphere, Cube, show # Create a sphere object and position it at (10,20,30) s1 = Sphere().pos(10,20,30) # Create a cube object with color grey and scaled # along the x-axis by 2, and positioned at (14,20,30) s2 = Cube(c='grey4').scale([2,1,1]).pos(14,20,30) # Compute the Euclidean distance between the 2 surfaces # and set the color of the sphere based on the distance s1.distance_to(s2, signed=False) s1.cmap('hot').add_scalarbar('Signed\nDistance') # Show the sphere, the cube, the script docstring, axes, # then close the window show(s1, s2, __doc__ , axes=1, size=(1000,500), zoom=1.5).close() vedo-2023.4.6/examples/basic/extrude.py000066400000000000000000000010761444463326400176540ustar00rootroot00000000000000"""Extruding a polygon along the z-axis""" from vedo import Star, show # Create a yellow star and rotate it around the x-axis star = Star().color('y').rotate_x(10) # Extrude the star along the z-axis, with a shift of 1, # a rotation of 10 degrees, a decrease in radius of 0.2, epol = star.extrude(zshift=1, rotation=10, dR=-0.2, cap=False, res=1) # Set the back color of the extruded polygon to violet epol.bc('violet').lighting("default") # Show the extruded polygon, the script docstring, axes, # then close the window show(epol, __doc__, axes=1, viewup='z').close() vedo-2023.4.6/examples/basic/fillholes.py000066400000000000000000000005741444463326400201570ustar00rootroot00000000000000"""Identify and fill holes of an input mesh. Holes are identified by locating boundary edges, linking them together into loops, and then triangulating the resulting loops.""" from vedo import Mesh, show, dataurl a = Mesh(dataurl+"bunny.obj").lw(0.1).bc('red') b = a.clone() # make a copy b.fill_holes(size=0.1).color("lb").bc('green') show(a, b, __doc__, elevation=-40).close() vedo-2023.4.6/examples/basic/flatarrow.py000066400000000000000000000006421444463326400201730ustar00rootroot00000000000000"""Use 2 lines to define a flat arrow""" from vedo import * from numpy import arange arrs = [] for i in range(10): s, c = sin(i), cos(i) l1 = [[sin(x)+c, -cos(x)+s, x] for x in arange(0,3, 0.1)] l2 = [[sin(x)+c+0.1, -cos(x)+s + x/15, x] for x in arange(0,3, 0.1)] farr = FlatArrow(l1, l2, tip_size=1, tip_width=1).c(i) arrs.append(farr) show(arrs, __doc__, viewup="z", axes=1).close() vedo-2023.4.6/examples/basic/glyphs1.py000066400000000000000000000020421444463326400175550ustar00rootroot00000000000000"""Glyphs: at each vertex of a mesh, another mesh is shown with various orientation options""" from vedo import * # Create a sphere with resolution 12, set its color and show as wireframe s = Sphere(res=12).c("white", 0.1).wireframe() randvs = np.random.rand(s.npoints, 3) # random orientation vectors ####################################### # Create an ellipsoid glyph and scale it down gly1 = Ellipsoid().scale(0.04) # create a Glyph object that will show an ellipsoid at each vertex gsphere1 = Glyph( s, gly1, orientation_array=randvs, scale_by_vector_size=True, color_by_vector_size=True, c="jet", ) ####################################### # Create a mesh glyph and scale it down gly2 = Mesh(dataurl + "shuttle.obj").rotate_y(180).scale(0.02) # Create a Glyph object that will show a shuttle at each vertex gsphere2 = Glyph( s, gly2, orientation_array="normals", c="lightblue", ) # Show two groups of objects on N=2 renderers: show([(s, gsphere1, __doc__), (s, gsphere2)], N=2, bg="bb", zoom=1.4).close() vedo-2023.4.6/examples/basic/glyphs_arrows.py000066400000000000000000000026071444463326400211000ustar00rootroot00000000000000"""Draw color arrow glyphs""" from vedo import * import numpy as np # Create two spheres with different radii, wireframes, # and colors, and set the position of one of them s1 = Sphere(r=10, res=8).wireframe().c('white') s2 = Sphere(r=20, res=8).wireframe().c('white',0.1).pos(0,4,0) # Get the coordinates of the vertices of each sphere coords1 = s1.points() coords2 = s2.points() # --- color can be a colormap which maps arrow sizes # Define a title for the first set of arrows, # and create an Arrows object with coordinates and a colormap for color t1 = 'Color arrows by size\nusing a color map' a1 = Arrows(coords1, coords2, c='coolwarm', alpha=0.4).add_scalarbar(c='w') # --- get a list of random rgb colors # Generate a list of random RGB colors for each arrow # based on an array of integers, and define a title for the second set of arrows nrs = np.random.randint(0, 10, len(coords1)) cols = get_color(nrs) t2 = 'Color arrows by an array\nand scale them by half' a2 = Arrows(coords1, coords2, c=cols) # Display two groups of objects on two renderers: the two spheres, # the Arrows object with a colormap for color and a scalar bar, # and the title for the first set of arrows on one renderer; # the two spheres, the Arrows object with random RGB colors, # and the title for the second set of arrows on another renderer show([(s1, s2, a1, t1), (s1, s2, a2, t2)], N=2, bg='bb', bg2='lb').close() vedo-2023.4.6/examples/basic/hover_legend.py000066400000000000000000000013751444463326400206370ustar00rootroot00000000000000"""Hover mouse on mesh to visualize object details""" from vedo import * mesh = Mesh(dataurl+"bunny.obj").color('k7') # Create multiple arrays associated to mesh vertices or cells mesh.pointdata['MYPOINTARRAY'] = mesh.points()[:,0] mesh.celldata['MYCELLARRAY'] = mesh.cell_centers()[:,1] # Create more objects sph = Sphere(r=0.02, pos=(-0.1,0.05,0.05)) cub = Cube().alpha(0.5).linewidth(2) pts = Points(cub.points(), r=50, c='v') pts.name = 'The cube vertices' # can give a name to any objects # Create an instance of the plotter window plt = Plotter(N=2, axes=1, sharecam=False) # Add a 2D hover legend to both renderers and show: plt.at(0).add_hover_legend().show(mesh, sph, __doc__) plt.at(1).add_hover_legend().show(cub, pts) plt.interactive().close() vedo-2023.4.6/examples/basic/input_box.py000066400000000000000000000021171444463326400202000ustar00rootroot00000000000000"""Start typing a color name then press return E.g. pink4""" from vedo import settings, dataurl, Plotter, Mesh settings.enable_default_keyboard_callbacks = False def kfunc(evt): global msg evt.keypress = evt.keypress.replace("period", ".") if evt.keypress == "BackSpace" and msg: msg = msg[:-1] evt.keypress = '' elif evt.keypress == "Return": bfunc() return elif evt.keypress == "Escape": plt.close() if len(evt.keypress) > 1: return msg += f"{evt.keypress}" bu.actor.SetInput(msg) plt.render() def bfunc(): mesh.color(msg) plt.render() plt = Plotter(axes=1) plt.interactor.RemoveObservers("CharEvent") # might be needed msg = "" plt.add_callback("key press", kfunc) bu = plt.add_button( bfunc, pos=(0.7, 0.05), # x,y fraction from bottom left corner states=["input box"], c=["w"], bc=["dg"], # colors of states font="courier", # arial, courier, times size=45, bold=True, ) mesh = Mesh(dataurl+"magnolia.vtk").c("v").flat() plt.show(mesh, __doc__).close() vedo-2023.4.6/examples/basic/interaction_modes.py000066400000000000000000000010131444463326400216710ustar00rootroot00000000000000"""Scene interaction styles""" from vedo import * msg = Text2D( """TrackballCamera is the default mode\n(press q to proceed)""", c="k", bg="yellow7", s=1.2, ) plt = Plotter(shape=(1,2)) plt.at(0).show(Cube(), msg).interactive() msg.text("..lets change it to JoystickCamera").background("indigo7") plt.at(1).show(Paraboloid(), mode="JoystickCamera").interactive() msg.text("..lets change it again to MousePan").background("red6") mode = interactor_modes.MousePan() plt.user_mode(mode).interactive() plt.close() vedo-2023.4.6/examples/basic/keypress.py000066400000000000000000000014521444463326400200370ustar00rootroot00000000000000"""Implement a custom function that is triggered by pressing a keyboard button when the rendering window is in interactive mode Place pointer anywhere on the mesh and press c""" from vedo import dataurl, printc, Plotter, Point, Mesh ############################################################# def myfnc(evt): mesh = evt.actor # printc('dump event info', evt) if not mesh or evt.keypress != "c": printc("click mesh and press c", c="r") return printc("point:", mesh.picked3d, c="v") cpt = Point(pos=mesh.picked3d, r=20, c="v").pickable(False) plt.add(cpt).render() ############################################################## plt = Plotter(axes=1) plt += Mesh(dataurl+"bunny.obj").color("gold") plt += __doc__ plt.add_callback('KeyPress', myfnc) plt.show().close() vedo-2023.4.6/examples/basic/largestregion.py000066400000000000000000000006631444463326400210420ustar00rootroot00000000000000"""Extract the mesh region that has the largest connected surface""" from vedo import dataurl, Volume, printc, Plotter mesh1 = Volume(dataurl+"embryo.tif").isosurface(80).c("yellow") printc("area1 =", mesh1.area(), c="yellow") mesh2 = mesh1.extract_largest_region().color("lb") printc("area2 =", mesh2.area(), c="lb") plt = Plotter(shape=(2,1), axes=7) plt.at(0).show(mesh1, __doc__) plt.at(1).show(mesh2) plt.interactive().close() vedo-2023.4.6/examples/basic/legendbox.py000066400000000000000000000011571444463326400201430ustar00rootroot00000000000000"""Customizing a legend box""" from vedo import * s = Sphere() c = Cube().x(2) e = Ellipsoid().x(4) h = Hyperboloid().x(6).legend('The description for\nthis one is quite long') lb = LegendBox([s,c,e,h], width=0.3, height=0.4, markers='s').font("Kanopus") cam = dict( # press C in window to get these numbers position=(10.4414, -7.62994, 4.18818), focal_point=(4.10196, 0.335224, -0.148651), viewup=(-0.252830, 0.299657, 0.919936), distance=11.0653, clipping_range=(3.69605, 21.2641), ) show(s, c, e, h, lb, __doc__, axes=1, bg='lightyellow', bg2='white', size=(1400,800), camera=cam ).close() vedo-2023.4.6/examples/basic/lightings.py000066400000000000000000000005471444463326400201660ustar00rootroot00000000000000from vedo import dataurl, Mesh, Plotter styles = ['default', 'metallic', 'plastic', 'shiny', 'glossy', 'ambient', 'off'] msh = Mesh(dataurl+"beethoven.ply").c('gold').subdivide() plt = Plotter(N=len(styles), bg='bb') for i,s in enumerate(styles): msh_copy = msh.clone(deep=False).lighting(s) plt.at(i).show(msh_copy, s) plt.interactive().close() vedo-2023.4.6/examples/basic/lights.py000066400000000000000000000014371444463326400174670ustar00rootroot00000000000000"""Set custom lights to a 3D scene""" from vedo import * man = Mesh(dataurl+'man.vtk').c('white').lighting('glossy') p1 = Point([1,0,1], c='y') p2 = Point([0,0,2], c='r') p3 = Point([-1,-0.5,-1], c='b') p4 = Point([0,1,0], c='k') # Add light sources at the given positions l1 = Light(p1, c='y') # p1 can simply be [1,0,1] l2 = Light(p2, c='r') l3 = Light(p3, c='b') l4 = Light(p4, c='w', intensity=0.5) show(man, l1, l2, l3, l4, p1, p2, p3, p4, __doc__, axes=1, viewup='z').close() ##################################################### ##### Equivalent code using a Plotter instance: ##### ##################################################### # plt = Plotter(axes=1) # plt += [man, p1, p2, p3, p4, l1, l2, l3, l4] # plt.show(viewup='z') ##################################################### vedo-2023.4.6/examples/basic/lin_interpolate.py000066400000000000000000000012131444463326400213550ustar00rootroot00000000000000"""Interpolate linearly [(0, 0, 0), (2, 2, 0)] # at these positions, [(0.2,0,0), (0,0,0.2)] # these are the specified vectors """ from vedo import * positions = [(0, 0, 0), (2, 2, 0)] # at these positions, directions = [(0.2,0,0), (0,0,0.2)] # these are the specified vectors # now use lin_interpolate to interpolate linearly any other point in space # (points far from both positions will get close to the directions average) arrs = [] for x in range(0,10): for y in range(0,10): p = [x/5, y/5, 0] v = lin_interpolate(p, positions, directions) arrs.append(Arrow(p, p+v, s=0.001)) show(arrs, __doc__, axes=1).close() vedo-2023.4.6/examples/basic/manypoints.py000066400000000000000000000007171444463326400203760ustar00rootroot00000000000000"""Colorize a large cloud of 1M points by passing colors and transparencies in the format (R,G,B,A)""" import time from vedo import * N = 1000000 pts = np.random.rand(N, 3) RGB = pts * 255 Alpha = pts[:, 2] * 255 RGBA = np.c_[RGB, Alpha] # concatenate t0 = time.time() # passing c in format (R,G,B,A) is ~50x faster pts = Points(pts, r=2, c=RGBA) t1 = time.time() print("-> elapsed time:", t1-t0, "seconds for N:", N) show(pts, __doc__, axes=True).close() vedo-2023.4.6/examples/basic/manyspheres.py000066400000000000000000000012541444463326400205300ustar00rootroot00000000000000"""Example that shows how to draw very large number of spheres (same for Points, Lines) with different colors or different radii, N=""" from random import gauss from vedo import show, Spheres N = 50000 cols = range(N) # color numbers pts = [(gauss(0, 1), gauss(0, 2), gauss(0, 1)) for i in cols] rads = [abs(pts[i][1]) / 10 for i in cols] # radius=0 for y=0 # all have same radius but different colors: s0 = Spheres(pts, c=cols, r=0.1, res=5) # res= theta-phi resolution show(s0, __doc__+str(N), at=0, N=2, axes=1, viewup=(-0.7, 0.7, 0)) # all have same color but different radius along y: s1 = Spheres(pts, r=rads, c="lb", res=8) show(s1, at=1, axes=2).interactive().close() vedo-2023.4.6/examples/basic/mesh_alphas.py000066400000000000000000000010231444463326400204500ustar00rootroot00000000000000"""Create a set of transparencies which can be passed to method cmap()""" from vedo import Mesh, show, dataurl mesh = Mesh(dataurl+"beethoven.ply") # pick y coordinates of vertices and use them as scalars scals = mesh.points()[:, 1] # define opacities in the range of the scalar, # at min(scals) alpha is 0.1, # at max(scals) alpha is 0.9: alphas = [0.1, 0.1, 0.3, 0.4, 0.9] mesh.cmap("copper", scals, alpha=alphas) # mesh.print() # print(mesh.pointdata['PointScalars']) # retrieve scalars show(mesh, __doc__, axes=9).close() vedo-2023.4.6/examples/basic/mesh_coloring.py000066400000000000000000000021551444463326400210230ustar00rootroot00000000000000"""Specify a colors for cells and points of a Mesh""" from vedo import dataurl, Plotter, Mesh plt = Plotter(N=3, axes=11) ##################################### add a cell array man1 = Mesh(dataurl+"man_low.vtk").linewidth(0.1) nv = man1.ncells # nr. of cells scals = range(nv) # coloring by the index of cell man1.cmap("Paired", scals, on='cells').add_scalarbar("cell nr") plt.at(0).show(man1, __doc__, elevation=-60) ##################################### Point coloring man2 = Mesh(dataurl+"man_low.vtk") scals = man2.points()[:, 0] + 37 # pick x coordinates of vertices man2.cmap("hot", scals) man2.add_scalarbar(horizontal=True) plt.at(1).show(man2, "mesh.cmap()") ##################################### Cell coloring man3 = Mesh(dataurl+"man_low.vtk") scals = man3.cell_centers()[:, 2] + 37 # pick z coordinates of cells man3.cmap("afmhot", scals, on='cells') # add a fancier 3D scalar bar embedded in the scene man3.add_scalarbar3d(size=[None,3]) man3.scalarbar.rotate_x(90).y(0.2) plt.at(2).show(man3, "mesh.cmap(on='cells')") plt.interactive().close() vedo-2023.4.6/examples/basic/mesh_custom.py000066400000000000000000000016751444463326400205270ustar00rootroot00000000000000"""Controlling the color and transparency of a Mesh with various color map definitions""" from vedo import * # "depth peeling" may improve the rendering of transparent objects settings.use_depth_peeling = True settings.multi_samples = 0 man = Mesh(dataurl+"man.vtk") # let the scalar be the z coordinate of the mesh vertices scals = man.points()[:, 2] # assign color map with specified opacities try: import colorcet # https://colorcet.holoviz.org mycmap = colorcet.bmy alphas = np.linspace(0.8, 0.2, num=len(mycmap)) except ModuleNotFoundError: printc("colorcet is not available, use custom cmap", c='y') mycmap = ["darkblue", "magenta", (1, 1, 0)] alphas = [0.8, 0.6, 0.2] # - OR by generating a palette between 2 colors: #mycmap = makePalette('pink', 'green', N=500, hsv=True) #alphas = 1 man.cmap(mycmap, scals, alpha=alphas).add_scalarbar() show(man, __doc__, viewup="z", axes=7).close() vedo-2023.4.6/examples/basic/mesh_lut.py000066400000000000000000000025361444463326400200160ustar00rootroot00000000000000"""Build a custom colormap, including out-of-range and NaN colors and labels""" from vedo import build_lut, Sphere, show, settings settings.use_depth_peeling = True # might help with transparencies # generate a sphere and stretch it, so it sits between z=-2 and z=+2 mesh = Sphere(quads=True).scale([1,1,2]).linewidth(0.1) # create some dummy data array to be associated to points data = mesh.points()[:,2] # pick z-coords, use them as scalar data data[10:70] = float('nan') # make some values invalid by setting to NaN data[300:600] = 100 # send some values very far above-scale # build a custom Look-Up-Table of colors: # value, color, alpha lut = build_lut( [ #(-2, 'pink' ), # up to -2 is pink (0.0, 'pink' ), # up to 0 is pink (0.4, 'green', 0.5), # up to 0.4 is green with alpha=0.5 (0.7, 'darkblue' ), #( 2, 'darkblue' ), ], vmin=-1.2, vmax= 0.7, below_color='lightblue', above_color='grey', nan_color='red', interpolate=False, ) # 3D scalarbar: mesh.cmap(lut, data).add_scalarbar3d(title='My 3D scalarbar', c='white') mesh.scalarbar.scale(1.5).rotate_x(90).y(1) # make it bigger and place it # 2D scalarbar: # mesh.cmap(lut, data).add_scalarbar() show(mesh, __doc__, axes=dict(zlabel_size=.04, number_of_divisions=10), elevation=-80, bg='blackboard', ).close() vedo-2023.4.6/examples/basic/mesh_map2cell.py000066400000000000000000000012531444463326400207040ustar00rootroot00000000000000"""Map an array which is defined on the vertices of a mesh to its cells""" from vedo import * doc = Text2D(__doc__, pos="top-center") mesh1 = Mesh(dataurl+'icosahedron.vtk').linewidth(0.1).flat() # let the scalar be the z coordinate of the mesh vertices msg1 = Text2D("Scalars originally defined on points..", pos="bottom-center") mesh1.pointdata["myzscalars"] = mesh1.points()[:, 2] mesh1.cmap("jet", "myzscalars", on="points") msg2 = Text2D("..are interpolated to cells.", pos="bottom-center") mesh2 = mesh1.clone(deep=False).map_points_to_cells() plt = Plotter(N=2, axes=11) plt.at(0).show(mesh1, msg1, doc, viewup="z") plt.at(1).show(mesh2, msg2) plt.interactive().close() vedo-2023.4.6/examples/basic/mesh_merge_vs_assembly.py000066400000000000000000000030011444463326400227040ustar00rootroot00000000000000''' Mesh objects can be combined with (1) `mesh.merge` - creates a new mesh object; this new mesh inherits properties (color, etc.) of the first mesh. (2) `assembly.Assembly` - groups meshes (or other actors); preserves properties (3) `+` - equivalent to `Assembly` ''' # credits: https://github.com/icemtel import vedo # Define vertices and faces verts = [(0, 0, 0), (10, 0, 0), (0, 10, 0), (0, 0, 10)] faces = [(0, 1, 2), (2, 1, 3), (1, 0, 3), (0, 2, 3)] # Create a tetrahedron and a copy mesh1 = vedo.Mesh([verts, faces], c='red') mesh2 = mesh1.clone().pos(15,15,0).c('blue') # Create a copy, position it; change color # Merge: creates a new mesh, fusion of the 2 inputs. Color of the second mesh is lost. mesh_all = vedo.merge(mesh1, mesh2) print('1. Type:', type(mesh_all)) plotter = vedo.show("mesh.merge(mesh1, mesh2) creates a single new Mesh object", mesh_all, viewup='z', axes=1) # -> all red plotter.close() # Assembly: groups meshes. Objects keep their individuality (can be later unpacked). mesh_all = vedo.Assembly(mesh1, mesh2) print('2. Type:', type(mesh_all)) plotter = vedo.show("Assembly(mesh1, mesh2) groups meshes preserving their properties", mesh_all, viewup='z', axes=1) # -> red and blue plotter.close() # Equivalently, "+" also creates an Assembly mesh_all = mesh1 + mesh2 print('3. Type:', type(mesh_all)) plotter = vedo.show("mesh1+mesh2 operator is equivalent to Assembly()", mesh_all, viewup='z', axes=1) # -> red and blue plotter.close() vedo-2023.4.6/examples/basic/mesh_modify.py000066400000000000000000000005441444463326400204760ustar00rootroot00000000000000"""Modify mesh vertex positions""" from vedo import * dsc = Disc(res=(8,120)).linewidth(0.1) plt = Plotter(interactive=False, axes=7) plt.show(dsc, __doc__) coords = dsc.points() for i in range(100): coords[:,2] = sin(i/10.*coords[:,0])/5 # move vertices in z dsc.points(coords) # update mesh points plt.render() plt.interactive().close() vedo-2023.4.6/examples/basic/mesh_sharemap.py000066400000000000000000000010411444463326400210000ustar00rootroot00000000000000"""Share the same color map across different meshes""" from vedo import Mesh, show, dataurl ##################################### man1 = Mesh(dataurl+"man.vtk") scals = man1.points()[:, 2] * 5 + 27 # pick z coordinates [18->34] man1.cmap("rainbow", scals, vmin=18, vmax=44) ##################################### man2 = Mesh(dataurl+"man.vtk") scals = man2.points()[:, 2] * 5 + 37 # pick z coordinates [28->44] man2.cmap("rainbow", scals, vmin=18, vmax=44).add_scalarbar() show([(man1, __doc__), man2], N=2, elevation=-40, axes=11).close() vedo-2023.4.6/examples/basic/mesh_threshold.py000066400000000000000000000010441444463326400211770ustar00rootroot00000000000000"""Extracts cells of a Mesh which satisfy the threshold criterion: 37 < scalar < 37.5""" from vedo import * man = Mesh(dataurl+"man.vtk") scals = man.points()[:, 0] + 37 # pick y coords of vertices # scals data is added to mesh points with automatic name PointScalars man.cmap("cool", scals).add_scalarbar(title="threshold", horizontal=True) # make a copy and threshold the mesh cutman = man.clone().threshold("Scalars", 37, 37.5) # distribute the meshes on the 2 renderers show([(man, __doc__), cutman], N=2, elevation=-30, axes=11).close() vedo-2023.4.6/examples/basic/mirror.py000066400000000000000000000005031444463326400175000ustar00rootroot00000000000000"""Mirror a mesh along one of the Cartesian axes""" from vedo import dataurl, Mesh, show myted1 = Mesh(dataurl+"teddy.vtk") myted2 = myted1.clone(deep=False).mirror("y") myted2.pos(0,3,0).c("green") fp = myted2.flagpole("mirrored\nmesh").follow_camera() show(myted1, myted2, fp, __doc__, viewup="z", bg2='ly', axes=9) vedo-2023.4.6/examples/basic/mouseclick.py000066400000000000000000000014551444463326400203330ustar00rootroot00000000000000"""Mouse click and other type of events will trigger a call to a custom function""" from vedo import printc, Plotter, Mesh, dataurl printc("Click object to trigger a function call", invert=1) # callback functions def on_left_click(event): if not event.actor: return printc("Left button pressed on", [event.actor], c=event.actor.color()) # printc('full dump of event:', event) def on_drag(event): printc(event.name, 'happened at mouse position', event.picked2d) ###################### tea = Mesh(dataurl+"teapot.vtk").c("gold") mug = Mesh(dataurl+"mug.ply").rotate_x(90).scale(8).pos(2,0,-.7).c("red3") plt = Plotter(axes=11) plt.add_callback('LeftButtonPress', on_left_click) plt.add_callback('Interaction', on_drag) # mouse dragging triggers this plt.show(tea, mug, __doc__).close() vedo-2023.4.6/examples/basic/mousehighlight.py000066400000000000000000000013011444463326400212030ustar00rootroot00000000000000"""Click a sphere to highlight it""" from vedo import Text2D, Sphere, Plotter import numpy as np spheres = [] for i in range(25): p = np.random.rand(2) s = Sphere(r=0.05).pos(p).color('k5') s.name = f"sphere nr.{i} at {p}" spheres.append(s) def func(evt): if not evt.actor: return sil = evt.actor.silhouette().linewidth(6).c('red5') sil.name = "silu" # give it a name so we can remove the old one msg.text("You clicked: "+evt.actor.name) plt.remove('silu').add(sil) msg = Text2D("", pos="bottom-center", c='k', bg='r9', alpha=0.8) plt = Plotter(axes=1, bg='black') plt.add_callback('mouse click', func) plt.show(spheres, msg, __doc__, zoom=1.2) plt.close() vedo-2023.4.6/examples/basic/mousehover0.py000066400000000000000000000013761444463326400204530ustar00rootroot00000000000000"""Use a flagpost object to visualize some property interactively""" from vedo import ParametricShape, Plotter, precision def func(evt): ### called every time mouse moves! if not evt.actor: return # mouse hits nothing, return. pt = evt.picked3d # 3d coords of point under mouse txt = f"Position: {precision(pt[:2],2)}\n" \ f"Speed : {precision(evt.speed3d*100,2)} km/h" flagpost.text(txt).pos(pt) # update text and position plt.render() hil = ParametricShape('RandomHills').cmap('terrain') flagpost = hil.flagpost(offset=(0,0,0.25)) plt = Plotter(axes=1, bg2='yellow9', size=(1150, 750)) plt.add_callback('mouse move', func) # add the callback function plt.show(hil, flagpost, __doc__, viewup='z', zoom=2) plt.close() vedo-2023.4.6/examples/basic/mousehover1.py000066400000000000000000000026641444463326400204550ustar00rootroot00000000000000"""Visualize scalar values interactively by hovering the mouse on a mesh Press c to clear the path""" from vedo import * def func(evt): ### called every time mouse moves! msh = evt.actor if not msh: return # mouse hits nothing, return. pt = evt.picked3d # 3d coords of point under mouse pid = msh.closest_point(pt, return_point_id=True) txt = f"Point: {precision(pt[:2] ,2)}\n" \ f"Height: {precision(arr[pid],3)}\n" \ f"Ground speed: {precision(evt.speed3d*100,2)}" msg.text(txt) # update text message arw = Arrow(pt - evt.delta3d, pt, s=0.001, c='orange5') fp = msh.flagpole( txt, point=pt, offset=(0.4,0.6), s=0.04, c='k', font="VictorMono", ).follow_camera() # make it always face the camera if len(plt.actors) > 3: plt.pop() # remove the old flagpole plt.add(arw, fp).render() # add Arrow and the new flagpole msg = Text2D(pos='bottom-left', font="VictorMono") # an empty text hil = ParametricShape('RandomHills').cmap('terrain').add_scalarbar() arr = hil.pointdata["Scalars"] # numpy array with heights plt = Plotter(axes=1, bg2='lightblue') plt.add_callback('mouse move', func) # add the callback function plt.add_callback('keyboard', lambda evt: plt.remove(plt.actors[3:]).render()) plt.show(hil, msg, __doc__, viewup='z') plt.close() vedo-2023.4.6/examples/basic/mousehover2.py000066400000000000000000000014451444463326400204520ustar00rootroot00000000000000"""Hover mouse to interactively fit a sphere to a region of the mesh""" from vedo import * def func(event): # callback function p = event.picked3d if p is None: return pts = Points(msh.closest_point(p, n=50), r=6) sph = fit_sphere(pts).alpha(0.1) pts.name = "mypoints" # we give it a name to make it easy to sph.name = "mysphere" # remove the old and add the new ones txt.text(f'Radius : {sph.radius}\nResidue: {sph.residue}') plt.remove("mypoints", "mysphere").add(pts, sph).render() txt = Text2D(__doc__, bg='yellow', font='Calco') msh = Mesh(dataurl+'290.vtk').subdivide() msh.compute_curvature(method=2) msh.cmap('PRGn', vmin=-0.02).add_scalarbar() plt = Plotter(axes=1) plt.add_callback('mouse hover', func) plt.show(msh, txt, viewup='z') plt.close() vedo-2023.4.6/examples/basic/mousehover3.py000066400000000000000000000024241444463326400204510ustar00rootroot00000000000000"""Compute 3D world coordinates from 2D screen pixel coordinates (hover mouse to place the points)""" from vedo import * settings.default_font = "Ubuntu" settings.use_depth_peeling = True def func(evt): # this is the callback function i = evt.at # the renderer nr. which is being hit pt2d = evt.picked2d # 2D screen coordinate # passing a list of meshes will force the points to be placed on any of them pt3d = plt.at(i).compute_world_coordinate(pt2d, objs=[objs[i]]) if mag(pt3d) < 0.01: return newpt = Point(pt3d).color(i) txt.text(f'2D coords: {pt2d}\n3D coords: {pt3d}\nNpt = {len(plt.actors)}') txt.color(i) # update text and color on the fly plt.at(i).add(newpt).render() # add new point and render i # create an empty text (to be updated in the callback) txt = Text2D("", s=1.4, font='Brachium', c='white', bg='green8') # create two polygonal meshes mesh1 = TessellatedBox() mesh2 = ParametricShape('ConicSpiral') mesh2.c('indigo1').lc('grey9').lw(0.1) objs = [mesh1, mesh2] plt = Plotter(N=2, bg='blackboard', axes=1, sharecam=False) plt.add_callback('mouse move', func) plt.at(0).show(mesh1, __doc__, viewup='z') plt.at(1).show(mesh2, txt, zoom=1.4) plt.interactive().close() vedo-2023.4.6/examples/basic/multirenderers.py000066400000000000000000000021261444463326400212350ustar00rootroot00000000000000"""Manually define the number, shape and position of the renderers inside the rendering window""" from vedo import * settings.immediate_rendering = False # faster for multi-renderers # (0,0) is the bottom-left corner of the window, (1,1) the top-right # the order in the list defines the priority when overlapping custom_shape = [ dict(bottomleft=(0.0,0.0), topright=(1.00,1.00), bg='wheat', bg2='w' ),# ren0 dict(bottomleft=(0.0,0.0), topright=(0.40,0.30), bg='blue3', bg2='lb'),# ren1 dict(bottomleft=(0.5,0.4), topright=(0.95,0.95), bg='green', bg2='lg'),# ren2 dict(bottomleft=(0.7,0.2), topright=(0.90,0.50), bg='red', bg2='pink'),# ren3 dict(bottomleft=(0.1,0.6), topright=(0.30,0.80), bg='violet', bg2='w'),# ren4 ] plt = Plotter(shape=custom_shape, size=(1200,900)) for i, cust in enumerate(custom_shape): s = ParametricShape(i).color(i).lighting('glossy') msg = 'Renderer nr.'+str(i)+'\n'+str(cust)+'\nShape = '+s.name plt.at(i).show(s, msg) plt.at(0).add(Text2D(__doc__, pos='bottom-right', font="Quikhand", s=1.5)) plt.interactive().close() vedo-2023.4.6/examples/basic/multiwindows1.py000066400000000000000000000027631444463326400210260ustar00rootroot00000000000000""" Example of drawing objects on different windows and/or subwindows within the same window. We split the main window in many subwindows and draw somethingon specific windows numbers. Then open an independent window and draw a shape on it. """ from vedo import * ########################################################################## # this is one instance of the class Plotter with 5 raws and 5 columns plt1 = Plotter(shape=(5,5), axes=0) # set a different background color for a specific subwindow (the last one) plt1.background([0.8, 0.9, 0.9], at=24) # load the meshes and give them a name a = Mesh(dataurl+"shuttle.obj") b = Mesh(dataurl+"cessna.vtk").c("red") c = Mesh(dataurl+"porsche.ply") # show a Text2D in each renderer for i in range(25): plt1.at(i).show(f"renderer\nnr.{i}") plt1.at( 6).show(a) plt1.at(23).show(b) plt1.at(24).show(c) ########################################################################## # declare a second independent instance of the class Plotter # shape can also be given as a string, e.g.: # shape="2/6" means 2 renderers above and 6 below # shape="3|1" means 3 renderers on the left and one on the right s = Mesh(dataurl+'mug.ply') # Set the position of the horizontal of vertical splitting [0,1]: #settings.window_splitting_position = 0.5 plt2 = Plotter(pos=(500, 250), shape='2/6') for i in range(len(plt2.renderers)): s2 = s.clone(deep=False).color(i) plt2.at(i).show(s2, f'renderer #{i}') printc(__doc__) plt2.interactive() plt2.close() plt1.close() vedo-2023.4.6/examples/basic/multiwindows2.py000066400000000000000000000015071444463326400210220ustar00rootroot00000000000000"""Multiple plotter sync-ed windows""" from vedo import * acts = [Ellipsoid().color('Bisque'), Cone().color('RosyBrown'), Cylinder().color('Chocolate'), ] opts = dict(axes=1, interactive=False, new=True, size=(390,390)) ts = [f"Window nr.{i}" for i in range(4)] plt0 = show(acts[0], **opts, pos=( 200,0), title=ts[0], viewup='z') plt1 = show(acts[1], **opts, pos=( 600,0), title=ts[1], camera=plt0.camera) plt2 = show(acts[2], __doc__, **opts, pos=(1000,0), title=ts[2], camera=plt0.camera) plts = [plt0, plt1, plt2] def func(evt): for i in range(3): if ts[i] != evt.title: # only update the other windows plts[i].render() for plt in plts: plt.add_callback('Interaction', func) plt.add_callback('EndInteraction', func) # because zooming is not an "Interaction" event plt.interactive() vedo-2023.4.6/examples/basic/pca_ellipse.py000066400000000000000000000010631444463326400204500ustar00rootroot00000000000000"""Draw the ellipse and the ellipsoid that contain 50% of a pointcloud, then check how many points are inside both objects""" from vedo import * pts = Points(np.random.randn(1000,3)) pts.rotate_z(30).scale([1.5, 2, 0.01]).pos(2,3,0) elli2d = pca_ellipse( pts, pvalue=0.5) elli3d = pca_ellipsoid(pts, pvalue=0.5) extruded = elli2d.z(-0.1).extrude(0.2) # make an oval box printc("Inside ellipse :", extruded.inside_points(pts).npoints, c='b') printc("Inside ellipsoid:", elli3d.inside_points(pts).npoints, c='b') show(pts, elli2d, elli3d, __doc__, axes=1) vedo-2023.4.6/examples/basic/pca_ellipsoid.py000066400000000000000000000024701444463326400210020ustar00rootroot00000000000000"""Draw the ellipsoid that contains 50% of a cloud of Points, then check how many points are inside the surface""" # # NB: check out pcaEllipse() method for 2D problems # from vedo import * settings.use_depth_peeling = True pts = Points(np.random.randn(10000, 3)*[3,2,1] + [50,60,70]) elli = pca_ellipsoid(pts, pvalue=0.50) elli.inside_points(pts, return_ids=True) ids = elli.inside_points(pts, return_ids=True) pts.print() # a new "IsInside" array now exists in pts pin = pts.points()[ids] print("inside points #", len(pin)) # Create an inverted mask instead of calling insidePoints(invert=True) mask = np.ones(pts.npoints, dtype=bool) mask[ids] = False pout = pts.points()[mask] print("outside points #", len(pout)) # Extra info can be retrieved with: print("axis 1 size:", elli.va) print("axis 2 size:", elli.vb) print("axis 3 size:", elli.vc) print("axis 1 direction:", elli.axis1) print("axis 2 direction:", elli.axis2) print("axis 3 direction:", elli.axis3) print("asphericity:", elli.asphericity(), '+-', elli.asphericity_error()) a1 = Arrow(elli.center, elli.center + elli.axis1) a2 = Arrow(elli.center, elli.center + elli.axis2) a3 = Arrow(elli.center, elli.center + elli.axis3) show(elli, a1, a2, a3, Points(pin).c("green4"), Points(pout).c("red5").alpha(0.2), __doc__, axes=1, ).close() vedo-2023.4.6/examples/basic/record_play.py000066400000000000000000000007571444463326400205040ustar00rootroot00000000000000"""Record and playback camera movements and other events \rightarrow Move the cube around, press 1, and finally press q""" from vedo import Cube, Plotter plt1 = Plotter(axes=1, interactive=0, title="recording window") evts = plt1.show(Cube(), __doc__).record() # print("Events:", evts) # a simple string (also saved as .vedo_recorded_events.log) plt2 = Plotter(axes=1, interactive=0, title="playback window", pos=(1100,0)) plt2.show(Cube(), "...now playing!").play(evts).interactive().close() vedo-2023.4.6/examples/basic/ribbon.py000066400000000000000000000010241444463326400174400ustar00rootroot00000000000000"""Form a surface by joining two lines""" from vedo import * import numpy as np l1 = [[sin(x), cos(x), x/3] for x in np.arange(0,9, 0.1)] l2 = [[sin(x)+0.2, cos(x) + x/15, x/3] for x in np.arange(0,9, 0.1)] t1 = Tube(l1, c="green5", r=0.02) t2 = Tube(l2, c="blue3", r=0.02) r12 = Ribbon(l1, l2, res=(200,5)).alpha(0.5) r1 = Ribbon(l1, width=0.1).alpha(0.5).color('orange') plt = Plotter(N=2, axes=1) plt.at(0).show(__doc__, r12, t1, t2) plt.at(1).show("..or along a single line", r1, t1, viewup="z") plt.interactive().close() vedo-2023.4.6/examples/basic/rotate_image.py000066400000000000000000000006041444463326400206300ustar00rootroot00000000000000"""Normal jpg/png pictures can be loaded, cropped, rotated and positioned in 3D.""" from vedo import Plotter, Picture, dataurl plt = Plotter(axes=7) pic = Picture(dataurl+"images/dog.jpg") for i in range(5): p = pic.clone() p.crop(bottom=0.20) # crop 20% from bottom p.scale(1-i/10.0).rotate_x(20*i).z(30*i) p.alpha(0.8) plt += p plt += __doc__ plt.show().close() vedo-2023.4.6/examples/basic/run_all.sh000077500000000000000000000002661444463326400176150ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo Press Esc at anytime to skip example, F1 to interrupt for f in *.py do echo "Processing $f script.." python "$f" done vedo-2023.4.6/examples/basic/scalarbars.py000066400000000000000000000015331444463326400203070ustar00rootroot00000000000000"""Insert 2D and 3D scalarbars in the rendering scene""" from vedo import Mesh, dataurl, show shape = Mesh(dataurl + "lamp.vtk") ms = [] cmaps = ("jet", "PuOr", "viridis") for i in range(3): s = shape.clone(deep=False).pos(0, i * 2.2, 0) # colorize mesh scals = s.points()[:, 2] s.cmap(cmaps[i], scals) ms.append(s) # add 2D scalar bar to first mesh ms[0].add_scalarbar(title="my scalarbar\nnumber #0") # 2D # add 3D scalar bars ms[1].add_scalarbar3d(c="k", title="scalarbar #1", size=[None, 3]) sc = ms[2].add_scalarbar3d( pos=(1, 0, -5), c="k", size=[None, 2.8], # change y-size only title="A viridis 3D\nscalarbar to play with", title_font="Quikhand", title_xoffset=-2, # offset of labels title_size=1.5, ) sc.scalarbar.rotate_x(90) # make it vertical show(ms, __doc__, axes=1, viewup="z").close() vedo-2023.4.6/examples/basic/shadow1.py000066400000000000000000000005411444463326400175360ustar00rootroot00000000000000"""Cast a shadow of 2 meshes onto the wall""" from vedo import dataurl, Mesh, Sphere, show spider = Mesh(dataurl+"spider.ply") spider.normalize().rotate_z(-90) spider.texture(dataurl+'textures/leather.jpg') spider.add_shadow('x', -3) sphere = Sphere(r=0.3).pos(0.4,0,0.6).add_shadow('x', -3) show(spider, sphere, __doc__, axes=1, viewup="z").close() vedo-2023.4.6/examples/basic/shadow2.py000066400000000000000000000010641444463326400175400ustar00rootroot00000000000000from vedo import * man = Mesh(dataurl+'man.vtk').c('k9').lighting('glossy') floor = Box(length=9, width=9, height=0.1).z(-1.6).c('white') cube = Cube().pos(2,-2,-1) p1 = Arrow([4,0,4], [0,0,0], c='red5').scale(0.2) p2 = Arrow([0,4,4], [0,0,0], c='green5').scale(0.2) p3 = Arrow([-4,-4,4], [0,0,0], c='blue5').scale(0.2) # Add light sources at the given positions # (grab the position and color of the arrow object) l1 = Light(p1) l2 = Light(p2) l3 = Light(p3) plt = Plotter(bg='blackboard').add_shadows() plt.show(l1, l2, l3, p1, p2, p3, man, floor, cube) vedo-2023.4.6/examples/basic/shadow3.py000066400000000000000000000007711444463326400175450ustar00rootroot00000000000000"""Project a shadow of a mesh in a specified direction""" from vedo import * settings.use_depth_peeling = False # depending on your system msh = Mesh(dataurl+"man.vtk").c("k5") plane = Plane(pos=(0,0,-1.6), normal=(0,0,1), s=[6,7]).alpha(0.2) shad = msh.clone().project_on_plane(plane, direction=(0.5,1,-1)) shad.c("k7").alpha(1).lighting("off").use_bounds(False) plane.shift(0,-0,0.001) # a small tolerance to avoid coplanarity with shad show(msh, plane, shad, __doc__, viewup='z', axes=7).close() vedo-2023.4.6/examples/basic/shrink.py000066400000000000000000000003171444463326400174670ustar00rootroot00000000000000"""Shrink mesh polygons to make the inside visible""" from vedo import * pot = Mesh(dataurl+"teapot.vtk").shrink(0.75) s = Sphere(r=0.2).pos(0, 0, -0.5) show(pot, s, __doc__, axes=11, viewup="z").close() vedo-2023.4.6/examples/basic/silhouette1.py000066400000000000000000000007361444463326400204440ustar00rootroot00000000000000"""Generate the silhouette of a mesh as seen along a specified direction """ from vedo import * s = Hyperboloid().rotate_x(20) sx = s.clone().project_on_plane('x').c('r').x(-3) # sx is 2d sy = s.clone().project_on_plane('y').c('g').y(-3) sz = s.clone().project_on_plane('z').c('b').z(-3) show(s, sx, sx.silhouette('2d'), # 2d objects dont need a direction sy, sy.silhouette('2d'), sz, sz.silhouette('2d'), __doc__, axes=7, viewup='z', ).close() vedo-2023.4.6/examples/basic/silhouette2.py000066400000000000000000000030311444463326400204340ustar00rootroot00000000000000"""Generate the silhouette of a mesh as seen along a specified direction Axes font: """ # Source: Zhi-Qiang Zhou (https://github.com/zhouzq-thu) from vedo import * settings.default_font = "Kanopus" settings.use_depth_peeling = False plt = Plotter(title="Example of project_on_plane()") s = Hyperboloid().rotate_x(20) pts = s.points() n = len(pts) plt += [s, __doc__ + settings.default_font] # orthogonal projection ############################### plane1 = Plane(pos=(2, 0, 2), normal=(1, 0, 1), s=[5, 5]).alpha(0.1) so = s.clone().project_on_plane(plane1).c("y") plt += [plane1, so, so.silhouette("2d")] pts1 = so.silhouette("2d").points() # perspective projection ############################## plane2 = Plane(pos=(3, 3, 3), normal=(1, 1, 1), s=[5, 5]).alpha(0.1) point = [6, 6, 6] sp = s.clone().project_on_plane(plane2, point=point).c("m") plt += [plane2, sp, sp.silhouette("2d")] # oblique projection ################################## plane3 = Plane(pos=(4, 8, -4), normal=(-1, 0, 1), s=[5, 5]).alpha(0.1) sob = s.clone().project_on_plane(plane3, direction=(1, 2, -1)).c("g") plt += [plane3, sob, sob.silhouette("2d")] pts2 = sob.silhouette("2d").points() # draw the lines for i in range(0, n, int(n / 20)): plt += Line(pts1[i], pts[i], c="k", alpha=0.2) plt += Line(point, pts[i], c="k", alpha=0.2) plt += Line(pts2[i], pts[i], c="k", alpha=0.2) plt.show( axes=dict( xtitle="X-axis in :mum", ytitle="Y-axis in :mum", ztitle="Z-axis in :mum", yzgrid=False, text_scale=1.5, ), ).close() vedo-2023.4.6/examples/basic/silhouette3.py000066400000000000000000000005351444463326400204430ustar00rootroot00000000000000"""Make the silhouette of an object move along with camera position""" from vedo import * s = Mesh(dataurl+'shark.ply').c('gray',0.1).lw(0.1).lc('k') # this call creates the camera object needed by silhouette() show(s, bg='db', bg2='lb', interactive=False) sil = s.silhouette().c('darkred',0.9).lw(3) show(s, sil, __doc__).interactive().close() vedo-2023.4.6/examples/basic/skybox.py000066400000000000000000000007321444463326400175110ustar00rootroot00000000000000"""Embed a mesh into a skybox environment Mesh lighting is by Physically Based Rendering (PBR)""" from vedo import * msh = Mesh(dataurl+"man.vtk").rotate_x(-90) # Use physically based rendering (PBR): msh.c("white").lighting(metallicity=1, roughness=0.05) # Specify a skybox environment from a HDR file # (more skybox example HDR files at https://polyhaven.com/hdris) cubemap_path = download(dataurl+"kloppenheim_06_4k.hdr") show(msh, __doc__, bg=cubemap_path).close() vedo-2023.4.6/examples/basic/slider_browser.py000066400000000000000000000017131444463326400212170ustar00rootroot00000000000000"""Mouse hind limb growth from day 10 9h to day 15 21h""" from vedo import settings, dataurl, load from vedo import Text2D, Plotter, Picture, Axes, Line def sliderfunc(widget, event): i = int(widget.value) days = int((i * 2 + 249) / 24) widget.title = f"{days}d {i*2+249-days*24}h" # remove the old and add the new shape # (no need to render as the slider makes a call to rendering) plt.pop().add(objs[i]) objs = load(dataurl + "timecourse1d.npy") # load a list of shapes settings.default_font = "Glasgo" plt = Plotter(bg="blackboard") plt += Text2D(__doc__, pos="top-center", s=1.2, c="w") plt += Picture(dataurl + "images/limbs_tc.jpg").scale(0.0154).y(10) plt += Line([(0, 8), (0, 10), (28.6, 10), (4.5, 8)], c="gray") plt += Axes(objs[-1]) plt += objs[0] plt.add_slider( sliderfunc, 0, len(objs) - 1, pos=[(0.4, 0.1), (0.9, 0.1)], show_value=False, title_size=1.5, ) plt.show(zoom=1.2, mode="image") plt.close() vedo-2023.4.6/examples/basic/sliders1.py000066400000000000000000000011461444463326400177200ustar00rootroot00000000000000"""Use two sliders to change color and transparency of a mesh""" from vedo import Plotter, Mesh, dataurl def slider1(widget, event): mesh.color(widget.value) def slider2(widget, event): mesh.alpha(widget.value) mesh = Mesh(dataurl+"magnolia.vtk").flat().lw(0.1) plt = Plotter() plt += [mesh, __doc__] plt.add_slider( slider1, xmin=-9, xmax=9, value=0, pos="bottom-right", title="color number", ) plt.add_slider( slider2, xmin=0.01, xmax=0.99, value=0.5, c="blue", pos="bottom-right-vertical", title="alpha value (opacity)", ) plt.show().close() vedo-2023.4.6/examples/basic/sliders2.py000066400000000000000000000026301444463326400177200ustar00rootroot00000000000000"""Sliders and buttons controlling objects""" from vedo import * settings.use_depth_peeling = True def slider0(widget, event): sphere.color(widget.value) def slider1(widget, event): val = widget.value widget.title = get_color_name(val) cube.color(val) def buttonfunc(): cube.alpha(1 - cube.alpha()) # toggle mesh transparency sphere.alpha(1 - sphere.alpha()) button.switch() # change to next status ###### sphere = Sphere(r=0.6).alpha(0.9).color(0) cube = Cube().alpha(0.9).color(0) plt = Plotter(N=2, axes=True) ###### plt.at(0).show(sphere, __doc__) # show the sphere on the first renderer plt.add_slider( slider0, -9, 9, # slider range value=0, # initial value pos=([0.1,0.1], # first point of slider in the renderer [0.4,0.1]), # 0.4 = 40% of the window size width title="slider nr.0, color number", ) ###### plt.at(1).show(cube) plt.add_slider( slider1, -9, 9, value=0, pos=([0.1,0.1], [0.4,0.1]), title="slider nr.1, color number", ) ###### button = plt.at(1).add_button( buttonfunc, pos=(0.5, 0.9), # x,y fraction from bottom left corner states=["HIGH alpha (click here!)", "LOW alpha (click here!)"], c = ["w", "k"], # colors of states (foreground) bc= ["k", "grey"], # colors of states (background) font="Quikhand", size=35, ) plt.show().interactive().close() vedo-2023.4.6/examples/basic/sliders3d.py000066400000000000000000000010011444463326400200540ustar00rootroot00000000000000"""3D slider to move a mesh interactively""" from vedo import Plotter, Mesh, dataurl plt = Plotter() mesh = Mesh(dataurl+"spider.ply") mesh.normalize().rotate_z(190) def slider_y(widget, event): mesh.y(widget.value) # set y coordinate position plt.add_slider3d( slider_y, pos1=[0.5, -3.5, 0.35], pos2=[0.5, -1.0, 0.35], xmin=-1, xmax=1, value=0, s=0.04, c="r", rotation=45, title="y position", ) plt.show(mesh, __doc__, axes=11, bg='bb', bg2='navy') plt.close() vedo-2023.4.6/examples/basic/sliders_hsv.py000066400000000000000000000031751444463326400205230ustar00rootroot00000000000000"""Explore RGB and HSV color spaces""" from vedo import Plotter, Cube, Text2D, precision, np from vedo.colors import rgb2hex, rgb2hsv, hsv2rgb, get_color_name def update(rgb, hsv): box.color(rgb) RGB = np.round(np.array(rgb)*255).astype(int) tx1.text(f"RGB: {precision(rgb,3)}\n {RGB}\nHEX: {rgb2hex(rgb)}") tx2.text(f"HSV: {precision(hsv,3)}\n{get_color_name(rgb)}") def funcRGB(w, e): r,g,b = slr.value, slg.value, slb.value h,s,v = rgb2hsv([r,g,b]) slh.value = h sls.value = s slv.value = v update([r,g,b], [h,s,v]) def funcHSV(w, e): h,s,v = slh.value, sls.value, slv.value r,g,b = hsv2rgb([h,s,v]) slr.value = r slg.value = g slb.value = b update([r,g,b], [h,s,v]) box = Cube().lw(2).color([1,0,0]).lighting("off") tx1 = Text2D(font="Calco", s=1.5, pos="top-left", bg="k5").text(__doc__) tx2 = Text2D(font="Calco", s=1.5, pos="top-right", bg="k5") plt = Plotter() slr = plt.add_slider(funcRGB, 0,1, value=1, show_value=False, c="r3", pos=((0.05, 0.18),(0.4, 0.18))) slg = plt.add_slider(funcRGB, 0,1, value=0, show_value=False, c="g3", pos=((0.05, 0.12),(0.4, 0.12))) slb = plt.add_slider(funcRGB, 0,1, value=0, show_value=False, c="b3", pos=((0.05, 0.06),(0.4, 0.06)), title="RGB") slh = plt.add_slider(funcHSV, 0,1, value=0, show_value=False, c="k1", pos=((0.6, 0.18),(0.95, 0.18))) sls = plt.add_slider(funcHSV, 0,1, value=1, show_value=False, c="k1", pos=((0.6, 0.12),(0.95, 0.12))) slv = plt.add_slider(funcHSV, 0,1, value=1, show_value=False, c="k1", pos=((0.6, 0.06),(0.95, 0.06)), title="HSV") plt.show(box, tx1, tx2, viewup="z") vedo-2023.4.6/examples/basic/sliders_range.py000066400000000000000000000016011444463326400210070ustar00rootroot00000000000000"""Create a range slider to scale two spheres""" from vedo import * def slider1(w, e): if slid1.value > slid2.value: slid1.value = slid2.value s1.scale(slid1.value, reset=True) def slider2(w, e): if slid2.value < slid1.value: slid2.value = slid1.value s2.scale(slid2.value, reset=True) s1 = Sphere().c("red5").alpha(0.5).scale(0.8) s2 = Sphere().c("green4").alpha(0.5).scale(1.2) plt = Plotter() slid2 = plt.add_slider( slider2, xmin=0.1, xmax=2, value=1.2, slider_length=0.02, slider_width=0.06, alpha=0.5, c="green4", show_value=True, font="Calco", ) slid1 = plt.add_slider( slider1, xmin=0.1, xmax=2.0, value=0.8, slider_length=0.01, slider_width=0.05, alpha=0.5, tube_width=0.0015, c="red5", show_value=True, font="Calco", ) plt.show(s1, s2, __doc__, axes=1).close() vedo-2023.4.6/examples/basic/specular.py000066400000000000000000000012111444463326400200010ustar00rootroot00000000000000"""Setting illumination properties: ambient, diffuse, specular, specularPower, specularColor. """ from vedo import Plotter, Mesh, dataurl plt = Plotter(axes=1) ambient, diffuse, specular = 0.1, 0., 0. specularPower, specularColor= 20, 'white' apple = Mesh(dataurl+'apple.ply').normalize().c('gold') for i in range(8): s = apple.clone().pos((i%4)*2.2, int(i<4)*3, 0) #s.phong() s.flat() # modify the default with specific values s.lighting('default', ambient, diffuse, specular, specularPower, specularColor) #ambient += 0.125 diffuse += 0.125 specular += 0.125 plt += s plt += __doc__ plt.show().close() vedo-2023.4.6/examples/basic/spline_tool.py000066400000000000000000000012331444463326400205160ustar00rootroot00000000000000"""Modify a spline interactively. - Drag points with mouse - Add points by clicking on the line - Remove them by selecting&pressing DEL --- PRESS q TO PROCEED ---""" from vedo import Circle, show # Create a set of points in space pts = Circle(res=8).extrude(zshift=0.5).ps(4) # Visualize the points plt = show(pts, __doc__, interactive=False, axes=1) # Add the spline tool using the same points and interact with it sptool = plt.add_spline_tool(pts, closed=True) plt.interactive() # Switch off the tool sptool.off() # Extract and visualize the resulting spline sp = sptool.spline().lw(4) show(sp, "My spline is ready!", interactive=True, resetcam=False).close() vedo-2023.4.6/examples/basic/ssao.py000066400000000000000000000010301444463326400171270ustar00rootroot00000000000000"""Rendering with Screen Space Ambient Occlusion (SSAO)""" from vedo import dataurl, Mesh, Volume, Plotter # mesh = Mesh(dataurl + "porsche.ply").rotate_x(90) mesh = Volume(dataurl+"embryo.tif").isosurface() mesh.compute_normals().c('white') plt = Plotter(N=2, bg='blue1') plt.at(0) radius = mesh.diagonal_size()/5 # need to specify it! plt.add_ambient_occlusion(radius) plt += mesh.clone() plt += __doc__ plt.at(1) plt += mesh.clone() plt += '..without ambient occlusion' plt.show(viewup='z', zoom=1.3) plt.interactive().close() vedo-2023.4.6/examples/basic/surf_intersect.py000066400000000000000000000005341444463326400212310ustar00rootroot00000000000000"""Intersection of two polygonal meshes""" from vedo import * settings.use_depth_peeling = True car = Mesh(dataurl+"porsche.ply").alpha(0.2) line = [(-9.,0.,0.), (0.,1.,0.), (9.,0.,0.)] tube = Tube(line).triangulate().c("violet",0.2) contour = car.intersect_with(tube).linewidth(4).c('black') show(car, tube, contour, __doc__, axes=7).close() vedo-2023.4.6/examples/basic/texture_coords.py000066400000000000000000000014101444463326400212350ustar00rootroot00000000000000"""Assign texture coordinates to a polygon""" from vedo import * settings.default_font = 'Bongas' # define a polygon of 4 vertices: polygon = [ [(82, 92, 47), (87, 88, 47), # x,y,z of vertices (93, 95, 47), (88, 99, 47)], [[0, 1, 2, 3]], # vertex connectivity ] # texture coordinates, one (u,v) pair for each vertex: tc = [(0,0), (1,0), (1,1), (0,1)] #tc = [(0,0), (2,0), (2,2), (0,2)] # create the Mesh object (a rectangle) m = Mesh(polygon) # apply texture to m fpath = download('https://vedo.embl.es/examples/data/images/dog.jpg') m.texture( fpath, tcoords=tc, interpolate=True, repeat=True, # when tcoords extend beyond [0,1] edge_clamp=False, # only used when repeat is False ) show(m, __doc__, axes=1).close() vedo-2023.4.6/examples/basic/texturecubes.py000066400000000000000000000007701444463326400207160ustar00rootroot00000000000000""" Show a cube for each available texture name. Any jpg file can be used as texture. """ from vedo import dataurl, show, Cube textures_path = dataurl+'textures/' print(__doc__) print('example textures:', textures_path) cubes = [] cubes.append(Cube().texture(textures_path+'leather.jpg')) cubes.append(Cube().texture(textures_path+'paper2.jpg')) cubes.append(Cube().texture(textures_path+'wood1.jpg')) cubes.append(Cube().texture(textures_path+'wood2.jpg')) show(cubes, N=4, bg2='lightblue').close() vedo-2023.4.6/examples/basic/tube_radii.py000066400000000000000000000014051444463326400202770ustar00rootroot00000000000000"""Use array to vary radius and color of a line represented as a tube""" from vedo import * settings.default_font = 'Quikhand' ln = [[sin(x), cos(x), x / 2] for x in np.arange(0,9, 0.1)] N = len(ln) ############################### a simple tube( along ln t1 = Tube(ln, c="blue", r=0.08) ############################### vary radius rads = [0.3*(cos(6.0*ir/N))**2+0.1 for ir in range(N)] t2 = Tube(ln, r=rads, c="tomato", res=24) ############################### vary color cols = list(range(N)) cols = make_bands(cols, 5) # make color bins t3 = Tube(ln, r=rads, c=cols, res=24) ############################### visualize plt = Plotter(N=3, axes=dict(text_scale=4)) plt.at(0).show(t1, __doc__) plt.at(1).show(t2) plt.at(2).show(t3, viewup="z") plt.interactive().close() vedo-2023.4.6/examples/basic/voronoi1.py000066400000000000000000000006551444463326400177520ustar00rootroot00000000000000"""Voronoi convex tiling of the plane from a set of random points""" from vedo import Points, voronoi, show import numpy as np points = np.random.random((500, 2)) pts = Points(points).subsample(0.02) # impose a min distance of 2% vor = voronoi(pts, padding=0.01) vor.cmap('Set3', "VoronoiID", on='cells').wireframe(False) lab = vor.labels("VoronoiID", on='cells', scale=0.01) show(pts, vor, lab, __doc__, zoom=1.3).close() vedo-2023.4.6/examples/notebooks/000077500000000000000000000000001444463326400165405ustar00rootroot00000000000000vedo-2023.4.6/examples/notebooks/align1.ipynb000066400000000000000000003144141444463326400207650ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m\u001b[32mave. squared distance = 43.20515185350062\u001b[0m\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"\"\"Align 2 shapes: a simple line to a polygonal mesh\"\"\"\n", "from vedo import *\n", "\n", "settings.default_backend = '2d' # or k3d, ipyvtk, or vtk\n", "\n", "limb = Mesh(dataurl + \"270.vtk\").alpha(0.5)\n", "rim = Mesh(dataurl + \"270_rim.vtk\").c(\"red4\").lw(3)\n", "\n", "# make a clone copy of the rim line and align it to the surface\n", "arim = rim.clone().align_to(limb, rigid=True).c(\"g\")\n", "\n", "plt = Plotter()\n", "plt += [limb, rim, arim]\n", "\n", "# compute how well it fits\n", "d = 0\n", "for p in arim.points():\n", " cpt = limb.closest_point(p)\n", " d += mag2(p - cpt) # square of residual distance\n", "\n", "printc(\"ave. squared distance =\", d / arim.npoints, c=\"g\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", "vedo.mesh.Mesh
(....embl.es/examples/data/270.vtk)\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
4.480 ... 892.7
-570.2 ... 623.1
-513.1 ... 421.8
center of mass (375, -3.34, -99.9)
average size 470.220
nr. points / faces 820 / 1526
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "limb" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2023.4.6/examples/notebooks/distance2mesh.ipynb000066400000000000000000000534071444463326400223450ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Distance: [2.54950976 2.54950976 2.41422468 ... 2.14595456 2.27999987 2.41536531]\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "de7b1fda636f4a5f9c73c3bbb8f0377f", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Plot(antialias=True, axes=['x', 'y', 'z'], axes_helper=1.0, axes_helper_colors=[16711680, 65280, 255], backgro…" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"\"\"Compute the (signed) distance from one mesh to another.\"\"\"\n", "from vedo import *\n", "\n", "settings.default_backend = 'k3d' # or 2d, ipyvtk, or vtk\n", "\n", "s1 = Sphere().flat() # flat shading\n", "s2 = Cube(pos=(3,0,0), c='white', alpha=0.2)\n", "\n", "# add scalars to the sphere that correspond to their distance from the cube\n", "s1.distance_to(s2, signed=True, invert=False)\n", "s1.cmap(\"magma_r\").add_scalarbar()\n", "\n", "print(\"Distance:\", s1.pointdata[\"Distance\"])\n", "show(s1, s2, viewup='z', axes=1, bg='bb')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Sphere:   vedo.mesh.Mesh\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
-0.9977 ... 0.9977
-0.9977 ... 0.9977
-1.000 ... 1.000
center of mass (0, 0, 0)
average size 1.000
nr. points / faces 1058 / 2112
point data array Distance
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s1" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "distance_to\n", "├── Sphere\n", "└── Cube" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s1.pipeline" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2023.4.6/examples/notebooks/interpolate_volume.ipynb000066400000000000000000012073441444463326400235330ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "histogram : entries=100000\n", "12639 █ \n", " | █ \n", " | █ \n", " | █ \n", " | █ \n", " | █ \n", " | █ \n", " | █ \n", " | ████ █████ \n", " | █████████████ ███████████████████████████ \n", "0.00..................................................1.00\n", "\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\"\"\"Generate a voxel dataset by interpolating a scalar\n", "which is only known on a scattered set of points or mesh.\n", "Available interpolation kernels are: shepard, gaussian, voronoi, linear.\n", "The middle layer is the result of thresholding the volume\n", "between 0.3 and 0.4 and assigning it the new value of 0.9\"\"\"\n", "from vedo import *\n", "import numpy as np\n", "\n", "# settings.default_backend = '2d' # or k3d, ipyvtk, or vtk\n", "\n", "npts = 500 # nr. of points of known scalar value\n", "coords = np.random.rand(npts, 3) # range is [0, 1]\n", "scals = np.abs(coords[:, 2]) # let the scalar be the z of point itself\n", "\n", "apts = Points(coords)\n", "apts.pointdata['scals'] = scals\n", "\n", "vol = apts.tovolume(kernel='shepard', radius=0.2, dims=(90,90,90))\n", "vol.c([\"tomato\", \"g\", \"b\"]) # set color transfer functions\n", "\n", "# this produces a hole in the histogram in the range [0.3, 0.4]'\n", "vol.threshold(above=0.3, below=0.4, replace=0.9) # replace voxel value in [vmin,vmax]\n", "print_histogram(vol, bins=25, c='b')\n", "\n", "show(apts, vol, axes=1, elevation=-30)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", "vedo.pointcloud.Points\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
4.784e-4 ... 0.9984
1.643e-3 ... 0.9978
3.092e-4 ... 0.9992
center of mass (0.505, 0.507, 0.505)
average size 0.473
nr. points 500
point data array scals
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "apts" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.9" } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2023.4.6/examples/notebooks/legosurface.ipynb000066400000000000000000015742061444463326400221210ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[7m\u001b[1m\u001b[34mVolume \u001b[0m\n", "\u001b[1m\u001b[34morigin : \u001b[0m\u001b[34m(0, 0, 0)\u001b[0m\n", "\u001b[1m\u001b[34mcenter : \u001b[0m\u001b[34m(6450.40, 4109.53, 5514.05)\u001b[0m\n", "\u001b[1m\u001b[34mdimensions : \u001b[0m\u001b[34m(125, 80, 107)\u001b[0m\n", "\u001b[1m\u001b[34mspacing : \u001b[0m\u001b[34m(104.039, 104.039, 104.039)\u001b[0m\n", "\u001b[1m\u001b[34mmemory size : \u001b[0m\u001b[34m1 MB\u001b[0m\n", "\u001b[1m\u001b[34mscalar #bytes : \u001b[0m\u001b[34m1\u001b[0m\n", "\u001b[1m\u001b[34mbounds : \u001b[0m\u001b[34mx=(0, 1.290e+4)\u001b[0m\u001b[34m y=(0, 8219)\u001b[0m\u001b[34m z=(0, 1.103e+4)\u001b[0m\n", "\u001b[1m\u001b[34mscalar range : \u001b[0m\u001b[34m(0.0, 150.0)\u001b[0m\n", "\u001b[1m\u001b[34mhistogram : entries=100000 (logscale)\n", " 4.91\n", "0.00 | ██████████████████████████████\n", "17.88 | ██████████████████████\n", "35.75 | ██████████████████████\n", "53.62 | ██████████████████████\n", "71.50 | █████████████████████\n", "89.38 | ██████████████████\n", "107.25| █████████████\n", "125.12| █████████\n", "\u001b[0m\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"\"\"Represent a volume as lego blocks (voxels). Colors correspond to the volume's scalar.\"\"\"\n", "from vedo import dataurl, settings, Volume, Plotter\n", "\n", "settings.default_backend = '2d' # or k3d, 2d, ipyvtk or vtk\n", "\n", "vol = Volume(dataurl+'embryo.tif') # load Volume\n", "vol.print()\n", "\n", "# show lego blocks whose value is between vmin and vmax\n", "lego = vol.legosurface(vmin=65).cmap('seismic').add_scalarbar()\n", "\n", "plt = Plotter(axes=1, bg='wheat', bg2='lb', size=(900,600))\n", "plt.show(lego, viewup='z', zoom=1.75)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2023.4.6/examples/notebooks/manipulate_camera.ipynb000066400000000000000000000046251444463326400232610ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4be5195458e1498290d9d80a396b2c09", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Plot(antialias=True, axes=['x', 'y', 'z'], axes_helper=1.0, axes_helper_colors=[16711680, 65280, 255], backgro…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\"\"\"Manipulate Camera for K3D backend\"\"\"\n", "import vedo\n", "\n", "vedo.settings.default_backend = 'k3d'\n", "\n", "bu = vedo.Mesh(vedo.dataurl+'bunny.obj')\n", "bu.show()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Manually set the k3d camera. Syntax is:\n", "# [posx,posy,posz, targetx,targety,targetz, upx,upy,upz]\n", "vedo.notebook_plotter.camera = [0., 0. ,1.,\n", " 0., 0., 0.,\n", " 0., 1., 0.]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "k3dcam is [-0.017 0.11 0.48 -0.017 0.11 0.08 0. 1. 0. ]\n" ] } ], "source": [ "# Convert a vtkCamera object into the appropiate K3D list\n", "import vtk\n", "vcam = vtk.vtkCamera()\n", "vcam.SetPosition( [-0.017, 0.11, 0.48] )\n", "vcam.SetFocalPoint( [-0.017, 0.11, -0.001] )\n", "vcam.SetViewUp( [0.0, 1.0, 0.0] )\n", "vcam.SetDistance( 0.4 )\n", "k3dcam = vedo.utils.vtkCameraToK3D(vcam)\n", "print('k3dcam is', k3dcam)\n", "\n", "vedo.notebook_plotter.camera = k3dcam" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2023.4.6/examples/notebooks/numpy2volume.ipynb000066400000000000000000011221351444463326400222720ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "scalar min, max = 0.0 1.0\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Make a Volume from a numpy object\n", "#\n", "import numpy as np\n", "from vedo import *\n", "\n", "settings.default_backend = '2d' # or k3d, 2d, or vtk\n", "\n", "X, Y, Z = np.mgrid[:30, :30, :30]\n", "\n", "# scaled distance from the center at (15, 15, 15)\n", "scalar_field = ((X-15)**2 + (Y-15)**2 + (Z-15)**2)/225/3\n", "print('scalar min, max =', np.min(scalar_field), np.max(scalar_field))\n", "\n", "vol = Volume(scalar_field)\n", "lego = vol.legosurface(vmin=.3, vmax=.6)\n", "lego.cmap(\"hot_r\")\n", "\n", "show(lego, axes=1)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", "vedo.mesh.Mesh\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
0 ... 29.00
0 ... 29.00
0 ... 29.00
center of mass (14.4, 14.4, 14.4)
average size 16.762
nr. points / faces 8200 / 8208
point data array input_scalars
cell data array input_scalars
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lego" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2023.4.6/examples/notebooks/pca.ipynb000066400000000000000000003426111444463326400203550ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "inside points # 2463\n", "outside points # 2537\n", "asphericity: 0.5412817357526739\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+gAAAH0CAIAAAAhSpB6AAEAAElEQVR4nOyde1xUZf7HP88ZUEDa0C3BxDSzUrt4ybx0E7FsKaWyFKvNzA3FLAIDtdEyXZ22QCBM5WKt3UVZ29RdWkrDssRLKl3UiswLFepuTr9IMHXO74/nnOc8c+bCDHfw+36528yZc57zzI35PN/z+X6/TFVVEARBEARBEATRslGaewIEQRAEQRAEQdQOCXeCIAiCIAiCaAUENPcECIIgGga1ew9+gx062JzzIAiCIIjGgSLuBEG0BdQnU5p7CgRBEATRuDBKTiUIom1AEXeCIAiibUMRd4Ig2gjs0EEkJZFqJ1oaavce2r8bbmzuuRAE0boh4U4QRNuBJSc19xQIgiAIorEg4U4QBEEQBEEQrQDyuBMEQRBE48KTp9ni9OaeCEEQrRsS7gRBEARBEATRCiCrDEEQBEEQBEG0Aki4EwRBEARBEEQrgDqnEgRBEIBUCB+RkeyTLc05FYIgCMIdFHEnCIIgCIIgiFYACXeCIAiCIAiCaAWQcCcIgiAA3nr23nvZoYOoqOCdPpt7RgRBEIQTJNwJgiAIDbY4nVccJwiCIFogVMedIAiCcELE2tmhg805D4IgCMIZirgTBEEQTrBDB5GURKqdIAiipUERd4IgCIIgCIJoBVDEnSAIgiAIgiBaASTcCYIgCIIgCKIVQMKdIAiCIAiCIFoBJNwJgiAIgiAIohVAwp0gCIIgCIIgWgEBzT0BgiAIgmhBUBl7giBaLBRxJwiCIAgNNW5Cc0+BIAjCI1THnSAIouERUVtERrJPtjTnVAg/oYg7QRAtFoq4EwRBEIQBO3QQ995Lqp0giBYICXeCIAiCcIItTm/uKRAEQbiBrDIEQRCNgpqZxZKTmnsWBEEQRNuBhDtBEARBEARBtALIKkMQBEEQBEEQrQAS7kQDsHXr1oyMjOaeBUEQBEEQRFuGrDJEfamoqJgxY8bWrVuPHDnS3HMhCIIgCIJos1DnVKK+bN26devWrQAyMjIefvjh5p4OQRAEQRDo2LFjc0+BaHjIKkPUi4qKCmGSyczMbJY52O32Zjkv4SP0BrV86D1q4dAb1MKhN4hoMki4E/Vi69atFRUV4u7f//73ZpwMQRAEQRBEG4aEO1EvuElG0FxBd+JcJqz/AP6vgYcdPYb/a9hhCYIgCKLOkMedqBcZGRk8M3XNmjWPPPJIc0+HOOdQn5nXWMNKl5IIgiAIoiVAwp2oL5GRkfz/r7vuuuaeC3HOwRbMx7p1zT0LgiAIgmgKyCpDEETrxr5n94lBg+x7djfgmGzB/AYcjSAIgiAaBIq4EwTR6mEr8ht8zIZdCdSHsIRpAOw5y5t7IgRBEEQzQ8KdIAii5SKSbsP6D2g5a4la4YsNNPl6I2zlq/ZJDzXlGQmCIJoSEu4EQRBEQ1Na2sQnNFY4WVmtaIVDEAThFyTcCYJoIwjp1iZ1Wwt5UqI+pn3Dek/7qDk5TTUdAiAzFUGcS1ByalujwkMNO0/bCaIpaaSa6+aztKHi6/Y9u/m/5p6ITkUF/xe2cJGnXVhCQlPO6BwnrP8AlJaitLSxv1YEQbQESLi3NWbMmDFs2DDX7cOGDZsxY0bTz4cg3CI80ESbpOnXG+KMLWiRU1e8LIoIgjjHIatMG4SC7sS5iX3Pbt6PiYo5NgamgK597pzmmkkbJmz0GN75K6ywsA2sQAiCaHBIuBME0XTY9+zm+q+R/Lgk2ZsG0pQtB3ovCOKcgoQ7QRBNCukMormgJE6CIFo7JNwJgiCI2rHv2a0+Eo/GaXfVBLSK3E0vtXoIgiBAyakEQRCEj7AV+a1UtctQ6idBEK0XirgTBEEQ5xD1Satt270CCIJo+ZBwJwiCaBEYXo7ISLJMNDj1l9q8ZlHrglYaBNHGIKsMQRBE80OF7YlGhQxCBNE2IOHe1oiMjAQg91qqqKigCu4EQRD1pOO6dc09hbpDdfcJom1AVpm2RkZGRkVFxZo1a9asWcNFPKl2gqgDdfMY1NmZYM9Z3qprtninDdRhDBs9RtxuRbYToxZQc8+EIIgGgYR7G2T16tUZGRmlpaVHjhwBMGzYsMjIyDVr1jT3vAii1aDm5DT9SdukZIe0mAkbPYa8+01PW/1cEcS5CQn3tolsleGQcCcI32EJCcjJbe5Z+I0wyrfq2LYgbOGiRjV4+HV5xL5hfRu+JFIrlORKEC0EEu7nBOSWIQh/se/ZrebksIQE/w6LjGyc6fhGaWlznr02/Aq3c6UYVljYSEqxDtnA56ZkB2VOE0RLgoR7W4ObZJKTk4cNG8a3VFRU8AD8uHHjmnVqBNHK8Fu1U+dLd9RTeYetfNU+6aGGmgxBEESrhoR7W6O0tHTr1q1bt26FXmGGh9vHjRtHwp0giFZHI6l2e85ynm9Ka61aodeKIFoOJNzbGqtXr66oqFi9enVpaSmAI0eOjBs3btiwYaTaCaLN05b8x03wXEiG+g69VgTRQiDh3gaJjIx0TU4lCIIgCIIgWjXUgIkgCIIgCIIgWgEUcScIwg1U/Y0gCIIgWhoUcScIwgxVfyMIgiCIFghF3AmCqBdho8dAbxRA4fmWgLhaAnpHiDYHlQclznEo4k4QhBlf+m6G9R/A/zXBfPwibOGisIWLmnsWtdBiX73GI2zlq809BaLVE9Z/ALKyzqkvDkGYoIg7QRBu8B6pbbFeGhH+b7yOmw1L2MJF9rlzmnsWjY7WBjUrq1W8Ka0Cvjo9Fz48AvWZec09BYJofki4E40Ode5o29A72xKQk4nte3ZzicMWzK/vsKPHaMO6e5d9NC202GVe6yUsYRpKS9F6FqgNAlswH+vWNfcsCKKZIeFONC5CT4SNHkMKr80gOim2ZPhnr4XLmkaKmNZfsmvo2QuuVwZ8D6Lbc5afC96GVvF584sWWFqq5cyEIJoLEu4EQdSFlrkM47NSn5nXsWVH5lq7/vDXtNDan2+tNHGEog5rIX7dw5f0FQ75UgiiZULCnWgiWqbOI4i2wYlBg/gN1jjjm8LtjWdaMPRoZGRL+6Ph3ThU64EN+3T8WgvVYV1BvhSCaJmQcCcalzYfaSNaIGzBfOza1dyzaFLYivzGGNbL9/dc+2qrz8wTxiFX7Ht2a1YZF1kcljBNS5juP8CXF63lGFR4skSD2a48cA5m2RJEfSDhThBEG6SlBWuJNo/Q2XUOzJtojIpD/k6p0VV7aysDRRDNDgl3giCIxqW5YqgNe96meRZeSuI0fWMp+Sn7YR1xDszXOTe3AVV7Q71c1PyIIJodasBEEATRiDRSkl/Y6DHeC/uoOTmNcV5IEWW/D/StBxNbML+xA73+opnU9+zm//w93K8D7Xt2IzISkZF+z7IxCUuY1hjNj+jKGEH4C0XcCYJoQZwjDYnqiS+2aZaQgJxcn0brPyAMQOOEsXmM1nBEZGWh0c7VZjin5Cx9EgjCL0i4E26oqKhYvXq16/Zhw4YNGzas6edDuKXlJLE1FFpp8LbldhWZst7VWGO8m/Y9u9WcHJaQ4OP+3ldN9j271Ufi4U8irKj17ukh+PN86zCBeuIl5dT7UY02o2bjHCnGTxAtHxLuhBuOHDmyZs0a0uithbCEab6XZ26xtOG60bXKPr/Lovusojrm5CInF/fei4bwTDeGYvbrGkvHnTsBwLfyLA1Cm1ThdYNeCoJoCZBwJzySkZHR3FMgziF8T/7zt5VMQx3beNShZrZfhQVRWAjPlzLse3afmPRwWEAAmzsHdU1AbILrP/y9027XuzK6cO+AJGmD0vY6yBJEi4KEO0G0VgznQAuToXXGLzFaBze84bRuwpCtjzRNzWxPsKxMFhYGydzi1+vj6YqBl0GMmol1uw7QUt/HFk5j55AYX096awiicSDhThCtmCYz+xJNgF+q3Ze4prBo1wH/HCz+t7uqQ7CcXydRn5nX8dgxlJb6e3iLpWmSVcISpvEXrY3lkBDEuQYJd8I9FRUV3bp147cjIyPHjRs3Y8YMeYetW7dmZmby20eOHAEwdepUfnfcuHG33HJLE06WOBepQ+DQvmF9y0yw89ddUIe4pr9azfeXV5S4qcNZ6gBbMN/uXNO9bvCVg1/Ju41NG6iSbt+zu/4uJoIgvMBUVW3uORAtkQqph8iRI0e4RpdLzWzdunXNmjVi5yNHjlx99dX8bv/+/WNiYppwsgTRiukRNULcPljyYYMfov7teTZ7lnmEPz8I4OAbr5v2vOS99/yaCYAes58S8W/fjyIE4t1s7FevyU5EtATCwsI6duzY3LMgGh4S7oSvDBs2bMaMGePGjXN9aM2aNVu3bn366aebflYA7HZ7WFhYs5ya8AV6g7xTt4ag9YlrCteEOKN4j+pm22iKzFThiW/Zody6vZu1lrls1C9RG4j0Nzst868cCfc2CVllCF8RzhmCIBqQurkLGkq/hvUfgKFD7X97TkymDoPUR6/7WudHvwbYZlp0yaudZkxWqVs6MkEQzYXS3BMgWiJbt24dP3687JbJyMg4cuQIVXYnCEFY/wH8Xx0eNWHfsN6+YX1YwjT+r0Gn6e50vpUh8usp1O1ALfZfWtoycw+aBnExoXkJW/lqc0+BIIjaoYg74YZhw4Zt3bp12LBhkZGRPNB+5MiRcePGRUZGNvfUCKJF4HvLJB4h9slM4k+lFE9B+lqD964S2Z6zHHa7t3PVNcjdGNHxFh5ub/r2rg0FuWUIolVAwp1wz4wZM8aPH3/kyJGKiorIyEiKtROtlKaptec7DdLm1qgq4zyaKPDiqdqMvN6w79nta3S/rrUXaxXZvreArUPJncZ4x32p/+O3ZB86tD5Tqict5HtBEISPkHAnPBIZGUkhdsJfWpRQ9h4Xr89U2YL58Fq83HCut6QIsdyi1Sjs3X+A3V2ZEe0pVFSgosKvfjr2Pbtdyyx66lTasJ+TBrediCsYckZv2Ogxbq51OK9A/Hi5WtInhCCIFg4Jd4IgGgzfDSQtirpV1ag1PVTegTdGhdcuS3WQsKbgvU8BbH9W4ycGDuwo5br4Tsc9ZajftQXjiURG+piJ2+BGeblefi17uly7qNUmZJhq6jHDZqRFLdHReuoOEUQ9IeFOEESDIQd0GxyTvPZFN9QaF9coLAwrLGzs33u/GqN6x8tTrlVFyU+zVj1atzdUBNebsu+9HGs/MWhQo1rMfXkNfYmjtzoffItFfWYe6rTCJIhWBwl3giAaEh5abkCRyqlz0Tovcpw7Ojpu+FfTq8x60iBGecgq33Nyah3M5W6D+qY3wtcqkHWieQRxZOSJgQPZgvmN8fknCILgUDlIgiAamEZVLQ1btK4Z292Lmon+GjzC+g+oc/1E38tN+luYUs3JEbdrvXbBn0ItzyIykv8zhbc9Rrg3rD8xaNCJQYMacPVl37Ob//Nxf/7Jb7zPf9NUC/UR+57dDftq1wdaKRHnDhRxJwiiNSHcMtwi7Cm26kv1D22cDetbaRFxf635smPb+ysj563i3nt9cn0kJCAnV9ytv57zkv3pKc+1kQLtZq3sXASmyeo/eiol1Iy0KKtPC1lCEERjQxF3giBaNCLI6hr79K7a4YOHW+Pee+XBGyquGTZ6DP/n+pAcn64zTVR4u7DQ94qNJ2Jjm1g/hS1c1NinqFUlsxX5LUrCEgTRhiHhThBEC6UJNBm4uJe0qXBxNMDQFRXaPxdki47frn19jVG3tqY+ncJFqvr4XvjoWLDv2a3ZYPx57sbO0kta69UAvyxJnnbjrzlfljR7tNvTBOpsviIIohVBwp0giBZHWMI0k572i7oFfU1R9sbuAG/fsxtDh9a/+Y7vyxvh2PbJQeS8W8M3QN2wvg5lfJxm7qfurxUnK447mtdI7ZfhnrQ7QbRVyONOEIRGHSpnNwX+dwGrmxHFXBO9kY0oskysz6vtu6QWEl8cYpTUdNeACY3vG6612HkdhyXZ2mivLUEQzQsJd4IgWhxyIyFfRK2pprspUdL9IQsXAbDPnWPSpobTXd/Bv6m7G6qhcKNHPaxqXNdgckJnWGGhfc/uZle3WonPwkJ/DTN+JYPWur/r69CCVq3+YHpPSbUTRJuEhDtBEC0IESb0o3y4O2NDLVVTRLTbg2o0digtbWwZV69wu7tjfTJzezYCeaqw3nidMkV5HLen4O+v/EyFBPexWaYXie/mw+P/FZ4Wgvc6+gRBtA1IuBMEodG89dSMEoR+hmBbKU7atPG7x5uqXtonPYRJDxmhaLkBk14I0tNkGrwcoaba3VXyqaWEJTXL9EArvWhAEEStkHAnCKJ1Y9+wXn0kvuPOnWhV3U8FvpeeFF1p3cbU3RppZAHn+sq4hqLVZ+bVPo/S0gZ5nb2M4BplbyTsG9bX+VyN2vy1PpBqJ4g2DAl3gmgAKA+s/si+dr+56CIfdzTFto3aebVp3EbEn9KTvLCJ6/Rky0d9WgKxBfOxbp3rdte3xvcWVz5iz1luPIuKCujLsDqcyL+d6yRzGyq3uAFpdUtWgiDqAAl3gqgvdcuxI1yp8wsoy00fdV59UjMby9niW2lIXwK9rbQfkJFHK2/0/CLTN67ZabGXHQiirUJ13AmiwWjsyt+EF/zWcA2RwNewLaJ8UT+u/aG0iwYVFScGDToxaFADaNnISO2fPDcxbL0Lz9eK9wB2S2sz1ELC7c2C+DR6qnxPEESDQxF3gmgwmqgFPVEPhI2kY2Wl2HgiNtb33joNrhfr2C7KxWXesbKyFsnrW3C0FiXaID1la6Plh9Jb/gwJgmiTkHAniPrS9n7Cm6DISWPAczdRW4dLbiOx64mYbMF8VrfzRUY2b2KDX+5q9Zl5tZaL8Y9zr+agU1meVvXV8JE69y44ly87EEQTQ8KdIFolTWMtbXVFWkyS3bvfvb4d7JtDubo2TrLv2d00NVjcnNrzGRtvSiKrGNL7K38dfFl2+rs0dbWCNEhNzBZlEDfSbSsqfJxS6/rjQBBtAxLuBNH6aIEVLeAshurfdtSXs9Sypy62GipQKmSiVrOlCfWW/Kxdi8b48hnwVC7GL3zst1pL8fWGxjhdwjR/K7vL+tvbYqMRCsYbjQv8eZVa6dUwgiAaChLuBEGYOREb27EeIq/WvqQeD6ytqqZrlXG/Q6d1lZJNuVjy8qT4S1S3ojEiMk244mWxoebkuO7fQsLkjUEbfmoE0QagqjIE0YppJAXZLB6SsP4DUFjoPaDrXwqpHiU16TC/CpI0fQGTxjuXUQOkIeS7l89eEwSD7Xt2u1bRsecsl2fl5Y2z79nNK+f4IlJZQoJ8IP9Xj7kbs63/ID4SljCt1jddPLUWVbSHIAgTFHEniNZH0wgjv49pIM+397i76B7qbQRJo/AnIozgQs3XGjg3C52hQ7mxoVHD7bWrqxbT5yts5ateyigJU039L3HIh8tuFsMp5Dy+dmGhtuo3JokvH+5m58b5xjWN3UW2ElE0nSBaOyTcCaL5aTzfaqM6Yk1yp86K1pzyWJs29aTajXHc1RrXmvv4Fkd0q/ya2FV8YtAgUe6mzqfWnq/pBWmIko5uVXvY6DENYgd3605pJLdS66oV0/JnSHiHshSIekLCnSBaELWavP3C1RHelBi/TyUf+n6U71Z16Bf33Tys9w9ylXciEuyv8muaUKU9Z7l43bwb2WWJ7OlFMySpP0rdOCoy0vQqOeUfN6b+YAkJyMn1+HBtawN7znIfy9o0gem/5ZSO8XEOJwYN4jfqWCaV8IzbFSlB+AUJd4Lwj0YtvdewRogGKSRSNxq1k6JrHqHJtuH9ZfRFaMoC2vv+3mSuu4+K92FNlXka3hjjYT3jL3KTYE/z5PrP3zxaeUmm5uTI/nK/qMNzrOWN9moN8nhU0xbYcYtrjofb7YK6pT4TvlDLipQgfICEO0H4QSP9DPMCf43xeynEU2OE/RrqFfCxcZInNC91VlbDFlavvdykV2Ht1tfhPb4rXyHRnlRhIYYOrfO75lfldf9GnvRQWFaWaaM414lBg9iKfC/xWk+fRtP3y6Ta/S1G6eMKDUDtWRP6Z4zsDS2TVuQ/qduCliAEVFWGIOpIw1ZdaKS/42xFPluRb5QTWbioMc7iin3DeteiH15gC+b7rtrFmK6D2zesb4LC9mEJ0zzVwKnPK+zXusW+Yb19z+4TCVO9v8KiVIjJVuSpzIghvmNj3RqNTsTGinxfrTDL3DlwvsZSi8lHfBr9/wbJE6gV+bKAd3zPda7ljD4UbyEanOb1BPoL/5vc3LMgWjEUcScIolGo24+Tj5Ez8WizF62Tq9yIMLkoqwdTkFt4zSMj3T9TcdFA+Ne9httZQoL37rBu8aX1T8eePe1uzyhp3AZfI7nG1F1fJT8WeJ6dLX5dgJJ9U15wezmu5QeA2wDN6AkkiKaHIu4E4QcNVcK5uWg5xQRrxReXfEOVtfEXk+DjUtI17czHT4vTs9iwHvfey6Ppvhwui8WGzSvw189t37D+RGysHA53DT+7vRwhbzTvX6fotS8XIvwN+Tdg+fZa8bGMep2rrTflc2ky/LoUQxCtGoq4E4TftLqfh1Y34abH35qArvv4knYmh+HdSq4G91K7jev7GEL2FzkWLore8PCzEeMvLOR5twCEdBYdduWJmSpL+mVi9p7S2pKdFT6uvur29pkTHlrtnwW3icL1bRtHEK0EEu4EQTQ1XowKPE8XvjltRFsl11g7l4ZNfIWhboqfE5YwrQ4V0L3na3pRqJ6m0QRizrvoFMVkZAl7Ija2Y21eCN/dL43krGgyHVy3hYfrkqBudXKanbaUKNyKcmqJlgMJd4I4t6iDJboxJgAXg3Udf8PuvZeLD/l5GacoLNR2c6nVWPczNhBmzV3Xpkj1rMkDbrrQh6rbCG5m5XxJodYYv/xhcI2X1yq1TQF+L2cxpuSbDamJPxvidfP9vLXqb0+vfGtU7T4uWlrdmqRRar8SbRQS7gRxDtESqkq7pQ5BREOrSXUJfX9eJv90/eVvHXA/1aQkfzWHpzmzBfOxaxe8ZpE2XhUU07NzU5vS6+UC85zrVOtTXpuZPmNhCdO8hOd96dLqfYQ64341K3UxMy1j/Pi0REaeiIhgK/LrUyC/efHlaklbCskThCsk3AmCaHRqNa60hLoQTSPZhWPBkxysZ6TQ5BjxnrCb+/qbuOGmoK2lvEtmzRtvaQ+o2v/47aC0F56wGJUM6qyHTgwa1HHnTrkJlGH6r21M+Ym4fpzkAL9c0VIewfwZKy01hTn9ugKjqcMGWgC7PXWtTqc66G/uQHM9ypdGvC0E79NryQkMrhjOQAq3Ez7DVFWtfS+C8MqaNWu2bt369NNPN8vZ7XZ7WFhYs5y6ReGjx7fpDQBeeoua8KsLlUlq+NvRVn1mnrBN1//V8PFKt3zShjq1TO7rbwalpYMBYDUzZzIGMAYGQIGiAICigG8EA2MAMne8BDDV/suMW+fyORqSHQAQnJ6mbdb+X61OTdGfjwoVcDjgOAuHClVVVRWqY4UjH8C3mb+4Pkfjw3Dvvb57A5waytYmMd1G8cWeak5Oxw3/ktMJ3JQWTUqyT3rI+yeqPj4r07FenpHY82DJh65/5Xy39deaN9KKhHutNIsFrmX+DHXs2LG5p0A0PBRxJ85pag1/thZ898C05F9lv0q/m94yf99BU/y1PusZU2kU/46th90i9/W3oDCmKGAKAgKgMJR9rpwXyuv8stBQAADX6OB9TJnzfwCc6PAzAHRgSrtAfWBJuKtgAe1M51XatZfC8SpUqCoABwDmUJ/+4hkAUFVo50TeWwVc0ENVZ9XtqerUpb+V83KRJSTYeear51RgftGjzn8TalH8/niTjC6bdrt5HH8Ky7T8jj8NqLZb8p84gqg/JNyJcxv/63g0O1SIoP4YbopBg9iKfLF+c132CJnli7yuNe5eZ0dQ7utvgilMYVAUKBZYlOCMjBAAUKpnpoIpjIExhqgRbOdOHlBXhOBWmNDQAGQJv3bveigWbXtgIEyoANQaq3VIXh6Asl/+T9se0E6Ie6bqQzocAObumcMsFv3Bs9r+HTowAA6nWP4LvS7HW6tUh2Pqn+/3/txl84N97pxaCyaarPO+62+5l5YvO7vdLqoD+e6isW9Y7yki7ovgbpC8Rv4qtQTve0tL06S/t0RLg4Q7QbRWGik3rsFxe5W/GZGFYO3CyJ9iL74IDtdiMq5KJff1N5ligcJgCYCiQFFY6HmAAgWAptFZQDswgCkhH5bU3PYngMfWWY1VGyooLZ2r85rUVGlsXcQzABh7zdhdO7dpj1g8/hxsmzbdzVZV/EeE31XNkMOJ7ML/qy8hVEBNX/gcVDXlf8dYcAcVDuZQ8955F2cdOHMaDocvOv7EwIEda63vHhnptgZ8rWateuY5eKnNb8xQ/0TJE65PRLwBZW6zq/aWhmtXNYJodki4E0RboJ7RoAaMKjVxgMqv3vWeMKU2yn5o9yd19tX4+0xNRm0UFoYVFj7/ZCpTFFgsCAxgoeeBKXocnfvUmdboWmFB23c89s4afuhLF0bU3DFaH1iBHFu3BPC4enDh2prx4/RAu/a/oOJiADWjRi0anAYw+8//YxZLxraX/scOA2Anz1s4/GmT2d0dKsDg0G4BhnBfeO3z6YPkELuqGeKhpsxKAZAKpC96HlChOtQAFYHtNR2/9l2cPYuzZ3DWoTocUx+838tlCleh7G8jrQbEbVqkaYYNWMPH1ZrfukPCetWgFhVu96WrGkE0MSTciXOa1vhTZxQi8KBW65Nn5mONPG8+Af+ps/KoW3VL90Jw6FDX4Lrbn20vvpq6sSSwHQICQ7Z+Wn3bn8AUhYGrdk2vG8IdYEoQTxXVeezSHou510VLOcWTyY/zh5Z27a5tsigswDJnuxF3X/xRZ74MCK74oYZ/lpiFMUvgH06xKgYAHaqYsNA4k733BRw/PnPHhQAeHXItgIybRgBgKlSoiwanA5BTWeGQ/PCA+u8iMdTcL55ZOMAGqMyhAmrqUzP59rS/2uBQnXT87KfUsw44zk4F2IL5J378EQBbke97bXiNioqmKYTqe9ZsA9LsLRrqQ4vNMjLSDAiiZUDCnSBaH83yKyKL8gZ06TRL+TbfxU2Dy6DcN95iioKJk57e91cwBQwR1WdTPwmtuWO0wmu/aMIdYDx6LcfRGWMBsl8dwJNPJvIbGS8u1aLyAIDpPxxa1q0nwGrum8AP5SMAANP/8jMlaPFiMGDyZFgUY4UASKYXI+4+Z1sKAITghcH/PfiPX3HkewAzCgszliyHQ0TzxVGqNn2ewQpABRs9GhvfE2efu2fOwmufh+Jkf0/937GgH5fyjNeF/RaoKvfHO+BQ8wr/iTO/q1HRU/98H6RqQnBer3qHl2Zv8LL9omq+jPta9ZGRfAmB5tPZLSdO38KbJZFkJ1oaJNwJgqg9LS8sYZovbm97znJ/yzI2SAV3uWFq3YSI3NrTbVBWeHJMPUF9IfeNt5hiQUAAAgJYh/OgMMYUZgnQpG5EePUlESywHcDFOvey67VghJLmphmLAoZl3XpUR3YH8KR6yjiNYsn+6oUZ8okVBd27axKcKU7bATBc86OmdK9Zkr19wV8Tr3mqlmfiNBnnEykizq4CmLNNC/AvGpIGVcth5bI+48Vlc7anAHx/xiwKoHK/Def6Xz7XZqiqCGzH4/H8/1WHA4GBUB15a/85c+9Xz19y6dTa3g5PK8NaJXsdPk5euvPKmGz69cS+Z7eak9OxgRwdTSno5R5qzb5+IIjWAgl3gmhr1O2isx+hx8hIL+H2OpydK486JMY5FQj308HiRqBIGY2eWvPw7T6KjNw33mYBAWjXjnX4AxTGFMYYA1MABkVZOOhvc3fPAdjjfVLQRxLrCg+KM4Dp8tjQ3DWzeUFFzTqDN/9unE+xyHp62SWXA6iZMIHv36/L1WWVX2qDzNKrMj4z1zhcUvYzFs0DkDHH5SOhj//48SGI3GdEuJk2e87aveukyL0FesBd7+vEFg3NmLPtSQYsGpzOY/O/vfqX4Ps7pW0Lqrmg7z3X3LVrx1aoAFNhCYSiBr3/n5pbb4XDwRwqVJWpjpQ5swHMAl4ICQkObKeeOZOoGtr/RGwsWzA/rP8Ak2723fbQIIYopxwJKS+WAa6lSAV1OF1DWbGdrqq17EA4QZyzkHAnCKJ25IB03RYG3qu8yardbcyv8QKBQqDUIZRuDCId+KKKU089hcBA1uE8WBRFMcQ6FG5b1zwwCwenaepct7A/mWSu35KxJEczqACLhi7O/up5gCVeNZur5B4Djk+svkC98JqO99wPsMRrrBnLsXbvurF9Y9WiIhYTI8YZf8lfyiqT+e2g9HQAp1JSdixYeN2SbADFf/5zR0WT2uq/i7ginzHtL5nLX+HbtAkMy9SGG4YMAMCMjUUZI42zaHCDPkdRDOEOMZi6aFgGVEBVZzy/CBUVQNDTe04GP8Am9u99hRJgG5L+ymevPjxgIoCgtBegIujzL/UMV0fNk0+KwU69O2vpqA4pm89bojr6dex4MxzPT7hvVnqarIzFBSXnywSNjqynzd+ae+9FYaF9z+6GSlf1+3uhJ4MKTF4jUu0E0TIh4U4QhE/URzH73qKoDjpGmHNk9exHvNCdacGv0hbynMdcp0CxjHrj7VMJU+aWPc0blC4c9DdNrCsKtLA69NZIRlh9xtuvug6evXkmgln1678CwBtT5zx4Hhibs+3JRcMy70l9+B6g99gwYOciPAC9Zsw9V94JBnbH7foY2glsN7yofvJJ8KefahsUBcCOJ5IA4H//E7vNeHeNcXqFySOYhG/y1IcBzCgsRGRk8MhftbMMy7yn752fbf1QOjtzOlK77YCKGZv+4/T6M3ZF0CB+c/Kgh4OKi2tuHcUUC6Aylbf5VlWHBVJPqL8OOAWcemPyNePC47Y5HNscjpD83CVBITh92nH2zBOi3ryfXnbxcarnQtF9lqqwiPQf4N4E3wiYVs7el99NY1xpsQmpBNGSIeFOEETj0mN2bc7peuC23422TnA2zpoKR/IobMd163g1Rr5nHfRK7utvyd1A3+/OwBzvX1wRffhT3bvCYAkwxDpj3Lw+Z/tMcK+IEPFuYSz1i/bAr+Iu/++MV/NRpQCofu3/gh86f07pDAC267P03cyjaKr+xpuwVc9VUJxd7/Jdebsn5CB6RQVwvjFDBtsNL7rdVXWIu8qMR/9iGrL6jSq8kQAgY2ne4HlP3/jfo9jwDoBDoY7uVcqybpdABVMcTFEWZ2bP2TELKpSaIKjAD1+ja4BmpAloh3ZBCGynqI4lZx3q7zXVb7xVa3l4V5rMdS2sYrJhzN9cEe/4snKuzxUngiCaDBLuBEE0Lgf/9lyPqBE+7mzPWe6pi6SPyMmIQs2bYpz8UTkv1sd+jWKf3NffZJYAtGvHQkNfiBnDfj0Jhb006Dh+O85rs0RfduumXR9oKaaKRY+sazp4zo4ULsHn7EhdvCUCUGpmpmZM/AsmPhKUng6GR7/bz80MidHzD1bmAMe1GTBmLTtq6xfuMjUGwPppsu3GF909glmf3MXvPT/rXZOLhg/L5/PinoXJYmNkpDkJVeLFMmlP4L3//O9Pf7ogd8ux/92oa32jQxMTbhmm6BNyLhKfsfxlADOmaVJ+xvQpWy6IEI92r1IAPHrk+2UX9wIYUyyAEnFe+NFfj6lgYOqDX1wAVlJz6y1QHfjjBfi1qvrKvuy223hTJ6Y68lb/A6dPz0x7Xjy1Rg33epfdrhKZ63Un1e5n+1VfJ+b1c+6xzGuLKUFDEAQJd4IgaqeefY78+r13K9k9jSCb77XD61Smxrtqt+/ZzRVP7mtvsgALAgNZ6HlQAhSFx6QVPPggFOVxpsz97Cke2p67ezaYwr0rayreGH/xQyLiDjjXeGGWR7//Go/GZyx/OWjNGm56X35p35qZKTzAfsmfH8XHD/N9q1/9BQh6es8vmfnTkkWdH0leJ8/Xnkjms8/xG9YtiWfZQfkVYrffzrfz+7Ybs7lwf3HPwqO/HQ9+uGP6tqBTXQeyCROc9jHBWPCkjtUrT/B7wysDqlfagXaIfyhzxWsA1+cqwHj1GKeLAKpquijAFKe7h0Idaf1+v3Gj+Zw1s2YCKhwqwBKvnA2og5+dB+DPUf9TL/gy0XJb0AsZqqoiMJCNiYVDhepgDgdTHaolQG131jxcPfCiZd1eBTLRXAq4Du2NnBxoraRbM0G0YTxfBiUI4lwlbOEip7ujx6C0FKWlLfNKun3Pbv5P3mLex1Ps06X9pFvC+g9AYWFY/wEsNBQdQpWgYKVdOyUgAAHtENgO7drBEghLAFMsi4akgZePYbyGjP7PokCxwGKBokCxLLo+i29f/GnXR7//mp9lxrS/SEfpUXCmgCmZ+a9m5r/6zEAp0M5Y5orXMle8lrnidduNS7gZxnbjElRU8H/J771r/STR+kkiGCzoIR0I8MIvTjCA4fh/+Y2UIafYhPs2Hdjs+lJYtyQKNe/J3WM8ayiAoveTkrpKKQyM8SeVmf9qZt6r/KHM3L8jMvJQqKP3PR2LI8/2mH7Z4jvHjU6daIysWMAU7WW0KGDK9vkLbr395NEQHPvt+JL9GcyiKIrCFEvwxk28/iYCAxAQwAIClcBAeY65b7zt5R33HVF/pgFp8KsBrt8RgiBaKRRxJwjCQNRr9yWRtAXiJQ4qar37m3SY+4bhYp+598v0AddpjnBFSflHAYDF4+6Hwqs3Ms3EDi0KHh7aGYyN7zkZgBFuBwDYhmVCYaduAKZOFhtr4sarRf8BwG6P4UcIdfzinkVHr/l9gejwIw1l3ZIIpyRSgXHfgkvCQzs/0f9pfU/FeJQpYAhasWKWvduMoYfF+NGXjvjgx7XGPoD148c1T86WJ2w3LgEw5qKS6J7Dg9LTp+3b43xe1d189E2qHIBXwVSoWg5r5rxF1k9ETimU228fCWTmRoGH6VVVKj2pgqlBBatxMdPOyHjpHpU51JqYPykOVQVTVQVMTfnp+/Qu3dL/lq7+61/BX3xePeVR5jiTt2YtTv8+5f4JrrN0i/seTxUVvKOT2OB6FagO+PXtM1cvrd/1MW+zchmTXDQE0cSQcCeIVkzj/ULLtJasNb8q0vhy0T/3jbdZu0DWIdTYVFiIwcPALFBYSmYal3FPlpZqXUsZwFj1m7/xfTOW5QNaRXa+hQFBhYUAasaPh74pM+/V5ClaAZzkKQ8D0Kwmsuxl2r/ghzvCybjCNh3Y7CTBdTJvvxsfb+IPhNewWWXdalJTxaP3XBn72cfvawcxMIYn+3zOz5NRerHY87mbl7yy67XJAyeKPY0ZKQAwsleUafuhUId1S6LtpiVcfCf/5QFtPi+/UVCeD6hxveLlZ2bd8gQAqOJJSYqfC3EAqhr0wgt8/5rUFM0wryJocTpUoDtfJ7DEq2fXXM3brKpQAUVlUJ9Ms/G3KQVIT88K/no/AgKDszJrnnxStQSgXfu8te/i1Cn1zJmpD/qRwGrfs1t9JL7jzp0AeBvU5u2BGlZYiKFDa+0j5nEQz6Z8L93ZGuNqQ32g2vPEuQAJd4JorRi/0A1nPDUFC1taOK1R5uNS0BpA7ptvs8B2rMN5LEBhipL+3AspT83kD6WsXbM47n6zz1CxaDZuSTrfM/MvvceGLRqWyRisW7WWphmHuwJakFuDaUo9+RFNHyc/a82c/5xpSk/0f1ryqChBaWn8ZnRq6sYf/wE9yp/19zf1UfHczS8FpaXNGHroaLA6Y+hhG0SsGgBsNy81RpdWF2BKyU/vRl10N783+dpJYi/bzUuzdy0AkDjwGajQ56DWpM7Ew/fLgy3Z89fEAU/L8x84Z4I1pjOAyqpFT/TXGj8Zjh1pdSNEPx9cvCzLL78KqgooYCq/FMGYojIs/iQScNSk8MUGj9+rAOBwmJ30FgssgVAccChBu/bUXDcIjrPMYlEDAuBw5BUUqmdOT33gPvkQJ0UrhdvDFi6yr8iH1FHYFHc3dnNnK2+aJXetaKY4bq/yrPX9LabZ9Bh/DKkJK9HWIeFOEIR7Gqo1TGPgdq1iz1nuGjiUtb68JjHqQjqLrbw3V6F9exZ6HlMUpligWKAwKBZ5H17VJGPmnBmJ+kukWKBrSac5McYU5cXPbeK+5kv54P2aUaO0LbrXJRkmDMsNx3bTEnFPusEizutcWXUMYNaPE203vyQP8cItNagSu5pP4JYZQw6h/FBx+UbTUJzEgc8YozG+/+EzH90x82FEnje0suoYf7Cy6njBt/lxl00VB8bc3pmfX2F6KqrqvGAwbqjiplr0njGx6ysyPo3krqTkeCOwurxXX0BhClNVfUyRF+tcu4YpFsXCVIcFTKm+/nqoDqgKzjqYw8ITWHH2bF5BoXr69NQ/32dawZ5ImAoXnBa6PsfdG6lojOkbUXvPhPr7eTasb9iylQRB1AoJd4Jo9TRW3E4ULWk9mASEXBrSiaFDXbflvVWA9u0QGqpoel1Lf3z3QNFdvUaL3TLuewgKgtIWgyFjab6rXs/MfUVdVdD+pz0pQ2oA3U3upLhZzajbALNkDX640/41/+0ednHmgueNzc4hYwAF3+YBwOU/PvRtpBjQnSpnQWlp6jXHEazdz969IHGg8wsiDlJYxHk8HH7MeFRhAAq+zgEQd0UC18BJy7MAZE1L0k9t4HSsPn7WSj0H9KPH+H8TB/A5OMBwz5WxP+wuA6CF5/WikVrIHGAxMSh8Sx+NoWMnp4I8ACIja2bNgqpCVZnudedGGj7/HmPaA5cerToGVcWOmdUVVfy4DIuiqpoDHupZOBzM4WCKoioWtD/z2j3jVQeekGv/SG1QERkp4uj2Pbtdve/cSAOAzZ3T2JetTMM2cbyZJDtBNDEk3AmitdLYv9CG+HBXn7FZXDTGlHxbq3gqDSkvdXJff5MFBKB9EDqcp1gYmCHZoShzP5sNsJ2fbWEvLge4QUYJSk+DRQEQtDi9JnUmuABWJLfHfRNSPtmm6VoFTwyY+8qu1wA2eeDEmpvMc5Rld59xF0ScF5rI5EfN+ris8gsA6ITqbt3YhAlJOS9a+x4T++q9TqEWFUHBrC+7zxh8kD9WWXU8e9eCxGvdLmZY4rXP8lvWzdP5jezPFggtHncFA0PSxDht90cZAPTogUOHwHjBR5xRDwQoPcWIcVckGMOrqil+b/1ILzR580t6WNxhFI1kDEDSw5o/fsqN4a9fdhpQZ/T9Ap8kAs5XJ+S1k6oC6pYfPr2p6zCoePGL547+dtz1NQQwY0tJxk3RT6ZpF0PSk2fCcQYOB2MOpjIlOEQNDc2uqUl0nBGH8I+fm6+Du+a7fDc1J8f1ITlpxK3Bpulp7faS1j5/gvAdEu4EcW7hl+Dm4sON/6T5XDT+NmY6MWiQOMo1zS7vrQLWIZRZAhlX6hYFisJzTxm3dAgvhyLVduT+GQBgTNLrXL/ze7abssUmAJOvfSgoPR0fpgNAWMea+HgAyZMfAJD19zefu3nJ2r3rKk6VAbgm4mrZYi4/dQCbDmw2znb/fUkTJwA4WYqQv1wAoF/E1QVf53LFzGJux5dfASxje88Zg78Xo5T8sDaq61jXwYVetw1fCsC6ebocQTcd1WnB3QnDL0I4EI4//dBtQ5fv5ElmbO8BANvTZww+qI/5EmD4Vgq+cZKz1o8fE7eddLxO3qD73vjlNVW6qpD58usuT4EfwqyfJgEoOrRGz3MVthynXTOiboFqaG5FUVQWoDIVylk4lJr7Hwh6/nlmsSw5fbo6MXHK/dqKpZaPn8uVHKc4vYRh3KqokAP2/hWTcTHK+1UxyQ8vjdd+VeSWIYimhIQ7QZyjeEqbM/2cG6FBef/mdtGYlh+8moSThV1ytMvPSKj23DfeZkFB6BCqWBQwCwIsPNbO9CrjjJchN4S7BQybj/8LjA2fOTN4xQowxvW3rNf1yC4T/yfBAMwYehg4wrY8fvKVn/nWpIcfyFr59tgr7wLuyt61oLh8E4Di8o1G8qi0NIjuNfyDH9bw27L/m6MF45ETd0VCkvVJAKioyHqtALoor6w6Vlm+sbh8Y7+IqyEFxeWZ7v9lS+/zbzSNXFy+URbuCcMvErff63pEaOxRvUZGdR2L7emmw0t+eCeq61jpNDxAroKrdr5dNR4EIKf/hvzf66YOTmCK9ePH+U3bjS86H8J0l7wu2aGCITw0HEDG8swZi+YBgGIRhhwAUBQGhTGHqrL2i1+A4ywCAmqenAXHWXb2bN6atfj99ykP+Fo40gl32c9OOAfsfRTfrg71Zoni162IDUEQdYaEO0Gcq7i7vu8LLSppNWzlq8jKAhCWleVxH+clSu7rb7LAdqxDqBIQAMWiRdmVAMaYJty5WFcAKIuGZeiFw5U5W5MBgLHi7zaFD+0MAJ8/90T/OXwjAK4UgxZrsrUmJQVgvBSM7aYlDHjv4h9dLBsyzlmkivNGHR4R13h7pdgoQuYa+vtr/Wi6LWopgE0HNn9wZDXfWHb0CwBgOXFXTNPmr8+sd9hNAGxRy0wD7v+/T7JeX23d/KjrvAMsl/IbxeUbi8s3YjAAnHF8JwR9VNelkOzycVcklFVONz81nlEqXiBV7ZnY58FPf0m75hQA281LN323WV+0qF9Xfcp0uV9QviKuV7x2h+nOGU2Tq+E1bNbuSECteTK14MCK1Qf/zuYuUMFLwktnVxSogAIUvacoFgdToJxFYADOKoxbpwLb5a3+h/r771P/7FR2RsZttkmtGlpeZNZBB3tagRME0SYh4U4Q5yi+pLQ6xbB9CM83BqJWtPsi05Me8iLZXcl7axXrEMoCA7WKMRYFzMIULtkVTaPLrhjdPM3g5JM+WnUcDLlbjvXYNuuzhDRAD+8WFUHcYYr148f5QXO2PG6b+dLPxcuAfXyErJVvJ026D0DWylVGTJ3JZ/Gm8bVBXiswdtR3j+ud4FytkvG70T1HfHBkjfMAxokjQjubzmsbvgyAUOq9z78JwKhet/z8S+DYvrHZnz0L14RUT1NmsG6ezsV0WeV02/CltuFLsz+bDyDx2nkzP/wTgADlUoBZ9RxW2/Cllb8dS+sHQAvGR18qrjaw/qv2vdabv8gq42VqVKgqA1TbjUusWx7nMwkPDX/ixrk1t6pQVesnWsH4yqrnnrjGyjNgM5a/DABwwKFCBVSw20fjy68UqHAwWALAHHAw5rBAOQOLBe3a5RWsUX8/LRd9r9u3wNTrV83JYQkJdaj04pQmy6P1DRRul61lnr6Gxkkp3E4QTQIJd4I4txASwb/DkpKMERqiMaSPhCVMc3tlwG1TGE/SgSsbTXnEJygWBZYAKAovHcMUxfCya5JdkfMdGWNOYlq/Wb3SDrQDKm9+9im97LrCbr8DX+0VR+vHaTmmH729hd/nYj3rtVXGsAAAniHKI9PuYaY7xn3b8NpXYrbhy+SQuRZul04dnJ6GD9OSr/te7P9+UQd++8vfi5Pb/ZPfHotYKZnVTQweQICl15mz5fxG9mcLpJdOC3UnDpoH1ciFPeP4LkC51O2ztUUt5bYW2/ClQasLcPAQYM/Y1n3ZyHAAcZdN5OXbmR5r511dtXNp4zDDQsPdUA7GmKoVsFEVKAAccChQUTNrlrrlE3b9MAUqGHMoChwOOBhTeNmZALT7Pe/t1VPuG4+Gg38lfdfBbndocPVsfMX0r6FrgL9hT0oXEAjCOyTcCeKcw2/VDpj6EXrywTdl1E1ICo96Xd+e+/qbsz7ZwpXHzHlzg8YHQtHM64uGpGledlmyMwawoBUrmNnF7jkWrtcoZAw1F3cDGLvvPutHjxnS8+aX5KOSNhRmxY5zO20hZOOuMJ1Kcbe7R7JeX7N23zoAtr6xxuAlhsge1WukGPy1gy9VfnkMAK5DeLX07KSbxf/9DLqzXYh1W9Qy+aQRoZ0Tr32WB+MBJF6rPSq26IMq+3/5uPf5N/JXO8DSiyvsXucNKf+/bfopnJ0/Rj1N440QLV01Xa7Z2VXGGLQCM+Jx3fWu4on+T0N1aC+nB/nObroRKm+/yhTVoTKmMgXMAaYwdpZZmGoJyFvzj/fbvQtgzZ2vwRnfvxGue8qHGI+WfNjSuqE1BkYXWK/psARxLkPCnSAIwCXXjYsDfyWCpx6uvEGjv4G0sIWLnFq416l4BffGOGXTKhYeDGcMjFm4lx0KRMF1BgQtXsz3DUpfXDMzFfCedSpF1hlj993v8rBRpZHjSbXLg5f8+E5U13tMDxqKefgy0/7GPiVCVXuLwUdF3uvlUWOoGAB4v6hD0UVHvE0XAJA46Fnx/67z4Uzsf5/+LN62DV9mG74s6UHt1ch6/SHgobV7143tO0ZYa5wWEkDN+PGiayyYomtzVa8bYyh4xjTHPFfwthuXGEKeKVBRm3xXoapQFagKUx2MOVSFqWcVKArOKowpLx1YWvl/P6nn/9L5xZ7HnjggZuiaBGJKm/aypyd6RI2Qj2rGlqsUDieI5oWEO1Ffxo8fv3Xr1mHDhk2dOvWRRx657rrrmntGhBuERHAvrHUDq7Gl4S5YC80RVlrqXXa7djkNKyzU6sb0H+Bvs8ncN95m7duhw3ls29aXOnV+7Gfdja0wzRjDMOMJ7WXJWLZCM8YoDGDTyvcCWH75VSIADxjyvF/ENXGXTcm8SVQucXpUuLTlIirWzY+d/E8QIiO1Mi98T1GBMYrnmyryYa6qveBr6b1jbm4BsJYYWrCkolBT5y6TBLD/l497h91sHKI/NPurnsnXGTKUs+OFxShxpzKZXh9GxckVx7FiHICsNwrF45sObDYdMSC/9DX9j8T+Xz6+4tMqeTgAD/zWpRqKsNbM/qpHdYxTC9Sa1FTTIVAZmIuCV/kzkhS8gxlCnyH5We0TnjlvEeAq37lwd5HvDqiMwcGgKMwSwH7tqJ4+7eaV0fHYBcyZFu4Ub7ETI4hzDRLuRH1ZvXr1mjVrtm7d+vTTTzf3XAjPNGYBR615ZMP1cJUjkbzUo/vdPMTguQaaBaT/1QbFguEjsHP3SxGRTFFOzZxlY2zt3vVbcovkQ65dMOlPt/0RQHho54NLv+Ubp33z5fIrrhEK0nZjtmyJ4f8Vt4Ly82H/BQD0Wt6jet0S1XWsYfnQXcIDZt6z+4V/ZO+ab+hpyQZjhNJh0uTA3r3opN3kYWynmDozS/Pi7zZFdXMK7duilgtlz1X72r1Gg6pBnWM6/eH36qh7bcDavesqTn4m556KY3v9YRiAsKCwsX1jneawQltpDEi5K2bMRXx79KVRHxxZxdUy33JVUYoYs3fYTbgdeOsVfjc4XQulB2/ebEvRXofq4fzZ6YIbhogv+WEtAL3QpIuCFy+iygAErV4NOGrGj+cBeLWoyEifYIoRfVcZA5fv3BMvyXeHol2SYUyF8nifJ+funA2VsUCWV/iOeqpm6gP3AcZ3za3YlQV6HdJFTsTGmlI72hK0PCCIWiHhThCtGB9tr27bN8rIrRwBp47uPtLAhlR5mVFaGlZaKpfM44i8VVMMPvf1t2bpt1PKdqUPHgYWcGr2bK1uDBgUdv9733o4sZyHikOhjpqZqdYtiVwU8pKOct6q+UAFz199yJdqMJotx43nRvuvbC8RynjSd92TOx0ApOj+5kdNfhhZmgPI3jkv8TonnWcb4bT/2Cvv3HlMW8PsPFaEYygu32gbkTP2yjuBO7msH9t3jHxs9o55AKpOAsxwz8sRcf0pTNOnlLPpwObonsP158hG/RiY+nn7Ly+9vDqKAeZK57vCKgbaXWufMwAlP6wtLt/odEoVxeUbbcOXBqWl8y08Hl/ywzuAGnXRWL5Rc9eoAHhYnZ34fpPT2Jp5RtXc8K7y3aHCovICl8GL06E6HA514ZMv4OxZnD2rOs4iIMCUscovW7lt3yvsLsYFJXeID/aJSQ+HBQSwFfk+fLbc4+VvxbngnieINgMJd4Jorfh4CR7w2L5RRoua8xhkXUu8u2foUNQtGM/7UJaWwrOyEfDo+/P33c86dBAb04fcwBQFioUpegYqLx2jGBHujLvGA5hzfrGriu497o/Y8gT0UpCbK/8Z1eVuZ8nOpIKKzChdAgA4WnWs4Osc2/Clm77fHN0zCi9rki5mdBcbIJI4uSO8YP9yAHG93VVoMfIyWebOS/921fdHgyWZ7DJt24gc64dy/jETd20j3Czhep1/veP/TnXqHL7z6L9ND42VElsFIgy//8RHvTsKOY6st9aeePEJALzyuoxQ7daSadw0X9z1jC1qCt+Y9fyLAAA1+IU07tJ5Hd9HfPas4ZVXATfla0S+gRpcuEYVW4Dsz+bzSfJuVoCKocgo7Q6GoPffr7l1FKCm9zu14DN5KL3gjMp0+c5luwqG5Kl/4ftlLM2DqvKi7wpTg/+xtvqee8EYczDGoCqWvNX/aK/iCQZIdvATsbEdXbS7E7U1aWJZmSwszPs+Xqh16c6hii4E0fIh4U4QzYNru3J/cRvJ84SnWFpjB9vEYsAnb7qk1GvFnLdaUZHNLCHLlp966qn059LUNavBAhSLhSkWMJ5uyHgxmc3//ddtimX5pX3AGLp3Z7ffDsZsuGPT9x9F94wCkPkyRJQdkism6iKtdajmYme8F5L2MK8/k1hUtCR0O9/CmxyVHX2Mu19yY8cldy7RZs8ASbLrHU9xtGpe4qD5ciFJmeqZqQCe4HP4UItn8/g3gMTrFog9bSNysnc8wzfKZhi3dAj+FcEY2ydWCHdn3e9e7p/MPwa8GBL/tvxoxydefGXXa72AyQMnGoMYz8UlLO8Eq54509lJL1YstRyY3HkzOiNzRw8ABV/nmKvLG/5+tea2UTzuDrCQyX8E1FG9RkYpTHXoM3SS7wADHMZ7cUHmpKnD/rhYiYCDgalMsSgBisMRAAcDGGNnERxyat6zz7+zdurrrxqnN31VIyNNX3x/L1j5+7X1ZelOEESrgIQ7QTQDDdUn/MSgQQDYivwGmFID9UOtw0qAu9jDEqaZJDsXN0asPTISusQxlekIGz1mSWAgax/MAgJhCYTFwh74M+M12kWpR0UB2JzSGQCKb2QZn3QFQ82ECft/K+0dOgxg0T2jhFbPKO0+Y+hhxpBRHVtz221r967TY89SiB2s4OvcuCucNC6LiUlkMQDL/my+HAzn7u3MQ5dUa4mVutdF6FThUGcMJscLQ3BaGj9EP1wT02v3rnMNk3OEjj/N3FaD0RDyuqwyAbriNwlf14D9vrcruS//ZP6xrBHyvnKJRqfDbSNyzFcHGANUsQIx18Axlc9XvWt3AEBYx+TLduOodp6TK/7LN4f85QIANTNnWjdPx0ePA6rt5pdEw6moLncDWvKCLt+hR9yZ4X0HAEy94UKoas2sWUG5uVBRExcHOBQwFUwN4LXhFcaYes/4vFVrpkwYB9MHWL+iVZ/KMLWGz12TvPlt9ZF4t38rjKtthYVNX4rRe4c1giBMkHAniFZMg0h2gX3D+rqVXHRL2Ogx9g3rze5519149ZisLC3czmfi3FTS+4ly33iLTZockr0EFgssAQgIYBYFioXxgt+MQVFWH1wJxsZfMllowfcm9YkKj7V+wp0wq8LP6/xE/7nCvM4YMrd1B2M1qbdBc4wwLuCC0tIxWBtk1Ysbu4d9m2VbDEi1CAEAidc+K6wd6qefAABY8nUHINdqdImszzpxg178kNlG5Lyy67XJAyeqRUU++eadSbpfvz4QHy4d7jSO9cME05aCfcvcm+8BACVHCqO6jbONyO1e9DiqhJ9K3lmVRnaDS/BeO/Zk/jHk3wPAGq/p6cRBzimYjGnHqiqci+cIqh+Jh/aas9TP24vtgy68bWzfWOnKAwOUxGvnaSVotIkzQNXluyqZZxSoamb+q+qqVe1/3A1Uc09UzdSper1IXuKfMYU5HArYWTDGFAVKh7zCd9SaGpFxgaFDUWjU26kzvofPTV89L38uav2eNgaaZG9YYx5BtHVIuBM+ocZNAMAKVtW6J9HE1NfrEhmJiooTgwYxnionSfaGctEcLPkwzNmea5jpTTOpEyykgxLY7rH/O6Hdf3FxRspTYEZPpTmlM7g+Ljs6gx8BhqiIOzWFamhaBVrgm9XMnKUWFbGYGHBjDAOAjG8G1MTHAyxj+yXPX31w5aafulcFoKoiaWJc1utrAEj1yNeAwRa1LFgrNbNVcn243NDJ3Hkp8Hlw2ecirD554MTsHc9UBh3DILEDAATnawpsbHy8HnH3qLaf2nHoucHdtTtS8HjTgc38iH1v/QSgz/1djGE8LROYNkJW+pKkCXcDCJkSjpIESY4zXQr7sdIoWv+jmx8jpmcLqEh6QKtXk/XmP7QrErqIz945z8UYAwAdH8+E/naMvTIWwNi+sTs3/8d4IrzaDHPq0uQs3/lGXkqSsQn3/Y4Jg/a+O7Z3LOBQVQZFBVQ4IArO8BZNYAwOxrg1S1FehPIEHADsc+eE6cK9vvWXfPyyDB3q3XjWzGmpzn8EvNSP8kQdDiGI1g4Jd6J21O49tBtxE0i7NwiN8TNZh4vvQkB33LnT7vyQ75mvnhCeljB+t9YW7nPnwGtinCwyuAcg2xLAgkJCspfUzJrttCtX7QrvhKo1SdWrwcB244tcnP77hxfOsoMW9OB3uWS3fvw4H8MW85IWZddC6Xi+W9ms1Wv4vdlf9hje41JUuldFSZ99kjXoRj4VfUqsOjXVycDNALB+EVcLg7vPMK3uJLB0x8NdQwFg+uCVslReu3ddkn6bq/aI0M6JgxfIo0T3HP7Bwbf3vfVT9yoFwMm8oz1nXB3Xdzr0GpFj+8ZaNxmB84jQzlEXG8Uls1a9Ix4tObLGeIg5PW+BtWSaVhTSKeju3gCj78MAJM1KdLsPADCWeN0CQ9ZHwRa1rKTiH7wEftbra9RPPmE33KCdiCFz5yX/6XJm1A8BOLqmZvw44yKJCjBHwTe5UBF3+VSoDHAww/huOGfG9r0TAFSFe3c2H9sAYPgFMdogChTGwJgDCgLAzrLgF9PUkJDskycfHDSQubYcrqtLxPv+9j271Wfm8aqR6iPxANiKfO8aPWzhoibW7q6GH79Vu36xjorhNDjiR58dOtic8yDcQcKdIJoa11/QBinm0LDNFP3KfBWY5L5P6l8PCnq3+5uGyn39zZALw5WaUwiwwBKIAOc/ZYqWh8rbKRlNTzU1qYBh1hatXkpkmGP6NcuESUZQ8tM7AO+CZGxnDNWpKXwlkAUklWpq1br5UVuUUX+dq3ZryTRczgBk7ujJzy8Q4jWuz/Tfql8DMP2zU4Dd3VM3AuDVqTO1DXof1kP2w8ZeEmP7xh4KfZnfHhRxOzzUh7FF53TPu1vcFcp+bN/YgsLpBXv/k/l9r6UjO8Odc12muHxjcflGW7QhxbiD3BwL19+HpPu0k4bEhwMsZkzXfW//BKDPfRGyrBduH2kEIwyv7bMkTXpU4Rad4vKN/SKujus9TVftxrlv+ykQiqqa1hUM1s18waaWHX3MdtNLUBVAZYoKMLNzxqElrc7ZksznUVy+cdGwDCP0boHC4DgTGLT6LQQEMDCEsPzokVNcXzgPLhFPIlu2y3vX7qLWu49uuqYvJiMbfuqgvOU/CFTOsvGgaF0LhIQ74Qf0BW5YeIxctAitW06Yfc9uNSeHJbi3FNdyrFdjq/eR3eSS7tltqnnnSf3bN6znv7tswXzvSbFulzS5b77NQjrUJD4RnJkJxQJLALMEZLy4VP1kK7vpRq7XuX2cMYApthuywJQXP0jikwr64P2aW291GpFJDhJd0vFKgsXlm0b1Gnlw934A075uV50yXtbIWW+sEQXXC9Y+bn3kwtTP26ddc8rm3Avp+RFVidctKNi3FFoxFiB/LICst9ZC18TVAwGA7xMnnSJx8IK1+7T4t5cXypV3VrzLb7iIXyeyVr3DTS8y2dufqex0FkByp3LbwBS+BZKy59iiczrNvSMhuhu/a92UILQ731OMHDIlXBylO/4BaK/lqB8C3rv8xjfvuMLWN9Z9CD4yMnPg9WzCBOMYBi6asx5PTSqVWsyai3VqKr/kh39InWhZzXhemlN1OZ0u0PltZ+eMdUsiP2nG3qtrHnlE99twL40CBXA4oAAOBQqUACAgAJYAAAztENIh762CKffHiTO5tit2hSeKuHmgoqJBOq2K1mnNQn0m7706PkG0YUi4E7VDF8taOHVT7Rzvv52mkf1IX9MzTe17dp+Y/VTHvz1nHlmPCJqqOgqZIhYGfEkDGL5eFhyqtA+AElgz+ylYLExRmGIBY+ymG0WgHQDjxdqZwo0ws/Z00wLV/ZyU+vR+eoiXMUOxSRSXb8QfYBu+rHqMtN2thZuxtH6/A2y//SPel1TgKVlTPhhAWeWXAMqOJvSL0FwrkCR7UuGbALLufSD52nK+JQCX1zZs7WStesd+/L9hF17A72Zvd6kqo1tisrc/I2v3pAl3A+0mlh8VulzsKUffATy13fDZzzn1erLrJBgbe2VscFo6zz1NHvQdgCTx6NChbOwE12MAWEsSeD6rqShNXJ/p2j6qat08DTwMP+bquCucForWj6a7yHcGKJL3nct3x5xPEvev+S+3FQEfLWdAb6Y54FUEv7yi+pFHoPDcWQccChT2+4T7zr71Js6eZePGKWdPO0JCTNrdF7SFvSeLi+8mbw+2+NZby8W4YtnkabVtHnbooPpkCluc3twTIdxAwp0gmhrZgdqKqHNkjs2e5eVRpx/digpDu8vhfN1R8HzqLBYcwlU7AgKYosBiYUzhpR6hcI2u8EA7xP+DAaxmZqq6ahWgsFG3MYYXbv6XU7VBTckzXnMdgHXzdP6ItoPhVnf6jy1qOe+jFDdifpluYe/dcbgPSt2oxR5xXufEwQuSJtydpD8UMgVllQmy/BXR66TCQqsUwAaQ+Vmv6miPZ0lKeRxAVvoS7aS6tnZ1vcuPetnCKdi7VMxW1uXyUWIH06PL+nUHkD7yDxGAevx4TGUPAGpREQAwVtDztOlcWfc8IGlrFcDM90fyOwEBl2mbGQNU24jl5iA6L90jqkkySDuwkyuO81shj1yQse0SPn7NcOipq5rJveTHd81rNQbbTdnWLYlQAabil1+C09OrU1IAFQoDHIADUCwPPOA4exaOswAUxhxgeW8XTLkvDl6vd4lAuLxP2MpXtTarUm63777w1ivQa0VUvaRwewNCqr3FQsKdIJoBWbW3el9mZOSJiAiTldbHX1B/FwMsOERp3w5KgK7aA5gpDxXc1s5EoF2ytoPddz94Fqqeb6o9atw1sEUtBRSnbp0u8XjxqFx23bVdkXr8OIK128OeHjm+7AIASy7di9+0wHZl1bHs7c8k+fVaOBOcv6I6/hHX7Ybcz3q+5/W/uTwuLV3ArJumigciQjvzuPvJvKN8S8iU8MqqY1yRm3JqTbrcwIjynpaHTRlSA8A2OAuAumrVyW5gEyYwAF9+JQ4V581a9Y55zpI0P3PmW67djWrxuosGql5+5zLNQhPXZ7rWFRUw6fuiDZX7wy9RVUBlQcXv14y6FQyAAhXWj920s615ZMqLexZqr5yqJUjo2h28tSoUBxwWxQIHGAKAM1DaQUVo3turp9w3Hl6/+64629DoQrXX+09Hm6mh3ur/ihKEz5BwJ4i2QBOkZ4ngnxb2k/LkmC7TxUNuDbi+TNI1DCk3kTFUu0WBIlS7EpSe/uj33yy/tE/NzJnWT5O0ioE3ZssJqdYtj/MIu+3mpdrQTgpegis2AIBt+DKuzq2bH808NgJANbdHO2eyFuw3MlOtHybYRuTYRuSIoPvRYFWcJe7Kx3AlAGD7M/IIJncKL9HY/d+P9xzfES7mckF4NTsarK685PtJJwbwU5QcXg0g6uLxpj03H9xSeU2keHr6DbGmYU53gasuuLWy6q19b/0oXopRvW4pLt8oHxsyJcL5JGbD+LDJveP6Ts/e/gz0Zzdr8x+W9w4CMG1/O36VQHeuA8DJq64M+fKruAOBpdcag2jWebfeJCAg4HIAJ/N1lT9CTA/B6S/wSWUeG6G9a0BwenrydQd4AD4itHOSPs7wHjfur3Y8f/VBQH3ithS5RKTuqldHTL4SQOKAp3nVd/1hvdkqAIbg9MXVKU8CPI0VUFQ4LIqFOQAEAGcYawewDkK71wq/QPfLjOQwl4eET8bUj8yXYTWohjpBtDZIuBNEm6JBCtR4wt9VgafJiO2uLZ+cVLser30+dSYLDlHat9dVu0Xrr6QwKIr63nuPfv8NgGnf7cs0WhqxkqProiLuBFBSue7nE4qutPVAu+6NSbI+CYA3UUqaqPmPs15fw3udFvQ8jT/q8zl0CIwFp6c/P6IKQOJ1Hs1OBfuWxvWZHhHaubJKc2LYRprD8CalLge2jbtVFZVVpwFYNyWY7DGciEuuOlr5RVmns8mddmam/5I8UPO+F5dv6hdxdVzfx8SeMbFmi3Pi4L96mr8tOhfABwffkjdGXTxeCPe4vo+VVU51Oc4Q173CeDmX/7NuMicfT9vfztN5WUwMvvxKOPgFPMx/8t+B/G5W+pLIjjdWnNgSEHg5ALnXkpv5iCWJioL9yyqv+h7QdPaBLD3AHxmZNf1Jcf2k4OvcuCumuslbZUgc+AxUrVtT0sCnX9n5qgpMHvgg9uXDbodDheKYkTBZHLNs+C0148bBoSgWqIAacBZnwcCC//Xv19asnri20JfVLFswH3a76/YGLGHeIKmuBEE0ASTcCaJN0WRl3YzMsIRpnoo5eJqMvN3LNXr+UO4bb7MQJ9XOFIteqd1IRdVwqfwoAu1O0WU9jCqUetLEuKzXV0vjiP/IRzEAydcdQBUgO9RDO8f1mV5WafKCs8Tr/mot0TbKFVdcMUlPVyWas+nIxPJ2/R+47uf26n8DjsAQ+kddwt4aZZVfHK16Gqve1e7rNhguqXkpm6QJdwLI0vfJ3NVree/fp+1vh7PF1beOigjtPGJKZwCP/+963otKFHmUTTWuZO7qhbBTyT13yq8GgMz/jQQ7xAVxdWpKyeHVURePN8XpT3aLBMzCXUMKD/NLEFzQp11zar6REMEAJGU/D+CuLocBxPzUvXp8HADtvQiGGyIj5Yh+WeUXZZWP2YYv5XmrtuFLjcdU6MZ3BhWP7v4dQPVAVhM/JSjtBSis5slZiJdKZ1oUMAYFQQWFUNWasWMdYEFpaTh7Rjlz5rVrB3uuUW+G11+y5yxvPHntvSSrx6Mart0yQRC1QsKdINoEdW07Wk+MzDkpuO6pjqTIyhUSxO1Q/Lm4qvagzExmCWCKgp6X1IyPE6pduf12rNM7yUum9uLyTVFd7q7++8/8kZDJfwRguBpcsG6enmTc0yR73IHAn9t3c3TtNnngROxIS77ugOuB4aHh0K3ta/euh96qE5JT3BVbdA7XnbboHCsShPQ03YWm0dsB2PPmjqxV71o3TZUdLAIRbndCf64R52kzKf/lE1t07v6fS3KmZfKHklKmP/vUfP6Mp33dToSoE4f8FUDw+8XVt4/ieyYO+WvwivzknuZnxCP0AILT07gOd1bt+gz/uNG4fLGJF1zfpB+rAsje/jR6gq+LQqaE83UCXF7ATnPv+Hnhv+TXMGRKeOpPkR0fmAvVKBL/Yqijz30Rn1/xayKQdP/YJABASHzniNDOPezhpQGGRz/r8VQje9X02nHHvOycURUwB1QEpfMaOGpw4Zrqe8fVpM5000+KKVCUoBdegEOF6gjKzKh5cgYCAviHUAnpgF/tri+UwPh+iS3uFsn8mwXn5BlfMNvevBSg9DRDPVOWiqkTRNNAwp0g2gItLdzlqUIlWzDf0CKeii5HRvLtLrF2npCqAAoUrSUqUxgYy8x7FQp4Z6Xw8zofrTrGc1Dty1LEqLbhS10d7VmvFyQ9GAcg5JELARwKdXQPu5g/VJ2aqhYUAJg0ZgI/qHrmTLirFTNpw8nqPuALhtIfsgCU/pDFXRxuETXR5Rg8d8gIBRwyJdxDyUnYonO7/3s6qozw88m8Su2oqUb0fd+bPwI/9vnNTWicx8vFuY0uTjpFV9ijAHAhDgSXlVWnpHp6OjLVKalqUVFI1a9gTqsIW3SudaP7IL0ed3dKjR0UccfYvrHcr5948bhsLR9AcxM9clP1xKMrrgp/JDgtHbobvuMDcwHX14xVVh0v2GcUwMn5sOLnBTmAuul+raz75ogz1pJp/SKuto3IWfvVuzuPFcmH6/911e6qXsedAQpTWNK/3smMuQtQM19+Xf3XvwGV/elPUB1QwYPucCgAoAQoFosDcLdUcMKv1O36VKmS00jqj7/S380ICxehOXpCEUSrgIQ7QRANgXMzJr8OMYuG0tKw/gOeT0k1O2QsvOyjrNrlmo/8//FE/6etWxJ5VL3jYxmYdB8f1frRY8LzUPLDWgBRkfcArGfSlSIo3mdCOHCqX8TVZZsfBWCbsNxtZXetiRKQO2CYHpdlYO4rJ47qNTLq4nEFe5cW7F0a13e62Kdg71K5MIs2Se1R43QRoZ2BSqedGLIWL1WLiuxfF6Vdc+rBbwNdT3oyt5KH5IverYi5MxJ6Gqu8T8jUiJO5lQD6PHARPp9ji87l6ty6aSrKy4vLN4pVBHjc/dZRAKofic9Mt7uP7vPZxcRUA9ikueGNQVyXISqg59E6e2/Y2L53Zm9/urLqGKCKnqxZqzDzP0bZS/WTTwBkftYLQHVqClzoXqXwpNWQeGPjzws2eJgNAIy98s6K6l1Q1cRBz8pVI/X/0+W7tgJU3ut2BCqixqcmPXwfgOTCwsyX3wAw5/z3AODT92w3ZG2uXHebYoHDAUWFAwCrmTVLPXNWdZzBGUf62dOOUzXqyZPevEcSbte6slmlnpFvfzW39yZudcAI4Rdql9EohE8QMiTcCYJodOogJoZ9/uX24TdLqt1SM3MWGINigcIAWbUb9hgu35+7ecnafevH9r0TYJl/uqt9xY6UIafEyAVf55Qd/QJgxd9tsg1fljjo2eydz0LKFi07+iW/YS2ZZqrtaBuRc+LFJ8Td3j99vL/rcMCTDtSQBL3hlpZUu8eDueqNfW6zyBO1MQAoOby6uP1GXAMAud8YApMHqgv2vmTW+gC49bxfv+pbRwmVLEfoC/a+JCezgovpgdqBIgYPoDol1eZhwtnbnwaQOPivsugXz4U/Kl7niPM68wTZTQc2O5dXh3XTVM0no7043BekRna80aIeBnBV+CMIR/Kp17UDNiVM7H9f707DAWSteic4LX3qZ079WUOmhD/4TeDrl512nfnwSqffwQOZ/N0fl/XGGkDMis+PyaH3GUMO8lmFv5JsnEorGc+rzTDrJ8mAWnwDFg3LgKpmf/Ec9qVBVRP7pKgAAs5AtbB27XHmrOuLKadu2+32sLAw130g22mcQ91+9Gaq7Yvp/fsrNqqPxAMwVYYlCKJhMbskCYKoFX4ll/AR9W/Pi9vc3a4RGRk2eoxbP8BH7YNZYKDWZcli+eiX9zef+I+u2hWPqp0pYLxMu8JVOxSw+yfIqh1wrtrOALDEQfMTB80HjAxUTxTsWxquCUoAGF4Z0PuHzXK4lztklnx+u9gSdfE4t0PZovNMFRhNk8z8fhB/PLrncLE5e/vT1k1TRXWXk7mVWspmZOShUEdF1Y7s7U/L+nt/t6hBEXcMtfeYva+XKLBii86zReeZThjX93FP80keWD429++d5sRIJVqY6848Rs5TV03Zq3xLZdUxuZSNuB3dc/jJ3MqTeZUn8yrFqO5yAxjAfvgt+Iffglwvbry2522xMfna8s0RZ0w7vH75af2tZwAyHzTi8LYROXF9HgXDiewk6WxKwf7lBV+LCLf+lI0Ou9r21y+XOkYxxkSGNPQPG/9YMXa06tjR344f/e04mKJYFCiWlKdSU+c+NdP217xVa1yeL+wb1nMt3mP2U07fHV/w4SIYr9zqPWTu5IDnbVw9HMVW5JNqJ4jGhiLuBOEf2k9XYSGGDqVGfbV2gQ3rPyBMvu+uH6oTkZEfqYwFttt2400IsDCLZe5ns7nqKf7uw0XXZwFgWloqM6t2bmwXskkB101GVRAGQIm74tGySq3wn7XkUVvUcgBgTAuuMwDM1Pc0aWYin20SEBIf/uhGuMXwrH+eLlk4DJUX1/exuL5M2j9304HNx2u+0KLvDBGhndXjx2fvuxQwEhKFCB7Va+TnLu4aQZ8HLuJ5nNZNU4Pv/TMOHeLbx/a9E33vPLlqFQB26yixvylx1rppSuZ5j6zssM115JO5lTw79tBfRr/z8gbrpinSdmQVrANQcrjAUxquTPb2p12D8TKat4cB3Bm/aSpUWDdNdT5KDsOb4cb3mNiuANIPdEvpeYRv7xV2/eSBE7V4ueq6RGEF+5aWXXNqvv4CaB21VDWuNz9EnFoPvUvHZr1aADig8gdV57g7oDIoyjtf/lMLyDNAYXBYFOkZzHzjtRdUB2+qaqL2tBAAHlwuXkq+uCpyREbWapVpWGOMK2ICdUu3JYg2Dwl3giDqhZdfVv7TyzmRMLVjjgfFdu+90P2s7W79CoDy2wULAyxMUZhi0dU5A2NB6emMsZqZM02q3brlCefmSoZqlybqPpycvXNe4nULACMSL1S7aw9UvlvIlHBRdn13liF0glevAVA9fpys13XZzSB5ZoQMje45HGx42VFNmicO/mvB3pfwU3sA1Y9I1mx39Iu4WlhiPgmPBA6Kh5L/+AGv35K56zJt1lKfI44bnb15M3ocQCftnij+6PbsXLUDSHry0ZA7zOFtfk7v83fL8B43iieivXQifu2czJm9/WnpFNpjapGcWgqh2qFXwBRHLLlwqzC47D+x+cHn1hUMqUEnhMR3Tt8WxHu7AgBjJT+sjep6j2SS0bS7LWqp05RUJWmSLrv//lZS2fbMqwclz5sNIHP+c3A4xl55185PPgRjRrqqae0RFJz75qqpD5jfKe94crnYc5Ybil+v81iHeu32PbuF7xwAIiObpm0TSXaCcAsJd4KoIz6G2/1ymjYl8o+xLz/kdfCpswXzsW6ddjshAZJwlwtZ2OfOwdw56jPzxl/7PQ5uAaC5YiwB98yddg/Q++7zeRydiUC7HFkX3gSwkh/fibporEm1B7//Phiqb70NcBGTYhxdtWfvcGpomr3jGYAluTy1rFXvmLYEr17Dg9zBaenVqVoNlrV713sxwwiEjudSNbmneQsn6uK4qIvj9O1Tyiq/kEzqB+WxhaoGKrOYm4Iw1o1T3E5q0sGeyZ2+BWAbmee6T/cqxbsajwjtnDh44dq968b2jZW326LzXtn1GoR6BiA6mwLVKalZBe+qRUW8WjzcFYnnr4MtOnft3nVQcRqHRZJAeDU7qldnn9P+XV5nJryasQsvPJCh7RNial/FpI0qFpVWA0jfFnRrzG8ADNUOAIiKvJfv5qzdxX+1jUkPGcHypIfvByAWBsl/eTDz5dfhcNhueBEOhwpAdcDhAFMyspfPeGERgPTHk9mZ0zjrxuwu8OVvjtFgwSU07qrjfSUyUtPr/B9wYtAgcsUQRLNAwp0g/MOvHzzNV5OV1YoKI9Qq0P0q93Zi0CD7mTMdV/7ddUARAjSigO/qqo4pTFGeTJrOQ5L73/nlX1fcwH75xbtqBxAVOVbc5lg/mo72DEBm+ufVqanWkkeNGTAWEdo58br5nrR19o55lVXHwRByO2zR73Bl6SkvUx/T6dbYvrE7K//lZofagtH7fy7p3WlELTtJ7Hvzx+5hF3uIfGsUfLXEtY4N9Mj6rI/O53dH9RoZ1T0ue9tcscM1s++Fs+aGVJRGPmnikIXQy9hz3S/M9KbDg1fkS68CA8BiYnj2as7GwwASRl4M4ZaR4EuCgr0viRj8DwH7cRoAAgKv0MdUS975sXuY8QNXtO6Hh0Of4W2btKkOXqBdAGHYbNk+GAy63OdXYDYd2Bzd82apCiS/YuMADNsMb7ZqG/6SawF3NygMDkBRuGQHA5gDYBkzrY4zZ1NmPM73esFxduY3Xzs1KdNXuXXub+p6iOyY9zEzVW4WQaqdIJoLEu4E0Vj4nUzWaPheF1k2tzQIbEU+c9et3ZXPbx8zatq0b9jPf/3o++OPvsAUJxfBqSlT1IICMMbuu8+s2hmz3bx07d71Y6+KBWDdrKVm2oYvzd7lJMoL9usBSz2+Hh5qLpeeeN2CV3a9Vv7Lp5oPR3pQiwe7oOm/C5B5uJfJEiMQ/Y/0QzQxKlu3edlyjlvVbt00xRadJ6YkwurzhnXvXqWgquJkrlOhGK8YT6yy6jiA5IHHtfvl5cXlmyJCO4t9Jg98yN2xqttzyXH6k7mVyI0FkLV6nbGHi8YVpnlIfvqJF/TISn7KdXxeWn4SkDxQm0hAuyvO/P51QOAVYp+idT90rwqQS91Da/iaYIvOKTm8BkDUxeNE/6bidj8dHRORvuHX2V9dCqgoSatOTdVyguUK7gCYAlXlG7lqB5D92YLEa58J+csF+wqOAZjwxMitiz50mTgz/k9RVK7dFcChAopiMfabaVsEIKywsMFW+0OH8v861WsvLYW/a4AmccgQBOEdEu4E4Tc+mkZkj2kzYlwfd5YC9g3rXdO/ZHOLCfue3XK5N7d5cnWuIf1RQCACApkl8NArPwDtMCMxY4kx+L+vuBEMumQ3q3Ze62PsVbEAW7tXmrzZ1C7sDSznw4qEEZEA4vpMFw9LCamae95k706acDe/IflkGA8S89vJA7/ThLgcJPYaXLe62EJ4iDp7+1y485dzjWsbmbfo97sB7SWqDo4EtFRU28g8ACGYoiXmjpSrx7h3+btl1kfnP3+zNgHrximjeo0EENVdTp10M9SmAx8JWe807Y1TjJkwAKiOj1dXrYIKNmECNrn37ZiM7RP738ct7Ct7fG/aL6DdFeKcgyLuGN7jK1RqadDzhl6cdo1UDFQvny/Kw2scP/7lhT0AnreK4NWrq8eP1+ag+2G0dFXANnyZnJyqHj8enL4Y16FPXGcA/QApV1UFAFWFqmpD8f8yXtSdGQF4//ExAC9/T3k2eUcP3/FaxvF/IeHjHwTqukoQvkPCnSDqTtjCRd7D2C38d8ht+pd9z241J8e19alrkxdTxpsI7PmFfc/uV4ePGPCH87dPnQqLIV8Gf/hhxrJ8tWA1Y2D33Q/IlR/Nql2Y2sf2jd25+T/Q7rHEa599ZTe3Vj9UHYWjO+eBsZP5x4B2E8uPYejQLD2uXbBPz2qFe3F79yN3OqcSulsSwOO2xMF/ddXonrB6FLLS8DEx+LsmyC791QjYWjdOtY3ME6cvOVQg1HbclY/HXSmdZaO2BvDkdw8//L9KPVGVF6AsLt9oG5lnG5m36cDmD75/U+wZEdo5PDQ87srHAejbWXh1LS+Ra76sTM8bTiY6H9i7UxRikNz+n/yuLTpX+Oa1bk0MAPpG/CEr6amkCXfy3TomLRm0d93Oyg2up5AvjEz6/hIwJF+rNZaK6PBrIpB0P3deISS+s3xgwdfL466YZotaxp1Xs7/sAcA2fNmmAyXRl+i1O1WFO2GgqmCMQVVVlFSuA9SozrFQVObg2p9BUTQHjmcOlnx4fkoqJI+Kp/LtAjf2mJWv2ic95GVxDmdnPB+hQf6IefHXNfhVPoJo25BwJ4jWSuOlvbpR7Z5Vguniex1QLrts+913wxIARfuLtOWP4dtH3gqmsAkTGO+TqgjVDjAWvGY1mFIzfrys2jm9/jCk/NftAKybH40I7awVaOe7eK3R7kW1u98TAFji4IVmRe4c1/ZU/XBQxGi3atKXCXB1vqz/JdAyKb9NHthFetQQ4kerjom7IuadNH4MeGnLqV08qXYAk+wDkzvtMG3M3jY3ccjC6J7DZeHOy7eXVU7hsp6PaWrU6vLEjEf1XktIHLIwBNp89uXu6V7waNbiZa4l5zklh1ebfPOcsqNf9v5jVFbBu+IMY/vG2mvs5fZPANWty3/UDwHVqSnB+SucJ+vxnSir/KKs8lFAXVQ9JuTLL1deerhD9XfsQPUdPZ926q6qa/fsXdxbr/706zHw9c/1L0JxzNmSDKhQ1UVDF2e8lAuHA2fOtHv+OZw5g9OnT769esp947VFsg8C2nvcWs63aeEBBYIgvEDCnSD8xjCN+OAabyRaYtqrP3Xi5MAeOy8saHFWzVNPsQAl48VlUBQoCo9uayXbuTTXVLsSnJ72Xrcf/1QRGZSWXjPLuWQKw+SBk6ybt4sNmr2BMVvU8sTr5ls/NBIPshJnittxfR8rO2osV7iJ4u5H7gTQ5/4uEaGd31mRk5TyOICs9Je0Mxk7az1BE4cY3YWMCTjLemFMvyutul/E1UJHyp4WoX3fL+owYuQusT2gXW9j2I1TMMT1bGZkncr9KndPvsN76z1+9uSB39pG5tkQ70XZOz+vnwAgd0zs34x2VLnX3Vzc9cyoHwIyD4RVjzR2lse0jczjKa3ibva2uQcWfw4oqKpIyrRlJVvdnjHq4vHituwpKqv8oqxyqi06V/bsVJ35FoBmH4rOAVQ53B5T2aMaSL50p9MJXHS7S31Mxm6/Izl4/Zmz5TgfOLjloD1++sB8wxbPAFWxfvyoKFYp6rtbP30ivENn3TnD5pQ+uWhwOhiDRamZORtnT+PMadQ4FbfxuFCPjAxLmOb7srkp61xxZw48XNzjsAXzT/z4IyjhlSB8g4Q7QdSFlvMbEzZ6DCIjG6oVlKegnUhr4+F2953P9Uh8WMI0751izAQGIsAStHPX79cPhaLM2Z4KAIzZbsjSw+SGal/9bV7Z0MMAK+56KGNHD75VG4fBvSRlDEBJRWFUt3G2ETnCHiMe5jFykarISZpwNx9t31s/jZjSGWCukl1gkuyiFoqpyVHRuxXir25U97iCr5Z4ekl4J6Y/R1V72sHLgVwHc7t/xa/b5QkUfLXkbs/HDuoyemzfWFFPhgt9vqLwUb4DWLfzYMgftdvJA78F8GOgJW6cxw+DbOYBAKiJQxYCUjVJZ8+8SwBercWD5M6kY9panZoi3vqI0M5G8ZnISACH7If5vfDQ8Lg+09fuXbfz6L9P5h8DgPx7rM4uGm18pkJFwdc5ZZVfiLtcyOvaHUd/OwYA4r7C4GBgFsXicKgKWAALbJ+3ao1YXAq1zbPevZR9lHG183lX7aZUlvrjSzn2Zvxzqr2Y53wrPaIVQcKdIFoB3i6CV1SgosLvwsxuz+K1DI7HPi/O233s8ijz2M/HASweNpQxZfXhVwFIZR+VoPR0frsmZSbg6mFwo9ptUcvEdlH6I6rbODg3V7J+mMBVu0hS5DesmxKsmxKS3E/WyEZNHPxX+fxwVyvGezNRUzgcQL+Iq49WHQVYZdVxBANQ8buXAdwgzqhXUo/N3jZXnkafB7rue/MHACOmDsj86PyCnqdLww7CnMbqEREdN++fO4b/N2v8QzY8tHbvup0/aUagsk5nyzZOOfP7fn73hZiP5OOcVTtMkjprhtW82VyUxthfvoLhMu2/Wjca+t66aarbJFoTWelLoML6YYK819i+sTuP/lvcLVr/Y8yYy86c+RbA9IEr9DHNrVWdtLveTxXi/5n4zAPMAqbCojJY1Hbtn0+ZOaVk0y/paWEApPYL/Cvv3SDu1ObZ9/YLLSYq0djUmidAEC0QEu4E4Z6WWehA/MBoWaFyR0PXnX3wvNbtUbcT82U3gX3P7tcGXpfoMEqAMybST1n1a/8HAK8+nLniNb4FYEHvF5+67ba4yxPKKh8DAIaaVD0cKcfaZWXPmG3E8rV714/tG1uwb6ms6rJ3zDMC+RK8VqBMn/u7QKskmAtJGZccWc3dGppPZrAcdHcal4fPAcTcGQkg9fP2HZPdxtpZWeWXpk2yPUYeUJ6JZlMBQqZ2gamEi/PiIe7KxKNVc0ZM7VxZdQxVx5IHHsvcdXkcLk8e+I1YOYSHhvNDbCM1AbfpwGbj9TlUENVdJJWqAILT0vip+TSSxo/JWr1+bN9YIdxN/GufYX3pF3G1232yVssqSk3KsEGIeM96O67v43F9nR4o2PsSgLi+j8kHOkfotcI14nqLXOudP24bkfPKrtegIq7PRNcTD+9xoy0qFQBUh6m1alzvhLJKrWwRf8sS+z+TvXuBbnZnYKrt+uy1X/1zbO/RmqpnZ8EUxcIcqgWqytq3w++n2Ip8eKipKmeankiY6pqdQhBEG4OE+zmK2r0Hv8EOHWzOebRUmrEEu6ti9nIp3L5hvS8VJ12D326fIN9HfWYeWzDf71iUy/rBbbhdfnYsqP1LQWGP/fxf7TGFgTvaJZIfmbi8Tz9NjDNYP9aa1Niilrp3yDCIFku2ETn8OFMXT3GMc7A8AcCZ098ACAi8HHpbzUERd6Dy326P1g/UVCDXiJykuNgkAEDI1AhXq0naNaecuzj5lA8rkzhkoRhQqHYARe8eibmzm5cxrZviAfSLuLryN03NJ1/7jbxD2dEvxNHWTfFcu6+bnQYgJKELgKgeEwBkb9PcF7PKerieq5P1toSR3b3MX7wmZZVf8JRWLzsnzXiUf7qSxseKyvHGISps0Xm8Do9W555vBdbuXceXamWVLtU5neQ3AxTA4VQd0vnxyddOhAoRMgcQEt859fP2F3W5XurQpGglICF2Y7aopXyLdfN0QLV+/JjtpiUAoDpUVZvH2CvvhEOF6gCDXmHGAgVBLyzGmdPqqZrcs2fi7tB6CLh+5cUfCi8fI3+tIPUMW7TYdtEE0QYg4U4QLQjXuLV8KVxuM9541kxfPKlw/ml3ul4fGelJ6MurhbD+A079dZG6fWf6zcNZoIWxAK7ax18yuezoDNOMZgw9zBiAI/oGFHydG3eFCC4qkCwx+j6Mp6Vqkc7r5DAqAyCUK4Dg/BW4VLvNVbtgbN87d5qEuzvVzhEKUlD0bsXsCKd+pXw+2dvmJg5ZZBuZH7x6NYDkP34Af/DkONdVu3szUd1IGjea3ziZ81PWmg0A1u5dZ0TxWQ8+fubuywFtCZFwS3fXiHhAu97cLXNHHxt0C36tFHy15G774e5G6oJZd5te8OztcxMHL/T0nLUPw+C/Asje9rSzkam2mox8MaPbZm7pft9FO7fj0GFADc7Pr46PB9xrd6mFEwNTNVO7ViBS30dRmQMqlKAXnofDAdWBs2cdFgUOCwtsH7z2HdxhNP/y9SJYwjQMHVqHPxGe7Dd+FWWvT958k13tbFFXUwnCR0i4E4Qb7DnLGzZDq0FwU8LZtwZPrj/e9pzlcl12b8e67OB6Uu+VoT1iCWA338QUhTGLXu1RYYDt+qzMG5Xk+XMAZM5/zrrlCWaWoays8ouyyum24Ut55xqzCpQO0FoIfZiQufNS4NLkQQf0QZD5WS/9KWn/FardFp0rxF+vsBsATB440aQGoy4ez6ubcyZ9FV7d182zNLmuK6uO8ZG5w+Sqoz/K7YFMyax+wSPinIKvsgHEXZkI3fndq+NN5Sc+5o9yw4wvJ7JujE9y3lLwVbb8jKrj44Pz8/mNLKRaN8ZrD5iUswroth/f81wBlFV+0eeBrvJVBX10Bqhus3uFlLdF5+2s/Jf8kPyUtXxipwWGAj2u7pa1+9ZpJ1dZdM/hwHZtMk6fT027B69ZjUOH+CmSrztgzFxzuXO4agccDEyBytupqnAoUFTmsKiKAxamBAXlvfn2zOkeLwO6ZqDKfyL8lae1fp29pK/Uvyh7y2k4TRAtExLu5yjs0EH1yRS2OL25J9JyaRbJbt+w3qSn2YL52LULPihsjhyJr6Wxa+MkY3kZVlstCFONYgFTYFEAbpLhGxUwBYxlPvucc5UYYW6RVJIQ6AwA9q06yu/1uS/C7QSuOn7UJCinfvYJv1F02/1yeUH5LFqxcH2DKDpuEqfJf/wgM/0QBgJAyNSI1M/bX3TmYgDAt273F6R+3r646xm3D3nCNjI/e7sm1HqmdAaQOGQRhGjWVwtllcaWyQMnAhPX7l03tm+sVdqTM7OfLeyCC/lt06MhCV1O5vwEgIfbXVl5fTWAOLeP6fTqpC0b+FAAQqZ2sY3M954basxhahfTFlPGrVuEc8YUlbdummoU12euthnUPiuG4OL3xb3q+ClG+XboZq3OyDx0CYC/XX1QnEX78Ghxdq0rE8A/ySpjQsSrUBhTmAoFDkvKlfvV42XpL6b9/vfzwUs8SUpdZKA2YPyYX0aTL775mMRSxzU8QRA+Q8L93IVUe8vEVfjWorAjI8U+PgbgGwzJFeOjaOD75z450zLyFlgUxhTGlKCXX4aiwKKcip9iVOrjGp3huZuXvLL7DQCTr33I+tF0Yywh4hnG9r1zxAcfdq9yqgVZtP5HADFjLgL3u3+2+MvwLqN+OChU8tSjh8TOxeUbP6/8YtbnXGqz6kck8arr7ZLDq0WInSvCzF2XFXc9UxT+Pd/Iqx9y0q45lbkLfJ/kgeVeXpNbY37jN0Qlx00HNkf3jHKV12Imwn0u72Mbme/mEJ2SQ6uiuk9wZ/cHgD3/fibmaE8A1ampro+GJHQRiapxVyaK9YDzGbPjrkyUZyU/WnX6a22EHM14k7Px0M+3AGCixrmnmdcGiwjtnDjkrzyQ71bN26Lz1nponqolFl9nSixmbm0zvJGT8kPFtH2BQBnAqlO1ovWiP8CgzjFGhUd5TKZCReK186DCpaMqA4OVN2O6QV1oHwXHWXbbbXCoQTnLH91b9thqAEq7ISF8LFmpN95XXk50kfHFJ+Nlt1p30DJt3DVvJggCJNwJQkSSWlE5sNp7KNY7OazW313U9RXLe7tAiYqCYglanMEsAadmz8L//QKFgVnAGKDXlgHAGGMAY5MHTtQNCQxAzuYfJ/a/P+vOOMCQ72GX3YbtL4uzFK3/cXhlAICT+cd6Jl+VvWMeosyq7pCTeZo/JftVRysBfPl+cfWto/TxARc7O0dW6tA0utOWovCDMUcvEQ2VTMdm7rrsy/CLREheuGiie0Y57cqNPbsuB5A8UMsltW6Mv+WSP5vGFPLaVcEXl2+UjT2+IKorimFNZ3GLOLU8h8qqY9aN8fKBE/vfn8VvMQAITkvn0l1IYf1cbl46mE0vCzcd2OwaPB/Va2TJ4YKoi+MAjO0bO7ZvLA+926Jzk+Lu1CY5NQJAwb6X4vo+5mKbcdLuBXuXApg8cHrwxnQwJF9bDgAfTrONcGca0bX7ychuifZu71wcDGBsnzHa8+UdVVUjul9Qns+nX/3qL8AaADj+Y8YDD9dMnYIntMXqiv+Z1zYmX4ochm+Z7m3fbTCk2usJ/0OtUv2JtggJd+KcR3duuPpEWwK+S3D5R7HpSzo4CXrvoqF9e2YJCMpYzJRApihBaYu5PYYxFvR+cc2f/iRrdD38qTVPtQ1fmjQxDmiH8sKk0tKsv2WKUdntMXjzZbcnrKw67talMmHGqPGfX9D++60pQ2oAJA5eiI/SnPbwmtYpG+t5sLx6JCCpTB5oL+76bcS2uW7N67w7qXxIwVfZ3Ji+du+6WpNKo3sO/+D7N0wbubtdSOS1e9ft/Mm8vnKdTMyxnuL1tt2Sn106B0DcVYlxV7mcVTUUuSzE+bS9U/BVNtZsUIuKWEwM9IsAxsNaKZspXECLujHC4J61er2riB/VayS0l+JNPoRtZC4A68YpfKFSXL5R9GyyRedlb597IsvNVLWFmWrU4Jct76I9U1xfAPjT1x//6Wv0uZ8beJha9G8Eacf0+eSDW+2H/z5iEIDq1FRezH0sH1q301g/ms5v225aAqbM2fKYHqB3fssZwCzi3tE/v/B84eopPXt01L0oZl9KYaFWsl03oPtd1NXT/kOH8s6s8vaW+Qez5ePHn8qGQL3hRvbJlsY+C9GUkHAniBaKaGPuS32GBqzDINvQ/f29r5W8twrYeedBsUCxwKKAMShMy0wFakYJ1W6E2wFNz2R/Nr+y6liSeUihdVjWW2uht1iKGXOR1tsSHvV3XN/Hgv+VhsDIzF0AWHW08VD1qFHynq7VYwxLjztO5lbyG9ycLVTyqF4jo7rHOfuzmVlGM+n/dTIPDAbsADJ3Xf63Pt8CeGJ0XsmhVaN6jZS1r8gcLauMt92SD6BTh5Ou06usOma7Jd/6gRER/2nSpPN37mQxMfJGY9gvs8Xt4K+rcL5221Dwt+SLcLWXLkhllV8A2XExieLY4vKNtpH5BV9lo8d3kw5eWtDztPTcGYCkjIXi8KTxY5Jc/O7F5Rt5CyfbyLxNBzZH9xwOwGy80WPxutm9vWligbgYMOpgOh/pNFrJ4TX//OwT0VK3z/1drB8m2GKW48N3+Q65JT8AQU/v+TLrzX9AVaWSMuCGmbVfrRO3RWCeASpY+HkXAieMkyvKjMe0V3juVf3PD7Cw0aPZhHF23+o+yfiy/ncNh9v37NZSblyLyfI/Ta7G+shIX+bTMi8IEESrgIQ7QWi03uiRj5Uc6uCfcbMeiIz00vKpdoLaM0sALMqpmTOD/74STKlJmAqmMIWBKULBJ897CkDWX18AwKX82r3rTUHirL9lGjqLuWmldNfz9x3lsXZdRzoX6jaWBPw/JYdXR6Wk7tA37v+5pHenKACbDjh1+gQQvGZ19fjxco+hyqpj1o1TMs/eaxuV/8qu1zS3A5Cz8ZBrRXO5Cjtk1wfD0d+0/FqT4F55ffX4L7qFHDkiW2X4jaNVx+Kuch/tFir8lp5/ju45XBblPKYuw6Pgbg934nw32/ie8mIgc/flyQO+cd2zrPKLssr4QV2MTEftiXTC34K/7dZzNH76Xp8QAGw+uGW4u98p28g8sf4RDad01Q5RdkZ6esa9tGtOhVf3OHXJMDZhQmY6v8by9c6BbvY05qEj2420nAqGkiOFthE5wat5GRl5DcaN7HIBeDa2b+zOzf/RRtYqzGgO+H4RV2fmz4HqgMOhAnCcFSMt7N0r3WJRLUYA3hNu673U+RKcljzjWwUqT/s0de4NwdOLH4nvGBDAClY191yIBoaEO3Gu02JjP/ac5T7+4PlSyaH+xZW1WW1Y71ooU06S82KOz2aWkNA/1MyZA2aBYqmZEq8VlgEAJoLryX95kB+S9PD9WSvfTsrJArA2Siu0HvLIhQD6RVwd56zaS44UAojqNk6csbh8Ex8QZskOZzXGwG0t5eXF5RttI3Ol+Prbtui86J7DPzj4Jr8fXs1m7+sFXYqbHNgrf/nnpLTPJ6emCuFuUu1R3eMAJjS3UaDGedXhNseUTZhQ8MEy1+0cXpOx7BKpNawkzbmilYW1aRX0QpmV7+BpfJnLq3sA+L8LT5oGkQPzRZ0PZO6+vGBAhzhHLwDVt456ccOUo8GaIh7bN9bVwMO3V/y6DbxIDgAg5q5u+974AUIlA5C7L+mYmsVK+zhpd1Fo//enshkPwA8EgMxdvS5vd40j5Lxy+yeunhnT9ZaQKeEn87T11cm8oyFTwrmzq3r8eP4uOMGLPIoZQAWDbfjStXvXje0TCzjAYLtpySu7XlUdalTEnQCvKqOlrhrjFBbi2iEssF3um29PfeA+iOQcPcIt0tPlb6JrcRgvyP3X+BbT3x9RWdL3P02ug3jZoWX+KW5wR5BofOHj+1Jn2Ip81rFjo56CaBZIuBNEy8X3XzLve/pVXJkrAPWZeR09LAbcFsqspdbE6DEAWFAQAi2wKExhjClCrDOFgTEjJ1XC+tFjSaX/A/BRaWnIXy7QVPjwZSbhXbBvGbdnFJdvtI3IWbt33dgrY62bpondsrc/I7WyZ8FanBXVKTPVoqJ3lANiKBMFe5fE9X3cFp33yq7XJl87MTg/f+qO9fjpe5SWZGUsk1S705FZq9erRUVz2r3j8kq4nMD5SVdWHeMmdciVExO6hId2BlDKnF5krmjfWZnPS8JrPhNpKJezmzEZZtxuceWb4INC4q/du27nj5oEn1R0KlkXaWWdzkY9lBq3ejUOlQEILiubjcvkGLxrVZzZ+y6rHm1IdkGfP3flN9JLg1KG1IgikqYLFx5wip8X7F3SL+LquL6Pw6X2/7T97aofmWjd9Ik4Lqn0w6yhIwr2vuQahBeebwARoZ215aLKquPjs3gnJpgdMk53oWrlfbQGTJg88KGCb3MLylfE9XpE+16Y69Ig5anUtIXPMUUPujv72ZwKrcrP34M69OSI67huHY8CuP1Giz7K9RTZohJ8/eu+NyqNUWoTjS/ZibYNCXeileH7RVtCUIfiymzBfPuC+f52ofISPMuGwgICwCxgvJ6MBYpSM2s2P5vkZWeZr7yZPPkBflTqF4Yd2TZ8mbybPlE3cn9s31jDKw+AW1k2Jdiic0w7B69ZXT1u/Fhg56apbj3rXOQBqDrzTfa2uYnxC/H+eheFpB1Z1uksDmqb3Kl253RMDy75rc8Wm7bkfHAoAeaaMCdzfuJO67sn3c6l7dBfLnEdjQtxL1o8vJqJQLg4ZOX6RdP2txM6O7yazd5/2d96f2vaE8DYvrGnHQePVh0FMHXb5qnbAL0VVHBaGrobFxycnDO6dVwuGZk88JtRr00zVaWUd0gZWsNTUV2t567IiQS2kXmAKlR+WaWT3D+ZWwlUAriky2cIljdmJSFrQMSZmNhIWbuP6jUyK3pc0oS7+d1Zm/+AzemiIQBPtHAS604qXAu6O/VSVZn148cAVVVRVpkIFYBqG5ahQslYtmLGo4+IqX5c/dGNAdeanmkDGlHUHOPCVNhC8wqqbhhGeX5NgPvjS0vr0BmqGaFMXKLlQMKdaE2IKFHr+qPfjBjFLuv0ctUq2eXfs1qCZ4rCFAsYS0l5gm9YdsnlQSvyT02Z6hRuZ4wxhEz+oz6DU/N3aDeDPyiuvvU251i7ps7j+kwvq0yQtydt24zoHKGuQqaE8wdMzy/5jxuxaSP0UiQcW3TeurW2uAOBAKqjAWY0+yz4akmSvlsn658w8mLTmG7roAtSl5TuSJ/goyPFX+IOBJa6SDhPkp3PITgtLaK7cjRY81KXHFylLQ+CAVwudu73s0drtdvxnyr9/rmhl6zs/l3c+FRv8XuXdUtx1zPFXb/hhS/hoailtvJRATDudAfA6997xTiZlDocUfRuhfgddF2WCPQEYhV6YU2r9olC5me1nZmf3SXoXvB1DoC4y6fIi1BV1fdkClTHDNuz3AxzyH74ijEdUL5x30Wfqm/+zt0ynjgxaFDd+sexhATkGF8E4bQxFuR1iph4Oaq1NGwi1U60HEi4E0Sbpj6JpLUhriPzu/Y9u8VvcFj/AXJZOvuG9TWF7yghoQgMQOoMvvHR779Z1mkYAOc8UekWQz9Ll5yre3JVX33rbaYdrCVaHQzbiBzbCD1YyFjSfXcDSEKWPFupzB+qU1JFgT8+nkhF5YOP+b3nyUiwCRNM4lKul+KadQogePVqAFMLX08C4Nry0znKnjRuNIAkPURtZujQzMheAOZcoHd9khT/zRet++iZPEhOkuQB34gdarW7aPsMcBLlUT0mFJdv1C06PwHDeZi8uOuZsk7fehjGDc8NvUQbZPVoq7unJpJZ3R5eFH4gSq9r6UrBmoS4cTki4zNxyCKfmzeZHS85Gw8P73EzKjXTCxf0IVOd2u7GxEYC+DBvD7/b5/4uRet+ABAT29X7yZK2f5w1+CZPQXfrR9P1ueTFXT7FZXoMwIyEydq9oUN7Dz8B1aFbyyxw55ARi/OO/QegttCG5ojz3OeIS1Vu6mjInqwu/vjGDsHU5yIthYeIFggJd6I1Yd+wvvUWKGjw8r28fJvbIhINi+uJPL0Lnlo55r7xNgs9D4oCueFRZOSp+EfAUHJsXVTEXQDAFK7RbTe/ZP3oMQBlZytnDEbmDt0Eoptkkv58L7jkje8MwPphgibc3ZlPAGR+1gufpfFHq1NSeTMdaUyUVX5ZVvkldG8MmzAhac1rWPNa1viJpqG4sOsXcY3tysd5JN42Mm9m0c380eQ/Yt+bP8DU10k/0a0xv0HvQ5S0uJYgcVbKXP5sbNDcNSUHV0X10G6P7RubVRgLAJJGF3rddku+7D43IRvZyzqddbsPgKnsVLKY+4UXAoBX33xIQpcHvw18/TInq/2+N37gSwtX97z1g3i32r2465lizy1gAQTn51fHx1s3xQOa38ZVu7vG4PVMYmPPif3vzxo3MenJR03rW1t0blY0IBV3F6mxJ/OO8t/NonU/cO1+8qorWUwMJujmeDBATbp/LIAkZOVG/ak6Pr6kojCq6z0i6G7dPB3O2G5+CaoKqE999Lg2hvniEIPKwNjv/3ceIoy1lqseFV9AXy5LCtWu1YLUjfuNSlOqYbpIS7Q9SLgTrQz648tx/XlukOIMroPU+ZdPFvrBL7+snHGgfXsEBGS8uFT9TzEsFnb7HYwp1k+SwFhx+SbbTSLCynSHuiZeqlNS5QobSS+li9u8WDuX79qxkuI5FOoA0Of+LpmfaYMlDyzHJqcQIy/tIkLpvMNOUlysdq7S0qyMZYuCHgr59FMYrVJZWeUXcVe6KW/iEWlWosuSQBa1IQldbLfkF3yZjS+zeZ1HWe8Wl2+Uxa6XyLrWK9TdDq4Jqfbjx8O4NJfYfHAL+nfjt4VffNBFY0zDypM3qXYA3cMuHnTR7WP7xroWoIRzIRpXenW8qfzEx6aNkw5eijBsOrBZu8+M/2Rv004hVPv+j5cO+OnC6vHjAeF3YodCHd3DLgaQNX6ideMU6x3Y96ZDSHP5yowtOjd7+9MHFn/uOrfhlQGZn/USfV6zVr0DaE2WkmYab27v/RtiSnaBv3HDlwIo+Hq5PmEVQNwVCVChd2llz92UraoAVDiMvq0ZE/+SevRYWMc/OM6cxenTg/+x5tXX33xo3Vqxgy/ffS/VYD2tw1t4vZeWQ9jKV+133dncsyDOFUi4E0RbwFMvcb9+cWut8CBqQRhI5TW8nJFV/YoO50FhjClBawprJkyAImLSmk+mpPLdqC53u4+ZM/H/7iPqJzvcn6W1XmJgwCotMVT4Yf7W97vZ+y6VD+F6PXHIX/U9nUr+mQj54Qd+I3PXZbwfqomAdr3P/L6f3+7zQNd9b/7AbxiTl+C1zPFkPoATmY+lXXNKjpr3i7ga+kKirDLeKBmpI4fV5e1y5yNeZ6Y6NZXvk106x0uRGU/GlZi7urnurJVDkXArvkMSuqRvCzp16Q1swoSxnk7sDjlZ1lW1A9Aq2X+/3ZjA3uy4volJq1da/6g9x5JDBVHd47hSf+2PyEw7JOcejJjaP3HIwpJDBThUwLf0eeCi9G1BlsBucjYtJzL0OsCNcM+99gb5ruy8SkKguD37hm6Adk0je+ezAMJDNXM8GGw3L+VOd0CN6zXV+boBy8xbqXL57jgLhQEKmGPIyytuKv/6ZkCYYUQeC0ckg6KiwlzP0edqsKJkYWunCS7S8vF71LvSLkH4CAl3gmgK5F/BFvv3veMxN9rO6ZevtJRnoxqWmNJS2cvuFvVvzyMwEIoi4uhB6elQLIy3Tb0BXNv+6Y3yUzMh6sbYhi+VBLtzscXHUpJK73XaMvhmbU8GACWH10RdPE7egV144UnlKgDAd2KjUO1m5Ji9/XD2trlqyPHZ6CUe47ocb97BpbltZJ5tZB7ARMS3zwPmoeTqKJySQ6t+Phmy85pTppNrsl7Hi+C+7skkSE2TPPUrBRD5hyGVVbV4fLNL5yQOXWS7JT8E5iD9qF4jRU0bT/4WV1KG1AAb8cFGALZb8hOHLpLdO7063QQg7qqJ4sny2jXFXc8UBR8Qg4h1iygT6ZqxunXFXlSMBnDSNakAALDrvIOff7VEdKg9sPhzINbq7GW3BIpVipMVfmzfWOBlcTd30I0AXGs1eiLunqVlH2qavvK341DVayKutg1ftnbvurF9x0BV9XdNjbuMN2jS3fAKgwOMMVVVAbZgntV1cNHB1IR9w3r1mXkdfctvMa35W+xfJxm/LgU4XTzkWxqnKFkdOtwRRB0g4U4QTVFissGLJ5h+sXjKl7/VJOTfPy8WfE/OdR/J63bxRZYAMAWKcmrmLFgsQYszwLRKjhn7rsYv/ycbHmSfTNLEOP5A1htr5BKQw54eyRVP+ragUz2GmmLxQrXbonN4KLSy6tic9v8EYIvOy97+NIDEwbJqZ7boPG6PyRoJAFmrtTfLunEKqo6JKoEAUj9vLzcDghbfnQBdXBrK0oPhnmMq7+iFiNDOoe2uKP/ZTfj5/aIOt8b85rqdJ5XaPAx45tR+AAHte8sbK6uOZZfOMeLBElE9JkT1mCAi/SUHV3EPfcX/bQMQd1Vi3FXanrKFRq5Dz+V+WJDRdnXywInZpXPkqwf8KkFRZ0O1A0gcughwn30qhPgh++HuzkkFUd3jjGnk/gQAmw4fCnXoF0MUACdzK3m6wlB7j9h7rDiQD6B63HjXE2UVvAvAupFfkynP3NULwMnrr2c3XO9mWkBW2hJe0lF7aiOWQzUSqTlj+8ZqdSE1RBdVMKaqWn13vlH1+EHyLM1r/YNjfKOHDhUb5S9+i633UrdLAeoz8xo1Ux/1aE9LEH5Bwp1olTRgXmZYwrQmyF5qbLcoH7/jzp32uh3uc81m17Jo3t+FsP4DuigB7Lw/pNxih6KwHamLhmVKphdWEx8ftHhxredNemlxuz68UTwCAi7jfhIAKUNqbCN4viazjdTrP+bdDc12zLhlWXfCMK7aw0PDTUVskp58VDvR+Fih2mWqU1MBZt04JfXz9qaHjNLs3KMyUIwK6PqSq3nbyHy+veDLbC8BchPhoeFllU6qvVenm5a/ucvHw8E7lXpIVJWprDrGpbCs7F3j6zxBdmzfWMBsm7Hdkv/KrtcALHnlLdfflw8OvOHp1LzEjeto2i0pCG4bmc97J43tG+safeeJvwAAVctAyB0Dr5SGHSzdOMUWn6dljm7SSn/KZnd5DkXhB2OO9mA33CCvJ2zROXxWD3xyDOX51Y/EuzkSABAVeY+4F5yejkHGftm7eY8w9fF+c10P1IiMNASopERd/7B4WY07bffcBrVlRt9b2opC6yZrt4c190yIcwQS7kTro1UXChCtBxsQf0NQdVj2mF5n+ZfejfHdGRYQsPzKs7rhhc14THOTZ4y4jd1/f1BaOhQGsFMzU6X+SuDe3yQxSmkp+mg3z5z5Nq5Pjijcnr1D7orqhKtznQvTyqpjYC/F9X3M/VEbp3DNF5yfj57axoKvXoq78nEAadecmr/V2JkrRW6SMbp+MgAo+ucRADF3ya+F04lyPjiUcEt3WRm/suu1Ja+8BWd/efDXVdBD1cbOxUcA7Jg9B86ZphGhnZ/9546EW8xebblSpCnWboKrdgBdg09Ov+FNADyvVIhy70weONE1I5ZH6F0nIyNH6MVUnbQ7ANXlpZYKYo7qNTLKGM+d6gUevuOGTQVbAYRM7RJebdRuL/hqCS8oJKq8I/fOkKkRfIkof1SiHlxazafiYqoJTktPvrYcAD78zDYiJ3h1Ac+LBYMtSv+OqCLrlAEsY/slgJrwxU68fF8SeAcDp2kzQIUy9KFbH9y6Gw71yev+t7BfetBLS85WHH4CKvyX1623MJfAvme3l0KWbmlpcp8g6gwJd+Jcx0vAqbUg/ybVGto3LXs0m9DcOWi8DiOB7b7rVg2mAOzB8naAZu1g992nfvqpVC7G8MkUfJ3LA9Ihj1yw6GQsuz3mulmpQBnfLyDgMnn4yqpj1k3TANhG5sAJJ5ncK+zGX3/6VBNqzLxP1uJl3Cojynhz50bmrssQFpbcc0dZ5Rei46bJSC3ivtaN8Zm4fOgvl5SGfQ9geGUAgJM5P7mWad/63v+h9Ceg3cTyn3J3a4mkACYPnDjctpoflVW4AUBwfn5Bp+OuL+qO2dr7xSP6QvUC2rD88PojVHjBl9mTByZCf2XEnF1r1ACIuavbvjd+6B52cVZWzsl7RyNndJKLItdsMEB26Zy/v/GZ29+j/f/d1PuCaGMy+kvNK/PYRuaXHFolTEdSbyYOA9R2D//yflEHADF3dgMQdyBQvH1PjM5zitkzJK02r0z0LOGpWgDeeXB+i1/nydJTovmDBf+YDos6yTkv1uVQM0X/Phpze2djNxif1ZQhp+BwcB989ZSp7ec9DVVLe3X7rTf+rEVGegkWyMt+fogvK4FmLzjjl2rntLooD0G4hYQ70fpo8EIBTfAH3b5nt/pIPFB7L9I6jw9AfWZeRz+jSv6G/11feR5u9/iTf++9jxcWpqIdAMbw+mWn87aJxxi74QaRXZe9ewHAEgearx6wGC0B88PifilDan7rOWTyQHdeUobs7c9Yp4SnbwsCUPzADVHOj3f49bsO1UaXUNdwe9bqdXKH1EkAgF3nHfy2U1ehnvRa4ADQq+NNkweaq7xXp6ae2bcOP33/4LeB8B+1qMh1Y8dTHs3yJQdXXRNx9eP7zgeWetpH4NafExHaubLKzcIAwPQb3sounWPIzL17g4vSTl51lbyPa0kZoeP7/Lmr7ZYc6wfxSfpDRf88YqpUU3JwFbiR/Y0/uZ1D7wui+Sl4ZUxBWeUXgPF0JIcMrJviJV9NHgCeBiB+7cKrGYAnRufyHfhlhLgrJyaNNzt/fEF0502acLdcaqas01lA/VvwgScAl+ZK2u3qlBRAhQpMjIMrvHY7GKCO6nVL2TdSHqrCambOtN9nduT7chFSWGj4ngwwhaK1Jf3CRfDQMdRTDSuCIJoAEu5Eq6Q1xk4aSbL7RT0XPJ5q44hyDSbdIE739b9qrhjTgYuEOxfcffNOi3LHHVwM16SkqO/9Z+55/0YVA1DwTU5c74S4KxLKKnmTGq1QzI7n09Wiorjbb7eWTLN+uBWAaJVqFVU7qo5BK2YC28UmTcPKzlaiEwC8/16HHWkZ2uB8BGFrHplX8NWSssovyiq/SB4ojj3oNs+0Q3u7m9eIYWzf2J0/rX/9stO5nrNPs1LmJt072nX7nMC1yc5bquPjR6WlFZlrQgKSRC4ORLKHRz1UgDGeTuJQG4D3dv3ro5//ybcEtO/jciADMOlQLwAs5nZ8+eXUbZsBZMElluxhht4fOlp1zHpXt31v/ABgQsqfIK0ujEZRleZqNr4lCbCAdk6+IL0SPwq+WsK9T1WnvwFg3TglSdpt3rDuaS4Ff6ybpnLJ3S/ian3h5/TBqE5NMXUJ0A7UP6LCMFPyVmLMj90AVKc8CSDrtYJ2LzwJqCmDa2w3LUl6+H7tyMjIzKe1LOrFH0XAccZx5mxNf8YYU/VLVWqO6UKThiHQXRbnbrLPeaqPbpo32kQUFrbGP7YE0YYh4U4QLRd/r0ezBfOxaxcAVFS4Ws/rX5LSo0+0tnIN3auURYNfmLtzNhiKyzeWRXZ+gt3Bq8qAx9S3/JvvWXb0i7KjjwGwDV8qdhC7yT5pfU6wReeu3GD7psNhviEitHNoAC/diEERd+ys/Jf5EK3TkKZ7srfPrfV58/94arckh3uztxkV07PWbNAOleqxiPIs1oQuJiXKQ8vcTyIeyi6dg5uAKrgWdHeLyZbjXL3RKKxpOvXQboOFcI8I7SxMLOK58Cg1p/ehjfy3I+ne0SjcIBev9DQlLsrdFoYXcKt6P69DubZfdY87L8qgLqM7dag2FfPJ3va024KbQrWbU1RdyFr1TlLK4wBCbj/tqtqfuN3pO1iwf1ncFdOsJY+iK4q7fp+545LgHTuqB10H4PfUxYDD5oDT1Csqkv+emzFpiv49YACCduyoGdBPeMxYQgJytEm6KnLvk+f4uJ43/TlSn5nHFsw37+M5Tt8sNLulhyAaHBLuBNHo1P/Ho9YEUIF9w3ot/l1aaop/N0h61olBg+Dl6kFSkqcDn0x+fO4DHTyVZveEdbNW7EULVXo4aFr1Zcm6cJcTVcf2jd1Z+S+nwxhuHXQQm6YCyNx12coeByo7nZWHirvyceFl946p+2lwWlrytd847VHbUyz4MjvuqkShREWpHBkhK4WY9km5usxDJJjyEUzx+BfKjDLh4kQAiv55GEDMXRcfDVZXdv8ubrxrcNen97HPn7v2+9mSuftSXqfShBw7rzWObrsl37WfFLe8m4rM8AWVbWQ+oFo3Ttn5k5Ppn4fb5XF4ekNEaOfEwQuhX4SxbprqpN2ZG5t7VvqStXvX7ct4GUCf+7vYonMAvReqywJC75yqUX3ddc5tlzza33m9SAZWPfg6nDkDxXjluRPP7bfSS61bt/Y2Uxtmt/A/R25Uu8ifaXlx+saoCkAQzQIJd4JoXDxdyPaLBil8Cb0housvru94N/yYKxm79FXVRzFvsN30Ehgr+Ca37KjQbcw1vj62b2zFb58BSLxuQcmRNVHdtHrt1ePHZeb/ot2ONtpY2qJzbdG5kiXGW3tUEVAf1GW0JPJ8EqYFJU+jh3unuExx+cbPnUWqHK4uq/yCV1+Ru5OKrNOsWwBnT7noigoAEMmpJpgs9EsOrvrc5zKUSUlToeXX/hiScFFZp7PciB1z18Unc37k+1g/iBcFX8SqwNOAsmoXVdh9wTSy27j7pgObTVuC09J4YqibCzV88hudVmh6M92FUGGLzhMGqv0/l/TuFAXAFp276cDm6EuGm8bJ3v7MgYwveHn4onU/7ObJtAzBL6RxGW5Lzcne8QyAuN6PAij7KeHkCv5pOY4H4wBkvVbAJXtQWhpUNadv/4S9e/jgmZMT4HAAqJmZijMOOE7jzBkAYBZ5Du5Vu3C8uMhW2d7memBLk90EQQhIuBNE4yJfyPaXuuls78m79VHtHs/o4Wdertjz8eV9Fw19HEoAFIUpRrucF/csBJjCkDhwXtzlCb+dfA1grkmfOizxugXQTcPc9sADotXxj/A9src/I/bO3v60c6MlM5MO9kzu9K1p42n1kLhtssfIUs9cRPyPTvdEMDs4Px+XGNsrq45FhHaO/MOQsKDz3dY1H9s3lqdsRvWYIOequhXEYqNr4RpPSw5ZLnMjTcnBVTP7PfdC2VPytK0fxN9trzA1NuJWH9st+XwVAUAqRmk+Xebuy7luzi6dox4/PunQpcmdDOEeHhruu3CHs/jmz7pXp5tEcDo8tJ156aJPp+Ar9yXz5bcyIrRz4pCFnk7NVTsnuudwcdKSw6ujLh5ndWdq5+w6//DAX7oBCC4uThy1QPRbPfnlpUAty7zlEx6qufUWOFS9fKSiPyVFu2ClKN6O94DbALyPMr3+y/46U+eLlo1dFYAgmh4S7gTR6NRiL/GK/DPpY0ttuQxcHc7oIz5WjlsSEsqCO/TjMUK4qcP4Y9V2AAHskpIf34nqOnbywIniobF977Tv/sXQ8cyn4LcsByurjlk3TfUeNQ+vZkxzvWt4cmuYArTe4RrX0wwrq5yUk1bnZEwegF8X3lI89BIAn1d+8ThudD28V6ebAHz+jSPEm2eGuQ1LR/WYYDJ5832KsZHvL1to+vw5UkTWcz44mHBLD/6MeIlGPdLvdFIed+f1IpMHfMNl/aLTY0P2f2naVbzIsnffVcrLhnsTHdrZAXCHTPkJbeOgLmPG9o0VBSt9g5lUe3B6GoBMXLY02qmPrHbFRoUtOpffLi7/wDTW7iztnbV+mIDL8Dq+6/ezJW5ULVm8vENwzlXXii01t94qWqsySKLdwe+w4IzFr85/9gmm+qRlIyMhB+B53Rifiz8KvKv2RvKi1K1VqoAkO9HGIOFOEI2Cj0WU/R0wLCvL+w+tU6W2igp/e1T5mFtmUgBuduAX4iMjwZR+p3+Homx/dDpzFdC1SXFZx/tmWvFGv58tZX80HO3JA78dFDH6aOW3kPSiyVZRsGZaeGjnqJj52dtqzWF1Iub9X4FaFIPtlvxNBzbf8Y/tAJIHfGP9IP5kzk9A0NN7tNLvLCbmUMESSD2GAEweOJFXpDkJbI44IzI+XZX6qF4jTTLdR3jIXybhlh4RoZ0lc/nbrkdZP4i33ZJX8GU2YtofrTqKKm376m7fTnLW7f0irhbCXYj1Ub1GHkjRLkGICwiVVcf4Esi1+WtZ5Rc5Hxx69q6j8kbuMtJKp6sAEHdlovf0WdvIPNlXHrx6tbitX/kxu85dPVchU8I1a7srffvK97J3zsseqj7oiAzrNSr5rVfcHvF8vyPq+088cWsW/9BbtyYDgKouGpwGAAxQwBhjjAGqLwkwbndobD9Ma08MFZZ91PUptLRUXaJtQMKdcENFRcXq1atLS0uPHDkCYNy4cePHj49szPAt4R2/OpXW/yxhFRX1OYX4wXvxyA/KeefxjSJ0aMKCS/jWqIvudjta0kvpALIeS5E3ZpZfm9zrM21gnwV9Waezo3qNjLo4Lnv7XK4Xd1aauxSFBZ0v3WNlnc4CPxW7xNptI7U2otM3HgUg0lJH9Rr5828hdx8OhF3TqtWpqTbE8/h04tBFJm0d3XN4depwtagI+Kbon0dc/ybLkt0TPEC+/7+b9OamrPznj60fxIt4OYCQhIvEPrWmtwq5f8lDXUVvUV+cLfLIUidUJA9A5veDpY0/wdneczLnJ8CNcYhP5mjVsbirEk1O95M5PwHtJqaXyasXV4LT0jDQ04OiML/2HPtFXB03/nG/Ava26Fxt/8/Sq1NTXHeI6zNdu8Ww9qt1lVXHoKpp18A2PCYrJibpwXFizxlDDmaUdl/V88zRYFVVYd2SaLshe+1e52U/09O7mZIIB7zipuyj/1H2+lPPFtdesurrr63rhi+KvCWn6hKtGhLuhBtWr169Zs2aGTNmcLG+devWYcOGrV69etiwYc09tXMRk2Hdu6S25yxXH4nvuHOnf6fQM9V8xJMC0MYR1SEZwHQnLnOjsJP/8iAvQJ618m1Z1gevWAGgOn4KAJ7emlR6b9Zb/wAQnJZ21fHKLy+MyNx5Ka8XWT3S53n7IPE/+P5NX0YSBvfq1Hz1k09wShPu/0wx1GfuECOL0a3fQ2SaxsUk4oO1MXd1E2LXJFLlVM6CL7OT9BF2v/Sejc9H2/Nt2y35L66fimD305a7kMrM7PecWzUvVHv9qY6PxwfbTRttt+S7rWdvgrdbgksbJg7vUMuxbowf1Wsk9C6qwflOFz0GdRkN4KNntY09nzQXnyyr/AJYEpeaqv67SHT+ckXYe2Z93u1k+0/c7mOLzoGptqPEyRXHsWIcgGFzox/85zfQ+g+oNampKLTJe47tG7tzi2zI0QZ87P90e5Db/G8PtFIF2aKmbQQ4SkupUg3R9JBwJ8xs3bp1zZo1W7duFVuGDRvWrVu3GTNmyBsJV2SFzRO5UO9kULNq9/ADJl+VZivy7fU4BTyvDeSzuJ+Jc0F3BlaTmvqf306Gde5szqRz1tBJOS9mJSTxB4JXr5n60fsAcn/5xdSnM3j16quOVwK46nglb7Q06fuepoFt0bnZ259Wjx+fve/S5IHl4kxnTn8N4N97v45ZfTgxZSGvGeIl9xRAeDXzRbmyG27AppWeHvUUa4fu8z6Z8xNQnASEJHQxgtDOO8vR7rLKL8RuzqodcNfKVOClEjzPTPWdfj9bypzLaNYNua8qZ9mAS/g7a4K/Vk5tmHIMxc8XPPxl4ZcLiss32qK1PTN3XV7c9cxN988GUHKoQBz1Ye7uCaFLzGfauzf4q9XV48xNSQHD2s4znq2bpib3PIpTOzPRy/2z+zBBqyqjNwsb2zd257Gip3YeAYL4lmmr3lsed5ucVnHXPdbtH0+XhlHD+RunqlqbVRVw1GtB1TQmFvue3V6KUXqhhXhsSJQTLRMS7oSZzMzMcePGmTaOGzcuIyOjoqKCDDO+0+DlFzz9jNUzecuXU5jwpSiyfc/umrcKFAVOwXah190GvxkATN1QyO9NLduelZqKNzUf8N1T7u5epen/kHhNg1bf68acMOujPwB/AJC5qxfAqlNSAcz8TxR/tCj8+5h0zT5h3ThFaHeh2nM2Hk4YeTH8iTcbPZgkNVmdmmr9IJ5bvWVtzRMu+Ra39hi3RIR2Dm13BYDJAyd68brEXZUYXJTOCy+GJFyUvi0IQMqQGq53vch6j0/Npfeq9YN4X1T7oVAHf79O5vwUktCFL2DcVb/RiYwMGX0WcKPa3ZJVuAGAWlSU/PJStztYN8Znnn8r7HaEhd10fzyv5m7ap6zyC0CVkwEmHewJHApe41G785C3Uy5EWNjKjrsBxHmYqly69GT+MaHaASREdbXpfYJtNy/l6tx20xLVwWW6CuCJa546cfx/YZ3CcFa87E6fTJ7ZUgd7W2NXN6/n4GELF3m3ozSvtvZ+dtL9RCNBwp1wg1tLTLdu3bZu3So0fUVFBXfAAzhy5EhFRcX+/fvFnh06dGiaqbYZaq0Y03jBp0Zyvob1H4BZswFF1+haXQyjRAZY5suvJ897CkBWwhN8k1wAkXOzdeLOY0UA9q06ChdKDq+J6u60zjS5I4rCD+Lw6qiLDRFW3PVMcVejBGTBV0t4Lx7OydxKoN3E8krejkcg8iltI/OFT8bQ66r2pLLWbFDfKwLAYmLc1V0BgMqqY0mrVnbacyjhlu6yPcYV+aGQBADHAFg/+FjEzk2n4M2J1N7HRURcjl57kfsz+z0XduEFr+x6rfznj00Dmvb06o9XAdzS88/RPYcD6L5noeziqKw6Zrsl/5UPXyo/WyYfk1W4QS3SfCk2H9pLiers0jk9zQU4dAgAzpfzFhAytcsbX3WvrDoqXhyu2vtFXD3p374uG/TeXgCw8oZTZZVnAZRtSpBTVE/ma5/YrLfG8Smpnxi+ms0RZ2JGd4G+Bjj58n/x8gQAWX9/Sz6R9ZMkqCpUddHQxfoTcwB4Yd6zU+6+E/yLVlqKelvJvVC3wLlxeDNF0BspHahF+XaIcxAS7ucWavce/AY7dNDTPkKOe2fr1q0zZswwbeE3kpOT777bfaJhI2G325vydJ6wl3wo3bED6BE1gt87KD/kAt8tLCvLdTdjTC/PcUZyx1279L087+YZ7Sy1HWsv+VBNSgZwyZ49/MfYNGF7yYfiKfPJKKcdv9ScZAEWZgmEosASAAYoChQLzyt95olUxoD/HQcYFGDwdXh7pRgh6aXF9gkPceHuluLyjf1DRshbZHd38sByACjfWFy+0Xpt4WsHXqz8zU2Gpf2/xwHM7Lfote9eBCr5xpyNhxNGdue3I0I73xY+4bbw+/jOM/vZiss3juo1kh/I6bJyJYDkgd8gEABmHh/kac5F/zyCysKJaDex/Kdnl//92eXA5s0vhP3H0/6uTLw0id8QHU97BgwGUPBldmXVMQTjaPCZiNBwSB4b76rd/vP/nt24PgkIucDpIesH8RGhnSdemqyfzqOjRiTCPru8r/24+yLlblNXn+13HIMGweWQzN2Xyw2beMXM2fsvA+A0/nWD4L40CwCs7PEdgElqd/t/j8sa/89XHooI7YwqJ5leVvlF8kCEV7PZ+3r9NGIE/uv+Wfx/e+ceF1Wd/vHPGbyA2Ta6pVSYZdaqXbzkBbeLqGXSL20zAbVyu6hgJQFCtViWprMpBoSaKNbaVbms7ZplWSpWLqSm0sXcMtMcC7VytpBBYc7398f3nO85c+bMMMAAAzzvl9sezpzLd87cPt/nPM/n4YfxZtfjOPmz8rzeeEm38uS+quLotd/rt7wl+nT61fMB+f1vt2x6p1z8HJ/65WeAMZ4fr0uJKTj8jzFh/wdWLdfIqKmWT1fwD7tVd0xrwszDz/1df5ZL77mXLxx+/TVtPOoHWcrOqvVTLz7Rngc3bvnE3wB4GwD8/nay6pbr/d2ufKkOGOj7uzeABMnPkMBqtTb3EIhGgYR7G4XNTpWeX+LtUbt7prIpvFyVL5eUlJSWlk6bpnTAufjii5vyK8PhcATnN5Q+g8XPEV66bHn9vMNEMMyv0zSENf8AADWEph+wZ6689Tzrkyf/ZqnshlMWW+TzCAlBSIgECSFcuPMkGoskSbzMFBLSP3ok40FFPFa+9DNKS58pLbW+XgRg/Zn3FEvr6Gib2oMJwPsn8+P6aTnBzunTuQ/3rGveRTUAtGv/JwCLP58DaCk6tlGrcnY+CUAfbk88fwGgdC1dfc9D+Gmj2CHknJ3nhmlpMLHnu3m0G8L8AN4/vjYxciF3nvGR3GK94AIA+X1+7I9rLujUf1SvEbWGnMVeetPGaVHTYcyEYYmRC9M/rN173nrB+c/MVO72VEZEZGev1I+hvOLE+8ffjLs60fvAWNrnHQ1jA9DrBuchP8omn9nyTvak+8SfwvQmeeA3eu3+6LhV3LzFmZZmdTu5SfpN1qGhzmnT07coKT1rwsvjzj8fmoeMeq7Rq+DRSEu64ALn7WlWt0A+A5Cz86nyihNctdtGrWx3IgyVykZx/R4uK09Qn7771AcAsPjLpwBsHoL+v4asuTw87s5lAFus7C3HdY3DPzUPyi5/PB9gSqqMrPONYbD+8Y+Qq+WaGlRXy+3bmX6r8JUmH0bDxvyDXEd8fI9pJZu6ARiL1/37GtSS45+c49cOHuj7VRtOWmv6Tf0I2p8hovVBwp0wYponY7fbS0pKkpOTxZqIiAiR72632+12+5AhQ5poiC0EHy5m3mhxjr9iwKZ59uv3/xsXAEo9Hd+OMUmSGMCYe0MlNddEXdBrQY4UHZ2+bSYAbPu3qPZTyvVU8vcvBxCXmgYA779rOubo45el7DmRceyhxHtf9Ey1zy5QXjK7zrjd/utHzxZ/BCxaHP0xPHumAuiFrL1Xbup+yLBatIDVu8To02Pc1fAXo3qN0Ns1dkq4kF+HjGvP8DWiIZFBRntT1babVwHwLd/1FaJHHD/4M3NQqaUGwFdGu4petcN7Fn7+lzlxaWkAVLd7AMgu2pj/lbZ91p4rlaVre5q8RuYw2+hVXdPH8qoG+Od6CUDkyXA8Tdx7DT99L+thvXKsFB0NdZJZ1tUFxsqKZ9qiXtRvvHfxP/esWwcmS3GTwFjSO28ByIq+A4Dtz9npOx4FEHvpfXDJTIbSgVXpqKqlukFNc3dr5qDScMHqZ9qJdc0ryM5Wlm8f57uRs9dzNSxB3Fu/aqUbBvkzEi0ZEu5tDFVq+wi3Dx8+PDMz01CfWlJSEhERQXaQdcWxby/LzZUSvDZFF5vV7/ieyaN+dlet62ENaI3E1TX6WYrY68431u75WQ26GjSeEOpgjEHy6Iqace2ZebuU5fTimYBb59ScXXPF8n07OuI/q53Tp4nm82Xlbv1xbKNWQtc0Z8yxdrdEnwaweesMvatMzqdPCtE2+MLbxfLNl9393n+fEpt5U4TJA7/RTwPKyr+Iu9p0Q6A2RavX7q/9+TwANi/dQ73tDkC0Qa05oxSftOvYF9yq/OpE1JZNrh9D987d9NH9/uHXlJV/rt8449oz8/7j/wAxpvfo7KJJbNOmgh7f6gs6DUPSp8pw1u/f8PXrxwCjR5Gy/aBvwMPtY8ZgS6FYH3dVonj/Ze25AkDyoG/LK06kb5lRWdYTpaXGqgYGbjoE9c1TV3J2zi2vOJFxLQP+bUM0gJqab9u1u0LbwmPKI8VNAmQwJN0/RXk6RUVZea+AYeHwLMfPJ/kujP+Pyfoj+PMFUm/VXtdvJ8d9f7Wqwt1AQyYPdS3A9Rx2AIv4CaIZIeHetpB2fFLrNjExMYWFhcOHD09JSeFKndu6Z2ZmNv4AWyG1qvaAoI9s1dpdNSB4NhI/NXiwYX383ZNXv7LyrOVcWCwMTPKMzzIYYt62Ectf3vOa5Uf7zAMdVva/DJDe+L8+4Dnu7kH68M7dtm36FXa73fo1JOyCkXbtrxzTe7QoS81y3fWG/O3dX1bqtyk+kh/V05sXiMKoXiPe+6+ynBR7exIAoFN87bFkAdejtpvzDO7sPrYUa64Nvybq0kmmhu51h6n/ZTmlT+oPxdszGRCjVfO51cyQq2fpe5FyiW9wqIS7db3hKUddOqn48LrN7begHL7bmnLCO3fjk41q+bDhCXk2Rl0z3BnnXkPsP7273PDAoKn5X7l5RIopn7CUgWINOUPdQKlJzdk5F2bU1HwLT+2uPgVtidV6D0OfOeN1U9NmDv6UrtY6Y/exgX6NVu/uHjivv2oXeTgNsMGpxy1QgghCSLgTJhQUFGRmZnKxbrfbuZRvm0aQLahndVPGk0x/vz2lPIDpf0j5rf0Z6wXdAQCyLlbqodnVNQ8Mmhq2VbsjxK2v9duFd+6WOGT+wJTxPcvbAZaeFYd29OiVv/0Zz7Nz1a4IrxBklfXeFH44+vhl2gaqas//aml5xYnKleUAOsWHT+g3fvdPG9VRYXH0R1D8IpUkjdwtRxJG9zTKaPU5KbkcubdnF20Uxi8+9LqhEFOPoQjSh2r3dIDhtOvYp+bMgXYd+wy+aNyEfuOh1LCaWPS4wwwLIlQP93i8N/Mc/pBhwNxzpi7ZOID7HKDvPRd//foxAG+teVfJONdrdIay8i+4lBfr07dMF9ntWdBLZ5adkp4Uq1Q1GEz9PTnwS3GfrlFiX88NtCfLtA3cjCP5iaJeBEP69ocAgDHbCHM7S48TMRFvh8x8CHcAvJkDm/t0FzOpWmvkW2zgTanXKqANOt7Hlk1J8IyEIOoNCXfCHINjTNsk+Dvk6ds8SYDXxuCNZsdWu+Ga7AKTAVkLKOrkevoniZBgu3GZYSdnaipblw8J0uTJAHr/YTiABwZNfXnf69Aljgueijy/zHXEsNI9Q0aCajKz+eJvbaNUicYASXFw//qNH/m8onJlefboWmTc1AFTfh19H8wyZ2q1ZrfdnOdpvGgg98MjCTcrnjbeDEwMx/Tx6OL/+xhA+ofTd//4NoD+4deIh4TNZa2Ydi2tK9wp0jf6WQEn/cPp3Z3S68WdhgC3RKPvPRcDwIfThR1n1qGhcDie6/vt8VBzOStqUpMHfWsbvQpbZghBrGXIuLu8Dw6/fUK/cSLcDkCn2pGz8yn4ZNPbPwJ44voed1eHlor3PGNZu3phVwbvLcAdTnu+Pzvb9nz6Rw/zEeUk9pnV/0n18yJDS5FBaEaG7KpBdbUz6VHfZ+dI8+c55s/Tvsd0uebWoiJERPj+WjPNlW8avH1lBef3MEE0JSTcCaJlo2/zZKrL6xGJr4O+Ly2t5Ra8S1Zr6USeBsBkSCHpnyRyPZ3+8SxJ4t1nFFmfvv1hXAhIQLGmbtOLS/QJx9HjLqrM0wc468CBX7f16Tqy9u20oyvK60hnJVfhrdj7+IIhJcM2Km/EvgUoVzL7w/LyHselyZcZw+QPDJqaU/pfEaDlDior+pwFcN+4OUkTbwc6TD34k+9UeN/tSw13A7Ye2m66WdzViccr3OLi/X8NKQ+Tc0rn8Di3fkrAK0e5ghfymhu0wz30njTxdgBJHtn8/sTaTbcRzbDu/bb9a1dU6x9KirkdQPzoS57Yf8Vzfb+ttW1W8asPZR2/QnnT7MkIv8k8+2h3+cbd5Ru1v9WjFv9QYHjDebakrcw7zn9eS/75U/abY9ptW68exG1HpaFYRW0uXowBCFVcvNRPk8+Iux7+8bTePg5+2IUpu3iJx9e7GWoDoUg5QQhIuBNEG0ULv9UWeGvI8R8Dnkx9TPN+MaoNTROnf/SIqt2Zx4Mm29tG5maPVP6Ky3i+tKtxAAd+1Sc2YEzv0f967A2+nJ1votr73n0RT5XJLtjwwsZ4AN+/qiTGiIz2vndfrDVdUtFr95xP5yBlYVKsahzpcMA9Eya8czeuicf0Hv3qvrXiIJVXX/1XQIqO9mxBZeBK56UzD3QA4ExLK6vNW4bLa75emLF0ci+7MMhWZTJQccKQcC8OXlY+3TMoLrJi+Pokdb3+1kHD4VXFgvQtmsNM+qeH+95d3f/XkHMv+jPU2zK20Xkv73nl4Cm32p7NF9dsvvgbXqUKv21kOIoppO+Zov7BiRMND665/Mh9310Cd9+k0IzFGOKxM5PBxAdHVgLwMgOTmcvF9E6RteGPr4vnNjxXHu5ZcBTzJojmhYQ70abRi1d4llK1hDBPrWkwjVGS5di315owU98X0wcLDh9a0i2c5+aG5uU9VKbWzK1+Nf0TffZF7RHE/P3LIUlxfR82rD8hb6mpPgNg8a1bhbeMXrUDbMTRi93PJYlFkRWTPRrgaRVhuPfb9p7bf/3GsZ7vJGRn5po0TwUAlFecyPl0Dgo2QkL+Vzn3bTpjSF7Xq1s9S7t8wiPcUnQ0XlKSnk1LUb8JO5w8UNHT+nC4aa65qbvipn8djf5LD8/1puR/mdOQJBmu2j3VP4Cs74eK7j+mKf6GNJ6/jbkC2FfL+fr1e+AqJZMq59M5ABKHLUjfYijKZwCSB31r3NdzACHhZa5ydQ+33f2kU5ePbJii7sfA50W/WAF0mfU87lULoxkyP+0Jhqq02YqDu3qDSiTKVMVM7Jibi5rqqvvvw+mK+Hsm+zkGk4yXyEg/7VlMC1cIgmhGSLgTBADwm8iN1zO8kfAzDSYgT8owQ3DkrjBp8mJmRvlkj0utauzwoV/KtQcYs92Qk77jUdXdXVmd/1+9JbZb1L2s/AtIEvY/fN+vA5zTFQmYNHkCEPrUvtAO9/8PmqO2GpjXsmskLDU9qjmvXVG9cqt+BQOknhUWVNiTYm9PV2Pwnjnu5RUnlJUSkmsLdNpuzuOx6vKKE+kfTucCN7tIzdDwXvcZEMb0Hm2Q+7qovPIEy8q/OF4xp3vn7vrNPCce14ZfU67Lxe+UcKHIaTHNvx/Te3QylO1v7nUPDpkId0Pyvf28H1Fh3Ca7cCNPlel798V8l7irAN3rkr6l9hZUenjeS3nFiaw9vQEkD9IG7G2XxKHzkybdCSAJ6JV8DcBuejJ693GtjYAtagW3NP163fGeFRZgM7Zvzn4tP/vVfACheXk4dcrLsWXtVhVjzmkPoqYaZ8+Gvvmm9cPNfOYcqK8szQomoN+B9SuwaVnfwwTRlJBwJ4KURupv18poSDSdF7ZK8+dZBwys9QdbH7Qz6vXISGWD0lLozCj58fP+1JdV1wBuKTAKDJBguz4HFgmQJIvkKajDO3djJ38+HsaydvVKHqK1N0ru/Rm2fQZg4Zk7/H7GDHV0RnpxwKXqYhXMekLpx5k4bGHOp3NMTWbqjei9ag218rpST4SGtt2cxw1M3Lbcvz/riNGyxp9wuz7Fhc8rDBv0D7/meMVxPki9ju/d9UYAB3/9mKt2fSGsfjN9xe2oXiM+PPS6eBam2yuPjs57ec+rbtXJDNkFGwFAVer5X+XEXWV+iyBrzxUAM8TaDbc1Eocu4D6PyYMOcu2uj7AnDp0vylWzPuvtTEsFwHbs0G/AI+s64a6v8dChrqiaPo29uRaAFKdYlyZv+jeArFtvV7bj817IkNmwlatQ/uPeytM4dJBvXGu4wZG7giema3gpTWlUudwQJ0eCIAQk3IlgpMn624laKx5xb4lhHk/3dAM+Il76wlb4YxHjH/oyOJbah6nNYhhY5uNPssJCSBbLlCnehG3clQll5Q/zh8p/P4EwCYCm2hm76ExEGRQPmYKeh0Q73z4X3Kc7jMnBs5coKShK+rsk5ex8Ur9B4rAFAIR1YOqwKvFQeOduGdeemFei/QmP9OjEYQuNAXjv2t23D4yAi1R9XFy4OsIjE4av1wv3sq6u5K7fZMkxzjFjsm9GWEbG1eXHACVT/F+pilz2p8WpAZE/Y5DXvbp2iLp0UvqHvjxzPOGzDvG8xEp+cD4ZeGDgVNXe8WPwJKU6FiXzDk2C8M7d+Cv+wsZ4UdKaXzQTXcGrHYDy5IGK54xoCOCJdP31WKoamKpD0pr7MgbAFrUCQM/3kkxKURmkSZPAAMhMxoRHp6DCAiC5qCgz92XNjkkGd2dispzIvCa4C42uV8n6Zb3JTEv8xiOINg4JdyKoaYK4e8CDQI3nveh2FvXK+CPZDbt4pbTUW+hdBO08G5hzre+WOaMzr4i/Z/Lil9eAMcgyQhgYk+LiYAnhxjIAFF0iSUyGZGFgEiTYRixfv/9tALtPvi/Eb9a3g5zTp4ctyYBk2aTqzLLyLzpN7wbANir3gdri2/n7lwKSmoCx1tvmeuPt3l1ugKqe07fM6BQfrijxihM8u11NpFaMxkXKu1Dw4ed0g2RSAWlaSOpt5P94/TO+EP2XHlzdJq1bAyDfvTmrN88W55gxfOHq8mMAPth0jqHKU8TX40dfMqjissoePaRJk2zeD+hjqFGXTtJfQG/6XiAsWQyq3Xgi5paVVJn7E3JvV2LtQP5X2gSmf/jVABt84e2qEz8iHZfGHWpvUO1Q52nQWdZA1OaKE/16Q/bEe9W/GADbqJVhGRnGgao3c8IyFvMFZ1qa2EX8N/u5LDCwHTukP3vrQs1M/mIMjMlMhiwrHyXdeY3fYH5bx/hDw7/NGm5EYzoVIYg2Cwl3IqhpcdkyTdAFScSzfd+RMN4c98PiTfzkm97UFmtEjo3JcTyz3hNmYuBAuGoQEgKZwcLAWOjixZLFAosEyVL12GP53+aVnz4OSBYJiYOeCc3IgCRNgVSVljoBd6Rvf4hLZZ7U7kxNgyTZJGnroe1f/rLFf0sQnSG3VLmqHECnGeEG7X7gl219/jhS130JD392RiTT20avWr9/w+6fNqpRdAZIQrK7ncs97p44dGH61jp38dQzolz5ruZCNikpgb9YJUXolHBh7643Grztx/Qere+3ygP2+jZGBkRWzKCKywB0slicXrbkA+DKlWtTT4eZCf3Ge0vsgXvJKR+nYQN98o+yyl3NikT8pNjbsws2Gq72q/vWAmtto1eJFzHuUHvTitL0LTNM3fq7O7W3Raeun2DrJ9BqJwDAmZYalrEEPTW3nOwlS3mae7zdDmDlwOFhBQXO2Nj0bTMBEXQXfZcYtr+u9l0Sxo6mQXSmOj8y3guh9P775cKCay69xPMDaMDbRN3/XPZA+bj7L7jN5wkBnYoQREuHhDsRjLTcG7jB2VX7VEK8lJDgYwP+y+rDM87wg1qraNAoLR172vlpzMUSkxmTIYdIEuNCRpIBC1Pc3CUAvD5VVtpDSghbvdo5bbptxIuQAEkvsRkgjeo1YlSvEenbEtzWM0mnxc3zVLhqB/D1mz/2nXKRfpM+f1RsIm2jV4UVFODIEcARlpEhsqLVjG0GSMVH8qN6xolT8NA7dNF38aemLOuV8s490ZXlTz7MvuFmwwa9unYwrOFqmAvf9A+ni+nNvTHnsJMn+fLXrx8TjWwf629bXJYO1VFeHMe0F5LYICwjQ2h3AFsPbdd3RfUWldeXnHqqdn20Piwjg+ttNXpdB0OX/K+WqqKcOUdj/f4N+MnERib/q6Vx/WYZVj76f7mdwuKXlIbqcqXcThyWtxoAjhwJy1jC09y9oA+3I2f3M4nXPSMeO/C/T/qcd4N+E+4n0/PqP28//Mkjd4y5f+A9OkdIGZAhy0x24dYx0t0mljKGubqPqEfwf8H6TtujGDzRliHhThABxltAuqmHoea0OPbt9VMuOvbt5bbNXXbvrmer84gIz/DYTeeElbpkSebZMjKYBJnBIgOWlD8fA5MgcYXNGJNCMzKEmgRgLr4ZAMZtOqBPJva+hy8Y+l94DYBFZaf21GFfFtWTe/kxg2+JIQCs/zP8nG6Jwxfmf5kjxOvgi8b5CE570qkq3wajcN98cIu37qp62a0sh5ls9up32WI5/tPt+BQoeJWb23i2Vl3T8zuRTxKu2rfbbs4zdEU98PPWPuePAjBkdhKAD3DO3x4cBaBaPmw4oF7ru10NvVpm2p+d4i/8+o1j4Lb6pk8bKCv/oqx8hm204inU9RztFkLWnivETIxvBsA2atWG9baaPldN6Dc+fWs8mFuFgzvsuYs+w0V4Yv/lYlXY4iVum1itzthYfdNT9wMAQJ/zbtBsH9Vwe/LTf4PdPgLtvli5NXPFPerGjPG4O5NRXR1vptoBLTLtTZeLLwQ/E2BMfdybHTb3aYrBE20ZEu4EEXgCq9qNPox+B5nqEVdTfqH9aNdifsaNb4tfei1+X1qKkaPRvr3IlqlKS2Xvb+60fz8ARWjrFXP/a52nTgGQJqvhWDUGr9tIU0Pp2xJ02t0gvU2UeKcZ3StXHQfQd8pFfM2659/nPSxv+tf47AIl4uuMjTVJZdaRvmW6bfQqnovvJ4nDFkLWxl6Z+xOwCnr/R35knZDN/zInSYw84UIAxYfXITsXomK1Lv2DvGGacTTwkbF7l73HrWP06LPAxY7Cy1LAVTt3XOEiOE7NYi8rny720u9i+JNnpXevlB5lxulQ37svDu/czTZsIZS6ApaUuVA0FlAbZikX2jCzMnVwD1uSEYd2ydZ3dpe/4yG13SYQOTvn8pz45OsOZn0mbGfklQOHA4DVquZWMTDYRry49dD2L3/dCoCH220jlq3/Sl+GqxzcrBGqKtYZY9xbRpYjFy+2LpgP90+3oSuqqSurvibV80zeaGLJLmIHki7c3gT3B3hSUEBK8wmisSHhThAtBsPtYz/DZobfpHrbKvtZYab90uuj764axlwiW+ZveyeFWCNwPdfrEoDunS94fEsYF9lVY26RYKk14wWMifyZ4qOFUT1i1K1MEmZ0Ce4A0GlGd9uoldhqlj7EAEmVeqqHN89u52KLB2gFE/qNE7nUvhF1q3FXJQrlyklatyZ70n2e5Zv5X+Zg/36D5QuPr4d37sZz1kXLUrh7s3grBhX0vediAGN6j/68/Asf6r9OjUWhKzblSNdff4tzDV8u+9Ck5aovGAAUr7dj/W3pdyv9swZfOM5Qxso1/cDDR0dov2iaCtbn3ghU0xh0ildMY+J3fQwgfhc6zQh3fzoXJA591tsArz7x0y4GAMnXfadu301YUaYXJ/CB8Ox2ZWBMlOEyJc7OhF8ky3rm78nTRC0stPR3mUFm8jvv7Ks+e5O30ah4qvYWRK1ThYCnI5LNDtGyIOFOEC2SOoTNuL16XX6TtLiXH63O/TGRnDFl0qq33pbaqdkygKudPaQmovu53Y+fPtn9nG6PDniyaoCkGLqL3RTvd0ld1v4PDLaRK9KLH+IbRvWI0Z9OaZ4qKQWFQrWHd+6mF2G2USsNgl47rzthGRkTRJq1/kRaKFeCR1aJoamqYOuh7TVnDwAAzhMrPfuebvrXUeDogZ6jk7uaNCcyRXQ51YtjIfHhRc3rjdhtN+dd2/XVt3PWAYj+Sw9viSimeIbPPdPcTTu5CrQLqL4EX79xjN8MqVz5E4+je5jPmESq9ZMHfakxR+/H79mbdtMGe/R44ffPyitOmL9JdCS9sGjg4R+jx13kNipdbo+W3a6PqzMxeMZ0y1l5r0CWmSyn/PeLzCv6gTEm88pUhjE3J5YYusB64N6sQMy39TWpDbR5aXZIXhNtGRLuBBEY9JHswN541X5x635Ag8uN/6Y3ft4iVxz3dbMI8Zvq2Pg2P93/UpKtAKrPokOH1LQ0ALNxHu9yerzihPPV34D/Za02HFh2z3RHWGEBJDhj4/QrbVErXt77mmaowgAJOTvnCn2f7h5T9wgeKypK5MxAArbOsI0ycRoReOZ8i0PFXTXLEI/XU3xkHYConpNG9Rrx3n91D0REZMfeh0814W67Oe/O+27rWdEOwIjy7ckDvZqsG7Qy73L6+MdW6KZ1vCcrP6xQ0mJHkR8vHnpg0NS31kwF4L9q9xZH7/rEGOFX40l3p3TZ2UvjDrV3pqbxqHnZT9qF5T2ter6TYGJ8ruAm2aPv6AEwXpBqaL8kjPn58vfluVD7ACQOXbB+/793l7/jefTwzhd4u9tw78H2U7/twIeQlDaLZ6VX5p3gzqTK0ExyX9xz9oXVo/ZfKG6PjKXMfBBACpD5wnIm8zyZGpw9a9pEzGDSqlWpqne9+Lxd/9k0fV4EQQQ/JNwJIsBY17xSjyC3b0x7HPpTN2a4rez/XWbrgoWozY6T5eb6eBQi19/hAICa6tS3/yUeGho6+bOKjw+sd3CBnjxtatbqV8EQujoPsJyJn65PkAlbouSah+Wtck5Xwp+K0R4AaE6IOqVuSJjx+iTcguUMkFD8Q75t1CrePpOz5tJD+Gpp3FVG+xE9ttGr9MrMEG4XKdrHK04crzge0fWmQ8+XKY+JhCK+twQAPa2XeBOswtQluWI6gNwPj0Dn51heceLq8tOmOwoO/LzVU8GLaL02ZvWh8M7dIv4wDGprp/DO3S49dk7ped/7Pktl7k9Ah6kHf9oeXsN7tfKTHq9Qcnue+PoKvuWGf9rEvQfb6Dx+rcorTqRvmX6qR8d5du0h9djadT7wyzb9Sm8Oj/rt/9RFP5dgE/qNd1Q5rn0M9x+/YE7Hf4n1iUOf9RZr7ztj6S1beRoMq9ykWfqotRbMXLVrK1l68cN8KbzzBbMGPKX5zzAAkN99V9tNZpBdkF1ydQ2rqalVc7uJ+DZZxFnXbECK3xMtCxLuBBFgTh061KVJTuRnUNzws+TPr5SW9OnTKl5KSEDuSs99TW0rZkyZhI+2i82mHA39zGoUN6F5q1P6fg5I0keP2G5aBljUbBkVJaNACisoQDfUhol2D1uS4UxNM24GKa7fI2Xl8cpfDFsPbddvUdbVhfIvgKVxV83yFlbnlay2NH5BJC3qv8UYFPfcl2+jCVMZ2Vm5STGKC6TeecZ2cx72aiWzXBwDGFF+jOesczxbLGnnUuT4WmUCMNDzISPlFSfKK97W/8k6aJeVy3ERdA/v3K37D794HkSkr3C7zLCCAuCIu1+iCRnXnnngC8VxJefTOd07dwcgZlBqHJ3pM15yPn1SdFbS8/UbPwLo+U5h9vMvYo3u5hXDAwOVuZ8N0elb4wFmG7UyZ+dT+sHz4/Nnka6qdgCdos9Wun0QhVEMbFEr1u//Nxi6nldtWnyqOkDqwu1MBmNSdDQ2FKlbyGAyXC6ccXr1k/H2uZ44EUVF3nZp9TRB/z7/0WZTEycGz6iIlggJd4IIDKcGD+YLwWbl3hidXPX34k+FhwPoUl6u9W9a84r+7NbISJ7ks3jUzdLpKrRv38lZJZXtfd4S/s4FFz1U8Q2ArFVrAIi4Y+XLp/DyFADZr6wDA2OMe7w7p00HY8Y4uq5KVWAblZu+NQFgNdXftmt/JYArT18y84DR79w2aiWA9K3xPLYa3rnboczPgTegK1s0kP/VUh9XJqygIPmPH/Ll8M7dI84d6m3LTvEXVq78CZoFinsTVgalLaiECWqo20DNmQP6LHnBLdGns74fGt75sL5olS8kTbw9iZ894cJN3Q5Fn+gl9oq72lgy6yeiuxM/y5CXVmG/25yBh9t5xo5tdJ5izR4TC49ZjSl91bJUVJxQn9HSuKtm5Xz6pJD8+pyW8ooTOZ8+CV1jVAC2Uat6rhwPgN/HEC+ujQFA0qQ7+J/Z6/6lb7QkeK3w9C3RysFto3LTtyToZxu9kq9OHDI/KWdxUs7i7FlpXIgfcHzUx3rjhL7j07c/hJNs87cf8o5LOZ89oxWqQl1g2n8ZY4CcuWwVXC4m16CmBi5ZrqlhbrljGnpLGeMs/ck5II0YBLjlKBYV+Q6IEIRvSLgTRGBwq+MMyi/lhsefFL3ubtbexW537Nurd5B03PdXa3a2tltpqZI1VFOD2IlpTz3JV7/Y43JY2Iu9/nTt778NeTJ918K/V02bhk8e1evypLeLssdNrEpLFXkzSffG8oV4oNO0CwBwxZO06+PsoTfpPd1FlLSm+pt27a/8n+UocHnydQexNR7AB5vO2ZWRqXtyDEDi0GcBRcO99xnGXuf29OOummUwFvQsbYwvep1nV3SKD3fzHleTQLhYB9Ap/kIh2Tn8UOlbpuvTbIoPr4vqOck2SkkgSf9gui0tLywvL/mynTgDbyRfthMVyrLaNApJS9zi0HrV7o2svVfqXdsFj45bJcLzfNg5pXOUIteeQE98sOkcNzMc9TIo2t30XIeGOqdPLz6ybkzv0d5s6QX5X+WUe/hUCtQrqabNuAe7tx4q1o9KqHbTg3Ayrj0DIHfrUQC/joRt1IqcnXP1G9w54y+osABIKr2rV9JV6kNrbSNeFDH44mPrf/1fyP3b9/590MUAbDcuZUq4nQnnR8bvLvCkdsiMdz+Qa3C2Kv5+f6dVwfn90/QET2A72KI5RIuGhDtBtBhM7ZkbekyzOlrPpkuALl/Wj8RZ3oWqi/tv1Ywpcave0iLHDx397sWevZUaVKWvu2S74YWthz4ClGLV7NvvAhR7mfTtjwBI0h3QFrUCQPq2mZWrTwJIQnb2m+uVx1St1q7dFdwnXrrggjWXuaVlh+3a6RwyNGx1HjQFq0m8sYO0pHPPclXuoqiFtEevwqG8+A+McXH77zt1qevMNjoPK5UEmE3/Php9Rw+PK6eR/5XSp2nzwS1c7Cqif+XtN82bgR/RrkOfTgleC0MFZeVf8FC63jDRdnNe5c/rAACKZY03v5f7jly+vHd3AA8MmiqsJ03PqDdevGXsaW8JMMVH1kX1NDZMBZDcaye27PTxRACoRcCP+L7v4bGHGx8eftNHco4n/cOvSdt06IXtR3tWdACAyXdmv7n+8eJzkwf7Z5Spnutf/z6C0lIg9Kl9v3R6oCuEatfyhfifMhiDzJgsQ3ZBluVqF6up8TxwnRzZ3Xb0WcHiediWNRMIztGafiUSRD0g4U4QQOPkkwQWxb8lO7veI/T8nbYmzKy1jrbe4sDzJ8q6YCF69RZ/Lr96gCSF4LffPj/3D9f+/psan5ZG9bop6+Uoti5fmjxZUvPU04sfdm/ApKF399OTOGQ+JF6uyrh2j5u4vEznM+McMjRsSUbyoIP8T542k73uX2xdPgBArXrUZTQIonrGfa7LVk/fMgO9EB8ZKXoA8Vgvz9lQd2YmKrI2crccSRhtNGa55a2c3cMuU44qa8nxL+959VTV/35xfm56qOi/9LDdnMd27JCuvx6ANGkSAHyoxbbFHIAnvYj+U5pvjzcYEocuBLD7mDJ14X6X7Tr0AZC158oVfc5+0+kwf+i4LlAtSlE9MVjBGC6dvtIg69AQ5/TphpshYmCC7PwNAONdUaHLud/R4/KyrjUAUodVhe98SjUM1fYsK/9iV0bu9ZPu9HEB+k4Or8xTnpf7TRjGM2QA4Kssj6GJmlQeblcdZhgDZCbLSrj9TKWP7HYASEryf0rvu4JFy4IjAo00f56juTtqE60AEu5EC6OxFbY/ruRNj/82jp7U9UL54/Fs6nLjdeuICOF08Zh+/S+/IKQdQizOiEt2Tp4iyQwWBkiQAJlJk+LAGIMkSXprSNbpwfMX/nQTAGnKJK7IM649M08N1CZNmcAXROjdNipX7Ukk5X+13DYqd+uh7SN3/rQrYzIAodr1SJPiAMmGSTzx3TZqpbC4UULvXsxqslPS2aZNAKToaL4mcdiCl/e8Cp32zS7YkJTy0BHHD77D7QDirkosmXc7N2bpBDd1+3eu2gHo0sRto/N4kaVYo0/LEcOe41yDD9dAl/jO4R1S9SudaWls06alXT5BqZJ8nzh0oV5n8wlD/lc5cVcpdjQGr0zeLMk5Gvf5l85uILxzN54PI/blaT+8OPWDTefwlV/+ydgbVRme230SUQCqrUoc+izAvuwenmp8GzBoZRIAkORTtQOwjXhxePcXoSs+rnEdBPSmkCx7ZlJSqXKrYeENS7WaVB5lV0Yog8mQGZNdkF1wueQaF6sxpioZaNEdlwiCqBMk3ImWRJuNBgW+WaCqzo32z6LA1DQGXxc/BOEtc/j116z6B5KSMv54vtS+Y2hWNiyyJFvCLr2sipecMgZJBiyieWTWy2/y9bYRy3M+mwdJ6RsPSJDBhX54526dpinH5jkzAJLWv5k9YQoX3Eon0a3xAMrKE2yjc9ELtXXV4dJtJVQzSmfqYwDSt3m1aecIyS7wDFdnZ76YvmWGm/ujOzyZhM8B9HSKvzDt844837pWvn7jmMEL3zYqb/2XGzTlqrTtVP9k6hodb/WoLv/phNgg59M5hrR+xX+9fLptdJ7I7QEw9k8LRvUaAbPEGKHylVGNznt5z6sHT32s/snVNjPNYufHLyufYRu96svuF119/Mcvu1+U3GtXbRdDSUcJW5KRhd75varHT0gXKt6Zmgb1zcClvGHnTRuOid9KMSF0pqWpPvcMMksvnqnfRVHtwO9s27nSyKQNhdnjJoIhe83apNwX3EfFmyuh4/ubq265GYyvVLPbmQtVzsczFiFjEcwcotjcpyU1iOs7qCG6L7mt9IhTGL4TvB2tNeGjupcgghAS7gQB6LsJBl+4nRNITxizFt9s7tOG5HWtz6IQBJ7JNj7D88rBuY+7WHnfX9k//yVZ2kN2QbYwSX74my/xzZeZU6elbH0na8ztyS+9qNucO8owMCnxOn7bgWliV9HuJmRPmKIewKCN2YFftvf54wjD9lyje8DCVq+++vhPAJCWnHp/L+9i25ziI/lRPeN8biLGbzyoFB2Nfyw3rNSrds/SWACPbbpRXTxXv95bUoptdB53s+neuTuPnXvLQV+/f4Mupz8PcDPN1Kt2AFy18zNuPrilf/g1/cOvMUh2APzpPzDoXuBe9U8GICl2fBIA794+AJxpaTuVuc23phvk718a1+8RcYHFRCjuUHunuzrXvfoMQPEPhQCiLomxjcpd/9WGvVnjR0z2FnFnkH2lP50rjUyaGgcgqagoe81atuldnkyVXFqa9dJrqrm7HJqRwZgcumdP1ewUXbhdlmtc0GW3e9aXS2apF9bbxxk+kvqPPMTXnd2uFY7r0H8nmB6/CQj+3EWCaC5IuBMtCcfGtxuvWTd1EzTFmjDTsW8vy82VEhKMDwk1sGCh3i5azIKgu6puP8BVVaxd+6rZsxHSPjUtCfbvAaRwQVNUhMhI3UkYGNwSZphwdpcAgLHEwc/w5QOOj7Jfv8nTGtKg3Qe+tBPYheuMUpn7dqspztrOX3YPv/p4+ZfdPTxSPM5jcCHk+RubD24J79zN4CyeteeK5EFucrN3l+sPnuLd7CXezdQ2Oi+7YKM+E8agvBOHLfSRfzIp+pIx9nZQtb5+S5HerT8OF+W8jFWUw07oN373T14/F6N6jfjw+9f5sqk/vUCNlHNLGU+l67YmKdPYs1UMWMwchqQm71qSpdzf2PKW2Cxx6AJ95yz9gaXoaHz1JcCe6/udpOWyGzcV6TGbD26xjcyd0G8cwP6yaHL/9Z90efQF4y6qardFrRBBd9uI5SJDhu3Y4ba93s1dyW9n3PAUspYtw1xquP1M1Yy7J/FwewDx89alP6q9UdxmE2bWvhFBtFVIuBMtDJLXDUcE0fW/tfpsHH2UXXnUQ7XXgk/nmRl3T1pVtF4KaQeLiTd11gMJyXb7EccPcY+MiFNSaCQ1kUaIZUU7H3B83KfLjUn3xPC1naatFcdxC6Iz2Ebl5uycC+C5ft89sf/yrM965/eqLu16hD+ev3+Z4peyNV6/Y3Kv3erRUuMgtccGALvL31GOOXpV/v6lQrOWV5yoXFkOjIfPUDGANbeFolwd5+hVQ1KTgb0A75qkaLviI2v1ke/8r3J6d7lRpJR4YhDx9x2+HEDyoG88t1Ss4n3yde5DfRP0tz5w947juz0MJG2j84qPrDtecUIv3L0ZPgIwL/X1TtaeKwAYJjkAbok+3b94blzUfDCINreJQ3WzI4ayn74o+0mtUgAA5kxNVVKkKk7k718W1+8Rr4Nh2v9xKZ985McRbhUUhlg7s0W9qCasa+u3XVidrG3CMDYaBa9r55BlMMZkWSlIlRlkmckuMDXcXl2t/yT6TlQzdFPWG0Z5fqINpq7wr7jFbfsFC1tHZ1b6TSFaFiTcCaJV4WcAzPRR/UpN3PuRO+R4co7VS4NG64CBjuJtnuvZmbNy+w4WV4jnQ0Pm/C3stkqgC8q/KK9Y8Oigp3QJM4AkiQj6Y9tubWe5HFibpO67aeNP0beroXFDYyamxmvDsCn8cHT5pXGH2n0fKkndLkgcOj9/vzEpxYAuJ147pg9TwsqV5XrtnhQ7ni/wlf1/DUFX9chbZnyAc67/4TsAlSsNil+rpjxecTxxWCIwVQj09C3TB184zhAR50YuAJIHfZO158qsPVeiZ09nbKxe1uuj+PlfmbtADvr9MmzevOlPv0IX8M7acyVfcI42HkqgvzOgd4YxPB0fiBrfTl9+6WOzMld52ZYZQrUDSN86wzZypW3kSgD5+5fp5hIsf/8yADqlrh+S6Tqmf7wy74T7z6VRtWt7uXVIZaMuG9HpgQL+2EIGMGS99Jqa2s7FugygavZsyC7IjMk1s1OUhKLFf0t3C7dHRPD/99GQQXSTEHnbIhOG/1coe0NUW7t75l91fr3NpvzBkbui8e6sEkRLh4Q7QbROGm76Xuu9b4PQ10f7aiX+7kmrCtcjpN2Sxc9LlnZo106yWGAJCc18/trff1M0t9A3FqgJMwwMSRv/mT1uIk+YqZG/a2e53MtJmCrxPZJaLrgAVVY4HE/s74X9knMI4vo9XFau3FUIy8hwpqV5H7tb5o1bioiX3PdZv14PuFk0lod51IF6YEiOL684nr5lmm30KtvolelbZvCT+chjAVB59dVSdHT6lunY8gHUQLheaq/fv0GMnz+a8+kcdvLkE19fASA5pBAHAaB75+5xVyXio4yrjx/7svvFYnf9ocb0Hh3VMy4pZSbeSUj/P76O5Xw6RyjgMcfaRR+/TCh+3/AcGGd0tLCkrB3zGQEPmYtJ1zLxQFy/R0wD7baRuQbV7kn6VrcbUKaxduXtx2C7aRkY74cKQNbe1ZDBDSCZDMiQGWMyk7U3xmPbtjriYgynVmxhi4qgNiSuE+Lj6chdUW/xzXI9msu6pbcFAJLsBOENEu5EQ2HX3xBpt5fcNaG5BxIAWlNFVNM7xBl6x9YqC9iZM3L79paQdgzyk5/OhmT574aKo6EX6Td5dMCTiu2Gqt2T758MXur3yjqxXfarBXc+NBGACLfbolYo2fBMApgh8T1q7NPIWy3Owv+T9fNoHFEyZ5JSldBskl0xNuk0o7t+YADCO3dvj0uAL/SrO80I//rNH3tWWHjgvHeXGx4YNNVTfR4P0xReeOduwGnxp2qrUismojK8c3foEsE7/f57sk5bh23e7BwzxvdBE4ct9KaVrz5+jP9315IsgOnbLQEsqmdsUqaSO+Fx3wAAyrq60j7/EYtsux5PB+Du0e4VZQalC9tzk0ddIjszlddl5W4zpZpqnjJ0jUib8ZIeYyLZs3ZfDiiXNGvcxDndtwvzIqV3r3fVzk+07ce3oi78C5jw8WFK8QaD2m5JBpPhqoGsOT+KLBc2bbqjpqbLmn+YXiJTPM1hTLYxve1W22SgUWPtBEHUCgl3okGwuEmw2yOA5/+53vHUU809nAYRtBVRdZpO8J95P8PejYo2WndXGUH8PZNX5RchpB3PX69aWwlYelaUf3J++POfXHTmscdgsajpLrwNE1fhCklvF2HcJkjI/+/K/P+uwItF6dsfAs+JF6FvpZJV4sexjcwV653Tp4VlLAHgTEvlCssZExOWsQQSNoUfjv/smGG0mzYcix5/MTz8Z3aXbzRE2h+de++I/7CFJ9QOR2ayMnfLD1MHTOn0x08AJA5bkNp56b3/dgFIHVZlLMysC907dztecVycco20RX/65JACbCkQo+WKWRezV7Z0pqUqKxS5zOKuegRQSie/7H6RKKvUHzx9y4wkXGoYT+KwBUKgK3OVkyfDCgqcsbH6HeFbvptdQNuoVTofdAWe0nPg122v7ltbuUqZcf1l8ZTNB7e0a38ltFQZXxntpo+vHDg8efB3YMwWNQnFmpdObvGxhKiL07fPtN30IoD07Q/z/W03Leeq/cBvn7yydy2AzQc/tN2Qo4xZZu6p7dy4XWayjBpXxvyF8ub345dphbDS6jzJ4YC7aNYrbNOviDpFH+oTqpg40fHkHNOydVNaU1jEk0ujRvKFVvnsiKCChDtBBDX1sK6vk2r3kS/bBLDqs3JNR0tIO7doZd++VZPvlpgMGUr1qiSByYAFkpZIkD1uIqDvqKrqGAbbSF3COkPYksVcrTofe0y/XlOoQNILi484fhgZ3bW84qRpxsuIS2+wjXoifWu81pUJ4AtqJoay2+aDWzbznPAtWwF0r5JeP95p5ZAbwePHW2ZUriwHOuBgUSWQXbDhwC/bysq/KBumnUsfjTYoWm5cw1d6dh1qL/Usr/Dl7qI8c7cFBuCx/gv5ggi3O9PSDAL2y+4XgdeJmvYoBTr1P1yp9I01F+IZ155J+7zj1RX/q9V33ThSHelbZ/D14iXgtpi2USsB5mYpAwB4Yf7rI2f0N/RDFYaP6jrGixzi+j3sedLkwd8B4G/R9OKZtqgVWD1RN0gGIH37Q9qg1Vh7+kcPM/2UgOFARUmfTsMgPGQ01e5iLlfqpzuWDBzEqpx61W6OLjUlsN0t6ppc7q9qb9UtOFr3syOCDRLuRIOQ8texnpc29ygCQ7BVRDXBLWn/82UbSd/H3zNl1Zv5HV96CX/W5NLOmDgwmcEiSQxMTp4/F8CKzl0ACZIUdn8XLpH/LmpPlbA6bCOWqx6RgCSHZTyvnUlia3odgc5IREsIkaT4Pf8B0BPYZrf3nRyuj+tnr3uLbXoP7p2Vvn7zp57vPgIge4mWM62KQjMzSoary3+85bbTnpLXtOWnIOfTJx//6Dy+7ExLy/n0ScX6ZssMvaYX63f/tFG/+32He+GwiSVL//BrePNRcfbFZcqLm4Ur+IJ7JowyAADeVDsnu0DZy9TAPu3zjgB2PTAdwOALbzeMVsNDOis9UBlzLzkFlPx1BuHa7hXdzQFh+PjtFtuoXIDl7JyrumEmaLdlAAD5Xy//em05gL6TtFyp7NcL2dp1AJsT/pHxLKpSz/8m16Da0z+ZBQbgzTGXjwIw4vzbFNXO5Nn5b3B/99SiokWpbvUVyofUEE3Xf1q9WLvUI8Jt2uFBWaN61GjVLM034SeItgwJd6KhSEcOFxYWlpSUtOxEGQBBI9kBsLlPG1cFuvzLf4S+b4y7wDOmxL328ssZ73Ve9scOaNfuzBNPQJYlCaG7d1YNi0x5NY/rkpmwr+hz7brLqgEoUp3p9DVD3J/ixUP5B1YAuA8yYEkeckg7WfkXZeXxtpG57m4znnFd1ml6NxHQlaLHAij+oUA83LPCggo7gKSi17Mn3iPW80RqnpVhruD9QC/l2cmTgCLchTr3Hy61bR7Tg7LyL3jzUc9dkgd9yx0YJ/Qb71VYuyOsY4T5jDCwN5wi9f5efMLgSfqWGYo690T/Au3fL9x4+GPispaVfxHXT3ug04zuX7/5E4C+Uy40MebUJHUtr0rJs1t4A4HK1Sc7TbvAFrVCKbaYFAcGbBfCnQG44n8XgeH+cekAi+09Y99Ps/j67ud0e3TAnPSPE3mUffPBLWBs8zcfLByWoaS264i/ZwrMsC5YWMsHMClJhH5PDRrktm/D0lQMgr4emXiN2oKj2XFsfPvUE3+zdujQXP2qiDYFCXeCCEb0rupNAA/geXZNgukUwgy9abSfiCj+rNAOSysqYLFAAnO5pBApdPESWKTQj7aj+x+1HWQ26VC7nd24JOaNmZjtpmXucXdJJC0kD0bW7ss8z5u+LcE2MnfThUcARP/UU/9Q38nhWZ/15svOUSwpLRFAdsbS9G1KjNa0Wakertq56F+/f8OEfuOHLH4OF2DXY3+D6m3SaYaiJMPP7QafR3uicjSg1Mv6qdpvvuzuD79/w7BS33FJfxzb6FUDE28DEH1HhLa11eqc7rWvk6B/+DXtpZ4T+o3XHzn/q6V6ae5jwlDLxEBfJwoAOPBr8cAtJ+47chkOI7/X2fET0j01N2+hJehpvQSAbZSbZWf6lgRxAqjRd/31yf96OYC4vg8DMjy8fw44Pupz3g1C99tGLAfw8p5XPs9+FwDwC4DscYzJWhqSzkaGgTFXyNGQmgjlITW1fckdd6WWlhpPZqC01LdX46lDh7qI6LtOuPv5EYaXDg+BolVKdoH0xOOS1drcoyDaBCTcCSIoMG01yqZN77JbaQBUD+s335h4upndc/dnCuFpAl1rao0+iu/Y+Hbl629KnTpbOoZCdoUWFjJZlmABWObUaSlC0FjPAyTbDakv73ntgcF/BWTAwhgLy8jg2r0qLQ0Sj6Eq0e7kwd+bOkKmb0vARQCw+eLvACQP7gagf/g1WTs6AP/j2ySlJfILkjT5zvTp3QFAMqpnHm7Xl6uGLckAgD0ZztS0Cf3GJ036C19/y9YZtlGrXt7z6kGHrpUmg23kKnVIZikoVqswuhGMOe/aqMFuOSG8LSufJwDwFO76vq1CTOd8+uShHZ1Q3g4613nb6FWejo08Mwdqhj3HNHZeVv7FfV8V4I+ej+hQ9bZt1Kqcne63ETz0ujKArfEAXv0jyzrSG0DcofZO9SH9VEp/KFGcmlT0RvbEu/nBc3bOFcfP+qx38nUH+fK14dck9ogBkL4tgafiHP/9qcTB8wBkv16UdI+S0V65+mT2azfoovXKwgMDpwLvak+Cq3buIcOf0YmToXmrbA9mMyaDsTklyStLfo0f1oUxF3O5QleuRE310vCL7n3vHXEQk0w5ux12u6d210S2TqBL8+dhzx7PK1krAZHs9ZjGEwThJyTcCSI4MBXNq/McjXZCKSEBuStr367uv+W1ptZ4GvjE3zNl1RvrZIvFIknOu+4Ky8xiEiRZgixnvrgagGSxQLLAIoHhgUH3vrDnWS7FHz/YT8mZ4cqc6ZxkBJ5rtIcYJKkyjwu+LdlvrhfTAMN2AMCk/uHXlB3/gltDGuxlDIR9sLmyxuW+jh10fAKIsSJx6LNimmEbqTUS4o9n7bkC/eFMTVM2VwW3QbULRPCb5670D7/Gc5uthzRHlPKKE9sP20eovwJ+21AaMabpHznSvZOk97v0RtiSDNbnJMLUv01ylgDFd9Lr0fy5EZH/FS88fcjtOOanM1mfdfeDyW+8pD4KgIUtWcIYqtJS07c/xA+ZJLbmbZKYDMB2fc76/f+2fPXFpEPtIP/aMW9V1YMPgjHna78DHaYePL1kkAy5Br+cZGfOypUVfLpr6EjKP0T+VLwY5tgiBCABp378EXUsW9dTp28AbRp/+7jWHWUniGaBhDtBtF2UoH55eaAKYQ0xNm9xd33zF7HNjLsnrVpXwCySZJGcKSlS+xBIIRK3tbZYIMuwALIFFoBJxyuOAxIk4HAoJAtjTILERbBtxPLQjCWvXPFDWVe58qWf+VmyXy2ABTm7nwGkxMHz0ot1MwedUEt6LDF7sdJJNFtC0mSlO4FtVC7A/9Rs3XN2PpU4dL7XrkvA0j/+J9n8EeWMOTufUrU7oA8e8xXnWZ03j9HHp7W93c9p8ETncfGy8i9K5rm1a+Ub6OPxT8RHl8z7QByEN1EyHTE/xeALby+v2Fi5shwAVo4Xpah6DLWwtlGr1u/fsLtczYpRs8rZpnfB2BNfX77m0u/LuroApG+N182FtBdlQr/xu8uVULQzNY1vCbeNfdGpy8c1dm7izhKHzs/ZORdA4pD5yVDSn7o7peivz3P2AHRe7Dzc7jkYgIWtXs0YAPbRmzaoXQey17wpv7sJjEnRY8FkcetgQp9xoW9/DVlmAGQZjIWu1IadWvLxkkFDWU0Nc1Y+CgYzgW6Qv97C2L6z2P2X7K3btJEgWgEk3AmizaFPy5FW50FvDl2vX2tve3nLltFH3PXbzJgUu6povSRZ0B6zkxXRm5mTCwlMskhK7oFFla2qrft5f4BkcU6fLqmR9aq01Dig7KOHxZGTNhRkj49NvO4ZHk23Ra2AMJaRAJz0HGT61oT06d2gqnYjWlmjUHUSAKh5rskh/0SFtrkXlcmKf8j/13qlfDbnz9oD/cOvcY5SE811ujFn55NwT30xjsrrPEIdiVpLCiDuqlnZBbPEn5sPbjlecULkwPBpQP5XS4WRy4R+40e+/4E4lKGiNLxzt8c/Os9NuDOAYULf8Xe/81/lb6vVOYoByJH/jb544mt911u3UlFeDRx1SSzcr55og+ou9GEblas1NGXIXvsWP1rNZiX1p3O7E2BIHDI/LCMDxRkYrA7baXHeNUZV226E5a0CmHPadGzfrI1SEeVsjL3dexdBCcLLkMaOVaS/SPjhbVBV1V41bRpkGad+FYdact0w1JxFlTORuQA4npxjLSoyDgIAcLh4m9V7CnWgelD4zoavazNmCrcTRGNAwp0ggoImjW/pbsT7+ZNvXbAQHkJcBMsNj9b1xrp+e+aski0hj72jhXIZkyUZsIDBIklcXVnAGMBbMgFA1bQHwRRBJUmAJOV8Nk+vw7LHxwJqwrGSNqM1acp+oyjp8SQA2YsU/2xRjQqde2CSbtiVeceB49lrAUCbSADJvXbrn53Wb3VrfHjnblMHTO7TNUpIz/KKE+UHt6BUieKXX6tsXFP9Tcn8ckCRyNnr/q2ORNkx/6ulcf10KeZMNwyGxKELDHbmf/v08N+HXSq2FGr7wC/b+nQdCQM+klwYuiQtRYlWkKqciAFA4pAFi9iTYrrS3Sk9+n+56uFY8iAlodyG6elb4xEGgK259NB9hy9L7nrQcJ6cnU/xmw+bD27xGVlnxmmV8gRX8KXiHwrbtbuipuZbAP93xTwAbNMmwyHiJizlCvvOhAl3qraP6cUzs3ZdxmugwzIysm2Z4rpUTX8wdHEGgJShh/nKhTcsU2YdOtUeumgRAMiyMzUVjIHJkF3csn15eA/mqsbV16DmrOx03rvrU4fHE9NcF/0IlutvYTUSSv5bdnatn24K1RNEo0LCnSDaFoaaVP1PvteU9NvHca2vT1vXPODFZn77RTpyV7C5T3dR83H1kbz4e6esfGMtdA4bsx99CEDmslwATLZIkgwLbH9+ARaJrct3RkCaNEnJYmeAJHVcvFiSJHbtCYSh0wN/TPu8Y5fETC0WLZLgJdWYHABD9nPZqvBl6dsSzNLckb12PZd9ya8qWirp0+3Zw24CAz84NyTxRnnFiVf3rQXWCiWas/OpW/ad8ueKmaFX68oKpQvpqFVKzetKRWF3a3dL5Knq8RPS+U7FP+R/fvwLNTt8rW2Ull6vzQcYwnbtdA4ZGtd3VlxfrN+/4aP5q7FyfPa6DdnrNpx6Y37GhXb3aQADmMg47+6Unvj6cnydsSm2J4Bfb/sTyg+KzbTJQb9+a/rB1s8ozfWZ6wd+Le7TNar4hwI1+q5E1rlk5+1vwfDG/10JxrhG54gZ1+JbtoiVUnQ0vvwSQNbuy52ps8WFTLpnIrd9/Hrd8b6TugMsefAhAFm7uDERC925q2roYL59ytDD4iUQAXi9amfvvAMwyEzZgsmqZbsLLpm5quGS0fkc2emcEXsXvCSoCMluHTDQ6v6o5/aOfXvZ3Kf9tCP0lsPmrRLdf18agiAaGxLuRKulFdsGNwTPmlTHvr28b3kA01s9I/SGl8NNImRnW7Ozxanj756MjMWGA6Y8kqBod1gkWYYEyJI0SU3IZjKYBRYGxlKGHQGQtfPSxaMrAalswjVRSgoNC/vgQwDOW8Z4C72nF4tcCwYAkuTm/8ggRUfn7JwrMtezh90E8Rh0ilQ9ZK32ka/1rl651cfjuoPrFnSdhhiATRvsAKLHRxg2y16niTARJH/hnXhj5ahOSIu0Ge7mHrZdKWb9aPfHfCFp0vjsdf+e9/ZurhA7zQg3DdH3/zWER9lrvn4HQESXG0w340k4ZeXxpskwHD7bAbD5oKK/tSg7Axji9+wAEL9nR4f7/+f2pFSKjxZG9Yjhy2F5ebBaKy++WIoe6/3eAqtcrVRHdHoQWTsvC81YArDQ4m1VaWlaihRTX3XGAFb807+jwscDgCxL0WPx+edKXrssgwnV7lJUe0115bVXz4i5y3Bik85HPrty6iV4lw0bxGfKeBDdR9t37bh5inzTutMSBOEDEu5E68RHC0DC84LoVbvJ9hvfrtONeO3il5ZypW76cggN4W13Iy4ZFiVnZuja1yFJu6bcw31mkqcrAfuw+7vwJ5Q89PDfBy5P//jh8oMnNh/cYhuxPDRvNX5zrLn8KN56O+7OpfrQO9/FrWIVgJoKL9YXv/5I1D3LAHSa3i3t844Z156xuW8f1++h01WvHnT8R/ReLa840T/8mvboMaHfeC0DW4Vr+ux1/1L+VgXrdT3uyl73CI/u846tXMua1m4mZT+nWDquKucO8WGr89CzJ/gUxZ2wJRnoa7yuWw8VG1e5n8JA0qQ7xPKmDfZozNCNTdkr+njP/F7VvCMVgBD2g23UK1sPbR/Va4S3w3I8O7Z6wr3YbaNy8/cvu083zrO/P3hT384T+o43jF2o9vRtCbicAcg6cW7yNuVlDe/crXvn7knqxnfcNvDK3wAown3TO+VPDLf89WAPNeUHgAwlMQvdnXi87JKq61n6J7MAbP72Q4DZrs+GzJjVClmG7HJX7a6qlNls+zZ23XUzYibU+kzrjf6Dpo+Xm5jA+kcAv0Wp/pUgGgIJd4Jo8TTBvQXPn9im+dFdeq511u8OAM8//wJPRJaA0OczUPE7gCFPpu9aYGPv6bKWlYA3j6gzxiBJDEDxsfVjgbWXVpd1ral86Re8FQtuNaPmNjy2VdG47UJ6Q5XsADtw6iMRfU/7vOMuIHHI/PX7N2y7BTZd7yFBr/PDep0/OuqSGEWmMwlMMWrUZ2Pn7192vEJJbU83M0hJ3xqPjgBgQ7ToK2S6pZ4rK3vMPNABOAXHKQBhZfu4DYvAYPmStac33+DDw0brd4NwXzn4+vjdOzy2MSKG5xyFmv0bcPQD/aO1qnYAE/qN/2j+y3w5e91bbrMd5rbEJzPJ1yFe9SvPnjCFa+GcXXMB2EbqRCpj+V8v92oBCXSadj4/ftauDoaH4v6Sg4wM9a0id8wvXBiz7KN3Xxzz1e98LMmrlw86/PPYW89X6hxm3M93zFy2Uqj20OcWMVcNXK6q5Ec9Vbtj315vn2LHxrfZtOmOmpoua/7hOWzf3RI4+ni5/yawTUCt3R4IgvCEhDvROmnUFoBB1V5ES0AP0L0Fz4PUngTvcSPe85ji5dBn0WhZOt7mHlXOpedaz/wtHS4XT1FX0g8YU+wfGdOrse6dLzhecQKKOaSSYCxJiLr4TmA1wNLKOhpP4a7lalwHF49WHRK3aTH4/r9YlHNJktYuVOwrofiHQpHLIRYAptiHqzF4SMZUEP+pXHUcq/4CfZAeyE56QrR5+qbTD5URIztV/B7/4TsAVg6+3tuh+v8act9hra3sY9cu3PpZ/t8//O6eqMrvXysHABznZwlTM615oa1obPRi/54AUodVeTuF3sbx4WHmYtHzHgLb4TY9cBPfYOv3b9hd/i7cSVj+aJ8u2pRAFBa/8O7MJ77q5UxNVQ6+fz+6Kts4Y2NRvE056MkTZb8fNxwz95rBP4X+CAZ+X6UqNQ2QAXRcnAHGQjMW3ZSWhi8zAMw8UAZgBNoBOj8ZAEBK8QeZN45WY+01cLlQU9Nxw4Z78+oW9pZW50kOh36NtywX7u4Kj4/SqcGDoSbNN2Oc2/DlQKqdIOoBCXei1dJIv0+tNQnHn+fiZz9U0wMqfWQ86lwNWTracmQkSkvv6X9N3pixUs0ZCWCMSe1CADBZ/rxT52srKz4/9w9MlqWxt+JfBXynw8u+6RE/LKT9qUcHzg3NWJyJHpAsVWlpTEbKlXsBjPgxVDcoWeS4t7NcXiN/xxe0SlYdZV1dt0SfxrYEAOGduyUOfVb/qGcaDEcXZVf0XM6nc/Vyn1P8Q0HUJTH6aHpZuSbuE4c+m741ftOGY4ZvbKVLKzB87s3CsVGaNCle1fHxu3dg0g64C309yYMO8vycx65dOOHWh/FhiqraNZzTpkOXd95pRvd7D7Z/rXc14CbZTe8G8DU5O58Su3+w6RwAH+CcXRmZbsn14pJcfz2WLlH+cNfBACb0G++ZdNSnywi9C5AKAwOYHFaQ74yJBXDfdz2fC/t+3qd2558fcQIL29/d6T87+OHDKnckjFAs2SsjIgAmTZqUUazYiR7438d9/nA9U6pqZb4ydHEGwKpSUzFtKl/z3vu//HVCHzAG/KYMobS049ffVt3/AJNdXLWzM05T1a7/VkEDvru8tWyrd+ulAKL/mCsTieYbDEG0XEi4E4QRvc15847EH+qagB4QvMbgIyJMW8DWehyTP0tLAUir82YAq9YVIgwSOnbMy5MqKmCxMAvb+fQzKYkz8dA0AFkrXkqe+SDf7+jKT7NWv8refUeVfLJw/5AkZFxbNa88AkD2wiVQi1YByTbiRe3UXKOZGcu4bwMAtWymw1PcV65S6laz18aogzHHNmolNtzudn4PW0P1LPFJ3sfwwaZzbok+DeA+x0BYtfXvn1gXd/4juzIyr099RP8Kilh+uvC1BAb91nOz8zvP3qhiIqHPz8nfv8xLea5HgawgwlhlKxDX0D0SbziwstcTX15mOMb3b5wAOuDgquwxN0vD/4wdOwDEf74L6DD14M+dHjwfYNKkOPcJBVNVu7pWSXaX9ecCsP+caxKvng3ImctYynPPwm5fzkLw868dFz1XlZJSlZzk+td6REV5HbYOa8LMYLihF8hqdfdPuudEoq4m8QTRZiHhThAeqMKlpaRgNnbgX7OU9rgaXGHoPaf9T7j3Z77BX4IZk2JWrSsAAFcNq6mWLO3RDvI774jNmCF3mWmFhGDSC3vmq1tJAP4Sdd5YNlTdEoAm3zXLSAlgzDZiOSQpvfghs6GpUXl+LmYU+gZlyRt2ekO1lXTzduSHV/uzYm/22yMm3SkeF7aGkBDX75G4foCHH4uBIYv/DjXmvStjuunG2UuWiaJYodoBbNpwLHr8xeJPT9WujBkAELZ5s3PMGB/lrfqNPf/Izsgx3Z7XreZusyeMjDDbQDmIbeQKfrxK5yZe2utJ+raHANhSXwQYpireRJX/i8oeNzF0VR6AqmnTwztfAEBmXKIrMr1qdiqvQwWQueNiMLbi8r7g78AePcBkMAZZzkxN77h4EWpkJtfAVQNXtXy2ClEj4++d4uuatBEi3F4+a8JMPkv3xySeIAgS7gRRN4Lnp6Up/S5rvdUuNvA9Hv2jmnD3HqcXE6cZk2JXrS1gZ6sll4sBUk07kbQAIPT99zJfXJ3y0DQAmDgx+f23s8aOwxdfwiKlRB7B7xLAdTADpFv3dGAoC91XVvVYmlDq6dsf5ovhnbsnXveM5uqoyvec3U+XVygNVhMH8+5OTBjOcJmevi0BEgze6gJuMd6u3RWeT1O1lWQHft3ep+sIZU+mM54HICF73Vt8e0VzX6fu7+4502lG9/6/htz3vZLCLuzqv+x6/tUnTXrEAigr/4In54R37pYY/Sw8IveXWi8BXACyPuv9XL/vxHrbqJXak/xsiW4PZWVcv4fLflLD5KNyd40EgJydT2HnU4lD5ysu7MCa/wuD6g7p1lPJXfxX5p0AOkw9eGL72+Pvu/liAI9GvyjyZLhk55UJtqgVOtXOAOZMm417YvVHy//virg/abdBssdNDFWLUEMzFiWmzk0q25l17RBFtcsMQGjeKvSFSzoC4LPwn66SZQCMyWCsauJE1axdhuxypiSHLnoONa6q2cnymTOs0umXao+IQNDUzwQQH9W3BEHUCRLuBOGVYA63s7lPB7YmtU5oP8MeCkMvx739SIsYm3K0jW9DNa3r4sWIGsCMybGrILPijyztOqTt2I7Nx/hZYLdj797QsrLMF/NSbPNQVAQguagoK+8VANjxqAi9c+3+yhVHAemv30ZABixCoWvlkYDMe/G42ZjwZAmdLs8/oGXXpG9LsI3MtY3MTd+WADDbyFzPGLynZP/Loslj3tjx2h1X8JCvmgeyVlWuDEB5xfH0rfG2Ublg2qnd5Kx2Ejam9+jNB7fw3Z1ibGpk3TZt5ZcZGdBJeU7/8GtEirw33npmOfe+dI6CtHMutOwX3VCsVv6X85Zb9Ktto1YAKP6hkG+cs3MuT55J35qQhd4Akq87CF1qffrWBNNMmAn9xgNrxJ/HQ2UYml4xzbszvXimLWqFMu9Rp3jZrxYASN/+kLYDWPYr63RHYCKxKun+KQCSgayXXlPVfAagqHZlc1l2zp7N3n1HGjsWsguMq3aZ1ciQazZP639D2I1wOuvg/Nh8H2o9/mff+Z9O4+3boAnavhJEa4KEO0EYCZ6YejNS6+9xoCJn4vhK00effV5mTJ60ioF1Ogc7lMZAiIxcXrJbYgyyHPr++25byzIkCYwBimTn2resqwtAyrDDNjDIkCTJLblcyZrhWs8CIH37Q5Uv/ZwEAOBp0PkHlsf18cifYQyS0YKQ/3/O7qdFnre+JdPmg1s2DwPKvygrN6a/20blmjmoMI8FCEHP3c35gghaK5MBkXWTNl/sI1qQxvV72H0AysGPdJYB9LRekr1kqVidNPlO5VJM7y7OpZylF9NPOfTwDcSkor5oh42+/UK+4H3KwQA5Z9cz4mrbRrwo8tP5mrgrE3RXVCk+5S+a86p+2L9X95C6H5MvOt2zPTsKoN/kNwCAydLYW/WxduZyQXY9ufsJJrver954Zu9leOUfTRlpbmBuur7lk+8j1NsV3gB95RKE/5BwJ4gWSZP1MrTePi7gmqMhMbYZUyatekMLkS4Zdn3YjlKGEEghZ0bfnHnLLSmPKAHm5Pj7s1a+bPtzNiwSIKV/8qgq35XMmfSPHrbdtJwxFrp4SabUc93l1XLfaxSrRyUQL8MUBjAW12fm6cpXD/5W6rae7ykh6fEkANmLXgCg96xMHDIfwPr9G+ynd3trqspl7uDw27xdBNuo3Jf3vArAGmrdXf4uwCrzlEN1mt5NDCUsYwmu09dTatJXXymbviXhsWsWWC84X/csYBuZO+68VwE8MGgqH3z61oRNb/+o+9XQzyKU5eIfCqMuidEP9cCv28vKv9SvSRw6X5w9+bqDWbsvNzy7Mb1Hi+yXrN29wLRbBH95blJUj4lggEe3LOXKRC1PL34IDLYRL8L46injtI1Y7jaz0EXZnalpPAVLAlCoeNs/vuOORX/+N5jM/z3+2YUp17vAMKckaeGw5yHLYFAkO++4VOOC7GI1Naym+oPdFpTXHkRXPJcCEXjmZrVNQ1C5whNEG4GEO0G0VIIzTCWs2eu9e63bzLh7EtaqDYNqqp1Js6V2FlgskF2SwWJOZpAU18funS8AAEk6zuUykwDkf5P7131deJw17mD7MxPGaWWhUAoiK1/62TCAuD/N1GdlhJ/bLXHwPOh6rFauVlLJk+6+K/uNosQh84USTd8abxuZO6HvuPTidwyGeFqiPACga+cz4Z27ebsIDwyaWvxD4efluw3rv15b3ndyuJedFIWav3+5R1CcASzpn28CyL5rinqKe9WHlOLa6HEXiRmCP5i4ZDIAGNz9tt3HlZsJzrQ0uJs5/vp7B7cgN5D01tqPDn8ydoALPGwftaKy893Zg29QzqJcdpb/9XIRgE/f/pCbUxB/7upRk+akirKK7DVvqsXMqtKXAbAbUyZ+euoldW8ZQNXs2QBL35Gk5E0B24seu/W7rkyWq2bPZi4Zcg1qXHDVdHxxGbvuDLqdAc7x/3Lpi7z93yvgODa+7X8+Oh9zMNhNEkQbgYQ7QRBmTJyIoqJT48crGSx1wVO1B9yfx7Hx7ZWvr5XCwqSaaikEDCGSxYKQEMZCnn/hxbAlz8MiQbIwJkuQio9vjAof/+i16cn/WAkg68En03ckqonvajhccYhhYJIkMVVR815Lb4rz2kYsU9Lf9agyTisjNTxq6q+iru8ffk171mPCVXd4bsLDlTqeTwAATWZJREFU89qBoR3em3N8T+sltlGaK0vWZ70BoH9/55hb+BpvOyZNVvKwk4qKsteuN90GWkQfMFSRAgA2H9yiRNwZth7arm3pw72Ro3nC5ALQ5Qix+H2fYh9uAip3o9O0CwAk3TMRQBKys18vBNw6cBkOmnidaubD1BJk/hwR5nZmd8nOL/eEfuM/3aET7jwoLzOxDxjGHOzKZBmy3HHTu1WjR6PGJbtqUOWc1S5k1juhgL5pgF9wBdyQOk5H7oqGl4HWaV9S7QTRlJBwJwjCiLhl32XPHkeDU2YvjRoJwFpU5KNc1XwYug61nmOIv2cygFWF/0R7WWrfnoWEAJAsLDTjeWaxSLIFEgNj6f9JhiRtPrjF+drvfMcJX/4n/a4uPPE9rve0qiuk0LzVkFA1fUb6Rw9zXWy7aZkx9x1ARIQu/d1DnUsioMv+8lzcv57I9/7M3A4b1/dhQJ9IzZNtpM0Ht/AOrEbV6z6o8M7dEofMzx4Jlr8OgDRpkuf5hGr3hItvx0m3uwrpWxP6h18T1+9hsSZx6HwedHdL71FHoo+gi5Wjeo348Mha05N+tGANX+g07QJD71slmyVqxfr9Gyb0G1/ZfgdCJX0pc9rnut63Mk99eZHXmx6vOK4uM9uI5foQu+H4Rxw/9BQTMMWRXcuZUf+UFw1/K3nGfQDwjweyXlzNADB54bAlc0pSALb53XPAfvu8YxiTXVUjR6GmRq4+i6rKGZMnOeImGruE+v3ZaXgv5IDntgXQ0J0giAZCwp0gCF/oK9Wa9Lyil6TPnN0ZMXetenMdC+1kad8ejDFLCFwuMDALIFkgy4p608nsnhWWlTtOxl9/gZr5zaqmPaiWsUJJJvkml1cuSpCyX+Hq0+Dowmwjlm09tH1UryhhSiMyW6Iuviv7tbsA3p6Jrd+vCSlblOIybotaoR7VbXyGhBk+QvVQJoiovBQ3STc8AHCmprqP2QQegH/s6mcN68vKvygr19xd8r9ebsjInzpgslie0G+8Jtx18N3D8vLw7Srn9Ol8ZdLSDPcNmG3kivX7N4BhQr/xYqi82EC6/vrs669PKp2o7sEyrqmat9P8uZRXnCg+VmQbsUyfza/uB5Etw4ARt1/weFkEgKq0tOIf/xUVfodesidPV5qhZuW+LA6QvPW9zJFjwGTIbMEvo4Z+WsKXKy8Kh0uW5Gr5TDVzVvL5JAKqca0JM63q1KXJpDM5vRBEcELCnSDaBProdTAQQP0xY8qkla+/KYd2kpgshbR3piSHPp8pMUvV44/D5TLNo5h6sMPUqnOznl6gPiqpqk6vodVcFhmAyJ9x82gfddkIMKYG5qXE654BkP/fFfkHVsT9aaY4iNKXx114ax7wUSvgZgm/gjuRG3F/IuHnXFBecQKS4kTp+xJxz0Qe2jc1f7xwzRp9DoyB9G0m2TV9uozQ/9n7vD8DeGDgvYZxhuXlweEAEGbmRMk3ztn9NLg7vgkMYCuvHaL+9T0Ubx98sOmcIU+kAdj13GL3SLnhAOr8TIvss8fLevCN0z+aBbDNBz+03ZDDX+zk6ffp9nWvb3Vxw0eGW8egZEdZx45wydJdE2W5hlVVMacz/t67zZ6ChjILjYz00SU0gL2Q9cehYDlBtA5IuBNEi6dWUV7Xm++GbRpYMHe4eNt5qWn+H8GoWnRpEt6Iv2cKgFX5RayjbGHtq5KTYGknuWRYsGBwBiySZLFkDpNyvlp0OPeQtpvMAAaLMHGXbDfkrN+/YcJVdwCSUtgKJH++K6v/UMZgSH/nCdPCoqT42D+jIiaoWdRS3J+gHhYT+o53VDmgOLTImj0lJAD56x+577ueUKWpXrX3Pm/4A4OmGkLybvDJhdckb+Tsmlt++gTfPa4vAMT1fdjTfXJNr8NeL67uTEITK0b1Oh4YeK9YTnr8Ub6QvegFNynNELZ4cXZami6C7um8Dm0XDxWuN9PURqVLiYm6WHVMZ9pDTNtWWXzlimN//eZi/YmKf/pXVPfxxufMtDafmTeNYryNqiwzWf40fQ77+CMpMlKurkZV5YzJsfDAumAhdO0gtPYFpaWiS6hpFop4KEjC3qcGDwbvizxgIGgOQBDNCgl3gmjZaCkljda0peHFZ76PoGXjuPdPdezbWyfhMiNu4so31sqhYVKHDlIIY2ASs8BiASyMMcki6bVm1pxnFKN3Xo+oyvcJfccruc6SFPr+BzPzXwWQDNyxcGLURRNU+Y70jxQf9/TtD2d+MyDlyn0AeEo6AEjswP8+6nPejcXH1gOIuviuBwZO5cfnj6qKUSTnMKHO9RHxP192qV51AoqAD9u8mdWc1BVYmrN+/wZV5jIAxT8UcEcdVR9j/f4NAHYff7esS41BIi88HiVNmqRcMffKUS/o9hevI2POadN5rF1P9utFXvaVtUsChC1Rdkwe8r3yeIW28T1Rp8Hw+BeXuo9c0+naq21IXgeLG5+J1avBmHgVNh/cEtXtdjCsuLwPYwBY1ezZkOXMx58Ek5kMyDJkeXZKIj/MkgXPSUOHymfPwOmccbdJXYH2wSwqMv1gWhNm6ifb1jWv6MPw5hbp6izC27kC+A3g2LeX90ST5s+T3M/i/1dNQIS+4coQRBuHhDtBNDrNnqZSv5vvvtVAQx414q7XTfHztz/+7skrX3sDsowOHdL27FoyeBjkECkECAFzWWb1SwMUwZ08c1rmi3kSJDDJU74DUugSN7mZsnTdX2O+eHTQXIAxJunSzhkcpypf/oVvtj28BkD0bd37/OGGnN3PlJ8+AWDzwQ9tI3SvPs9xH/HihvU2AHGH2gPMNuLF9OKHIKGs/HN1O+nVfWuBtUJn833DCgpw5MgTuOy5q7+XLrggcfA8zzwctzOpHK84wacEInmd55GL9HQRzzYIdNtIMQDlgElLlwDInpXKV/AmsiZNqTxIHnIIxTMBprQ1ZbCNWJ5erO7o4ZuvSnbtifTuPAzAOedU8ueSMvR7mzLy4wDStz+88MZl6mDd9TqD7foXxHGqHpwGsP4H88rKvxDzEyYz5+xUpV5WlsEYZMYgK4F2lzaM1I3/Wjxy1Iy4GOuAgchYBH9ah7q3LzB8IRi0af0s0g2TgQb6S9bDUcptMOqEvCExBX7FxA0KgiBIuBNE49Jwj4iAUNdT82CbN3wXjDa8BcyphHj/neANUT2eZ8xXphYVLfn7IgYmwQLJYnRyZDJjFkjMXL7LMiRt+7Fjz+/OIPJnbDctfWHPfJz8+fEfrk34cpvYbER5OwCVm8OyeQa4FvSV87/JBfeAB3jkfPyEdABO6LY0BI8hqlcFmkJ/4svLtJRxs2SZCX3H7z6+iS/3D7/G/bmb7KBlmXs8qs/IT1q2hKd8JJVOzH69KF3rhfSiQbvn7H46cfAzlT0iAHQ6+oP+yPlfv6heCrgbrmvPZ83lR0Qqi5gaZb8yFUD+f3UtWhmLCO1f/vtmbdBCsitXVTchYNpeAOJ6PVD2UxL/k8lM9XmUU4o/zLxxlOIUKcsd161NvWw3GEvVDgRFtavUr1UZD2ybSmR9SwSHw2G1Wut6cABdyssBOOqxp9l4Gm40WW8McxKCaLOQcCfaKEFucOb/8IJn/JqIiYysfWOR72sgIgI6J/han53p7Xv9rINVV0shYMwCKUQKcY/oyjIAWGAu38FSIo+kRJ6npqTj0QFzAN54lQF4/MMwoAekU16G5qZ91+/fUHbyCwBlPz1kG7FcZzQphS1Zoiyqae5umdzMKKOdMTFh2t0A7Thig7C8PADcxcUWtSL/wItl5V94FqQKbFErHD+ftJ5/gbcNeEaN4Ijjh57qsmh+JMYKoNO08/mKcMbAmBQXl178ELqbHJnbOPJJRdyfEozzj779UP4FgK8LTrpPuljclfFl5Q8DPDjOlJwXUQqsjcVTsjNNzfNbH5GZTDkQj6wjJTEBQEpR0fOZOZDlofPnHe/oev370LtHnO74F3n+dwNmXHapidS22/VvQtO3rsj+Eo9aFyxEhw4Ok2sDmLVEMEWT1O7SNuBRgzpJ9gBW2SKYCusJonkh4U60RZrS4rCBv14NiTM1ZHIizZ+HPXu8PWq46W8kIkJUs3ndRq/aIyNP1dTUsn1dkObPwwZFazKnk7V3Se3bSZZ2jFkQGfnx/v+W/VFOjTyDkpTnP7pQsqAq7XFP+f5m9JU4dZT7OdquzwF0yg9SaF6e0NNZL7/BPdRT3ldkTdazGRJD4nVzRccfPenbHw7v3C3xuqcBsE3vCrVqG7E857N57OTJciiqPWvXZQCwKyP+yp4AssfHAgyS3udRC+krwflNm+A4lTzkEIo/g2pZo50iypj04gXm8ad2opFjrYcO/OgxAN5Qlml5L2ZHEp7rZeVflJU/xB/m2UFl5Q/Zbloutsz5bJ6YvfS0XoIKLW/+wP8++dMfrtensE/oe/vuj9/XRuo9xK7ZxjM5/T/JuqfAFg57HkyWP96h7VrjAnPd+JsyN7u7ulr+sSb+tVfEBopi9iPXS7+LWNamnXa7nx9zbwnfzRIFr5WGzxaCJzBBEEECCXeCaHSa5ben4ZMT31LAx5NyPDnHiweKgmfhXT0ku+8GN+LPGcDK195EaEfWvsNjc+YCuBGQO9VA7gRJer/XiVsPnR/63ntVY8cA7tF3Ho8Xak+SRLA2dMkSEeBOGfYDPnoEF8J209KsuEnqeqbkXKip8HbnHtPouBQdzb78CorhO0scNHfDW38/HiaEIAOk+M934fNdAJJKS7Ntmd4lN0/jYWt6HdHJbFb2ky7W7h68H/K4mmlzwQW7Uh/ji0J526KUDJYJfceJlBswlnjdMx3uvxVAO8vlAMb0Hh118V3KYHWEd+7G/TH1rN//L7ftPJ6LmOqEd+4mHs5ekJH0ZNoRxw99Ys6HssFa8WjxT29Fhf/FdsNSkeiiHlm9D8BftfffA0PVmDFgsrCI1G3Aik++M6LrrWEV/9NG46pmuk/Bvadqlqw+YBgw/5g0gf2LpvL9TvgObMy7uQjyu6ME0cSQcCfaIo6Nbzdjsib8+CnSqspazg1ibcy1bakvvDs1eHBjP8f4e6cAWPn6m25rmQxmufW/VlhkxlzMJUuSErSGRWIMd/a9fXfJVt3GykOApGRZSNKi/lxh6wO66vNXFTwgMQb5xMlrnSFlXV1KPasWw5aq0lJDM5YIRR17sH1pV2X5uasOA4gX1ap2u9jL/KkySGOj8ZbWC2nrd9vFsm3Ei0Io53z2THnFCUQDwAebzkntdRQHVsT9aSYPh3OK7f9UFLk+DZ0BwOKR7wN4ec+rB38v3Xxwi9hMT3nFcZGpUvmS0pn1psc1sW4bsdzsjgTT7a5Vjd44+YbdP282Kn0GAFHd76glxA4WuioPjlNg6LhvX1XqbGUbncU7wG4tOoJfFzFZXnZBOFxyVUoKqz7LRo/Gjo/5gVd3v9cBWBcsFA6PgrpqSk/P00aqgTEc09s3j5jnN/wr0Z9D+a/FG14wQxCtDBLuRIOw2+0lJSUlJSV2u/3DDz+8+eabm3tE/tKMd5a5u7Oy7D0TJlB5I02J/2MWP9i1qvzaiYjw59WMv2cK1NTwz0//cVTn4aOuGFl54gPL//0fLBbIMpMsYEySWMosRbymqPtm/Zmbr0uQWWjeasgyLBIXfy7pSIjcE1ALIiVJy/eWYLtx6ct7XsNvvz30uRNAyrAfuFacNfBpJkOSAIkl/VVtQfrXSYiIyF64ZOG6dXMu/BjA8TA3nXqksxyWkeFMTeUp8rxAM+5PShq06iv/YvehUTi4pfe5kQ8Mmgrgw6P5vq/MLdGnAaD8i+MVz3g+mpSeAqDXXX8AYIigH/y9lEvknM+e5pk/AAZfMGb3yffNam0B4KNFb1776G3glvaAbcQy7TE1m1/MYWw3af4wbskwAADnGiWDJesGkd/OxPZKgruazs6z4Gf/2Q5gIZMhs5RZCfz1XX5xz3WXnZl0sB37gwuuGjAXamTILrn6LKrPsDNnNMP1oiJrUREAa1ERIiMDk3UdGQm7venr1/XTD2vCzDpl+9RCXQ5FJacEUVdIuBMNIkLnK3z69Okff/zxoosuasbxBD9NdufasfHtBjZO8p/mvZft/xyMO3h02bBh1q23OC++ilXXSLfczGpqYLFIFgssFkiWjh9+6LkjkxnAneB5Cg3jBayPjs5+8cCj1WcvOF5xIv3jWYBkuzEn+Zl0AFnz/s5Vo9KZaFdGSuQP/Gi2m5YBMo/EJ983xe1Mdnv69odwoX6VNDw9SpSWZu5EaN7qqunTRAp42U8P8+R4fjol0UVCBfuOB7x14lhfm8tMZLX7yqiL70yaqvQV+kd+TfT/dU/fPtM2Yrluc+a534S+43efeJ8vaz2qdBz8vXRM79G6IlG9/wuu7S5s7FWPF/UUPBkm/ZNZAJxrHOKAye9tyLp1nDYeJWGG78WzYhhkefHAYwf+9RuAPiz52eo7tQG5XHHfhDBWg5pqVFdDdjHZhZpqdroi/p7JCBqaN1HEz8+4uf28d2pV7bWU0xBE24OEO9FQYmJiAJSUlNxxxx3NPZYWhX9x4obQNDH7uv5UBwofAkIYdxhaVwLowotWi4oeQ9HS8y9A+45VD81Me0rZYHm3ixUvSANMhiQxGQBzTnswbMnzakK5/FCfbADpO5J4fnnytKl8j+QH781a/SrfGZL0yh1/QLmSRnPgtx19zv0zYH674W97frQNvEh5UALA4v6kOKgAAGRANq15dR8wyn8/4aMANXHQ02JZOxpD1jcD87ucrOl71YR+400qVOGm9kWuiwi3uw9MS7Tv9EDXypd/Favf/3bL+99u0QLq4gElaq7sGLp4MYCqtDS3TBj3MSjIavaRqtfVgyl/Vz34wOFZCdya5r0tv+1+fDgK3uC7OpOT2TsbITPcOoa5XKipZmeq4u+uRbI3JE6sdz3ix2mGjqTq3QPHvr11Ese+Y+R+2s/7MME03djPsRFEW4CEOxF0tJFSpOB0gagH9esU03joDSKVhdJS06s96+eTL8iMOZ1ize2VR98OuxhQXCmfn/347ORZAFIeic9cugKwcDXtnD0bgCTx6Lukr1t1g6n56G7eL3h175vAm7Ybl4Eh7P4uzn+c0u9kG3ih2NR24zJwFao7eNX06TAKd+buYKNMCNK3P5y58zJtx7RUmGEbsfzULz93+eP5bNMmduqr2FPtceibqn5u20TfZubmqIXz3Z6gblyKxQtjCLu/a9rnHTOuPWN8GEh+9y0AWbf9BQxxvWeU//4sTp58vCxCTVWXdQdmtutfWL9/A/BP5RgRESv2fRW69ysAPHmd6Y4MyODu7LorOKK83YjkR7QupNXVuOVmVuNClZOdOeMtyt6oX0emVjONl/LuKdPrcC5TF9e6H6qB3Z0Ios1Cwp0IXlplp+tWORupU/wsqCZmj1okbHXLjXntml9QdkHVrCRIFujkPnPJkFhY3mpYAMlSNWOGksehOEgyAJCkrJUvJ8c/wHcJzcgADxgDcZdPq/za9q31OKDqaibnH8xz4XCH+xHCLlVOo5a09j5n6BfL3sc/pgDI+scbIjjtvAmQmS4LfDlUZWu7cbnwOhciPmXoIQCZOy8FELr5/cV/LIEuQK5DVkPdIrbNAGS/slY9FMvceemia46I6lUlAUZXBapfAND/15DTl1z3wKCpIlafcW2V2zkZA0Pyg/fwv5KLilb0ubYqNfXRAXNCCwsB1RvHzQmHgWFCn9tX9P5aUef9+2PfPigZ8nq9zjeWGU+d92gpteThWXDJjLlY9RnUnGVnzsbfMwU+qfdb161h6r69pl6rnuXyzVtATxBEcELCnQheWp9qDxT1FxCNNhcyqPZazSuaEr300RrfCC1VWgrgSGcZwJWj5GcHznFGtZOqq2Gx4JYx2LJZ2UyugWRhp359+NhhAHh4d+bSlTwAzxgWRmZC4jF4FnbvuZCQ+Z8IbigZumgRgKrHH5/5dftX/mQp6+rSck5UMemSDoewnspKAJDuLz9fewJCdKqpNbablorHoF+SjXtwnrv6yOOf90zp8G/8DgDZu+c9OuhpAMnv/DPs3K1iM9uty/H5l8rQZABIvn9yEgAg7P6uztlpbM88pnqrM9kkEcd207L1+/8N4O+v7QCAT7/cNZABzHZjDoDkVcsA3Hj9JRP6jVdG6T7QmQc+X7H5g6pbbq6aODE0Lw/89gJEsakxGQaA8+ab53TayHdfyIReFz2ZmOistCQjKzUtWbtc1dWspgbV1ezsGd5tF6qHiWkqSADtTawJMxERoT+LvlOSth1fU6+GrL7hM23UJewtWkcRBNG8kHAngg7uKtgSPVWaHlNnOvMt1U6l/ptABwTrgoWOR2pLyPbzUN5FlR5/La7dcwZ6VlgQEXFmDxZd8Ts6dmAh7aV27QpPFBWO6nBvmRUWidW4JIsMV404Qsr2D56/cbRkASQe6JYYw5ySJL6cMtyeueNiAJAkSAhduRKy/NevwyEh5c/HAKR/Mst2Q87p3zpAsViR8g/mlR1X6jKlsbeiSEnCdqsBhXcjHt16201LQ/PyUv5UpltrzFhPvn8KACcQdn9XsdKppdO4bf/ephN7bpL1s43QvFXgwtp97jCh7zi2aZN2AHXwbNO7/B34cWlp1urbvTwHzCx4LeuWmwFUTZsGxhQ3fbDQxRn8aDMPKU7qmcvzABQceklT8y7ZTa+DQWaAzGQGWQaTQyeGpJV1YIz9YfITqDzNqquFZEcj9BlVDuup+PknUX+WAJq6+Ec9MlWa6xZZUN2jI4hmh4Q7EYyQavcTP1V78FC/jjDWNa8gO1tZboQApILdDuDxI4f5VV355tqyo5/hvJB9USef39IVNdXMEsJcLrH589ePgMzDzkySJEjgDZwgiQQSBgmSkoEiV82ezQryAYApKq34p39zV0QAQ+Y8MQQAOv3t7uET+o0HY1l5r7J16wqG/I5vV8X1ng4AkMTBAaR/nMgXbDcuBYyyvmraNBuQ/vEscFtJnUPLowOfYu9qXu865xav1awjLr1hD2OPDnwKwNZD22/b8g0cpwCELlrMc4H0R5PGjv3iC7XrEzO7C8C0k2blvRKakTHzmy+1R1WxLvLaQ1flcbP1hw7p+x/JkJWwPbeOSS9NWTgkIzRjMa9VZX84r+rBBwEG2QWZMdnFZNfifhVwue49f9eSEQu8PVmBXjIGxN5EhLr1uNWqetwRolQZgf9xCoJoxZBwJ4iWRz0iT4F1VavVBENrxvTkHDgcng/5OTdr7LvzJpkzKvute9kfT/NlduYcVnMWUruq5KQlFgt7b7N0W7TkqoFk4UYlDBb+/wuGLlm6fxGAxGv+VhWJ0CVLmCQBqHrwQYkxKTYWkPCfEp5jE9V9nCpStUrWv9s77FIKQ9mciB34CQDKf3/20QFPKVpWAoD8g3k6wS0rmh6GQLkk/pz59b6ZXyvLWTcwaexYFL7O/xzc9Zbq351xw+I8hfuKyBHqy9dRqO1Rl90E9l/3xHamDgl8jlGVmqpzoWEApLFj8c+16oHVx2SEZiwGsKJ3v5kH9wPIyn1ZTaFh4qowJovcGA2XzBiL6XFvyO8bPvv9I35xcr5alFYjg8kAg6saNdWQZQaZ1chwVbOzZ3CBe569DsOs0jOty59mRp4rDR89xddIhzR/HjxWen64DEfWjtn4/lQEQQQPJNwJoq0QqBvNmluLz+C3D2kezHdUREjvhdsWr32hiC9XPpQgVTrRvj1CQhASIt0yGjU1zGKBhUmyDEmCJINxzxnLrL5pkMBcLkmSqmanKF40SlAYAFsYmbnt+49GXT5CU+2S9MV51mv+5wDYrpvHuKl5ySPXhQFA2U+in6oqjk0SaRiMapevlgGobpWYAJz65ReD9Q2A0NWruWqfeeBzACjdHp89s0/n4QAWDS4/ria74+NZ+h3LfppluyHH9NpmrVqjnEXWlcCqjo0rBkVWTZ8mbmLoB1417cHQVXlgyFy6ImWWknnScdXKqgenAWzCn277bFexIvePH4fLCpcMJrPqs3LNWbhqUFPDzp6Nv2fKjIl3Tlg7BYDXcPvEifWI6Zp+EPQrzT96EyeKxVrLu9lzi+o6qqbB03E18Kj+PxRuJwiQcCcIovXhzy11gx21qbQ68eghw5qVb6yVOnRk7dpJIe0gWaQQC7NIgAUWC+CSLBIkCySe9S4xSLAAkAGLZAGYpKhwSRp52U1MVlW1BIlJVbNn79y0SYq+DbKsWLgrEXQG4NFr07X1kNZ/rQVobTfkuKlzd6Fuu/6Fl/dwgb7FdJv0T9R8mxty9MvKZsxt6ynPLR1765vdO3cTAzPw3vu/ABjx3xVZDyR4Sbxh2gCUTknKdlUPPgit4FU0PeUXEM4HHgAAl/x81vLQjMUAw88/h763yXnzzWBswUDbk7sfB2Ozhi1g2xdBluFyOe+9h/3+u8Hecf3kN81GpUtwLyribwZ9AL4JGnx22bCBx91N34rSE4/jvfcadQD1QH/RxMqAZ6LT/QSC0EPCnSCIuiH8JZrnB9Vu952owx8V8svXNnWvQeR9eVa+9iY6dkRICAsJkSwhkCySRYLFwmQLl+uSxMPwkhqGB2NqRyVJkng2vBIalyDk8a1jmSxzHQ+JgcE2PEs5MZMhibwXNqHP7bt3fKA8pIXt+f8kddlNlK+48jgA2XIydVgVPpkFoc7Vg+YfXKXT6Aw8zm3IPuecPHm4wMEXw6b+Qf/IiPJ2AFBeivtn6I7NwDBk7RsAdk2ekvzfL7OuvFqE1ZmaAxO6+b2qW8Zo7jFKDyWmmz+o0XrZxWQGJsNVA1cNZBmy/Oy185gsy2fPOGfNYmfP1NpBqeFo+WCr84ypVn6kr+jnlv64LelzzII5T4Yy0QmiUSHhThBtFKEVfPzwe/sNDnjWjbcDcrHSZfdu5e+ICOG/YTo2z8o/Txre6jX+XsXwe+Xrbz62JIMvZ8xfCElKeypdDHVJYookyUoAnut4SIDElDA894/UBL16eEkX5lZD8loXJ3UzxTke6Tse5Sts12dru7g7uhSvSx4rhwNIjXRq4pwrfn2qulhWJwMzKx36Jz52TFfVmVHBWTkm65bbth7aPuqyEQDw6gPiCMkzp/HFzBdXD537JJfgfGWy4gkj87JdJawuy2rtr0GsMyUSz7NoGGOKWGdVI6NY9VllRxd3ZHfFT70HgcZbuJ3LaH/eddqhvCTK+0Nj55jVtYGrea15URFIuBNEo0HCnSBaP+ZGiu4OdJ4aWoSuERnZ2HkCPCHY0KeGL0ir82AqbkpLPeOOpnV+BgytXhtiNvf4Jx+LZVZ5GiHu36g11UoiDQ/DK0k1gMsiouMMgAWzH1UcMzNzVhh1vCTBze7cPROd6VxmeBtXIHnLpqzR0QAUixtg7OFufDPnq7/xbcOm/oGvsV2f/fKeV10V1XGXP1hWnuR+cLdnk7XiJfwnCcDxUPcHZHnUpTcaikf1Lu8ptmc+cet+KkYrgyHl+h/VM/60UL5Z8aJnmp8jE38yxjuhViUlMdkFWWZnzsDlYtVn4XLpjR39RBg1OnJXmE5f69AE1P1dV+8oeDM6HupbDtdBu5sV5vo+Atk7EkRDIOFOEK0cf9yp690Xyc/b4gZFXm+vGMfGt8XT8WZ97Y8aaAzFMGNSDAAsnC/WsLNnYEikgQyLBMiSBYo6lwCXRdvFJUP7y6IKeH08niN5ZpAzmaX8/Rl+WZKLijJfzLMNz3p5z6sPDJpaNRzp/0lO+7yj2Ng2PFOE1R8YcM+pX36BLNuGZyoPa8WjGskzH0y/91yDnH/xs887fvY5gKrUNChxdJ7f4naEz8/pDAAMN/yqlLSmlyR9sOmcW8Zy3x51niDXKPaOwJO7HuOh9wWDbGAMMmNMBmOMyXDJcNWgpprV1NSq1732AtMbyAwYiMhI2O3iTaU4t/id9eGt0VidFHyd5DIP83fp1cv/4wcblFRDEPWAhDtBtHYa3NvFW7g9ACH5yMhTNTXwmQNgEF4+nOADHsnzPJHhyJ4mm/qelPIbb0rtRSq8BZJFkiywSJAkJlsAKJWs0LzhwWrUeDwABkjpO1P5nwuHPS8qViVg4bAl6/e/PaHf+Dmls9V93bRyykPTAbDleUpPIsYyrqmaXya2NUTNmWkn1My/PZ3y2ku8YZD+FGH3nMPF9vOfKGtC89dVxcSKTPSURQuVvKaIiOfT/gYokfSe+xcfrzgOKONRDqiaPrIal+LkKMuQZfncXwG8f/a1WxALlws8yl5dDVn2M75eh3an4jnyHT1qVeuG3x86faJ8nc4gzZ+nfAAD1FJNq12p79Ec+/byGUuwpd0TRGuChDtBtFH0P89KJNv9F7eRbmQbtJRer/gWMdY1rzju+6th5anx4+HRBrKBnS/rdEPA80RiMI9nKOnvL1zS88zdd8PSTlHwivmMJEHiOn7Jc0vYunXS5CmocQEupZ2TZNn6/XaPvHO1mNWCO/v8H5NdC4YuBgBYmCyb6EXZpUTrGQMQdvc5937boc/U5/QqP+eL5wAkdn2i1if7/Efd+cLsG8r5MJis5sC4ZCarbWVlTbk+P/txLZmeMTBZJNP/erYT5FMA/vvumZ4VFgBL+p9VYuqMcdXOYb//DlmOn1rnZBhv1C7oGzDdNX3/+Oj7q683dezbq49Da3PR4m2+zhig0HXDP/J1u8NA4XaCqDsk3AmiqWmuFE/fpzP9xfWhNtz2rXUD9/QYTaCrO4oT+Yg7CtWufyKSl439b7BqTHLwP0YrdqntBX30ogsdcTEAVr72BrNIUrv2sFhgCWEWJQafNvdJANi3e4ltESSJSTwez0ZecsOWE28ryttVM7toHYDnYyZrCTaaNY3L7MxgsrK+2znnc+f1V3tXdf/cFt65OyDF9vxrzleL+fr0/yT3D78m9tL7tH6lmzcDeH7yvUxqD0CaNAlAaMYSMLZkezeeG1M1BKGr8+A4hcPfhS5aVJWWZnCQnH3ku+cv7qnkqQOzrkgGk1OfSAWwrNd5uyN+ef+TMz0rlF8iufosd3KErD2dwjte9e91MKGefcciIurX4tcTfpBT48fziL63KaU+Oxz8LlZExKlBg/w8S8MVcFN+KVFqO0E0BBLuBNFsNIE5NBrwM2lNmOlbbdTpyNpt9NwVcI+p+3bLrrU3jeEgjUEDpYZ4UjzBQ8RHV772BrNY8MEHYkt29qwaj7dIACzSgoELt37/8aheI2anJvFtZpeWLlmcqQTmoXOBNExieNsaNVs9sW/qnJ1pfPn478eP/34cQGwP3pFU2abspzKwl2Mv+SuA0MICHDkMhtC9e6rS0vihQvMLoBm/1HB97rwwPOyXnwGAMdTUCI3OWRIeAZeLF5WG5q0Gkx+pOcMfeuTQt86/PjvC/g7KlTQVVvH74+vWAnBsfHsGYup3tQ2Yv3VzVxju7bC5T2s9TWuzHK0rnt1S/aHWSuuApYTVfbJKEERzQcKdIIgmot6Zr7WqdjciIhpyLi6y2dynu+zZ08DyAB+xVZ45zXU8++8BqFvKp3+X2reDFAKLhVlCJIsESRoZMZxVn3U7Sk01JIlxP3gFCZK0bHBk//8euPF3B4CPfzu986m5cNWInRZe9/f1+zcA+Oz0DiVW73Il9pk9Z9djYpuynz6PjXDxh1AjK7HzGuUg3HWRC31W4wK4gHcxLs0ZlAUZS2yLuHGkMnLGhv3dpgTjqyrF6eTTFYtuuPFxNb/88U8+rrWQOlDU21qx1rwUo4epH3ir2Na82x0OX0MyyyIjCKJVQsKdIJoaHkLusmePMDQMznvH9UwzaNgZa93Gn3v6/qt2b7V00vx5Dv+j+GpL9loxNfyW5s/Dnj18GPG69Stfe4NZQqT27XgfVrfj1JxVey0p2fASELpkCSRw1Q7gxt9Ofeoy5s/ceeX/Afjss4/V41QD0gffD7ql5y75nF/4yu2/bBqTt4/3M33k5+MA8OmOJYMjAbnqrr+AgW3aJI2NRk01l/XSmNH4/hAA57QHUX1WMW3k3jC8TZIsgzF29uwIV7VhPPFTJgFw3KP44jdL6LdOb3J/2nsBkFbnOdSXW4Tba8lV83jUn0JPrYjWS4mqX58XdbIqZshUY0oQQYvEPDzFCKKuFBYWlpSUPPXUU81ydofDYbVam+XU9UZkoXAaW7gHNoHVumAh6pJWG9gXyEfPSGHn4m0XE88+d/s/ZX0dn2Cd8HShMd/MLKy78tXXIUmwSLAoNjVKXydJgmQJe34J94mf9fv/+PYZz9qMx9V3VwUADPvXW9L+/QBGxymXIvOzkThyhAGz/veLfteM+QsBiN5OaldT3hoJigWkLIMxyDJz1XDVLtoh+dbHhu4BPq5MYHHLkPEyJG3j3NwuageAOg3Pn1wvA9rlmjjR8eQcbx8ib+9hk+P43WPVtJ0C4Zvg/Bnq0qVLcw+BCDwUcSeIpqaJw9h1autYK1o+emlpIwXk6i3dTLVRXZ++nz6Adb1Von9SerFluo3yZ1GRQWz56Am68tU35N9/kywWWCxL23VQTCernADU9HePJHheAuuqYa4aAB++GQ5JKvvjH9l5Z3H2jOcp2Bmn0uKUgckyZCWyLswcA9KytOFKsUHSPynJR86JoXWX/9RVtTcjfn471TphIAiikSDhThBNitvvYkTEqUGDGvKj3oJ6EAZqqP74Xus7Yvqo8Kurc4in4LYOGMgDor53DOzcyZT4qXdj6t3KkFRLFkfMBN97rXz19b27dwHSoyGKqL/pWOWiSXGhGRlgDCEW/cYzYu4KzFh1V6xRJ7Heir/13ZEMbw9T1a7fvoHv3nr4NtaST1/b5NngrR5sPY/8/FpoQV90BNHYkHAniOakIaqd5eb6e4p6mVr4pt7h9oZ76dReVujeTMeHL42nDvCm5r1KzKIiz9i8QWcY1eHGt+F3+oSpZPFRjFinmwCPAwZ1DiD+3rut+evqHU81TE2Vg+j7A+iEo5+WQQHGffbFn6C3YVgTZja8hZlbl1b/Ojq5vdwDBlo9Vno7helbWr9NPQbQSPj5DdbiTG9omkE0KiTcCaJ5aPh3uv837r0mUvv9A1PvnyKhOfzZUlnyu9az9mOqArdO0rB+L425wlbt5E8NHgz3KYePIWkN7U+c8FSNAemX6VsMmTbkQj3eBurgfbjE1OmlcWtO5KXJgP+TAf2ogjabpa6y1VsHAz9v+/j5ytZp8umNeqceBTPi/gxBNBIk3AmiSQlwDKYBGtf//I3A/hSZZy/o1EkAU+cbwyPvVEK8lJDAl7WMf90lMr1cfpkPRkYajPMdPpNJ/Lx3USe1LbapxcykcVoQ+B6qPmDsO8fGfzXpI3VEqVE281Zq0nZFATJ3aow7bw2f7fgzy3LkrvBWd04QbRAS7gTRgmlJfm3eTS3q4ccH3/Z2gZZT+lJUfYWn5oWiF+t2O4BT48cHRGf4yvOpo3TWx2L1HYh8OKvUB/f0GPO8Iw+57O09IK68t3mmWwzePz2t1/1eVbu+CFvd3vO+gfX2cYiIMLwQns/OkGju7Yl4G49j395aTUv8qf0IzswNfz4mLUiyOza+XesLQRANgewgiQBAdpAtFP/dmuvn66zE0e123/v66ZBo3NiPqtCAUKs7nluSj/fUcH9kpXm+TQPylIyrIiPN73j47QDIZxEGk0FvzYNqGZVuMKbvAdMLC4PyFnMnd4tVb89UeyK5ueLOia9BGp7gxImOJ+f4eMfW78Wq1aSFvuWCnOB8gcgOslVCEXeCaESCub8S6iLE6xHaFwrmcPE2P3/SgvBC1Xo3QB8J9mFT42emsrcuPPXA7YxC+JaWmudAuytjH5jY5Ps3Qv+7WdXyZuOdcQ2R77qXkEoJCd6y5H3A54pKDzX1NoVpvk1DsomoupEgCG8Y/QQIgggUpgnQ/u6bMLPFeSl449KokdYBA/k/vsa6YKF1wUKxxrFv76nBg/2titu399TgwacGD26CcLs/twIMQtaxby//Z9jMTw1nuFCBwlQK6891+PXXEBGBiIgAKkWe++FrVLpr4ti399T48Y59e02HWkvC/YCBKC01Cnd3ZyGve5WWmn7QxOvITy2GJzbQv+7m+S1enCjr9BLXeg0JgmhrUMSdIIIOTeB69+JoSbhHc41thgYMdOzbW6d80GZIHvUZBvbTxsSxb68hNOsjsCritZ4GL35acXsrahR+IKbr/cQkuV+9RIb0cc8xeEsZ97yAvnKKvGSEnxo/PpD5+u4m7v4ML7Af2KDyXCcIIhgg4U4QjYUQKC2phDRwmBdutlDsdtMMEyGp/XdkN3XR9p1WoT9vva24Ddv7r25rmSeIzGxR9uptYGrRav3aUemLL310t62Hd0otN0MabOKOuludNo+9PUEQLQES7gTRiLSGeHmDOfz6a1ar1f8WSI2BD8sOH/i2Haz3jREuhU1MBhcsxMSJPMfDVE3qG9YErHzCp5Ss0zzBN0LZS0Ct2to0+9z0TovnxfddQKz5Xda30reuOxqqIMydDcX0QH05SLUTBGEKCXeCCDpapdwXQqTpn53e2s8tgMrLHD3j6I3cFt54cA+jEq+9ijwa1tRaAVmP+ktB/ULjBhz79nr6t/B2VHD31hQEPMXf7eDuV8xHJkwjQYqcIIiGQMKdIIi2Ck+3cA/ZGmLMAbFl9L2Xn5ME/dn9LW0UMxYPfe/PU/An7cSv43i4LvpZpeBtBuXDvUfZ0f9XqrZMGC3jq77TCf1lrHVO2MD5gyi0rdNUrVYzypZOY0/FCaIpIeFOEERboVbBp8e65hV941VP75EGShwtabuOO1rXvBLYHGjrgIFW3aj0Dwk/9WYxNvUhtnyMxPRGgekVq9MthUbNOw/Yha3NS6cNEsB0L4IIBki4EwTRyvFWo+lbjOpVeyOhDzz7aNhk8LThA6ubggxEhSXce682Hg0UWN5uFHhesbpWsgZAtRcVoWm6hrlPO4OBZpn7BSTdiyCCChLuBNHaMO1MGbQ0Y6+Zutn5qbHMutWhBuTZcdntnyGJ/zQk/b0Z8Sevw5BY70MyNjCO7udnTZ/d1ESTn7qo9iYYT3NZ3NbDZYggghwS7gRBNBtNHA/zsxLRU203vBlWQ/poKoNpgLoyKcB1F1IGq3iv1HHyUI+5QaAmcgbVDvFMPULRfqr2FtHNNJjH1lzQNSFaGdQ5lSCIZqMpHTasAwbCblf++blLs/atPJUQ38AjeGvj6snh11+r98TAevs4U6t+6+3jlNakjekSUyesAwYiO7se46nrzE20RzWxoWzk8HZjdN5tOI59ewPempcg2iYk3AmitaF1a28JWRCezeSDB1Ec6chdcWrw4FODB9d1nJpeqftr4WnGUiveNHSg8HwWYjrUZG22HBvfPjV+vP/vGW+bWde8UoeTenn5TD9r3lS+n5OohqD3EWrUE9UDx8a322YrOoIILJQqQxBEMxNsztYidUSPnw6GJkdrSIpLvfLp9WnE3hI86nTketpf1sXDp040/A2jOI1kZ/v/1PzMhg/CaLf/NGU6UAstsSCIZoeEO0EQQYFv0dBwSaHZL/ohwVtHaNDPsKuwg2yIXDO9YvU4YK271MOcxLCxNWFm/WwT6zphODV+fHNNSoNcELfo6Q1BNC8k3AmCaGYM4W3POs5A1bDWO2oezIjIpbAuqbf+9tGnxlNpeTaoagLEW6Uh5iSO3BVNIxy7bNjgaFrhHpwpZz4wvOXq10CKINoUJNwJglBoFt+Mhkuohhu2tFyENyIXssZ8mNwV/trF6I/ZEuxTGog/T81wHfy8LDyjpksLtSAMtOWoHtNZpXGiSA2kCKI2SLgTBAEEQzVbRMSpQYMASPPnGUSSpxmzQe77E39tlv4vzY6Q7D50p2YH+eScJqsxrR8ib97/15FbA9Xa8d4ww2G5ufpHDX/6Ok5LTgIJSIaY6TvNcKvE9OXz/yITRFuGhDtBEEGBY+PbksdKcSdd/0tv+gNvHTDQRxMcb+1v9N1JebixZQXv9QWgporW07bc9AbF4ddfs1qtvk6k5uGcGjwY9U06Ckgs3899FaWoWn/67njv+faQEhKQu1JsYPjTL9z73bYRGjL/r89FJoi2Bwl3giCA+qZVBOC8dddwjfIDr/q7N3Fnx4bjLTdDy6LJzq7D0fQzAYPET0py3PdXz8mVnzRlLL/WsLd+wubtDW+wkTF0Yw1+guoWk5+3SoJktAQRzJCPO0HUmebty9N4BKHRcq0ZDvpfetNgObfrbrL2N81CnaxL6ndLod6ti1oWhreH4cL6o9o1Z/dmfacZ7sM0GY7cFcrNK490+SawsSeItgBF3AmibigO0D7vvBMNpNZr66bXa0uBsGZne2vZ6JaG22gSpwnKPf2MB9dvAAFJPnZsfLvpb+k0sElTG0TcGKn3y9Qq58YEETyQcCeIeuLDO69N0fBf+iChKZrOBPo9o08/MKj2evc/8pwDBCo3qcneIXWa+LVKtILjul5ztSqAIIjghIQ7QdQTUu0K9EvvN/w9E6gAvLeKW/NT+25rVbxNv94zcl+PoeqnDa1eKAchDZwmUWCCIIITEu4EUTdIgnjD08Ck2fF8sQKereGPCjeUOWr7BtqBXhSkQk0p9vP5XvrE37wa8uj6jNKbv0UQGPceUu0EEZRQcSpBEIEh2FS7J9YBA7l7jO8cEuuAgfxfrQc0tHT14YVXp/pRP9Fkmd3uzbMlCAuOiWBGFNc290AIgjCHIu4EQTSIVvYbXycjan1nKKUQtjY3yfpFQ2sPnPuRsORZjSBC8oef+7vVy16O3BX1LNudOBFFRdrZfT7xttCutekJwptgBEE0EIq4EwTRVtBMIQOnDh379p4aP74+KeB+zxC0GwU+rdBFoappxJTNfVrxqneX+P6E5OsRhbXePs5Nta95xXTZZMcm6eDr/02VFg2pdoJofVDEnSCIoCawsdja/Ubq3oiqMdJgzLHbDRF9vlwPAdrEEW7HfX8VfaCaXU0aEpxaH3TXgiBaMSTcCYIIMIYSyYAdtqlsLuqXFF6rnTzU0DWbNh2AVN+y1DqVtLoJdI/uqvDPkaaBKFfGoyOPNgZ1kKcGD673ZfEffYJTMBNUrU8JgggSSLgTBNEyCGabCx+TCs/uRdLqvDod3BBW91Tt/mg7a8LMJpWAHjM3b9MDfW5MXa9MvTH4/DRBZ6i6Tjvr5PXZomk1jSAIommgHHeCIIIax769pwYPPjV4cHMPxCvWAQNRVOQtX6XWbqZ+4ti391RCfKDEt2PfXt6Xvh5qybpgoXXBQh8bNHEuikhYr3NhMd89YaY/XkMNQbxDmiaDv4VhVnpBEIQ3SLgTBBFgHBvfDqypnLQ6r96x2KYsQ/QmZwOluesxBxC1syZx+no5RVoTZqKoyMdEBe5J/74lPgBH7go+MaOcED213qkgCKJtQqkyBEG0Wpo4wOkjFyJQcfd60HS1s2b4kx/SZBkyptTf77Je5/L2kGe6Ds1kCILwhIQ7QRBEg2hbAkvtoqqHh9X1Gr0pr0nDz9XYo631+G0no92TtvXxIYgGQ8KdMMFut5eUlHiuj4mJafrBEES9qYe3I+EDfWRa6C1hImQtKiIRRhAE0aiQcCdMOHr0aGZmZo8ePQzrIyIihg8f3ixDIoj6QZLdN0rDVwAesc+WYkfYZD6hTQC9XQmC8A0Jd8IrBQUFzT0EgmgsAq5KW1l7eS15Q9fyybFvb63XjdcV+O8030CUiUdRESIjm+ykASf4Z0cEQQQJJNwJgmh+mji4a6pKG35Aa3Z2MCiwRu2K6nlMx8a39ddTWaitS1QTt241nLR+PpgEQRDNDtlBEgTRzHjKvpaFZ4slb1gTZja20U1dj8/9Ir8fO9YgoDWjd78LK+tHoC5Iyw23EwRB+A9F3Alz7HZ7bGys+DMyMjIlJUW/QUlJSWFhodj46NGjzz77LP8zJiamT58+TTZUgqgr+pSPhod+pYQE5K6sdTOtiDNAYX5T6mFuKM2fJzkcJodyj0l75sD4OFGTyehguMVBEATRZEiMseYeAxGM6F1luEbv0aOHPuu9pKRESHm73R4RESEeiomJufPOO5tsqESzcOk99/KFw6+/FoCjRY0EcLh4W8MPVb9TA0Bk5OHn/t6IJ7rnXtEesrGfKXtukfTE44E94GXvvceXxeDFpft+wAAAUnaW/wcU+zbLi04QrR6r1dqlS5fmHgUReEi4t10KCwtFyFyPaU2q3W6PiYnJzMw0dZUpLCwsKSl56qmnAj9KP3A4HFartVlO3ZbxP1Ad5C+QFjYOUHWjjyvTLInd/lDra8TmPt1lwwZlY2EEGaxPp/UR5B8iIjhfIBLurRJKlWm71MnYMSIiokePHnY1XkgQrQbHvr1s2nQAUqCzOzwLNINc4PowxpHmz4Mq3DV099mCDfLvJwiiVULCve0SERHhraGS3W4vKCjQJ7XzLPaIIP6dJoh6I63Oq/e+rcZEvFZjHFM/mUYflh94zjeappyAIAii6SHhTpgQERFRWlo6fPjwHj16cLFeUlISExND3ZcIAekha8JMlJbCe8fQFuRzwp5b1NxDqCdivhGcPu6UTUQQRGAhO0jCnIKCgsLCwsjISN4ttbCw0OAqQxCEKY59e/m/5h5IHdBXsloXLGzGkfiJdcFCH+MMklsBeqxrXmnuIRAE0RqgiDvhlYiICBLrBOGNehgvGuB52AgOoak5YxYVebuHECRoxv+6qpsgLydoTV11CYJoRki4EwRB1JOGqkOq9m4wwSbQDTj27WVzn5bmz2vugRAE0UqgVBmCIIhmgM19urmH0OIJwqR2T0i1EwQRQCjiThAE0QyYGyzWnQDm2wR59FrQUsYZQC5dthyAN/8ifcpWG7w4BNGmIOFOEATRPARGY7WufJtWY68ZQPQ5/f7fZLAmzEST3JSgaQNBNCWUKkMQRIunRRihNDatwLfEOmAgiooaWPJLgCdilZaitJQuJkG0MijiThBEy0Zx8g5uI5QmoKX7llDSf614C5+38Xc+QbQpKOJOEEQroW3G3b3ZxltvH8f/Ncuo/MGaMJOnc3D0RZzBHyc2DL5Rcezbe7h4W53UeVNWxDr27T01ePCpwYNp/kAQTQBF3AmCaCU0cW50MDfFZHOfDvLcdy1v+/ZxWlltRESQDLv2BHHeNHfAwCB89TlNOTBpdV6TnYsg2jgk3AmCaNk0u3KiespWhvX2cXz+4E2XU1YPQRDNBQl3giCIBhGEqj1QXpNNgN7FMhg6yPpD413eJrOCIQiihULCnSAIoj40Y6TfnyydxhteQHKE6revdc0rTVCD69j4dq1J9o1xec3ThwAAl0aNbNRTEwTRUiDhThAE0VLxVHiNfsZ6VWQGROsr9kHZ2U2gXEkcEwQRnJCrDEEQBNGIBMTZhtLKCYIgQBF3giDqRzB7qrR6HPv2smnT4d3No/HqZXn6NcvNlRISGnKcur5/WlDWfr3xcSkOF287LzUN5N9CEG0eEu4EQdQZCn82Oz4EXBN0pKqTandsfJsH3UVWT/3ybdr4FJEkO0EQIOFOEESteDpdtIXwZwslOOdULcUuhiAIIsihHHeCIHxhvX0cSktRWmrw2aBeicFJU7bMrDeO3BWOfXtPjR9P7x+CIIg6QRF3giDqA924D9os/4aPp2meWouYYxAEQQQVFHEnCMIXrSbJwTpgIP8X+CPXK2M7aAnOZBuCIAgCFHEnCKJWgi2iXA9ambZuVKiAgSAIImgh4U4QRIunebNWam1QH7RJNd5w7NvL5j7tfyqLcGpvNfdnCIIgghNKlSEIovXgLbLuyF2BiAhERARKOrc4LV5X/FftbO7TsNuVfwRBEERjQsKdIIjWg4/gt2Pj240RD6YkHIKoN9aEmfQJIog6QcKdIIgWT7B7C0ZEKP9aI2QOQ9QP64CBitUsaXeC8BvKcScIojXQxPLRsW8vmzYdgFRbgjvaQOZ38E6ZCIIgWhck3AmCIOoDOdkTRECotbybIAgBCXeCIAgikPDKXQrDE76hdwhB1APKcScIgiAChvDbaYxeVwRBEG0cEu4EQRAEQRAE0QIg4U4QBNF6sA4YyP811wAc+/YG1jKfaAysa15p7iEQBFEfKMedIAjCF3oRHORilM19urmHALQBF52WDn9LW7Ozg/z9TBCEJxRxJwiCaCWQpTpRJyjuThAtDhLuBEEQQUQDc12CvRcVEUw47vtrcw+BIIi6QakyBEEQvmguEWxdsNDx5Jx67Ehxd8I3NK8jiJYLCXeCIIhgpH6qnWgRiDsqpKEJgqgTlCpDEEQz0+xGKEEF5bq0eoKkhpggiJYICXeCIIIFa8LM5h5CUEC5Lq0ben0Jgqg3JNwJgiAIokmh+yoEQdQPynEnCKKZcezby6ZNByDlrmjusRBBjXXBQrSW7H+KuxMEUQ9IuBME0fxIq/OaewhEsCOqIKylpdTjiSCItgmlyhAEQRCEV6wJM6n6giCIIIGEO0EQBNGSaMpwu3XAQJSWorSUZ+kQBEE0L5QqQxAEQbQAqJSTIAiChDtBEESLhxr6NDatoyKWIIiWDgl3giBaNvrOTW1TtlJDn8ajbb6jCIIIWijHnSAIgiAIgiBaABRxJwiCaNlI8+dhz57mHgVBEATR6JBwJwiiZaP1b2rDZvDka04QBNEWIOFOEESLpy1LdoIgCKLtQDnuBEEQBEEQBNECIOFOEARBEARBEC0AEu4EQRBEUENdSwmCIDgk3ImWzYEDB9q3b9/coyC88uOPP5aXlzf3KAhfBPOHyJow0zpgIIqK9G79bQ3+ITp9+nRzD4TwCr1ARJNBwp1o2aSkpGRmZjb3KAivHDt2LDY29scff2zugRBeycrKSklJae5REL6IjY0tKSlp7lEQXvnHP/4RExPT3KMg2gQk3AmCIIggxZG7ormHQBAthh9//PGBBx74xz/+0dwDIRoREu4EEUSsWLFi165dzT0Kwhfx8fHNPYS2hWPfXv7Pz+137dr14YcfNuqQiAZCH6JG4tixY7t3787KyrrttttIvrdWyMedCAx2u725fiyb8dQB5+eff37vvff+97//NfdAAsbRo0cBvP/++z169GjusQSGo0ePtpr3m6A1PamjR4/a7fbmHkXgaWWpMq3m/cZxOBzB8Esk3iR2uz0rK6uwsDAmJoYS4VoZJNyJBmG32wsKCgoLC6+77rrt27c3ywAANMupG4Ndu3YNGTKk1TwdAMeOHQNw6NChQ4cONfdYAkZreoEAlJSUREREtJondezYsfbt27eapwP1Q2S321vNkyopKenWrVtzjyKQHDlyJBg+RPytIrDb7YWFhbGxsREREc01JCLgkHAn6k9JSUlKSsrw4cMLCwub63vhs88+Gz58eKupT83MzBw+fPjw4cObeyABo6SkJDY29oknnmg1vxyxsbHLli1r7lEEkhMnTgBoNU+qpKTEbre3pkpBu90+fPjwmJiYVvOkTpw40Wreb5yUlJSSkpJgeFLi3mZERAT/QWne8RABh4Q7UR/sdntmZiYX7q3mtyQYiI2Nbe4hELVAb/ggZ/jw4a0yVaY1kZyc3NxDaLUMHz786NGj9NPciiHhTtQNkRsTExPTynIug4FWE5ZuxdDPYfBDn6Mgh8LAjUdmZia9/1s3JNyJOlBYWMhvvTVjboyBmJiYVlP12Crp0aMHKd0gJyYmhtcQE8FJRERETExMkHzlEqYEz1SE3ietHokx1txjIFoAdrs9JSXl6NGjlDNHEARBEATRLFDEnagFfW5MQUFBcw+HIAiCIAiijULCnfBFZmZmaWlpZGRk8OTGEARBEARBtE1IuBPmtOjcGO4pQTON4MHU5YNeoCCBPi9BC31wWhz0aSIaGxLuhJGWlRuTmZmZlZUlSusyMzMLCwvFr11MTEyrsXhv0XCTY8PKiIgIMiZqRvgnPSsri//JKyCpyWLwwHsgeK7PzMykgu9ggP/c8C8x+jQRTQYJd0KjxVk9ctUu/iwsLBS+N1DN5ocPH94inkurJ7Bqg/W8lC9IRw4H6phtDf5hLygoEJ+XlJSU2NjY4J+utx1ochu08F8fEVmnTxPRZFiaewBEsMB7DXLt2yLiBDzaIQLq/ItSn9jD+8b16NGjsLCw+YZJBB4WN6m5h9Di4b3QCwsL9Z+XgoIC3na0ecdGEEGO56+P6afp6NGjNO8iAg4Jd0KJTPN+2iUlJS0iOY9/Uepl+tGjRyMiIjzT8VvK3QPCf6T8dc09hBZPQUFBjx49PD/sLSJBjiCakZKSEi7Txcfn6NGjpp8m3vOkyQdItHIoVaZN0+JyYwTiDrKIDtrtdm+dmFrWU2utiGRQ/vPWwLs60pHDLCtbSk4KyNjaIHa7PTIy0nN9REQERdyDB34jkS9HRETExsa2iMBK60akX4raKm8BL0rUJBoDiri3XUpKSmJiYnjoukXkxtQP+p0LBmJiYiIjIyMiIvjLwe8pN/AnjVQ70boZPnx4cnJyhApfQ9X2LQuaBhMBhyLubRGeG1NSUpKSkhLM7gR2u72kpMSzGfvw4cPr5FDpLRJPBJbCwkJvL5bhbZaSkpKSkqJPCSWaGB+RdZrrBg+GkEpsbOxwleYaEuE/PIGzuUdBtDYo4t62EOnsPNUkmFU7gIiICE8h6A1v2T4tJWu/FeD/iwWqPWhuevToYSrcS0tLSRQGLdxkkIK4wYY3C4TS0lL69SECDkXc2xCimrMFtUGtUw4Pv4+s38Vut2dlZVGxXdPg48UqKSkxFG/xNU0yLsIEbjJdUlKil+n8BhcJ9yCB33LUh1c81xDBAG8YYvg02e123sGwGQdGtEpIuLcJWnQbVP8R05KYmJgePXqUlJSUlJQkJye34qfcUrDb7bGxsfxWj3hp6CeteSkoKIiNjU1OTgYgXpRWXO7S4uCGtvweaY8ePY4ePcqzy+gLLQjJzMz0/DTxb7zmHhrR2pAYY809BqIR0fvGtNafZG7fzpf587Xb7Xa7nd9Wph+5IIG/NKWlpQAiIyPJHyMY0H9e6EUJTviXG0+68CwXIZoX/T1ew69PSkoKfZqIxoCEe2smMzOztLSUfo8JgiAIgiBaAZQq0zppI7kxBEEQBEEQbQcS7q0NfW4MFWUSBBEoWM9L+YJ05HBzjoMgCKINQ8K99dBy26ASBBHksLhJzT0Egmh58Hx3f1YShJ+Qj3srwW63x8TEFBYWtu42qARBEATRIuAGkZ72WZmZmd4aKRBErZBwb/GInko80E7zeIIgAo6Uvw6RkYiMpDwZgvAT7t2ZlZWlvwfO42vDhw+nH2uifpCrTAumLVg9EgRBEEQLxW63c3+IgoKC4cOH8z8jIiJaUBtEItigiHtLhTd3sNvtlBtDEARBEEEI76IFICsri2e0AiCLd6IhUMS95cFzY3iPQ9GMg4pdCIIgCCIIiY2NFdkyMTEx1DSaaAgk3FsSlBtDEARBEC2OHj16AIiIiCDPN6KBUKpMi4HrdcqNIQiCIIgWhBDrdrudhDvRQCji3gKgNqgEQRAE0RLhqe28LJUbRFJvRKIhUMQ9qBFWj5GRkfwD39wjIgiCIAjCXzIzM7l258YyJSUllONONASKuAcvmZmZpaWlkZGRsbGxVHhKEARBEC0LntqqT23nppBcxDfv2IgWCgn3YIRyYwiCIAiiRWPq2l5SUsKDcZTsTtQPSpUJLig3hiAIgiBaAUePHo2IiDC4toscd7vd3nxDI1owFHEPFsjqkSAIgiAIgvBBu+YeAAGoVecAqA0yQRAEQRAEYQqlyjQzIjcmJiampKSEVDtBEARBEARhCkXcmw19bgwVqRAEQRAEQRC+IeHePJSUlKSkpAwfPpxyYwiCIAiCIAh/IOHe1PDcGC7ceV47QRAEQRAEQdQKCfemg3JjCIIgCIIgiHpDwr2JKCws5N2UKDeGIAiCIAiCqAck3BsdaoNKEARBEARBNBwS7o2IPjeGd0ojCIIgCIIgiPpBwr2xyMzMLC0tjYyMpNwYgiAIgiAIouGQcG8ohYWFJSUlJSUlMTExKSkpoNwYgiAIgiAIohGQGGPNPYYWTGZmZlZWlvgzIiIiJiaG58ZwEU8QBEEQBEEQAYGEe/0pKSmJjY01rBw+fDilsxMEQRAEQRABx9LcA2jBmHqxk0E7QRAEQRAE0RiQcK8/PXr08FxJdagEQRAEQRBEY0DCvf6YFp7GxMQ0/UgIgiAIgiCIVg8J9/oTERGRmZlpWEM1qQRBEARBEERjQMWpDYV3WbLb7cOHD6dwO0EQBEEQBNFIkHAnCIIgCIIgiBYApcoQBEEQBEEQRAuAhDtBEARBEARBtABIuBMEQRAEQRBEC4CEO0EQBEEQBEG0AEi4EwRBEARBEEQLgIQ7QRAEQRAEQbQASLgTBEEQBEEQRAuAhDtBEARBEARBtABIuBMEQRAEQRBEC4CEO0EQBEEQBEG0AEi4EwRBEARBEEQLgIQ7QRAEQRAEQbQASLgTBEEQBEEQRAuAhDtBEARBEARBtAD+H4GXw/SMQMMmAAAAAElFTkSuQmCC", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\"\"\"\n", "Draw the PCA (Principal Component Analysis) ellipsoid that contains\n", "50% of a cloud of a pointcloud, then check how many points are inside the surface.\n", "\"\"\"\n", "from vedo import *\n", "import numpy as np\n", "\n", "# settings.default_backend = '2d' # or k3d, ipyvtk, or vtk\n", "\n", "plt = Plotter(size=(1000,500))\n", "\n", "pts = np.random.randn(5000, 3) * [3,2,1]# random gaussian point cloud\n", "\n", "elli = pca_ellipsoid(pts, pvalue=0.5) # group of [ellipse, 3 axes]\n", "plt += elli\n", "\n", "ipts = elli.inside_points(pts) # select points inside mesh\n", "opts = elli.inside_points(pts, invert=True)\n", "plt += Points(ipts, c=\"g\")\n", "plt += Points(opts, c=\"r\")\n", "\n", "printc(\"inside points #\", ipts.npoints, c='g')\n", "printc(\"outside points #\", opts.npoints, c='r')\n", "printc(\"asphericity:\", elli.asphericity())\n", "plt.show(axes=1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plt.close()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.13" } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2023.4.6/examples/notebooks/pore_network.ipynb000066400000000000000000011457541444463326400223420ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import vedo\n", "from numpy import array\n", "\n", "pore_data = {'radius': array([1.19674905, 1.17642665, 1.48423733, 4.11235865, 5.27399875,\n", " 1.6080488 , 5.04062365, 3.28250786, 0.48145194, 1.95844462,\n", " 2.95412234, 6.34223284, 2.68521829, 1.22652792, 1.89028428,\n", " 2.32453223, 2.37981034, 5.88536598, 4.78205451, 3.666239 ,\n", " 5.94103498, 5.94537754, 3.51141173, 5.69892518, 2.37635673,\n", " 1.56836145, 5.27402228, 2.67315768, 2.31724564, 2.92747411,\n", " 1.17457039, 1.1796397 , 0.27594236, 0.58774932, 0.37354945,\n", " 2.94445452, 0.43445867, 1.16996146, 1.12668883, 1.21957642]),\n", " 'center': array([[30., 15., 3.],\n", " [ 4., 47., 3.],\n", " [37., 3., 5.],\n", " [42., 44., 6.],\n", " [16., 19., 8.],\n", " [32., 32., 10.],\n", " [13., 41., 10.],\n", " [37., 24., 12.],\n", " [29., 45., 15.],\n", " [40., 50., 16.],\n", " [22., 49., 19.],\n", " [16., 30., 21.],\n", " [49., 34., 24.],\n", " [35., 34., 28.],\n", " [27., 3., 29.],\n", " [21., 4., 30.],\n", " [24., 15., 32.],\n", " [42., 39., 36.],\n", " [11., 20., 37.],\n", " [29., 31., 37.],\n", " [27., 46., 38.],\n", " [12., 7., 51.],\n", " [46., 48., 52.],\n", " [26., 46., 59.],\n", " [38., 4., 62.],\n", " [40., 49., 63.],\n", " [ 7., 38., 64.],\n", " [49., 4., 65.],\n", " [48., 46., 65.],\n", " [27., 24., 70.],\n", " [50., 50., 70.],\n", " [48., 50., 72.],\n", " [12., 51., 72.],\n", " [41., 36., 73.],\n", " [43., 51., 73.],\n", " [25., 4., 74.],\n", " [34., 25., 74.],\n", " [43., 25., 75.],\n", " [50., 33., 75.],\n", " [45., 38., 75.]]),\n", " 'color': array([[ 0, 0, 0],\n", " [ 1, 1, 1],\n", " [ 2, 2, 2],\n", " [ 3, 3, 3],\n", " [ 4, 4, 4],\n", " [ 5, 5, 5],\n", " [ 6, 6, 6],\n", " [ 7, 7, 7],\n", " [ 8, 8, 8],\n", " [ 9, 9, 9],\n", " [10, 10, 10],\n", " [11, 11, 11],\n", " [12, 12, 12],\n", " [13, 13, 13],\n", " [14, 14, 14],\n", " [15, 15, 15],\n", " [16, 16, 16],\n", " [17, 17, 17],\n", " [18, 18, 18],\n", " [19, 19, 19],\n", " [20, 20, 20],\n", " [21, 21, 21],\n", " [22, 22, 22],\n", " [23, 23, 23],\n", " [24, 24, 24],\n", " [25, 25, 25],\n", " [26, 26, 26],\n", " [27, 27, 27],\n", " [28, 28, 28],\n", " [29, 29, 29],\n", " [30, 30, 30],\n", " [31, 31, 31],\n", " [32, 32, 32],\n", " [33, 33, 33],\n", " [34, 34, 34],\n", " [35, 35, 35],\n", " [36, 36, 36],\n", " [37, 37, 37],\n", " [38, 38, 38],\n", " [39, 39, 39]]),\n", " 'pore_pressure': [0.0,\n", " 0.0,\n", " 0.0,\n", " 0.1,\n", " 10.0,\n", " 7.598155494738002,\n", " 10.0,\n", " 0.1,\n", " 0.0,\n", " 0.1,\n", " 4.9866234871525,\n", " 10.0,\n", " 0.1,\n", " 0.0,\n", " 10.0,\n", " 10.0,\n", " 9.999999999999998,\n", " 0.1,\n", " 10.0,\n", " 5.887868354558643,\n", " 4.512645435262695,\n", " 10.0,\n", " 0.1,\n", " 6.150712624490666,\n", " 6.885571232556974,\n", " 0.1,\n", " 10.0,\n", " 0.1,\n", " 0.1,\n", " 9.908732905890773,\n", " 0.1,\n", " 0.1,\n", " 0.0,\n", " 0.0,\n", " 0.0,\n", " 9.57065941647515,\n", " 0.0,\n", " 0.0,\n", " 0.0,\n", " 0.0]}\n", "\n", "throat_data = {'radius': array([2.90419237, 1.91412649, 4.95871637, 2.66664252, 3.84343485,\n", " 2.91695308, 2.64362353, 2.90442779, 2.16462804, 1.59391792,\n", " 2.89982681, 4.00869598, 2.20213635, 3.22351169, 2.33049898,\n", " 4.0408531 , 3.26135521, 3.53445357, 3.87389098, 5.70235662,\n", " 4.33497331, 3.67944754, 4.31956756, 1.54813143, 2.33478145,\n", " 3.54625105, 3.2341318 , 3.56343412, 2.91256156, 4.51513931,\n", " 3.03150832, 2.90332157, 3.13112118, 4.94121126, 3.87019909,\n", " 2.97949269, 2.96877147, 2.17017842, 2.16641068, 4.14354076,\n", " 4.05124284, 1.24314961, 2.60263205, 1.56828704, 2.91248637,\n", " 1.21171778, 1.54088758, 0.58485084, 1.84036701, 0.40036291]),\n", " 'throat_connection': array([[ 4, 6],\n", " [ 3, 7],\n", " [ 6, 11],\n", " [ 6, 10],\n", " [ 4, 11],\n", " [ 4, 5],\n", " [ 3, 9],\n", " [ 4, 7],\n", " [ 3, 12],\n", " [ 5, 7],\n", " [ 4, 14],\n", " [ 7, 11],\n", " [ 7, 12],\n", " [ 7, 17],\n", " [ 4, 17],\n", " [10, 17],\n", " [12, 17],\n", " [ 4, 15],\n", " [10, 20],\n", " [17, 20],\n", " [ 4, 18],\n", " [11, 20],\n", " [11, 19],\n", " [14, 15],\n", " [ 4, 16],\n", " [11, 18],\n", " [17, 19],\n", " [15, 21],\n", " [19, 20],\n", " [18, 21],\n", " [19, 21],\n", " [20, 26],\n", " [20, 22],\n", " [20, 23],\n", " [23, 26],\n", " [21, 26],\n", " [22, 23],\n", " [22, 28],\n", " [24, 27],\n", " [21, 24],\n", " [21, 35],\n", " [25, 28],\n", " [26, 29],\n", " [24, 35],\n", " [21, 29],\n", " [28, 30],\n", " [27, 35],\n", " [30, 31],\n", " [29, 35],\n", " [38, 39]]),\n", "}\n", "\n", "throat_coordinates = list()\n", "throat_connectivity = throat_data['throat_connection']\n", "for throat_connection in throat_connectivity:\n", " pore_i = throat_connection[0]\n", " pore_j = throat_connection[1]\n", " pore_i_coordinate = pore_data['center'][pore_i]\n", " pore_j_coordinate = pore_data['center'][pore_j]\n", " throat_coordinates.append((pore_i_coordinate, pore_j_coordinate))\n", "\n", "pores_rendering_list = list()\n", "for idx in range(len(pore_data['center'])):\n", " pore_rendering = vedo.Sphere(\n", " pos=pore_data['center'][idx],\n", " r=pore_data['radius'][idx],\n", " # c=pore_data['color'][idx] /50\n", " c=vedo.color_map(pore_data['pore_pressure'][idx], name='jet', vmin=0, vmax=10)\n", " )\n", " pores_rendering_list.append(pore_rendering)\n", "\n", "# just create a temporary Points and extract a scalarbar\n", "sb = vedo.Points(pore_data['center']\n", " ).cmap('jet', pore_data['pore_pressure']\n", " ).add_scalarbar(c='k', title='pore\\npressure').scalarbar\n", "\n", "cylinder_radius_scale_factor = 0.5\n", "throats_rendering_list = list()\n", "for idx, throat_coordinate in enumerate(throat_coordinates):\n", " cylinder_radius = cylinder_radius_scale_factor * throat_data['radius'][idx]\n", " throats_rendering = vedo.Cylinder(\n", " pos=(throat_coordinate[0], throat_coordinate[1]),\n", " r=cylinder_radius,\n", " c=vedo.color_map(cylinder_radius, name='bone', vmin=0, vmax=5),\n", " )\n", " throats_rendering_list.append(throats_rendering)\n", "\n", "vedo.show(*pores_rendering_list, *throats_rendering_list, sb, axes=1, zoom=1.5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2023.4.6/examples/notebooks/shrink.ipynb000066400000000000000000001123441444463326400211060ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "37ffab037b1847aaa7db0a1c2894b734", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Plot(antialias=True, axes=['x', 'y', 'z'], axes_helper=1.0, axes_helper_colors=[16711680, 65280, 255], backgro…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\"\"\"Shrink the triangulation of a mesh to make the inside visible.\"\"\"\n", "from vedo import *\n", "\n", "settings.default_backend = 'k3d' # or k3d, 2d or vtk\n", "\n", "pot = Mesh(dataurl+\"teapot.vtk\").shrink(0.75)\n", "s = Sphere(r=0.2).pos(0, 0, -0.5)\n", "show(pot, s, axes=1, bg=\"gray1\", viewup='z')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", "vedo.mesh.Mesh
(...bl.es/examples/data/teapot.vtk)\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
-1.505 ... 1.664
-0.9845 ... 0.9843
-0.8471 ... 0.7045
center of mass (-8.90e-3, -1.19e-4, 3.90e-3)
average size 0.960
nr. points / faces 18960 / 6320
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pot" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2023.4.6/examples/notebooks/slider2d.ipynb000066400000000000000000000074461444463326400213260ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "d7392fcc", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "e9c49f3446564b878da7b61202e6ecaf", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "cae768630c2547f68a5ed31f5717b44c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Button(button_style='info', description='Change Color', style=ButtonStyle(), tooltip='click to select a random…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "ea344652cf2247369609f6b6ad98de33", "version_major": 2, "version_minor": 0 }, "text/plain": [ "FloatSlider(value=0.0, description='x-position', max=0.2, min=-0.2, step=0.02)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.display import display, clear_output\n", "import ipywidgets as widgets\n", "from vedo import *\n", "\n", "############################## button\n", "button = widgets.Button(\n", " description='Change Color',\n", " button_style='info',\n", " tooltip='click to select a random color',\n", ")\n", "\n", "def on_button_click(b):\n", " with out:\n", " rgb = (np.random.rand(3)*255).astype(int)\n", " mesh.color(rgb)\n", " vtxt.text(f\"RGB: {rgb} \\n({get_color_name(rgb)})\")\n", " clear_output(wait=True)\n", " img = plt.show()\n", " display(img)\n", "button.on_click(on_button_click)\n", "\n", "############################## slider\n", "slider = widgets.FloatSlider(\n", " description='x-position', \n", " min=-0.2, value=0, max=0.2, \n", " step=0.02,\n", " continuous_update=True,\n", ")\n", "\n", "def on_slider(change):\n", " with out:\n", " value = change['new']\n", " mesh.x(slider.value)\n", " clear_output(wait=True)\n", " img = plt.show(resetcam=True)\n", " display(img)\n", "slider.observe(on_slider, names='value')\n", "\n", "############################################## vedo\n", "# settings.default_backend = \"2d\" # this example only works with \"2d\"\n", "settings.backend_autoclose = False # do not close Plotter after show()\n", "\n", "plt = Plotter(size=[600,500], axes=1, bg2=\"lightblue\")\n", "mesh = Mesh(dataurl+\"bunny.obj\").color(\"white\")\n", "vtxt = Text2D(font=\"Cartoons123\")\n", "plt += [mesh, vtxt]\n", "\n", "out = widgets.Output()\n", "display(out, button, slider)\n", "with out:\n", " img = plt.show()\n", " display(img)" ] }, { "cell_type": "code", "execution_count": 11, "id": "d3d61d2b", "metadata": {}, "outputs": [], "source": [ "plt.close()" ] }, { "cell_type": "code", "execution_count": null, "id": "f1ac44ea", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 5 } vedo-2023.4.6/examples/notebooks/sphere.ipynb000066400000000000000000002234741444463326400211050ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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BYCenp6vf/3req299trr05/+9MgPjAWLGTOSCFajttbA1+CMcmEW21UWBy8678+b+odasy0cg5PJvK9Svnuh1eJbVLAR7YbcFKEduDJrEc1ylwbtiooUtSvTJ417pQuOfXoIVdmWVJvHNCiFZkI6mpWolRPHSiNe/xufnDYksSpp4ljJZxxXCvMWnPne92Ver7GAC9snN+Vy+ZOf/OTq1atPP/30jRs3/tu//dsll1yyePHiZOkvf/nL5cuXn3zyybt27br66qvf/e53P//883fcccfb3/52ALj66qvPOOOMl73sZY8++ugpp5xy+umnJ2u1tbU15Nh4oFFmzOjp6bnsssv89zEPgyQzePjhh3/gAx8Y+dY0o6BZbFf5bNiw4bniL4daqkU6M2uw8lKE4IasAtlAYlbV1ApC6b/cwJWVFgTiQWCbE+TblbXo2KeHkiU6IZiOZaXGVpBIJqRpoeO2S8RYgh5c9JfxySiljl3JSvqSwTiupIOLViqxjFesv/cjl185rsJXwIXtk52rrrpq586dZ511VjL7xz/+8YEHHnj/+9/v9/zf//3fbdu2bdmypaur64gjjgCAPXv2fPCDH7z99tuvvfba2bNnn3322Y09No5gMWNGox4k1AO1N9auoPmFWWxX+STnZ1H53L/2fyGrT1bFlT2HtN1LFhKHomqFdNJuCaqVnnXq3J1UYK5m2eVWjl1huqJlYMauup4eQgAJpjMSl0J3Qg8iqoe2SkhmtXjhjfEpoOwKZYyxHu8q/UhKr/bf/NAhp52xZPmKrCs1+nBycCrwzDPPnHjiiXr2wAMPvOGGG2iHP/zhD08++eTzzz+/YcOGz3zmM7t37/73f//3ffbZp7W19cknnxwcHHz66acB4MYbb1y3bt2MGTNOPPHEgw8+uCHHxoLFjCUjf5DQGai9GTRJs9iu8tHnZ1rL/ANnvf/hHd9we3jBd0uigqblaFZWKMvErDJECog/kU3VEbiCcFow+UUiVdXt6jiaDXS9ykgVKVoP5AepaZHMIP4yPsUMziANKKWqcI8xlgc994ict+DDF38axscDucB2NWUYGhpqaWnRs62trVJaD8esXLly2rRpGzduXL9+faVSWb58+Ze//OUnn3wSEVeuXPm1r31tYGDgzDPP3G+//QBg165dn//859/0pjede+65Iz82FixmLBnhg4T5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Rq3ow4NvWv8HE6wK5ASpYJmhGSpSDknZu2D/8tBApVxesGDeBe97xzHHHD22J60qXNjOjJyNT28/4tXL9OzeB8777U+eyV963kWHfuPTf16xz+yWtkLvE9sqA7Oefvrp/fbbL+mzbt2673//+9/+9reT2UceeeT+++//+Mc/PoxjY8FipiInnnji008/3d3dXSqVmv266HGLfsYQqmnWFA9fJSyYM/Nj573hl3fc++s/P+54lffAIIBrUXlqBQCI8o3r/yARK7ZR0YSgFb5SsasYcSiO08DV0GC5XF64cN6nL/nUOC+6SuDSK2bklIdksaWgZ1vaClJi/tJFy2d88uqT+p7YhghL95r1l+8uGBgYSDps2rTpwgsvvOqqqxL7r1QqF1988RVXXDG8Y4uqd2GYychVV13V09MzMDDwpje96ZprrhnrwxkzOjs7k2hWYlo+bFeU044//F/e86aVi2ap9yurlwCqtywnLwREaZbK9EM1mp4SpXzT+tvfuO73p667PZZIfmT6g+lPMuCC/YNDMn564cvXzd9/cGhwaHBgcHDgnHPO+MY3v8x2xUwdFiyd9uLmXXr2+b5dtMg9a2kUic6Xz115wNy29sL999+/7777AsCLL774oQ996NJLLy2VSkn/r3zlK6effvqw/4XiGixmUrF27VoAWLNmjW7p6+vr6enp7e1dvXq1/teG0rzXRU84fJdiu8riF7f/9Vd3P2IVYJnQFa1qdwZrQEB8xYuPlXY+hwgSMB3fKhSjouXtOqCVZAkrUiaBq0qlnBRdLVw0//1/e/74TwsCl14xDeV7d1/wzUv+/MHPHTNtZkulLL95yZ/f8Pb99z4o1fetLwz4S3dtH1qwdPqyvWYBwE3ffXwRnvjpT386Kbq65JJLDjoord964oknLr744h/+8IdCiOEdGwsWM9no6+tbu3ZtqVRas2aN9q2ksaura9WqVcG1Gv666AkKzRiyXeXz0rYd1/z3755+tt8VKc+3ErU6fd3vk45SJQuTCb/WKiRbpra9LOX6RQdUyuVypVypDC1YMP+kk7re+a63jfX5qAm2K6axyF++745HX7r8f55MMoPvenXnW49ZvmnLwD99/6Fvf+RIAPCXPrF552d/8tjWXeWhijxm//n//M3bisXihz/84Z6eHv1/wj/84Q/feOONyRtBhn1sLFjM5EQHrmg0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", "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import *\n", "\n", "s = Sphere().cut_with_plane(normal=(1,1,1))\n", "scals = s.points()[:,2] # use z-coords to color vertices\n", "\n", "# NB, actions can be concatenated into a pipeline:\n", "# add point scalars with a choice of color map, use flat shading, print infos and then show\n", "s.cmap('Set3', scals).add_scalarbar()\n", "s.show(axes=1, viewup='z')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 2 } vedo-2023.4.6/examples/notebooks/test_types.ipynb000066400000000000000000005172421444463326400220210ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "31128ecf", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Mr. Rabbit:   vedo.mesh.Mesh
(...mbl.es/examples/data/bunny.obj)\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
-0.09438 ... 0.06078
0.03331 ... 0.1870
-0.06168 ... 0.05871
center of mass (-0.0280, 0.0942, 9.05e-3)
average size 0.063
nr. points / faces 2503 / 4968
cell data array Quality
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import dataurl, Mesh\n", "mesh = Mesh(dataurl + \"bunny.obj\")\n", "mesh.name = \"Mr. Rabbit\"\n", "mesh.compute_quality().cmap(\"Reds\")\n", "mesh" ] }, { "cell_type": "code", "execution_count": 3, "id": "59ebe06a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Wild-type Embryo:   vedo.volume.Volume\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
0 ... 1.290e+4
0 ... 8219
0 ... 1.103e+4
dimensions (125, 80, 107)
voxel spacing (104, 104, 104)
in memory size 1MB
point data array Tiff Scalars
scalar range (0, 150.0)
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import dataurl, Volume\n", "vol = Volume(dataurl+\"embryo.tif\")\n", "vol.name = \"Wild-type Embryo\"\n", "vol" ] }, { "cell_type": "code", "execution_count": 4, "id": "b22e6d01", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Domestic Cat:   vedo.picture.Picture
(...onalGeographic_2572187_2x3.jpg)\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
shape (2048, 3072)
in memory size 18432 KB
point data array JPEGImage
intensity range (0.0, 255.0)
level / window 127.5 / 255.0
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import Picture\n", "pic = Picture(\"https://i.natgeofe.com/n/548467d8-c5f1-4551-9f58-6817a8d2c45e/NationalGeographic_2572187_2x3.jpg\")\n", "pic.name = \"Domestic Cat\"\n", "pic" ] }, { "cell_type": "code", "execution_count": 5, "id": "ddd6fbb6", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " MouseLimb:   vedo.tetmesh.TetMesh\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
0 ... 1416
-711.3 ... 700.2
-851.6 ... 463.9
center of mass (582, 18.1, -252)
nr. points / tets 10926 / 58977
cell data array chem_0
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import dataurl, TetMesh\n", "tet = TetMesh(dataurl+\"limb_ugrid.vtk\")\n", "tet.name = \"MouseLimb\"\n", "tet" ] }, { "cell_type": "code", "execution_count": 6, "id": "221660dc", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " UGrid:   vedo.ugrid.UGrid
(/tmp/ugrid.vtk)\n", "\n", "\n", "\n", "\n", "\n", "\n", "
bounds
(x/y/z)
0 ... 5.993
0 ... 2.000
0 ... 3.000
center of mass (3.64, 1.15, 1.64)
nr. points / cells 26 / 80
point data array SignedDistances
cell data array elem_val
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import dataurl, UGrid, Cylinder\n", "ug1 = UGrid(dataurl+'ugrid.vtk')\n", "cyl = Cylinder(r=3, height=7).x(3)\n", "ug1.cut_with_mesh(cyl)" ] }, { "cell_type": "code", "execution_count": 7, "id": "24f64426", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Axes:   vedo.assembly.Assembly\n", "\n", "\n", "\n", "\n", "\n", "
nr. of objects 26
position (0.0, 0.0, 0.0)
diagonal size 3.7067
bounds
(x/y/z)
-1.204 ... 1.011
-1.164 ... 1.011
-1.013 ... 1.013
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo import Sphere, Axes\n", "axes = Axes(Sphere())\n", "axes" ] }, { "cell_type": "code", "execution_count": 8, "id": "5ab995ad", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "\n", "
\n", " Histogram1D:   vedo.pyplot.Figure\n", "\n", "\n", "\n", "\n", "\n", "\n", "
nr. of parts 44
position (0.0, 0.0, 0.0)
x-limits (-3.445, 3.300)
y-limits (0, 135.0)
world bounds
(x/y/z)
-3.814 ... 3.300
-0.2101 ... 5.239
0 ... 1.349e-3
\n", "
" ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from vedo.pyplot import np, histogram\n", "data = np.random.randn(1000)\n", "histo = histogram(data)\n", "histo" ] }, { "cell_type": "code", "execution_count": null, "id": "d6788c1f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "01177e99", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.10" } }, "nbformat": 4, "nbformat_minor": 5 } vedo-2023.4.6/examples/other/000077500000000000000000000000001444463326400156565ustar00rootroot00000000000000vedo-2023.4.6/examples/other/__init__.py000066400000000000000000000000051444463326400177620ustar00rootroot00000000000000# # vedo-2023.4.6/examples/other/clone2d.py000066400000000000000000000012351444463326400175570ustar00rootroot00000000000000"""Make a static 2D copy of a mesh and place it in the rendering window""" from vedo import Mesh, dataurl, show man3d = Mesh(dataurl+'man.vtk').rotate_z(20).rotate_x(-70).scale(0.2) man3d.c('darkgreen').lighting('glossy') # Make a 2D snapshot of a 3D mesh # The coordinate system options are # 0. Displays # 1. Normalized Display # 2. Viewport (origin is the bottom-left corner of the window) # 3. Normalized Viewport # 4. View (origin is the center of the window) # 5. World (anchor the 2d image to mesh) # (returns a vtkActor2D) man2d = man3d.clone2d(pos=[0.4,0.4], coordsys=4, c='r', alpha=1) show(man3d, man2d, __doc__, axes=1).close() vedo-2023.4.6/examples/other/dolfin/000077500000000000000000000000001444463326400171315ustar00rootroot00000000000000vedo-2023.4.6/examples/other/dolfin/README.md000066400000000000000000000007701444463326400204140ustar00rootroot00000000000000# _FEniCS/Dolfin_ examples In this directory you will find a bunch of examples of to visualize meshes in conjunction with [FEniCS/Dolfin](https://fenicsproject.org/) package. The `plot()` function emulates the *matplotlib* functionality. To gain more control on the property of the shown objects one can access the output of the `plot()` method and change their properties, e.g.: ```python plt = plot(u_solution) msh = plt.actors[0] msh.color('blue').alpha(0.5).cut_with_plane() # etc plt.show() ``` vedo-2023.4.6/examples/other/dolfin/__init__.py000066400000000000000000000000031444463326400212330ustar00rootroot00000000000000# #vedo-2023.4.6/examples/other/dolfin/ascalarbar.py000066400000000000000000000006761444463326400216070ustar00rootroot00000000000000"""#Control scalar bar range. > plot(u, mode='color', vmin=-3, vmax=3, style=1) Available styles: 0. vtk 1. matplotlib 2. meshlab 3. paraview 4. bw """ from dolfin import * mesh = UnitSquareMesh(16, 16) V = FunctionSpace(mesh, 'Lagrange', 1) f = Expression('10*(x[0]+x[1]-1)', degree=1) u = interpolate(f, V) ################################## vedo from vedo.dolfin import plot plot(u, mode='color', vmin=-3, vmax=3, style=1, text=__doc__) vedo-2023.4.6/examples/other/dolfin/awefem.py000066400000000000000000000063021444463326400207500ustar00rootroot00000000000000""" Solve the constant velocity scalar wave equation in an arbitrary number of dimensions. It injects a point source with a time-dependent source time function. """ #Original script by Carlos da Costa: #https://github.com/cako/fenics-scripts/blob/master/awefem/awefem.py # from dolfin import * from vedo import ProgressBar, printc, download, settings from vedo.dolfin import plot import numpy as np set_log_level(30) def ricker_source(t, f=40): t -= 2 / f return (1 - 2 * (np.pi*f*t)**2) * np.exp(-(np.pi*f*t)**2) def sine_source(t, f=40): return np.sin(2 * np.pi*f*t) def awefem(mesh, t, source_loc=None): # Function space V = FunctionSpace(mesh, "Lagrange", 1) # Boundary condition bc = DirichletBC(V, Constant(0), "on_boundary") # Trial and test functions u = TrialFunction(V) v = TestFunction(V) # Discretization c = 6 dt = t[1] - t[0] u0 = Function(V) # u0 = uN-1 u1 = Function(V) # u1 = uN1 # Variational formulation F = (u - 2 * u1 + u0) * v * dx + (dt * c) ** 2 * dot( grad(u + 2 * u1 + u0) / 4, grad(v) ) * dx a, L = lhs(F), rhs(F) # Solver A, b = assemble_system(a, L) solver = LUSolver(A, "mumps") solver.parameters["symmetric"] = True bc.apply(A, b) # Solution u = Function(V) # uN+1 # Source if source_loc is None: mesh_center = np.mean(mesh.coordinates(), axis=0) source_loc = Point(mesh_center) else: source_loc = Point(source_loc) # Time stepping printc('\bomb Hit F1 to interrupt.', c='yellow') pb = ProgressBar(0, len(t)) for i, t_ in enumerate(t[1:]): pb.print() b = assemble(L) delta = PointSource(V, source_loc, ricker_source(t_) * dt**2) delta.apply(b) solver.solve(u.vector(), b) u0.assign(u1) u1.assign(u) if t_>0.03: plt = plot( u, warpZfactor=20, # set elevation along z vmin=.0, # sets a minimum to the color scale vmax=0.003, cmap='rainbow', # the color map style alpha=1, # transparency of the mesh lw=0.1, # linewidth of mesh scalarbar=None, #lighting='plastic', #elevation=-.3, interactive=False, ) # continue execution plt.clear() plt.interactive() if __name__ == "__main__": ot, dt, nt = 0, 1e-3, 150 t = ot + np.arange(nt) * dt print("Computing wavefields over dolfin mesh") fpath = download("https://vedo.embl.es/examples/data/dolfin_fine.xml") mesh = Mesh(fpath) awefem(mesh, t, source_loc=(0.8, 0.8)) # print('Computing wavefields over unit square') # mesh = UnitSquareMesh(100, 100) # u = awefem(mesh, t, source_loc=(0.8, 0.7)) # print('Computing wavefields over unit circle') # domain = Circle(Point(0., 0.), 1) # mesh = generate_mesh(domain, 50) # u = awefem(mesh, t, source_time_function=sine_source) # print('Computing wavefields over unit cube') # print('need to set alpha=0.1 and warpZfactor=0') # mesh = UnitCubeMesh(15, 15, 15) # u = awefem(mesh, t, source_loc=(0.8, 0.7, 0.7)) vedo-2023.4.6/examples/other/dolfin/calc_surface_area.py000066400000000000000000000021571444463326400231120ustar00rootroot00000000000000from dolfin import * import sympy as sp # Credits: # https://github.com/pf4d/fenics_scripts/calc_surface_area.py x, y = sp.symbols('x, y') # surface : def s(x,y): return sp.exp(x) # x-derivative of surface def dsdx(x,y): return s(x,y).diff(x, 1) # y-derivative of surface def dsdy(x,y): return s(x,y).diff(y, 1) # outward-pointing-normal-vector magnitude at surface : def n_mag_s(x,y): return sp.sqrt(1 + dsdx(x,y)**2 + dsdy(x,y)**2) # surface area of surface : def area(x,y): return sp.integrate(n_mag_s(x,y), (x,0,1), (y,0,1)) A_exact = area(x,y) for n in [5,10,100,500]: mesh = UnitSquareMesh(n,n) Q = FunctionSpace(mesh, "CG", 1) e = Expression('exp(x[0])', degree=2) f = interpolate(e, Q) A_num = assemble( sqrt(f.dx(0)**2 + f.dx(1)**2 + 1) * dx) print('for n = %i -- error = %.2e' % (n, abs(A_exact.evalf()-A_num))) n = 10 mesh = UnitSquareMesh(n,n) Q = FunctionSpace(mesh, "CG", 1) e = Expression('exp(x[0])', degree=2) f = interpolate(e, Q) A_vector = project( sqrt(f.dx(0)**2 + f.dx(1)**2 + 1), Q) from vedo.dolfin import plot plot(A_vector) vedo-2023.4.6/examples/other/dolfin/collisions.py000066400000000000000000000020601444463326400216570ustar00rootroot00000000000000''' compute_collision() will compute the collision of all the entities with a Point while compute_first_collision() will always return its first entry. Especially if a point is on an element edge this can be tricky. You may also want to compare with the Cell.contains(Point) tool. ''' # Script by Rudy at https://fenicsproject.discourse.group/t/ # any-function-to-determine-if-the-point-is-in-the-mesh/275/3 import dolfin from vedo.dolfin import plot from vedo import printc, pointcloud n = 4 Px = 0.5 Py = 0.5 mesh = dolfin.UnitSquareMesh(n, n) bbt = mesh.bounding_box_tree() collisions = bbt.compute_collisions(dolfin.Point(Px, Py)) collisions1st = bbt.compute_first_entity_collision(dolfin.Point(Px, Py)) printc("collisions : ", collisions) printc("collisions 1st: ", collisions1st) for cell in dolfin.cells(mesh): contains = cell.contains(dolfin.Point(Px, Py)) printc("Cell", cell.index(), "contains P:", contains, c=contains) ########################################### pt = pointcloud.Point([Px, Py], c='blue') plot(mesh, pt, text=__doc__) vedo-2023.4.6/examples/other/dolfin/demo_eigenvalue.py000066400000000000000000000020001444463326400226230ustar00rootroot00000000000000# A simple eigenvalue solver # ========================== from dolfin import * from vedo import download from vedo.dolfin import plot # Define mesh, function space fpath = download("https://vedo.embl.es/examples/data/box_with_dent.xml.gz") mesh = Mesh(fpath) V = FunctionSpace(mesh, "Lagrange", 1) # Define basis and bilinear form u = TrialFunction(V) v = TestFunction(V) a = dot(grad(u), grad(v))*dx # Assemble stiffness form A = PETScMatrix() assemble(a, tensor=A) # Create eigensolver eigensolver = SLEPcEigenSolver(A) # Compute all eigenvalues of A x = \lambda x print("Computing eigenvalues. This can take a minute.") eigensolver.solve() # Extract largest (first) eigenpair r, c, rx, cx = eigensolver.get_eigenpair(0) print("Largest eigenvalue: ", r) # Initialize function and assign eigenvector u = Function(V) u.vector()[:] = rx # plot eigenfunction on mesh as colored points (ps=point size) plot(u, mode='mesh', ps=12, cmap='gist_earth') #or as wireframe plot(u, mode='mesh', wireframe=True, cmap='magma') vedo-2023.4.6/examples/other/dolfin/demo_submesh.py000066400000000000000000000020131444463326400221510ustar00rootroot00000000000000""" how to extract matching sub meshes from a common mesh. """ from dolfin import * class Structure(SubDomain): def inside(self, x, on_boundary): return x[0] > 1.4 - DOLFIN_EPS and x[0] < 1.6 \ + DOLFIN_EPS and x[1] < 0.6 + DOLFIN_EPS mesh = RectangleMesh(Point(0.0, 0.0), Point(3.0, 1.0), 60, 20) # Create sub domain markers and mark everaything as 0 sub_domains = MeshFunction("size_t", mesh, mesh.topology().dim()) sub_domains.set_all(0) # Mark structure domain as 1 structure = Structure() structure.mark(sub_domains, 1) # Extract sub meshes fluid_mesh = SubMesh(mesh, sub_domains, 0) structure_mesh = SubMesh(mesh, sub_domains, 1) # Move structure mesh for x in structure_mesh.coordinates(): x[0] += 0.1*x[0]*x[1] # Move fluid mesh according to structure mesh ALE.move(fluid_mesh, structure_mesh) fluid_mesh.smooth() ############################################# from vedo.dolfin import plot plot(fluid_mesh, text=__doc__, interactive=False) plot(structure_mesh, c='tomato', add=True) plot() vedo-2023.4.6/examples/other/dolfin/elasticbeam.py000066400000000000000000000034651444463326400217640ustar00rootroot00000000000000"""A beam deforming under its own weight.""" from dolfin import * # Scaled variables l, w = 1, 0.1 mu_, lambda_ = 1, 1 rho = 10 gamma = (w/l)**2 wind = (0, 0.0, 0) # Create mesh and define function space mesh = BoxMesh(Point(0, 0, 0), Point(l, w, w), 50, 5, 5) V = VectorFunctionSpace(mesh, "P", 1) # Define boundary condition def clamped_boundary(x, on_boundary): return on_boundary and (near(x[0], 0) or near(x[0], l)) bc = DirichletBC(V, Constant((0, 0, 0)), clamped_boundary) # Define strain and stress def epsilon(u): return 0.5 * (nabla_grad(u) + nabla_grad(u).T) def sigma(u): return lambda_ * nabla_grad(u) * Identity(3) + 2 * mu_ * epsilon(u) # Define variational problem u = TrialFunction(V) v = TestFunction(V) f = Constant((0, 0, -rho * gamma)) T = Constant(wind) a = inner(sigma(u), epsilon(v)) * dx L = dot(f, v) * dx + dot(T, v) * ds # Compute solution u = Function(V) solve(a == L, u, bc) s = sigma(u) - (1.0 / 3) * tr(sigma(u)) * Identity(3) # deviatoric stress von_Mises = sqrt(3.0 / 2 * inner(s, s)) V = FunctionSpace(mesh, "P", 1) von_Mises = project(von_Mises, V) u_magnitude = sqrt(dot(u, u)) u_magnitude = project(u_magnitude, V) ################################ Plot solution from vedo import Text3D from vedo.dolfin import plot plot( u, mode="displaced mesh", text=__doc__, scalarbar=False, axes=1, viewup='z', ) #export_window('elasticbeam1.x3d') # generate a html test page txt = Text3D("Von Mises stress intensity", pos=(0.1,.12,0), s=0.03, c='white') plot(von_Mises, txt, cmap='plasma', scalarbar=False, new=True) #export_window('elasticbeam2.x3d') # generate a html test page txt = Text3D("Magnitude of displacement", pos=(0.1,.12,0), s=0.03, c='white') plot(u_magnitude, txt, scalarbar=False, new=True) #export_window('elasticbeam3.x3d') # generate a html test page vedo-2023.4.6/examples/other/dolfin/elastodynamics.py000066400000000000000000000146001444463326400225230ustar00rootroot00000000000000'''Time-integration of the elastodynamics equation ''' from dolfin import * import numpy as np # Form compiler options parameters["form_compiler"]["cpp_optimize"] = True parameters["form_compiler"]["optimize"] = True # Define mesh mesh = BoxMesh(Point(0., 0., 0.), Point(1., 0.1, 0.04), 20, 5, 4) # Sub domain for clamp at left end def left(x, on_boundary): return near(x[0], 0.) and on_boundary # Sub domain for rotation at right end def right(x, on_boundary): return near(x[0], 1.) and on_boundary # Elastic parameters E = 800.0 nu = 0.3 mu = Constant(E / (2.0*(1.0 + nu))) lmbda = Constant(E*nu / ((1.0 + nu)*(1.0 - 2.0*nu))) # Mass density rho = Constant(1.0) # Rayleigh damping coefficients eta_m = Constant(0.) eta_k = Constant(0.) # Generalized-alpha method parameters alpha_m = Constant(0.2) alpha_f = Constant(0.4) gamma = Constant(0.5+alpha_f-alpha_m) beta = Constant((gamma+0.5)**2/4.) # Time-stepping parameters T = 4.0 Nsteps = 50 dt = Constant(T/Nsteps) p0 = 1. cutoff_Tc = T/5 # Define the loading as an expression depending on t p = Expression(("0", "t <= tc ? p0*t/tc : 0", "0"), t=0, tc=cutoff_Tc, p0=p0, degree=0) # Define function space for displacement, velocity and acceleration V = VectorFunctionSpace(mesh, "CG", 1) # Define function space for stresses Vsig = TensorFunctionSpace(mesh, "DG", 0) # Test and trial functions du = TrialFunction(V) u_ = TestFunction(V) # Current (unknown) displacement u = Function(V, name="Displacement") # Fields from previous time step (displacement, velocity, acceleration) u_old = Function(V) v_old = Function(V) a_old = Function(V) # Create mesh function over the cell facets boundary_subdomains = MeshFunction("size_t", mesh, mesh.topology().dim() - 1) boundary_subdomains.set_all(0) force_boundary = AutoSubDomain(right) force_boundary.mark(boundary_subdomains, 3) # Define measure for boundary condition integral dss = ds(subdomain_data=boundary_subdomains) # Set up boundary condition at left end zero = Constant((0.0, 0.0, 0.0)) bc = DirichletBC(V, zero, left) # Stress tensor def sigma(r): return 2.0*mu*sym(grad(r)) + lmbda*tr(sym(grad(r)))*Identity(len(r)) # Mass form def m(u, u_): return rho*inner(u, u_)*dx # Elastic stiffness form def k(u, u_): return inner(sigma(u), sym(grad(u_)))*dx # Rayleigh damping form def c(u, u_): return eta_m*m(u, u_) + eta_k*k(u, u_) # Work of external forces def Wext(u_): return dot(u_, p)*dss(3) # Update formula for acceleration # a = 1/(2*beta)*((u - u0 - v0*dt)/(0.5*dt*dt) - (1-2*beta)*a0) def update_a(u, u_old, v_old, a_old, ufl=True): if ufl: dt_ = dt beta_ = beta else: dt_ = float(dt) beta_ = float(beta) return (u-u_old-dt_*v_old)/beta_/dt_**2 - (1-2*beta_)/2/beta_*a_old # Update formula for velocity # v = dt * ((1-gamma)*a0 + gamma*a) + v0 def update_v(a, u_old, v_old, a_old, ufl=True): if ufl: dt_ = dt gamma_ = gamma else: dt_ = float(dt) gamma_ = float(gamma) return v_old + dt_*((1-gamma_)*a_old + gamma_*a) def update_fields(u, u_old, v_old, a_old): """Update fields at the end of each time step.""" # Get vectors (references) u_vec, u0_vec = u.vector(), u_old.vector() v0_vec, a0_vec = v_old.vector(), a_old.vector() # use update functions using vector arguments a_vec = update_a(u_vec, u0_vec, v0_vec, a0_vec, ufl=False) v_vec = update_v(a_vec, u0_vec, v0_vec, a0_vec, ufl=False) # Update (u_old <- u) v_old.vector()[:], a_old.vector()[:] = v_vec, a_vec u_old.vector()[:] = u.vector() def avg(x_old, x_new, alpha): return alpha*x_old + (1-alpha)*x_new # Residual a_new = update_a(du, u_old, v_old, a_old, ufl=True) v_new = update_v(a_new, u_old, v_old, a_old, ufl=True) res = m(avg(a_old, a_new, alpha_m), u_) + c(avg(v_old, v_new, alpha_f), u_) \ + k(avg(u_old, du, alpha_f), u_) - Wext(u_) a_form = lhs(res) L_form = rhs(res) # Define solver for reusing factorization K, res = assemble_system(a_form, L_form, bc) solver = LUSolver(K, "mumps") solver.parameters["symmetric"] = True # Time-stepping time = np.linspace(0, T, Nsteps+1) u_tip = np.zeros((Nsteps+1,)) energies = np.zeros((Nsteps+1, 4)) E_damp = 0 E_ext = 0 sig = Function(Vsig, name="sigma") #xdmf_file = XDMFFile("elastodynamics-results.xdmf") #xdmf_file.parameters["flush_output"] = True #xdmf_file.parameters["functions_share_mesh"] = True #xdmf_file.parameters["rewrite_function_mesh"] = False def local_project(v, V, u=None): """Element-wise projection using LocalSolver""" dv = TrialFunction(V) v_ = TestFunction(V) a_proj = inner(dv, v_)*dx b_proj = inner(v, v_)*dx solver = LocalSolver(a_proj, b_proj) solver.factorize() if u is None: u = Function(V) solver.solve_local_rhs(u) return u else: solver.solve_local_rhs(u) return ################################################################### time loop from vedo import Box, ProgressBar from vedo.dolfin import plot # add a frame box box = Box(length=1, width=1, height=1).pos(0.5,0,0).wireframe() pb = ProgressBar(0, len(np.diff(time)), c='blue') for (i, dt) in enumerate(np.diff(time)): t = time[i+1] # Forces are evaluated at t_{n+1-alpha_f}=t_{n+1}-alpha_f*dt p.t = t-float(alpha_f*dt) # Solve for new displacement res = assemble(L_form) bc.apply(res) solver.solve(K, u.vector(), res) # Update old fields with new quantities update_fields(u, u_old, v_old, a_old) # Save solution to XDMF format #xdmf_file.write(u, t) # Compute stresses and save to file local_project(sigma(u), Vsig, sig) #xdmf_file.write(sig, t) p.t = t # Record tip displacement and compute energies if MPI.comm_world.size == 1: u_tip[i+1] = u(1., 0.05, 0.)[1] E_elas = assemble(0.5*k(u_old, u_old)) E_kin = assemble(0.5*m(v_old, v_old)) E_damp += dt*assemble(c(v_old, v_old)) # E_ext += assemble(Wext(u-u_old)) E_tot = E_elas+E_kin+E_damp #-E_ext energies[i+1, :] = np.array([E_elas, E_kin, E_damp, E_tot]) plot(u, box, mode='displace', style='matplotlib', axes=0, # no axes scalarbar=False, azimuth=1, # at each iteration add an angle to rotate scene text=__doc__, # add this file header interactive=False).clear() #screenshot('bar'+str(i)+'.png') # uncomment to save screenshots pb.print("Time: "+str(t)+" seconds") vedo-2023.4.6/examples/other/dolfin/ex03_poisson.py000066400000000000000000000025511444463326400220370ustar00rootroot00000000000000"""Poisson equation with Dirichlet conditions. -Laplace(u) = f in the unit square u = uD on the boundary uD = 1 + x^2 + 2*y^2 (f = -6) """ ########################################################### fenics import numpy as np from fenics import * # Create mesh and define function space mesh = UnitSquareMesh(8, 8) V = FunctionSpace(mesh, "P", 1) # Define boundary condition uD = Expression("1 + x[0]*x[0] + 2*x[1]*x[1]", degree=2) bc = DirichletBC(V, uD, "on_boundary") # Define variational problem w = TrialFunction(V) v = TestFunction(V) u = Function(V) f = Constant(-6.0) # Compute solution solve( dot(grad(w), grad(v))*dx == f*v*dx, u, bc) f = r'-\nabla^{2} u=f' ########################################################### vedo from vedo.dolfin import plot from vedo.pyplot import histogram from vedo import Latex l = Latex(f, s=0.2, c='w').shift(.6,.6,.1) plot(u, l, cmap='jet', scalarbar='h', text=__doc__).clear() # Now show uD values on the boundary of a much finer mesh bmesh = BoundaryMesh(UnitSquareMesh(80, 80), "exterior") plot(uD, bmesh, cmap='cool', ps=5, legend='boundary') # ps = point size # now make some nonsense plot with the same plot() function yvals = u.compute_vertex_values(mesh) xvals = np.arange(len(yvals)) plt = plot(xvals, yvals, 'go-') plt.show(new=True) # and a histogram hst = histogram(yvals) hst.show(new=True) vedo-2023.4.6/examples/other/dolfin/ex04_mixed-poisson.py000066400000000000000000000036711444463326400231500ustar00rootroot00000000000000"""Solving Poisson equation using a mixed (two-field) formulation.""" # https://fenicsproject.org/docs/dolfin/2018.1.0/python/demos/mixed-poisson from dolfin import * # Create mesh mesh = UnitSquareMesh(30, 30) # Define finite elements spaces and build mixed space BDM = FiniteElement("BDM", mesh.ufl_cell(), 1) DG = FiniteElement("DG", mesh.ufl_cell(), 0) W = FunctionSpace(mesh, BDM * DG) # Define trial and test functions (sigma, u) = TrialFunctions(W) (tau, v) = TestFunctions(W) # Define source function f = Expression("10*exp(-(pow(x[0]-0.5, 2) + pow(x[1]-0.5, 2))/0.02)", degree=2) # Define variational form a = (dot(sigma, tau) + div(tau) * u + div(sigma) * v) * dx L = -f * v * dx # Define function G such that G \cdot n = g class BoundarySource(UserExpression): def __init__(self, mesh, **kwargs): self.mesh = mesh super().__init__(**kwargs) def eval_cell(self, values, x, ufc_cell): cell = Cell(self.mesh, ufc_cell.index) n = cell.normal(ufc_cell.local_facet) g = sin(5 * x[0]) values[0] = g * n[0] values[1] = g * n[1] def value_shape(self): return (2,) G = BoundarySource(mesh, degree=2) # Define essential boundary def boundary(x): return x[1] < DOLFIN_EPS or x[1] > 1.0 - DOLFIN_EPS bc = DirichletBC(W.sub(0), G, boundary) # Compute solution w = Function(W) solve(a == L, w, bc) (sigma, u) = w.split() ########################################################### vedo from vedo.dolfin import plot # Plot solution on mesh, and warp z-axis by the scalar value plot(u, warpZfactor=0.8, legend='u', text=__doc__) # # Plot the sigma vector on the mesh. Try also mode='arrows' # msg = Text3D("> plot(sigma, mode='mesh lines', warpZfactor= -0.2)", c='w') # plot(sigma, msg, # mode='mesh lines', # warpZfactor=-0.2, # rise mesh in z based on scalar value # scale=0.03, # scale the lines or arrows # new=True, # new window # ) vedo-2023.4.6/examples/other/dolfin/ex06_elasticity1.py000066400000000000000000000030471444463326400226040ustar00rootroot00000000000000""" Show mesh and displacement solution with arrows. Refer to original script for the detailed description: https://fenicsproject.org/docs/dolfin/2018.1.0/python/ demos/hyperelasticity/demo_hyperelasticity.py.html """ print(__doc__) ########################################################### dolfin from dolfin import * # Create mesh and define function space mesh = UnitCubeMesh(10, 10, 10) V = VectorFunctionSpace(mesh, "Lagrange", 1) # Mark boundary subdomains left = CompiledSubDomain("near(x[0], side) && on_boundary", side=0.0) right = CompiledSubDomain("near(x[0], side) && on_boundary", side=1.0) # Define Dirichlet boundary (x = 0 or x = 1) c = Constant((0.0, 0.0, 0.0)) r = Expression(( "scale*0.0", "scale*(y0 + (x[1]-y0)*cos(theta) - (x[2]-z0)*sin(theta) - x[1])", "scale*(z0 + (x[1]-y0)*sin(theta) + (x[2]-z0)*cos(theta) - x[2])", ), scale=0.5, y0=0.5, z0=0.5, theta=pi/3, degree=2 ) bcl = DirichletBC(V, c, left) bcr = DirichletBC(V, r, right) w = TrialFunction(V) # Incremental displacement v = TestFunction(V) # Test function u = Function(V) # solution solve(inner(grad(w), grad(v)) * dx == inner(c, v) * dx, u, [bcl, bcr]) bmesh = BoundaryMesh(mesh, "exterior") ########################################################### vedo from vedo.dolfin import * # ps = point size, only mesh vertices are shown plot(u, mode='mesh', ps=10, scalarbar='3d') # plot displacements as white arrows, lw controls the mesh visibility plot(u, mode='arrows', add=True, color='w', alpha=0.5, cmap='gist_earth', lw=1) vedo-2023.4.6/examples/other/dolfin/ex06_elasticity2.py000066400000000000000000000020501444463326400225760ustar00rootroot00000000000000"""Show fenics mesh and displacement solution.""" from dolfin import * # Create mesh and define function space mesh = UnitCubeMesh(12, 12, 12) V = VectorFunctionSpace(mesh, "Lagrange", 1) # Mark boundary subdomains left = CompiledSubDomain("near(x[0], side) && on_boundary", side=0.0) right = CompiledSubDomain("near(x[0], side) && on_boundary", side=1.0) # Define Dirichlet boundary (x=0 or x=1) c = Constant((0.0, 0.0, 0.0)) r = Expression(( "scale*0.0", "scale*(y0 + (x[1]-y0)*cos(theta) - (x[2]-z0)*sin(theta)-x[1])", "scale*(z0 + (x[1]-y0)*sin(theta) + (x[2]-z0)*cos(theta)-x[2])", ), scale=0.5, y0=0.5, z0=0.5, theta=pi/4, degree=2) bcl = DirichletBC(V, c, left) bcr = DirichletBC(V, r, right) w = TrialFunction(V) # Incremental displacement v = TestFunction(V) # Test function u = Function(V) # Solution solve(inner(grad(w), grad(v)) * dx == inner(c, v) * dx, u, [bcl, bcr]) ########################################################### vedo from vedo.dolfin import plot plot(u, mode='displacements', azimuth=45) vedo-2023.4.6/examples/other/dolfin/ex06_elasticity3.py000066400000000000000000000065471444463326400226160ustar00rootroot00000000000000#!/usr/bin/env python3 """An initial circle is stretched by means of a variable force into its final shape. Colored lines are the trajectories of a few initial points.""" from dolfin import * from mshr import * import numpy as np import vedo from vedo.dolfin import plot set_log_level(30) class AllBoundaries(SubDomain): def inside(self, x, on_boundary): return on_boundary and x[0]<-10 def solve_problem(mesh, mfunc, force): V = VectorFunctionSpace(mesh, "CG", 1) u = TrialFunction(V) v = TestFunction(V) displacement = Function(V) bc = [DirichletBC(V, Constant((0,0)), mfunc, 1)] F = Constant(force) E = Constant(5000) nu = Constant(0.3) mu = E / (2.0*(1+nu)) lmbda = E * nu / ((1.0+nu) * (1.0-2*nu)) sigma = 2.0 * mu * sym(grad(u)) + lmbda * tr( sym(grad(u)) ) * Identity(2) solve(inner(sigma, grad(v)) * dx == inner(F, v) * dx, displacement, bc) displacement.set_allow_extrapolation(True) return displacement def update(mesh, displacement): new_mesh = Mesh(mesh) ALE.move(new_mesh, displacement) return new_mesh def remesh(mesh, res=50): if isinstance(mesh, vedo.Mesh): vmesh = mesh else: vmesh = vedo.Mesh([mesh.coordinates(), mesh.cells()]) bpts = vmesh.computeNormals(cells=True).boundaries().join(reset=1) #extract boundary vz = vmesh.celldata["Normals"][0][2] # check z component of normals at first point bpts.generate_mesh(invert=vz<0).smooth().write('tmpmesh.xml') #vedo REMESHING + smoothing return Mesh("tmpmesh.xml") ################################################################################# N = 40 # number of iterations of stretching res = 15 # resolution of meshes do_remesh = False # grab the boundary and remesh the interior at each iteration vedo.settings.use_parallel_projection = True # avoid perspective parallax circle = Circle(Point(0, 0), 50) mesh = generate_mesh(circle, res) meshes = [mesh] displacements = [] for i in range(N): mfunc = MeshFunction('size_t', mesh, 1, mesh.domains()) mfunc.set_all(0) allb = AllBoundaries() allb.mark(mfunc, 1) F = np.array([2, (i-N/2)/N]) # some variable force displacement = solve_problem(mesh, mfunc, F) new_mesh = update(mesh, displacement) if do_remesh: mesh = remesh(new_mesh) else: mesh = new_mesh meshes.append(mesh) displacements.append(displacement) # plot things: txt = vedo.Text2D(f"step{i}") arrow = vedo.Arrow2D([0,0], F*20).z(1) plot(mesh, arrow, txt, c='grey5', at=i, N=N, zoom=1.1) #PRESS q dmesh_i = meshes[0] # initial mesh dmesh_f = meshes[-1] # final mesh vmesh_i = vedo.Mesh([dmesh_i.coordinates(), dmesh_i.cells()], c='grey5').z(-1) vmesh_f = vedo.Mesh([dmesh_f.coordinates(), dmesh_f.cells()], c='grey3').wireframe() plt = vedo.Plotter() # move a few points along the deformation of the circle seeds = vedo.Circle(r=50, res=res).points()[:,(0,1)] # make points 2d with [:,(0,1)] endpoints = [] for i, p in enumerate(seeds): line = [p] for u in displacements: p = p + u(p) line.append(p) plt += vedo.Line(line, c=i, lw=4).z(1) endpoints.append(p) plt += [vmesh_i, vmesh_f, __doc__] plt.show(axes=1) # to invert everything and move the end points back in place, check out discussion: #https://fenicsproject.discourse.group/t/precision-in-hyperelastic-model/6824/3 vedo-2023.4.6/examples/other/dolfin/ex06_elasticity4.py000066400000000000000000000045571444463326400226160ustar00rootroot00000000000000import numpy as np from dolfin import * import vedo set_log_level(30) class AllBoundaries(SubDomain): def inside(self, x, on_boundary): return on_boundary and x[0]<-10 def solve_problem(mesh, mfunc, force): V = VectorFunctionSpace(mesh, "CG", 1) u = TrialFunction(V) v = TestFunction(V) displacement = Function(V) bc = [DirichletBC(V, Constant((0,0)), mfunc, 1)] F = Constant(force) E = Constant(5000) nu = Constant(0.3) mu = E / (2.0*(1+nu)) lmbda = E * nu / ((1.0+nu) * (1-2*nu)) sigma = 2.0 * mu * sym(grad(u)) + lmbda * tr( sym(grad(u)) ) * Identity(2) solve(inner(sigma, grad(v)) * dx == inner(F, v) * dx, displacement, bc) displacement.set_allow_extrapolation(True) return displacement def update(mesh, displacement): new_mesh = Mesh(mesh) ALE.move(new_mesh, displacement) return new_mesh def remesh(mesh): if isinstance(mesh, vedo.Mesh): vmesh = mesh else: vmesh = vedo.Mesh([mesh.coordinates(), mesh.cells()]) bpts = vmesh.compute_normals(cells=True).boundaries().join(reset=1) #extract boundary vz = vmesh.celldata["Normals"][0][2] # check z component of normals at first point bpts.generate_mesh(invert=vz<0).write('tmpmesh.xml') #vedo REMESHING + smoothing return Mesh("tmpmesh.xml") ################################################################################# N = 20 # number of iterations of stretching do_remesh = 0 # grab the boundary and remesh the interior at each iteration circle = vedo.Circle(r=50) mesh = remesh(circle) half_circle = circle.boundaries().cut_with_plane(origin=[-10,0,0], normal='-x').z(2) half_circle.linewidth(5).c("red4") plt = vedo.Plotter(N=N, size=(2250, 1300)) meshes = [mesh] displacements = [] for i in range(N): mfunc = MeshFunction('size_t', mesh, 1, mesh.domains()) mfunc.set_all(0) allb = AllBoundaries() allb.mark(mfunc, 1) F = np.array([4, 2*(i-N/2)/N]) displacement = solve_problem(mesh, mfunc, F) new_mesh = update(mesh, displacement) mesh = remesh(new_mesh) if do_remesh else new_mesh meshes.append(mesh) displacements.append(displacement) varrow = vedo.Arrow2D([0,0], F*15).z(1).c("red4") vmesh = vedo.Mesh([mesh.coordinates(), mesh.cells()]).c("k4").lc('k5') plt.at(i).show(f"t={i}, F={F}", half_circle, vmesh, varrow, zoom=1.5) plt.interactive().close() vedo-2023.4.6/examples/other/dolfin/ex07_stokes-iterative.py000066400000000000000000000040261444463326400236520ustar00rootroot00000000000000""" Stokes equations with an iterative solver. """ # https://fenicsproject.org/docs/dolfin/2018.1.0/python/demos/ # stokes-iterative/demo_stokes-iterative.py.html from dolfin import * mesh = UnitCubeMesh(10, 10, 10) # Build function space P2 = VectorElement("Lagrange", mesh.ufl_cell(), 2) P1 = FiniteElement("Lagrange", mesh.ufl_cell(), 1) TH = P2 * P1 W = FunctionSpace(mesh, TH) # Boundaries def right(x, on_boundary): return x[0] > (1.0 - DOLFIN_EPS) def left(x, on_boundary): return x[0] < DOLFIN_EPS def top_bottom(x, on_boundary): return x[1] > 1.0 - DOLFIN_EPS or x[1] < DOLFIN_EPS # No-slip boundary condition for velocity noslip = Constant((0.0, 0.0, 0.0)) bc0 = DirichletBC(W.sub(0), noslip, top_bottom) # Inflow boundary condition for velocity inflow = Expression(("-sin(x[1]*pi)", "0.0", "0.0"), degree=2) bc1 = DirichletBC(W.sub(0), inflow, right) # Define variational problem (u, p) = TrialFunctions(W) (v, q) = TestFunctions(W) f = Constant((0.0, 0.0, 0.0)) a = inner(grad(u), grad(v)) * dx + div(v) * p * dx + q * div(u) * dx L = inner(f, v) * dx # Form for use in constructing preconditioner matrix b = inner(grad(u), grad(v)) * dx + p * q * dx # Assemble system A, bb = assemble_system(a, L, [bc0, bc1]) # Assemble preconditioner system P, btmp = assemble_system(b, L, [bc0, bc1]) # Create Krylov solver and AMG preconditioner if has_krylov_solver_method("minres"): krylov_method = "minres" elif has_krylov_solver_method("tfqmr"): krylov_method = "tfqmr" solver = KrylovSolver(krylov_method, "amg") # Associate operator (A) and preconditioner matrix (P) solver.set_operators(A, P) # Solve U = Function(W) solver.solve(U.vector(), bb) # Get sub-functions u, p = U.split() pressures = p.compute_vertex_values(mesh) #################################################### vedo from vedo.dolfin import plot # Plot u and p solutions on N=2 synced renderers plot(u, mode='mesh arrows', at=0, N=2, legend='velocity', scale=0.1, wireframe=1, lw=0.03, alpha=0.5, scalarbar=False).close() plot(p, mode='mesh').close() vedo-2023.4.6/examples/other/dolfin/ft02_poisson_membrane.py000066400000000000000000000030541444463326400237000ustar00rootroot00000000000000""" FEniCS tutorial demo program: Deflection of a membrane. -Laplace(w) = p in the unit circle w = 0 on the boundary The load p is a Gaussian function centered at (0, 0.6). """ from fenics import * from mshr import Circle, generate_mesh # Create mesh and define function space domain = Circle(Point(0, 0), 1) mesh = generate_mesh(domain, 64) V = FunctionSpace(mesh, 'P', 2) w_D = Constant(0) def boundary(x, on_boundary): return on_boundary bc = DirichletBC(V, w_D, boundary) # Define load p = Expression('4*exp(-pow(beta, 2)*(pow(x[0], 2) + pow(x[1] - R0, 2)))', degree=1, beta=8, R0=0.6) # Define variational problem w = TrialFunction(V) v = TestFunction(V) a = dot(grad(w), grad(v))*dx L = p*v*dx # Compute solution w = Function(V) solve(a == L, w, bc) p = interpolate(p, V) # Curve plot along x = 0 comparing p and w import numpy as np tol = 0.001 # avoid hitting points outside the domain y = np.linspace(-1 + tol, 1 - tol, 101) points = [(0, y_) for y_ in y] # 2D points w_line = np.array([w(point) for point in points]) p_line = np.array([p(point) for point in points]) ####################################################################### from vedo.dolfin import plot from vedo import Line, Latex pde = r'-T \nabla^{2} D=p, ~\Omega=\left\{(x, y) | x^{2}+y^{2} \leq R\right\}' tex = Latex(pde, pos=(0,1.1,.1), s=0.2, c='w') wline = Line(y, w_line*10, c='white', lw=4) pline = Line(y, p_line/ 4, c='lightgreen', lw=4) plot(w, wline, tex, at=0, N=2, bg='bb', text='Deflection') plot(p, pline, at=1, bg='bb', text='Load') vedo-2023.4.6/examples/other/dolfin/ft04_heat_gaussian.py000066400000000000000000000030011444463326400231450ustar00rootroot00000000000000""" FEniCS tutorial demo program: Diffusion of a Gaussian hill. u'= Laplace(u) + f in a square domain u = u_D on the boundary u = u_0 at t = 0 u_D = f = 0 The initial condition u_0 is chosen as a Gaussian hill. """ # https://fenicsproject.org/pub/tutorial/html/._ftut1006.html from fenics import * set_log_level(30) num_steps = 50 # number of time steps dt = 0.02 # time step size # Create mesh and define function space nx = ny = 30 mesh = RectangleMesh(Point(-2, -2), Point(2, 2), nx, ny) V = FunctionSpace(mesh, 'P', 1) # Define boundary condition def boundary(x, on_boundary): return on_boundary bc = DirichletBC(V, Constant(0), boundary) # Define initial value u_0 = Expression('exp(-5*pow(x[0],2) - 5*pow(x[1],2))', degree=2) u_n = interpolate(u_0, V) # Define variational problem u = TrialFunction(V) v = TestFunction(V) f = Constant(0) F = u*v*dx + dt*dot(grad(u), grad(v))*dx - (u_n + dt*f)*v*dx a, L = lhs(F), rhs(F) ############################################################# vedo from vedo.dolfin import plot from vedo import Latex f = r'\frac{\partial u}{\partial t}=\nabla^2 u+f~\mathrm{in}~\Omega\times(0,T]' formula = Latex(f, pos=(-.4,-.8, .1), s=0.6, c='w') formula.crop(0.2, 0.4) # crop top and bottom 20% and 40% # Time-stepping u = Function(V) for n in range(num_steps): # Compute solution solve(a == L, u, bc) # Plot solution plot(u, formula, scalarbar=False, interactive=False) # Update previous solution u_n.assign(u) plot() vedo-2023.4.6/examples/other/dolfin/ft09_reaction_system.py000066400000000000000000000055771444463326400235730ustar00rootroot00000000000000"""Convection-diffusion-reaction for a system describing the concentration of three species A, B, C undergoing a simple first-order reaction A + B --> C with first-order decay of C. The velocity is given by the flow field w from the demo navier_stokes_cylinder.py. u_1' + w . nabla(u_1) - div(eps*grad(u_1)) = f_1 - K*u_1*u_2 u_2' + w . nabla(u_2) - div(eps*grad(u_2)) = f_2 - K*u_1*u_2 u_3' + w . nabla(u_3) - div(eps*grad(u_3)) = f_3 + K*u_1*u_2 - K*u_3 """ print(__doc__) from fenics import * set_log_level(30) T = 10.0 # final time num_steps = 50 # number of time steps dt = T / num_steps/ 100 # time step size eps = 0.01 # diffusion coefficient K = 10.0 # reaction rate # Read mesh from file mesh = Mesh('navier_stokes_cylinder/cylinder.xml.gz') # Define function space for velocity W = VectorFunctionSpace(mesh, 'P', 2) # Define function space for system of concentrations P1 = FiniteElement('P', triangle, 1) element = MixedElement([P1, P1, P1]) V = FunctionSpace(mesh, element) # Define test functions v_1, v_2, v_3 = TestFunctions(V) # Define functions for velocity and concentrations w = Function(W) u = Function(V) u_n = Function(V) # Split system functions to access components u_1, u_2, u_3 = split(u) u_n1, u_n2, u_n3 = split(u_n) # Define source terms f_1 = Expression('pow(x[0]-0.1,2)+pow(x[1]-0.1,2)<0.05*0.05 ? 0.1 : 0', degree=1) f_2 = Expression('pow(x[0]-0.1,2)+pow(x[1]-0.3,2)<0.05*0.05 ? 0.1 : 0', degree=1) f_3 = Constant(0) # Define expressions used in variational forms k = Constant(dt) K = Constant(K) eps = Constant(eps) # Define variational problem F = ((u_1 - u_n1) / k)*v_1*dx + dot(w, grad(u_1))*v_1*dx \ + eps*dot(grad(u_1), grad(v_1))*dx + K*u_1*u_2*v_1*dx \ + ((u_2 - u_n2) / k)*v_2*dx + dot(w, grad(u_2))*v_2*dx \ + eps*dot(grad(u_2), grad(v_2))*dx + K*u_1*u_2*v_2*dx \ + ((u_3 - u_n3) / k)*v_3*dx + dot(w, grad(u_3))*v_3*dx \ + eps*dot(grad(u_3), grad(v_3))*dx - K*u_1*u_2*v_3*dx + K*u_3*v_3*dx \ - f_1*v_1*dx - f_2*v_2*dx - f_3*v_3*dx # Create time series for reading velocity data timeseries_w = TimeSeries('navier_stokes_cylinder/velocity_series') # Time-stepping from vedo import ProgressBar from vedo.dolfin import plot pb = ProgressBar(0, num_steps, c='red') t = 0 for n in pb.range(): # Update current time t += dt # Read velocity from file timeseries_w.retrieve(w.vector(), t) # Solve variational problem for time step solve(F == 0, u) _u_1, _u_2, _u_3 = u.split() # Update previous solution u_n.assign(u) # Plot solution plot(_u_3, at=0, # draw on renderer nr.0 shape=(2,1), # two rows, one column size='fullscreen', cmap='bone', scalarbar=False, axes=0, zoom=2, interactive=False) plot(_u_2, at=1, cmap='bone', zoom=2, scalarbar=False, interactive=False) pb.print(t) plot() vedo-2023.4.6/examples/other/dolfin/heatconv.py000066400000000000000000000050761444463326400213220ustar00rootroot00000000000000"""Heat equation in moving media.""" # Credits: Jan Blechta # https://github.com/blechta/fenics-handson/blob/master/heatconv from dolfin import * set_log_level(30) # Create mesh and build function space mesh = UnitSquareMesh(30, 30, "crossed") V = FunctionSpace(mesh, "Lagrange", 1) # Create boundary markers tdim = mesh.topology().dim() boundary_parts = MeshFunction("size_t", mesh, tdim - 1) left = AutoSubDomain(lambda x: near(x[0], 0.0)) right = AutoSubDomain(lambda x: near(x[0], 1.0)) bottom = AutoSubDomain(lambda x: near(x[1], 0.0)) left.mark(boundary_parts, 1) right.mark(boundary_parts, 2) bottom.mark(boundary_parts, 2) # Initial condition and right-hand side ic = Expression("""pow(x[0] - 0.25, 2) + pow(x[1] - 0.25, 2) < 0.2*0.2 ? -25.0 * ((pow(x[0] - 0.25, 2) + pow(x[1] - 0.25, 2)) - 0.2*0.2) : 0.0""", degree=1, ) f = Expression("""pow(x[0] - 0.75, 2) + pow(x[1] - 0.75, 2) < 0.2*0.2 ? 1.0 : 0.0""", degree=1, ) # Equation coefficients K = Constant(1e-2) # thermal conductivity g = Constant(0.01) # Neumann heat flux b = Expression(("-(x[1] - 0.5)", "x[0] - 0.5"), degree=1) # convecting velocity # Define boundary measure on Neumann part of boundary dsN = Measure("ds", subdomain_id=1, subdomain_data=boundary_parts) # Define steady part of the equation def operator(u, v): return (K * inner(grad(u), grad(v)) - f * v + dot(b, grad(u)) * v ) * dx - K * g * v * dsN # Define trial and test function and solution at previous time-step u = TrialFunction(V) v = TestFunction(V) u0 = Function(V) # Time-stepping parameters dt = 0.02 theta = Constant(0.5) # Crank-Nicolson scheme # Define time discretized equation F = ((1.0 / dt) * inner(u - u0, v) * dx + theta * operator(u, v) + (1.0 - theta) * operator(u0, v) ) # Define boundary condition bc = DirichletBC(V, Constant(0.0), boundary_parts, 2) # Prepare solution function and solver u = Function(V) problem = LinearVariationalProblem(lhs(F), rhs(F), u, bc) solver = LinearVariationalSolver(problem) # Prepare initial condition u0.interpolate(ic) u.interpolate(ic) ######################################################Time-stepping from vedo.dolfin import plot t = 0.0 while t < 3: solver.solve() plot(u, text=__doc__+"\nTemperature at t = %g" % t, style=2, axes=3, lw=0, # no mesh edge lines warpZfactor=0.1, isolines={"n": 12, "lw":1, "c":'black', "alpha":0.1}, scalarbar=False, interactive=False, ).clear() # Move to next time step u0.assign(u) t += dt vedo-2023.4.6/examples/other/dolfin/magnetostatics.py000066400000000000000000000055441444463326400225400ustar00rootroot00000000000000"""Compute the magnetic field B in an iron cylinder, the copper wires, and the surrounding vacuum. Isolines of Az are also shown.""" # https://fenicsproject.org/pub/tutorial/html/._ftut1015.html from fenics import * from mshr import * from math import sin, cos, pi a = 1.0 # inner radius of iron cylinder b = 1.2 # outer radius of iron cylinder c_1 = 0.8 # radius for inner circle of copper wires c_2 = 1.4 # radius for outer circle of copper wires r = 0.1 # radius of copper wires R = 2.5 # radius of domain n = 5 # number of windings # Define geometry for background domain = Circle(Point(0, 0), R) # Define geometry for iron cylinder cylinder = Circle(Point(0, 0), b) - Circle(Point(0, 0), a) # Define geometry for wires (N = North (up), S = South (down)) angles_N = [i*2*pi/n for i in range(n)] angles_S = [(i + 0.5)*2*pi/n for i in range(n)] wires_N = [Circle(Point(c_1*cos(v), c_1*sin(v)), r) for v in angles_N] wires_S = [Circle(Point(c_2*cos(v), c_2*sin(v)), r) for v in angles_S] # Set subdomain for iron cylinder domain.set_subdomain(1, cylinder) # Set subdomains for wires for (i, wire) in enumerate(wires_N): domain.set_subdomain(2 + i, wire) for (i, wire) in enumerate(wires_S): domain.set_subdomain(2 + n + i, wire) # Create mesh mesh = generate_mesh(domain, 64) # Define function space V = FunctionSpace(mesh, 'P', 1) # Define boundary condition bc = DirichletBC(V, Constant(0), 'on_boundary') # Define subdomain markers and integration measure markers = MeshFunction('size_t', mesh, 2, mesh.domains()) dx = Measure('dx', domain=mesh, subdomain_data=markers) # Define current densities J_N = Constant(1.0) J_S = Constant(-1.0) # Define magnetic permeability class Permeability(UserExpression): def __init__(self, markers, **kwargs): self.markers = markers super().__init__(**kwargs) def eval_cell(self, values, x, cell): if self.markers[cell.index] == 0: values[0] = 4*pi*1e-7 # vacuum elif self.markers[cell.index] == 1: values[0] = 1e-5 # iron (should really be 6.3e-3) else: values[0] = 1.26e-6 # copper mu = Permeability(markers, degree=1) # Define variational problem A_z = TrialFunction(V) v = TestFunction(V) a = (1 / mu)*dot(grad(A_z), grad(v))*dx L_N = sum(J_N*v*dx(i) for i in range(2, 2 + n)) L_S = sum(J_S*v*dx(i) for i in range(2 + n, 2 + 2*n)) L = L_N + L_S # Solve variational problem A_z = Function(V) solve(a == L, A_z, bc) # Compute magnetic field (B = curl A) W = VectorFunctionSpace(mesh, 'P', 1) B = project(as_vector((A_z.dx(1), -A_z.dx(0))), W) # Plot solution from vedo.dolfin import plot plot(A_z, at=0, N=2, # draw on the first of 2 renderers lw=0, # linewidth of mesh isolines={'n':20, 'lw':1.5, 'c':'black'}, scalarbar=False, ) plot(B, at=1, scalarbar=False, text=__doc__) # draw on the second renderer vedo-2023.4.6/examples/other/dolfin/markmesh.py000066400000000000000000000007071444463326400213160ustar00rootroot00000000000000''' Mark mesh with boundary function ''' from dolfin import * mesh = UnitCubeMesh(5,5,5) V = FunctionSpace(mesh, "Lagrange", 1) class left(SubDomain): def inside(self, x, on_boundary): return on_boundary and abs(x[0]) < DOLFIN_EPS left = left() tcond = MeshFunction("size_t", mesh, 0) tcond.set_all(0) left.mark(tcond, 1) ################################## from vedo.dolfin import plot plot(tcond, cmap='cool', elevation=20, text=__doc__) vedo-2023.4.6/examples/other/dolfin/navier-stokes_lshape.py000066400000000000000000000055231444463326400236360ustar00rootroot00000000000000""" Solve the incompressible Navier-Stokes equations on an L-shaped domain using Chorin's splitting method. """ from __future__ import print_function from dolfin import * from vedo import ProgressBar, download from vedo.dolfin import plot # Print log messages only from the root process in parallel parameters["std_out_all_processes"] = False # Load mesh from file fpath = download("https://vedo.embl.es/examples/data/lshape.xml.gz") mesh = Mesh(fpath) # Define function spaces (P2-P1) V = VectorFunctionSpace(mesh, "Lagrange", 2) Q = FunctionSpace(mesh, "Lagrange", 1) # Define trial and test functions u = TrialFunction(V) p = TrialFunction(Q) v = TestFunction(V) q = TestFunction(Q) # Set parameter values dt = 0.01 T = 3 nu = 0.01 # Define time-dependent pressure boundary condition p_in = Expression("sin(3.0*t)", t=0.0, degree=2) # Define boundary conditions noslip = DirichletBC(V, (0, 0), "on_boundary && \ (x[0] < DOLFIN_EPS | x[1] < DOLFIN_EPS | \ (x[0] > 0.5 - DOLFIN_EPS && x[1] > 0.5 - DOLFIN_EPS))") inflow = DirichletBC(Q, p_in, "x[1] > 1.0 - DOLFIN_EPS") outflow = DirichletBC(Q, 0, "x[0] > 1.0 - DOLFIN_EPS") bcu = [noslip] bcp = [inflow, outflow] # Create functions u0 = Function(V) u1 = Function(V) p1 = Function(Q) # Define coefficients k = Constant(dt) f = Constant((0, 0)) # Tentative velocity step F1 = (1/k)*inner(u - u0, v)*dx + inner(grad(u0)*u0, v)*dx + \ nu*inner(grad(u), grad(v))*dx - inner(f, v)*dx a1 = lhs(F1) L1 = rhs(F1) # Pressure update a2 = inner(grad(p), grad(q))*dx L2 = -(1/k)*div(u1)*q*dx # Velocity update a3 = inner(u, v)*dx L3 = inner(u1, v)*dx - k*inner(grad(p1), v)*dx # Assemble matrices A1 = assemble(a1) A2 = assemble(a2) A3 = assemble(a3) # Use amg preconditioner if available prec = "amg" if has_krylov_solver_preconditioner("amg") else "default" # Use nonzero guesses - essential for CG with non-symmetric BC parameters['krylov_solver']['nonzero_initial_guess'] = True # Time-stepping pb = ProgressBar(0, T, dt, c='green') for t in pb.range(): # Update pressure boundary condition p_in.t = t # Compute tentative velocity step b1 = assemble(L1) [bc.apply(A1, b1) for bc in bcu] solve(A1, u1.vector(), b1, "bicgstab", "default") # Pressure correction b2 = assemble(L2) [bc.apply(A2, b2) for bc in bcp] [bc.apply(p1.vector()) for bc in bcp] solve(A2, p1.vector(), b2, "bicgstab", prec) # Velocity correction b3 = assemble(L3) [bc.apply(A3, b3) for bc in bcu] solve(A3, u1.vector(), b3, "bicgstab", "default") # Move to next time step u0.assign(u1) t += dt # Plot solution plot(u1, mode='mesh and arrows', text="Velocity of fluid", cmap='jet', scale=0.3, # unit conversion factor scalarbar=False, interactive=False) pb.print() plot() vedo-2023.4.6/examples/other/dolfin/nodal_u.py000066400000000000000000000007161444463326400211300ustar00rootroot00000000000000"""Compute some quantity in each node of a mesh (by looping on the nodes) and then build a piecewise linear function with computed nodal values.""" from dolfin import * from vedo.dolfin import plot def f(coordinate): return coordinate[0] * coordinate[1] mesh = UnitSquareMesh(10, 10) V = FunctionSpace(mesh, "CG", 1) g = Function(V) coords = V.tabulate_dof_coordinates() for i in range(V.dim()): g.vector()[i] = f(coords[i]) plot(g, text=__doc__) vedo-2023.4.6/examples/other/dolfin/pi_estimate.py000066400000000000000000000011661444463326400220120ustar00rootroot00000000000000from dolfin import * from mshr import Circle, generate_mesh from vedo.dolfin import plot from vedo import Latex # Credits: # https://github.com/pf4d/fenics_scripts/blob/master/pi_estimate.py domain = Circle(Point(0.0,0.0), 1.0) for res in [2**k for k in range(7)]: mesh = generate_mesh(domain, res) A = assemble(Constant(1) * dx(domain=mesh)) printc("resolution = %i, \t A-pi = %.5e" % (res, A-pi)) print('pi is about', A) l = Latex(r'\mathrm{Area}(r)=\pi=\int\int_D 1 \cdot d(x,y)', s=0.3) l.crop(0.3,0.3).z(0.1) # crop invisible top and bottom and set at z=0.1 plot(mesh, l, alpha=0.4, ztitle='', style=1, axes=3) vedo-2023.4.6/examples/other/dolfin/pointLoad.py000066400000000000000000000027741444463326400214460ustar00rootroot00000000000000"""Apply a vector-valued point load to a corner of a linear-elastic cube. """ # Credit https://fenicsproject.discourse.group/t/ #applying-pointsource-at-two-different-vectors/1459/2 from dolfin import * from vedo.dolfin import plot BULK_MOD = 1.0 SHEAR_MOD = 1.0 mesh = UnitCubeMesh(10, 10, 10) VE = VectorElement("Lagrange", mesh.ufl_cell(), 1) V = FunctionSpace(mesh, VE) # Constrain normal displacement on two sides: def boundary1(x, on_boundary): return on_boundary and near(x[1], 0.0) bc1 = DirichletBC(V.sub(1), Constant(0.0), boundary1) def boundary2(x, on_boundary): return on_boundary and near(x[0], 0.0) bc2 = DirichletBC(V.sub(0), Constant(0.0), boundary2) # Solve linear elasticity with point load at upper-right corner: u = TrialFunction(V) v = TestFunction(V) eps = 0.5 * (grad(u) + grad(u).T) I = Identity(3) sigma = BULK_MOD*tr(eps)*I + 2*SHEAR_MOD*(eps-tr(eps)*I/3) a = inner(sigma, grad(v)) * dx L = inner(Constant((0,0,0)), v) * dx # Assemble: A = assemble(a) B = assemble(L) # Apply point sources: ptSrcLocation = Point(1-DOLFIN_EPS, 1-DOLFIN_EPS) # Vectorial point load: f = [0.01, 0.02] # Distinct point sources for x- and y-components ptSrc_x = PointSource(V.sub(0), ptSrcLocation, f[0]) ptSrc_y = PointSource(V.sub(1), ptSrcLocation, f[1]) ptSrcs = [ptSrc_x, ptSrc_y] # Apply to RHS of linear system: for ptSrc in ptSrcs: ptSrc.apply(B) # Apply BCs: for bc in [bc1, bc2]: bc.apply(A) bc.apply(B) # Solve: u = Function(V) solve(A, u.vector(), B) plot(u, mode='displacement')vedo-2023.4.6/examples/other/dolfin/read_image.py000066400000000000000000000021401444463326400215550ustar00rootroot00000000000000#!/usr/bin/python3 # """Interpolate a jpg image to a mesh and plot it""" from dolfin import * import matplotlib.pyplot as plt from vedo import download from vedo.dolfin import plot scale = 0.1 fpath = download("https://vedo.embl.es/examples/data/images/embl_logo.jpg") img = plt.imread(fpath) print('Image shape is', img.shape) img = img[:,:,1] Nx, Ny = img.shape mesh = RectangleMesh(Point(0,0,0), Point(Ny*scale, Nx*scale,1), Ny, Nx) class FE_image(UserExpression): def eval_cell(self, value, x, ufc_cell): p = Cell(mesh, ufc_cell.index).midpoint() i, j = int(p[1]/scale), int(p[0]/scale) value[:] = img[-(i+1), j] def value_shape(self): return () y = FE_image() V = FunctionSpace(mesh, 'Lagrange', 1) u = Function(V) u.interpolate(y) cam = dict(pos=(10.6, 3.71, 22.7), focal_point=(10.6, 3.71, -1.04e-3), viewup=(0, 1.00, 0), distance=22.7, clippingRange=(21.3, 24.6)) # press C to get this lines of code plot(u, text=__doc__, camera=cam, lw=0.1, cmap='Greens_r', size=(600,300) ) vedo-2023.4.6/examples/other/dolfin/run_all.sh000077500000000000000000000036601444463326400211310ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # ########################## echo Running ascalarbar.py python3 ascalarbar.py echo Running collisions.py python3 collisions.py echo Running calc_surface_area.py python3 calc_surface_area.py echo Running markmesh.py python3 markmesh.py # echo Running scalemesh.py # python3 scalemesh.py # echo Running pi_estimate.py # python3 pi_estimate.py # echo Running submesh_boundary.py # python3 submesh_boundary.py echo Running demo_submesh.py python3 demo_submesh.py echo Running elastodynamics.py python3 elastodynamics.py echo Running elasticbeam.py python3 elasticbeam.py echo Running magnetostatics.py python3 magnetostatics.py echo Running pointLoad.py python3 pointLoad.py echo Running nodal_u.py python3 nodal_u.py echo Running read_image.py python3 read_image.py ###################################### echo Running ex03_poisson.py python3 ex03_poisson.py echo Running ex04_mixed-poisson.py python3 ex04_mixed-poisson.py echo Running ex05_non-matching-meshes.py python3 ex05_non-matching-meshes.py echo Running ex06_elasticity1.py python3 ex06_elasticity1.py echo Running ex06_elasticity2.py python3 ex06_elasticity2.py echo Running ex07_stokes-iterative.py python3 ex07_stokes-iterative.py ###################################### # echo Running ft02_poisson_membrane.py # python3 ft02_poisson_membrane.py echo Running ft04_heat_gaussian.py python3 ft04_heat_gaussian.py echo Running navier-stokes_lshape.py python3 navier-stokes_lshape.py echo Running ft09_reaction_system.py python3 ft09_reaction_system.py echo Running stokes.py python3 stokes.py echo Running stokes2.py python3 stokes2.py echo Running demo_cahn-hilliard.py python3 demo_cahn-hilliard.py echo Running turing_pattern.py python3 turing_pattern.py echo Running heatconv.py python3 heatconv.py echo Running wavy_1d.py python3 wavy_1d.py echo Running awefem.py python3 awefem.py echo Running demo_eigenvalue.py python3 demo_eigenvalue.py vedo-2023.4.6/examples/other/dolfin/scalemesh.py000066400000000000000000000012361444463326400214510ustar00rootroot00000000000000""" Scale a mesh asymmetrically in one coordinate """ from dolfin import * from mshr import * domain = Rectangle(Point(0.0, 0.0), Point(5.0, 0.01)) mesh = generate_mesh(domain, 20) V = FunctionSpace(mesh, "CG", 2) e = Expression("sin(2*pi*(x[0]*x[0]+x[1]*x[1]))", degree=2) f = interpolate(e, V) #################################################### from vedo.dolfin import plot plt = plot(f, xtitle='y-coord is scaled by factor 100', scaleMeshFactors=(0.01, 1, 1), style=1, lw=0, warpZfactor=0.001, scalarbar='horizontal', axes={'xtitle_offset':0.2}, text=__doc__, ) vedo-2023.4.6/examples/other/dolfin/stokes1.py000066400000000000000000000047651444463326400211100ustar00rootroot00000000000000""" This demo solves the Stokes equations, using quadratic elements for the velocity and first degree elements for the pressure (Taylor-Hood elements). """ # Credits: # https://github.com/pf4d/fenics_scripts/blob/master/cbc_block/stokes.py from dolfin import * import numpy as np from vedo.dolfin import plot from vedo import Latex, dataurl, download # Load mesh and subdomains fpath = download(dataurl + "dolfin_fine.xml") mesh = Mesh(fpath) fpath = download(dataurl + "dolfin_fine_subdomains.xml.gz") sub_domains = MeshFunction("size_t", mesh, fpath) # Define function spaces P2 = VectorElement("Lagrange", mesh.ufl_cell(), 2) P1 = FiniteElement("Lagrange", mesh.ufl_cell(), 1) TH = P2 * P1 W = FunctionSpace(mesh, TH) # No-slip boundary condition for velocity noslip = Constant((0, 0)) bc0 = DirichletBC(W.sub(0), noslip, sub_domains, 0) # Inflow boundary condition for velocity inflow = Expression(("-sin(x[1]*pi)", "0.0"), degree=2) bc1 = DirichletBC(W.sub(0), inflow, sub_domains, 1) bcs = [bc0, bc1] # Define variational problem (u, p) = TrialFunctions(W) (v, q) = TestFunctions(W) f = Constant((0, 0)) a = (inner(grad(u), grad(v)) - div(v) * p + q * div(u)) * dx L = inner(f, v) * dx w = Function(W) solve(a == L, w, bcs) # Split the mixed solution using a shallow copy (u, p) = w.split() ##################################################################### vedo f = r"-\nabla \cdot(\nabla u+p I)=f ~\mathrm{in}~\Omega" formula = Latex(f, pos=(0.55, 0.45, -0.05), s=0.1) plot( u, formula, at=0, N=2, mode="mesh and arrows", scale=0.03, wireframe=True, scalarbar=False, style=1, ) plot(p, at=1, text="pressure", cmap="rainbow", interactive=True).close() ##################################################################### streamlines # A list of seed points (can be automatic: just comment out 'probes') ally = np.linspace(0, 1, num=100) probes = np.c_[np.ones_like(ally), ally, np.zeros_like(ally)] plot( u, mode="mesh with streamlines", streamlines={ "tol": 0.02, # control density of streams "lw": 2, # line width "direction": "forward", # direction of integration "maxPropagation": 2.2, # max length of propagation "probes": probes, # custom list of point in space as seeds }, c="white", # mesh color alpha=0.3, # mesh alpha lw=0, # mesh line width wireframe=True, # show as wireframe bg="blackboard", # background color new=True, # new window pos=(200, 200), # window position on screen ) vedo-2023.4.6/examples/other/dolfin/stokes2.py000066400000000000000000000023361444463326400211010ustar00rootroot00000000000000from dolfin import * from mshr import * b = 0.7 embryo = Ellipse(Point(0.0, 0.0), 1, b) mesh = generate_mesh(embryo, 32) # Define function spaces P2 = VectorElement("CG", triangle, 2) P1 = FiniteElement("CG", triangle, 1) TH = MixedElement([P2, P1]) W = FunctionSpace(mesh, TH) g = Constant(0.0) mu = Constant(1.0) force = Constant((0.0, 0.0)) # Specify Boundary Conditions flow_profile = ("-sin(atan2(x[1]/b, x[0]))*sin(nharmonic*atan2(x[1]/b, x[0]))", "+cos(atan2(x[1]/b, x[0]))*sin(nharmonic*atan2(x[1]/b, x[0]))") bc = DirichletBC(W.sub(0), Expression(flow_profile, degree=2, b=b, nharmonic=2), "on_boundary") # Define trial and test functions (u, p) = TrialFunctions(W) (v, q) = TestFunctions(W) def epsilon(u): return grad(u) + nabla_grad(u) a = inner(mu*epsilon(u) + p*Identity(2), epsilon(v))*dx -div(u)*q*dx -1e-10*p*q*dx L = dot(force, v)*dx + g*q*dx # Solve system U = Function(W) solve(a == L, U, bc) # Get sub-functions u, p = U.split() from vedo.dolfin import plot plot(u, mode='mesh and arrows', scale=0.1, warpZfactor=-0.1, lw=0, scalarbar='horizontal', axes={'xlabel_size':0.01,'ylabel_size':0.01, 'ztitle':''}, title="Velocity") vedo-2023.4.6/examples/other/dolfin/submesh_boundary.py000066400000000000000000000014621444463326400230570ustar00rootroot00000000000000""" Extract submesh boundaries. """ # https://fenicsproject.discourse.group/t/output-parts-of-boundary/537 from fenics import * from mshr import * from numpy import array from numpy.linalg import norm domain = Box(Point(0,0,0), Point(10,10,10)) - Sphere(Point(5,5,5), 3) mesh = generate_mesh(domain, 32) exterior = BoundaryMesh(mesh, "exterior") def inSphere(x): v = x - array([5, 5, 5]) return norm(v) < 3 + 1e2 * DOLFIN_EPS class SphereDomain(SubDomain): def inside(self, x, on_boundary): return inSphere(x) class BoxDomain(SubDomain): def inside(self, x, on_boundary): return not inSphere(x) sph = SubMesh(exterior, SphereDomain()) box = SubMesh(exterior, BoxDomain()) from vedo.dolfin import plot plot(sph, at=0, N=2, c='red', text=__doc__) plot(box, at=1, wireframe=True) vedo-2023.4.6/examples/other/dolfin/turing_2d.py000066400000000000000000000046471444463326400214130ustar00rootroot00000000000000# # https://fenicsproject.org/qa/8612/difficulties-with-solving-the-gray-scott-model from dolfin import * import numpy as np # Set parameters D_u = 8.0e-05 D_v = 4.0e-05 c = 0.022 k = 0.055 dt = 12.0 t_max = 100000 # Form compiler options parameters["form_compiler"]["optimize"] = True parameters["form_compiler"]["cpp_optimize"] = True parameters["form_compiler"]["representation"] = "uflacs" set_log_level(30) # Class representing the initial conditions class InitialConditions(UserExpression): def eval(self, val, x): if between(x[0], (1.0, 1.5)) and between(x[1], (1.0, 1.5)): val[1] = 0.25*np.power(np.sin(4*np.pi*x[0]), 2)*np.power(np.sin(4*np.pi*x[1]), 2) val[0] = 1 - 2*val[1] else: val[1] = 0 val[0] = 1 def value_shape(self): return (2,) # Class for interfacing with the Newton solver class GrayScottEquations(NonlinearProblem): def __init__(self, a, L): NonlinearProblem.__init__(self) self.L = L self.a = a def F(self, b, x): assemble(self.L, tensor=b) def J(self, A, x): assemble(self.a, tensor=A) # Define mesh and function space p0 = Point(0.0, 0.0) p1 = Point(2.5, 2.5) mesh = RectangleMesh(p0, p1, 64, 64) V = VectorFunctionSpace(mesh, 'CG', 2) # Define functions W_init = InitialConditions(degree = 1) phi = TestFunction(V) dp = TrialFunction(V) W0 = Function(V) W = Function(V) # Interpolate initial conditions and split functions W0.interpolate(W_init) q, p = split(phi) u, v = split(W) u0, v0 = split(W0) # Weak statement of the equations F1 = u*q*dx -u0*q*dx +D_u*inner(grad(u), grad(q))*dt*dx +u*v*v*q*dt*dx -c*(1-u)*q*dt*dx F2 = v*p*dx -v0*p*dx +D_v*inner(grad(v), grad(p))*dt*dx -u*v*v*p*dt*dx +(c+k)*v*p*dt*dx F = F1 + F2 # Compute directional derivative about W in the direction of dp (Jacobian) a = derivative(F, W, dp) # Create nonlinear problem and Newton solver problem = GrayScottEquations(a, F) solver = NewtonSolver() #solver.parameters["linear_solver"] = "lu" #solver.parameters["convergence_criterion"] = "incremental" solver.parameters["relative_tolerance"] = 1e-3 from vedo.dolfin import plot t = 0.0 W.assign(W0) while (t < t_max): t += dt solver.solve(problem, W.vector()) W0.assign(W) u_out, v_out = W.split() plot(u_out, text="time = "+str(t), lw=0, warpZfactor=-0.1, vmin=0, vmax=1, scalarbar=False, interactive=False) vedo-2023.4.6/examples/other/dolfin/turing_3d.py000066400000000000000000000046351444463326400214110ustar00rootroot00000000000000# # https://fenicsproject.org/qa/8612/difficulties-with-solving-the-gray-scott-model from dolfin import * import numpy as np from vedo import Text2D, Sphere, show from vedo.dolfin import plot # Set parameters D_u = 8.0e-05 D_v = 4.0e-05 c = 0.024 k = 0.06 dt = 1.0 t_max = 100 # Form compiler options parameters["form_compiler"]["optimize"] = True parameters["form_compiler"]["cpp_optimize"] = True parameters["form_compiler"]["representation"] = "uflacs" set_log_level(30) # Class representing the initial conditions class InitialConditions(UserExpression): def eval(self, val, x): val[0] = np.random.rand() val[1] = np.random.rand() def value_shape(self): return (2,) # Class for interfacing with the Newton solver class GrayScottEquations(NonlinearProblem): def __init__(self, a, L): NonlinearProblem.__init__(self) self.L = L self.a = a def F(self, b, x): assemble(self.L, tensor=b) def J(self, A, x): assemble(self.a, tensor=A) def convert(vmesh): bpts = vmesh.compute_normals() bpts.write('tmpmesh.xml') return Mesh("tmpmesh.xml") # Define mesh and function space p0 = Point(0.0, 0.0, 0.0) sphere = Sphere([p0.x(), p0.y(), p0.z()], r=1.0) mesh = convert(sphere) V_ele = FiniteElement("CG", mesh.ufl_cell(), 1) V = FunctionSpace(mesh, MixedElement([V_ele, V_ele])) # Define functions W_init = InitialConditions(degree=1) phi = TestFunction(V) dp = TrialFunction(V) W0 = Function(V) W = Function(V) # Interpolate initial conditions and split functions W0.interpolate(W_init) q, p = split(phi) u, v = split(W) u0, v0 = split(W0) # Weak statement of the equations F1 = u*q*dx -u0*q*dx +D_u*inner(grad(u),grad(q)) *dt*dx +u*v*v*q*dt*dx -c*(1-u)*q*dt*dx F2 = v*p*dx -v0*p*dx +D_v*inner(grad(v),grad(p)) *dt*dx -u*v*v*p*dt*dx +(c+k)*v*p*dt*dx F = F1 + F2 # Compute directional derivative about W in the direction of dp (Jacobian) a = derivative(F, W, dp) # Create nonlinear problem and Newton solver problem = GrayScottEquations(a, F) solver = NewtonSolver() #solver.parameters["linear_solver"] = "lu" #solver.parameters["convergence_criterion"] = "incremental" # solver.parameters["relative_tolerance"] = 1e-3 t = 0.0 W.assign(W0) while t < t_max: t += dt solver.solve(problem, W.vector()) W0.assign(W) u_out, v_out = W.split() plot(u_out, Text2D("time = "+str(t)), vmin=0, vmax=1, scalarbar=False, interactive=False) vedo-2023.4.6/examples/other/ellipt_fourier_desc.py000066400000000000000000000014061444463326400222530ustar00rootroot00000000000000"""Elliptic Fourier Descriptors parametrizing a closed contour (in red)""" import vedo import pyefd shapes = vedo.load(vedo.dataurl+'timecourse1d.npy') sh = shapes[55] sr = vedo.Line(sh).mirror('x').reverse() sm = vedo.merge(sh, sr).c('red5').lw(3) pts = sm.points()[:,(0,1)] rlines = [] for order in range(5,30, 5): coeffs = pyefd.elliptic_fourier_descriptors(pts, order=order, normalize=False) a0, c0 = pyefd.calculate_dc_coefficients(pts) rpts = pyefd.reconstruct_contour(coeffs, locus=(a0,c0), num_points=400) color = vedo.color_map(order, "Blues", 5,30) rline = vedo.Line(rpts).lw(3).c(color) rlines.append(rline) sm.z(0.1) # move it on top so it's visible vedo.show(sm, *rlines, __doc__, axes=1, bg='k', size=(1190, 630), zoom=1.8).close() vedo-2023.4.6/examples/other/export_numpy.py000066400000000000000000000007321444463326400210030ustar00rootroot00000000000000from vedo import * m1 = Mesh(dataurl+'bunny.obj').c('g').normalize().rotate_x(+90) m2 = Mesh(dataurl+'teddy.vtk').c('v').normalize().rotate_z(-90).pos(3,0,0) plt = show(m1, m2, axes=1) plt.export('scene.npz') printc("Window exported to numpy file: scene.npz", c='g') plt.close() ################################################ plt = load('scene.npz') plt += Text2D("Imported scene", c='k', bg='b') plt.show().close() printc("\nTry also:\n> vedo scene.npz", c='g') vedo-2023.4.6/examples/other/export_x3d.py000066400000000000000000000012151444463326400203260ustar00rootroot00000000000000"""Embed a 3D scene in a webpage with x3d""" from vedo import dataurl, Plotter, Volume, Text3D plt = Plotter(size=(800,600), bg='GhostWhite') embryo = Volume(dataurl+'embryo.tif').isosurface().decimate(0.5) coords = embryo.points() embryo.cmap('PRGn', coords[:,1]) # add dummy colors along y txt = Text3D(__doc__, font='Bongas', s=350, c='red2', depth=0.05) txt.pos(2500, 300, 500) plt.show(embryo, txt, txt.box(padding=250), axes=1, viewup='z', zoom=1.2) # This exports the scene and generates 2 files: # embryo.x3d and an example embryo.html to inspect in the browser plt.export('embryo.x3d', binary=False) print("Type: \n firefox embryo.html") vedo-2023.4.6/examples/other/flag_labels1.py000066400000000000000000000016531444463326400205510ustar00rootroot00000000000000"""Hover mouse onto an object to pop a flag-style label""" from vedo import * b = Mesh(dataurl+'bunny.obj').color('m') c = Cube(side=0.1).compute_normals().alpha(0.8).y(-0.02).lighting("off").lw(1) fp = b.flagpole('A flag pole descriptor\nfor a rabbit', font='Quikhand') fp.scale(0.5).color('v').use_bounds() # tell camera to take fp bounds into account c.caption('2d caption for a cube\nwith face indices', point=[0.044, 0.03, -0.04], size=(0.3,0.06), font="VictorMono", alpha=1) # create a new object made of polygonal text labels to indicate the cell numbers flabs = c.labels('id', on="cells", font='Theemim', scale=0.02, c='k') vlabs = c.clone().clean().labels2d(font='ComicMono', scale=3, bc='orange7') # create a custom entry to the legend b.legend('Bugs the bunny') c.legend('The Cube box') lbox = LegendBox([b,c], font="Bongas", width=0.25) show(b, c, fp, flabs, vlabs, lbox, __doc__, axes=11, bg2='linen').close() vedo-2023.4.6/examples/other/flag_labels2.py000066400000000000000000000006461444463326400205530ustar00rootroot00000000000000"""A flag-post style marker""" from vedo import ParametricShape, precision, color_map, show s = ParametricShape("RandomHills").cmap("coolwarm") pts = s.clone().decimate(n=10).points() fss = [] for p in pts: col = color_map(p[2], name="coolwarm", vmin=0, vmax=0.7) ht = precision(p[2], 3) fs = s.flagpost(f"Heigth:\nz={ht}m", p, c=col) fss.append(fs) show(s, *fss, __doc__, bg="bb", axes=1, viewup="z") vedo-2023.4.6/examples/other/icon.py000066400000000000000000000005121444463326400171560ustar00rootroot00000000000000"""Make a icon to indicate orientation and place it in one of the 4 corners within the same renderer""" from vedo import * plt = Plotter(axes=5) plt += Text3D(__doc__).bc('tomato') elg = Picture(dataurl+"images/embl_logo.jpg") plt.add_icon(elg, pos=2, size=0.06) plt.add_icon(VedoLogo(), pos=1, size=0.06) plt.show().close() vedo-2023.4.6/examples/other/iminuit1.py000066400000000000000000000015111444463326400177650ustar00rootroot00000000000000"""Use iminuit to find the minimum of a 3D scalar field""" from vedo import show, Point, Line, printc from iminuit import Minuit # pip install iminuit # https://github.com/scikit-hep/iminuit import numpy as np def fcn(x, y, z): f = (x - 4) ** 4 + (y - 3) ** 4 + (z - 2) ** 2 if not vals or f < vals[-1]: path.append([x,y,z]) vals.append(f) return f paths = [] for x,y,z in np.random.rand(200, 3)*3: path, vals = [], [] m = Minuit(fcn, x=x, y=y, z=z) m.errordef = m.LEAST_SQUARES # m.simplex() # run simplex optimiser m.migrad() # run migrad optimiser line = Line(path).cmap('jet_r', vals).lw(2).alpha(0.25) paths.append(line) printc('Last optimization output:', c='green7', invert=1) printc(m, c='green7', italic=1) show(paths, Point([4,3,2]), __doc__, axes=1).close() vedo-2023.4.6/examples/other/inset.py000066400000000000000000000021471444463326400173560ustar00rootroot00000000000000"""Render meshes into inset windows (which can be dragged)""" from vedo import * plt = Plotter(bg2='bisque', size=(1000,800), interactive=False) e = Volume(dataurl+"embryo.tif").isosurface() e.normalize().shift(-2,-1.5,-2).c("gold") plt.show(e, __doc__, viewup='z') # make clone copies of the embryo surface and cut them: e1 = e.clone().cut_with_plane(normal=[0,1,0]).c("green4") e2 = e.clone().cut_with_plane(normal=[1,0,0]).c("red5") # add 2 draggable inset windows: plt.add_inset(e1, pos=(0.9,0.8)) plt.add_inset(e2, pos=(0.9,0.5)) # customised axes can also be inserted: ax = Axes( xrange=(0,1), yrange=(0,1), zrange=(0,1), xtitle='front', ytitle='left', ztitle='head', yzgrid=False, xtitle_size=0.15, ytitle_size=0.15, ztitle_size=0.15, xlabel_size=0, ylabel_size=0, zlabel_size=0, tip_size=0.05, axes_linewidth=2, xline_color='dr', yline_color='dg', zline_color='db', xtitle_offset=0.05, ytitle_offset=0.05, ztitle_offset=0.05, ) ex = e.clone().scale(0.25).pos(0,0.1,0.1).alpha(0.1).lighting('off') plt.add_inset(ax, ex, pos=(0.1,0.1), size=0.15, draggable=False) plt.interactive().close() vedo-2023.4.6/examples/other/make_video.py000066400000000000000000000034051444463326400203350ustar00rootroot00000000000000"""Make a video file with or without graphic window""" from vedo import dataurl, Plotter, Mesh, Video # settings.screeshot_scale = 2 # to get higher resolution msh = Mesh(dataurl+"spider.ply").rotate_x(-90) msh.texture(dataurl+"textures/leather.jpg") plt = Plotter(bg="beige", bg2="lb", axes=10, offscreen=False) plt += [msh, __doc__] ############################################################## # Open a video file and force it to last 3 seconds in total video = Video("spider.mp4", duration=3) # or gif ############################################################## # Any rendering loop goes here, e.g.: # for i in range(80): # plt.show(elevation=1, azimuth=2) # render the scene # video.add_frame() # add individual frame ############################################################## # OR use the automatic video shooting function: # Options are: elevation=(0,80), # range of elevation values # azimuth=(0,359), # zoom=None, # cameras=None ############################################################## # OR set a sequence of camera positions, e.g.: cam1 = dict( position=(5.805, 17.34, -0.8418), focal_point=(3.133, 1.506, -3.132), viewup=(-0.3099, 0.1871, -0.9322), distance=16.22, clipping_range=(12.35, 21.13), ) cam2 = dict( position=(-1.167, 3.356, -18.66), focal_point=(3.133, 1.506, -3.132), distance=16.22, clipping_range=(8.820, 25.58), ) cam3 = dict( position=(-4.119, 0.9889, -0.8867), focal_point=(2.948, 1.048, -3.592), viewup=(-0.01864, 0.9995, -0.02682), distance=7.567, clipping_range=(0.07978, 17.04), ) video.action(cameras=[cam1, cam2, cam3, cam1]) video.close() # merge all the recorded frames and write to disk plt.interactive().close() vedo-2023.4.6/examples/other/meshio_read.py000066400000000000000000000006161444463326400205120ustar00rootroot00000000000000"""Read and show meshio objects""" import meshio from vedo import download, show, Mesh fpath = download('https://vedo.embl.es/examples/data/shuttle.obj') mesh = meshio.read(fpath) # vedo understands meshio format for polygonal data: # show(mesh, __doc__, axes=7) # explicitly convert it to a vedo.Mesh object: m = Mesh(mesh).linewidth(1).color('tomato').print() show(m, __doc__, axes=7).close() vedo-2023.4.6/examples/other/morphomatics_regression.py000066400000000000000000000035541444463326400232040ustar00rootroot00000000000000"""Geodesic regression for data in SO(3) with the Morphometrics library""" try: from morphomatics.manifold import SO3 from morphomatics.stats import RiemannianRegression except ModuleNotFoundError: print("Install with:") print("pip install git+https://github.com/morphomatics/morphomatics.git#egg=morphomatics") import numpy as np import vedo # z-axis is axis of rotation I = np.eye(3) R = np.array( [[np.cos(np.pi / 6), -np.sin(np.pi / 6), 0], [np.sin( np.pi / 6), np.cos(np.pi / 6), 0], [0, 0, 1]], ) # 6 points in SO(3). The extra dimension is not needed here but comes # into play when the data consists of tuples of matrices. M = SO3() Y = np.zeros((6,) + tuple(M.point_shape)) # -> (6,1,3,3) eval_perturbed = lambda t, vec: M.connec.exp(M.connec.geopoint(I,R,t), vec) Y[0, 0] = eval_perturbed(-2 / 3, np.array([[0, 0, 0.1], [0, 0, 0.0], [-0.1, 0.0, 0]])) Y[1, 0] = eval_perturbed(-1 / 3, np.array([[0, 0, 0.0], [0, 0, 0.2], [ 0.0,-0.2, 0]])) Y[2, 0] = I Y[3, 0] = eval_perturbed( 1 / 3, np.array([[0, 0, 0.0], [0, 0, 0.2], [ 0.0,-0.2, 0]])) Y[4, 0] = eval_perturbed( 2 / 3, np.array([[0, 0, 0.1], [0, 0, 0.0], [-0.1, 0.0, 0]])) Y[5, 0] = R # corresponding time points t = np.array([0, 1/5, 2/5, 3/5, 4/5, 1]) # geodesic has degree 1 degrees = np.array([1]) # cubic regression # degrees = np.array([3]) # solve regression = RiemannianRegression(M, Y, t, degrees) # geodesic least-squares estimator gam = regression.trend # evaluate geodesic at 100 equidistant points X = gam.eval() # rotate [1,0,0] by rotations in X, i.e. take first column of X x = X[...,0].squeeze() time = np.linspace(0,1, x.shape[0]) pts = [y[..., 0][0] for y in Y] # visualize pts = vedo.Points(pts, r=15) line = vedo.Line(x).lw(10).cmap("jet", time) line.add_scalarbar("time") sphere = vedo.Sphere(c='white').flat() vedo.show(sphere, line, pts, __doc__, axes=1, viewup='z').close() vedo-2023.4.6/examples/other/morphomatics_tube.py000066400000000000000000000024601444463326400217560ustar00rootroot00000000000000"""Morphomatics example""" try: from morphomatics.geom import Surface from morphomatics.stats import StatisticalShapeModel from morphomatics.manifold import FundamentalCoords except ModuleNotFoundError: print("Install with:") print("pip install git+https://github.com/morphomatics/morphomatics.git#egg=morphomatics") exit(0) import numpy as np import vedo ln1 = [[1, 1, x / 2] for x in np.arange(0,15, 0.15)] ln2 = [[np.sin(x), np.cos(x), x / 2] for x in np.arange(0,15, 0.15)] rads= [0.4*(np.cos(6*ir/len(ln2)))**2+0.1 for ir in range(len(ln2))] vmesh1 = vedo.Tube(ln1, r=0.08).triangulate().clean() vmesh2 = vedo.Tube(ln2, r=rads).triangulate().clean() verts1 = vmesh1.points() verts2 = vmesh2.points() faces = np.array(vmesh1.faces()) # construct model SSM = StatisticalShapeModel(lambda ref: FundamentalCoords(ref)) surfaces = [Surface(v, faces) for v in [verts1, verts2]] SSM.construct(surfaces) # sample trajectory along the main mode of variation shapes = [] std = np.sqrt(SSM.variances[0]) for t in np.linspace(-1.0, 1.0, 20): e = SSM.space.exp(SSM.mean_coords, t * std * SSM.modes[0]) v = SSM.space.from_coords(e) shapes.append(vedo.Mesh([v, faces])) plt = vedo.applications.Browser(shapes, prefix="shape ", bg2='lb') plt += vedo.Axes(shapes[-1]) plt.show(viewup='z').close() vedo-2023.4.6/examples/other/napari1.py000066400000000000000000000014271444463326400175670ustar00rootroot00000000000000import numpy as np import napari import vedo # Load the surface, triangulate just in case, and compute vertex normals surf = vedo.Mesh(vedo.dataurl+"beethoven.ply").triangulate().compute_normals() surf.rotate_x(180).rotate_y(60) vertices = surf.points() faces = np.array(surf.faces()) normals = surf.normals() # generate vertex values by projecting normals on a "lighting vector" values = np.dot(normals, [-1, 1, 1]) print(vertices.shape, faces.shape, values.shape) # (2521, 3) (5030, 3) (2521,) with napari.gui_qt(): # create an empty viewer viewer = napari.Viewer() # add the surface viewer.add_surface((vertices, faces, values), opacity=0.8) viewer.add_points(vertices, size=0.05, face_color='pink') # turn on 3D rendering viewer.dims.ndisplay = 3 vedo-2023.4.6/examples/other/nevergrad_opt.py000066400000000000000000000016131444463326400210700ustar00rootroot00000000000000"""Using nevergrad package to find the minimum of the 2-variable function: z = (x-1)**2 + (y-1)**2 + 9*sin(y-1)**2 """ from vedo import * from vedo.pyplot import plot import nevergrad as ng # install with: pip install nevergrad def f(x,y): z = (x-1)**2 + (y-1)**2 + 9*sin(y-1)**2 + 1 return z/12 def func(v): return f(v[0],v[1]) def callbk(opti, v, value): global minv if value < minv: pts.append([v.value[0], v.value[1], value]) minv = value optimizer = ng.optimizers.OnePlusOne(parametrization=2, budget=100) pts, minv = [], 1e30 optimizer.register_callback("tell", callbk) # define a constraint on first variable of x: #optimizer.parametrization.register_cheap_constraint(lambda v: v[0]>-3) res = optimizer.minimize(func) # best value printc('Minimum at:', res.value) ln = Line(pts, lw=3, c='r') fu = plot(f, xlim=[-3,4], ylim=[-3,4]) show(fu, ln, __doc__) vedo-2023.4.6/examples/other/printc.py000066400000000000000000000022461444463326400175330ustar00rootroot00000000000000# Available modifiers: # c (foreground color), bc (background color) # bold, blink, underLine, dim, invert, box from vedo import printc printc(":world: 1- Change the world by being yourself - Amy Poehler", c=1) printc(":smile: 2- Never regret anything that made you smile - Mark Twain", c="r", bold=0) printc(":construction: 3- Every moment is a fresh beginning - T.S Eliot", c="m", underline=1) printc(":thumbup: 4- Die with memories, not dreams - Unknown", blink=1, bold=0) printc(":pin: 5- When words fail, music speaks - Shakespeare") printc(":rocket: 6- Everything you can imagine is real - Pablo Picasso", c=3) printc(":idea: 7- Simplicity is the ultimate sophistication - Leonardo da Vinci", c=4) printc(":rainbow: 8- Whatever you do, do it well - Walt Disney", c=3, bc=1) printc(":target: 9- What we think, we become - Buddha", c=6, invert=1) printc(":sparks:10- All limitations are self-imposed - Oliver Wendell Holmes", c=7, dim=1) printc(":checked:11- If you tell the truth you don't have to remember anything - Mark Twain", underline=True, invert=True, c="indigo9", ) from vedo.colors import emoji for k in emoji.keys(): print(emoji[k], "\t", k) vedo-2023.4.6/examples/other/pygeodesic1.py000066400000000000000000000010211444463326400204360ustar00rootroot00000000000000"""pygeodesic library to compute geodesic distances""" from pygeodesic import geodesic # pip install pygeodesic import vedo m = vedo.Mesh(vedo.dataurl+"bunny.obj").c("green9") geoalg = geodesic.PyGeodesicAlgorithmExact(m.points(), m.faces()) # Use source and target point ids distance, path = geoalg.geodesicDistance(639, 834) distances, _ = geoalg.geodesicDistances([639, 1301]) # any of the two line = vedo.Line(path).c("k").lw(4) m.cmap("Set2", distances, name="GeodesicDistance") vedo.show(m, line, __doc__, axes=1) vedo-2023.4.6/examples/other/pygmsh_cut.py000066400000000000000000000020061444463326400204100ustar00rootroot00000000000000# Example usage with pygmsh package: # https://github.com/nschloe/pygmsh import pygmsh # pip install pygmsh from vedo import TetMesh, SphereCutter, Plotter with pygmsh.occ.Geometry() as geom: geom.characteristic_length_min = 0.1 geom.characteristic_length_max = 0.1 rectangle = geom.add_rectangle([-1.0, -1.0, 0.0], 2.0, 2.0) disk1 = geom.add_disk([-1.2, 0.0, 0.0], 0.5) disk2 = geom.add_disk([+1.2, 0.0, 0.0], 0.5) disk3 = geom.add_disk([0.0, -0.9, 0.0], 0.5) disk4 = geom.add_disk([0.0, +0.9, 0.0], 0.5) flat = geom.boolean_difference( geom.boolean_union([rectangle, disk1, disk2]), geom.boolean_union([disk3, disk4]), ) geom.extrude(flat, [0, 0, 0.3]) msh = geom.generate_mesh() lines, triangles, tetras, vertices = msh.cells msh = TetMesh([msh.points, tetras.data]).tomesh() plt = Plotter(axes=1, interactive=False) plt.show( msh, "Drag the sphere,\nright-click&drag to zoom", ) cutter = SphereCutter(msh) plt.add(cutter) plt.interactive() plt.close() vedo-2023.4.6/examples/other/pymeshlab1.py000066400000000000000000000016761444463326400203070ustar00rootroot00000000000000import vedo import pymeshlab # tested on pymeshlab-2022.2.post2 filepath = vedo.download(vedo.dataurl+'bunny.obj') ms = pymeshlab.MeshSet() ms.load_new_mesh(filepath) pt = [0.0234, 0.0484, 0.0400] ms.compute_scalar_by_geodesic_distance_from_given_point_per_vertex(startpoint=pt) # vedo.show(ms, axes=True) # this already works! mlab_mesh = ms.current_mesh() vedo_mesh = vedo.Mesh(mlab_mesh).cmap('Paired').add_scalarbar("distance") print("We can also convert it back to pymeshlab.MeshSet:", type(vedo.utils.vedo2meshlab(vedo_mesh)) ) vedo.show( __doc__, vedo_mesh, vedo.Point(pt), axes=True, bg='green9', bg2='blue9', title="vedo + pymeshlab", ) ################################################################################ # Full list of filters, https://pymeshlab.readthedocs.io/en/latest/filter_list.html # pymeshlab.print_filter_list() # pymeshlab.print_filter_parameter_list('generate_surface_reconstruction_screened_poisson') vedo-2023.4.6/examples/other/pymeshlab2.py000066400000000000000000000011411444463326400202730ustar00rootroot00000000000000"""pymeshlab interoperability example: Surface reconstruction by ball pivoting""" import vedo import pymeshlab # tested on pymeshlab-2022.2.post2 pts = vedo.Mesh(vedo.dataurl+'cow.vtk').points() # numpy array of vertices m = pymeshlab.Mesh(vertex_matrix=pts) ms = pymeshlab.MeshSet() ms.add_mesh(m) p = pymeshlab.Percentage(2) ms.generate_surface_reconstruction_ball_pivoting(ballradius=p) mlab_mesh = ms.current_mesh() reco_mesh = vedo.Mesh(mlab_mesh).compute_normals().flat().backcolor('t') vedo.show( __doc__, vedo.Points(pts), reco_mesh, axes=True, bg2='blue9', title="vedo + pymeshlab", ) vedo-2023.4.6/examples/other/qt_cutter.py000066400000000000000000000033171444463326400202460ustar00rootroot00000000000000import sys # from PySide2 import QtWidgets, QtCore from PyQt5 import Qt from vtkmodules.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor from vedo import Plotter, Mesh, BoxCutter, dataurl class MainWindow(Qt.QMainWindow): def __init__(self, parent=None): Qt.QMainWindow.__init__(self, parent) self.frame = Qt.QFrame() self.layout = Qt.QVBoxLayout() self.vtkWidget = QVTKRenderWindowInteractor(self.frame) # Create renderer and add the vedo objects and callbacks self.plt = Plotter(qt_widget=self.vtkWidget) mesh = Mesh(dataurl+'cow.vtk') self.cutter = BoxCutter(mesh) self.plt += [mesh, self.cutter] self.plt.show() box_cutter_button_on = Qt.QPushButton("Start the box cutter") box_cutter_button_on.clicked.connect(self.ctool_start) box_cutter_button_off = Qt.QPushButton("Stop the box cutter") box_cutter_button_off.clicked.connect(self.ctool_stop) # Set-up the rest of the Qt window self.layout.addWidget(self.vtkWidget) self.layout.addWidget(box_cutter_button_on) self.layout.addWidget(box_cutter_button_off) self.frame.setLayout(self.layout) self.setCentralWidget(self.frame) self.show() def ctool_start(self): self.cutter.on() def ctool_stop(self): self.cutter.off() def onClose(self): #Disable the interactor before closing to prevent it #from trying to act on already deleted items self.vtkWidget.close() if __name__ == "__main__": app = Qt.QApplication(sys.argv) window = MainWindow() app.aboutToQuit.connect(window.onClose) # <-- connect the onClose event app.exec_() vedo-2023.4.6/examples/other/qt_tabs.py000066400000000000000000000076401444463326400176740ustar00rootroot00000000000000import sys from PyQt5 import QtCore, QtWidgets from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor from vedo import Mesh, dataurl, Plotter from vedo.pyplot import np, plot try: _encoding = QtWidgets.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtWidgets.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtWidgets.QApplication.translate(context, text, disambig) class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.tab1 = QtWidgets.QWidget() self.tab1.setObjectName("tab1") self.gridLayout1 = QtWidgets.QGridLayout(self.tab1) self.vtkLayout1 = QtWidgets.QVBoxLayout() self.vtkLayout1.setObjectName("vtkLayout1") self.gridLayout1.addLayout(self.vtkLayout1, 0, 0, 1, 1) self.tab2 = QtWidgets.QWidget() self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) self.tabWidget.addTab(self.tab1, "tab1") self.tabWidget.addTab(self.tab2, "tab2") self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.addWidget(self.tabWidget) self.gridLayout2 = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout2.addLayout(self.verticalLayout, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 31)) MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) MainWindow.setStatusBar(self.statusbar) MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) self.tabWidget.setTabText( self.tabWidget.indexOf(self.tab1), _translate("MainWindow", "Tab 1", None) ) self.tabWidget.setTabText( self.tabWidget.indexOf(self.tab2), _translate("MainWindow", "Tab 2", None) ) self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self, parent=None): QtWidgets.QMainWindow.__init__(self, parent) self.setupUi(self) self.vtkWidget1 = QVTKRenderWindowInteractor(self) self.vtkLayout1.addWidget(self.vtkWidget1) self.plt1 = Plotter(qt_widget=self.vtkWidget1, axes=1) self.id2 = self.plt1.add_callback("key press", self.onKeypress) self.plt1 += Mesh(dataurl+'shark.ply').c('cyan') self.plt1.show() self.vtkWidget2 = QVTKRenderWindowInteractor(self) self.verticalLayout.addWidget(self.vtkWidget2) self.plt2 = Plotter(qt_widget=self.vtkWidget2) ##################################################### # add a plot using a formatted Figure x = np.random.randn(100) + 10 y = np.random.randn(100) * 20 + 20 fig = plot( x, y, lw=0, # do not join points with lines xtitle="variable x", ytitle="variable y", marker="*", # marker style mc="dr", # marker color aspect=16/9, # aspect ratio ) self.plt2 += fig ##################################################### show self.plt2.show(zoom=1.8, mode='image') def onClose(self): self.vtkWidget1.close() def onKeypress(self, evt): print("You have pressed key:", evt.keypress) if evt.keypress=='q': sys.exit(0) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) window = MainWindow() app.aboutToQuit.connect(window.onClose) window.show() sys.exit(app.exec_()) vedo-2023.4.6/examples/other/qt_window1.py000066400000000000000000000037001444463326400203240ustar00rootroot00000000000000import sys from PyQt5 import Qt from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor from vedo import Plotter, Cone, printc class MainWindow(Qt.QMainWindow): def __init__(self, parent=None): Qt.QMainWindow.__init__(self, parent) self.frame = Qt.QFrame() self.layout = Qt.QVBoxLayout() self.vtkWidget = QVTKRenderWindowInteractor(self.frame) # Create renderer and add the vedo objects and callbacks self.plt = Plotter(qt_widget=self.vtkWidget) self.id1 = self.plt.add_callback("mouse click", self.onMouseClick) self.id2 = self.plt.add_callback("key press", self.onKeypress) self.plt += Cone().rotate_x(20) self.plt.show() # <--- show the vedo rendering # Set-up the rest of the Qt window button = Qt.QPushButton("My Button makes the cone red") button.setToolTip('This is an example button') button.clicked.connect(self.onClick) self.layout.addWidget(self.vtkWidget) self.layout.addWidget(button) self.frame.setLayout(self.layout) self.setCentralWidget(self.frame) self.show() # <--- show the Qt Window def onMouseClick(self, evt): printc("You have clicked your mouse button. Event info:\n", evt, c='y') def onKeypress(self, evt): printc("You have pressed key:", evt.keypress, c='b') @Qt.pyqtSlot() def onClick(self): printc("..calling onClick") self.plt.actors[0].color('red').rotate_z(40) self.plt.interactor.Render() def onClose(self): #Disable the interactor before closing to prevent it #from trying to act on already deleted items printc("..calling onClose") self.vtkWidget.close() if __name__ == "__main__": app = Qt.QApplication(sys.argv) window = MainWindow() app.aboutToQuit.connect(window.onClose) # <-- connect the onClose event app.exec_() vedo-2023.4.6/examples/other/qt_window2.py000066400000000000000000000034331444463326400203300ustar00rootroot00000000000000import sys from PyQt5 import Qt from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor from vedo import Plotter, Picture, Text2D, printc class MainWindow(Qt.QMainWindow): def __init__(self, parent=None): Qt.QMainWindow.__init__(self, parent) self.frame = Qt.QFrame() self.layout = Qt.QVBoxLayout() self.vtkWidget = QVTKRenderWindowInteractor(self.frame) # Create vedo renderer and add objects and callbacks self.plt = Plotter(qt_widget=self.vtkWidget) self.cbid = self.plt.add_callback("key press", self.onKeypress) self.imgActor = Picture("https://icatcare.org/app/uploads/2018/07/Helping-your-new-cat-or-kitten-settle-in-1.png") self.text2d = Text2D("Use slider to change contrast") self.slider = Qt.QSlider(1) self.slider.valueChanged.connect(self.onSlider) self.layout.addWidget(self.vtkWidget) self.layout.addWidget(self.slider) self.frame.setLayout(self.layout) self.setCentralWidget(self.frame) self.plt.show(self.imgActor, self.text2d, mode='image') # build the vedo rendering self.show() # show the Qt Window def onSlider(self, value): self.imgActor.window(value*10) # change image contrast self.text2d.text(f"window level is now: {value*10}") self.plt.render() def onKeypress(self, evt): printc("You have pressed key:", evt.keypress, c='b') if evt.keypress=='q': self.plt.close() self.vtkWidget.close() exit() def onClose(self): self.vtkWidget.close() if __name__ == "__main__": app = Qt.QApplication(sys.argv) window = MainWindow() app.aboutToQuit.connect(window.onClose) app.exec_() vedo-2023.4.6/examples/other/qt_window3.py000066400000000000000000000032611444463326400203300ustar00rootroot00000000000000import sys from PyQt5 import Qt from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor from vedo import Plotter, Cone class MainWindow(Qt.QMainWindow): def __init__(self, parent=None): Qt.QMainWindow.__init__(self, parent) self.frame = Qt.QFrame() self.layout = Qt.QVBoxLayout() self.widget = QVTKRenderWindowInteractor(self.frame) # Create renderer and add the vedo objects and callbacks self.plt = Plotter(N=2, axes=1, qt_widget=self.widget) self.id1 = self.plt.add_callback("mouse click", self.onMouseClick) self.id2 = self.plt.add_callback("key press", self.onKeypress) cone1 = Cone().rotate_x(20) cone2 = Cone().rotate_x(40).c("blue5") self.plt.at(0).show(cone1) self.plt.at(1).show(cone2) # Set up the rest of the Qt window button = Qt.QPushButton("My Button makes the cone red") button.setToolTip("This is an example button") button.clicked.connect(self.onClick) self.layout.addWidget(self.widget) self.layout.addWidget(button) self.frame.setLayout(self.layout) self.setCentralWidget(self.frame) self.show() # NB: qt, not a Plotter method def onMouseClick(self, evt): print("mouse clicked") def onKeypress(self, evt): print("key pressed:", evt.keypress) @Qt.pyqtSlot() def onClick(self): self.plt.actors[0].color("red5").rotate_z(40) self.plt.render() def onClose(self): self.widget.close() if __name__ == "__main__": app = Qt.QApplication(sys.argv) window = MainWindow() app.aboutToQuit.connect(window.onClose) app.exec_() vedo-2023.4.6/examples/other/remesh_ACVD.py000066400000000000000000000007741444463326400203200ustar00rootroot00000000000000# Credits: # https://github.com/akaszynski/pyacvd # Needs PyACVD: # pip install pyacvd # from vedo import * from pyvista import wrap from pyacvd import Clustering mesh = Sphere(res=50).subdivide().lw(0.2).cut_with_plane().clean() clus = Clustering(wrap(mesh.polydata())) clus.cluster(1000, maxiter=100, iso_try=10, debug=False) pvremesh = clus.create_mesh() remesh = Mesh(pvremesh).compute_normals() remesh.color('o6').backcolor('v').lw(0.2).shift(1,0,0) show(mesh, remesh) #remesh.write('sphere.vtk') vedo-2023.4.6/examples/other/remesh_meshfix.py000066400000000000000000000021071444463326400212360ustar00rootroot00000000000000#Credits: #M. Attene. A lightweight approach to repairing digitized polygon meshes. #The Visual Computer, 2010. (c) Springer. DOI: 10.1007/s00371-010-0416-3 #http://pymeshfix.pyvista.org #TetGen, a Delaunay-Based Quality Tetrahedral Mesh Generator #https://github.com/pyvista/tetgen # # pip install pymeshfix # pip install tetgen # import pymeshfix import tetgen import vedo vedo.settings.use_depth_peeling = True amesh = vedo.Mesh(vedo.dataurl+'290.vtk') # repairing also closes the mesh in a nice way meshfix = pymeshfix.MeshFix(amesh.points(), amesh.faces()) meshfix.repair() repaired = vedo.Mesh(meshfix.mesh).linewidth(1).alpha(0.5) # tetralize the closed surface tet = tetgen.TetGen(repaired.points(), repaired.faces()) tet.tetrahedralize(order=1, mindihedral=20, minratio=1.5) tmesh = vedo.TetMesh(tet.grid) # save it to disk #tmesh.write("my_tetmesh.vtk") plt = vedo.Plotter(N=3, axes=1) plt.at(0).show("Original mesh", amesh) plt.at(1).show("Repaired mesh", repaired) plt.at(2).show("Tetrahedral mesh\n(click & press shift-X)", tmesh.tomesh().shrink()) plt.interactive().close() vedo-2023.4.6/examples/other/remesh_tetgen.py000066400000000000000000000030331444463326400210600ustar00rootroot00000000000000"""Segment a TetMesh with a custom scalar. Press q to make it explode""" from vedo import Mesh, TetMesh, Plotter, Text2D, dataurl import tetgen import pymeshfix n = 20000 f1 = 0.005 # control the tetras resolution f2 = 0.15 # control the nr of seeds # repair and tetralize the closed surface amesh = Mesh(dataurl + "bunny.obj") meshfix = pymeshfix.MeshFix(amesh.points(), amesh.faces()) meshfix.repair() # will make it manifold repaired = Mesh(meshfix.mesh) tet = tetgen.TetGen(repaired.points(), repaired.faces()) tet.tetrahedralize(order=1, mindihedral=50, minratio=1.5) tmesh = TetMesh(tet.grid) surf = tmesh.tomesh(fill=False) txt = Text2D(__doc__, font="Brachium") # pick points on the surface and use subsample to make them uniform seeds = surf.clone().subsample(f2).ps(10).c("black") # assign to each tetrahedron the id of the closest seed point cids = [] for p in tmesh.cell_centers(): cid = seeds.closest_point(p, return_point_id=True) cids.append(cid) tmesh.celldata["fragment"] = cids # tmesh.celldata.select("fragment")# bug, has no effect, needs name=... pieces = [] for i in range(seeds.npoints): tc = tmesh.clone().threshold(name="fragment", above=i - 0.1, below=i + 0.1) mc = tc.tomesh(fill=False).color(i) pieces.append(mc) ############### animate plt = Plotter(size=(1200, 800), axes=1) plt.show(txt, pieces) for i in range(10): for pc in pieces: cm = pc.center_of_mass() pc.shift(cm / 25) txt.text(f"{__doc__}\n\nNr. of pieces = {seeds.npoints}") plt.render() plt.interactive().close() vedo-2023.4.6/examples/other/run_all.sh000077500000000000000000000020201444463326400176430ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo ############################################# echo Press Esc at anytime to skip example echo ############################################# echo echo echo Running clone2d.py python3 clone2d.py echo Running flag_labels1.py python3 flag_labels1.py echo Running flag_labels2.py python3 flag_labels2.py echo Running icon.py python3 icon.py echo Running iminuit1.py python3 iminuit1.py echo Running inset.py python3 inset.py echo Running vpolyscope.py python3 vpolyscope.py echo Running meshio_read.py python3 meshio_read.py echo Running pygmsh_cut.py python3 pygmsh_cut.py echo Running nevergrad_opt.py python3 nevergrad_opt.py echo Running qt_window.py # needs qt5 python3 qt_window1.py echo Running qt_window_split.py # needs qt5 python qt_window2.py echo Running qt_tabs.py # needs qt5 python3 qt_tabs.py echo Running remesh_meshfix.py python3 remesh_meshfix.py echo Running spherical_harmonics1.py python3 spherical_harmonics1.py echo Running export_numpy.py python3 export_numpy.py vedo-2023.4.6/examples/other/spherical_harmonics1.py000066400000000000000000000060571444463326400223360ustar00rootroot00000000000000"""Expand and reconstruct any surface (here a simple box) into spherical harmonics""" # Expand an arbitrary closed shape in spherical harmonics # using SHTOOLS (https://shtools.oca.eu/shtools/) # and then truncate the expansion to a specific lmax and # reconstruct the projected points in red import numpy as np from scipy.interpolate import griddata import pyshtools from vedo import spher2cart, mag, Box, Point, Points, show ########################################################################### lmax = 8 # maximum degree of the spherical harm. expansion N = 50 # number of grid intervals on the unit sphere rmax = 500 # line length x0 = [250, 250, 250] # set SPH sphere at this position ########################################################################### x0 = np.array(x0) surface = Box(pos=x0+[10,20,30], size=(300,150,100)).color('grey').alpha(0.2) ############################################################ # cast rays from the sphere center and find intersections agrid, pts = [], [] for th in np.linspace(0, np.pi, N, endpoint=True): longs = [] for ph in np.linspace(0, 2*np.pi, N, endpoint=False): p = spher2cart(rmax, th, ph) intersections = surface.intersect_with_line(x0, x0+p) if len(intersections): value = mag(intersections[0]-x0) longs.append(value) pts.append(intersections[0]) else: print('No hit for theta, phi =', th, ph, c='r') longs.append(rmax) pts.append(p) agrid.append(longs) agrid = np.array(agrid) hits = Points(pts).cmap('jet', agrid.ravel()).add_scalarbar3d('scalar distance to x_0') show([surface, hits, Point(x0), __doc__], at=0, N=2, axes=1) ############################################################# grid = pyshtools.SHGrid.from_array(agrid) clm = grid.expand() grid_reco = clm.expand(lmax=lmax).to_array() # cut "high frequency" components ############################################################# # interpolate to a finer grid ll = [] for i, long in enumerate(np.linspace(0, 360, num=grid_reco.shape[1], endpoint=False)): for j, lat in enumerate(np.linspace(90, -90, num=grid_reco.shape[0], endpoint=True)): th = np.deg2rad(90 - lat) ph = np.deg2rad(long) p = spher2cart(grid_reco[j][i], th, ph) ll.append((lat, long)) radii = grid_reco.T.ravel() n = 200j lnmin, lnmax = np.array(ll).min(axis=0), np.array(ll).max(axis=0) grid = np.mgrid[lnmax[0]:lnmin[0]:n, lnmin[1]:lnmax[1]:n] grid_x, grid_y = grid grid_reco_finer = griddata(ll, radii, (grid_x, grid_y), method='cubic') pts2 = [] for i, long in enumerate(np.linspace(0, 360, num=grid_reco_finer.shape[1], endpoint=False)): for j, lat in enumerate(np.linspace(90, -90, num=grid_reco_finer.shape[0], endpoint=True)): th = np.deg2rad(90 - lat) ph = np.deg2rad(long) p = spher2cart(grid_reco_finer[j][i], th, ph) pts2.append(p+x0) show(f'Spherical harmonics expansion of order {lmax}', Points(pts2, c="r", alpha=0.5), surface, at=1, ).interactive().close() vedo-2023.4.6/examples/other/tensor_grid1.py000066400000000000000000000003311444463326400206250ustar00rootroot00000000000000from vedo import Grid, Tensors, show domain = Grid(res=[5,5], c='gray') # Generate random attributes on this mesh domain.generate_random_data() ts = Tensors(domain, scale=0.1) ts.print() show(domain, ts).close() vedo-2023.4.6/examples/other/tensor_grid2.py000066400000000000000000000112411444463326400206300ustar00rootroot00000000000000"""Cauchy-Green and Green-Lagrange strain tensors on a 2D grid.""" import numpy as np import vedo # Define a simple deformation function def deform(x, y): xd = np.array([x + 0.25 * x * x, y + 0.25 * x * y]) # Add rotation to the deformation. # note that the rotation is applied to the deformed configuration # and it has no effect on the deformation gradient tensor C and E rotation_angle_degrees = 10 rotation_angle_radians = np.radians(rotation_angle_degrees) cos_angle = np.cos(rotation_angle_radians) sin_angle = np.sin(rotation_angle_radians) x_def, y_def = xd x_rot = x_def * cos_angle - y_def * sin_angle y_rot = x_def * sin_angle + y_def * cos_angle return np.array([x_rot, y_rot]) # Compute the deformation gradient tensor F def deformation_gradient(x, y, ds=0.001): # Compute the deformation gradient tensor F # F = (df/dx, df/dy) fxy = deform(x, y) fxy_x = deform(x + ds, y) fxy_y = deform(x, y + ds) F = np.zeros((2, 2)) F[0, 0] = (fxy_x[0] - fxy[0]) / ds F[0, 1] = (fxy_y[0] - fxy[0]) / ds F[1, 0] = (fxy_x[1] - fxy[1]) / ds F[1, 1] = (fxy_y[1] - fxy[1]) / ds return F # Compute the right Cauchy-Green deformation tensor C def cauchy_green(F): return F.T @ F # Right Cauchy-Green tensor (C) is used to define the Green-Lagrange # strain tensor (E), which is a measure of deformation in the reference # (undeformed) configuration: def green_lagrange(C): return 0.5 * (C - np.eye(2)) # Left Cauchy-Green tensor (B) is used to define the Almansi strain tensor (e), # which is a measure of deformation in the current (deformed) configuration: # e = 0.5 * (I - B^-1) (this is less used in practice) def almansi(F): B = F @ F.T return 0.5 * (np.eye(2) - np.linalg.inv(B)) # Compute the principal stretches and directions def principal_stretches_directions(T): # T is a symmetric tensor # eigenvalues are sorted in ascending order eigenvalues, eigenvectors = np.linalg.eigh(T) principal_stretches = np.sqrt(np.abs(eigenvalues))*np.sign(eigenvalues) return principal_stretches, eigenvectors ###################################################################### # Define the original grid (undeformed configuration) x, y = np.meshgrid(np.linspace(-1, 1, 8), np.linspace(-1, 1, 8)) grid = vedo.Grid(s=(x[0], y.T[0])) grid_pts = grid.points() grid_pts_defo = deform(grid_pts[:, 0], grid_pts[:, 1]) grid_defo = grid.clone().points(grid_pts_defo.T) # Initialize the vedo plotter plotter = vedo.Plotter() for i in range(x.shape[0]): for j in range(y.shape[1]): pt = x[i, j], y[i, j] displaced_pt = deform(*pt) F = deformation_gradient(*pt) C = cauchy_green(F) stretches, directions = principal_stretches_directions(C) ellipsoid_axes = np.diag(stretches) @ directions.T / 8 ellipsoid_C = vedo.Ellipsoid( axis1=ellipsoid_axes[0], axis2=ellipsoid_axes[1], axis3=[0, 0, 0.01], pos=(*pt, 0), c="blue5", ).lighting("off") E = green_lagrange(C) # E = almansi(F) stretches, directions = principal_stretches_directions(E) ellipsoid_axes = np.diag(stretches) @ directions.T / 8 ellipsoid_E = vedo.Ellipsoid( axis1=ellipsoid_axes[0], axis2=ellipsoid_axes[1], axis3=[0, 0, 0.01], pos=(*pt, 0), c="purple5", ).z(0.01).lighting("off") if stretches[0] < 0 or stretches[1] < 0: ellipsoid_E.c("red4") # Plot the deformation gradient tensor, we cannot compute the # principal stretches and directions of the deformation gradient # tensor because it is not a symmetric tensor. # F = deformation_gradient(*pt) # circle = vedo.Circle(r=0.05, c="black").pos(*pt) # cpts = circle.points() # cpts_defo = F @ cpts.T[:2] # circle.points(cpts_defo.T) # Same as: circle = vedo.Circle(r=0.06, c="black").pos(*pt) cpts = circle.points() cpts_defo = deform(cpts[:,0], cpts[:,1]) circle.points(cpts_defo.T) plotter += [ellipsoid_C, ellipsoid_E, circle] pts = np.array([x, y]).T.reshape(-1, 2) defo_pts = deform(x, y).T.reshape(-1, 2) plotter += vedo.Arrows2D(pts, defo_pts, s=0.2, c="blue5") plotter += grid_defo plotter += __doc__ plotter.show(axes=8, zoom=1.2) ##################################################################### # Resources: # https://en.wikipedia.org/wiki/Deformation_gradient # https://en.wikipedia.org/wiki/Almansi_strain_tensor # https://en.wikipedia.org/wiki/Principal_stretch # https://www.continuummechanics.org/deformationstrainintro.htmlvedo-2023.4.6/examples/other/trame_ex1.py000066400000000000000000000014021444463326400201120ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # See more examples at: # https://github.com/Kitware/trame-tutorial from trame.app import get_server from trame.ui.vuetify import SinglePageLayout from trame.widgets import vtk, vuetify import vedo cone = vedo.Cone() plt = vedo.Plotter() plt += cone # ----------------------------------------------------------------------------- # Trame # ----------------------------------------------------------------------------- server = get_server() with SinglePageLayout(server) as layout: layout.title.set_text("Hello trame") with layout.content: with vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): plt.reset_camera() view = vtk.VtkLocalView(plt.window) server.start() vedo-2023.4.6/examples/other/trame_ex2.py000066400000000000000000000015561444463326400201250ustar00rootroot00000000000000#!/usr/bin/env python # from trame.app import get_server from trame.ui.vuetify import SinglePageLayout from trame.widgets import vtk, vuetify from vedo import Volume, Axes, Plotter, dataurl vol = Volume(dataurl+"embryo.slc") plt = Plotter(bg='Wheat') plt += [vol, Axes(vol)] plt += vol.isosurface().shift(300,0,0) # ------------------------------------------------------------ # Web Application setup # ------------------------------------------------------------ server = get_server() ctrl = server.controller with SinglePageLayout(server) as layout: layout.title.set_text("Hello trame") with layout.content: with vuetify.VContainer( fluid=True, classes="pa-0 fill-height", ): plt.reset_camera() view = vtk.VtkRemoteView(plt.window) # view = vtk.VtkLocalView(plt.window) server.start() vedo-2023.4.6/examples/other/trame_ex3.py000066400000000000000000000043551444463326400201260ustar00rootroot00000000000000from trame.app import get_server from trame.ui.vuetify import SinglePageLayout from trame.widgets import vtk, vuetify import vedo cone = vedo.Cone() plt = vedo.Plotter() plt += [cone, vedo.Axes(cone).unpack(transformed=True)] # ----------------------------------------------------------------------------- # Trame setup # ----------------------------------------------------------------------------- server = get_server() state, ctrl = server.state, server.controller # ----------------------------------------------------------------------------- # Functions # ----------------------------------------------------------------------------- @state.change("resolution") def update_resolution(resolution, **kwargs): cone.color(resolution) ctrl.view_update() def reset_resolution(): cone.color("red5") ctrl.view_update() # ----------------------------------------------------------------------------- # GUI # ----------------------------------------------------------------------------- with SinglePageLayout(server) as layout: layout.title.set_text("Use slider to change color") with layout.content: with vuetify.VContainer( fluid=True, classes="pa-0 fill-height", ): plt.reset_camera() view = vtk.VtkLocalView(plt.window) ctrl.view_update = view.update ctrl.view_reset_camera = view.reset_camera with layout.toolbar: vuetify.VSpacer() vuetify.VSlider( v_model=("resolution", "blue5"), min=3, max=60, step=1, hide_details=True, dense=True, style="max-width: 300px", ) with vuetify.VBtn(icon=True, click=reset_resolution): vuetify.VIcon("mdi-restore") vuetify.VDivider(vertical=True, classes="mx-2") vuetify.VSwitch( v_model="$vuetify.theme.dark", hide_details=True, dense=True, ) with vuetify.VBtn(icon=True, click=ctrl.view_reset_camera): vuetify.VIcon("mdi-crop-free") # ----------------------------------------------------------------------------- # Main # ----------------------------------------------------------------------------- server.start() vedo-2023.4.6/examples/other/trimesh/000077500000000000000000000000001444463326400173315ustar00rootroot00000000000000vedo-2023.4.6/examples/other/trimesh/README.md000066400000000000000000000034501444463326400206120ustar00rootroot00000000000000# _Trimesh_ In this directory you will find a bunch of examples of interoperability with the [trimesh](https://trimsh.org) package. (Still a bit experimental, especially when running from a jupyter notebook. Use in this case _embedWindow(False)_). To run the examples: ```bash git clone https://github.com/marcomusy/vedo.git cd vedo/vedo/examples/other/trimesh python example.py ``` (_click thumbnail image to get to the python script_) | | | |:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:-----| | [![trim_section](https://user-images.githubusercontent.com/32848391/60594020-55220100-9da4-11e9-8d7f-281965616795.png)](https://github.com/marcomusy/vedo/blob/master/vedo/examples/other/trimesh/section.py)
`section.py` | Find a bunch of parallel cross sections to a mesh. | | | | | [![trim_ray](https://user-images.githubusercontent.com/32848391/60594021-55220100-9da4-11e9-87be-f2004f1060df.png)](https://github.com/marcomusy/vedo/blob/master/vedo/examples/other/trimesh/ray.py)
`ray.py` | Find hits of a ray to mesh. | | | | | [![trim_nearest](https://user-images.githubusercontent.com/32848391/60594022-55220100-9da4-11e9-82ba-19f38af63d35.png)](https://github.com/marcomusy/vedo/blob/master/vedo/examples/other/trimesh/nearest.py)
`nearest.py` | Find the closest points on a mesh to a set of random point. | | | | | [![trim_shortest](https://user-images.githubusercontent.com/32848391/60594023-55220100-9da4-11e9-87b4-73ea7f8b04f7.png)](https://github.com/marcomusy/vedo/blob/master/vedo/examples/other/trimesh/shortest.py)
`shortest.py` | Shortest path query using length for edge weight. | vedo-2023.4.6/examples/other/trimesh/__init__.py000066400000000000000000000000051444463326400214350ustar00rootroot00000000000000# # vedo-2023.4.6/examples/other/trimesh/nearest.py000066400000000000000000000022511444463326400213440ustar00rootroot00000000000000"""Find the closest point on the mesh to each random point """ import numpy as np from vedo import show, Arrows, download import trimesh plyfile = download('https://github.com/mikedh/trimesh/blob/main/models/cycloidal.ply') mesh = trimesh.load(plyfile) points = mesh.bounding_box_oriented.sample_volume(count=30) # find the closest point on the mesh to each random point closest_points, distances, triangle_id = mesh.nearest.on_surface(points) #print('Distance from point to surface of mesh:\n{}'.format(distances)) # create a PointCloud object out of each (n,3) list of points cloud_original = trimesh.points.PointCloud(points) cloud_close = trimesh.points.PointCloud(closest_points) # create a unique color for each point cloud_colors = np.array([trimesh.visual.random_color() for i in points]) # set the colors on the random point and its nearest point to be the same cloud_original.vertices_color = cloud_colors cloud_close.vertices_color = cloud_colors arrs = Arrows(cloud_original.vertices, cloud_close.vertices, c='w') ## create a scene containing the mesh and two sets of points show(mesh, cloud_original, cloud_close, arrs, __doc__, bg='bb', axes=1, viewup='z').close() vedo-2023.4.6/examples/other/trimesh/ray.py000066400000000000000000000022141444463326400204750ustar00rootroot00000000000000import trimesh import numpy as np from vedo import show, settings settings.use_depth_peeling = True # test on a sphere mesh mesh = trimesh.creation.icosphere() # create some rays ray_origins = np.array([[0, 0, -3], [1, 2, -3]]) ray_directions = np.array([[0, 0, 1], [0, -1, 1]]) # run the mesh-ray query locations, index_ray, index_tri = mesh.ray.intersects_location( ray_origins=ray_origins, ray_directions=ray_directions ) locs = trimesh.points.PointCloud(locations) # stack rays into line segments for visualization as Path3D ray_visualize = trimesh.load_path( np.hstack((ray_origins, ray_origins + ray_directions)).reshape(-1, 2, 3) ) print("The rays hit the mesh at coordinates:\n", locations) print(f"The rays with index: {index_ray} hit triangles stored at mesh.faces[{index_tri}]") # stack rays into line segments for visualization as Path3D ray_visualize = trimesh.load_path( np.hstack((ray_origins, ray_origins + ray_directions * 5.0)).reshape(-1, 2, 3) ) # make mesh white-ish mesh.visual.face_colors = [200, 200, 250, 100] mesh.visual.face_colors[index_tri] = [255, 0, 0, 255] show(mesh, ray_visualize, locs, axes=1).close() vedo-2023.4.6/examples/other/trimesh/run_all.sh000077500000000000000000000003761444463326400213320ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo Running examples in directory other/trimesh/ echo Running nearest.py python3 nearest.py echo Running ray.py python3 ray.py echo Running section.py python3 section.py echo Running shortest.py python3 shortest.py vedo-2023.4.6/examples/other/trimesh/section.py000066400000000000000000000031341444463326400213500ustar00rootroot00000000000000import numpy as np from vedo import show, Plane, printc, download, settings import trimesh settings.immediate_rendering = False # load the mesh from filename, file objects are also supported f = download('https://github.com/mikedh/trimesh/raw/main/models/featuretype.STL') mesh = trimesh.load_mesh(f) # get a single cross section of the mesh txt = 'cross section of the mesh' mslice = mesh.section(plane_origin=mesh.centroid, plane_normal=[0,0,1]) pl = Plane(mesh.centroid, normal=[0,0,1], s=[6,4], c='green', alpha=0.3) slice_2D, to_3D = mslice.to_planar() # show objects on N=2 non-synced renderers: show([(mesh, pl), (slice_2D, txt)], N=2, sharecam=False, axes=7).close() # if we wanted to take a bunch of parallel slices, like for a 3D printer # we can do that easily with the section_multiplane method # we're going to slice the mesh into evenly spaced chunks along z # this takes the (2,3) bounding box and slices it into [minz, maxz] z_extents = mesh.bounds[:,2] # slice every .125 model units (eg, inches) z_levels = np.arange(*z_extents, step=0.125) # find a bunch of parallel cross sections sections = mesh.section_multiplane(plane_origin=mesh.bounds[0], plane_normal=[0,0,1], heights=z_levels) N = len(sections) printc("nr. of sections:", N, c='green') # summing the array of Path2D objects will put all of the curves # into one Path2D object, which we can plot easily combined = np.sum(sections) sections.append([combined, 'combined']) # show objects in N synced renderers: show(sections, N=N, axes=1, new=True).interactive().close() vedo-2023.4.6/examples/other/trimesh/shortest.py000066400000000000000000000022511444463326400215560ustar00rootroot00000000000000from vedo import show import trimesh import networkx as nx # test on a sphere mesh mesh = trimesh.primitives.Sphere() # edges without duplication edges = mesh.edges_unique # the actual length of each unique edge length = mesh.edges_unique_length # create the graph with edge attributes for length g = nx.Graph() for edge, L in zip(edges, length): g.add_edge(*edge, length=L) # alternative method for weighted graph creation ga = nx.from_edgelist([(e[0], e[1], {"length": L}) for e, L in zip(edges, length)]) # arbitrary indices of mesh.vertices to test with start = 0 end = int(len(mesh.vertices) / 2.0) # run the shortest path query using length for edge weight path = nx.shortest_path(g, source=start, target=end, weight="length") ################################### VISUALIZE RESULT # make the sphere transparent-ish mesh.visual.face_colors = [150, 150, 180, 255] # Path3D with the path between the points path_visual = trimesh.load_path(mesh.vertices[path]) # visualizable two points points_visual = trimesh.points.PointCloud(mesh.vertices[[start, end]]) txt = 'Shortest path query\nusing length for edge weight' show(mesh, points_visual, path_visual, txt, axes=6).close() vedo-2023.4.6/examples/other/vpolyscope.py000066400000000000000000000012601444463326400204320ustar00rootroot00000000000000#!/usr/bin/env python3 # Visualization example with polyscope (pip install polyscope) # https://polyscope.run/py/ import vedo import polyscope m = vedo.load(vedo.dataurl + "embryo.tif").isosurface().extract_largest_region() # m = vedo.load(vedo.dataurl+'man.vtk') polyscope.set_program_name("vedo using polyscope") polyscope.set_verbosity(0) polyscope.set_up_dir("z_up") polyscope.init() ps_mesh = polyscope.register_surface_mesh( "My vedo mesh", m.points(), m.faces(), color=[0.5, 0, 0], smooth_shade=True ) ps_mesh.add_scalar_quantity("heights", m.points()[:, 2], defined_on="vertices") ps_mesh.set_material("wax") # wax, mud, jade, candy polyscope.show() vedo.show(m, axes=11) vedo-2023.4.6/examples/other/wx_window1.py000066400000000000000000000031121444463326400203330ustar00rootroot00000000000000import wx from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor import vedo ##################################################### # Every wx app needs an app app = wx.App(False) # create the top-level frame, sizer and wxVTKRWI frame = wx.Frame(None, -1, "vedo with wxpython", size=(600,600)) widget = wxVTKRenderWindowInteractor(frame, -1) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(widget, 1, wx.EXPAND) frame.SetSizer(sizer) frame.Layout() # It would be more correct (API-wise) to call widget.Initialize() and # widget.Start() here, but Initialize() calls RenderWindow.Render(). # That Render() call will get through before we can setup the # RenderWindow() to render via the wxWidgets-created context; this # causes flashing on some platforms and downright breaks things on # other platforms. Instead, we call widget.Enable(). widget.Enable(1) widget.AddObserver("ExitEvent", lambda o,e,f=frame: f.Close()) ##################################################### vedo example def func(evt): print("Event dump:\n", evt) plt.azimuth(10) # rotate by one degree the camera cone = vedo.shapes.Cone(c='green8') axes = vedo.Axes(cone, c='white') cube = vedo.shapes.Cube() # Create 2 subwindows with a cone and a cube plt = vedo.Plotter(N=2, bg='blue2', bg2='blue8', wx_widget=widget) plt.add_callback("right mouse click", func) plt.at(0).add([cone, axes, "right-click anywhere"]).reset_camera() plt.at(1).add(cube).reset_camera() # plt.show() # vedo.show() is now disabled in wx ##################################################### # Show everything frame.Show() app.MainLoop() vedo-2023.4.6/examples/other/wx_window2.py000066400000000000000000000032761444463326400203470ustar00rootroot00000000000000import wx import vedo from vtk.wx.wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor ##################################################### wx app app = wx.App(False) frame = wx.Frame(None, -1, "vedo with wxpython", size=(800,800)) widget = wxVTKRenderWindowInteractor(frame, -1) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(widget, 1, wx.EXPAND) frame.SetSizer(sizer) frame.Layout() widget.Enable(1) widget.AddObserver("ExitEvent", lambda o,e,f=frame: f.Close()) ##################################################### vedo def func(event): mesh = event.actor if not mesh: return ptid = mesh.closest_point(event.picked3d, return_point_id=True) txt = f"Probed point:\n{vedo.utils.precision(event.picked3d, 3)}\n" \ f"value = {vedo.utils.precision(arr[ptid], 2)}" vpt = vedo.shapes.Sphere(mesh.points(ptid), r=0.01, c='orange2').pickable(False) vig = vpt.flagpole(txt, s=.05, offset=(0.5,0.5), font="VictorMono").follow_camera() msg.text(txt) # update the 2d text message plt.remove(plt.actors[-2:]).add([vpt, vig]) # remove last 2 objects, add the new ones widget.Render() # need to manually call Render msg = vedo.Text2D(pos='bottom-left', font="VictorMono") msh = vedo.shapes.ParametricShape("RandomHills").cmap('terrain') axs = vedo.Axes(msh) arr = msh.pointdata["Scalars"] plt = vedo.Plotter(bg='moccasin', bg2='blue9', wx_widget=widget) plt.add([msh, axs, msg]).reset_camera() plt.actors += [None,None,None] # place holder for sphere, flagpole, text2d plt.add_callback('MouseMove', func) ##################################################### # Show everything frame.Show() app.MainLoop() vedo-2023.4.6/examples/pyplot/000077500000000000000000000000001444463326400160645ustar00rootroot00000000000000vedo-2023.4.6/examples/pyplot/__init__.py000066400000000000000000000000031444463326400201660ustar00rootroot00000000000000# #vedo-2023.4.6/examples/pyplot/anim_lines.py000066400000000000000000000051741444463326400205630ustar00rootroot00000000000000"""Animated plot showing multiple temporal data lines""" # Copyright (c) 2021, Nicolas P. Rougier. License: BSD 2-Clause* # Adapted for vedo by M. Musy, February 2021 import numpy as np from vedo import settings, Line, show settings.default_font = "Theemim" # Generate random data np.random.seed(1) data = np.random.uniform(0, 1, (25, 100)) X = np.linspace(-1, 1, data.shape[-1]) G = 0.15 * np.exp(-4 * X**2) # use a gaussian as a weight # Generate line plots lines = [] for i, d in enumerate(data): pts = np.c_[X, np.zeros_like(X)+i/10, G*d] lines.append(Line(pts, lw=3)) # Set up the first frame axes = dict(xtitle=':Deltat /:mus', ytitle="source", ztitle="") plt = show(lines, __doc__, axes=axes, elevation=-30, interactive=False, bg='k8') for i in range(50): data[:, 1:] = data[:, :-1] # Shift data to the right data[:, 0] = np.random.uniform(0, 1, len(data)) # Fill-in new values for line, d in zip(lines, data): # Update data newpts = line.points() newpts[:,2] = G * d line.points(newpts).cmap('gist_heat_r', newpts[:,2]) plt.render() plt.interactive().close() ############################################################################# # *BSD 2-Clause License # # Copyright (c) 2021, Nicolas P. Rougier # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 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 HOLDER 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. # # Original version at: https://github.com/rougier/unknown-pleasures vedo-2023.4.6/examples/pyplot/caption.py000066400000000000000000000012271444463326400200750ustar00rootroot00000000000000"""Attach a 2D caption to an object""" from vedo import Cone, Axes, show cone = Cone().rotate_x(30).rotate_z(20).c('steelblue') txt = "Japanese\nこれは青い円錐形です\n" txt += "Chinese\n這是一個藍錐\n" txt += "Russian\nЭто синий конус\n" txt += "English\nThis is a blue cone" cone.caption(txt, size=(0.4,0.3), font="LogoType", c='lb') axes = Axes( cone, xtitle='マイクロメートル単位のx軸', ytitle='y軸にも長い説明があります', ztitle='Z軸始終來自中國', title_font='LogoType', text_scale=1.5, c='white', ) show(cone, axes, __doc__, viewup='z', bg='k', bg2='bb').close() vedo-2023.4.6/examples/pyplot/custom_axes1.py000066400000000000000000000040131444463326400210470ustar00rootroot00000000000000"""Customizing axes style (40+ control parameters!) Title font: """ from vedo import Box, Lines, Points, Spline, show, settings settings.default_font = 'Theemim' # an invisible box: world = Box(pos=(2.7,0,0), size=(12,10,8), alpha=0) # a dummy spline with its shadow on the xy plane pts = Points([(-2,-3.2,-1.5), (3,-1.2,-2), (7,3,4)], r=12) spl = Spline(pts, res=50).add_shadow(plane='z', point=-4) # make spline and add its shadow at z=-4 lns = Lines(spl, spl.shadows[0]) # join spline points with its own shadow # make a dictionary of axes options axes_opts = dict( xtitle='My variable :Omega^:lowerxi_lm in units of :mum^3', # latex-style syntax ytitle='This is my highly\ncustomized y-axis', ztitle='z in units of Å', # many unicode chars are supported (type: vedo -r fonts) y_values_and_labels=[(-3.2,'Mark^a_-3.2'), (-1.2,'Carmen^b_-1.2'), (3,'John^c_3')], text_scale=1.3, # make all text 30% bigger number_of_divisions=5, # approximate number of divisions on longest axis axes_linewidth= 2, grid_linewidth= 1, zxgrid2=True, # show zx plane on opposite side of the bounding box yzgrid2=True, # show yz plane on opposite side of the bounding box xyplane_color='green7', xygrid_color='dg', # darkgreen line color xyalpha=0.2, # grid opacity xtitle_position=0.5, # title fractional positions along axis xtitle_justify="top-center", # align title wrt to its axis ytitle_size=0.02, ytitle_box=True, ytitle_offset=0.05, ylabel_offset=0.4, yhighlight_zero=True, # draw a line highlighting zero position if in range yhighlight_zero_color='red', zline_color='blue', ztitle_color='blue', ztitle_backface_color='v', # violet color of axis title backface label_font="Quikhand", ylabel_size=0.025, # size of the numeric labels along Y axis ylabel_color='dg', # color of the numeric labels along Y axis ) show(world, pts, spl, lns, __doc__+settings.default_font, axes=axes_opts).close() vedo-2023.4.6/examples/pyplot/custom_axes2.py000066400000000000000000000017331444463326400210560ustar00rootroot00000000000000from vedo import Points, Axes, show import numpy as np pts = np.random.randn(2000,3)*[3,2,4]-[1,2,3] vpts1 = Points(pts).alpha(0.2).c('blue2') vpts2 = vpts1.clone().shift(5,6,7).c('green2') axs = Axes( [vpts1, vpts2], # build axes for this set of objects xtitle="X-axis in :mum", ytitle="Variable Y in :mum", ztitle="_inverted Z in :mum", htitle='My :Gamma^2_ijk plot', htitle_font='Kanopus', htitle_justify='bottom-right', htitle_color='red2', htitle_size=0.035, htitle_offset=(0,0.075,0), htitle_rotation=45, zhighlight_zero=True, xyframe_line=2, yzframe_line=1, zxframe_line=1, xyframe_color='red3', xyshift=1.05, # move xy 5% above the top of z-range yzgrid=True, zxgrid=True, zxshift=1.0, xtitle_justify='bottom-right', xtitle_offset=-1.175, xlabel_offset=-1.75, ylabel_rotation=90, z_inverted=True, tip_size=0.25, ) show(vpts1, vpts2, axs, "Customizing Axes", viewup='z').close() vedo-2023.4.6/examples/pyplot/custom_axes3.py000066400000000000000000000014131444463326400210520ustar00rootroot00000000000000"""Customizing Axes. Cartesian planes can be displaced from their lower-range default position""" from vedo import Sphere, Axes, precision, show sph = Sphere().scale([4, 3, 2]).shift(5, 6, 7).c("green2", 0.1).wireframe() axs = Axes( sph, # build axes for object sph xtitle="x axis", ytitle="y axis", ztitle="z axis", htitle="An ellipsoid at " + precision(sph.center_of_mass(), 2), htitle_font=1, htitle_color="red3", zxgrid=True, xyframe_line=2, yzframe_line=2, zxframe_line=2, xyframe_color="red3", yzframe_color="green3", zxframe_color="blue3", xyshift=0.2, # move xy plane 20% along z yzshift=0.2, # move yz plane 20% along x zxshift=0.2, # move zx plane 20% along y ) show(sph, axs, __doc__).close() vedo-2023.4.6/examples/pyplot/custom_axes4.py000066400000000000000000000020661444463326400210600ustar00rootroot00000000000000"""Create individual axes to each separate object in a scene. Access any element to change its size and color""" from vedo import * settings.use_depth_peeling = True # Create a bunch of objects s1 = Sphere(pos=(10, 0, 0), r=1, c='r') s2 = Sphere(pos=( 0,10, 0), r=2, c='g') s3 = Sphere(pos=( 0, 0,10), r=3, c='b') pt = Point([-4,-4,-4], c='k') # Build individual axes for each object. # A new Assembly object is returned: axes1 = Axes(s1, c='r') axes2 = Axes(s2, c='g') axes3 = Axes(s3, c='b', number_of_divisions=10) # axes3 is an Assembly (group of Meshes). # Unpack it and scale the 7th label getting it by its name, # make it 5 times bigger big and fuchsia: axes3.unpack('xNumericLabel7').scale(5).c('fuchsia') # Print all element names in axes3: #for m in axes3.get_meshes(): print(m.name) # By specifiyng axes in show(), new axes are # created which span the whole bounding box. # Options are passed through a dictionary show(pt, s1, s2, s3, axes1, axes2, axes3, __doc__, viewup='z', axes=dict(c='black', number_of_divisions=10, yzgrid=False), ).close() vedo-2023.4.6/examples/pyplot/donut.py000066400000000000000000000004301444463326400175640ustar00rootroot00000000000000from vedo.pyplot import donut title = "A donut plot" fractions = [0.1, 0.2, 0.3, 0.1, 0.3] colors = [ 1, 2, 3, 4, 'white'] labels = ["stuff_1 ", "stuff_2 ", "comp^A ", "comp^B ", ""] dn = donut(fractions, c=colors, labels=labels, title=title) dn.show().close() vedo-2023.4.6/examples/pyplot/earthquake_browser.py000066400000000000000000000041671444463326400223430ustar00rootroot00000000000000"""Earthquakes of magnitude 2.5+ in the past 30 days areas are proportional to energy release [hover mouse to get more info]""" import pandas from vedo import * num = 50 # nr of earthquakes to be visualized to define a time window path = download("https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv") usecols = ['time','place','latitude','longitude','depth','mag'] data = pandas.read_csv(path, usecols=usecols)[usecols][::-1].reset_index(drop=True) # reverse list pic = Picture(dataurl + "images/eo_base_2020_clean_3600x1800.png") pic.pickable(False).level(185).window(120) # add some contrast to the original image scale = [pic.shape[0]/2, pic.shape[1]/2, 1] comment = Text2D(__doc__, bg='green9', alpha=0.7, font='Ubuntu') centers = [] for i, d in progressbar(data.iterrows()): M = d['mag'] # earthquake estimated magnitude E = np.sqrt(np.exp(5.24+1.44*M) * scale[0])/10000 # empirical formula for sqrt(energy_release(M)) rgb = color_map(E, name='Reds', vmin=0, vmax=7) # map energy to color lat = np.deg2rad(d['latitude']) lon = np.deg2rad(d['longitude']) ce = GeoCircle(lat, lon, E/50).scale(scale).z(num/M) ce.c(rgb).alpha(0.75).use_bounds(False) ce.time = i ce.info = '\n'.join(str(d).split('\n')[:-1]) # remove of the last line in string d if i < len(data) - num: ce.off() # switch off older ones: make circles invisible centers.append(ce) def sliderfunc(widget, event): val = widget.value # get the slider current value widget.title = f"{data['time'][int(val)][:10]}" for ce in centers: isinside = abs(val-ce.time) < num # switch on if inside of time window ce.on() if isinside else ce.off() plt = Plotter(size=(2200,1100), title="Earthquake Browser").parallel_projection() plt.add_slider(sliderfunc, 0, len(centers)-1, value=len(centers)-1, show_value=False, title="today") plt.add_hover_legend(use_info=True, alpha=1, c='white', bg='red2', s=1) plt.show(pic, centers, comment, zoom="tightest", mode='image').close() vedo-2023.4.6/examples/pyplot/embed_matplotlib.py000066400000000000000000000010611444463326400217370ustar00rootroot00000000000000"""Include background images in the rendering scene (e.g. generated by matplotlib)""" import matplotlib.pyplot as plt from vedo import dataurl, show, Mesh, Picture2D msh = Mesh(dataurl+"limb_ugrid.vtk").shrink(0.8) # Create a histogram with matplotlib fig = plt.figure() plt.hist(msh.celldata["chem_0"], log=True) plt.title(r'$\mathrm{Matplotlib\ Histogram\ of\ log(chem_0)}$') pic1 = Picture2D(fig, scale=0.5, pos="bottom-right").ontop() pic2 = Picture2D(dataurl+"images/embryo.jpg", pos='top-right') show(msh, pic1, pic2, __doc__, bg='lightgrey', axes=1) vedo-2023.4.6/examples/pyplot/explore5d.py000066400000000000000000000035501444463326400203500ustar00rootroot00000000000000"""Read a data from ascii file and make a simple analysis visualizing 3 of the 5 dimensions of the dataset""" import numpy as np from vedo import download, Points, Axes, show from vedo.pyplot import histogram ################################### Read the csv data: delimiter=',' fpath = download('https://vedo.embl.es/examples/data/genes.csv') with open(fpath, "r") as f: lines = f.readlines() data = [] for i,lns in enumerate(lines): if i==0: names = lns.split(delimiter) # read header continue ln = lns.split(delimiter) vals = [float(x) for x in ln] data.append(vals) data = np.array(data) print("Print first 5 rows:\n", names) print(data[:5]) print("Number of rows:", len(data)) ################################################## # extract the columns into separate vectors: g0, g1, g2, g3, g4 = data.T # unpack genes n0, n1, n2, n3, n4 = names # now create and show histograms of the gene expressions h0 = histogram(g0, xtitle=n0, c=0) h1 = histogram(g1, xtitle=n1, c=1) h2 = histogram(g2, xtitle=n2, c=2) h3 = histogram(g3, xtitle=n3, c=3, logscale=True) h4 = histogram(g4, xtitle=n4, c=4) # this is where you choose what variables to show as 3D points pts = np.c_[g4,g2,g3] # form an array of 3d points from the columns pts_1 = pts[g0>0] # select only points that have g0>0 p1 = Points(pts_1, r=4, c='red5') # create the vedo object print("after selection nr. of points is", len(pts_1)) pts_2 = pts[(g0<0) & (g1>.5)] # select excluded points that have g1>0.5 p2 = Points(pts_2, r=8, c='green') # create the vedo object axes = Axes(p1+p2, xtitle='gene4', ytitle='gene2', ztitle='gene3', c='k') # Show the two clouds superposed on a new plotter window: show([h0, h1, h2, h3, h4, (p1,p2, axes, __doc__)], shape="1/5", # 1 spaces above and 5 below sharecam=0, axes=0, zoom=1.4, interactive=True).close() vedo-2023.4.6/examples/pyplot/fill_gap.py000066400000000000000000000014731444463326400202200ustar00rootroot00000000000000"""Interpolate gap between two functions""" # https://www.youtube.com/watch?v=vD5g8aVscUI import numpy as np from vedo.pyplot import plot from vedo import settings settings.remember_last_figure_format = True # useful for pf += plot(...) x1 = np.linspace(-2,2, num=100) x = np.linspace(-2,2, num=100) x2 = np.linspace(-2,2, num=100) fx = np.sin(x1*3) - 1 gx = x2*x2/3 -1 def phi(x): psi = np.exp(-1/x) psi_1 = np.exp(-1/(1-x)) phi = psi / (psi + psi_1) phi = np.where(x<=0, 0, phi) phi = np.where(x>1, 1, phi) return phi w = phi(x) h = (1-w) * fx + w * gx pf = plot(x1[:50], fx[:50], xlim=[-2,2], ylim=[-2,1.5], lw=5, title=__doc__) pf += plot(x[50:75], h[50:75], c='red5') pf += plot(x2[75:], gx[75:], lw=5) pf += plot(x[50:75], w[50:75], c='green4', lw=1) pf.show(mode='image', zoom='tight') vedo-2023.4.6/examples/pyplot/fit_circle.py000066400000000000000000000015201444463326400205370ustar00rootroot00000000000000"""Fit circles analytically to measure the signed curvature of a line""" from vedo import * shape = Spline([[1.0, 2.0, -1.0], [1.5, 0.0, 0.4], [2.0, 4.0, 0.5], [4.0, 1.5, -0.3]], res=200) n = 5 # nr. of points to use for the fit npt = shape.npoints points = shape.points() fitpts, circles, curvs = [], [], [0]*npt for i in range(n, npt - n-1): pts = points[i-n:i+n] center, R, normal = fit_circle(pts) z = cross(pts[-1]-pts[0], center-pts[0])[2] curvs[i] = sqrt(1/R) * z/abs(z) if R < 0.75: circle = Circle(center, r=R).wireframe().orientation(normal) circles.append(circle) fitpts.append(center) shape.lw(8).cmap('coolwarm', curvs).add_scalarbar3d(title=':pm1/:sqrtR', c='w') show(shape, circles, Points(fitpts), __doc__, axes=1, bg='bb').close() vedo-2023.4.6/examples/pyplot/fit_curve.py000066400000000000000000000016601444463326400204270ustar00rootroot00000000000000"""Fitting a curve to a dataset""" import numpy as np from scipy.optimize import curve_fit from vedo.pyplot import plot from vedo import settings def func(x, h, a, x0, k): return h + a * (x-x0) * np.sin((x-x0)**2 / k) # generate simulated data xdata = np.linspace(3, 10, 80) true_params = [20, 2, 8, 3] ydata_true = func(xdata, *true_params) ydata = np.random.normal(ydata_true, 3, 80) fit_params, pcov = curve_fit(func, xdata, ydata, p0=[19, 3, 8, 2.5]) ydata_fit = func(xdata, *fit_params) print("true params = ", true_params) print("fit params = ", fit_params) settings.default_font = "ComicMono" settings.remember_last_figure_format = True # when adding with p += ... p = plot(xdata, ydata, "o", mc="blue2", title=__doc__, label="Data") p += plot(xdata, ydata_true, "-g", lw=2, label="Ground Truth") p += plot(xdata, ydata_fit, "-r", lw=4, label="Fit") p.add_legend(pos="bottom-right") p.show(size=(900, 650), zoom="tight") vedo-2023.4.6/examples/pyplot/fit_erf.py000066400000000000000000000021461444463326400200570ustar00rootroot00000000000000from scipy import special from scipy.optimize import curve_fit from vedo import np, settings, Marker from vedo.pyplot import plot settings.default_font = 'Calco' settings.remember_last_figure_format = True xdata = [230, 234, 240, 243, 246, 249, 252] ydata = [0, 0, 11, 62, 15, 21, 100] tdata = [100, 31, 34, 80, 21, 21, 100] yerrs = np.sqrt(ydata) /np.array(tdata) + 0.1 ydata = np.array(ydata) /np.array(tdata) def func(x, a, x0): return (1 + special.erf(a*(x-x0))) / 2 p0 = [1/25, 240] # initial guess popt, _ = curve_fit(func, xdata, ydata, p0) x = np.linspace(225, 255, 50) y = func(x, *popt) x0, y0 = popt[1], func(popt[1], *popt) fig = plot( xdata, ydata, 'o', yerrors=yerrs, ylim=(-0.1,1.3), title="ERF(x) fit to data", ytitle='Embryos with visible HL', xtitle='Hind Limb age (h)', mc='blue2', ms=0.3, lwe=2, label='data', ) fig += plot(x, y, lw=5, label='fit') fig += Marker('*', s=0.05, c='r4').pos(x0,y0, 0.1) fig.add_label(':mu', marker='*', mc="r4") fig.add_legend("top-left", vspace=2.5) fig.show(size=(900, 650), zoom='tight').close() vedo-2023.4.6/examples/pyplot/fit_polynomial1.py000066400000000000000000000027051444463326400215500ustar00rootroot00000000000000"""Fit y=ax+b and compute error bands""" from vedo import Text2D, DashedLine, show from vedo.pyplot import plot, fit import numpy as np # np.random.seed(0) # Generate some noisy data points along a line a, b = (np.random.rand(2)-0.5)*10 # choose a and b x = np.linspace(0, 15, 25) y = a*x + b noise = np.random.randn(len(x)) * 5 # create gaussian noise # Plot the points and add the "true" line without noise fig = plot(x, y+noise, '*k', title=__doc__, label='data') fig += DashedLine(x, y, c='red5') # Fit points and evaluate, with a bootstrap and Monte-Carlo technique, # the correct error coeffs and error bands. Return a Line object: pfit = fit( [x, y+noise], deg=1, # degree of the polynomial niter=500, # nr. of MC iterations to compute error bands nstd=2, # nr. of std deviations to display ) fig += [pfit, pfit.error_band, *pfit.error_lines] # add these objects to fig msg = f"Generated a, b : {np.array([a,b])}"\ f"\nFitted a, b : {pfit.coefficients}"\ f"\nerrors on a, b : {pfit.coefficient_errors}"\ f"\nave point spread: :sigma :approx {pfit.data_sigma:.3f} in y units" msg = Text2D(msg, font='VictorMono', pos='bottom-left', c='red3') fig.add_label("y = a:dotx+b", c='k', marker='-', mc='red4') fig.add_label("ground truth", c='k', marker='--', mc='red5') fig.add_label("1:sigma error band", c='k', marker='s', mc='grey') fig.add_legend(pos=[1.07,1], vspace=2) show(fig, msg, zoom=1.1).close() vedo-2023.4.6/examples/pyplot/fit_polynomial2.py000066400000000000000000000036431444463326400215530ustar00rootroot00000000000000"""A polynomial fit of degree=""" from vedo import np, precision, Text3D, DashedLine, show from vedo.pyplot import plot, fit, histogram # np.random.seed(0) n = 25 # nr of data points to generate deg = 3 # degree of the fitting polynomial # Generate some noisy data points x = np.linspace(0, 12, n) y = (x-6)**3 /50 + 6 # the "truth" is a cubic function! xerrs = np.linspace(0.4, 1.0, n) # make last points less precise yerrs = np.linspace(1.0, 0.4, n) # make first points less precise noise = np.random.randn(n) # Plot the noisy points with their error bars fig1 = plot( x, y+noise, ".k", title=__doc__+str(deg), xerrors=xerrs, yerrors=yerrs, aspect=4/5, xlim=(-3,15), ylim=(-3,15), padding=0, ) fig1 += DashedLine(x, y, c='r') # Fit points and evaluate, with a bootstrap and Monte-Carlo technique, # the correct errors and error bands. Return a Line object: pfit = fit( [x, y+noise], deg=deg, # degree of the polynomial niter=500, # nr. of MC iterations to compute error bands nstd=2, # nr. of std deviations to display xerrors=xerrs, # optional array of errors on x yerrors=yerrs, # optional array of errors on y vrange=(-3,15), # specify the domain of fit ) fig1 += [pfit, pfit.error_band, pfit.error_lines] # add these objects to Figure # Add some text too txt = "fit coefficients:\n " + precision(pfit.coefficients, 2) \ + "\n:pm" + precision(pfit.coefficient_errors, 2) \ + "\n:Chi^2_:nu = " + precision(pfit.reduced_chi2, 3) fig1 += Text3D(txt, s=0.42, font='VictorMono').pos(4,-2).c('k') # Create a 2D histo to show the correlation of fit parameters fig2 = histogram( pfit.monte_carlo_coefficients[:,0], pfit.monte_carlo_coefficients[:,1], title="parameters correlation", xtitle='coeff_0', ytitle='coeff_1', cmap='ocean_r', scalarbar=True, ) show(fig1, fig2, N=2, sharecam=False, zoom='tight').close() vedo-2023.4.6/examples/pyplot/fonts3d.py000066400000000000000000000073741444463326400200310ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os from vedo import printc, Text2D, Text3D, show, Plotter from vedo import fonts, fonts_path, settings import numpy as np ################################################################################## 2D inred = Text2D("°monospaced fonts are marked in red", c='r5', pos='bottom-center', font='VictorMono') acts2d = [inred] txt = 'The quick fox jumps over the lazy dog. 1234567890 αβγδεθλμνπστφψω' for i, f in enumerate(fonts): bg = None if f in ['Calco', 'Glasgo', 'SmartCouric', 'VictorMono']: bg = 'red5' t = Text2D(f'{f}: {txt}', pos=(.015, 1-(i+3)*.06), font=f, s=1.3, c='k', bg=bg) acts2d.append(t) acts2d.append(Text2D("List of built-in fonts", pos='top-center', bg='k', s=1.3)) plt0a = show(acts2d, bg2='cornsilk', size=(1300,800), interactive=False) ## online fonts: acts2d = [] i = 0 for key, props in sorted(settings.font_parameters.items()): if props['islocal']: continue if key in ('Justino2', 'Justino3'): continue bg = None if props['mono']: bg = 'red5' t = Text2D(f'{key}: {txt}', pos=(.015, 1-(i+2)*.06), font=key, s=1.3, c='k', bg=bg) acts2d.append(t) i+=1 plt0b = show(acts2d, Text2D("Additional fonts (https://vedo.embl.es/fonts)", pos='top-center', bg='k', s=1.3), bg2='lb', size=(1300,900), pos=(1200,200), new=True) ################################################################################ printout for font in fonts: printc(font + " - available characters:", " "*25, bold=1, invert=1) fontfile = os.path.join(fonts_path, font + '.npz') font_meshes = np.load(fontfile, allow_pickle=True)['font'][0] for k in font_meshes.keys(): printc(k, end=' ') print() printc('\n(use the above to copy&paste any char into your python script!)', italic=1) printc('Symbols ~ ^ _ are reserved modifiers:', italic=1) printc(' use ~ to add a short space, 1/4 of the default size,', italic=1) printc(' use ^ and _ to start up/sub scripting, space terminates them.\n', italic=1) ################################################################################## 3D # Symbols ~ ^ _ are reserved modifiers: # use ~ to add a short space, 1/4 of the default size, # use ^ and _ to start up/sub scripting, a space terminates them. txt = """The quick fox jumps over the lazy dog. Symbols: !@#$%&*()+=-{}[]:;|<>?/:euro1234567890 Units: :delta=0.25E-03 ~μm, T_sea ~=~5.3~±0.7~:circC LaTeX: :nabla:dotE=~4:pi~:rho, :nabla:timesE=~-1/c~~:partialB/:partialt ih~:partial/:partialt~:Psi = [-h^2 /2m:nabla^2 + V(r,t)]~:Psi(r,t) :DeltaE~=~h:nu, y = :Sigma_n ~A_n cos(:omega_n t+:delta_n ) sin(k_n x) :intx:dot~dx = :onehalf x:^2 + const. d^2 x^:mu + :Gamma^:mu_:alpha:beta ~dx^:alpha ~dx^:beta = 0 -∇:^2u(x) = f(x) in Ω, u(x)~=~u_D (x) in :partial:Omega Protect underscore \\\_ and \\\^ with a backslash. """ plt = Plotter(N=4, pos=(300,0), size=(1600,950)) cam = dict(pos=(3.99e+5, 8.51e+3, 6.47e+5), focal_point=(2.46e+5, 1.16e+5, -9.24e+3), viewup=(-0.0591, 0.983, 0.175), distance=6.82e+5, clipping_range=(5.26e+5, 8.92e+5)) for i,fnt in enumerate(["Kanopus", "Normografo", "Theemim", "VictorMono"]): t = Text3D(txt, font=fnt, italic=0).c('darkblue').scale(12300) plt.at(i) plt.show(t, Text2D("Font: "+fnt, font=fnt, bg='r'), axes=dict(xtitle='my units for L_x (:mum)', ytitle='my Y-axis with:na long description', title_font=fnt, label_font=fnt, digits=2, ), camera=cam, resetcam=not bool(i), ) plt.interactive().close() plt0b.close() plt0a.close() vedo-2023.4.6/examples/pyplot/fourier_epicycles.py000066400000000000000000000044451444463326400221600ustar00rootroot00000000000000"""Fourier 2D shape reconstruction with epicycles representation""" # Original version from D. Shiffman (2019), adapted for vedo by M. Musy (2022) # https://thecodingtrain.com/CodingChallenges/130.2-fourier-transform-drawing.html import numpy as np import vedo order = 30 # restrict to this nr of fourier coefficients in reconstruction def DFT(x): X = [] N = len(x) for freq in range(N): re, im = [0, 0] for n in range(N): phi = (2 * np.pi * freq * n) / N re += x[n] * np.cos(phi) im -= x[n] * np.sin(phi) re, im = [re/N, im/N] amp = np.sqrt(re*re + im*im) phase = np.arctan2(im, re) X.append([re, im, freq, amp, phase]) return vedo.utils.sort_by_column(X, 3, invert=True) def epicycles(time, rotation, fourier, order): global objs plt.remove(objs) x, y = [0, 0] objs, path = [], [] for i in range(len(fourier[:order])): re, im, freq, amp, phase = fourier[i] if amp > 0.2: c = vedo.Circle([x,y], amp).wireframe().lw(0.1) objs.append(c) x += amp * np.cos(freq * time + phase + rotation) y += amp * np.sin(freq * time + phase + rotation) path.append([x,y]) if len(points)>0: hline = vedo.Line([x,y], points[-1], c='red5', lw=0.1) pline = vedo.Line(path, c='green5', lw=2) oline = vedo.Line(points, c='red4', lw=5) objs += [hline, pline, oline] plt.add(objs).render() return [x, y] # Load some 2D shape and make it symmetric shape = vedo.load(vedo.dataurl+'timecourse1d.npy')[55] shaper = vedo.Line(shape).mirror('x').reverse() shape = vedo.merge(shape, shaper) x, y, _ = shape.points().T # Compute Fourier Discrete Transform in x and y separately: fourierX = DFT(x) fourierY = DFT(y) vedo.settings.default_font = 'Glasgo' plt = vedo.Plotter(size=(1500,750), bg='black', axes=1, interactive=False) txt = vedo.Text2D(f"{__doc__} (order={order})", c='red9', bg='white', pos='bottom-center') plt.show(shape, txt, mode='image', zoom=1.9) objs, points = [], [] times = np.linspace(0, 2*np.pi, len(fourierX), endpoint=False) for time in times: x, _ = epicycles(time, 0, fourierX, order) _, y = epicycles(time, np.pi/2, fourierY, order) points.append([x, y]) plt.interactive().close() vedo-2023.4.6/examples/pyplot/glyphs3.py000066400000000000000000000014411444463326400200270ustar00rootroot00000000000000"""Orient and scale 'glyphs' (use a Mesh like a symbol)""" # Credits: original example and data from https://plotly.com/python/cone-plot # Adapted for vedo by M. Musy, 2020. from vedo import Cone, Glyph, show import numpy as np import pandas as pd # Read cvs data df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/vortex.csv") pts = np.c_[df['x'], df['y'],df['z']] vecs= np.c_[df['u'], df['v'],df['w']] # Create a mesh to be used like a symbol (a "glyph") to be attached to each point cone = Cone().scale(0.3).rotate_y(90) # make it smaller and orient tip to positive x glyph = Glyph(pts, cone, vecs, scale_by_vector_size=True, color_by_vector_size=True) glyph.lighting('ambient').cmap('Blues').add_scalarbar(title='wind speed') show(glyph, __doc__, axes=True).close() vedo-2023.4.6/examples/pyplot/goniometer.py000066400000000000000000000016641444463326400206150ustar00rootroot00000000000000"""The 3D-ruler axis style, a flag pole and a goniometer""" from vedo import * settings.use_parallel_projection = True # avoid parallax effects mesh = Cone().c("steelblue").rotate_y(90).pos(1, 2, 3) # add a flagpole-style comment a, v = precision(mesh.area(), 4), precision(mesh.volume(), 4) fp = mesh.flagpole( "S = πr^2 +πr√(h^2 +r^2 )\n = " + a + "~μm^2 \nV = πr^2 ·h/3\n = " + v + "~μm^3", s=0.1, ) fp.color("r3").scale(0.7) # measure the angle formed by 3 points gon = Goniometer( [-0.5, 1, 2], [2.5, 2, 2], [-0.5, 3, 3], prefix=":alpha_c =~", lw=2, s=0.8 ) # show distance of 2 points rul = Ruler( (-0.5, 2, 1.9), (2.5, 2, 2.9), prefix="L_x =", units="μm", axis_rotation=90, tick_angle=70, ) # make 3d rulers along the bounding box (similar to set axes=7) ax3 = RulerAxes(mesh, units="μm") show(mesh, fp.follow_camera(), gon, rul, ax3, __doc__, bg2="lb", viewup="z").close() vedo-2023.4.6/examples/pyplot/graph_lineage.py000066400000000000000000000017511444463326400212270ustar00rootroot00000000000000"""Generate a lineage graph of cell divisions""" # N.B.: no positions are specified here, only connectivity! from vedo import show from vedo.pyplot import DirectedGraph # Layouts: [2d, fast2d, clustering2d, circular, circular3d, cone, force, tree] #g = Graph(layout='2d', zrange=7) g = DirectedGraph(layout='cone') #g = DirectedGraph(layout='circular3d', height=1, radius=1.5) #g = DirectedGraph(layout='force') # Vertex generation is automatic, # add a child to vertex0, so that now vertex1 exists g.add_child(0, edge_label="Mother cell") g.add_child(1); g.add_child(1) g.add_child(2); g.add_child(2); g.add_child(2) g.add_child(3); g.add_child(3, edge_label="daughter_38") g.add_child(4); g.add_child(4) for i in range(7): g.add_child(5, node_label="cell5_"+str(i)) g.add_child(7); g.add_child(7); g.add_child(7) g.build() # optimize layout g.unpack(0).color('dg').lw(3) #0=graph, 1=vertexLabels, 2=edge_labels, 3=arrows g.unpack(2).color('dr') show(g, __doc__, axes=9, elevation=-40).close() vedo-2023.4.6/examples/pyplot/graph_network.py000066400000000000000000000031761444463326400213170ustar00rootroot00000000000000"""Visualize a 2D/3D network and its properties""" # (see also example: lineage_graph.py) from vedo import Points, show, sin from vedo.pyplot import DirectedGraph # Create some graph with nodes and edges # layouts: [2d, fast2d, clustering2d, circular, circular3d, cone, force, tree] g = DirectedGraph(layout='fast2d') ##################### Use networkx to create random nodes and edges # import networkx # G = networkx.gnm_random_graph(n=20, m=35) # for i, j in G.edges(): g.add_edge(j,i) ##################### Manually create nodes and edges for i in range(6): g.add_child(i) # add one child node to node i for i in range(3): g.add_child(i) for i in range(3): g.add_child(i) for i in range(7,9): g.add_child(i) for i in range(3): g.add_child(12) # add 3 children to node 12 g.add_edge(1,16) ##################### build and draw graph = g.build().unpack(0).linewidth(4) # get the vedo 3d graph lines nodes = graph.points() # get the 3d points of the nodes pts = Points(nodes, r=10).lighting('off') v1 = ['node'+str(n) for n in range(len(nodes))] v2 = [sin(x) for x in range(len(nodes))] labs1 = pts.labels(v1, scale=.02, italic=True).shift(.05,0.02,0).c('green') labs2 = pts.labels(v2, scale=.02, precision=3).shift(.05,-.02,0).c('red') # Interpolate the node value to color the edges: graph.cmap('viridis', v2).add_scalarbar3d(c='k') graph.scalarbar.shift(0.15,0,0).use_bounds(True) pts.cmap('viridis', v2) # This would colorize the edges directly with solid color based on a v3 array: # v3 = [sin(x) for x in range(graph.ncells)] # graph.cmap('jet', v3).add_scalarbar() show(pts, graph, labs1, labs2, __doc__, zoom='tight').close() vedo-2023.4.6/examples/pyplot/histo_1d_a.py000066400000000000000000000001421444463326400204450ustar00rootroot00000000000000from vedo.pyplot import np, histogram data = np.random.randn(1000) histogram(data).show().close() vedo-2023.4.6/examples/pyplot/histo_1d_b.py000066400000000000000000000016631444463326400204570ustar00rootroot00000000000000"""Superimpose and compare histograms""" import numpy as np from vedo.pyplot import histogram from vedo import settings settings.remember_last_figure_format = True np.random.seed(0) theory = np.random.randn(500).tolist() backgr = ((np.random.rand(100)-0.5)*6).tolist() data = np.random.randn(500).tolist() + backgr # A first histogram: fig = histogram( theory + backgr, ylim=(0,90), title=__doc__, xtitle='measured variable', c='red4', gap=0, # no gap between bins padding=0, # no extra spaces label="theory", ) # Extract the 11th bin and color it purple fig.unpack(10).c('purple4') fig.add_label("special bin", marker='s', mc='purple4') # Add a second histogram to be superimposed fig += histogram(backgr, label='background') # Add the data histogram with poissonian errors fig += histogram(data, marker='o', errors=True, fill=False, label='data') fig.add_legend(s=0.8) fig.show(zoom='tight').close() vedo-2023.4.6/examples/pyplot/histo_1d_c.py000066400000000000000000000015611444463326400204550ustar00rootroot00000000000000"""Uniform distribution weighted by sin^2 12x + :onehalf""" from vedo import Line, settings, np from vedo.pyplot import histogram settings.default_font = "DejavuSansMono" data = np.random.rand(10000) weights = np.ones_like(data) * np.sin(12*data)**2 + 1/2 fig = histogram( data, weights=weights, bins=50, aspect=16/9, # desired aspect ratio of the figure xtitle=__doc__, # x-axis title padding=[0,0,0,0.1], # allow 10% padding space only on the top gap=0, # no gap between bins ac='k7', # axes color c='yellow9', label='my histogram', ) x = np.linspace(0,1, 200) y = 200*np.sin(12*x)**2 + 100 fig += Line(x, y, c='red5', lw=3).z(0.001) fig.add_label('my function', marker='-', mc='red5') fig.add_legend(pos=[0.7,1.33], alpha=0.2) fig.show(size=(1000,700), bg='black', zoom='tight').close() vedo-2023.4.6/examples/pyplot/histo_1d_d.py000066400000000000000000000021401444463326400204500ustar00rootroot00000000000000"""Insert a Figure into another (note that the x-axes stay aligned)""" from vedo import Marker, settings, show, np from vedo.pyplot import histogram settings.default_font = "Ubuntu" data = np.random.normal(loc=100, size=1000) + 7 ################## Create the first Figure fig1 = histogram( data, bins=20, xlim=(95,111), aspect=16/9, xtitle="shifted gaussian", c='cyan3', ) # let's add an asterix marker where the mean is fig1 += Marker('a', [fig1.mean,150,0.1], s=8).c('orange5') ################## Create a second Figure fig2 = histogram( data - 7, bins=60, aspect=4/3, density=True, outline=True, c='purple9', axes=dict(xygrid=True, xyplane_color='grey2', xyalpha=1, grid_linewidth=0), label='finer binning', ) # let's add an asterix marker where the mean is fig2 += Marker('a', [fig2.mean,0.2,0.1], s=0.02).c('orange5') # shift fig2 in vertical by 25, and in z by 0.1 (to make it show on top) fig2.shift(0, 25, 0.1) ################## Insert fig2 into fig1 fig2.add_legend() fig1.insert(fig2) show(fig1, __doc__, zoom='tight', size=(1200,900)).close() vedo-2023.4.6/examples/pyplot/histo_1d_e.py000066400000000000000000000014351444463326400204570ustar00rootroot00000000000000"""Plot a histogram of the distance of each point of a sphere to the oceans mesh. The distance is used to threshold the sphere and create continents.""" from vedo import * from vedo.pyplot import histogram # Download the oceans mesh oceans = Mesh(dataurl + "oceans.vtk").c("blue9") size = oceans.average_size() # Create a sphere and compute the distance to the oceans mesh sphere = IcoSphere(subdivisions=5).scale(size*1.01) dists = sphere.distance_to(oceans) # Create a histogram of the distance histo = histogram(dists, logscale=True, c="gist_earth") histo+= Arrow2D([200,1], [200,0]).z(1).c("red5") # Threshold the sphere to create continents continents = sphere.threshold("Distance", above=20.0) continents.cmap("gist_earth").linewidth(1) show(oceans, continents, histo.as2d(), __doc__) vedo-2023.4.6/examples/pyplot/histo_2d_a.py000066400000000000000000000011251444463326400204500ustar00rootroot00000000000000"""Histogram of 2 variables""" from vedo import Marker, Points, np from vedo.pyplot import histogram n = 10_000 x = np.random.randn(n) + 20 y = x + np.random.randn(n) + 10 xm, ym = np.mean(x), np.mean(y) histo = histogram( x, y, # this is interpreted as 2D bins=25, zlim=(0,150), # saturate color above 150 entries cmap='Blues_r', ztitle="Number of entries in bin", ) # Add a marker to the plot histo += Marker('*', s=0.2, c='r').pos(xm, ym, 0.2) # Add also the original points histo += Points([x,y], r=2).z(0.1) histo.show(zoom='tight', bg='light yellow').close() vedo-2023.4.6/examples/pyplot/histo_2d_b.py000066400000000000000000000010461444463326400204530ustar00rootroot00000000000000"""Histogram of 2 variables as 3D bars""" import numpy as np from vedo import Points, show from vedo.pyplot import histogram n = 1000 x = np.random.randn(n)*1.5 + 60 y = np.random.randn(n) + 70 histo = histogram( x, y, bins=(12, 10), cmap="summer", ztitle="Number of entries in bin", mode="3d", gap=0.0, zscale=0.4, # rescale the z axis aspect=16/9, ) print(histo.frequencies) # Add also the original points on top histo += Points(np.c_[x, y], r=4, c="red5").z(3) show(histo, __doc__, elevation=-80).close() vedo-2023.4.6/examples/pyplot/histo_3d.py000066400000000000000000000010431444463326400201500ustar00rootroot00000000000000"""Histogram (or plot) in 3D. The size of each cube is proportional to the value at that point""" import numpy as np from vedo import Volume, Cube, Glyph, show # Make up some arbitrary data X, Y, Z = np.mgrid[:10, :6, :4] counts = 50 - ( (X-4)**2 + (Y-4)**2 + (Z-4)**2 ) # This is now a point cloud with an associated array of counts pcloud = Volume(counts).topoints() marker = Cube().scale(0.015) glyphed_pcl = Glyph(pcloud, marker, scale_by_scalar=True) glyphed_pcl.cmap('seismic').add_scalarbar('counts') show(glyphed_pcl, __doc__, axes=1) vedo-2023.4.6/examples/pyplot/histo_gauss.py000066400000000000000000000014361444463326400207720ustar00rootroot00000000000000"""Superimpose histograms and curves""" import numpy as np from vedo.pyplot import histogram, plot from vedo import settings settings.default_font = "Bongas" settings.remember_last_figure_format = True mu, sigma, n, bins = 100.0, 15.0, 600, 50 samples = np.random.normal(loc=mu, scale=sigma, size=n) x = np.linspace(min(samples), max(samples), num=50) y = 1/(sigma*np.sqrt(2*np.pi)) * np.exp( -(x-mu)**2 /(2*sigma**2)) dy = 1/np.sqrt(n) fig = histogram( samples, title=__doc__, bins=bins, density=True, c='cyan3', aspect=9/7, label="gaussian", ) fig += plot(x, y, "-", lc='orange5', label="some fit") fig += plot(x, y*(1+dy), "--", c='orange5', lw=2) fig += plot(x, y*(1-dy), "--", c='orange5', lw=2) fig.add_legend() fig.show(size=(800,700), zoom="tight").close() vedo-2023.4.6/examples/pyplot/histo_hexagonal.py000066400000000000000000000010771444463326400216170ustar00rootroot00000000000000from vedo import Latex, show from vedo.pyplot import histogram import numpy as np N = 2000 x = np.random.randn(N) * 1.0 y = np.random.randn(N) * 1.5 # hexagonal binned histogram: histo = histogram( x, y, bins=10, mode='hexbin', fill=True, cmap='terrain', ) # add a formula: f = r'f(x, y)=A \exp \left(-\left(\frac{\left(x-x_{o}\right)^{2}}' f+= r'{2 \sigma_{x}^{2}}+\frac{\left(y-y_{o}\right)^{2}}' f+= r'{2 \sigma_{y}^{2}}\right)\right)' formula = Latex(f, c='k', s=1.5).rotate_x(90).rotate_z(90).pos(-4,-5,2) show(histo, formula, axes=1, viewup='z') vedo-2023.4.6/examples/pyplot/histo_manual.py000066400000000000000000000050471444463326400211270ustar00rootroot00000000000000"""Categories and repeats""" # manually create a plot by adding Rectangles to a Figure object from vedo import np, settings, Rectangle, Text3D, Line, DashedLine from vedo.pyplot import Figure settings.default_font = "Theemim" #################################################################### First plot groupA = np.random.randn(3)*10+50 groupB = np.random.randn(3)*10+60 groupC = np.random.randn(3)*10+70 fig = Figure( [-5,55], [-10,100], # x and y ranges xtitle='', ytitle='', # this disables x and y axes ) ################# x0 = 0 for i in range(3): x1 = x0 + 4 val= groupA[i] fig += Rectangle([x0,0], [x1, val], c=f'red{3+i*2}') x0 = x1 fig += Text3D("Group A", justify='center', c='k').pos(6,-7).scale(4) fig += Line([-1,0], [13, 0], lw=2) ################# x0 = 20 for i in range(3): x1 = x0 + 4 val= groupB[i] fig += Rectangle([x0,0], [x1, val], c=f'purple{3+i*2}') x0 = x1 fig += Text3D("Group B", justify='center', c='k').pos(26,-7).scale(4) fig += Line([19,0], [33, 0], lw=2) ################# x0 = 40 for i in range(3): x1 = x0 + 4 val= groupC[i] fig += Rectangle([x0,0], [x1, val], c=f'orange{3+i*2}') x0 = x1 fig += Text3D("Group C", justify='center', c='k').pos(46,-7).scale(4) fig += Line([39,0], [53, 0], lw=2) ################# fig += DashedLine([-2,50], [55,50], c='k3', lw=1) fig += Text3D("50%").pos(-7,49).scale(3).c('k') fig.show(size=(1000,700), zoom='tight', title=__doc__).clear() #################################################################### Second plot fig = Figure( [0, 100], [-20, 80], aspect=3/4, # can change the aspect ratio xtitle='', ytitle='', # this disables x and y axes ) for i in range(5): val = np.random.randn()*10+50 y0, y1 = 2*i, 2*i+1 fig += Rectangle([0,y0], [100,y1], radius=0.5, c='k6') fig += Rectangle([0,y0], [val,y1], radius=0.5, c='r4').z(1) fig += Text3D("Group A", justify='center', c='k').pos(50,-5).scale(2.5) for i in range(5): val = np.random.randn()*10+60 y0, y1 = 2*i + 20, 2*i+1 + 20 fig += Rectangle([0,y0], [100,y1], radius=0.5, c='k6') fig += Rectangle([0,y0], [val,y1], radius=0.5, c='p5').z(1) fig += Text3D("Group B", justify='center', c='k').pos(50,15).scale(2.5) for i in range(5): val = np.random.randn()*10+70 y0, y1 = 2*i + 40, 2*i+1 + 40 fig += Rectangle([0,y0], [100,y1], radius=0.5, c='k6') fig += Rectangle([0,y0], [val,y1], radius=0.5, c='o5').z(1) fig += Text3D("Group C", justify='center', c='k').pos(50,35).scale(2.5) fig.show(size=(1000,700), zoom='tight').close() vedo-2023.4.6/examples/pyplot/histo_pca.py000066400000000000000000000022161444463326400204100ustar00rootroot00000000000000"""Histogram along a PCA axis""" import numpy as np from vedo import Points, pca_ellipse, Arrow2D, Goniometer from vedo.pyplot import Figure, histogram data = np.random.randn(1000, 3) pts = Points(data, r=6, c='#1f77b4') pts.scale([2,1,0.01]).rotate_z(45).shift(5,1) # rotate and shift! # Recover the rotation pretending we only know the points # Fit a 1-sigma ellipse to the points elli = pca_ellipse(pts) ec, e1, e2 = elli.center, elli.axis1, elli.axis2 arrow1 = Arrow2D(ec, ec - 3*e1) arrow2 = Arrow2D(ec, ec + 3*e2) angle = np.arctan2(e1[1], e1[0]) * 180/np.pi mypts = pts.clone() # rotate back to make the histo: mypts.shift(-ec).rotate_z(-angle) histo = histogram( # a Histogram1D(Figure) object mypts.points()[:,1], # grab the y-values (PCA2) ytitle='', title=' ', # no automatic title, no y-axis c='#1f77b4', # color aspect=16/9, # aspect ratio ) histo.rotate_z(90 + angle).pos(ec - 6*e1) gon = Goniometer(ec-5.5*e1, ec, [ec[0]-5.5*e1[0], ec[1],0]).z(0.2) fig = Figure([0,14], [-4,9], aspect="equal", title=__doc__) fig += [pts, elli.z(-0.1), arrow1, arrow2, gon, histo] fig.show(zoom='tight').close() vedo-2023.4.6/examples/pyplot/histo_polar.py000066400000000000000000000024641444463326400207670ustar00rootroot00000000000000from vedo import Hyperboloid, show from vedo.pyplot import histogram import numpy as np np.random.seed(1) ################################################################## radhisto = histogram( np.random.rand(200)*6.28, mode='polar', title="random orientations", bins=10, c=range(10), #'orange', #uniform color alpha=0.8, labels=["label"+str(i) for i in range(10)], ) show(radhisto, at=0, N=2, axes=0, sharecam=False) ################################################################## hyp = Hyperboloid(res=20).cut_with_plane().rotate_y(-90) hyp.color('grey').alpha(0.3) # select 10 random indices of points on the surface idx = np.random.randint(0, hyp.npoints, size=10) radhistos = [] for i in idx: #generate a random histogram rh = histogram( np.random.randn(100), mode='polar', bins=12, r1=0.2, # inner radius phigap=1.0, # leave a space btw phi bars cmap='viridis_r', show_disc=False, show_angles=False, show_errors=False, ) rh.scale(0.15) # scale histogram to make it small rh.pos(hyp.points()[i]) # set its position on the surface rh.orientation(hyp.normal_at(i)) # orient it along normal radhistos.append(rh) show(hyp, radhistos, at=1).interactive().close() vedo-2023.4.6/examples/pyplot/histo_spheric.py000066400000000000000000000005541444463326400213050ustar00rootroot00000000000000"""A uniform distribution on a plane is not uniform on a sphere""" import numpy as np from vedo.pyplot import histogram from vedo import Plotter phi = np.random.rand(1000)*np.pi*2 the = np.random.rand(1000)*np.pi h = histogram(the, phi, mode='spheric').add_scalarbar() plt = Plotter(axes=12).add_ambient_occlusion(0.05) plt.show(h, __doc__, viewup='z').close() vedo-2023.4.6/examples/pyplot/histo_violin.py000066400000000000000000000011071444463326400211430ustar00rootroot00000000000000from vedo import * from vedo.pyplot import violin import numpy as np n = 1000 acts = [ Text3D('gaussian', pos=(0,4.5), s=0.3, c='k', justify='center'), violin(np.random.randn(n)), Text3D('exponential', pos=(5,-1), s=0.3, c='k', justify='center'), violin(np.random.exponential(1, n), x=5, width=3, splined=False, centerline=False, c='t', lc='k'), Text3D('chisquare', pos=(10,11), s=0.3, c='k', justify='center'), violin(np.random.chisquare(9, n)/4, x=10, vlim=(0,10), c='lg', lc='dg'), ] show(acts, axes=dict(xtitle=False, ytitle='distribution')).close() vedo-2023.4.6/examples/pyplot/intersect2d.py000066400000000000000000000021671444463326400206720ustar00rootroot00000000000000"""Find the overlap area of 2 triangles""" from vedo import Mesh, precision, show import numpy as np verts1 = [(1.9, 0.50), (2.1, 0.8), (2.4, 0.4)] verts2 = [(2.3, 0.75), (1.7, 0.4), (2.1, 0.3)] faces = [(0,1,2)] m1 = Mesh([verts1, faces]).c('g').lw(4).wireframe() m2 = Mesh([verts2, faces]).c('b').lw(4).wireframe() a1 = precision(m1.area(),3) + " :mum:^2" a2 = precision(m2.area(),3) + " :mum:^2" fp1 = m1.flagpole('Triangle 1\nA=' + a1, point=(2.1,0.7), s=0.012, offset=(-0.3,0.04)) fp2 = m2.flagpole('Triangle 2\nA=' + a2, point=(1.9,0.4), s=0.012, offset=(0.2,-0.2)) m3 = m1.clone().wireframe(False).c('tomato').lw(0) zax = (0,0,1) v0,v1,v2 = np.insert(np.array(verts2), 2, 0, axis=1) m3.cut_with_plane(origin=v0, normal=np.cross(zax, v1-v0)) if m3.npoints: m3.cut_with_plane(origin=v1, normal=np.cross(zax, v2-v1)) if m3.npoints: m3.cut_with_plane(origin=v2, normal=np.cross(zax, v0-v2)) fp3 = m3.flagpole('Overlap polygon\nA=' + precision(m3.area(),3), point=(2.2,0.6), s=0.012) show(m1, m2, m3, fp1, fp2, fp3, __doc__, axes=1, size=(800,600), zoom=1.3).close() vedo-2023.4.6/examples/pyplot/isolines.py000066400000000000000000000022071444463326400202640ustar00rootroot00000000000000"""Draw the isolines and isobands of a scalar field H (height) on a surface""" from vedo import * mesh0 = ParametricShape('RandomHills') # ParametricShapes already have a scalar associated to points printc('Mesh point arrays:', mesh0.pointdata.keys()) # so assign it a colormap: mesh0.cmap('terrain') isol = mesh0.isolines(n=10).color('w') isob = mesh0.isobands(n=5).add_scalarbar("H=Elevation") # make a copy and interpolate the Scalars from points to cells mesh1 = mesh0.clone(deep=False).map_points_to_cells() printc('Mesh cell arrays :', mesh1.celldata.keys()) gvecs = mesh1.gradient(on='cells') cc = mesh1.cell_centers() ars = Arrows(cc, cc + gvecs*0.01, c='bone_r').lighting('off') ars.add_scalarbar3d(title='|:nablaH|:dot0.01 [arb.units]') # colormap the gradient magnitude directly on the mesh mesh2 = mesh1.clone(deep=False).lw(0.1).cmap('jet', mag(gvecs), on='cells') mesh2.add_scalarbar3d(title='|:nablaH| [arb.units]') plt = Plotter(N=4, size=(1200,900), axes=11) plt.at(0).show(mesh0, isol, __doc__) plt.at(1).show(isob) plt.at(2).show(mesh1, isol, ars, "Arrows=:nablaH") plt.at(3).show(mesh2, "Color=|:nablaH|") plt.interactive().close() vedo-2023.4.6/examples/pyplot/latex.py000066400000000000000000000012141444463326400175510ustar00rootroot00000000000000from vedo import Latex # https://matplotlib.org/tutorials/text/mathtext.html latex1 = r'x= \frac{ - b \pm \sqrt {b^2 - 4ac} }{2a}' latex2 = r'\mathcal{A}\mathrm{sin}(2 \omega t)' latex3 = r'I(Y | X)=\sum_{x \in \mathcal{X}, y \in \mathcal{Y}} p(x, y) \log \left(\frac{p(x)}{p(x, y)}\right)' latex4 = r'\Gamma_{\epsilon}(x)=\left[1-e^{-2 \pi \epsilon}\right]^{1-x} \prod_{n=0}^{\infty} \frac{1-\exp (-2 \pi \epsilon(n+1))}{1-\exp (-2 \pi \epsilon(x+n))}' ltx = Latex(latex4, s=1, c='darkblue', bg='', usetex=False, res=40) ltx.crop(0.3, 0.3) # crop top and bottom 30% ltx.pos(2,0,0) ltx.show(axes=8, size=(1400,700), bg2='lb', zoom='tight').close() vedo-2023.4.6/examples/pyplot/lines_intersect.py000066400000000000000000000016121444463326400216300ustar00rootroot00000000000000"""Find the intersection points of two coplanar lines""" import numpy as np from vedo import * p1, p2 = (-1,-1,0), (10,2,0) x = np.linspace(0,10, 50) y = np.sin(x)*4 pts = np.c_[x,y] # create 2 lines and assign some arbitrary rotations line1 = Spline(pts).lw(5).c('black').rotate_y(10).rotate_x(15) line2 = Line(p1,p2).lw(5).c('green').rotate_y(10).rotate_x(15) # make a small extrusion of line1 and intersect it with line2: ds = line1.diagonal_size()*0.02 # 1% tolerance pint = line1.extrude(ds).shift(0,0,-ds/2).intersect_with_line(line2) ps = Points(pint, r=15).c('red') # lets fill the convex area between the first 2 hits: id0 = line1.closest_point(pint[0], return_point_id=True) id1 = line1.closest_point(pint[1], return_point_id=True) msh = Line(line1.points()[id0:id1]).triangulate().lw(0).shift(0,0,-0.01) show(line1, line2, ps, msh, __doc__+f"\narea = {msh.area()} cm:^2", axes=1).close() vedo-2023.4.6/examples/pyplot/markers.py000066400000000000000000000006371444463326400201100ustar00rootroot00000000000000"""Markers set, analogous to matplotlib""" from vedo import Plotter, Marker, Text3D symbols = ['.','o','O', '0', 'p','*','h','D','d','v','^','>','<','s', 'x', 'a'] plt = Plotter(size=(1500,300)) plt += __doc__ for i,s in enumerate(symbols): plt += Marker(s, filled=True).x(i*0.6).backcolor('blue5') plt += Text3D(s, pos=[i*0.6,-0.6,0], s=0.12, literal=True, font="Calco") plt.show(zoom='tight').close() vedo-2023.4.6/examples/pyplot/markpoint.py000066400000000000000000000006351444463326400204460ustar00rootroot00000000000000"""Lock an object orientation to constantly face the scene camera""" from vedo import * sp = Sphere().wireframe() pts = sp.points() tx1 = Text3D("Fixed Text", pts[10], s=0.07, depth=0.1, c="lb") tx2 = Text3D("Follower Text", pts[144], s=0.07, c="lg").follow_camera() fp = sp.flagpole("The\nNorth Pole", c='k6', rounded=True).scale(0.4).follow_camera() show(sp, tx1, tx2, fp, __doc__, bg='bb', axes=1).close() vedo-2023.4.6/examples/pyplot/np_matrix.py000066400000000000000000000010541444463326400204370ustar00rootroot00000000000000"""Visualize a n:dotm numpy matrix""" from vedo.pyplot import matrix from vedo import show import numpy as np n, m = (6, 5) M = np.eye(n, m)/2 + np.random.randn(n, m)*0.1 # print(M) mat = matrix( M, cmap='Reds', title='My numpy Matrix', xtitle='Genes of group A', ytitle='Genes of group B', xlabels=[f'hox{i}' for i in range(m)], ylabels=[f'bmp{i}' for i in range(n)], scale=0.15, # size of bin labels; set it to 0 to remove labels lw=2, # separator line width ) show(mat, __doc__, bg='k7', zoom=1.2).close() vedo-2023.4.6/examples/pyplot/plot_bars.py000066400000000000000000000016621444463326400204300ustar00rootroot00000000000000# A plot(mode="bars") example. Useful to plot categories. from vedo import precision, Text3D, color_map, settings from vedo.pyplot import plot settings.default_font = "Meson" counts = [1946, 8993, 3042, 1190, 1477, 0, 0] percent = [11.68909178, 54.01850072, 18.27246516, 7.14800577, 8.87193657, 0, 0] labels = ['<100', '100-250', '250-500', '500-750', '750-1000', '1000-2000', '>2000'] colors = color_map(range(len(counts)), "hot") # plot() will return a PlotBars object fig = plot( [counts, labels, colors], mode="bars", ylim=(0,10_000), aspect=16/9, title='Clusters in lux range', axes=dict( xlabel_rotation=30, xlabel_size=0.02, ), ) for i in range(len(percent)): val = precision(percent[i], 3)+'%' txt = Text3D(val, pos=(fig.centers[i], counts[i]), justify="bottom-center", c="blue2") fig += txt.scale(200).shift(0,170,0) fig.show(size=(1000,750), zoom='tight').close() vedo-2023.4.6/examples/pyplot/plot_density2d.py000066400000000000000000000014441444463326400214040ustar00rootroot00000000000000"""Density plot from a distribution of points in 2D""" import numpy as np from vedo import * settings.use_depth_peeling = True n = 10000 p = np.random.normal(0, 0.3, (n,2)) p[:int(n*1/3) ] += [1.0, 0.0] # shift 1/3 of the points along x by 1 p[ int(n*2/3):] += [1.7, 0.4] # create the point cloud pts = Points(p).color('k', 0.2) # radius of local search can be specified (None=automatic) vol = pts.density(radius=None).c('Paired_r') # returns a Volume # Other cool color mapping: Set1_r, Dark2. Or you can build your own, e.g.: # vol.c(['w','w','y','y','r','r','g','g','b','k']).alpha([0,1]) r = precision(vol.info['radius'], 2) # retrieve automatic radius value vol.add_scalarbar3d(title='Density (counts in r_search ='+r+')', c='k', italic=1) show([(pts,__doc__), vol], N=2, axes=True).close() vedo-2023.4.6/examples/pyplot/plot_density3d.py000066400000000000000000000011011444463326400213730ustar00rootroot00000000000000"""Density plot from a distribution of points in 3D""" import numpy as np from vedo import * settings.use_depth_peeling = True n = 3000 p = np.random.normal(7, 0.3, (n,3)) p[:int(n*1/3) ] += [1,0,0] # shift 1/3 of the points along x by 1 p[ int(n*2/3):] += [1.7,0.4,0.2] pts = Points(p, alpha=0.5) vol = pts.density().c('Dark2').alpha([0.1,1]) # density() returns a Volume r = precision(vol.info['radius'], 2) # retrieve automatic radius value vol.add_scalarbar3d(title='Density (counts in r_s ='+r+')', c='k', italic=1) show(pts, vol, __doc__, axes=True).close() vedo-2023.4.6/examples/pyplot/plot_density4d.py000066400000000000000000000017641444463326400214130ustar00rootroot00000000000000# Plot a volume evolution in time # Credits: https://github.com/edmontz import numpy as np from scipy.fftpack import fftn, fftshift from vedo import Axes, Plotter, Volume, progressbar def f(x, y, z, t): r = np.sqrt(x*x + y*y + z*z + 2*t*t) + 0.1 return np.sin(9*np.pi * r)/r n = 64 qn = 25 vol = np.zeros((n, n, n)) n1 = int(n/2) plt = Plotter(bg="black", interactive=False) axes = Axes(xrange=(0,n), yrange=(0,n), zrange=(0,n)) plt.show(axes, viewup='z') for q in progressbar(range(qn), c='r'): t = 2 * q / qn - 1 for k in range(n1): z = 2 * k / n1 - 1 for j in range(n1): y = 2 * j / n1 - 1 for i in range(n1): x = 2 * i / n1 - 1 vol[i, j, k] = f(x, y, z, t) volf = fftn(vol) volf = fftshift(abs(volf)) volf = np.log(12*volf/volf.max()+ 1) / 2.5 vb = Volume(volf).mode(1).c("rainbow").alpha([0, 0.8, 1]) vb.name = "MyVolume" plt.remove("MyVolume").add(vb).render() plt.interactive().close() vedo-2023.4.6/examples/pyplot/plot_empty.py000066400000000000000000000020311444463326400206260ustar00rootroot00000000000000"""Create an empty Figure to be filled in a loop Any 3D Mesh object can be added to the figure!""" from vedo import * from vedo.pyplot import plot, Figure settings.default_font = "Cartoons123" settings.palette = 2 settings.remember_last_figure_format = True # Create an empty Figure and plot on it fig = Figure( xlim=(0,12), ylim=(-1.5, 1.5), padding=0, # no extra space aspect=16/9, # desired aspect ratio xtitle="speed [mph]", grid=True, axes=dict(axes_linewidth=3, xyframe_line=3), ) for i in range(2,11,2): x = np.linspace(0, 4*np.pi, 20) y = np.sin(x) * np.sin(x/12) * i/5 fig += plot(x, y, '-0', c=i, splined=True) fig += Arrow([5,-1], [8,-1], s=0.5, c='green3') # Add any number of polygonal Meshes. # Use insert() to preserve the object aspect ratio inside the Figure coord system: mesh = Mesh(dataurl+'cessna.vtk').c('blue5').scale(0.25).pos(4, 0.5, 0.5) circle = Circle([5,0.5,-0.1], r=0.5, c='orange5') fig.insert(mesh, circle) show(fig, __doc__, size=(800,700), zoom='tight').close() vedo-2023.4.6/examples/pyplot/plot_errband.py000066400000000000000000000025331444463326400211140ustar00rootroot00000000000000"""Plotting functions with error bands""" from vedo import np, Rectangle, Text3D, Marker, Line from vedo.pyplot import plot # Make up same dummy data x = np.arange(0, 6, 0.05) y = 2+2*np.sin(2*x)/(x+1) ye= y**2 / 10 miny = np.min(y-ye) idx = np.argmax(y) # Plot the two variables, return a Plot(Assembly) object: fig = plot( x, y, yerrors=ye, xtitle='time in :museconds', ytitle='y oscillation [a.u.]', ylim=(0.5, 5), aspect=5/3, # plot aspect ratio (xsize/ysize) error_band=True, # join errors on y into an error band lc="red2", # line color ec="red7", # error band color padding=0, # no extra spaces around the content grid=0, # no background grid axes=dict(axes_linewidth=2, xyframe_line=0), ) # Add a grey transparent rectangle to represent an exclusion region: fig += Rectangle([1,0.5], [2.7,5], c='grey5').lighting('off') # Add some text (set z=2 so it stays on top): fig += Text3D("Excluded\ntime range!", s=0.2, c='k', font="Quikhand").rotate_z(20).pos(1.3,3.6) # Add a star marker at maximum of function (set z=0.1, so it stays on top): fig += Marker('*', c='blue4').pos(x[idx], y[idx], 0.1) # Add a dashed line to indicate the minimum fig += Line((x[0], miny), (x[-1], miny)).pattern('- . -').lw(3) fig.show(zoom='tight', mode='image', size=(900,600)).close() vedo-2023.4.6/examples/pyplot/plot_errbars.py000066400000000000000000000021731444463326400211370ustar00rootroot00000000000000"""Superpose plots in different styles""" from vedo.pyplot import plot from vedo import np, settings settings.default_font = 'Theemim' settings.remember_last_figure_format = True x = np.linspace(0, 10, num=21) y = 3 * np.sin(x) ################# first plot fig = plot( x, y, "*r-", # markers: *,o,p,h,D,d,v,^,s,x,a title=__doc__, xtitle="t variable (:mus)", ytitle="y(x) = :pmK_i :dot:sqrtsin^2 t", aspect=16/9, # aspect ratio x/y of plot xlim=(-1, 14), # specify x range axes=dict(text_scale=1.2), label="3 :dot sin(x)", ) ################# plot on top of fig fig += plot( x + np.pi, y, "sb--", like=fig, # format like fig splined=True, # continuous spline through points lw=3, # line width label="3 :dot sin(x - :pi)", ) ################## plot again on top of fig fig += plot(x, y/5, "g", label="3/5 :dot sin(x)") ################## plot again on top of fig fig += plot(x, y/5-1, "purple5 -", label="3/5 :dot sin(x) - 1") ################## Show! ################## fig.add_legend(pos=[0.95,1]) fig.show(size=(1400,900), zoom='tight').close() vedo-2023.4.6/examples/pyplot/plot_extra_yaxis.py000066400000000000000000000034001444463326400220310ustar00rootroot00000000000000"""Add a secondary y-axis for units conversion""" from vedo import np, settings, dataurl, Mesh, show from vedo.pyplot import plot, Figure settings.annotated_cube_texts = ['front','back','left','right','top','bttm'] x0, x1 = [0.3, 2.0] x = np.linspace(x0, x1, num=50) # The main plot fig1 = plot( x, 1000*np.cos(x+1), xlim=[x0, x1], ylim=[-1000, 250], aspect=16/9, padding=0, # do not mess up with margins title="Wing pull vs position", xtitle="Distance from airplane axis [m]", ytitle="N [Kg*m/s^2 ]", axes=dict( xygrid_transparent=False, xygrid_color='k7', xyalpha=1, xyplane_color='w', yhighlight_zero=True, ), ) # This empty Figure just creates a new y-axis in red fig2 = Figure( fig1.xlim, # same as fig1 fig1.ylim * 7.236, # units conversion factor aspect=fig1.aspect, # same as fig1 padding=fig1.padding, # same as fig1 xtitle='', # don't draw the x-axis! ytitle='Poundal [lb*ft/s^2 ]', axes=dict( # extra options for y-axis number_of_divisions=10, yshift_along_x=1, # shift 100% to the right ylabel_offset=-1, ylabel_justify="center-left", ytitle_position=0.5, ytitle_justify="top-center", axes_linewidth=3, c='red3', ), ) fig1.rotate_x(90).rotate_z(90).shift(-0.5, 0, 1) fig2.rotate_x(90).rotate_z(90).shift(-0.5, 0, 1) msh = Mesh(dataurl+"cessna.vtk") cam = dict( # press C to get these values pos=(3.899, -0.4781, 1.157), focal_point=(-0.1324, 0.9041, 0.3530), viewup=(-0.1725, 0.06857, 0.9826), ) show(msh, fig1, fig2, __doc__, axes=5, camera=cam, bg2='lb').close() vedo-2023.4.6/examples/pyplot/plot_fxy.py000066400000000000000000000025061444463326400203050ustar00rootroot00000000000000'''Draw a z = f(x,y) surface specified as a string or as a reference to an external function. Red points indicate where the function does not exist!''' from vedo import dataurl, sin, cos, log, show, Text2D from vedo.pyplot import plot doc = Text2D(__doc__, pos='bottom-left', c='darkgreen', font='Quikhand') ############################################################### REAL def f(x, y): return sin(2*x*y) * cos(3*y)/2 f1 = plot(f, c='summer') # use a colormap # red dots are shown where the function does not exist (y>x): def f(x, y): return sin(3*x) * log(x-y)/3 f2 = plot(f, texture=dataurl+'textures/paper3.jpg') # specify x and y ranges and z vertical limits: def f(x, y): return log(x**2+y**2-1) f3 = plot( f, xlim=[-2,2], ylim=[-1,8], zlim=[-1,None], texture=dataurl+'textures/paper1.jpg', ) show([(f1, 'y = sin(2*x*y) * cos(3*y) /2', doc), (f2, 'y = sin(3*x)*log(x-y)/3'), (f3, 'y = log(x**2+y**2-1)'), ], N=3, sharecam=False, ).close() ############################################################## COMPLEX comment = """Vertical axis shows the real part of complex z: z = sin(log(x:doty)) Color map the value of the imaginary part (green=positive, purple=negative)""" plt = plot(lambda x,y: sin(log(x*y))/25, mode='complex', bins=(51,51)) show(plt, comment, viewup='z').close() vedo-2023.4.6/examples/pyplot/plot_hexcells.py000066400000000000000000000012641444463326400213060ustar00rootroot00000000000000"""3D Bar plot of a TOF camera with hexagonal pixels""" from vedo import * import numpy as np settings.default_font = "Glasgo" settings.use_parallel_projection = True vals = np.abs(np.random.randn(4*6)) # pixel heights cols = color_map(vals, "summer") k = 0 items = [__doc__] for i in range(4): for j in range(6): val, col= vals[k], cols[k] x, y, z = [i+j%2/2, j/1.155, val+0.01] zbar= Polygon([x,y,0], nsides=6, r=0.55, c=col).extrude(val) line= Polygon([x,y,z], nsides=6, r=0.55, c='k').wireframe().lw(2) txt = Text3D(f"{i}/{j}", [x,y,z], s=.15, c='k', justify='center') items += [zbar, line, txt] k += 1 show(items, axes=7) vedo-2023.4.6/examples/pyplot/plot_multi.py000066400000000000000000000010311444463326400206210ustar00rootroot00000000000000"""Use of plot() function analogous to matplotlib""" from vedo import * from vedo.pyplot import plot x = np.linspace(0, 5, 10) fig1 = plot(x, x*x, 'sg-', title='Plot1: y=x*x') fig2 = plot(x, cos(x), '*r--', title='Plot2: y=cos(x)') fig3 = plot(x, sqrt(x),'Db-', title='Plot3: y=sqrt(x)') fig4 = plot(x, sin(x), '*t--', title='Plot4: y=sin(x)') # window shape can be expressed as "n/m" or "n|m" plt = show( fig1, fig2, fig3, fig4, shape="3|1", sharecam=False, size=(1300,900), zoom='tight', ) plt.interactive().close() vedo-2023.4.6/examples/pyplot/plot_pip.py000066400000000000000000000015551444463326400202720ustar00rootroot00000000000000"""Picture in picture plotting""" from vedo import np, settings, show from vedo.pyplot import plot settings.default_font = 'Theemim' def f(x): return 3*np.exp(-x)*np.cos(2*x)**2 xa = np.arange(0, 0.5, 0.01) xb = np.arange(0, 4.0, 0.01) # Build first figure: fig1 = plot( xa, f(xa), title=__doc__, xtitle='time in seconds', ytitle='Intensity [a.u.]', ) # Build second figure w/ options for axes: fig2 = plot( xb, f(xb), title='3 e^-x cos 2x**2 (wider range)', xtitle=' ', ytitle=' ', # leave empty c='red5', axes=dict( xyplane_color='#dae3f0', grid_linewidth=0, # make it solid xyalpha=1, # make it opaque text_scale=2, # make text bigger ) ) # Scale fig to make it smaller fig2.scale(0.04).shift(0.05, 0.75) fig1.insert(fig2) ############# insert show(fig1, zoom='tight').close() vedo-2023.4.6/examples/pyplot/plot_polar.py000066400000000000000000000011121444463326400206040ustar00rootroot00000000000000"A splined polar plot" from vedo import * from vedo.pyplot import plot angles = vector([ 0, 20, 60, 160, 200, 250, 300, 340]) distances = vector([0.1, 0.2, 0.3, 0.5, 0.6, 0.4, 0.2, 0.1]) dn1 = plot(angles, distances, mode='polar', deg=True, splined=True, fill=True, c='green', bc='k', alpha=0.7, title=__doc__, vmax=0.65) dn2 = plot(angles+120, distances**2, mode='polar', deg=True, splined=True, fill=True, c='red', alpha=1, vmax=0.65) dn2.z(0.01) # set a positive z so it stays in front show(dn1, dn2, zoom=1.2, bg='k9').close() vedo-2023.4.6/examples/pyplot/plot_spheric.py000066400000000000000000000013711444463326400211330ustar00rootroot00000000000000"""Surface plotting in spherical coordinates Spherical harmonic function is: Y(l=2, m=0) = 3\dotcos\^2\theta - 1 (red points are made NaN on purpose) """ from vedo import * from vedo.pyplot import plot import numpy as np def rhofunc(theta, phi): if theta < 0.2: return np.nan # make some points invalid #return cos(theta)**2 # Y(l=1 m=0) return (3*cos(theta)**2 - 1)**2 # Y(l=2 m=0) #return (5*cos(theta)**3 - 3*cos(theta))**2 # Y(l=3 m=0) # Build the plot, # return an Assembly of 3 meshes, the unit # grid sphere, the surface rho(theta, phi) and # the red Points where rho is a complex number: spl = plot(rhofunc, mode='spheric', cmap='viridis') show(spl, __doc__, axes=12, viewup='z').close() vedo-2023.4.6/examples/pyplot/plot_stream.py000066400000000000000000000011601444463326400207650ustar00rootroot00000000000000"""Plot streamlines of the 2D field: u(x,y) = -1 - x:^2 + y v(x,y) = 1 + x - y:^2 """ from vedo import Points, show from vedo.pyplot import streamplot import numpy as np # a grid with a vector field (U,V): X, Y = np.mgrid[-5:5 :15j, -4:4 :15j] U = -1 - X**2 + Y V = 1 + X - Y**2 # optionally, pick some random points as seeds: prob_pts = np.random.rand(200, 2)*8 - [4,4] sp = streamplot( X,Y, U,V, lw=0.001, # line width in abs. units direction='forward', # 'both' or 'backward' probes=prob_pts, ) pts = Points(prob_pts, r=5, c='white') show(sp, pts, __doc__, axes=1, bg='bb').close() vedo-2023.4.6/examples/pyplot/quiver.py000066400000000000000000000004001444463326400177430ustar00rootroot00000000000000"""A simple quiver plot""" from vedo import Grid, Arrows2D, show # Create displacements pts1 = Grid(s=[1.0,1.0]).points() pts2 = Grid(s=[1.2,1.2]).rotate_z(4).points() quiv = Arrows2D(pts1, pts2, c="red5") show(quiv, __doc__, axes=1, zoom=1.2).close() vedo-2023.4.6/examples/pyplot/run_all.sh000077500000000000000000000004271444463326400200620ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo ############################################# echo Press Esc at anytime to skip example echo ############################################# echo echo for f in *.py do echo "Processing $f script.." python3 $f done vedo-2023.4.6/examples/pyplot/scatter1.py000066400000000000000000000006151444463326400201660ustar00rootroot00000000000000"""A simple scatter plot""" from vedo import show from vedo.pyplot import plot import numpy as np x = np.random.randn(100) + 10 y = np.random.randn(100) * 20 + 20 fig = plot( x, y, lw=0, # do not join points with lines xtitle="variable x", ytitle="variable y", marker="*", # marker style mc="dr", # marker color ) show(fig, __doc__, zoom='tight').close() vedo-2023.4.6/examples/pyplot/scatter2.py000066400000000000000000000024401444463326400201650ustar00rootroot00000000000000# Scatter plot of a gaussian distribution # with varying color and point sizes from vedo import Text2D, Plotter from vedo.pyplot import plot import numpy as np n = 500 x = np.random.randn(n) y = np.random.randn(n) # Define what size must have each marker: marker_sizes = np.sin(2*x)/8 # Define a (r,g,b) list of colors for each marker: marker_cols = np.c_[np.cos(2*x), np.zeros(n), np.zeros(n)] txt0 = Text2D("A scatter plot of a\n2D gaussian distribution") fig0 = plot( x, y, lw=0, # no joining of lines marker="*", # marker style xtitle="variable A", ytitle="variable B", grid=False, ) txt1 = Text2D("marker size proportional to sin(2x) ") fig1 = plot( x, y, lw=0, marker="*", ms=marker_sizes, # VARIABLE marker sizes mc='purple5', # same fixed color for markers grid=False, ) txt2 = Text2D("marker size proportional to sin(2x)\nred level proportional to cos(2x)") fig2 = plot( x, y, lw=0, marker=">", ms=marker_sizes, # VARIABLE marker sizes mc=marker_cols, # VARIABLE marker colors grid=False, ) plt = Plotter(N=3, size=(1800,500)) plt.at(0).show(fig0, txt0) plt.at(1).show(fig1, txt1) plt.at(2).show(fig2, txt2, zoom=1.2) plt.interactive().close() vedo-2023.4.6/examples/pyplot/scatter3.py000066400000000000000000000017531444463326400201740ustar00rootroot00000000000000"""Create a scatter plot to overlay three different distributions""" from vedo import * from numpy.random import randn ### first cloud in blue, place it at z=0: x = randn(2000) * 3 y = randn(2000) * 2 pts1 = Points([x, y], c="blue", alpha=0.5).z(0.0) bra1 = Brace([-7, -8], [7, -8], comment="whole population", s=0.4, c="b") ### second cloud in red x = randn(1200) + 4 y = randn(1200) + 2 pts2 = Points([x, y], c="red", alpha=0.5).z(0.1) bra2 = Brace( [8, 2, 0.3], [6, 5, 0.3], comment="red zone", angle=180, justify="bottom-center", c="r", ) ### third cloud with a black marker x = randn(20) + 4 y = randn(20) - 4 mark = Marker("*", s=0.25) pts3 = Glyph([x, y], mark, c="k").z(0.2) bra3 = Brace([8, -6], [8, -2], comment="my stars").z(0.3) # some text message msg = Text3D("preliminary\nresults!", font="Quikhand", s=1.5) msg.c("black").rotate_z(20).pos(-10, 3, 0.2) show( pts1, pts2, pts3, msg, bra1, bra2, bra3, __doc__, axes=1, zoom=1.2, mode="image", ).close() vedo-2023.4.6/examples/pyplot/scatter_large.py000066400000000000000000000007651444463326400212650ustar00rootroot00000000000000"""Scatter plot of 1M points with assigned colors and transparencies. Use mouse to zoom, press r to reset, press p to increase point size. """ import time from vedo import * N = 1000000 x = np.random.rand(N) y = np.random.rand(N) RGBA = np.c_[x*255, y*255, np.zeros(N), y*255] t0 = time.time() pts = Points([x,y], r=1, c=RGBA) t1 = time.time() print("-> elapsed time:", t1-t0, "seconds for N:", N) # use mouse to zoom, press r to reset show(pts, __doc__, axes=1, mode="RubberBandZoom").close() vedo-2023.4.6/examples/pyplot/triangulate2d.py000066400000000000000000000006451444463326400212100ustar00rootroot00000000000000"""Triangulate arbitrary line contours in 2D. The contours may be concave, and even contain holes.""" from vedo import Star, merge, show # let's create two bidimensional contour lines s1 = Star(line=True, n=9) s2 = Star(line=True, n=5, r1=0.3, r2=0.4).x(0.12) # merge the 2 lines and triangulate the inner region sm = merge(s1, s2).triangulate().c('lightsalmon').lw(1) show([(s1,s2,__doc__), sm], N=2, axes=8).close() vedo-2023.4.6/examples/pyplot/whiskers.py000066400000000000000000000027041444463326400203000ustar00rootroot00000000000000"""Whisker plot with quantiles indication (horizontal line shows the mean value)""" from vedo import np, settings, Axes, Brace, Line, Ribbon, show from vedo.pyplot import whisker settings.default_font = "Theemim" # build some theoretical expectation to be shown as a grey band x = np.linspace(-1, 9, 100) y = x/5 + 0.2*np.sin(x) ye= y**2/5 + 0.1 # error on y line = Line(np.c_[x, y]) band = Ribbon(np.c_[x, y-ye], np.c_[x, y+ye]).c('black',0.1) # create 5 whisker bars with some random data ws = [] for i in range(5): xval = i*2 # position along x axis data = xval/5 + 0.2*np.sin(xval) + np.random.randn(25) w = whisker(data, bc=i, s=0.5).x(xval) ws.append(w) # print(i, 'whisker:\n', w.info) # build braces to inndicate stats significance and dosage bra1 = Brace([0, 3],[2, 3], comment='*~*', s=0.7, style='[') bra2 = Brace([4,-1],[8,-1], comment='dose > 3~:mug/kg', s=0.4) # build custom axes axes = Axes(xrange=[-1,9], yrange=[-3,5], htitle=':beta_c expression: change in time', xtitle=' ', ytitle='Level of :beta_c protein in \muM/l', x_values_and_labels=[(0,'Experiment^A\n at t=1h'), (4,'Experiment^B\n at t=2h'), (8,'Experiment^C\n at t=4h'), ], xlabel_size=0.02, xygrid=False, ) show(ws, bra1, bra2, line, band, __doc__, axes, zoom=1.3).close() vedo-2023.4.6/examples/run_all.sh000077500000000000000000000030251444463326400165300ustar00rootroot00000000000000#!/bin/bash # cd basic; ./run_all.sh; cd .. cd advanced; ./run_all.sh; cd .. cd simulations; ./run_all.sh; cd .. cd volumetric; ./run_all.sh; cd .. cd pyplot; ./run_all.sh; cd .. cd other; ./run_all.sh; cd .. # other/dolfin if python3 -c 'import pkgutil; exit(not pkgutil.find_loader("dolfin"))'; then cd other/dolfin; ./run_all.sh; cd ../.. else echo 'dolfin not found, skip.' fi # other/trimesh if python3 -c 'import pkgutil; exit(not pkgutil.find_loader("trimesh"))'; then cd other/trimesh; ./run_all.sh; cd ../.. else echo 'trimesh not found, skip.' fi ################################# command line tests echo '---------------------------- command line tests' echo vedo vedo echo '----------------------------' echo vedo ../data/2*.vtk vedo ../data/2*.vtk echo '----------------------------' echo vedo ../data/2*.vtk vedo -ni -k glossy ../data/2*.vtk echo '----------------------------' echo vedo -s "../data/2??.vtk" vedo -s ../data/2??.vtk echo '----------------------------' echo vedo ../data/embryo.tif vedo ../data/embryo.tif echo '----------------------------' echo vedo -g ../data/embryo.slc vedo -g ../data/embryo.slc echo '----------------------------' echo vedo --slicer2d ../data/embryo.tif vedo --slicer2d ../data/embryo.tif echo '----------------------------' echo vedo --slicer3d ../data/embryo.tif vedo --slicer3d ../data/embryo.tif echo '----------------------------' echo vedo --eog ../data/uv_grid.jpg vedo --eog ../data/uv_grid.jpg vedo-2023.4.6/examples/simulations/000077500000000000000000000000001444463326400171045ustar00rootroot00000000000000vedo-2023.4.6/examples/simulations/__init__.py000066400000000000000000000000031444463326400212060ustar00rootroot00000000000000# #vedo-2023.4.6/examples/simulations/airplane1.py000066400000000000000000000010541444463326400213320ustar00rootroot00000000000000"""Draw the shadow and trailing line of a moving object.""" from vedo import * world = Box(size=(30,15,8)).wireframe() airplane = Mesh(dataurl+"cessna.vtk").c("green") airplane.pos(-15, 2.0, 0.15) airplane.add_trail(n=100).add_shadow('z', -4) plt = Plotter(interactive=False) plt.show(world, airplane, __doc__, viewup="z") for t in np.arange(0, 3.2, 0.04): pos = (9*t-15, 2-t, sin(3-t)) # make up some movement airplane.pos(pos).rotate_x(t) airplane.update_trail() airplane.update_shadows() plt.render() plt.interactive().close() vedo-2023.4.6/examples/simulations/airplane2.py000066400000000000000000000015541444463326400213400ustar00rootroot00000000000000"""Draw the shadows and trailing lines of 2 planes. Not really a simulation.. just a way to illustrate how to move objects around!""" from vedo import * world = Box([0,0,0], 30, 16, 8).wireframe() plane1 = Mesh(dataurl+"cessna.vtk").c("green") plane1.pos(-15, 2, 0.15).add_trail(n=100) plane1.add_shadow('z', -4).add_shadow('y', 8) plane2 = plane1.clone().c("tomato") plane2.pos(-15,-2,-0.20).add_trail(n=100) plane2.add_shadow('z', -4).add_shadow('y', 8) # Setup the scene plt = Plotter(interactive=False) plt.show(world, plane1, plane2, __doc__, viewup="z") for t in np.arange(0, 3.2, 0.04): plane1.pos(9*t-15, 2-t, sin(3-t)).rotate_x(0+t) # make up some movement plane2.pos(8*t-15, t-2, sin(t-3)).rotate_x(2-t) # for the 2 planes plane1.update_trail().update_shadows() plane2.update_trail().update_shadows() plt.render() plt.interactive().close() vedo-2023.4.6/examples/simulations/aspring1.py000066400000000000000000000022451444463326400212050ustar00rootroot00000000000000"""Simulation of a block connected to a spring in a viscous medium""" from vedo import * L = 0.1 # spring x position at rest x0 = 0.85 # initial x-coordinate of the block k = 25 # spring constant m = 20 # block mass b = 0.5 # viscosity friction (proportional to velocity) dt = 0.15 # time step v = vector(0, 0, 0.2) # initial conditions x = vector(x0, 0, 0) x0 = vector(-0.8, 0, 0) xr = vector(L, 0, 0) def loop_func(event): global v, x F = -k * (x - xr) - b * v # force and friction a = F / m # acceleration v = v + a*dt # velocity x = x + v*dt + 1/2 * a * dt**2 # position block.pos(x) # update block position and trail spring.stretch(x0, x) # stretch helix accordingly plt.render() block = Cube(pos=x, side=0.2, c="tomato") spring = Spring(x0, x, r1=0.06, thickness=0.01) plt = Plotter(size=(1050, 600)) plt += Box(pos=(0, -0.1, 0), size=(2.0, 0.02, 0.5)) # floor plt += Box(pos=(-0.82, 0.15, 0), size=(0.04,0.50,0.3)) # wall plt += [block, spring, __doc__] plt.add_callback("timer", loop_func) plt.timer_callback("start") plt.show().close() vedo-2023.4.6/examples/simulations/aspring2_player.py000066400000000000000000000030421444463326400225560ustar00rootroot00000000000000"""Animation of a block attached to a spring""" from vedo import * from vedo.applications import AnimationPlayer L = 0.1 # spring x position at rest x0 = 0.85 # initial x-coordinate of the block k = 20 # spring constant m = 20 # block mass b = 5 # viscosity friction (proportional to velocity) dt = 0.15 # time step v = vector(0, 0, 0.3) # initial conditions x = vector(x0, 0, 0) xr = vector(L, 0, 0) x0 = vector(-0.8, 0, 0) # Pre-compute the trajectory of the block and store it in a list. history_x = [] for i in range(200): F = -k * (x - xr) - b * v # force and friction a = F / m # acceleration v = v + a * dt # velocity x = x + v * dt + 1/2 * a * dt**2 # position history_x.append(x) # Create the objects to be shown in the animation floor = Box(pos=(0, -0.1, 0), size=(2.0, 0.02, 0.5), c='yellow2') wall = Box(pos=(-0.82, 0.15, 0), size=(0.04, 0.50, 0.3), c='yellow2') block = Cube(pos=x, side=0.2, c="tomato") spring= Spring(x0, x, r1=0.05, thickness=0.005) text = Text2D(font="Calco", c='white', bg='k', alpha=1, pos='top-right') # Create the animation player and it's callback function def update_scene(i: int): # update block and spring position at frame i block.pos(history_x[i]) spring.stretch(x0, history_x[i]) text.text(f"Frame number {i}\nx = {history_x[i][0]:.4f}") plt.render() plt = AnimationPlayer(update_scene, irange=[0,200], loop=True) plt += [floor, wall, block, spring, text, __doc__] plt.set_frame(0) plt.show() plt.close() vedo-2023.4.6/examples/simulations/brownian2d.py000066400000000000000000000107641444463326400215330ustar00rootroot00000000000000"""Simple demo to illustrate the motion of a Big brownian particle in a swarm of small particles in 2D motion. The spheres collide elastically with themselves and with the walls of the box. The masses of the spheres are proportional to their radius**3 (as in 3D)""" # Adapted by M. Musy from E. Velasco (2009) from vedo import Plotter, progressbar, dot, Grid, Sphere, Point import random import numpy as np print(__doc__) screen_w = 800 screen_h = 800 plt = Plotter(size=(screen_w, screen_h), axes=0, interactive=0) # Constants and time step Nsp = 200 # Number of small spheres Rb = screen_w / 32 # Radius of the big sphere Rs = Rb * 0.43 # Radius of small spheres Ms = (Rs / Rb) ** 3 # Mass of the small spheres (Mbig=1) Dt = 0.03 # Time step LBox = (screen_w / 2, screen_h / 2) # Size of the box = 2LBox[0].2LBox[1] Lb0 = LBox[0] - Rb Lb1 = LBox[1] - Rb Ls0 = LBox[0] - Rs Ls1 = LBox[1] - Rs # Create the arrays with the initial positions of the spheres. # Start with the big sphere at the center, then put the small # spheres at random selected from a grid of possible positions. ListPos = [(0, 0)] PossiblePos = [ (x, y) for x in np.arange(-LBox[0] + 2 * Rs, LBox[0] - 2 * Rs, 2.2 * Rs) for y in np.arange(-LBox[1] + 2 * Rs, LBox[1] - 2 * Rs, 2.2 * Rs) if x * x + y * y > Rb + Rs ] if Nsp > len(PossiblePos) + 1: Nsp = len(PossiblePos) + 1 for s in range(Nsp - 1): n = random.randint(0, len(PossiblePos) - 1) ListPos.append(PossiblePos[n]) del PossiblePos[n] Pos = np.array(ListPos) # Create an array with all the radius and a list with all the masses Radius = np.concatenate((np.array([Rb]), np.array([Rs] * (Nsp - 1)))) Mass = [1.0] + [Ms] * (Nsp - 1) # Create the initial array of velocities at random with big sphere at rest ListVel = [(0.0, 0.0)] for s in range(1, Nsp): ListVel.append((Rb * random.uniform(-1, 1), Rb * random.uniform(-1, 1))) Vel = np.array(ListVel) # Create the spheres Spheres = [Sphere(pos=(Pos[0][0], Pos[0][1], 0), r=Radius[0], c="red", res=12).phong()] for s in range(1, Nsp): a = Sphere(pos=(Pos[s][0], Pos[s][1], 0), r=Radius[s], c="blue", res=6).phong() Spheres.append(a) plt += Spheres plt += Grid(s=[screen_w,screen_w]) plt.show() # Auxiliary variables Id = np.identity(Nsp) Dij = (Radius + Radius[:, np.newaxis]) ** 2 # Matrix Dij=(Ri+Rj)**2 # The main loop for i in progressbar(1000, c="r"): # Update all positions np.add(Pos, Vel * Dt, Pos) # Fast version of Pos = Pos + Vel*Dt # Impose the bouncing at the walls if Pos[0, 0] <= -Lb0: Pos[0, 0] = -Lb0 Vel[0, 0] = -Vel[0, 0] elif Pos[0, 0] >= Lb0: Pos[0, 0] = Lb0 Vel[0, 0] = -Vel[0, 0] elif Pos[0, 1] <= -Lb1: Pos[0, 1] = -Lb1 Vel[0, 1] = -Vel[0, 1] elif Pos[0, 1] >= Lb1: Pos[0, 1] = Lb1 Vel[0, 1] = -Vel[0, 1] for s in range(1, Nsp): if Pos[s, 0] <= -Ls0: Pos[s, 0] = -Ls0 Vel[s, 0] = -Vel[s, 0] elif Pos[s, 0] >= Ls0: Pos[s, 0] = Ls0 Vel[s, 0] = -Vel[s, 0] elif Pos[s, 1] <= -Ls1: Pos[s, 1] = -Ls1 Vel[s, 1] = -Vel[s, 1] elif Pos[s, 1] >= Ls1: Pos[s, 1] = Ls1 Vel[s, 1] = -Vel[s, 1] # Create the set of all pairs and the list the colliding spheres Rij = Pos - Pos[:, np.newaxis] Mag2ij = np.add.reduce(Rij * Rij, -1) # sphere-to-sphere distances**2 colliding = np.less_equal(Mag2ij, Dij) - Id hitlist = np.sort(np.nonzero(colliding.flat)[0]).tolist() # Check to see if the spheres are colliding for ij in hitlist: s1, s2 = divmod(ij, Nsp) # decode the spheres pair (s1,s2) colliding hitlist.remove(s2 * Nsp + s1) # remove symmetric (s2,s1) pair from list R12 = Pos[s2] - Pos[s1] nR12 = np.linalg.norm(R12) d12 = Radius[s1] + Radius[s2] - nR12 tau = R12 / nR12 DR0 = d12 * tau x1 = Mass[s1] / (Mass[s1] + Mass[s2]) x2 = 1 - x1 # x2 = Mass[s2]/(Mass[s1]+Mass[s2]) Pos[s1] -= x2 * DR0 Pos[s2] += x1 * DR0 DV0 = 2 * dot(Vel[s2] - Vel[s1], tau) * tau Vel[s1] += x2 * DV0 Vel[s2] -= x1 * DV0 # Update the location of the spheres for s in range(Nsp): Spheres[s].pos([Pos[s][0], Pos[s][1], 0]) if not int(i) % 10: # every ten steps: rsp = [Pos[0][0], Pos[0][1], 0] rsv = [Vel[0][0], Vel[0][1], 0] plt += Point(rsp, c="r", r=5, alpha=0.1) # leave a point trace plt.render() # render scene plt.interactive().close() vedo-2023.4.6/examples/simulations/doubleslit.py000066400000000000000000000041151444463326400216250ustar00rootroot00000000000000"""Simulation of the double slit experiment. (Any number of slits of any geometry can be added) Slit sources are placed on the plane shown as a thin grid""" # Can simulate the 'Arago spot', the bright point at the center of # a circular object shadow (https://en.wikipedia.org/wiki/Arago_spot). import numpy as np from vedo import * ######################################### lambda1 = 680e-9 # red wavelength 680nm width = 10e-6 # slit width in m D = 0.1 # screen distance in m ######################################### # create the slits as a set of individual coherent point-like sources n = 10 # nr of elementary sources in slit (to control precision). slit1 = list(zip([0]*n, np.arange(0,n)*width/n, [0]*n)) # source points inside slit1 slit2 = list(slit1 + np.array([1e-5, 0, 0])) # a shifted copy of slit 1 slits = slit1 + slit2 # slits += list(slit1 + array([-2e-5, 1e-5, 0])) # add another copy of slit1 # slits = [(cos(x)*4e-5, sin(x)*4e-5, 0) for x in arange(0,2*np.pi, .1)] # Arago spot # slits = Grid(s=[1e-4,1e-4], res=[9,9]).points() # a square lattice plt = Plotter(title="The Double Slit Experiment", axes=9, bg="black") screen = Grid(pos=[0, 0, -D], s=[0.1,0.1], lw=0, res=[200,50]).wireframe(False) # Compute the image on the far screen k = 0.0 + 1j * 2 * np.pi / lambda1 # complex wave number norm = len(slits) * 5e5 amplitudes = [] screen_pts = screen.points() for i, x in enumerate(screen_pts): psi = 0 for s in slits: r = mag(x - s) psi += np.exp(k * r) / r psi2 = np.real(psi * np.conj(psi)) # psi squared amplitudes.append(psi2) screen_pts[i] = x + [0, 0, psi2 / norm] screen.points(screen_pts).cmap("hot", amplitudes) plt += [screen, __doc__] plt += Points(np.array(slits) * 200, c="w") # slits scale magnified by factor 200 plt += Grid(s=[0.1,0.1], res=[6,6], c="w", alpha=0.1) plt += Line([0, 0, 0], [0, 0, -D], c="w", alpha=0.1) plt += Text3D("source plane", pos=[-0.04, -0.05, 0], s=0.002, c="gray") plt += Text3D("detector plane D = "+str(D)+" m", pos=[-.04,-.05,-D+.001], s=.002, c="gray") plt.show(zoom=1.1).close() vedo-2023.4.6/examples/simulations/drag_chain.py000066400000000000000000000013211444463326400215320ustar00rootroot00000000000000"""Forward kinematics: hover the mouse to drag the chain""" from vedo import Plotter, versor, Plane, Line n = 15 # number of points l = 3 # length of one segment def func(evt): if not evt.actor: return coords = line.points() coords[0] = evt.picked3d for i in range(1, n): v = versor(coords[i] - coords[i-1]) coords[i] = coords[i-1] + v * l line.points(coords) # update positions nodes.points(coords) plt.render() surf = Plane(s=[60, 60]) line = Line([l*n/2, 0], [-l*n/2, 0], res=n, lw=12) nodes= line.clone().c('red3').point_size(15) plt = Plotter() plt.add_callback("on mouse move please call", func) plt.show(surf, line, nodes, __doc__, zoom=1.3) plt.close() vedo-2023.4.6/examples/simulations/gas.py000066400000000000000000000116071444463326400202350ustar00rootroot00000000000000"""A model of an ideal gas with hard-sphere collisions""" ## Based on gas.py by Bruce Sherwood for a cube as a container ## Slightly modified by Andrey Antonov for a torus. ## Adapted by M. Musy for vedo ## relevant points in the code are marked with '### <--' from random import random import numpy as np from vedo import Plotter, progressbar, mag, versor, Torus, Sphere from vedo.addons import ProgressBarWidget ############################################################# Natoms = 400 # change this to have more or fewer atoms Nsteps = 150 # nr of steps in the simulation Matom = 4e-3 / 6e23 # helium mass Ratom = 0.025 # wildly exaggerated size of helium atom RingThickness = 0.3 # thickness of the toroid RingRadius = 1 k = 1.4e-23 # Boltzmann constant T = 300 # room temperature dt = 1.5e-5 ############################################################ def reflection(p, pos): n = versor(pos) return np.dot(np.identity(3) - 2 * n * n[:, np.newaxis], p) plt = Plotter(title="gas in toroid", interactive=0, axes=0) plt += __doc__ plt += Torus(c="g", r1=RingRadius, r2=RingThickness, alpha=0.1).wireframe(1) ### <-- Atoms = [] poslist = [] plist, mlist, rlist = [], [], [] mass = Matom * Ratom ** 3 / Ratom ** 3 pavg = np.sqrt(2.0 * mass * 1.5 * k * T) # average kinetic energy p**2/(2mass) = (3/2)kT for i in range(Natoms): alpha = 2 * np.pi * random() x = RingRadius * np.cos(alpha) * 0.9 y = RingRadius * np.sin(alpha) * 0.9 z = 0 atm = Sphere(pos=(x, y, z), r=Ratom, c=i, res=6).phong() plt += atm Atoms = Atoms + [atm] ### <-- theta = np.pi * random() phi = 2 * np.pi * random() px = pavg * np.sin(theta) * np.cos(phi) py = pavg * np.sin(theta) * np.sin(phi) pz = pavg * np.cos(theta) poslist.append((x, y, z)) plist.append((px, py, pz)) mlist.append(mass) rlist.append(Ratom) pos = np.array(poslist) poscircle = pos p = np.array(plist) m = np.array(mlist) m.shape = (Natoms, 1) radius = np.array(rlist) r = pos - pos[:, np.newaxis] # all pairs of atom-to-atom vectors ds = (p / m) * (dt / 2.0) if "False" not in np.less_equal(mag(ds), radius).tolist(): pos = pos + (p / mass) * (dt / 2.0) # initial half-step pbw = ProgressBarWidget(Nsteps) plt += pbw plt.show() for it in range(Nsteps): # Update all positions ds = mag((p / m) * (dt / 2.0)) if "False" not in np.less_equal(ds, radius).tolist(): pos = pos + (p / m) * dt r = pos - pos[:, np.newaxis] # all pairs of atom-to-atom vectors rmag = np.sqrt(np.sum(np.square(r), -1)) # atom-to-atom scalar distances hit = np.less_equal(rmag, radius + radius[:, None]) - np.identity(Natoms) hitlist = np.sort(np.nonzero(hit.flat)[0]).tolist() # i,j encoded as i*Natoms+j # If any collisions took place: for ij in hitlist: i, j = divmod(ij, Natoms) # decode atom pair hitlist.remove(j * Natoms + i) # remove symmetric j,i pair from list ptot = p[i] + p[j] mi = m[i, 0] mj = m[j, 0] vi = p[i] / mi vj = p[j] / mj ri = Ratom rj = Ratom a = mag(vj - vi) ** 2 if a == 0: continue # exactly same velocities b = 2 * np.dot(pos[i] - pos[j], vj - vi) c = mag(pos[i] - pos[j]) ** 2 - (ri + rj) ** 2 d = b ** 2 - 4.0 * a * c if d < 0: continue # something wrong; ignore this rare case deltat = (-b + np.sqrt(d)) / (2.0 * a) # t-deltat is when they made contact pos[i] = pos[i] - (p[i] / mi) * deltat # back up to contact configuration pos[j] = pos[j] - (p[j] / mj) * deltat mtot = mi + mj pcmi = p[i] - ptot * mi / mtot # transform momenta to cm frame pcmj = p[j] - ptot * mj / mtot rrel = versor(pos[j] - pos[i]) pcmi = pcmi - 2 * np.dot(pcmi, rrel) * rrel # bounce in cm frame pcmj = pcmj - 2 * np.dot(pcmj, rrel) * rrel p[i] = pcmi + ptot * mi / mtot # transform momenta back to lab frame p[j] = pcmj + ptot * mj / mtot pos[i] = pos[i] + (p[i] / mi) * deltat # move forward deltat in time pos[j] = pos[j] + (p[j] / mj) * deltat # Bounce off the boundary of the torus for j in range(Natoms): poscircle[j] = versor(pos[j]) * RingRadius * [1, 1, 0] outside = np.greater_equal(mag(poscircle - pos), RingThickness - 2 * Ratom) for k in range(len(outside)): if outside[k] == 1 and np.dot(p[k], pos[k] - poscircle[k]) > 0: p[k] = reflection(p[k], pos[k] - poscircle[k]) # then update positions of display objects for l in range(Natoms): Atoms[l].pos(pos[l]) ### <-- outside = np.greater_equal(mag(pos), RingRadius + RingThickness) pbw.update() # update progress bar plt.render().reset_camera().azimuth(0.5) ### <-- plt.interactive().close() vedo-2023.4.6/examples/simulations/grayscott.py000066400000000000000000000055111444463326400214770ustar00rootroot00000000000000# ----------------------------------------------------------------------------- # From Numpy to Python # Copyright (2017) Nicolas P. Rougier - BSD license # More information at https://github.com/rougier/numpy-book # https://www.labri.fr/perso/nrougier/from-python-to-numpy/code/gray_scott.py # Parameters from http://www.aliensaint.com/uo/java/rd # Adapted for vedo by Marco Musy (2020) # ----------------------------------------------------------------------------- """Grey-Scott reaction-diffusion system""" import numpy as np from vedo import Plotter, Grid # --------------------------------------------------------------- Nsteps = 300 n = 200 # grid subdivisions #Du, Dv, F, k, name = 0.16, 0.08, 0.035, 0.065, 'Bacteria 1' #Du, Dv, F, k, name = 0.14, 0.06, 0.035, 0.065, 'Bacteria 2' #Du, Dv, F, k, name = 0.16, 0.08, 0.060, 0.062, 'Coral' #Du, Dv, F, k, name = 0.19, 0.05, 0.060, 0.062, 'Fingerprint' #Du, Dv, F, k, name = 0.10, 0.10, 0.018, 0.050, 'Spirals' #Du, Dv, F, k, name = 0.12, 0.08, 0.020, 0.050, 'Spirals Dense' #Du, Dv, F, k, name = 0.10, 0.16, 0.020, 0.050, 'Spirals Fast' #Du, Dv, F, k, name = 0.16, 0.08, 0.020, 0.055, 'Unstable' #Du, Dv, F, k, name = 0.16, 0.08, 0.050, 0.065, 'Worms 1' #Du, Dv, F, k, name = 0.16, 0.08, 0.054, 0.063, 'Worms 2' Du, Dv, F, k, name = 0.16, 0.08, 0.035, 0.060, 'Zebrafish' # --------------------------------------------------------------- Z = np.zeros((n+2, n+2), [('U', np.double), ('V', np.double)]) U, V = Z['U'], Z['V'] u, v = U[1:-1, 1:-1], V[1:-1, 1:-1] r = 20 u[...] = 1.0 U[n//2-r:n//2+r, n//2-r:n//2+r] = 0.50 V[n//2-r:n//2+r, n//2-r:n//2+r] = 0.25 u += 0.05*np.random.uniform(-1, 1, (n, n)) v += 0.05*np.random.uniform(-1, 1, (n, n)) sy, sx = V.shape grd = Grid(s=[sx,sy], res=[sx,sy]) grd.linewidth(0).wireframe(False).lighting(ambient=0.5) formula = r'(u,v)=(D_u\cdot\Delta u -u v v+F(1-u), D_v\cdot\Delta v +u v v -(F+k)v)' print('Du, Dv, F, k, name =', Du, Dv, F, k, name) plt = Plotter(bg='linen') def loop_func(event): global u, v for i in range(25): Lu = ( U[0:-2, 1:-1] + U[1:-1, 0:-2] - 4*U[1:-1, 1:-1] + U[1:-1, 2:] + U[2: , 1:-1]) Lv = ( V[0:-2, 1:-1] + V[1:-1, 0:-2] - 4*V[1:-1, 1:-1] + V[1:-1, 2:] + V[2: , 1:-1]) uvv = u*v*v u += Du*Lu - uvv + F*(1-u) v += Dv*Lv + uvv - (F+k)*v grd.cmap('ocean_r', V.ravel(), on='cells', name="escals") grd.map_cells_to_points() # interpolate cell data to point data newpts = grd.points() newpts[:,2] = grd.pointdata['escals']*25 # assign z elevation grd.points(newpts) # set the new points plt.render() plt.add_callback("timer", loop_func) plt.timer_callback("start") plt.show(grd, __doc__, zoom=1.25, elevation=-30) plt.close() vedo-2023.4.6/examples/simulations/gyroscope1.py000066400000000000000000000046101444463326400215520ustar00rootroot00000000000000"""Simulation of a gyroscope hanging from a spring""" # (adapted by M. Musy from Bruce Sherwood, 2009) from vedo import * # ############################################################ parameters dt = 0.005 # time step ks = 15 # spring stiffness Lrest = 1 # unstretched length of spring Ls = 1 # length of gyroscope shaft M = 1 # mass of gyroscope (massless shaft) R = 0.4 # radius of gyroscope rotor omega = 50 # angular velocity of rotor (rad/s, not shown) gpos = vector(0, 0, 0) # initial position of spring free end # ############################################################ inits top = vector(0, 2, 0) # where top of spring is held precess = vector(0, 0, 0) # initial momentum of center of mass Fgrav = vector(0, -M * 9.81, 0) gaxis = vector(0, 0, 1) # initial orientation of gyroscope gaxis = versor(gaxis) I = 1 / 2 * M * R ** 2 # moment of inertia of gyroscope Lrot = I * omega * gaxis # angular momentum cm = gpos + 0.5 * Ls * gaxis # center of mass of shaft # ############################################################ the scene plt = Plotter() plt += __doc__ shaft = Cylinder([[0, 0, 0], Ls * gaxis], r=0.03, c="dg") rotor = Cylinder([(Ls - 0.55) * gaxis, (Ls - 0.45) * gaxis], r=R, c="t") bar = Cylinder([Ls*gaxis/2-R*vector(0,1,0), Ls*gaxis/2+R*vector(0,1,0)], r=R/6, c="r") gyro = shaft + rotor + bar # group meshes into a single one of type Assembly spring = Spring(top, gpos, r1=0.06, thickness=0.01, c="gray") plt += [gyro, spring] # add it to Plotter. plt += Box(top, length=0.2, width=0.02, height=0.2, c="gray") plt += Box(pos=(0, 0.5, 0), length=2.6, width=3, height=2.6, c="gray", alpha=0.2).wireframe() # ############################################################ the physics def loop_func(event): global t, Lrot, precess, cm, gpos t += dt Fspring = -ks * versor(gpos - top) * (mag(gpos - top) - Lrest) torque = cross(-1/2 * Ls * versor(Lrot), Fspring) # torque about center of mass Lrot += torque * dt precess += (Fgrav + Fspring) * dt # momentum of center of mass cm += (precess / M) * dt gpos = cm - 1/2 * Ls * versor(Lrot) # set orientation along gaxis and rotate it around its axis by omega*t degrees gyro.orientation(Lrot, rotation=omega*t, rad=True).pos(gpos) spring.stretch(top, gpos) plt.render() t = 0 plt.add_callback("timer", loop_func) plt.timer_callback("start") plt.show().close() vedo-2023.4.6/examples/simulations/gyroscope2.py000066400000000000000000000055201444463326400215540ustar00rootroot00000000000000"""A gyroscope sitting on a pedestal. The analysis is in terms of Lagrangian mechanics. The Lagrangian variables are polar angle theta, azimuthal angle phi, and spin angle psi""" # (adapted from http://www.glowscript.org) from vedo import * # ############################################################ parameters dt = 3e-03 # time step Lshaft = 1 # length of gyroscope shaft M = 1 # mass of gyroscope (massless shaft) R = 0.4 # radius of gyroscope rotor theta = 1.3 # initial polar angle of shaft (from vertical) psidot = -40 # spinning angular velocity (rad/s) phidot = 0 # (try -1 and +1 to get first and second pattern) # ############################################################ g, r = 9.81, Lshaft / 2 I3 = 1 / 2 * M * R ** 2 # moment of inertia, I, of gyroscope about its own axis I1 = M * r ** 2 + 1 / 2 * I3 # I about a line through the support, perpendicular to axis phi = psi = thetadot = 0 x = vector(theta, phi, psi) # Lagrangian coordinates v = vector(thetadot, phidot, psidot) # ############################################################ the scene plt = Plotter() plt += __doc__ shaft = Cylinder([[0, 0, 0], [Lshaft, 0, 0]], r=0.03, c="dg") rotor = Cylinder([[Lshaft / 2.2, 0, 0], [Lshaft / 1.8, 0, 0]], r=R).texture(dataurl+'textures/white.jpg') base = Sphere([0, 0, 0], c="dg", r=0.03) tip = Sphere([Lshaft, 0, 0], c="dg", r=0.03) gyro = shaft + rotor + base + tip # group relevant meshes into single one of type Assembly plt += gyro # add it to Plotter list pedestal = Box([0, -0.63, 0], height=0.1, length=0.1, width=1).texture(dataurl+'textures/wood1.jpg') pedbase = Box([0, -1.13, 0], height=0.5, length=0.5, width=0.05).texture(dataurl+'textures/wood1.jpg') pedpin = Pyramid([0, -0.08, 0], axis=[0, 1, 0], s=0.05, height=0.12).texture(dataurl+'textures/wood1.jpg') formulas = Picture(dataurl+"images/gyro_formulas.png").alpha(0.9) formulas.scale(0.0035).pos(-1.4, -1.1, -1.1) plt += [pedestal + pedbase + pedpin + formulas] # ############################################################ the physics def loop_func(event): global t, v, x t += dt st, ct, sp, cp = sin(x[0]), cos(x[0]), sin(x[1]), cos(x[1]) thetadot, phidot, psidot = v # unpack atheta = st*ct * phidot**2 + (M*g*r*st - I3*(psidot + phidot*ct) * phidot*st)/I1 aphi = I3/I1 * (psidot + phidot * ct) * thetadot/st - 2 * ct * thetadot * phidot/st apsi = phidot * thetadot * st - aphi * ct a = vector(atheta, aphi, apsi) v += a * dt # update velocities x += v * dt # update Lagrangian coordinates gaxis = (Lshaft + 0.03) * vector(st * sp, ct, st * cp) # set orientation along gaxis and rotate it around its axis by psidot*t degrees gyro.orientation(gaxis, rotation=psidot * t, rad=True) plt.add(Point(gaxis, r=3, c="red4")).render() t = 0 plt.add_callback("timer", loop_func) plt.timer_callback("start") plt.show().close() vedo-2023.4.6/examples/simulations/hanoi3d.py000066400000000000000000000041011444463326400207770ustar00rootroot00000000000000"""Demo to show how to solve the Tower of Hanoi""" # Credits: # https://github.com/gjbex/training-material/blob/master/Misc/Notebooks/hanoi.ipynb # Creative Commons Zero v1.0 Universal licence from vedo import Plotter, Cylinder, Box from copy import deepcopy class Hanoi: def __init__(self, nr_disks): self._nr_disks = nr_disks self._towers = [list(range(nr_disks, 0, -1)), list(), list()] @property def nr_disks(self): return self._nr_disks @property def nr_moves(self): return 2**self.nr_disks - 1 @property def towers(self): return deepcopy(self._towers) def tower(self, n): return self._towers[n].copy() def move_disk(self, from_tower, to_tower): disk = self._towers[from_tower].pop() self._towers[to_tower].append(disk) return disk, from_tower, to_tower def move_disks(self, n, from_tower, to_tower): if n == 1: yield self.move_disk(from_tower, to_tower) else: helper = 3 - from_tower - to_tower yield from self.move_disks(n - 1, from_tower, helper) yield self.move_disk(from_tower, to_tower) yield from self.move_disks(n - 1, helper, to_tower) def moves(self): yield from self.move_disks(self.nr_disks, 0, 1) nr_disks = 5 hanoi = Hanoi(nr_disks) tower_states = list([hanoi.towers]) for _ in hanoi.moves(): tower_states.append(hanoi.towers) disks = { hanoi.nr_disks - i : Cylinder(r=0.2*(hanoi.nr_disks-i+1), c=i) for i in range(hanoi.nr_disks) } plt = Plotter(interactive=False, size=(800, 600), bg='wheat', bg2='lb') plt += list(disks.values()) plt += Box(pos=(3,0,-0.5), size=(12,4,0.1)) cam = dict( pos=(14.60, -20.56, 7.680), focal_point=(3.067, 0.5583, 1.910), viewup=(-0.1043, 0.2088, 0.9724), ) plt.show(camera=cam) for t in range(len(tower_states)): state = tower_states[t] for tower_nr in range(3): for i, disk in enumerate(state[tower_nr]): disks[disk].pos([3 * tower_nr, 0, i+0.5]) plt.render() plt.interactive().close() vedo-2023.4.6/examples/simulations/koch_fractal.py000066400000000000000000000017421444463326400221020ustar00rootroot00000000000000"""Koch snowflake fractal""" from vedo import sqrt, Line, show levels = 7 def koch(level): # Compute Koch fractal contour points k = sqrt(3)/2 if level: points = koch(level-1) + [(0, 0)] # recursion! kpts = [] for i in range(len(points)-1): p1, p2 = points[i], points[i+1] dx, dy = (p2[0]-p1[0])/3, (p2[1]-p1[1])/3 pa = (p1[0] + dx , p1[1] + dy ) pb = (p1[0] + dx*2, p1[1] + dy*2) z = complex(pb[0]-pa[0], pb[1]-pa[1]) * (0.5-k*1j) p3 = (pa[0]+z.real, pa[1]+z.imag) kpts += [p1, pa, p3, pb] return kpts return [(0, 0), (1, 0), (0.5, k)] kochs = [] for i in range(levels): # Create a Line from the points and mesh the inside with minimum resolution kmsh = Line(koch(i)).generate_mesh(mesh_resolution=1).z(-i/1000) kmsh.lw(0).color(-i) kochs.append(kmsh) show(kochs, __doc__+ f"\nlevels: {levels}\npoints: {kmsh.npoints}", bg2='lb').close() vedo-2023.4.6/examples/simulations/lorenz.py000066400000000000000000000021171444463326400207700ustar00rootroot00000000000000"""The Lorenz attractor is a set of chaotic solutions of a particular system of ordinary differential equations""" from vedo import * p = (25, -10, -7) # starting point (initial condition) dt = 0.01 # time step # Define the ODE system to integrate (Lorenz equations) pts, vel = [], [] for t in np.arange(0, 20, dt): x, y, z = p v = np.array([-8/3*x+y*z, -10*(y-z), -y*x+28*y-z]) p = p + v * dt pts.append(p) vel.append(mag(v)) # Plot the trajectory in 3D space line = Line(pts).lw(2).cmap("winter", vel).add_scalarbar("speed") line.add_shadow("x", 3, alpha=0.2) line.add_shadow("z", -25, alpha=0.2) pt = Point(pts[0], c="red4", r=12).add_trail(lw=4) def loop_func(event): global i if i < len(pts): pt.pos(pts[i]).update_trail() # move the point plt.render() i += 1 else: plt.timer_callback("stop", tid) # stop the timer i = 0 plt = Plotter(axes=dict(xygrid=False)) plt.show(line, pt, __doc__, viewup="z", interactive=False) plt.add_callback("timer", loop_func) tid = plt.timer_callback("start") plt.interactive().close() vedo-2023.4.6/examples/simulations/mag_field1.py000066400000000000000000000041101444463326400214420ustar00rootroot00000000000000"""Drag the red points to modify the wire path Press "b" to compute the magnetic field""" import numpy as np from vedo import settings, mag, utils from vedo import Arrows, Points, StreamLines, Axes, Plotter, Text2D, Circle def func(evt): if evt.keypress != "b": return txt.text("..computing field in space, please wait!") txt.c('red5').background('yellow7') plt.render() pts = sptool.spline().points() # extract the current spline field = [] for probe in probes: B = np.zeros(3) for p0,p1 in zip(pts, np.roll(pts,1, axis=0)): p = (p0+p1)/2 r = mag(p-probe) B += np.cross(p1-p0, p-probe)/r**3 # Biot-Savart law B /= max(1, mag(B)) # clamp the field magnitude near the wire field.append(B) field = np.array(field) arrows = Arrows(probes, probes+field/5).c('black') txt.text(__doc__).c('black').background(None) ppts1 = Points(probes) ppts1.pointdata["BField"] = field domain = ppts1.tovolume(n=4, dims=(10,10,10)) # interpolate ppts2 = ppts1.clone() # make a copy ppts2.pointdata["BFieldIntensity"] = mag(field*255/3).astype(np.uint8) vol = ppts2.tovolume(n=4, dims=(10,10,10)).crop(back=0.5) isos = vol.isosurface(np.arange(0,250, 12)).smooth() isos.cmap("rainbow").lighting('off').alpha(0.5).add_scalarbar() isos.name = "Isosurfaces" streamlines = StreamLines( domain, probes, max_propagation=0.5, initial_step_size=0.01, direction="both", ) streamlines.c('black').linewidth(2) plt.remove("Arrows", "StreamLines", "Isosurfaces", "Axes") plt.add(arrows, streamlines, isos, Axes(streamlines)) probes = utils.pack_spheres([-2,2, -2,2, -2,2], radius=0.7) settings.use_depth_peeling = True settings.multi_samples = 0 plt = Plotter() plt.add_callback("key press", func) txt = Text2D(__doc__, font="Kanopus") plt += txt # Create a set of points in space to form a spline circle = Circle(res=8) # resolution = 8 points sptool = plt.add_spline_tool(circle, pc='red', lw=4, closed=True) plt.show().close() vedo-2023.4.6/examples/simulations/mag_field2.py000066400000000000000000000014151444463326400214500ustar00rootroot00000000000000import magpylib # pip install magpylib import numpy as np import vedo coil1 = magpylib.Collection() for z in np.linspace(-8, 8, 16): winding = magpylib.current.Loop( current=100, diameter=10, position=(0,0,z), ) coil1.add(winding) ##################### volume = vedo.Volume( dims=(41, 41, 41), spacing=(2, 2, 2), origin=(-40, -40, -40), ) # compute B-field and add as pointdata to volume volume.pointdata['B'] = coil1.getB(volume.points()) # compute field lines seeds = vedo.Disc(r1=1, r2=5.2, res=(3,12)) streamlines = vedo.StreamLines( volume, seeds, max_propagation=180, initial_step_size=0.1, direction="both", ) streamlines.cmap("RdBu_r", "B").lw(5).add_scalarbar("mT") vedo.show(streamlines, axes=1) vedo-2023.4.6/examples/simulations/multiple_pendulum.py000066400000000000000000000104171444463326400232250ustar00rootroot00000000000000import numpy as np from vedo import Plotter, mag, versor, vector from vedo import Cylinder, Spring, Box, Sphere ############## Constants N = 5 # number of bobs R = 0.3 # radius of bob (separation between bobs=1) Ks = 50 # k of springs (masses=1) g = 9.81 # gravity acceleration gamma = 0.1 # some friction Dt = 0.03 # time step # Create the initial positions and velocitites (0,0) of the bobs bob_x = [0] bob_y = [0] x_dot = np.zeros(N+1) # velocities y_dot = np.zeros(N+1) # Create the bobs for k in range(1, N + 1): alpha = np.pi / 5 * k / 10 bob_x.append(bob_x[k - 1] + np.cos(alpha) + np.random.normal(0, 0.1)) bob_y.append(bob_y[k - 1] + np.sin(alpha) + np.random.normal(0, 0.1)) plt = Plotter(title="Multiple Pendulum", bg2='ly') plt += Box(pos=(0, -5, 0), length=12, width=12, height=0.7, c="k").wireframe(1) sph = Sphere(pos=(bob_x[0], bob_y[0], 0), r=R / 2, c="gray") plt += sph bob = [sph] for k in range(1, N + 1): c = Cylinder(pos=(bob_x[k], bob_y[k], 0), r=R, height=0.3, c=k) plt += c bob.append(c) # Create the springs out of N links link = [None] * N for k in range(N): p0 = bob[k].pos() p1 = bob[k + 1].pos() link[k] = Spring(p0, p1, thickness=0.015, r1=R / 3, c="gray") plt += link[k] # Create some auxiliary variables x_dot_m = np.zeros(N+1) y_dot_m = np.zeros(N+1) dij = np.zeros(N+1) # array with distances to previous bob dij_m = np.zeros(N+1) for k in range(1, N + 1): dij[k] = mag([bob_x[k] - bob_x[k - 1], bob_y[k] - bob_y[k - 1]]) fctr = lambda x: (x - 1) / x Dt *= np.sqrt(1 / g) Dt2 = Dt / 2 # Midpoint time step DiaSq = (2 * R) ** 2 # Diameter of bob squared def loop_func(evt): global bob_x, bob_y bob_x_m = list(map((lambda x, dx: x + Dt2 * dx), bob_x, x_dot)) # midpoint variables bob_y_m = list(map((lambda y, dy: y + Dt2 * dy), bob_y, y_dot)) for k in range(1, N + 1): factor = fctr(dij[k]) x_dot_m[k] = x_dot[k] - Dt2 * (Ks * (bob_x[k] - bob_x[k - 1]) * factor + gamma * x_dot[k]) y_dot_m[k] = y_dot[k] - Dt2 * (Ks * (bob_y[k] - bob_y[k - 1]) * factor + gamma * y_dot[k] + g) for k in range(1, N): factor = fctr(dij[k + 1]) x_dot_m[k] -= Dt2 * Ks * (bob_x[k] - bob_x[k + 1]) * factor y_dot_m[k] -= Dt2 * Ks * (bob_y[k] - bob_y[k + 1]) * factor # Compute the full step variables bob_x = list(map((lambda x, dx: x + Dt * dx), bob_x, x_dot_m)) bob_y = list(map((lambda y, dy: y + Dt * dy), bob_y, y_dot_m)) for k in range(1, N + 1): dij[k] = mag([bob_x[k] - bob_x[k - 1], bob_y[k] - bob_y[k - 1]]) dij_m[k] = mag([bob_x_m[k] - bob_x_m[k - 1], bob_y_m[k] - bob_y_m[k - 1]]) factor = fctr(dij_m[k]) x_dot[k] -= Dt * (Ks * (bob_x_m[k] - bob_x_m[k - 1]) * factor + gamma * x_dot_m[k]) y_dot[k] -= Dt * (Ks * (bob_y_m[k] - bob_y_m[k - 1]) * factor + gamma * y_dot_m[k] + g) for k in range(1, N): factor = fctr(dij_m[k + 1]) x_dot[k] -= Dt * Ks * (bob_x_m[k] - bob_x_m[k + 1]) * factor y_dot[k] -= Dt * Ks * (bob_y_m[k] - bob_y_m[k + 1]) * factor # Check to see if they are colliding for i in range(1, N): for j in range(i + 1, N + 1): dist2 = (bob_x[i] - bob_x[j]) ** 2 + (bob_y[i] - bob_y[j]) ** 2 if dist2 < DiaSq: # are colliding Ddist = np.sqrt(dist2) - 2 * R tau = versor([bob_x[j] - bob_x[i], bob_y[j] - bob_y[i], 0]) DR = Ddist / 2 * tau bob_x[i] += DR[0] # DR.x bob_y[i] += DR[1] # DR.y bob_x[j] -= DR[0] # DR.x bob_y[j] -= DR[1] # DR.y Vji = vector(x_dot[j] - x_dot[i], y_dot[j] - y_dot[i]) DV = np.dot(Vji, tau) * tau x_dot[i] += DV[0] # DV.x y_dot[i] += DV[1] # DV.y x_dot[j] -= DV[0] # DV.x y_dot[j] -= DV[1] # DV.y # Update the loations of the bobs and the stretching of the springs for k in range(1, N + 1): bob[k].pos([bob_x[k], bob_y[k], 0]) link[k - 1].stretch(bob[k - 1].pos(), bob[k].pos()) plt.render() plt.add_callback("timer", loop_func) plt.timer_callback("start") plt.show().close() vedo-2023.4.6/examples/simulations/optics_base.py000066400000000000000000000262461444463326400217630ustar00rootroot00000000000000import vedo import numpy as np vedo.settings.use_depth_peeling = True ############################ class OpticalElement: # A base class def __init__(self): self.name = "OpticalElement" self.type = "undefined" self.normals = [] self._hits = [] self._hits_type = [] # +1 if ray is entering, -1 if exiting self.cellids = [] def n_at(self, wave_length): # to be overridden to implement dispersion return self.ref_index @property def hits(self): """Ray coordinates hitting this element""" return np.array(self._hits) @property def hits_type(self): """Flag +1 if ray is entering, -1 if exiting""" return np.array(self._hits_type) class Lens(vedo.Mesh, OpticalElement): """A refractive object of arbitrary shape defined by an arbitrary mesh""" def __init__(self, actor, ref_index="glass"): vedo.Mesh.__init__(self, actor.polydata(), "blue8", 0.5) OpticalElement.__init__(self) self.name = actor.name self.type = "lens" self.compute_normals(cells=True, points=False) self.lighting('off') self.normals = self.celldata["Normals"] self.ref_index = ref_index def n_at(self, wave_length): # in meters """This is where material dispersion law is implemented""" if self.ref_index == "glass": # Dispersion of a common borosilicate glass, see: # https://en.wikipedia.org/wiki/Sellmeier_equation B1 = 1.03961212 B2 = 0.231792344 C1 = 6.00069867e-03 C2 = 2.00179144e-02 l2 = (wave_length*1e+06)**2 n = np.sqrt(1 + B1 * l2/(l2-C1) + B2 * l2/(l2-C2)) return n return self.ref_index class Mirror(vedo.Mesh, OpticalElement): """A mirror surface defined by an arbitrary Mesh""" def __init__(self, actor): vedo.Mesh.__init__(self, actor.polydata(), "blue8", 0.5) OpticalElement.__init__(self) self.compute_normals(cells=True, points=True) self.name = actor.name self.type = "mirror" self.normals = self.celldata["Normals"] self.color('silver').lw(0).wireframe(False).alpha(1).phong() class Screen(vedo.Grid, OpticalElement): """A simple read out screen plane""" def __init__(self, sizex, sizey): vedo.Grid.__init__(self, res=[1,1], s=[sizex,sizey]) # self.triangulate() OpticalElement.__init__(self) self.compute_normals(cells=True, points=False) self.name = "Screen" self.type = "screen" self.normals = self.celldata["Normals"] self.color('red3').lw(2).lighting('off').wireframe(False).alpha(0.2) class Absorber(vedo.Grid, OpticalElement): """A simple non detecting absorber, not generating a hit.""" def __init__(self, sizex, sizey): vedo.Grid.__init__(self, res=[100,100], s=[sizex,sizey]) OpticalElement.__init__(self) self.compute_normals() self.name = "Absorber" self.type = "screen" self.normals = self.celldata["Normals"] self.color('k3').lw(1).lighting('default').wireframe(False).alpha(0.8) class Detector(vedo.Mesh, OpticalElement): """A detector surface defined by an arbitrary Mesh""" def __init__(self, actor): vedo.Mesh.__init__(self, actor.polydata(), "k5", 0.5) OpticalElement.__init__(self) self.compute_normals() self.name = "Detector" self.type = "screen" self.normals = self.celldata["Normals"] self.color('k9').lw(2).lighting('off').wireframe(False).alpha(1) def count(self): """Count the hits on the detector cells and store them in cell array 'Counts'.""" arr = np.zeros(self.ncells, dtype=np.uint) for cid in self.cellids: arr[cid] += 1 self.celldata["Counts"] = arr return self def integrate(self, pols): """Integrate the polarization vector and store the probability in cell array 'Probability'.""" arr = np.zeros([self.ncells, 3], dtype=float) for i, cid in enumerate(self.cellids): arr[cid] += pols[i] arr = np.power(np.linalg.norm(arr, axis=1), 2) / len(self.cellids) self.celldata["Probability"] = arr return self ################################################### class Ray: """A photon to be tracked as a ray of light. wave_length in meters (so use e.g. 450.0e-09 m = 450 nm)""" def __init__(self, origin=(0,0,0), direction=(0,0,1), wave_length=450.0e-09, phase=0, pol=(1,0,0), n=1.003): self.name = "Ray" self.p = np.asarray(origin) # current position self.v = np.asarray(direction) self.v = self.v / np.linalg.norm(self.v) self.wave_length = wave_length self.path = [self.p] self._amplitudes = [1.0] self._polarizations = [np.array(pol)] self.phase = phase self.dmax = 20 self.maxiterations = 20 self.tolerance = None # will be computed automatically self.OBBTreeTolerance = 1e-05 # None = automatic self.ref_index = n @property def amplitudes(self): """ Amplitudes/attenuations at each hit. It assumes random light polarization (natural light). """ return np.array(self._amplitudes) @property def polarizations(self): """Exact polarization vector at each hit.""" return np.array(self._polarizations) def _rotate(self, p, angle, axis): magv = np.linalg.norm(axis) if not magv: return p a = np.cos(angle / 2) b, c, d = -axis * (np.sin(angle / 2) /magv) aa, bb, cc, dd = a * a, b * b, c * c, d * d bc, ad, ac, ab, bd, cd = b * c, a * d, a * c, a * b, b * d, c * d R = np.array([ [aa + bb - cc - dd, 2 * (bc + ad), 2 * (bd - ac)], [2 * (bc - ad), aa + cc - bb - dd, 2 * (cd + ab)], [2 * (bd + ac), 2 * (cd - ab), aa + dd - bb - cc] ]) return np.dot(R, p) def _reflectance(self, r12, theta_i, theta_t, inout): """Fresnel law for probability to reflect at interface, r12=n1/n2. This can be used to compute how much of the main ray arrives at the screen. A list of amplitudes at each step is stored in ray.aplitudes. """ if inout < 0: # need to check the sign ci = np.cos(theta_i) ct = np.cos(theta_t) else: # flip ct = np.cos(theta_i) ci = np.cos(theta_t) r12 = 1 / r12 a = (r12*ci - ct) / (r12*ci + ct) # Rs b = (r12*ct - ci) / (r12*ct + ci) # Rp return (a*a + b*b)/2 # def intersect(self, element, p0,p1): # not working (but no need to) # points = element.points() # faces = element.faces() # cids = [] # for i,f in enumerate(faces): # v0,v1,v2 = points[f] # res = vedo.utils.intersection_ray_triangle(p0,p1, v0,v1,v2) # if res is not False: # if res is not None: # cids.append([res, i]) # return cids def trace(self, elements): """Trace the path of a single photon through the input list of lenses, mirrors etc.""" for element in elements: self.tolerance = element.diagonal_size()/1000. for _ in range(self.maxiterations): hits, cids = element.intersect_with_line( # faster self.p, self.p + self.v * self.dmax, return_ids=True, tol=self.OBBTreeTolerance, ) # hit_cids = self.intersect(element, self.p, self.p + self.v * self.dmax) if len(hits) == 0: break # no hits hit, cid = hits[0], cids[0] # grab the first hit, point and cell ID of the mesh d = np.linalg.norm(hit - self.p) if d < self.tolerance: # it's picking itself.. get the second hit if it exists if len(hits) < 2: break hit, cid = hits[1], cids[1] d = np.linalg.norm(hit - self.p) n = element.normals[cid] w = np.cross(self.v, n) sintheta1 = np.linalg.norm(w) theta1 = np.arcsin(sintheta1) inout = np.sign(np.dot(n, self.v)) # ray entering of exiting ref_index = self.ref_index # polarization vector k = 2*np.pi / (self.wave_length/ref_index) pol = self._polarizations[-1] amp = self._amplitudes[-1] # this assumes random polarizations hit_type = -3 if element.type == "screen": if element.name == "Wall": break pol = pol * np.cos(k * d + self.phase) elif element.type == "mirror": theta1 *= inout # mirrors must reflect on both sides self.v = self._rotate(-self.v, 2*theta1, w) pol = pol * np.cos(k * d + self.phase + np.pi) hit_type = -2 elif element.type == "lens": ref_index = element.n_at(self.wave_length) # dispersion r = ref_index/self.ref_index if inout>0 else self.ref_index/ref_index sintheta2 = r * sintheta1 # Snell law if abs(sintheta2) > 1.0: # total internal reflection self.v = self._rotate(-self.v, 2*theta1, w) pol = pol * np.cos(k * d + self.phase + np.pi) hit_type = -2 else: # refraction theta2 = np.arcsin(sintheta2) self.v = self._rotate(self.v, theta2-theta1, -w*inout) amp = amp * (1-self._reflectance(r, theta1, theta2, inout)) pol = pol * np.cos(k * d + self.phase) hit_type = -inout else: print("Unknown element type", element.type) self._amplitudes.append(amp) self._polarizations.append(pol) self.path.append(hit) element._hits.append(hit) element._hits_type.append(hit_type) element.cellids.append(cid) if element.type == "screen": break self.p = hit # update position self.path = np.array(self.path) return self def asLine(self, min_hits=1, max_hits=1000, c=None, cmap_amplitudes="", vmin=0): """Return a vedo.Line object if it has at least min_hits and less than max_hits""" if min_hits < len(self.path) < max_hits: ln = vedo.Line(self.path).lw(1) if cmap_amplitudes: ln.cmap(cmap_amplitudes, self._amplitudes, vmin=vmin) elif c is None: c = vedo.colors.color_map(self.wave_length, "jet", 450e-09, 750e-09) /1.5 ln.color(c) else: ln.color(c) return ln return None vedo-2023.4.6/examples/simulations/optics_main1.py000066400000000000000000000102451444463326400220460ustar00rootroot00000000000000import numpy as np import vedo from optics_base import Lens, Ray, Mirror, Detector, Screen # see file ./optics_base.py ###################################################################### thin lenses s = vedo.Sphere(r=2, res=50) # construct a thin lens: shape = s.boolean("intersect", s.clone().z(3.5)).z(1.4) lens = Lens(shape, ref_index=1.52).color("orange9") screen= Screen(3,3).z(5) elements = [lens, screen] source = vedo.Disc(r1=0, r2=0.7, res=4).points() # numpy 3d points lines = [Ray(pt).trace(elements).asLine() for pt in source] # list of vedo.Line vedo.show("Test of 1/f = (n-1) \dot (1/R1-1/R2) \approx 1/2", elements, lines, lens.boundaries().lw(2), azimuth=-90, zoom=1.2, size=(1100,700), axes=dict(zxgrid=True)).close() ####################################################################### dispersion s = vedo.Cone(res=4).scale([1,1,0.4]).rotate_y(-90).rotate_x(45).pos(-0.5,0,1.5) prism = Lens(s, ref_index="glass").lw(1) screen= Screen(2,2).z(6) lines = [] for wl in np.arange(450,750, 10)*1e-09: ray = Ray(direction=(-0.5,0,1), wave_length=wl) line = ray.trace([prism,screen]).asLine() lines.append(line) vedo.show("Test of chromatic dispersion", prism, screen, lines, zoom=1.5, size=(1100,700), axes=1).close() ################################################################ spherical mirrors s1 = vedo.Sphere(r=7, res=50).cut_with_plane([0,0,6],'z').cut_with_cylinder(invert=True) s2 = vedo.Sphere(r=5, res=50).cut_with_plane([0,0,-2],'-z').cut_with_cylinder().z(10) m1 = Mirror(s1) m2 = Mirror(s2) screen = Screen(5,5).z(9) elements = [m2, m1, m2, m1, screen] ## NOTE ordering! source= vedo.Disc(r1=1, r2=3, res=[20,60]).cut_with_plane().cut_with_plane(normal='y').z(1) lines = [Ray(pt).trace(elements).asLine(2) for pt in source.points()] vedo.show("Reflection from spherical mirrors", elements, lines, axes=1).close() ################################################################# parabolic mirror s = vedo.Paraboloid(res=200).cut_with_plane([0,0,-0.4], 'z').scale([1,1,0.1]).z(1) elements = [Mirror(s), Screen(0.2,0.2).z(0.35)] source= vedo.Disc(r1=.1, r2=.3, res=[10,30]).cut_with_plane().cut_with_plane(normal='y') lines = [Ray(pt).trace(elements).asLine() for pt in source.points()] vedo.show("Reflection from a parabolic mirror", elements, lines, axes=2, azimuth=-90).close() ################################################################# mesh mirror # Create the mirror from a vedo.Mesh object shape = vedo.Mesh(vedo.dataurl+"bunny.obj").fill_holes().subdivide().smooth() shape.scale(7).pos(0.1,-0.6,0).rotate_x(90) mirror = Mirror(shape).color("silver") # Create a detector surface as a quad-sphere surrounding the shape sd = vedo.Sphere(quads=1, res=12).cut_with_plane([0,-0.8,0], normal='y') detector = Detector(sd).color("white").alpha(1).lw(1) source = vedo.Grid(res=[30,30]).rotate_x(90).y(-1) lines=[] for pt in source.points(): ray = Ray(pt, direction=(0,1,0)).trace([mirror, detector]) line = ray.asLine(min_hits=2, max_hits=4) lines.append(line) detector.count().cmap("Reds", on='cells', vmax=10).add_scalarbar("Counts") vedo.show(mirror, detector, lines, "A Mesh mirror and a spherical detector", elevation=-90, axes=1, bg='bb', bg2='blue9').close() # ################################################################# interference s1 = vedo.Sphere(res=100).rotate_y(90).cut_with_plane([0,0,0.9], normal='z').y(-.5) s2 = vedo.Sphere(res=100).rotate_y(90).cut_with_plane([0,0,0.9], normal='z').y(+.5) src = vedo.merge(s1,s2).clean().compute_normals() dirs = src.pointdata["Normals"] screen= Screen(3,3).z(4) grid = vedo.Grid(res=[40,40], s=[4,4]).rotate_z(90) detector = Detector(grid).z(3.5) elements = [detector] rays, lines, pols = [], [], [] for i,pt in enumerate(src.points()): ray = Ray(pt, direction=dirs[i], wave_length=1).trace(elements) # radio waves line = ray.asLine() if not i%20: lines.append(line) pols.append(ray.polarizations[-1]) detector.integrate(pols).cmap("brg", on='cells').add_scalarbar("Prob.") vedo.show("Interference on a detector surface", s1,s2, lines, elements, zoom=1.5, size=(1100,700), elevation=180, azimuth=90, axes=1).close() vedo-2023.4.6/examples/simulations/optics_main2.py000066400000000000000000000041141444463326400220450ustar00rootroot00000000000000"""Simulation of an optical system with lenses and mirrors of arbitrary shapes and orientations (points mark the exit locations of photons, many from internal total reflection)""" import numpy as np from vedo import Grid, Sphere, Cube, Cone, Points, show from optics_base import Lens, Ray, Mirror, Screen # see file ./optics_base.py # Create meshes as ordinary vedo objects sm = Sphere(r=8).z(-8.1) sp = Sphere(r=8).z(+8.1) shape1 = Sphere(r=0.9, res=53).cut_with_plane().cap().rotate_y(-90).pos(0,0,0.5) shape2 = Cube(side=2).triangulate().boolean('-', sm).boolean("-", sp).z(3) shape3 = Cone().rotate_y(-90).z(6) shape4 = Cube().scale([1.7,1,0.2]).rotate_y(70).pos(-0.3,0,8) shape5 = Sphere(r=2).boolean("intersect", Sphere(r=2).z(3.5)).rotate_x(10).pos(0.8,0,7.5) shape6 = Grid(res=[1,1]).rotate_y(-60).rotate_x(30).pos(0,-1,11) # Build lenses (with their refractive indices), and mirrors, using those meshes lens1 = Lens(shape1, ref_index=1.35).c("blue9") # constant refr. index lens2 = Lens(shape2, ref_index="glass").c("blue7") lens3 = Lens(shape3, ref_index="glass").c("green9") lens4 = Lens(shape4, ref_index="glass").c("purple9").linewidth(1) lens5 = Lens(shape5, ref_index="glass").c("orange9") mirror= Mirror(shape6) screen= Screen(4,4).rotate_y(20).pos(1,0,12) elements = [lens1, lens2, lens3, lens4, lens5, mirror, screen] # Generate photons and trace them through the optical elements lines = [] source = Grid(res=[20,20]).points() # a numpy array for pt in source: λ = np.random.uniform(low=450, high=750)*1e-09 # nanometers ray = Ray(pt, direction=(0,0,1), wave_length=λ) line = ray.trace(elements).asLine(min_hits=4, cmap_amplitudes="Blues") # vedo.Line lines.append(line) lines = list(filter(None, lines)) # remove possible None to add a scalar bar to lines[0] lines[0].add_scalarbar("Ampl.") # Grab the coords of photons exiting the conic lens3 (hits_type==-1) cone_hits = Points(lens3.hits[lens3.hits_type==-1], r=8, c="green1") # Show everything show(__doc__, elements, lines, lens5.boundaries().lw(2), cone_hits, size=(1500,700), bg='k2', bg2='k9', zoom=2, azimuth=-90, ) vedo-2023.4.6/examples/simulations/optics_main3.py000066400000000000000000000026171444463326400220540ustar00rootroot00000000000000"""The butterfly effect with cylindrical mirrors and a laser""" # Original idea from "The Action Lab": https://www.youtube.com/watch?v=kBow0kTVn3s # from vedo import Plotter, Grid, Cylinder, merge from optics_base import Ray, Mirror, Detector # see file ./optics_base.py grid = Grid(res=[3,4]) # pick a few points in space to place cylinders pts = grid.points().tolist() + grid.cell_centers().tolist() # Create the mirror by merging many (y-scaled) cylinders into a single mesh object cyls = [Cylinder(p, r=0.065, height=0.2, res=2000).scale([1,1.5,1]) for p in pts] mirror = Mirror(merge(cyls)).color("silver") # Create a detector surface as a thin cylinder surrounding the mirror sd = Cylinder(r=1, height=0.3, cap=False).cut_with_plane([0,-0.95,0], normal='y') detector = Detector(sd) def slider(widget, event): ### callback to shift the beam along x dx = widget.value ray = Ray([dx,-1.2,-0.1], direction=(0,1,0.02)) ray.maxiterations = 1000 # max nr. of reflections ray.trace([mirror, detector]) # cumpute trajectory detector.count().cmap("Reds", on='cells', vmax=10) line = ray.asLine().linewidth(4).c('green5') plt.remove("Line").add(line) # remove the old and add the new one plt = Plotter(axes=1, bg='peachpuff', bg2='blue9') plt.add_slider(slider, -0.07, 0.07, value=0, pos=5, title="beam shift") plt.show(mirror, detector, __doc__, elevation=-30) plt.close() vedo-2023.4.6/examples/simulations/particle_simulator.py000066400000000000000000000101421444463326400233560ustar00rootroot00000000000000""" Simulate interacting charged particles in 3D space. """ # An example simulation of N particles scattering on a charged target. # See e.g. https://en.wikipedia.org/wiki/Rutherford_scattering # By Tommy Vandermolen import numpy as np from vedo import Plotter, Cube, Sphere, mag2, versor, vector K_COULOMB = 8987551787.3681764 # N*m^2/C^2 plt = None # so that it can be also used without visualization class ParticleSim: def __init__(self, dt, iterations): """ Creates a new particle simulator dt: time step, time between successive calculations of particle motion """ self.dt = dt self.particles = [] self.iterations = iterations def add_particle( self, pos=(0, 0, 0), charge=1e-6, mass=1e-3, radius=0.005, color=None, vel=(0, 0, 0), fixed=False, negligible=False, ): """ Adds a new particle with specified properties (in SI units) """ color = color or len(self.particles) # assigned or default color number p = Particle(pos, charge, mass, radius, color, vel, fixed, negligible) self.particles.append(p) def simulate(self): """ Runs the particle simulation. Simulates one time step, dt, of the particle motion. Calculates the force between each pair of particles and updates their motion accordingly """ # Main simulation loop for i in range(self.iterations): for a in self.particles: if a.fixed: continue ftot = vector(0, 0, 0) # total force acting on particle a for b in self.particles: if a.negligible and b.negligible or a == b: continue ab = a.pos - b.pos ftot += ((K_COULOMB * a.charge * b.charge) / mag2(ab)) * versor(ab) a.vel += ftot / a.mass * self.dt # update velocity and position of a a.pos += a.vel * self.dt a.vsphere.pos(a.pos) a.vsphere.update_trail() if plt: if i==0: plt.reset_camera() plt.azimuth(1) plt.render() class Particle: def __init__(self, pos, charge, mass, radius, color, vel, fixed, negligible): """ Creates a new particle with specified properties (in SI units) pos: XYZ starting position of the particle, in meters charge: charge of the particle, in Coulombs mass: mass of the particle, in kg radius: radius of the particle, in meters. No effect on simulation color: color of the particle. If None, a default color will be chosen vel: initial velocity vector, in m/s fixed: if True, particle will remain fixed in place negligible: assume charge is small wrt other charges to speed up calculation """ self.pos = vector(pos) self.radius = radius self.charge = charge self.mass = mass self.vel = vector(vel) self.fixed = fixed self.negligible = negligible self.color = color if plt: self.vsphere = Sphere(pos, r=radius, c=color).add_trail(lw=1, n=75, alpha=0.5) plt.add(self.vsphere) # Sphere representing the particle ##################################################################################################### if __name__ == "__main__": plt = Plotter(title="Particle Simulator", bg="black", axes=0, interactive=False) plt += Cube().c('w').wireframe(True).lighting('off') # a wireframe cube sim = ParticleSim(dt=1e-5, iterations=60) sim.add_particle((-0.4, 0, 0), color="w", charge=3e-6, radius=0.01, fixed=True) # the target positions = np.random.randn(500, 3) / 60 # generate a beam of particles for p in positions: p[0] = -0.5 # Fix x position. Their charge are small/negligible compared to target: sim.add_particle(p, charge=0.01e-6, mass=0.1e-6, vel=(1000, 0, 0), negligible=True) sim.simulate() plt.interactive().close() vedo-2023.4.6/examples/simulations/pendulum_3d.py000066400000000000000000000022031444463326400216720ustar00rootroot00000000000000"""Double pendulum in 3D""" # Original idea and solution using sympy from: # https://www.youtube.com/watch?v=MtG9cueB548 from vedo import * # Load the solution: x1, y1, z1, x2, y2, z2 = np.load(download(dataurl+'3Dpen.npy')) p1, p2 = np.c_[x1,y1,z1], np.c_[x2,y2,z2] ball1 = Sphere(c="green5", r=0.1, pos=p1[0]) ball2 = Sphere(c="blue5", r=0.1, pos=p2[0]) ball1.add_shadow('z', -3) ball2.add_shadow('z', -3) ball1.add_trail(n=10) ball2.add_trail(n=10) ball1.trail.add_shadow('z', -3) # make trails project a shadow too ball2.trail.add_shadow('z', -3) rod1 = Line([0,0,0], ball1, lw=4) rod2 = Line(ball1, ball2, lw=4) axes = Axes(xrange=(-3,3), yrange=(-3,3), zrange=(-3,3)) # show the solution plt = Plotter(interactive=False) plt.show(ball1, ball2, rod1, rod2, axes, __doc__, viewup='z') i = 0 for b1, b2 in zip(p1,p2): ball1.pos(b1) ball2.pos(b2) rod1.stretch([0,0,0], b1) rod2.stretch(b1, b2) ball1.update_shadows().update_trail() ball2.update_shadows().update_trail() ball1.trail.update_shadows() ball2.trail.update_shadows() plt.render() i+=1 if i > 150: break plt.interactive().close() vedo-2023.4.6/examples/simulations/pendulum_ode.py000066400000000000000000000035361444463326400221450ustar00rootroot00000000000000"""Double pendulum from ODE integration""" # Copyright (c) 2018, N. Rougier, https://github.com/rougier/pendulum # http://www.physics.usyd.edu.au/~wheat/dpend_html/solve_dpend.c # Adapted for vedo by M. Musy, 2021 from scipy import integrate from vedo import * G = 9.81 # acceleration due to gravity, in m/s^2 L1 = 1.0 # length of pendulum 1 in m L2 = 1.0 # length of pendulum 2 in m M1 = 1.0 # mass of pendulum 1 in kg M2 = 1.0 # mass of pendulum 2 in kg th1= 120 # initial angles (degrees) th2= -20 w1 = 0 # initial angular velocities (degrees per second) w2 = 0 dt = 0.015 def derivs(state, t): dydx = np.zeros_like(state) dydx[0] = state[1] a = state[2] - state[0] sina, cosa = sin(a), cos(a) den1 = (M1 + M2)*L1 - M2*L1*cosa*cosa dydx[1] = (M2*L1*state[1]*state[1]*sina*cosa + M2*G*sin(state[2])*cosa + M2*L2*state[3]*state[3]*sina - (M1+M2)*G*sin(state[0]) )/den1 dydx[2] = state[3] den2 = (L2/L1)*den1 dydx[3] = (-M2*L2*state[3]*state[3]*sina*cosa + (M1+M2)*G*sin(state[0])*cosa - (M1+M2)*L1*state[1]*state[1]*sina - (M1+M2)*G*sin(state[2]) )/den2 return dydx t = np.arange(0.0, 10.0, dt) state = np.radians([th1, w1, th2, w2]) y = integrate.odeint(derivs, state, t) P1 = np.dstack([L1*sin(y[:,0]), -L1*cos(y[:,0])]).squeeze() P2 = P1 + np.dstack([L2*sin(y[:,2]), -L2*cos(y[:,2])]).squeeze() plt = Plotter(interactive=False, size=(900,700),) ax = Axes(xrange=(-2,2), yrange=(-2,1), htitle=__doc__) for i in progressbar(len(t)): j = max(i- 5,0) k = max(i-10,0) l1 = Line([[0,0], P1[i], P2[i]]).lw(7).c("blue2", 1.0) l2 = Line([[0,0], P1[j], P2[j]]).lw(6).c("blue2", 0.4) l3 = Line([[0,0], P1[k], P2[k]]).lw(5).c("blue2", 0.2) plt.clear().show(l1, l2, l3, ax, zoom=1.4) plt.interactive().close() vedo-2023.4.6/examples/simulations/run_all.sh000077500000000000000000000004271444463326400211020ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo ############################################# echo Press Esc at anytime to skip example echo ############################################# echo echo for f in *.py do echo "Processing $f script.." python3 $f done vedo-2023.4.6/examples/simulations/self_org_maps2d.py000066400000000000000000000052111444463326400225230ustar00rootroot00000000000000"""Self organizing maps""" # ----------------------------------------------------------------------------- # Copyright 2019 (C) Nicolas P. Rougier # Released under a BSD two-clauses license # # References: Kohonen, Teuvo. Self-Organization and Associative Memory. # Springer, Berlin, 1984. # https://github.com/rougier/ML-Recipes/blob/master/recipes/ANN/som.py # ----------------------------------------------------------------------------- import numpy as np import scipy.spatial from vedo import * class SOM: def __init__(self, shape, distance): self.codebook = np.random.uniform(0, 1, shape) self.distance = distance / distance.max() self.samples = [] def learn(self, n_epoch=10000, sigma=(0.25,0.01), lrate=(0.5,0.01)): t = np.linspace(0, 1, n_epoch) lrate = lrate[0] * (lrate[1] / lrate[0]) ** t sigma = sigma[0] * (sigma[1] / sigma[0]) ** t I = np.random.randint(0, len(self.samples), n_epoch) self.samples = self.samples[I] for i in progressbar(range(n_epoch)): # Get random sample data = self.samples[i] # Get index of nearest node (minimum distance) winner = np.argmin(((self.codebook - data)**2).sum(axis=-1)) # Gaussian centered on winner G = np.exp(-self.distance[winner]**2 / sigma[i]**2) # Move nodes towards sample according to Gaussian self.codebook -= lrate[i] * G[..., np.newaxis] * (self.codebook-data) # Draw network if i>500 and not i%20 or i==n_epoch-1: x, y, z = [self.codebook[:,i].reshape(n,n) for i in range(3)] grd.wireframe(False).lw(0.5).bc('blue9').flat() grdpts = grd.points() for i in range(n): for j in range(n): grdpts[i*n+j] = (x[i,j], y[i,j], z[i,j]) grd.points(grdpts) plt.azimuth(1.0).render() plt.interactive().close() return [self.codebook[:,i].reshape(n,n) for i in range(3)] # ------------------------------------------------------------------------------- if __name__ == "__main__": n = 20 X, Y = np.meshgrid(np.linspace(0, 1, n), np.linspace(0, 1, n)) P = np.c_[X.ravel(), Y.ravel()] D = scipy.spatial.distance.cdist(P, P) s = Sphere(res=90).cut_with_plane(origin=(0,-.3,0), normal='y').subsample(0.01) plt = Plotter(axes=6, interactive=False) grd = Grid(res=[n-1,n-1], c='green2') plt.show(__doc__, s.ps(1), grd) som = SOM((len(P), 3), D) som.samples = s.points() som.learn(n_epoch=4000, sigma=(1, 0.01), lrate=(1, 0.01)) vedo-2023.4.6/examples/simulations/spline_ease.py000066400000000000000000000015331444463326400217470ustar00rootroot00000000000000"""Spline three points in space""" from vedo import * pts = [[0,0,0], [0.5,0.6,0.8], [1,1,1]] gpts = Points(pts, r=10).c('green',0.5) # Create a spline where the final points are more dense (easing) line = Spline(pts, easing="OutCubic", res=100) vpts = line.clone().point_size(3).shift(0,0.1,0) # a dotted copy # Calculate positions as a fraction of the length of the line, # being x=0 the first point and x=1 the last point. # This corresponds to an imaginary point that travels along the line # at constant speed: equi_pts = Points([line.eval(x) for x in np.arange(0,1, 0.1)]).c('blue') redpt = Point(r=25).c('red') plt = show(vpts, gpts, line, redpt, equi_pts, axes=1, interactive=0) # Animation pts = line.points() for i in range(line.npoints): redpt.pos(pts[i]) # assign the new position plt.render() plt.interactive().close() vedo-2023.4.6/examples/simulations/trail.py000066400000000000000000000010641444463326400205720ustar00rootroot00000000000000"""Add a trailing line to a moving object""" from vedo import Plotter, sin, Sphere, Point s = Sphere().c("green").bc("tomato") s.cut_with_plane([-0.8, 0, 0]) # cut left part of sphere p = Point([-2,0,0], r=12, c="black") # add a trail to point p with 50 segments p.add_trail(lw=3, n=50) plt = Plotter(axes=6, interactive=False) # add meshes to Plotter list plt += [s, p, __doc__] for i in range(150): p.pos(-2+i/100.0, sin(i/5.0)/15, 0).update_trail() plt.show(azimuth=-0.2) # stay interactive and after pressing q close plt.interactive().close() vedo-2023.4.6/examples/simulations/tunnelling1.py000066400000000000000000000032011444463326400217120ustar00rootroot00000000000000"""Quantum tunneling using 4th order Runge-Kutta method""" import numpy as np from vedo import Plotter, Line N = 300 # number of points dt = 0.004 # time step x0 = 5 # peak initial position s0 = 0.75 # uncertainty on particle position k0 = 10 # initial momentum of the wave packet Vmax = 0.2 # height of the barrier (try 0 for particle in empty box) size = 20.0 # x span [0, size] def f(psi): nabla2psi = np.zeros(N+2, dtype=complex) dx2 = ((x[-1] - x[0]) / (N+2))**2 * 400 # dx**2 step, scaled nabla2psi[1 : N+1] = (psi[0:N] + psi[2 : N+2] - 2 * psi[1 : N+1]) / dx2 return 1j * (nabla2psi - V * psi) # this is the RHS of Schroedinger equation def d_dt(psi): # find Psi(t+dt)-Psi(t) /dt with 4th order Runge-Kutta method k1 = f(psi) k2 = f(psi + dt / 2 * k1) k3 = f(psi + dt / 2 * k2) k4 = f(psi + dt * k3) return (k1 + 2 * k2 + 2 * k3 + k4) / 6 x = np.linspace(0, size, N+2) # we will need 2 extra points for the box wall V = Vmax * (np.abs(x-11) < 0.5) - 0.01 # simple square barrier potential Psi = np.sqrt(1/s0) * np.exp(-1/2 * ((x-x0)/s0)**2 + 1j * x * k0) # wave packet zeros = np.zeros_like(x) plt = Plotter(interactive=False, size=(1000,500)) barrier = Line(np.c_[x, V * 15], c="red3", lw=3) wpacket = Line(np.c_[x, zeros], c='blue4', lw=2) plt.show(barrier, wpacket, __doc__, zoom=2) for j in range(150): for i in range(500): Psi += d_dt(Psi) * dt # integrate for a while amp = np.real(Psi * np.conj(Psi)) * 1.5 # psi squared, probability(x) wpacket.points(np.c_[x, amp, zeros]) # update points plt.render() plt.interactive().close() vedo-2023.4.6/examples/simulations/tunnelling2.py000066400000000000000000000053601444463326400217230ustar00rootroot00000000000000"""Quantum Tunnelling effect using 4th order Runge-Kutta method with arbitrary potential shape. The animation shows the evolution of a particle of relatively well defined momentum (hence undefined position) in a box hitting a potential barrier.""" print(__doc__) import numpy as np from vedo import Plotter, Picture, Line, dataurl, settings Nsteps = 250 # number of steps in time N = 300 # number of points in space dt = 0.004 # time step x0 = 6 # peak initial position s0 = 0.75 # uncertainty on particle position k0 = 10 # initial momentum of the wave packet Vmax = 0.2 # height of the barrier (try 0 for particle in empty box) size = 20.0 # x axis span [0, size] # Uncomment below for more examples of the potential V(x). x = np.linspace(0, size, N+2) V = 0.15 * np.sin(1.5 * (x - 7)) # particle hitting a sinusoidal barrier # V = Vmax*(np.abs(x-11) < 0.5)-.01 # simple square barrier potential # V = -1.2*(np.abs(x-11) < 1.7)-.01 # a wide square well potential # V = 0.008*(x-10)**2 # elastic potential well # V = -0.1*(x-10) # particle on a slope bouncing back Psi = np.sqrt(1/s0) * np.exp(-1/2 * ((x-x0)/s0)**2 + 1j*x*k0) # wave packet dx2 = ((x[-1] - x[0]) / (N+2))**2 * 400 # dx**2 step, scaled nabla2psi = np.zeros(N+2, dtype=complex) def f(psi): # a smart numpy way to calculate the second derivative in x: nabla2psi[1 : N+1] = (psi[0:N] + psi[2 : N+2] - 2 * psi[1 : N+1]) / dx2 return 1j * (nabla2psi - V*psi) # this is the RH of Schroedinger equation! def d_dt(psi): # find Psi(t+dt)-Psi(t) /dt with 4th order Runge-Kutta method k1 = f(psi) k2 = f(psi + dt / 2 * k1) k3 = f(psi + dt / 2 * k2) k4 = f(psi + dt * k3) return (k1 + 2 * k2 + 2 * k3 + k4) / 6 plt = Plotter(interactive=False) bck = Picture(dataurl+"images/schrod.png").alpha(.3).scale(.0256).pos([0,-5,-.1]) barrier = Line(np.stack((x, V*15, np.zeros_like(x)), axis=1), c="black", lw=2) box = bck.box().c('black') lines = [] for i in range(0, Nsteps): for j in range(500): Psi += d_dt(Psi) * dt # integrate for a while before showing things A = np.real(Psi * np.conj(Psi)) * 1.5 # psi squared, probability(x) coords = np.stack((x, A), axis=1) Aline = Line(coords, c="db", lw=3) plt.show(barrier, bck, Aline, box).remove(Aline) lines.append([Aline, A]) # store objects # now show the same lines along z representing time plt.actors= [] # clean up internal list of objects to show plt.elevation(20) plt.azimuth(20) bck.alpha(1) for i in range(Nsteps): p = [0, 0, i*size/Nsteps] # shift along z l, a = lines[i] l.cmap("gist_earth_r", a) plt.add(box, bck, l.pos(p), barrier.clone().alpha(0.3).pos(p)) plt.reset_camera().render() plt.interactive().close() vedo-2023.4.6/examples/simulations/value_iteration.py000066400000000000000000000105501444463326400226510ustar00rootroot00000000000000"""Solve a random maze with Markovian Decision Process""" # ----------------------------------------------------------------------------- # Copyright 2019 (C) Nicolas P. Rougier & Anthony Strock # Released under a BSD two-clauses license # # References: Bellman, Richard (1957), A Markovian Decision Process. # Journal of Mathematics and Mechanics. Vol. 6, No. 5. # ----------------------------------------------------------------------------- #https://github.com/rougier/ML-Recipes/blob/master/recipes/MDP/value-iteration.py #https://en.wikipedia.org/wiki/Markov_decision_process import numpy as np from scipy.ndimage import generic_filter def maze(shape=(30, 50), complexity=0.8, density=0.8): shape = (np.array(shape)//2)*2 + 1 n_complexity = int(complexity*(shape[0]+shape[1])) n_density = int(density*(shape[0]*shape[1])) Z = np.ones(shape, dtype=bool) Z[1:-1, 1:-1] = 0 P = (np.dstack([np.random.randint(0, shape[0]+1, n_density), np.random.randint(0, shape[1]+1, n_density)])//2)*2 for (y,x) in P.squeeze(): Z[y, x] = 1 for j in range(n_complexity): neighbours = [] if x > 1: neighbours.append([(y, x-1), (y, x-2)]) if x < shape[1]-2: neighbours.append([(y, x+1), (y, x+2)]) if y > 1: neighbours.append([(y-1, x), (y-2, x)]) if y < shape[0]-2: neighbours.append([(y+1, x), (y+2, x)]) if len(neighbours): next_1, next_2 = neighbours[np.random.randint(len(neighbours))] if Z[next_2] == 0: Z[next_1] = Z[next_2] = 1 y, x = next_2 else: break return Z def solve(Z, start, goal): Z = 1 - Z G = np.zeros(Z.shape) G[start] = 1 # We iterate until value at exit is > 0. This requires the maze # to have a solution or it will be stuck in the loop. def diffuse(Z, gamma=0.99): return max(gamma*Z[0], gamma*Z[1], Z[2], gamma*Z[3], gamma*Z[4]) while G[goal] == 0.0: G = Z * generic_filter(G, diffuse, footprint=[[0, 1, 0], [1, 1, 1], [0, 1, 0]]) # Descent gradient to find shortest path from entrance to exit y, x = goal dirs = (0,-1), (0,+1), (-1,0), (+1,0) P = [] while (x, y) != start: P.append((y,x)) neighbours = [-1, -1, -1, -1] if x > 0: neighbours[0] = G[y, x-1] if x < G.shape[1]-1: neighbours[1] = G[y, x+1] if y > 0: neighbours[2] = G[y-1, x] if y < G.shape[0]-1: neighbours[3] = G[y+1, x] a = np.argmax(neighbours) x, y = x + dirs[a][1], y + dirs[a][0] P.append((y,x)) return P, G def print_solution(S, start, goal): for y,line in enumerate(Z): for x,c in enumerate(line): if (y,x) == start: print("[]", end='') elif (y,x) == goal: print("[]", end='') elif (y,x) in S[0]: print("..", end='') elif c: print("██", end='') else: print(" ", end='') print() def show_solution3d(S, start, goal): from vedo import Text3D, Cube, Line, Grid, merge, show pts, cubes, txts = [], [], [] pts = [(x,-y) for y,x in S[0]] for y,line in enumerate(Z): for x,c in enumerate(line): if c: cubes.append(Cube([x,-y,0])) path = Line(pts).lw(6).c('red5') walls = merge(cubes).flat().c('orange1') sy, sx = S[1].shape gradient = np.flip(S[1], axis=0).ravel() grd = Grid(pos=((sx-1)/2, -(sy-1)/2, -0.49), s=[sx,sy], res=[sx,sy]) grd.lw(0).wireframe(False).cmap('gist_earth_r', gradient, on='cells') grd.add_scalarbar('Gradient', horizontal=True, c='k', nlabels=2) txts.append(__doc__) txts.append(Text3D('Start', pos=[start[1]-1,-start[0]+1.5,1], c='k')) txts.append(Text3D('Goal!', pos=[goal[1] -2,-goal[0] -2.7,1], c='k')) return show(path, walls, grd, txts, axes=0, zoom=1.2) ########################################################################## if __name__ == '__main__': np.random.seed(4) Z = maze(shape=(50, 70)) start, goal = (1,1), (Z.shape[0]-2, Z.shape[1]-2) print("Please wait..") S = solve(Z, start, goal) #print_solution(S, start, goal) show_solution3d(S, start, goal).close() vedo-2023.4.6/examples/simulations/volterra.py000066400000000000000000000041111444463326400213110ustar00rootroot00000000000000"""The Lotka-Volterra model where: x is the number of preys y is the number of predators""" #Credits: #http://visual.icse.us.edu.pl/NPB/notebooks/Lotka_Volterra_with_SAGE.html #as implemented in K3D_Animations/Lotka-Volterra.ipynb #https://en.wikipedia.org/wiki/Lotka%E2%80%93Volterra_equations import numpy as np from scipy.integrate import odeint def rhs(y0, t, a): x, y = y0[0], y0[1] return [x-x*y, a*(x*y-y)] a_1 = 1.2 x0_1, x0_2, x0_3 = 2.0, 1.2, 1.0 y0_1, y0_2, y0_3 = 4.2, 3.7, 2.4 T = np.arange(0, 8, 0.02) sol1 = odeint(rhs, [x0_1, y0_1], T, args=(a_1,)) sol2 = odeint(rhs, [x0_2, y0_2], T, args=(a_1,)) sol3 = odeint(rhs, [x0_3, y0_3], T, args=(a_1,)) limx = np.linspace(np.min(sol1[:,0]), np.max(sol1[:,0]), 20) limy = np.linspace(np.min(sol1[:,1]), np.max(sol1[:,1]), 20) vx, vy = np.meshgrid(limx, limy) vx, vy = np.ravel(vx), np.ravel(vy) vec = rhs([vx, vy], t=0.01, a=a_1) origins = np.stack([np.zeros(np.shape(vx)), vx, vy]).T vectors = np.stack([np.zeros(np.shape(vec[0])), vec[0], vec[1]]).T vectors /= np.stack([np.linalg.norm(vectors, axis=1)]).T * 5 curve_points1 = np.vstack([np.zeros(sol1[:,0].shape), sol1[:,0], sol1[:,1]]).T curve_points2 = np.vstack([np.zeros(sol2[:,0].shape), sol2[:,0], sol2[:,1]]).T curve_points3 = np.vstack([np.zeros(sol3[:,0].shape), sol3[:,0], sol3[:,1]]).T ######################################################################## from vedo import Plotter, Arrows, Points, Line plt = Plotter(bg="blackboard") plt += Arrows(origins, origins+vectors, c='lr') plt += Points(curve_points1, c='y') plt += Line(curve_points1, c='y') plt += Line(np.vstack([T, sol1[:,0], sol1[:,1]]).T, c='y') plt += Points(curve_points2, c='g') plt += Line(curve_points2, c='g') plt += Line(np.vstack([T, sol2[:,0], sol2[:,1]]).T, c='g') plt += Points(curve_points3, c='lb') plt += Line(curve_points3, c='lb') plt += Line(np.vstack([T, sol3[:,0], sol3[:,1]]).T, c='lb') plt += __doc__ plt.show(axes={'xtitle':'time', 'ytitle':'x', 'ztitle':'y', 'zxgrid':True, 'yzgrid':False}, viewup='x', ) plt.close() vedo-2023.4.6/examples/simulations/wave_equation1d.py000066400000000000000000000070321444463326400225540ustar00rootroot00000000000000"""Simulate a discrete collection of oscillators We will use this as a model of a vibrating string and compare two methods of integration: Euler and Runge-Kutta4. For too large values of dt the simple Euler can diverge.""" # To model 'N' oscillators, we will use N+2 Points, numbered # 0, 1, 2, 3, ... N+1. Points 0 and N+1 are actually the boundaries. # We will keep them fixed, but adding them in as if they were # masses makes the programming easier. # Adapted from B.Martin (2009) http://www.kcvs.ca/martin by M.Musy from vedo import * #################################################### N = 400 # Number of coupled oscillators dt = 0.5 # Time step nsteps = 1500 # Number of steps in the simulation #################################################### # Initial positions #################################################### x = np.array(list(range(N + 2))) z = np.zeros(N + 2, float) y = np.zeros(N + 2, float) # y[p] is the position of particle p for p in x: # p is particle number along x axis y[p] = 100 * np.sin(p/15) * np.exp(-p/50) #################################################### # Initial velocities #################################################### v = np.zeros(N + 2, float) # or you can give one specific particle a kick: # v[40] = 50 #################################################### # Integrate forward #################################################### # Acceleration function for the simple harmonic oscillator def accel(y, v, t): a = np.zeros(N + 2, float) # acceleration of particles a[1 : N+1] = -(y[1 : N+1] - y[0:N]) - (y[1 : N+1] - y[2 : N+2]) return a def runge_kutta4(y, v, t, dt): # 4th Order Runge-Kutta yk1 = dt * v vk1 = dt * accel(y, v, t) yk2 = dt * (v + vk1 / 2) vk2 = dt * accel(y + yk1 / 2, v + vk1 / 2, t + dt / 2) yk3 = dt * (v + vk2 / 2) vk3 = dt * accel(y + yk2 / 2, v + vk2 / 2, t + dt / 2) yk4 = dt * (v + vk3) vk4 = dt * accel(y + yk3, v + vk3, t + dt) ynew = y + (yk1 + 2 * yk2 + 2 * yk3 + yk4) / 6 vnew = v + (vk1 + 2 * vk2 + 2 * vk3 + vk4) / 6 return ynew, vnew def euler(y, v, t, dt): # simple euler integrator vnew = v + accel(y, v, t) * dt ynew = y + vnew * dt + 1 / 2 * accel(y, vnew, t) * dt ** 2 return ynew, vnew positions_eu, positions_rk = [], [] y_eu, y_rk = np.array(y), np.array(y) v_eu, v_rk = np.array(v), np.array(v) t = 0 for i in progressbar(nsteps, c="blue", title="integrating RK4 and Euler"): y_eu, v_eu = euler(y_eu, v_eu, t, dt) y_rk, v_rk = runge_kutta4(y_rk, v_rk, t, dt) t += dt positions_eu.append(y_eu) # store result of integration positions_rk.append(y_rk) #################################################### # Visualize the result #################################################### plt = Plotter(interactive=False, axes=2, size=(1400,1000)) line_eu = Line([0,0,0], [len(x)-1,0,0], res=len(x), c="red5", lw=5) plt += line_eu line_rk = Line([0,0,0], [len(x)-1,0,0], res=len(x), c="green5", lw=5) plt += line_rk # let's also add a fancy background image from wikipedia img = dataurl + "images/wave_wiki.png" plt += Picture(img).alpha(0.8).scale(0.4).pos(0,-100,-20) plt += __doc__ plt.show(zoom=1.5) for i in progressbar(nsteps, c='red', title="visualize the result"): if i%10 != 0: continue y_eu = positions_eu[i] # retrieve the list of y positions at step i y_rk = positions_rk[i] pts = line_eu.points() pts[:,1] = y_eu line_eu.points(pts) pts = line_rk.points() pts[:,1] = y_rk line_rk.points(pts) plt.render() plt.interactive().close() vedo-2023.4.6/examples/simulations/wave_equation2d.py000066400000000000000000000031701444463326400225540ustar00rootroot00000000000000"""Solve the wave equation using finite differences and the Euler method""" import numpy as np from scipy.ndimage import gaussian_filter from vedo import Plotter, Grid, Text2D N = 400 # grid resolution A, B = 5, 4 # box sides end = 5 # end time nframes = 150 X, Y = np.mgrid[-A:A:N*1j, -B:B:N*1j] dx = X[1,0] - X[0,0] dt = 0.1 * dx time = np.arange(0, end, dt) m = int(len(time)/nframes) # initial condition (a ring-like wave) Z0 = np.ones_like(X) Z0[X**2+Y**2 < 1] = 0 Z0[X**2+Y**2 > 2] = 0 Z0 = gaussian_filter(Z0, sigma=4) Z1 = np.array(Z0) grid = Grid(s=(X[:,0], Y[0])).linewidth(0).lighting('glossy') txt = Text2D(font='Brachium', pos='bottom-left', bg='yellow5') cam = dict( pos=(5.715, -10.54, 12.72), focal_point=(0.1380, -0.7437, -0.5408), viewup=(-0.2242, 0.7363, 0.6384), distance=17.40, ) plt = Plotter(axes=1, size=(1000,700), interactive=False) plt.show(grid, txt, __doc__, camera=cam) for i in range(nframes): # iterate m times before showing the frame for _ in range(m): ZC = Z1.copy() Z1[1:N-1, 1:N-1] = ( 2*Z1[1:N-1, 1:N-1] - Z0[1:N-1, 1:N-1] + (dt/dx)**2 * ( Z1[2:N, 1:N-1] + Z1[0:N-2, 1:N-1] + Z1[1:N-1, 0:N-2] + Z1[1:N-1, 2:N ] - 4*Z1[1:N-1, 1:N-1] ) ) Z0[:] = ZC[:] wave = Z1.ravel() txt.text(f"frame: {i}/{nframes}, height_max = {wave.max()}") grid.cmap("Blues", wave, vmin=-2, vmax=2) newpts = grid.points() newpts[:,2] = wave grid.points(newpts) # update the z component plt.render() plt.interactive() plt.close() vedo-2023.4.6/examples/volumetric/000077500000000000000000000000001444463326400167265ustar00rootroot00000000000000vedo-2023.4.6/examples/volumetric/__init__.py000066400000000000000000000000031444463326400210300ustar00rootroot00000000000000# #vedo-2023.4.6/examples/volumetric/app_isobrowser.py000066400000000000000000000003641444463326400223410ustar00rootroot00000000000000from vedo import dataurl, Volume from vedo.applications import IsosurfaceBrowser vol = Volume(dataurl+'head.vti') # IsosurfaceBrowser(Plotter) instance: plt = IsosurfaceBrowser(vol, use_gpu=True, c='gold') plt.show(axes=7, bg2='lb').close() vedo-2023.4.6/examples/volumetric/app_raycaster.py000066400000000000000000000004211444463326400221320ustar00rootroot00000000000000from vedo import Volume, dataurl from vedo.applications import RayCastPlotter embryo = Volume(dataurl+"embryo.slc").mode(1).c('jet') # change properties plt = RayCastPlotter(embryo, bg='black', bg2='blackboard', axes=7) # Plotter instance plt.show(viewup="z").close() vedo-2023.4.6/examples/volumetric/colorize_volume.py000066400000000000000000000016271444463326400225230ustar00rootroot00000000000000"""Custom color and transparency maps for Volumes""" from vedo import Volume, dataurl, show from vedo.pyplot import CornerHistogram # Build a Volume object. # A set of color/transparency values - of any length - can be passed # to define the transfer function in the range of the scalar. # E.g.: setting alpha=[0, 0, 0, 1, 0, 0, 0] would make visible # only voxels with value close to center of the range (see histogram). vol = Volume(dataurl+'embryo.slc') vol.color([(0,"green"), (49,"green"), (50,"blue"), (109,"blue"), (110,"red"), (180,"red"), ]) # vol.mode('max-projection') vol.alpha([0., 1.]) vol.alpha_unit(8) # absorption unit, higher factors = higher transparency vol.add_scalarbar3d(title='color:dot:alpha transfer function', c='k') ch = CornerHistogram(vol, logscale=True, pos='bottom-left') # show both Volume and Mesh show(vol, ch, __doc__, axes=1, zoom=1.2).close() vedo-2023.4.6/examples/volumetric/delaunay3d.py000066400000000000000000000010641444463326400213320ustar00rootroot00000000000000"""Delaunay 3D tetralization""" from vedo import * import numpy as np settings.use_depth_peeling = True pts = (np.random.rand(10000, 3)-0.5)*2 s = Sphere().alpha(0.1) pin = s.inside_points(pts) pin.subsample(0.05) # impose min separation (5% of bounding box) printc("# of points inside the sphere:", pin.npoints) tmesh = delaunay3d(pin).shrink(0.95) cmesh = tmesh.cut_with_plane(normal=(1,2,-1)) # cmesh.pipeline.show() # to show the graph of operations show([(s, pin, "Generate points in a Sphere"), (cmesh, __doc__), ], N=2, axes=1, ).close() vedo-2023.4.6/examples/volumetric/densifycloud.py000066400000000000000000000012611444463326400217700ustar00rootroot00000000000000"""Generate a denser point cloud. The new points are created in such a way that all points in any local neighborhood are within a target distance of one another""" from vedo import Points, printc, show import numpy as np npts = 50 # nr. of points coords = np.random.rand(npts, 3) # range is [0, 1] scals = np.abs(coords[:, 1]) # let the scalar be the y of the point itself pts = Points(coords, r=9) pts.pointdata["scals"] = scals densecloud = pts.densify(0.1, nclosest=10, niter=1) # return a new pointcloud.Points printc('nr. points increased', pts.npoints, '\rightarrow ', densecloud.npoints, c='lg') show([(pts, __doc__), densecloud], N=2, axes=1).close() vedo-2023.4.6/examples/volumetric/earth_model.py000066400000000000000000000037601444463326400215710ustar00rootroot00000000000000"""Visualization of a discretized Earth model""" import vedo vedo.settings.default_font = 'Kanopus' tet = vedo.TetMesh(vedo.dataurl+'earth_model.vtu') conductor = tet.clone().threshold('cell_scalars', above=0, below=4) # Crop the initial mesh box = vedo.Box(size=[503500, 505000, 6414000, 6417000, -1830, 600]) tet.cut_with_mesh(box, whole_cells=True) # We need to build a look up table for our color bar lut_table = [ #value, color, alpha, category_label ( 0.0, 'black', 1, "Cond_0"), ( 1.0, 'cyan', 1, "Cond_1"), ( 2.0, 'skyblue', 1, "Cond_2"), ( 3.0, 'dodgerblue', 1, "Cond_3"), ( 4.0, 'blue', 1, "Cond_4"), ( 5.0, 'gray', 1, "Overburden"), ( 6.0, 'yellow', 1, "Layer^A"), ( 7.0, 'gold', 1, "Layer^B"), ( 9.0, 'red', 1, "Layer^C"), (11.0, 'powderblue', 1, "Layer^D"), (13.0, 'lime', 1, "Layer^E"), (15.0, 'seagreen', 1, "Layer^V"), ] lut = vedo.build_lut(lut_table) msh = tet.tomesh(shrink=0.95).cmap(lut, 'cell_scalars', on='cells') msh.add_scalarbar3d( categories=lut_table, pos=(505500, 6416900, -630), title='Units', title_size=1.25, label_size=1.5, size=[100, 2200], ) # put scalarbar vertical, tell camera to keep bounds into account msh.scalarbar.rotate_x(90, around='itself').rotate_z(60, around='itself') msh.scalarbar.use_bounds() # Create cmap for conductor cond = conductor.tomesh().cmap(lut, 'cell_scalars', on='cells') axes = vedo.Axes( msh + cond, xtitle='Easting (m)', ytitle='Northing (m)', ztitle='Elevation (m)', xtitle_position=0.65, ytitle_position=0.65, ztitle_position=0.65, ytitle_offset=-0.22, ztitle_offset= 0.06, ylabel_rotation=90, ylabel_offset=-1.5, zaxis_rotation=15, axes_linewidth=3, grid_linewidth=2, yshift_along_x=1, tip_size=0, yzgrid=True, xyframe_line=True, ) vedo.show(msh, cond, axes, __doc__, size=(1305, 1020), roll=-80, azimuth=50, elevation=-10, zoom=1.25).close() vedo-2023.4.6/examples/volumetric/erode_dilate.py000066400000000000000000000005701444463326400217220ustar00rootroot00000000000000"""Erode or dilate a Volume by replacing a voxel with the max/min over an ellipsoidal neighborhood""" from vedo import * embryo = Volume(dataurl+'embryo.tif') embryo.print_histogram(logscale=1) eroded = embryo.clone().erode(neighbours=(2,2,2)) dilatd = eroded.clone().dilate(neighbours=(2,2,2)) show([(embryo, __doc__), eroded, dilatd], N=3, viewup='z', zoom=1.4).close() vedo-2023.4.6/examples/volumetric/euclidian_dist.py000066400000000000000000000004421444463326400222600ustar00rootroot00000000000000"""Euclidean Distance Transform using Saito algorithm. The distance map produced contains the square of the Euclidean distance values""" from vedo import * e = Volume(dataurl+'embryo.tif') edt = e.euclidean_distance() show([(e,__doc__), edt], N=2, viewup='z', axes=1, zoom=1.5).close() vedo-2023.4.6/examples/volumetric/image_false_colors.py000066400000000000000000000016661444463326400231260ustar00rootroot00000000000000"""Generate the Mandelbrot set as a color-mapped Picture object""" import numpy as np from vedo import Picture, dataurl, show def mandelbrot(h=400, w=400, maxit=20, r=2): # Returns an image of the Mandelbrot fractal of size (h,w) x = np.linspace(-2.5, 1.5, 4*h+1) y = np.linspace(-1.5, 1.5, 3*w+1) A, B = np.meshgrid(x, y) C = A + B*1j z = np.zeros_like(C) divtime = maxit + np.zeros(z.shape, dtype=int) for i in range(maxit): z = z**2 + C diverge = abs(z) > r # who is diverging div_now = diverge & (divtime == maxit) # who is diverging now divtime[div_now] = i # note when z[diverge] = r # avoid diverging too much return divtime pic = Picture(mandelbrot()).cmap("RdGy") show(pic, __doc__, axes=1, size=[800,600], zoom=1.4).close() # Also: # Picture(dataurl+"images/dog.jpg").cmap("RdGy").show().close() vedo-2023.4.6/examples/volumetric/image_fft.py000066400000000000000000000012141444463326400212170ustar00rootroot00000000000000# 2D Fast Fourier Transform of a picture from vedo import Picture, show # url = 'https://comps.canstockphoto.com/a-capital-silhouette-stock-illustrations_csp31110154.jpg' url = 'https://vedo.embl.es/examples/data/images/dog.jpg' pic = Picture(url).resize([200,None]) # resize so that x has 200 pixels, but keep y aspect-ratio picfft = pic.fft(logscale=12) picfft = picfft.tomesh().cmap('Set1',"RGBA").add_scalarbar("12\dotlog(fft)") # optional step show([ [pic, f"Original image\n{url[-40:]}"], [picfft, "2D Fast Fourier Transform"], [pic.fft(mode='complex').rfft(), "Reversed FFT"], ], N=3, bg='gray7', axes=1, ).close() vedo-2023.4.6/examples/volumetric/image_mask.py000066400000000000000000000026301444463326400213760ustar00rootroot00000000000000from vedo import Picture, show, settings from vedo.pyplot import histogram import numpy as np settings.default_font = "Theemim" pic = Picture("https://thumbs.dreamstime.com/z/green-grass-vase-tranquillity-white-rectangular-nature-81294508.jpg") msh = pic.tomesh() # convert it to a quad-mesh rgb = msh.pointdata["RGBA"] # numpy array tot = np.sum(rgb, axis=1) + 0.1 # add 0.1 to avoid divide by zero ratio_g = rgb[:,1] / tot ratio_r = rgb[:,0] / tot ids_r = np.where(ratio_r > 0.38) # threshold to find the red vase ids_g = np.where(ratio_g > 0.36) # threshold for grass ids_w = np.where(tot > 240*3) # threshold to identify white areas data_g = np.zeros(msh.npoints) data_r = np.zeros(msh.npoints) data_w = np.zeros(msh.npoints) data_r[ids_r] = 1.0 data_g[ids_g] = 1.0 data_w[ids_w] = 1.0 ngreen = len(ids_g[0]) total = len(rgb) - len(ids_r[0]) - len(ids_w[0]) gvalue = int(ngreen/total*100 + 0.5) show([ [pic, pic.box().lw(3), "Original image. How much grass is there?"], histogram(ratio_g, logscale=True, xtitle='ratio of green'), [msh.clone().cmap('Greens', data_g), f'Ratio of green is \approx {gvalue}%'], [msh.clone().cmap('Reds', data_r), 'Masking the vase region'], [msh.clone().cmap('Greys', data_w), 'Masking bright areas'], ], shape="2|3", size=(1370, 1130), sharecam=False, bg='aliceblue', mode='image', zoom=1.5, interactive=True, ) vedo-2023.4.6/examples/volumetric/image_probe.py000066400000000000000000000025531444463326400215560ustar00rootroot00000000000000"""Probe image intensities along a set of radii""" from vedo import Picture, dataurl, Circle, Lines, show from vedo.pyplot import plot import numpy as np pic = Picture(dataurl+'images/spheroid.jpg') cpt = [580,600,0] circle = Circle(cpt, r=500, res=36).wireframe() pts = circle.points() # 3d coords of the points of the circle centers = np.zeros_like(pts) + cpt # create the same amount of center coords lines = Lines(centers, pts, res=50) # create Lines with 50 pts of resolution each msh = pic.tomesh() # transform the picture into a quad mesh lines.interpolate_data_from(msh, n=3) # interpolate all msh data onto the lines rgb = lines.pointdata['RGBA'] # extract the rgb intensities intensities = np.sum(rgb, axis=1) # sum the rgb values into one single intensty intensities_ray = np.split(intensities, 36) # split array so we can index any radius mean_intensity = np.mean(intensities_ray, axis=0) # compute the average intensity # add some optional plotting here: fig = plot( mean_intensity, lc='black', lw=5, spline=True, xtitle='radial distance', ytitle='intensity', aspect=16/9, ) for i in range(0,36, 3): fig += plot(intensities_ray[i], lc=i, lw=1, like=fig) fig.scale(21).shift(60,-800) # scale up and move plot below the image show(msh, circle, lines, fig, __doc__, size=(625,1000), zoom=1.5) vedo-2023.4.6/examples/volumetric/image_rgba.py000066400000000000000000000014331444463326400213560ustar00rootroot00000000000000"""Example plot of 2 images containing an alpha channel for modulating the opacity""" #Credits: https://github.com/ilorevilo from vedo import Picture, show import numpy as np rgbaimage1 = np.random.rand(50, 50, 4) * 255 alpharamp = np.linspace(0, 255, 50).astype(int) rgbaimage1[:, :, 3] = alpharamp rgbaimage2 = np.random.rand(50, 50, 4) * 255 rgbaimage2[:, :, 3] = alpharamp[::-1] p1 = Picture(rgbaimage1, channels=4) p2 = Picture(rgbaimage2, channels=4).z(12) show(p1, p2, __doc__, axes=7, viewup="z").close() # Second example: a b&w image from a numpy array img = np.zeros([512,512]) img[0:256, 0:256] = 0 img[0:256, 256:] = 64 img[256:, 0:256] = 128 img[256:, 256:] = 255 img = img.transpose(1,0) pict = Picture(img) show(pict, mode="image", bg=(0.4,0.5,0.6), axes=1).close() vedo-2023.4.6/examples/volumetric/image_to_mesh.py000066400000000000000000000014451444463326400221040ustar00rootroot00000000000000# Transform a picture into a mesh from vedo import Picture, dataurl, show import numpy as np pic = Picture(dataurl+"images/dog.jpg").smooth(5) msh = pic.tomesh() # make a quad-mesh out of it # build a scalar array with intensities rgb = msh.pointdata["RGBA"] intensity = np.sum(rgb, axis=1) intensityz = np.zeros_like(rgb) intensityz[:,2] = intensity / 10 # set the new vertex points pts = msh.points() + intensityz msh.points(pts) # more cosmetics msh.triangulate().smooth() msh.lighting("default").linewidth(0) msh.cmap("bone", "RGBA").add_scalarbar() msht = pic.clone().threshold(100).linewidth(0) show([[pic, "A normal jpg image.."], [msh, "..becomes a polygonal Mesh"], [msht, "Thresholding also generates a Mesh"] ], N=3, axes=1, zoom=1.1, elevation=-20, bg='black').close() vedo-2023.4.6/examples/volumetric/interpolate_volume.py000066400000000000000000000027141444463326400232210ustar00rootroot00000000000000"""Generate a Volume by interpolating a scalar which is only known on a scattered set of points or mesh. The blue layer is the result of thresholding the volume between 0.3 and 0.4 and assigning it the new value 0.9 (blue)""" from vedo import Points, show from vedo.pyplot import CornerHistogram import numpy as np npts = 500 # nr. of points where the scalar value is known coords = np.random.rand(npts, 3) # range is [0, 1] scals = coords[:, 2] # let the scalar be the z of the point itself pts = Points(coords) pts.pointdata["scals"] = scals # Now interpolate the values at these points to the full Volume # available interpolation kernels are: shepard, gaussian, voronoi, linear. vol = pts.tovolume(kernel='shepard', n=4, dims=(90,90,90)) vol.c(["maroon","g","b"]) # set color transfer function vol.alpha([0.3, 0.9]) # set opacity transfer function #vol.alpha([(0.3,0.3), (0.9,0.9)]) # alternative way, by specifying (xscalar, alpha) vol.alpha_unit(0.5) # make the whole object less transparent (default is 1) # replace voxels of specific range with a new value vol.threshold(above=0.3, below=0.4, replace=0.9) # Note that scalar range now has changed (you may want to reapply vol.c().alpha()) ch = CornerHistogram(vol, pos="bottom-left") vol.add_scalarbar3d('Height is the voxel scalar', size=[None,1]) vol.scalarbar.rotate_x(90).pos(1.15,1,0.5) show(pts, vol, ch, __doc__, axes=1, elevation=-90).close() vedo-2023.4.6/examples/volumetric/isosurfaces.py000066400000000000000000000006641444463326400216340ustar00rootroot00000000000000"""Interactively cut a set of isosurfaces from a volumetric dataset""" from vedo import dataurl, show, BoxCutter, Volume # generate an isosurface the volume for each thresholds thresholds = [0.1, 0.25, 0.4, 0.6, 0.75, 0.9] # isos is of type Mesh isos = Volume(dataurl+'quadric.vti').isosurface(thresholds) plt = show(isos, __doc__, axes=1, interactive=False) cutter = BoxCutter(isos) plt.add(cutter) plt.interactive() plt.close() vedo-2023.4.6/examples/volumetric/legosurface.py000066400000000000000000000007031444463326400215770ustar00rootroot00000000000000"""Represent a volume as lego blocks (voxels). Colors correspond to the volume's scalar. Try also: > vedo --lego data/embryo.tif""" from vedo import * vol = Volume(dataurl+'embryo.tif') vol.crop(back=0.50) # crop 50% from neg. y # show lego blocks whose value is between vmin and vmax lego = vol.legosurface(vmin=20, vmax=None, boundary=False) lego.cmap('seismic', vmin=0, vmax=127).add_scalarbar() show(lego, __doc__, axes=1, viewup='z').close() vedo-2023.4.6/examples/volumetric/lowpassfilter.py000066400000000000000000000011501444463326400221730ustar00rootroot00000000000000from vedo import * # mode = 1 is maximum projection (default is 0=composite) v1 = Volume(dataurl+'embryo.tif').mode(1) v1.add_scalarbar3d(c='w').print_histogram(logscale=1, horizontal=1, c='g') t1 = Text2D('Original volume', c='lg') # cutoff range is roughly in the range of 1 / size of object v2 = v1.clone().frequency_pass_filter(high_cutoff=.001, order=1).mode(1) v2.add_scalarbar3d(c='w').print_histogram(logscale=1, horizontal=1, c='b') t2 = Text2D('High freqs in the FFT\nare cut off:', c='lb') show([(v1,t1), (v2,t2)], N=2, bg='bb', zoom=1.5, axes=dict(digits=2)).close() #write(v2, 'embryo_filtered.vti') vedo-2023.4.6/examples/volumetric/mesh2volume.py000066400000000000000000000007161444463326400215520ustar00rootroot00000000000000"""Build a volume from a mesh where the foreground voxels are set to 255 and the background voxels are 0""" from vedo import Mesh, dataurl, Plotter surf = Mesh(dataurl+"bunny.obj").normalize().wireframe() vol = surf.binarize(spacing=(0.02,0.02,0.02)) vol.alpha([0,0.6]).c('blue') iso = vol.isosurface().color("blue5") plt = Plotter(N=2, axes=9) plt.at(0).show(vol, surf, __doc__) plt.at(1).show("..the volume is isosurfaced:", iso) plt.interactive().close() vedo-2023.4.6/examples/volumetric/multiscalars.py000066400000000000000000000022701444463326400220040ustar00rootroot00000000000000"""A Volume can have multiple scalars associated to each voxel""" from vedo import dataurl, Volume, printc, show import numpy as np vol = Volume(dataurl+'vase.vti') nx, ny, nz = vol.dimensions() r0,r1 = vol.scalar_range() vol.add_scalarbar3d('original voxel scalars') # create a set of scalars and add it to the Volume vol.pointdata["myscalars1"] = np.linspace(r0,r1, num=nx*ny*nz) # create another set of scalars and add it to the Volume vol.pointdata["myscalars2"] = np.random.randint(-100,+100, nx*ny*nz) # make SLCImage scalars the active array (can set 0, to pick the first): printc('Arrays in Volume are:\n', vol.pointdata.keys(), invert=True) vol.pointdata.select("SLCImage") # select the first data array as the active one # Build the isosurface of the active scalars, # but use testscals1 to colorize this isosurface, and then smooth it iso1 = vol.isosurface().cmap('jet', 'myscalars1').smooth().lw(0.1) iso1.add_scalarbar3d('myscalars1') iso2 = vol.isosurface().cmap('viridis', 'myscalars2') iso2.add_scalarbar3d('myscalars2') show([(vol, __doc__), (iso1,"Colorize isosurface using\nmyscalars1"), (iso2,"Colorize isosurface using\nmyscalars2"), ], N=3, axes=1 ).close() vedo-2023.4.6/examples/volumetric/numpy2volume1.py000066400000000000000000000011401444463326400220370ustar00rootroot00000000000000"""Create a Volume from a numpy.mgrid""" import numpy as np from vedo import Volume, Text2D, show X, Y, Z = np.mgrid[:30, :30, :30] # Distance from the center at (15, 15, 15) scalar_field = ((X-15)**2 + (Y-15)**2 + (Z-15)**2) /225 vol = Volume(scalar_field) vol.add_scalarbar3d() print('numpy array from Volume:', vol.tonumpy().shape) lego = vol.legosurface(vmin=1, vmax=2) lego.cmap('hot_r', vmin=1, vmax=2).add_scalarbar3d() text1 = Text2D(__doc__, c='blue') text2 = Text2D('..and its lego isosurface representation\nvmin=1, vmax=2', c='dr') show([(vol,text1), (lego,text2)], N=2, azimuth=10).close() vedo-2023.4.6/examples/volumetric/numpy2volume2.py000066400000000000000000000010331444463326400220410ustar00rootroot00000000000000"""Create a Volume from a numpy array""" import numpy as np from vedo import Volume, show data_matrix = np.zeros([70, 80, 90], dtype=np.uint8) data_matrix[ 0:30, 0:30, 0:30] = 1 data_matrix[30:50, 30:60, 30:70] = 2 data_matrix[50:70, 60:80, 70:90] = 3 vol = Volume(data_matrix, c=['white','b','g','r'], mode=1) vol.add_scalarbar3d() # optionally mask some parts of the volume (needs mapper='gpu'): # data_mask = np.zeros_like(data_matrix) # data_mask[10:65, 10:65, 20:75] = 1 # vol.mask(data_mask) show(vol, __doc__, axes=1).close() vedo-2023.4.6/examples/volumetric/numpy_imread.py000066400000000000000000000010111444463326400217620ustar00rootroot00000000000000"""Create a Volume from a numpy object using imread""" from vedo import * from skimage.io import imread f = dataurl+'embryo.tif' voriginal = Volume(f) printc('voxel size is', voriginal.spacing(), c='cyan') raw = imread(f) narray = np.transpose(raw, axes=[2, 1, 0]) vraw = Volume(narray, spacing=(104,104,104)) # Compare loading the volume directly with the numpy volume: # they should be the same show( [(voriginal, __doc__), (vraw,"From imread\n(should be same as left)")], N=2, axes=1, ).close() vedo-2023.4.6/examples/volumetric/off_furniture.py000066400000000000000000000234431444463326400221630ustar00rootroot00000000000000# Pure vtk stuff. # Create the furniture objects for the office.py example import vtk def furniture(): # generate a whole bunch of planes which correspond to # the geometry in the analysis; tables, bookshelves and so on. from vedo import download reader = vtk.vtkStructuredGridReader() fpath = download('https://vedo.embl.es/examples/data/office.binary.vtk', verbose=0) reader.SetFileName(fpath) reader.Update() sgrid = reader.GetOutput() table1 = vtk.vtkStructuredGridGeometryFilter() table1.SetInputData(sgrid) table1.SetExtent(11, 15, 7, 9, 8, 8) mapTable1 = vtk.vtkPolyDataMapper() mapTable1.SetInputConnection(table1.GetOutputPort()) mapTable1.ScalarVisibilityOff() table1Actor = vtk.vtkActor() table1Actor.SetMapper(mapTable1) table1Actor.GetProperty().SetColor(.59, .427, .392) table2 = vtk.vtkStructuredGridGeometryFilter() table2.SetInputData(sgrid) table2.SetExtent(11, 15, 10, 12, 8, 8) mapTable2 = vtk.vtkPolyDataMapper() mapTable2.SetInputConnection(table2.GetOutputPort()) mapTable2.ScalarVisibilityOff() table2Actor = vtk.vtkActor() table2Actor.SetMapper(mapTable2) table2Actor.GetProperty().SetColor(.59, .427, .392) FilingCabinet1 = vtk.vtkStructuredGridGeometryFilter() FilingCabinet1.SetInputData(sgrid) FilingCabinet1.SetExtent(15, 15, 7, 9, 0, 8) mapFilingCabinet1 = vtk.vtkPolyDataMapper() mapFilingCabinet1.SetInputConnection(FilingCabinet1.GetOutputPort()) mapFilingCabinet1.ScalarVisibilityOff() FilingCabinet1Actor = vtk.vtkActor() FilingCabinet1Actor.SetMapper(mapFilingCabinet1) FilingCabinet1Actor.GetProperty().SetColor(.8, .8, .6) FilingCabinet2 = vtk.vtkStructuredGridGeometryFilter() FilingCabinet2.SetInputData(sgrid) FilingCabinet2.SetExtent(15, 15, 10, 12, 0, 8) mapFilingCabinet2 = vtk.vtkPolyDataMapper() mapFilingCabinet2.SetInputConnection(FilingCabinet2.GetOutputPort()) mapFilingCabinet2.ScalarVisibilityOff() FilingCabinet2Actor = vtk.vtkActor() FilingCabinet2Actor.SetMapper(mapFilingCabinet2) FilingCabinet2Actor.GetProperty().SetColor(.8, .8, .6) bookshelf1Top = vtk.vtkStructuredGridGeometryFilter() bookshelf1Top.SetInputData(sgrid) bookshelf1Top.SetExtent(13, 13, 0, 4, 0, 11) mapBookshelf1Top = vtk.vtkPolyDataMapper() mapBookshelf1Top.SetInputConnection(bookshelf1Top.GetOutputPort()) mapBookshelf1Top.ScalarVisibilityOff() bookshelf1TopActor = vtk.vtkActor() bookshelf1TopActor.SetMapper(mapBookshelf1Top) bookshelf1TopActor.GetProperty().SetColor(.8, .8, .6) bookshelf1Bottom = vtk.vtkStructuredGridGeometryFilter() bookshelf1Bottom.SetInputData(sgrid) bookshelf1Bottom.SetExtent(20, 20, 0, 4, 0, 11) mapBookshelf1Bottom = vtk.vtkPolyDataMapper() mapBookshelf1Bottom.SetInputConnection(bookshelf1Bottom.GetOutputPort()) mapBookshelf1Bottom.ScalarVisibilityOff() bookshelf1BottomActor = vtk.vtkActor() bookshelf1BottomActor.SetMapper(mapBookshelf1Bottom) bookshelf1BottomActor.GetProperty().SetColor(.8, .8, .6) bookshelf1Front = vtk.vtkStructuredGridGeometryFilter() bookshelf1Front.SetInputData(sgrid) bookshelf1Front.SetExtent(13, 20, 0, 0, 0, 11) mapBookshelf1Front = vtk.vtkPolyDataMapper() mapBookshelf1Front.SetInputConnection(bookshelf1Front.GetOutputPort()) mapBookshelf1Front.ScalarVisibilityOff() bookshelf1FrontActor = vtk.vtkActor() bookshelf1FrontActor.SetMapper(mapBookshelf1Front) bookshelf1FrontActor.GetProperty().SetColor(.8, .8, .6) bookshelf1Back = vtk.vtkStructuredGridGeometryFilter() bookshelf1Back.SetInputData(sgrid) bookshelf1Back.SetExtent(13, 20, 4, 4, 0, 11) mapBookshelf1Back = vtk.vtkPolyDataMapper() mapBookshelf1Back.SetInputConnection(bookshelf1Back.GetOutputPort()) mapBookshelf1Back.ScalarVisibilityOff() bookshelf1BackActor = vtk.vtkActor() bookshelf1BackActor.SetMapper(mapBookshelf1Back) bookshelf1BackActor.GetProperty().SetColor(.8, .8, .6) bookshelf1LHS = vtk.vtkStructuredGridGeometryFilter() bookshelf1LHS.SetInputData(sgrid) bookshelf1LHS.SetExtent(13, 20, 0, 4, 0, 0) mapBookshelf1LHS = vtk.vtkPolyDataMapper() mapBookshelf1LHS.SetInputConnection(bookshelf1LHS.GetOutputPort()) mapBookshelf1LHS.ScalarVisibilityOff() bookshelf1LHSActor = vtk.vtkActor() bookshelf1LHSActor.SetMapper(mapBookshelf1LHS) bookshelf1LHSActor.GetProperty().SetColor(.8, .8, .6) bookshelf1RHS = vtk.vtkStructuredGridGeometryFilter() bookshelf1RHS.SetInputData(sgrid) bookshelf1RHS.SetExtent(13, 20, 0, 4, 11, 11) mapBookshelf1RHS = vtk.vtkPolyDataMapper() mapBookshelf1RHS.SetInputConnection(bookshelf1RHS.GetOutputPort()) mapBookshelf1RHS.ScalarVisibilityOff() bookshelf1RHSActor = vtk.vtkActor() bookshelf1RHSActor.SetMapper(mapBookshelf1RHS) bookshelf1RHSActor.GetProperty().SetColor(.8, .8, .6) bookshelf2Top = vtk.vtkStructuredGridGeometryFilter() bookshelf2Top.SetInputData(sgrid) bookshelf2Top.SetExtent(13, 13, 15, 19, 0, 11) mapBookshelf2Top = vtk.vtkPolyDataMapper() mapBookshelf2Top.SetInputConnection(bookshelf2Top.GetOutputPort()) mapBookshelf2Top.ScalarVisibilityOff() bookshelf2TopActor = vtk.vtkActor() bookshelf2TopActor.SetMapper(mapBookshelf2Top) bookshelf2TopActor.GetProperty().SetColor(.8, .8, .6) bookshelf2Bottom = vtk.vtkStructuredGridGeometryFilter() bookshelf2Bottom.SetInputData(sgrid) bookshelf2Bottom.SetExtent(20, 20, 15, 19, 0, 11) mapBookshelf2Bottom = vtk.vtkPolyDataMapper() mapBookshelf2Bottom.SetInputConnection(bookshelf2Bottom.GetOutputPort()) mapBookshelf2Bottom.ScalarVisibilityOff() bookshelf2BottomActor = vtk.vtkActor() bookshelf2BottomActor.SetMapper(mapBookshelf2Bottom) bookshelf2BottomActor.GetProperty().SetColor(.8, .8, .6) bookshelf2Front = vtk.vtkStructuredGridGeometryFilter() bookshelf2Front.SetInputData(sgrid) bookshelf2Front.SetExtent(13, 20, 15, 15, 0, 11) mapBookshelf2Front = vtk.vtkPolyDataMapper() mapBookshelf2Front.SetInputConnection(bookshelf2Front.GetOutputPort()) mapBookshelf2Front.ScalarVisibilityOff() bookshelf2FrontActor = vtk.vtkActor() bookshelf2FrontActor.SetMapper(mapBookshelf2Front) bookshelf2FrontActor.GetProperty().SetColor(.8, .8, .6) bookshelf2Back = vtk.vtkStructuredGridGeometryFilter() bookshelf2Back.SetInputData(sgrid) bookshelf2Back.SetExtent(13, 20, 19, 19, 0, 11) mapBookshelf2Back = vtk.vtkPolyDataMapper() mapBookshelf2Back.SetInputConnection(bookshelf2Back.GetOutputPort()) mapBookshelf2Back.ScalarVisibilityOff() bookshelf2BackActor = vtk.vtkActor() bookshelf2BackActor.SetMapper(mapBookshelf2Back) bookshelf2BackActor.GetProperty().SetColor(.8, .8, .6) bookshelf2LHS = vtk.vtkStructuredGridGeometryFilter() bookshelf2LHS.SetInputData(sgrid) bookshelf2LHS.SetExtent(13, 20, 15, 19, 0, 0) mapBookshelf2LHS = vtk.vtkPolyDataMapper() mapBookshelf2LHS.SetInputConnection(bookshelf2LHS.GetOutputPort()) mapBookshelf2LHS.ScalarVisibilityOff() bookshelf2LHSActor = vtk.vtkActor() bookshelf2LHSActor.SetMapper(mapBookshelf2LHS) bookshelf2LHSActor.GetProperty().SetColor(.8, .8, .6) bookshelf2RHS = vtk.vtkStructuredGridGeometryFilter() bookshelf2RHS.SetInputData(sgrid) bookshelf2RHS.SetExtent(13, 20, 15, 19, 11, 11) mapBookshelf2RHS = vtk.vtkPolyDataMapper() mapBookshelf2RHS.SetInputConnection(bookshelf2RHS.GetOutputPort()) mapBookshelf2RHS.ScalarVisibilityOff() bookshelf2RHSActor = vtk.vtkActor() bookshelf2RHSActor.SetMapper(mapBookshelf2RHS) bookshelf2RHSActor.GetProperty().SetColor(.8, .8, .6) window = vtk.vtkStructuredGridGeometryFilter() window.SetInputData(sgrid) window.SetExtent(20, 20, 6, 13, 10, 13) mapWindow = vtk.vtkPolyDataMapper() mapWindow.SetInputConnection(window.GetOutputPort()) mapWindow.ScalarVisibilityOff() windowActor = vtk.vtkActor() windowActor.SetMapper(mapWindow) windowActor.GetProperty().SetColor(.3, .3, .5) outlet = vtk.vtkStructuredGridGeometryFilter() outlet.SetInputData(sgrid) outlet.SetExtent(0, 0, 9, 10, 14, 16) mapOutlet = vtk.vtkPolyDataMapper() mapOutlet.SetInputConnection(outlet.GetOutputPort()) mapOutlet.ScalarVisibilityOff() outletActor = vtk.vtkActor() outletActor.SetMapper(mapOutlet) outletActor.GetProperty().SetColor(1, 1, 1) inlet = vtk.vtkStructuredGridGeometryFilter() inlet.SetInputData(sgrid) inlet.SetExtent(0, 0, 9, 10, 0, 6) mapInlet = vtk.vtkPolyDataMapper() mapInlet.SetInputConnection(inlet.GetOutputPort()) mapInlet.ScalarVisibilityOff() inletActor = vtk.vtkActor() inletActor.SetMapper(mapInlet) inletActor.GetProperty().SetColor(1, 1, 1) outline = vtk.vtkStructuredGridOutlineFilter() outline.SetInputData(sgrid) mapOutline = vtk.vtkPolyDataMapper() mapOutline.SetInputConnection(outline.GetOutputPort()) outlineActor = vtk.vtkActor() outlineActor.SetMapper(mapOutline) outlineActor.GetProperty().SetColor(1, 1, 1) acts = [] acts.append(table1Actor) acts.append(table2Actor) acts.append(FilingCabinet1Actor) acts.append(FilingCabinet2Actor) acts.append(bookshelf1TopActor) acts.append(bookshelf1BottomActor) acts.append(bookshelf1FrontActor) acts.append(bookshelf1BackActor) acts.append(bookshelf1LHSActor) acts.append(bookshelf1RHSActor) acts.append(bookshelf2TopActor) acts.append(bookshelf2BottomActor) acts.append(bookshelf2FrontActor) acts.append(bookshelf2BackActor) acts.append(bookshelf2LHSActor) acts.append(bookshelf2RHSActor) acts.append(windowActor) acts.append(outletActor) acts.append(inletActor) acts.append(outlineActor) return acts if __name__ == "__main__": from vedo import show show(furniture()) vedo-2023.4.6/examples/volumetric/office.py000066400000000000000000000014141444463326400205330ustar00rootroot00000000000000"""Stream tubes originating from a probing grid of points. Data is from CFD analysis of airflow in an office with ventilation and a burning cigarette""" from vedo import * from off_furniture import furniture fpath = download(dataurl + 'office.binary.vtk') sgrid = loadStructuredGrid(fpath) # Create a grid of points and use those as integration seeds seeds = Grid(res=[2,3], c="gray").rotate_y(90).pos(2,2,1) # Now we will generate multiple streamlines in the data slines = StreamLines( sgrid, seeds, initial_step_size=0.01, max_propagation=15, tubes=dict(radius=0.005, mode=2, ratio=1), ) slines.cmap("Reds").add_scalarbar3d(c='white') slines.scalarbar.x(5) # reposition scalarbar at x=5 show(slines, seeds, furniture(), __doc__, axes=1, bg='bb').close() vedo-2023.4.6/examples/volumetric/point_density.py000066400000000000000000000005321444463326400221700ustar00rootroot00000000000000"""Density field as a Volume from a point cloud""" from vedo import * s = Mesh(dataurl+'bunny.obj').normalize().subdivide(2).point_size(3).c("black") vol = s.density().print() plane = probe_plane(vol, normal=(1,1,1)).alpha(0.5) show([ ("Point cloud", s), ("Point density as Volume", vol, vol.box(), plane) ], N=2, ).close() vedo-2023.4.6/examples/volumetric/probe_line1.py000066400000000000000000000011161444463326400214760ustar00rootroot00000000000000"""Probe a Volume (voxel dataset) with lines""" from vedo import * vol = Volume(dataurl+"embryo.slc") lines = [] for i in range(60): # probe scalars on 60 parallel lines step = (i - 30) * 2 p1 = vol.center() + vector(-100, step, step) p2 = vol.center() + vector( 100, step, step) pl = probe_line(vol, p1, p2).cmap('hot', vmin=0, vmax=110) pl.alpha(0.5).linewidth(4) lines.append(pl) #print(pl.pointdata.keys()) # numpy scalars can be accessed here #print(pl.pointdata['vtkValidPointMask']) # the mask of valid points show(lines, __doc__, axes=1).close() vedo-2023.4.6/examples/volumetric/probe_line2.py000066400000000000000000000013341444463326400215010ustar00rootroot00000000000000"""Probe a Volume with a line and plot the intensity values""" from vedo import dataurl, Volume, probe_line, show from vedo.pyplot import plot vol = Volume(dataurl+'embryo.slc') vol.add_scalarbar3d('wild-type mouse embryo', c='k') p1, p2 = (50,50,50), (200,200,200) pl = probe_line(vol, p1, p2, res=100).linewidth(4) xvals = pl.points()[:,0] yvals = pl.pointdata[0] # get the probed values along the line fig = plot( xvals, yvals, xtitle=" ", ytitle="voxel intensity", aspect=16/9, spline=True, lc="r", # line color marker="*", # marker style mc="dr", # marker color ms=0.9, # marker size ) fig.shift(0,25,0) show(vol, pl, fig, __doc__, axes=dict(xygrid=0, yzgrid=0)).close() vedo-2023.4.6/examples/volumetric/probe_points.py000066400000000000000000000010341444463326400220010ustar00rootroot00000000000000"""Probe a voxel dataset at specified points and plot a histogram of the values""" from vedo import np, dataurl, Volume, Axes, probe_points, show from vedo.pyplot import histogram vol = Volume(dataurl+'embryo.slc').print() pts = np.random.rand(5000, 3)*256 mpts = probe_points(vol, pts).point_size(3) mpts.print() # valid = mpts.pointdata['vtkValidPointMask'] scals = mpts.pointdata['SLCImage'] his = histogram(scals, xtitle='probed voxel value', xlim=(5,100)) show([(vol, Axes(vol), mpts, __doc__), his], N=2, sharecam=False).close() vedo-2023.4.6/examples/volumetric/read_volume1.py000066400000000000000000000011461444463326400216650ustar00rootroot00000000000000from vedo import * from vedo.pyplot import histogram, plot cmap = 'nipy_spectral' alpha = np.array([0, 0, 0.05, 0.2, 0.8, 1]) vol = Volume(dataurl+"embryo.slc") vol.cmap(cmap).alpha(alpha).add_scalarbar3d(c='white') xvals = np.linspace(*vol.scalar_range(), len(alpha)) fig = histogram(vol, logscale=True, c=cmap, ac='white') fig+= plot(xvals, alpha*max(fig.frequencies), '--ow', like=fig).z(1) show([ (vol, Axes(vol, c='w'), f"Original Volume\ncolor map: {cmap}"), (fig, "Voxel scalar histogram\nand opacity transfer function") ], N=2, sharecam=False, bg=(82,87,110), zoom=1.1, ).close() vedo-2023.4.6/examples/volumetric/read_volume2.py000066400000000000000000000022541444463326400216670ustar00rootroot00000000000000"""Load and render a 3D Volume mode=0, composite rendering mode=1, maximum-projection rendering""" from vedo import dataurl, Volume, show vol1 = Volume(dataurl+"vase.vti") # can set colors and transparencies along the scalar range # from minimum to maximum value. In this example voxels with # the smallest value will be completely transparent (and white) # while voxels with highest value of the scalar will get alpha=0.8 # and color will be=(0,0,1) vol1.color(["white", "fuchsia", "dg", (0,0,1)]) #vol1.color('jet') # a matplotlib colormap name is also accepted vol1.alpha([0.0, 0.2, 0.3, 0.8]) # a transparency for the GRADIENT of the scalar can also be set: # in this case when the scalar is ~constant the gradient is ~zero # and the voxel are made transparent: vol1.alpha_gradient([0.0, 0.5, 0.9]).add_scalarbar3d('composite shade', c='k') vol1.scalarbar.scale(0.8).x(20) # mode = 1 is maximum-projection volume rendering vol2 = Volume(dataurl+"vase.vti").mode(1).shift(60,0,0) vol2.add_scalarbar3d('maximum-projection', c='k') vol2.scalarbar.scale(0.8).x(160) # show command creates and returns an instance of class Plotter show(vol1, vol2, __doc__, size=(800,600), zoom=1.5).close() vedo-2023.4.6/examples/volumetric/read_volume3.py000066400000000000000000000023701444463326400216670ustar00rootroot00000000000000from vedo import * vol = Volume(dataurl+"embryo.slc").cmap('nipy_spectral') vsl = VolumeSlice(vol) # reuse the same underlying data as in vol # use colorize("bw") to have black and white color scale # no argument will grab the existing cmap in vol (or use build_lut()) vsl.colorize().lighting(window=100, level=25) usage = Text2D( f"Image-style interactor:\n" f"SHIFT+Left click :rightarrow rotate camera for oblique slicing\n" f"SHIFT+Middle click :rightarrow slice perpendicularly through image\n" f"Left click & drag :rightarrow modify luminosity and contrast\n" f"X :rightarrow Reset to sagittal view\n" f"Y :rightarrow Reset to coronal view\n" f"Z :rightarrow Reset to axial view\n" f"R :rightarrow Reset the Window/Levels", font="Calco", pos="bottom-left", s=0.9, bg='yellow', alpha=0.25 ) custom_shape = [ # define here the 2 rendering rectangle spaces dict(bottomleft=(0.0,0.0), topright=(1,1), bg='k9'), # the full window dict(bottomleft=(0.7,0.7), topright=(1,1), bg='k8', bg2='lb'), ] show([ (vsl,usage,"VolumeSlice example"), (vol,"Volume") ], shape=custom_shape, mode="image", bg='k9', zoom=1.2, axes=11, interactive=1).close() vedo-2023.4.6/examples/volumetric/read_vts.py000066400000000000000000000011211444463326400211020ustar00rootroot00000000000000"""Read structured grid data and show the associated vector and scalar fields""" from vedo import * settings.use_depth_peeling = True g = load(dataurl+'structgrid.vts') coords = g.points() # g.print() gives the list of point and cell data contained in g vects = g.pointdata['Momentum']/600 print('numpy array shapes are:', coords.shape, vects.shape) # build arrows from starting points to endpoints, with colormap arrows = Arrows(coords-vects, coords+vects, c='hot_r') g.cmap('jet', input_array='Density').linewidth(0.1).alpha(0.3) show(g, arrows, __doc__, axes=7, viewup='z').close() vedo-2023.4.6/examples/volumetric/run_all.sh000077500000000000000000000004311444463326400207170ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # echo ############################################# echo Press Esc at anytime to skip example echo ############################################# echo echo for f in *.py do echo "Processing $f script.." python3 "$f" done vedo-2023.4.6/examples/volumetric/slice_mesh.py000066400000000000000000000004531444463326400214150ustar00rootroot00000000000000"""Slice/probe a Volume with a Mesh""" from vedo import * vol = Volume(dataurl+'embryo.slc').mode(1).c('bone') msh = Paraboloid(res=200).scale(200).pos(100,100,200) scals = probe_points(vol, msh).pointdata[0] msh.cmap('Spectral', scals).add_scalarbar() show(vol, msh, __doc__, axes=True).close() vedo-2023.4.6/examples/volumetric/slice_plane1.py000066400000000000000000000020151444463326400216350ustar00rootroot00000000000000"""Slice a Volume with an arbitrary plane hover the plane to get the scalar values""" from vedo import dataurl, precision, Sphere, Volume, Plotter def func(evt): if not evt.actor: return pid = evt.actor.closest_point(evt.picked3d, return_point_id=True) txt = f"Probing:\n{precision(evt.actor.picked3d, 3)}\nvalue = {arr[pid]}" pts = evt.actor.points() sph = Sphere(pts[pid], c='orange7').pickable(False) fp = sph.flagpole(txt, s=7, offset=(-150,15), font=2).follow_camera() # remove old and add the two new objects plt.remove('Sphere', 'FlagPole').add(sph, fp).render() vol = Volume(dataurl+'embryo.slc').alpha([0,0,0.8]).c('w').pickable(False) vslice = vol.slice_plane(origin=vol.center(), normal=(0,1,1)) vslice.cmap('Purples_r').lighting('off').add_scalarbar('Slice', c='w') arr = vslice.pointdata[0] # retrieve vertex array data plt = Plotter(axes=9, bg='k', bg2='bb') plt.add_callback('as my mouse moves please call', func) # be kind to vedo ;) plt.show(vol, vslice, __doc__) plt.close() vedo-2023.4.6/examples/volumetric/slice_plane2.py000066400000000000000000000010341444463326400216360ustar00rootroot00000000000000"""Slice a Volume with multiple planes Make low values of the scalar completely transparent""" from vedo import * vol = Volume(dataurl+'embryo.slc').alpha([0,0,0.5]).c('k') slices = [] for i in range(4): sl = vol.slice_plane(origin=[150,150,i*50+50], normal=(0,-1,1)) slices.append(sl) amap = [0, 1, 1, 1, 1] # hide low value points giving them alpha 0 mslices = merge(slices) # merge all slices into a single Mesh mslices.cmap('hot_r', alpha=amap).lighting('off').add_scalarbar3d() show(vol, mslices, __doc__, axes=1).close() vedo-2023.4.6/examples/volumetric/slicer1.py000066400000000000000000000011001444463326400206320ustar00rootroot00000000000000"""Use sliders to slice volume Click button to change colormap""" from vedo import dataurl, Volume, Text2D from vedo.applications import Slicer3DPlotter filename = dataurl + "embryo.slc" # filename = dataurl+'embryo.tif' # filename = dataurl+'vase.vti' vol = Volume(filename)#.print() plt = Slicer3DPlotter( vol, bg="white", bg2="lightblue", cmaps=("gist_ncar_r", "jet", "Spectral_r", "hot_r", "bone_r"), use_slider3d=False, ) # Can now add any other object to the Plotter scene: # plt += Text2D('some message') # plt.show().interactive() plt.close() vedo-2023.4.6/examples/volumetric/slicer2.py000066400000000000000000000024221444463326400206430ustar00rootroot00000000000000"""Slice multiple datasets""" from vedo import Plotter, Text2D, load, dataurl, ScalarBar3D volumes = [dataurl+'vase.vti', dataurl+'embryo.slc', dataurl+'head.vti'] volumes = load(volumes) cmaps = ['hot_r', 'gist_ncar_r', 'bone_r'] ######################################################################## def initfunc(iren, data): vol = data.mode(1).c('k').alpha([0, 0, 0.15, 0, 0]) txt = Text2D(data.filename[-20:], font='Calco') plt.at(iren).show(vol, vol.box(), txt) def func(widget, event): zs = int(widget.value) widget.title = f"z-slice = {zs}" msh = vol.zslice(zs) msh.cmap(cmaps[iren]).lighting("off") msh.name = "slice" sb = ScalarBar3D(msh, c='k') plt.renderer = widget.renderer # make it the current renderer plt.remove("slice", "ScalarBar3D").add(msh, sb) return func # this is the actual function returned! ######################################################################## plt = Plotter(shape=(1, len(volumes)), sharecam=False, bg2='lightcyan') for iren, data in enumerate(volumes): plt.add_slider( initfunc(iren, data), #func 0, data.dimensions()[2], value=0, show_value=False, pos=[(0.1,0.1), (0.25,0.1)], ) plt.interactive().close() vedo-2023.4.6/examples/volumetric/streamlines1.py000066400000000000000000000016021444463326400217060ustar00rootroot00000000000000"""Streamlines originating from a set of seed points in space subjected to a vectorial field defined on a small set of points. This field is interpolated to a user-defined bounding box.""" from vedo import * import pandas as pd data = "https://raw.githubusercontent.com/plotly/datasets/master/vortex.csv" df = pd.read_csv(data) pts = np.c_[df['x'], df['y'], df['z']] wind = np.c_[df['u'], df['v'], df['w']] domain = Points(pts) domain.pointdata["Wind"] = wind seeds = domain.clone().subsample(0.2) # these are the seed points # Compute stream lines with Runge-Kutta integration, we # extrapolate the field defined on points to a bounding box streamlines = StreamLines( domain, seeds, max_propagation=100, extrapolate_to_box=dict(bounds=[-20,20, -15,15, -20,20]), ) streamlines.lw(5).cmap("Blues", "Wind").add_scalarbar() show(streamlines, __doc__, axes=1, viewup='z').close() vedo-2023.4.6/examples/volumetric/streamlines2.py000066400000000000000000000014151444463326400217110ustar00rootroot00000000000000"""Load an existing vtkStructuredGrid and draw the streamlines of the velocity field""" from vedo import * ######################## vtk import vtk # Read the data and specify which scalars and vectors to read. pl3d = vtk.vtkMultiBlockPLOT3DReader() fpath = download(dataurl+"combxyz.bin") pl3d.SetXYZFileName(fpath) fpath = download(dataurl+"combq.bin") pl3d.SetQFileName(fpath) pl3d.SetScalarFunctionNumber(100) pl3d.SetVectorFunctionNumber(202) pl3d.Update() # this vtkStructuredData already has a vector field: domain = pl3d.GetOutput().GetBlock(0) ######################## vedo probe = Grid(s=[5,5], res=[6,6]).rotate_y(90).pos(5,0,29) stream = StreamLines(domain, probe) box = Mesh(domain).alpha(0.1).c('white') show(stream, probe, box, __doc__, axes=7, bg='bb').close() vedo-2023.4.6/examples/volumetric/streamlines3.py000066400000000000000000000015771444463326400217230ustar00rootroot00000000000000"""Draw streamlines for the cavity case from OpenFOAM tutorial""" from vedo import * # Load file as type vtkUnStructuredGrid fpath = download(dataurl+"cavity.vtk") ugrid = loadUnStructuredGrid(fpath) # Make a grid of points to probe as type Mesh probe = Grid(s=[0.1,0.01], res=[20,4], c='k') probe.rotate_x(90).pos(0.05,0.08,0.005) # Compute stream lines with Runge-Kutta4, return a Mesh stream = StreamLines( ugrid, probe, active_vectors='U', # name of the active array #tubes={"radius":1e-04, "vary_radius":2}, lw=2, # line width ) # Make a cloud of points form the ugrid, in order to draw arrows domain = Points(ugrid) coords = domain.points() vects = domain.pointdata['U']/200 arrows = Arrows(coords-vects, coords+vects, c='jet_r') # use colormap box = domain.box().c('k') # build a box frame of the domain show(stream, arrows, box, probe, __doc__, axes=5).close() vedo-2023.4.6/examples/volumetric/streamlines4.py000066400000000000000000000011441444463326400217120ustar00rootroot00000000000000from vedo import * ug = Mesh('https://github.com/marcomusy/vedo/files/4602353/domain_unstruct.vtk.gz') # make up some custom vector field pts = ug.points() x,y,z = pts.T windx = np.ones_like(x)*4 windy = np.exp(-(x+18)**2/100) * np.sign(y)/(abs(y)+8)*20 wind = np.c_[windx, windy, np.zeros_like(windy)] ug.pointdata["wind"] = wind # add the vectors to the mesh ars = Arrows(pts-wind/10, pts+wind/10, c='hot') ypr = np.linspace(-15,15, num=25) xpr = np.zeros_like(ypr)-40 probes = np.c_[xpr, ypr] str_lns = StreamLines(ug, probes, max_propagation=80, lw=3) show(ars, str_lns, zoom=8, bg2='lb').close() vedo-2023.4.6/examples/volumetric/streamribbons.py000066400000000000000000000014531444463326400221550ustar00rootroot00000000000000"""Load an existing vtkStructuredGrid and draw the lines of the velocity field joining them in ribbons""" from vedo import * ######################## vtk import vtk # Read the data and specify which scalars and vectors to read. pl3d = vtk.vtkMultiBlockPLOT3DReader() pl3d.SetXYZFileName(download(dataurl+"combxyz.bin")) pl3d.SetQFileName(download(dataurl+"combq.bin")) pl3d.SetScalarFunctionNumber(100) pl3d.SetVectorFunctionNumber(202) pl3d.Update() # this vtkStructuredData already contains a vector field: domain = pl3d.GetOutput().GetBlock(0) ######################## vedo box = Mesh(domain, c="white", alpha=0.1) probe = Line([9,0,28], [11,0,33], res=11).color('k').lw(4) stream = StreamLines(domain, probe, direction='backwards', ribbons=2) show(box, probe, stream, __doc__, axes=7, bg='bb').close() vedo-2023.4.6/examples/volumetric/tensors.py000066400000000000000000000011471444463326400210000ustar00rootroot00000000000000"""Visualize stress tensors as ellipsoids""" import vtk from vedo import * # Create a volume with tensors pl = vtk.vtkPointLoad() pl.SetLoadValue(50) pl.SetSampleDimensions(6,6,6) pl.ComputeEffectiveStressOn() pl.SetPoissonsRatio(0.2) pl.SetModelBounds(-10,10,-10,10,-10,10) vol = Volume(pl, mode=1) # Extract a slice of the volume data at index 3 zsl = vol.zslice(3) # Generate tensor ellipsoids tens1 = Tensors(vol, source='ellipse', scale=10) tens2 = Tensors(zsl, source='ellipse', scale=20) show([(vol, __doc__), tens1], N=2, axes=9, bg='w', viewup='z') show(vol, tens2, zsl, axes=9, viewup='z', new=True) vedo-2023.4.6/examples/volumetric/tet_astyle.py000066400000000000000000000011531444463326400214550ustar00rootroot00000000000000"""Visualize a TetMesh with default ray casting.""" from vedo import * # settings.use_depth_peeling = False tetm = TetMesh(dataurl+'limb_ugrid.vtk') tetm.color('jet').alpha_unit(100) # make the tets more transparent tetm.add_scalarbar3d() # Build a Mesh object made of all the boundary triangles wmesh = tetm.tomesh(fill=False).wireframe() # Make a copy of tetm and shrink the tets shrunk = tetm.clone().shrink(0.5) # Build a Mesh object and cut it cmesh = shrunk.tomesh(fill=True) show([(tetm, __doc__), (wmesh, "..wireframe surface"), (cmesh, "..shrunk tetrahedra"), ], N=3, axes=1, ).close() vedo-2023.4.6/examples/volumetric/tet_build.py000066400000000000000000000016501444463326400212550ustar00rootroot00000000000000"""Build a TetMesh (tetrahedral mesh) by manually defining vertices and cells""" from vedo import * points = [ (0, 0, 0), # first tet (1, 0, 0), (1, 1, 0), (0, 1, 2), (3, 3, 3), # second tet (4, 3, 3), (4, 4, 3), (3, 4, 4), (2, 5, 3), # third tet (3, 5, 3), (3, 6, 3), (2, 5, 5), ] tets = [[0,1,2,3], [4,5,6,7], [8,9,10,11]] scal = [10.0, 20.0, 30.0] # cell scalars # Create the TeTMesh object tm = TetMesh([points,tets]) tm.celldata["myscal"] = scal tm.color('jet') # tm.color('green') # or set a single color printc("tetmesh.inputdata():", type(tm.inputdata())) # vtkUnstructuredGrid printc("points, cells :", len(tm.points()), len(tm.cells())) # Optionally convert tm to a Mesh (for visualization) show([(tm, __doc__), (tm.tomesh(),"TetMesh.tomesh()"), ], N=2, axes=1, ).close() vedo-2023.4.6/examples/volumetric/tet_cut1.py000066400000000000000000000005141444463326400210300ustar00rootroot00000000000000"""Cut a TetMesh with an arbitrary polygonal Mesh. Units are :mum.""" from vedo import * settings.use_depth_peeling = True tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') sphere = Sphere(r=500, c='g').x(400).alpha(0.2) tetmesh.cut_with_mesh(sphere, invert=True) show(tetmesh, sphere, __doc__, axes=dict(xtitle='x [:mum]')).close() vedo-2023.4.6/examples/volumetric/tet_cut2.py000066400000000000000000000017521444463326400210360ustar00rootroot00000000000000"""Cut a TetMesh with a Mesh (note the presence of polygonal boundary)""" from vedo import * settings.use_depth_peeling = True tetm = TetMesh(dataurl+'limb_ugrid.vtk') sphere = Sphere(r=500).x(400).c('green', 0.1) # Clone and cut tetm, keep the outside: tetm1 = tetm.clone().cut_with_mesh(sphere, invert=True) # Make it a polygonal Mesh for visualization msh1 = tetm1.tomesh().linewidth(0.1).color('lb') # Cut tetm, but the output will keep only the whole tets (NOT the polygonal boundary!): tetm2 = tetm.clone().cut_with_mesh(sphere, invert=True, whole_cells=True) # Cut tetm, but the output will keep only the tets on the boundary: tetm3 = tetm.clone().cut_with_mesh(sphere, only_boundary=True) tetm3.add_scalarbar3d(c='k') show([ (msh1, sphere, __doc__), (tetm2.tomesh(), "Keep only tets that lie\ncompletely outside the Sphere"), (tetm3.tomesh(), sphere, "Keep only tets that lie\nexactly on the Sphere"), ], N=3, axes=dict(xtitle='x in :mum'), ).close() vedo-2023.4.6/examples/volumetric/tet_explode.py000066400000000000000000000023001444463326400216070ustar00rootroot00000000000000"""Segment a TetMesh with a custom scalar. Press q to make it explode""" from vedo import TetMesh, Plotter, Text2D, dataurl n = 20000 f1 = 0.005 # control the tetras resolution f2 = 0.15 # control the nr of seeds tmesh = TetMesh(dataurl + "limb_ugrid.vtk") surf = tmesh.tomesh(fill=False) txt = Text2D(__doc__, font="Brachium") # pick points on the surface and use subsample to make them uniform seeds = surf.clone().subsample(f2).ps(10).c("black") # assign to each tetrahedron the id of the closest seed point cids = [] for p in tmesh.cell_centers(): cid = seeds.closest_point(p, return_point_id=True) cids.append(cid) tmesh.celldata["fragment"] = cids # tmesh.celldata.select("fragment")# bug, has no effect, needs name=... pieces = [] for i in range(seeds.npoints): tc = tmesh.clone().threshold(name="fragment", above=i-0.1, below=i+0.1) mc = tc.tomesh(fill=False).color(i) pieces.append(mc) ############### animate plt = Plotter(size=(1200, 800), axes=1) plt.show(txt, pieces) for i in range(20): for pc in pieces: cm = pc.center_of_mass() pc.shift(cm / 25) txt.text(f"{__doc__}\n\nNr. of pieces = {seeds.npoints}") plt.render() plt.interactive().close() vedo-2023.4.6/examples/volumetric/tet_isos_slice.py000066400000000000000000000007451444463326400223160ustar00rootroot00000000000000# Thresholding and slicing a TetMesh from vedo import TetMesh, dataurl, show tetmesh = TetMesh(dataurl+'limb_ugrid.vtk').color('Spectral') tetmesh.add_scalarbar3d('chem_0 expression', c='k') thrslist = [0.2, 0.3, 0.8] isos = tetmesh.isosurface(thrslist) slce = tetmesh.slice(normal=(1,1,1)).lw(0.1) show([ (tetmesh, "A TetMesh"), (isos, "Isosurfaces for thresholds:\n"+str(thrslist)), (slce, "Slice TetMesh with plane"), ], N=3, axes=1, viewup='z').close() vedo-2023.4.6/examples/volumetric/tet_threshold.py000066400000000000000000000006611444463326400221530ustar00rootroot00000000000000"""Threshold the original TetMesh with a scalar array""" from vedo import * settings.use_depth_peeling = True tetm = TetMesh(dataurl+'limb_ugrid.vtk') tetm.color('prism').alpha([0,1]) # Threshold the tetrahedral mesh for values in the range: tetm.threshold(above=0.9, below=1) tetm.add_scalarbar3d('chem_0 expression levels', c='k', italic=1) show([(tetm,__doc__), tetm.tomesh(shrink=0.9), ], N=2, axes=1, ).close() vedo-2023.4.6/examples/volumetric/tetralize_surface.py000066400000000000000000000017041444463326400230150ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- """Tetralize a closed surface mesh Click on the mesh and press ↓ or x to toggle a piece""" from vedo import dataurl, Sphere, settings, Mesh, TessellatedBox, show settings.use_depth_peeling = True surf = Sphere(quads=True, res=15) # surf = TessellatedBox() # surf = Mesh(dataurl+'290_closed.vtk') # surf = Mesh(dataurl+'bunny.obj', c='g3').fill_holes().cap().smooth() tmesh = surf.tetralize(side=0.015, debug=True) #tmesh.write('mytetmesh.vtk') # save to disk! # Assign an id to each tetrahedron to visualize regions seeds = surf.clone().subsample(0.3) cids = [] for p in tmesh.cell_centers(): cid = seeds.closest_point(p, return_point_id=True) cids.append(cid) tmesh.celldata["fragments"] = cids pieces = [] for i in range(seeds.npoints): tc = tmesh.clone().threshold("fragments", above=i-0.1, below=i+0.1) mc = tc.tomesh(fill=True, shrink=0.95).color(i) pieces.append(mc) show(__doc__, pieces, axes=1) vedo-2023.4.6/examples/volumetric/ugrid1.py000066400000000000000000000003111444463326400204660ustar00rootroot00000000000000 from vedo import * ug1 = UGrid(dataurl+'ugrid.vtk') ug2= ug1.clone().tomesh().wireframe() cyl = Cylinder(r=3, height=7).x(3).wireframe() ug1.cut_with_mesh(cyl) show(ug1, ug2, cyl, axes=1).close() vedo-2023.4.6/examples/volumetric/ugrid2.py000066400000000000000000000004221444463326400204720ustar00rootroot00000000000000"""Cut UGrid with plane""" from vedo import * ug = UGrid(dataurl+'ugrid.vtk') ug.c('g',0.2).lc('r').lw(2) ug.cut_with_plane(origin=(5,0,1), normal=(1,1,5)) msh = ug.tomesh(shrink=0.8) # return a polygonal Mesh show([(ug, __doc__), msh], N=2, axes=1, viewup='z').close() vedo-2023.4.6/examples/volumetric/vol2points.py000066400000000000000000000004351444463326400214210ustar00rootroot00000000000000"""Extract all image voxels as points""" from vedo import * v = Volume(dataurl+'vase.vti') pts = v.topoints().print() # returns Points scalars = pts.pointdata[0] pts.cmap('afmhot_r', scalars).point_size(1) show([(v,__doc__), pts], N=2, viewup='z', bg2='lightblue', axes=1).close() vedo-2023.4.6/examples/volumetric/volumeFromMesh.py000066400000000000000000000006461444463326400222560ustar00rootroot00000000000000"""Generate a Volume with the signed distance from a Mesh, then generate the isosurface at distance -0.5""" from vedo import * mesh = Mesh(dataurl+"beethoven.ply").subdivide() mesh.color('k').point_size(3) # render mesh as points # Generate signed distance volume vol = mesh.signed_distance(dims=(40,40,40)) # Generate an isosurface at distance -0.5 iso = vol.isosurface(-0.5) show(mesh, iso, __doc__, axes=1).close() vedo-2023.4.6/examples/volumetric/volume_operations.py000066400000000000000000000036121444463326400230540ustar00rootroot00000000000000""" Perform other simple mathematical operation between 3d Volumes. Possible operations are: +, -, /, 1/x, sin, cos, exp, log, abs, **2, sqrt, min, max, atan, atan2, median, mag, dot, gradient, divergence, laplacian. Alphas defines the opacity transfer function in the scalar range. """ from vedo import * printc(__doc__) plt = Plotter(N=6) v0 = Volume(dataurl+'embryo.slc').c(0) v0.add_scalarbar3d() plt.at(0).show("original", v0) v1 = v0.clone().operation("gradient").operation("mag") v1.add_scalarbar3d() # print(v1.pointdata.keys()) plt.at(1).show("gradient", v1) v2 = v0.clone().operation("divergence").c(2) v2.add_scalarbar3d() plt.at(2).show("divergence", v2) v3 = v0.clone().operation("laplacian").c(3) v3.add_scalarbar3d() plt.at(3).show("laplacian", v3) v4 = v0.clone().operation("median").c(4) v4.add_scalarbar3d() plt.at(4).show("median", v4) v5 = v0.clone().operation("dot", v0).c(7) v5.add_scalarbar3d() plt.at(5).show("dot(v0,v0)", v5, zoom=1.3) plt.interactive().close() ############################################################# example application #Start with creating a masked Volume then compute its gradient and probe 2 points msh = Ellipsoid() vol = msh.signed_distance(dims=(20, 20, 20)) vol.threshold(above=0.0, replace=0.0) # replacing all values outside to 0 vol.c("blue").alpha([0.9, 0.0]).alpha_unit(0.1).add_scalarbar3d() vgrad = vol.operation("gradient") printc(vgrad.pointdata.keys(), c='g') grd = vgrad.pointdata['ImageScalarsGradient'] pts = vol.points() # coords as numpy array arrs = Arrows(pts, pts + grd*0.1).lighting('off') pts_probes = [[0.2,0.5,0.5], [0.2,0.3,0.4]] vects = probe_points(vgrad, pts_probes).pointdata['ImageScalarsGradient'] arrs_pts_probe = Arrows(pts_probes, pts_probes+vects) plt = Plotter(axes=1, N=2) plt.at(0).show("A masked Volume", vol) plt.at(1).show("..compute its gradient and probe 2 points", arrs, arrs_pts_probe) plt.interactive().close() vedo-2023.4.6/examples/volumetric/volume_sharemap.py000066400000000000000000000014011444463326400224630ustar00rootroot00000000000000"""Share the same color and transparency mapping across different volumes""" from vedo import Volume, Line, show import numpy as np arr = np.zeros(shape=(50,60,70)) for i in range(50): for j in range(60): for k in range(70): arr[i,j,k] = k vol1 = Volume(arr ).mode(1).cmap('jet', alpha=[0,1], vmin=0, vmax=80).add_scalarbar("vol1") vol2 = Volume(arr+30).mode(1).cmap('jet', alpha=[0,1], vmin=0, vmax=80).add_scalarbar("vol2") # or equivalently, to set transparency: # vol1.alpha([0,1], vmin=0, vmax=70) # can also manually build an extra scalarbar object to span the whole range: sb = Line([50,0,0],[50,50,0]).cmap('jet',[0,70]).add_scalarbar3d("vol2", c='black').scalarbar show([(vol1, __doc__), (vol2, sb)], N=2, axes=1, elevation=-25) vedo-2023.4.6/examples/volumetric/warp_scalars.py000066400000000000000000000005611444463326400217630ustar00rootroot00000000000000"""Warp scalars inside of a Volumetric dataset""" from vedo import Volume, Cube, Arrows, show, dataurl vol = Volume(dataurl+"embryo.tif") source = Cube().scale(3000) target = Cube().scale([4000,5000,6000]).rotate_x(20).wireframe() arrs = Arrows(source, target, c='k') vol.warp(source, target, fit=True) show(vol, arrs, source, target, __doc__, axes=1, viewup='z') vedo-2023.4.6/requirements.txt000066400000000000000000000000301444463326400161740ustar00rootroot00000000000000vtk Deprecated Pygments vedo-2023.4.6/setup.cfg000066400000000000000000000000441444463326400145360ustar00rootroot00000000000000[metadata] license_files = *LICENSE vedo-2023.4.6/setup.py000077500000000000000000000053171444463326400144420ustar00rootroot00000000000000from setuptools import setup try: VERSIONFILE = "vedo/version.py" verstrline = open(VERSIONFILE, "rt").read() verstr = verstrline.split("=")[1].replace("\n", "").replace("'", "") except: verstr = "unknown" ############################################################## setup( name="vedo", version=verstr, python_requires=">=3", license="MIT", license_files=['LICENSE', 'FONT.LICENSE'], packages=[ "vedo", "vedo.examples.basic", "vedo.examples.advanced", "vedo.examples.pyplot", "vedo.examples.simulations", "vedo.examples.volumetric", "vedo.examples.other", "vedo.examples.other.dolfin", "vedo.examples.other.trimesh", ], package_dir={ 'vedo': 'vedo', 'vedo.examples.basic': 'examples/basic', 'vedo.examples.advanced': 'examples/advanced', 'vedo.examples.pyplot': 'examples/pyplot', 'vedo.examples.simulations': 'examples/simulations', 'vedo.examples.volumetric': 'examples/volumetric', 'vedo.examples.other': 'examples/other', 'vedo.examples.other.dolfin': 'examples/other/dolfin', 'vedo.examples.other.trimesh': 'examples/other/trimesh', }, entry_points={ "console_scripts": ["vedo=vedo.cli:execute_cli"], }, install_requires=["vtk", "numpy", "Deprecated", "Pygments"], include_package_data=True, description="A python module for scientific analysis and visualization of 3D objects and point clouds based on VTK.", long_description="A python module for scientific visualization, analysis of 3D objects and point clouds based on VTK. Check out https://vedo.embl.es for documentation.", author="Marco Musy", author_email="marco.musy@embl.es", maintainer="Marco Musy", url="https://github.com/marcomusy/vedo", keywords="vtk 3D science analysis visualization mesh numpy", classifiers=[ "Intended Audience :: Science/Research", "Intended Audience :: Education", "Intended Audience :: Information Technology", "Programming Language :: Python", "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Topic :: Scientific/Engineering :: Visualization", "Topic :: Scientific/Engineering :: Physics", "Topic :: Scientific/Engineering :: Medical Science Apps.", "Topic :: Scientific/Engineering :: Information Analysis", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Operating System :: MacOS", ], ) vedo-2023.4.6/tests/000077500000000000000000000000001444463326400140615ustar00rootroot00000000000000vedo-2023.4.6/tests/common/000077500000000000000000000000001444463326400153515ustar00rootroot00000000000000vedo-2023.4.6/tests/common/run_all.sh000077500000000000000000000002541444463326400173450ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # set -e for f in test_*.py do echo "Processing $f script.." python3 "$f" done echo '---------' echo "All good." echo '---------' vedo-2023.4.6/tests/common/test_0_imports.py000066400000000000000000000003111444463326400206710ustar00rootroot00000000000000 print("IMPORTING vtkclasses") try: import vedo.vtkclasses except: assert False exit(1) print("importing vtkclasses success") import numpy as np print("NUMPY Version:", np.__version__) vedo-2023.4.6/tests/common/test_actors.py000066400000000000000000000246551444463326400202710ustar00rootroot00000000000000from vedo import Cone, Sphere, merge, Volume, dataurl, utils import numpy as np import vtk print('---------------------------------') print('vtkVersion', vtk.vtkVersion().GetVTKVersion()) print('---------------------------------') ##################################### cone = Cone(res=48) sphere = Sphere(res=24) carr = cone.cell_centers()[:, 2] parr = cone.points()[:, 0] cone.pointdata["parr"] = parr cone.celldata["carr"] = carr carr = sphere.cell_centers()[:, 2] parr = sphere.points()[:, 0] sphere.pointdata["parr"] = parr sphere.celldata["carr"] = carr sphere.pointdata["pvectors"] = np.sin(sphere.points()) sphere.compute_elevation() cone.compute_normals() sphere.compute_normals() ###################################### test clone() c2 = cone.clone() print('clone()', cone.npoints, c2.npoints) assert cone.npoints == c2.npoints print('clone()', cone.ncells, c2.ncells) assert cone.ncells == c2.ncells ###################################### test merge() m = merge(sphere, cone) print('merge()', m.npoints, cone.npoints + sphere.npoints) assert m.npoints == cone.npoints + sphere.npoints print('merge()', m.ncells, cone.ncells + sphere.ncells) assert m.ncells == cone.ncells + sphere.ncells ###################################### inputdata print('inputdata', [cone.inputdata()], "vtk.vtkPolyData") assert isinstance(cone.inputdata(), vtk.vtkPolyData) ###################################### mapper print('mapper',[cone.mapper()], "vtk.vtkPolyDataMapper") assert isinstance(cone.mapper(), vtk.vtkPolyDataMapper) ###################################### pickable cone.pickable(False) cone.pickable(True) print('pickable', cone.pickable(), True) assert cone.pickable() ###################################### pos cone.SetPosition(1,2,3) print('pos', [1,2,3], cone.pos()) assert np.allclose([1,2,3], cone.pos()) cone.pos(5,6) print('pos',[5,6,0], cone.pos()) assert np.allclose([5,6,0], cone.pos()) ###################################### shift cone.pos(5,6,7).shift(3,0,0) print('shift',[8,6,7], cone.pos()) assert np.allclose([8,6,7], cone.pos()) ###################################### x y z cone.pos(10,11,12) cone.x(1.1) print('x y z',[1.1,11,12], cone.pos()) assert np.allclose([1.1,11,12], cone.pos()) cone.y(1.2) print('x y z',[1.1,1.2,12], cone.pos()) assert np.allclose([1.1,1.2,12], cone.pos()) cone.z(1.3) print('x y z',[1.1,1.2,1.3], cone.pos()) assert np.allclose([1.1,1.2,1.3], cone.pos()) ###################################### rotate cr = cone.pos(0,0,0).clone().rotate(90, axis=(0, 1, 0)) print('rotate', np.max(cr.points()[:,2]) ,'<', 1.01) assert np.max(cr.points()[:,2]) < 1.01 ###################################### orientation cr = cone.pos(0,0,0).clone().orientation(newaxis=(1, 1, 0)) print('orientation',np.max(cr.points()[:,2]) ,'<', 1.01) assert np.max(cr.points()[:,2]) < 1.01 ####################################### scale cr.scale(5) print('scale',np.max(cr.points()[:,2]) ,'>', 4.99) assert np.max(cr.points()[:,2]) > 4.99 ###################################### box bx = cone.box() print('box',bx.npoints, 24) assert bx.npoints == 24 print('box',bx.clean().npoints , 8) assert bx.clean().npoints == 8 ###################################### get_transform ct = cone.clone().rotate_x(10).rotate_y(10).rotate_z(10) print('get_transform', [ct.get_transform()], [vtk.vtkTransform]) assert isinstance(ct.get_transform(), vtk.vtkTransform) ct.apply_transform(ct.get_transform()) print('get_transform',ct.get_transform().GetNumberOfConcatenatedTransforms()) assert ct.get_transform().GetNumberOfConcatenatedTransforms() ###################################### pointdata and celldata arrnames = cone.pointdata.keys() print('pointdata', arrnames, 'parr') assert 'parr' in arrnames arrnames = cone.celldata.keys() print('celldata.keys', arrnames, 'carr') assert 'carr' in arrnames ###################################### Get Point Data arr = sphere.pointdata['parr'] print('pointdata',len(arr)) assert len(arr) print('pointdata',np.max(arr) ,'>', .99) assert np.max(arr) > .99 arr = sphere.celldata['carr'] print('celldata',[arr]) assert len(arr) print('celldata',np.max(arr) ,'>', .99) assert np.max(arr) > .99 ######################################__add__ print('__add__', [cone+sphere], [vtk.vtkAssembly]) assert isinstance(cone+sphere, vtk.vtkAssembly) ###################################### points() s2 = sphere.clone() pts = sphere.points() pts2 = pts + [1,2,3] pts3 = s2.points(pts2).points() print('points()',sum(pts3-pts2)) assert np.allclose(pts2, pts3) ###################################### faces print('faces()', np.array(sphere.faces()).shape , (2112, 3)) assert np.array(sphere.faces()).shape == (2112, 3) ###################################### texture st = sphere.clone().texture(dataurl+'textures/wood2.jpg') print('texture test') assert isinstance(st.GetTexture(), vtk.vtkTexture) ###################################### delete_cells_by_point_index sd = sphere.clone().delete_cells_by_point_index(range(100)) print('delete_cells_by_point_index',sd.npoints , sphere.npoints) assert sd.npoints == sphere.npoints print('delete_cells_by_point_index',sd.ncells ,'<', sphere.ncells) assert sd.ncells < sphere.ncells ###################################### reverse # this fails on some archs (see issue #185) # lets comment it out temporarily sr = sphere.clone().reverse().cut_with_plane() print('DISABLED: reverse test', sr.npoints, 576) rev = vtk.vtkReverseSense() rev.SetInputData(sr.polydata()) rev.Update() print('DISABLED: reverse vtk nr.pts, nr.cells') print(rev.GetOutput().GetNumberOfPoints(),sr.polydata().GetNumberOfPoints(), rev.GetOutput().GetNumberOfCells(), sr.polydata().GetNumberOfCells()) # assert sr.npoints == 576 ###################################### quantize sq = sphere.clone().quantize(0.1) print('quantize',sq.npoints , 834) assert sq.npoints == 834 ###################################### bounds ss = sphere.clone().scale([1,2,3]) print('bounds',ss.xbounds()) assert np.allclose(ss.xbounds(), [-1,1], atol=0.01) print('bounds',ss.ybounds()) assert np.allclose(ss.ybounds(), [-2,2], atol=0.01) print('bounds',ss.zbounds()) assert np.allclose(ss.zbounds(), [-3,3], atol=0.01) ###################################### average_size print('average_size', Sphere().scale(10).pos(1,3,7).average_size()) assert 9.9 < Sphere().scale(10).pos(1,3,7).average_size() < 10.1 print('diagonal_size',sphere.diagonal_size()) assert 3.3 < sphere.diagonal_size() < 3.5 print('center_of_mass',sphere.center_of_mass()) assert np.allclose(sphere.center_of_mass(), [0,0,0]) print('volume',sphere.volume()) assert 4.1 < sphere.volume() < 4.2 print('area',sphere.area()) assert 12.5 < sphere.area() < 12.6 ###################################### closest_point pt = [12,34,52] print('closest_point',sphere.closest_point(pt), [0.19883616, 0.48003298, 0.85441941]) assert np.allclose(sphere.closest_point(pt), [0.19883616, 0.48003298, 0.85441941]) ###################################### findCellsWithin ics = sphere.find_cells_in(xbounds=(-0.5, 0.5)) print('findCellsWithin',len(ics) , 1404) assert len(ics) == 1404 ######################################transformMesh T = cone.clone().pos(35,67,87).get_transform() s3 = sphere.clone().apply_transform(T) print('transformMesh',s3.center_of_mass(), (35,67,87)) assert np.allclose(s3.center_of_mass(), (35,67,87)) ######################################normalize s3 = sphere.clone().pos(10,20,30).scale([7,8,9]).normalize() print('normalize',s3.center_of_mass(), (10,20,30)) assert np.allclose(s3.center_of_mass(), (10,20,30)) print('normalize',s3.average_size()) assert 0.9 < s3.average_size() < 1.1 ###################################### crop c2 = cone.clone().crop(left=0.5) print('crop',np.min(c2.points()[:,0]), '>', -0.001) assert np.min(c2.points()[:,0]) > -0.001 ###################################### subdivide s2 = sphere.clone().subdivide(4) print('subdivide',s2.npoints , 270338) assert s2.npoints == 270338 ###################################### decimate s2 = sphere.clone().decimate(0.2) print('decimate',s2.npoints , 213) assert s2.npoints == 213 ###################################### normal_at print('normal_at',sphere.normal_at(12), [9.97668684e-01, 1.01513637e-04, 6.82437494e-02]) assert np.allclose(sphere.normal_at(12), [9.97668684e-01, 1.01513637e-04, 6.82437494e-02]) ###################################### isInside print('isInside',) assert sphere.is_inside([0.1,0.2,0.3]) ###################################### intersectWithLine (fails vtk7..) # pts = sphere.intersectWithLine([-2,-2,-2], [2,3,4]) # print('intersectWithLine',pts[0]) # assert np.allclose(pts[0], [-0.8179885149002075, -0.522485613822937, -0.2269827425479889]) # print('intersectWithLine',pts[1]) # assert np.allclose(pts[1], [-0.06572723388671875, 0.41784095764160156, 0.9014091491699219]) ############################################################################ ############################################################################ Assembly asse = cone+sphere ###################################### print('unpack',len(asse.unpack()) , 2) assert len(asse.unpack()) ==2 print('unpack', asse.unpack(0).name) assert asse.unpack(0) == cone print('unpack',asse.unpack(1).name) assert asse.unpack(1) == sphere print('unpack',asse.diagonal_size(), 4.15) assert 4.1 < asse.diagonal_size() < 4.2 ############################################################################ Volume X, Y, Z = np.mgrid[:30, :30, :30] scalar_field = ((X-15)**2 + (Y-15)**2 + (Z-15)**2)/225 print('Test Volume, scalar min, max =', np.min(scalar_field), np.max(scalar_field)) vol = Volume(scalar_field) volarr = vol.pointdata[0] print('Volume',volarr.shape[0] , 27000) assert volarr.shape[0] == 27000 print('Volume',np.max(volarr) , 3) assert np.max(volarr) == 3 print('Volume',np.min(volarr) , 0) assert np.min(volarr) == 0 ###################################### isosurface iso = vol.isosurface(1.0) print('isosurface', iso.area()) assert 2540 < iso.area() < 3000 ###################################### utils change of coords q = [5,2,3] q = utils.cart2spher(*q) q = utils.spher2cart(*q) print("cart2spher spher2cart", q) assert np.allclose(q, [5,2,3]) q = utils.cart2cyl(*q) q = utils.cyl2cart(*q) print("cart2cyl cyl2cart", q) assert np.allclose(q, [5,2,3]) q = utils.cart2cyl(*q) q = utils.cyl2spher(*q) q = utils.spher2cart(*q) print("cart2cyl cyl2spher spher2cart", q) assert np.allclose(q, [5,2,3]) q = utils.cart2spher(*q) q = utils.spher2cyl(*q) q = utils.cyl2cart(*q) print("cart2spher spher2cyl cyl2cart", q) assert np.allclose(q, [5,2,3]) ###################################### print("OK with test_actors") vedo-2023.4.6/tests/common/test_pyplot.py000066400000000000000000000050521444463326400203130ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- from vedo import shapes, show, dataurl, settings from vedo import Picture, Mesh, Points, Point from vedo.pyplot import Figure, donut settings.use_parallel_projection = True fig = Figure([-1,12], [-2,14], aspect=16/9, padding=0, title="Lorem Ipsum Neque porro quisquam", xtitle="test x-axis should always align", ytitle="y-axis (zeros should match)", grid=True, ) print(f"yscale = {fig.yscale}") man = Mesh(dataurl+'man.vtk').scale(1.4).pos(7,4).rotate_x(-90, around='itself') fig += man pic = Picture("https://vedo.embl.es/examples/data/textures/bricks.jpg") fig += pic.scale(0.005).pos(2,10) fig += Points([[8,1],[10,3]], r=15) fig += donut([0.1, 0.2, 0.3, 0.1, 0.3], c=[1,2,3,4,'w']).scale(1).pos(1,6,.2) fig += Point([2,3]) fig += Point([4,5]) fig += shapes.Circle([4,5]) fig += shapes.Circle([0,0], r=3) fig += shapes.Circle([0,12], r=3).c("r6") fig += shapes.Circle([11,12], r=3).c("p5") fig += shapes.Circle([11,0], r=3).c("o5") fig += shapes.Arrow([2,3], [4,5]).z(.05) fig += shapes.Line( [2,3], [4,5]).z(.1).lw(2) fig += shapes.Line([2,2], [4,4], c='k', lw=6).z(.1) fig += shapes.DashedLine([8,3],[10,5], spacing=0.5, c='r') fig += shapes.Tube([[8,2,0],[10,4,0]], r=.1).lighting('ambient') fig+= shapes.Marker('.').pos(5,5).scale(12) fig+= shapes.Star3D().pos(5,7).scale(0.5) fig+= shapes.Cross3D().pos(5,3).scale(0.5) fig += shapes.Glyph([[5,9]], shapes.Sphere(r=0.5)) fig += shapes.Spline([[4,0],[5,2],[6,0],[7,0.5]]).c('r4') fig += shapes.CSpline([[4,0],[5,2],[6,0],[7,0.5]]).c('r6') fig += shapes.KSpline([[4,0],[5,2],[6,0],[7,0.5]]).c('r8') fig += shapes.Bezier([[4,-1],[5,1],[6,-1],[7,-1.5]]) fig += shapes.Brace([2,1], [4,3],comment='Brace', padding1=0, italic=3).z(0.1) ## BUGGED fig+= shapes.Ribbon(shapes.Spline([[4,0],[5,2],[6,0],[7,0.5]]), shapes.Bezier([[4,-1],[5,1],[6,-1],[7,-1.5]])) fig+= shapes.Star([8,6]) fig+= shapes.Sphere([8,9,0]) fig+= shapes.Spheres([[8,10,0],[9,10,0]], r=0.2, c='g') fig += shapes.Ellipsoid().pos(9,11) fig += shapes.Grid().scale(2).pos(7,11) fig += shapes.Rectangle([2,6], [4,8], radius=0.1).c('b5') fig += shapes.Cone().scale(2).pos(10,6).rotate_y(90, around='itself') fig += shapes.Text3D("MyTest3D", c='k', justify='center', font="Quikhand")\ .pos(5,11).scale(0.5).rotate_z(20, around='itself') fig += shapes.Latex('sin(x^2)', res=150).scale(3).pos(10,0) fig2 = Figure([-2.5, 14],[-5,14], padding=0, title='Test Embedding Figure') fig2.insert(fig) import sys if len(sys.argv)>1: show(fig2, size=(1600, 1100), zoom='tight').close() vedo-2023.4.6/tests/common/test_shapes.py000066400000000000000000000006011444463326400202420ustar00rootroot00000000000000 from vedo import Arc, vtk_version import numpy as np print('-----------------------------------------------------') print('VTK Version', vtk_version, "test_shapes.py") print('-----------------------------------------------------') ##################################### arc = Arc(center=None, point1=(1, 1, 1), point2=None, normal=(0, 0, 1), angle=np.pi) assert isinstance(arc, Arc) vedo-2023.4.6/tests/common/test_utils.py000066400000000000000000000015121444463326400201210ustar00rootroot00000000000000# Tests: import numpy as np from vedo.utils import * from vedo.utils import make3d print(make3d([])) assert str(make3d([])) == '[]' print(make3d([0,1])) assert str(make3d([0,1])) == '[0 1 0]' print(make3d([0,1,2])) assert str(make3d([0,1,2])) == '[0 1 2]' # print(make3d([0,1,2,3])) # will CORRECTLY raise error print(make3d([[0,1,2,3], [6,7,8,9]])) # assert str() == '' print(make3d([ [0,1,2,3], [6,7,8,9], [6,7,8,8] ])) # assert str() == '' print(make3d([ [0,1,2], [6,7,8], [6,7,9] ])) # assert str() == '' print(make3d([ [0,1,2], [6,7,8], [6,7,9] ], transpose=True)) # assert str() == '' print(make3d([[0,1,2]])) # assert str() == '' print(make3d([[0,1,2], [6,7,8]])) # assert str() == '' print(make3d([[0,1,2], [6,7,8], [6,7,8], [6,7,4]])) # assert str() == '' print(make3d([[0,1], [6,7], [6,7], [6,7]])) # assert str() == '' vedo-2023.4.6/tests/dolfin/000077500000000000000000000000001444463326400153345ustar00rootroot00000000000000vedo-2023.4.6/tests/dolfin/run_all.sh000077500000000000000000000001601444463326400173240ustar00rootroot00000000000000#!/bin/bash # source run_all.sh # for f in test_*.py do echo "Processing $f script.." python3 "$f" done vedo-2023.4.6/tests/dolfin/test_ascalarbar.py000066400000000000000000000016031444463326400210400ustar00rootroot00000000000000import numpy as np from dolfin import * from dolfin import __version__ from vedo.dolfin import plot, screenshot, MeshActor, show from vedo import settings print('Test ascalarbar, dolfin version', __version__) if hasattr(MPI, 'comm_world'): mesh = UnitSquareMesh(MPI.comm_world, nx=16, ny=16) else: mesh = UnitSquareMesh(16,16) V = FunctionSpace(mesh, 'Lagrange', 1) f = Expression('10*(x[0]+x[1]-1)', degree=1) u = interpolate(f, V) actors = plot(u, mode='color', cmap='viridis', vmin=-3, vmax=3, style=1, returnActorsNoShow=True) actor = actors[0] solution = actor.pointdata[0] print('ArrayNames', actor.pointdata.keys()) print('min', 'mean', 'max:') print(np.min(solution), np.mean(solution), np.max(solution), len(solution)) assert len(solution) == 289 assert np.isclose(np.min(solution) , -10., atol=1e-05) assert np.isclose(np.max(solution) , 10., atol=1e-05) vedo-2023.4.6/tests/dolfin/test_pointLoad.py000066400000000000000000000042601444463326400207000ustar00rootroot00000000000000""" Apply a vector-valued point load to a corner of a linear-elastic cube. """ # Credit https://fenicsproject.discourse.group/t/ #applying-pointsource-at-two-different-vectors/1459/2 from dolfin import * from vedo.dolfin import plot import numpy as np print('Test pointLoad') BULK_MOD = 1.0 SHEAR_MOD = 1.0 mesh = UnitCubeMesh(10, 10, 10) VE = VectorElement("Lagrange", mesh.ufl_cell(), 1) V = FunctionSpace(mesh, VE) # Constrain normal displacement on two sides: def boundary1(x, on_boundary): return on_boundary and near(x[1], 0.0) bc1 = DirichletBC(V.sub(1), Constant(0.0), boundary1) def boundary2(x, on_boundary): return on_boundary and near(x[0], 0.0) bc2 = DirichletBC(V.sub(0), Constant(0.0), boundary2) # Solve linear elasticity with point load at upper-right corner: u = TrialFunction(V) v = TestFunction(V) eps = 0.5 * (grad(u) + grad(u).T) I = Identity(3) sigma = BULK_MOD*tr(eps)*I + 2*SHEAR_MOD*(eps-tr(eps)*I/3) a = inner(sigma, grad(v)) * dx L = inner(Constant((0,0,0)), v) * dx # Assemble: A = assemble(a) B = assemble(L) # Apply point sources: ptSrcLocation = Point(1-DOLFIN_EPS, 1-DOLFIN_EPS) # Vectorial point load: f = [0.01, 0.02] # Distinct point sources for x- and y-components ptSrc_x = PointSource(V.sub(0), ptSrcLocation, f[0]) ptSrc_y = PointSource(V.sub(1), ptSrcLocation, f[1]) ptSrcs = [ptSrc_x, ptSrc_y] # Apply to RHS of linear system: for ptSrc in ptSrcs: ptSrc.apply(B) # Apply BCs: for bc in [bc1, bc2]: bc.apply(A) bc.apply(B) # Solve: u = Function(V) solve(A, u.vector(), B) # Plot results: acts = plot(u, mode="displacement", returnActorsNoShow=True) actor = acts[0] solution = actor.pointdata[0] print('ArrayNames', actor.pointdata.keys()) print('min', 'mean', 'max:') print(np.min(solution), np.mean(solution), np.max(solution), len(solution)) print('bounds[3]:') print(actor.bounds()[3]) assert np.isclose(np.min(solution) , 0.0007107061021966307, atol=1e-03) assert np.isclose(np.mean(solution), 0.012744666491495634, atol=1e-03) assert np.isclose(np.max(solution) , 0.4923130138837739, atol=1e-03) assert len(solution) == 1331 assert np.isclose(actor.bounds()[3] , 1.425931564186973, atol=1e-03) print('Test pointLoad PASSED') vedo-2023.4.6/tests/dolfin/test_poisson.py000066400000000000000000000021771444463326400204460ustar00rootroot00000000000000from fenics import * import numpy as np print('Test poisson' ) # Create mesh and define function space mesh = UnitSquareMesh(8, 8) V = FunctionSpace(mesh, "P", 1) # Define boundary condition uD = Expression("1 + x[0]*x[0] + 2*x[1]*x[1]", degree=2) bc = DirichletBC(V, uD, "on_boundary") # Define variational problem w = TrialFunction(V) v = TestFunction(V) u = Function(V) f = Constant(-6.0) # Compute solution solve( dot(grad(w), grad(v))*dx == f*v*dx, u, bc) f = r'-\nabla^{2} u=f' ########################################################### vedo from vedo.dolfin import plot from vedo import Latex l = Latex(f, s=0.2, c='w').shift(.6,.6,.1) acts = plot(u, l, cmap='jet', scalarbar='h', returnActorsNoShow=True) actor = acts[0] solution = actor.pointdata[0] print('ArrayNames', actor.pointdata.keys()) print('min', 'mean', 'max:') print(np.min(solution), np.mean(solution), np.max(solution), len(solution)) assert np.isclose(np.min(solution) , 1., atol=1e-03) assert np.isclose(np.mean(solution), 2.0625, atol=1e-03) assert np.isclose(np.max(solution) , 4., atol=1e-03) assert len(solution) == 81 print('Test poisson PASSED') vedo-2023.4.6/tests/snippets/000077500000000000000000000000001444463326400157265ustar00rootroot00000000000000vedo-2023.4.6/tests/snippets/test_docs_sniplets.py000066400000000000000000000235021444463326400222120ustar00rootroot00000000000000## This contains the script snippets that come with the documetation for testing import numpy as np from vedo import * from vedo.pyplot import plot import vedo doshow = 1 ##################################################################### addons.py box = Box(pos=(1,2,3), length=8, width=9, height=7).alpha(0.1) axs = Axes(box, c='k') # returns Assembly object for a in axs.unpack(): print(a.name) if doshow: show(box, axs).close() ###################################################### print("Test 1") b = Box(pos=(0, 0, 0), length=80, width=90, height=70).alpha(0.1) if doshow: show( b, axes={ "xtitle": "Some long variable [a.u.]", "number_of_divisions": 4, # ... }, ).close() ##################################################################### base.py print("Test 2") c1 = Cube() c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 v = vector(0.2,1,0) p = vector(1,0,0) # axis passes through this point c2.rotate(90, axis=v, point=p) l = Line(-v+p, v+p).lw(3).c('red') if doshow: show(c1, l, c2, axes=1).close() ###################################################### print("Test 3") objs = [] for i in range(-5, 5): p = [i/3, i/2, i] v = vector(i/10, i/20, 1) c = Circle(r=i/5+1.2).pos(p).orientation(v).lw(3) objs += [c, Arrow(p,p+v)] if doshow: show(objs, axes=1).close() ###################################################### print("Test 4") c1 = Cube() c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 v = vector(0.2,1,0) p = vector(1,0,0) # axis passes through this point c2.rotate(90, axis=v, point=p) # get the inverse of the current transformation T = c2.get_transform(invert=True) c2.apply_transform(T) # put back c2 in place l = Line(p-v, p+v).lw(3).c('red') if doshow: show(c1.wireframe().lw(3), l, c2, axes=1).close() ###################################################### print("Test 5") tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') tetmesh.color('rainbow') cu = Cube(side=500).x(500) # any Mesh works tetmesh.cut_with_box(cu) if doshow: show(axes=1).close() ##################################################################### mesh.py print("Test 6") s = Sphere().crop(right=0.3, left=0.1) if doshow: show(s).close() ###################################################### print("Test 7") c1 = Cylinder(pos=(0,0,0), r=2, height=3, axis=(1,.0,0), alpha=.1).triangulate() c2 = Cylinder(pos=(0,0,2), r=1, height=2, axis=(0,.3,1), alpha=.1).triangulate() intersect = c1.intersect_with(c2).join(reset=True) spline = Spline(intersect).c('blue').lw(5) if doshow: show(c1, c2, spline, intersect.labels('id'), axes=1).close() ###################################################### print("Test 8") grid = Grid()#.triangulate() circle = Circle(r=0.3, res=24).pos(0.11,0.12) line = Line(circle, closed=True, lw=4, c='r4') # grid.imprint(line) if doshow: show(grid, line, axes=1).close() ##################################################################### picture.py print("Test 9") if doshow: pic = Picture(dataurl+'dog.jpg').pad() pic.append([pic,pic,pic], axis='y') pic.append([pic,pic,pic,pic], axis='x') pic.show(axes=1).close() ###################################################### print("Test 10") if doshow: p = vedo.Picture(vedo.dataurl+'images/dog.jpg').bw() pe = p.clone().enhance() show(p, pe, N=2, mode='image', zoom='tight').close() ###################################################### print("Test 11") if doshow: pic1 = Picture("https://aws.glamour.es/prod/designs/v1/assets/620x459/547577.jpg") pic2 = pic1.clone().invert() pic3 = pic1.clone().binarize() show(pic1, pic2, pic3, N=3, bg="blue9").close() ###################################################### print("Test 12") if doshow: pic = vedo.Picture(vedo.dataurl+"images/dog.jpg") pic.rectangle([100,300], [100,200], c='green4', alpha=0.7) pic.line([100,100],[400,500], lw=2, alpha=1) pic.triangle([250,300], [100,300], [200,400]) show(pic, axes=1).close() ##################################################################### plotter.py print("Test 13") cone = Cone() if doshow: cone.show(axes=1).fly_to([1,0,0]) cone.show().close() ###################################################### print("Test 14") settings.use_parallel_projection = True # or else it doesnt make sense! cube = Cube().alpha(0.2) plt = Plotter(size=(900,600), axes=dict(xtitle='x (um)')) if doshow: plt.add_scale_indicator(units='um', c='blue4') plt.show(cube, "Scale indicator with units").close() settings.use_parallel_projection = False ###################################################### print("Test 15") def func(evt): # called every time the mouse moves # evt is a dotted dictionary if not evt.actor: return # no hit, return print("point coords =", evt.picked3d) elli = Ellipsoid() plt = Plotter(axes=1) plt.add_callback('mouse hovering', func) if doshow: plt.show(elli).close() ##################################################################### pointcloud.py print("Test 16") s = Ellipsoid().rotate_y(30) #Camera options: pos, focal_point, viewup, distance, # clippingRange, parallelScale, thickness, viewAngle camopts = dict(pos=(0,0,25), focal_point=(0,0,0)) if doshow: show(s, camera=camopts, offscreen=True).close() m = visible_points(s) #print('visible pts:', m.points()) # numpy array show(m, new=True, axes=1).close() # optionally draw result on a new window ###################################################### print("Test 17") def fibonacci_sphere(n): s = np.linspace(0, n, num=n, endpoint=False) theta = s * 2.399963229728653 y = 1 - s * (2/(n-1)) r = np.sqrt(1 - y * y) x = np.cos(theta) * r z = np.sin(theta) * r return [x,y,z] fpoints = Points(fibonacci_sphere(1000)) if doshow: fpoints.show(axes=1).close() ###################################################### print("Test 18") s = Sphere(res=10).linewidth(1).c("orange").compute_normals() point_ids = s.labels('id', on="points").c('green') cell_ids = s.labels('id', on="cells").c('black') if doshow: show(s, point_ids, cell_ids).close() ###################################################### print("Test 19") sph = Sphere(quads=True, res=4).compute_normals().wireframe() sph.celldata["zvals"] = sph.cell_centers()[:,2] l2d = sph.labels("zvals", on="cells", precision=2).backcolor('orange9') if doshow: show(sph, l2d, axes=1).close() ###################################################### print("Test 20") c1 = Cube().rotate_z(5).x(2).y(1) print("cube1 position", c1.pos()) T = c1.get_transform() # rotate by 5 degrees, sum 2 to x and 1 to y c2 = Cube().c('r4') c2.apply_transform(T) # ignore previous movements c2.apply_transform(T, concatenate=True) c2.apply_transform(T, concatenate=True) print("cube2 position", c2.pos()) if doshow: show(c1, c2, axes=1).close() ###################################################### print("Test 21") disc = Disc(r1=1, r2=1.2) mesh = disc.extrude(3, res=50).linewidth(1) mesh.cut_with_cylinder([0,0,2], r=0.4, axis='y', invert=True) if doshow: show(mesh, axes=1) ###################################################### print("Test 22") disc = Disc(r1=1, r2=1.2) mesh = disc.extrude(3, res=50).linewidth(1) mesh.cut_with_sphere([1,-0.7,2], r=1.5, invert=True) if doshow: show(mesh, axes=1).close() ###################################################### print("Test 23") arr = np.random.randn(100000, 3)/2 pts = Points(arr).c('red3').pos(5,0,0) cube = Cube().pos(4,0.5,0) assem = pts.cut_with_mesh(cube, keep=True) if doshow: show(assem.unpack(), axes=1).close() ##################################################################### shapes.py print("Test 24") pts = [[1, 0, 0], [5, 2, 0], [3, 3, 1]] ln = Line(pts, c='r', lw=5).pattern('- -', repeats=10) if doshow: ln.show(axes=1).close() ###################################################### print("Test 25") if doshow: shape = load(dataurl+"timecourse1d.npy")[58] pts = shape.rotate_x(30).points() tangents = Line(pts).tangents() arrs = Arrows(pts, pts+tangents, c='blue9') show(shape.c('red5').lw(5), arrs, bg='bb', axes=1).close() ###################################################### print("Test 26") if doshow: shape = load(dataurl+"timecourse1d.npy")[55] curvs = Line(shape.points()).curvature() shape.cmap('coolwarm', curvs, vmin=-2,vmax=2).add_scalarbar3d(c='w') shape.render_lines_as_tubes().lw(12) pp = plot(curvs, ac='white', lc='yellow5') show(shape, pp, N=2, bg='bb', sharecam=False).close() ###################################################### print("Test 27") aline = Line([(0,0,0),(1,3,0),(2,4,0)]) surf1 = aline.sweep((1,0.2,0), res=3) surf2 = aline.sweep((0.2,0,1)) aline.color('r').linewidth(4) if doshow: show(surf1, surf2, aline, axes=1).close() ###################################################### print("Test 28") pts = [(-4,-3),(1,1),(2,4),(4,1),(3,-1),(2,-5),(9,-3)] ln = Line(pts, c='r', lw=2).z(0.01) rl = RoundedLine(pts, 0.6) if doshow: show(Points(pts), ln, rl, axes=1).close() ###################################################### print("Test 29") pts = np.random.randn(25,3) for i,p in enumerate(pts): p += [5*i, 15*sin(i/2), i*i*i/200] if doshow: show(Points(pts), Bezier(pts), axes=1).close() ###################################################### print("Test 30") xcoords = np.arange(0, 2, 0.2) ycoords = np.arange(0, 1, 0.2) sqrtx = sqrt(xcoords) grid = Grid(s=(sqrtx, ycoords)) if doshow: grid.show(axes=8) # can also create a grid from np.mgrid: X, Y = np.mgrid[-12:12:1000*1j, 0:15:1000*1j] vgrid = Grid(s=(X[:,0], Y[0])) if doshow: vgrid.show(axes=8).close() ###################################################### print("Test 31") settings.immediate_rendering = False plt = Plotter(N=18) for i in range(18): ps = ParametricShape(i).color(i) if doshow: plt.at(i).show(ps, ps.name) if doshow: plt.interactive() vedo-2023.4.6/vedo.desktop000066400000000000000000000011121444463326400152420ustar00rootroot00000000000000 # In linux systems, place this file in directory: # /usr/share/applications/ # sudo chmod o+r /usr/share/applications/vedo.desktop # # then right-click a file # choose Properties # choose Open With ... vedo [Desktop Entry] Type=Application Name=vedo GenericName=vedo Comment=Scientific 3D Viewer Comment[it]=Visualizzatore di modelli 3D in vari formati Exec=vedo -n %F Categories=Science;Graphics;3DGraphics; Icon=python Terminal=true StartupNotify=false MimeType=text/x-python;application/x-wavefront-obj;application/x-collada; X-AppStream-Ignore=True Keywords=browser;vtk;collada; vedo-2023.4.6/vedo/000077500000000000000000000000001444463326400136545ustar00rootroot00000000000000vedo-2023.4.6/vedo/__init__.py000066400000000000000000000071341444463326400157720ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- # ##### To generate documentation # cd ~/Projects/vedo/docs/pdoc # ./build_html.py ############################### """ .. include:: ../docs/documentation.md """ ######################################################################## imports import os import sys import logging import numpy as np from numpy import sin, cos, sqrt, exp, log, dot, cross # just because handy from vtkmodules.vtkCommonCore import vtkVersion ################################################# from vedo.version import _version as __version__ from vedo.settings import Settings settings = Settings(level=0) from vedo.colors import * from vedo.utils import * from vedo.base import * from vedo.shapes import * from vedo.file_io import * from vedo.ugrid import * from vedo.assembly import * from vedo.pointcloud import * from vedo.mesh import * from vedo.picture import * from vedo.volume import * from vedo.tetmesh import * from vedo.addons import * from vedo.plotter import * from vedo import applications from vedo import interactor_modes try: import platform sys_platform = platform.system() except (ModuleNotFoundError, AttributeError) as e: sys_platform = "" ######################################################################### GLOBALS __author__ = "Marco Musy" __license__ = "MIT" __maintainer__ = "M. Musy" __email__ = "marco.musy@embl.es" __website__ = "https://github.com/marcomusy/vedo" ########################################################################## vtk_version = ( int(vtkVersion().GetVTKMajorVersion()), int(vtkVersion().GetVTKMinorVersion()), int(vtkVersion().GetVTKBuildVersion()), ) installdir = os.path.dirname(__file__) dataurl = "https://vedo.embl.es/examples/data/" plotter_instance = None notebook_plotter = None notebook_backend = None ## fonts fonts_path = os.path.join(installdir, "fonts/") # Note: # a fatal error occurs when compiling to exe, # developer needs to copy the fonts folder to the same location as the exe file # to solve this problem if not os.path.exists(fonts_path): fonts_path = "fonts/" fonts = [_f.split(".")[0] for _f in os.listdir(fonts_path) if '.npz' not in _f] fonts = list(sorted(fonts)) # pyplot module to remember last figure format last_figure = None ######################################################################### LOGGING class _LoggingCustomFormatter(logging.Formatter): logformat = "[vedo.%(filename)s] %(levelname)s: %(message)s" white = "\x1b[1m" grey = "\x1b[2m\x1b[1m\x1b[38;20m" yellow = "\x1b[1m\x1b[33;20m" red = "\x1b[1m\x1b[31;20m" inv_red = "\x1b[7m\x1b[1m\x1b[31;1m" reset = "\x1b[0m" FORMATS = { logging.DEBUG: grey + logformat + reset, logging.INFO: white + logformat + reset, logging.WARNING: yellow + logformat + reset, logging.ERROR: red + logformat + reset, logging.CRITICAL: inv_red + logformat + reset, } def format(self, record): log_fmt = self.FORMATS.get(record.levelno) formatter = logging.Formatter(log_fmt) return formatter.format(record).replace(".py", "") logger = logging.getLogger("vedo") _chsh = logging.StreamHandler() _chsh.flush = sys.stdout.flush _chsh.setLevel(logging.DEBUG) _chsh.setFormatter(_LoggingCustomFormatter()) logger.addHandler(_chsh) logger.setLevel(logging.INFO) ################################################# silence annoying messages # import warnings # warnings.simplefilter(action="ignore", category=FutureWarning) # try: # np.warnings.filterwarnings('ignore', category=np.VisibleDeprecationWarning) # except AttributeError: # pass vedo-2023.4.6/vedo/addons.py000066400000000000000000004555561444463326400155220ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo from vedo import settings from vedo import utils from vedo import shapes from vedo.assembly import Assembly, Group from vedo.colors import get_color, build_lut, color_map, printc from vedo.mesh import Mesh from vedo.pointcloud import Points, Point, merge from vedo.tetmesh import TetMesh from vedo.volume import Volume __docformat__ = "google" __doc__ = """ Create additional objects like axes, legends, lights, etc. ![](https://vedo.embl.es/images/pyplot/customAxes2.png) """ __all__ = [ "ScalarBar", "ScalarBar3D", "Slider2D", "Slider3D", "Icon", "LegendBox", "Light", "Axes", "RendererFrame", "Ruler", "RulerAxes", "Ruler2D", "DistanceTool", "SplineTool", "Goniometer", "Button", "Flagpost", "ProgressBarWidget", "BoxCutter", "PlaneCutter", "SphereCutter", ] ######################################################################################## class Flagpost(vtk.vtkFlagpoleLabel): """ Create a flag post style element to describe an object. """ def __init__( self, txt="", base=(0, 0, 0), top=(0, 0, 1), s=1, c="k9", bc="k1", alpha=1, lw=0, font="Calco", justify="center-left", vspacing=1, ): """ Create a flag post style element to describe an object. Arguments: txt : (str) Text to display. The default is the filename or the object name. base : (list) position of the flag anchor point. top : (list) a 3D displacement or offset. s : (float) size of the text to be shown c : (list) color of text and line bc : (list) color of the flag background alpha : (float) opacity of text and box. lw : (int) line with of box frame. The default is 0. font : (str) font name. Use a monospace font for better rendering. The default is "Calco". Type `vedo -r fonts` for a font demo. Check [available fonts here](https://vedo.embl.es/fonts). justify : (str) internal text justification. The default is "center-left". vspacing : (float) vertical spacing between lines. Examples: - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/other/flag_labels2.py) ![](https://vedo.embl.es/images/other/flag_labels2.png) """ vtk.vtkFlagpoleLabel.__init__(self) base = utils.make3d(base) top = utils.make3d(top) self.SetBasePosition(*base) self.SetTopPosition(*top) self.SetFlagSize(s) self.SetInput(txt) self.PickableOff() self.GetProperty().LightingOff() self.GetProperty().SetLineWidth(lw + 1) prop = self.GetTextProperty() if bc is not None: prop.SetBackgroundColor(get_color(bc)) prop.SetOpacity(alpha) prop.SetBackgroundOpacity(alpha) if bc is not None and len(bc) == 4: prop.SetBackgroundRGBA(alpha) c = get_color(c) prop.SetColor(c) self.GetProperty().SetColor(c) prop.SetFrame(bool(lw)) prop.SetFrameWidth(lw) prop.SetFrameColor(prop.GetColor()) prop.SetFontFamily(vtk.VTK_FONT_FILE) fl = utils.get_font_path(font) prop.SetFontFile(fl) prop.ShadowOff() prop.BoldOff() prop.SetOpacity(alpha) prop.SetJustificationToLeft() if "top" in justify: prop.SetVerticalJustificationToTop() if "bottom" in justify: prop.SetVerticalJustificationToBottom() if "cent" in justify: prop.SetVerticalJustificationToCentered() prop.SetJustificationToCentered() if "left" in justify: prop.SetJustificationToLeft() if "right" in justify: prop.SetJustificationToRight() prop.SetLineSpacing(vspacing * 1.2) self.SetUseBounds(False) def text(self, value): self.SetInput(value) return self def on(self): self.VisibilityOn() return self def off(self): self.VisibilityOff() return self def toggle(self): self.SetVisibility(not self.GetVisibility()) return self def use_bounds(self, value=True): self.SetUseBounds(value) return self def color(self, c): c = get_color(c) self.GetTextProperty().SetColor(c) self.GetProperty().SetColor(c) return self def pos(self, p): p = np.asarray(p) self.top = self.top - self.base + p self.base = p return self @property def base(self): return np.array(self.GetBasePosition()) @property def top(self): return np.array(self.GetTopPosition()) @base.setter def base(self, value): self.SetBasePosition(*value) @top.setter def top(self, value): self.SetTopPosition(*value) ########################################################################################### class LegendBox(shapes.TextBase, vtk.vtkLegendBoxActor): """ Create a 2D legend box. """ def __init__( self, entries=(), nmax=12, c=None, font="", width=0.18, height=None, padding=2, bg="k8", alpha=0.25, pos="top-right", markers=None, ): """ Create a 2D legend box for the list of specified objects. Arguments: nmax : (int) max number of legend entries c : (color) text color, leave as None to pick the mesh color automatically font : (str) Check [available fonts here](https://vedo.embl.es/fonts) width : (float) width of the box as fraction of the window width height : (float) height of the box as fraction of the window height padding : (int) padding space in units of pixels bg : (color) background color of the box alpha: (float) opacity of the box pos : (str, list) position of the box, can be either a string or a (x,y) screen position in range [0,1] Examples: - [legendbox.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/legendbox.py) - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) ![](https://vedo.embl.es/images/other/flag_labels.png) """ vtk.vtkLegendBoxActor.__init__(self) shapes.TextBase.__init__(self) self.name = "LegendBox" self.entries = entries[:nmax] self.property = self.GetEntryTextProperty() n = 0 texts = [] for e in self.entries: ename = e.name if "legend" in e.info.keys(): if not e.info["legend"]: ename = "" else: ename = str(e.info["legend"]) if not isinstance(e, vtk.vtkActor): ename = "" if ename: n += 1 texts.append(ename) self.SetNumberOfEntries(n) if not n: return self.ScalarVisibilityOff() self.PickableOff() self.SetPadding(padding) self.property.ShadowOff() self.property.BoldOff() # self.property.SetJustificationToLeft() # no effect # self.property.SetVerticalJustificationToTop() if not font: font = settings.default_font self.font(font) n = 0 for i in range(len(self.entries)): ti = texts[i] if not ti: continue e = entries[i] if c is None: col = e.GetProperty().GetColor() if col == (1, 1, 1): col = (0.2, 0.2, 0.2) else: col = get_color(c) if markers is None: # default poly = e.inputdata() else: marker = markers[i] if utils.is_sequence(markers) else markers if isinstance(marker, vedo.Points): poly = marker.clone(deep=False).normalize().shift(0, 1, 0).polydata() else: # assume string marker poly = vedo.shapes.Marker(marker, s=1).shift(0, 1, 0).polydata() self.SetEntry(n, poly, ti, col) n += 1 self.SetWidth(width) if height is None: self.SetHeight(width / 3.0 * n) else: self.SetHeight(height) sx, sy = 1 - self.GetWidth(), 1 - self.GetHeight() if pos == 1 or ("top" in pos and "left" in pos): self.GetPositionCoordinate().SetValue(0, sy) elif pos == 2 or ("top" in pos and "right" in pos): self.GetPositionCoordinate().SetValue(sx, sy) elif pos == 3 or ("bottom" in pos and "left" in pos): self.GetPositionCoordinate().SetValue(0, 0) elif pos == 4 or ("bottom" in pos and "right" in pos): self.GetPositionCoordinate().SetValue(sx, 0) if alpha: self.UseBackgroundOn() self.SetBackgroundColor(get_color(bg)) self.SetBackgroundOpacity(alpha) else: self.UseBackgroundOff() self.LockBorderOn() class Button: """ Build a Button object. """ def __init__(self, fnc, states, c, bc, pos, size, font, bold, italic, alpha, angle): """ Build a Button object to be shown in the rendering window. Arguments: fnc : (function) external function to be called by the widget states : (list) the list of possible states, eg. ['On', 'Off'] c : (list) the list of colors for each state eg. ['red3', 'green5'] bc : (list) the list of background colors for each state pos : (list, str) 2D position in pixels from left-bottom corner size : (int) size of button font font : (str) font type bold : (bool) set bold font face italic : (bool) italic font face alpha : (float) opacity level angle : (float) anticlockwise rotation in degrees Examples: - [buttons.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/buttons.py) Examples: - [buttons.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/buttons.py) ![](https://user-images.githubusercontent.com/32848391/50738870-c0fe2500-11d8-11e9-9b78-92754f5c5968.jpg) - [timer_callback2.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/timer_callback2.py) ![](https://vedo.embl.es/images/advanced/timer_callback1.jpg) """ self.status_idx = 0 self.states = states if not utils.is_sequence(c): c = [c] self.colors = c if not utils.is_sequence(bc): bc = [bc] self.bcolors = bc assert len(c) == len(bc), "in Button color number mismatch!" self.function = fnc self.actor = vtk.vtkTextActor() self.actor.GetActualPositionCoordinate().SetCoordinateSystemToNormalizedViewport() self.actor.SetPosition(pos[0], pos[1]) self.offset = 5 self.spacer = " " self.len_states = max([len(s) for s in states]) self.text_property = self.actor.GetTextProperty() self.text_property.SetJustificationToCentered() if not font: font = settings.default_font if font.lower() == "courier": self.text_property.SetFontFamilyToCourier() elif font.lower() == "times": self.text_property.SetFontFamilyToTimes() elif font.lower() == "arial": self.text_property.SetFontFamilyToArial() else: self.text_property.SetFontFamily(vtk.VTK_FONT_FILE) self.text_property.SetFontFile(utils.get_font_path(font)) self.text_property.SetFontSize(size) self.text_property.SetBackgroundOpacity(alpha) self.text_property.BoldOff() if bold: self.text_property.BoldOn() self.text_property.ItalicOff() if italic: self.text_property.ItalicOn() self.text_property.ShadowOff() self.text_property.SetOrientation(angle) self.text_property.SetLineOffset(self.offset) self.hasframe = hasattr(self.text_property, "FrameOn") self.status(0) def text(self, txt="", c=None): if txt: # n = int(self.len_states) # ss = "{txt: ^"+str(n)+"}" # t = f"{ss}" t = txt self.actor.SetInput(self.spacer + t + self.spacer) if c is not None: self.text_property.SetColor(get_color(c)) return self def backcolor(self, c): self.text_property.SetBackgroundColor(get_color(c)) return self def frame(self, lw=None, c=None): if self.hasframe: self.text_property.FrameOn() if lw is not None: if lw > 0: self.text_property.FrameOn() self.text_property.SetFrameWidth(lw) else: self.text_property.FrameOff() return self if c is not None: self.text_property.SetFrameColor(get_color(c)) return self def status(self, s=None): """ Set/Get the status of the button. """ if s is None: return self.states[self.status_idx] if isinstance(s, str): s = self.states.index(s) self.status_idx = s self.text(self.states[s]) s = s % len(self.bcolors) self.text(c=self.colors[s]) self.backcolor(self.bcolors[s]) return self def switch(self): """ Change/cycle button status to the next defined status in states list. """ self.status_idx = (self.status_idx + 1) % len(self.states) self.status(self.status_idx) return self ##################################################################### class SplineTool(vtk.vtkContourWidget): """ Spline tool, draw a spline through a set of points interactively. """ def __init__(self, points, pc="k", ps=8, lc="r4", ac="g5", lw=2, closed=False, ontop=True): """ Spline tool, draw a spline through a set of points interactively. Arguments: points : (list), Points initial set of points. pc : (str) point color. ps : (int) point size. lc : (str) line color. ac : (str) active point color. lw : (int) line width. closed : (bool) spline is closed or open. ontop : (bool) show it always on top of other objects. Examples: - [spline_tool.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/spline_tool.py) ![](https://vedo.embl.es/images/basic/spline_tool.png) """ vtk.vtkContourWidget.__init__(self) self.representation = vtk.vtkOrientedGlyphContourRepresentation() self.representation.SetAlwaysOnTop(ontop) self.representation.GetLinesProperty().SetColor(get_color(lc)) self.representation.GetLinesProperty().SetLineWidth(lw) self.representation.GetProperty().SetColor(get_color(pc)) self.representation.GetProperty().SetPointSize(ps) self.representation.GetProperty().RenderPointsAsSpheresOn() self.representation.GetActiveProperty().SetColor(get_color(ac)) self.representation.GetActiveProperty().SetLineWidth(lw + 1) self.SetRepresentation(self.representation) if utils.is_sequence(points): self.points = Points(points) else: self.points = points self.closed = closed def add(self, pt): """ Add one point at a specified position in space if 3D, or 2D screen-display position if 2D. """ if len(pt) == 2: self.representation.AddNodeAtDisplayPosition(int(pt[0]), int(pt[1])) else: self.representation.AddNodeAtWorldPosition(pt) return self def remove(self, i): """Remove specific node by its index""" self.representation.DeleteNthNode(i) return self def on(self): """Activate/Enable the tool""" self.On() self.Render() return self def off(self): """Disactivate/Disable the tool""" self.Off() self.Render() return self def render(self): """Render the spline""" self.Render() return self def bounds(self): """Retrieve the bounding box of the spline as [x0,x1, y0,y1, z0,z1]""" return self.GetBounds() def spline(self): """Return the vedo.Spline object.""" self.representation.SetClosedLoop(self.closed) self.representation.BuildRepresentation() pd = self.representation.GetContourRepresentationAsPolyData() pts = utils.vtk2numpy(pd.GetPoints().GetData()) ln = vedo.Line(pts, lw=2, c="k") return ln def nodes(self, onscreen=False): """Return the current position in space (or on 2D screen-display) of the spline nodes.""" n = self.representation.GetNumberOfNodes() pts = [] for i in range(n): p = [0.0, 0.0, 0.0] if onscreen: self.representation.GetNthNodeDisplayPosition(i, p) else: self.representation.GetNthNodeWorldPosition(i, p) pts.append(p) return np.array(pts) ##################################################################### class SliderWidget(vtk.vtkSliderWidget): """Helper class for vtkSliderWidget""" def __init__(self): vtk.vtkSliderWidget.__init__(self) @property def interactor(self): return self.GetInteractor() @interactor.setter def interactor(self, iren): self.SetInteractor(iren) @property def representation(self): return self.GetRepresentation() @property def value(self): return self.GetRepresentation().GetValue() @value.setter def value(self, val): self.GetRepresentation().SetValue(val) @property def renderer(self): return self.GetCurrentRenderer() @renderer.setter def renderer(self, ren): self.SetCurrentRenderer(ren) @property def title(self): self.GetRepresentation().GetTitleText() @title.setter def title(self, txt): self.GetRepresentation().SetTitleText(str(txt)) @property def range(self): xmin = self.GetRepresentation().GetMinimumValue() xmax = self.GetRepresentation().GetMaximumValue() return [xmin, xmax] @range.setter def range(self, vals): if vals[0] is not None: self.GetRepresentation().SetMinimumValue(vals[0]) if vals[1] is not None: self.GetRepresentation().SetMaximumValue(vals[1]) def on(self): self.EnabledOn() def off(self): self.EnabledOff() ##################################################################### def Goniometer( p1, p2, p3, font="", arc_size=0.4, s=1, italic=0, rotation=0, prefix="", lc="k2", c="white", alpha=1, lw=2, precision=3, ): """ Build a graphical goniometer to measure the angle formed by 3 points in space. Arguments: p1 : (list) first point 3D coordinates. p2 : (list) the vertex point. p3 : (list) the last point defining the angle. font : (str) Font face. Check [available fonts here](https://vedo.embl.es/fonts). arc_size : (float) dimension of the arc wrt the smallest axis. s : (float) size of the text. italic : (float, bool) italic text. rotation : (float) rotation of text in degrees. prefix : (str) append this string to the numeric value of the angle. lc : (list) color of the goniometer lines. c : (str) color of the goniometer angle filling. Set alpha=0 to remove it. alpha : (float) transparency level. lw : (float) line width. precision : (int) number of significant digits. Examples: - [goniometer.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/goniometer.py) ![](https://vedo.embl.es/images/pyplot/goniometer.png) """ if isinstance(p1, Points): p1 = p1.GetPosition() if isinstance(p2, Points): p2 = p2.GetPosition() if isinstance(p3, Points): p3 = p3.GetPosition() if len(p1)==2: p1=[p1[0], p1[1], 0.0] if len(p2)==2: p2=[p2[0], p2[1], 0.0] if len(p3)==2: p3=[p3[0], p3[1], 0.0] p1, p2, p3 = np.array(p1), np.array(p2), np.array(p3) acts = [] ln = shapes.Line([p1, p2, p3], lw=lw, c=lc) acts.append(ln) va = utils.versor(p1 - p2) vb = utils.versor(p3 - p2) r = min(utils.mag(p3 - p2), utils.mag(p1 - p2)) * arc_size ptsarc = [] res = 120 imed = int(res / 2) for i in range(res + 1): vi = utils.versor(vb * i / res + va * (res - i) / res) if i == imed: vc = np.array(vi) ptsarc.append(p2 + vi * r) arc = shapes.Line(ptsarc).lw(lw).c(lc) acts.append(arc) angle = np.arccos(np.dot(va, vb)) * 180 / np.pi lb = shapes.Text3D( prefix + utils.precision(angle, precision) + "º", s=r / 12 * s, font=font, italic=italic, justify="center", ) cr = np.cross(va, vb) lb.pos(p2 + vc * r / 1.75).orientation(cr * np.sign(cr[2]), rotation=rotation) lb.c(c).bc("tomato").lighting("off") acts.append(lb) if alpha > 0: pts = [p2] + arc.points().tolist() + [p2] msh = Mesh([pts, [list(range(arc.npoints + 2))]], c=lc, alpha=alpha) msh.lighting("off") msh.triangulate() msh.shift(0, 0, -r / 10000) # to resolve 2d conflicts.. acts.append(msh) asse = Assembly(acts) return asse def Light(pos, focal_point=(0, 0, 0), angle=180, c=None, intensity=1): """ Generate a source of light placed at `pos` and directed to `focal point`. Returns a `vtkLight` object. Arguments: focal_point : (list) focal point, if a `vedo` object is passed then will grab its position. angle : (float) aperture angle of the light source, in degrees c : (color) set the light color intensity : (float) intensity value between 0 and 1. Check also: `plotter.Plotter.remove_lights()` Examples: - [lights.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/lights.py) ![](https://vedo.embl.es/images/basic/lights.png) """ if c is None: try: c = pos.color() except AttributeError: c = "white" if isinstance(pos, vedo.Base3DProp): pos = pos.pos() if isinstance(focal_point, vedo.Base3DProp): focal_point = focal_point.pos() light = vtk.vtkLight() light.SetLightTypeToSceneLight() light.SetPosition(pos) light.SetConeAngle(angle) light.SetFocalPoint(focal_point) light.SetIntensity(intensity) light.SetColor(get_color(c)) return light ##################################################################### def ScalarBar( obj, title="", pos=(0.8, 0.05), title_yoffset=15, font_size=12, size=(None, None), nlabels=None, c="k", horizontal=False, use_alpha=True, label_format=":6.3g", ): """ A 2D scalar bar for the specified obj. Arguments: pos : (list) fractional x and y position in the 2D window size : (list) size of the scalarbar in pixel units (width, height) nlabels : (int) number of numeric labels to be shown use_alpha : (bool) retain transparency in scalarbar horizontal : (bool) show in horizontal layout Examples: - [scalarbars.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/scalarbars.py) ![](https://user-images.githubusercontent.com/32848391/62940174-4bdc7900-bdd3-11e9-9713-e4f3e2fdab63.png) """ if isinstance(obj, Points): vtkscalars = obj.inputdata().GetPointData().GetScalars() if vtkscalars is None: vtkscalars = obj.inputdata().GetCellData().GetScalars() if not vtkscalars: return None lut = vtkscalars.GetLookupTable() if not lut: lut = obj.mapper().GetLookupTable() if not lut: return None elif isinstance(obj, (Volume, TetMesh)): lut = utils.ctf2lut(obj) elif utils.is_sequence(obj) and len(obj) == 2: x = np.linspace(obj[0], obj[1], 256) data = [] for i in range(256): rgb = color_map(i, c, 0, 256) data.append([x[i], rgb]) lut = build_lut(data) elif not hasattr(obj, "mapper"): vedo.logger.error(f"in add_scalarbar(): input is invalid {type(obj)}. Skip.") return None else: return None c = get_color(c) sb = vtk.vtkScalarBarActor() # print(sb.GetLabelFormat()) label_format = label_format.replace(":", "%-#") sb.SetLabelFormat(label_format) sb.SetLookupTable(lut) sb.SetUseOpacity(use_alpha) sb.SetDrawFrame(0) sb.SetDrawBackground(0) if lut.GetUseBelowRangeColor(): sb.DrawBelowRangeSwatchOn() sb.SetBelowRangeAnnotation("") if lut.GetUseAboveRangeColor(): sb.DrawAboveRangeSwatchOn() sb.SetAboveRangeAnnotation("") if lut.GetNanColor() != (0.5, 0.0, 0.0, 1.0): sb.DrawNanAnnotationOn() sb.SetNanAnnotation("nan") if title: if "\\" in repr(title): for r in shapes._reps: title = title.replace(r[0], r[1]) titprop = sb.GetTitleTextProperty() titprop.BoldOn() titprop.ItalicOff() titprop.ShadowOff() titprop.SetColor(c) titprop.SetVerticalJustificationToTop() titprop.SetFontSize(font_size) titprop.SetFontFamily(vtk.VTK_FONT_FILE) titprop.SetFontFile(utils.get_font_path(settings.default_font)) sb.SetTitle(title) sb.SetVerticalTitleSeparation(title_yoffset) sb.SetTitleTextProperty(titprop) sb.UnconstrainedFontSizeOn() sb.DrawAnnotationsOn() sb.DrawTickLabelsOn() sb.SetMaximumNumberOfColors(256) if horizontal: sb.SetOrientationToHorizontal() sb.SetNumberOfLabels(3) sb.SetTextPositionToSucceedScalarBar() sb.SetPosition(pos) sb.SetMaximumWidthInPixels(1000) sb.SetMaximumHeightInPixels(50) else: sb.SetNumberOfLabels(7) sb.SetTextPositionToPrecedeScalarBar() sb.SetPosition(pos[0] + 0.09, pos[1]) sb.SetMaximumWidthInPixels(60) sb.SetMaximumHeightInPixels(250) if size[0] is not None: sb.SetMaximumWidthInPixels(size[0]) if size[1] is not None: sb.SetMaximumHeightInPixels(size[1]) if nlabels is not None: sb.SetNumberOfLabels(nlabels) sctxt = sb.GetLabelTextProperty() sctxt.SetFontFamily(vtk.VTK_FONT_FILE) sctxt.SetFontFile(utils.get_font_path(settings.default_font)) sctxt.SetColor(c) sctxt.SetShadow(0) sctxt.SetFontSize(font_size - 2) sb.SetAnnotationTextProperty(sctxt) sb.PickableOff() return sb ##################################################################### def ScalarBar3D( obj, title="", pos=None, size=(None, None), title_font="", title_xoffset=-1.5, title_yoffset=0.0, title_size=1.5, title_rotation=0.0, nlabels=8, label_font="", label_size=1, label_offset=0.375, label_rotation=0, label_format="", italic=0, c=None, draw_box=True, above_text=None, below_text=None, nan_text="NaN", categories=None, ): """ Create a 3D scalar bar for the specified object. Input `obj` input can be: - a list of numbers, - a list of two numbers in the form (min, max), - a Mesh already containing a set of scalars associated to vertices or cells, - if None the last object in the list of actors will be used. Arguments: size : (list) (thickness, length) of scalarbar title : (str) scalar bar title title_xoffset : (float) horizontal space btw title and color scalarbar title_yoffset : (float) vertical space offset title_size : (float) size of title wrt numeric labels title_rotation : (float) title rotation in degrees nlabels : (int) number of numeric labels label_font : (str) font type for labels label_size : (float) label scale factor label_offset : (float) space btw numeric labels and scale label_rotation : (float) label rotation in degrees draw_box : (bool) draw a box around the colorbar categories : (list) make a categorical scalarbar, the input list will have the format [value, color, alpha, textlabel] Examples: - [scalarbars.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/scalarbars.py) """ if isinstance(obj, Points): lut = obj.mapper().GetLookupTable() if not lut or lut.GetTable().GetNumberOfTuples() == 0: # create the most similar to the default obj.cmap("jet_r") lut = obj.mapper().GetLookupTable() vmin, vmax = lut.GetRange() elif isinstance(obj, (Volume, TetMesh)): lut = utils.ctf2lut(obj) vmin, vmax = lut.GetRange() elif utils.is_sequence(obj): vmin, vmax = np.min(obj), np.max(obj) else: vedo.logger.error("in ScalarBar3D(): input must be a vedo object with bounds.") return obj bns = obj.bounds() sx, sy = size if sy is None: sy = bns[3] - bns[2] if sx is None: sx = sy / 18 if categories is not None: ################################ ncats = len(categories) scale = shapes.Grid([-float(sx) * label_offset, 0, 0], c=c, alpha=1, s=(sx, sy), res=(1, ncats)) cols, alphas = [], [] ticks_pos, ticks_txt = [0.0], [""] for i, cat in enumerate(categories): cl = get_color(cat[1]) cols.append(cl) if len(cat) > 2: alphas.append(cat[2]) else: alphas.append(1) if len(cat) > 3: ticks_txt.append(cat[3]) else: ticks_txt.append("") ticks_pos.append((i + 0.5) / ncats) ticks_pos.append(1.0) ticks_txt.append("") rgba = np.c_[np.array(cols) * 255, np.array(alphas) * 255] scale.cell_individual_colors(rgba) else: ######################################################## # build the color scale part scale = shapes.Grid( [-float(sx) * label_offset, 0, 0], c=c, alpha=1, s=(sx, sy), res=(1, lut.GetTable().GetNumberOfTuples()), ) cscals = np.linspace(vmin, vmax, lut.GetTable().GetNumberOfTuples()) if lut.GetScale(): # logarithmic scale lut10 = vtk.vtkLookupTable() lut10.DeepCopy(lut) lut10.SetScaleToLinear() scale.cmap(lut10, cscals, on="cells") tk = utils.make_ticks(vmin, vmax, nlabels, logscale=True, useformat=label_format) else: scale.cmap(lut, cscals, on="cells") tk = utils.make_ticks(vmin, vmax, nlabels, logscale=False, useformat=label_format) ticks_pos, ticks_txt = tk scale.lw(0).wireframe(False).lighting("off") scales = [scale] xbns = scale.xbounds() if pos is None: d = sx / 2 if title: d = np.sqrt((bns[1] - bns[0]) ** 2 + sy * sy) / 20 pos = (bns[1] - xbns[0] + d, (bns[2] + bns[3]) / 2, bns[4]) lsize = sy / 60 * label_size tacts = [] for i, p in enumerate(ticks_pos): tx = ticks_txt[i] if i and tx: # build numeric text y = (p - 0.5) * sy if label_rotation: a = shapes.Text3D( tx, pos=[sx * label_offset, y, 0], s=lsize, justify="center-top", c=c, italic=italic, font=label_font, ) a.RotateZ(label_rotation) else: a = shapes.Text3D( tx, pos=[sx * label_offset, y, 0], s=lsize, justify="center-left", c=c, italic=italic, font=label_font, ) tacts.append(a) # build ticks tic = shapes.Line([xbns[1], y, 0], [xbns[1] + sx * label_offset / 4, y, 0], lw=2, c=c) tacts.append(tic) # build title if title: t = shapes.Text3D( title, (0, 0, 0), s=sy / 50 * title_size, c=c, justify="centered", italic=italic, font=title_font, ) t.RotateZ(90 + title_rotation) t.pos(sx * title_xoffset, title_yoffset, 0) tacts.append(t) # build below scale if lut.GetUseBelowRangeColor(): r, g, b, alfa = lut.GetBelowRangeColor() sx = float(sx) sy = float(sy) brect = shapes.Rectangle( [-sx * label_offset - sx / 2, -sy / 2 - sx - sx * 0.1, 0], [-sx * label_offset + sx / 2, -sy / 2 - sx * 0.1, 0], c=(r, g, b), alpha=alfa, ) brect.lw(1).lc(c).lighting("off") scales += [brect] if below_text is None: below_text = " <" + str(vmin) if below_text: if label_rotation: btx = shapes.Text3D( below_text, (0, 0, 0), s=lsize, c=c, justify="center-top", italic=italic, font=label_font, ) btx.RotateZ(label_rotation) else: btx = shapes.Text3D( below_text, (0, 0, 0), s=lsize, c=c, justify="center-left", italic=italic, font=label_font, ) btx.pos(sx * label_offset, -sy / 2 - sx * 0.66, 0) tacts.append(btx) # build above scale if lut.GetUseAboveRangeColor(): r, g, b, alfa = lut.GetAboveRangeColor() arect = shapes.Rectangle( [-sx * label_offset - sx / 2, sy / 2 + sx * 0.1, 0], [-sx * label_offset + sx / 2, sy / 2 + sx + sx * 0.1, 0], c=(r, g, b), alpha=alfa, ) arect.lw(1).lc(c).lighting("off") scales += [arect] if above_text is None: above_text = " >" + str(vmax) if above_text: if label_rotation: atx = shapes.Text3D( above_text, (0, 0, 0), s=lsize, c=c, justify="center-top", italic=italic, font=label_font, ) atx.RotateZ(label_rotation) else: atx = shapes.Text3D( above_text, (0, 0, 0), s=lsize, c=c, justify="center-left", italic=italic, font=label_font, ) atx.pos(sx * label_offset, sy / 2 + sx * 0.66, 0) tacts.append(atx) # build NaN scale if lut.GetNanColor() != (0.5, 0.0, 0.0, 1.0): nanshift = sx * 0.1 if brect: nanshift += sx r, g, b, alfa = lut.GetNanColor() nanrect = shapes.Rectangle( [-sx * label_offset - sx / 2, -sy / 2 - sx - sx * 0.1 - nanshift, 0], [-sx * label_offset + sx / 2, -sy / 2 - sx * 0.1 - nanshift, 0], c=(r, g, b), alpha=alfa, ) nanrect.lw(1).lc(c).lighting("off") scales += [nanrect] if label_rotation: nantx = shapes.Text3D( nan_text, (0, 0, 0), s=lsize, c=c, justify="center-left", italic=italic, font=label_font, ) nantx.RotateZ(label_rotation) else: nantx = shapes.Text3D( nan_text, (0, 0, 0), s=lsize, c=c, justify="center-left", italic=italic, font=label_font, ) nantx.pos(sx * label_offset, -sy / 2 - sx * 0.66 - nanshift, 0) tacts.append(nantx) if draw_box: tacts.append(scale.box().lw(1)) for a in tacts: a.PickableOff() mtacts = merge(tacts).lighting("off") mtacts.PickableOff() scale.PickableOff() sact = Assembly(scales + tacts) sact.SetPosition(pos) sact.PickableOff() sact.UseBoundsOff() sact.name = "ScalarBar3D" return sact ##################################################################### class Slider2D(SliderWidget): """ Add a slider which can call an external custom function. """ def __init__( self, sliderfunc, xmin, xmax, value=None, pos=4, title="", font="Calco", title_size=1, c="k", alpha=1, show_value=True, delayed=False, **options, ): """ Add a slider which can call an external custom function. Set any value as float to increase the number of significant digits above the slider. Use `play()` to start an animation between the current slider value and the last value. Arguments: sliderfunc : (function) external function to be called by the widget xmin : (float) lower value of the slider xmax : (float) upper value value : (float) current value pos : (list, str) position corner number: horizontal [1-5] or vertical [11-15] it can also be specified by corners coordinates [(x1,y1), (x2,y2)] and also by a string descriptor (eg. "bottom-left") title : (str) title text font : (str) title font face. Check [available fonts here](https://vedo.embl.es/fonts). title_size : (float) title text scale [1.0] show_value : (bool) if True current value is shown delayed : (bool) if True the callback is delayed until when the mouse button is released alpha : (float) opacity of the scalar bar texts slider_length : (float) slider length slider_width : (float) slider width end_cap_length : (float) length of the end cap end_cap_width : (float) width of the end cap tube_width : (float) width of the tube title_height : (float) height of the title tformat : (str) format of the title Examples: - [sliders1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/sliders1.py) - [sliders2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/sliders2.py) ![](https://user-images.githubusercontent.com/32848391/50738848-be033480-11d8-11e9-9b1a-c13105423a79.jpg) """ slider_length = options.pop("slider_length", 0.015) slider_width = options.pop("slider_width", 0.025) end_cap_length= options.pop("end_cap_length", 0.0015) end_cap_width = options.pop("end_cap_width", 0.0125) tube_width = options.pop("tube_width", 0.0075) title_height = options.pop("title_height", 0.025) if options: vedo.logger.warning(f"in Slider2D unknown option(s): {options}") c = get_color(c) if value is None or value < xmin: value = xmin slider_rep = vtk.vtkSliderRepresentation2D() slider_rep.SetMinimumValue(xmin) slider_rep.SetMaximumValue(xmax) slider_rep.SetValue(value) slider_rep.SetSliderLength(slider_length) slider_rep.SetSliderWidth(slider_width) slider_rep.SetEndCapLength(end_cap_length) slider_rep.SetEndCapWidth(end_cap_width) slider_rep.SetTubeWidth(tube_width) slider_rep.GetPoint1Coordinate().SetCoordinateSystemToNormalizedDisplay() slider_rep.GetPoint2Coordinate().SetCoordinateSystemToNormalizedDisplay() if isinstance(pos, str): if "top" in pos: if "left" in pos: if "vert" in pos: pos = 11 else: pos = 1 elif "right" in pos: if "vert" in pos: pos = 12 else: pos = 2 elif "bott" in pos: if "left" in pos: if "vert" in pos: pos = 13 else: pos = 3 elif "right" in pos: if "vert" in pos: if "span" in pos: pos = 15 else: pos = 14 else: pos = 4 elif "span" in pos: pos = 5 if utils.is_sequence(pos): slider_rep.GetPoint1Coordinate().SetValue(pos[0][0], pos[0][1]) slider_rep.GetPoint2Coordinate().SetValue(pos[1][0], pos[1][1]) elif pos == 1: # top-left horizontal slider_rep.GetPoint1Coordinate().SetValue(0.04, 0.93) slider_rep.GetPoint2Coordinate().SetValue(0.45, 0.93) elif pos == 2: slider_rep.GetPoint1Coordinate().SetValue(0.55, 0.93) slider_rep.GetPoint2Coordinate().SetValue(0.95, 0.93) elif pos == 3: slider_rep.GetPoint1Coordinate().SetValue(0.05, 0.06) slider_rep.GetPoint2Coordinate().SetValue(0.45, 0.06) elif pos == 4: # bottom-right slider_rep.GetPoint1Coordinate().SetValue(0.55, 0.06) slider_rep.GetPoint2Coordinate().SetValue(0.95, 0.06) elif pos == 5: # bottom span horizontal slider_rep.GetPoint1Coordinate().SetValue(0.04, 0.06) slider_rep.GetPoint2Coordinate().SetValue(0.95, 0.06) elif pos == 11: # top-left vertical slider_rep.GetPoint1Coordinate().SetValue(0.065, 0.54) slider_rep.GetPoint2Coordinate().SetValue(0.065, 0.9) elif pos == 12: slider_rep.GetPoint1Coordinate().SetValue(0.94, 0.54) slider_rep.GetPoint2Coordinate().SetValue(0.94, 0.9) elif pos == 13: slider_rep.GetPoint1Coordinate().SetValue(0.065, 0.1) slider_rep.GetPoint2Coordinate().SetValue(0.065, 0.54) elif pos == 14: # bottom-right vertical slider_rep.GetPoint1Coordinate().SetValue(0.94, 0.1) slider_rep.GetPoint2Coordinate().SetValue(0.94, 0.54) elif pos == 15: # right margin vertical slider_rep.GetPoint1Coordinate().SetValue(0.95, 0.1) slider_rep.GetPoint2Coordinate().SetValue(0.95, 0.9) else: # bottom-right slider_rep.GetPoint1Coordinate().SetValue(0.55, 0.06) slider_rep.GetPoint2Coordinate().SetValue(0.95, 0.06) if show_value: if isinstance(xmin, int) and isinstance(xmax, int) and isinstance(value, int): frm = "%0.0f" else: frm = "%0.2f" frm = options.pop("tformat", frm) slider_rep.SetLabelFormat(frm) # default is '%0.3g' slider_rep.GetLabelProperty().SetShadow(0) slider_rep.GetLabelProperty().SetBold(0) slider_rep.GetLabelProperty().SetOpacity(alpha) slider_rep.GetLabelProperty().SetColor(c) if isinstance(pos, int) and pos > 10: slider_rep.GetLabelProperty().SetOrientation(90) else: slider_rep.ShowSliderLabelOff() slider_rep.GetTubeProperty().SetColor(c) slider_rep.GetTubeProperty().SetOpacity(0.75) slider_rep.GetSliderProperty().SetColor(c) slider_rep.GetSelectedProperty().SetColor(np.sqrt(np.array(c))) slider_rep.GetCapProperty().SetColor(c) slider_rep.SetTitleHeight(title_height * title_size) slider_rep.GetTitleProperty().SetShadow(0) slider_rep.GetTitleProperty().SetColor(c) slider_rep.GetTitleProperty().SetOpacity(alpha) slider_rep.GetTitleProperty().SetBold(0) if font.lower() == "courier": slider_rep.GetTitleProperty().SetFontFamilyToCourier() elif font.lower() == "times": slider_rep.GetTitleProperty().SetFontFamilyToTimes() elif font.lower() == "arial": slider_rep.GetTitleProperty().SetFontFamilyToArial() else: if font == "": font = utils.get_font_path(settings.default_font) else: font = utils.get_font_path(font) slider_rep.GetTitleProperty().SetFontFamily(vtk.VTK_FONT_FILE) slider_rep.GetLabelProperty().SetFontFamily(vtk.VTK_FONT_FILE) slider_rep.GetTitleProperty().SetFontFile(font) slider_rep.GetLabelProperty().SetFontFile(font) if title: slider_rep.SetTitleText(title) if not utils.is_sequence(pos): if isinstance(pos, int) and pos > 10: slider_rep.GetTitleProperty().SetOrientation(90) else: if abs(pos[0][0] - pos[1][0]) < 0.1: slider_rep.GetTitleProperty().SetOrientation(90) SliderWidget.__init__(self) self.SetAnimationModeToJump() self.SetRepresentation(slider_rep) if delayed: self.AddObserver("EndInteractionEvent", sliderfunc) else: self.AddObserver("InteractionEvent", sliderfunc) ##################################################################### class Slider3D(SliderWidget): """ Add a 3D slider which can call an external custom function. """ def __init__( self, sliderfunc, pos1, pos2, xmin, xmax, value=None, s=0.03, t=1, title="", rotation=0, c=None, show_value=True, ): """ Add a 3D slider which can call an external custom function. Arguments: sliderfunc : (function) external function to be called by the widget pos1 : (list) first position 3D coordinates pos2 : (list) second position 3D coordinates xmin : (float) lower value xmax : (float) upper value value : (float) initial value s : (float) label scaling factor t : (float) tube scaling factor title : (str) title text c : (color) slider color rotation : (float) title rotation around slider axis show_value : (bool) if True current value is shown on top of the slider Examples: - [sliders3d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/sliders3d.py) """ c = get_color(c) if value is None or value < xmin: value = xmin slider_rep = vtk.vtkSliderRepresentation3D() slider_rep.SetMinimumValue(xmin) slider_rep.SetMaximumValue(xmax) slider_rep.SetValue(value) slider_rep.GetPoint1Coordinate().SetCoordinateSystemToWorld() slider_rep.GetPoint2Coordinate().SetCoordinateSystemToWorld() slider_rep.GetPoint1Coordinate().SetValue(pos2) slider_rep.GetPoint2Coordinate().SetValue(pos1) # slider_rep.SetPoint1InWorldCoordinates(pos2[0], pos2[1], pos2[2]) # slider_rep.SetPoint2InWorldCoordinates(pos1[0], pos1[1], pos1[2]) slider_rep.SetSliderWidth(0.03 * t) slider_rep.SetTubeWidth(0.01 * t) slider_rep.SetSliderLength(0.04 * t) slider_rep.SetSliderShapeToCylinder() slider_rep.GetSelectedProperty().SetColor(np.sqrt(np.array(c))) slider_rep.GetSliderProperty().SetColor(np.array(c) / 1.5) slider_rep.GetCapProperty().SetOpacity(0) slider_rep.SetRotation(rotation) if not show_value: slider_rep.ShowSliderLabelOff() slider_rep.SetTitleText(title) slider_rep.SetTitleHeight(s * t) slider_rep.SetLabelHeight(s * t * 0.85) slider_rep.GetTubeProperty().SetColor(c) SliderWidget.__init__(self) self.SetRepresentation(slider_rep) self.SetAnimationModeToJump() self.AddObserver("InteractionEvent", sliderfunc) class BaseCutter: """ Base class for Cutter widgets. """ def __init__(self): self._implicit_func = None self.widget = None self.clipper=None self.cutter=None self._alpha = 0.5 self._keypress_id = None def invert(self): """Invert selection.""" self.clipper.SetInsideOut(not self.clipper.GetInsideOut()) return self def bounds(self, value=None): """Set or get the bounding box.""" if value is None: return self.cutter.GetBounds() else: self._implicit_func.SetBounds(value) return self def on(self): """Switch the widget on or off.""" self.widget.On() return self def off(self): """Switch the widget on or off.""" self.widget.Off() return self def add_to(self, plt): """Assign the widget to the provided `Plotter` instance.""" self.widget.SetInteractor(plt.interactor) self.widget.SetCurrentRenderer(plt.renderer) if self.widget not in plt.widgets: plt.widgets.append(self.widget) cpoly = self.clipper.GetOutput() self.mesh._update(cpoly) out = self.clipper.GetClippedOutputPort() self.remnant.mapper().SetInputConnection(out) self.remnant.alpha(self._alpha).color((0.5, 0.5, 0.5)) self.remnant.lighting('off').wireframe() plt.add(self.remnant) self._keypress_id = plt.interactor.AddObserver("KeyPressEvent", self._keypress) if plt.interactor and plt.interactor.GetInitialized(): self.widget.On() self._select_polygons(self.widget, "InteractionEvent") plt.interactor.Render() return self def remove_from(self, plt): """Remove the widget to the provided `Plotter` instance.""" self.widget.Off() self.RemoveAllObservers() plt.remove(self.remnant) if self.widget in plt.widgets: plt.widgets.remove(self.widget) if self._keypress_id: plt.interactor.RemoveObserver(self._keypress_id) return self class PlaneCutter(vtk.vtkPlaneWidget, BaseCutter): """ Create a box widget to cut away parts of a Mesh. """ def __init__( self, mesh, invert=False, can_translate=True, can_scale=True, c=(0.25, 0.25, 0.25), origin=(), normal=(), padding=0.05, alpha=0.05, ): """ Create a box widget to cut away parts of a Mesh. Arguments: mesh : (Mesh) the input mesh invert : (bool) invert the clipping plane can_translate : (bool) enable translation of the widget can_scale : (bool) enable scaling of the widget origin : (list) origin of the plane normal : (list) normal to the plane padding : (float) padding around the input mesh c : (color) color of the box cutter widget alpha : (float) transparency of the cut-off part of the input mesh """ super().__init__() self.mesh = mesh self.remnant = Mesh() self.remnant.name = mesh.name + "Remnant" self.remnant.pickable(False) self._alpha = alpha self._keypress_id = None self._implicit_func = vtk.vtkPlane() poly = mesh.polydata() self.clipper = vtk.vtkClipPolyData() self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) self.clipper.SetClipFunction(self._implicit_func) self.clipper.SetInsideOut(invert) self.clipper.GenerateClippedOutputOn() self.clipper.Update() self.widget = vtk.vtkImplicitPlaneWidget() # self.widget.KeyPressActivationOff() # self.widget.SetKeyPressActivationValue('i') self.widget.SetOriginTranslation(can_translate) self.widget.SetOutlineTranslation(can_translate) self.widget.SetScaleEnabled(can_scale) self.widget.GetOutlineProperty().SetColor(c) self.widget.GetOutlineProperty().SetOpacity(0.25) self.widget.GetOutlineProperty().SetLineWidth(1) self.widget.GetOutlineProperty().LightingOff() self.widget.GetSelectedOutlineProperty().SetColor(get_color("red3")) self.widget.SetTubing(0) self.widget.SetDrawPlane(1) self.widget.GetPlaneProperty().LightingOff() self.widget.GetPlaneProperty().SetOpacity(0.05) self.widget.GetSelectedPlaneProperty().SetColor(get_color("red5")) self.widget.GetSelectedPlaneProperty().LightingOff() self.widget.SetPlaceFactor(1.0 + padding) self.widget.SetInputData(poly) self.widget.PlaceWidget() self.widget.AddObserver("InteractionEvent", self._select_polygons) if len(origin) == 3: self.widget.SetOrigin(origin) else: self.widget.SetOrigin(mesh.center_of_mass()) if len(normal) == 3: self.widget.SetNormal(normal) else: self.widget.SetNormal((1, 0, 0)) def _select_polygons(self, vobj, event): vobj.GetPlane(self._implicit_func) def _keypress(self, vobj, event): if vobj.GetKeySym() == "r": # reset planes self.widget.GetPlane(self._implicit_func) self.widget.PlaceWidget() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "u": # invert cut self.invert() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "x": # set normal along x self.widget.SetNormal((1, 0, 0)) self.widget.GetPlane(self._implicit_func) self.widget.PlaceWidget() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "y": # set normal along y self.widget.SetNormal((0, 1, 0)) self.widget.GetPlane(self._implicit_func) self.widget.PlaceWidget() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "z": # set normal along z self.widget.SetNormal((0, 0, 1)) self.widget.GetPlane(self._implicit_func) self.widget.PlaceWidget() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "s": # Ctrl+s to save mesh if self.widget.GetInteractor(): if self.widget.GetInteractor().GetControlKey(): printc(":save: saving mesh to vedo_clipped.vtk") self.mesh.write("vedo_clipped.vtk") class BoxCutter(vtk.vtkBoxWidget, BaseCutter): """ Create a box widget to cut away parts of a Mesh. """ def __init__( self, mesh, invert=False, can_rotate=True, can_translate=True, can_scale=True, initial_bounds=(), padding=0.025, c=(0.25, 0.25, 0.25), alpha=0.05, ): """ Create a box widget to cut away parts of a Mesh. Arguments: mesh : (Mesh) the input mesh invert : (bool) invert the clipping plane can_rotate : (bool) enable rotation of the widget can_translate : (bool) enable translation of the widget can_scale : (bool) enable scaling of the widget initial_bounds : (list) initial bounds of the box widget c : (color) color of the box cutter widget alpha : (float) transparency of the cut-off part of the input mesh """ super().__init__() self.mesh = mesh self.remnant = Mesh() self.remnant.name = mesh.name + "Remnant" self.remnant.pickable(False) self._alpha = alpha self._keypress_id = None self._init_bounds = initial_bounds if len(self._init_bounds) == 0: self._init_bounds = mesh.bounds() else: self._init_bounds = initial_bounds self._implicit_func = vtk.vtkPlanes() self._implicit_func.SetBounds(self._init_bounds) poly = mesh.polydata() self.clipper = vtk.vtkClipPolyData() self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) self.clipper.SetClipFunction(self._implicit_func) self.clipper.SetInsideOut(not invert) self.clipper.GenerateClippedOutputOn() self.clipper.Update() self.widget = vtk.vtkBoxWidget() self.widget.SetRotationEnabled(can_rotate) self.widget.SetTranslationEnabled(can_translate) self.widget.SetScalingEnabled(can_scale) self.widget.OutlineCursorWiresOn() self.widget.GetSelectedOutlineProperty().SetColor(get_color("red3")) self.widget.GetSelectedHandleProperty().SetColor(get_color("red5")) self.widget.GetOutlineProperty().SetColor(c) self.widget.GetOutlineProperty().SetOpacity(1) self.widget.GetOutlineProperty().SetLineWidth(1) self.widget.GetOutlineProperty().LightingOff() self.widget.GetSelectedFaceProperty().LightingOff() self.widget.GetSelectedFaceProperty().SetOpacity(0.1) self.widget.SetPlaceFactor(1.0 + padding) self.widget.SetInputData(poly) self.widget.PlaceWidget() self.widget.AddObserver("InteractionEvent", self._select_polygons) def _select_polygons(self, vobj, event): vobj.GetPlanes(self._implicit_func) def _keypress(self, vobj, event): if vobj.GetKeySym() == "r": # reset planes self._implicit_func.SetBounds(self._init_bounds) self.widget.GetPlanes(self._implicit_func) self.widget.PlaceWidget() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "u": self.invert() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "s": # Ctrl+s to save mesh if self.widget.GetInteractor(): if self.widget.GetInteractor().GetControlKey(): printc(":save: saving mesh to vedo_clipped.vtk") self.mesh.write("vedo_clipped.vtk") class SphereCutter(vtk.vtkSphereWidget, BaseCutter): """ Create a box widget to cut away parts of a Mesh. """ def __init__( self, mesh, invert=False, can_translate=True, can_scale=True, origin=(), radius=0, res=60, c='white', alpha=0.05, ): """ Create a box widget to cut away parts of a Mesh. Arguments: mesh : Mesh the input mesh invert : bool invert the clipping can_translate : bool enable translation of the widget can_scale : bool enable scaling of the widget origin : list initial position of the sphere widget radius : float initial radius of the sphere widget res : int resolution of the sphere widget c : color color of the box cutter widget alpha : float transparency of the cut-off part of the input mesh """ super().__init__() self.mesh = mesh self.remnant = Mesh() self.remnant.name = mesh.name + "Remnant" self.remnant.pickable(False) self._alpha = alpha self._keypress_id = None self._implicit_func = vtk.vtkSphere() if len(origin) == 3: self._implicit_func.SetCenter(origin) else: origin = mesh.center_of_mass() self._implicit_func.SetCenter(origin) if radius > 0: self._implicit_func.SetRadius(radius) else: radius = mesh.average_size() * 2 self._implicit_func.SetRadius(radius) poly = mesh.polydata() self.clipper = vtk.vtkClipPolyData() self.clipper.GenerateClipScalarsOff() self.clipper.SetInputData(poly) self.clipper.SetClipFunction(self._implicit_func) self.clipper.SetInsideOut(not invert) self.clipper.GenerateClippedOutputOn() self.clipper.Update() self.widget = vtk.vtkSphereWidget() self.widget.SetThetaResolution(res*2) self.widget.SetPhiResolution(res) self.widget.SetRadius(radius) self.widget.SetCenter(origin) self.widget.SetRepresentation(2) self.widget.HandleVisibilityOff() self.widget.SetTranslation(can_translate) self.widget.SetScale(can_scale) self.widget.HandleVisibilityOff() self.widget.GetSphereProperty().SetColor(get_color(c)) self.widget.GetSphereProperty().SetOpacity(0.2) self.widget.GetSelectedSphereProperty().SetColor(get_color("red5")) self.widget.GetSelectedSphereProperty().SetOpacity(0.2) self.widget.SetPlaceFactor(1.0) self.widget.SetInputData(poly) self.widget.PlaceWidget() self.widget.AddObserver("InteractionEvent", self._select_polygons) def _select_polygons(self, vobj, event): vobj.GetSphere(self._implicit_func) def _keypress(self, vobj, event): if vobj.GetKeySym() == "r": # reset planes self._implicit_func.SetBounds(self._init_bounds) self.widget.GetPlanes(self._implicit_func) self.widget.PlaceWidget() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "u": self.invert() self.widget.GetInteractor().Render() elif vobj.GetKeySym() == "s": # Ctrl+s to save mesh if self.widget.GetInteractor(): if self.widget.GetInteractor().GetControlKey(): printc(":save: saving mesh to vedo_clipped.vtk") self.mesh.write("vedo_clipped.vtk") ##################################################################### class RendererFrame(vtk.vtkActor2D): """ Add a line around the renderer subwindow. """ def __init__(self, c="k", alpha=None, lw=None, padding=None): """ Add a line around the renderer subwindow. Arguments: c : (color) color of the line. alpha : (float) opacity. lw : (int) line width in pixels. padding : (int) padding in pixel units. """ if lw is None: lw = settings.renderer_frame_width if lw == 0: return None if alpha is None: alpha = settings.renderer_frame_alpha if padding is None: padding = settings.renderer_frame_padding c = get_color(c) ppoints = vtk.vtkPoints() # Generate the polyline xy = 1 - padding psqr = [[padding, padding], [padding, xy], [xy, xy], [xy, padding], [padding, padding]] for i, pt in enumerate(psqr): ppoints.InsertPoint(i, pt[0], pt[1], 0) lines = vtk.vtkCellArray() lines.InsertNextCell(len(psqr)) for i in range(len(psqr)): lines.InsertCellPoint(i) pd = vtk.vtkPolyData() pd.SetPoints(ppoints) pd.SetLines(lines) mapper = vtk.vtkPolyDataMapper2D() mapper.SetInputData(pd) cs = vtk.vtkCoordinate() cs.SetCoordinateSystemToNormalizedViewport() mapper.SetTransformCoordinate(cs) vtk.vtkActor2D.__init__(self) self.GetPositionCoordinate().SetValue(0, 0) self.GetPosition2Coordinate().SetValue(1, 1) self.SetMapper(mapper) self.GetProperty().SetColor(c) self.GetProperty().SetOpacity(alpha) self.GetProperty().SetLineWidth(lw) ##################################################################### class ProgressBarWidget(vtk.vtkActor2D): """ Add a progress bar in the rendering window. """ def __init__(self, n=None, c="blue5", alpha=0.8, lw=10, autohide=True): """ Add a progress bar window. Arguments: n : (int) number of iterations. If None, you need to call `update(fraction)` manually. c : (color) color of the line. alpha : (float) opacity of the line. lw : (int) line width in pixels. autohide : (bool) if True, hide the progress bar when completed. """ self.n = 0 self.iterations = n self.autohide = autohide ppoints = vtk.vtkPoints() # Generate the line psqr = [[0, 0, 0], [1, 0, 0]] for i, pt in enumerate(psqr): ppoints.InsertPoint(i, *pt) lines = vtk.vtkCellArray() lines.InsertNextCell(len(psqr)) for i in range(len(psqr)): lines.InsertCellPoint(i) pd = vtk.vtkPolyData() pd.SetPoints(ppoints) pd.SetLines(lines) self._data = pd mapper = vtk.vtkPolyDataMapper2D() mapper.SetInputData(pd) cs = vtk.vtkCoordinate() cs.SetCoordinateSystemToNormalizedViewport() mapper.SetTransformCoordinate(cs) vtk.vtkActor2D.__init__(self) self.SetMapper(mapper) self.GetProperty().SetOpacity(alpha) self.GetProperty().SetColor(get_color(c)) self.GetProperty().SetLineWidth(lw*2) def lw(self, value): """Set width.""" self.GetProperty().SetLineWidth(value*2) return self def c(self, color): """Set color.""" c = get_color(color) self.GetProperty().SetColor(c) return self def alpha(self, value): """Set opacity.""" self.GetProperty().SetOpacity(value) return self def update(self, fraction=None): """Update progress bar to fraction of the window width.""" if fraction is None: if self.iterations is None: vedo.printc("Error in ProgressBarWindow: must specify iterations", c='r') return self self.n += 1 fraction = self.n / self.iterations if fraction >= 1 and self.autohide: fraction = 0 psqr = [[0, 0, 0], [fraction, 0, 0]] vpts = utils.numpy2vtk(psqr, dtype=np.float32) self._data.GetPoints().SetData(vpts) return self def reset(self): """Reset progress bar.""" self.n = 0 self.update(0) return self ##################################################################### class Icon(vtk.vtkOrientationMarkerWidget): """ Add an inset icon mesh into the renderer. """ def __init__(self, mesh, pos=3, size=0.08): """ Arguments: pos : (list, int) icon position in the range [1-4] indicating one of the 4 corners, or it can be a tuple (x,y) as a fraction of the renderer size. size : (float) size of the icon space as fraction of the window size. Examples: - [icon.py](https://github.com/marcomusy/vedo/tree/master/examples/other/icon.py) """ vtk.vtkOrientationMarkerWidget.__init__(self) self.SetOrientationMarker(mesh) if utils.is_sequence(pos): self.SetViewport(pos[0] - size, pos[1] - size, pos[0] + size, pos[1] + size) else: if pos < 2: self.SetViewport(0, 1 - 2 * size, size * 2, 1) elif pos == 2: self.SetViewport(1 - 2 * size, 1 - 2 * size, 1, 1) elif pos == 3: self.SetViewport(0, 0, size * 2, size * 2) elif pos == 4: self.SetViewport(1 - 2 * size, 0, 1, size * 2) ##################################################################### def compute_visible_bounds(actors=None): """Calculate max meshes bounds and sizes.""" bns = [] if actors is None: actors = vedo.plotter_instance.actors elif not utils.is_sequence(actors): actors = [actors] try: # this block fails for VolumeSlice as vtkImageSlice.GetBounds() returns a pointer.. # in any case we dont need axes for that one. for a in actors: if a and a.GetUseBounds(): b = a.GetBounds() if b: bns.append(b) if bns: max_bns = np.max(bns, axis=0) min_bns = np.min(bns, axis=0) vbb = [min_bns[0], max_bns[1], min_bns[2], max_bns[3], min_bns[4], max_bns[5]] else: vbb = list(vedo.plotter_instance.renderer.ComputeVisiblePropBounds()) max_bns = vbb min_bns = vbb sizes = np.array( [max_bns[1] - min_bns[0], max_bns[3] - min_bns[2], max_bns[5] - min_bns[4]] ) return [vbb, sizes, min_bns, max_bns] except: return [[0, 0, 0, 0, 0, 0], [0, 0, 0], 0, 0] ##################################################################### def Ruler( p1, p2, units_scale=1, label="", s=None, font=None, italic=0, prefix="", units="", # eg.'μm' c=(0.2, 0.1, 0.1), alpha=1, lw=1, precision=3, label_rotation=0, axis_rotation=0, tick_angle=90, ): """ Build a 3D ruler to indicate the distance of two points p1 and p2. Arguments: label : (str) alternative fixed label to be shown units_scale : (float) factor to scale units (e.g. μm to mm) s : (float) size of the label font : (str) font face. Check [available fonts here](https://vedo.embl.es/fonts). italic : (float) italicness of the font in the range [0,1] units : (str) string to be appended to the numeric value lw : (int) line width in pixel units precision : (int) nr of significant digits to be shown label_rotation : (float) initial rotation of the label around the z-axis axis_rotation : (float) initial rotation of the line around the main axis tick_angle : (float) initial rotation of the line around the main axis Examples: - [goniometer.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/goniometer.py) ![](https://vedo.embl.es/images/pyplot/goniometer.png) """ if units_scale != 1.0 and units == "": raise ValueError( "When setting 'units_scale' to a value other than 1, " + "a 'units' arguments must be specified." ) if isinstance(p1, Points): p1 = p1.GetPosition() if isinstance(p2, Points): p2 = p2.GetPosition() if len(p1) == 2: p1 = [p1[0], p1[1], 0.0] if len(p2) == 2: p2 = [p2[0], p2[1], 0.0] p1, p2 = np.array(p1), np.array(p2) q1, q2 = [0, 0, 0], [utils.mag(p2 - p1), 0, 0] q1, q2 = np.array(q1), np.array(q2) v = q2 - q1 d = utils.mag(v) * units_scale if s is None: s = d * 0.02 * (1 / units_scale) if not label: label = str(d) if precision: label = utils.precision(d, precision) if prefix: label = prefix + "~" + label if units: label += "~" + units lb = shapes.Text3D(label, pos=(q1 + q2) / 2, s=s, font=font, italic=italic, justify="center") if label_rotation: lb.RotateZ(label_rotation) x0, x1 = lb.xbounds() gap = [(x1 - x0) / 2, 0, 0] pc1 = (v / 2 - gap) * 0.9 + q1 pc2 = q2 - (v / 2 - gap) * 0.9 lc1 = shapes.Line(q1 - v / 50, pc1) lc2 = shapes.Line(q2 + v / 50, pc2) zs = np.array([0, d / 50 * (1 / units_scale), 0]) ml1 = shapes.Line(-zs, zs).pos(q1) ml2 = shapes.Line(-zs, zs).pos(q2) ml1.RotateZ(tick_angle - 90) ml2.RotateZ(tick_angle - 90) c1 = shapes.Circle(q1, r=d / 180 * (1 / units_scale), res=20) c2 = shapes.Circle(q2, r=d / 180 * (1 / units_scale), res=20) acts = [lb, lc1, lc2, c1, c2, ml1, ml2] macts = merge(acts).pos(p1).c(c).alpha(alpha) macts.GetProperty().LightingOff() macts.GetProperty().SetLineWidth(lw) macts.UseBoundsOff() macts.base = q1 macts.top = q2 macts.orientation(p2 - p1, rotation=axis_rotation).bc("t").pickable(False) return macts def RulerAxes( inputobj, xtitle="", ytitle="", ztitle="", xlabel="", ylabel="", zlabel="", xpadding=0.05, ypadding=0.04, zpadding=0, font="Normografo", s=None, italic=0, units="", c=(0.2, 0, 0), alpha=1, lw=1, precision=3, label_rotation=0, xaxis_rotation=0, yaxis_rotation=0, zaxis_rotation=0, xycross=True, ): """ A 3D ruler axes to indicate the sizes of the input scene or object. Arguments: xtitle : (str) name of the axis or title xlabel : (str) alternative fixed label to be shown instead of the distance s : (float) size of the label font : (str) font face. Check [available fonts here](https://vedo.embl.es/fonts). italic : (float) italicness of the font in the range [0,1] units : (str) string to be appended to the numeric value lw : (int) line width in pixel units precision : (int) nr of significant digits to be shown label_rotation : (float) initial rotation of the label around the z-axis [x,y,z]axis_rotation : (float) initial rotation of the line around the main axis in degrees xycross : (bool) show two back crossing lines in the xy plane Examples: - [goniometer.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/goniometer.py) """ if utils.is_sequence(inputobj): x0, x1, y0, y1, z0, z1 = inputobj else: x0, x1, y0, y1, z0, z1 = inputobj.bounds() dx, dy, dz = (y1 - y0) * xpadding, (x1 - x0) * ypadding, (y1 - y0) * zpadding d = np.sqrt((y1 - y0) ** 2 + (x1 - x0) ** 2 + (z1 - z0) ** 2) if not d: return None if s is None: s = d / 75 acts, rx, ry = [], None, None if xtitle is not None and (x1 - x0) / d > 0.1: rx = Ruler( [x0, y0 - dx, z0], [x1, y0 - dx, z0], s=s, font=font, precision=precision, label_rotation=label_rotation, axis_rotation=xaxis_rotation, lw=lw, italic=italic, prefix=xtitle, label=xlabel, units=units, ) acts.append(rx) if ytitle is not None and (y1 - y0) / d > 0.1: ry = Ruler( [x1 + dy, y0, z0], [x1 + dy, y1, z0], s=s, font=font, precision=precision, label_rotation=label_rotation, axis_rotation=yaxis_rotation, lw=lw, italic=italic, prefix=ytitle, label=ylabel, units=units, ) acts.append(ry) if ztitle is not None and (z1 - z0) / d > 0.1: rz = Ruler( [x0 - dy, y0 + dz, z0], [x0 - dy, y0 + dz, z1], s=s, font=font, precision=precision, label_rotation=label_rotation, axis_rotation=zaxis_rotation + 90, lw=lw, italic=italic, prefix=ztitle, label=zlabel, units=units, ) acts.append(rz) if xycross and rx and ry: lx = shapes.Line([x0, y0, z0], [x0, y1 + dx, z0]) ly = shapes.Line([x0 - dy, y1, z0], [x1, y1, z0]) d = min((x1 - x0), (y1 - y0)) / 200 cxy = shapes.Circle([x0, y1, z0], r=d, res=15) acts.extend([lx, ly, cxy]) macts = merge(acts) if not macts: return None macts.c(c).alpha(alpha).bc("t") macts.UseBoundsOff() macts.PickableOff() return macts ##################################################################### class Ruler2D(vtk.vtkAxisActor2D): """ Create a ruler with tick marks, labels and a title. """ def __init__( self, lw=2, ticks=True, labels=False, c="k", alpha=1, title="", font="Calco", font_size=24, bc=None, ): """ Create a ruler with tick marks, labels and a title. Ruler2D is a 2D actor; that is, it is drawn on the overlay plane and is not occluded by 3D geometry. To use this class, specify two points defining the start and end with update_points() as 3D points. This class decides decides how to create reasonable tick marks and labels. Labels are drawn on the "right" side of the axis. The "right" side is the side of the axis on the right. The way the labels and title line up with the axis and tick marks depends on whether the line is considered horizontal or vertical. Arguments: lw : (int) width of the line in pixel units ticks : (bool) control if drawing the tick marks labels : (bool) control if drawing the numeric labels c : (color) color of the object alpha : (float) opacity of the object title : (str) title of the ruler font : (str) font face name. Check [available fonts here](https://vedo.embl.es/fonts). font_size : (int) font size bc : (color) background color of the title Example: ```python from vedo import * plt = Plotter(axes=1, interactive=False) plt.show(Cube()) rul = Ruler2D() rul.set_points([0,0,0], [0.5,0.5,0.5]) plt.add(rul) plt.interactive().close() ``` ![](https://vedo.embl.es/images/feats/dist_tool.png) """ vtk.vtkAxisActor2D.__init__(self) plt = vedo.plotter_instance if not plt: vedo.logger.error("Ruler2D need to initialize Plotter first.") raise RuntimeError() self.p0 = [0, 0, 0] self.p1 = [0, 0, 0] self.distance = 0 self.title = title prop = self.GetProperty() tprop = self.GetTitleTextProperty() self.SetTitle(title) self.SetNumberOfLabels(9) if not font: font = settings.default_font if font.lower() == "courier": tprop.SetFontFamilyToCourier() elif font.lower() == "times": tprop.SetFontFamilyToTimes() elif font.lower() == "arial": tprop.SetFontFamilyToArial() else: tprop.SetFontFamily(vtk.VTK_FONT_FILE) tprop.SetFontFile(utils.get_font_path(font)) tprop.SetFontSize(font_size) tprop.BoldOff() tprop.ItalicOff() tprop.ShadowOff() tprop.SetColor(get_color(c)) tprop.SetOpacity(alpha) if bc is not None: bc = get_color(bc) tprop.SetBackgroundColor(bc) tprop.SetBackgroundOpacity(alpha) lprop = vtk.vtkTextProperty() lprop.ShallowCopy(tprop) self.SetLabelTextProperty(lprop) self.SetLabelFormat("%0.3g") self.SetTickVisibility(ticks) self.SetLabelVisibility(labels) prop.SetLineWidth(lw) prop.SetColor(get_color(c)) self.renderer = plt.renderer self.cid = plt.interactor.AddObserver("RenderEvent", self._update_viz, 1.0) def color(self, c): """Assign a new color.""" c = get_color(c) self.GetTitleTextProperty().SetColor(c) self.GetLabelTextProperty().SetColor(c) self.GetProperty().SetColor(c) return self def off(self): """Switch off the ruler completely.""" self.renderer.RemoveObserver(self.cid) self.renderer.RemoveActor(self) def set_points(self, p0, p1): """Set new values for the ruler start and end points.""" self.p0 = np.asarray(p0) self.p1 = np.asarray(p1) self._update_viz(0, 0) return self def _update_viz(self, evt, name): ren = self.renderer view_size = np.array(ren.GetSize()) ren.SetWorldPoint(*self.p0, 1) ren.WorldToDisplay() disp_point1 = ren.GetDisplayPoint()[:2] disp_point1 = np.array(disp_point1) / view_size ren.SetWorldPoint(*self.p1, 1) ren.WorldToDisplay() disp_point2 = ren.GetDisplayPoint()[:2] disp_point2 = np.array(disp_point2) / view_size self.SetPoint1(*disp_point1) self.SetPoint2(*disp_point2) self.distance = np.linalg.norm(self.p1 - self.p0) self.SetRange(0, self.distance) if not self.title: self.SetTitle(utils.precision(self.distance, 3)) ##################################################################### class DistanceTool(Group): """ Create a tool to measure the distance between two clicked points. """ def __init__(self, plotter=None, c="k", lw=2): """ Create a tool to measure the distance between two clicked points. Example: ```python from vedo import * mesh = ParametricShape("RandomHills").c("red5") plt = Plotter(axes=1) dtool = DistanceTool() dtool.on() plt.show(mesh, dtool) dtool.off() ``` ![](https://vedo.embl.es/images/feats/dist_tool.png) """ Group.__init__(self) self.p0 = [0, 0, 0] self.p1 = [0, 0, 0] self.distance = 0 if plotter is None: plotter = vedo.plotter_instance self.plotter = plotter self.callback = None self.cid = None self.color = c self.linewidth = lw self.toggle = True self.ruler = None self.title = "" def on(self): """Switch tool on.""" self.cid = self.plotter.add_callback("click", self._onclick) self.VisibilityOn() self.plotter.render() return self def off(self): """Switch tool off.""" self.plotter.remove_callback(self.cid) self.VisibilityOff() self.ruler.off() self.plotter.render() def _onclick(self, event): if not event.actor: return self.clear() acts = [] if self.toggle: self.p0 = event.picked3d acts.append(Point(self.p0, c=self.color)) else: self.p1 = event.picked3d self.distance = np.linalg.norm(self.p1 - self.p0) acts.append(Point(self.p0, c=self.color)) acts.append(Point(self.p1, c=self.color)) self.ruler = Ruler2D(c=self.color) self.ruler.set_points(self.p0, self.p1) acts.append(self.ruler) if self.callback is not None: self.callback(event) self += acts self.toggle = not self.toggle ##################################################################### def Axes( obj=None, xtitle='x', ytitle='y', ztitle='z', xrange=None, yrange=None, zrange=None, c=None, number_of_divisions=None, digits=None, limit_ratio=0.04, title_depth=0, title_font="", # grab settings.default_font text_scale=1.0, x_values_and_labels=None, y_values_and_labels=None, z_values_and_labels=None, htitle="", htitle_size=0.03, htitle_font=None, htitle_italic=False, htitle_color=None, htitle_justify='bottom-center', htitle_rotation=0, htitle_offset=(0, 0.01, 0), xtitle_position=0.95, ytitle_position=0.95, ztitle_position=0.95, xtitle_offset=0.025, ytitle_offset=0.0275, ztitle_offset=0.02, # can be a list (dx,dy,dz) xtitle_justify=None, ytitle_justify=None, ztitle_justify=None, xtitle_rotation=0, ytitle_rotation=0, ztitle_rotation=0, # can be a list (rx,ry,rz) xtitle_box=False, ytitle_box=False, xtitle_size=0.025, ytitle_size=0.025, ztitle_size=0.025, xtitle_color=None, ytitle_color=None, ztitle_color=None, xtitle_backface_color=None, ytitle_backface_color=None, ztitle_backface_color=None, xtitle_italic=0, ytitle_italic=0, ztitle_italic=0, grid_linewidth=1, xygrid=True, yzgrid=False, zxgrid=False, xygrid2=False, yzgrid2=False, zxgrid2=False, xygrid_transparent=False, yzgrid_transparent=False, zxgrid_transparent=False, xygrid2_transparent=False, yzgrid2_transparent=False, zxgrid2_transparent=False, xyplane_color=None, yzplane_color=None, zxplane_color=None, xygrid_color=None, yzgrid_color=None, zxgrid_color=None, xyalpha=0.075, yzalpha=0.075, zxalpha=0.075, xyframe_line=None, yzframe_line=None, zxframe_line=None, xyframe_color=None, yzframe_color=None, zxframe_color=None, axes_linewidth=1, xline_color=None, yline_color=None, zline_color=None, xhighlight_zero=False, yhighlight_zero=False, zhighlight_zero=False, xhighlight_zero_color='red4', yhighlight_zero_color='green4', zhighlight_zero_color='blue4', show_ticks=True, xtick_length=0.015, ytick_length=0.015, ztick_length=0.015, xtick_thickness=0.0025, ytick_thickness=0.0025, ztick_thickness=0.0025, xminor_ticks=1, yminor_ticks=1, zminor_ticks=1, tip_size=None, label_font="", # grab settings.default_font xlabel_color=None, ylabel_color=None, zlabel_color=None, xlabel_size=0.016, ylabel_size=0.016, zlabel_size=0.016, xlabel_offset=0.8, ylabel_offset=0.8, zlabel_offset=0.8, # each can be a list (dx,dy,dz) xlabel_justify=None, ylabel_justify=None, zlabel_justify=None, xlabel_rotation=0, ylabel_rotation=0, zlabel_rotation=0, # each can be a list (rx,ry,rz) xaxis_rotation=0, yaxis_rotation=0, zaxis_rotation=0, # rotate all elements around axis xyshift=0, yzshift=0, zxshift=0, xshift_along_y=0, xshift_along_z=0, yshift_along_x=0, yshift_along_z=0, zshift_along_x=0, zshift_along_y=0, x_use_bounds=True, y_use_bounds=True, z_use_bounds=False, x_inverted=False, y_inverted=False, z_inverted=False, use_global=False, tol=0.001, **options, ): """ Draw axes for the input object. Check [available fonts here](https://vedo.embl.es/fonts). Returns an `vedo.Assembly` object. Parameters ---------- - `xtitle`, ['x'], x-axis title text - `xrange`, [None], x-axis range in format (xmin, ymin), default is automatic. - `number_of_divisions`, [None], approximate number of divisions on the longest axis - `axes_linewidth`, [1], width of the axes lines - `grid_linewidth`, [1], width of the grid lines - `title_depth`, [0], extrusion fractional depth of title text - `x_values_and_labels` [], assign custom tick positions and labels [(pos1, label1), ...] - `xygrid`, [True], show a gridded wall on plane xy - `yzgrid`, [True], show a gridded wall on plane yz - `zxgrid`, [True], show a gridded wall on plane zx - `zxgrid2`, [False], show zx plane on opposite side of the bounding box - `xygrid_transparent` [False], make grid plane completely transparent - `xygrid2_transparent` [False], make grid plane completely transparent on opposite side box - `xyplane_color`, ['None'], color of the plane - `xygrid_color`, ['None'], grid line color - `xyalpha`, [0.15], grid plane opacity - `xyframe_line`, [0], add a frame for the plane, use value as the thickness - `xyframe_color`, [None], color for the frame of the plane - `show_ticks`, [True], show major ticks - `digits`, [None], use this number of significant digits in scientific notation - `title_font`, [''], font for axes titles - `label_font`, [''], font for numeric labels - `text_scale`, [1.0], global scaling factor for all text elements (titles, labels) - `htitle`, [''], header title - `htitle_size`, [0.03], header title size - `htitle_font`, [None], header font (defaults to `title_font`) - `htitle_italic`, [True], header font is italic - `htitle_color`, [None], header title color (defaults to `xtitle_color`) - `htitle_justify`, ['bottom-center'], origin of the title justification - `htitle_offset`, [(0,0.01,0)], control offsets of header title in x, y and z - `xtitle_position`, [0.32], title fractional positions along axis - `xtitle_offset`, [0.05], title fractional offset distance from axis line, can be a list - `xtitle_justify`, [None], choose the origin of the bounding box of title - `xtitle_rotation`, [0], add a rotation of the axis title, can be a list (rx,ry,rz) - `xtitle_box`, [False], add a box around title text - `xline_color`, [automatic], color of the x-axis - `xtitle_color`, [automatic], color of the axis title - `xtitle_backface_color`, [None], color of axis title on its backface - `xtitle_size`, [0.025], size of the axis title - `xtitle_italic`, [0], a bool or float to make the font italic - `xhighlight_zero`, [True], draw a line highlighting zero position if in range - `xhighlight_zero_color`, [autom], color of the line highlighting the zero position - `xtick_length`, [0.005], radius of the major ticks - `xtick_thickness`, [0.0025], thickness of the major ticks along their axis - `xminor_ticks`, [1], number of minor ticks between two major ticks - `xlabel_color`, [automatic], color of numeric labels and ticks - `xLabelPrecision`, [2], nr. of significative digits to be shown - `xlabel_size`, [0.015], size of the numeric labels along axis - `xlabel_rotation`, [0], numeric labels rotation (can be a list of 3 rotations) - `xlabel_offset`, [0.8], offset of the numeric labels (can be a list of 3 offsets) - `xlabel_justify`, [None], choose the origin of the bounding box of labels - `xaxis_rotation`, [0], rotate the X axis elements (ticks and labels) around this same axis - `xyshift` [0.0], slide the xy-plane along z (the range is [0,1]) - `xshift_along_y` [0.0], slide x-axis along the y-axis (the range is [0,1]) - `tip_size`, [0.01], size of the arrow tip - `limit_ratio`, [0.04], below this ratio don't plot smaller axis - `x_use_bounds`, [True], keep into account space occupied by labels when setting camera - `x_inverted`, [False], invert labels order and direction (only visually!) - `use_global`, [False], try to compute the global bounding box of visible actors Example: ```python from vedo import Axes, Box, show box = Box(pos=(1,2,3), length=8, width=9, height=7).alpha(0.1) axs = Axes(box, c='k') # returns an Assembly object for a in axs.unpack(): print(a.name) show(box, axs).close() ``` ![](https://vedo.embl.es/images/feaxes1ats/axes1.png) Examples: - [custom_axes1.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes1.py) - [custom_axes2.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes2.py) - [custom_axes3.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes3.py) - [custom_axes4.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes4.py) ![](https://vedo.embl.es/images/pyplot/customAxes3.png) """ # make sure options are correct and user passed snake_case instead of camelCase if len(options): for k in options: if k.lower() == k: vedo.logger.warning(f"Unrecognised keyword '{k}' is ignored") else: vedo.logger.warning(f"Unrecognised keyword '{k}'. Please use snake_case notation") if not title_font: title_font = settings.default_font if not label_font: label_font = settings.default_font if c is None: # automatic black or white c = (0.1, 0.1, 0.1) plt = vedo.plotter_instance if plt and plt.renderer: bgcol = plt.renderer.GetBackground() else: bgcol = (1, 1, 1) if np.sum(bgcol) < 1.5: c = (0.9, 0.9, 0.9) else: c = get_color(c) if use_global: vbb, drange, min_bns, max_bns = compute_visible_bounds() else: if obj is not None: vbb, drange, min_bns, max_bns = compute_visible_bounds(obj) else: vbb = np.zeros(6) drange = np.zeros(3) if zrange is None: zrange = (0, 0) if xrange is None or yrange is None: vedo.logger.error("in Axes() must specify axes ranges!") raise RuntimeError() if xrange is not None: if xrange[1] < xrange[0]: x_inverted = True xrange = [xrange[1], xrange[0]] vbb[0], vbb[1] = xrange drange[0] = vbb[1] - vbb[0] min_bns = vbb max_bns = vbb if yrange is not None: if yrange[1] < yrange[0]: y_inverted = True yrange = [yrange[1], yrange[0]] vbb[2], vbb[3] = yrange drange[1] = vbb[3] - vbb[2] min_bns = vbb max_bns = vbb if zrange is not None: if zrange[1] < zrange[0]: z_inverted = True zrange = [zrange[1], zrange[0]] vbb[4], vbb[5] = zrange drange[2] = vbb[5] - vbb[4] min_bns = vbb max_bns = vbb drangemax = max(drange) if not drangemax: return None if drange[0] / drangemax < limit_ratio: drange[0] = 0 xtitle = "" if drange[1] / drangemax < limit_ratio: drange[1] = 0 ytitle = "" if drange[2] / drangemax < limit_ratio: drange[2] = 0 ztitle = "" x0, x1, y0, y1, z0, z1 = vbb dx, dy, dz = drange gscale = np.sqrt(dx * dx + dy * dy + dz * dz) * 0.75 if not xyplane_color: xyplane_color = c if not yzplane_color: yzplane_color = c if not zxplane_color: zxplane_color = c if not xygrid_color: xygrid_color = c if not yzgrid_color: yzgrid_color = c if not zxgrid_color: zxgrid_color = c if not xtitle_color: xtitle_color = c if not ytitle_color: ytitle_color = c if not ztitle_color: ztitle_color = c if not xline_color: xline_color = c if not yline_color: yline_color = c if not zline_color: zline_color = c if not xlabel_color: xlabel_color = xline_color if not ylabel_color: ylabel_color = yline_color if not zlabel_color: zlabel_color = zline_color # vtk version<9 dont like depthpeeling: force switching off grids if settings.use_depth_peeling and not utils.vtk_version_at_least(9): xygrid = False yzgrid = False zxgrid = False xygrid2 = False yzgrid2 = False zxgrid2 = False if tip_size is None: tip_size = 0.005 * gscale if not ztitle: tip_size = 0 # switch off in xy 2d ndiv = 4 if not ztitle or not ytitle or not xtitle: # make more default ticks if 2D ndiv = 6 if not ztitle: if xyframe_line is None: xyframe_line = True if tip_size is None: tip_size = False if utils.is_sequence(number_of_divisions): rx, ry, rz = number_of_divisions else: if not number_of_divisions: number_of_divisions = ndiv rx, ry, rz = np.ceil(drange / drangemax * number_of_divisions).astype(int) if xtitle: xticks_float, xticks_str = utils.make_ticks(x0, x1, rx, x_values_and_labels, digits) xticks_float = xticks_float * dx if x_inverted: xticks_float = np.flip(-(xticks_float - xticks_float[-1])) xticks_str = list(reversed(xticks_str)) xticks_str[-1] = "" xhighlight_zero = False if ytitle: yticks_float, yticks_str = utils.make_ticks(y0, y1, ry, y_values_and_labels, digits) yticks_float = yticks_float * dy if y_inverted: yticks_float = np.flip(-(yticks_float - yticks_float[-1])) yticks_str = list(reversed(yticks_str)) yticks_str[-1] = "" yhighlight_zero = False if ztitle: zticks_float, zticks_str = utils.make_ticks(z0, z1, rz, z_values_and_labels, digits) zticks_float = zticks_float * dz if z_inverted: zticks_float = np.flip(-(zticks_float - zticks_float[-1])) zticks_str = list(reversed(zticks_str)) zticks_str[-1] = "" zhighlight_zero = False ################################################ axes lines lines = [] if xtitle: axlinex = shapes.Line([0,0,0], [dx,0,0], c=xline_color, lw=axes_linewidth) if xyshift: axlinex.shift(0,0,xyshift*dz) if zxshift: axlinex.shift(0,zxshift*dy,0) if xshift_along_y: axlinex.shift(0,xshift_along_y*dy,0) if xshift_along_z: axlinex.shift(0,0,xshift_along_z*dz) axlinex.name = 'xAxis' lines.append(axlinex) if ytitle: axliney = shapes.Line([0,0,0], [0,dy,0], c=yline_color, lw=axes_linewidth) if xyshift: axliney.shift(0,0,xyshift*dz) if yzshift: axliney.shift(yzshift*dx,0,0) if yshift_along_x: axliney.shift(yshift_along_x*dx,0,0) if yshift_along_z: axliney.shift(0,0,yshift_along_z*dz) axliney.name = 'yAxis' lines.append(axliney) if ztitle: axlinez = shapes.Line([0,0,0], [0,0,dz], c=zline_color, lw=axes_linewidth) if yzshift: axlinez.shift(yzshift*dx,0,0) if zxshift: axlinez.shift(0,zxshift*dy,0) if zshift_along_x: axlinez.shift(zshift_along_x*dx,0,0) if zshift_along_y: axlinez.shift(0,zshift_along_y*dy,0) axlinez.name = 'zAxis' lines.append(axlinez) ################################################ grid planes # all shapes have a name to keep track of them in the Assembly # if user wants to unpack it grids = [] if xygrid and xtitle and ytitle: if not xygrid_transparent: gxy = shapes.Grid(s=(xticks_float, yticks_float)) gxy.alpha(xyalpha).c(xyplane_color).lw(0) if xyshift: gxy.shift(0,0,xyshift*dz) elif tol: gxy.shift(0,0,-tol*gscale) gxy.name = "xyGrid" grids.append(gxy) if grid_linewidth: gxy_lines = shapes.Grid(s=(xticks_float, yticks_float)) gxy_lines.c(xyplane_color).lw(grid_linewidth).alpha(xyalpha) if xyshift: gxy_lines.shift(0,0,xyshift*dz) elif tol: gxy_lines.shift(0,0,-tol*gscale) gxy_lines.name = "xyGridLines" grids.append(gxy_lines) if yzgrid and ytitle and ztitle: if not yzgrid_transparent: gyz = shapes.Grid(s=(zticks_float, yticks_float)) gyz.alpha(yzalpha).c(yzplane_color).lw(0).RotateY(-90) if yzshift: gyz.shift(yzshift*dx,0,0) elif tol: gyz.shift(-tol*gscale,0,0) gyz.name = "yzGrid" grids.append(gyz) if grid_linewidth: gyz_lines = shapes.Grid(s=(zticks_float, yticks_float)) gyz_lines.c(yzplane_color).lw(grid_linewidth).alpha(yzalpha).RotateY(-90) if yzshift: gyz_lines.shift(yzshift*dx,0,0) elif tol: gyz_lines.shift(-tol*gscale,0,0) gyz_lines.name = "yzGridLines" grids.append(gyz_lines) if zxgrid and ztitle and xtitle: if not zxgrid_transparent: gzx = shapes.Grid(s=(xticks_float, zticks_float)) gzx.alpha(zxalpha).c(zxplane_color).lw(0).RotateX(90) if zxshift: gzx.shift(0,zxshift*dy,0) elif tol: gzx.shift(0,-tol*gscale,0) gzx.name = "zxGrid" grids.append(gzx) if grid_linewidth: gzx_lines = shapes.Grid(s=(xticks_float, zticks_float)) gzx_lines.c(zxplane_color).lw(grid_linewidth).alpha(zxalpha).RotateX(90) if zxshift: gzx_lines.shift(0,zxshift*dy,0) elif tol: gzx_lines.shift(0,-tol*gscale,0) gzx_lines.name = "zxGridLines" grids.append(gzx_lines) # Grid2 if xygrid2 and xtitle and ytitle: if not xygrid2_transparent: gxy2 = shapes.Grid(s=(xticks_float, yticks_float)).z(dz) gxy2.alpha(xyalpha).c(xyplane_color).lw(0) if tol: gxy2.shift(0,tol*gscale,0) gxy2.name = "xyGrid2" grids.append(gxy2) if grid_linewidth: gxy2_lines = shapes.Grid(s=(xticks_float, yticks_float)).z(dz) gxy2_lines.c(xyplane_color).lw(grid_linewidth).alpha(xyalpha) if tol: gxy2_lines.shift(0,tol*gscale,0) gxy2_lines.name = "xygrid2Lines" grids.append(gxy2_lines) if yzgrid2 and ytitle and ztitle: if not yzgrid2_transparent: gyz2 = shapes.Grid(s=(zticks_float, yticks_float)).x(dx) gyz2.alpha(yzalpha).c(yzplane_color).lw(0).RotateY(-90) if tol: gyz2.shift(tol*gscale,0,0) gyz2.name = "yzGrid2" grids.append(gyz2) if grid_linewidth: gyz2_lines = shapes.Grid(s=(zticks_float, yticks_float)).x(dx) gyz2_lines.c(yzplane_color).lw(grid_linewidth).alpha(yzalpha).RotateY(-90) if tol: gyz2_lines.shift(tol*gscale,0,0) gyz2_lines.name = "yzGrid2Lines" grids.append(gyz2_lines) if zxgrid2 and ztitle and xtitle: if not zxgrid2_transparent: gzx2 = shapes.Grid(s=(xticks_float, zticks_float)).y(dy) gzx2.alpha(zxalpha).c(zxplane_color).lw(0).RotateX(90) if tol: gzx2.shift(0,tol*gscale,0) gzx2.name = "zxGrid2" grids.append(gzx2) if grid_linewidth: gzx2_lines = shapes.Grid(s=(xticks_float, zticks_float)).y(dy) gzx2_lines.c(zxplane_color).lw(grid_linewidth).alpha(zxalpha).RotateX(90) if tol: gzx2_lines.shift(0,tol*gscale,0) gzx2_lines.name = "zxGrid2Lines" grids.append(gzx2_lines) ################################################ frame lines framelines = [] if xyframe_line and xtitle and ytitle: if not xyframe_color: xyframe_color = xygrid_color frxy = shapes.Line([[0,dy,0],[dx,dy,0],[dx,0,0],[0,0,0],[0,dy,0]], c=xyframe_color, lw=xyframe_line) if xyshift: frxy.shift(0,0,xyshift*dz) frxy.name = 'xyFrameLine' framelines.append(frxy) if yzframe_line and ytitle and ztitle: if not yzframe_color: yzframe_color = yzgrid_color fryz = shapes.Line([[0,0,dz],[0,dy,dz],[0,dy,0],[0,0,0],[0,0,dz]], c=yzframe_color, lw=yzframe_line) if yzshift: fryz.shift(yzshift*dx,0,0) fryz.name = 'yzFrameLine' framelines.append(fryz) if zxframe_line and ztitle and xtitle: if not zxframe_color: zxframe_color = zxgrid_color frzx = shapes.Line([[0,0,dz],[dx,0,dz],[dx,0,0],[0,0,0],[0,0,dz]], c=zxframe_color, lw=zxframe_line) if zxshift: frzx.shift(0,zxshift*dy,0) frzx.name = 'zxFrameLine' framelines.append(frzx) ################################################ zero lines highlights highlights = [] if xygrid and xtitle and ytitle: if xhighlight_zero and min_bns[0] <= 0 and max_bns[1] > 0: xhl = -min_bns[0] hxy = shapes.Line([xhl,0,0], [xhl,dy,0], c=xhighlight_zero_color) hxy.alpha(np.sqrt(xyalpha)).lw(grid_linewidth*2) if xyshift: hxy.shift(0,0,xyshift*dz) hxy.name = "xyHighlightZero" highlights.append(hxy) if yhighlight_zero and min_bns[2] <= 0 and max_bns[3] > 0: yhl = -min_bns[2] hyx = shapes.Line([0,yhl,0], [dx,yhl,0], c=yhighlight_zero_color) hyx.alpha(np.sqrt(yzalpha)).lw(grid_linewidth*2) if xyshift: hyx.shift(0,0,xyshift*dz) hyx.name = "yxHighlightZero" highlights.append(hyx) if yzgrid and ytitle and ztitle: if yhighlight_zero and min_bns[2] <= 0 and max_bns[3] > 0: yhl = -min_bns[2] hyz = shapes.Line([0,yhl,0], [0,yhl,dz], c=yhighlight_zero_color) hyz.alpha(np.sqrt(yzalpha)).lw(grid_linewidth*2) if yzshift: hyz.shift(yzshift*dx,0,0) hyz.name = "yzHighlightZero" highlights.append(hyz) if zhighlight_zero and min_bns[4] <= 0 and max_bns[5] > 0: zhl = -min_bns[4] hzy = shapes.Line([0,0,zhl], [0,dy,zhl], c=zhighlight_zero_color) hzy.alpha(np.sqrt(yzalpha)).lw(grid_linewidth*2) if yzshift: hzy.shift(yzshift*dx,0,0) hzy.name = "zyHighlightZero" highlights.append(hzy) if zxgrid and ztitle and xtitle: if zhighlight_zero and min_bns[4] <= 0 and max_bns[5] > 0: zhl = -min_bns[4] hzx = shapes.Line([0,0,zhl], [dx,0,zhl], c=zhighlight_zero_color) hzx.alpha(np.sqrt(zxalpha)).lw(grid_linewidth*2) if zxshift: hzx.shift(0,zxshift*dy,0) hzx.name = "zxHighlightZero" highlights.append(hzx) if xhighlight_zero and min_bns[0] <= 0 and max_bns[1] > 0: xhl = -min_bns[0] hxz = shapes.Line([xhl,0,0], [xhl,0,dz], c=xhighlight_zero_color) hxz.alpha(np.sqrt(zxalpha)).lw(grid_linewidth*2) if zxshift: hxz.shift(0,zxshift*dy,0) hxz.name = "xzHighlightZero" highlights.append(hxz) ################################################ arrow cone cones = [] if tip_size: if xtitle: if x_inverted: cx = shapes.Cone( r=tip_size, height=tip_size * 2, axis=(-1, 0, 0), c=xline_color, res=12 ) else: cx = shapes.Cone((dx,0,0), r=tip_size, height=tip_size*2, axis=(1,0,0), c=xline_color, res=12) if xyshift: cx.shift(0,0,xyshift*dz) if zxshift: cx.shift(0,zxshift*dy,0) if xshift_along_y: cx.shift(0,xshift_along_y*dy,0) if xshift_along_z: cx.shift(0,0,xshift_along_z*dz) cx.name = "xTipCone" cones.append(cx) if ytitle: if y_inverted: cy = shapes.Cone(r=tip_size, height=tip_size*2, axis=(0,-1,0), c=yline_color, res=12) else: cy = shapes.Cone((0,dy,0), r=tip_size, height=tip_size*2, axis=(0,1,0), c=yline_color, res=12) if xyshift: cy.shift(0,0,xyshift*dz) if yzshift: cy.shift(yzshift*dx,0,0) if yshift_along_x: cy.shift(yshift_along_x*dx,0,0) if yshift_along_z: cy.shift(0,0,yshift_along_z*dz) cy.name = "yTipCone" cones.append(cy) if ztitle: if z_inverted: cz = shapes.Cone(r=tip_size, height=tip_size*2, axis=(0,0,-1), c=zline_color, res=12) else: cz = shapes.Cone((0,0,dz), r=tip_size, height=tip_size*2, axis=(0,0,1), c=zline_color, res=12) if yzshift: cz.shift(yzshift*dx,0,0) if zxshift: cz.shift(0,zxshift*dy,0) if zshift_along_x: cz.shift(zshift_along_x*dx,0,0) if zshift_along_y: cz.shift(0,zshift_along_y*dy,0) cz.name = "zTipCone" cones.append(cz) ################################################################# MAJOR ticks majorticks, minorticks = [], [] xticks, yticks, zticks = [], [], [] if show_ticks: if xtitle: tickThickness = xtick_thickness * gscale / 2 tickLength = xtick_length * gscale / 2 for i in range(1, len(xticks_float) - 1): v1 = (xticks_float[i] - tickThickness, -tickLength, 0) v2 = (xticks_float[i] + tickThickness, tickLength, 0) xticks.append(shapes.Rectangle(v1, v2)) if len(xticks) > 1: xmajticks = merge(xticks).c(xlabel_color) if xaxis_rotation: xmajticks.RotateX(xaxis_rotation) if xyshift: xmajticks.shift(0,0,xyshift*dz) if zxshift: xmajticks.shift(0,zxshift*dy,0) if xshift_along_y: xmajticks.shift(0,xshift_along_y*dy,0) if xshift_along_z: xmajticks.shift(0,0,xshift_along_z*dz) xmajticks.name = "xMajorTicks" majorticks.append(xmajticks) if ytitle: tickThickness = ytick_thickness * gscale / 2 tickLength = ytick_length * gscale / 2 for i in range(1, len(yticks_float) - 1): v1 = (-tickLength, yticks_float[i] - tickThickness, 0) v2 = (tickLength, yticks_float[i] + tickThickness, 0) yticks.append(shapes.Rectangle(v1, v2)) if len(yticks) > 1: ymajticks = merge(yticks).c(ylabel_color) if yaxis_rotation: ymajticks.RotateY(yaxis_rotation) if xyshift: ymajticks.shift(0,0,xyshift*dz) if yzshift: ymajticks.shift(yzshift*dx,0,0) if yshift_along_x: ymajticks.shift(yshift_along_x*dx,0,0) if yshift_along_z: ymajticks.shift(0,0,yshift_along_z*dz) ymajticks.name = "yMajorTicks" majorticks.append(ymajticks) if ztitle: tickThickness = ztick_thickness * gscale / 2 tickLength = ztick_length * gscale / 2.85 for i in range(1, len(zticks_float) - 1): v1 = (zticks_float[i] - tickThickness, -tickLength, 0) v2 = (zticks_float[i] + tickThickness, tickLength, 0) zticks.append(shapes.Rectangle(v1, v2)) if len(zticks) > 1: zmajticks = merge(zticks).c(zlabel_color) zmajticks.RotateZ(-45 + zaxis_rotation) zmajticks.RotateY(-90) if yzshift: zmajticks.shift(yzshift*dx,0,0) if zxshift: zmajticks.shift(0,zxshift*dy,0) if zshift_along_x: zmajticks.shift(zshift_along_x*dx,0,0) if zshift_along_y: zmajticks.shift(0,zshift_along_y*dy,0) zmajticks.name = "zMajorTicks" majorticks.append(zmajticks) ############################################################# MINOR ticks if xtitle and xminor_ticks and len(xticks) > 1: tickThickness = xtick_thickness * gscale / 4 tickLength = xtick_length * gscale / 4 xminor_ticks += 1 ticks = [] for i in range(1, len(xticks)): t0, t1 = xticks[i - 1].pos(), xticks[i].pos() dt = t1 - t0 for j in range(1, xminor_ticks): mt = dt * (j / xminor_ticks) + t0 v1 = (mt[0] - tickThickness, -tickLength, 0) v2 = (mt[0] + tickThickness, tickLength, 0) ticks.append(shapes.Rectangle(v1, v2)) # finish off the fist lower range from start to first tick t0, t1 = xticks[0].pos(), xticks[1].pos() dt = t1 - t0 for j in range(1, xminor_ticks): mt = t0 - dt * (j / xminor_ticks) if mt[0] < 0: break v1 = (mt[0] - tickThickness, -tickLength, 0) v2 = (mt[0] + tickThickness, tickLength, 0) ticks.append(shapes.Rectangle(v1, v2)) # finish off the last upper range from last tick to end t0, t1 = xticks[-2].pos(), xticks[-1].pos() dt = t1 - t0 for j in range(1, xminor_ticks): mt = t1 + dt * (j / xminor_ticks) if mt[0] > dx: break v1 = (mt[0] - tickThickness, -tickLength, 0) v2 = (mt[0] + tickThickness, tickLength, 0) ticks.append(shapes.Rectangle(v1, v2)) if ticks: xminticks = merge(ticks).c(xlabel_color) if xaxis_rotation: xminticks.RotateX(xaxis_rotation) if xyshift: xminticks.shift(0,0,xyshift*dz) if zxshift: xminticks.shift(0,zxshift*dy,0) if xshift_along_y: xminticks.shift(0,xshift_along_y*dy,0) if xshift_along_z: xminticks.shift(0,0,xshift_along_z*dz) xminticks.name = "xMinorTicks" minorticks.append(xminticks) if ytitle and yminor_ticks and len(yticks) > 1: ##### y tickThickness = ytick_thickness * gscale / 4 tickLength = ytick_length * gscale / 4 yminor_ticks += 1 ticks = [] for i in range(1, len(yticks)): t0, t1 = yticks[i - 1].pos(), yticks[i].pos() dt = t1 - t0 for j in range(1, yminor_ticks): mt = dt * (j / yminor_ticks) + t0 v1 = (-tickLength, mt[1] - tickThickness, 0) v2 = (tickLength, mt[1] + tickThickness, 0) ticks.append(shapes.Rectangle(v1, v2)) # finish off the fist lower range from start to first tick t0, t1 = yticks[0].pos(), yticks[1].pos() dt = t1 - t0 for j in range(1, yminor_ticks): mt = t0 - dt * (j / yminor_ticks) if mt[1] < 0: break v1 = (-tickLength, mt[1] - tickThickness, 0) v2 = (tickLength, mt[1] + tickThickness, 0) ticks.append(shapes.Rectangle(v1, v2)) # finish off the last upper range from last tick to end t0, t1 = yticks[-2].pos(), yticks[-1].pos() dt = t1 - t0 for j in range(1, yminor_ticks): mt = t1 + dt * (j / yminor_ticks) if mt[1] > dy: break v1 = (-tickLength, mt[1] - tickThickness, 0) v2 = (tickLength, mt[1] + tickThickness, 0) ticks.append(shapes.Rectangle(v1, v2)) if ticks: yminticks = merge(ticks).c(ylabel_color) if yaxis_rotation: yminticks.RotateY(yaxis_rotation) if xyshift: yminticks.shift(0,0,xyshift*dz) if yzshift: yminticks.shift(yzshift*dx,0,0) if yshift_along_x: yminticks.shift(yshift_along_x*dx,0,0) if yshift_along_z: yminticks.shift(0,0,yshift_along_z*dz) yminticks.name = "yMinorTicks" minorticks.append(yminticks) if ztitle and zminor_ticks and len(zticks) > 1: ##### z tickThickness = ztick_thickness * gscale / 4 tickLength = ztick_length * gscale / 5 zminor_ticks += 1 ticks = [] for i in range(1, len(zticks)): t0, t1 = zticks[i - 1].pos(), zticks[i].pos() dt = t1 - t0 for j in range(1, zminor_ticks): mt = dt * (j / zminor_ticks) + t0 v1 = (mt[0] - tickThickness, -tickLength, 0) v2 = (mt[0] + tickThickness, tickLength, 0) ticks.append(shapes.Rectangle(v1, v2)) # finish off the fist lower range from start to first tick t0, t1 = zticks[0].pos(), zticks[1].pos() dt = t1 - t0 for j in range(1, zminor_ticks): mt = t0 - dt * (j / zminor_ticks) if mt[0] < 0: break v1 = (mt[0] - tickThickness, -tickLength, 0) v2 = (mt[0] + tickThickness, tickLength, 0) ticks.append(shapes.Rectangle(v1, v2)) # finish off the last upper range from last tick to end t0, t1 = zticks[-2].pos(), zticks[-1].pos() dt = t1 - t0 for j in range(1, zminor_ticks): mt = t1 + dt * (j / zminor_ticks) if mt[0] > dz: break v1 = (mt[0] - tickThickness, -tickLength, 0) v2 = (mt[0] + tickThickness, tickLength, 0) ticks.append(shapes.Rectangle(v1, v2)) if ticks: zminticks = merge(ticks).c(zlabel_color) zminticks.RotateZ(-45 + zaxis_rotation) zminticks.RotateY(-90) if yzshift: zminticks.shift(yzshift*dx,0,0) if zxshift: zminticks.shift(0,zxshift*dy,0) if zshift_along_x: zminticks.shift(zshift_along_x*dx,0,0) if zshift_along_y: zminticks.shift(0,zshift_along_y*dy,0) zminticks.name = "zMinorTicks" minorticks.append(zminticks) ################################################ axes NUMERIC text labels labels = [] xlab, ylab, zlab = None, None, None if xlabel_size and xtitle: xRot, yRot, zRot = 0, 0, 0 if utils.is_sequence(xlabel_rotation): # unpck 3 rotations zRot, xRot, yRot = xlabel_rotation else: zRot = xlabel_rotation if zRot < 0: # deal with negative angles zRot += 360 jus = "center-top" if zRot: if zRot > 24: jus = "top-right" if zRot > 67: jus = "center-right" if zRot > 112: jus = "right-bottom" if zRot > 157: jus = "center-bottom" if zRot > 202: jus = "bottom-left" if zRot > 247: jus = "center-left" if zRot > 292: jus = "top-left" if zRot > 337: jus = "top-center" if xlabel_justify is not None: jus = xlabel_justify for i in range(1, len(xticks_str)): t = xticks_str[i] if not t: continue if utils.is_sequence(xlabel_offset): xoffs, yoffs, zoffs = xlabel_offset else: xoffs, yoffs, zoffs = 0, xlabel_offset, 0 xlab = shapes.Text3D( t, s=xlabel_size * text_scale * gscale, font=label_font, justify=jus ) tb = xlab.ybounds() # must be ybounds: height of char v = (xticks_float[i], 0, 0) offs = -np.array([xoffs, yoffs, zoffs]) * (tb[1] - tb[0]) xlab.pos(v + offs) if xaxis_rotation: xlab.rotate_x(xaxis_rotation) if zRot: xlab.RotateZ(zRot) if xRot: xlab.RotateX(xRot) if yRot: xlab.RotateY(yRot) if xyshift: xlab.shift(0,0,xyshift*dz) if zxshift: xlab.shift(0,zxshift*dy,0) if xshift_along_y: xlab.shift(0,xshift_along_y*dy,0) if xshift_along_z: xlab.shift(0,0,xshift_along_z*dz) xlab.name = f"xNumericLabel{i}" xlab.SetUseBounds(x_use_bounds) labels.append(xlab.c(xlabel_color)) if ylabel_size and ytitle: xRot, yRot, zRot = 0, 0, 0 if utils.is_sequence(ylabel_rotation): # unpck 3 rotations zRot, yRot, xRot = ylabel_rotation else: zRot = ylabel_rotation if zRot < 0: zRot += 360 # deal with negative angles jus = "center-right" if zRot: if zRot > 24: jus = "bottom-right" if zRot > 67: jus = "center-bottom" if zRot > 112: jus = "left-bottom" if zRot > 157: jus = "center-left" if zRot > 202: jus = "top-left" if zRot > 247: jus = "center-top" if zRot > 292: jus = "top-right" if zRot > 337: jus = "right-center" if ylabel_justify is not None: jus = ylabel_justify for i in range(1, len(yticks_str)): t = yticks_str[i] if not t: continue if utils.is_sequence(ylabel_offset): xoffs, yoffs, zoffs = ylabel_offset else: xoffs, yoffs, zoffs = ylabel_offset, 0, 0 ylab = shapes.Text3D( t, s=ylabel_size * text_scale * gscale, font=label_font, justify=jus ) tb = ylab.ybounds() # must be ybounds: height of char v = (0, yticks_float[i], 0) offs = -np.array([xoffs, yoffs, zoffs]) * (tb[1] - tb[0]) ylab.pos(v + offs) if yaxis_rotation: ylab.rotate_y(yaxis_rotation) if zRot: ylab.RotateZ(zRot) if yRot: ylab.RotateY(yRot) if xRot: ylab.RotateX(xRot) if xyshift: ylab.shift(0,0,xyshift*dz) if yzshift: ylab.shift(yzshift*dx,0,0) if yshift_along_x: ylab.shift(yshift_along_x*dx,0,0) if yshift_along_z: ylab.shift(0,0,yshift_along_z*dz) ylab.name = f"yNumericLabel{i}" ylab.SetUseBounds(y_use_bounds) labels.append(ylab.c(ylabel_color)) if zlabel_size and ztitle: xRot, yRot, zRot = 0, 0, 0 if utils.is_sequence(zlabel_rotation): # unpck 3 rotations xRot, yRot, zRot = zlabel_rotation else: xRot = zlabel_rotation if xRot < 0: xRot += 360 # deal with negative angles jus = "center-right" if xRot: if xRot > 24: jus = "bottom-right" if xRot > 67: jus = "center-bottom" if xRot > 112: jus = "left-bottom" if xRot > 157: jus = "center-left" if xRot > 202: jus = "top-left" if xRot > 247: jus = "center-top" if xRot > 292: jus = "top-right" if xRot > 337: jus = "right-center" if zlabel_justify is not None: jus = zlabel_justify for i in range(1, len(zticks_str)): t = zticks_str[i] if not t: continue if utils.is_sequence(zlabel_offset): xoffs, yoffs, zoffs = zlabel_offset else: xoffs, yoffs, zoffs = zlabel_offset, zlabel_offset, 0 zlab = shapes.Text3D( t, s=zlabel_size * text_scale * gscale, font=label_font, justify=jus ) tb = zlab.ybounds() # must be ybounds: height of char v = (0, 0, zticks_float[i]) offs = -np.array([xoffs, yoffs, zoffs]) * (tb[1] - tb[0]) / 1.5 angle = 90 if dx: angle = np.arctan2(dy, dx) * 57.3 zlab.RotateZ(angle + yRot) # vtk inverts order of rotations if xRot: zlab.RotateY(-xRot) # ..second zlab.RotateX(90 + zRot) # ..first zlab.pos(v + offs) if zaxis_rotation: zlab.rotate_z(zaxis_rotation) if yzshift: zlab.shift(yzshift*dx,0,0) if zxshift: zlab.shift(0,zxshift*dy,0) if zshift_along_x: zlab.shift(zshift_along_x*dx,0,0) if zshift_along_y: zlab.shift(0,zshift_along_y*dy,0) zlab.SetUseBounds(z_use_bounds) zlab.name = f"zNumericLabel{i}" labels.append(zlab.c(zlabel_color)) ################################################ axes titles titles = [] if xtitle: xRot, yRot, zRot = 0, 0, 0 if utils.is_sequence(xtitle_rotation): # unpack 3 rotations zRot, xRot, yRot = xtitle_rotation else: zRot = xtitle_rotation if zRot < 0: # deal with negative angles zRot += 360 if utils.is_sequence(xtitle_offset): xoffs, yoffs, zoffs = xtitle_offset else: xoffs, yoffs, zoffs = 0, xtitle_offset, 0 if xtitle_justify is not None: jus = xtitle_justify else: # find best justfication for given rotation(s) jus = "right-top" if zRot: if zRot > 24: jus = "center-right" if zRot > 67: jus = "right-bottom" if zRot > 157: jus = "bottom-left" if zRot > 202: jus = "center-left" if zRot > 247: jus = "top-left" if zRot > 337: jus = "top-right" xt = shapes.Text3D( xtitle, s=xtitle_size * text_scale * gscale, font=title_font, c=xtitle_color, justify=jus, depth=title_depth, italic=xtitle_italic, ) if xtitle_backface_color: xt.backcolor(xtitle_backface_color) if zRot: xt.RotateZ(zRot) if xRot: xt.RotateX(xRot) if yRot: xt.RotateY(yRot) shift = 0 if xlab: # xlab is the last created numeric text label.. lt0, lt1 = xlab.GetBounds()[2:4] shift = lt1 - lt0 xt.pos( [(xoffs + xtitle_position) * dx, -(yoffs + xtick_length / 2) * dy - shift, zoffs * dz] ) if xaxis_rotation: xt.rotate_x(xaxis_rotation) if xyshift: xt.shift(0, 0, xyshift * dz) if xshift_along_y: xt.shift(0, xshift_along_y * dy, 0) if xshift_along_z: xt.shift(0, 0, xshift_along_z * dz) xt.SetUseBounds(x_use_bounds) if xtitle == " ": xt.SetUseBounds(False) xt.name = f"xtitle {xtitle}" titles.append(xt) if xtitle_box: titles.append(xt.box(scale=1.1).use_bounds(x_use_bounds)) if ytitle: xRot, yRot, zRot = 0, 0, 0 if utils.is_sequence(ytitle_rotation): # unpck 3 rotations zRot, yRot, xRot = ytitle_rotation else: zRot = ytitle_rotation if len(ytitle) > 3: zRot += 90 ytitle_position *= 0.975 if zRot < 0: zRot += 360 # deal with negative angles if utils.is_sequence(ytitle_offset): xoffs, yoffs, zoffs = ytitle_offset else: xoffs, yoffs, zoffs = ytitle_offset, 0, 0 if ytitle_justify is not None: jus = ytitle_justify else: jus = "center-right" if zRot: if zRot > 24: jus = "bottom-right" if zRot > 112: jus = "left-bottom" if zRot > 157: jus = "center-left" if zRot > 202: jus = "top-left" if zRot > 292: jus = "top-right" if zRot > 337: jus = "right-center" yt = shapes.Text3D( ytitle, s=ytitle_size * text_scale * gscale, font=title_font, c=ytitle_color, justify=jus, depth=title_depth, italic=ytitle_italic, ) if ytitle_backface_color: yt.backcolor(ytitle_backface_color) if zRot: yt.RotateZ(zRot) if yRot: yt.RotateY(yRot) if xRot: yt.RotateX(xRot) shift = 0 if ylab: # this is the last created num label.. lt0, lt1 = ylab.GetBounds()[0:2] shift = lt1 - lt0 yt.pos(-(xoffs + ytick_length / 2) * dx - shift, (yoffs + ytitle_position) * dy, zoffs * dz) if yaxis_rotation: yt.rotate_y(yaxis_rotation) if xyshift: yt.shift(0, 0, xyshift*dz) if yshift_along_x: yt.shift(yshift_along_x*dx, 0, 0) if yshift_along_z: yt.shift(0, 0, yshift_along_z*dz) yt.SetUseBounds(y_use_bounds) if ytitle == " ": yt.SetUseBounds(False) yt.name = f"ytitle {ytitle}" titles.append(yt) if ytitle_box: titles.append(yt.box(scale=1.1).use_bounds(y_use_bounds)) if ztitle: xRot, yRot, zRot = 0, 0, 0 if utils.is_sequence(ztitle_rotation): # unpck 3 rotations xRot, yRot, zRot = ztitle_rotation else: xRot = ztitle_rotation if len(ztitle) > 3: xRot += 90 ztitle_position *= 0.975 if xRot < 0: xRot += 360 # deal with negative angles if ztitle_justify is not None: jus = ztitle_justify else: jus = "center-right" if xRot: if xRot > 24: jus = "bottom-right" if xRot > 112: jus = "left-bottom" if xRot > 157: jus = "center-left" if xRot > 202: jus = "top-left" if xRot > 292: jus = "top-right" if xRot > 337: jus = "right-center" zt = shapes.Text3D( ztitle, s=ztitle_size * text_scale * gscale, font=title_font, c=ztitle_color, justify=jus, depth=title_depth, italic=ztitle_italic, ) if ztitle_backface_color: zt.backcolor(ztitle_backface_color) angle = 90 if dx: angle = np.arctan2(dy, dx) * 57.3 zt.RotateZ(angle + yRot) # vtk inverts order of rotations if xRot: zt.RotateY(-xRot) # ..second zt.RotateX(90 + zRot) # ..first shift = 0 if zlab: # this is the last created one.. lt0, lt1 = zlab.GetBounds()[0:2] shift = lt1 - lt0 zt.pos( -(ztitle_offset + ztick_length / 5) * dx - shift, -(ztitle_offset + ztick_length / 5) * dy - shift, ztitle_position * dz, ) if zaxis_rotation: zt.rotate_z(zaxis_rotation) if zxshift: zt.shift(0,zxshift*dy,0) if zshift_along_x: zt.shift(zshift_along_x*dx,0,0) if zshift_along_y: zt.shift(0,zshift_along_y*dy,0) zt.SetUseBounds(z_use_bounds) if ztitle == " ": zt.SetUseBounds(False) zt.name = f"ztitle {ztitle}" titles.append(zt) ################################################### header title if htitle: if htitle_font is None: htitle_font = title_font if htitle_color is None: htitle_color = xtitle_color htit = shapes.Text3D( htitle, s=htitle_size * gscale * text_scale, font=htitle_font, c=htitle_color, justify=htitle_justify, depth=title_depth, italic=htitle_italic, ) if htitle_rotation: htit.RotateX(htitle_rotation) wpos = [(0.5 + htitle_offset[0]) * dx, (1 + htitle_offset[1]) * dy, htitle_offset[2] * dz] htit.pos(wpos) if xyshift: htit.shift(0, 0, xyshift * dz) htit.name = f"htitle {htitle}" titles.append(htit) ###### acts = titles + lines + labels + grids + framelines acts += highlights + majorticks + minorticks + cones orig = (min_bns[0], min_bns[2], min_bns[4]) for a in acts: a.PickableOff() a.AddPosition(orig) a.GetProperty().LightingOff() asse = Assembly(acts) asse.SetOrigin(orig) asse.PickableOff() asse.name = "Axes" return asse def add_global_axes(axtype=None, c=None, bounds=()): """ Draw axes on scene. Available axes types are Parameters ---------- axtype : (int) - 0, no axes, - 1, draw three gray grid walls - 2, show cartesian axes from (0,0,0) - 3, show positive range of cartesian axes from (0,0,0) - 4, show a triad at bottom left - 5, show a cube at bottom left - 6, mark the corners of the bounding box - 7, draw a 3D ruler at each side of the cartesian axes - 8, show the `vtkCubeAxesActor` object - 9, show the bounding box outLine - 10, show three circles representing the maximum bounding box - 11, show a large grid on the x-y plane (use with zoom=8) - 12, show polar axes - 13, draw a simple ruler at the bottom of the window - 14, show the vtk default `vtkCameraOrientationWidget` object Axis type-1 can be fully customized by passing a dictionary `axes=dict()`, see `vedo.Axes` for the complete list of options. Example ------- .. code-block:: python from vedo import Box, show b = Box(pos=(0, 0, 0), length=80, width=90, height=70).alpha(0.1) show( b, axes={ "xtitle": "Some long variable [a.u.]", "number_of_divisions": 4, # ... }, ) """ plt = vedo.plotter_instance if axtype is not None: plt.axes = axtype # override r = plt.renderers.index(plt.renderer) if not plt.axes: return if c is None: # automatic black or white c = (0.9, 0.9, 0.9) if np.sum(plt.renderer.GetBackground()) > 1.5: c = (0.1, 0.1, 0.1) else: c = get_color(c) # for speed if not plt.renderer: return None if plt.axes_instances[r]: return None ############################################################ # custom grid walls if plt.axes == 1 or plt.axes is True or isinstance(plt.axes, dict): if len(bounds) == 6: bnds = bounds xrange = (bnds[0], bnds[1]) yrange = (bnds[2], bnds[3]) zrange = (bnds[4], bnds[5]) else: xrange=None yrange=None zrange=None if isinstance(plt.axes, dict): plt.axes.update({"use_global": True}) # protect from invalid camelCase options from vedo<=2.3 for k in plt.axes: if k.lower() != k: return if "xrange" in plt.axes: xrange = plt.axes.pop("xrange") if "yrange" in plt.axes: yrange = plt.axes.pop("yrange") if "zrange" in plt.axes: zrange = plt.axes.pop("zrange") asse = Axes(**plt.axes, xrange=xrange, yrange=yrange, zrange=zrange) else: asse = Axes(xrange=xrange, yrange=yrange, zrange=zrange) plt.renderer.AddActor(asse) plt.axes_instances[r] = asse elif plt.axes in (2, 3): x0, x1, y0, y1, z0, z1 = plt.renderer.ComputeVisiblePropBounds() xcol, ycol, zcol = "dr", "dg", "db" s = 1 alpha = 1 centered = False dx, dy, dz = x1 - x0, y1 - y0, z1 - z0 aves = np.sqrt(dx * dx + dy * dy + dz * dz) / 2 x0, x1 = min(x0, 0), max(x1, 0) y0, y1 = min(y0, 0), max(y1, 0) z0, z1 = min(z0, 0), max(z1, 0) if plt.axes == 3: if x1 > 0: x0 = 0 if y1 > 0: y0 = 0 if z1 > 0: z0 = 0 dx, dy, dz = x1 - x0, y1 - y0, z1 - z0 acts = [] if x0 * x1 <= 0 or y0 * z1 <= 0 or z0 * z1 <= 0: # some ranges contain origin zero = shapes.Sphere(r=aves / 120 * s, c="k", alpha=alpha, res=10) acts += [zero] if dx > aves / 100: xl = shapes.Cylinder([[x0, 0, 0], [x1, 0, 0]], r=aves / 250 * s, c=xcol, alpha=alpha) xc = shapes.Cone( pos=[x1, 0, 0], c=xcol, alpha=alpha, r=aves / 100 * s, height=aves / 25 * s, axis=[1, 0, 0], res=10, ) wpos = [x1, -aves / 25 * s, 0] # aligned to arrow tip if centered: wpos = [(x0 + x1) / 2, -aves / 25 * s, 0] xt = shapes.Text3D("x", pos=wpos, s=aves / 40 * s, c=xcol) acts += [xl, xc, xt] if dy > aves / 100: yl = shapes.Cylinder([[0, y0, 0], [0, y1, 0]], r=aves / 250 * s, c=ycol, alpha=alpha) yc = shapes.Cone( pos=[0, y1, 0], c=ycol, alpha=alpha, r=aves / 100 * s, height=aves / 25 * s, axis=[0, 1, 0], res=10, ) wpos = [-aves / 40 * s, y1, 0] if centered: wpos = [-aves / 40 * s, (y0 + y1) / 2, 0] yt = shapes.Text3D("y", pos=(0, 0, 0), s=aves / 40 * s, c=ycol) yt.pos(wpos).RotateZ(90) acts += [yl, yc, yt] if dz > aves / 100: zl = shapes.Cylinder([[0, 0, z0], [0, 0, z1]], r=aves / 250 * s, c=zcol, alpha=alpha) zc = shapes.Cone( pos=[0, 0, z1], c=zcol, alpha=alpha, r=aves / 100 * s, height=aves / 25 * s, axis=[0, 0, 1], res=10, ) wpos = [-aves / 50 * s, -aves / 50 * s, z1] if centered: wpos = [-aves / 50 * s, -aves / 50 * s, (z0 + z1) / 2] zt = shapes.Text3D("z", pos=(0, 0, 0), s=aves / 40 * s, c=zcol) zt.pos(wpos).RotateZ(45) zt.RotateX(90) acts += [zl, zc, zt] for a in acts: a.PickableOff() ass = Assembly(acts) ass.PickableOff() plt.renderer.AddActor(ass) plt.axes_instances[r] = ass elif plt.axes == 4: axact = vtk.vtkAxesActor() axact.SetShaftTypeToCylinder() axact.SetCylinderRadius(0.03) axact.SetXAxisLabelText("x") axact.SetYAxisLabelText("y") axact.SetZAxisLabelText("z") axact.GetXAxisShaftProperty().SetColor(1, 0, 0) axact.GetYAxisShaftProperty().SetColor(0, 1, 0) axact.GetZAxisShaftProperty().SetColor(0, 0, 1) axact.GetXAxisTipProperty().SetColor(1, 0, 0) axact.GetYAxisTipProperty().SetColor(0, 1, 0) axact.GetZAxisTipProperty().SetColor(0, 0, 1) bc = np.array(plt.renderer.GetBackground()) if np.sum(bc) < 1.5: lc = (1, 1, 1) else: lc = (0, 0, 0) axact.GetXAxisCaptionActor2D().GetCaptionTextProperty().BoldOff() axact.GetYAxisCaptionActor2D().GetCaptionTextProperty().BoldOff() axact.GetZAxisCaptionActor2D().GetCaptionTextProperty().BoldOff() axact.GetXAxisCaptionActor2D().GetCaptionTextProperty().ItalicOff() axact.GetYAxisCaptionActor2D().GetCaptionTextProperty().ItalicOff() axact.GetZAxisCaptionActor2D().GetCaptionTextProperty().ItalicOff() axact.GetXAxisCaptionActor2D().GetCaptionTextProperty().ShadowOff() axact.GetYAxisCaptionActor2D().GetCaptionTextProperty().ShadowOff() axact.GetZAxisCaptionActor2D().GetCaptionTextProperty().ShadowOff() axact.GetXAxisCaptionActor2D().GetCaptionTextProperty().SetColor(lc) axact.GetYAxisCaptionActor2D().GetCaptionTextProperty().SetColor(lc) axact.GetZAxisCaptionActor2D().GetCaptionTextProperty().SetColor(lc) axact.PickableOff() icn = Icon(axact, size=0.1) plt.axes_instances[r] = icn icn.SetInteractor(plt.interactor) icn.EnabledOn() icn.InteractiveOff() plt.widgets.append(icn) elif plt.axes == 5: axact = vtk.vtkAnnotatedCubeActor() axact.GetCubeProperty().SetColor(get_color(settings.annotated_cube_color)) axact.SetTextEdgesVisibility(0) axact.SetFaceTextScale(settings.annotated_cube_text_scale) axact.SetXPlusFaceText(settings.annotated_cube_texts[0]) # XPlus axact.SetXMinusFaceText(settings.annotated_cube_texts[1]) # XMinus axact.SetYPlusFaceText(settings.annotated_cube_texts[2]) # YPlus axact.SetYMinusFaceText(settings.annotated_cube_texts[3]) # YMinus axact.SetZPlusFaceText(settings.annotated_cube_texts[4]) # ZPlus axact.SetZMinusFaceText(settings.annotated_cube_texts[5]) # ZMinus axact.SetZFaceTextRotation(90) if settings.annotated_cube_text_color is None: # use default axact.GetXPlusFaceProperty().SetColor(get_color("r")) axact.GetXMinusFaceProperty().SetColor(get_color("dr")) axact.GetYPlusFaceProperty().SetColor(get_color("g")) axact.GetYMinusFaceProperty().SetColor(get_color("dg")) axact.GetZPlusFaceProperty().SetColor(get_color("b")) axact.GetZMinusFaceProperty().SetColor(get_color("db")) else: # use single user color ac = get_color(settings.annotated_cube_text_color) axact.GetXPlusFaceProperty().SetColor(ac) axact.GetXMinusFaceProperty().SetColor(ac) axact.GetYPlusFaceProperty().SetColor(ac) axact.GetYMinusFaceProperty().SetColor(ac) axact.GetZPlusFaceProperty().SetColor(ac) axact.GetZMinusFaceProperty().SetColor(ac) axact.PickableOff() icn = Icon(axact, size=0.06) plt.axes_instances[r] = icn icn.SetInteractor(plt.interactor) icn.EnabledOn() icn.InteractiveOff() plt.widgets.append(icn) elif plt.axes == 6: ocf = vtk.vtkOutlineCornerFilter() ocf.SetCornerFactor(0.1) largestact, sz = None, -1 for a in plt.actors: if a.GetPickable(): b = a.GetBounds() if b is None: return d = max(b[1] - b[0], b[3] - b[2], b[5] - b[4]) if sz < d: largestact = a sz = d if isinstance(largestact, Assembly): ocf.SetInputData(largestact.unpack(0).GetMapper().GetInput()) else: ocf.SetInputData(largestact.GetMapper().GetInput()) ocf.Update() oc_mapper = vtk.vtkHierarchicalPolyDataMapper() oc_mapper.SetInputConnection(0, ocf.GetOutputPort(0)) oc_actor = vtk.vtkActor() oc_actor.SetMapper(oc_mapper) bc = np.array(plt.renderer.GetBackground()) if np.sum(bc) < 1.5: lc = (1, 1, 1) else: lc = (0, 0, 0) oc_actor.GetProperty().SetColor(lc) oc_actor.PickableOff() oc_actor.UseBoundsOn() plt.renderer.AddActor(oc_actor) plt.axes_instances[r] = oc_actor plt.renderer.AddActor(oc_actor) elif plt.axes == 7: vbb = compute_visible_bounds()[0] rulax = RulerAxes(vbb, c=c, xtitle="x - ", ytitle="y - ", ztitle="z - ") plt.axes_instances[r] = rulax if not rulax: return None rulax.UseBoundsOn() rulax.PickableOff() plt.renderer.AddActor(rulax) elif plt.axes == 8: vbb = compute_visible_bounds()[0] ca = vtk.vtkCubeAxesActor() ca.SetBounds(vbb) ca.SetCamera(plt.renderer.GetActiveCamera()) ca.GetXAxesLinesProperty().SetColor(c) ca.GetYAxesLinesProperty().SetColor(c) ca.GetZAxesLinesProperty().SetColor(c) for i in range(3): ca.GetLabelTextProperty(i).SetColor(c) ca.GetTitleTextProperty(i).SetColor(c) ca.SetTitleOffset(5) ca.SetFlyMode(3) ca.SetXTitle("x") ca.SetYTitle("y") ca.SetZTitle("z") ca.PickableOff() ca.UseBoundsOff() plt.axes_instances[r] = ca plt.renderer.AddActor(ca) elif plt.axes == 9: vbb = compute_visible_bounds()[0] src = vtk.vtkCubeSource() src.SetXLength(vbb[1] - vbb[0]) src.SetYLength(vbb[3] - vbb[2]) src.SetZLength(vbb[5] - vbb[4]) src.Update() ca = Mesh(src.GetOutput(), c, 0.5).wireframe(True) ca.pos((vbb[0] + vbb[1]) / 2, (vbb[3] + vbb[2]) / 2, (vbb[5] + vbb[4]) / 2) ca.PickableOff() ca.UseBoundsOff() plt.axes_instances[r] = ca plt.renderer.AddActor(ca) elif plt.axes == 10: vbb = compute_visible_bounds()[0] x0 = (vbb[0] + vbb[1]) / 2, (vbb[3] + vbb[2]) / 2, (vbb[5] + vbb[4]) / 2 rx, ry, rz = (vbb[1] - vbb[0]) / 2, (vbb[3] - vbb[2]) / 2, (vbb[5] - vbb[4]) / 2 rm = max(rx, ry, rz) xc = shapes.Disc(x0, r1=rm, r2=rm, c="lr", res=(1, 72)) yc = shapes.Disc(x0, r1=rm, r2=rm, c="lg", res=(1, 72)) yc.RotateX(90) zc = shapes.Disc(x0, r1=rm, r2=rm, c="lb", res=(1, 72)) yc.RotateY(90) xc.clean().alpha(0.5).wireframe().linewidth(2).PickableOff() yc.clean().alpha(0.5).wireframe().linewidth(2).PickableOff() zc.clean().alpha(0.5).wireframe().linewidth(2).PickableOff() ca = xc + yc + zc ca.PickableOff() ca.UseBoundsOn() plt.renderer.AddActor(ca) plt.axes_instances[r] = ca elif plt.axes == 11: vbb, ss = compute_visible_bounds()[0:2] xpos, ypos = (vbb[1] + vbb[0]) / 2, (vbb[3] + vbb[2]) / 2 gs = sum(ss) * 3 gr = shapes.Grid((xpos, ypos, vbb[4]), s=(gs, gs), res=(11, 11), c=c, alpha=0.1) gr.lighting("off").PickableOff() gr.UseBoundsOff() plt.axes_instances[r] = gr plt.renderer.AddActor(gr) elif plt.axes == 12: polaxes = vtk.vtkPolarAxesActor() vbb = compute_visible_bounds()[0] polaxes.SetPolarAxisTitle("radial distance") polaxes.SetPole(0, 0, vbb[4]) rd = max(abs(vbb[0]), abs(vbb[2]), abs(vbb[1]), abs(vbb[3])) polaxes.SetMaximumRadius(rd) polaxes.AutoSubdividePolarAxisOff() polaxes.SetNumberOfPolarAxisTicks(10) polaxes.SetCamera(plt.renderer.GetActiveCamera()) polaxes.SetPolarLabelFormat("%6.1f") polaxes.PolarLabelVisibilityOff() # due to bad overlap of labels polaxes.GetPolarArcsProperty().SetColor(c) polaxes.GetPolarAxisProperty().SetColor(c) polaxes.GetPolarAxisTitleTextProperty().SetColor(c) polaxes.GetPolarAxisLabelTextProperty().SetColor(c) polaxes.GetLastRadialAxisTextProperty().SetColor(c) polaxes.GetSecondaryRadialAxesTextProperty().SetColor(c) polaxes.GetSecondaryRadialAxesProperty().SetColor(c) polaxes.GetSecondaryPolarArcsProperty().SetColor(c) polaxes.SetMinimumAngle(0.0) polaxes.SetMaximumAngle(315.0) polaxes.SetNumberOfPolarAxisTicks(5) polaxes.UseBoundsOn() polaxes.PickableOff() plt.axes_instances[r] = polaxes plt.renderer.AddActor(polaxes) elif plt.axes == 13: # draws a simple ruler at the bottom of the window ls = vtk.vtkLegendScaleActor() ls.RightAxisVisibilityOff() ls.TopAxisVisibilityOff() ls.LeftAxisVisibilityOff() ls.LegendVisibilityOff() ls.SetBottomBorderOffset(50) ls.GetBottomAxis().SetNumberOfMinorTicks(1) ls.GetBottomAxis().SetFontFactor(1.1) ls.GetBottomAxis().GetProperty().SetColor(c) ls.GetBottomAxis().GetProperty().SetOpacity(1.0) ls.GetBottomAxis().GetProperty().SetLineWidth(2) ls.GetBottomAxis().GetLabelTextProperty().SetColor(c) ls.GetBottomAxis().GetLabelTextProperty().BoldOff() ls.GetBottomAxis().GetLabelTextProperty().ItalicOff() pr = ls.GetBottomAxis().GetLabelTextProperty() pr.SetFontFamily(vtk.VTK_FONT_FILE) pr.SetFontFile(utils.get_font_path(settings.default_font)) ls.PickableOff() # if not plt.renderer.GetActiveCamera().GetParallelProjection(): # vedo.logger.warning("Axes type 13 should be used with parallel projection") plt.axes_instances[r] = ls plt.renderer.AddActor(ls) elif plt.axes == 14: try: cow = vtk.vtkCameraOrientationWidget() cow.SetParentRenderer(plt.renderer) cow.On() plt.axes_instances[r] = cow except AttributeError: vedo.logger.warning("axes mode 14 is unavailable in this vtk version") else: e = "\bomb Keyword axes type must be in range [0-13]." e += "Available axes types are:\n\n" e += "0 = no axes\n" e += "1 = draw three customizable gray grid walls\n" e += "2 = show cartesian axes from (0,0,0)\n" e += "3 = show positive range of cartesian axes from (0,0,0)\n" e += "4 = show a triad at bottom left\n" e += "5 = show a cube at bottom left\n" e += "6 = mark the corners of the bounding box\n" e += "7 = draw a 3D ruler at each side of the cartesian axes\n" e += "8 = show the vtkCubeAxesActor object\n" e += "9 = show the bounding box outline\n" e += "10 = show three circles representing the maximum bounding box\n" e += "11 = show a large grid on the x-y plane (use with zoom=8)\n" e += "12 = show polar axes\n" e += "13 = draw a simple ruler at the bottom of the window\n" e += "14 = show the CameraOrientationWidget object" vedo.logger.warning(e) if not plt.axes_instances[r]: plt.axes_instances[r] = True return None vedo-2023.4.6/vedo/applications.py000066400000000000000000002041471444463326400167240ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import time import os from typing import Callable import numpy as np import vedo from vedo.colors import color_map, get_color from vedo.utils import is_sequence, lin_interpolate, mag, precision from vedo.plotter import Event, Plotter from vedo.pointcloud import fit_plane, Points from vedo.shapes import Line, Ribbon, Spline, Text2D from vedo.pyplot import CornerHistogram from vedo.addons import SliderWidget __docformat__ = "google" __doc__ = """ This module contains vedo applications which provide some *ready-to-use* funcionalities """ __all__ = [ "Browser", "IsosurfaceBrowser", "FreeHandCutPlotter", "RayCastPlotter", "Slicer3DPlotter", "Slicer2DPlotter", "SplinePlotter", "AnimationPlayer", "Clock", ] ################################# class Slicer3DPlotter(Plotter): """ Generate a rendering window with slicing planes for the input Volume. """ def __init__( self, volume, alpha=1, cmaps=("gist_ncar_r", "hot_r", "bone_r", "jet", "Spectral_r"), map2cells=False, # buggy clamp=True, use_slider3d=False, show_histo=True, show_icon=True, draggable=False, pos=(0, 0), size="auto", screensize="auto", title="", bg="white", bg2="lightblue", axes=7, resetcam=True, interactive=True, ): """ Generate a rendering window with slicing planes for the input Volume. Arguments: alpha : (float) transparency of the slicing planes cmaps : (list) list of color maps names to cycle when clicking button map2cells : (bool) scalars are mapped to cells, not interpolated clamp : (bool) clamp scalar to reduce the effect of tails in color mapping use_slider3d : (bool) show sliders attached along the axes show_histo : (bool) show histogram on bottom left show_icon : (bool) show a small 3D rendering icon of the volume draggable : (bool) make the icon draggable Examples: - [slicer1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slicer1.py) """ self._cmap_slicer = "gist_ncar_r" if not title: if volume.filename: title = volume.filename else: title = "Volume Slicer" ################################ Plotter.__init__( self, pos=pos, bg=bg, bg2=bg2, size=size, screensize=screensize, title=title, interactive=interactive, axes=axes, ) ################################ box = volume.box().wireframe().alpha(0.1) self.show(box, viewup="z", resetcam=resetcam, interactive=False) if show_icon: self.add_inset(volume, pos=(0.85, 0.85), size=0.15, c="w", draggable=draggable) # inits la, ld = 0.7, 0.3 # ambient, diffuse dims = volume.dimensions() data = volume.pointdata[0] rmin, rmax = volume.imagedata().GetScalarRange() if clamp: hdata, edg = np.histogram(data, bins=50) logdata = np.log(hdata + 1) # mean of the logscale plot meanlog = np.sum(np.multiply(edg[:-1], logdata)) / np.sum(logdata) rmax = min(rmax, meanlog + (meanlog - rmin) * 0.9) rmin = max(rmin, meanlog - (rmax - meanlog) * 0.9) vedo.logger.debug( "scalar range clamped to range: (" + precision(rmin, 3) + ", " + precision(rmax, 3) + ")" ) self._cmap_slicer = cmaps[0] visibles = [None, None, None] msh = volume.zslice(int(dims[2] / 2)) msh.alpha(alpha).lighting("", la, ld, 0) msh.cmap(self._cmap_slicer, vmin=rmin, vmax=rmax) if map2cells: msh.mapPointsToCells() self.renderer.AddActor(msh) visibles[2] = msh msh.add_scalarbar(pos=(0.04, 0.0), horizontal=True, font_size=0) def slider_function_x(widget, event): i = int(widget.GetRepresentation().GetValue()) msh = volume.xslice(i).alpha(alpha).lighting("", la, ld, 0) msh.cmap(self._cmap_slicer, vmin=rmin, vmax=rmax) if map2cells: msh.mapPointsToCells() self.renderer.RemoveActor(visibles[0]) if i and i < dims[0]: self.renderer.AddActor(msh) visibles[0] = msh def slider_function_y(widget, event): i = int(widget.GetRepresentation().GetValue()) msh = volume.yslice(i).alpha(alpha).lighting("", la, ld, 0) msh.cmap(self._cmap_slicer, vmin=rmin, vmax=rmax) if map2cells: msh.mapPointsToCells() self.renderer.RemoveActor(visibles[1]) if i and i < dims[1]: self.renderer.AddActor(msh) visibles[1] = msh def slider_function_z(widget, event): i = int(widget.GetRepresentation().GetValue()) msh = volume.zslice(i).alpha(alpha).lighting("", la, ld, 0) msh.cmap(self._cmap_slicer, vmin=rmin, vmax=rmax) if map2cells: msh.mapPointsToCells() self.renderer.RemoveActor(visibles[2]) if i and i < dims[2]: self.renderer.AddActor(msh) visibles[2] = msh cx, cy, cz, ch = "dr", "dg", "db", (0.3, 0.3, 0.3) if np.sum(self.renderer.GetBackground()) < 1.5: cx, cy, cz = "lr", "lg", "lb" ch = (0.8, 0.8, 0.8) if not use_slider3d: self.add_slider( slider_function_x, 0, dims[0], title="X", title_size=0.5, pos=[(0.8, 0.12), (0.95, 0.12)], show_value=False, c=cx, ) self.add_slider( slider_function_y, 0, dims[1], title="Y", title_size=0.5, pos=[(0.8, 0.08), (0.95, 0.08)], show_value=False, c=cy, ) self.add_slider( slider_function_z, 0, dims[2], title="Z", title_size=0.6, value=int(dims[2] / 2), pos=[(0.8, 0.04), (0.95, 0.04)], show_value=False, c=cz, ) else: # 3d sliders attached to the axes bounds bs = box.bounds() self.add_slider3d( slider_function_x, pos1=(bs[0], bs[2], bs[4]), pos2=(bs[1], bs[2], bs[4]), xmin=0, xmax=dims[0], t=box.diagonal_size() / mag(box.xbounds()) * 0.6, c=cx, show_value=False, ) self.add_slider3d( slider_function_y, pos1=(bs[1], bs[2], bs[4]), pos2=(bs[1], bs[3], bs[4]), xmin=0, xmax=dims[1], t=box.diagonal_size() / mag(box.ybounds()) * 0.6, c=cy, show_value=False, ) self.add_slider3d( slider_function_z, pos1=(bs[0], bs[2], bs[4]), pos2=(bs[0], bs[2], bs[5]), xmin=0, xmax=dims[2], value=int(dims[2] / 2), t=box.diagonal_size() / mag(box.zbounds()) * 0.6, c=cz, show_value=False, ) ################# def buttonfunc(): bu.switch() self._cmap_slicer = bu.status() for mesh in visibles: if mesh: mesh.cmap(self._cmap_slicer, vmin=rmin, vmax=rmax) if map2cells: mesh.mapPointsToCells() self.renderer.RemoveActor(mesh.scalarbar) mesh.add_scalarbar(pos=(0.04, 0.0), horizontal=True) self.renderer.AddActor(mesh.scalarbar) bu = self.add_button( buttonfunc, pos=(0.27, 0.005), states=cmaps, c=["db"] * len(cmaps), bc=["lb"] * len(cmaps), # colors of states size=14, bold=True, ) ################# hist = None if show_histo: hist = CornerHistogram( data, s=0.2, bins=25, logscale=1, pos=(0.02, 0.02), c=ch, bg=ch, alpha=0.7 ) self.add([msh, hist]) if interactive: self.interactive() ######################################################################################## class Slicer2DPlotter(Plotter): """ A single slice of a Volume which always faces the camera, but at the same time can be oriented arbitrarily in space. """ def __init__(self, volume, levels=(None, None), histo_color="red5", **kwargs): """ A single slice of a Volume which always faces the camera, but at the same time can be oriented arbitrarily in space. Arguments: levels : (list) window and color levels histo_color : (color) histogram color, use `None` to disable it """ if "shape" not in kwargs: custom_shape = [ # define here the 2 rendering rectangle spaces dict(bottomleft=(0.0, 0.0), topright=(1, 1), bg="k9"), # the full window dict(bottomleft=(0.8, 0.8), topright=(1, 1), bg="k8", bg2="lb"), ] kwargs["shape"] = custom_shape Plotter.__init__(self, **kwargs) # reuse the same underlying data as in vol vsl = vedo.volume.VolumeSlice(volume) # no argument will grab the existing cmap in vol (or use build_lut()) vsl.colorize() if levels[0] and levels[1]: vsl.lighting(window=levels[0], level=levels[1]) usage = Text2D( ( "Left click & drag :rightarrow modify luminosity and contrast\n" "SHIFT+Left click :rightarrow slice image obliquely\n" "SHIFT+Middle click :rightarrow slice image perpendicularly\n" "R :rightarrow Reset the Window/Color levels\n" "X :rightarrow Reset to sagittal view\n" "Y :rightarrow Reset to coronal view\n" "Z :rightarrow Reset to axial view" ), font="Calco", pos="top-left", s=0.8, bg="yellow", alpha=0.25, ) hist = None if histo_color is not None: # hist = CornerHistogram( # volume.pointdata[0], # bins=25, # logscale=1, # pos=(0.02, 0.02), # s=0.175, # c="dg", # bg="k", # alpha=1, # ) hist = vedo.pyplot.histogram( volume.pointdata[0], bins=10, logscale=True, c=histo_color, ytitle="log_10 (counts)", axes=dict(text_scale=1.9), ) hist = hist.as2d(pos="bottom-left", scale=0.5) axes = kwargs.pop("axes", 7) interactive = kwargs.pop("interactive", True) if axes == 7: ax = vedo.addons.RulerAxes(vsl, xtitle="x - ", ytitle="y - ", ztitle="z - ") box = vsl.box().alpha(0.2) self.at(0).show(vsl, box, ax, usage, hist, mode="image") self.at(1).show(volume, interactive=interactive) ######################################################################## class RayCastPlotter(Plotter): """ Generate Volume rendering using ray casting. """ def __init__(self, volume, **kwargs): """ Generate a window for Volume rendering using ray casting. Returns: `vedo.Plotter` object. Examples: - [app_raycaster.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/app_raycaster.py) ![](https://vedo.embl.es/images/advanced/app_raycaster.gif) """ Plotter.__init__(self, **kwargs) self.alphaslider0 = 0.33 self.alphaslider1 = 0.66 self.alphaslider2 = 1 self.property = volume.GetProperty() img = volume.imagedata() if volume.dimensions()[2] < 3: vedo.logger.error("RayCastPlotter: not enough z slices.") raise RuntimeError smin, smax = img.GetScalarRange() x0alpha = smin + (smax - smin) * 0.25 x1alpha = smin + (smax - smin) * 0.5 x2alpha = smin + (smax - smin) * 1.0 ############################## color map slider # Create transfer mapping scalar value to color cmaps = [ "jet", "viridis", "bone", "hot", "plasma", "winter", "cool", "gist_earth", "coolwarm", "tab10", ] cols_cmaps = [] for cm in cmaps: cols = color_map(range(0, 21), cm, 0, 20) # sample 20 colors cols_cmaps.append(cols) Ncols = len(cmaps) csl = (0.9, 0.9, 0.9) if sum(get_color(self.renderer.GetBackground())) > 1.5: csl = (0.1, 0.1, 0.1) def sliderColorMap(widget, event): sliderRep = widget.GetRepresentation() k = int(sliderRep.GetValue()) sliderRep.SetTitleText(cmaps[k]) volume.color(cmaps[k]) w1 = self.add_slider( sliderColorMap, 0, Ncols - 1, value=0, show_value=0, title=cmaps[0], c=csl, pos=[(0.8, 0.05), (0.965, 0.05)], ) w1.GetRepresentation().SetTitleHeight(0.018) ############################## alpha sliders # Create transfer mapping scalar value to opacity opacityTransferFunction = self.property.GetScalarOpacity() def setOTF(): opacityTransferFunction.RemoveAllPoints() opacityTransferFunction.AddPoint(smin, 0.0) opacityTransferFunction.AddPoint(smin + (smax - smin) * 0.1, 0.0) opacityTransferFunction.AddPoint(x0alpha, self.alphaslider0) opacityTransferFunction.AddPoint(x1alpha, self.alphaslider1) opacityTransferFunction.AddPoint(x2alpha, self.alphaslider2) setOTF() def sliderA0(widget, event): self.alphaslider0 = widget.GetRepresentation().GetValue() setOTF() self.add_slider( sliderA0, 0, 1, value=self.alphaslider0, pos=[(0.84, 0.1), (0.84, 0.26)], c=csl, show_value=0, ) def sliderA1(widget, event): self.alphaslider1 = widget.GetRepresentation().GetValue() setOTF() self.add_slider( sliderA1, 0, 1, value=self.alphaslider1, pos=[(0.89, 0.1), (0.89, 0.26)], c=csl, show_value=0, ) def sliderA2(widget, event): self.alphaslider2 = widget.GetRepresentation().GetValue() setOTF() w2 = self.add_slider( sliderA2, 0, 1, value=self.alphaslider2, pos=[(0.96, 0.1), (0.96, 0.26)], c=csl, show_value=0, title="Opacity levels", ) w2.GetRepresentation().SetTitleHeight(0.016) # add a button def button_func_mode(): s = volume.mode() snew = (s + 1) % 2 volume.mode(snew) bum.switch() bum = self.add_button( button_func_mode, pos=(0.7, 0.035), states=["composite", "max proj."], c=["bb", "gray"], bc=["gray", "bb"], # colors of states font="", size=16, bold=0, italic=False, ) bum.status(volume.mode()) # add histogram of scalar plot = CornerHistogram( volume, bins=25, logscale=1, c=(0.7, 0.7, 0.7), bg=(0.7, 0.7, 0.7), pos=(0.78, 0.065), lines=True, dots=False, nmax=3.1415e06, # subsample otherwise is too slow ) plot.GetPosition2Coordinate().SetValue(0.197, 0.20, 0) plot.GetXAxisActor2D().SetFontFactor(0.7) plot.GetProperty().SetOpacity(0.5) self.add([plot, volume]) ##################################################################################### class IsosurfaceBrowser(Plotter): """ Generate a Volume isosurfacing controlled by a slider. """ def __init__( self, volume, isovalue=None, c=None, alpha=1, lego=False, res=50, use_gpu=False, precompute=False, progress=False, cmap="hot", delayed=False, sliderpos=4, pos=(0, 0), size="auto", screensize="auto", title="", bg="white", bg2=None, axes=1, interactive=True, ): """ Generate a `vedo.Plotter` for Volume isosurfacing using a slider. Set `delayed=True` to delay slider update on mouse release. Set `res` to set the resolution, e.g. the number of desired isosurfaces to be generated on the fly. Set `precompute=True` to precompute the isosurfaces (so slider browsing will be smoother). Examples: - [app_isobrowser.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/app_isobrowser.py) ![](https://vedo.embl.es/images/advanced/app_isobrowser.gif) """ Plotter.__init__( self, pos=pos, bg=bg, bg2=bg2, size=size, screensize=screensize, title=title, interactive=interactive, axes=axes, ) ### GPU ################################ if use_gpu and hasattr(volume.GetProperty(), "GetIsoSurfaceValues"): scrange = volume.scalar_range() delta = scrange[1] - scrange[0] if not delta: return if isovalue is None: isovalue = delta / 3.0 + scrange[0] ### isovalue slider callback def slider_isovalue(widget, event): value = widget.GetRepresentation().GetValue() isovals.SetValue(0, value) isovals = volume.GetProperty().GetIsoSurfaceValues() isovals.SetValue(0, isovalue) self.renderer.AddActor(volume.mode(5).alpha(alpha).c(c)) self.add_slider( slider_isovalue, scrange[0] + 0.02 * delta, scrange[1] - 0.02 * delta, value=isovalue, pos=sliderpos, title="scalar value", show_value=True, delayed=delayed, ) ### CPU ################################ else: self._prev_value = 1e30 scrange = volume.scalar_range() delta = scrange[1] - scrange[0] if not delta: return if lego: res = int(res / 2) # because lego is much slower slidertitle = "" else: slidertitle = "scalar value" allowed_vals = np.linspace(scrange[0], scrange[1], num=res) bacts = {} # cache the meshes so we dont need to recompute if precompute: delayed = False # no need to delay the slider in this case if progress: pb = vedo.ProgressBar(0, len(allowed_vals), delay=1) for value in allowed_vals: value_name = precision(value, 2) if lego: mesh = volume.legosurface(vmin=value) if mesh.ncells: mesh.cmap(cmap, vmin=scrange[0], vmax=scrange[1], on="cells") else: mesh = volume.isosurface(value).color(c).alpha(alpha) bacts.update({value_name: mesh}) # store it if progress: pb.print("isosurfacing volume..") ### isovalue slider callback def slider_isovalue(widget, event): prevact = self.actors[0] if isinstance(widget, float): value = widget else: value = widget.GetRepresentation().GetValue() # snap to the closest idx = (np.abs(allowed_vals - value)).argmin() value = allowed_vals[idx] if abs(value - self._prev_value) / delta < 0.001: return self._prev_value = value value_name = precision(value, 2) if value_name in bacts: # reusing the already existing mesh # print('reusing') mesh = bacts[value_name] else: # else generate it # print('generating', value) if lego: mesh = volume.legosurface(vmin=value) if mesh.ncells: mesh.cmap(cmap, vmin=scrange[0], vmax=scrange[1], on="cells") else: mesh = volume.isosurface(value).color(c).alpha(alpha) bacts.update({value_name: mesh}) # store it self.renderer.RemoveActor(prevact) self.renderer.AddActor(mesh) self.actors[0] = mesh ################################################ if isovalue is None: isovalue = delta / 3.0 + scrange[0] self.actors = [None] slider_isovalue(isovalue, "") # init call if lego: self.actors[0].add_scalarbar(pos=(0.8, 0.12)) self.add_slider( slider_isovalue, scrange[0] + 0.02 * delta, scrange[1] - 0.02 * delta, value=isovalue, pos=sliderpos, title=slidertitle, show_value=True, delayed=delayed, ) ############################################################################## class Browser(Plotter): """ Browse a series of vedo objects by using a simple slider. """ def __init__( self, objects=(), sliderpos=((0.50, 0.07), (0.95, 0.07)), c=None, # slider color prefix="", font="Calco", # slider font axes=1, resetcam=False, # resetcam while using the slider **kwargs, ): """ Browse a series of vedo objects by using a simple slider. Examples: ```python from vedo import load, dataurl from vedo.applications import Browser meshes = load(dataurl+'timecourse1d.npy') # python list of Meshes plt = Browser(meshes, bg='k') # vedo.Plotter plt.show(interactive=False, zoom='tight') # show the meshes plt.play(dt=50) # delay in milliseconds plt.close() ``` - [morphomatics_tube.py](https://github.com/marcomusy/vedo/tree/master/examples/other/morphomatics_tube.py) """ Plotter.__init__(self, axes=axes, **kwargs) if isinstance(objects, str): objects = vedo.file_io.load(objects) self += objects self.slider = None self.timer_callback_id = None # define the slider func ########################## def slider_function(widget=None, event=None): must_render = False if isinstance(widget, vedo.plotter.Event): if self.slider.value < len(self.actors)-1: self.slider.value = self.slider.value + 1 else: self.slider.value = 0 must_render = True k = int(self.slider.value) ak = self.actors[k] for a in self.actors: if a == ak: a.on() else: a.off() if resetcam: self.reset_camera() tx = str(k) if ak.filename: tx = ak.filename.split("/")[-1] tx = tx.split("\\")[-1] # windows os elif ak.name: tx = ak.name self.slider.title = prefix + tx if must_render: self.render() ################################################## self.slider_function = slider_function self.slider = self.add_slider( slider_function, 0.5, len(objects) - 0.5, pos=sliderpos, font=font, c=c, show_value=False, ) self.slider.GetRepresentation().SetTitleHeight(0.020) slider_function(self.slider) # init call def play(self, dt=100): """Start playing the slides at a given speed.""" self.timer_callback_id = self.add_callback("timer", self.slider_function) self.timer_callback("start", dt=dt) self.interactive() ############################################################################################# class FreeHandCutPlotter(Plotter): """A tool to edit meshes interactively.""" # thanks to Jakub Kaminski for the original version of this script def __init__( self, mesh, splined=True, font="Bongas", alpha=0.9, lw=4, lc="red5", pc="red4", c="green3", tc="k9", tol=0.008, **options, ): """ A `vedo.Plotter` derived class which edits polygonal meshes interactively. Can also be invoked from command line with: ```bash vedo --edit https://vedo.embl.es/examples/data/porsche.ply ``` Usage: - Left-click and hold to rotate - Right-click and move to draw line - Second right-click to stop drawing - Press "c" to clear points - "z/Z" to cut mesh (Z inverts inside-out the selection area) - "L" to keep only the largest connected surface - "s" to save mesh to file (tag `_edited` is appended to filename) - "u" to undo last action - "h" for help, "i" for info Arguments: mesh : (Mesh, Points) The input Mesh or pointcloud. splined : (bool) join points with a spline or a simple line. font : (str) Font name for the instructions. alpha : (float) transparency of the instruction message panel. lw : (str) selection line width. lc : (str) selection line color. pc : (str) selection points color. c : (str) background color of instructions. tc : (str) text color of instructions. tol : (int) tolerance of the point proximity. Examples: - [cut_freehand.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/cut_freehand.py) ![](https://vedo.embl.es/images/basic/cutFreeHand.gif) """ if not isinstance(mesh, Points): vedo.logger.error("FreeHandCutPlotter input must be Points or Mesh") raise RuntimeError() super().__init__(**options) self.mesh = mesh self.mesh_prev = mesh self.splined = splined self.linecolor = lc self.linewidth = lw self.pointcolor = pc self.color = c self.alpha = alpha self.msg = "Right-click and move to draw line\n" self.msg += "Second right-click to stop drawing\n" self.msg += "Press L to extract largest surface\n" self.msg += " z/Z to cut mesh (s to save)\n" self.msg += " c to clear points, u to undo" self.txt2d = Text2D(self.msg, pos="top-left", font=font, s=0.9) self.txt2d.c(tc).background(c, alpha).frame() self.idkeypress = self.add_callback("KeyPress", self._on_keypress) self.idrightclck = self.add_callback("RightButton", self._on_right_click) self.idmousemove = self.add_callback("MouseMove", self._on_mouse_move) self.drawmode = False self.tol = tol # tolerance of point distance self.cpoints = [] self.points = None self.spline = None self.jline = None self.topline = None self.top_pts = [] def init(self, init_points): """Set an initial number of points to define a region""" if isinstance(init_points, Points): self.cpoints = init_points.points() else: self.cpoints = np.array(init_points) self.points = Points(self.cpoints, r=self.linewidth).c(self.pointcolor).pickable(0) if self.splined: self.spline = Spline(self.cpoints, res=len(self.cpoints) * 4) else: self.spline = Line(self.cpoints) self.spline.lw(self.linewidth).c(self.linecolor).pickable(False) self.jline = Line(self.cpoints[0], self.cpoints[-1], lw=1, c=self.linecolor).pickable(0) self.add([self.points, self.spline, self.jline]).render() return self def _on_right_click(self, evt): self.drawmode = not self.drawmode # toggle mode if self.drawmode: self.txt2d.background(self.linecolor, self.alpha) else: self.txt2d.background(self.color, self.alpha) if len(self.cpoints) > 2: self.remove([self.spline, self.jline]) if self.splined: # show the spline closed self.spline = Spline(self.cpoints, closed=True, res=len(self.cpoints) * 4) else: self.spline = Line(self.cpoints, closed=True) self.spline.lw(self.linewidth).c(self.linecolor).pickable(False) self.add(self.spline) self.render() def _on_mouse_move(self, evt): if self.drawmode: cpt = self.compute_world_coordinate(evt.picked2d) # make this 2d-screen point 3d if self.cpoints and mag(cpt - self.cpoints[-1]) < self.mesh.diagonal_size() * self.tol: return # new point is too close to the last one. skip self.cpoints.append(cpt) if len(self.cpoints) > 2: self.remove([self.points, self.spline, self.jline, self.topline]) self.points = Points(self.cpoints, r=self.linewidth).c(self.pointcolor).pickable(0) if self.splined: self.spline = Spline(self.cpoints, res=len(self.cpoints) * 4) # not closed here else: self.spline = Line(self.cpoints) if evt.actor: self.top_pts.append(evt.picked3d) self.topline = Points(self.top_pts, r=self.linewidth) self.topline.c(self.linecolor).pickable(False) self.spline.lw(self.linewidth).c(self.linecolor).pickable(False) self.txt2d.background(self.linecolor) self.jline = Line(self.cpoints[0], self.cpoints[-1], lw=1, c=self.linecolor).pickable(0) self.add([self.points, self.spline, self.jline, self.topline]).render() def _on_keypress(self, evt): if evt.keypress.lower() == "z" and self.spline: # Cut mesh with a ribbon-like surface inv = False if evt.keypress == "Z": inv = True self.txt2d.background("red8").text(" ... working ... ") self.render() self.mesh_prev = self.mesh.clone() tol = self.mesh.diagonal_size() / 2 # size of ribbon (not shown) pts = self.spline.points() n = fit_plane(pts, signed=True).normal # compute normal vector to points rb = Ribbon(pts - tol * n, pts + tol * n, closed=True) self.mesh.cut_with_mesh(rb, invert=inv) # CUT self.txt2d.text(self.msg) # put back original message if self.drawmode: self._on_right_click(evt) # toggle mode to normal else: self.txt2d.background(self.color, self.alpha) self.remove([self.spline, self.points, self.jline, self.topline]).render() self.cpoints, self.points, self.spline = [], None, None self.top_pts, self.topline = [], None elif evt.keypress == "L": self.txt2d.background("red8") self.txt2d.text(" ... removing smaller ... \n ... parts of the mesh ... ") self.render() self.remove(self.mesh) self.mesh_prev = self.mesh mcut = self.mesh.extract_largest_region() mcut.filename = self.mesh.filename # copy over various properties mcut.name = self.mesh.name mcut.scalarbar = self.mesh.scalarbar mcut.info = self.mesh.info self.mesh = mcut # discard old mesh by overwriting it self.txt2d.text(self.msg).background(self.color) # put back original message self.add(mcut).render() elif evt.keypress == 'u': # Undo last action if self.drawmode: self._on_right_click(evt) # toggle mode to normal else: self.txt2d.background(self.color, self.alpha) self.remove([self.mesh, self.spline, self.jline, self.points, self.topline]) self.mesh = self.mesh_prev self.cpoints, self.points, self.spline = [], None, None self.top_pts, self.topline = [], None self.add(self.mesh).render() elif evt.keypress in ("c", "Delete"): # clear all points self.remove([self.spline, self.points, self.jline, self.topline]).render() self.cpoints, self.points, self.spline = [], None, None self.top_pts, self.topline = [], None elif evt.keypress == "r": # reset camera and axes try: self.remove(self.axes_instances[0]) self.axes_instances[0] = None self.add_global_axes(axtype=1, c=None, bounds=self.mesh.bounds()) self.renderer.ResetCamera() self.render() except: pass elif evt.keypress == "s": if self.mesh.filename: fname = os.path.basename(self.mesh.filename) fname, extension = os.path.splitext(fname) fname = fname.replace("_edited", "") fname = f"{fname}_edited{extension}" else: fname = "mesh_edited.vtk" self.write(fname) def write(self, filename="mesh_edited.vtk"): """Save the resulting mesh to file""" self.mesh.write(filename) vedo.logger.info(f"mesh saved to file {filename}") return self def start(self, *args, **kwargs): """Start window interaction (with mouse and keyboard)""" acts = [self.txt2d, self.mesh, self.points, self.spline, self.jline] self.show(acts + list(args), **kwargs) return self ######################################################################## class SplinePlotter(Plotter): """ Interactive drawing of splined curves on meshes. """ def __init__(self, obj, init_points=(), closed=False, splined=True, **kwargs): """ Create an interactive application that allows the user to click points and retrieve the coordinates of such points and optionally a spline or line (open or closed). Input object can be a image file name or a 3D mesh. """ super().__init__(**kwargs) self.mode = "trackball" self.verbose = True self.splined = splined self.resolution = None # spline resolution (None = automatic) self.closed = closed self.lcolor = "yellow4" self.lwidth = 3 self.pcolor = "purple5" self.psize = 10 self.cpoints = list(init_points) self.vpoints = None self.line = None if isinstance(obj, str): self.object = vedo.file_io.load(obj) else: self.object = obj if isinstance(self.object, vedo.Picture): self.mode = "image" self.parallel_projection(True) t = ( "Click to add a point\n" "Right-click to remove it\n" "Drag mouse to change contrast\n" "Press c to clear points\n" "Press q to continue" ) self.instructions = Text2D(t, pos="bottom-left", c="white", bg="green", font="Calco") self += [self.object, self.instructions] self.callid1 = self.add_callback("KeyPress", self._key_press) self.callid2 = self.add_callback("LeftButtonPress", self._on_left_click) self.callid3 = self.add_callback("RightButtonPress", self._on_right_click) def points(self, newpts=None): """Retrieve the 3D coordinates of the clicked points""" if newpts is not None: self.cpoints = newpts self._update() return self return np.array(self.cpoints) def _on_left_click(self, evt): if not evt.actor: return if evt.actor.name == "points": # remove clicked point if clicked twice pid = self.vpoints.closest_point(evt.picked3d, return_point_id=True) self.cpoints.pop(pid) self._update() return p = evt.picked3d self.cpoints.append(p) self._update() if self.verbose: vedo.colors.printc("Added point:", precision(p, 4), c="g") def _on_right_click(self, evt): if evt.actor and len(self.cpoints) > 0: self.cpoints.pop() # pop removes from the list the last pt self._update() if self.verbose: vedo.colors.printc("Deleted last point", c="r") def _update(self): self.remove(self.line, self.vpoints) # remove old points and spline self.vpoints = Points(self.cpoints).ps(self.psize).c(self.pcolor) self.vpoints.name = "points" self.vpoints.pickable(True) # to allow toggle minnr = 1 if self.splined: minnr = 2 if self.lwidth and len(self.cpoints) > minnr: if self.splined: try: self.line = Spline(self.cpoints, closed=self.closed, res=self.resolution) except ValueError: # if clicking too close splining might fail self.cpoints.pop() return else: self.line = Line(self.cpoints, closed=self.closed) self.line.c(self.lcolor).lw(self.lwidth).pickable(False) self.add(self.vpoints, self.line) else: self.add(self.vpoints) def _key_press(self, evt): if evt.keypress == "c": self.cpoints = [] self.remove(self.line, self.vpoints).render() if self.verbose: vedo.colors.printc("==== Cleared all points ====", c="r", invert=True) def start(self): """Start the interaction""" self.show(self.object, self.instructions, mode=self.mode) return self ######################################################################## class Animation(Plotter): """ A `Plotter` derived class that allows to animate simultaneously various objects by specifying event times and durations of different visual effects. Arguments: total_duration : (float) expand or shrink the total duration of video to this value time_resolution : (float) in seconds, save a frame at this rate show_progressbar : (bool) whether to show a progress bar or not video_filename : (str) output file name of the video video_fps : (int) desired value of the nr of frames per second .. warning:: this is still an experimental feature at the moment. """ def __init__( self, total_duration=None, time_resolution=0.02, show_progressbar=True, video_filename="animation.mp4", video_fps=12, ): Plotter.__init__(self) self.resetcam = True self.events = [] self.time_resolution = time_resolution self.total_duration = total_duration self.show_progressbar = show_progressbar self.video_filename = video_filename self.video_fps = video_fps self.bookingMode = True self._inputvalues = [] self._performers = [] self._lastT = None self._lastDuration = None self._lastActs = None self.eps = 0.00001 def _parse(self, objs, t, duration): if t is None: if self._lastT: t = self._lastT else: t = 0.0 if duration is None: if self._lastDuration: duration = self._lastDuration else: duration = 0.0 if objs is None: if self._lastActs: objs = self._lastActs else: vedo.logger.error("Need to specify actors!") raise RuntimeError objs2 = objs if is_sequence(objs): objs2 = objs else: objs2 = [objs] # quantize time steps and duration t = int(t / self.time_resolution + 0.5) * self.time_resolution nsteps = int(duration / self.time_resolution + 0.5) duration = nsteps * self.time_resolution rng = np.linspace(t, t + duration, nsteps + 1) self._lastT = t self._lastDuration = duration self._lastActs = objs2 for a in objs2: if a not in self.actors: self.actors.append(a) return objs2, t, duration, rng def switch_on(self, acts=None, t=None): """Switch on the input list of meshes.""" return self.fade_in(acts, t, 0) def switch_off(self, acts=None, t=None): """Switch off the input list of meshes.""" return self.fade_out(acts, t, 0) def fade_in(self, acts=None, t=None, duration=None): """Gradually switch on the input list of meshes by increasing opacity.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) for tt in rng: alpha = lin_interpolate(tt, [t, t + duration], [0, 1]) self.events.append((tt, self.fade_in, acts, alpha)) else: for a in self._performers: if hasattr(a, "alpha"): if a.alpha() >= self._inputvalues: continue a.alpha(self._inputvalues) return self def fade_out(self, acts=None, t=None, duration=None): """Gradually switch off the input list of meshes by increasing transparency.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) for tt in rng: alpha = lin_interpolate(tt, [t, t + duration], [1, 0]) self.events.append((tt, self.fade_out, acts, alpha)) else: for a in self._performers: if a.alpha() <= self._inputvalues: continue a.alpha(self._inputvalues) return self def change_alpha_between(self, alpha1, alpha2, acts=None, t=None, duration=None): """Gradually change transparency for the input list of meshes.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) for tt in rng: alpha = lin_interpolate(tt, [t, t + duration], [alpha1, alpha2]) self.events.append((tt, self.fade_out, acts, alpha)) else: for a in self._performers: a.alpha(self._inputvalues) return self def change_color(self, c, acts=None, t=None, duration=None): """Gradually change color for the input list of meshes.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) col2 = get_color(c) for tt in rng: inputvalues = [] for a in acts: col1 = a.color() r = lin_interpolate(tt, [t, t + duration], [col1[0], col2[0]]) g = lin_interpolate(tt, [t, t + duration], [col1[1], col2[1]]) b = lin_interpolate(tt, [t, t + duration], [col1[2], col2[2]]) inputvalues.append((r, g, b)) self.events.append((tt, self.change_color, acts, inputvalues)) else: for i, a in enumerate(self._performers): a.color(self._inputvalues[i]) return self def change_backcolor(self, c, acts=None, t=None, duration=None): """Gradually change backface color for the input list of meshes. An initial backface color should be set in advance.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) col2 = get_color(c) for tt in rng: inputvalues = [] for a in acts: if a.GetBackfaceProperty(): col1 = a.backColor() r = lin_interpolate(tt, [t, t + duration], [col1[0], col2[0]]) g = lin_interpolate(tt, [t, t + duration], [col1[1], col2[1]]) b = lin_interpolate(tt, [t, t + duration], [col1[2], col2[2]]) inputvalues.append((r, g, b)) else: inputvalues.append(None) self.events.append((tt, self.change_backcolor, acts, inputvalues)) else: for i, a in enumerate(self._performers): a.backColor(self._inputvalues[i]) return self def change_to_wireframe(self, acts=None, t=None): """Switch representation to wireframe for the input list of meshes at time `t`.""" if self.bookingMode: acts, t, _, _ = self._parse(acts, t, None) self.events.append((t, self.change_to_wireframe, acts, True)) else: for a in self._performers: a.wireframe(self._inputvalues) return self def change_to_surface(self, acts=None, t=None): """Switch representation to surface for the input list of meshes at time `t`.""" if self.bookingMode: acts, t, _, _ = self._parse(acts, t, None) self.events.append((t, self.change_to_surface, acts, False)) else: for a in self._performers: a.wireframe(self._inputvalues) return self def change_line_width(self, lw, acts=None, t=None, duration=None): """Gradually change line width of the mesh edges for the input list of meshes.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) for tt in rng: inputvalues = [] for a in acts: newlw = lin_interpolate(tt, [t, t + duration], [a.lw(), lw]) inputvalues.append(newlw) self.events.append((tt, self.change_line_width, acts, inputvalues)) else: for i, a in enumerate(self._performers): a.lw(self._inputvalues[i]) return self def change_line_color(self, c, acts=None, t=None, duration=None): """Gradually change line color of the mesh edges for the input list of meshes.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) col2 = get_color(c) for tt in rng: inputvalues = [] for a in acts: col1 = a.linecolor() r = lin_interpolate(tt, [t, t + duration], [col1[0], col2[0]]) g = lin_interpolate(tt, [t, t + duration], [col1[1], col2[1]]) b = lin_interpolate(tt, [t, t + duration], [col1[2], col2[2]]) inputvalues.append((r, g, b)) self.events.append((tt, self.change_line_color, acts, inputvalues)) else: for i, a in enumerate(self._performers): a.linecolor(self._inputvalues[i]) return self def change_lighting(self, style, acts=None, t=None, duration=None): """Gradually change the lighting style for the input list of meshes. Allowed styles are: [metallic, plastic, shiny, glossy, default]. """ if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) c = (1,1,0.99) if style=='metallic': pars = [0.1, 0.3, 1.0, 10, c] elif style=='plastic' : pars = [0.3, 0.4, 0.3, 5, c] elif style=='shiny' : pars = [0.2, 0.6, 0.8, 50, c] elif style=='glossy' : pars = [0.1, 0.7, 0.9, 90, c] elif style=='default' : pars = [0.1, 1.0, 0.05, 5, c] else: vedo.logger.error(f"Unknown lighting style {style}") for tt in rng: inputvalues = [] for a in acts: pr = a.GetProperty() aa = pr.GetAmbient() ad = pr.GetDiffuse() asp = pr.GetSpecular() aspp = pr.GetSpecularPower() naa = lin_interpolate(tt, [t,t+duration], [aa, pars[0]]) nad = lin_interpolate(tt, [t,t+duration], [ad, pars[1]]) nasp = lin_interpolate(tt, [t,t+duration], [asp, pars[2]]) naspp= lin_interpolate(tt, [t,t+duration], [aspp,pars[3]]) inputvalues.append((naa, nad, nasp, naspp)) self.events.append((tt, self.change_lighting, acts, inputvalues)) else: for i, a in enumerate(self._performers): pr = a.GetProperty() vals = self._inputvalues[i] pr.SetAmbient(vals[0]) pr.SetDiffuse(vals[1]) pr.SetSpecular(vals[2]) pr.SetSpecularPower(vals[3]) return self def move(self, act=None, pt=(0, 0, 0), t=None, duration=None, style="linear"): """Smoothly change the position of a specific object to a new point in space.""" if self.bookingMode: acts, t, duration, rng = self._parse(act, t, duration) if len(acts) != 1: vedo.logger.error("in move(), can move only one object.") cpos = acts[0].pos() pt = np.array(pt) dv = (pt - cpos) / len(rng) for j, tt in enumerate(rng): i = j + 1 if "quad" in style: x = i / len(rng) y = x * x self.events.append((tt, self.move, acts, cpos + dv * i * y)) else: self.events.append((tt, self.move, acts, cpos + dv * i)) else: self._performers[0].pos(self._inputvalues) return self def rotate(self, act=None, axis=(1, 0, 0), angle=0, t=None, duration=None): """Smoothly rotate a specific object by a specified angle and axis.""" if self.bookingMode: acts, t, duration, rng = self._parse(act, t, duration) if len(acts) != 1: vedo.logger.error("in rotate(), can move only one object.") for tt in rng: ang = angle / len(rng) self.events.append((tt, self.rotate, acts, (axis, ang))) else: ax = self._inputvalues[0] if ax == "x": self._performers[0].rotate_x(self._inputvalues[1]) elif ax == "y": self._performers[0].rotate_y(self._inputvalues[1]) elif ax == "z": self._performers[0].rotate_z(self._inputvalues[1]) return self def scale(self, acts=None, factor=1, t=None, duration=None): """Smoothly scale a specific object to a specified scale factor.""" if self.bookingMode: acts, t, duration, rng = self._parse(acts, t, duration) for tt in rng: fac = lin_interpolate(tt, [t, t + duration], [1, factor]) self.events.append((tt, self.scale, acts, fac)) else: for a in self._performers: a.scale(self._inputvalues) return self def mesh_erode(self, act=None, corner=6, t=None, duration=None): """Erode a mesh by removing cells that are close to one of the 8 corners of the bounding box. """ if self.bookingMode: acts, t, duration, rng = self._parse(act, t, duration) if len(acts) != 1: vedo.logger.error("in meshErode(), can erode only one object.") diag = acts[0].diagonal_size() x0, x1, y0, y1, z0, z1 = acts[0].GetBounds() corners = [ (x0, y0, z0), (x1, y0, z0), (x1, y1, z0), (x0, y1, z0), (x0, y0, z1), (x1, y0, z1), (x1, y1, z1), (x0, y1, z1), ] pcl = acts[0].closest_point(corners[corner]) dmin = np.linalg.norm(pcl - corners[corner]) for tt in rng: d = lin_interpolate(tt, [t, t + duration], [dmin, diag * 1.01]) if d > 0: ids = acts[0].closest_point(corners[corner], radius=d, return_point_id=True) if len(ids) <= acts[0].npoints: self.events.append((tt, self.mesh_erode, acts, ids)) return self def play(self): """Play the internal list of events and save a video.""" self.events = sorted(self.events, key=lambda x: x[0]) self.bookingMode = False if self.show_progressbar: pb = vedo.ProgressBar(0, len(self.events), c="g") if self.total_duration is None: self.total_duration = self.events[-1][0] - self.events[0][0] if self.video_filename: vd = vedo.Video(self.video_filename, fps=self.video_fps, duration=self.total_duration) ttlast = 0 for e in self.events: tt, action, self._performers, self._inputvalues = e action(0, 0) dt = tt - ttlast if dt > self.eps: self.show(interactive=False, resetcam=self.resetcam) if self.video_filename: vd.add_frame() if dt > self.time_resolution + self.eps: if self.video_filename: vd.pause(dt) ttlast = tt if self.show_progressbar: pb.print("t=" + str(int(tt * 100) / 100) + "s, " + action.__name__) self.show(interactive=False, resetcam=self.resetcam) if self.video_filename: vd.add_frame() vd.close() self.show(interactive=True, resetcam=self.resetcam) self.bookingMode = True ######################################################################## class AnimationPlayer(vedo.Plotter): """ A Plotter with play/pause, step forward/backward and slider functionalties. Useful for inspecting time series. The user has the responsibility to update all actors in the callback function. Pay attention to that the idx can both increment and decrement, as well as make large jumps. Arguments: func : (Callable) a function that passes an integer as input and updates the scene irange : (tuple) the range of the integer input representing the time series index dt : (float) the time interval between two calls to `func` in milliseconds loop : (bool) whether to loop the animation c : (list, str) the color of the play/pause button bc : (list) the background color of the play/pause button and the slider button_size : (int) the size of the play/pause buttons button_pos : (float, float) the position of the play/pause buttons as a fraction of the window size button_gap : (float) the gap between the buttons slider_length : (float) the length of the slider as a fraction of the window size slider_pos : (float, float) the position of the slider as a fraction of the window size kwargs: (dict) keyword arguments to be passed to `Plotter` Examples: - [aspring2_player.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/aspring2_player.py) """ # Original class contributed by @mikaeltulldahl (Mikael Tulldahl) PLAY_SYMBOL = " \u23F5 " PAUSE_SYMBOL = " \u23F8 " ONE_BACK_SYMBOL = " \u29CF" ONE_FORWARD_SYMBOL = "\u29D0 " def __init__( self, func: Callable[[int],None], irange: tuple, dt: float = 1.0, loop: bool = True, c=("white", "white"), bc=("green3","red4"), button_size=25, button_pos=(0.5,0.08), button_gap=0.055, slider_length=0.5, slider_pos=(0.5,0.055), **kwargs, ): super().__init__(**kwargs) min_value, max_value = np.array(irange).astype(int) button_pos = np.array(button_pos) slider_pos = np.array(slider_pos) self._func = func self.value = min_value-1 self.min_value = min_value self.max_value = max_value self.dt = max(dt, 1) self.is_playing = False self._loop = loop self.timer_callback_id = self.add_callback("timer", self._handle_timer) self.timer_id = None self.play_pause_button = self.add_button( self.toggle, pos=button_pos, # x,y fraction from bottom left corner states=[self.PLAY_SYMBOL, self.PAUSE_SYMBOL], font="Kanopus", size=button_size, bc=bc, ) self.button_oneback = self.add_button( self.onebackward, pos=(-button_gap, 0) + button_pos, states=[self.ONE_BACK_SYMBOL], font="Kanopus", size=button_size, c=c, bc=bc, ) self.button_oneforward = self.add_button( self.oneforward, pos=(button_gap, 0) + button_pos, states=[self.ONE_FORWARD_SYMBOL], font="Kanopus", size=button_size, bc=bc, ) d = (1-slider_length)/2 self.slider: SliderWidget = self.add_slider( self._slider_callback, self.min_value, self.max_value - 1, value=self.min_value, pos=[(d-0.5, 0)+slider_pos, (0.5-d, 0)+slider_pos], show_value=False, c=bc[0], alpha=1, ) def pause(self) -> None: """Pause the animation.""" self.is_playing = False if self.timer_id is not None: self.timer_callback("destroy", self.timer_id) self.timer_id = None self.play_pause_button.status(self.PLAY_SYMBOL) def resume(self) -> None: """Resume the animation.""" if self.timer_id is not None: self.timer_callback("destroy", self.timer_id) self.timer_id = self.timer_callback("create", dt=int(self.dt)) self.is_playing = True self.play_pause_button.status(self.PAUSE_SYMBOL) def toggle(self) -> None: """Toggle between play and pause.""" if not self.is_playing: self.resume() else: self.pause() def oneforward(self) -> None: """Advance the animation by one frame.""" self.pause() self.set_frame(self.value + 1) def onebackward(self) -> None: """Go back one frame in the animation.""" self.pause() self.set_frame(self.value - 1) def set_frame(self, value: int) -> None: """Set the current value of the animation.""" if self._loop: if value < self.min_value: value = self.max_value - 1 elif value >= self.max_value: value = self.min_value else: if value < self.min_value: self.pause() value = self.min_value elif value >= self.max_value - 1: value = self.max_value - 1 self.pause() if self.value != value: self.value = value self.slider.value = value self._func(value) def _slider_callback(self, widget: SliderWidget, _: str) -> None: self.pause() self.set_frame(int(round(widget.value))) def _handle_timer(self, _: Event = None) -> None: self.set_frame(self.value + 1) def stop(self) -> "AnimationPlayer": """ Stop the animation timers, remove buttons and slider. Behave like a normal `Plotter` after this. """ # stop timer if self.timer_id is not None: self.timer_callback("destroy", self.timer_id) self.timer_id = None # remove callbacks self.remove_callback(self.timer_callback_id) # remove buttons self.slider.off() self.renderer.RemoveActor(self.play_pause_button.actor) self.renderer.RemoveActor(self.button_oneback.actor) self.renderer.RemoveActor(self.button_oneforward.actor) return self ######################################################################## class Clock(vedo.Assembly): """Clock animation.""" def __init__(self, h=None, m=None, s=None, font="Quikhand", title="", c="k"): """ Create a clock with current time or user provided time. Arguments: h : (int) hours in range [0,23] m : (int) minutes in range [0,59] s : (int) seconds in range [0,59] font : (str) font type title : (str) some extra text to show on the clock c : (str) color of the numbers Example: ```python import time from vedo import show from vedo.applications import Clock clock = Clock() plt = show(clock, interactive=False) for i in range(10): time.sleep(1) clock.update() plt.render() plt.close() ``` ![](https://vedo.embl.es/images/feats/clock.png) """ self.elapsed = 0 self._start = time.time() wd = "" if h is None and m is None: t = time.localtime() h = t.tm_hour m = t.tm_min s = t.tm_sec if not title: d = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] wd = f"{d[t.tm_wday]} {t.tm_mday}/{t.tm_mon}/{t.tm_year} " h = int(h) % 24 m = int(m) % 60 t = (h * 60 + m) / 12 / 60 alpha = 2 * np.pi * t + np.pi / 2 beta = 12 * 2 * np.pi * t + np.pi / 2 x1, y1 = np.cos(alpha), np.sin(alpha) x2, y2 = np.cos(beta), np.sin(beta) if s is not None: s = int(s) % 60 gamma = s * 2 * np.pi / 60 + np.pi / 2 x3, y3 = np.cos(gamma), np.sin(gamma) ore = Line([0, 0], [x1, y1], lw=14, c="red4").scale(0.5).mirror() minu = Line([0, 0], [x2, y2], lw=7, c="blue3").scale(0.75).mirror() secs = None if s is not None: secs = Line([0, 0], [x3, y3], lw=1, c="k").scale(0.95).mirror() secs.z(0.003) back1 = vedo.shapes.Circle(res=180, c="k5") back2 = vedo.shapes.Circle(res=12).mirror().scale(0.84).rotate_z(-360 / 12) labels = back2.labels(range(1, 13), justify="center", font=font, c=c, scale=0.14) txt = vedo.shapes.Text3D(wd + title, font="VictorMono", justify="top-center", s=0.07, c=c) txt.pos(0, -0.25, 0.001) labels.z(0.001) minu.z(0.002) vedo.Assembly.__init__(self, [back1, labels, ore, minu, secs, txt]) self.name = "Clock" def update(self, h=None, m=None, s=None): """Update clock with current or user time.""" parts = self.unpack() self.elapsed = time.time() - self._start if h is None and m is None: t = time.localtime() h = t.tm_hour m = t.tm_min s = t.tm_sec h = int(h) % 24 m = int(m) % 60 t = (h * 60 + m) / 12 / 60 alpha = 2 * np.pi * t + np.pi / 2 beta = 12 * 2 * np.pi * t + np.pi / 2 x1, y1 = np.cos(alpha), np.sin(alpha) x2, y2 = np.cos(beta), np.sin(beta) if s is not None: s = int(s) % 60 gamma = s * 2 * np.pi / 60 + np.pi / 2 x3, y3 = np.cos(gamma), np.sin(gamma) pts2 = parts[2].points() pts2[1] = [-x1 * 0.5, y1 * 0.5, 0.001] parts[2].points(pts2) pts3 = parts[3].points() pts3[1] = [-x2 * 0.75, y2 * 0.75, 0.002] parts[3].points(pts3) if s is not None: pts4 = parts[4].points() pts4[1] = [-x3 * 0.95, y3 * 0.95, 0.003] parts[4].points(pts4) return self vedo-2023.4.6/vedo/assembly.py000066400000000000000000000304231444463326400160470ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo __docformat__ = "google" __doc__ = """ Submodule for managing groups of vedo objects ![](https://vedo.embl.es/images/basic/align4.png) """ __all__ = ["Group", "Assembly", "procrustes_alignment"] ################################################# def procrustes_alignment(sources, rigid=False): """ Return an ``Assembly`` of aligned source meshes with the `Procrustes` algorithm. The output ``Assembly`` is normalized in size. The `Procrustes` algorithm takes N set of points and aligns them in a least-squares sense to their mutual mean. The algorithm is iterated until convergence, as the mean must be recomputed after each alignment. The set of average points generated by the algorithm can be accessed with ``algoutput.info['mean']`` as a numpy array. Arguments: rigid : bool if `True` scaling is disabled. Examples: - [align4.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align4.py) ![](https://vedo.embl.es/images/basic/align4.png) """ group = vtk.vtkMultiBlockDataGroupFilter() for source in sources: if sources[0].npoints != source.npoints: vedo.logger.error("sources have different nr of points") raise RuntimeError() group.AddInputData(source.polydata()) procrustes = vtk.vtkProcrustesAlignmentFilter() procrustes.StartFromCentroidOn() procrustes.SetInputConnection(group.GetOutputPort()) if rigid: procrustes.GetLandmarkTransform().SetModeToRigidBody() procrustes.Update() acts = [] for i, s in enumerate(sources): poly = procrustes.GetOutput().GetBlock(i) mesh = vedo.mesh.Mesh(poly) mesh.SetProperty(s.GetProperty()) if hasattr(s, "name"): mesh.name = s.name acts.append(mesh) assem = Assembly(acts) assem.transform = procrustes.GetLandmarkTransform() assem.info["mean"] = vedo.utils.vtk2numpy(procrustes.GetMeanPoints().GetData()) return assem ################################################# class Group(vtk.vtkPropAssembly): """Form groups of generic objects (not necessarily meshes).""" def __init__(self, objects=()): """Form groups of generic objects (not necessarily meshes).""" vtk.vtkPropAssembly.__init__(self) self.name = "" self.created = "" self.trail = None self.trail_points = [] self.trail_segment_size = 0 self.trail_offset = None self.shadows = [] self.info = {} self.rendered_at = set() self.transform = None self.scalarbar = None for a in vedo.utils.flatten(objects): if a: self.AddPart(a) self.PickableOff() def __iadd__(self, obj): """ Add an object to the group """ if not vedo.utils.is_sequence(obj): obj = [obj] for a in obj: if a: self.AddPart(a) return self def unpack(self): """Unpack the group into its elements""" elements = [] self.InitPathTraversal() parts = self.GetParts() parts.InitTraversal() for i in range(parts.GetNumberOfItems()): ele = parts.GetItemAsObject(i) elements.append(ele) # gr.InitPathTraversal() # for _ in range(gr.GetNumberOfPaths()): # path = gr.GetNextPath() # print([path]) # path.InitTraversal() # for i in range(path.GetNumberOfItems()): # a = path.GetItemAsObject(i).GetViewProp() # print([a]) return elements def clear(self): """Remove all parts""" for a in self.unpack(): self.RemovePart(a) return self def on(self): """Switch on visibility""" self.VisibilityOn() return self def off(self): """Switch off visibility""" self.VisibilityOff() return self def pickable(self, value=None): """Set/get the pickability property of an object.""" if value is None: return self.GetPickable() self.SetPickable(value) return self def draggable(self, value=None): """Set/get the draggability property of an object.""" if value is None: return self.GetDragable() self.SetDragable(value) return self def pos(self, x=None, y=None): """Set/Get object position.""" if x is None: # get functionality return np.array(self.GetPosition()) if y is None: # assume x is of the form (x,y) x, y = x self.SetPosition(x, y) return self def shift(self, ds): """Add a shift to the current object position.""" p = np.array(self.GetPosition()) self.SetPosition(p + ds) return self def bounds(self): """ Get the object bounds. Returns a list in format [xmin,xmax, ymin,ymax]. """ return self.GetBounds() def diagonal_size(self): """Get the length of the diagonal""" b = self.GetBounds() return np.sqrt((b[1] - b[0]) ** 2 + (b[3] - b[2]) ** 2) def show(self, **options): """ Create on the fly an instance of class ``Plotter`` or use the last existing one to show one single object. This method is meant as a shortcut. If more than one object needs to be visualised please use the syntax `show(mesh1, mesh2, volume, ..., options)`. Returns the ``Plotter`` class instance. """ return vedo.plotter.show(self, **options) ################################################# class Assembly(vedo.base.Base3DProp, vtk.vtkAssembly): """ Group many objects and treat them as a single new object. """ def __init__(self, *meshs): """ Group many objects and treat them as a single new object, keeping track of internal transformations. Examples: - [gyroscope1.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/gyroscope1.py) ![](https://vedo.embl.es/images/simulations/39766016-85c1c1d6-52e3-11e8-8575-d167b7ce5217.gif) """ vtk.vtkAssembly.__init__(self) vedo.base.Base3DProp.__init__(self) if len(meshs) == 1: meshs = meshs[0] else: meshs = vedo.utils.flatten(meshs) self.actors = meshs if meshs and hasattr(meshs[0], "top"): self.base = meshs[0].base self.top = meshs[0].top else: self.base = None self.top = None scalarbars = [] for a in meshs: if isinstance(a, vtk.vtkProp3D): # and a.GetNumberOfPoints(): self.AddPart(a) if hasattr(a, "scalarbar") and a.scalarbar is not None: scalarbars.append(a.scalarbar) if len(scalarbars) > 1: self.scalarbar = Group(scalarbars) elif len(scalarbars) == 1: self.scalarbar = scalarbars[0] self.pipeline = vedo.utils.OperationNode( "Assembly", parents=meshs, comment=f"#meshes {len(meshs)}", c="#f08080" ) ################################################################### def _repr_html_(self): """ HTML representation of the Assembly object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.assembly.Assembly" help_url = "https://vedo.embl.es/docs/vedo/assembly.html" arr = self.thumbnail(zoom=1.1, elevation=-60) im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" # statisitics bounds = "
".join( [ vedo.utils.precision(min_x, 4) + " ... " + vedo.utils.precision(max_x, 4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" allt = [ "", "", "", "
", image, "
", help_text, "", "", "", "", "", "
nr. of objects " + str(self.GetNumberOfPaths()) + "
position " + str(self.GetPosition()) + "
diagonal size " + vedo.utils.precision(self.diagonal_size(), 5) + "
bounds
(x/y/z)
" + str(bounds) + "
", "
", ] return "\n".join(allt) def __add__(self, obj): """ Add an object to the assembly """ if isinstance(obj, vtk.vtkProp3D): self.AddPart(obj) self.actors.append(obj) if hasattr(obj, "scalarbar") and obj.scalarbar is not None: if self.scalarbar is None: self.scalarbar = obj.scalarbar return self def unpack_group(scalarbar): if isinstance(scalarbar, Group): return scalarbar.unpack() else: return scalarbar if isinstance(self.scalarbar, Group): self.scalarbar += unpack_group(obj.scalarbar) else: self.scalarbar = Group([unpack_group(self.scalarbar), unpack_group(obj.scalarbar)]) self.pipeline = vedo.utils.OperationNode("add mesh", parents=[self, obj], c="#f08080") return self def __contains__(self, obj): """Allows to use ``in`` to check if an object is in the Assembly.""" return obj in self.actors def clone(self): """Make a clone copy of the object.""" newlist = [] for a in self.actors: newlist.append(a.clone()) return Assembly(newlist) def unpack(self, i=None, transformed=False): """Unpack the list of objects from a ``Assembly``. If `i` is given, get `i-th` object from a ``Assembly``. Input can be a string, in this case returns the first object whose name contains the given string. Examples: - [custom_axes4.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/custom_axes4.py) """ if transformed: actors = [] for a in self.actors: actors.append(a.clone(transformed=True)) else: actors = self.actors if i is None: return actors elif isinstance(i, int): return actors[i] elif isinstance(i, str): for m in actors: if i in m.name: return m def recursive_unpack(self): """Flatten out an Assembly.""" def _genflatten(lst): if not lst: return [] ## if isinstance(lst[0], Assembly): lst = lst[0].unpack() ## for elem in lst: if isinstance(elem, Assembly): apos = elem.GetPosition() asum = np.sum(apos) for x in elem.unpack(): if asum: yield x.clone().shift(apos) else: yield x else: yield elem return list(_genflatten([self])) vedo-2023.4.6/vedo/backends.py000066400000000000000000000336721444463326400160130ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo from vedo import settings from vedo import utils from vedo.pointcloud import Points from vedo.mesh import Mesh from vedo.volume import Volume __doc__ = """Submodule to delegate jupyter notebook rendering""" __all__ = [] ############################################################################################ def get_notebook_backend(actors2show=()): """Return the appropriate notebook viewer""" ######################################### if settings.default_backend == "2d": return start_2d() ######################################### if settings.default_backend == "k3d": return start_k3d(actors2show) ######################################### if settings.default_backend.startswith("trame"): return start_trame() ######################################### if settings.default_backend.startswith("ipyvtk"): return start_ipyvtklink() vedo.logger.error(f"Unknown jupyter backend: {settings.default_backend}") return None ##################################################################################### def start_2d(): try: import PIL.Image # import IPython except ImportError: print("PIL or IPython not available") return None plt = vedo.plotter_instance if hasattr(plt, "window") and plt.window: if plt.renderer == plt.renderers[-1]: nn = vedo.file_io.screenshot(asarray=True, scale=1) pil_img = PIL.Image.fromarray(nn) # IPython.display.display(pil_img) vedo.notebook_plotter = pil_img if settings.backend_autoclose: plt.close() return pil_img #################################################################################### def start_k3d(actors2show): try: # https://github.com/K3D-tools/K3D-jupyter import k3d except ModuleNotFoundError: print("Cannot find k3d, install with: pip install k3d") return None plt = vedo.plotter_instance if not plt: return None actors2show2 = [] for ia in actors2show: if not ia: continue if isinstance(ia, vedo.Assembly): # unpack assemblies actors2show2 += ia.recursive_unpack() else: actors2show2.append(ia) vedo.notebook_plotter = k3d.plot( axes=["x", "y", "z"], menu_visibility=settings.k3d_menu_visibility, height=settings.k3d_plot_height, antialias=settings.k3d_antialias, background_color=_rgb2int(vedo.get_color(plt._bg)), camera_fov=30.0, # deg (this is the vtk default) lighting=settings.k3d_lighting, grid_color=_rgb2int(vedo.get_color(settings.k3d_axes_color)), label_color=_rgb2int(vedo.get_color(settings.k3d_axes_color)), axes_helper=settings.k3d_axes_helper, # axes_helper_colors=[_rgb2int(vedo.get_color("red5")), # not working # _rgb2int(vedo.get_color("green5")), # _rgb2int(vedo.get_color("blue5"))], ) # vedo.notebook_plotter.axes_helper_colors = [ # vedo.backends._rgb2int(vedo.get_color("red5")), # not working # vedo.backends._rgb2int(vedo.get_color("green5")), # vedo.backends._rgb2int(vedo.get_color("blue5")) # ] # set k3d camera vedo.notebook_plotter.camera_auto_fit = settings.k3d_camera_autofit vedo.notebook_plotter.grid_auto_fit = settings.k3d_grid_autofit vedo.notebook_plotter.axes_helper = settings.k3d_axes_helper if plt.camera: vedo.notebook_plotter.camera = utils.vtkCameraToK3D(plt.camera) if not plt.axes: vedo.notebook_plotter.grid_visible = False for ia in actors2show2: if isinstance(ia, (vtk.vtkCornerAnnotation, vtk.vtkAssembly, vtk.vtkActor2D)): continue iacloned = ia kobj = None kcmap = None color_attribute = None vtkscals = None name = None if hasattr(ia, "filename"): if ia.filename: name = os.path.basename(ia.filename) if ia.name: name = os.path.basename(ia.name) ################################################################## scalars # work out scalars first, Points Lines are also Mesh objs if isinstance(ia, Points): # print('scalars', ia.name, ia.npoints) iap = ia.GetProperty() if ia.inputdata().GetNumberOfPolys(): iacloned = ia.clone() iapoly = iacloned.clean().triangulate().compute_normals().polydata() else: iapoly = ia.polydata() if ia.mapper().GetScalarVisibility() and ia.mapper().GetColorMode() > 0: vtkdata = iapoly.GetPointData() vtkscals = vtkdata.GetScalars() if vtkscals is None: vtkdata = iapoly.GetCellData() vtkscals = vtkdata.GetScalars() if vtkscals is not None: c2p = vtk.vtkCellDataToPointData() c2p.SetInputData(iapoly) c2p.Update() iapoly = c2p.GetOutput() vtkdata = iapoly.GetPointData() vtkscals = vtkdata.GetScalars() else: if not vtkscals.GetName(): vtkscals.SetName("scalars") scals_min, scals_max = ia.mapper().GetScalarRange() color_attribute = (vtkscals.GetName(), scals_min, scals_max) lut = ia.mapper().GetLookupTable() lut.Build() kcmap = [] nlut = lut.GetNumberOfTableValues() for i in range(nlut): r, g, b, _ = lut.GetTableValue(i) kcmap += [i / (nlut - 1), r, g, b] else: color_attribute = ia.color() #####################################################################Volume if isinstance(ia, Volume): # print('Volume', ia.name, ia.dimensions()) kx, ky, _ = ia.dimensions() arr = ia.pointdata[0] kimage = arr.reshape(-1, ky, kx) colorTransferFunction = ia.GetProperty().GetRGBTransferFunction() kcmap = [] for i in range(128): r, g, b = colorTransferFunction.GetColor(i / 127) kcmap += [i / 127, r, g, b] kbounds = np.array(ia.imagedata().GetBounds()) + np.repeat( np.array(ia.imagedata().GetSpacing()) / 2.0, 2 ) * np.array([-1, 1] * 3) kobj = k3d.volume( kimage.astype(np.float32), color_map=kcmap, # color_range=ia.imagedata().GetScalarRange(), alpha_coef=10, bounds=kbounds, name=name, ) vedo.notebook_plotter += kobj ################################################################ Text2D elif isinstance(ia, vedo.Text2D): # print('Text2D', ia.GetPosition()) pos = (ia.GetPosition()[0], 1.0 - ia.GetPosition()[1]) kobj = k3d.text2d( ia.text(), position=pos, color=_rgb2int(vedo.get_color(ia.c())), is_html=True, size=ia.property.GetFontSize() / 22.5 * 1.5, label_box=bool(ia.property.GetFrame()), # reference_point='bl', ) vedo.notebook_plotter += kobj ################################################################# Lines elif (hasattr(ia, "polydata") and ia.polydata(False).GetNumberOfLines() and ia.polydata(False).GetNumberOfPolys() == 0): for i, ln_idx in enumerate(ia.lines()): if i > 200: vedo.logger.warning("in k3d, nr. of lines is limited to 200.") break pts = ia.points()[ln_idx] aves = ia.diagonal_size() * iap.GetLineWidth() / 100 kobj = k3d.line( pts.astype(np.float32), color=_rgb2int(iap.GetColor()), opacity=iap.GetOpacity(), shader=settings.k3d_line_shader, width=aves, name=name, ) vedo.notebook_plotter += kobj ################################################################## Mesh elif isinstance(ia, Mesh) and ia.npoints and ia.polydata(False).GetNumberOfPolys(): # print('Mesh', ia.name, ia.npoints, len(ia.faces())) if not vtkscals: color_attribute = None cols = [] if ia.mapper().GetColorMode() == 0: # direct RGB colors vcols = ia.inputdata().GetPointData().GetScalars() if vcols and vcols.GetNumberOfComponents() == 3: cols = utils.vtk2numpy(vcols) cols = 65536 * cols[:, 0] + 256 * cols[:, 1] + cols[:, 2] # print("GetColor",iap.GetColor(), _rgb2int(iap.GetColor()) ) # print("colors", len(cols)) # print("color_attribute", color_attribute) # if kcmap is not None: print("color_map", len(kcmap)) # TODO: # https://k3d-jupyter.org/reference/factory.mesh.html#colormap kobj = k3d.mesh( iacloned.points(), iacloned.faces(), colors=cols, name=name, color=_rgb2int(iap.GetColor()), opacity=iap.GetOpacity(), side="double", wireframe=(iap.GetRepresentation() == 1), ) else: kobj = k3d.vtk_poly_data( iapoly, name=name, color=_rgb2int(iap.GetColor()), color_attribute=color_attribute, color_map=kcmap, opacity=iap.GetOpacity(), side="double", wireframe=(iap.GetRepresentation() == 1), ) if iap.GetInterpolation() == 0: kobj.flat_shading = True vedo.notebook_plotter += kobj #####################################################################Points elif isinstance(ia, Points): # print('Points', ia.name, ia.npoints) kcols = [] if kcmap is not None and vtkscals: scals = utils.vtk2numpy(vtkscals) kcols = k3d.helpers.map_colors(scals, kcmap, [scals_min, scals_max]).astype( np.uint32 ) aves = ia.average_size() * iap.GetPointSize() / 200 kobj = k3d.points( ia.points().astype(np.float32), color=_rgb2int(iap.GetColor()), colors=kcols, opacity=iap.GetOpacity(), shader=settings.k3d_point_shader, point_size=aves, name=name, ) vedo.notebook_plotter += kobj ##################################################################### elif isinstance(ia, vedo.Picture): vedo.logger.error("Sorry Picture objects are not supported in k3d.") if plt and settings.backend_autoclose: plt.close() return vedo.notebook_plotter ##################################################################################### def start_trame(): try: from trame.app import get_server, jupyter from trame.ui.vuetify import VAppLayout from trame.widgets import vtk as t_vtk, vuetify except ImportError: print("trame is not installed, try:\n> pip install trame") return None plt = vedo.plotter_instance if hasattr(plt, "window") and plt.window: plt.renderer.ResetCamera() server = get_server("jupyter-1") state, ctrl = server.state, server.controller plt.server = server plt.controller = ctrl plt.state = state with VAppLayout(server) as layout: with layout.root: with vuetify.VContainer(fluid=True, classes="pa-0 fill-height"): plt.reset_camera() view = t_vtk.VtkLocalView(plt.window) ctrl.view_update = view.update ctrl.view_reset_camera = view.reset_camera ctrl.on_server_exited.add(lambda **_: print("trame server exited")) vedo.notebook_plotter = jupyter.show(server) return vedo.notebook_plotter vedo.logger.error("No window present for the trame backend.") return None ##################################################################################### def start_ipyvtklink(): try: from ipyvtklink.viewer import ViewInteractiveWidget except ImportError: print("ipyvtklink is not installed, try:\n> pip install ipyvtklink") return None plt = vedo.plotter_instance if hasattr(plt, "window") and plt.window: plt.renderer.ResetCamera() vedo.notebook_plotter = ViewInteractiveWidget( plt.window, allow_wheel=True, quality=100, quick_quality=50 ) return vedo.notebook_plotter vedo.logger.error("No window present for the ipyvtklink backend.") return None ##################################################################################### def _rgb2int(rgb_tuple): # Return the int number of a color from (r,g,b), with 0= 2: if "rgb" in key.lower(): data.SetActiveScalars(key) # try: # self.actor.mapper().SetColorModeToDirectScalars() # except AttributeError: # pass else: data.SetActiveVectors(key) elif nc >= 4: data.SetActiveTensors(key) try: self.actor.mapper().SetArrayName(key) self.actor.mapper().ScalarVisibilityOn() # .. could be a volume mapper except AttributeError: pass def select_scalars(self, key): """Select one specific scalar array by its name to make it the `active` one.""" if self.association == 0: data = self.actor.inputdata().GetPointData() self.actor.mapper().SetScalarModeToUsePointData() else: data = self.actor.inputdata().GetCellData() self.actor.mapper().SetScalarModeToUseCellData() if isinstance(key, int): key = data.GetArrayName(key) data.SetActiveScalars(key) try: self.actor.mapper().SetArrayName(key) self.actor.mapper().ScalarVisibilityOn() except AttributeError: pass def select_vectors(self, key): """Select one specific vector array by its name to make it the `active` one.""" if self.association == 0: data = self.actor.inputdata().GetPointData() self.actor.mapper().SetScalarModeToUsePointData() else: data = self.actor.inputdata().GetCellData() self.actor.mapper().SetScalarModeToUseCellData() if isinstance(key, int): key = data.GetArrayName(key) data.SetActiveVectors(key) try: self.actor.mapper().SetArrayName(key) self.actor.mapper().ScalarVisibilityOn() except AttributeError: pass def print(self, **kwargs): """Print the array names available to terminal""" colors.printc(self.keys(), **kwargs) def __repr__(self) -> str: """Representation""" def _get_str(pd, header): if pd.GetNumberOfArrays(): out = f"\x1b[2m\x1b[1m\x1b[7m{header}" if self.actor.name: out += f" in {self.actor.name}" out += f" contains {pd.GetNumberOfArrays()} array(s)\x1b[0m" for i in range(pd.GetNumberOfArrays()): varr = pd.GetArray(i) out += f"\n\x1b[1m\x1b[4mArray name : {varr.GetName()}\x1b[0m" out += "\nindex".ljust(15) + f": {i}" t = varr.GetDataType() if t in vedo.utils.array_types: out += f"\ntype".ljust(15) out += f": {vedo.utils.array_types[t][1]} ({vedo.utils.array_types[t][0]})" shape = (varr.GetNumberOfTuples(), varr.GetNumberOfComponents()) out += "\nshape".ljust(15) + f": {shape}" out += "\nrange".ljust(15) + f": {np.array(varr.GetRange())}" out += "\nmax id".ljust(15) + f": {varr.GetMaxId()}" out += "\nlook up table".ljust(15) + f": {bool(varr.GetLookupTable())}" out += "\nin-memory size".ljust(15) + f": {varr.GetActualMemorySize()} KB" else: out += " has no associated data." return out if self.association == 0: out = _get_str(self.actor._data.GetPointData(), "Point Data") elif self.association == 1: out = _get_str(self.actor._data.GetCellData(), "Cell Data") elif self.association == 2: pd = self.actor._data.GetFieldData() if pd.GetNumberOfArrays(): out = f"\x1b[2m\x1b[1m\x1b[7mMeta Data" if self.actor.name: out += f" in {self.actor.name}" out += f" contains {pd.GetNumberOfArrays()} entries\x1b[0m" for i in range(pd.GetNumberOfArrays()): varr = pd.GetAbstractArray(i) out += f"\n\x1b[1m\x1b[4mEntry name : {varr.GetName()}\x1b[0m" out += "\nindex".ljust(15) + f": {i}" shape = (varr.GetNumberOfTuples(), varr.GetNumberOfComponents()) out += "\nshape".ljust(15) + f": {shape}" return out ############################################################################### class Base3DProp: """ Base class to manage positioning and size of the objects in space and other properties. .. warning:: Do not use this class to instantiate objects """ def __init__(self): """ Base class to manage positioning and size of the objects in space and other properties. """ self.filename = "" self.name = "" self.file_size = "" self.created = "" self.trail = None self.trail_points = [] self.trail_segment_size = 0 self.trail_offset = None self.shadows = [] self.axes = None self.picked3d = None self.units = None self.top = np.array([0, 0, 1]) self.base = np.array([0, 0, 0]) self.info = {} self.time = time.time() self.rendered_at = set() self.transform = None self._isfollower = False # set by mesh.follow_camera() self.point_locator = None self.cell_locator = None self.scalarbar = None # self.scalarbars = dict() #TODO self.pipeline = None def address(self): """ Return a unique memory address integer which may serve as the ID of the object, or passed to c++ code. """ # https://www.linkedin.com/pulse/speedup-your-code-accessing-python-vtk-objects-from-c-pletzer/ # https://github.com/tfmoraes/polydata_connectivity return int(self.inputdata().GetAddressAsString("")[5:], 16) def pickable(self, value=None): """Set/get the pickability property of an object.""" if value is None: return self.GetPickable() self.SetPickable(value) return self def draggable(self, value=None): # NOT FUNCTIONAL? """Set/get the draggability property of an object.""" if value is None: return self.GetDragable() self.SetDragable(value) return self def origin(self, x=None, y=None, z=None): """ Set/get object's origin. Relevant to control the scaling with `scale()` and rotations. Has no effect on position. """ if x is None: return np.array(self.GetOrigin()) + self.GetPosition() if z is None and y is None: # assume x is of the form (x,y,z) if len(x) == 3: x, y, z = x else: x, y = x z = 0 elif z is None: # assume x,y is of the form x, y z = 0 self.SetOrigin([x, y, z] - np.array(self.GetPosition())) return self def pos(self, x=None, y=None, z=None): """Set/Get object position.""" if x is None: # get functionality return np.array(self.GetPosition()) if z is None and y is None: # assume x is of the form (x,y,z) if len(x) == 3: x, y, z = x else: x, y = x z = 0 elif z is None: # assume x,y is of the form x, y z = 0 self.SetPosition(x, y, z) self.point_locator = None self.cell_locator = None return self # return itself to concatenate methods def shift(self, dx=0, dy=0, dz=0): """Add a vector to the current object position.""" p = np.array(self.GetPosition()) if utils.is_sequence(dx): if len(dx) == 2: self.SetPosition(p + [dx[0], dx[1], 0]) else: self.SetPosition(p + dx) else: self.SetPosition(p + [dx, dy, dz]) self.point_locator = None self.cell_locator = None return self def x(self, val=None): """Set/Get object position along x axis.""" p = self.GetPosition() if val is None: return p[0] self.pos(val, p[1], p[2]) return self def y(self, val=None): """Set/Get object position along y axis.""" p = self.GetPosition() if val is None: return p[1] self.pos(p[0], val, p[2]) return self def z(self, val=None): """Set/Get object position along z axis.""" p = self.GetPosition() if val is None: return p[2] self.pos(p[0], p[1], val) return self def rotate(self, angle, axis=(1, 0, 0), point=(0, 0, 0), rad=False): """ Rotate around an arbitrary `axis` passing through `point`. Example: ```python from vedo import * c1 = Cube() c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 v = vector(0.2,1,0) p = vector(1,0,0) # axis passes through this point c2.rotate(90, axis=v, point=p) l = Line(-v+p, v+p).lw(3).c('red') show(c1, l, c2, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/rotate_axis.png) """ if rad: anglerad = angle else: anglerad = np.deg2rad(angle) axis = utils.versor(axis) a = np.cos(anglerad / 2) b, c, d = -axis * np.sin(anglerad / 2) aa, bb, cc, dd = a * a, b * b, c * c, d * d bc, ad, ac, ab, bd, cd = b * c, a * d, a * c, a * b, b * d, c * d R = np.array( [ [aa + bb - cc - dd, 2 * (bc + ad), 2 * (bd - ac)], [2 * (bc - ad), aa + cc - bb - dd, 2 * (cd + ab)], [2 * (bd + ac), 2 * (cd - ab), aa + dd - bb - cc], ] ) rv = np.dot(R, self.GetPosition() - np.asarray(point)) + point if rad: angle *= 180.0 / np.pi # this vtk method only rotates in the origin of the object: self.RotateWXYZ(angle, axis[0], axis[1], axis[2]) self.pos(rv) return self def _rotatexyz(self, a, angle, rad, around): if rad: angle *= 180 / np.pi T = vtk.vtkTransform() T.SetMatrix(self.GetMatrix()) T.PostMultiply() rot = dict(x=T.RotateX, y=T.RotateY, z=T.RotateZ) if around is None: # rotate around its origin rot[a](angle) else: if around == "itself": around = self.GetPosition() # displacement needed to bring it back to the origin # and disregard origin disp = around - np.array(self.GetOrigin()) T.Translate(-disp) rot[a](angle) T.Translate(disp) self.SetOrientation(T.GetOrientation()) self.SetPosition(T.GetPosition()) self.point_locator = None self.cell_locator = None return self @deprecated(reason=vedo.colors.red + "Please use rotate_x()" + vedo.colors.reset) def rotateX(self, *a, **b): """Deprecated. Please use `rotate_x()`.""" return self.rotate_x(*a, **b) @deprecated(reason=vedo.colors.red + "Please use rotate_y()" + vedo.colors.reset) def rotateY(self, *a, **b): """Deprecated. Please use `rotate_y()`.""" return self.rotate_y(*a, **b) @deprecated(reason=vedo.colors.red + "Please use rotate_z()" + vedo.colors.reset) def rotateZ(self, *a, **b): """Deprecated. Please use `rotate_z()`.""" return self.rotate_z(*a, **b) def rotate_x(self, angle, rad=False, around=None): """ Rotate around x-axis. If angle is in radians set `rad=True`. Use `around` to define a pivoting point. """ return self._rotatexyz("x", angle, rad, around) def rotate_y(self, angle, rad=False, around=None): """ Rotate around y-axis. If angle is in radians set `rad=True`. Use `around` to define a pivoting point. """ return self._rotatexyz("y", angle, rad, around) def rotate_z(self, angle, rad=False, around=None): """ Rotate around z-axis. If angle is in radians set `rad=True`. Use `around` to define a pivoting point. """ return self._rotatexyz("z", angle, rad, around) def orientation(self, newaxis=None, rotation=0, concatenate=False, xyplane=False, rad=False): """ Set/Get object orientation. Arguments: rotation : (float) rotate object around newaxis. concatenate : (bool) concatenate the orientation operation with the previous existing transform (if any) xyplane : (bool) make an extra rotation to keep the object aligned to the xy-plane rad : (bool) set to True if angle is expressed in radians. Example: ```python from vedo import * center = np.array([581/2,723/2,0]) objs = [] for a in np.linspace(0, 6.28, 7): v = vector(cos(a), sin(a), 0)*1000 pic = Picture(dataurl+"images/dog.jpg").rotate_z(10) pic.orientation(v, xyplane=True) pic.origin(center) pic.pos(v - center) objs += [pic, Arrow(v, v+v)] show(objs, Point(), axes=1).close() ``` ![](https://vedo.embl.es/images/feats/orientation.png) Examples: - [gyroscope2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/gyroscope2.py) ![](https://vedo.embl.es/images/simulations/50738942-687b5780-11d9-11e9-97f0-72bbd63f7d6e.gif) """ if self.top is None or self.base is None: initaxis = (0, 0, 1) else: initaxis = utils.versor(self.top - self.base) newaxis = utils.versor(newaxis) p = np.array(self.GetPosition()) crossvec = np.cross(initaxis, newaxis) angleth = np.arccos(np.dot(initaxis, newaxis)) T = vtk.vtkTransform() if concatenate: try: M = self.GetMatrix() T.SetMatrix(M) except: pass T.PostMultiply() T.Translate(-p) if rotation: if rad: rotation *= 180.0 / np.pi T.RotateWXYZ(rotation, initaxis) if xyplane: angleph = np.arctan2(newaxis[1], newaxis[0]) T.RotateWXYZ(np.rad2deg(angleph + angleth), initaxis) # compensation T.RotateWXYZ(np.rad2deg(angleth), crossvec) T.Translate(p) self.SetOrientation(T.GetOrientation()) self.point_locator = None self.cell_locator = None return self # newaxis = utils.versor(newaxis) # pos = np.array(self.GetPosition()) # crossvec = np.cross(initaxis, newaxis) # angle = np.arccos(np.dot(initaxis, newaxis)) # T = vtk.vtkTransform() # T.PostMultiply() # T.Translate(-pos) # if rotation: # T.RotateWXYZ(rotation, initaxis) # T.RotateWXYZ(np.rad2deg(angle), crossvec) # T.Translate(pos) # self.SetUserTransform(T) # self.transform = T def scale(self, s=None, reset=False): """ Set/get object's scaling factor. Arguments: s : (list, float) scaling factor(s). reset : (bool) if True previous scaling factors are ignored. Note: use `s=(sx,sy,sz)` to scale differently in the three coordinates. """ if s is None: return np.array(self.GetScale()) # assert s[0] != 0 # assert s[1] != 0 # assert s[2] != 0 if reset: self.SetScale(s) else: self.SetScale(np.multiply(self.GetScale(), s)) self.point_locator = None self.cell_locator = None return self def get_transform(self, invert=False): """ Check if `object.transform` exists and returns a `vtkTransform`. Otherwise return current user transformation (where the object is currently placed). Use `invert` to return the inverse of the current transformation Example: ```python from vedo import * c1 = Cube() c2 = c1.clone().c('violet').alpha(0.5) # copy of c1 v = vector(0.2,1,0) p = vector(1,0,0) # axis passes through this point c2.rotate(90, axis=v, point=p) # get the inverse of the current transformation T = c2.get_transform(invert=True) c2.apply_transform(T) # put back c2 in place l = Line(p-v, p+v).lw(3).c('red') show(c1.wireframe().lw(3), l, c2, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/get_transf.png) """ if self.transform: tr = self.transform if invert: tr = tr.GetInverse() return tr T = self.GetMatrix() tr = vtk.vtkTransform() tr.SetMatrix(T) if invert: tr = tr.GetInverse() return tr @deprecated(reason=vedo.colors.red + "Please use apply_transform()" + vedo.colors.reset) def applyTransform(self, T, reset=False, concatenate=False): """Deprecated. Please use `apply_transform()`""" return self.apply_transform(T, reset, concatenate) def apply_transform(self, T, reset=False, concatenate=False): """ Transform object position and orientation. Arguments: reset : (bool) no effect, this is superseded by `pointcloud.apply_transform()` concatenate : (bool) no effect, this is superseded by `pointcloud.apply_transform()` """ if isinstance(T, vtk.vtkMatrix4x4): self.SetUserMatrix(T) elif utils.is_sequence(T): vm = vtk.vtkMatrix4x4() for i in [0, 1, 2, 3]: for j in [0, 1, 2, 3]: vm.SetElement(i, j, T[i][j]) self.SetUserMatrix(vm) else: self.SetUserTransform(T) self.transform = T self.point_locator = None self.cell_locator = None return self def align_to_bounding_box(self, msh, rigid=False): """ Align the current object's bounding box to the bounding box of the input object. Use `rigid` to disable scaling. Examples: - [align6.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align6.py) """ lmt = vtk.vtkLandmarkTransform() ss = vtk.vtkPoints() xss0, xss1, yss0, yss1, zss0, zss1 = self.bounds() for p in [ [xss0, yss0, zss0], [xss1, yss0, zss0], [xss1, yss1, zss0], [xss0, yss1, zss0], [xss0, yss0, zss1], [xss1, yss0, zss1], [xss1, yss1, zss1], [xss0, yss1, zss1], ]: ss.InsertNextPoint(p) st = vtk.vtkPoints() xst0, xst1, yst0, yst1, zst0, zst1 = msh.bounds() for p in [ [xst0, yst0, zst0], [xst1, yst0, zst0], [xst1, yst1, zst0], [xst0, yst1, zst0], [xst0, yst0, zst1], [xst1, yst0, zst1], [xst1, yst1, zst1], [xst0, yst1, zst1], ]: st.InsertNextPoint(p) lmt.SetSourceLandmarks(ss) lmt.SetTargetLandmarks(st) lmt.SetModeToAffine() if rigid: lmt.SetModeToRigidBody() lmt.Update() self.apply_transform(lmt) self.transform = lmt self.point_locator = None self.cell_locator = None return self def on(self): """Switch on object visibility. Object is not removed.""" self.VisibilityOn() try: self.scalarbar.VisibilityOn() except AttributeError: pass try: self.trail.VisibilityOn() except AttributeError: pass try: for sh in self.shadows: sh.VisibilityOn() except AttributeError: pass return self def off(self): """Switch off object visibility. Object is not removed.""" self.VisibilityOff() try: self.scalarbar.VisibilityOff() except AttributeError: pass try: self.trail.VisibilityOff() except AttributeError: pass try: for sh in self.shadows: sh.VisibilityOff() except AttributeError: pass return self def toggle(self): """Toggle object visibility on/off.""" v = self.GetVisibility() if v: self.off() else: self.on() return self def box(self, scale=1, padding=0, fill=False): """ Return the bounding box as a new `Mesh`. Arguments: scale : (float) box size can be scaled by a factor padding : (float, list) a constant padding can be added (can be a list [padx,pady,padz]) Examples: - [latex.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/latex.py) """ b = self.bounds() if not utils.is_sequence(padding): padding = [padding, padding, padding] length, width, height = b[1] - b[0], b[3] - b[2], b[5] - b[4] tol = (length + width + height) / 30000 # useful for boxing 2D text pos = [(b[0] + b[1]) / 2, (b[3] + b[2]) / 2, (b[5] + b[4]) / 2 - tol] bx = vedo.shapes.Box( pos, length * scale + padding[0], width * scale + padding[1], height * scale + padding[2], c="gray", ) if hasattr(self, "GetProperty"): # could be Assembly if isinstance(self.GetProperty(), vtk.vtkProperty): # could be volume pr = vtk.vtkProperty() pr.DeepCopy(self.GetProperty()) bx.SetProperty(pr) bx.property = pr bx.wireframe(not fill) bx.flat().lighting("off") return bx def use_bounds(self, ub=True): """ Instruct the current camera to either take into account or ignore the object bounds when resetting. """ self.SetUseBounds(ub) return self def bounds(self): """ Get the object bounds. Returns a list in format `[xmin,xmax, ymin,ymax, zmin,zmax]`. """ try: pts = self.points() xmin, ymin, zmin = np.min(pts, axis=0) xmax, ymax, zmax = np.max(pts, axis=0) return [xmin, xmax, ymin, ymax, zmin, zmax] except (AttributeError, ValueError): return self.GetBounds() def xbounds(self, i=None): """Get the bounds `[xmin,xmax]`. Can specify upper or lower with i (0,1).""" b = self.bounds() if i is not None: return b[i] return (b[0], b[1]) def ybounds(self, i=None): """Get the bounds `[ymin,ymax]`. Can specify upper or lower with i (0,1).""" b = self.bounds() if i == 0: return b[2] if i == 1: return b[3] return (b[2], b[3]) def zbounds(self, i=None): """Get the bounds `[zmin,zmax]`. Can specify upper or lower with i (0,1).""" b = self.bounds() if i == 0: return b[4] if i == 1: return b[5] return (b[4], b[5]) @deprecated(reason=vedo.colors.red + "Please use diagonal_size()" + vedo.colors.reset) def diagonalSize(self): """Deprecated. Please use `diagonal_size()`.""" return self.diagonal_size() def diagonal_size(self): """Get the length of the diagonal of mesh bounding box.""" b = self.bounds() return np.sqrt((b[1] - b[0]) ** 2 + (b[3] - b[2]) ** 2 + (b[5] - b[4]) ** 2) # return self.GetLength() # ???different??? def copy_data_from(self, obj): """Copy all data (point and cell data) from this input object""" self.inputdata().GetPointData().PassData(obj.inputdata().GetPointData()) self.inputdata().GetCellData().PassData(obj.inputdata().GetCellData()) self.pipeline = utils.OperationNode( f"copy_data_from\n{obj.__class__.__name__}", parents=[self, obj], shape="note", c="#ccc5b9", ) return self def print(self): """Print information about an object.""" utils.print_info(self) return self def show(self, **options): """ Create on the fly an instance of class `Plotter` or use the last existing one to show one single object. This method is meant as a shortcut. If more than one object needs to be visualised please use the syntax `show(mesh1, mesh2, volume, ..., options)`. Returns the `Plotter` class instance. """ return vedo.plotter.show(self, **options) def thumbnail(self, zoom=1.25, size=(200, 200), bg="white", azimuth=0, elevation=0, axes=False): """Build a thumbnail of the object and return it as an array.""" # speed is about 20Hz for size=[200,200] ren = vtk.vtkRenderer() ren.AddActor(self) if axes: axes = vedo.addons.Axes(self) ren.AddActor(axes) ren.ResetCamera() cam = ren.GetActiveCamera() cam.Zoom(zoom) cam.Elevation(elevation) cam.Azimuth(azimuth) ren_win = vtk.vtkRenderWindow() ren_win.SetOffScreenRendering(True) ren_win.SetSize(size) ren.SetBackground(colors.get_color(bg)) ren_win.AddRenderer(ren) ren_win.Render() nx, ny = ren_win.GetSize() arr = vtk.vtkUnsignedCharArray() ren_win.GetRGBACharPixelData(0, 0, nx - 1, ny - 1, 0, arr) narr = utils.vtk2numpy(arr).T[:3].T.reshape([ny, nx, 3]) narr = np.ascontiguousarray(np.flip(narr, axis=0)) ren.RemoveActor(self) if axes: ren.RemoveActor(axes) ren_win.Finalize() del ren_win return narr ######################################################################################## class BaseActor2D(vtk.vtkActor2D): """ Base class. .. warning:: Do not use this class to instantiate objects. """ def __init__(self): """Manage 2D objects.""" super().__init__() self._mapper = None self.property = self.GetProperty() self.filename = "" def layer(self, value=None): """Set/Get the layer number in the overlay planes into which to render.""" if value is None: return self.GetLayerNumber() self.SetLayerNumber(value) return self def pos(self, px=None, py=None): """Set/Get the screen-coordinate position.""" if isinstance(px, str): vedo.logger.error("Use string descriptors only inside the constructor") return self if px is None: return np.array(self.GetPosition(), dtype=int) if py is not None: p = [px, py] else: p = px assert len(p) == 2, "Error: len(pos) must be 2 for BaseActor2D" self.SetPosition(p) return self def coordinate_system(self, value=None): """ Set/get the coordinate system which this coordinate is defined in. The options are: 0. Display 1. Normalized Display 2. Viewport 3. Normalized Viewport 4. View 5. Pose 6. World """ coor = self.GetPositionCoordinate() if value is None: return coor.GetCoordinateSystem() coor.SetCoordinateSystem(value) return self def on(self): """Set object visibility.""" self.VisibilityOn() return self def off(self): """Set object visibility.""" self.VisibilityOn() return self def toggle(self): """Toggle object visibility.""" self.SetVisibility(not self.GetVisibility()) return self def pickable(self, value=True): self.SetPickable(value) return self def alpha(self, value=None): """Set/Get the object opacity.""" if value is None: return self.GetProperty().GetOpacity() self.GetProperty().SetOpacity(value) return self def ps(self, point_size=None): if point_size is None: return self.GetProperty().GetPointSize() self.GetProperty().SetPointSize(point_size) return self def ontop(self, value=True): """Keep the object always on top of everything else.""" if value: self.GetProperty().SetDisplayLocationToForeground() else: self.GetProperty().SetDisplayLocationToBackground() return self ######################################################################################## class BaseActor(Base3DProp): """ Base class. .. warning:: Do not use this class to instantiate objects, use one the above instead. """ def __init__(self): """ Base class to add operative and data functionality to `Mesh`, `Assembly`, `Volume` and `Picture` objects. """ super().__init__() self._mapper = None self._caption = None self.property = None def mapper(self, new_mapper=None): """Return the `vtkMapper` data object, or update it with a new one.""" if new_mapper: self.SetMapper(new_mapper) if self._mapper: iptdata = self._mapper.GetInput() if iptdata: new_mapper.SetInputData(self._mapper.GetInput()) self._mapper = new_mapper self._mapper.Modified() return self._mapper def inputdata(self): """Return the VTK input data object.""" if self._mapper: return self._mapper.GetInput() return self.GetMapper().GetInput() def modified(self): """Use in conjunction with `tonumpy()` to update any modifications to the volume array""" sc = self.inputdata().GetPointData().GetScalars() if sc: sc.Modified() self.inputdata().GetPointData().Modified() return self @deprecated(reason=vedo.colors.red + "Please use property object.npoints" + vedo.colors.reset) def N(self): """Deprecated. Please use property object.npoints""" return self.inputdata().GetNumberOfPoints() @deprecated(reason=vedo.colors.red + "Please use property object.npoints" + vedo.colors.reset) def NPoints(self): """Deprecated. Please use property object.npoints""" return self.inputdata().GetNumberOfPoints() @deprecated(reason=vedo.colors.red + "Please use property object.ncells" + vedo.colors.reset) def NCells(self): """Deprecated. Please use property object.ncells""" return self.inputdata().GetNumberOfCells() @property def npoints(self): """Retrieve the number of points.""" return self.inputdata().GetNumberOfPoints() @property def ncells(self): """Retrieve the number of cells.""" return self.inputdata().GetNumberOfCells() def points(self, pts=None, transformed=True): """ Set/Get the vertex coordinates of a mesh or point cloud. Argument can be an index, a set of indices or a complete new set of points to update the mesh. Set `transformed=False` to ignore any previous transformation applied to the mesh. """ if pts is None: ### getter if isinstance(self, vedo.Points): vpts = self.polydata(transformed).GetPoints() elif isinstance(self, vedo.BaseVolume): v2p = vtk.vtkImageToPoints() v2p.SetInputData(self.imagedata()) v2p.Update() vpts = v2p.GetOutput().GetPoints() else: # tetmesh et al vpts = self.inputdata().GetPoints() if vpts: return utils.vtk2numpy(vpts.GetData()) return np.array([], dtype=np.float32) else: ### setter if len(pts) == 3 and len(pts[0]) != 3: # assume plist is in the format [all_x, all_y, all_z] pts = np.stack((pts[0], pts[1], pts[2]), axis=1) pts = np.asarray(pts, dtype=np.float32) if pts.shape[1] == 2: pts = np.c_[pts, np.zeros(pts.shape[0], dtype=np.float32)] vpts = self.inputdata().GetPoints() arr = utils.numpy2vtk(pts, dtype=np.float32) vpts.SetData(arr) vpts.Modified() # reset mesh to identity matrix position/rotation: self.PokeMatrix(vtk.vtkMatrix4x4()) self.point_locator = None self.cell_locator = None return self @deprecated(reason=vedo.colors.red + "Please use cell_centers()" + vedo.colors.reset) def cellCenters(self): """Deprecated. Please use `cell_centers()`""" return self.cell_centers() def cell_centers(self): """ Get the coordinates of the cell centers. Examples: - [delaunay2d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delaunay2d.py) """ vcen = vtk.vtkCellCenters() if hasattr(self, "polydata"): vcen.SetInputData(self.polydata()) else: vcen.SetInputData(self.inputdata()) vcen.Update() return utils.vtk2numpy(vcen.GetOutput().GetPoints().GetData()) def delete_cells(self, ids): """ Remove cells from the mesh object by their ID. Points (vertices) are not removed (you may use `.clean()` to remove those). """ data = self.inputdata() data.BuildLinks() for cid in ids: data.DeleteCell(cid) data.RemoveDeletedCells() data.Modified() self._mapper.Modified() self.pipeline = utils.OperationNode( "delete_cells", parents=[self], comment=f"#cells {self._data.GetNumberOfCells()}" ) return self def mark_boundaries(self): """ Mark cells and vertices of the mesh if they lie on a boundary. A new array called `BoundaryCells` is added to the mesh. """ mb = vtk.vtkMarkBoundaryFilter() mb.SetInputData(self._data) mb.Update() out = self._update(mb.GetOutput()) out.pipeline = utils.OperationNode("mark_boundaries", parents=[self]) return out def find_cells_in(self, xbounds=(), ybounds=(), zbounds=()): """ Find cells that are within the specified bounds. Setting a color will add a vtk array to colorize these cells. """ if len(xbounds) == 6: bnds = xbounds else: bnds = list(self.bounds()) if len(xbounds) == 2: bnds[0] = xbounds[0] bnds[1] = xbounds[1] if len(ybounds) == 2: bnds[2] = ybounds[0] bnds[3] = ybounds[1] if len(zbounds) == 2: bnds[4] = zbounds[0] bnds[5] = zbounds[1] cellIds = vtk.vtkIdList() self.cell_locator = vtk.vtkCellTreeLocator() self.cell_locator.SetDataSet(self.polydata()) self.cell_locator.BuildLocator() self.cell_locator.FindCellsWithinBounds(bnds, cellIds) cids = [] for i in range(cellIds.GetNumberOfIds()): cid = cellIds.GetId(i) cids.append(cid) return np.array(cids) def count_vertices(self): """Count the number of vertices each cell has and return it as a numpy array""" vc = vtk.vtkCountVertices() vc.SetInputData(self._data) vc.SetOutputArrayName("VertexCount") vc.Update() varr = vc.GetOutput().GetCellData().GetArray("VertexCount") return utils.vtk2numpy(varr) def lighting( self, style="", ambient=None, diffuse=None, specular=None, specular_power=None, specular_color=None, metallicity=None, roughness=None, ): """ Set the ambient, diffuse, specular and specular_power lighting constants. Arguments: style : (str) preset style, options are `[metallic, plastic, shiny, glossy, ambient, off]` ambient : (float) ambient fraction of emission [0-1] diffuse : (float) emission of diffused light in fraction [0-1] specular : (float) fraction of reflected light [0-1] specular_power : (float) precision of reflection [1-100] specular_color : (color) color that is being reflected by the surface Examples: - [specular.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/specular.py) """ pr = self.GetProperty() if style: if isinstance(pr, vtk.vtkVolumeProperty): self.shade(True) if style == "off": self.shade(False) elif style == "ambient": style = "default" self.shade(False) else: if style != "off": pr.LightingOn() if style == "off": pr.SetInterpolationToFlat() pr.LightingOff() return self ############## if hasattr(pr, "GetColor"): # could be Volume c = pr.GetColor() else: c = (1, 1, 0.99) mpr = self._mapper if hasattr(mpr, 'GetScalarVisibility') and mpr.GetScalarVisibility(): c = (1,1,0.99) if style=='metallic': pars = [0.1, 0.3, 1.0, 10, c] elif style=='plastic' : pars = [0.3, 0.4, 0.3, 5, c] elif style=='shiny' : pars = [0.2, 0.6, 0.8, 50, c] elif style=='glossy' : pars = [0.1, 0.7, 0.9, 90, (1,1,0.99)] elif style=='ambient' : pars = [0.8, 0.1, 0.0, 1, (1,1,1)] elif style=='default' : pars = [0.1, 1.0, 0.05, 5, c] else: vedo.logger.error("in lighting(): Available styles are") vedo.logger.error("[default, metallic, plastic, shiny, glossy, ambient, off]") raise RuntimeError() pr.SetAmbient(pars[0]) pr.SetDiffuse(pars[1]) pr.SetSpecular(pars[2]) pr.SetSpecularPower(pars[3]) if hasattr(pr, "GetColor"): pr.SetSpecularColor(pars[4]) if ambient is not None: pr.SetAmbient(ambient) if diffuse is not None: pr.SetDiffuse(diffuse) if specular is not None: pr.SetSpecular(specular) if specular_power is not None: pr.SetSpecularPower(specular_power) if specular_color is not None: pr.SetSpecularColor(colors.get_color(specular_color)) if utils.vtk_version_at_least(9): if metallicity is not None: pr.SetInterpolationToPBR() pr.SetMetallic(metallicity) if roughness is not None: pr.SetInterpolationToPBR() pr.SetRoughness(roughness) return self def print_histogram( self, bins=10, height=10, logscale=False, minbin=0, horizontal=False, char="\U00002589", c=None, bold=True, title="Histogram", ): """ Ascii histogram printing on terminal. Input can be `Volume` or `Mesh` (will grab the active point array). Arguments: bins : (int) number of histogram bins height : (int) height of the histogram in character units logscale : (bool) use logscale for frequencies minbin : (int) ignore bins before minbin horizontal : (bool) show histogram horizontally char : (str) character to be used as marker c : (color) ascii color bold : (bool) use boldface title : (str) histogram title ![](https://vedo.embl.es/images/feats/histoprint.png) """ utils.print_histogram( self, bins, height, logscale, minbin, horizontal, char, c, bold, title ) return self def c(self, color=False, alpha=None): """ Shortcut for `color()`. If None is passed as input, will use colors from current active scalars. """ return self.color(color, alpha) @property def pointdata(self): """ Create and/or return a `numpy.array` associated to points (vertices). A data array can be indexed either as a string or by an integer number. E.g.: `myobj.pointdata["arrayname"]` Usage: `myobj.pointdata.keys()` to return the available data array names `myobj.pointdata.select(name)` to make this array the active one `myobj.pointdata.remove(name)` to remove this array """ return _DataArrayHelper(self, 0) @property def celldata(self): """ Create and/or return a `numpy.array` associated to cells (faces). A data array can be indexed either as a string or by an integer number. E.g.: `myobj.celldata["arrayname"]` Usage: `myobj.celldata.keys()` to return the available data array names `myobj.celldata.select(name)` to make this array the active one `myobj.celldata.remove(name)` to remove this array """ return _DataArrayHelper(self, 1) @property def metadata(self): """ Create and/or return a `numpy.array` associated to neither cells nor faces. A data array can be indexed either as a string or by an integer number. E.g.: `myobj.metadata["arrayname"]` Usage: `myobj.metadata.keys()` to return the available data array names `myobj.metadata.select(name)` to make this array the active one `myobj.metadata.remove(name)` to remove this array """ return _DataArrayHelper(self, 2) def map_cells_to_points(self, arrays=(), move=False): """ Interpolate cell data (i.e., data specified per cell or face) into point data (i.e., data specified at each vertex). The method of transformation is based on averaging the data values of all cells using a particular point. A custom list of arrays to be mapped can be passed in input. Set `move=True` to delete the original `celldata` array. """ c2p = vtk.vtkCellDataToPointData() c2p.SetInputData(self.inputdata()) if not move: c2p.PassCellDataOn() if arrays: c2p.ClearCellDataArrays() c2p.ProcessAllArraysOff() for arr in arrays: c2p.AddCellDataArray(arr) else: c2p.ProcessAllArraysOn() c2p.Update() self._mapper.SetScalarModeToUsePointData() out = self._update(c2p.GetOutput()) out.pipeline = utils.OperationNode("map cell\nto point data", parents=[self]) return out def map_points_to_cells(self, arrays=(), move=False): """ Interpolate point data (i.e., data specified per point or vertex) into cell data (i.e., data specified per cell). The method of transformation is based on averaging the data values of all points defining a particular cell. A custom list of arrays to be mapped can be passed in input. Set `move=True` to delete the original `pointdata` array. Examples: - [mesh_map2cell.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_map2cell.py) """ p2c = vtk.vtkPointDataToCellData() p2c.SetInputData(self.inputdata()) if not move: p2c.PassPointDataOn() if arrays: p2c.ClearPointDataArrays() p2c.ProcessAllArraysOff() for arr in arrays: p2c.AddPointDataArray(arr) else: p2c.ProcessAllArraysOn() p2c.Update() self._mapper.SetScalarModeToUseCellData() out = self._update(p2c.GetOutput()) out.pipeline = utils.OperationNode("map point\nto cell data", parents=[self]) return out def resample_data_from(self, source, tol=None, categorical=False): """ Resample point and cell data from another dataset. The output has the same structure but its point data have the resampled values from target. Use `tol` to set the tolerance used to compute whether a point in the source is in a cell of the current object. Points without resampled values, and their cells, are marked as blank. If the data is categorical, then the resulting data will be determined by a nearest neighbor interpolation scheme. Example: ```python from vedo import * m1 = Mesh(dataurl+'bunny.obj')#.add_gaussian_noise(0.1) pts = m1.points() ces = m1.cell_centers() m1.pointdata["xvalues"] = np.power(pts[:,0], 3) m1.celldata["yvalues"] = np.power(ces[:,1], 3) m2 = Mesh(dataurl+'bunny.obj') m2.resample_arrays_from(m1) # print(m2.pointdata["xvalues"]) show(m1, m2 , N=2, axes=1) ``` """ rs = vtk.vtkResampleWithDataSet() rs.SetInputData(self.inputdata()) rs.SetSourceData(source.inputdata()) rs.SetPassPointArrays(True) rs.SetPassCellArrays(True) rs.SetPassFieldArrays(True) rs.SetCategoricalData(categorical) rs.SetComputeTolerance(True) if tol: rs.SetComputeTolerance(False) rs.SetTolerance(tol) rs.Update() self._update(rs.GetOutput()) self.pipeline = utils.OperationNode( f"resample_data_from\n{source.__class__.__name__}", parents=[self, source] ) return self def add_ids(self): """Generate point and cell ids arrays.""" ids = vtk.vtkIdFilter() ids.SetInputData(self.inputdata()) ids.PointIdsOn() ids.CellIdsOn() ids.FieldDataOff() ids.SetPointIdsArrayName("PointID") ids.SetCellIdsArrayName("CellID") ids.Update() self._update(ids.GetOutput()) self.pipeline = utils.OperationNode("add_ids", parents=[self]) return self def gradient(self, input_array=None, on="points", fast=False): """ Compute and return the gradiend of the active scalar field as a numpy array. Arguments: input_array : (str) array of the scalars to compute the gradient, if None the current active array is selected on : (str) compute either on 'points' or 'cells' data fast : (bool) if True, will use a less accurate algorithm that performs fewer derivative calculations (and is therefore faster). Examples: - [isolines.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/isolines.py) ![](https://user-images.githubusercontent.com/32848391/72433087-f00a8780-3798-11ea-9778-991f0abeca70.png) """ gra = vtk.vtkGradientFilter() if on.startswith("p"): varr = self.inputdata().GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS else: varr = self.inputdata().GetCellData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS if input_array is None: if varr.GetScalars(): input_array = varr.GetScalars().GetName() else: vedo.logger.error(f"in gradient: no scalars found for {on}") raise RuntimeError gra.SetInputData(self.inputdata()) gra.SetInputScalars(tp, input_array) gra.SetResultArrayName("Gradient") gra.SetFasterApproximation(fast) gra.ComputeDivergenceOff() gra.ComputeVorticityOff() gra.ComputeGradientOn() gra.Update() if on.startswith("p"): gvecs = utils.vtk2numpy(gra.GetOutput().GetPointData().GetArray("Gradient")) else: gvecs = utils.vtk2numpy(gra.GetOutput().GetCellData().GetArray("Gradient")) return gvecs def divergence(self, array_name=None, on="points", fast=False): """ Compute and return the divergence of a vector field as a numpy array. Arguments: array_name : (str) name of the array of vectors to compute the divergence, if None the current active array is selected on : (str) compute either on 'points' or 'cells' data fast : (bool) if True, will use a less accurate algorithm that performs fewer derivative calculations (and is therefore faster). """ div = vtk.vtkGradientFilter() if on.startswith("p"): varr = self.inputdata().GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS else: varr = self.inputdata().GetCellData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS if array_name is None: if varr.GetVectors(): array_name = varr.GetVectors().GetName() else: vedo.logger.error(f"in divergence(): no vectors found for {on}") raise RuntimeError div.SetInputData(self.inputdata()) div.SetInputScalars(tp, array_name) div.ComputeDivergenceOn() div.ComputeGradientOff() div.ComputeVorticityOff() div.SetDivergenceArrayName("Divergence") div.SetFasterApproximation(fast) div.Update() if on.startswith("p"): dvecs = utils.vtk2numpy(div.GetOutput().GetPointData().GetArray("Divergence")) else: dvecs = utils.vtk2numpy(div.GetOutput().GetCellData().GetArray("Divergence")) return dvecs def vorticity(self, array_name=None, on="points", fast=False): """ Compute and return the vorticity of a vector field as a numpy array. Arguments: array_name : (str) name of the array to compute the vorticity, if None the current active array is selected on : (str) compute either on 'points' or 'cells' data fast : (bool) if True, will use a less accurate algorithm that performs fewer derivative calculations (and is therefore faster). """ vort = vtk.vtkGradientFilter() if on.startswith("p"): varr = self.inputdata().GetPointData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS else: varr = self.inputdata().GetCellData() tp = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS if array_name is None: if varr.GetVectors(): array_name = varr.GetVectors().GetName() else: vedo.logger.error(f"in vorticity(): no vectors found for {on}") raise RuntimeError vort.SetInputData(self.inputdata()) vort.SetInputScalars(tp, array_name) vort.ComputeDivergenceOff() vort.ComputeGradientOff() vort.ComputeVorticityOn() vort.SetVorticityArrayName("Vorticity") vort.SetFasterApproximation(fast) vort.Update() if on.startswith("p"): vvecs = utils.vtk2numpy(vort.GetOutput().GetPointData().GetArray("Vorticity")) else: vvecs = utils.vtk2numpy(vort.GetOutput().GetCellData().GetArray("Vorticity")) return vvecs @deprecated(reason=vedo.colors.red + "Please use method add_scalarbar()" + vedo.colors.reset) def addScalarBar(self, *a, **b): """Deprecated. Please use method `add_scalarbar()`""" return self.add_scalarbar(*a, **b) def add_scalarbar( self, title="", pos=(0.8, 0.05), title_yoffset=15, font_size=12, size=(None, None), nlabels=None, c=None, horizontal=False, use_alpha=True, label_format=":6.3g", ): """ Add a 2D scalar bar for the specified obj. Examples: - [mesh_coloring.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_coloring.py) - [scalarbars.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/scalarbars.py) """ plt = vedo.plotter_instance if plt and plt.renderer: c = (0.9, 0.9, 0.9) if np.sum(plt.renderer.GetBackground()) > 1.5: c = (0.1, 0.1, 0.1) if isinstance(self.scalarbar, vtk.vtkActor): plt.renderer.RemoveActor(self.scalarbar) elif isinstance(self.scalarbar, vedo.Assembly): for a in self.scalarbar.unpack(): plt.renderer.RemoveActor(a) if c is None: c = "gray" sb = vedo.addons.ScalarBar( self, title, pos, title_yoffset, font_size, size, nlabels, c, horizontal, use_alpha, label_format, ) self.scalarbar = sb return self @deprecated(reason=vedo.colors.red + "Please use method add_scalarbar3d()" + vedo.colors.reset) def addScalarBar3D(self, *a, **b): """Deprecated. Please use method `add_scalarbar3d()`""" return self.add_scalarbar3d(*a, **b) def add_scalarbar3d( self, title="", pos=None, size=(None, None), title_font="", title_xoffset=-1.5, title_yoffset=0.0, title_size=1.5, title_rotation=0.0, nlabels=9, label_font="", label_size=1, label_offset=0.375, label_rotation=0, label_format="", italic=0, c=None, draw_box=True, above_text=None, below_text=None, nan_text="NaN", categories=None, ): """ Associate a 3D scalar bar to the object and add it to the scene. The new scalarbar object (Assembly) will be accessible as obj.scalarbar Arguments: size : (list) (thickness, length) of scalarbar title : (str) scalar bar title title_xoffset : (float) horizontal space btw title and color scalarbar title_yoffset : (float) vertical space offset title_size : (float) size of title wrt numeric labels title_rotation : (float) title rotation in degrees nlabels : (int) number of numeric labels label_font : (str) font type for labels label_size : (float) label scale factor label_offset : (float) space btw numeric labels and scale label_rotation : (float) label rotation in degrees label_format : (str) label format for floats and integers (e.g. `':.2f'`) draw_box : (bool) draw a box around the colorbar categories : (list) make a categorical scalarbar, the input list will have the format `[value, color, alpha, textlabel]` Examples: - [scalarbars.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/scalarbars.py) """ plt = vedo.plotter_instance if plt and c is None: # automatic black or white c = (0.9, 0.9, 0.9) if np.sum(vedo.get_color(plt.backgrcol)) > 1.5: c = (0.1, 0.1, 0.1) if c is None: c = (0, 0, 0) c = vedo.get_color(c) self.scalarbar = vedo.addons.ScalarBar3D( self, title, pos, size, title_font, title_xoffset, title_yoffset, title_size, title_rotation, nlabels, label_font, label_size, label_offset, label_rotation, label_format, italic, c, draw_box, above_text, below_text, nan_text, categories, ) return self ################################################################################### def write(self, filename, binary=True): """Write object to file.""" out = vedo.file_io.write(self, filename, binary) out.pipeline = utils.OperationNode( "write", parents=[self], comment=filename[:15], shape="folder", c="#8a817c" ) return out ######################################################################################## class BaseGrid(BaseActor): """ Base class for grid datasets. .. warning:: Do not use this class to instantiate objects. """ def __init__(self): """Base class for grid datasets.""" super().__init__() self._data = None self.useCells = True self._color = None self._alpha = [0, 1] # ----------------------------------------------------------- def _update(self, data): self._data = data self._mapper.SetInputData(self.tomesh().polydata()) self._mapper.Modified() return self def tomesh(self, fill=True, shrink=1.0): """ Build a polygonal Mesh from the current Grid object. If `fill=True`, the interior faces of all the cells are created. (setting a `shrink` value slightly smaller than the default 1.0 can avoid flickering due to internal adjacent faces). If `fill=False`, only the boundary faces will be generated. """ gf = vtk.vtkGeometryFilter() if fill: sf = vtk.vtkShrinkFilter() sf.SetInputData(self._data) sf.SetShrinkFactor(shrink) sf.Update() gf.SetInputData(sf.GetOutput()) gf.Update() poly = gf.GetOutput() if shrink == 1.0: cleanPolyData = vtk.vtkCleanPolyData() cleanPolyData.PointMergingOn() cleanPolyData.ConvertLinesToPointsOn() cleanPolyData.ConvertPolysToLinesOn() cleanPolyData.ConvertStripsToPolysOn() cleanPolyData.SetInputData(poly) cleanPolyData.Update() poly = cleanPolyData.GetOutput() else: gf.SetInputData(self._data) gf.Update() poly = gf.GetOutput() msh = vedo.mesh.Mesh(poly).flat() msh.scalarbar = self.scalarbar lut = utils.ctf2lut(self) if lut: msh.mapper().SetLookupTable(lut) if self.useCells: msh.mapper().SetScalarModeToUseCellData() else: msh.mapper().SetScalarModeToUsePointData() msh.pipeline = utils.OperationNode( "tomesh", parents=[self], comment=f"fill={fill}", c="#9e2a2b:#e9c46a" ) return msh def cells(self): """ Get the cells connectivity ids as a numpy array. The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. """ arr1d = utils.vtk2numpy(self._data.GetCells().GetData()) if arr1d is None: return [] # Get cell connettivity ids as a 1D array. vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. i = 0 conn = [] n = len(arr1d) if n: while True: cell = [arr1d[i + k] for k in range(1, arr1d[i] + 1)] conn.append(cell) i += arr1d[i] + 1 if i >= n: break return conn def color(self, col, alpha=None, vmin=None, vmax=None): """ Assign a color or a set of colors along the range of the scalar value. A single constant color can also be assigned. Any matplotlib color map name is also accepted, e.g. `volume.color('jet')`. E.g.: say that your cells scalar runs from -3 to 6, and you want -3 to show red and 1.5 violet and 6 green, then just set: `volume.color(['red', 'violet', 'green'])` You can also assign a specific color to a aspecific value with eg.: `volume.color([(0,'red', (0.5,'violet'), (1,'green')])` Arguments: alpha : (list) use a list to specify transparencies along the scalar range vmin : (float) force the min of the scalar range to be this value vmax : (float) force the max of the scalar range to be this value """ # supersedes method in Points, Mesh if col is None: return self if vmin is None: vmin, _ = self._data.GetScalarRange() if vmax is None: _, vmax = self._data.GetScalarRange() ctf = self.GetProperty().GetRGBTransferFunction() ctf.RemoveAllPoints() self._color = col if utils.is_sequence(col): if utils.is_sequence(col[0]) and len(col[0]) == 2: # user passing [(value1, color1), ...] for x, ci in col: r, g, b = colors.get_color(ci) ctf.AddRGBPoint(x, r, g, b) # colors.printc('color at', round(x, 1), # 'set to', colors.get_color_name((r, g, b)), # c='w', bold=0) else: # user passing [color1, color2, ..] for i, ci in enumerate(col): r, g, b = colors.get_color(ci) x = vmin + (vmax - vmin) * i / (len(col) - 1) ctf.AddRGBPoint(x, r, g, b) elif isinstance(col, str): if col in colors.colors.keys() or col in colors.color_nicks.keys(): r, g, b = colors.get_color(col) ctf.AddRGBPoint(vmin, r, g, b) # constant color ctf.AddRGBPoint(vmax, r, g, b) else: # assume it's a colormap for x in np.linspace(vmin, vmax, num=64, endpoint=True): r, g, b = colors.color_map(x, name=col, vmin=vmin, vmax=vmax) ctf.AddRGBPoint(x, r, g, b) elif isinstance(col, int): r, g, b = colors.get_color(col) ctf.AddRGBPoint(vmin, r, g, b) # constant color ctf.AddRGBPoint(vmax, r, g, b) else: vedo.logger.warning(f"in color() unknown input type {type(col)}") if alpha is not None: self.alpha(alpha, vmin=vmin, vmax=vmax) return self def alpha(self, alpha, vmin=None, vmax=None): """ Assign a set of tranparencies along the range of the scalar value. A single constant value can also be assigned. E.g.: say `alpha=(0.0, 0.3, 0.9, 1)` and the scalar range goes from -10 to 150. Then all cells with a value close to -10 will be completely transparent, cells at 1/4 of the range will get an alpha equal to 0.3 and voxels with value close to 150 will be completely opaque. As a second option one can set explicit (x, alpha_x) pairs to define the transfer function. E.g.: say `alpha=[(-5, 0), (35, 0.4) (123,0.9)]` and the scalar range goes from -10 to 150. Then all cells below -5 will be completely transparent, cells with a scalar value of 35 will get an opacity of 40% and above 123 alpha is set to 90%. """ if vmin is None: vmin, _ = self._data.GetScalarRange() if vmax is None: _, vmax = self._data.GetScalarRange() otf = self.GetProperty().GetScalarOpacity() otf.RemoveAllPoints() self._alpha = alpha if utils.is_sequence(alpha): alpha = np.array(alpha) if len(alpha.shape) == 1: # user passing a flat list e.g. (0.0, 0.3, 0.9, 1) for i, al in enumerate(alpha): xalpha = vmin + (vmax - vmin) * i / (len(alpha) - 1) # Create transfer mapping scalar value to opacity otf.AddPoint(xalpha, al) # colors.printc("alpha at", round(xalpha, 1), "\tset to", al) elif len(alpha.shape) == 2: # user passing [(x0,alpha0), ...] otf.AddPoint(vmin, alpha[0][1]) for xalpha, al in alpha: # Create transfer mapping scalar value to opacity otf.AddPoint(xalpha, al) otf.AddPoint(vmax, alpha[-1][1]) else: otf.AddPoint(vmin, alpha) # constant alpha otf.AddPoint(vmax, alpha) return self def alpha_unit(self, u=None): """ Defines light attenuation per unit length. Default is 1. The larger the unit length, the further light has to travel to attenuate the same amount. E.g., if you set the unit distance to 0, you will get full opacity. It means that when light travels 0 distance it's already attenuated a finite amount. Thus, any finite distance should attenuate all light. The larger you make the unit distance, the more transparent the rendering becomes. """ if u is None: return self.GetProperty().GetScalarOpacityUnitDistance() self.GetProperty().SetScalarOpacityUnitDistance(u) return self def shrink(self, fraction=0.8): """ Shrink the individual cells to improve visibility. ![](https://vedo.embl.es/images/feats/shrink_hex.png) """ sf = vtk.vtkShrinkFilter() sf.SetInputData(self.inputdata()) sf.SetShrinkFactor(fraction) sf.Update() self._update(sf.GetOutput()) self.pipeline = utils.OperationNode( "shrink", comment=f"by {fraction}", parents=[self], c="#9e2a2b" ) return self def isosurface(self, value=None, flying_edges=True): """ Return an `Mesh` isosurface extracted from the `Volume` object. Set `value` as single float or list of values to draw the isosurface(s). Use flying_edges for faster results (but sometimes can interfere with `smooth()`). Examples: - [isosurfaces.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/isosurfaces.py) ![](https://vedo.embl.es/images/volumetric/isosurfaces.png) """ scrange = self._data.GetScalarRange() if flying_edges: cf = vtk.vtkFlyingEdges3D() cf.InterpolateAttributesOn() else: cf = vtk.vtkContourFilter() cf.UseScalarTreeOn() cf.SetInputData(self._data) cf.ComputeNormalsOn() if utils.is_sequence(value): cf.SetNumberOfContours(len(value)) for i, t in enumerate(value): cf.SetValue(i, t) else: if value is None: value = (2 * scrange[0] + scrange[1]) / 3.0 # print("automatic isosurface value =", value) cf.SetValue(0, value) cf.Update() poly = cf.GetOutput() out = vedo.mesh.Mesh(poly, c=None).phong() out.mapper().SetScalarRange(scrange[0], scrange[1]) out.pipeline = utils.OperationNode( "isosurface", parents=[self], comment=f"#pts {out.inputdata().GetNumberOfPoints()}", c="#4cc9f0:#e9c46a", ) return out def legosurface( self, vmin=None, vmax=None, invert=False, boundary=False, array_name="input_scalars" ): """ Represent an object - typically a `Volume` - as lego blocks (voxels). By default colors correspond to the volume's scalar. Returns an `Mesh` object. Arguments: vmin : (float) the lower threshold, voxels below this value are not shown. vmax : (float) the upper threshold, voxels above this value are not shown. boundary : (bool) controls whether to include cells that are partially inside array_name : (int, str) name or index of the scalar array to be considered Examples: - [legosurface.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/legosurface.py) ![](https://vedo.embl.es/images/volumetric/56820682-da40e500-684c-11e9-8ea3-91cbcba24b3a.png) """ dataset = vtk.vtkImplicitDataSet() dataset.SetDataSet(self._data) window = vtk.vtkImplicitWindowFunction() window.SetImplicitFunction(dataset) srng = list(self._data.GetScalarRange()) if vmin is not None: srng[0] = vmin if vmax is not None: srng[1] = vmax tol = 0.00001 * (srng[1] - srng[0]) srng[0] -= tol srng[1] += tol window.SetWindowRange(srng) extract = vtk.vtkExtractGeometry() extract.SetInputData(self._data) extract.SetImplicitFunction(window) extract.SetExtractInside(invert) extract.SetExtractBoundaryCells(boundary) extract.Update() gf = vtk.vtkGeometryFilter() gf.SetInputData(extract.GetOutput()) gf.Update() m = vedo.mesh.Mesh(gf.GetOutput()).lw(0.1).flat() m.map_points_to_cells() m.celldata.select(array_name) m.pipeline = utils.OperationNode( "legosurface", parents=[self], comment=f"array: {array_name}", c="#4cc9f0:#e9c46a" ) return m @deprecated(reason=vedo.colors.red + "Please use cut_with_plane()" + vedo.colors.reset) def cutWithPlane(self, origin=(0, 0, 0), normal=(1, 0, 0)): """Deprecated. Please use cut_with_plane()""" return self.cut_with_plane(origin, normal) def cut_with_plane(self, origin=(0, 0, 0), normal="x"): """ Cut the object with the plane defined by a point and a normal. Arguments: origin : (list) the cutting plane goes through this point normal : (list, str) normal vector to the cutting plane """ strn = str(normal) if strn == "x": normal = (1, 0, 0) elif strn == "y": normal = (0, 1, 0) elif strn == "z": normal = (0, 0, 1) elif strn == "-x": normal = (-1, 0, 0) elif strn == "-y": normal = (0, -1, 0) elif strn == "-z": normal = (0, 0, -1) plane = vtk.vtkPlane() plane.SetOrigin(origin) plane.SetNormal(normal) clipper = vtk.vtkClipDataSet() clipper.SetInputData(self._data) clipper.SetClipFunction(plane) clipper.GenerateClipScalarsOff() clipper.GenerateClippedOutputOff() clipper.SetValue(0) clipper.Update() cout = clipper.GetOutput() self._update(cout) self.pipeline = utils.OperationNode("cut_with_plane", parents=[self], c="#9e2a2b") return self def cut_with_box(self, box): """ Cut the grid with the specified bounding box. Parameter box has format [xmin, xmax, ymin, ymax, zmin, zmax]. If an object is passed, its bounding box are used. Example: ```python from vedo import * tetmesh = TetMesh(dataurl+'limb_ugrid.vtk') tetmesh.color('rainbow') cu = Cube(side=500).x(500) # any Mesh works tetmesh.cut_with_box(cu).show(axes=1) ``` ![](https://vedo.embl.es/images/feats/tet_cut_box.png) """ bc = vtk.vtkBoxClipDataSet() bc.SetInputData(self._data) if isinstance(box, vtk.vtkProp): boxb = box.GetBounds() else: boxb = box bc.SetBoxClip(*boxb) bc.Update() self._update(bc.GetOutput()) self.pipeline = utils.OperationNode("cut_with_box", parents=[self, box], c="#9e2a2b") return self def cut_with_mesh(self, mesh, invert=False, whole_cells=False, only_boundary=False): """ Cut a UGrid, TetMesh or Volume with a Mesh. Use `invert` to return cut off part of the input object. """ polymesh = mesh.polydata() ug = self._data ippd = vtk.vtkImplicitPolyDataDistance() ippd.SetInput(polymesh) if whole_cells or only_boundary: clipper = vtk.vtkExtractGeometry() clipper.SetInputData(ug) clipper.SetImplicitFunction(ippd) clipper.SetExtractInside(not invert) clipper.SetExtractBoundaryCells(False) if only_boundary: clipper.SetExtractBoundaryCells(True) clipper.SetExtractOnlyBoundaryCells(True) else: signedDistances = vtk.vtkFloatArray() signedDistances.SetNumberOfComponents(1) signedDistances.SetName("SignedDistances") for pointId in range(ug.GetNumberOfPoints()): p = ug.GetPoint(pointId) signedDistance = ippd.EvaluateFunction(p) signedDistances.InsertNextValue(signedDistance) ug.GetPointData().AddArray(signedDistances) ug.GetPointData().SetActiveScalars("SignedDistances") clipper = vtk.vtkClipDataSet() clipper.SetInputData(ug) clipper.SetInsideOut(not invert) clipper.SetValue(0.0) clipper.Update() cug = clipper.GetOutput() if ug.GetCellData().GetScalars(): # not working scalname = ug.GetCellData().GetScalars().GetName() if scalname: # not working if self.useCells: self.celldata.select(scalname) else: self.pointdata.select(scalname) self._update(cug) self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self, mesh], c="#9e2a2b") return self def extract_cells_on_plane(self, origin, normal): """ Extract cells that are lying of the specified surface. """ bf = vtk.vtk3DLinearGridCrinkleExtractor() bf.SetInputData(self._data) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() plane = vtk.vtkPlane() plane.SetOrigin(origin) plane.SetNormal(normal) bf.SetImplicitFunction(plane) bf.Update() self._update(bf.GetOutput()) self.pipeline = utils.OperationNode( "extract_cells_on_plane", parents=[self], comment=f"#cells {self._data.GetNumberOfCells()}", c="#9e2a2b", ) return self def extract_cells_on_sphere(self, center, radius): """ Extract cells that are lying of the specified surface. """ bf = vtk.vtk3DLinearGridCrinkleExtractor() bf.SetInputData(self._data) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() sph = vtk.vtkSphere() sph.SetRadius(radius) sph.SetCenter(center) bf.SetImplicitFunction(sph) bf.Update() self._update(bf.GetOutput()) self.pipeline = utils.OperationNode( "extract_cells_on_sphere", parents=[self], comment=f"#cells {self._data.GetNumberOfCells()}", c="#9e2a2b", ) return self def extract_cells_on_cylinder(self, center, axis, radius): """ Extract cells that are lying of the specified surface. """ bf = vtk.vtk3DLinearGridCrinkleExtractor() bf.SetInputData(self._data) bf.CopyPointDataOn() bf.CopyCellDataOn() bf.RemoveUnusedPointsOff() cyl = vtk.vtkCylinder() cyl.SetRadius(radius) cyl.SetCenter(center) cyl.SetAxis(axis) bf.SetImplicitFunction(cyl) bf.Update() self.pipeline = utils.OperationNode( "extract_cells_on_cylinder", parents=[self], comment=f"#cells {self._data.GetNumberOfCells()}", c="#9e2a2b", ) self._update(bf.GetOutput()) return self def clean(self): """ Cleanup unused points and empty cells """ cl = vtk.vtkStaticCleanUnstructuredGrid() cl.SetInputData(self._data) cl.RemoveUnusedPointsOn() cl.ProduceMergeMapOff() cl.AveragePointDataOff() cl.Update() self._update(cl.GetOutput()) self.pipeline = utils.OperationNode( "clean", parents=[self], comment=f"#cells {self._data.GetNumberOfCells()}", c="#9e2a2b" ) return self def find_cell(self, p): """Locate the cell that contains a point and return the cell ID.""" cell = vtk.vtkTetra() cellId = vtk.mutable(0) tol2 = vtk.mutable(0) subId = vtk.mutable(0) pcoords = [0, 0, 0] weights = [0, 0, 0] cid = self._data.FindCell(p, cell, cellId, tol2, subId, pcoords, weights) return cid def extract_cells_by_id(self, idlist, use_point_ids=False): """Return a new UGrid composed of the specified subset of indices.""" selectionNode = vtk.vtkSelectionNode() if use_point_ids: selectionNode.SetFieldType(vtk.vtkSelectionNode.POINT) contcells = vtk.vtkSelectionNode.CONTAINING_CELLS() selectionNode.GetProperties().Set(contcells, 1) else: selectionNode.SetFieldType(vtk.vtkSelectionNode.CELL) selectionNode.SetContentType(vtk.vtkSelectionNode.INDICES) vidlist = utils.numpy2vtk(idlist, dtype="id") selectionNode.SetSelectionList(vidlist) selection = vtk.vtkSelection() selection.AddNode(selectionNode) es = vtk.vtkExtractSelection() es.SetInputData(0, self._data) es.SetInputData(1, selection) es.Update() ug = vedo.ugrid.UGrid(es.GetOutput()) pr = vtk.vtkProperty() pr.DeepCopy(self.GetProperty()) ug.SetProperty(pr) ug.property = pr # assign the same transformation to the copy ug.SetOrigin(self.GetOrigin()) ug.SetScale(self.GetScale()) ug.SetOrientation(self.GetOrientation()) ug.SetPosition(self.GetPosition()) ug.mapper().SetLookupTable(utils.ctf2lut(self)) ug.pipeline = utils.OperationNode( "extract_cells_by_id", parents=[self], comment=f"#cells {self._data.GetNumberOfCells()}", c="#9e2a2b", ) return ug ############################################################################### funcs def _getinput(obj): if isinstance(obj, (vtk.vtkVolume, vtk.vtkActor)): return obj.GetMapper().GetInput() return obj def probe_points(dataset, pts): """ Takes a `Volume` (or any other vtk data set) and probes its scalars at the specified points in space. Note that a mask is also output with valid/invalid points which can be accessed with `mesh.pointdata['vtkValidPointMask']`. Examples: - [probe_points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_points.py) ![](https://vedo.embl.es/images/volumetric/probePoints.png) """ if isinstance(pts, vedo.pointcloud.Points): pts = pts.points() def _readpoints(): output = src.GetPolyDataOutput() points = vtk.vtkPoints() for p in pts: x, y, z = p points.InsertNextPoint(x, y, z) output.SetPoints(points) cells = vtk.vtkCellArray() cells.InsertNextCell(len(pts)) for i in range(len(pts)): cells.InsertCellPoint(i) output.SetVerts(cells) src = vtk.vtkProgrammableSource() src.SetExecuteMethod(_readpoints) src.Update() img = _getinput(dataset) probeFilter = vtk.vtkProbeFilter() probeFilter.SetSourceData(img) probeFilter.SetInputConnection(src.GetOutputPort()) probeFilter.Update() poly = probeFilter.GetOutput() pm = vedo.mesh.Mesh(poly) pm.name = "ProbePoints" pm.pipeline = utils.OperationNode("probe_points", parents=[dataset]) return pm def probe_line(dataset, p1, p2, res=100): """ Takes a `Volume` (or any other vtk data set) and probes its scalars along a line defined by 2 points `p1` and `p2`. Note that a mask is also output with valid/invalid points which can be accessed with `mesh.pointdata['vtkValidPointMask']`. Use `res` to set the nr of points along the line Examples: - [probe_line1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line1.py) - [probe_line2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/probe_line2.py) ![](https://vedo.embl.es/images/volumetric/probeLine2.png) """ line = vtk.vtkLineSource() line.SetResolution(res) line.SetPoint1(p1) line.SetPoint2(p2) img = _getinput(dataset) probeFilter = vtk.vtkProbeFilter() probeFilter.SetSourceData(img) probeFilter.SetInputConnection(line.GetOutputPort()) probeFilter.Update() poly = probeFilter.GetOutput() lnn = vedo.mesh.Mesh(poly) lnn.name = "ProbeLine" lnn.pipeline = utils.OperationNode("probe_line", parents=[dataset]) return lnn def probe_plane(dataset, origin=(0, 0, 0), normal=(1, 0, 0)): """ Takes a `Volume` (or any other vtk data set) and probes its scalars on a plane defined by a point and a normal. Examples: - [slice_plane1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane1.py) - [slice_plane2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane2.py) ![](https://vedo.embl.es/images/volumetric/slicePlane2.png) """ img = _getinput(dataset) plane = vtk.vtkPlane() plane.SetOrigin(origin) plane.SetNormal(normal) planeCut = vtk.vtkCutter() planeCut.SetInputData(img) planeCut.SetCutFunction(plane) planeCut.Update() poly = planeCut.GetOutput() cutmesh = vedo.mesh.Mesh(poly) cutmesh.name = "ProbePlane" cutmesh.pipeline = utils.OperationNode("probe_plane", parents=[dataset]) return cutmesh vedo-2023.4.6/vedo/cli.py000066400000000000000000001042431444463326400150010ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Command Line Interface module ----------------------------- The library includes a handy Command Line Interface. # For a list of options type: vedo -h # Some useful bash aliases: # alias v='vedo ' alias vr='vedo --run ' # to search and run examples by name alias vs='vedo -i --search ' # to search for a string in examples alias vdoc='vedo -i --search-code' # to search for a string in source code alias ve='vedo --eog ' # to view single and multiple images # alias vv='vedo -bg blackboard -bg2 gray3 -z 1.05 -k glossy -c blue9 ' """ import argparse import glob import os import sys import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo from vedo.utils import humansort from vedo.utils import is_sequence from vedo.utils import print_info from vedo import __version__ from vedo import file_io from vedo import load from vedo import settings from vedo.colors import get_color, printc from vedo.mesh import Mesh from vedo.picture import Picture from vedo.plotter import Plotter from vedo.tetmesh import TetMesh from vedo.ugrid import UGrid from vedo.volume import Volume from vedo import applications __all__ = [] ############################################################################################## def execute_cli(): parser = get_parser() args = parser.parse_args() if "/vedo/vedo" in vedo.installdir: vedo.installdir = vedo.installdir.replace("vedo/", "") if "\\vedo\\vedo" in vedo.installdir: vedo.installdir = vedo.installdir.replace("vedo\\", "") if args.info is not None: system_info() elif args.run: exe_run(args) elif args.search: exe_search(args) elif args.search_vtk: exe_search_vtk(args) elif args.search_code: exe_search_code(args) elif args.convert: exe_convert(args) elif args.eog: exe_eog(args) elif len(args.files) == 0: system_info() printc( ":idea: No input files. Try:\n> vedo https://vedo.embl.es/examples/data/panther.stl.gz", c="y", ) else: draw_scene(args) ############################################################################################## def get_parser(): descr = f"version {__version__}" descr += " - check out home page at https://vedo.embl.es" pr = argparse.ArgumentParser(description=descr) pr.add_argument('files', nargs='*', help="input filename(s)") pr.add_argument("-c", "--color", type=str, help="mesh color [integer or color name]", default=None, metavar='') pr.add_argument("-a", "--alpha", type=float, help="alpha value [0-1]", default=1, metavar='') pr.add_argument("-w", "--wireframe", help="use wireframe representation", action="store_true") pr.add_argument("-p", "--point-size", type=float, help="specify point size", default=-1, metavar='') pr.add_argument("-l", "--showedges", help="show a thin line on mesh edges", action="store_true") pr.add_argument("-k", "--lighting", type=str, help="metallic, plastic, shiny, glossy or off", default='default', metavar='') pr.add_argument("-K", "--flat", help="use flat shading", action="store_true") pr.add_argument("-t", "--texture-file", help="texture image file", default='', metavar='') pr.add_argument("-x", "--axes-type", type=int, help="specify axes type [0-14]", default=1, metavar='') pr.add_argument("-i", "--no-camera-share", help="do not share camera in renderers", action="store_true") pr.add_argument("-f", "--full-screen", help="full screen mode", action="store_true") pr.add_argument("-bg","--background", type=str, help="background color [integer or color name]", default='', metavar='') pr.add_argument("-bg2", "--background-grad", help="use background color gradient", default='', metavar='') pr.add_argument("-z", "--zoom", type=float, help="zooming factor", default=1, metavar='') pr.add_argument("-n", "--multirenderer-mode", help="multi renderer mode: files go to separate renderers", action="store_true") pr.add_argument("-s", "--sequence-mode", help="sequence mode: use slider to browse files", action="store_true") pr.add_argument("-g", "--ray-cast-mode", help="GPU Ray-casting Mode for 3D image files", action="store_true") pr.add_argument("-gx", "--x-spacing", type=float, help="volume x-spacing factor [1]", default=1, metavar='') pr.add_argument("-gy", "--y-spacing", type=float, help="volume y-spacing factor [1]", default=1, metavar='') pr.add_argument("-gz", "--z-spacing", type=float, help="volume z-spacing factor [1]", default=1, metavar='') pr.add_argument("--mode", help="volume rendering style (composite/maxproj/...)", default=0, metavar='') pr.add_argument("--cmap", help="volume rendering color map name", default='jet', metavar='') pr.add_argument("-e", "--edit", help="free-hand edit the input Mesh", action="store_true") pr.add_argument("--slicer2d", help="2D Slicer Mode for volumetric data", action="store_true") pr.add_argument("--slicer3d", help="3D Slicer Mode for volumetric data", action="store_true") pr.add_argument("-r", "--run", help="run example from vedo/examples", metavar='') pr.add_argument("--search", type=str, help="search/grep for word in vedo examples", default='', metavar='') pr.add_argument("--search-vtk", type=str, help="search examples for the input vtk class", default='', metavar='') pr.add_argument("--search-code", type=str, help="search keyword in source code", default='', metavar='') pr.add_argument("--reload", help="reload the file, ignoring any previous download", action="store_true") pr.add_argument("--info", nargs='*', help="get an info printout of the input file(s)") pr.add_argument("--convert", nargs='*', help="input file(s) to be converted") pr.add_argument("--to", type=str, help="convert to this target format", default='vtk', metavar='') pr.add_argument("--image", help="image mode for 2d objects", action="store_true") pr.add_argument("--eog", help="eog-like image visualizer", action="store_true") pr.add_argument("--font", help="font name", default="Normografo", metavar='') return pr ################################################################################################# def system_info(): for i in range(2, len(sys.argv)): file = sys.argv[i] try: A = load(file) if isinstance(A, np.ndarray): print_info(A) elif is_sequence(A): for a in A: print_info(a) else: print_info(A) except: vedo.logger.error(f"Could not load {file}, skip.") printc("_" * 65, bold=0) printc("vedo version :", __version__, invert=1, end=" ") printc("https://vedo.embl.es", underline=1, italic=1) printc("vtk version :", vtk.vtkVersion().GetVTKVersion()) printc("numpy version :", np.__version__) printc("python version :", sys.version.replace("\n", "")) printc("python interpreter:", sys.executable) printc("vedo installation :", vedo.installdir) try: import platform printc( "system :", platform.system(), platform.release(), os.name, platform.machine(), ) except ModuleNotFoundError: pass try: from screeninfo import get_monitors for m in get_monitors(): pr = " " if m.is_primary: pr = "(primary)" printc(f"monitor {pr} : {m.name}, resolution=({m.width}, {m.height}), x={m.x}, y={m.y}") except ModuleNotFoundError: printc('monitor : info is unavailable. Try "pip install screeninfo".') try: import k3d printc("k3d version :", k3d.__version__, bold=0, dim=1) except ModuleNotFoundError: pass # try: # import trame # printc("trame version :", trame.__version__, bold=0, dim=1) # except ModuleNotFoundError: # pass ################################################################################################# def exe_run(args): expath = os.path.join(vedo.installdir, "examples", "**", "*.py") exfiles = list(glob.glob(expath, recursive=True)) f2search = os.path.basename(args.run).lower() matching = [ s for s in exfiles if ( f2search in os.path.basename(s).lower() and "__" not in s and "dolfin" not in s and "trimesh" not in s ) ] matching = list(sorted(matching)) nmat = len(matching) if nmat == 0: printc(f":sad: No matching example found containing string: {args.run}", c=1) printc(" Current installation directory is:", vedo.installdir, c=1) sys.exit(1) if nmat > 1: printc(f"\n:target: Found {nmat} matching scripts:", c="y", italic=1) args.full_screen = True # to print out the one line description if args.full_screen: # -f option not to dump the full code but just the first line for mat in matching[:25]: printc(os.path.basename(mat).replace(".py", ""), c="y", italic=1, end=" ") with open(mat, "r", encoding="UTF-8") as fm: lline = "".join(fm.readlines(60)) lline = lline.replace("\n", " ").replace("'", "").replace('"', "").replace("-", "") line = lline[:56] # cut if line.startswith("from"): line = "" if line.startswith("import"): line = "" if len(lline) > len(line): line += ".." if len(line) > 5: printc("-", line, c="y", bold=0, italic=1) else: print() if nmat > 25: printc("...", c="y") if nmat > 1: sys.exit(0) if not args.full_screen: # -f option not to dump the full code with open(matching[0], "r", encoding="UTF-8") as fm: code = fm.read() code = "#" * 80 + "\n" + code + "\n" + "#" * 80 from pygments import highlight from pygments.lexers import Python3Lexer from pygments.formatters import Terminal256Formatter # from pygments.styles import STYLE_MAP # print(STYLE_MAP.keys()) result = highlight(code, Python3Lexer(), Terminal256Formatter(style="zenburn")) print(result, end="") printc("(" + matching[0] + ")", c="y", bold=0, italic=1) os.system("python " + matching[0]) ################################################################################################ def exe_convert(args): allowedexts = [ "vtk", "vtp", "vtu", "vts", "npy", "ply", "stl", "obj", "byu", "xml", "vti", "tif", "mhd", "xml", ] humansort(args.convert) nfiles = len(args.convert) if nfiles == 0: sys.exit() target_ext = args.to.lower() if target_ext not in allowedexts: printc(f":sad: Sorry target cannot be {target_ext}\nMust be {allowedexts}", c=1) sys.exit() for f in args.convert: source_ext = f.split(".")[-1] if target_ext == source_ext: continue a = load(f) newf = f.replace("." + source_ext, "") + "." + target_ext a.write(newf, binary=True) ############################################################################################## def exe_search(args): expath = os.path.join(vedo.installdir, "examples", "**", "*.py") exfiles = list(sorted(glob.glob(expath, recursive=True))) pattern = args.search if args.no_camera_share: pattern = pattern.lower() if len(pattern) > 3: for ifile in exfiles: if "dolfin" in ifile: continue if "trimesh" in ifile: continue with open(ifile, "r", encoding="UTF-8") as file: fflag = True for i, line in enumerate(file): if args.no_camera_share: bline = line.lower() else: bline = line if pattern in bline: if fflag: name = os.path.basename(ifile) try: etype = ifile.split("/")[-2] printc( "--> examples/" + etype + "/" + name + ":", c="y", italic=1, invert=1, ) except IndexError: etype = ifile.split("\\")[-2] printc( "--> examples\\" + etype + "\\" + name + ":", c="y", italic=1, invert=1, ) fflag = False line = line.replace( pattern, "\x1b[4m\x1b[1m" + pattern + "\x1b[0m\u001b[33m" ) print(f"\u001b[33m{i}\t{line}\x1b[0m", end="") # printc(i, line, c='o', bold=False, end='') else: printc("Please use at least 4 letters in keyword search!", c="r") ############################################################################################## def exe_search_code(args): import inspect from pygments import highlight from pygments.lexers import Python3Lexer from pygments.formatters import Terminal256Formatter # styles: autumn, material, rrt, zenburn style = "zenburn" key = args.search_code iopt = args.no_camera_share if key.lower() == key: iopt = True if len(key) < 4: printc("Please use at least 4 letters in keyword search!", c="r") return def _dump(mcontent): for name, mm in mcontent: if name.startswith("_"): continue if name.startswith("vtk"): continue # if not inspect.isfunction(mm): # continue try: mmdoc = inspect.getsource(mm) except TypeError: return if mmdoc is None: continue if iopt: # -i option to ignore case mmdoc_lower = mmdoc.lower() key_lower = key.lower() name_lower = name.lower() else: mmdoc_lower = mmdoc key_lower = key name_lower = name if "eprecated" in mmdoc_lower: continue if key_lower in name_lower: sname = inspect.getmodule(mm).__name__ + " -> " + name if sname in snames: continue snames.append(sname) printc( ":checked:Found matching", mm, "in module", os.path.basename(inspect.getfile(mm)), c="y", invert=True, ) mmdoc = mmdoc.replace("``", '"').replace("`", '"') mmdoc = mmdoc.replace(".. warning::", "Warning!") result = highlight(mmdoc, Python3Lexer(), Terminal256Formatter(style=style)) idcomment = result.rfind('"""') print(result[: idcomment + 3], "\x1b[0m\n") # printc("..parsing source code, please wait", c="y", bold=False) content = inspect.getmembers(vedo) snames = [] for name, m in content: if name.startswith("_"): continue if not inspect.isclass(m) and not inspect.isfunction(m): continue if inspect.isbuiltin(m): continue # if name != "Points": continue # test # printc("---", name, str(m), c='r') # function case _dump([[name, m]]) # class case mcontent = inspect.getmembers(m) _dump(mcontent) ############################################################################################## def exe_search_vtk(args): # input a vtk class name to get links to examples that involve that class # From https://kitware.github.io/vtk-examples/site/Python/Utilities/SelectExamples/ import json import tempfile from datetime import datetime from pathlib import Path from urllib.error import HTTPError from urllib.request import urlretrieve xref_url = "https://raw.githubusercontent.com/Kitware/vtk-examples/gh-pages/src/Coverage/vtk_vtk-examples_xref.json" def download_file(dl_path, dl_url, overwrite=False): file_name = dl_url.split("/")[-1] # Create necessary sub-directories in the dl_path (if they don't exist). Path(dl_path).mkdir(parents=True, exist_ok=True) # Download if it doesn't exist in the directory overriding if overwrite is True. path = Path(dl_path, file_name) if not path.is_file() or overwrite: try: urlretrieve(dl_url, path) except HTTPError as e: raise RuntimeError(f"Failed to download {dl_url}. {e.reason}") return path def get_examples(d, vtk_class, lang): try: kv = d[vtk_class][lang].items() except KeyError as e: print(f"For the combination {vtk_class} and {lang}, this key does not exist: {e}") return None, None total = len(kv) samples = list(kv) return total, [f"{s[1]}" for s in samples] vtk_class, language, all_values, number = args.search_vtk, "Python", True, 10000 tmp_dir = tempfile.gettempdir() path = download_file(tmp_dir, xref_url, overwrite=False) if not path.is_file(): print(f"The path: {str(path)} does not exist.") dt = datetime.today().timestamp() - os.path.getmtime(path) # Force a new download if the time difference is > 10 minutes. if dt > 600: path = download_file(tmp_dir, xref_url, overwrite=True) with open(path, "r", encoding="UTF-8") as json_file: xref_dict = json.load(json_file) total_number, examples = get_examples(xref_dict, vtk_class, language) if examples: if total_number <= number or all_values: print( f"VTK Class: {vtk_class}, language: {language}\n" f"Number of example(s): {total_number}." ) else: print( f"VTK Class: {vtk_class}, language: {language}\n" f"Number of example(s): {total_number} with {number} random sample(s) shown." ) print("\n".join(examples)) else: print(f"No examples for the VTK Class: {vtk_class} and language: {language}") ################################################################################################################# def exe_eog(args): # print("EOG emulator") settings.immediate_rendering = False settings.use_parallel_projection = True settings.enable_default_mouse_callbacks = False settings.enable_default_keyboard_callbacks = False if args.background == "": args.background = "white" if args.background_grad: args.background_grad = get_color(args.background_grad) files = [] for s in sys.argv: if "--" in s or s.endswith(".py") or s.endswith("vedo"): continue if s.endswith(".gif"): continue files.append(s) def vfunc(event): # print(event.keypress) for p in pics: if event.keypress == "r": p.window(win).level(lev) elif event.keypress == "Up": p.level(p.level() + 10) elif event.keypress == "Down": p.level(p.level() - 10) if event.keypress == "Right": p.window(p.window() + 10) elif event.keypress == "Down": p.window(p.window() - 10) elif event.keypress == "m": p.mirror() elif event.keypress == "t": p.rotate(90) elif event.keypress == "f": p.flip() elif event.keypress == "b": p.binarize() elif event.keypress == "i": p.invert() elif event.keypress == "I": plt.color_picker(event.picked2d, verbose=True) elif event.keypress == "k": p.enhance() elif event.keypress == "s": p.smooth(sigma=1) elif event.keypress == "S": ahl = plt.hover_legends[-1] plt.remove(ahl) plt.screenshot() # writer printc(":camera: Picture saved as screenshot.png") plt.add(ahl) return elif event.keypress == "h": printc("---------------------------------------------") printc("Press:") printc(" up/down to modify level (or drag mouse)") printc(" left/right to modify window") printc(" m to mirror image horizontally") printc(" f to flip image vertically") printc(" t to rotate image by 90 deg") printc(" i to invert colors") printc(" I to pick the color under mouse") printc(" b to binarize the image") printc(" k to enhance b&w image") printc(" s to apply gaussian smoothing") printc(" S to save image as png") printc("---------------------------------------------") plt.render() pics = [] for f in files: if os.path.isfile(f): try: pic = Picture(f) if pic: pics.append(pic) except: vedo.logger.error(f"Could not load image {f}") else: vedo.logger.error(f"Could not load image {f}") n = len(pics) if not n: return pic = pics[0] lev, win = pic.level(), pic.window() if n > 1: plt = Plotter(N=n, sharecam=True, bg=args.background, bg2=args.background_grad) plt.add_callback("key press", vfunc) for i in range(n): p = pics[i].pickable(True) pos = [-p.shape[0] / 2, -p.shape[1] / 2, 0] p.pos(pos) plt.add_hover_legend(at=i, c="k8", bg="k2", alpha=0.4) plt.show(p, axes=0, at=i, mode="image") plt.show(interactive=False) plt.reset_camera(tight=0.05) plt.interactor.Start() if vedo.vtk_version == (9, 2, 2): plt.interactor.GetRenderWindow().SetDisplayId("_0_p_void") else: shape = pic.shape if shape[0] > 1500: shape[1] = shape[1] / shape[0] * 1500 shape[0] = 1500 if shape[1] > 1200: shape[0] = shape[0] / shape[1] * 1200 shape[1] = 1200 plt = Plotter(title=files[0], size=shape, bg=args.background, bg2=args.background_grad) plt.add_callback("key press", vfunc) plt.add_hover_legend(c="k8", bg="k2", alpha=0.4) plt.show(pic, mode="image", interactive=False) plt.reset_camera(tight=0.0) plt.interactor.Start() if vedo.vtk_version == (9, 2, 2): plt.interactor.GetRenderWindow().SetDisplayId("_0_p_void") plt.close() ################################################################################################################# def draw_scene(args): nfiles = len(args.files) if nfiles == 0: printc("No input files.", c="r") return humansort(args.files) wsize = "auto" if args.full_screen: wsize = "full" if args.ray_cast_mode: if args.background == "": args.background = "bb" if args.background == "": args.background = "white" if args.background_grad: args.background_grad = get_color(args.background_grad) if nfiles == 1 and args.files[0].endswith(".gif"): ###can be improved frames = load(args.files[0]) applications.Browser(frames).show(bg=args.background, bg2=args.background_grad) return ########################################################## if args.sequence_mode: args.multirenderer_mode = False settings.default_font = args.font sharecam = args.no_camera_share N = None if args.multirenderer_mode: if nfiles < 201: N = nfiles if nfiles > 200: printc(":lightning: Warning: option '-n' allows a maximum of 200 files", c=1) printc(" you are trying to load ", nfiles, " files.\n", c=1) N = 200 if N > 4: settings.use_depth_peeling = False plt = Plotter(size=wsize, N=N, bg=args.background, bg2=args.background_grad, sharecam=sharecam) settings.immediate_rendering = False plt.axes = args.axes_type for i in range(N): plt.add_hover_legend(at=i) if args.axes_type in (4, 5): plt.axes = 0 else: N = nfiles plt = Plotter(size=wsize, bg=args.background, bg2=args.background_grad) plt.axes = args.axes_type plt.add_hover_legend() wire = False if args.wireframe: wire = True ########################################################## # special case of SLC/TIFF volumes with -g option if args.ray_cast_mode: # print('DEBUG special case of SLC/TIFF volumes with -g option') vol = file_io.load(args.files[0], force=args.reload) if not isinstance(vol, Volume): vedo.logger.error(f"expected a Volume but loaded a {type(vol)} object") return sp = vol.spacing() vol.spacing([sp[0] * args.x_spacing, sp[1] * args.y_spacing, sp[2] * args.z_spacing]) vol.mode(int(args.mode)).color(args.cmap).jittering(True) vol.lighting(args.lighting) plt = applications.RayCastPlotter(vol) plt.show(viewup="z", interactive=True).close() return ########################################################## # special case of SLC/TIFF/DICOM volumes with --slicer3d option elif args.slicer3d: # print('DEBUG special case of SLC/TIFF/DICOM volumes with --slicer3d option') useSlider3D = False if args.axes_type == 4: args.axes_type = 1 elif args.axes_type == 3: args.axes_type = 1 useSlider3D = True vol = file_io.load(args.files[0], force=args.reload) sp = vol.spacing() vol.spacing([sp[0] * args.x_spacing, sp[1] * args.y_spacing, sp[2] * args.z_spacing]) vedo.plotter_instance = None # reset plt = applications.Slicer3DPlotter( vol, bg="white", bg2="lb", use_slider3d=useSlider3D, cmaps=[args.cmap, "Spectral_r", "hot_r", "bone_r", "gist_ncar_r"], alpha=args.alpha, axes=args.axes_type, clamp=True, size=(1000, 800), ) return ######################################################################## elif args.edit: # print('edit mode for meshes and pointclouds') vedo.plotter_instance = None # reset settings.use_parallel_projection = True try: m = Mesh(args.files[0], alpha=args.alpha / 2, c=args.color) except AttributeError: vedo.logger.critical( "In edit mode, input file must be a point cloud or polygonal mesh." ) return plt = applications.FreeHandCutPlotter(m, splined=True) plt.add_hover_legend() if not args.background_grad: args.background_grad = None plt.start(axes=1, bg=args.background, bg2=args.background_grad) ######################################################################## elif args.slicer2d: # print('DEBUG special case of SLC/TIFF/DICOM volumes with --slicer2d option') vol = file_io.load(args.files[0], force=args.reload) if not vol: return vol.cmap("bone_r") sp = vol.spacing() vol.spacing([sp[0] * args.x_spacing, sp[1] * args.y_spacing, sp[2] * args.z_spacing]) vedo.plotter_instance = None # reset plt = applications.Slicer2DPlotter(vol, axes=7) plt.close() return ######################################################################## # normal mode for single VOXEL file with Isosurface Slider mode elif nfiles == 1 and ( ".slc" in args.files[0].lower() or ".vti" in args.files[0].lower() or ".tif" in args.files[0].lower() or ".mhd" in args.files[0].lower() or ".nrrd" in args.files[0].lower() or ".dem" in args.files[0].lower() ): # print('DEBUG normal mode for single VOXEL file with Isosurface Slider mode') vol = file_io.load(args.files[0], force=args.reload) sp = vol.spacing() vol.spacing([sp[0] * args.x_spacing, sp[1] * args.y_spacing, sp[2] * args.z_spacing]) if not args.color: args.color = "gold" plt = applications.IsosurfaceBrowser( vol, c=args.color, cmap=args.cmap, precompute=False, progress=True, use_gpu=True, ) plt.show(zoom=args.zoom, viewup="z") return ######################################################################## # NORMAL mode for single or multiple files, or multiren mode, or numpy scene elif nfiles == 1 or (not args.sequence_mode): # print('DEBUG NORMAL mode for single or multiple files, or multiren mode') interactor_mode = 0 if args.image: interactor_mode = "image" ########################################################## # loading a full scene if ".npy" in args.files[0] or ".npz" in args.files[0] and nfiles == 1: objct = file_io.load(args.files[0], force=args.reload) if isinstance(objct, Plotter): # loading a full scene objct.show(mode=interactor_mode) else: # loading a set of meshes plt.show(objct, mode=interactor_mode) return ######################################################### ds = 0 actors = [] for i in range(N): f = args.files[i] colb = args.color if args.color is None and N > 1: colb = i actor = load(f, force=args.reload) if isinstance(actor, (TetMesh, UGrid)): actor = actor.tomesh().shrink(0.975).c(colb).alpha(args.alpha) elif isinstance(actor, vedo.Points): actor.c(colb).alpha(args.alpha).wireframe(wire).lighting(args.lighting) if args.flat: actor.flat() else: actor.phong() if i == 0 and args.texture_file: actor.texture(args.texture_file) if args.point_size > 0: actor.ps(args.point_size) if args.cmap != "jet": actor.cmap(args.cmap) if args.showedges: try: actor.GetProperty().SetEdgeVisibility(1) actor.GetProperty().SetLineWidth(0.1) actor.GetProperty().SetRepresentationToSurface() except AttributeError: pass actors.append(actor) if args.multirenderer_mode: try: ds = actor.diagonal_size() * 3 plt.camera.SetClippingRange(0, ds) plt.show(actor, at=i, interactive=False, zoom=args.zoom, mode=interactor_mode) plt.actors = actors except AttributeError: # wildcards in quotes make glob return actor as a list :( vedo.logger.error("Please do not use wildcards within single or double quotes") if args.multirenderer_mode: plt.interactor.Start() if vedo.vtk_version == (9, 2, 2): plt.interactor.GetRenderWindow().SetDisplayId("_0_p_void") else: # scene is empty if all(a is None for a in actors): vedo.logger.error("Could not load file(s). Quit.") return plt.show(actors, interactive=True, zoom=args.zoom, mode=interactor_mode) return ######################################################################## # sequence mode -s else: # print("DEBUG simple browser mode -s") if plt.axes == 4: plt.axes = 1 acts = load(args.files, force=args.reload) plt += acts for a in acts: if hasattr(a, "c"): # Picture doesnt have it a.c(args.color) if args.point_size > 0: try: a.GetProperty().SetPointSize(args.point_size) a.GetProperty().SetRepresentationToPoints() except AttributeError: pass if args.cmap != "jet": try: a.cmap(args.cmap) except AttributeError: pass try: a.lighting(args.lighting) except AttributeError: pass a.alpha(args.alpha) plt = applications.Browser(acts, axes=1) plt.show(zoom=args.zoom).close() vedo-2023.4.6/vedo/cmaps.py000066400000000000000000011232231444463326400153350ustar00rootroot00000000000000cmaps = { "Accent": [ "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#7fc97f", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#beaed4", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#fdc086", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#386cb0", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#f0027f", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#bf5b16", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666" ], "Blues": [ "#f7fbff", "#f6fafe", "#f5f9fe", "#f4f9fe", "#f3f8fd", "#f3f8fd", "#f2f7fd", "#f1f7fd", "#f0f6fc", "#eff6fc", "#eff5fc", "#eef5fc", "#edf4fb", "#ecf4fb", "#ecf3fb", "#ebf3fb", "#eaf2fa", "#e9f2fa", "#e8f1fa", "#e8f1fa", "#e7f0f9", "#e6f0f9", "#e5eff9", "#e4eff9", "#e4eef8", "#e3eef8", "#e2edf8", "#e1edf8", "#e1ecf7", "#e0ecf7", "#dfebf7", "#deebf7", "#ddeaf6", "#ddeaf6", "#dce9f6", "#dbe9f6", "#dae8f5", "#dae8f5", "#d9e7f5", "#d8e7f5", "#d7e6f4", "#d7e6f4", "#d6e5f4", "#d5e5f4", "#d4e4f3", "#d4e4f3", "#d3e3f3", "#d2e3f3", "#d1e2f2", "#d1e2f2", "#d0e1f2", "#cfe1f2", "#cee0f1", "#cee0f1", "#cddff1", "#ccdff1", "#cbdef0", "#cbdef0", "#caddf0", "#c9ddf0", "#c8dcef", "#c8dcef", "#c7dbef", "#c6dbef", "#c5daee", "#c4daee", "#c3d9ee", "#c1d9ed", "#c0d8ed", "#bfd8ec", "#bed7ec", "#bcd7eb", "#bbd6eb", "#bad6ea", "#b9d5ea", "#b7d4ea", "#b6d4e9", "#b5d3e9", "#b4d3e8", "#b2d2e8", "#b1d2e7", "#b0d1e7", "#afd1e6", "#add0e6", "#acd0e6", "#abcfe5", "#aacfe5", "#a8cee4", "#a7cee4", "#a6cde3", "#a5cde3", "#a3cce3", "#a2cbe2", "#a1cbe2", "#a0cae1", "#9ecae1", "#9dc9e0", "#9bc8e0", "#9ac7e0", "#98c7df", "#97c6df", "#95c5df", "#93c4de", "#92c3de", "#90c2de", "#8fc1dd", "#8dc0dd", "#8bc0dd", "#8abfdc", "#88bedc", "#87bddc", "#85bcdb", "#83bbdb", "#82badb", "#80b9da", "#7fb8da", "#7db8d9", "#7bb7d9", "#7ab6d9", "#78b5d8", "#77b4d8", "#75b3d8", "#73b2d7", "#72b1d7", "#70b1d7", "#6fb0d6", "#6dafd6", "#6baed6", "#6aadd5", "#69acd5", "#67abd4", "#66aad4", "#65aad3", "#63a9d3", "#62a8d2", "#61a7d2", "#60a6d1", "#5ea5d1", "#5da4d0", "#5ca3d0", "#5aa3cf", "#59a2cf", "#58a1ce", "#57a0ce", "#559fcd", "#549ecd", "#539dcc", "#519ccc", "#509bcb", "#4f9bcb", "#4e9aca", "#4c99ca", "#4b98c9", "#4a97c9", "#4896c8", "#4795c8", "#4694c7", "#4594c7", "#4393c6", "#4292c6", "#4191c5", "#4090c5", "#3f8fc4", "#3e8ec4", "#3d8dc3", "#3c8cc3", "#3b8bc2", "#3a8ac1", "#3989c1", "#3888c0", "#3787c0", "#3585bf", "#3484bf", "#3383be", "#3282be", "#3181bd", "#3080bd", "#2f7fbc", "#2e7ebc", "#2d7dbb", "#2c7cbb", "#2b7bba", "#2a7ab9", "#2979b9", "#2878b8", "#2777b8", "#2676b7", "#2575b7", "#2474b6", "#2373b6", "#2272b5", "#2171b5", "#2070b4", "#1f6fb3", "#1e6eb2", "#1e6db2", "#1d6cb1", "#1c6bb0", "#1b6aaf", "#1a69ae", "#1a68ae", "#1967ad", "#1866ac", "#1765ab", "#1764ab", "#1663aa", "#1562a9", "#1461a8", "#1360a7", "#135fa7", "#125ea6", "#115da5", "#105ca4", "#0f5ba3", "#0f5aa3", "#0e59a2", "#0d58a1", "#0c57a0", "#0c56a0", "#0b559f", "#0a549e", "#09539d", "#08529c", "#08519c", "#08509a", "#084f99", "#084e97", "#084c96", "#084b94", "#084a92", "#084991", "#08488f", "#08478e", "#08468c", "#08458b", "#084489", "#084388", "#084286", "#084185", "#084083", "#083f82", "#083e80", "#083d7e", "#083c7d", "#083b7b", "#083a7a", "#083978", "#083877", "#083775", "#083674", "#083572", "#083471", "#08336f", "#08326e", "#08316c", "#08306b" ], "BrBG": [ "#543005", "#563105", "#583205", "#5a3305", "#5c3505", "#5e3605", "#613706", "#633906", "#653a06", "#673b06", "#693c06", "#6c3e07", "#6e3f07", "#704007", "#724207", "#744307", "#774408", "#794508", "#7b4708", "#7d4808", "#7f4908", "#824b09", "#844c09", "#864d09", "#884f09", "#8a5009", "#8d510a", "#8f530c", "#91550d", "#93570e", "#955910", "#975b11", "#995d12", "#9b5f14", "#9d6115", "#9f6217", "#a16418", "#a36619", "#a5681b", "#a76a1c", "#a96c1d", "#ab6e1f", "#ad7020", "#af7122", "#b17323", "#b37524", "#b57726", "#b77927", "#b97b28", "#bb7d2a", "#bd7f2b", "#bf812d", "#c08330", "#c18633", "#c28836", "#c48b39", "#c58d3c", "#c6903f", "#c79242", "#c99546", "#ca9749", "#cb9a4c", "#cc9d4f", "#ce9f52", "#cfa255", "#d0a458", "#d1a75c", "#d3a95f", "#d4ac62", "#d5ae65", "#d6b168", "#d8b36b", "#d9b66e", "#dab972", "#dbbb75", "#ddbe78", "#dec07b", "#dfc27e", "#e0c481", "#e1c583", "#e2c786", "#e3c889", "#e3ca8c", "#e4cb8e", "#e5cd91", "#e6ce94", "#e7d097", "#e8d199", "#e9d39c", "#ead49f", "#ebd6a2", "#ecd7a4", "#ecd9a7", "#eddaaa", "#eedcad", "#efddaf", "#f0dfb2", "#f1e0b5", "#f2e2b8", "#f3e3ba", "#f4e5bd", "#f5e6c0", "#f6e8c3", "#f5e8c4", "#f5e9c6", "#f5e9c8", "#f5eaca", "#f5eacc", "#f5ebce", "#f5ebd0", "#f5ecd2", "#f5ecd4", "#f5edd6", "#f5edd8", "#f5eeda", "#f5eedc", "#f5efde", "#f5efe0", "#f5f0e2", "#f5f0e4", "#f5f1e6", "#f5f1e8", "#f5f2ea", "#f5f2ec", "#f5f3ee", "#f5f3f0", "#f5f4f2", "#f5f4f4", "#f4f4f4", "#f2f4f4", "#f0f3f3", "#eef3f2", "#ecf3f2", "#ebf2f1", "#e9f2f0", "#e7f1f0", "#e5f1ef", "#e3f0ef", "#e2f0ee", "#e0f0ed", "#deefed", "#dcefec", "#daeeeb", "#d9eeeb", "#d7edea", "#d5edea", "#d3ede9", "#d1ece8", "#d0ece8", "#ceebe7", "#ccebe6", "#caeae6", "#c8eae5", "#c7eae5", "#c4e8e3", "#c1e7e2", "#bee6e0", "#bbe5df", "#b9e4dd", "#b6e3dc", "#b3e2db", "#b0e0d9", "#addfd8", "#abded6", "#a8ddd5", "#a5dcd4", "#a2dbd2", "#a0dad1", "#9dd8cf", "#9ad7ce", "#97d6cd", "#94d5cb", "#92d4ca", "#8fd3c8", "#8cd2c7", "#89d0c5", "#86cfc4", "#84cec3", "#81cdc1", "#7ecbc0", "#7bc9be", "#78c7bc", "#75c5ba", "#72c3b8", "#6fc1b6", "#6cbfb4", "#69bdb2", "#67bbb0", "#64b8ae", "#61b6ac", "#5eb4aa", "#5bb2a8", "#58b0a6", "#55aea4", "#52aca2", "#4faaa0", "#4ca79e", "#49a59c", "#46a39a", "#43a198", "#409f96", "#3d9d94", "#3a9b92", "#379990", "#35978f", "#32958d", "#30938b", "#2e9189", "#2c8f87", "#2a8d85", "#288b83", "#268981", "#24877f", "#22857d", "#20837b", "#1e8179", "#1c7f77", "#1a7e76", "#187c74", "#167a72", "#147870", "#12766e", "#10746c", "#0e726a", "#0c7068", "#0a6e66", "#086c64", "#066a62", "#046860", "#02665e", "#00655d", "#00635b", "#006159", "#006057", "#005e55", "#005c54", "#005b52", "#005950", "#00584e", "#00564c", "#00544b", "#005349", "#005147", "#004f45", "#004e43", "#004c42", "#004a40", "#00493e", "#00473c", "#00453a", "#004439", "#004237", "#004035", "#003f33", "#003d31", "#003c30" ], "BuGn": [ "#f7fcfd", "#f6fbfc", "#f5fbfc", "#f5fbfc", "#f4fbfc", "#f4fafc", "#f3fafc", "#f3fafc", "#f2fafb", "#f1fafb", "#f1f9fb", "#f0f9fb", "#f0f9fb", "#eff9fb", "#eff8fb", "#eef8fb", "#edf8fa", "#edf8fa", "#ecf8fa", "#ecf7fa", "#ebf7fa", "#ebf7fa", "#eaf7fa", "#eaf6fa", "#e9f6f9", "#e8f6f9", "#e8f6f9", "#e7f6f9", "#e7f5f9", "#e6f5f9", "#e6f5f9", "#e5f5f9", "#e4f4f8", "#e4f4f8", "#e3f4f7", "#e2f4f7", "#e1f3f6", "#e0f3f5", "#e0f3f5", "#dff2f4", "#def2f4", "#ddf2f3", "#ddf2f2", "#dcf1f2", "#dbf1f1", "#daf1f1", "#d9f1f0", "#d9f0ef", "#d8f0ef", "#d7f0ee", "#d6efee", "#d6efed", "#d5efed", "#d4efec", "#d3eeeb", "#d2eeeb", "#d2eeea", "#d1edea", "#d0ede9", "#cfede8", "#ceede8", "#ceece7", "#cdece7", "#ccece6", "#cbebe5", "#caebe4", "#c8eae3", "#c6e9e3", "#c5e9e2", "#c3e8e1", "#c2e8e0", "#c0e7df", "#bee6de", "#bde6dd", "#bbe5dc", "#bae4db", "#b8e4da", "#b6e3d9", "#b5e3d9", "#b3e2d8", "#b2e1d7", "#b0e1d6", "#aee0d5", "#addfd4", "#abdfd3", "#aaded2", "#a8ded1", "#a6ddd0", "#a5dccf", "#a3dccf", "#a2dbce", "#a0dacd", "#9edacc", "#9dd9cb", "#9bd9ca", "#9ad8c9", "#98d7c8", "#96d7c7", "#95d6c6", "#93d5c5", "#92d4c3", "#90d4c2", "#8ed3c1", "#8dd2c0", "#8bd2bf", "#8ad1be", "#88d0bc", "#86d0bb", "#85cfba", "#83ceb9", "#82ceb8", "#80cdb7", "#7eccb5", "#7dccb4", "#7bcbb3", "#7acab2", "#78c9b1", "#76c9b0", "#75c8af", "#73c7ad", "#72c7ac", "#70c6ab", "#6ec5aa", "#6dc5a9", "#6bc4a8", "#6ac3a6", "#68c3a5", "#66c2a4", "#65c1a3", "#64c1a1", "#63c0a0", "#61bf9e", "#60bf9d", "#5fbe9c", "#5ebd9a", "#5dbd99", "#5cbc97", "#5abc96", "#59bb94", "#58ba93", "#57ba91", "#56b990", "#55b88f", "#54b88d", "#52b78c", "#51b78a", "#50b689", "#4fb587", "#4eb586", "#4db484", "#4bb383", "#4ab382", "#49b280", "#48b27f", "#47b17d", "#46b07c", "#44b07a", "#43af79", "#42ae77", "#41ae76", "#40ad75", "#3fac73", "#3eab71", "#3daa70", "#3ca86e", "#3ba76d", "#3aa66b", "#39a56a", "#38a468", "#37a367", "#37a265", "#36a164", "#35a062", "#349f61", "#339d5f", "#329c5d", "#319b5c", "#309a5a", "#2f9959", "#2e9857", "#2d9756", "#2c9654", "#2b9553", "#2a9451", "#299250", "#28914e", "#27904d", "#278f4b", "#268e49", "#258d48", "#248c46", "#238b45", "#228a44", "#218943", "#1f8842", "#1e8742", "#1d8641", "#1c8540", "#1b843f", "#1a833e", "#19823e", "#18813d", "#17803c", "#167f3b", "#157e3a", "#137e3a", "#127d39", "#117c38", "#107b37", "#0f7a37", "#0e7936", "#0d7835", "#0c7734", "#0b7633", "#0a7533", "#087432", "#077331", "#067230", "#057130", "#04702f", "#036f2e", "#026f2d", "#016e2c", "#006d2c", "#006b2b", "#006a2b", "#00692a", "#006829", "#006629", "#006528", "#006428", "#006227", "#006127", "#006026", "#005f26", "#005d25", "#005c25", "#005b24", "#005924", "#005823", "#005723", "#005622", "#005421", "#005321", "#005220", "#005020", "#004f1f", "#004e1f", "#004d1e", "#004b1e", "#004a1d", "#00491d", "#00471c", "#00461c", "#00451b", "#00441b" ], "BuPu": [ "#f7fcfd", "#f6fbfc", "#f5fafc", "#f4fafc", "#f4f9fb", "#f3f9fb", "#f2f8fb", "#f1f8fb", "#f1f7fa", "#f0f7fa", "#eff6fa", "#eff6f9", "#eef5f9", "#edf5f9", "#ecf4f9", "#ecf4f8", "#ebf3f8", "#eaf3f8", "#eaf2f7", "#e9f2f7", "#e8f1f7", "#e7f1f7", "#e7f0f6", "#e6f0f6", "#e5eff6", "#e4eff5", "#e4eef5", "#e3eef5", "#e2edf5", "#e2edf4", "#e1ecf4", "#e0ecf4", "#dfebf3", "#deebf3", "#ddeaf3", "#dce9f2", "#dbe8f2", "#dae7f1", "#d9e7f1", "#d8e6f0", "#d7e5f0", "#d6e4ef", "#d5e4ef", "#d4e3ef", "#d3e2ee", "#d2e1ee", "#d1e0ed", "#d0e0ed", "#cfdfec", "#cedeec", "#cdddec", "#ccddeb", "#cbdceb", "#cadbea", "#c9daea", "#c8d9e9", "#c7d9e9", "#c5d8e8", "#c4d7e8", "#c3d6e8", "#c2d5e7", "#c1d5e7", "#c0d4e6", "#bfd3e6", "#bed2e5", "#bdd2e5", "#bcd1e5", "#bbd0e4", "#bacfe4", "#b9cfe4", "#b8cee3", "#b7cde3", "#b6cde2", "#b5cce2", "#b4cbe2", "#b3cae1", "#b2cae1", "#b1c9e1", "#b0c8e0", "#afc7e0", "#aec7df", "#adc6df", "#acc5df", "#abc5de", "#aac4de", "#a9c3de", "#a7c2dd", "#a6c2dd", "#a5c1dc", "#a4c0dc", "#a3c0dc", "#a2bfdb", "#a1bedb", "#a0bdda", "#9fbdda", "#9ebcda", "#9dbbd9", "#9dbad9", "#9cb9d8", "#9cb7d7", "#9bb6d7", "#9ab5d6", "#9ab4d6", "#99b3d5", "#99b2d4", "#98b0d4", "#98afd3", "#97aed2", "#97add2", "#96acd1", "#95aad0", "#95a9d0", "#94a8cf", "#94a7cf", "#93a6ce", "#93a4cd", "#92a3cd", "#91a2cc", "#91a1cb", "#90a0cb", "#909eca", "#8f9dca", "#8f9cc9", "#8e9bc8", "#8d9ac8", "#8d98c7", "#8c97c6", "#8c96c6", "#8c95c5", "#8c93c5", "#8c92c4", "#8c91c3", "#8c8fc3", "#8c8ec2", "#8c8dc1", "#8c8bc1", "#8c8ac0", "#8c89bf", "#8c87bf", "#8c86be", "#8c85bd", "#8c83bd", "#8c82bc", "#8c81bb", "#8c7fbb", "#8c7eba", "#8c7db9", "#8c7bb9", "#8c7ab8", "#8c78b7", "#8c77b7", "#8c76b6", "#8c74b5", "#8c73b5", "#8c72b4", "#8c70b3", "#8c6fb3", "#8c6eb2", "#8c6cb1", "#8c6bb1", "#8b6ab0", "#8b68af", "#8b67af", "#8b66ae", "#8b64ae", "#8b63ad", "#8b62ac", "#8b60ac", "#8a5fab", "#8a5eaa", "#8a5daa", "#8a5ba9", "#8a5aa9", "#8a59a8", "#8a57a7", "#8a56a7", "#8955a6", "#8953a5", "#8952a5", "#8951a4", "#894fa4", "#894ea3", "#894da2", "#894ba2", "#884aa1", "#8849a0", "#8847a0", "#88469f", "#88459f", "#88439e", "#88429d", "#88419d", "#873f9c", "#873e9b", "#873c9a", "#873b99", "#863998", "#863797", "#863696", "#863494", "#863393", "#853192", "#853091", "#852e90", "#852c8f", "#842b8e", "#84298d", "#84288c", "#84268b", "#84258a", "#832389", "#832288", "#832087", "#831e86", "#831d85", "#821b84", "#821a83", "#821882", "#821781", "#811580", "#81137f", "#81127e", "#81107d", "#810f7c", "#7f0e7a", "#7d0e79", "#7c0d77", "#7a0d76", "#790c74", "#770c72", "#750b71", "#740b6f", "#720a6e", "#700a6c", "#6f096b", "#6d0969", "#6b0868", "#6a0866", "#680865", "#670763", "#650762", "#630660", "#62065e", "#60055d", "#5e055b", "#5d045a", "#5b0458", "#5a0357", "#580355", "#560254", "#550252", "#530151", "#51014f", "#50004e", "#4e004c", "#4d004b" ], "CMRmap": [ "#000000", "#010104", "#020208", "#03030c", "#040410", "#060614", "#070718", "#08081c", "#090920", "#0a0a24", "#0c0c28", "#0d0d2c", "#0e0e30", "#0f0f34", "#101038", "#12123c", "#131340", "#141444", "#151548", "#16164c", "#181850", "#191954", "#1a1a58", "#1b1b5c", "#1c1c60", "#1e1e64", "#1f1f68", "#20206c", "#212170", "#222274", "#242478", "#25257c", "#26267f", "#272681", "#282683", "#2a2685", "#2b2687", "#2c2689", "#2d268b", "#2e268d", "#30268f", "#312691", "#322693", "#332695", "#342697", "#352699", "#37269b", "#38269d", "#39269f", "#3a26a1", "#3c26a3", "#3d26a5", "#3e26a7", "#3f26a9", "#4026ab", "#4126ad", "#4326af", "#4426b1", "#4526b3", "#4626b5", "#4826b7", "#4926b9", "#4a26bb", "#4b26bd", "#4d26be", "#4f26bc", "#5127ba", "#5427b8", "#5627b6", "#5928b4", "#5b28b2", "#5d29b0", "#6029ae", "#6229ac", "#652aaa", "#672aa8", "#692ba6", "#6c2ba4", "#6e2ba2", "#712ca0", "#732c9e", "#752d9c", "#782d9a", "#7a2d98", "#7d2e96", "#7f2e94", "#812f92", "#842f90", "#862f8e", "#89308c", "#8b308a", "#8d3188", "#903186", "#923184", "#953282", "#973280", "#9a337e", "#9d337b", "#a03378", "#a33476", "#a73473", "#aa3570", "#ad356d", "#b0356a", "#b33668", "#b73665", "#ba3762", "#bd375f", "#c0375c", "#c3385a", "#c73857", "#ca3954", "#cd3951", "#d0394e", "#d33a4c", "#d73a49", "#da3b46", "#dd3b43", "#e03b40", "#e33c3e", "#e73c3b", "#ea3d38", "#ed3d35", "#f03d32", "#f33e30", "#f73e2d", "#fa3f2a", "#fd3f27", "#fe4025", "#fd4224", "#fd4423", "#fc4622", "#fb4820", "#fa4a1f", "#f94c1e", "#f94e1d", "#f8501c", "#f7521a", "#f65419", "#f55618", "#f55817", "#f45a16", "#f35c14", "#f25e13", "#f16012", "#f16211", "#f06410", "#ef660e", "#ee680d", "#ed6a0c", "#ed6c0b", "#ec6e0a", "#eb7008", "#ea7207", "#e97406", "#e97605", "#e87804", "#e77a02", "#e67c01", "#e57e00", "#e58000", "#e58201", "#e58402", "#e58602", "#e58803", "#e58a04", "#e58c05", "#e58e06", "#e59006", "#e59207", "#e59408", "#e59609", "#e5980a", "#e59a0a", "#e59c0b", "#e59e0c", "#e5a00d", "#e5a20e", "#e5a40e", "#e5a60f", "#e5a810", "#e5aa11", "#e5ac12", "#e5ae12", "#e5b013", "#e5b214", "#e5b415", "#e5b616", "#e5b816", "#e5ba17", "#e5bc18", "#e5be19", "#e5c01b", "#e5c11f", "#e5c222", "#e5c325", "#e5c428", "#e5c62b", "#e5c72f", "#e5c832", "#e5c935", "#e5ca38", "#e5cc3b", "#e5cd3f", "#e5ce42", "#e5cf45", "#e5d048", "#e5d24b", "#e5d34f", "#e5d452", "#e5d555", "#e5d658", "#e5d85b", "#e5d95f", "#e5da62", "#e5db65", "#e5dc68", "#e5de6b", "#e5df6f", "#e5e072", "#e5e175", "#e5e278", "#e5e47b", "#e5e57f", "#e6e683", "#e7e787", "#e7e78b", "#e8e88f", "#e9e992", "#eaea97", "#ebeb9b", "#ebeb9f", "#ececa3", "#ededa7", "#eeeeab", "#efefaf", "#efefb3", "#f0f0b7", "#f1f1bb", "#f2f2bf", "#f3f3c3", "#f3f3c7", "#f4f4cb", "#f5f5cf", "#f6f6d2", "#f7f7d7", "#f7f7db", "#f8f8df", "#f9f9e3", "#fafae7", "#fbfbeb", "#fbfbef", "#fcfcf3", "#fdfdf7", "#fefefb", "#ffffff" ], "Dark2": [ "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#1b9e77", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#d95f02", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#7570b3", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#e7298a", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#66a61e", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#e6ab02", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#a6761d", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666", "#666666" ], "GnBu": [ "#f7fcf0", "#f6fbef", "#f5fbee", "#f4fbee", "#f4faed", "#f3faec", "#f2faec", "#f1faeb", "#f1f9ea", "#f0f9ea", "#eff9e9", "#eff8e8", "#eef8e8", "#edf8e7", "#ecf8e6", "#ecf7e6", "#ebf7e5", "#eaf7e4", "#eaf6e4", "#e9f6e3", "#e8f6e2", "#e7f6e2", "#e7f5e1", "#e6f5e0", "#e5f5e0", "#e4f4df", "#e4f4de", "#e3f4de", "#e2f4dd", "#e2f3dc", "#e1f3dc", "#e0f3db", "#dff2da", "#dff2da", "#def2d9", "#def2d8", "#ddf1d8", "#dcf1d7", "#dcf1d6", "#dbf1d6", "#daf0d5", "#daf0d4", "#d9f0d4", "#d9f0d3", "#d8efd2", "#d7efd1", "#d7efd1", "#d6efd0", "#d5eecf", "#d5eecf", "#d4eece", "#d4eecd", "#d3edcd", "#d2edcc", "#d2edcb", "#d1edcb", "#d0ecca", "#d0ecc9", "#cfecc8", "#ceecc8", "#ceebc7", "#cdebc6", "#cdebc6", "#ccebc5", "#cbeac4", "#caeac4", "#c9eac3", "#c8e9c3", "#c7e9c2", "#c6e8c2", "#c4e8c1", "#c3e7c1", "#c2e7c0", "#c1e6c0", "#c0e6bf", "#bfe6bf", "#bee5be", "#bde5be", "#bbe4bd", "#bae4bd", "#b9e3bc", "#b8e3bc", "#b7e2bb", "#b6e2bb", "#b5e2ba", "#b4e1ba", "#b2e1b9", "#b1e0b9", "#b0e0b8", "#afdfb8", "#aedfb7", "#addfb7", "#acdeb6", "#aadeb6", "#a9ddb5", "#a8ddb5", "#a7dcb5", "#a6dcb5", "#a4dbb6", "#a3dbb6", "#a1dab7", "#a0dab7", "#9fd9b8", "#9dd9b8", "#9cd8b8", "#9ad8b9", "#99d7b9", "#97d6ba", "#96d6ba", "#95d5bb", "#93d5bb", "#92d4bc", "#90d4bc", "#8fd3bd", "#8ed3bd", "#8cd2be", "#8bd2be", "#89d1bf", "#88d1bf", "#87d0c0", "#85d0c0", "#84cfc0", "#82cec1", "#81cec1", "#7fcdc2", "#7ecdc2", "#7dccc3", "#7bccc3", "#7acbc4", "#78cac4", "#77cac5", "#76c9c5", "#74c8c6", "#73c7c6", "#71c6c7", "#70c6c7", "#6fc5c8", "#6dc4c8", "#6cc3c8", "#6ac2c9", "#69c2c9", "#67c1ca", "#66c0ca", "#65bfcb", "#63bfcb", "#62becc", "#60bdcc", "#5fbccd", "#5ebbcd", "#5cbbce", "#5bbace", "#59b9cf", "#58b8cf", "#57b8d0", "#55b7d0", "#54b6d0", "#52b5d1", "#51b4d1", "#4fb4d2", "#4eb3d2", "#4db2d2", "#4cb1d1", "#4bafd1", "#4aaed0", "#48adcf", "#47accf", "#46aace", "#45a9cd", "#44a8cd", "#43a7cc", "#42a6cb", "#41a4cb", "#40a3ca", "#3fa2ca", "#3da1c9", "#3c9fc8", "#3b9ec8", "#3a9dc7", "#399cc6", "#389ac6", "#3799c5", "#3698c4", "#3597c4", "#3496c3", "#3294c2", "#3193c2", "#3092c1", "#2f91c0", "#2e8fc0", "#2d8ebf", "#2c8dbe", "#2b8cbe", "#2a8bbd", "#298abd", "#2788bc", "#2687bb", "#2586bb", "#2485ba", "#2384ba", "#2283b9", "#2182b9", "#2080b8", "#1f7fb7", "#1e7eb7", "#1d7db6", "#1b7cb6", "#1a7bb5", "#197ab5", "#1879b4", "#1777b3", "#1676b3", "#1575b2", "#1474b2", "#1373b1", "#1272b1", "#1071b0", "#0f70b0", "#0e6eaf", "#0d6dae", "#0c6cae", "#0b6bad", "#0a6aad", "#0969ac", "#0868ac", "#0866aa", "#0865a9", "#0864a8", "#0863a6", "#0861a5", "#0860a4", "#085fa2", "#085ea1", "#085ca0", "#085b9e", "#085a9d", "#08599b", "#08579a", "#085699", "#085597", "#085496", "#085295", "#085193", "#085092", "#084f91", "#084d8f", "#084c8e", "#084b8d", "#084a8b", "#08488a", "#084789", "#084687", "#084586", "#084385", "#084283", "#084182", "#084081" ], "Greens": [ "#f7fcf5", "#f6fbf4", "#f5fbf3", "#f5fbf3", "#f4fbf2", "#f4faf1", "#f3faf1", "#f3faf0", "#f2faef", "#f1faef", "#f1f9ee", "#f0f9ed", "#f0f9ed", "#eff9ec", "#eff8eb", "#eef8eb", "#edf8ea", "#edf8e9", "#ecf8e9", "#ecf7e8", "#ebf7e7", "#ebf7e7", "#eaf7e6", "#eaf6e5", "#e9f6e5", "#e8f6e4", "#e8f6e3", "#e7f6e3", "#e7f5e2", "#e6f5e1", "#e6f5e1", "#e5f5e0", "#e4f4df", "#e3f4de", "#e3f4dd", "#e2f3dc", "#e1f3db", "#e0f3da", "#dff2d9", "#def2d8", "#ddf1d7", "#dcf1d6", "#dbf1d5", "#daf0d4", "#d9f0d3", "#d8f0d2", "#d7efd1", "#d6efd0", "#d5eecf", "#d4eece", "#d3eecd", "#d3edcc", "#d2edcb", "#d1edca", "#d0ecc9", "#cfecc8", "#ceebc7", "#cdebc6", "#ccebc5", "#cbeac4", "#caeac3", "#c9eac2", "#c8e9c1", "#c7e9c0", "#c6e8bf", "#c5e8be", "#c4e7bd", "#c3e7bc", "#c1e6bb", "#c0e6b9", "#bfe5b8", "#bee5b7", "#bde4b6", "#bbe4b5", "#bae3b4", "#b9e3b2", "#b8e2b1", "#b7e2b0", "#b6e1af", "#b4e1ae", "#b3e0ad", "#b2e0ab", "#b1dfaa", "#b0dfa9", "#aedea8", "#addea7", "#acdda6", "#abdda5", "#aadca3", "#a8dca2", "#a7dba1", "#a6dba0", "#a5da9f", "#a4da9e", "#a2d99c", "#a1d99b", "#a0d89a", "#9fd899", "#9dd798", "#9cd697", "#9ad695", "#99d594", "#98d493", "#96d492", "#95d391", "#93d290", "#92d28e", "#90d18d", "#8fd08c", "#8ed08b", "#8ccf8a", "#8bce89", "#89ce87", "#88cd86", "#87cc85", "#85cc84", "#84cb83", "#82ca82", "#81ca81", "#80c97f", "#7ec87e", "#7dc87d", "#7bc77c", "#7ac67b", "#78c67a", "#77c578", "#76c477", "#74c476", "#73c375", "#71c274", "#70c274", "#6ec173", "#6cc072", "#6bbf71", "#69be70", "#68be70", "#66bd6f", "#64bc6e", "#63bb6d", "#61ba6c", "#60ba6c", "#5eb96b", "#5cb86a", "#5bb769", "#59b769", "#58b668", "#56b567", "#54b466", "#53b365", "#51b365", "#50b264", "#4eb163", "#4cb062", "#4bb061", "#49af61", "#48ae60", "#46ad5f", "#44ac5e", "#43ac5e", "#41ab5d", "#40aa5c", "#3fa95b", "#3ea85b", "#3da75a", "#3ca659", "#3ba558", "#3aa458", "#39a357", "#38a256", "#37a155", "#37a055", "#369f54", "#359e53", "#349d52", "#339c51", "#329b51", "#319a50", "#30994f", "#2f984e", "#2e974e", "#2d964d", "#2c954c", "#2b944b", "#2a934b", "#29924a", "#289149", "#279048", "#278f48", "#268e47", "#258d46", "#248c45", "#238b45", "#228a44", "#218943", "#1f8842", "#1e8742", "#1d8641", "#1c8540", "#1b843f", "#1a833e", "#19823e", "#18813d", "#17803c", "#167f3b", "#157e3a", "#137e3a", "#127d39", "#117c38", "#107b37", "#0f7a37", "#0e7936", "#0d7835", "#0c7734", "#0b7633", "#0a7533", "#087432", "#077331", "#067230", "#057130", "#04702f", "#036f2e", "#026f2d", "#016e2c", "#006d2c", "#006b2b", "#006a2b", "#00692a", "#006829", "#006629", "#006528", "#006428", "#006227", "#006127", "#006026", "#005f26", "#005d25", "#005c25", "#005b24", "#005924", "#005823", "#005723", "#005622", "#005421", "#005321", "#005220", "#005020", "#004f1f", "#004e1f", "#004d1e", "#004b1e", "#004a1d", "#00491d", "#00471c", "#00461c", "#00451b", "#00441b" ], "Greys": [ "#ffffff", "#fefefe", "#fefefe", "#fdfdfd", "#fdfdfd", "#fcfcfc", "#fcfcfc", "#fbfbfb", "#fbfbfb", "#fafafa", "#fafafa", "#f9f9f9", "#f9f9f9", "#f8f8f8", "#f8f8f8", "#f7f7f7", "#f7f7f7", "#f7f7f7", "#f6f6f6", "#f6f6f6", "#f5f5f5", "#f5f5f5", "#f4f4f4", "#f4f4f4", "#f3f3f3", "#f3f3f3", "#f2f2f2", "#f2f2f2", "#f1f1f1", "#f1f1f1", "#f0f0f0", "#f0f0f0", "#efefef", "#efefef", "#eeeeee", "#ededed", "#ededed", "#ececec", "#ebebeb", "#eaeaea", "#eaeaea", "#e9e9e9", "#e8e8e8", "#e7e7e7", "#e7e7e7", "#e6e6e6", "#e5e5e5", "#e5e5e5", "#e4e4e4", "#e3e3e3", "#e2e2e2", "#e2e2e2", "#e1e1e1", "#e0e0e0", "#e0e0e0", "#dfdfdf", "#dedede", "#dddddd", "#dddddd", "#dcdcdc", "#dbdbdb", "#dadada", "#dadada", "#d9d9d9", "#d8d8d8", "#d7d7d7", "#d7d7d7", "#d6d6d6", "#d5d5d5", "#d4d4d4", "#d3d3d3", "#d2d2d2", "#d1d1d1", "#d0d0d0", "#cfcfcf", "#cfcfcf", "#cecece", "#cdcdcd", "#cccccc", "#cbcbcb", "#cacaca", "#c9c9c9", "#c8c8c8", "#c8c8c8", "#c7c7c7", "#c6c6c6", "#c5c5c5", "#c4c4c4", "#c3c3c3", "#c2c2c2", "#c1c1c1", "#c1c1c1", "#c0c0c0", "#bfbfbf", "#bebebe", "#bdbdbd", "#bcbcbc", "#bbbbbb", "#bababa", "#b8b8b8", "#b7b7b7", "#b6b6b6", "#b5b5b5", "#b3b3b3", "#b2b2b2", "#b1b1b1", "#b0b0b0", "#afafaf", "#adadad", "#acacac", "#ababab", "#aaaaaa", "#a8a8a8", "#a7a7a7", "#a6a6a6", "#a5a5a5", "#a4a4a4", "#a2a2a2", "#a1a1a1", "#a0a0a0", "#9f9f9f", "#9d9d9d", "#9c9c9c", "#9b9b9b", "#9a9a9a", "#999999", "#979797", "#969696", "#959595", "#949494", "#939393", "#929292", "#919191", "#8f8f8f", "#8e8e8e", "#8d8d8d", "#8c8c8c", "#8b8b8b", "#8a8a8a", "#898989", "#888888", "#878787", "#868686", "#848484", "#838383", "#828282", "#818181", "#808080", "#7f7f7f", "#7e7e7e", "#7d7d7d", "#7c7c7c", "#7b7b7b", "#7a7a7a", "#787878", "#777777", "#767676", "#757575", "#747474", "#737373", "#727272", "#717171", "#707070", "#6f6f6f", "#6e6e6e", "#6d6d6d", "#6c6c6c", "#6b6b6b", "#6a6a6a", "#696969", "#686868", "#666666", "#656565", "#646464", "#636363", "#626262", "#616161", "#606060", "#5f5f5f", "#5e5e5e", "#5d5d5d", "#5c5c5c", "#5b5b5b", "#5a5a5a", "#595959", "#585858", "#575757", "#565656", "#555555", "#545454", "#535353", "#525252", "#505050", "#4f4f4f", "#4e4e4e", "#4c4c4c", "#4b4b4b", "#494949", "#484848", "#474747", "#454545", "#444444", "#424242", "#414141", "#404040", "#3e3e3e", "#3d3d3d", "#3b3b3b", "#3a3a3a", "#383838", "#373737", "#363636", "#343434", "#333333", "#313131", "#303030", "#2f2f2f", "#2d2d2d", "#2c2c2c", "#2a2a2a", "#292929", "#282828", "#262626", "#252525", "#232323", "#222222", "#212121", "#202020", "#1f1f1f", "#1e1e1e", "#1d1d1d", "#1b1b1b", "#1a1a1a", "#191919", "#181818", "#171717", "#161616", "#141414", "#131313", "#121212", "#111111", "#101010", "#0f0f0f", "#0d0d0d", "#0c0c0c", "#0b0b0b", "#0a0a0a", "#090909", "#080808", "#060606", "#050505", "#040404", "#030303", "#020202", "#010101", "#000000" ], "OrRd": [ "#fff7ec", "#fef6ea", "#fef6e9", "#fef5e8", "#fef5e7", "#fef4e6", "#fef4e5", "#fef3e4", "#fef3e2", "#fef2e1", "#fef2e0", "#fef1df", "#fef1de", "#fef0dd", "#fef0dc", "#feefdb", "#feefd9", "#feefd8", "#feeed7", "#feeed6", "#feedd5", "#feedd4", "#feecd3", "#feecd2", "#feebd0", "#feebcf", "#feeace", "#feeacd", "#fee9cc", "#fee9cb", "#fee8ca", "#fee8c8", "#fde7c7", "#fde7c6", "#fde6c5", "#fde6c3", "#fde5c2", "#fde4c1", "#fde4bf", "#fde3be", "#fde2bd", "#fde2bb", "#fde1ba", "#fde1b9", "#fde0b8", "#fddfb6", "#fddfb5", "#fddeb4", "#fdddb2", "#fdddb1", "#fddcb0", "#fddcae", "#fddbad", "#fddaac", "#fddaaa", "#fdd9a9", "#fdd8a8", "#fdd8a6", "#fdd7a5", "#fdd6a4", "#fdd6a2", "#fdd5a1", "#fdd5a0", "#fdd49e", "#fdd39d", "#fdd39c", "#fdd29c", "#fdd19b", "#fdd09a", "#fdcf99", "#fdcf98", "#fdce98", "#fdcd97", "#fdcc96", "#fdcb95", "#fdcb94", "#fdca94", "#fdc993", "#fdc892", "#fdc891", "#fdc790", "#fdc68f", "#fdc58f", "#fdc48e", "#fdc48d", "#fdc38c", "#fdc28b", "#fdc18b", "#fdc08a", "#fdc089", "#fdbf88", "#fdbe87", "#fdbd86", "#fdbd86", "#fdbc85", "#fdbb84", "#fcba83", "#fcb982", "#fcb780", "#fcb67f", "#fcb47e", "#fcb37c", "#fcb17b", "#fcb07a", "#fcae78", "#fcad77", "#fcac76", "#fcaa74", "#fca973", "#fca771", "#fca670", "#fca46f", "#fca36d", "#fca16c", "#fca06b", "#fc9f69", "#fc9d68", "#fc9c67", "#fc9a65", "#fc9964", "#fc9763", "#fc9661", "#fc9460", "#fc935f", "#fc925d", "#fc905c", "#fc8f5b", "#fc8d59", "#fb8c58", "#fb8b58", "#fa8957", "#fa8857", "#fa8756", "#f98656", "#f98455", "#f88355", "#f88254", "#f88153", "#f77f53", "#f77e52", "#f67d52", "#f67c51", "#f67a51", "#f57950", "#f57850", "#f4774f", "#f4754f", "#f4744e", "#f3734e", "#f3724d", "#f2704d", "#f26f4c", "#f26e4b", "#f16d4b", "#f16b4a", "#f06a4a", "#f06949", "#ef6749", "#ef6648", "#ef6548", "#ee6347", "#ed6245", "#ed6044", "#ec5e43", "#eb5d42", "#ea5b40", "#ea593f", "#e9583e", "#e8563c", "#e7543b", "#e7533a", "#e65139", "#e55037", "#e44e36", "#e34c35", "#e34b33", "#e24932", "#e14731", "#e04630", "#e0442e", "#df422d", "#de412c", "#dd3f2a", "#dd3d29", "#dc3c28", "#db3a27", "#da3825", "#da3724", "#d93523", "#d83321", "#d73220", "#d7301f", "#d62e1e", "#d52d1d", "#d32b1c", "#d22a1b", "#d1281a", "#d02719", "#cf2518", "#ce2417", "#cd2216", "#cb2115", "#ca1f14", "#c91e13", "#c81c12", "#c71b11", "#c61910", "#c5180f", "#c4160e", "#c2150d", "#c1130c", "#c0120b", "#bf100a", "#be0f09", "#bd0d08", "#bc0c07", "#bb0a06", "#b90905", "#b80704", "#b70604", "#b60403", "#b50302", "#b40101", "#b30000", "#b10000", "#af0000", "#ae0000", "#ac0000", "#ab0000", "#a90000", "#a70000", "#a60000", "#a40000", "#a20000", "#a10000", "#9f0000", "#9d0000", "#9c0000", "#9a0000", "#990000", "#970000", "#950000", "#940000", "#920000", "#900000", "#8f0000", "#8d0000", "#8c0000", "#8a0000", "#880000", "#870000", "#850000", "#830000", "#820000", "#800000", "#7f0000" ], "Oranges": [ "#fff5eb", "#fef4ea", "#fef4e9", "#fef3e8", "#fef3e7", "#fef2e6", "#fef2e5", "#fef1e4", "#fef1e3", "#fef0e2", "#fef0e1", "#feefe0", "#feefe0", "#feeedf", "#feeede", "#feeddd", "#feeddc", "#feeddb", "#feecda", "#feecd9", "#feebd8", "#feebd7", "#feead6", "#feead6", "#fee9d5", "#fee9d4", "#fee8d3", "#fee8d2", "#fee7d1", "#fee7d0", "#fee6cf", "#fee6ce", "#fde5cd", "#fde5cc", "#fde4cb", "#fde3c9", "#fde3c8", "#fde2c6", "#fde1c5", "#fde1c4", "#fde0c2", "#fddfc1", "#fddfc0", "#fddebe", "#fdddbd", "#fddcbb", "#fddcba", "#fddbb9", "#fddab7", "#fddab6", "#fdd9b4", "#fdd8b3", "#fdd8b2", "#fdd7b0", "#fdd6af", "#fdd6ae", "#fdd5ac", "#fdd4ab", "#fdd3a9", "#fdd3a8", "#fdd2a7", "#fdd1a5", "#fdd1a4", "#fdd0a3", "#fdcfa1", "#fdce9f", "#fdcd9e", "#fdcc9c", "#fdcb9a", "#fdca98", "#fdc997", "#fdc895", "#fdc793", "#fdc692", "#fdc590", "#fdc48e", "#fdc28c", "#fdc18b", "#fdc089", "#fdbf87", "#fdbe85", "#fdbd84", "#fdbc82", "#fdbb80", "#fdba7f", "#fdb97d", "#fdb87b", "#fdb779", "#fdb678", "#fdb576", "#fdb474", "#fdb272", "#fdb171", "#fdb06f", "#fdaf6d", "#fdae6c", "#fdad6a", "#fdac68", "#fdab67", "#fdaa66", "#fda964", "#fda863", "#fda761", "#fda660", "#fda55e", "#fda45d", "#fda35b", "#fda25a", "#fda158", "#fda057", "#fd9f55", "#fd9e54", "#fd9d52", "#fd9c51", "#fd9a4f", "#fd994e", "#fd984c", "#fd974b", "#fd964a", "#fd9548", "#fd9447", "#fd9345", "#fd9244", "#fd9142", "#fd9041", "#fd8f3f", "#fd8e3e", "#fd8d3c", "#fc8c3b", "#fc8b3a", "#fc8a38", "#fb8937", "#fb8736", "#fa8634", "#fa8533", "#fa8432", "#f98331", "#f9822f", "#f9812e", "#f8802d", "#f87e2b", "#f77d2a", "#f77c29", "#f77b28", "#f67a26", "#f67925", "#f67824", "#f57622", "#f57521", "#f47420", "#f4731f", "#f4721d", "#f3711c", "#f3701b", "#f36f19", "#f26d18", "#f26c17", "#f16b16", "#f16a14", "#f16913", "#f06812", "#ef6712", "#ef6611", "#ee6510", "#ed6410", "#ec630f", "#ec620f", "#eb610e", "#ea600e", "#e95f0d", "#e95d0d", "#e85c0c", "#e75b0b", "#e65a0b", "#e5590a", "#e5580a", "#e45709", "#e35609", "#e25508", "#e25407", "#e15307", "#e05206", "#df5106", "#df5005", "#de4f05", "#dd4e04", "#dc4d03", "#dc4c03", "#db4b02", "#da4a02", "#d94901", "#d94801", "#d74701", "#d64701", "#d44601", "#d34501", "#d14501", "#cf4401", "#ce4401", "#cc4301", "#cb4301", "#c94201", "#c74101", "#c64101", "#c44001", "#c34001", "#c13f01", "#bf3f01", "#be3e02", "#bc3d02", "#bb3d02", "#b93c02", "#b73c02", "#b63b02", "#b43b02", "#b33a02", "#b13a02", "#af3902", "#ae3802", "#ac3802", "#ab3702", "#a93702", "#a73602", "#a63602", "#a43503", "#a33503", "#a23403", "#a13403", "#a03303", "#9e3303", "#9d3203", "#9c3203", "#9b3103", "#993103", "#983003", "#973003", "#962f03", "#952f03", "#932f03", "#922e03", "#912e03", "#902d03", "#8e2d03", "#8d2c03", "#8c2c03", "#8b2b03", "#8a2b03", "#882a03", "#872a03", "#862903", "#852903", "#832803", "#822803", "#812703", "#802703", "#7f2704" ], "PRGn": [ "#40004b", "#42014d", "#44034f", "#460451", "#480653", "#4a0855", "#4c0958", "#4e0b5a", "#500d5c", "#530e5e", "#551060", "#571263", "#591365", "#5b1567", "#5d1769", "#5f186b", "#611a6e", "#641c70", "#661d72", "#681f74", "#6a2076", "#6c2279", "#6e247b", "#70257d", "#72277f", "#742981", "#762b83", "#782e85", "#793086", "#7a3388", "#7c368a", "#7d398b", "#7e3b8d", "#803e8e", "#814190", "#834491", "#844693", "#854995", "#874c96", "#884f98", "#895199", "#8b549b", "#8c579c", "#8e5a9e", "#8f5ca0", "#905fa1", "#9262a3", "#9365a4", "#9467a6", "#966aa7", "#976da9", "#9970ab", "#9a72ac", "#9c74ad", "#9d76af", "#9f78b0", "#a17ab2", "#a27cb3", "#a47eb4", "#a580b6", "#a782b7", "#a984b9", "#aa86ba", "#ac88bb", "#ad8bbd", "#af8dbe", "#b18fc0", "#b291c1", "#b493c3", "#b595c4", "#b797c5", "#b999c7", "#ba9bc8", "#bc9dca", "#bd9fcb", "#bfa1cc", "#c1a3ce", "#c2a5cf", "#c4a7d0", "#c5a9d1", "#c7abd2", "#c8add3", "#c9afd4", "#cbb0d5", "#ccb2d6", "#ceb4d7", "#cfb6d8", "#d1b8d9", "#d2bada", "#d4bcdb", "#d5bddc", "#d7bfdd", "#d8c1de", "#d9c3df", "#dbc5e0", "#dcc7e1", "#dec8e2", "#dfcae3", "#e1cce4", "#e2cee5", "#e4d0e6", "#e5d2e7", "#e7d4e8", "#e7d5e8", "#e8d6e9", "#e8d8e9", "#e9d9ea", "#eadaea", "#eadceb", "#ebddec", "#ecdeec", "#ece0ed", "#ede1ed", "#ede3ee", "#eee4ef", "#efe5ef", "#efe7f0", "#f0e8f0", "#f1e9f1", "#f1ebf2", "#f2ecf2", "#f2eef3", "#f3eff3", "#f4f0f4", "#f4f2f4", "#f5f3f5", "#f6f4f6", "#f6f6f6", "#f6f6f6", "#f5f6f4", "#f4f6f3", "#f2f6f2", "#f1f5f0", "#f0f5ef", "#eff5ed", "#eef4ec", "#edf4eb", "#ebf4e9", "#eaf4e8", "#e9f3e6", "#e8f3e5", "#e7f3e3", "#e5f3e2", "#e4f2e1", "#e3f2df", "#e2f2de", "#e1f1dc", "#e0f1db", "#def1da", "#ddf1d8", "#dcf0d7", "#dbf0d5", "#daf0d4", "#d9f0d3", "#d7efd1", "#d5eecf", "#d3edcd", "#d1eccb", "#cfebc9", "#cdebc7", "#cbeac5", "#c9e9c3", "#c7e8c1", "#c5e7bf", "#c3e6bd", "#c1e6bb", "#bfe5b9", "#bde4b7", "#bbe3b5", "#b9e2b3", "#b7e2b1", "#b5e1af", "#b3e0ad", "#b1dfab", "#afdea9", "#addda7", "#abdda5", "#a9dca3", "#a7dba1", "#a4da9e", "#a1d89c", "#9ed699", "#9bd497", "#98d394", "#95d192", "#92cf8f", "#8fcd8d", "#8ccc8b", "#89ca88", "#86c886", "#83c683", "#80c481", "#7dc37e", "#7ac17c", "#77bf79", "#74bd77", "#71bc74", "#6eba72", "#6bb86f", "#68b66d", "#65b56a", "#62b368", "#5fb165", "#5caf63", "#5aae61", "#57ab5f", "#55a95d", "#52a75c", "#50a55a", "#4da358", "#4ba157", "#489f55", "#469d53", "#439a52", "#419850", "#3e964e", "#3c944d", "#39924b", "#379049", "#348e48", "#328c46", "#308a45", "#2d8743", "#2b8541", "#288340", "#26813e", "#237f3c", "#217d3b", "#1e7b39", "#1c7937", "#1a7636", "#197435", "#187234", "#177033", "#166e32", "#156c30", "#146a2f", "#13682e", "#12662d", "#10642c", "#0f622b", "#0e602a", "#0d5e29", "#0c5c28", "#0b5a27", "#0a5825", "#095624", "#085423", "#075222", "#065021", "#054e20", "#044c1f", "#034a1e", "#02481d", "#01461c", "#00441b" ], "Paired": [ "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#a6cee3", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#1f78b4", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#b2df8a", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#33a02c", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#fb9a99", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#e31a1c", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#fdbf6f", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#cab2d6", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#6a3d9a", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#ffff99", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928", "#b15928" ], "Pastel1": [ "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#fbb4ae", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#b3cde3", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#decbe4", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#fed9a6", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#ffffcc", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#e5d8bd", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#fddaec", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2", "#f2f2f2" ], "Pastel2": [ "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#b3e2cd", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#fdcdac", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#cbd5e8", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#f4cae4", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#e6f5c9", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#fff2ae", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#f1e2cc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc", "#cccccc" ], "PiYG": [ "#8e0152", "#900253", "#920355", "#940457", "#960558", "#98065a", "#9a075c", "#9d085d", "#9f095f", "#a10a61", "#a30b62", "#a50c64", "#a70d66", "#aa0e67", "#ac0f69", "#ae106b", "#b0116c", "#b2126e", "#b41370", "#b61472", "#b91573", "#bb1675", "#bd1777", "#bf1878", "#c1197a", "#c31a7c", "#c51c7d", "#c6207f", "#c72481", "#c82783", "#c92b85", "#ca2e87", "#cb3289", "#cc368b", "#cd398d", "#ce3d8f", "#cf4091", "#d04493", "#d14895", "#d24b96", "#d34f98", "#d4529a", "#d5569c", "#d65a9e", "#d75da0", "#d861a2", "#d964a4", "#da68a6", "#db6ca8", "#dc6faa", "#dd73ac", "#de77ae", "#de79af", "#df7bb1", "#e07eb3", "#e080b4", "#e183b6", "#e285b8", "#e388ba", "#e38abb", "#e48dbd", "#e58fbf", "#e692c0", "#e694c2", "#e797c4", "#e899c6", "#e99cc7", "#e99ec9", "#eaa1cb", "#eba3cd", "#eca5ce", "#eca8d0", "#edaad2", "#eeadd3", "#efafd5", "#efb2d7", "#f0b4d9", "#f1b6da", "#f1b8db", "#f2badc", "#f2bbdc", "#f3bddd", "#f3bfde", "#f4c0df", "#f4c2e0", "#f5c3e1", "#f5c5e1", "#f5c7e2", "#f6c8e3", "#f6cae4", "#f7cce5", "#f7cde5", "#f8cfe6", "#f8d1e7", "#f9d2e8", "#f9d4e9", "#fad6ea", "#fad7ea", "#fbd9eb", "#fbdbec", "#fcdced", "#fcdeee", "#fde0ef", "#fce0ef", "#fce1ef", "#fce2ef", "#fce3f0", "#fbe4f0", "#fbe5f0", "#fbe6f1", "#fbe7f1", "#fae8f1", "#fae9f2", "#fae9f2", "#faeaf2", "#f9ebf3", "#f9ecf3", "#f9edf3", "#f9eef4", "#f9eff4", "#f8f0f4", "#f8f1f4", "#f8f2f5", "#f8f2f5", "#f7f3f5", "#f7f4f6", "#f7f5f6", "#f7f6f6", "#f6f6f6", "#f6f6f4", "#f5f6f3", "#f4f6f1", "#f4f6f0", "#f3f6ee", "#f2f6ed", "#f2f6eb", "#f1f6ea", "#f0f6e8", "#f0f6e6", "#eff6e5", "#eef6e3", "#eef5e2", "#edf5e0", "#ecf5df", "#ecf5dd", "#ebf5dc", "#eaf5da", "#eaf5d9", "#e9f5d7", "#e8f5d6", "#e8f5d4", "#e7f5d3", "#e6f5d1", "#e6f5d0", "#e4f4cd", "#e2f3ca", "#e0f2c7", "#def1c4", "#dcf1c1", "#dbf0be", "#d9efbb", "#d7eeb8", "#d5edb5", "#d3edb2", "#d2ecb0", "#d0ebad", "#ceeaaa", "#cceaa7", "#cae9a4", "#c9e8a1", "#c7e79e", "#c5e69b", "#c3e698", "#c1e595", "#c0e493", "#bee390", "#bce28d", "#bae28a", "#b8e187", "#b6e084", "#b4de81", "#b2dd7f", "#b0db7c", "#adda79", "#abd977", "#a9d774", "#a7d671", "#a5d46f", "#a2d36c", "#a0d169", "#9ed066", "#9cce64", "#99cd61", "#97cb5e", "#95ca5c", "#93c959", "#90c756", "#8ec653", "#8cc451", "#8ac34e", "#87c14b", "#85c049", "#83be46", "#81bd43", "#7fbc41", "#7dba3f", "#7bb83e", "#79b73d", "#77b53b", "#75b33a", "#73b239", "#71b038", "#6fae36", "#6dad35", "#6bab34", "#69a933", "#67a831", "#65a630", "#63a42f", "#61a32e", "#5fa12c", "#5da02b", "#5b9e2a", "#599c29", "#579b27", "#559926", "#539725", "#519624", "#4f9422", "#4d9221", "#4c9120", "#4a8f20", "#498d20", "#478b1f", "#46891f", "#44881f", "#43861e", "#41841e", "#40821e", "#3e801e", "#3d7f1d", "#3b7d1d", "#3a7b1d", "#38791c", "#37771c", "#35761c", "#34741b", "#32721b", "#31701b", "#2f6e1a", "#2e6d1a", "#2c6b1a", "#2b6919", "#296719", "#286519", "#276419" ], "PuBu": [ "#fff7fb", "#fef6fa", "#fdf5fa", "#fdf5fa", "#fcf4f9", "#fcf4f9", "#fbf3f9", "#faf3f9", "#faf2f8", "#f9f2f8", "#f9f1f8", "#f8f1f7", "#f7f0f7", "#f7f0f7", "#f6eff7", "#f6eff6", "#f5eef6", "#f4eef6", "#f4edf5", "#f3edf5", "#f3ecf5", "#f2ecf5", "#f1ebf4", "#f1ebf4", "#f0eaf4", "#f0eaf3", "#efe9f3", "#eee9f3", "#eee8f3", "#ede8f2", "#ede7f2", "#ece7f2", "#ebe6f1", "#ebe6f1", "#eae5f1", "#e9e4f0", "#e8e4f0", "#e7e3f0", "#e6e2ef", "#e5e2ef", "#e4e1ee", "#e3e0ee", "#e3e0ee", "#e2dfed", "#e1deed", "#e0dded", "#dfddec", "#dedcec", "#dddbeb", "#dcdbeb", "#dcdaeb", "#dbd9ea", "#dad9ea", "#d9d8ea", "#d8d7e9", "#d7d7e9", "#d6d6e8", "#d5d5e8", "#d5d4e8", "#d4d4e7", "#d3d3e7", "#d2d2e7", "#d1d2e6", "#d0d1e6", "#cfd0e5", "#ced0e5", "#cdcfe5", "#cbcee4", "#cacee4", "#c9cde4", "#c7cde3", "#c6cce3", "#c5cbe3", "#c3cbe2", "#c2cae2", "#c1c9e2", "#bfc9e1", "#bec8e1", "#bdc8e1", "#bbc7e0", "#bac6e0", "#b9c6e0", "#b7c5df", "#b6c4df", "#b5c4df", "#b4c3de", "#b2c3de", "#b1c2dd", "#b0c1dd", "#aec1dd", "#adc0dc", "#acbfdc", "#aabfdc", "#a9bedb", "#a8bedb", "#a6bddb", "#a5bcda", "#a3bcda", "#a2bbda", "#a0bad9", "#9fbad9", "#9db9d8", "#9cb9d8", "#9ab8d8", "#98b7d7", "#97b7d7", "#95b6d7", "#94b5d6", "#92b5d6", "#91b4d5", "#8fb3d5", "#8db3d5", "#8cb2d4", "#8ab2d4", "#89b1d4", "#87b0d3", "#86b0d3", "#84afd2", "#82aed2", "#81aed2", "#7fadd1", "#7eadd1", "#7cacd1", "#7babd0", "#79abd0", "#77aacf", "#76a9cf", "#74a9cf", "#73a8ce", "#71a7ce", "#6fa7cd", "#6da6cd", "#6ba5cc", "#69a4cc", "#67a3cb", "#65a3cb", "#63a2cb", "#61a1ca", "#5fa0ca", "#5d9fc9", "#5b9fc9", "#599ec8", "#579dc8", "#559cc7", "#539cc7", "#519bc6", "#509ac6", "#4e99c5", "#4c98c5", "#4a98c4", "#4897c4", "#4696c3", "#4495c3", "#4294c3", "#4094c2", "#3e93c2", "#3c92c1", "#3a91c1", "#3891c0", "#3690c0", "#358fbf", "#338ebf", "#318dbe", "#308cbe", "#2e8bbd", "#2d8abd", "#2b89bc", "#2a88bc", "#2887bb", "#2786bb", "#2585ba", "#2484ba", "#2283b9", "#2182b9", "#1f81b8", "#1d80b8", "#1c7fb7", "#1a7eb7", "#197db6", "#177cb6", "#167bb5", "#147ab5", "#1379b4", "#1178b4", "#1077b3", "#0e76b3", "#0d75b2", "#0b74b2", "#0973b1", "#0872b1", "#0671b0", "#0570b0", "#046faf", "#046eae", "#046eac", "#046dab", "#046caa", "#046ca9", "#046ba8", "#046aa7", "#0469a6", "#0469a5", "#0468a4", "#0467a3", "#0467a2", "#0466a0", "#04659f", "#04659e", "#04649d", "#04639c", "#04639b", "#04629a", "#046199", "#046098", "#046097", "#045f95", "#045e94", "#045e93", "#045d92", "#045c91", "#045c90", "#045b8f", "#045a8e", "#045a8d", "#03598b", "#035889", "#035688", "#035586", "#035484", "#035383", "#035281", "#03517f", "#03507e", "#034f7c", "#034e7a", "#034d79", "#034c77", "#034b75", "#034a74", "#034972", "#024870", "#02466f", "#02456d", "#02446b", "#02436a", "#024268", "#024166", "#024065", "#023f63", "#023e61", "#023d60", "#023c5e", "#023b5c", "#023a5b", "#023959", "#023858" ], "PuBuGn": [ "#fff7fb", "#fef6fa", "#fdf5fa", "#fdf5f9", "#fcf4f9", "#fcf3f9", "#fbf3f8", "#faf2f8", "#faf1f8", "#f9f1f7", "#f9f0f7", "#f8eff7", "#f7eff6", "#f7eef6", "#f6edf6", "#f6edf5", "#f5ecf5", "#f4ebf5", "#f4ebf4", "#f3eaf4", "#f3e9f4", "#f2e9f3", "#f1e8f3", "#f1e7f3", "#f0e7f2", "#f0e6f2", "#efe5f2", "#eee5f1", "#eee4f1", "#ede3f0", "#ede3f0", "#ece2f0", "#ebe1ef", "#ebe1ef", "#eae0ef", "#e9e0ef", "#e8dfee", "#e7dfee", "#e6deee", "#e5deed", "#e4dded", "#e3dded", "#e3dcec", "#e2dcec", "#e1dbec", "#e0dbeb", "#dfdaeb", "#ded9eb", "#ddd9ea", "#dcd8ea", "#dcd8ea", "#dbd7ea", "#dad7e9", "#d9d6e9", "#d8d6e9", "#d7d5e8", "#d6d5e8", "#d5d4e8", "#d5d4e7", "#d4d3e7", "#d3d3e7", "#d2d2e6", "#d1d1e6", "#d0d1e6", "#cfd0e5", "#ced0e5", "#cdcfe5", "#cbcee4", "#cacee4", "#c9cde4", "#c7cde3", "#c6cce3", "#c5cbe3", "#c3cbe2", "#c2cae2", "#c1c9e2", "#bfc9e1", "#bec8e1", "#bdc8e1", "#bbc7e0", "#bac6e0", "#b9c6e0", "#b7c5df", "#b6c4df", "#b5c4df", "#b4c3de", "#b2c3de", "#b1c2dd", "#b0c1dd", "#aec1dd", "#adc0dc", "#acbfdc", "#aabfdc", "#a9bedb", "#a8bedb", "#a6bddb", "#a5bcda", "#a3bcda", "#a1bbda", "#9fbad9", "#9dbad9", "#9bb9d8", "#99b9d8", "#97b8d8", "#95b7d7", "#93b7d7", "#91b6d7", "#8fb5d6", "#8db5d6", "#8bb4d5", "#89b3d5", "#87b3d5", "#85b2d4", "#83b2d4", "#81b1d4", "#7fb0d3", "#7db0d3", "#7bafd2", "#79aed2", "#77aed2", "#75add1", "#73add1", "#71acd1", "#6fabd0", "#6dabd0", "#6baacf", "#69a9cf", "#67a9cf", "#66a8ce", "#64a7ce", "#63a7cd", "#61a6cd", "#60a5cc", "#5ea4cc", "#5da3cb", "#5ba3cb", "#59a2cb", "#58a1ca", "#56a0ca", "#559fc9", "#539fc9", "#529ec8", "#509dc8", "#4f9cc7", "#4d9cc7", "#4c9bc6", "#4a9ac6", "#4999c5", "#4798c5", "#4598c4", "#4497c4", "#4296c3", "#4195c3", "#3f94c3", "#3e94c2", "#3c93c2", "#3b92c1", "#3991c1", "#3891c0", "#3690c0", "#348fbe", "#338fbd", "#318ebb", "#308eb9", "#2e8db8", "#2c8db6", "#2b8cb4", "#298cb3", "#278bb1", "#268baf", "#248bae", "#238aac", "#218aaa", "#1f89a8", "#1e89a7", "#1c88a5", "#1a88a3", "#1987a2", "#1787a0", "#15869e", "#14869d", "#12859b", "#118599", "#0f8497", "#0d8496", "#0c8394", "#0a8392", "#088391", "#07828f", "#05828d", "#04818c", "#02818a", "#018088", "#017f87", "#017f85", "#017e84", "#017d82", "#017d81", "#017c7f", "#017b7e", "#017b7c", "#017a7b", "#017979", "#017977", "#017876", "#017774", "#017773", "#017671", "#017570", "#01756e", "#01746d", "#01736b", "#01736a", "#017268", "#017267", "#017165", "#017063", "#017062", "#016f60", "#016e5f", "#016e5d", "#016d5c", "#016c5a", "#016c59", "#016a58", "#016956", "#016855", "#016754", "#016653", "#016452", "#016351", "#016250", "#01614f", "#01604e", "#015f4d", "#015d4b", "#015c4a", "#015b49", "#015a48", "#015947", "#015746", "#015645", "#015544", "#015443", "#015342", "#015140", "#01503f", "#014f3e", "#014e3d", "#014d3c", "#014b3b", "#014a3a", "#014939", "#014838", "#014737", "#014636" ], "PuOr": [ "#7f3b08", "#813c07", "#833d07", "#853e07", "#873f07", "#894007", "#8b4107", "#8d4207", "#8f4407", "#914507", "#934607", "#954707", "#974807", "#994906", "#9b4a06", "#9d4c06", "#9f4d06", "#a14e06", "#a34f06", "#a55006", "#a75106", "#a95206", "#ab5406", "#ad5506", "#af5606", "#b15706", "#b35806", "#b55a06", "#b75c07", "#b95d07", "#ba5f08", "#bc6109", "#be6209", "#c0640a", "#c2650a", "#c3670b", "#c5690b", "#c76a0c", "#c96c0c", "#ca6e0d", "#cc6f0d", "#ce710e", "#d0730f", "#d1740f", "#d37610", "#d57810", "#d77911", "#d87b11", "#da7d12", "#dc7e12", "#de8013", "#e08214", "#e18417", "#e2861a", "#e3881d", "#e48a20", "#e58c23", "#e68e26", "#e79029", "#e9922c", "#ea952f", "#eb9732", "#ec9936", "#ed9b39", "#ee9d3c", "#ef9f3f", "#f1a142", "#f2a345", "#f3a548", "#f4a84b", "#f5aa4e", "#f6ac51", "#f7ae55", "#f9b058", "#fab25b", "#fbb45e", "#fcb661", "#fdb864", "#fdba67", "#fdbb6b", "#fdbd6e", "#fdbf71", "#fdc074", "#fdc278", "#fdc37b", "#fdc57e", "#fdc681", "#fdc885", "#fdca88", "#fdcb8b", "#fdcd8e", "#fdce92", "#fdd095", "#fdd198", "#fdd39b", "#fdd59f", "#fdd6a2", "#fdd8a5", "#fdd9a8", "#fddbac", "#fddcaf", "#fddeb2", "#fee0b6", "#fde0b8", "#fde1bb", "#fde2bd", "#fce3c0", "#fce4c2", "#fce5c5", "#fce6c7", "#fbe7ca", "#fbe8cc", "#fbe9cf", "#fae9d2", "#faead4", "#faebd7", "#faecd9", "#f9eddc", "#f9eede", "#f9efe1", "#f9f0e3", "#f8f1e6", "#f8f2e8", "#f8f2eb", "#f7f3ee", "#f7f4f0", "#f7f5f3", "#f7f6f5", "#f6f6f6", "#f5f5f6", "#f3f4f5", "#f2f3f5", "#f1f1f4", "#f0f0f4", "#efeff3", "#edeef3", "#ecedf3", "#ebecf2", "#eaebf2", "#e9e9f1", "#e7e8f1", "#e6e7f0", "#e5e6f0", "#e4e5ef", "#e2e4ef", "#e1e3ee", "#e0e1ee", "#dfe0ed", "#dedfed", "#dcdeec", "#dbddec", "#dadceb", "#d9dbeb", "#d8daeb", "#d6d8ea", "#d5d6e9", "#d3d4e8", "#d2d2e7", "#d0d0e6", "#cfcee5", "#cdcde4", "#cccbe3", "#cac9e2", "#c9c7e1", "#c7c5e0", "#c6c3df", "#c4c2de", "#c3c0dd", "#c1bedc", "#c0bcdb", "#bebada", "#bdb8d9", "#bbb6d8", "#bab5d7", "#b8b3d6", "#b7b1d5", "#b5afd4", "#b4add3", "#b2abd2", "#b1a9d1", "#afa7cf", "#ada5ce", "#aba3cc", "#a9a1cb", "#a79ec9", "#a59cc8", "#a39ac6", "#a198c5", "#9f96c3", "#9d93c2", "#9b91c0", "#998fbf", "#978dbd", "#958bbc", "#9388ba", "#9186b9", "#8f84b7", "#8d82b6", "#8b80b4", "#897db3", "#877bb1", "#8579b0", "#8377ae", "#8175ad", "#8073ac", "#7e70aa", "#7c6da9", "#7a6aa7", "#7967a6", "#7764a4", "#7561a3", "#735ea2", "#725ba0", "#70589f", "#6e559d", "#6d529c", "#6b4f9b", "#694c99", "#674998", "#664696", "#644395", "#624094", "#603d92", "#5f3a91", "#5d378f", "#5b348e", "#5a318c", "#582e8b", "#562b8a", "#542888", "#532686", "#512484", "#502382", "#4e217f", "#4d207d", "#4b1e7a", "#4a1d78", "#481b76", "#471a73", "#451871", "#43166e", "#42156c", "#40136a", "#3f1267", "#3d1065", "#3c0f62", "#3a0d60", "#390c5e", "#370a5b", "#360959", "#340756", "#330654", "#310452", "#30034f", "#2e014d", "#2d004b" ], "PuRd": [ "#f7f4f9", "#f6f3f8", "#f5f2f8", "#f5f2f8", "#f4f1f7", "#f4f1f7", "#f3f0f7", "#f3eff6", "#f2eff6", "#f2eef6", "#f1eef5", "#f1edf5", "#f0ecf5", "#f0ecf4", "#efebf4", "#efebf4", "#eeeaf3", "#eee9f3", "#ede9f3", "#ede8f3", "#ece8f2", "#ece7f2", "#ebe6f2", "#ebe6f1", "#eae5f1", "#eae5f1", "#e9e4f0", "#e9e3f0", "#e8e3f0", "#e8e2ef", "#e7e2ef", "#e7e1ef", "#e6e0ee", "#e6dfee", "#e5deed", "#e5ddec", "#e4dbec", "#e3daeb", "#e3d9ea", "#e2d8ea", "#e2d6e9", "#e1d5e8", "#e0d4e8", "#e0d3e7", "#dfd1e7", "#dfd0e6", "#decfe5", "#ddcee5", "#ddcce4", "#dccbe3", "#dccae3", "#dbc9e2", "#dbc7e1", "#dac6e1", "#d9c5e0", "#d9c3df", "#d8c2df", "#d8c1de", "#d7c0dd", "#d6bedd", "#d6bddc", "#d5bcdb", "#d5bbdb", "#d4b9da", "#d3b8d9", "#d3b7d9", "#d3b6d8", "#d2b5d8", "#d2b4d7", "#d2b2d6", "#d1b1d6", "#d1b0d5", "#d1afd5", "#d0aed4", "#d0add3", "#d0abd3", "#cfaad2", "#cfa9d2", "#cfa8d1", "#cea7d0", "#cea6d0", "#cea4cf", "#cda3cf", "#cda2ce", "#cda1cd", "#cca0cd", "#cc9fcc", "#cb9ecc", "#cb9ccb", "#cb9bca", "#ca9aca", "#ca99c9", "#ca98c9", "#c997c8", "#c995c7", "#c994c7", "#c993c6", "#c991c6", "#ca90c5", "#cb8fc4", "#cc8dc3", "#cc8cc3", "#cd8ac2", "#ce89c1", "#ce87c0", "#cf86c0", "#d084bf", "#d083be", "#d181be", "#d280bd", "#d27ebc", "#d37dbb", "#d47bbb", "#d47aba", "#d578b9", "#d677b9", "#d775b8", "#d774b7", "#d873b6", "#d971b6", "#d970b5", "#da6eb4", "#db6db3", "#db6bb3", "#dc6ab2", "#dd68b1", "#dd67b1", "#de65b0", "#df64af", "#df62ae", "#df60ad", "#df5eab", "#e05caa", "#e05aa9", "#e058a8", "#e056a7", "#e155a5", "#e153a4", "#e151a3", "#e14fa2", "#e24da1", "#e24b9f", "#e2499e", "#e2479d", "#e3459c", "#e3449b", "#e34299", "#e34098", "#e43e97", "#e43c96", "#e43a95", "#e43893", "#e53692", "#e53491", "#e53390", "#e5318f", "#e62f8e", "#e62d8c", "#e62b8b", "#e6298a", "#e62888", "#e52787", "#e42785", "#e42684", "#e32582", "#e22480", "#e1247f", "#e1237d", "#e0227b", "#df227a", "#de2178", "#dd2077", "#dd1f75", "#dc1f73", "#db1e72", "#da1d70", "#d91d6e", "#d91c6d", "#d81b6b", "#d71a69", "#d61a68", "#d61966", "#d51865", "#d41763", "#d31761", "#d21660", "#d2155e", "#d1155c", "#d0145b", "#cf1359", "#ce1258", "#ce1256", "#cc1155", "#cb1154", "#c91054", "#c70f53", "#c50f53", "#c40e52", "#c20e51", "#c00d51", "#bf0d50", "#bd0c50", "#bb0b4f", "#ba0b4e", "#b80a4e", "#b60a4d", "#b5094d", "#b3094c", "#b1084c", "#af074b", "#ae074a", "#ac064a", "#aa0649", "#a90549", "#a70548", "#a50447", "#a40447", "#a20346", "#a00246", "#9e0245", "#9d0144", "#9b0144", "#990043", "#980043", "#960042", "#950040", "#93003f", "#92003e", "#90003d", "#8e003c", "#8d003b", "#8b003a", "#8a0038", "#880037", "#870036", "#850035", "#840034", "#820033", "#810032", "#7f0031", "#7e002f", "#7c002e", "#7a002d", "#79002c", "#77002b", "#76002a", "#740029", "#730028", "#710026", "#700025", "#6e0024", "#6d0023", "#6b0022", "#6a0021", "#680020", "#67001f" ], "Purples": [ "#fcfbfd", "#fbfafc", "#fbfafc", "#faf9fc", "#faf9fb", "#f9f8fb", "#f9f8fb", "#f9f7fb", "#f8f7fa", "#f8f7fa", "#f7f6fa", "#f7f6fa", "#f7f5f9", "#f6f5f9", "#f6f4f9", "#f5f4f9", "#f5f3f8", "#f5f3f8", "#f4f3f8", "#f4f2f8", "#f3f2f7", "#f3f1f7", "#f3f1f7", "#f2f0f7", "#f2f0f6", "#f1f0f6", "#f1eff6", "#f0eff6", "#f0eef5", "#f0eef5", "#efedf5", "#efedf5", "#eeecf4", "#eeecf4", "#edebf4", "#ecebf4", "#eceaf3", "#ebe9f3", "#eae9f3", "#eae8f2", "#e9e8f2", "#e8e7f2", "#e8e6f1", "#e7e6f1", "#e7e5f1", "#e6e5f0", "#e5e4f0", "#e5e3f0", "#e4e3ef", "#e3e2ef", "#e3e2ef", "#e2e1ef", "#e1e1ee", "#e1e0ee", "#e0dfee", "#dfdfed", "#dfdeed", "#dedeed", "#ddddec", "#dddcec", "#dcdcec", "#dbdbeb", "#dbdbeb", "#dadaeb", "#d9d9ea", "#d8d8ea", "#d7d7e9", "#d6d7e9", "#d6d6e9", "#d5d5e8", "#d4d4e8", "#d3d3e7", "#d2d2e7", "#d1d1e6", "#d0d0e6", "#cfcfe5", "#cecee5", "#cdcde4", "#cccde4", "#cbcce3", "#cacbe3", "#c9cae2", "#c8c9e2", "#c7c8e1", "#c6c7e1", "#c6c6e1", "#c5c5e0", "#c4c4e0", "#c3c3df", "#c2c3df", "#c1c2de", "#c0c1de", "#bfc0dd", "#bebfdd", "#bdbedc", "#bcbddc", "#bbbcdb", "#babbdb", "#b9bada", "#b8b9d9", "#b7b8d9", "#b6b7d8", "#b6b6d8", "#b5b4d7", "#b4b3d6", "#b3b2d6", "#b2b1d5", "#b1b0d4", "#b0afd4", "#afaed3", "#aeadd2", "#adacd2", "#acabd1", "#aba9d1", "#aaa8d0", "#a9a7cf", "#a8a6cf", "#a7a5ce", "#a6a4cd", "#a6a3cd", "#a5a2cc", "#a4a1cc", "#a3a0cb", "#a29eca", "#a19dca", "#a09cc9", "#9f9bc8", "#9e9ac8", "#9d99c7", "#9c98c7", "#9b97c6", "#9a96c6", "#9995c6", "#9894c5", "#9794c5", "#9693c4", "#9692c4", "#9591c3", "#9490c3", "#938fc2", "#928ec2", "#918dc2", "#908cc1", "#8f8bc1", "#8e8ac0", "#8d8ac0", "#8c89bf", "#8b88bf", "#8a87be", "#8986be", "#8885be", "#8784bd", "#8683bd", "#8682bc", "#8581bc", "#8480bb", "#8380bb", "#827fbb", "#817eba", "#807dba", "#7f7cb9", "#7e7ab8", "#7e79b8", "#7d77b7", "#7c76b6", "#7c75b5", "#7b73b5", "#7a72b4", "#7a71b3", "#796fb3", "#786eb2", "#776cb1", "#776bb0", "#766ab0", "#7568af", "#7567ae", "#7466ae", "#7364ad", "#7363ac", "#7261ab", "#7160ab", "#715faa", "#705da9", "#6f5ca8", "#6f5ba8", "#6e59a7", "#6d58a6", "#6c56a6", "#6c55a5", "#6b54a4", "#6a52a3", "#6a51a3", "#6950a2", "#684ea1", "#684da1", "#674ca0", "#664aa0", "#66499f", "#65489e", "#64469e", "#63459d", "#63449c", "#62429c", "#61419b", "#61409b", "#603e9a", "#5f3d99", "#5f3c99", "#5e3a98", "#5d3997", "#5d3897", "#5c3696", "#5b3595", "#5a3495", "#5a3394", "#593194", "#583093", "#582f92", "#572d92", "#562c91", "#562b90", "#552990", "#54288f", "#54278f", "#53258e", "#52248d", "#52238d", "#51228c", "#50218c", "#501f8b", "#4f1e8b", "#4e1d8a", "#4e1c89", "#4d1a89", "#4c1988", "#4c1888", "#4b1787", "#4a1687", "#4a1486", "#491386", "#481285", "#481184", "#470f84", "#460e83", "#460d83", "#450c82", "#440b82", "#440981", "#430880", "#420780", "#42067f", "#41047f", "#40037e", "#40027e", "#3f017d", "#3f007d" ], "RdBu": [ "#67001f", "#69001f", "#6c011f", "#6f0220", "#720320", "#750421", "#780521", "#7b0622", "#7e0722", "#810823", "#840923", "#870a24", "#8a0b24", "#8d0c25", "#900d25", "#930e26", "#960f26", "#991027", "#9b1027", "#9e1127", "#a11228", "#a41328", "#a71429", "#aa1529", "#ad162a", "#b0172a", "#b2192b", "#b41c2d", "#b51f2e", "#b6212f", "#b82431", "#b92732", "#bb2a33", "#bc2d34", "#be3036", "#bf3237", "#c03538", "#c2383a", "#c33b3b", "#c53e3c", "#c6403e", "#c7433f", "#c94641", "#ca4942", "#cc4c43", "#cd4f44", "#ce5146", "#d05447", "#d15749", "#d35a4a", "#d45d4b", "#d6604d", "#d7624f", "#d86551", "#d96853", "#da6a55", "#db6d57", "#dd7059", "#de725b", "#df755d", "#e0785f", "#e17b61", "#e27d63", "#e48065", "#e58368", "#e6856a", "#e7886c", "#e88b6e", "#ea8d70", "#eb9072", "#ec9374", "#ed9676", "#ee9878", "#ef9b7a", "#f19e7c", "#f2a07e", "#f3a380", "#f4a683", "#f4a886", "#f4aa88", "#f5ac8b", "#f5ae8e", "#f5b090", "#f6b293", "#f6b496", "#f7b698", "#f7b99b", "#f7bb9e", "#f8bda1", "#f8bfa3", "#f8c1a6", "#f9c3a9", "#f9c5ab", "#f9c7ae", "#facab1", "#faccb4", "#faceb6", "#fbd0b9", "#fbd2bc", "#fbd4be", "#fcd6c1", "#fcd8c4", "#fddbc7", "#fcdcc8", "#fcddca", "#fcdecc", "#fcdfce", "#fbe0d0", "#fbe1d2", "#fbe2d4", "#fbe3d6", "#fae4d7", "#fae5d9", "#fae7db", "#fae8dd", "#f9e9df", "#f9eae1", "#f9ebe3", "#f9ece5", "#f9ede7", "#f8eee8", "#f8efea", "#f8f0ec", "#f8f2ee", "#f7f3f0", "#f7f4f2", "#f7f5f4", "#f7f6f6", "#f6f6f6", "#f4f5f6", "#f3f5f6", "#f1f4f6", "#f0f3f5", "#eef3f5", "#edf2f5", "#ebf1f4", "#eaf1f4", "#e8f0f4", "#e7eff4", "#e5eef3", "#e4eef3", "#e2edf3", "#e1ecf3", "#dfecf2", "#deebf2", "#dceaf2", "#dbe9f1", "#d9e9f1", "#d8e8f1", "#d6e7f1", "#d5e7f0", "#d3e6f0", "#d2e5f0", "#d1e5f0", "#cee3ef", "#cce2ee", "#c9e1ed", "#c7dfed", "#c4deec", "#c2ddeb", "#bfdceb", "#bddaea", "#bad9e9", "#b8d8e8", "#b5d7e8", "#b3d5e7", "#b0d4e6", "#aed3e6", "#abd2e5", "#a9d0e4", "#a7cfe4", "#a4cee3", "#a2cde2", "#9fcbe1", "#9dcae1", "#9ac9e0", "#98c8df", "#95c6df", "#93c5de", "#90c4dd", "#8dc2dc", "#8ac0db", "#87beda", "#84bcd9", "#80bad8", "#7db8d7", "#7ab6d6", "#77b4d5", "#74b2d3", "#71b0d2", "#6eaed1", "#6bacd0", "#68aacf", "#65a8ce", "#61a6cd", "#5ea4cc", "#5ba2cb", "#58a0ca", "#559ec9", "#529cc8", "#4f9ac7", "#4c98c6", "#4996c5", "#4694c4", "#4393c3", "#4191c2", "#408fc1", "#3f8dc0", "#3d8bbf", "#3c8abe", "#3b88bd", "#3986bc", "#3884bb", "#3783ba", "#3581b9", "#347fb9", "#337db8", "#317cb7", "#307ab6", "#2f78b5", "#2d76b4", "#2c75b3", "#2b73b2", "#2971b1", "#286fb0", "#276db0", "#256caf", "#246aae", "#2368ad", "#2166ac", "#2064aa", "#1f62a7", "#1e60a4", "#1d5ea1", "#1c5c9e", "#1a5a9b", "#195898", "#185695", "#175493", "#165190", "#154f8d", "#144d8a", "#134b87", "#124984", "#114781", "#0f457e", "#0e437b", "#0d4078", "#0c3e75", "#0b3c72", "#0a3a6f", "#09386c", "#083669", "#073466", "#063263", "#053061" ], "RdGy": [ "#67001f", "#69001f", "#6c011f", "#6f0220", "#720320", "#750421", "#780521", "#7b0622", "#7e0722", "#810823", "#840923", "#870a24", "#8a0b24", "#8d0c25", "#900d25", "#930e26", "#960f26", "#991027", "#9b1027", "#9e1127", "#a11228", "#a41328", "#a71429", "#aa1529", "#ad162a", "#b0172a", "#b2192b", "#b41c2d", "#b51f2e", "#b6212f", "#b82431", "#b92732", "#bb2a33", "#bc2d34", "#be3036", "#bf3237", "#c03538", "#c2383a", "#c33b3b", "#c53e3c", "#c6403e", "#c7433f", "#c94641", "#ca4942", "#cc4c43", "#cd4f44", "#ce5146", "#d05447", "#d15749", "#d35a4a", "#d45d4b", "#d6604d", "#d7624f", "#d86551", "#d96853", "#da6a55", "#db6d57", "#dd7059", "#de725b", "#df755d", "#e0785f", "#e17b61", "#e27d63", "#e48065", "#e58368", "#e6856a", "#e7886c", "#e88b6e", "#ea8d70", "#eb9072", "#ec9374", "#ed9676", "#ee9878", "#ef9b7a", "#f19e7c", "#f2a07e", "#f3a380", "#f4a683", "#f4a886", "#f4aa88", "#f5ac8b", "#f5ae8e", "#f5b090", "#f6b293", "#f6b496", "#f7b698", "#f7b99b", "#f7bb9e", "#f8bda1", "#f8bfa3", "#f8c1a6", "#f9c3a9", "#f9c5ab", "#f9c7ae", "#facab1", "#faccb4", "#faceb6", "#fbd0b9", "#fbd2bc", "#fbd4be", "#fcd6c1", "#fcd8c4", "#fddbc7", "#fddcc9", "#fdddcb", "#fddfcd", "#fde0cf", "#fde2d1", "#fde3d4", "#fde4d6", "#fde6d8", "#fde7da", "#fde9dc", "#fdeadf", "#fdebe1", "#feede3", "#feeee5", "#fef0e7", "#fef1ea", "#fef3ec", "#fef4ee", "#fef5f0", "#fef7f2", "#fef8f5", "#fefaf7", "#fefbf9", "#fefcfb", "#fefefd", "#fefefe", "#fdfdfd", "#fbfbfb", "#fafafa", "#f9f9f9", "#f8f8f8", "#f7f7f7", "#f5f5f5", "#f4f4f4", "#f3f3f3", "#f2f2f2", "#f1f1f1", "#efefef", "#eeeeee", "#ededed", "#ececec", "#eaeaea", "#e9e9e9", "#e8e8e8", "#e7e7e7", "#e6e6e6", "#e4e4e4", "#e3e3e3", "#e2e2e2", "#e1e1e1", "#e0e0e0", "#dedede", "#dddddd", "#dbdbdb", "#dadada", "#d8d8d8", "#d7d7d7", "#d5d5d5", "#d4d4d4", "#d2d2d2", "#d1d1d1", "#cfcfcf", "#cecece", "#cccccc", "#cbcbcb", "#c9c9c9", "#c8c8c8", "#c6c6c6", "#c5c5c5", "#c3c3c3", "#c2c2c2", "#c0c0c0", "#bfbfbf", "#bdbdbd", "#bcbcbc", "#bababa", "#b9b9b9", "#b7b7b7", "#b5b5b5", "#b3b3b3", "#b1b1b1", "#afafaf", "#adadad", "#ababab", "#a9a9a9", "#a7a7a7", "#a5a5a5", "#a3a3a3", "#a1a1a1", "#9f9f9f", "#9d9d9d", "#9b9b9b", "#999999", "#979797", "#959595", "#939393", "#919191", "#8f8f8f", "#8d8d8d", "#8b8b8b", "#898989", "#878787", "#848484", "#828282", "#808080", "#7d7d7d", "#7b7b7b", "#797979", "#777777", "#747474", "#727272", "#707070", "#6d6d6d", "#6b6b6b", "#696969", "#676767", "#646464", "#626262", "#606060", "#5e5e5e", "#5b5b5b", "#595959", "#575757", "#545454", "#525252", "#505050", "#4e4e4e", "#4c4c4c", "#494949", "#484848", "#454545", "#444444", "#414141", "#404040", "#3d3d3d", "#3c3c3c", "#393939", "#383838", "#353535", "#343434", "#313131", "#303030", "#2e2e2e", "#2c2c2c", "#2a2a2a", "#282828", "#262626", "#242424", "#222222", "#202020", "#1e1e1e", "#1c1c1c", "#1a1a1a" ], "RdPu": [ "#fff7f3", "#fef6f2", "#fef5f1", "#fef4f0", "#fef4f0", "#fef3ef", "#fef2ee", "#fef1ee", "#fef1ed", "#fef0ec", "#feefec", "#feefeb", "#feeeea", "#feedea", "#feece9", "#feece8", "#fdebe7", "#fdeae7", "#fdeae6", "#fde9e5", "#fde8e5", "#fde7e4", "#fde7e3", "#fde6e3", "#fde5e2", "#fde4e1", "#fde4e1", "#fde3e0", "#fde2df", "#fde2de", "#fde1de", "#fde0dd", "#fcdfdc", "#fcdfdb", "#fcdedb", "#fcddda", "#fcdcd9", "#fcdbd8", "#fcdad7", "#fcd9d6", "#fcd9d5", "#fcd8d4", "#fcd7d3", "#fcd6d2", "#fcd5d1", "#fcd4d1", "#fcd4d0", "#fcd3cf", "#fcd2ce", "#fcd1cd", "#fcd0cc", "#fccfcb", "#fcceca", "#fccec9", "#fccdc8", "#fcccc7", "#fccbc7", "#fccac6", "#fcc9c5", "#fcc9c4", "#fcc8c3", "#fcc7c2", "#fcc6c1", "#fcc5c0", "#fbc4bf", "#fbc3bf", "#fbc2bf", "#fbc1be", "#fbbfbe", "#fbbebe", "#fbbdbd", "#fbbcbd", "#fbbbbd", "#fbb9bc", "#fbb8bc", "#fbb7bc", "#fbb6bb", "#fbb5bb", "#fbb4bb", "#fbb2ba", "#fab1ba", "#fab0ba", "#faafb9", "#faaeb9", "#faacb9", "#faabb8", "#faaab8", "#faa9b7", "#faa8b7", "#faa6b7", "#faa5b6", "#faa4b6", "#faa3b6", "#faa2b5", "#faa0b5", "#fa9fb5", "#f99eb4", "#f99cb4", "#f99ab3", "#f999b2", "#f997b2", "#f995b1", "#f994b1", "#f992b0", "#f990af", "#f98eaf", "#f98dae", "#f88bad", "#f889ad", "#f887ac", "#f886ab", "#f884ab", "#f882aa", "#f881aa", "#f87fa9", "#f87da8", "#f87ba8", "#f77aa7", "#f778a6", "#f776a6", "#f774a5", "#f773a5", "#f771a4", "#f76fa3", "#f76ea3", "#f76ca2", "#f76aa1", "#f768a1", "#f667a0", "#f565a0", "#f463a0", "#f4629f", "#f3609f", "#f25f9f", "#f15d9e", "#f05b9e", "#f05a9e", "#ef589e", "#ee569d", "#ed559d", "#ec539d", "#eb519c", "#eb509c", "#ea4e9c", "#e94d9b", "#e84b9b", "#e7499b", "#e7489a", "#e6469a", "#e5449a", "#e44399", "#e34199", "#e34099", "#e23e99", "#e13c98", "#e03b98", "#df3998", "#de3797", "#de3697", "#dd3497", "#dc3396", "#da3195", "#d92f94", "#d72e94", "#d62c93", "#d42a92", "#d32991", "#d12791", "#d02690", "#ce248f", "#cd238e", "#cb218d", "#ca1f8d", "#c81e8c", "#c71c8b", "#c51b8a", "#c41989", "#c31789", "#c11688", "#c01487", "#be1386", "#bd1186", "#bb0f85", "#ba0e84", "#b80c83", "#b70a82", "#b50982", "#b40781", "#b20680", "#b1047f", "#af027e", "#ae017e", "#ac017d", "#ab017d", "#a9017d", "#a7017d", "#a6017c", "#a4017c", "#a2017c", "#a1017c", "#9f017c", "#9e017b", "#9c017b", "#9a017b", "#99017b", "#97017a", "#95017a", "#94017a", "#92017a", "#91017a", "#8f0179", "#8d0179", "#8c0179", "#8a0179", "#880179", "#870178", "#850178", "#830178", "#820178", "#800177", "#7f0177", "#7d0177", "#7b0177", "#7a0177", "#780076", "#770076", "#750075", "#740075", "#720075", "#700074", "#6f0074", "#6d0073", "#6c0073", "#6a0072", "#690072", "#670072", "#660071", "#640071", "#630070", "#610070", "#600070", "#5e006f", "#5c006f", "#5b006e", "#59006e", "#58006e", "#56006d", "#55006d", "#53006c", "#52006c", "#50006c", "#4f006b", "#4d006b", "#4c006a", "#4a006a", "#49006a" ], "RdYlBu": [ "#a50026", "#a60126", "#a80326", "#aa0526", "#ac0726", "#ae0926", "#b00b26", "#b20d26", "#b40f26", "#b61026", "#b81226", "#ba1426", "#bc1626", "#be1826", "#c01a26", "#c21c26", "#c41e26", "#c62026", "#c82126", "#ca2326", "#cc2526", "#ce2726", "#d02926", "#d22b26", "#d42d26", "#d62f26", "#d73127", "#d83328", "#d93529", "#da382a", "#dc3a2b", "#dd3d2d", "#de3f2e", "#df412f", "#e04430", "#e14631", "#e24932", "#e44b33", "#e54d34", "#e65035", "#e75236", "#e85538", "#e95739", "#ea593a", "#ec5c3b", "#ed5e3c", "#ee613d", "#ef633e", "#f0653f", "#f16840", "#f26a41", "#f46d43", "#f46f44", "#f47245", "#f57446", "#f57747", "#f57948", "#f67c4a", "#f67e4b", "#f6814c", "#f7834d", "#f7864e", "#f7894f", "#f88b51", "#f88e52", "#f89053", "#f99354", "#f99555", "#fa9856", "#fa9a58", "#fa9d59", "#fb9f5a", "#fba25b", "#fba55c", "#fca75e", "#fcaa5f", "#fcac60", "#fdae61", "#fdb063", "#fdb265", "#fdb467", "#fdb669", "#fdb86b", "#fdba6c", "#fdbc6e", "#fdbe70", "#fdc072", "#fdc274", "#fdc476", "#fdc678", "#fdc879", "#fdca7b", "#fdcc7d", "#fdce7f", "#fdd081", "#fdd283", "#fdd484", "#fdd686", "#fdd888", "#fdda8a", "#fddc8c", "#fdde8e", "#fee090", "#fee191", "#fee293", "#fee395", "#fee497", "#fee699", "#fee79b", "#fee89c", "#fee99e", "#feeaa0", "#feeca2", "#feeda4", "#feeea6", "#feefa7", "#fef1a9", "#fef2ab", "#fef3ad", "#fef4af", "#fef5b1", "#fef7b3", "#fef8b4", "#fef9b6", "#fefab8", "#fefbba", "#fefdbc", "#fefebe", "#fefec0", "#fdfec2", "#fbfdc4", "#fafdc6", "#f9fcc9", "#f8fccb", "#f7fbcd", "#f5fbcf", "#f4fbd2", "#f3fad4", "#f2fad6", "#f1f9d8", "#eff9da", "#eef8dd", "#edf8df", "#ecf7e1", "#eaf7e3", "#e9f6e6", "#e8f6e8", "#e7f5ea", "#e6f5ec", "#e4f4ef", "#e3f4f1", "#e2f3f3", "#e1f3f5", "#e0f3f7", "#ddf1f7", "#dbf0f6", "#d9eff6", "#d7eef5", "#d5edf5", "#d3ecf4", "#d1ebf3", "#cfeaf3", "#cde9f2", "#cbe8f2", "#c9e7f1", "#c7e6f0", "#c4e5f0", "#c2e4ef", "#c0e3ef", "#bee2ee", "#bce1ee", "#bae0ed", "#b8dfec", "#b6deec", "#b4ddeb", "#b2dceb", "#b0dbea", "#aedae9", "#acd9e9", "#a9d8e8", "#a7d6e7", "#a5d4e6", "#a3d2e5", "#a1d1e4", "#9fcfe3", "#9ccde2", "#9acce1", "#98cae1", "#96c8e0", "#94c6df", "#92c5de", "#90c3dd", "#8dc1dc", "#8bbfdb", "#89beda", "#87bcd9", "#85bad8", "#83b9d7", "#80b7d6", "#7eb5d5", "#7cb3d4", "#7ab2d3", "#78b0d2", "#76aed1", "#74add1", "#72aacf", "#70a8ce", "#6ea6cd", "#6ca4cc", "#6aa2cb", "#689fca", "#679dc9", "#659bc7", "#6399c6", "#6197c5", "#5f94c4", "#5d92c3", "#5c90c2", "#5a8ec1", "#588cbf", "#5689be", "#5487bd", "#5285bc", "#5083bb", "#4f81ba", "#4d7eb9", "#4b7cb7", "#497ab6", "#4778b5", "#4576b4", "#4473b3", "#4371b2", "#436eb0", "#426caf", "#4169ae", "#4067ad", "#3f64ac", "#3f62aa", "#3e60a9", "#3d5da8", "#3c5ba7", "#3b58a6", "#3b56a4", "#3a53a3", "#3951a2", "#384ea1", "#384c9f", "#37499e", "#36479d", "#35449c", "#34429b", "#343f99", "#333d98", "#323a97", "#313896", "#313695" ], "RdYlGn": [ "#a50026", "#a60126", "#a80326", "#aa0526", "#ac0726", "#ae0926", "#b00b26", "#b20d26", "#b40f26", "#b61026", "#b81226", "#ba1426", "#bc1626", "#be1826", "#c01a26", "#c21c26", "#c41e26", "#c62026", "#c82126", "#ca2326", "#cc2526", "#ce2726", "#d02926", "#d22b26", "#d42d26", "#d62f26", "#d73127", "#d83328", "#d93529", "#da382a", "#dc3a2b", "#dd3d2d", "#de3f2e", "#df412f", "#e04430", "#e14631", "#e24932", "#e44b33", "#e54d34", "#e65035", "#e75236", "#e85538", "#e95739", "#ea593a", "#ec5c3b", "#ed5e3c", "#ee613d", "#ef633e", "#f0653f", "#f16840", "#f26a41", "#f46d43", "#f46f44", "#f47245", "#f57446", "#f57747", "#f57948", "#f67c4a", "#f67e4b", "#f6814c", "#f7834d", "#f7864e", "#f7894f", "#f88b51", "#f88e52", "#f89053", "#f99354", "#f99555", "#fa9856", "#fa9a58", "#fa9d59", "#fb9f5a", "#fba25b", "#fba55c", "#fca75e", "#fcaa5f", "#fcac60", "#fdae61", "#fdb063", "#fdb265", "#fdb466", "#fdb668", "#fdb86a", "#fdba6b", "#fdbc6d", "#fdbe6e", "#fdc070", "#fdc272", "#fdc473", "#fdc675", "#fdc877", "#fdca78", "#fdcc7a", "#fdce7c", "#fdd07d", "#fdd27f", "#fdd481", "#fdd682", "#fdd884", "#fdda86", "#fddc87", "#fdde89", "#fee08b", "#fee18d", "#fee28f", "#fee391", "#fee493", "#fee695", "#fee797", "#fee899", "#fee99b", "#feea9d", "#feec9f", "#feeda1", "#feeea3", "#feefa5", "#fef1a7", "#fef2a9", "#fef3ab", "#fef4ad", "#fef5af", "#fef7b1", "#fef8b3", "#fef9b5", "#fefab7", "#fefbb9", "#fefdbb", "#fefebd", "#fefebd", "#fcfebb", "#fbfdb9", "#f9fcb7", "#f8fcb5", "#f6fbb3", "#f5fab1", "#f3faaf", "#f2f9ad", "#f0f9ab", "#eff8a9", "#edf7a7", "#ecf7a5", "#eaf6a3", "#e9f5a1", "#e7f59f", "#e6f49d", "#e4f49b", "#e3f399", "#e1f297", "#e0f295", "#def193", "#ddf091", "#dbf08f", "#daef8d", "#d9ef8b", "#d7ee89", "#d5ed88", "#d3ec87", "#d1eb85", "#cfea84", "#cde983", "#cbe881", "#c9e880", "#c7e77f", "#c5e67e", "#c3e57c", "#c1e47b", "#bfe37a", "#bde278", "#bbe277", "#b9e176", "#b7e075", "#b5df73", "#b3de72", "#b1dd71", "#afdc6f", "#addc6e", "#abdb6d", "#a9da6b", "#a7d96a", "#a4d869", "#a2d769", "#9fd669", "#9dd569", "#9ad468", "#98d268", "#95d168", "#93d067", "#90cf67", "#8ece67", "#8bcd67", "#89cc66", "#86cb66", "#84ca66", "#81c966", "#7fc765", "#7cc665", "#7ac565", "#77c464", "#75c364", "#72c264", "#70c164", "#6dc063", "#6bbf63", "#68be63", "#66bd63", "#63bb62", "#60ba61", "#5db860", "#5ab760", "#57b55f", "#54b45e", "#51b25d", "#4eb15d", "#4baf5c", "#48ae5b", "#45ad5a", "#42ab5a", "#3faa59", "#3ca858", "#39a757", "#36a557", "#33a456", "#30a255", "#2da154", "#2a9f54", "#279e53", "#249d52", "#219b51", "#1e9a51", "#1b9850", "#19974f", "#18954e", "#17934d", "#16914c", "#158f4b", "#148d4a", "#138b49", "#128948", "#118847", "#108646", "#0f8445", "#0e8244", "#0d8043", "#0c7e42", "#0b7c41", "#0a7a40", "#09783f", "#08773e", "#07753d", "#06733c", "#05713b", "#046f3a", "#036d39", "#026b38", "#016937", "#006837" ], "Reds": [ "#fff5f0", "#fef4ef", "#fef3ee", "#fef3ed", "#fef2ec", "#fef1eb", "#fef1ea", "#fef0e9", "#feefe8", "#feefe7", "#feeee6", "#feede5", "#feede4", "#feece3", "#feebe2", "#feebe1", "#feeae0", "#fee9e0", "#fee9df", "#fee8de", "#fee7dd", "#fee7dc", "#fee6db", "#fee5da", "#fee5d9", "#fee4d8", "#fee3d7", "#fee3d6", "#fee2d5", "#fee1d4", "#fee1d3", "#fee0d2", "#fddfd1", "#fdded0", "#fdddce", "#fddccd", "#fddbcb", "#fddaca", "#fdd8c8", "#fdd7c7", "#fdd6c5", "#fdd5c3", "#fdd4c2", "#fdd3c0", "#fdd1bf", "#fdd0bd", "#fdcfbc", "#fdceba", "#fccdb9", "#fcccb7", "#fccab6", "#fcc9b4", "#fcc8b3", "#fcc7b1", "#fcc6af", "#fcc5ae", "#fcc3ac", "#fcc2ab", "#fcc1a9", "#fcc0a8", "#fcbfa6", "#fcbea5", "#fcbda3", "#fcbba2", "#fcbaa0", "#fcb99f", "#fcb89d", "#fcb69c", "#fcb59a", "#fcb499", "#fcb297", "#fcb196", "#fcb094", "#fcaf93", "#fcad91", "#fcac90", "#fcab8e", "#fca98d", "#fca88b", "#fca78a", "#fca689", "#fca487", "#fca386", "#fca284", "#fca083", "#fc9f81", "#fc9e80", "#fc9d7e", "#fc9b7d", "#fc9a7b", "#fc997a", "#fc9778", "#fc9677", "#fc9575", "#fc9474", "#fc9272", "#fb9171", "#fb9070", "#fb8f6f", "#fb8d6d", "#fb8c6c", "#fb8b6b", "#fb8a6a", "#fb8868", "#fb8767", "#fb8666", "#fb8464", "#fb8363", "#fb8262", "#fb8161", "#fb7f5f", "#fb7e5e", "#fb7d5d", "#fb7c5c", "#fb7a5a", "#fb7959", "#fb7858", "#fb7757", "#fb7555", "#fb7454", "#fb7353", "#fb7252", "#fb7050", "#fb6f4f", "#fb6e4e", "#fb6d4d", "#fb6b4b", "#fb6a4a", "#fa6949", "#fa6748", "#fa6647", "#f96446", "#f96345", "#f86144", "#f86043", "#f85e42", "#f75d42", "#f75b41", "#f75a40", "#f6593f", "#f6573e", "#f5563d", "#f5543c", "#f5533b", "#f4513a", "#f45039", "#f44e38", "#f34d37", "#f34b36", "#f24a35", "#f24834", "#f24733", "#f14532", "#f14432", "#f14231", "#f04130", "#f03f2f", "#ef3e2e", "#ef3d2d", "#ef3b2c", "#ee3a2b", "#ed392b", "#ec382a", "#ea372a", "#e93529", "#e83429", "#e73328", "#e63228", "#e53127", "#e43027", "#e32f27", "#e12e26", "#e02d26", "#df2c25", "#de2a25", "#dd2924", "#dc2824", "#db2723", "#d92623", "#d82522", "#d72422", "#d62321", "#d52221", "#d42120", "#d31f20", "#d21e1f", "#d01d1f", "#cf1c1f", "#ce1b1e", "#cd1a1e", "#cc191d", "#cb181d", "#ca171c", "#c8171c", "#c7171c", "#c6161c", "#c5161b", "#c4161b", "#c2161b", "#c1151b", "#c0151a", "#bf151a", "#be141a", "#bc141a", "#bb1419", "#ba1419", "#b91319", "#b81319", "#b71318", "#b51218", "#b41218", "#b31218", "#b21217", "#b11117", "#af1117", "#ae1117", "#ad1116", "#ac1016", "#ab1016", "#a91016", "#a80f15", "#a70f15", "#a60f15", "#a50f15", "#a30e14", "#a10e14", "#9f0d14", "#9d0d14", "#9b0c13", "#990c13", "#970b13", "#950b13", "#930a12", "#910a12", "#8f0912", "#8d0912", "#8b0811", "#8a0811", "#880811", "#860711", "#840710", "#820610", "#800610", "#7e0510", "#7c050f", "#7a040f", "#78040f", "#76030f", "#74030e", "#72020e", "#70020e", "#6e010e", "#6c010d", "#6a000d", "#68000d", "#67000c" ], "Set1": [ "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#e41a1c", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#377eb8", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#4daf4a", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#984ea3", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ff7f00", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#ffff33", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#a65628", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#f781bf", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999", "#999999" ], "Set2": [ "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#66c2a5", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#fc8d62", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#8da0cb", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#e78ac3", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#a6d854", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#ffd92f", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#e5c494", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3", "#b3b3b3" ], "Set3": [ "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#8dd3c7", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#ffffb3", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#bebada", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#fb8072", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#80b1d3", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#fdb462", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#b3de69", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#fccde5", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#bc80bd", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ccebc5", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f", "#ffed6f" ], "Spectral": [ "#9e0142", "#a00342", "#a20543", "#a40843", "#a60a44", "#a80c44", "#aa0f45", "#ad1145", "#af1446", "#b11646", "#b31847", "#b51b47", "#b71d48", "#ba2048", "#bc2249", "#be2449", "#c0274a", "#c2294a", "#c42c4b", "#c62e4b", "#c9304c", "#cb334c", "#cd354d", "#cf384d", "#d13a4e", "#d33c4e", "#d53e4e", "#d6404e", "#d8424d", "#d9444d", "#da464c", "#db484c", "#dc494b", "#de4b4b", "#df4d4b", "#e04f4a", "#e1514a", "#e25349", "#e45549", "#e55648", "#e65848", "#e75a47", "#e95c47", "#ea5e46", "#eb6046", "#ec6145", "#ed6345", "#ef6544", "#f06744", "#f16943", "#f26b43", "#f46d43", "#f46f44", "#f47245", "#f57446", "#f57747", "#f57948", "#f67c4a", "#f67e4b", "#f6814c", "#f7834d", "#f7864e", "#f7894f", "#f88b51", "#f88e52", "#f89053", "#f99354", "#f99555", "#fa9856", "#fa9a58", "#fa9d59", "#fb9f5a", "#fba25b", "#fba55c", "#fca75e", "#fcaa5f", "#fcac60", "#fdae61", "#fdb063", "#fdb265", "#fdb466", "#fdb668", "#fdb86a", "#fdba6b", "#fdbc6d", "#fdbe6e", "#fdc070", "#fdc272", "#fdc473", "#fdc675", "#fdc877", "#fdca78", "#fdcc7a", "#fdce7c", "#fdd07d", "#fdd27f", "#fdd481", "#fdd682", "#fdd884", "#fdda86", "#fddc87", "#fdde89", "#fee08b", "#fee18d", "#fee28f", "#fee391", "#fee493", "#fee695", "#fee797", "#fee899", "#fee99b", "#feea9d", "#feec9f", "#feeda1", "#feeea3", "#feefa5", "#fef1a7", "#fef2a9", "#fef3ab", "#fef4ad", "#fef5af", "#fef7b1", "#fef8b3", "#fef9b5", "#fefab7", "#fefbb9", "#fefdbb", "#fefebd", "#fefebe", "#fdfebc", "#fcfebb", "#fbfdb9", "#fafdb8", "#f9fcb6", "#f8fcb5", "#f7fcb3", "#f6fbb2", "#f5fbb0", "#f4faae", "#f3faad", "#f2faab", "#f1f9aa", "#f0f9a8", "#eff8a7", "#eef8a5", "#edf8a4", "#ecf7a2", "#ebf7a1", "#eaf69f", "#e9f69e", "#e8f69c", "#e7f59b", "#e6f599", "#e6f598", "#e3f498", "#e1f398", "#dff299", "#dcf199", "#daf09a", "#d8ef9a", "#d5ee9b", "#d3ed9b", "#d1ec9c", "#ceeb9c", "#ccea9d", "#cae99d", "#c7e89e", "#c5e79e", "#c3e69f", "#c0e59f", "#bee5a0", "#bce4a0", "#bae3a0", "#b7e2a1", "#b5e1a1", "#b3e0a2", "#b0dfa2", "#aedea3", "#acdda3", "#a9dca4", "#a6dba4", "#a4daa4", "#a1d9a4", "#9ed8a4", "#9cd7a4", "#99d6a4", "#96d5a4", "#94d4a4", "#91d2a4", "#8ed1a4", "#8bd0a4", "#89cfa4", "#86cea4", "#83cda4", "#81cca4", "#7ecba4", "#7bcaa4", "#78c9a4", "#76c8a4", "#73c7a4", "#70c6a4", "#6ec5a4", "#6bc4a4", "#68c3a4", "#66c2a5", "#63bfa5", "#61bda6", "#5fbba7", "#5db8a8", "#5bb6a9", "#59b4aa", "#57b2ab", "#55afac", "#53adad", "#51abae", "#4fa8af", "#4da6b0", "#4ba4b1", "#49a2b2", "#479fb3", "#459db4", "#439bb5", "#4199b5", "#3f96b6", "#3d94b7", "#3b92b8", "#398fb9", "#378dba", "#358bbb", "#3389bc", "#3286bc", "#3484bb", "#3682ba", "#3880b9", "#397db8", "#3b7bb7", "#3d79b6", "#3e77b5", "#4075b4", "#4272b2", "#4470b1", "#456eb0", "#476caf", "#4969ae", "#4b67ad", "#4c65ac", "#4e63ab", "#5060aa", "#515ea9", "#535ca8", "#555aa7", "#5757a6", "#5855a5", "#5a53a4", "#5c51a3", "#5e4fa2" ], "Wistia": [ "#e4ff7a", "#e4fe78", "#e4fe76", "#e5fd75", "#e5fd73", "#e6fd72", "#e6fc70", "#e6fc6f", "#e7fc6d", "#e7fb6c", "#e8fb6a", "#e8fb69", "#e9fa67", "#e9fa66", "#e9f964", "#eaf963", "#eaf961", "#ebf860", "#ebf85e", "#ecf85d", "#ecf75b", "#ecf75a", "#edf758", "#edf657", "#eef655", "#eef554", "#eff552", "#eff551", "#eff44f", "#f0f44e", "#f0f44c", "#f1f34b", "#f1f349", "#f1f348", "#f2f246", "#f2f245", "#f3f243", "#f3f142", "#f4f140", "#f4f03f", "#f4f03d", "#f5f03c", "#f5ef3a", "#f6ef39", "#f6ef37", "#f7ee36", "#f7ee34", "#f7ee33", "#f8ed31", "#f8ed30", "#f9ec2e", "#f9ec2d", "#faec2b", "#faeb2a", "#faeb28", "#fbeb27", "#fbea25", "#fcea24", "#fcea22", "#fce921", "#fde91f", "#fde81e", "#fee81c", "#fee81b", "#ffe719", "#ffe719", "#ffe619", "#ffe518", "#ffe518", "#ffe417", "#ffe317", "#ffe317", "#ffe216", "#ffe116", "#ffe115", "#ffe015", "#ffdf15", "#ffdf14", "#ffde14", "#ffdd13", "#ffdd13", "#ffdc12", "#ffdb12", "#ffdb12", "#ffda11", "#ffd911", "#ffd810", "#ffd810", "#ffd710", "#ffd60f", "#ffd60f", "#ffd50e", "#ffd40e", "#ffd40e", "#ffd30d", "#ffd20d", "#ffd20c", "#ffd10c", "#ffd00c", "#ffd00b", "#ffcf0b", "#ffce0a", "#ffce0a", "#ffcd09", "#ffcc09", "#ffcc09", "#ffcb08", "#ffca08", "#ffca07", "#ffc907", "#ffc807", "#ffc806", "#ffc706", "#ffc605", "#ffc605", "#ffc505", "#ffc404", "#ffc404", "#ffc303", "#ffc203", "#ffc203", "#ffc102", "#ffc002", "#ffc001", "#ffbf01", "#ffbe01", "#ffbe00", "#ffbd00", "#ffbc00", "#ffbc00", "#ffbb00", "#ffbb00", "#ffba00", "#ffba00", "#ffba00", "#ffb900", "#ffb900", "#ffb800", "#ffb800", "#ffb700", "#ffb700", "#ffb600", "#ffb600", "#ffb500", "#ffb500", "#ffb500", "#ffb400", "#ffb400", "#ffb300", "#ffb300", "#ffb200", "#ffb200", "#ffb100", "#ffb100", "#ffb000", "#ffb000", "#ffb000", "#ffaf00", "#ffaf00", "#ffae00", "#ffae00", "#ffad00", "#ffad00", "#ffac00", "#ffac00", "#ffab00", "#ffab00", "#ffab00", "#ffaa00", "#ffaa00", "#ffa900", "#ffa900", "#ffa800", "#ffa800", "#ffa700", "#ffa700", "#ffa600", "#ffa600", "#ffa600", "#ffa500", "#ffa500", "#ffa400", "#ffa400", "#ffa300", "#ffa300", "#ffa200", "#ffa200", "#ffa100", "#ffa100", "#ffa100", "#ffa000", "#ffa000", "#fe9f00", "#fe9f00", "#fe9e00", "#fe9e00", "#fe9d00", "#fe9d00", "#fe9c00", "#fe9b00", "#fe9b00", "#fe9a00", "#fe9a00", "#fe9900", "#fe9900", "#fe9800", "#fe9800", "#fe9700", "#fe9700", "#fe9600", "#fe9600", "#fe9500", "#fe9500", "#fd9400", "#fd9400", "#fd9300", "#fd9300", "#fd9200", "#fd9200", "#fd9100", "#fd9100", "#fd9000", "#fd9000", "#fd8f00", "#fd8f00", "#fd8e00", "#fd8e00", "#fd8d00", "#fd8c00", "#fd8c00", "#fd8b00", "#fd8b00", "#fd8a00", "#fd8a00", "#fc8900", "#fc8900", "#fc8800", "#fc8800", "#fc8700", "#fc8700", "#fc8600", "#fc8600", "#fc8500", "#fc8500", "#fc8400", "#fc8400", "#fc8300", "#fc8300", "#fc8200", "#fc8200", "#fc8100", "#fc8100", "#fc8000", "#fc8000", "#fc7f00", "#fc7f00" ], "YlGn": [ "#ffffe5", "#fefee3", "#fefee2", "#fefee0", "#fdfedf", "#fdfede", "#fdfedc", "#fdfedb", "#fcfed9", "#fcfed8", "#fcfed7", "#fcfdd5", "#fbfdd4", "#fbfdd3", "#fbfdd1", "#fbfdd0", "#fafdce", "#fafdcd", "#fafdcc", "#fafdca", "#f9fdc9", "#f9fdc8", "#f9fcc6", "#f9fcc5", "#f8fcc3", "#f8fcc2", "#f8fcc1", "#f8fcbf", "#f7fcbe", "#f7fcbc", "#f7fcbb", "#f7fcba", "#f6fbb8", "#f5fbb8", "#f5fbb7", "#f4fab6", "#f3fab6", "#f2fab5", "#f1f9b4", "#f0f9b4", "#eff8b3", "#eef8b2", "#edf8b2", "#ecf7b1", "#ebf7b0", "#eaf7af", "#e9f6af", "#e8f6ae", "#e7f5ad", "#e6f5ad", "#e5f5ac", "#e5f4ab", "#e4f4ab", "#e3f4aa", "#e2f3a9", "#e1f3a9", "#e0f2a8", "#dff2a7", "#def2a6", "#ddf1a6", "#dcf1a5", "#dbf1a4", "#daf0a4", "#d9f0a3", "#d8efa2", "#d7efa2", "#d5eea1", "#d4eea0", "#d3eda0", "#d1ec9f", "#d0ec9e", "#ceeb9e", "#cdeb9d", "#ccea9c", "#cae99c", "#c9e99b", "#c8e89a", "#c6e89a", "#c5e799", "#c3e698", "#c2e698", "#c1e597", "#bfe596", "#bee496", "#bde395", "#bbe395", "#bae294", "#b8e293", "#b7e193", "#b6e092", "#b4e091", "#b3df91", "#b2df90", "#b0de8f", "#afdd8f", "#addd8e", "#acdc8d", "#aadc8d", "#a9db8c", "#a7da8b", "#a5d98b", "#a4d98a", "#a2d889", "#a0d789", "#9fd688", "#9dd687", "#9bd587", "#9ad486", "#98d485", "#96d385", "#95d284", "#93d183", "#91d183", "#90d082", "#8ecf81", "#8ccf81", "#8bce80", "#89cd7f", "#87cc7f", "#86cc7e", "#84cb7d", "#82ca7d", "#81c97c", "#7fc97b", "#7dc87b", "#7cc77a", "#7ac779", "#78c679", "#77c578", "#75c477", "#73c376", "#71c375", "#70c275", "#6ec174", "#6cc073", "#6bbf72", "#69be71", "#67bd70", "#65bd6f", "#64bc6e", "#62bb6e", "#60ba6d", "#5eb96c", "#5db86b", "#5bb86a", "#59b769", "#58b668", "#56b567", "#54b466", "#52b366", "#51b265", "#4fb264", "#4db163", "#4bb062", "#4aaf61", "#48ae60", "#46ad5f", "#45ad5f", "#43ac5e", "#41ab5d", "#40aa5c", "#3fa95b", "#3ea75a", "#3da65a", "#3ca559", "#3ba458", "#3aa257", "#39a156", "#38a055", "#379f55", "#379e54", "#369c53", "#359b52", "#349a51", "#339951", "#329750", "#31964f", "#30954e", "#2f944d", "#2e924c", "#2d914c", "#2c904b", "#2b8f4a", "#2a8e49", "#298c48", "#288b48", "#278a47", "#278946", "#268745", "#258644", "#248544", "#238443", "#228342", "#218242", "#1f8141", "#1e8041", "#1d7f41", "#1c7e40", "#1b7e40", "#1a7d40", "#197c3f", "#187b3f", "#177a3e", "#16793e", "#15783e", "#13773d", "#12773d", "#11763d", "#10753c", "#0f743c", "#0e733b", "#0d723b", "#0c713b", "#0b703a", "#0a703a", "#086f3a", "#076e39", "#066d39", "#056c38", "#046b38", "#036a38", "#026937", "#016837", "#006837", "#006736", "#006536", "#006435", "#006335", "#006234", "#006134", "#006033", "#005f33", "#005e33", "#005d32", "#005c32", "#005a31", "#005931", "#005830", "#005730", "#005630", "#00552f", "#00542f", "#00532e", "#00522e", "#00512d", "#004f2d", "#004e2c", "#004d2c", "#004c2c", "#004b2b", "#004a2b", "#00492a", "#00482a", "#004729", "#004629", "#004529" ], "YlGnBu": [ "#ffffd9", "#fefed7", "#fdfed6", "#fdfed5", "#fcfed3", "#fcfdd2", "#fbfdd1", "#fbfdd0", "#fafdce", "#f9fdcd", "#f9fccc", "#f8fccb", "#f8fcc9", "#f7fcc8", "#f7fbc7", "#f6fbc6", "#f5fbc4", "#f5fbc3", "#f4fbc2", "#f4fac1", "#f3fabf", "#f3fabe", "#f2fabd", "#f2f9bc", "#f1f9ba", "#f0f9b9", "#f0f9b8", "#eff9b7", "#eff8b5", "#eef8b4", "#eef8b3", "#edf8b2", "#ecf7b1", "#ebf7b1", "#eaf7b1", "#e9f6b1", "#e8f6b1", "#e6f5b1", "#e5f5b1", "#e4f4b1", "#e3f4b1", "#e2f3b1", "#e0f3b1", "#dff2b2", "#def2b2", "#ddf1b2", "#dcf1b2", "#daf0b2", "#d9f0b2", "#d8efb2", "#d7efb2", "#d6efb2", "#d5eeb2", "#d3eeb2", "#d2edb3", "#d1edb3", "#d0ecb3", "#cfecb3", "#cdebb3", "#ccebb3", "#cbeab3", "#caeab3", "#c9e9b3", "#c7e9b3", "#c6e8b4", "#c4e7b4", "#c1e7b4", "#bfe6b4", "#bde5b4", "#bbe4b5", "#b8e3b5", "#b6e2b5", "#b4e1b5", "#b2e0b6", "#afdfb6", "#addfb6", "#abdeb6", "#a9ddb6", "#a6dcb7", "#a4dbb7", "#a2dab7", "#a0d9b7", "#9dd8b8", "#9bd8b8", "#99d7b8", "#97d6b8", "#94d5b8", "#92d4b9", "#90d3b9", "#8dd2b9", "#8bd1b9", "#89d1b9", "#87d0ba", "#84cfba", "#82ceba", "#80cdba", "#7eccbb", "#7cccbb", "#7acbbb", "#78cabb", "#76c9bc", "#74c9bc", "#72c8bc", "#70c7bd", "#6ec6bd", "#6cc6bd", "#6ac5bd", "#68c4be", "#66c4be", "#64c3be", "#63c2bf", "#61c1bf", "#5fc1bf", "#5dc0bf", "#5bbfc0", "#59bfc0", "#57bec0", "#55bdc1", "#53bcc1", "#51bcc1", "#4fbbc1", "#4dbac2", "#4bb9c2", "#49b9c2", "#47b8c3", "#45b7c3", "#43b7c3", "#41b6c3", "#40b5c3", "#3fb4c3", "#3eb3c3", "#3db1c3", "#3bb0c3", "#3aafc3", "#39aec3", "#38adc3", "#37acc2", "#36aac2", "#35a9c2", "#34a8c2", "#32a7c2", "#31a6c2", "#30a5c2", "#2fa4c2", "#2ea2c1", "#2da1c1", "#2ca0c1", "#2a9fc1", "#299ec1", "#289dc1", "#279bc1", "#269ac1", "#2599c0", "#2498c0", "#2397c0", "#2196c0", "#2094c0", "#1f93c0", "#1e92c0", "#1d91c0", "#1d90bf", "#1d8ebe", "#1d8cbe", "#1d8bbd", "#1d89bc", "#1d88bb", "#1e86bb", "#1e84ba", "#1e83b9", "#1e81b8", "#1e80b8", "#1e7eb7", "#1e7cb6", "#1f7bb5", "#1f79b4", "#1f78b4", "#1f76b3", "#1f74b2", "#1f73b1", "#2071b1", "#2070b0", "#206eaf", "#206cae", "#206bae", "#2069ad", "#2168ac", "#2166ab", "#2164ab", "#2163aa", "#2161a9", "#2160a8", "#215ea8", "#225da7", "#225ba6", "#225aa6", "#2259a5", "#2257a5", "#2256a4", "#2255a3", "#2253a3", "#2252a2", "#2251a1", "#234fa1", "#234ea0", "#234da0", "#234b9f", "#234a9e", "#23499e", "#23479d", "#23469c", "#23459c", "#23439b", "#23429a", "#24419a", "#244099", "#243e99", "#243d98", "#243c97", "#243a97", "#243996", "#243895", "#243695", "#243594", "#243494", "#243392", "#233290", "#22318e", "#21318c", "#20308a", "#1f2f88", "#1e2f87", "#1d2e85", "#1c2d83", "#1c2c81", "#1b2c7f", "#1a2b7d", "#192a7b", "#182979", "#172978", "#162876", "#152774", "#142772", "#132670", "#12256e", "#12246c", "#11246a", "#102368", "#0f2267", "#0e2265", "#0d2163", "#0c2061", "#0b1f5f", "#0a1f5d", "#091e5b", "#081d59", "#081d58" ], "YlOrBr": [ "#ffffe5", "#fffee3", "#fffee2", "#fffee1", "#fffddf", "#fffdde", "#fffddd", "#fffddb", "#fffcda", "#fffcd9", "#fffcd8", "#fffcd6", "#fffbd5", "#fffbd4", "#fffbd2", "#fffbd1", "#fffad0", "#fffacf", "#fffacd", "#fffacc", "#fff9cb", "#fff9c9", "#fff9c8", "#fff9c7", "#fff8c6", "#fff8c4", "#fff8c3", "#fff8c2", "#fff7c0", "#fff7bf", "#fff7be", "#fff7bd", "#fef6bb", "#fef6ba", "#fef5b9", "#fef5b7", "#fef4b6", "#fef3b5", "#fef3b3", "#fef2b2", "#fef1b1", "#fef1af", "#fef0ae", "#fef0ac", "#feefab", "#feeeaa", "#feeea8", "#feeda7", "#feeca6", "#feeca4", "#feeba3", "#feeba2", "#feeaa0", "#fee99f", "#fee99e", "#fee89c", "#fee79b", "#fee79a", "#fee698", "#fee597", "#fee596", "#fee494", "#fee493", "#fee392", "#fee290", "#fee18e", "#fee08c", "#fedf8a", "#fede88", "#fedd86", "#fedc84", "#fedb81", "#feda7f", "#feda7d", "#fed97b", "#fed879", "#fed777", "#fed675", "#fed573", "#fed471", "#fed36f", "#fed26d", "#fed16b", "#fed069", "#fecf67", "#fece65", "#fecd62", "#fecc60", "#fecb5e", "#feca5c", "#fec95a", "#fec858", "#fec756", "#fec654", "#fec552", "#fec450", "#fec34e", "#fec24d", "#fec04c", "#febf4a", "#febe49", "#febc48", "#febb47", "#feba46", "#feb845", "#feb743", "#feb642", "#feb441", "#feb340", "#feb13f", "#feb03d", "#feaf3c", "#fead3b", "#feac3a", "#feab39", "#fea937", "#fea836", "#fea735", "#fea534", "#fea433", "#fea331", "#fea130", "#fea02f", "#fe9f2e", "#fe9d2d", "#fe9c2b", "#fe9b2a", "#fe9929", "#fd9828", "#fd9728", "#fc9527", "#fc9426", "#fb9326", "#fa9125", "#fa9024", "#f98f24", "#f98e23", "#f88c22", "#f88b22", "#f78a21", "#f68820", "#f68720", "#f5861f", "#f5851e", "#f4831e", "#f4821d", "#f3811c", "#f27f1c", "#f27e1b", "#f17d1a", "#f17c1a", "#f07a19", "#f07918", "#ef7818", "#ef7617", "#ee7516", "#ed7416", "#ed7315", "#ec7114", "#ec7014", "#eb6f13", "#ea6e13", "#e96d12", "#e86b11", "#e76a11", "#e66910", "#e56810", "#e4670f", "#e3660f", "#e2650e", "#e1640e", "#e0620d", "#df610c", "#de600c", "#dd5f0b", "#dc5e0b", "#db5d0a", "#da5c0a", "#d95a09", "#d85908", "#d75808", "#d65707", "#d55607", "#d45506", "#d35406", "#d25305", "#d15104", "#d05004", "#cf4f03", "#ce4e03", "#cd4d02", "#cc4c02", "#ca4b02", "#c94a02", "#c74902", "#c64902", "#c44802", "#c24702", "#c14602", "#bf4602", "#be4502", "#bc4402", "#ba4302", "#b94302", "#b74202", "#b64102", "#b44002", "#b24002", "#b13f03", "#af3e03", "#ae3d03", "#ac3d03", "#aa3c03", "#a93b03", "#a73a03", "#a63a03", "#a43903", "#a23803", "#a13703", "#9f3703", "#9e3603", "#9c3503", "#9a3403", "#993403", "#973304", "#963304", "#943204", "#923204", "#913104", "#8f3104", "#8e3004", "#8c3004", "#8a2f04", "#892f04", "#872e04", "#862e04", "#842d04", "#822d04", "#812d04", "#7f2c04", "#7e2c05", "#7c2b05", "#7a2b05", "#792a05", "#772a05", "#762905", "#742905", "#722805", "#712805", "#6f2705", "#6e2705", "#6c2605", "#6a2605", "#692505", "#672505", "#662505" ], "YlOrRd": [ "#ffffcc", "#fffeca", "#fffdc9", "#fffdc7", "#fffcc6", "#fffcc5", "#fffbc3", "#fffbc2", "#fffac0", "#fff9bf", "#fff9be", "#fff8bc", "#fff8bb", "#fff7ba", "#fff7b8", "#fff6b7", "#fff5b5", "#fff5b4", "#fff4b3", "#fff4b1", "#fff3b0", "#fff3af", "#fff2ad", "#fff2ac", "#fff1aa", "#fff0a9", "#fff0a8", "#ffefa6", "#ffefa5", "#ffeea3", "#ffeea2", "#ffeda1", "#feec9f", "#feec9e", "#feeb9d", "#feeb9b", "#feea9a", "#fee999", "#fee997", "#fee896", "#fee795", "#fee793", "#fee692", "#fee691", "#fee590", "#fee48e", "#fee48d", "#fee38c", "#fee28a", "#fee289", "#fee188", "#fee186", "#fee085", "#fedf84", "#fedf82", "#fede81", "#fedd80", "#fedd7e", "#fedc7d", "#fedb7c", "#fedb7a", "#feda79", "#feda78", "#fed976", "#fed875", "#fed774", "#fed673", "#fed571", "#fed370", "#fed26f", "#fed16d", "#fed06c", "#fece6b", "#fecd69", "#fecc68", "#fecb67", "#feca65", "#fec864", "#fec763", "#fec661", "#fec560", "#fec35f", "#fec25d", "#fec15c", "#fec05b", "#febf5a", "#febd58", "#febc57", "#febb56", "#feba54", "#feb853", "#feb752", "#feb650", "#feb54f", "#feb34e", "#feb24c", "#fdb14b", "#fdb04b", "#fdaf4a", "#fdae4a", "#fdac49", "#fdab49", "#fdaa48", "#fda948", "#fda847", "#fda747", "#fda546", "#fda446", "#fda345", "#fda245", "#fda144", "#fda044", "#fd9e43", "#fd9d43", "#fd9c42", "#fd9b42", "#fd9a41", "#fd9941", "#fd9840", "#fd9640", "#fd953f", "#fd943f", "#fd933e", "#fd923e", "#fd913d", "#fd8f3d", "#fd8e3c", "#fd8d3c", "#fc8c3b", "#fc8a3b", "#fc883a", "#fc863a", "#fc8439", "#fc8238", "#fc8038", "#fc7e37", "#fc7c37", "#fc7a36", "#fc7836", "#fc7635", "#fc7434", "#fc7234", "#fc7033", "#fc6e33", "#fc6c32", "#fc6a32", "#fc6831", "#fc6630", "#fc6430", "#fc622f", "#fc602f", "#fc5e2e", "#fc5c2e", "#fc5a2d", "#fc582d", "#fc562c", "#fc542b", "#fc522b", "#fc502a", "#fc4e2a", "#fb4c29", "#fa4b29", "#f94928", "#f94828", "#f84627", "#f74427", "#f64327", "#f64126", "#f53f26", "#f43e25", "#f33c25", "#f23b24", "#f23924", "#f13724", "#f03623", "#ef3423", "#ee3222", "#ee3122", "#ed2f21", "#ec2d21", "#eb2c20", "#eb2a20", "#ea2920", "#e9271f", "#e8251f", "#e7241e", "#e7221e", "#e6201d", "#e51f1d", "#e41d1c", "#e31c1c", "#e31a1c", "#e2191c", "#e0181c", "#df171c", "#de161d", "#dd161d", "#dc151d", "#da141e", "#d9131e", "#d8121e", "#d7121f", "#d6111f", "#d4101f", "#d30f20", "#d20e20", "#d10d20", "#d00d20", "#cf0c21", "#cd0b21", "#cc0a21", "#cb0922", "#ca0922", "#c90822", "#c70723", "#c60623", "#c50523", "#c40424", "#c30424", "#c10324", "#c00225", "#bf0125", "#be0025", "#bd0025", "#bb0026", "#b90026", "#b70026", "#b50026", "#b30026", "#b10026", "#af0026", "#ad0026", "#ac0026", "#aa0026", "#a80026", "#a60026", "#a40026", "#a20026", "#a00026", "#9e0026", "#9c0026", "#9a0026", "#980026", "#960026", "#950026", "#930026", "#910026", "#8f0026", "#8d0026", "#8b0026", "#890026", "#870026", "#850026", "#830026", "#810026", "#800026" ], "afmhot": [ "#000000", "#020000", "#040000", "#060000", "#080000", "#0a0000", "#0c0000", "#0e0000", "#100000", "#120000", "#140000", "#160000", "#180000", "#1a0000", "#1c0000", "#1e0000", "#200000", "#220000", "#240000", "#260000", "#280000", "#2a0000", "#2c0000", "#2e0000", "#300000", "#320000", "#340000", "#360000", "#380000", "#3a0000", "#3c0000", "#3e0000", "#400000", "#410000", "#440000", "#460000", "#480000", "#490000", "#4c0000", "#4e0000", "#500000", "#510000", "#540000", "#560000", "#580000", "#590000", "#5c0000", "#5e0000", "#600000", "#610000", "#640000", "#660000", "#680000", "#690000", "#6c0000", "#6e0000", "#700000", "#710000", "#740000", "#760000", "#780000", "#790000", "#7c0000", "#7e0000", "#800000", "#820200", "#830400", "#860600", "#880800", "#8a0a00", "#8c0c00", "#8e0e00", "#901000", "#921200", "#931400", "#961600", "#981800", "#9a1a00", "#9c1c00", "#9e1e00", "#a02000", "#a22200", "#a32400", "#a62600", "#a82800", "#aa2a00", "#ac2c00", "#ae2e00", "#b03000", "#b23200", "#b33400", "#b63600", "#b83800", "#ba3a00", "#bc3c00", "#be3e00", "#c04000", "#c24200", "#c34400", "#c64600", "#c84800", "#ca4a00", "#cc4c00", "#ce4e00", "#d05000", "#d25200", "#d35400", "#d65600", "#d85800", "#da5a00", "#dc5c00", "#de5e00", "#e06000", "#e26200", "#e36400", "#e66600", "#e86800", "#ea6a00", "#ec6c00", "#ee6e00", "#f07000", "#f27200", "#f37400", "#f67600", "#f87800", "#fa7a00", "#fc7c00", "#fe7e00", "#ff8000", "#ff8202", "#ff8404", "#ff8606", "#ff8808", "#ff8a0b", "#ff8c0d", "#ff8e0f", "#ff9010", "#ff9212", "#ff9414", "#ff9616", "#ff9819", "#ff9a1b", "#ff9c1d", "#ff9e1f", "#ffa020", "#ffa222", "#ffa424", "#ffa626", "#ffa828", "#ffaa2b", "#ffac2d", "#ffae2f", "#ffb030", "#ffb232", "#ffb434", "#ffb636", "#ffb839", "#ffba3b", "#ffbc3d", "#ffbe3f", "#ffc041", "#ffc242", "#ffc444", "#ffc646", "#ffc848", "#ffca4b", "#ffcc4d", "#ffce4f", "#ffd051", "#ffd252", "#ffd454", "#ffd656", "#ffd859", "#ffda5b", "#ffdc5d", "#ffde5f", "#ffe061", "#ffe262", "#ffe464", "#ffe666", "#ffe868", "#ffea6b", "#ffec6d", "#ffee6f", "#fff071", "#fff272", "#fff474", "#fff676", "#fff879", "#fffa7b", "#fffc7d", "#fffe7f", "#ffff81", "#ffff83", "#ffff84", "#ffff86", "#ffff88", "#ffff8b", "#ffff8d", "#ffff8f", "#ffff91", "#ffff93", "#ffff94", "#ffff96", "#ffff99", "#ffff9b", "#ffff9d", "#ffff9f", "#ffffa1", "#ffffa3", "#ffffa4", "#ffffa6", "#ffffa8", "#ffffab", "#ffffad", "#ffffaf", "#ffffb1", "#ffffb3", "#ffffb4", "#ffffb6", "#ffffb9", "#ffffbb", "#ffffbd", "#ffffbf", "#ffffc1", "#ffffc3", "#ffffc4", "#ffffc6", "#ffffc8", "#ffffcb", "#ffffcd", "#ffffcf", "#ffffd1", "#ffffd3", "#ffffd4", "#ffffd6", "#ffffd9", "#ffffdb", "#ffffdd", "#ffffdf", "#ffffe1", "#ffffe3", "#ffffe4", "#ffffe6", "#ffffe8", "#ffffeb", "#ffffed", "#ffffef", "#fffff1", "#fffff3", "#fffff4", "#fffff6", "#fffff9", "#fffffb", "#fffffd", "#ffffff" ], "autumn": [ "#ff0000", "#ff0100", "#ff0200", "#ff0300", "#ff0400", "#ff0500", "#ff0600", "#ff0700", "#ff0800", "#ff0900", "#ff0a00", "#ff0b00", "#ff0c00", "#ff0d00", "#ff0e00", "#ff0f00", "#ff1000", "#ff1100", "#ff1200", "#ff1300", "#ff1400", "#ff1500", "#ff1600", "#ff1700", "#ff1800", "#ff1900", "#ff1a00", "#ff1b00", "#ff1c00", "#ff1d00", "#ff1e00", "#ff1f00", "#ff2000", "#ff2000", "#ff2200", "#ff2300", "#ff2400", "#ff2400", "#ff2600", "#ff2700", "#ff2800", "#ff2800", "#ff2a00", "#ff2b00", "#ff2c00", "#ff2c00", "#ff2e00", "#ff2f00", "#ff3000", "#ff3000", "#ff3200", "#ff3300", "#ff3400", "#ff3400", "#ff3600", "#ff3700", "#ff3800", "#ff3800", "#ff3a00", "#ff3b00", "#ff3c00", "#ff3c00", "#ff3e00", "#ff3f00", "#ff4000", "#ff4100", "#ff4100", "#ff4300", "#ff4400", "#ff4500", "#ff4600", "#ff4700", "#ff4800", "#ff4900", "#ff4900", "#ff4b00", "#ff4c00", "#ff4d00", "#ff4e00", "#ff4f00", "#ff5000", "#ff5100", "#ff5100", "#ff5300", "#ff5400", "#ff5500", "#ff5600", "#ff5700", "#ff5800", "#ff5900", "#ff5900", "#ff5b00", "#ff5c00", "#ff5d00", "#ff5e00", "#ff5f00", "#ff6000", "#ff6100", "#ff6100", "#ff6300", "#ff6400", "#ff6500", "#ff6600", "#ff6700", "#ff6800", "#ff6900", "#ff6900", "#ff6b00", "#ff6c00", "#ff6d00", "#ff6e00", "#ff6f00", "#ff7000", "#ff7100", "#ff7100", "#ff7300", "#ff7400", "#ff7500", "#ff7600", "#ff7700", "#ff7800", "#ff7900", "#ff7900", "#ff7b00", "#ff7c00", "#ff7d00", "#ff7e00", "#ff7f00", "#ff8000", "#ff8100", "#ff8200", "#ff8300", "#ff8300", "#ff8500", "#ff8600", "#ff8700", "#ff8800", "#ff8900", "#ff8a00", "#ff8b00", "#ff8c00", "#ff8d00", "#ff8e00", "#ff8f00", "#ff9000", "#ff9100", "#ff9200", "#ff9300", "#ff9300", "#ff9500", "#ff9600", "#ff9700", "#ff9800", "#ff9900", "#ff9a00", "#ff9b00", "#ff9c00", "#ff9d00", "#ff9e00", "#ff9f00", "#ffa000", "#ffa100", "#ffa200", "#ffa300", "#ffa300", "#ffa500", "#ffa600", "#ffa700", "#ffa800", "#ffa900", "#ffaa00", "#ffab00", "#ffac00", "#ffad00", "#ffae00", "#ffaf00", "#ffb000", "#ffb100", "#ffb200", "#ffb300", "#ffb300", "#ffb500", "#ffb600", "#ffb700", "#ffb800", "#ffb900", "#ffba00", "#ffbb00", "#ffbc00", "#ffbd00", "#ffbe00", "#ffbf00", "#ffc000", "#ffc100", "#ffc200", "#ffc300", "#ffc300", "#ffc500", "#ffc600", "#ffc700", "#ffc800", "#ffc900", "#ffca00", "#ffcb00", "#ffcc00", "#ffcd00", "#ffce00", "#ffcf00", "#ffd000", "#ffd100", "#ffd200", "#ffd300", "#ffd300", "#ffd500", "#ffd600", "#ffd700", "#ffd800", "#ffd900", "#ffda00", "#ffdb00", "#ffdc00", "#ffdd00", "#ffde00", "#ffdf00", "#ffe000", "#ffe100", "#ffe200", "#ffe300", "#ffe300", "#ffe500", "#ffe600", "#ffe700", "#ffe800", "#ffe900", "#ffea00", "#ffeb00", "#ffec00", "#ffed00", "#ffee00", "#ffef00", "#fff000", "#fff100", "#fff200", "#fff300", "#fff300", "#fff500", "#fff600", "#fff700", "#fff800", "#fff900", "#fffa00", "#fffb00", "#fffc00", "#fffd00", "#fffe00", "#ffff00" ], "binary": [ "#ffffff", "#fefefe", "#fdfdfd", "#fcfcfc", "#fbfbfb", "#fafafa", "#f9f9f9", "#f8f8f8", "#f7f7f7", "#f6f6f6", "#f5f5f5", "#f4f4f4", "#f3f3f3", "#f2f2f2", "#f1f1f1", "#f0f0f0", "#efefef", "#eeeeee", "#ededed", "#ececec", "#ebebeb", "#eaeaea", "#e9e9e9", "#e8e8e8", "#e7e7e7", "#e6e6e6", "#e5e5e5", "#e4e4e4", "#e3e3e3", "#e2e2e2", "#e1e1e1", "#e0e0e0", "#dfdfdf", "#dedede", "#dddddd", "#dcdcdc", "#dbdbdb", "#dadada", "#d9d9d9", "#d8d8d8", "#d7d7d7", "#d6d6d6", "#d5d5d5", "#d3d3d3", "#d3d3d3", "#d2d2d2", "#d1d1d1", "#d0d0d0", "#cfcfcf", "#cecece", "#cdcdcd", "#cccccc", "#cbcbcb", "#cacaca", "#c9c9c9", "#c8c8c8", "#c7c7c7", "#c6c6c6", "#c5c5c5", "#c3c3c3", "#c3c3c3", "#c2c2c2", "#c1c1c1", "#c0c0c0", "#bfbfbf", "#bebebe", "#bdbdbd", "#bcbcbc", "#bbbbbb", "#bababa", "#b9b9b9", "#b8b8b8", "#b7b7b7", "#b6b6b6", "#b5b5b5", "#b3b3b3", "#b3b3b3", "#b2b2b2", "#b1b1b1", "#b0b0b0", "#afafaf", "#aeaeae", "#adadad", "#acacac", "#ababab", "#aaaaaa", "#a9a9a9", "#a8a8a8", "#a7a7a7", "#a6a6a6", "#a5a5a5", "#a3a3a3", "#a3a3a3", "#a2a2a2", "#a1a1a1", "#a0a0a0", "#9f9f9f", "#9e9e9e", "#9d9d9d", "#9c9c9c", "#9b9b9b", "#9a9a9a", "#999999", "#989898", "#979797", "#969696", "#959595", "#939393", "#939393", "#929292", "#919191", "#909090", "#8f8f8f", "#8e8e8e", "#8d8d8d", "#8c8c8c", "#8b8b8b", "#8a8a8a", "#898989", "#888888", "#878787", "#868686", "#858585", "#838383", "#838383", "#828282", "#818181", "#808080", "#7f7f7f", "#7e7e7e", "#7d7d7d", "#7c7c7c", "#7b7b7b", "#797979", "#797979", "#787878", "#777777", "#767676", "#757575", "#747474", "#727272", "#717171", "#717171", "#707070", "#6f6f6f", "#6e6e6e", "#6d6d6d", "#6c6c6c", "#6b6b6b", "#696969", "#696969", "#686868", "#676767", "#666666", "#656565", "#646464", "#626262", "#616161", "#616161", "#606060", "#5f5f5f", "#5e5e5e", "#5d5d5d", "#5c5c5c", "#5b5b5b", "#595959", "#595959", "#585858", "#575757", "#565656", "#555555", "#545454", "#525252", "#515151", "#515151", "#505050", "#4f4f4f", "#4e4e4e", "#4d4d4d", "#4c4c4c", "#4b4b4b", "#494949", "#494949", "#484848", "#474747", "#464646", "#454545", "#444444", "#424242", "#414141", "#414141", "#404040", "#3f3f3f", "#3e3e3e", "#3d3d3d", "#3c3c3c", "#3b3b3b", "#393939", "#383838", "#383838", "#373737", "#363636", "#353535", "#343434", "#323232", "#313131", "#303030", "#303030", "#2f2f2f", "#2e2e2e", "#2d2d2d", "#2c2c2c", "#2b2b2b", "#292929", "#282828", "#282828", "#272727", "#262626", "#252525", "#242424", "#222222", "#212121", "#202020", "#202020", "#1f1f1f", "#1e1e1e", "#1d1d1d", "#1c1c1c", "#1b1b1b", "#191919", "#181818", "#181818", "#171717", "#161616", "#151515", "#141414", "#121212", "#111111", "#101010", "#101010", "#0f0f0f", "#0e0e0e", "#0d0d0d", "#0c0c0c", "#0b0b0b", "#090909", "#080808", "#080808", "#070707", "#060606", "#050505", "#040404", "#020202", "#010101", "#000000", "#000000" ], "bone": [ "#000000", "#000001", "#010102", "#020203", "#030304", "#040406", "#050507", "#060608", "#070609", "#07070a", "#08080c", "#09090d", "#0a0a0e", "#0b0b0f", "#0c0c11", "#0d0d12", "#0e0d13", "#0e0e14", "#0f0f15", "#101017", "#111118", "#121219", "#13131a", "#14141c", "#15141d", "#15151e", "#16161f", "#171720", "#181822", "#191923", "#1a1a24", "#1b1b25", "#1c1b26", "#1c1c28", "#1d1d29", "#1e1e2a", "#1f1f2b", "#20202d", "#21212e", "#22222f", "#232230", "#232331", "#242433", "#252534", "#262635", "#272736", "#282838", "#292939", "#2a293a", "#2a2a3b", "#2b2b3c", "#2c2c3e", "#2d2d3f", "#2e2e40", "#2f2f41", "#303042", "#313044", "#313145", "#323246", "#333347", "#343449", "#35354a", "#36364b", "#37374c", "#38374d", "#38384f", "#393950", "#3a3a51", "#3b3b52", "#3c3c54", "#3d3d55", "#3e3e56", "#3f3e57", "#3f3f58", "#40405a", "#41415b", "#42425c", "#43435d", "#44445e", "#454560", "#464561", "#464662", "#474763", "#484865", "#494966", "#4a4a67", "#4b4b68", "#4c4c69", "#4d4c6b", "#4d4d6c", "#4e4e6d", "#4f4f6e", "#505070", "#515171", "#525272", "#535372", "#545473", "#545674", "#555775", "#565876", "#575977", "#585a78", "#595c79", "#5a5d79", "#5b5e7a", "#5b5f7b", "#5c607c", "#5d627d", "#5e637e", "#5f647f", "#606580", "#616680", "#626881", "#626982", "#636a83", "#646b84", "#656d85", "#666e86", "#676f87", "#687087", "#697188", "#697389", "#6a748a", "#6b758b", "#6c768c", "#6d778d", "#6e798e", "#6f7a8e", "#707b8f", "#707c90", "#717d91", "#727f92", "#738093", "#748194", "#758295", "#768395", "#778596", "#778697", "#788798", "#798899", "#7a899a", "#7b8b9b", "#7c8c9c", "#7d8d9c", "#7e8e9d", "#7e8f9e", "#7f919f", "#8092a0", "#8193a1", "#8294a2", "#8395a3", "#8497a3", "#8598a4", "#8599a5", "#869aa6", "#879ba7", "#889da8", "#899ea9", "#8a9faa", "#8ba0aa", "#8ca1ab", "#8ca3ac", "#8da4ad", "#8ea5ae", "#8fa6af", "#90a7b0", "#91a9b1", "#92aab1", "#93abb2", "#93acb3", "#94adb4", "#95afb5", "#96b0b6", "#97b1b7", "#98b2b8", "#99b3b8", "#9ab5b9", "#9ab6ba", "#9bb7bb", "#9cb8bc", "#9dbabd", "#9ebbbe", "#9fbcbf", "#a0bdbf", "#a1bec0", "#a1c0c1", "#a2c1c2", "#a3c2c3", "#a4c3c4", "#a5c4c5", "#a6c6c6", "#a7c7c6", "#a8c7c7", "#aac8c8", "#abc9c9", "#accaca", "#aecbcb", "#afcccc", "#b1cdcd", "#b2cecd", "#b3cece", "#b5cfcf", "#b6d0d0", "#b7d1d1", "#b9d2d2", "#bad3d3", "#bcd4d4", "#bdd5d4", "#bed5d5", "#c0d6d6", "#c1d7d7", "#c2d8d8", "#c4d9d9", "#c5dada", "#c6dbdb", "#c8dcdb", "#c9dcdc", "#cbdddd", "#ccdede", "#cddfdf", "#cfe0e0", "#d0e1e1", "#d1e2e2", "#d3e3e2", "#d4e3e3", "#d5e4e4", "#d7e5e5", "#d8e6e6", "#dae7e7", "#dbe8e8", "#dce9e9", "#deeae9", "#dfeaea", "#e0ebeb", "#e2ecec", "#e3eded", "#e5eeee", "#e6efef", "#e7f0f0", "#e9f1f0", "#eaf1f1", "#ebf2f2", "#edf3f3", "#eef4f4", "#eff5f5", "#f1f6f6", "#f2f7f7", "#f4f8f7", "#f5f8f8", "#f6f9f9", "#f8fafa", "#f9fbfb", "#fafcfc", "#fcfdfd", "#fdfefe", "#ffffff" ], "brg": [ "#0000ff", "#0200fd", "#0400fb", "#0600f9", "#0800f7", "#0a00f5", "#0c00f3", "#0e00f1", "#1000ef", "#1200ed", "#1400eb", "#1600e9", "#1800e7", "#1a00e5", "#1c00e3", "#1e00e1", "#2000df", "#2200dd", "#2400db", "#2600d9", "#2800d7", "#2a00d5", "#2c00d3", "#2e00d1", "#3000cf", "#3200cd", "#3400cb", "#3600c9", "#3800c7", "#3a00c5", "#3c00c3", "#3e00c1", "#4000bf", "#4100bd", "#4400bb", "#4600b9", "#4800b7", "#4900b5", "#4c00b3", "#4e00b1", "#5000af", "#5100ad", "#5400ab", "#5600a9", "#5800a7", "#5900a5", "#5c00a3", "#5e00a1", "#60009f", "#61009d", "#64009b", "#660099", "#680097", "#690095", "#6c0093", "#6e0091", "#70008f", "#71008d", "#74008b", "#760089", "#780087", "#790085", "#7c0083", "#7e0081", "#80007f", "#82007d", "#83007b", "#860079", "#880077", "#8a0075", "#8c0072", "#8e0071", "#90006f", "#92006d", "#93006b", "#960069", "#980067", "#9a0065", "#9c0062", "#9e0061", "#a0005f", "#a2005d", "#a3005b", "#a60059", "#a80057", "#aa0055", "#ac0052", "#ae0051", "#b0004f", "#b2004d", "#b3004b", "#b60049", "#b80047", "#ba0045", "#bc0042", "#be0041", "#c0003f", "#c2003d", "#c3003b", "#c60038", "#c80037", "#ca0035", "#cc0032", "#ce0030", "#d0002f", "#d2002d", "#d3002b", "#d60028", "#d80027", "#da0025", "#dc0022", "#de0020", "#e0001f", "#e2001d", "#e3001b", "#e60018", "#e80017", "#ea0015", "#ec0012", "#ee0010", "#f0000f", "#f2000d", "#f3000b", "#f60008", "#f80007", "#fa0005", "#fc0002", "#fe0000", "#fe0100", "#fc0300", "#fa0500", "#f80700", "#f60800", "#f40b00", "#f20d00", "#f00f00", "#ee1100", "#ec1300", "#ea1500", "#e81700", "#e61900", "#e41b00", "#e21d00", "#e01f00", "#de2100", "#dc2300", "#da2500", "#d82700", "#d62800", "#d32b00", "#d22d00", "#d02f00", "#ce3100", "#cc3300", "#ca3500", "#c83700", "#c63900", "#c33b00", "#c23d00", "#c03f00", "#be4100", "#bc4300", "#ba4500", "#b84700", "#b64800", "#b34b00", "#b24d00", "#b04f00", "#ae5100", "#ac5300", "#aa5500", "#a85700", "#a65900", "#a35b00", "#a25d00", "#a05f00", "#9e6100", "#9c6300", "#9a6500", "#986700", "#966800", "#936b00", "#926d00", "#906f00", "#8e7100", "#8c7300", "#8a7500", "#887700", "#867900", "#837b00", "#827d00", "#807f00", "#7e8100", "#7c8300", "#798500", "#788700", "#768800", "#748b00", "#718d00", "#708f00", "#6e9100", "#6c9300", "#699500", "#689700", "#669900", "#649b00", "#619d00", "#609f00", "#5ea100", "#5ca300", "#59a500", "#58a700", "#56a800", "#54ab00", "#51ad00", "#50af00", "#4eb100", "#4cb300", "#49b500", "#48b700", "#46b900", "#44bb00", "#41bd00", "#40bf00", "#3ec100", "#3cc300", "#39c500", "#38c700", "#36c800", "#34cb00", "#31cd00", "#30cf00", "#2ed100", "#2cd300", "#29d500", "#28d700", "#26d900", "#24db00", "#21dd00", "#20df00", "#1ee100", "#1ce300", "#19e500", "#18e700", "#16e800", "#14eb00", "#11ed00", "#10ef00", "#0ef100", "#0cf300", "#09f500", "#08f700", "#06f900", "#04fb00", "#01fd00", "#00ff00" ], "bwr": [ "#0000ff", "#0202ff", "#0404ff", "#0606ff", "#0808ff", "#0a0aff", "#0c0cff", "#0e0eff", "#1010ff", "#1212ff", "#1414ff", "#1616ff", "#1818ff", "#1a1aff", "#1c1cff", "#1e1eff", "#2020ff", "#2222ff", "#2424ff", "#2626ff", "#2828ff", "#2a2aff", "#2c2cff", "#2e2eff", "#3030ff", "#3232ff", "#3434ff", "#3636ff", "#3838ff", "#3a3aff", "#3c3cff", "#3e3eff", "#4040ff", "#4141ff", "#4444ff", "#4646ff", "#4848ff", "#4949ff", "#4c4cff", "#4e4eff", "#5050ff", "#5151ff", "#5454ff", "#5656ff", "#5858ff", "#5959ff", "#5c5cff", "#5e5eff", "#6060ff", "#6161ff", "#6464ff", "#6666ff", "#6868ff", "#6969ff", "#6c6cff", "#6e6eff", "#7070ff", "#7171ff", "#7474ff", "#7676ff", "#7878ff", "#7979ff", "#7c7cff", "#7e7eff", "#8080ff", "#8282ff", "#8383ff", "#8686ff", "#8888ff", "#8a8aff", "#8c8cff", "#8e8eff", "#9090ff", "#9292ff", "#9393ff", "#9696ff", "#9898ff", "#9a9aff", "#9c9cff", "#9e9eff", "#a0a0ff", "#a2a2ff", "#a3a3ff", "#a6a6ff", "#a8a8ff", "#aaaaff", "#acacff", "#aeaeff", "#b0b0ff", "#b2b2ff", "#b3b3ff", "#b6b6ff", "#b8b8ff", "#babaff", "#bcbcff", "#bebeff", "#c0c0ff", "#c2c2ff", "#c3c3ff", "#c6c6ff", "#c8c8ff", "#cacaff", "#ccccff", "#ceceff", "#d0d0ff", "#d2d2ff", "#d3d3ff", "#d6d6ff", "#d8d8ff", "#dadaff", "#dcdcff", "#dedeff", "#e0e0ff", "#e2e2ff", "#e3e3ff", "#e6e6ff", "#e8e8ff", "#eaeaff", "#ececff", "#eeeeff", "#f0f0ff", "#f2f2ff", "#f3f3ff", "#f6f6ff", "#f8f8ff", "#fafaff", "#fcfcff", "#fefeff", "#fffefe", "#fffcfc", "#fffafa", "#fff8f8", "#fff6f6", "#fff4f4", "#fff2f2", "#fff0f0", "#ffeeee", "#ffecec", "#ffeaea", "#ffe8e8", "#ffe6e6", "#ffe4e4", "#ffe2e2", "#ffe0e0", "#ffdede", "#ffdcdc", "#ffdada", "#ffd8d8", "#ffd6d6", "#ffd3d3", "#ffd2d2", "#ffd0d0", "#ffcece", "#ffcccc", "#ffcaca", "#ffc8c8", "#ffc6c6", "#ffc3c3", "#ffc2c2", "#ffc0c0", "#ffbebe", "#ffbcbc", "#ffbaba", "#ffb8b8", "#ffb6b6", "#ffb3b3", "#ffb2b2", "#ffb0b0", "#ffaeae", "#ffacac", "#ffaaaa", "#ffa8a8", "#ffa6a6", "#ffa3a3", "#ffa2a2", "#ffa0a0", "#ff9e9e", "#ff9c9c", "#ff9a9a", "#ff9898", "#ff9696", "#ff9393", "#ff9292", "#ff9090", "#ff8e8e", "#ff8c8c", "#ff8a8a", "#ff8888", "#ff8686", "#ff8383", "#ff8282", "#ff8080", "#ff7e7e", "#ff7c7c", "#ff7979", "#ff7878", "#ff7676", "#ff7474", "#ff7171", "#ff7070", "#ff6e6e", "#ff6c6c", "#ff6969", "#ff6868", "#ff6666", "#ff6464", "#ff6161", "#ff6060", "#ff5e5e", "#ff5c5c", "#ff5959", "#ff5858", "#ff5656", "#ff5454", "#ff5151", "#ff5050", "#ff4e4e", "#ff4c4c", "#ff4949", "#ff4848", "#ff4646", "#ff4444", "#ff4141", "#ff4040", "#ff3e3e", "#ff3c3c", "#ff3939", "#ff3838", "#ff3636", "#ff3434", "#ff3131", "#ff3030", "#ff2e2e", "#ff2c2c", "#ff2929", "#ff2828", "#ff2626", "#ff2424", "#ff2121", "#ff2020", "#ff1e1e", "#ff1c1c", "#ff1919", "#ff1818", "#ff1616", "#ff1414", "#ff1111", "#ff1010", "#ff0e0e", "#ff0c0c", "#ff0909", "#ff0808", "#ff0606", "#ff0404", "#ff0101", "#ff0000" ], "cividis": [ "#00224d", "#00234f", "#002350", "#002452", "#002554", "#002655", "#002657", "#002759", "#00285b", "#00285c", "#00295e", "#002a60", "#002a62", "#002b64", "#002c66", "#002c67", "#002d69", "#002e6b", "#002f6d", "#002f6f", "#003070", "#003070", "#003170", "#003170", "#043270", "#083370", "#0b3370", "#0e3470", "#11356f", "#14366f", "#16366f", "#18376f", "#1a386f", "#1c386e", "#1d396e", "#1f3a6e", "#213b6e", "#223b6e", "#243c6e", "#253d6d", "#273d6d", "#283e6d", "#2a3f6d", "#2b3f6d", "#2c406d", "#2e416c", "#2f426c", "#30426c", "#31436c", "#32446c", "#34446c", "#35456c", "#36466c", "#37466c", "#38476c", "#39486c", "#3a486b", "#3b496b", "#3d4a6b", "#3e4b6b", "#3f4b6b", "#404c6b", "#414d6b", "#424d6b", "#434e6b", "#444f6b", "#454f6b", "#46506b", "#47516b", "#48516b", "#49526b", "#4a536b", "#4b546c", "#4c546c", "#4d556c", "#4e566c", "#4e566c", "#4f576c", "#50586c", "#51586c", "#52596c", "#535a6c", "#545a6c", "#555b6d", "#565c6d", "#575d6d", "#585d6d", "#595e6d", "#595f6d", "#5a5f6d", "#5b606e", "#5c616e", "#5d616e", "#5e626e", "#5f636e", "#60646e", "#61646f", "#61656f", "#62666f", "#63666f", "#64676f", "#656870", "#666970", "#676970", "#686a70", "#686b71", "#696b71", "#6a6c71", "#6b6d71", "#6c6d72", "#6d6e72", "#6e6f72", "#6e7073", "#6f7073", "#707173", "#717273", "#727374", "#737374", "#747475", "#747575", "#757575", "#767676", "#777776", "#787876", "#797877", "#797977", "#7a7a77", "#7b7b77", "#7c7b78", "#7d7c78", "#7e7d78", "#7f7d78", "#807e78", "#817f78", "#828078", "#838078", "#848178", "#858278", "#858378", "#868378", "#878478", "#888578", "#898678", "#8a8678", "#8b8778", "#8c8878", "#8d8978", "#8e8978", "#8f8a77", "#908b77", "#918c77", "#928c77", "#938d77", "#948e77", "#958f77", "#968f77", "#979076", "#989176", "#999276", "#9a9376", "#9b9376", "#9c9476", "#9d9575", "#9e9675", "#9f9675", "#a09775", "#a19874", "#a29974", "#a39a74", "#a49a74", "#a59b73", "#a69c73", "#a79d73", "#a89e73", "#a99e72", "#aa9f72", "#aba072", "#aca171", "#ada271", "#aea271", "#afa370", "#b0a470", "#b1a570", "#b2a66f", "#b3a66f", "#b4a76f", "#b5a86e", "#b6a96e", "#b7aa6d", "#b8ab6d", "#b9ab6d", "#baac6c", "#bbad6c", "#bcae6b", "#bdaf6b", "#beb06a", "#bfb06a", "#c1b169", "#c2b269", "#c3b368", "#c4b468", "#c5b567", "#c6b567", "#c7b666", "#c8b765", "#c9b865", "#cab964", "#cbba64", "#ccbb63", "#cdbc62", "#cebc62", "#cfbd61", "#d0be60", "#d2bf60", "#d3c05f", "#d4c15e", "#d5c25e", "#d6c35d", "#d7c35c", "#d8c45b", "#d9c55a", "#dac65a", "#dbc759", "#dcc858", "#dec957", "#dfca56", "#e0cb55", "#e1cc54", "#e2cc53", "#e3cd52", "#e4ce51", "#e5cf50", "#e6d04f", "#e8d14e", "#e9d24d", "#ead34c", "#ebd44b", "#ecd54a", "#edd648", "#eed747", "#efd846", "#f1d944", "#f2da43", "#f3da42", "#f4db40", "#f5dc3f", "#f6dd3d", "#f8de3b", "#f9df3a", "#fae038", "#fbe136", "#fde234", "#fde333", "#fde534", "#fde636", "#fde737" ], "cool": [ "#00ffff", "#01feff", "#02fdff", "#03fcff", "#04fbff", "#05faff", "#06f9ff", "#07f8ff", "#08f7ff", "#09f6ff", "#0af5ff", "#0bf4ff", "#0cf3ff", "#0df2ff", "#0ef1ff", "#0ff0ff", "#10efff", "#11eeff", "#12edff", "#13ecff", "#14ebff", "#15eaff", "#16e9ff", "#17e8ff", "#18e7ff", "#19e6ff", "#1ae5ff", "#1be4ff", "#1ce3ff", "#1de2ff", "#1ee1ff", "#1fe0ff", "#20dfff", "#20deff", "#22ddff", "#23dcff", "#24dbff", "#24daff", "#26d9ff", "#27d8ff", "#28d7ff", "#28d6ff", "#2ad5ff", "#2bd3ff", "#2cd3ff", "#2cd2ff", "#2ed1ff", "#2fd0ff", "#30cfff", "#30ceff", "#32cdff", "#33ccff", "#34cbff", "#34caff", "#36c9ff", "#37c8ff", "#38c7ff", "#38c6ff", "#3ac5ff", "#3bc3ff", "#3cc3ff", "#3cc2ff", "#3ec1ff", "#3fc0ff", "#40bfff", "#41beff", "#41bdff", "#43bcff", "#44bbff", "#45baff", "#46b9ff", "#47b8ff", "#48b7ff", "#49b6ff", "#49b5ff", "#4bb3ff", "#4cb3ff", "#4db2ff", "#4eb1ff", "#4fb0ff", "#50afff", "#51aeff", "#51adff", "#53acff", "#54abff", "#55aaff", "#56a9ff", "#57a8ff", "#58a7ff", "#59a6ff", "#59a5ff", "#5ba3ff", "#5ca3ff", "#5da2ff", "#5ea1ff", "#5fa0ff", "#609fff", "#619eff", "#619dff", "#639cff", "#649bff", "#659aff", "#6699ff", "#6798ff", "#6897ff", "#6996ff", "#6995ff", "#6b93ff", "#6c93ff", "#6d92ff", "#6e91ff", "#6f90ff", "#708fff", "#718eff", "#718dff", "#738cff", "#748bff", "#758aff", "#7689ff", "#7788ff", "#7887ff", "#7986ff", "#7985ff", "#7b83ff", "#7c83ff", "#7d82ff", "#7e81ff", "#7f80ff", "#807fff", "#817eff", "#827dff", "#837cff", "#837bff", "#8579ff", "#8679ff", "#8778ff", "#8877ff", "#8976ff", "#8a75ff", "#8b74ff", "#8c72ff", "#8d71ff", "#8e71ff", "#8f70ff", "#906fff", "#916eff", "#926dff", "#936cff", "#936bff", "#9569ff", "#9669ff", "#9768ff", "#9867ff", "#9966ff", "#9a65ff", "#9b64ff", "#9c62ff", "#9d61ff", "#9e61ff", "#9f60ff", "#a05fff", "#a15eff", "#a25dff", "#a35cff", "#a35bff", "#a559ff", "#a659ff", "#a758ff", "#a857ff", "#a956ff", "#aa55ff", "#ab54ff", "#ac52ff", "#ad51ff", "#ae51ff", "#af50ff", "#b04fff", "#b14eff", "#b24dff", "#b34cff", "#b34bff", "#b549ff", "#b649ff", "#b748ff", "#b847ff", "#b946ff", "#ba45ff", "#bb44ff", "#bc42ff", "#bd41ff", "#be41ff", "#bf40ff", "#c03fff", "#c13eff", "#c23dff", "#c33cff", "#c33bff", "#c539ff", "#c638ff", "#c738ff", "#c837ff", "#c936ff", "#ca35ff", "#cb34ff", "#cc32ff", "#cd31ff", "#ce30ff", "#cf30ff", "#d02fff", "#d12eff", "#d22dff", "#d32cff", "#d32bff", "#d529ff", "#d628ff", "#d728ff", "#d827ff", "#d926ff", "#da25ff", "#db24ff", "#dc22ff", "#dd21ff", "#de20ff", "#df20ff", "#e01fff", "#e11eff", "#e21dff", "#e31cff", "#e31bff", "#e519ff", "#e618ff", "#e718ff", "#e817ff", "#e916ff", "#ea15ff", "#eb14ff", "#ec12ff", "#ed11ff", "#ee10ff", "#ef10ff", "#f00fff", "#f10eff", "#f20dff", "#f30cff", "#f30bff", "#f509ff", "#f608ff", "#f708ff", "#f807ff", "#f906ff", "#fa05ff", "#fb04ff", "#fc02ff", "#fd01ff", "#fe00ff", "#ff00ff" ], "coolwarm": [ "#3a4cc0", "#3b4dc1", "#3c4fc3", "#3e51c4", "#3f53c6", "#4054c7", "#4156c9", "#4258ca", "#435acc", "#455bcd", "#465dcf", "#475fd0", "#4860d1", "#4962d3", "#4b64d4", "#4c66d6", "#4d67d7", "#4e69d8", "#506bda", "#516cdb", "#526edc", "#5370dd", "#5571de", "#5673e0", "#5775e1", "#5876e2", "#5a78e3", "#5b79e4", "#5c7be5", "#5d7de6", "#5f7ee7", "#6080e8", "#6182ea", "#6383ea", "#6485eb", "#6586ec", "#6788ed", "#6889ee", "#698bef", "#6b8df0", "#6c8ef1", "#6d90f1", "#6f91f2", "#7093f3", "#7194f4", "#7395f4", "#7497f5", "#7598f6", "#779af6", "#789bf7", "#7a9df8", "#7b9ef8", "#7ca0f9", "#7ea1f9", "#7fa2fa", "#80a4fa", "#82a5fb", "#83a6fb", "#85a8fb", "#86a9fc", "#87aafc", "#89acfc", "#8aadfd", "#8baefd", "#8daffd", "#8eb1fd", "#90b2fe", "#91b3fe", "#92b4fe", "#94b5fe", "#95b7fe", "#97b8fe", "#98b9fe", "#99bafe", "#9bbbfe", "#9cbcfe", "#9dbdfe", "#9fbefe", "#a0bffe", "#a2c0fe", "#a3c1fe", "#a4c2fe", "#a6c3fd", "#a7c4fd", "#a8c5fd", "#aac6fd", "#abc7fc", "#acc8fc", "#aec9fc", "#afcafb", "#b0cbfb", "#b2cbfb", "#b3ccfa", "#b4cdfa", "#b6cef9", "#b7cff9", "#b8cff8", "#b9d0f8", "#bbd1f7", "#bcd1f6", "#bdd2f6", "#bed3f5", "#c0d3f5", "#c1d4f4", "#c2d4f3", "#c3d5f2", "#c5d5f2", "#c6d6f1", "#c7d6f0", "#c8d7ef", "#c9d7ee", "#cad8ee", "#ccd8ed", "#cdd9ec", "#ced9eb", "#cfd9ea", "#d0dae9", "#d1dae8", "#d2dae7", "#d3dbe6", "#d5dbe5", "#d6dbe4", "#d7dbe2", "#d8dbe1", "#d9dce0", "#dadcdf", "#dbdcde", "#dcdcdd", "#dddcdb", "#dedbda", "#dfdbd9", "#e0dad7", "#e1dad6", "#e2d9d4", "#e3d9d3", "#e4d8d1", "#e5d8d0", "#e6d7cf", "#e7d6cd", "#e7d6cc", "#e8d5ca", "#e9d4c9", "#ead3c7", "#ebd3c6", "#ecd2c4", "#ecd1c3", "#edd0c1", "#edcfc0", "#eecfbe", "#efcebc", "#efcdbb", "#f0ccb9", "#f1cbb8", "#f1cab6", "#f2c9b5", "#f2c8b3", "#f2c7b2", "#f3c6b0", "#f3c5af", "#f4c4ad", "#f4c3ab", "#f4c2aa", "#f5c1a8", "#f5c0a7", "#f5bfa5", "#f6bda4", "#f6bca2", "#f6bba0", "#f6ba9f", "#f6b99d", "#f6b79c", "#f6b69a", "#f7b598", "#f7b397", "#f7b295", "#f7b194", "#f7b092", "#f7ae91", "#f7ad8f", "#f6ab8d", "#f6aa8c", "#f6a98a", "#f6a789", "#f6a687", "#f6a486", "#f6a384", "#f5a182", "#f5a081", "#f59e7f", "#f49d7e", "#f49b7c", "#f49a7b", "#f39879", "#f39678", "#f39576", "#f29375", "#f29173", "#f19072", "#f18e70", "#f08d6f", "#f08b6d", "#ef896c", "#ee876a", "#ee8669", "#ed8467", "#ec8266", "#ec8064", "#eb7f63", "#ea7d61", "#ea7b60", "#e9795e", "#e8775d", "#e7755c", "#e6745a", "#e67259", "#e57057", "#e46e56", "#e36c54", "#e26a53", "#e16852", "#e06650", "#df644f", "#de624e", "#dd604c", "#dc5e4b", "#db5c4a", "#da5a48", "#d95847", "#d85646", "#d75444", "#d65243", "#d44f42", "#d34d40", "#d24b3f", "#d1493e", "#cf463d", "#ce443c", "#cd423a", "#cc3f39", "#ca3d38", "#c93b37", "#c83835", "#c63534", "#c53233", "#c43032", "#c22d31", "#c12a30", "#bf282e", "#be232d", "#bc1f2c", "#bb1a2b", "#b9162a", "#b81129", "#b60d28", "#b50827", "#b30326" ], "copper": [ "#000000", "#010000", "#020100", "#030201", "#040301", "#060302", "#070402", "#080503", "#090603", "#0b0704", "#0c0704", "#0d0805", "#0e0905", "#100a06", "#110a06", "#120b07", "#130c07", "#140d08", "#160e08", "#170e09", "#180f09", "#19100a", "#1b110a", "#1c110b", "#1d120b", "#1e130c", "#20140c", "#21150d", "#22150d", "#23160e", "#25170e", "#26180f", "#27180f", "#281910", "#291a10", "#2b1b11", "#2c1c11", "#2d1c12", "#2e1d12", "#301e13", "#311f13", "#322014", "#332014", "#352115", "#362215", "#372316", "#382316", "#3a2417", "#3b2517", "#3c2618", "#3d2718", "#3e2719", "#402819", "#41291a", "#422a1a", "#432a1b", "#452b1b", "#462c1c", "#472d1c", "#482e1d", "#4a2e1d", "#4b2f1e", "#4c301e", "#4d311f", "#4f311f", "#503220", "#513320", "#523421", "#533521", "#553522", "#563622", "#573723", "#583823", "#5a3924", "#5b3924", "#5c3a25", "#5d3b25", "#5f3c26", "#603c26", "#613d27", "#623e27", "#643f28", "#654028", "#664029", "#674129", "#68422a", "#6a432a", "#6b432b", "#6c442b", "#6d452c", "#6f462c", "#70472d", "#71472d", "#72482e", "#74492e", "#754a2f", "#764a2f", "#774b30", "#794c30", "#7a4d31", "#7b4e31", "#7c4e32", "#7d4f32", "#7f5033", "#805133", "#815234", "#825234", "#845335", "#855435", "#865536", "#875536", "#895637", "#8a5737", "#8b5838", "#8c5938", "#8e5939", "#8f5a39", "#905b3a", "#915c3a", "#925c3b", "#945d3b", "#955e3c", "#965f3c", "#97603d", "#99603d", "#9a613e", "#9b623e", "#9c633f", "#9e633f", "#9f6440", "#a06540", "#a16641", "#a36741", "#a46742", "#a56842", "#a66943", "#a76a43", "#a96b44", "#aa6b44", "#ab6c45", "#ac6d45", "#ae6e46", "#af6e46", "#b06f47", "#b17047", "#b37148", "#b47248", "#b57249", "#b67349", "#b8744a", "#b9754a", "#ba754b", "#bb764b", "#bc774c", "#be784c", "#bf794d", "#c0794d", "#c17a4e", "#c37b4e", "#c47c4f", "#c57c4f", "#c67d50", "#c87e50", "#c97f51", "#ca8051", "#cb8052", "#cd8152", "#ce8253", "#cf8353", "#d08454", "#d18454", "#d38555", "#d48655", "#d58756", "#d68756", "#d88857", "#d98957", "#da8a58", "#db8b58", "#dd8b59", "#de8c59", "#df8d5a", "#e08e5a", "#e28e5b", "#e38f5b", "#e4905c", "#e5915c", "#e6925d", "#e8925d", "#e9935e", "#ea945e", "#eb955f", "#ed955f", "#ee9660", "#ef9760", "#f09861", "#f29961", "#f39962", "#f49a62", "#f59b63", "#f79c63", "#f89d63", "#f99d64", "#fa9e64", "#fb9f65", "#fda065", "#fea066", "#ffa166", "#ffa267", "#ffa367", "#ffa468", "#ffa468", "#ffa569", "#ffa669", "#ffa76a", "#ffa76a", "#ffa86b", "#ffa96b", "#ffaa6c", "#ffab6c", "#ffab6d", "#ffac6d", "#ffad6e", "#ffae6e", "#ffae6f", "#ffaf6f", "#ffb070", "#ffb170", "#ffb271", "#ffb271", "#ffb372", "#ffb472", "#ffb573", "#ffb673", "#ffb674", "#ffb774", "#ffb875", "#ffb975", "#ffb976", "#ffba76", "#ffbb77", "#ffbc77", "#ffbd78", "#ffbd78", "#ffbe79", "#ffbf79", "#ffc07a", "#ffc07a", "#ffc17b", "#ffc27b", "#ffc37c", "#ffc47c", "#ffc47d", "#ffc57d", "#ffc67e", "#ffc77e" ], "cubehelix": [ "#000000", "#010001", "#030103", "#040104", "#060206", "#080208", "#090309", "#0a040b", "#0c040d", "#0d050f", "#0e0611", "#0f0613", "#110715", "#120817", "#130919", "#140a1b", "#140b1d", "#150b1f", "#160c21", "#170d23", "#170e25", "#180f27", "#181129", "#19122b", "#19132d", "#19142f", "#1a1530", "#1a1632", "#1a1834", "#1a1936", "#1a1a38", "#1a1c39", "#1a1d3b", "#1a1f3c", "#1a203e", "#1a223f", "#1a2341", "#192542", "#192643", "#192845", "#192946", "#182b47", "#182d48", "#182e49", "#17304a", "#17324a", "#17344b", "#17354c", "#16374c", "#16394d", "#163a4d", "#153c4d", "#153e4e", "#15404e", "#15424e", "#15434e", "#15454e", "#14474e", "#14494e", "#144a4d", "#154c4d", "#154e4d", "#154f4c", "#15514c", "#15534b", "#16544b", "#16564a", "#165849", "#175949", "#175b48", "#185c47", "#195e46", "#1a5f45", "#1b6144", "#1b6243", "#1c6342", "#1e6542", "#1f6641", "#206740", "#21683f", "#236a3d", "#246b3c", "#266c3b", "#276d3a", "#296e3a", "#2b6f39", "#2d7038", "#2f7137", "#317236", "#337235", "#357334", "#377433", "#397433", "#3c7532", "#3e7631", "#417631", "#437730", "#467730", "#48782f", "#4b782f", "#4e782f", "#51792e", "#53792e", "#56792e", "#59792e", "#5c7a2e", "#5f7a2f", "#627a2f", "#657a2f", "#687a30", "#6b7a30", "#6e7a31", "#717a32", "#747a32", "#787a33", "#7b7a34", "#7e7a35", "#817a37", "#847a38", "#877a39", "#8a793b", "#8d793c", "#90793e", "#937940", "#967941", "#997943", "#9b7945", "#9e7947", "#a1794a", "#a4784c", "#a6784e", "#a97851", "#ab7853", "#ae7856", "#b07858", "#b2785b", "#b5785e", "#b77860", "#b97863", "#bb7966", "#bd7969", "#bf796c", "#c1796f", "#c27972", "#c47a75", "#c67a78", "#c77a7c", "#c97b7f", "#ca7b82", "#cb7c85", "#cc7c88", "#cd7d8c", "#ce7d8f", "#cf7e92", "#d07f95", "#d17f99", "#d1809c", "#d2819f", "#d382a2", "#d383a5", "#d383a9", "#d484ac", "#d485af", "#d487b2", "#d488b5", "#d489b8", "#d48aba", "#d48bbd", "#d48cc0", "#d38ec3", "#d38fc5", "#d390c8", "#d292cb", "#d293cd", "#d295cf", "#d196d2", "#d098d4", "#d09ad6", "#cf9bd8", "#cf9dda", "#ce9edc", "#cda0de", "#cda2e0", "#cca4e2", "#cba5e3", "#cba7e5", "#caa9e6", "#c9abe7", "#c9ace9", "#c8aeea", "#c7b0eb", "#c7b2ec", "#c6b4ed", "#c5b6ee", "#c5b7ef", "#c4b9ef", "#c4bbf0", "#c3bdf1", "#c3bff1", "#c2c1f2", "#c2c2f2", "#c2c4f2", "#c1c6f3", "#c1c8f3", "#c1caf3", "#c1cbf3", "#c1cdf3", "#c1cff3", "#c1d0f3", "#c1d2f3", "#c1d4f3", "#c1d5f3", "#c2d7f2", "#c2d8f2", "#c3daf2", "#c3dbf2", "#c4ddf1", "#c4def1", "#c5e0f1", "#c6e1f1", "#c7e2f0", "#c8e4f0", "#c8e5f0", "#cae6ef", "#cbe7ef", "#cce8ef", "#cde9ef", "#ceebef", "#d0ecee", "#d1edee", "#d2eeee", "#d4efee", "#d5f0ee", "#d7f0ee", "#d9f1ee", "#daf2ee", "#dcf3ef", "#def4ef", "#dff4ef", "#e1f5f0", "#e3f6f0", "#e5f7f0", "#e7f7f1", "#e8f8f2", "#eaf8f2", "#ecf9f3", "#eefaf4", "#f0faf5", "#f2fbf6", "#f4fbf7", "#f5fcf8", "#f7fcf9", "#f9fdfa", "#fbfdfc", "#fdfefd", "#ffffff" ], "flag": [ "#ff0000", "#ff6035", "#ffb27d", "#ffeac6", "#fffeff", "#ccedff", "#84b9ff", "#3c69ff", "#0009ff", "#0000cf", "#000088", "#00003f", "#000000", "#2b0000", "#730000", "#bc0000", "#fc0000", "#ff4e28", "#ffa46f", "#ffe2b8", "#fffdf9", "#d9f3ff", "#92c5ff", "#497aff", "#081cff", "#0000dc", "#000096", "#00004c", "#00000a", "#1f0000", "#650000", "#ae0000", "#f10000", "#ff3c1c", "#ff9561", "#ffd8ab", "#fffbee", "#e5f8ff", "#a0d1ff", "#578aff", "#132eff", "#0000e8", "#0000a4", "#00005a", "#000016", "#130000", "#570000", "#a00000", "#e50000", "#ff2a10", "#ff8653", "#ffce9d", "#fff7e2", "#f1fcff", "#aedbff", "#6599ff", "#1f41ff", "#0000f4", "#0000b2", "#000068", "#000022", "#080000", "#490000", "#920000", "#d90000", "#ff1705", "#ff7546", "#ffc28f", "#fff2d6", "#fcfeff", "#bce4ff", "#73a8ff", "#2b53ff", "#0000ff", "#0000bf", "#000076", "#00002f", "#000000", "#3c0000", "#840000", "#cc0000", "#ff0400", "#ff6438", "#ffb581", "#ffecc9", "#ffffff", "#c9ecff", "#81b5ff", "#3864ff", "#0004ff", "#0000cc", "#000084", "#00003c", "#000000", "#2f0000", "#760000", "#bf0000", "#ff0000", "#ff532b", "#ffa873", "#ffe4bc", "#fffefc", "#d6f2ff", "#8fc2ff", "#4675ff", "#0517ff", "#0000d9", "#000092", "#000049", "#000008", "#220000", "#680000", "#b20000", "#f40000", "#ff411f", "#ff9965", "#ffdbae", "#fffcf1", "#e2f7ff", "#9dceff", "#5386ff", "#102aff", "#0000e5", "#0000a0", "#000057", "#000013", "#160000", "#5a0000", "#a40000", "#e80000", "#ff2e13", "#ff8a57", "#ffd1a0", "#fff8e5", "#eefbff", "#abd8ff", "#6195ff", "#1c3cff", "#0000f1", "#0000ae", "#000065", "#00001f", "#0a0000", "#4c0000", "#960000", "#dc0000", "#ff1c08", "#ff7a49", "#ffc592", "#fff3d9", "#f9fdff", "#b8e2ff", "#6fa4ff", "#284eff", "#0000fc", "#0000bc", "#000073", "#00002b", "#000000", "#3f0000", "#880000", "#cf0000", "#ff0900", "#ff693c", "#ffb984", "#ffedcc", "#fffeff", "#c6eaff", "#7db2ff", "#3560ff", "#0000ff", "#0000c9", "#000081", "#000038", "#000000", "#320000", "#7a0000", "#c20000", "#ff0000", "#ff572f", "#ffab76", "#ffe6bf", "#fffeff", "#d3f1ff", "#8bbfff", "#4271ff", "#0212ff", "#0000d6", "#00008f", "#000046", "#000005", "#250000", "#6c0000", "#b50000", "#f60000", "#ff4522", "#ff9d68", "#ffddb2", "#fffcf4", "#dff6ff", "#99cbff", "#5082ff", "#0d25ff", "#0000e2", "#00009d", "#000053", "#000010", "#190000", "#5e0000", "#a70000", "#eb0000", "#ff3316", "#ff8e5a", "#ffd3a4", "#fff9e8", "#ebfaff", "#a7d6ff", "#5e92ff", "#1938ff", "#0000ee", "#0000ab", "#000061", "#00001c", "#0d0000", "#500000", "#990000", "#df0000", "#ff200a", "#ff7e4c", "#ffc896", "#fff5dc", "#f6fdff", "#b5dfff", "#6ca1ff", "#254aff", "#0000f9", "#0000b8", "#00006f", "#000028", "#020000", "#420000", "#8b0000", "#d30000", "#ff0e00", "#ff6d3f", "#ffbc88", "#ffefcf", "#fffeff", "#c2e8ff", "#7aafff", "#325cff", "#0000ff", "#0000c6", "#00007d", "#000035", "#000000" ], "gist_earth": [ "#000000", "#00002b", "#010038", "#010043", "#02004e", "#030058", "#030063", "#04006e", "#050273", "#050474", "#060674", "#070974", "#070b74", "#080d74", "#091075", "#091275", "#0a1475", "#0b1675", "#0b1975", "#0c1b75", "#0d1d76", "#0d2076", "#0e2276", "#0f2476", "#0f2776", "#102977", "#112b77", "#112d77", "#123077", "#133277", "#133477", "#143678", "#153878", "#153a78", "#163c78", "#173e78", "#174079", "#184279", "#194579", "#194779", "#1a4979", "#1b4b79", "#1b4d7a", "#1c4f7a", "#1d517a", "#1d537a", "#1e547a", "#1f567b", "#1f587b", "#205a7b", "#215c7b", "#215e7b", "#22607b", "#23617c", "#23637c", "#24657c", "#25667c", "#25687c", "#26697d", "#276b7d", "#276d7d", "#286e7d", "#29707d", "#29717d", "#2a737e", "#2b747e", "#2b767e", "#2c787e", "#2d797e", "#2d7b7f", "#2e7c7f", "#2f7e7f", "#2f7f7f", "#30807e", "#30817d", "#31817b", "#31827a", "#328279", "#328378", "#338477", "#338475", "#348574", "#348573", "#358672", "#358670", "#36876f", "#36886e", "#37886d", "#37896c", "#38896a", "#388a69", "#388a68", "#398b67", "#398c65", "#3a8c64", "#3a8d63", "#3b8d62", "#3b8e61", "#3c8e5f", "#3c8f5e", "#3d905d", "#3d905c", "#3e915a", "#3e9159", "#3f9258", "#3f9357", "#409355", "#409454", "#409453", "#419552", "#419551", "#42964f", "#42974e", "#43974d", "#43984c", "#44984a", "#449949", "#459948", "#479a47", "#499b46", "#4b9b46", "#4e9c47", "#509c47", "#529d48", "#549d48", "#579e49", "#599f4a", "#5b9f4a", "#5da04b", "#5fa04b", "#62a14c", "#64a14d", "#66a24d", "#68a34e", "#6ba34e", "#6da34f", "#6fa44f", "#71a450", "#73a551", "#76a551", "#78a652", "#79a652", "#7ba752", "#7da752", "#7ea753", "#80a853", "#82a853", "#83a954", "#85a954", "#87aa54", "#88aa55", "#8aab55", "#8cab55", "#8dab56", "#8fac56", "#91ac56", "#92ad57", "#94ad57", "#96ae57", "#97ae58", "#99ae58", "#9aaf58", "#9caf58", "#9eb059", "#9fb059", "#a1b159", "#a3b15a", "#a4b25a", "#a6b25a", "#a8b25b", "#a9b35b", "#abb35b", "#adb45c", "#aeb45c", "#b0b55c", "#b2b55d", "#b3b55d", "#b5b65d", "#b6b65e", "#b7b55e", "#b7b55e", "#b8b45f", "#b8b35f", "#b9b25f", "#b9b15f", "#b9b060", "#baaf60", "#baaf60", "#bbae61", "#bbad61", "#bcac61", "#bcab62", "#bcaa62", "#bda962", "#bda963", "#bea863", "#bea763", "#bea664", "#bfa564", "#bfa464", "#c0a365", "#c0a367", "#c1a369", "#c2a36c", "#c3a46e", "#c5a471", "#c6a573", "#c7a676", "#c8a678", "#c9a77b", "#caa87d", "#cba97f", "#ccaa82", "#ceab84", "#cfac87", "#d0ad89", "#d1ad8c", "#d2ae8e", "#d3af91", "#d4b093", "#d5b196", "#d6b298", "#d8b39a", "#d9b59d", "#dab69f", "#dbb7a2", "#dcb9a4", "#ddbaa7", "#debca9", "#dfbdac", "#e1bfaf", "#e2c1b2", "#e3c3b5", "#e4c5b8", "#e5c7bb", "#e6c9be", "#e7cbc1", "#e8cdc4", "#e9cfc7", "#ebd1ca", "#ecd3cd", "#edd5d0", "#eed7d3", "#efd9d6", "#f0dcd9", "#f1dedc", "#f2e0df", "#f4e3e2", "#f5e6e5", "#f6e9e8", "#f7eceb", "#f8efee", "#f9f2f1", "#faf5f4", "#fbf8f7", "#fdfafa" ], "gist_gray": [ "#000000", "#010101", "#020202", "#030303", "#040404", "#050505", "#060606", "#070707", "#080808", "#090909", "#0a0a0a", "#0b0b0b", "#0c0c0c", "#0d0d0d", "#0e0e0e", "#0f0f0f", "#101010", "#111111", "#121212", "#131313", "#141414", "#151515", "#161616", "#171717", "#181818", "#191919", "#1a1a1a", "#1b1b1b", "#1c1c1c", "#1d1d1d", "#1e1e1e", "#1f1f1f", "#202020", "#202020", "#222222", "#232323", "#242424", "#242424", "#262626", "#272727", "#282828", "#282828", "#2a2a2a", "#2b2b2b", "#2c2c2c", "#2c2c2c", "#2e2e2e", "#2f2f2f", "#303030", "#303030", "#323232", "#333333", "#343434", "#343434", "#363636", "#373737", "#383838", "#383838", "#3a3a3a", "#3b3b3b", "#3c3c3c", "#3c3c3c", "#3e3e3e", "#3f3f3f", "#404040", "#414141", "#414141", "#434343", "#444444", "#454545", "#464646", "#474747", "#484848", "#494949", "#494949", "#4b4b4b", "#4c4c4c", "#4d4d4d", "#4e4e4e", "#4f4f4f", "#505050", "#515151", "#515151", "#535353", "#545454", "#555555", "#565656", "#575757", "#585858", "#595959", "#595959", "#5b5b5b", "#5c5c5c", "#5d5d5d", "#5e5e5e", "#5f5f5f", "#606060", "#616161", "#616161", "#636363", "#646464", "#656565", "#666666", "#676767", "#686868", "#696969", "#696969", "#6b6b6b", "#6c6c6c", "#6d6d6d", "#6e6e6e", "#6f6f6f", "#707070", "#717171", "#717171", "#737373", "#747474", "#757575", "#767676", "#777777", "#787878", "#797979", "#797979", "#7b7b7b", "#7c7c7c", "#7d7d7d", "#7e7e7e", "#7f7f7f", "#808080", "#818181", "#828282", "#838383", "#838383", "#858585", "#868686", "#878787", "#888888", "#898989", "#8a8a8a", "#8b8b8b", "#8c8c8c", "#8d8d8d", "#8e8e8e", "#8f8f8f", "#909090", "#919191", "#929292", "#939393", "#939393", "#959595", "#969696", "#979797", "#989898", "#999999", "#9a9a9a", "#9b9b9b", "#9c9c9c", "#9d9d9d", "#9e9e9e", "#9f9f9f", "#a0a0a0", "#a1a1a1", "#a2a2a2", "#a3a3a3", "#a3a3a3", "#a5a5a5", "#a6a6a6", "#a7a7a7", "#a8a8a8", "#a9a9a9", "#aaaaaa", "#ababab", "#acacac", "#adadad", "#aeaeae", "#afafaf", "#b0b0b0", "#b1b1b1", "#b2b2b2", "#b3b3b3", "#b3b3b3", "#b5b5b5", "#b6b6b6", "#b7b7b7", "#b8b8b8", "#b9b9b9", "#bababa", "#bbbbbb", "#bcbcbc", "#bdbdbd", "#bebebe", "#bfbfbf", "#c0c0c0", "#c1c1c1", "#c2c2c2", "#c3c3c3", "#c3c3c3", "#c5c5c5", "#c6c6c6", "#c7c7c7", "#c8c8c8", "#c9c9c9", "#cacaca", "#cbcbcb", "#cccccc", "#cdcdcd", "#cecece", "#cfcfcf", "#d0d0d0", "#d1d1d1", "#d2d2d2", "#d3d3d3", "#d3d3d3", "#d5d5d5", "#d6d6d6", "#d7d7d7", "#d8d8d8", "#d9d9d9", "#dadada", "#dbdbdb", "#dcdcdc", "#dddddd", "#dedede", "#dfdfdf", "#e0e0e0", "#e1e1e1", "#e2e2e2", "#e3e3e3", "#e3e3e3", "#e5e5e5", "#e6e6e6", "#e7e7e7", "#e8e8e8", "#e9e9e9", "#eaeaea", "#ebebeb", "#ececec", "#ededed", "#eeeeee", "#efefef", "#f0f0f0", "#f1f1f1", "#f2f2f2", "#f3f3f3", "#f3f3f3", "#f5f5f5", "#f6f6f6", "#f7f7f7", "#f8f8f8", "#f9f9f9", "#fafafa", "#fbfbfb", "#fcfcfc", "#fdfdfd", "#fefefe", "#ffffff" ], "gist_heat": [ "#000000", "#010000", "#030000", "#040000", "#060000", "#070000", "#090000", "#0a0000", "#0c0000", "#0d0000", "#0f0000", "#100000", "#120000", "#130000", "#150000", "#160000", "#180000", "#190000", "#1b0000", "#1c0000", "#1e0000", "#1f0000", "#200000", "#220000", "#240000", "#250000", "#270000", "#280000", "#2a0000", "#2b0000", "#2c0000", "#2e0000", "#300000", "#310000", "#330000", "#340000", "#360000", "#370000", "#380000", "#3a0000", "#3c0000", "#3d0000", "#3f0000", "#400000", "#410000", "#430000", "#450000", "#460000", "#480000", "#490000", "#4b0000", "#4c0000", "#4e0000", "#4f0000", "#510000", "#520000", "#540000", "#550000", "#570000", "#580000", "#590000", "#5b0000", "#5d0000", "#5e0000", "#600000", "#610000", "#620000", "#640000", "#660000", "#670000", "#690000", "#6a0000", "#6c0000", "#6d0000", "#6e0000", "#700000", "#710000", "#730000", "#750000", "#760000", "#780000", "#790000", "#7a0000", "#7c0000", "#7e0000", "#7f0000", "#810000", "#820000", "#830000", "#850000", "#860000", "#880000", "#8a0000", "#8b0000", "#8d0000", "#8e0000", "#900000", "#910000", "#930000", "#940000", "#960000", "#970000", "#990000", "#9a0000", "#9c0000", "#9d0000", "#9f0000", "#a00000", "#a20000", "#a30000", "#a50000", "#a60000", "#a80000", "#a90000", "#ab0000", "#ac0000", "#ae0000", "#af0000", "#b10000", "#b20000", "#b30000", "#b50000", "#b60000", "#b80000", "#ba0000", "#bb0000", "#bd0000", "#be0000", "#c00000", "#c10200", "#c30400", "#c40600", "#c50800", "#c70b00", "#c90d00", "#ca0f00", "#cc1000", "#cd1200", "#cf1400", "#d01600", "#d21900", "#d31b00", "#d51d00", "#d61f00", "#d82000", "#d92200", "#db2400", "#dc2600", "#dd2800", "#df2b00", "#e12d00", "#e22f00", "#e33000", "#e53200", "#e63400", "#e83600", "#ea3900", "#eb3b00", "#ed3d00", "#ee3f00", "#f04100", "#f14200", "#f34400", "#f44600", "#f54800", "#f74b00", "#f94d00", "#fa4f00", "#fc5100", "#fd5200", "#ff5400", "#ff5600", "#ff5900", "#ff5b00", "#ff5d00", "#ff5f00", "#ff6100", "#ff6200", "#ff6400", "#ff6600", "#ff6800", "#ff6b00", "#ff6d00", "#ff6f00", "#ff7100", "#ff7200", "#ff7400", "#ff7600", "#ff7900", "#ff7b00", "#ff7d00", "#ff7f00", "#ff8102", "#ff8306", "#ff840a", "#ff860e", "#ff8812", "#ff8b17", "#ff8d1b", "#ff8f1f", "#ff9122", "#ff9326", "#ff942a", "#ff962e", "#ff9933", "#ff9b37", "#ff9d3b", "#ff9f3f", "#ffa142", "#ffa346", "#ffa44a", "#ffa64e", "#ffa852", "#ffab57", "#ffad5b", "#ffaf5f", "#ffb162", "#ffb366", "#ffb46a", "#ffb66e", "#ffb973", "#ffbb77", "#ffbd7b", "#ffbf7f", "#ffc183", "#ffc386", "#ffc48a", "#ffc68e", "#ffc892", "#ffcb97", "#ffcd9b", "#ffcf9f", "#ffd1a3", "#ffd3a6", "#ffd4aa", "#ffd6ae", "#ffd9b3", "#ffdbb7", "#ffddbb", "#ffdfbf", "#ffe1c3", "#ffe3c6", "#ffe4ca", "#ffe6ce", "#ffe8d2", "#ffebd7", "#ffeddb", "#ffefdf", "#fff1e3", "#fff3e6", "#fff4ea", "#fff6ee", "#fff9f3", "#fffbf7", "#fffdfb", "#ffffff" ], "gist_ncar": [ "#000080", "#000776", "#000e6d", "#001563", "#001d5a", "#002450", "#002b47", "#00333e", "#003a34", "#00412b", "#004821", "#005018", "#00570f", "#005e05", "#005816", "#005126", "#004a37", "#004348", "#003d58", "#003669", "#002f79", "#00288a", "#00219b", "#001bab", "#0014bc", "#000dcd", "#0006dd", "#0000ee", "#000eff", "#001cff", "#002aff", "#0038ff", "#0046ff", "#0054ff", "#0062ff", "#0070ff", "#007fff", "#008dff", "#009bff", "#00a9ff", "#00b7ff", "#00c0ff", "#00c5ff", "#00caff", "#00ceff", "#00d2ff", "#00d7ff", "#00dbff", "#00e0ff", "#00e4ff", "#00e8ff", "#00edff", "#00f1fe", "#00f6f8", "#00faf1", "#00feeb", "#00fee4", "#00fede", "#00fdd7", "#00fdd1", "#00fcca", "#00fcc3", "#00fbbd", "#00fbb6", "#00fab0", "#00faa9", "#00faa3", "#00fa9c", "#00fa92", "#00fa87", "#00fa7d", "#00fa72", "#00fb68", "#00fb5d", "#00fc53", "#00fc49", "#00fc3e", "#00fd34", "#00fd29", "#00fe1f", "#06fe14", "#0cfe0a", "#13fb00", "#19f700", "#1ff300", "#26ef00", "#2cec00", "#32e800", "#39e400", "#3fe000", "#46dd00", "#4cd900", "#52d500", "#59d100", "#5fce00", "#65d100", "#67d400", "#69d700", "#6bdb00", "#6dde00", "#6fe100", "#71e400", "#73e800", "#75eb00", "#77ee00", "#79f100", "#7bf500", "#7df803", "#7ffb07", "#84fe0b", "#88ff0f", "#8dff13", "#91ff17", "#96ff1b", "#9aff1f", "#9fff23", "#a4ff27", "#a8ff2b", "#adff2f", "#b1ff33", "#b6ff37", "#baff3b", "#bfff37", "#c3ff33", "#c8ff2f", "#ccff2b", "#d1ff27", "#d6ff23", "#daff1f", "#dfff1b", "#e3ff17", "#e8ff13", "#ecff0f", "#f1ff0b", "#f5fc07", "#fafa03", "#fff700", "#fff500", "#fff200", "#fff000", "#ffed00", "#ffeb00", "#ffe800", "#ffe600", "#ffe300", "#ffe100", "#ffde00", "#ffdc00", "#ffda00", "#ffd701", "#ffd502", "#ffd203", "#ffd004", "#ffcd05", "#ffcb06", "#ffc807", "#ffc608", "#ffc309", "#ffc10a", "#ffbe0b", "#ffbc0c", "#ffb90d", "#ffb10d", "#ffa90c", "#ffa10b", "#ff990a", "#ff9109", "#ff8808", "#ff8007", "#ff7806", "#ff7005", "#ff6804", "#ff5f03", "#ff5702", "#ff4f01", "#ff4700", "#ff4200", "#ff3d00", "#ff3900", "#ff3400", "#ff2f00", "#ff2a00", "#ff2600", "#ff2100", "#ff1c00", "#ff1700", "#ff1300", "#ff0e00", "#ff0900", "#ff0411", "#ff0023", "#ff0035", "#ff0046", "#ff0058", "#ff006a", "#ff007b", "#ff008d", "#ff009f", "#ff00b1", "#ff00c2", "#ff00d4", "#ff00e6", "#ff00f8", "#f803fb", "#f106ff", "#ea0aff", "#e30dff", "#dc11ff", "#d514ff", "#ce18ff", "#c71bff", "#c11eff", "#ba22ff", "#b325ff", "#ac29ff", "#a52cfe", "#9e32fd", "#a438fc", "#aa3efb", "#b044fa", "#b64af8", "#bc50f7", "#c256f6", "#c75cf5", "#cd61f4", "#d367f2", "#d96df1", "#df73f0", "#e579ef", "#eb7fee", "#ec84ee", "#ec88ef", "#ed8df0", "#ee92f0", "#ef96f1", "#ef9bf1", "#f09ff2", "#f1a4f3", "#f1a9f3", "#f2adf4", "#f3b2f4", "#f4b7f5", "#f4bbf6", "#f5c0f6", "#f6c5f7", "#f6c9f7", "#f7cef8", "#f8d2f9", "#f9d7f9", "#f9dcfa", "#fae0fa", "#fbe5fb", "#fbeafc", "#fceefc", "#fdf3fd", "#fef7fe" ], "gist_stern": [ "#000000", "#120102", "#240204", "#360306", "#490408", "#5b050a", "#6d060c", "#7f070e", "#920810", "#a40912", "#b60a14", "#c90b16", "#db0c18", "#ed0d1a", "#fe0e1c", "#f90f1e", "#f41020", "#ef1122", "#ea1224", "#e51326", "#e01428", "#db152a", "#d6162c", "#d1172e", "#cc1830", "#c71932", "#c21a34", "#bd1b36", "#b81c38", "#b41d3a", "#af1e3c", "#aa1f3e", "#a52040", "#a02041", "#9b2244", "#962346", "#912448", "#8c2449", "#87264c", "#82274e", "#7d2850", "#782851", "#732a54", "#6e2b56", "#692c58", "#642c59", "#5f2e5c", "#5a2f5e", "#553060", "#503061", "#4b3264", "#463366", "#413468", "#3c3469", "#37366c", "#32376e", "#2d3870", "#283871", "#233a74", "#1e3b76", "#193c78", "#143c79", "#0f3e7c", "#0a3f7e", "#404080", "#414182", "#414183", "#434386", "#444488", "#45458a", "#46468c", "#47478e", "#484890", "#494992", "#494993", "#4b4b96", "#4c4c98", "#4d4d9a", "#4e4e9c", "#4f4f9e", "#5050a0", "#5151a2", "#5151a3", "#5353a6", "#5454a8", "#5555aa", "#5656ac", "#5757ae", "#5858b0", "#5959b2", "#5959b3", "#5b5bb6", "#5c5cb8", "#5d5dba", "#5e5ebc", "#5f5fbe", "#6060c0", "#6161c2", "#6161c3", "#6363c6", "#6464c8", "#6565ca", "#6666cc", "#6767ce", "#6868d0", "#6969d2", "#6969d3", "#6b6bd6", "#6c6cd8", "#6d6dda", "#6e6edc", "#6f6fde", "#7070e0", "#7171e2", "#7171e3", "#7373e6", "#7474e8", "#7575ea", "#7676ec", "#7777ee", "#7878f0", "#7979f2", "#7979f3", "#7b7bf6", "#7c7cf8", "#7d7dfa", "#7e7efc", "#7f7ffe", "#8080fc", "#8181f8", "#8282f4", "#8383f0", "#8383eb", "#8485e7", "#8686e3", "#8787df", "#8888da", "#8989d6", "#8a8ad2", "#8b8bce", "#8c8cc9", "#8d8dc5", "#8e8ec1", "#8f8fbd", "#9090b8", "#9191b4", "#9292b0", "#9393ac", "#9393a7", "#9595a3", "#96969f", "#97979a", "#989896", "#999992", "#9a9a8e", "#9b9b89", "#9c9c85", "#9d9d81", "#9e9e7d", "#9f9f78", "#a0a074", "#a1a170", "#a2a26c", "#a3a367", "#a3a363", "#a5a55f", "#a6a65b", "#a7a756", "#a8a852", "#a9a94e", "#aaaa4a", "#abab45", "#acac41", "#adad3d", "#aeae39", "#afaf34", "#b0b030", "#b1b12c", "#b2b228", "#b3b323", "#b3b31f", "#b5b51b", "#b6b617", "#b7b712", "#b8b80e", "#b9b90a", "#baba06", "#bbbb01", "#bcbc02", "#bdbd05", "#bebe09", "#bfbf0d", "#c0c011", "#c1c115", "#c2c218", "#c3c31c", "#c3c320", "#c4c524", "#c5c627", "#c7c72b", "#c8c82f", "#c9c933", "#caca37", "#cbcb3a", "#cbcc3e", "#cdcd42", "#cece46", "#cfcf49", "#d0d04d", "#d1d151", "#d2d255", "#d3d358", "#d3d35c", "#d5d560", "#d6d664", "#d7d768", "#d8d86b", "#d9d96f", "#dada73", "#dbdb77", "#dcdc7a", "#dddd7e", "#dede82", "#dfdf86", "#e0e08a", "#e1e18d", "#e2e291", "#e3e395", "#e3e399", "#e5e59c", "#e6e6a0", "#e7e7a4", "#e8e8a8", "#e9e9ab", "#eaeaaf", "#ebebb3", "#ececb7", "#ededbb", "#eeeebe", "#efefc2", "#f0f0c6", "#f1f1ca", "#f2f2cd", "#f3f3d1", "#f3f3d5", "#f4f5d9", "#f5f6dd", "#f7f7e0", "#f8f8e4", "#f9f9e8", "#fafaec", "#fbfbef", "#fbfcf3", "#fdfdf7", "#fefefb", "#ffffff" ], "gist_yarg": [ "#ffffff", "#fefefe", "#fdfdfd", "#fcfcfc", "#fbfbfb", "#fafafa", "#f9f9f9", "#f8f8f8", "#f7f7f7", "#f6f6f6", "#f5f5f5", "#f4f4f4", "#f3f3f3", "#f2f2f2", "#f1f1f1", "#f0f0f0", "#efefef", "#eeeeee", "#ededed", "#ececec", "#ebebeb", "#eaeaea", "#e9e9e9", "#e8e8e8", "#e7e7e7", "#e6e6e6", "#e5e5e5", "#e4e4e4", "#e3e3e3", "#e2e2e2", "#e1e1e1", "#e0e0e0", "#dfdfdf", "#dedede", "#dddddd", "#dcdcdc", "#dbdbdb", "#dadada", "#d9d9d9", "#d8d8d8", "#d7d7d7", "#d6d6d6", "#d5d5d5", "#d3d3d3", "#d3d3d3", "#d2d2d2", "#d1d1d1", "#d0d0d0", "#cfcfcf", "#cecece", "#cdcdcd", "#cccccc", "#cbcbcb", "#cacaca", "#c9c9c9", "#c8c8c8", "#c7c7c7", "#c6c6c6", "#c5c5c5", "#c3c3c3", "#c3c3c3", "#c2c2c2", "#c1c1c1", "#c0c0c0", "#bfbfbf", "#bebebe", "#bdbdbd", "#bcbcbc", "#bbbbbb", "#bababa", "#b9b9b9", "#b8b8b8", "#b7b7b7", "#b6b6b6", "#b5b5b5", "#b3b3b3", "#b3b3b3", "#b2b2b2", "#b1b1b1", "#b0b0b0", "#afafaf", "#aeaeae", "#adadad", "#acacac", "#ababab", "#aaaaaa", "#a9a9a9", "#a8a8a8", "#a7a7a7", "#a6a6a6", "#a5a5a5", "#a3a3a3", "#a3a3a3", "#a2a2a2", "#a1a1a1", "#a0a0a0", "#9f9f9f", "#9e9e9e", "#9d9d9d", "#9c9c9c", "#9b9b9b", "#9a9a9a", "#999999", "#989898", "#979797", "#969696", "#959595", "#939393", "#939393", "#929292", "#919191", "#909090", "#8f8f8f", "#8e8e8e", "#8d8d8d", "#8c8c8c", "#8b8b8b", "#8a8a8a", "#898989", "#888888", "#878787", "#868686", "#858585", "#838383", "#838383", "#828282", "#818181", "#808080", "#7f7f7f", "#7e7e7e", "#7d7d7d", "#7c7c7c", "#7b7b7b", "#797979", "#797979", "#787878", "#777777", "#767676", "#757575", "#747474", "#727272", "#717171", "#717171", "#707070", "#6f6f6f", "#6e6e6e", "#6d6d6d", "#6c6c6c", "#6b6b6b", "#696969", "#696969", "#686868", "#676767", "#666666", "#656565", "#646464", "#626262", "#616161", "#616161", "#606060", "#5f5f5f", "#5e5e5e", "#5d5d5d", "#5c5c5c", "#5b5b5b", "#595959", "#595959", "#585858", "#575757", "#565656", "#555555", "#545454", "#525252", "#515151", "#515151", "#505050", "#4f4f4f", "#4e4e4e", "#4d4d4d", "#4c4c4c", "#4b4b4b", "#494949", "#494949", "#484848", "#474747", "#464646", "#454545", "#444444", "#424242", "#414141", "#414141", "#404040", "#3f3f3f", "#3e3e3e", "#3d3d3d", "#3c3c3c", "#3b3b3b", "#393939", "#383838", "#383838", "#373737", "#363636", "#353535", "#343434", "#323232", "#313131", "#303030", "#303030", "#2f2f2f", "#2e2e2e", "#2d2d2d", "#2c2c2c", "#2b2b2b", "#292929", "#282828", "#282828", "#272727", "#262626", "#252525", "#242424", "#222222", "#212121", "#202020", "#202020", "#1f1f1f", "#1e1e1e", "#1d1d1d", "#1c1c1c", "#1b1b1b", "#191919", "#181818", "#181818", "#171717", "#161616", "#151515", "#141414", "#121212", "#111111", "#101010", "#101010", "#0f0f0f", "#0e0e0e", "#0d0d0d", "#0c0c0c", "#0b0b0b", "#090909", "#080808", "#080808", "#070707", "#060606", "#050505", "#040404", "#020202", "#010101", "#000000", "#000000" ], "gnuplot": [ "#000000", "#0f0006", "#16000c", "#1b0012", "#1f0019", "#23001f", "#270025", "#2a002b", "#2d0031", "#2f0038", "#32003e", "#340044", "#37004a", "#390050", "#3b0056", "#3d005c", "#3f0061", "#410067", "#43006d", "#450073", "#470078", "#49007e", "#4a0083", "#4c0088", "#4e008e", "#4f0093", "#510098", "#52009d", "#5400a2", "#5500a7", "#5700ab", "#5800b0", "#5a00b4", "#5b00b9", "#5d00bd", "#5e00c1", "#5f00c5", "#6100c9", "#6200cd", "#6300d1", "#6400d4", "#6601d7", "#6701db", "#6801de", "#6901e1", "#6b01e4", "#6c01e6", "#6d01e9", "#6e01ec", "#6f01ee", "#7001f0", "#7202f2", "#7302f4", "#7402f6", "#7502f7", "#7602f9", "#7702fa", "#7802fb", "#7903fc", "#7a03fd", "#7b03fd", "#7c03fe", "#7d03fe", "#7e03fe", "#7f04fe", "#8004fe", "#8104fe", "#8204fe", "#8304fd", "#8405fc", "#8505fb", "#8605fa", "#8705f9", "#8805f8", "#8906f6", "#8a06f5", "#8b06f3", "#8c07f1", "#8d07ef", "#8d07ed", "#8e07ea", "#8f08e8", "#9008e5", "#9108e2", "#9209df", "#9309dc", "#9409d9", "#940ad6", "#950ad2", "#960acf", "#970bcb", "#980bc7", "#990bc3", "#990cbf", "#9a0cbb", "#9b0db7", "#9c0db2", "#9d0eae", "#9e0ea9", "#9e0ea4", "#9f0f9f", "#a00f9a", "#a11095", "#a21090", "#a2118b", "#a31186", "#a41280", "#a5127b", "#a51375", "#a61370", "#a7146a", "#a81564", "#a8155f", "#a91659", "#aa1653", "#ab174d", "#ab1847", "#ac1841", "#ad193b", "#ae1935", "#ae1a2e", "#af1b28", "#b01b22", "#b11c1c", "#b11d15", "#b21e0f", "#b31e09", "#b31f03", "#b42000", "#b52100", "#b62100", "#b62200", "#b72300", "#b82400", "#b82500", "#b92500", "#ba2600", "#ba2700", "#bb2800", "#bc2900", "#bc2a00", "#bd2b00", "#be2c00", "#be2c00", "#bf2d00", "#c02e00", "#c02f00", "#c13000", "#c23100", "#c23200", "#c33300", "#c43400", "#c43600", "#c53700", "#c63800", "#c63900", "#c73a00", "#c83b00", "#c83c00", "#c93d00", "#c93e00", "#ca4000", "#cb4100", "#cb4200", "#cc4300", "#cd4500", "#cd4600", "#ce4700", "#ce4800", "#cf4a00", "#d04b00", "#d04c00", "#d14e00", "#d24f00", "#d25100", "#d35200", "#d35300", "#d45500", "#d55600", "#d55800", "#d65900", "#d65b00", "#d75c00", "#d85e00", "#d85f00", "#d96100", "#d96200", "#da6400", "#da6600", "#db6700", "#dc6900", "#dc6b00", "#dd6c00", "#dd6e00", "#de7000", "#de7200", "#df7300", "#e07500", "#e07700", "#e17900", "#e17b00", "#e27c00", "#e27e00", "#e38000", "#e48200", "#e48400", "#e58600", "#e58800", "#e68a00", "#e68c00", "#e78e00", "#e79000", "#e89200", "#e99400", "#e99600", "#ea9800", "#ea9a00", "#eb9d00", "#eb9f00", "#eca100", "#eca300", "#eda500", "#eda800", "#eeaa00", "#eeac00", "#efaf00", "#f0b100", "#f0b300", "#f1b600", "#f1b800", "#f2bb00", "#f2bd00", "#f3c000", "#f3c200", "#f4c500", "#f4c700", "#f5ca00", "#f5cc00", "#f6cf00", "#f6d100", "#f7d400", "#f7d700", "#f8d900", "#f8dc00", "#f9df00", "#f9e200", "#fae400", "#fae700", "#fbea00", "#fbed00", "#fcf000", "#fcf300", "#fdf600", "#fdf900", "#fefc00", "#ffff00" ], "gnuplot2": [ "#000000", "#000004", "#000008", "#00000c", "#000010", "#000014", "#000018", "#00001c", "#000020", "#000024", "#000028", "#00002c", "#000030", "#000034", "#000038", "#00003c", "#000040", "#000044", "#000048", "#00004c", "#000050", "#000054", "#000058", "#00005c", "#000060", "#000064", "#000068", "#00006c", "#000070", "#000074", "#000078", "#00007c", "#000080", "#000083", "#000088", "#00008c", "#000090", "#000093", "#000098", "#00009c", "#0000a0", "#0000a3", "#0000a8", "#0000ac", "#0000b0", "#0000b3", "#0000b8", "#0000bc", "#0000c0", "#0000c3", "#0000c8", "#0000cc", "#0000d0", "#0000d3", "#0000d8", "#0000dc", "#0000e0", "#0000e3", "#0000e8", "#0000ec", "#0000f0", "#0000f3", "#0000f8", "#0000fc", "#0000ff", "#0300ff", "#0700ff", "#0a00ff", "#0d00ff", "#1000ff", "#1300ff", "#1600ff", "#1900ff", "#1c00ff", "#2000ff", "#2300ff", "#2600ff", "#2900ff", "#2c00ff", "#2f00ff", "#3200ff", "#3500ff", "#3900ff", "#3c00ff", "#3f00ff", "#4200ff", "#4500ff", "#4800ff", "#4b00ff", "#4e00ff", "#5200ff", "#5500ff", "#5800ff", "#5b00ff", "#5e00ff", "#6100ff", "#6400ff", "#6700ff", "#6b00ff", "#6e00ff", "#7100ff", "#7400ff", "#7700ff", "#7a00ff", "#7d00ff", "#8000ff", "#8400ff", "#8700ff", "#8a01fd", "#8d03fb", "#9005f9", "#9307f7", "#9609f5", "#990bf3", "#9d0df1", "#a00fef", "#a311ed", "#a613eb", "#a915e9", "#ac17e7", "#af19e5", "#b21be3", "#b61de1", "#b91fdf", "#bc21dd", "#bf23db", "#c225d9", "#c527d7", "#c829d5", "#cb2bd3", "#cf2dd1", "#d22fcf", "#d531cd", "#d833cb", "#db35c9", "#de37c7", "#e139c5", "#e43bc3", "#e83dc1", "#eb3fbf", "#ee41bd", "#f143bb", "#f445b9", "#f747b7", "#fa49b5", "#fd4bb3", "#ff4db1", "#ff4faf", "#ff51ad", "#ff53ab", "#ff55a9", "#ff57a7", "#ff59a5", "#ff5ba3", "#ff5da1", "#ff5f9f", "#ff619d", "#ff639b", "#ff6599", "#ff6797", "#ff6995", "#ff6b93", "#ff6d91", "#ff6f8f", "#ff718d", "#ff738b", "#ff7589", "#ff7787", "#ff7985", "#ff7b83", "#ff7d81", "#ff7f7f", "#ff817d", "#ff837b", "#ff8579", "#ff8777", "#ff8975", "#ff8b73", "#ff8d71", "#ff8f6f", "#ff916d", "#ff936b", "#ff9569", "#ff9767", "#ff9965", "#ff9b63", "#ff9d61", "#ff9f5f", "#ffa15d", "#ffa35b", "#ffa559", "#ffa757", "#ffa955", "#ffab53", "#ffad51", "#ffaf4f", "#ffb14d", "#ffb34b", "#ffb549", "#ffb747", "#ffb945", "#ffbb43", "#ffbd41", "#ffbf3f", "#ffc13d", "#ffc33b", "#ffc539", "#ffc737", "#ffc935", "#ffcb33", "#ffcd31", "#ffcf2f", "#ffd12d", "#ffd32b", "#ffd529", "#ffd727", "#ffd925", "#ffdb23", "#ffdd21", "#ffdf1f", "#ffe11d", "#ffe31b", "#ffe519", "#ffe717", "#ffe915", "#ffeb13", "#ffed11", "#ffef0f", "#fff10d", "#fff30b", "#fff509", "#fff707", "#fff905", "#fffb03", "#fffd01", "#ffff04", "#ffff11", "#ffff1d", "#ffff2a", "#ffff36", "#ffff43", "#ffff4f", "#ffff5c", "#ffff68", "#ffff75", "#ffff82", "#ffff8e", "#ffff9a", "#ffffa7", "#ffffb3", "#ffffc0", "#ffffcc", "#ffffd9", "#ffffe6", "#fffff2", "#ffffff" ], "hot": [ "#0a0000", "#0d0000", "#0f0000", "#120000", "#150000", "#170000", "#1a0000", "#1c0000", "#1f0000", "#220000", "#240000", "#270000", "#2a0000", "#2c0000", "#2f0000", "#310000", "#340000", "#370000", "#390000", "#3c0000", "#3f0000", "#410000", "#440000", "#460000", "#490000", "#4c0000", "#4e0000", "#510000", "#540000", "#560000", "#590000", "#5b0000", "#5e0000", "#610000", "#630000", "#660000", "#690000", "#6b0000", "#6e0000", "#700000", "#730000", "#760000", "#780000", "#7b0000", "#7e0000", "#800000", "#830000", "#850000", "#880000", "#8b0000", "#8d0000", "#900000", "#930000", "#950000", "#980000", "#9a0000", "#9d0000", "#a00000", "#a20000", "#a50000", "#a80000", "#aa0000", "#ad0000", "#af0000", "#b20000", "#b50000", "#b70000", "#ba0000", "#bd0000", "#bf0000", "#c20000", "#c40000", "#c70000", "#ca0000", "#cc0000", "#cf0000", "#d20000", "#d40000", "#d70000", "#d90000", "#dc0000", "#df0000", "#e10000", "#e40000", "#e70000", "#e90000", "#ec0000", "#ee0000", "#f10000", "#f40000", "#f60000", "#f90000", "#fc0000", "#fe0000", "#ff0200", "#ff0500", "#ff0700", "#ff0a00", "#ff0c00", "#ff0f00", "#ff1200", "#ff1400", "#ff1700", "#ff1a00", "#ff1c00", "#ff1f00", "#ff2100", "#ff2400", "#ff2700", "#ff2900", "#ff2c00", "#ff2f00", "#ff3100", "#ff3400", "#ff3600", "#ff3900", "#ff3c00", "#ff3e00", "#ff4100", "#ff4400", "#ff4600", "#ff4900", "#ff4b00", "#ff4e00", "#ff5100", "#ff5300", "#ff5600", "#ff5900", "#ff5b00", "#ff5e00", "#ff6000", "#ff6300", "#ff6600", "#ff6800", "#ff6b00", "#ff6e00", "#ff7000", "#ff7300", "#ff7500", "#ff7800", "#ff7b00", "#ff7d00", "#ff8000", "#ff8300", "#ff8500", "#ff8800", "#ff8a00", "#ff8d00", "#ff9000", "#ff9200", "#ff9500", "#ff9700", "#ff9a00", "#ff9d00", "#ff9f00", "#ffa200", "#ffa500", "#ffa700", "#ffaa00", "#ffac00", "#ffaf00", "#ffb200", "#ffb400", "#ffb700", "#ffba00", "#ffbc00", "#ffbf00", "#ffc100", "#ffc400", "#ffc700", "#ffc900", "#ffcc00", "#ffcf00", "#ffd100", "#ffd400", "#ffd600", "#ffd900", "#ffdc00", "#ffde00", "#ffe100", "#ffe400", "#ffe600", "#ffe900", "#ffeb00", "#ffee00", "#fff100", "#fff300", "#fff600", "#fff900", "#fffb00", "#fffe00", "#ffff02", "#ffff06", "#ffff0a", "#ffff0e", "#ffff12", "#ffff16", "#ffff1a", "#ffff1e", "#ffff22", "#ffff26", "#ffff2a", "#ffff2e", "#ffff32", "#ffff36", "#ffff3a", "#ffff3e", "#ffff41", "#ffff45", "#ffff49", "#ffff4d", "#ffff51", "#ffff55", "#ffff59", "#ffff5d", "#ffff61", "#ffff65", "#ffff69", "#ffff6d", "#ffff71", "#ffff75", "#ffff79", "#ffff7d", "#ffff80", "#ffff84", "#ffff88", "#ffff8c", "#ffff90", "#ffff94", "#ffff98", "#ffff9c", "#ffffa0", "#ffffa4", "#ffffa8", "#ffffac", "#ffffb0", "#ffffb4", "#ffffb8", "#ffffbc", "#ffffbf", "#ffffc3", "#ffffc7", "#ffffcb", "#ffffcf", "#ffffd3", "#ffffd7", "#ffffdb", "#ffffdf", "#ffffe3", "#ffffe7", "#ffffeb", "#ffffef", "#fffff3", "#fffff7", "#fffffb", "#ffffff" ], "hsv": [ "#ff0000", "#ff0500", "#ff0b00", "#ff1100", "#ff1700", "#ff1d00", "#ff2300", "#ff2900", "#ff2f00", "#ff3500", "#ff3b00", "#ff4000", "#ff4600", "#ff4c00", "#ff5200", "#ff5800", "#ff5e00", "#ff6400", "#ff6a00", "#ff7000", "#ff7600", "#ff7c00", "#ff8100", "#ff8700", "#ff8d00", "#ff9300", "#ff9900", "#ff9f00", "#ffa500", "#ffab00", "#ffb100", "#ffb700", "#ffbd00", "#ffc200", "#ffc800", "#ffce00", "#ffd400", "#ffda00", "#ffe000", "#ffe600", "#ffec00", "#fdf100", "#fbf500", "#faf900", "#f8fc00", "#f4ff00", "#eeff00", "#e8ff00", "#e2ff00", "#dcff00", "#d6ff00", "#d0ff00", "#caff00", "#c4ff00", "#bfff00", "#b9ff00", "#b3ff00", "#adff00", "#a7ff00", "#a1ff00", "#9bff00", "#95ff00", "#8fff00", "#89ff00", "#83ff00", "#7eff00", "#78ff00", "#72ff00", "#6cff00", "#66ff00", "#60ff00", "#5aff00", "#54ff00", "#4eff00", "#48ff00", "#43ff00", "#3dff00", "#37ff00", "#31ff00", "#2bff00", "#25ff00", "#1fff00", "#19ff00", "#13ff00", "#0dff00", "#07ff00", "#05ff03", "#04ff07", "#02ff0b", "#00ff0f", "#00ff15", "#00ff1b", "#00ff21", "#00ff27", "#00ff2d", "#00ff33", "#00ff39", "#00ff3e", "#00ff44", "#00ff4a", "#00ff50", "#00ff56", "#00ff5c", "#00ff62", "#00ff68", "#00ff6e", "#00ff74", "#00ff79", "#00ff7f", "#00ff85", "#00ff8b", "#00ff91", "#00ff97", "#00ff9d", "#00ffa3", "#00ffa9", "#00ffaf", "#00ffb5", "#00ffba", "#00ffc0", "#00ffc6", "#00ffcc", "#00ffd2", "#00ffd8", "#00ffde", "#00ffe4", "#00ffea", "#00fff0", "#00fff5", "#00fffb", "#00fcff", "#00f6ff", "#00f0ff", "#00eaff", "#00e4ff", "#00deff", "#00d8ff", "#00d2ff", "#00ccff", "#00c7ff", "#00c1ff", "#00bbff", "#00b5ff", "#00afff", "#00a9ff", "#00a3ff", "#009dff", "#0097ff", "#0091ff", "#008bff", "#0086ff", "#0080ff", "#007aff", "#0074ff", "#006eff", "#0068ff", "#0062ff", "#005cff", "#0056ff", "#0050ff", "#004bff", "#0045ff", "#003fff", "#0039ff", "#0033ff", "#002dff", "#0027ff", "#0021ff", "#001bff", "#0015ff", "#000fff", "#010cff", "#0308ff", "#0504ff", "#0700ff", "#0d00ff", "#1300ff", "#1900ff", "#1f00ff", "#2500ff", "#2b00ff", "#3100ff", "#3600ff", "#3c00ff", "#4200ff", "#4800ff", "#4e00ff", "#5400ff", "#5a00ff", "#6000ff", "#6600ff", "#6c00ff", "#7100ff", "#7700ff", "#7d00ff", "#8300ff", "#8900ff", "#8f00ff", "#9500ff", "#9b00ff", "#a100ff", "#a700ff", "#ad00ff", "#b200ff", "#b800ff", "#be00ff", "#c400ff", "#ca00ff", "#d000ff", "#d600ff", "#dc00ff", "#e200ff", "#e800ff", "#ee00ff", "#f300ff", "#f700fd", "#f900f9", "#fb00f5", "#fd00f1", "#ff00ec", "#ff00e6", "#ff00e0", "#ff00da", "#ff00d4", "#ff00cf", "#ff00c9", "#ff00c3", "#ff00bd", "#ff00b7", "#ff00b1", "#ff00ab", "#ff00a5", "#ff009f", "#ff0099", "#ff0093", "#ff008e", "#ff0088", "#ff0082", "#ff007c", "#ff0076", "#ff0070", "#ff006a", "#ff0064", "#ff005e", "#ff0058", "#ff0052", "#ff004d", "#ff0047", "#ff0041", "#ff003b", "#ff0035", "#ff002f", "#ff0029", "#ff0023", "#ff001d", "#ff0017" ], "inferno": [ "#000003", "#000004", "#000006", "#010007", "#010109", "#01010b", "#02010e", "#020210", "#030212", "#040314", "#040316", "#050418", "#06041b", "#07051d", "#08061f", "#090621", "#0a0723", "#0b0726", "#0d0828", "#0e082a", "#0f092d", "#10092f", "#120a32", "#130a34", "#140b36", "#160b39", "#170b3b", "#190b3e", "#1a0b40", "#1c0c43", "#1d0c45", "#1f0c47", "#200c4a", "#220b4c", "#240b4e", "#260b50", "#270b52", "#290b54", "#2b0a56", "#2d0a58", "#2e0a5a", "#300a5c", "#32095d", "#34095f", "#350960", "#370961", "#390962", "#3b0964", "#3c0965", "#3e0966", "#400966", "#410967", "#430a68", "#450a69", "#460a69", "#480b6a", "#4a0b6a", "#4b0c6b", "#4d0c6b", "#4f0d6c", "#500d6c", "#520e6c", "#530e6d", "#550f6d", "#570f6d", "#58106d", "#5a116d", "#5b116e", "#5d126e", "#5f126e", "#60136e", "#62146e", "#63146e", "#65156e", "#66156e", "#68166e", "#6a176e", "#6b176e", "#6d186e", "#6e186e", "#70196e", "#72196d", "#731a6d", "#751b6d", "#761b6d", "#781c6d", "#7a1c6d", "#7b1d6c", "#7d1d6c", "#7e1e6c", "#801f6b", "#811f6b", "#83206b", "#85206a", "#86216a", "#88216a", "#892269", "#8b2269", "#8d2369", "#8e2468", "#902468", "#912567", "#932567", "#952666", "#962666", "#982765", "#992864", "#9b2864", "#9c2963", "#9e2963", "#a02a62", "#a12b61", "#a32b61", "#a42c60", "#a62c5f", "#a72d5f", "#a92e5e", "#ab2e5d", "#ac2f5c", "#ae305b", "#af315b", "#b1315a", "#b23259", "#b43358", "#b53357", "#b73456", "#b83556", "#ba3655", "#bb3754", "#bd3753", "#be3852", "#bf3951", "#c13a50", "#c23b4f", "#c43c4e", "#c53d4d", "#c73e4c", "#c83e4b", "#c93f4a", "#cb4049", "#cc4148", "#cd4247", "#cf4446", "#d04544", "#d14643", "#d24742", "#d44841", "#d54940", "#d64a3f", "#d74b3e", "#d94d3d", "#da4e3b", "#db4f3a", "#dc5039", "#dd5238", "#de5337", "#df5436", "#e05634", "#e25733", "#e35832", "#e45a31", "#e55b30", "#e65c2e", "#e65e2d", "#e75f2c", "#e8612b", "#e9622a", "#ea6428", "#eb6527", "#ec6726", "#ed6825", "#ed6a23", "#ee6c22", "#ef6d21", "#f06f1f", "#f0701e", "#f1721d", "#f2741c", "#f2751a", "#f37719", "#f37918", "#f47a16", "#f57c15", "#f57e14", "#f68012", "#f68111", "#f78310", "#f7850e", "#f8870d", "#f8880c", "#f88a0b", "#f98c09", "#f98e08", "#f99008", "#fa9107", "#fa9306", "#fa9506", "#fa9706", "#fb9906", "#fb9b06", "#fb9d06", "#fb9e07", "#fba007", "#fba208", "#fba40a", "#fba60b", "#fba80d", "#fbaa0e", "#fbac10", "#fbae12", "#fbb014", "#fbb116", "#fbb318", "#fbb51a", "#fbb71c", "#fbb91e", "#fabb21", "#fabd23", "#fabf25", "#fac128", "#f9c32a", "#f9c52c", "#f9c72f", "#f8c931", "#f8cb34", "#f8cd37", "#f7cf3a", "#f7d13c", "#f6d33f", "#f6d542", "#f5d745", "#f5d948", "#f4db4b", "#f4dc4f", "#f3de52", "#f3e056", "#f3e259", "#f2e45d", "#f2e660", "#f1e864", "#f1e968", "#f1eb6c", "#f1ed70", "#f1ee74", "#f1f079", "#f1f27d", "#f2f381", "#f2f485", "#f3f689", "#f4f78d", "#f5f891", "#f6fa95", "#f7fb99", "#f9fc9d", "#fafda0", "#fcfea4" ], "jet": [ "#00007f", "#000084", "#000088", "#00008d", "#000091", "#000096", "#00009a", "#00009f", "#0000a3", "#0000a8", "#0000ac", "#0000b1", "#0000b6", "#0000ba", "#0000bf", "#0000c3", "#0000c8", "#0000cc", "#0000d1", "#0000d5", "#0000da", "#0000de", "#0000e3", "#0000e8", "#0000ec", "#0000f1", "#0000f5", "#0000fa", "#0000fe", "#0000ff", "#0000ff", "#0000ff", "#0000ff", "#0004ff", "#0008ff", "#000cff", "#0010ff", "#0014ff", "#0018ff", "#001cff", "#0020ff", "#0024ff", "#0028ff", "#002cff", "#0030ff", "#0034ff", "#0038ff", "#003cff", "#0040ff", "#0044ff", "#0048ff", "#004cff", "#0050ff", "#0054ff", "#0058ff", "#005cff", "#0060ff", "#0064ff", "#0068ff", "#006cff", "#0070ff", "#0074ff", "#0078ff", "#007cff", "#0080ff", "#0084ff", "#0088ff", "#008cff", "#0090ff", "#0094ff", "#0098ff", "#009cff", "#00a0ff", "#00a4ff", "#00a8ff", "#00acff", "#00b0ff", "#00b4ff", "#00b8ff", "#00bcff", "#00c0ff", "#00c4ff", "#00c8ff", "#00ccff", "#00d0ff", "#00d4ff", "#00d8ff", "#00dcfe", "#00e0fa", "#00e4f7", "#02e8f4", "#05ecf1", "#08f0ed", "#0cf4ea", "#0ff8e7", "#12fce4", "#15ffe1", "#18ffdd", "#1cffda", "#1fffd7", "#22ffd4", "#25ffd0", "#29ffcd", "#2cffca", "#2fffc7", "#32ffc3", "#36ffc0", "#39ffbd", "#3cffba", "#3fffb7", "#42ffb3", "#46ffb0", "#49ffad", "#4cffaa", "#4fffa6", "#53ffa3", "#56ffa0", "#59ff9d", "#5cff9a", "#5fff96", "#63ff93", "#66ff90", "#69ff8d", "#6cff89", "#70ff86", "#73ff83", "#76ff80", "#79ff7d", "#7cff79", "#80ff76", "#83ff73", "#86ff70", "#89ff6c", "#8dff69", "#90ff66", "#93ff63", "#96ff5f", "#9aff5c", "#9dff59", "#a0ff56", "#a3ff53", "#a6ff4f", "#aaff4c", "#adff49", "#b0ff46", "#b3ff42", "#b7ff3f", "#baff3c", "#bdff39", "#c0ff36", "#c3ff32", "#c7ff2f", "#caff2c", "#cdff29", "#d0ff25", "#d4ff22", "#d7ff1f", "#daff1c", "#ddff18", "#e0ff15", "#e4ff12", "#e7ff0f", "#eaff0c", "#edff08", "#f1fc05", "#f4f802", "#f7f400", "#faf000", "#feed00", "#ffe900", "#ffe500", "#ffe200", "#ffde00", "#ffda00", "#ffd700", "#ffd300", "#ffcf00", "#ffcb00", "#ffc800", "#ffc400", "#ffc000", "#ffbd00", "#ffb900", "#ffb500", "#ffb100", "#ffae00", "#ffaa00", "#ffa600", "#ffa300", "#ff9f00", "#ff9b00", "#ff9800", "#ff9400", "#ff9000", "#ff8c00", "#ff8900", "#ff8500", "#ff8100", "#ff7e00", "#ff7a00", "#ff7600", "#ff7300", "#ff6f00", "#ff6b00", "#ff6700", "#ff6400", "#ff6000", "#ff5c00", "#ff5900", "#ff5500", "#ff5100", "#ff4d00", "#ff4a00", "#ff4600", "#ff4200", "#ff3f00", "#ff3b00", "#ff3700", "#ff3400", "#ff3000", "#ff2c00", "#ff2800", "#ff2500", "#ff2100", "#ff1d00", "#ff1a00", "#ff1600", "#fe1200", "#fa0f00", "#f50b00", "#f10700", "#ec0300", "#e80000", "#e30000", "#de0000", "#da0000", "#d50000", "#d10000", "#cc0000", "#c80000", "#c30000", "#bf0000", "#ba0000", "#b60000", "#b10000", "#ac0000", "#a80000", "#a30000", "#9f0000", "#9a0000", "#960000", "#910000", "#8d0000", "#880000", "#840000", "#7f0000" ], "magma": [ "#000003", "#000004", "#000006", "#010007", "#010109", "#01010b", "#02020d", "#02020f", "#030311", "#040313", "#040415", "#050417", "#060519", "#07051b", "#08061d", "#09071f", "#0a0722", "#0b0824", "#0c0926", "#0d0a28", "#0e0a2a", "#0f0b2c", "#100c2f", "#110c31", "#120d33", "#140d35", "#150e38", "#160e3a", "#170f3c", "#180f3f", "#1a1041", "#1b1044", "#1c1046", "#1e1049", "#1f114b", "#20114d", "#221150", "#231152", "#251155", "#261157", "#281159", "#2a115c", "#2b115e", "#2d1060", "#2f1062", "#301065", "#321067", "#341068", "#350f6a", "#370f6c", "#390f6e", "#3b0f6f", "#3c0f71", "#3e0f72", "#400f73", "#420f74", "#430f75", "#450f76", "#470f77", "#481078", "#4a1079", "#4b1079", "#4d117a", "#4f117b", "#50127b", "#52127c", "#53137c", "#55137d", "#57147d", "#58157e", "#5a157e", "#5b167e", "#5d177e", "#5e177f", "#60187f", "#61187f", "#63197f", "#651a80", "#661a80", "#681b80", "#691c80", "#6b1c80", "#6c1d80", "#6e1e81", "#6f1e81", "#711f81", "#731f81", "#742081", "#762181", "#772181", "#792281", "#7a2281", "#7c2381", "#7e2481", "#7f2481", "#812581", "#822581", "#842681", "#852681", "#872781", "#892881", "#8a2881", "#8c2980", "#8d2980", "#8f2a80", "#912a80", "#922b80", "#942b80", "#952c80", "#972c7f", "#992d7f", "#9a2d7f", "#9c2e7f", "#9e2e7e", "#9f2f7e", "#a12f7e", "#a3307e", "#a4307d", "#a6317d", "#a7317d", "#a9327c", "#ab337c", "#ac337b", "#ae347b", "#b0347b", "#b1357a", "#b3357a", "#b53679", "#b63679", "#b83778", "#b93778", "#bb3877", "#bd3977", "#be3976", "#c03a75", "#c23a75", "#c33b74", "#c53c74", "#c63c73", "#c83d72", "#ca3e72", "#cb3e71", "#cd3f70", "#ce4070", "#d0416f", "#d1426e", "#d3426d", "#d4436d", "#d6446c", "#d7456b", "#d9466a", "#da4769", "#dc4869", "#dd4968", "#de4a67", "#e04b66", "#e14c66", "#e24d65", "#e44e64", "#e55063", "#e65162", "#e75262", "#e85461", "#ea5560", "#eb5660", "#ec585f", "#ed595f", "#ee5b5e", "#ee5d5d", "#ef5e5d", "#f0605d", "#f1615c", "#f2635c", "#f3655c", "#f3675b", "#f4685b", "#f56a5b", "#f56c5b", "#f66e5b", "#f6705b", "#f7715b", "#f7735c", "#f8755c", "#f8775c", "#f9795c", "#f97b5d", "#f97d5d", "#fa7f5e", "#fa805e", "#fa825f", "#fb8460", "#fb8660", "#fb8861", "#fb8a62", "#fc8c63", "#fc8e63", "#fc9064", "#fc9265", "#fc9366", "#fd9567", "#fd9768", "#fd9969", "#fd9b6a", "#fd9d6b", "#fd9f6c", "#fda16e", "#fda26f", "#fda470", "#fea671", "#fea873", "#feaa74", "#feac75", "#feae76", "#feaf78", "#feb179", "#feb37b", "#feb57c", "#feb77d", "#feb97f", "#febb80", "#febc82", "#febe83", "#fec085", "#fec286", "#fec488", "#fec689", "#fec78b", "#fec98d", "#fecb8e", "#fdcd90", "#fdcf92", "#fdd193", "#fdd295", "#fdd497", "#fdd698", "#fdd89a", "#fdda9c", "#fddc9d", "#fddd9f", "#fddfa1", "#fde1a3", "#fce3a5", "#fce5a6", "#fce6a8", "#fce8aa", "#fceaac", "#fcecae", "#fceeb0", "#fcf0b1", "#fcf1b3", "#fcf3b5", "#fcf5b7", "#fbf7b9", "#fbf9bb", "#fbfabd", "#fbfcbf" ], "nipy_spectral": [ "#000000", "#09000a", "#120015", "#1c001f", "#25002a", "#2e0035", "#38003f", "#41004a", "#4a0055", "#54005f", "#5d006a", "#660075", "#70007f", "#770088", "#780089", "#7a008a", "#7b008c", "#7c008d", "#7e008e", "#7f0090", "#800091", "#810092", "#830094", "#840095", "#850096", "#870098", "#820099", "#77009b", "#6d009c", "#62009d", "#57009f", "#4d00a0", "#4200a1", "#3700a3", "#2d00a4", "#2200a5", "#1700a7", "#0d00a8", "#0200a9", "#0000ad", "#0000b1", "#0000b5", "#0000b9", "#0000bd", "#0000c1", "#0000c5", "#0000c9", "#0000cd", "#0000d1", "#0000d5", "#0000d9", "#0000dd", "#0009dd", "#0012dd", "#001cdd", "#0025dd", "#002edd", "#0038dd", "#0041dd", "#004add", "#0054dd", "#005ddd", "#0066dd", "#0070dd", "#0077dd", "#007add", "#007ddd", "#007fdd", "#0082dd", "#0085dd", "#0087dd", "#008add", "#008ddd", "#008fdd", "#0092dd", "#0095dd", "#0097dd", "#0099db", "#009bd7", "#009cd3", "#009dcf", "#009fcb", "#00a0c7", "#00a1c3", "#00a3bf", "#00a4bb", "#00a5b7", "#00a7b3", "#00a8af", "#00a9ab", "#00aaa8", "#00aaa5", "#00aaa2", "#00aaa0", "#00aa9d", "#00aa9a", "#00aa97", "#00aa95", "#00aa92", "#00aa8f", "#00aa8d", "#00aa8a", "#00aa87", "#00a87d", "#00a772", "#00a667", "#00a45d", "#00a352", "#00a247", "#00a03d", "#009f32", "#009e27", "#009c1d", "#009b12", "#009a07", "#009900", "#009c00", "#009e00", "#00a100", "#00a400", "#00a600", "#00a900", "#00ac00", "#00ae00", "#00b100", "#00b400", "#00b600", "#00b900", "#00bc00", "#00be00", "#00c100", "#00c400", "#00c600", "#00c900", "#00cc00", "#00cf00", "#00d100", "#00d400", "#00d700", "#00d900", "#00dc00", "#00df00", "#00e100", "#00e400", "#00e700", "#00e900", "#00ec00", "#00ef00", "#00f100", "#00f400", "#00f700", "#00f900", "#00fc00", "#00ff00", "#0eff00", "#1dff00", "#2bff00", "#3aff00", "#49ff00", "#57ff00", "#66ff00", "#75ff00", "#83ff00", "#92ff00", "#a1ff00", "#afff00", "#bbfe00", "#bffd00", "#c3fb00", "#c7fa00", "#cbf900", "#cff700", "#d3f600", "#d7f500", "#dbf300", "#dff200", "#e3f100", "#e7ef00", "#ebee00", "#eeec00", "#efe900", "#f1e700", "#f2e400", "#f3e100", "#f5df00", "#f6dc00", "#f7d900", "#f9d700", "#fad400", "#fbd100", "#fdcf00", "#fecc00", "#ffc900", "#ffc500", "#ffc100", "#ffbd00", "#ffb900", "#ffb500", "#ffb100", "#ffad00", "#ffa900", "#ffa500", "#ffa100", "#ff9d00", "#ff9900", "#ff8d00", "#ff8100", "#ff7500", "#ff6900", "#ff5d00", "#ff5100", "#ff4500", "#ff3900", "#ff2c00", "#ff2000", "#ff1400", "#ff0800", "#fe0000", "#fb0000", "#f90000", "#f60000", "#f30000", "#f10000", "#ee0000", "#eb0000", "#e90000", "#e60000", "#e30000", "#e10000", "#de0000", "#dc0000", "#db0000", "#d90000", "#d80000", "#d70000", "#d50000", "#d40000", "#d30000", "#d10000", "#d00000", "#cf0000", "#cd0000", "#cc0000", "#cc0c0c", "#cc1b1b", "#cc2c2c", "#cc3c3c", "#cc4c4c", "#cc5c5c", "#cc6c6c", "#cc7c7c", "#cc8c8c", "#cc9c9c", "#ccacac", "#ccbcbc", "#cccccc" ], "ocean": [ "#007f00", "#007e01", "#007c02", "#007b03", "#007904", "#007805", "#007606", "#007507", "#007308", "#007209", "#00700a", "#006f0b", "#006d0c", "#006c0d", "#006a0e", "#00690f", "#006710", "#006611", "#006412", "#006313", "#006114", "#006015", "#005e16", "#005d17", "#005b18", "#005919", "#00581a", "#00571b", "#00551c", "#00541d", "#00521e", "#00511f", "#004f20", "#004e20", "#004c22", "#004a23", "#004924", "#004824", "#004626", "#004527", "#004328", "#004228", "#00402a", "#003f2b", "#003d2c", "#003c2c", "#003a2e", "#00382f", "#003730", "#003630", "#003432", "#003233", "#003134", "#003034", "#002e36", "#002c37", "#002b38", "#002a38", "#00283a", "#00273b", "#00253c", "#00243c", "#00223e", "#00203f", "#001f40", "#001e41", "#001c41", "#001a43", "#001944", "#001845", "#001646", "#001447", "#001348", "#001249", "#001049", "#000f4b", "#000d4c", "#000c4d", "#000a4e", "#00084f", "#000750", "#000651", "#000451", "#000253", "#000154", "#000055", "#000156", "#000257", "#000458", "#000559", "#000759", "#00085b", "#000a5c", "#000b5d", "#000d5e", "#000f5f", "#001060", "#001161", "#001361", "#001563", "#001664", "#001865", "#001966", "#001b67", "#001c68", "#001e69", "#001f69", "#00206b", "#00226c", "#00236d", "#00256e", "#00276f", "#002870", "#002971", "#002b71", "#002d73", "#002e74", "#003075", "#003176", "#003277", "#003478", "#003579", "#003779", "#00387b", "#003a7c", "#003b7d", "#003d7e", "#003f7f", "#004080", "#004181", "#004382", "#004483", "#004683", "#004885", "#004986", "#004b87", "#004c88", "#004e89", "#004f8a", "#00518b", "#00528c", "#00548d", "#00558e", "#00578f", "#005890", "#005991", "#005b92", "#005c93", "#005e93", "#006095", "#006196", "#006297", "#006498", "#006599", "#00679a", "#00689b", "#006a9c", "#006c9d", "#006d9e", "#006f9f", "#0070a0", "#0071a1", "#0073a2", "#0074a3", "#0076a3", "#0078a5", "#0079a6", "#007ba7", "#007ca8", "#007ea9", "#007faa", "#0281ab", "#0582ac", "#0883ad", "#0b85ae", "#0e86af", "#1188b0", "#1489b1", "#178bb2", "#1a8cb3", "#1d8eb3", "#2090b5", "#2391b6", "#2693b7", "#2994b8", "#2c95b9", "#2f97ba", "#3298bb", "#369abc", "#399cbd", "#3c9dbe", "#3f9fbf", "#41a0c0", "#44a2c1", "#47a3c2", "#4aa4c3", "#4da6c3", "#51a8c5", "#54a9c6", "#57abc7", "#5aacc8", "#5daec9", "#60afca", "#62b1cb", "#66b2cc", "#69b4cd", "#6cb5ce", "#6fb7cf", "#72b8d0", "#75bad1", "#78bbd2", "#7bbdd3", "#7ebed3", "#81c0d5", "#83c1d6", "#86c3d7", "#89c4d8", "#8cc5d9", "#8fc7da", "#92c8db", "#96cadc", "#99ccdd", "#9ccdde", "#9fcfdf", "#a2d0e0", "#a4d2e1", "#a7d3e2", "#aad4e3", "#add6e3", "#b1d8e5", "#b4d9e6", "#b7dbe7", "#badce8", "#bddee9", "#c0dfea", "#c3e1eb", "#c5e2ec", "#c8e3ed", "#cbe5ee", "#cee6ef", "#d1e8f0", "#d4e9f1", "#d7ebf2", "#daecf3", "#ddeef3", "#e1f0f5", "#e3f1f6", "#e6f3f7", "#e9f4f8", "#ecf5f9", "#eff7fa", "#f2f8fb", "#f6fafc", "#f9fcfd", "#fcfdfe", "#ffffff" ], "plasma": [ "#0c0786", "#100787", "#130689", "#15068a", "#18068b", "#1b068c", "#1d068d", "#1f058e", "#21058f", "#230590", "#250591", "#270592", "#290593", "#2b0594", "#2d0494", "#2f0495", "#310496", "#330497", "#340498", "#360498", "#380499", "#3a049a", "#3b039a", "#3d039b", "#3f039c", "#40039c", "#42039d", "#44039e", "#45039e", "#47029f", "#49029f", "#4a02a0", "#4c02a1", "#4e02a1", "#4f02a2", "#5101a2", "#5201a3", "#5401a3", "#5601a3", "#5701a4", "#5901a4", "#5a00a5", "#5c00a5", "#5e00a5", "#5f00a6", "#6100a6", "#6200a6", "#6400a7", "#6500a7", "#6700a7", "#6800a7", "#6a00a7", "#6c00a8", "#6d00a8", "#6f00a8", "#7000a8", "#7200a8", "#7300a8", "#7500a8", "#7601a8", "#7801a8", "#7901a8", "#7b02a8", "#7c02a7", "#7e03a7", "#7f03a7", "#8104a7", "#8204a7", "#8405a6", "#8506a6", "#8607a6", "#8807a5", "#8908a5", "#8b09a4", "#8c0aa4", "#8e0ca4", "#8f0da3", "#900ea3", "#920fa2", "#9310a1", "#9511a1", "#9612a0", "#9713a0", "#99149f", "#9a159e", "#9b179e", "#9d189d", "#9e199c", "#9f1a9b", "#a01b9b", "#a21c9a", "#a31d99", "#a41e98", "#a51f97", "#a72197", "#a82296", "#a92395", "#aa2494", "#ac2593", "#ad2692", "#ae2791", "#af2890", "#b02a8f", "#b12b8f", "#b22c8e", "#b42d8d", "#b52e8c", "#b62f8b", "#b7308a", "#b83289", "#b93388", "#ba3487", "#bb3586", "#bc3685", "#bd3784", "#be3883", "#bf3982", "#c03b81", "#c13c80", "#c23d80", "#c33e7f", "#c43f7e", "#c5407d", "#c6417c", "#c7427b", "#c8447a", "#c94579", "#ca4678", "#cb4777", "#cc4876", "#cd4975", "#ce4a75", "#cf4b74", "#d04d73", "#d14e72", "#d14f71", "#d25070", "#d3516f", "#d4526e", "#d5536d", "#d6556d", "#d7566c", "#d7576b", "#d8586a", "#d95969", "#da5a68", "#db5b67", "#dc5d66", "#dc5e66", "#dd5f65", "#de6064", "#df6163", "#df6262", "#e06461", "#e16560", "#e26660", "#e3675f", "#e3685e", "#e46a5d", "#e56b5c", "#e56c5b", "#e66d5a", "#e76e5a", "#e87059", "#e87158", "#e97257", "#ea7356", "#ea7455", "#eb7654", "#ec7754", "#ec7853", "#ed7952", "#ed7b51", "#ee7c50", "#ef7d4f", "#ef7e4e", "#f0804d", "#f0814d", "#f1824c", "#f2844b", "#f2854a", "#f38649", "#f38748", "#f48947", "#f48a47", "#f58b46", "#f58d45", "#f68e44", "#f68f43", "#f69142", "#f79241", "#f79341", "#f89540", "#f8963f", "#f8983e", "#f9993d", "#f99a3c", "#fa9c3b", "#fa9d3a", "#fa9f3a", "#faa039", "#fba238", "#fba337", "#fba436", "#fca635", "#fca735", "#fca934", "#fcaa33", "#fcac32", "#fcad31", "#fdaf31", "#fdb030", "#fdb22f", "#fdb32e", "#fdb52d", "#fdb62d", "#fdb82c", "#fdb92b", "#fdbb2b", "#fdbc2a", "#fdbe29", "#fdc029", "#fdc128", "#fdc328", "#fdc427", "#fdc626", "#fcc726", "#fcc926", "#fccb25", "#fccc25", "#fcce25", "#fbd024", "#fbd124", "#fbd324", "#fad524", "#fad624", "#fad824", "#f9d924", "#f9db24", "#f8dd24", "#f8df24", "#f7e024", "#f7e225", "#f6e425", "#f6e525", "#f5e726", "#f5e926", "#f4ea26", "#f3ec26", "#f3ee26", "#f2f026", "#f2f126", "#f1f326", "#f0f525", "#f0f623", "#eff821" ], "prism": [ "#ff0000", "#ff0000", "#ff2100", "#ff5100", "#ff8200", "#ffb000", "#ffd700", "#fff600", "#e2ff00", "#b2ff00", "#81ff00", "#53fe00", "#2ae200", "#0abc39", "#00907d", "#0060b9", "#002fe8", "#0000ff", "#1900ff", "#3d00ff", "#6900fe", "#9900d7", "#ca00a2", "#f90063", "#ff001c", "#ff0000", "#ff0e00", "#ff3d00", "#ff6f00", "#ff9e00", "#ffc800", "#ffeb00", "#f5ff00", "#c5ff00", "#94ff00", "#65ff00", "#3aee00", "#16cc1c", "#00a362", "#0074a2", "#0043d7", "#0013fd", "#0d00ff", "#2e00ff", "#5700ff", "#8500e8", "#b600b9", "#e7007d", "#ff0039", "#ff0000", "#ff0000", "#ff2a00", "#ff5b00", "#ff8b00", "#ffb800", "#ffde00", "#fffb00", "#d9ff00", "#a8ff00", "#77ff00", "#4af900", "#23db00", "#05b447", "#008789", "#0056c3", "#0026f0", "#0300ff", "#2000ff", "#4600ff", "#7200f7", "#a300ce", "#d40096", "#ff0055", "#ff000e", "#ff0000", "#ff1700", "#ff4700", "#ff7800", "#ffa700", "#ffd000", "#fff100", "#ecff00", "#bcff00", "#8bff00", "#5cff00", "#32e800", "#10c52a", "#009a6f", "#006aad", "#0039e0", "#000aff", "#1300ff", "#3500ff", "#6000ff", "#8f00e0", "#c000ae", "#f00070", "#ff002b", "#ff0000", "#ff0400", "#ff3300", "#ff6400", "#ff9400", "#ffc000", "#ffe500", "#feff00", "#cfff00", "#9eff00", "#6eff00", "#42f400", "#1dd40d", "#01ac54", "#007e96", "#004dcd", "#001cf7", "#0700ff", "#2600ff", "#4e00ff", "#7c00f0", "#ac00c4", "#dd008a", "#ff0048", "#ff0000", "#ff0000", "#ff2000", "#ff5100", "#ff8100", "#ffaf00", "#ffd700", "#fff600", "#e3ff00", "#b2ff00", "#81ff00", "#53fe00", "#2be200", "#0bbd38", "#00917c", "#0060b8", "#002fe8", "#0001ff", "#1900ff", "#3d00ff", "#6900fe", "#9900d7", "#ca00a3", "#f90063", "#ff001d", "#ff0000", "#ff0d00", "#ff3d00", "#ff6e00", "#ff9d00", "#ffc800", "#ffeb00", "#f5ff00", "#c6ff00", "#95ff00", "#65ff00", "#3aee00", "#16cd1b", "#00a362", "#0074a1", "#0043d6", "#0013fd", "#0d00ff", "#2d00ff", "#5600ff", "#8500e9", "#b600b9", "#e6007e", "#ff003a", "#ff0000", "#ff0000", "#ff2900", "#ff5a00", "#ff8b00", "#ffb800", "#ffde00", "#fffb00", "#d9ff00", "#a9ff00", "#78ff00", "#4bf900", "#24db00", "#05b546", "#008789", "#0057c3", "#0026ef", "#0200ff", "#1f00ff", "#4500ff", "#7200f8", "#a200ce", "#d30097", "#ff0056", "#ff000f", "#ff0000", "#ff1600", "#ff4700", "#ff7800", "#ffa600", "#ffcf00", "#fff000", "#ecff00", "#bcff00", "#8bff00", "#5cff00", "#32e900", "#10c52a", "#009a6f", "#006bad", "#0039df", "#000aff", "#1200ff", "#3500ff", "#5f00ff", "#8f00e1", "#c000af", "#ef0071", "#ff002c", "#ff0000", "#ff0400", "#ff3300", "#ff6400", "#ff9400", "#ffc000", "#ffe400", "#feff00", "#d0ff00", "#9fff00", "#6fff00", "#42f400", "#1dd40d", "#01ac54", "#007e95", "#004dcc", "#001df6", "#0700ff", "#2600ff", "#4d00ff", "#7b00f1", "#ac00c4", "#dd008b", "#ff0048", "#ff0001", "#ff0000", "#ff2000", "#ff5000", "#ff8100", "#ffaf00", "#ffd700", "#fff600", "#e3ff00", "#b3ff00", "#82ff00", "#54fe00" ], "rainbow": [ "#7f00ff", "#7d03fe", "#7b06fe", "#7909fe", "#770cfe", "#750ffe", "#7312fe", "#7115fe", "#6f19fe", "#6d1cfe", "#6b1ffe", "#6922fe", "#6725fe", "#6528fe", "#632bfe", "#612efd", "#5f31fd", "#5d35fd", "#5b38fd", "#593bfd", "#573efd", "#5541fc", "#5344fc", "#5147fc", "#4f4afc", "#4d4dfb", "#4b50fb", "#4953fb", "#4756fb", "#4559fa", "#435cfa", "#415ffa", "#3f61fa", "#3d64f9", "#3b67f9", "#396af9", "#376df8", "#3570f8", "#3373f8", "#3175f7", "#2f78f7", "#2d7bf6", "#2b7ef6", "#2980f6", "#2783f5", "#2586f5", "#2388f4", "#218bf4", "#1f8ef3", "#1d90f3", "#1b93f3", "#1995f2", "#1798f2", "#159af1", "#139df1", "#119ff0", "#0fa2ef", "#0da4ef", "#0ba7ee", "#09a9ee", "#07abed", "#05aeed", "#03b0ec", "#01b2ec", "#00b4eb", "#02b7ea", "#04b9ea", "#06bbe9", "#08bde8", "#0abfe8", "#0cc1e7", "#0ec3e6", "#10c5e6", "#12c7e5", "#14c9e4", "#16cbe4", "#18cde3", "#1acfe2", "#1cd1e2", "#1ed2e1", "#20d4e0", "#22d6df", "#24d7df", "#26d9de", "#28dbdd", "#2adcdc", "#2cdedc", "#2edfdb", "#30e1da", "#32e2d9", "#34e4d8", "#36e5d7", "#38e6d7", "#3ae8d6", "#3ce9d5", "#3eead4", "#40ecd3", "#42edd2", "#44eed1", "#46efd1", "#48f0d0", "#4af1cf", "#4cf2ce", "#4ef3cd", "#50f4cc", "#52f5cb", "#54f6ca", "#56f6c9", "#58f7c8", "#5af8c7", "#5cf9c6", "#5ef9c5", "#60fac4", "#62fac3", "#64fbc2", "#66fbc1", "#68fcc0", "#6afcbf", "#6cfdbe", "#6efdbd", "#70fdbc", "#72febb", "#74feba", "#76feb9", "#78feb8", "#7afeb7", "#7cfeb5", "#7efeb4", "#80feb3", "#82feb2", "#84feb1", "#86feb0", "#88feaf", "#8afeae", "#8cfeac", "#8efdab", "#90fdaa", "#92fda9", "#94fca8", "#96fca7", "#98fba5", "#9afba4", "#9cfaa3", "#9efaa2", "#a0f9a1", "#a2f99f", "#a4f89e", "#a6f79d", "#a8f69c", "#aaf69a", "#acf599", "#aef498", "#b0f397", "#b2f295", "#b4f194", "#b6f093", "#b8ef92", "#baee90", "#bced8f", "#beec8e", "#c0ea8c", "#c2e98b", "#c4e88a", "#c6e688", "#c8e587", "#cae486", "#cce284", "#cee183", "#d0df82", "#d2de80", "#d4dc7f", "#d6db7e", "#d8d97c", "#dad77b", "#dcd67a", "#ded478", "#e0d277", "#e2d175", "#e4cf74", "#e6cd73", "#e8cb71", "#eac970", "#ecc76e", "#eec56d", "#f0c36c", "#f2c16a", "#f4bf69", "#f6bd67", "#f8bb66", "#fab964", "#fcb763", "#feb461", "#ffb260", "#ffb05f", "#ffae5d", "#ffab5c", "#ffa95a", "#ffa759", "#ffa457", "#ffa256", "#ff9f54", "#ff9d53", "#ff9a51", "#ff9850", "#ff954e", "#ff934d", "#ff904b", "#ff8e4a", "#ff8b48", "#ff8847", "#ff8645", "#ff8344", "#ff8042", "#ff7e41", "#ff7b3f", "#ff783e", "#ff753c", "#ff733b", "#ff7039", "#ff6d38", "#ff6a36", "#ff6735", "#ff6433", "#ff6131", "#ff5f30", "#ff5c2e", "#ff592d", "#ff562b", "#ff532a", "#ff5028", "#ff4d27", "#ff4a25", "#ff4724", "#ff4422", "#ff4120", "#ff3e1f", "#ff3b1d", "#ff381c", "#ff351a", "#ff3119", "#ff2e17", "#ff2b15", "#ff2814", "#ff2512", "#ff2211", "#ff1f0f", "#ff1c0e", "#ff190c", "#ff150a", "#ff1209", "#ff0f07", "#ff0c06", "#ff0904", "#ff0603", "#ff0301", "#ff0000" ], "seismic": [ "#00004c", "#00004f", "#000052", "#000054", "#000057", "#00005a", "#00005d", "#000060", "#000062", "#000065", "#000068", "#00006b", "#00006e", "#000070", "#000073", "#000076", "#000079", "#00007c", "#00007e", "#000081", "#000084", "#000087", "#00008a", "#00008c", "#00008f", "#000092", "#000095", "#000098", "#00009a", "#00009d", "#0000a0", "#0000a3", "#0000a6", "#0000a8", "#0000ab", "#0000ae", "#0000b1", "#0000b4", "#0000b6", "#0000b9", "#0000bc", "#0000bf", "#0000c2", "#0000c4", "#0000c7", "#0000ca", "#0000cd", "#0000d0", "#0000d2", "#0000d5", "#0000d8", "#0000db", "#0000de", "#0000e0", "#0000e3", "#0000e6", "#0000e9", "#0000ec", "#0000ee", "#0000f1", "#0000f4", "#0000f7", "#0000fa", "#0000fc", "#0101ff", "#0505ff", "#0808ff", "#0d0dff", "#1111ff", "#1515ff", "#1919ff", "#1d1dff", "#2121ff", "#2525ff", "#2828ff", "#2d2dff", "#3131ff", "#3535ff", "#3939ff", "#3d3dff", "#4141ff", "#4545ff", "#4848ff", "#4d4dff", "#5151ff", "#5555ff", "#5959ff", "#5d5dff", "#6161ff", "#6565ff", "#6868ff", "#6d6dff", "#7171ff", "#7575ff", "#7979ff", "#7d7dff", "#8181ff", "#8585ff", "#8888ff", "#8d8dff", "#9191ff", "#9595ff", "#9999ff", "#9d9dff", "#a1a1ff", "#a5a5ff", "#a8a8ff", "#adadff", "#b1b1ff", "#b5b5ff", "#b9b9ff", "#bdbdff", "#c1c1ff", "#c5c5ff", "#c8c8ff", "#cdcdff", "#d1d1ff", "#d5d5ff", "#d9d9ff", "#ddddff", "#e1e1ff", "#e5e5ff", "#e8e8ff", "#ededff", "#f1f1ff", "#f5f5ff", "#f9f9ff", "#fdfdff", "#fffdfd", "#fff9f9", "#fff5f5", "#fff1f1", "#ffeded", "#ffe9e9", "#ffe5e5", "#ffe1e1", "#ffdddd", "#ffd9d9", "#ffd5d5", "#ffd1d1", "#ffcdcd", "#ffc9c9", "#ffc5c5", "#ffc1c1", "#ffbdbd", "#ffb9b9", "#ffb4b4", "#ffb1b1", "#ffadad", "#ffa9a9", "#ffa4a4", "#ffa1a1", "#ff9d9d", "#ff9999", "#ff9494", "#ff9191", "#ff8d8d", "#ff8989", "#ff8484", "#ff8181", "#ff7d7d", "#ff7979", "#ff7575", "#ff7171", "#ff6d6d", "#ff6969", "#ff6565", "#ff6161", "#ff5d5d", "#ff5959", "#ff5555", "#ff5151", "#ff4d4d", "#ff4949", "#ff4545", "#ff4141", "#ff3d3d", "#ff3838", "#ff3535", "#ff3030", "#ff2d2d", "#ff2828", "#ff2525", "#ff2020", "#ff1d1d", "#ff1818", "#ff1515", "#ff1010", "#ff0d0d", "#ff0808", "#ff0505", "#ff0000", "#fd0000", "#fb0000", "#f90000", "#f70000", "#f50000", "#f30000", "#f10000", "#ef0000", "#ed0000", "#eb0000", "#e90000", "#e70000", "#e50000", "#e30000", "#e10000", "#df0000", "#dd0000", "#db0000", "#d90000", "#d70000", "#d50000", "#d30000", "#d10000", "#cf0000", "#cd0000", "#cb0000", "#c90000", "#c70000", "#c50000", "#c30000", "#c10000", "#bf0000", "#bd0000", "#bb0000", "#b90000", "#b70000", "#b50000", "#b30000", "#b10000", "#af0000", "#ad0000", "#ab0000", "#a90000", "#a70000", "#a50000", "#a30000", "#a10000", "#9f0000", "#9d0000", "#9b0000", "#990000", "#970000", "#950000", "#930000", "#910000", "#8f0000", "#8d0000", "#8b0000", "#890000", "#870000", "#850000", "#830000", "#810000", "#7f0000" ], "spring": [ "#ff00ff", "#ff01fe", "#ff02fd", "#ff03fc", "#ff04fb", "#ff05fa", "#ff06f9", "#ff07f8", "#ff08f7", "#ff09f6", "#ff0af5", "#ff0bf4", "#ff0cf3", "#ff0df2", "#ff0ef1", "#ff0ff0", "#ff10ef", "#ff11ee", "#ff12ed", "#ff13ec", "#ff14eb", "#ff15ea", "#ff16e9", "#ff17e8", "#ff18e7", "#ff19e6", "#ff1ae5", "#ff1be4", "#ff1ce3", "#ff1de2", "#ff1ee1", "#ff1fe0", "#ff20df", "#ff20de", "#ff22dd", "#ff23dc", "#ff24db", "#ff24da", "#ff26d9", "#ff27d8", "#ff28d7", "#ff28d6", "#ff2ad5", "#ff2bd3", "#ff2cd3", "#ff2cd2", "#ff2ed1", "#ff2fd0", "#ff30cf", "#ff30ce", "#ff32cd", "#ff33cc", "#ff34cb", "#ff34ca", "#ff36c9", "#ff37c8", "#ff38c7", "#ff38c6", "#ff3ac5", "#ff3bc3", "#ff3cc3", "#ff3cc2", "#ff3ec1", "#ff3fc0", "#ff40bf", "#ff41be", "#ff41bd", "#ff43bc", "#ff44bb", "#ff45ba", "#ff46b9", "#ff47b8", "#ff48b7", "#ff49b6", "#ff49b5", "#ff4bb3", "#ff4cb3", "#ff4db2", "#ff4eb1", "#ff4fb0", "#ff50af", "#ff51ae", "#ff51ad", "#ff53ac", "#ff54ab", "#ff55aa", "#ff56a9", "#ff57a8", "#ff58a7", "#ff59a6", "#ff59a5", "#ff5ba3", "#ff5ca3", "#ff5da2", "#ff5ea1", "#ff5fa0", "#ff609f", "#ff619e", "#ff619d", "#ff639c", "#ff649b", "#ff659a", "#ff6699", "#ff6798", "#ff6897", "#ff6996", "#ff6995", "#ff6b93", "#ff6c93", "#ff6d92", "#ff6e91", "#ff6f90", "#ff708f", "#ff718e", "#ff718d", "#ff738c", "#ff748b", "#ff758a", "#ff7689", "#ff7788", "#ff7887", "#ff7986", "#ff7985", "#ff7b83", "#ff7c83", "#ff7d82", "#ff7e81", "#ff7f80", "#ff807f", "#ff817e", "#ff827d", "#ff837c", "#ff837b", "#ff8579", "#ff8679", "#ff8778", "#ff8877", "#ff8976", "#ff8a75", "#ff8b74", "#ff8c72", "#ff8d71", "#ff8e71", "#ff8f70", "#ff906f", "#ff916e", "#ff926d", "#ff936c", "#ff936b", "#ff9569", "#ff9669", "#ff9768", "#ff9867", "#ff9966", "#ff9a65", "#ff9b64", "#ff9c62", "#ff9d61", "#ff9e61", "#ff9f60", "#ffa05f", "#ffa15e", "#ffa25d", "#ffa35c", "#ffa35b", "#ffa559", "#ffa659", "#ffa758", "#ffa857", "#ffa956", "#ffaa55", "#ffab54", "#ffac52", "#ffad51", "#ffae51", "#ffaf50", "#ffb04f", "#ffb14e", "#ffb24d", "#ffb34c", "#ffb34b", "#ffb549", "#ffb649", "#ffb748", "#ffb847", "#ffb946", "#ffba45", "#ffbb44", "#ffbc42", "#ffbd41", "#ffbe41", "#ffbf40", "#ffc03f", "#ffc13e", "#ffc23d", "#ffc33c", "#ffc33b", "#ffc539", "#ffc638", "#ffc738", "#ffc837", "#ffc936", "#ffca35", "#ffcb34", "#ffcc32", "#ffcd31", "#ffce30", "#ffcf30", "#ffd02f", "#ffd12e", "#ffd22d", "#ffd32c", "#ffd32b", "#ffd529", "#ffd628", "#ffd728", "#ffd827", "#ffd926", "#ffda25", "#ffdb24", "#ffdc22", "#ffdd21", "#ffde20", "#ffdf20", "#ffe01f", "#ffe11e", "#ffe21d", "#ffe31c", "#ffe31b", "#ffe519", "#ffe618", "#ffe718", "#ffe817", "#ffe916", "#ffea15", "#ffeb14", "#ffec12", "#ffed11", "#ffee10", "#ffef10", "#fff00f", "#fff10e", "#fff20d", "#fff30c", "#fff30b", "#fff509", "#fff608", "#fff708", "#fff807", "#fff906", "#fffa05", "#fffb04", "#fffc02", "#fffd01", "#fffe00", "#ffff00" ], "summer": [ "#007f66", "#018066", "#028066", "#038166", "#048166", "#058266", "#068266", "#078366", "#088366", "#098466", "#0a8466", "#0b8566", "#0c8566", "#0d8666", "#0e8666", "#0f8766", "#108766", "#118866", "#128866", "#138966", "#148966", "#158a66", "#168a66", "#178b66", "#188b66", "#198c66", "#1a8c66", "#1b8d66", "#1c8d66", "#1d8e66", "#1e8e66", "#1f8f66", "#208f66", "#209066", "#229066", "#239166", "#249166", "#249266", "#269266", "#279366", "#289366", "#289366", "#2a9466", "#2b9566", "#2c9566", "#2c9666", "#2e9666", "#2f9766", "#309766", "#309866", "#329866", "#339966", "#349966", "#349a66", "#369a66", "#379b66", "#389b66", "#389c66", "#3a9c66", "#3b9d66", "#3c9d66", "#3c9e66", "#3e9e66", "#3f9f66", "#409f66", "#41a066", "#41a066", "#43a166", "#44a166", "#45a266", "#46a266", "#47a366", "#48a366", "#49a366", "#49a466", "#4ba566", "#4ca566", "#4da666", "#4ea666", "#4fa766", "#50a766", "#51a866", "#51a866", "#53a966", "#54a966", "#55aa66", "#56aa66", "#57ab66", "#58ab66", "#59ac66", "#59ac66", "#5bad66", "#5cad66", "#5dae66", "#5eae66", "#5faf66", "#60af66", "#61b066", "#61b066", "#63b166", "#64b166", "#65b266", "#66b266", "#67b366", "#68b366", "#69b366", "#69b466", "#6bb566", "#6cb566", "#6db666", "#6eb666", "#6fb766", "#70b766", "#71b866", "#71b866", "#73b966", "#74b966", "#75ba66", "#76ba66", "#77bb66", "#78bb66", "#79bc66", "#79bc66", "#7bbd66", "#7cbd66", "#7dbe66", "#7ebe66", "#7fbf66", "#80bf66", "#81c066", "#82c066", "#83c166", "#83c166", "#85c266", "#86c266", "#87c366", "#88c366", "#89c366", "#8ac466", "#8bc466", "#8cc566", "#8dc666", "#8ec666", "#8fc766", "#90c766", "#91c866", "#92c866", "#93c966", "#93c966", "#95ca66", "#96ca66", "#97cb66", "#98cb66", "#99cc66", "#9acc66", "#9bcd66", "#9ccd66", "#9dce66", "#9ece66", "#9fcf66", "#a0cf66", "#a1d066", "#a2d066", "#a3d166", "#a3d166", "#a5d266", "#a6d266", "#a7d366", "#a8d366", "#a9d366", "#aad466", "#abd466", "#acd566", "#add666", "#aed666", "#afd766", "#b0d766", "#b1d866", "#b2d866", "#b3d966", "#b3d966", "#b5da66", "#b6da66", "#b7db66", "#b8db66", "#b9dc66", "#badc66", "#bbdd66", "#bcdd66", "#bdde66", "#bede66", "#bfdf66", "#c0df66", "#c1e066", "#c2e066", "#c3e166", "#c3e166", "#c5e266", "#c6e266", "#c7e366", "#c8e366", "#c9e366", "#cae466", "#cbe466", "#cce566", "#cde666", "#cee666", "#cfe766", "#d0e766", "#d1e866", "#d2e866", "#d3e966", "#d3e966", "#d5ea66", "#d6ea66", "#d7eb66", "#d8eb66", "#d9ec66", "#daec66", "#dbed66", "#dced66", "#ddee66", "#deee66", "#dfef66", "#e0ef66", "#e1f066", "#e2f066", "#e3f166", "#e3f166", "#e5f266", "#e6f266", "#e7f366", "#e8f366", "#e9f366", "#eaf466", "#ebf466", "#ecf566", "#edf666", "#eef666", "#eff766", "#f0f766", "#f1f866", "#f2f866", "#f3f966", "#f3f966", "#f5fa66", "#f6fa66", "#f7fb66", "#f8fb66", "#f9fc66", "#fafc66", "#fbfd66", "#fcfd66", "#fdfe66", "#fefe66", "#ffff66" ], "tab10": [ "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf" ], "tab20": [ "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#1f77b4", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#aec7e8", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ff7f0e", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#ffbb78", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#2ca02c", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#98df8a", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#d62728", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#ff9896", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#9467bd", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#c5b0d5", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#8c564b", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#c49c94", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#e377c2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#f7b6d2", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#7f7f7f", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#c7c7c7", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#bcbd22", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#dbdb8d", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#17becf", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5", "#9edae5" ], "tab20b": [ "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#393b79", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#5254a3", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#6b6ecf", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#9c9ede", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#637939", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#8ca252", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#b5cf6b", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#cedb9c", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#8c6d31", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#bd9e39", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7ba52", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#e7cb94", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#843c39", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#ad494a", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#d6616b", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#e7969c", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#7b4173", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#a55194", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#ce6dbd", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6", "#de9ed6" ], "tab20c": [ "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#3182bd", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#6baed6", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#9ecae1", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#c6dbef", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#e6550d", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fd8d3c", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdae6b", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#fdd0a2", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#31a354", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#74c476", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#a1d99b", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#c7e9c0", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#756bb1", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#9e9ac8", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#bcbddc", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#dadaeb", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#636363", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#969696", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#bdbdbd", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9", "#d9d9d9" ], "terrain": [ "#333399", "#31359b", "#30389e", "#2f3ba1", "#2d3da3", "#2c40a6", "#2b43a9", "#2945ab", "#2848ae", "#274bb1", "#254db3", "#2450b6", "#2353b9", "#2155bb", "#2058be", "#1f5bc1", "#1d5dc3", "#1c60c6", "#1b62c9", "#1965cb", "#1868ce", "#176bd1", "#156dd3", "#1470d6", "#1373d9", "#1175db", "#1078de", "#0e7be1", "#0d7de3", "#0c80e6", "#0b83e9", "#0985eb", "#0888ee", "#078af1", "#058df3", "#0490f6", "#0393f9", "#0195fb", "#0098fe", "#009afa", "#009cf4", "#009eee", "#00a0e8", "#00a2e2", "#00a4dc", "#00a6d6", "#00a8d0", "#00aaca", "#00acc4", "#00aebe", "#00b0b8", "#00b2b2", "#00b4ac", "#00b6a6", "#00b8a0", "#00ba9a", "#00bc94", "#00be8e", "#00c088", "#00c282", "#00c47c", "#00c676", "#00c870", "#00ca6a", "#01cc66", "#05cd67", "#08cd67", "#0dce68", "#11cf69", "#15d06a", "#19d16b", "#1dd16b", "#21d26c", "#25d36d", "#28d46e", "#2dd56f", "#31d56f", "#35d670", "#39d771", "#3dd872", "#41d973", "#45d973", "#48da74", "#4ddb75", "#51dc76", "#55dd77", "#59dd77", "#5dde78", "#61df79", "#65e07a", "#68e17a", "#6de17b", "#71e27c", "#75e37d", "#79e47e", "#7de57f", "#81e57f", "#85e680", "#88e781", "#8de882", "#91e983", "#95e983", "#99ea84", "#9deb85", "#a1ec86", "#a5ed87", "#a8ed87", "#adee88", "#b1ef89", "#b5f08a", "#b9f18b", "#bdf18b", "#c1f28c", "#c5f38d", "#c8f48e", "#cdf58f", "#d1f58f", "#d5f690", "#d9f791", "#ddf892", "#e1f993", "#e5f993", "#e8fa94", "#edfb95", "#f1fc96", "#f5fd97", "#f9fd97", "#fdfe98", "#fefd98", "#fcfb97", "#faf896", "#f8f695", "#f6f394", "#f4f093", "#f2ee91", "#f0eb90", "#eee98f", "#ece68e", "#eae48d", "#e8e18c", "#e6df8b", "#e4dc8a", "#e2d989", "#e0d788", "#ded487", "#dcd286", "#dacf85", "#d8cd83", "#d6ca82", "#d3c781", "#d2c580", "#d0c27f", "#cec07e", "#ccbd7d", "#cabb7c", "#c8b87b", "#c6b67a", "#c3b379", "#c2b078", "#c0ae76", "#beab75", "#bca974", "#baa673", "#b8a472", "#b6a171", "#b39f70", "#b29c6f", "#b0996e", "#ae976d", "#ac946c", "#aa926b", "#a88f6a", "#a68d68", "#a38a67", "#a28766", "#a08565", "#9e8264", "#9c8063", "#9a7d62", "#987b61", "#967860", "#93765f", "#92735e", "#90705d", "#8e6e5b", "#8c6b5a", "#8a6959", "#886658", "#866457", "#836156", "#825f55", "#805c54", "#815d56", "#836058", "#85625b", "#87655e", "#886760", "#8b6a63", "#8d6d66", "#8f6f68", "#91726b", "#93746e", "#957770", "#977973", "#997c76", "#9b7f79", "#9d817b", "#9f847e", "#a18681", "#a38983", "#a58b86", "#a78e89", "#a8908b", "#ab938e", "#ad9691", "#af9893", "#b19b96", "#b39d99", "#b5a09b", "#b7a29e", "#b9a5a1", "#bba7a3", "#bdaaa6", "#bfada9", "#c1afab", "#c3b2ae", "#c4b4b1", "#c7b7b3", "#c8b9b6", "#cbbcb9", "#cdbfbb", "#cfc1be", "#d1c4c1", "#d3c6c4", "#d4c9c6", "#d7cbc9", "#d9cecc", "#dbd0ce", "#ddd3d1", "#dfd6d4", "#e1d8d6", "#e3dbd9", "#e4dddc", "#e7e0de", "#e8e2e1", "#ebe5e4", "#ede7e6", "#efeae9", "#f1edec", "#f3efee", "#f4f2f1", "#f7f4f4", "#f9f7f6", "#fbf9f9", "#fdfcfc", "#ffffff" ], "twilight": [ "#e1d8e2", "#e0d9e2", "#dfd9e1", "#ded9e0", "#ddd9e0", "#dbd8df", "#d9d8de", "#d8d7dd", "#d6d6dc", "#d4d6db", "#d2d5da", "#cfd4d9", "#cdd2d8", "#cad1d7", "#c7d0d6", "#c5cfd4", "#c2cdd3", "#bfccd2", "#bccad1", "#b9c9d0", "#b6c7cf", "#b3c6ce", "#b0c4cd", "#adc3cc", "#aac1cb", "#a7c0ca", "#a4beca", "#a1bcc9", "#9ebbc8", "#9bb9c8", "#98b7c7", "#96b5c6", "#93b4c6", "#90b2c5", "#8eb0c5", "#8baec5", "#89acc4", "#86abc4", "#84a9c3", "#82a7c3", "#80a5c3", "#7ea3c2", "#7ca1c2", "#7a9fc2", "#789dc1", "#769bc1", "#749ac1", "#7398c0", "#7196c0", "#6f94c0", "#6e92bf", "#6d90bf", "#6b8ebf", "#6a8bbe", "#6989be", "#6887be", "#6785bd", "#6683bd", "#6581bd", "#647fbc", "#647dbc", "#637bbb", "#6278bb", "#6276ba", "#6174ba", "#6172b9", "#6070b8", "#606db8", "#606bb7", "#5f69b6", "#5f67b6", "#5f64b5", "#5f62b4", "#5f60b3", "#5e5db2", "#5e5bb1", "#5e59b0", "#5e56af", "#5e54ae", "#5e51ad", "#5e4fac", "#5e4daa", "#5e4aa9", "#5d48a7", "#5d45a6", "#5d43a4", "#5d40a3", "#5d3ea1", "#5c3c9f", "#5c399d", "#5c379b", "#5b3499", "#5b3297", "#5a3095", "#5a2d92", "#592b90", "#59298d", "#58278b", "#572488", "#562285", "#552182", "#541f7f", "#531d7c", "#521b78", "#501a75", "#4f1972", "#4d176e", "#4c166b", "#4a1567", "#491564", "#471460", "#45135d", "#44125a", "#421257", "#401154", "#3e1151", "#3d114e", "#3b114b", "#3a1048", "#381046", "#371043", "#361041", "#34103f", "#33113d", "#32113b", "#32113a", "#301238", "#2f1337", "#2f1336", "#311236", "#321237", "#331137", "#351138", "#361138", "#371139", "#391139", "#3b113a", "#3d113b", "#3f113c", "#41113d", "#43123e", "#45123f", "#471240", "#4a1341", "#4c1342", "#4f1443", "#511444", "#541545", "#561546", "#591647", "#5c1648", "#5e1749", "#61184a", "#63184b", "#66194c", "#691a4c", "#6b1a4d", "#6e1b4e", "#711c4e", "#731d4e", "#761e4f", "#781f4f", "#7b204f", "#7d2150", "#802350", "#822450", "#842550", "#872750", "#892850", "#8b2a50", "#8d2c50", "#902d50", "#922f4f", "#94314f", "#96324f", "#98344f", "#9a364f", "#9b384f", "#9d3a4f", "#9f3c4f", "#a13e4f", "#a2404f", "#a4424f", "#a6444f", "#a7464f", "#a94950", "#aa4b50", "#ac4d50", "#ad4f50", "#af5151", "#b05451", "#b25652", "#b35852", "#b45a53", "#b55d53", "#b65f54", "#b86155", "#b96456", "#ba6657", "#bb6857", "#bc6b59", "#bd6d5a", "#be705b", "#bf725c", "#c0745d", "#c0775f", "#c17960", "#c27c62", "#c37e64", "#c38166", "#c48368", "#c5866a", "#c5886c", "#c68b6e", "#c78d70", "#c78f72", "#c89275", "#c89478", "#c9977a", "#c9997d", "#ca9c80", "#ca9e83", "#cba185", "#cca389", "#cca58c", "#cda88f", "#cdaa92", "#ceac95", "#cfaf99", "#cfb19c", "#d0b39f", "#d1b6a3", "#d2b8a6", "#d3baa9", "#d3bcad", "#d4beb0", "#d5c0b4", "#d6c2b7", "#d7c4bb", "#d8c6be", "#d9c8c1", "#dacac4", "#dbccc8", "#dbcecb", "#dccfcd", "#ddd1d0", "#ded2d3", "#ded3d5", "#dfd5d7", "#dfd6d9", "#e0d6db", "#e0d7dd", "#e1d8de", "#e1d8df", "#e1d8e1", "#e1d8e1" ], "twilight_shifted": [ "#2f1337", "#301238", "#32113a", "#32113b", "#33113d", "#34103f", "#361041", "#371043", "#381046", "#3a1048", "#3b114b", "#3d114e", "#3e1151", "#401154", "#421257", "#44125a", "#45135d", "#471460", "#491564", "#4a1567", "#4c166b", "#4d176e", "#4f1972", "#501a75", "#521b78", "#531d7c", "#541f7f", "#552182", "#562285", "#572488", "#58278b", "#59298d", "#592b90", "#5a2d92", "#5a3095", "#5b3297", "#5b3499", "#5c379b", "#5c399d", "#5c3c9f", "#5d3ea1", "#5d40a3", "#5d43a4", "#5d45a6", "#5d48a7", "#5e4aa9", "#5e4daa", "#5e4fac", "#5e51ad", "#5e54ae", "#5e56af", "#5e59b0", "#5e5bb1", "#5e5db2", "#5f60b3", "#5f62b4", "#5f64b5", "#5f67b6", "#5f69b6", "#606bb7", "#606db8", "#6070b8", "#6172b9", "#6174ba", "#6276ba", "#6278bb", "#637bbb", "#647dbc", "#647fbc", "#6581bd", "#6683bd", "#6785bd", "#6887be", "#6989be", "#6a8bbe", "#6b8ebf", "#6d90bf", "#6e92bf", "#6f94c0", "#7196c0", "#7398c0", "#749ac1", "#769bc1", "#789dc1", "#7a9fc2", "#7ca1c2", "#7ea3c2", "#80a5c3", "#82a7c3", "#84a9c3", "#86abc4", "#89acc4", "#8baec5", "#8eb0c5", "#90b2c5", "#93b4c6", "#96b5c6", "#98b7c7", "#9bb9c8", "#9ebbc8", "#a1bcc9", "#a4beca", "#a7c0ca", "#aac1cb", "#adc3cc", "#b0c4cd", "#b3c6ce", "#b6c7cf", "#b9c9d0", "#bccad1", "#bfccd2", "#c2cdd3", "#c5cfd4", "#c7d0d6", "#cad1d7", "#cdd2d8", "#cfd4d9", "#d2d5da", "#d4d6db", "#d6d6dc", "#d8d7dd", "#d9d8de", "#dbd8df", "#ddd9e0", "#ded9e0", "#dfd9e1", "#e0d9e2", "#e1d8e2", "#e1d8e1", "#e1d8df", "#e1d8de", "#e0d7dd", "#e0d6db", "#dfd6d9", "#dfd5d7", "#ded3d5", "#ded2d3", "#ddd1d0", "#dccfcd", "#dbcecb", "#dbccc8", "#dacac4", "#d9c8c1", "#d8c6be", "#d7c4bb", "#d6c2b7", "#d5c0b4", "#d4beb0", "#d3bcad", "#d3baa9", "#d2b8a6", "#d1b6a3", "#d0b39f", "#cfb19c", "#cfaf99", "#ceac95", "#cdaa92", "#cda88f", "#cca58c", "#cca389", "#cba185", "#ca9e83", "#ca9c80", "#c9997d", "#c9977a", "#c89478", "#c89275", "#c78f72", "#c78d70", "#c68b6e", "#c5886c", "#c5866a", "#c48368", "#c38166", "#c37e64", "#c27c62", "#c17960", "#c0775f", "#c0745d", "#bf725c", "#be705b", "#bd6d5a", "#bc6b59", "#bb6857", "#ba6657", "#b96456", "#b86155", "#b65f54", "#b55d53", "#b45a53", "#b35852", "#b25652", "#b05451", "#af5151", "#ad4f50", "#ac4d50", "#aa4b50", "#a94950", "#a7464f", "#a6444f", "#a4424f", "#a2404f", "#a13e4f", "#9f3c4f", "#9d3a4f", "#9b384f", "#9a364f", "#98344f", "#96324f", "#94314f", "#922f4f", "#902d50", "#8d2c50", "#8b2a50", "#892850", "#872750", "#842550", "#822450", "#802350", "#7d2150", "#7b204f", "#781f4f", "#761e4f", "#731d4e", "#711c4e", "#6e1b4e", "#6b1a4d", "#691a4c", "#66194c", "#63184b", "#61184a", "#5e1749", "#5c1648", "#591647", "#561546", "#541545", "#511444", "#4f1443", "#4c1342", "#4a1341", "#471240", "#45123f", "#43123e", "#41113d", "#3f113c", "#3d113b", "#3b113a", "#391139", "#371139", "#361138", "#351138", "#331137", "#321237", "#311236", "#2f1336", "#2f1436" ], "viridis": [ "#440154", "#440255", "#440357", "#450558", "#45065a", "#45085b", "#46095c", "#460b5e", "#460c5f", "#460e61", "#470f62", "#471163", "#471265", "#471466", "#471567", "#471669", "#47186a", "#48196b", "#481a6c", "#481c6e", "#481d6f", "#481e70", "#482071", "#482172", "#482273", "#482374", "#472575", "#472676", "#472777", "#472878", "#472a79", "#472b7a", "#472c7b", "#462d7c", "#462f7c", "#46307d", "#46317e", "#45327f", "#45347f", "#453580", "#453681", "#443781", "#443982", "#433a83", "#433b83", "#433c84", "#423d84", "#423e85", "#424085", "#414186", "#414286", "#404387", "#404487", "#3f4587", "#3f4788", "#3e4888", "#3e4989", "#3d4a89", "#3d4b89", "#3d4c89", "#3c4d8a", "#3c4e8a", "#3b508a", "#3b518a", "#3a528b", "#3a538b", "#39548b", "#39558b", "#38568b", "#38578c", "#37588c", "#37598c", "#365a8c", "#365b8c", "#355c8c", "#355d8c", "#345e8d", "#345f8d", "#33608d", "#33618d", "#32628d", "#32638d", "#31648d", "#31658d", "#31668d", "#30678d", "#30688d", "#2f698d", "#2f6a8d", "#2e6b8e", "#2e6c8e", "#2e6d8e", "#2d6e8e", "#2d6f8e", "#2c708e", "#2c718e", "#2c728e", "#2b738e", "#2b748e", "#2a758e", "#2a768e", "#2a778e", "#29788e", "#29798e", "#287a8e", "#287a8e", "#287b8e", "#277c8e", "#277d8e", "#277e8e", "#267f8e", "#26808e", "#26818e", "#25828e", "#25838d", "#24848d", "#24858d", "#24868d", "#23878d", "#23888d", "#23898d", "#22898d", "#228a8d", "#228b8d", "#218c8d", "#218d8c", "#218e8c", "#208f8c", "#20908c", "#20918c", "#1f928c", "#1f938b", "#1f948b", "#1f958b", "#1f968b", "#1e978a", "#1e988a", "#1e998a", "#1e998a", "#1e9a89", "#1e9b89", "#1e9c89", "#1e9d88", "#1e9e88", "#1e9f88", "#1ea087", "#1fa187", "#1fa286", "#1fa386", "#20a485", "#20a585", "#21a685", "#21a784", "#22a784", "#23a883", "#23a982", "#24aa82", "#25ab81", "#26ac81", "#27ad80", "#28ae7f", "#29af7f", "#2ab07e", "#2bb17d", "#2cb17d", "#2eb27c", "#2fb37b", "#30b47a", "#32b57a", "#33b679", "#35b778", "#36b877", "#38b976", "#39b976", "#3bba75", "#3dbb74", "#3ebc73", "#40bd72", "#42be71", "#44be70", "#45bf6f", "#47c06e", "#49c16d", "#4bc26c", "#4dc26b", "#4fc369", "#51c468", "#53c567", "#55c666", "#57c665", "#59c764", "#5bc862", "#5ec961", "#60c960", "#62ca5f", "#64cb5d", "#67cc5c", "#69cc5b", "#6bcd59", "#6dce58", "#70ce56", "#72cf55", "#74d054", "#77d052", "#79d151", "#7cd24f", "#7ed24e", "#81d34c", "#83d34b", "#86d449", "#88d547", "#8bd546", "#8dd644", "#90d643", "#92d741", "#95d73f", "#97d83e", "#9ad83c", "#9dd93a", "#9fd938", "#a2da37", "#a5da35", "#a7db33", "#aadb32", "#addc30", "#afdc2e", "#b2dd2c", "#b5dd2b", "#b7dd29", "#bade27", "#bdde26", "#bfdf24", "#c2df22", "#c5df21", "#c7e01f", "#cae01e", "#cde01d", "#cfe11c", "#d2e11b", "#d4e11a", "#d7e219", "#dae218", "#dce218", "#dfe318", "#e1e318", "#e4e318", "#e7e419", "#e9e419", "#ece41a", "#eee51b", "#f1e51c", "#f3e51e", "#f6e61f", "#f8e621", "#fae622", "#fde724" ], "winter": [ "#0000ff", "#0001fe", "#0002fe", "#0003fd", "#0004fd", "#0005fc", "#0006fc", "#0007fb", "#0008fb", "#0009fa", "#000afa", "#000bf9", "#000cf9", "#000df8", "#000ef8", "#000ff7", "#0010f7", "#0011f6", "#0012f6", "#0013f5", "#0014f5", "#0015f4", "#0016f4", "#0017f3", "#0018f3", "#0019f2", "#001af2", "#001bf1", "#001cf1", "#001df0", "#001ef0", "#001fef", "#0020ef", "#0020ee", "#0022ee", "#0023ed", "#0024ed", "#0024ec", "#0026ec", "#0027eb", "#0028eb", "#0028ea", "#002aea", "#002be9", "#002ce9", "#002ce8", "#002ee8", "#002fe7", "#0030e7", "#0030e6", "#0032e6", "#0033e5", "#0034e5", "#0034e4", "#0036e4", "#0037e3", "#0038e3", "#0038e2", "#003ae2", "#003be1", "#003ce1", "#003ce0", "#003ee0", "#003fdf", "#0040df", "#0041de", "#0041de", "#0043dd", "#0044dd", "#0045dc", "#0046dc", "#0047db", "#0048db", "#0049da", "#0049da", "#004bd9", "#004cd9", "#004dd8", "#004ed8", "#004fd7", "#0050d7", "#0051d6", "#0051d6", "#0053d5", "#0054d5", "#0055d4", "#0056d3", "#0057d3", "#0058d3", "#0059d2", "#0059d2", "#005bd1", "#005cd1", "#005dd0", "#005ed0", "#005fcf", "#0060cf", "#0061ce", "#0061ce", "#0063cd", "#0064cd", "#0065cc", "#0066cc", "#0067cb", "#0068cb", "#0069ca", "#0069ca", "#006bc9", "#006cc9", "#006dc8", "#006ec8", "#006fc7", "#0070c7", "#0071c6", "#0071c6", "#0073c5", "#0074c5", "#0075c4", "#0076c3", "#0077c3", "#0078c3", "#0079c2", "#0079c2", "#007bc1", "#007cc1", "#007dc0", "#007ec0", "#007fbf", "#0080bf", "#0081be", "#0082be", "#0083bd", "#0083bd", "#0085bc", "#0086bc", "#0087bb", "#0088bb", "#0089ba", "#008aba", "#008bb9", "#008cb9", "#008db8", "#008eb8", "#008fb7", "#0090b7", "#0091b6", "#0092b6", "#0093b5", "#0093b5", "#0095b4", "#0096b3", "#0097b3", "#0098b3", "#0099b2", "#009ab2", "#009bb1", "#009cb1", "#009db0", "#009eb0", "#009faf", "#00a0af", "#00a1ae", "#00a2ae", "#00a3ad", "#00a3ad", "#00a5ac", "#00a6ac", "#00a7ab", "#00a8ab", "#00a9aa", "#00aaaa", "#00aba9", "#00aca9", "#00ada8", "#00aea8", "#00afa7", "#00b0a7", "#00b1a6", "#00b2a6", "#00b3a5", "#00b3a5", "#00b5a4", "#00b6a3", "#00b7a3", "#00b8a3", "#00b9a2", "#00baa2", "#00bba1", "#00bca1", "#00bda0", "#00bea0", "#00bf9f", "#00c09f", "#00c19e", "#00c29e", "#00c39d", "#00c39d", "#00c59c", "#00c69c", "#00c79b", "#00c89b", "#00c99a", "#00ca9a", "#00cb99", "#00cc99", "#00cd98", "#00ce98", "#00cf97", "#00d097", "#00d196", "#00d296", "#00d395", "#00d395", "#00d594", "#00d693", "#00d793", "#00d893", "#00d992", "#00da92", "#00db91", "#00dc91", "#00dd90", "#00de90", "#00df8f", "#00e08f", "#00e18e", "#00e28e", "#00e38d", "#00e38d", "#00e58c", "#00e68c", "#00e78b", "#00e88b", "#00e98a", "#00ea8a", "#00eb89", "#00ec89", "#00ed88", "#00ee88", "#00ef87", "#00f087", "#00f186", "#00f286", "#00f385", "#00f385", "#00f584", "#00f683", "#00f783", "#00f883", "#00f982", "#00fa82", "#00fb81", "#00fc81", "#00fd80", "#00fe80", "#00ff7f" ] } vedo-2023.4.6/vedo/colors.py000066400000000000000000001035611444463326400155350ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import sys import time import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo __docformat__ = "google" __doc__ = """ Colors definitions and printing methods. ![](https://vedo.embl.es/images/basic/colorcubes.png) """ __all__ = [ "printc", "printd", "get_color", "get_color_name", "color_map", "build_palette", "build_lut", "getColor", # deprecated will disappear "colorMap", # deprecated "buildLUT", # deprecated ] try: import matplotlib.cm as _cm_mpl _has_matplotlib = True cmaps = {} except ModuleNotFoundError: from vedo.cmaps import cmaps _has_matplotlib = False # see below, this is dealt with in color_map() ######################################################### # handy global shortcuts for terminal printing # Ex.: print(colors.red + "hello" + colors.reset) ######################################################### red = "\x1b[1m\x1b[31;1m" green = "\x1b[1m\x1b[32;1m" yellow = "\x1b[1m\x1b[33;1m" blue = "\x1b[1m\x1b[34;1m" reset = "\x1b[0m" ######################################################### # basic color schemes ######################################################### colors = { # order kind of matters because of pyplot.plot() "blue9": "#a8cbfe", # bootstrap5 colors "blue8": "#81b4fe", "blue7": "#5a9cfe", "blue6": "#3485fd", "blue5": "#0d6efd", "blue4": "#0b5cd5", "blue3": "#094bac", "blue2": "#073984", "blue1": "#05285b", "indigo9": "#c8a9fa", "indigo8": "#af83f8", "indigo7": "#975cf6", "indigo6": "#7e36f4", "indigo5": "#6610f2", "indigo4": "#560dcb", "indigo3": "#450ba5", "indigo2": "#35087e", "indigo1": "#250657", "purple9": "#cbbbe9", "purple8": "#b49ddf", "purple7": "#9d7ed5", "purple6": "#8660cb", "purple5": "#6f42c1", "purple4": "#5d37a2", "purple3": "#4b2d83", "purple2": "#3a2264", "purple1": "#281845", "pink9": "#f0b6d3", "pink8": "#ea95bf", "pink7": "#e374ab", "pink6": "#dd5498", "pink5": "#d63384", "pink4": "#b42b6f", "pink3": "#92235a", "pink2": "#6f1b45", "pink1": "#4d1230", "red9": "#f2b6bc", "red8": "#ed969e", "red7": "#e77681", "red6": "#e25563", "red5": "#dc3545", "red4": "#b92d3a", "red3": "#96242f", "red2": "#721c24", "red1": "#4f1319", "orange9": "#fed1aa", "orange8": "#febc85", "orange7": "#fea75f", "orange6": "#fd933a", "orange5": "#fd7e14", "orange4": "#d56a11", "orange3": "#ac560e", "orange2": "#84420a", "orange1": "#5b2d07", "yellow9": "#ffe9a6", "yellow8": "#ffdf7e", "yellow7": "#ffd556", "yellow6": "#ffcb2f", "yellow5": "#ffc107", "yellow4": "#d6a206", "yellow3": "#ad8305", "yellow2": "#856404", "yellow1": "#5c4503", "green9": "#b2dfbc", "green8": "#8fd19e", "green7": "#6dc381", "green6": "#4ab563", "green5": "#28a745", "green4": "#228c3a", "green3": "#1b722f", "green2": "#155724", "green1": "#0e3c19", "teal9": "#afecda", "teal8": "#8be3c9", "teal7": "#67dab8", "teal6": "#44d2a8", "teal5": "#20c997", "teal4": "#1ba97f", "teal3": "#168967", "teal2": "#11694f", "teal1": "#0c4836", "cyan9": "#abdee5", "cyan8": "#86cfda", "cyan7": "#61c0cf", "cyan6": "#3cb1c3", "cyan5": "#17a2b8", "cyan4": "#13889b", "cyan3": "#106e7d", "cyan2": "#0c5460", "cyan1": "#083a42", "gray9": "#f8f9fa", "gray8": "#e9edef", "gray7": "#dee2e6", "gray6": "#ced4da", "gray5": "#adb5bd", "gray4": "#6c757d", "gray3": "#495057", "gray2": "#343a40", "gray1": "#212529", "aliceblue": "#F0F8FF", # matplotlib scheme "antiquewhite": "#FAEBD7", "aqua": "#00FFFF", "aquamarine": "#7FFFD4", "azure": "#F0FFFF", "beige": "#F5F5DC", "bisque": "#FFE4C4", "black": "#000000", "blanchedalmond": "#FFEBCD", "blue": "#0f00fb", # "0000FF", "blueviolet": "#8A2BE2", "brown": "#A52A2A", "burlywood": "#DEB887", "cadetblue": "#5F9EA0", "chartreuse": "#7FFF00", "chocolate": "#D2691E", "coral": "#FF7F50", "cornflowerblue": "#6495ED", "cornsilk": "#FFF8DC", "crimson": "#DC143C", "cyan": "#00FFFF", "darkblue": "#00008B", "darkcyan": "#008B8B", "darkgoldenrod": "#B8860B", "darkgray": "#A9A9A9", "darkgreen": "#006400", "darkkhaki": "#BDB76B", "darkmagenta": "#8B008B", "darkolivegreen": "#556B2F", "darkorange": "#FF8C00", "darkorchid": "#9932CC", "darkred": "#8B0000", "darksalmon": "#E9967A", "darkseagreen": "#8FBC8F", "darkslateblue": "#483D8B", "darkslategray": "#2F4F4F", "darkturquoise": "#00CED1", "darkviolet": "#9400D3", "deeppink": "#FF1493", "deepskyblue": "#00BFFF", "dimgray": "#696969", "dodgerblue": "#1E90FF", "firebrick": "#B22222", "floralwhite": "#FFFAF0", "forestgreen": "#228B22", "fuchsia": "#FF00FF", "gainsboro": "#DCDCDC", "ghostwhite": "#F8F8FF", "gold": "#FFD700", "goldenrod": "#DAA520", "gray": "#808080", "green": "#047f10", # "#008000", "greenyellow": "#ADFF2F", "honeydew": "#F0FFF0", "hotpink": "#FF69B4", "indianred": "#CD5C5C", "indigo": "#4B0082", "ivory": "#FFFFF0", "khaki": "#F0E68C", "lavender": "#E6E6FA", "lavenderblush": "#FFF0F5", "lawngreen": "#7CFC00", "lemonchiffon": "#FFFACD", "lightblue": "#ADD8E6", "lightcoral": "#F08080", "lightcyan": "#E0FFFF", "lightgray": "#D3D3D3", "lightgreen": "#90EE90", "lightpink": "#FFB6C1", "lightsalmon": "#FFA07A", "lightseagreen": "#20B2AA", "lightskyblue": "#87CEFA", "lightsteelblue": "#B0C4DE", "lightyellow": "#FFFFE0", "lime": "#00FF00", "limegreen": "#32CD32", "linen": "#FAF0E6", "magenta": "#FF00FF", "maroon": "#800000", "mediumaquamarine": "#66CDAA", "mediumblue": "#0000CD", "mediumorchid": "#BA55D3", "mediumpurple": "#9370DB", "mediumseagreen": "#3CB371", "mediumslateblue": "#7B68EE", "mediumspringgreen": "#00FA9A", "mediumturquoise": "#48D1CC", "mediumvioletred": "#C71585", "midnightblue": "#191970", "mintcream": "#F5FFFA", "mistyrose": "#FFE4E1", "moccasin": "#FFE4B5", "navajowhite": "#FFDEAD", "navy": "#000080", "oldlace": "#FDF5E6", "olive": "#808000", "olivedrab": "#6B8E23", "orange": "#FFA500", "orangered": "#FF4500", "orchid": "#DA70D6", "palegoldenrod": "#EEE8AA", "palegreen": "#98FB98", "paleturquoise": "#AFEEEE", "palevioletred": "#DB7093", "papayawhip": "#FFEFD5", "peachpuff": "#FFDAB9", "peru": "#CD853F", "pink": "#FFC0CB", "plum": "#DDA0DD", "powderblue": "#B0E0E6", "purple": "#800080", "rebeccapurple": "#663399", "red": "#fe1e1f", # "#FF0000", "rosybrown": "#BC8F8F", "royalblue": "#4169E1", "saddlebrown": "#8B4513", "salmon": "#FA8072", "sandybrown": "#F4A460", "seagreen": "#2E8B57", "seashell": "#FFF5EE", "sienna": "#A0522D", "silver": "#C0C0C0", "skyblue": "#87CEEB", "slateblue": "#6A5ACD", "slategray": "#708090", "snow": "#FFFAFA", "blackboard": "#393939", "springgreen": "#00FF7F", "steelblue": "#4682B4", "tan": "#D2B48C", "teal": "#008080", "thistle": "#D8BFD8", "tomato": "#FF6347", "turquoise": "#40E0D0", "violet": "#EE82EE", "wheat": "#F5DEB3", "white": "#FFFFFF", "whitesmoke": "#F5F5F5", "yellow": "#ffff36", # "#FFFF00", "yellowgreen": "#9ACD32", } color_nicks = { # color nicknames "bb": "blackboard", "lb": "lightblue", # light "lg": "lightgreen", "lr": "orangered", "lc": "lightcyan", "ls": "lightsalmon", "ly": "lightyellow", "dr": "darkred", # dark "db": "darkblue", "dg": "darkgreen", "dm": "darkmagenta", "dc": "darkcyan", "ds": "darksalmon", "dv": "darkviolet", "b1": "blue1", # bootstrap5 colors "b2": "blue2", "b3": "blue3", "b4": "blue4", "b5": "blue5", "b6": "blue6", "b7": "blue7", "b8": "blue8", "b9": "blue9", "i1": "indigo1", "i2": "indigo2", "i3": "indigo3", "i4": "indigo4", "i5": "indigo5", "i6": "indigo6", "i7": "indigo7", "i8": "indigo8", "i9": "indigo9", "p1": "purple1", "p2": "purple2", "p3": "purple3", "p4": "purple4", "p5": "purple5", "p6": "purple6", "p7": "purple7", "p8": "purple8", "p9": "purple9", "r1": "red1", "r2": "red2", "r3": "red3", "r4": "red4", "r5": "red5", "r6": "red6", "r7": "red7", "r8": "red8", "r9": "red9", "o1": "orange1", "o2": "orange2", "o3": "orange3", "o4": "orange4", "o5": "orange5", "o6": "orange6", "o7": "orange7", "o8": "orange8", "o9": "orange9", "y1": "yellow1", "y2": "yellow2", "y3": "yellow3", "y4": "yellow4", "y5": "yellow5", "y6": "yellow6", "y7": "yellow7", "y8": "yellow8", "y9": "yellow9", "g1": "green1", "g2": "green2", "g3": "green3", "g4": "green4", "g5": "green5", "g6": "green6", "g7": "green7", "g8": "green8", "g9": "green9", "k1": "gray1", "k2": "gray2", "k3": "gray3", "k4": "gray4", "k5": "gray5", "k6": "gray6", "k7": "gray7", "k8": "gray8", "k9": "gray9", "a": "aqua", "b": "blue", "c": "cyan", "d": "gold", "f": "fuchsia", "g": "green", "i": "indigo", "k": "black", "m": "magenta", "n": "navy", "l": "lavender", "o": "orange", "p": "purple", "r": "red", "s": "salmon", "t": "tomato", "v": "violet", "y": "yellow", "w": "white", } # available colormap names: cmaps_names = ( "Accent", "Accent_r", "Blues", "Blues_r", "BrBG", "BrBG_r", "BuGn", "BuGn_r", "BuPu", "BuPu_r", "CMRmap", "CMRmap_r", "Dark2", "Dark2_r", "GnBu", "GnBu_r", "Greens", "Greens_r", "Greys", "Greys_r", "OrRd", "OrRd_r", "Oranges", "Oranges_r", "PRGn", "PRGn_r", "Paired", "Paired_r", "Pastel1", "Pastel1_r", "Pastel2", "Pastel2_r", "PiYG", "PiYG_r", "PuBu", "PuBuGn", "PuBuGn_r", "PuBu_r", "PuOr", "PuOr_r", "PuRd", "PuRd_r", "Purples", "Purples_r", "RdBu", "RdBu_r", "RdGy", "RdGy_r", "RdPu", "RdPu_r", "RdYlBu", "RdYlBu_r", "RdYlGn", "RdYlGn_r", "Reds", "Reds_r", "Set1", "Set1_r", "Set2", "Set2_r", "Set3", "Set3_r", "Spectral", "Spectral_r", "Wistia", "Wistia_r", "YlGn", "YlGnBu", "YlGnBu_r", "YlGn_r", "YlOrBr", "YlOrBr_r", "YlOrRd", "YlOrRd_r", "afmhot", "afmhot_r", "autumn", "autumn_r", "binary", "binary_r", "bone", "bone_r", "brg", "brg_r", "bwr", "bwr_r", "cividis", "cividis_r", "cool", "cool_r", "coolwarm", "coolwarm_r", "copper", "copper_r", "cubehelix", "cubehelix_r", "flag", "flag_r", "gist_earth", "gist_earth_r", "gist_gray", "gist_gray_r", "gist_heat", "gist_heat_r", "gist_ncar", "gist_ncar_r", "gist_rainbow", "gist_rainbow_r", "gist_stern", "gist_stern_r", "gist_yarg", "gist_yarg_r", "gnuplot", "gnuplot2", "gnuplot2_r", "gnuplot_r", "gray_r", "hot", "hot_r", "hsv", "hsv_r", "inferno", "inferno_r", "jet", "jet_r", "magma", "magma_r", "nipy_spectral", "nipy_spectral_r", "ocean", "ocean_r", "pink_r", "plasma", "plasma_r", "prism", "prism_r", "rainbow", "rainbow_r", "seismic", "seismic_r", "spring", "spring_r", "summer", "summer_r", "tab10", "tab10_r", "tab20", "tab20_r", "tab20b", "tab20b_r", "tab20c", "tab20c_r", "terrain", "terrain_r", "twilight", "twilight_r", "twilight_shifted", "twilight_shifted_r", "viridis", "viridis_r", "winter", "winter_r", ) # default color palettes when using an index palettes = ( ( (1.0, 0.832, 0.000), # gold (0.960, 0.509, 0.188), (0.901, 0.098, 0.194), (0.235, 0.85, 0.294), (0.46, 0.48, 0.000), (0.274, 0.941, 0.941), (0.0, 0.509, 0.784), (0.1, 0.1, 0.900), (0.902, 0.7, 1.000), (0.941, 0.196, 0.901), ), ( (1.0, 0.832, 0), # gold (0.59, 0.0, 0.09), # dark red (0.5, 0.5, 0), # yellow-green (0.0, 0.66, 0.42), # green blue (0.5, 1.0, 0.0), # green (0.0, 0.18, 0.65), # blue (0.4, 0.0, 0.4), # plum (0.4, 0.0, 0.6), (0.2, 0.4, 0.6), (0.1, 0.3, 0.2), ), ( (0.010, 0.0706, 0.098), # -> black (0.0196, 0.369, 0.447), (0.0745, 0.573, 0.584), (0.584, 0.820, 0.741), (0.914, 0.847, 0.663), (0.929, 0.616, 0.149), (0.788, 0.412, 0.110), (0.729, 0.259, 0.0902), (0.678, 0.153, 0.110), (0.604, 0.153, 0.165), # -> red3 ), ( (0.345, 0.188, 0.071), # -> orange1 (0.498, 0.314, 0.161), (0.573, 0.404, 0.239), (0.651, 0.545, 0.400), (0.714, 0.678, 0.569), (0.761, 0.773, 0.671), (0.643, 0.675, 0.533), (0.396, 0.427, 0.298), (0.255, 0.282, 0.204), (0.200, 0.239, 0.165), # -> blackboard ), ( (0.937, 0.969, 0.820), # -> beige (0.729, 0.851, 0.714), (0.671, 0.639, 0.396), (0.447, 0.180, 0.180), (0.259, 0.055, 0.082), # -> red1 (0.937, 0.969, 0.820), # -> beige (0.729, 0.851, 0.714), (0.671, 0.639, 0.396), (0.447, 0.180, 0.180), (0.259, 0.055, 0.082), # -> red1 ), ( (0.933, 0.298, 0.443), # -> red6 (0.996, 0.824, 0.431), (0.082, 0.835, 0.631), (0.094, 0.537, 0.690), (0.035, 0.231, 0.294), # -> cyan1 (0.933, 0.298, 0.443), # -> red6 (0.996, 0.824, 0.431), (0.082, 0.835, 0.631), (0.094, 0.537, 0.690), (0.035, 0.231, 0.294), # -> cyan1 ), ) emoji = { ":bomb:": "\U0001F4A5", ":sparks:": "\U00002728", ":thumbup:": "\U0001F44D", ":target:": "\U0001F3AF", ":save:": "\U0001F4BE", ":noentry:": "\U000026D4", ":video:": "\U0001F4FD", ":lightning:": "\U000026A1", ":camera:": "\U0001F4F8", ":times:": "\U0000274C", ":world:": "\U0001F30D", ":rainbow:": "\U0001F308", ":idea:": "\U0001F4A1", ":pin:": "\U0001F4CC", ":construction:": "\U0001F6A7", ":rocket:": "\U0001F680", ":hourglass:": "\U000023F3", ":prohibited:": "\U0001F6AB", ":checked:": "\U00002705", ":smile:": "\U0001F642", ":sad:": "\U0001F612", ":star:": "\U00002B50", ":zzz:": "\U0001F4A4", ":mu:": "\U000003BC", ":pi:": "\U000003C0", ":sigma:": "\U000003C3", ":rightarrow:": "\U000027A1", } # terminal or notebook can do color print def _has_colors(stream): try: import IPython return True except: pass if not hasattr(stream, "isatty"): return False if not stream.isatty(): return False return True _terminal_has_colors = _has_colors(sys.stdout) def _is_sequence(arg): # Check if input is iterable. if hasattr(arg, "strip"): return False if hasattr(arg, "__getslice__"): return True if hasattr(arg, "__iter__"): return True return False def getColor(rgb=None, hsv=None): """Deprecated. Use `get_color()`""" return get_color(rgb, hsv) def get_color(rgb=None, hsv=None): """ Convert a color or list of colors to (r,g,b) format from many different input formats. Set `hsv` to input as (hue, saturation, value). Example: - `RGB = (255, 255, 255)` corresponds to white - `rgb = (1,1,1)` is again white - `hex = #FFFF00` is yellow - `string = 'white'` - `string = 'w'` is white nickname - `string = 'dr'` is darkred - `string = 'red4'` is a shade of red - `int = 7` picks color nr. 7 in a predefined color list - `int = -7` picks color nr. 7 in a different predefined list Examples: - [colorcubes.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/colorcubes.py) ![](https://vedo.embl.es/images/basic/colorcubes.png) """ # recursion, return a list if input is list of colors: if _is_sequence(rgb) and (len(rgb) > 3 or _is_sequence(rgb[0])): seqcol = [] for sc in rgb: seqcol.append(get_color(sc)) return seqcol # because they are most common: if isinstance(rgb, str): if rgb == "r": return (0.9960784313725, 0.11764705882352, 0.121568627450980) elif rgb == "g": return (0.0156862745098, 0.49803921568627, 0.062745098039215) elif rgb == "b": return (0.0588235294117, 0.0, 0.984313725490196) if str(rgb).isdigit(): rgb = int(rgb) if hsv: c = hsv2rgb(hsv) else: c = rgb if _is_sequence(c): if c[0] <= 1 and c[1] <= 1 and c[2] <= 1: return c # already rgb if len(c) == 3: return list(np.array(c) / 255.0) # RGB return (c[0] / 255.0, c[1] / 255.0, c[2] / 255.0, c[3]) # RGBA elif isinstance(c, str): # is string c = c.replace("grey", "gray").replace(" ", "") if 0 < len(c) < 3: # single/double letter color if c.lower() in color_nicks: c = color_nicks[c.lower()] else: vedo.logger.warning( f"Unknown color nickname {c}\nAvailable abbreviations: {color_nicks}" ) return (0.5, 0.5, 0.5) if c.lower() in colors: # matplotlib name color c = colors[c.lower()] # from now format is hex! if c.startswith("#"): # hex to rgb h = c.lstrip("#") rgb255 = list(int(h[i : i + 2], 16) for i in (0, 2, 4)) rgbh = np.array(rgb255) / 255.0 if np.sum(rgbh) > 3: vedo.logger.error(f"in get_color(): Wrong hex color {c}") return (0.5, 0.5, 0.5) return tuple(rgbh) else: # vtk name color namedColors = vtk.vtkNamedColors() rgba = [0, 0, 0, 0] namedColors.GetColor(c, rgba) return (rgba[0] / 255.0, rgba[1] / 255.0, rgba[2] / 255.0) elif isinstance(c, (int, float)): # color number return palettes[vedo.settings.palette % len(palettes)][abs(int(c)) % 10] return (0.5, 0.5, 0.5) def get_color_name(c): """Find the name of the closest color.""" c = np.array(get_color(c)) # reformat to rgb mdist = 99.0 kclosest = "" for key in colors: ci = np.array(get_color(key)) d = np.linalg.norm(c - ci) if d < mdist: mdist = d kclosest = str(key) return kclosest def hsv2rgb(hsv): """Convert HSV to RGB color.""" ma = vtk.vtkMath() rgb = [0, 0, 0] ma.HSVToRGB(hsv, rgb) return rgb def rgb2hsv(rgb): """Convert RGB to HSV color.""" ma = vtk.vtkMath() hsv = [0, 0, 0] ma.RGBToHSV(get_color(rgb), hsv) return hsv def rgb2hex(rgb): """Convert RGB to Hex color.""" h = "#%02x%02x%02x" % (int(rgb[0] * 255), int(rgb[1] * 255), int(rgb[2] * 255)) return h def hex2rgb(hx): """Convert Hex to rgb color.""" h = hx.lstrip("#") rgb255 = [int(h[i : i + 2], 16) for i in (0, 2, 4)] return (rgb255[0] / 255.0, rgb255[1] / 255.0, rgb255[2] / 255.0) def colorMap(value, name="jet", vmin=None, vmax=None): """Deprecated, use `color_map()`""" print("Deprecated call to colorMap(), use color_map() instead") return color_map(value, name, vmin, vmax) def color_map(value, name="jet", vmin=None, vmax=None): """ Map a real value in range [vmin, vmax] to a (r,g,b) color scale. Return the (r,g,b) color, or a list of (r,g,b) colors. Arguments: value : *(float, list)* scalar value to transform into a color name : *(str, matplotlib.colors.LinearSegmentedColormap)* color map name Very frequently used color maps are: ![](https://user-images.githubusercontent.com/32848391/50738804-577e1680-11d8-11e9-929e-fca17a8ac6f3.jpg) A more complete color maps list: ![](https://matplotlib.org/1.2.1/_images/show_colormaps.png) .. note:: Can also directly use and customize a matplotlib color map Example: ```python from vedo import color_map import matplotlib.cm as cm print( color_map(0.2, cm.flag, 0, 1) ) # (1.0, 0.809016994374948, 0.6173258487801733) ``` Examples: - [plot_bars.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_bars.py) """ cut = _is_sequence(value) # to speed up later if cut: values = np.asarray(value) if vmin is None: vmin = np.min(values) if vmax is None: vmax = np.max(values) values = np.clip(values, vmin, vmax) values = (values - vmin) / (vmax - vmin) else: if vmin is None: vedo.logger.warning("in color_map() you must specify vmin! Assume 0.") vmin = 0 if vmax is None: vedo.logger.warning("in color_map() you must specify vmax! Assume 1.") vmax = 1 values = [(value - vmin) / (vmax - vmin)] if _has_matplotlib: # matplotlib is available, use it! ########################### if isinstance(name, str): mp = _cm_mpl.get_cmap(name=name) else: mp = name # assume matplotlib.colors.LinearSegmentedColormap result = mp(values)[:, [0, 1, 2]] else: # matplotlib not available ################################### invert = False if name.endswith("_r"): invert = True name = name.replace("_r", "") try: cmap = cmaps[name] except KeyError: vedo.logger.error(f"in color_map(), no color map with name {name} or {name}_r") vedo.logger.error(f"Available color maps are:\n{cmaps.keys()}") return np.array([0.5, 0.5, 0.5]) result = [] n = len(cmap) - 1 for v in values: iv = int(v * n) if invert: iv = n - iv rgb = hex2rgb(cmap[iv]) result.append(rgb) result = np.array(result) if cut: return result return result[0] def build_palette(color1, color2, n, hsv=True): """ Generate N colors starting from `color1` to `color2` by linear interpolation in HSV or RGB spaces. Arguments: N : (int) number of output colors. color1 : (color) first color. color2 : (color) second color. hsv : (bool) if `False`, interpolation is calculated in RGB space. Examples: - [mesh_custom.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_custom.py) ![](https://vedo.embl.es/images/basic/mesh_custom.png) """ if hsv: color1 = rgb2hsv(color1) color2 = rgb2hsv(color2) c1 = np.array(get_color(color1)) c2 = np.array(get_color(color2)) cols = [] for f in np.linspace(0, 1, n, endpoint=True): c = c1 * (1 - f) + c2 * f if hsv: c = np.array(hsv2rgb(c)) cols.append(c) return np.array(cols) def buildLUT( colorlist, vmin=None, vmax=None, belowColor=None, aboveColor=None, nanColor=None, belowAlpha=1, aboveAlpha=1, nanAlpha=1, interpolate=False, ): """Deprecated. Please use `build_lut()`""" print("Deprecated call to buildLUT(). Please use build_lut() instead") return build_lut( colorlist, vmin, vmax, belowColor, aboveColor, nanColor, belowAlpha, aboveAlpha, nanAlpha, interpolate, ) def build_lut( colorlist, vmin=None, vmax=None, below_color=None, above_color=None, nan_color=None, below_alpha=1, above_alpha=1, nan_alpha=1, interpolate=False, ): """ Generate colors in a lookup table (LUT). Return the `vtkLookupTable` object. This can be fed into `cmap()` method. Arguments: colorlist : (list) a list in the form `[(scalar1, [r,g,b]), (scalar2, 'blue'), ...]`. vmin : (float) specify minimum value of scalar range vmax : (float) specify maximum value of scalar range below_color : (color) color for scalars below the minimum in range below_alpha : (float) opacity for scalars below the minimum in range above_color : (color) color for scalars above the maximum in range above_alpha : (float) alpha for scalars above the maximum in range nan_color : (color) color for invalid (nan) scalars nan_alpha : (float) alpha for invalid (nan) scalars interpolate : (bool) interpolate or not intermediate scalars Examples: - [mesh_lut.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_lut.py) ![](https://vedo.embl.es/images/basic/mesh_lut.png) """ ctf = vtk.vtkColorTransferFunction() ctf.SetColorSpaceToRGB() ctf.SetScaleToLinear() alpha_x, alpha_vals = [], [] for sc in colorlist: if len(sc) >= 3: scalar, col, alf = sc[:3] else: alf = 1 scalar, col = sc r, g, b = get_color(col) ctf.AddRGBPoint(scalar, r, g, b) alpha_x.append(scalar) alpha_vals.append(alf) lut = vtk.vtkLookupTable() lut.SetNumberOfTableValues(256) x0, x1 = ctf.GetRange() # range of the introduced values if vmin is not None: x0 = vmin if vmax is not None: x1 = vmax ctf.SetRange(x0, x1) lut.SetRange(x0, x1) if below_color is not None: lut.SetBelowRangeColor(list(get_color(below_color)) + [below_alpha]) lut.SetUseBelowRangeColor(True) if above_color is not None: lut.SetAboveRangeColor(list(get_color(above_color)) + [above_alpha]) lut.SetUseAboveRangeColor(True) if nan_color is not None: lut.SetNanColor(list(get_color(nan_color)) + [nan_alpha]) rgba = (1, 1, 1, 1) for i in range(256): p = i / 255 x = (1 - p) * x0 + p * x1 if interpolate: alf = np.interp(x, alpha_x, alpha_vals) rgba = list(ctf.GetColor(x)) + [alf] else: for c in colorlist: if x <= c[0]: if len(c) == 3: alf = c[2] else: alf = 1 rgba = list(get_color(c[1])) + [alf] break lut.SetTableValue(i, rgba) lut.Build() return lut ######################################################################### def printc( *strings, c=None, bc=None, bold=True, italic=False, blink=False, underline=False, strike=False, dim=False, invert=False, box="", end="\n", flush=True, ): """ Print to terminal in color (any color!). Arguments: c : (color) foreground color name or (r,g,b) bc : (color) background color name or (r,g,b) bold : (bool) boldface [True] italic : (bool) italic [False] blink : (bool) blinking text [False] underline : (bool) underline text [False] strike : (bool) strike through text [False] dim : (bool) make text look dimmer [False] invert : (bool) invert background and forward colors [False] box : (bool) print a box with specified text character [''] flush : (bool) flush buffer after printing [True] end : (str) the end character to be printed [newline] Example: ```python from vedo.colors import printc printc('anything', c='tomato', bold=False, end=' ') printc('anything', 455.5, c='lightblue') printc(299792.48, c=4) ``` Examples: - [printc.py](https://github.com/marcomusy/vedo/tree/master/examples/other/printc.py) ![](https://user-images.githubusercontent.com/32848391/50739010-2bfc2b80-11da-11e9-94de-011e50a86e61.jpg) """ if not vedo.settings.enable_print_color or not _terminal_has_colors: print(*strings, end=end, flush=flush) return try: # ------------------------------------------------------------- txt = str() ns = len(strings) - 1 separator = " " offset = 0 for i, s in enumerate(strings): if i == ns: separator = "" if ":" in repr(s): for k in emoji: if k in str(s): s = s.replace(k, emoji[k]) offset += 1 for k, rp in vedo.shapes._reps: # check symbols in shapes._reps if k in str(s): s = s.replace(k, rp) offset += 1 txt += str(s) + separator special, cseq = "", "" oneletter_colors = { "k": "\u001b[30m", # because these are supported by most terminals "r": "\u001b[31m", "g": "\u001b[32m", "y": "\u001b[33m", "b": "\u001b[34m", "m": "\u001b[35m", "c": "\u001b[36m", "w": "\u001b[37m", } if c is not None: if c is True: c = "g" elif c is False: c = "r" if isinstance(c, str) and c in oneletter_colors: cseq += oneletter_colors[c] else: r, g, b = get_color(c) # not all terms support this syntax cseq += f"\x1b[38;2;{int(r*255)};{int(g*255)};{int(b*255)}m" if bc: if bc in oneletter_colors: cseq += oneletter_colors[bc] else: r, g, b = get_color(bc) cseq += f"\x1b[48;2;{int(r*255)};{int(g*255)};{int(b*255)}m" if box is True: box = "-" if underline and not box: special += "\x1b[4m" if strike and not box: special += "\x1b[9m" if dim: special += "\x1b[2m" if invert: special += "\x1b[7m" if bold: special += "\x1b[1m" if italic: special += "\x1b[3m" if blink: special += "\x1b[5m" if box and "\n" not in txt: box = box[0] boxv = box if box in ["_", "=", "-", "+", "~"]: boxv = "|" if box in ("_", "."): outtxt = special + cseq + " " + box * (len(txt) + offset + 2) + " \n" outtxt += boxv + " " * (len(txt) + 2) + boxv + "\n" else: outtxt = special + cseq + box * (len(txt) + offset + 4) + "\n" outtxt += boxv + " " + txt + " " + boxv + "\n" if box == "_": outtxt += "|" + box * (len(txt) + offset + 2) + "|" + reset + end else: outtxt += box * (len(txt) + offset + 4) + reset + end sys.stdout.write(outtxt) else: out = special + cseq + txt + reset sys.stdout.write(out + end) except: # ------------------------------------------------------------- fallback try: print(*strings, end=end) except UnicodeEncodeError as e: print(e, end=end) pass if flush: sys.stdout.flush() def printd(*strings, q=False): """ Print debug information about the environment where the printd() is called. Local variables are printed out with their current values. Use `q` to quit (exit) python session after the printd call. """ from inspect import currentframe, getframeinfo cf = currentframe().f_back cfi = getframeinfo(cf) fname = os.path.basename(getframeinfo(cf).filename) print("\x1b[7m\x1b[3m\x1b[37m" + fname + " line:\x1b[1m" + str(cfi.lineno) + reset, end="") print("\x1b[3m\x1b[37m\x1b[2m", "\U00002501" * 30, time.ctime(), reset) if strings: print(" \x1b[37m\x1b[1mMessage : ", *strings) print(" \x1b[37m\x1b[1mFunction:\x1b[0m\x1b[37m " + str(cfi.function)) print(" \x1b[1mLocals :" + reset) for loc in cf.f_locals.keys(): obj = cf.f_locals[loc] var = repr(obj) if 'module ' in var: continue if 'function ' in var: continue if 'class ' in var: continue if loc.startswith('_'): continue if hasattr(obj, 'name'): if not obj.name: oname = str(type(obj)) else: oname = obj.name var = oname + ", at " + vedo.utils.precision(obj.GetPosition(), 3) var = var.replace("vtkmodules.", "") print(" \x1b[37m", loc, "\t\t=", var[:60].replace("\n", ""), reset) if vedo.utils.is_sequence(obj) and len(obj) > 4: print(' \x1b[37m\x1b[2m\x1b[3m len:', len(obj), ' min:', vedo.utils.precision(min(obj), 4), ' max:', vedo.utils.precision(max(obj), 4), reset) if q: print(f" \x1b[1m\x1b[37mExiting python now (q={bool(q)}).\x1b[0m\x1b[37m") sys.exit(0) sys.stdout.flush() vedo-2023.4.6/vedo/dolfin.py000066400000000000000000000757711444463326400155220ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo from vedo.colors import printc from vedo import utils from vedo import shapes from vedo.mesh import Mesh from vedo.plotter import show __docformat__ = "google" __doc__ = """ Submodule for support of the [FEniCS/Dolfin](https://fenicsproject.org) library. Example: ```python import dolfin from vedo import dataurl, download from vedo.dolfin import plot fname = download(dataurl+"dolfin_fine.xml") mesh = dolfin.Mesh(fname) plot(mesh) ``` ![](https://user-images.githubusercontent.com/32848391/53026243-d2d31900-3462-11e9-9dde-518218c241b6.jpg) .. note:: Find many more examples in directory [vedo/examples/dolfin](https://github.com/marcomusy/vedo/blob/master/examples/other/dolfin). """ __all__ = ["plot"] ########################################################################## def _inputsort(obj): import dolfin u = None mesh = None if not utils.is_sequence(obj): obj = [obj] for ob in obj: inputtype = str(type(ob)) # printc('inputtype is', inputtype, c=2) if "vedo" in inputtype: # skip vtk objects, will be added later continue if "dolfin" in inputtype or "ufl" in inputtype: if "MeshFunction" in inputtype: mesh = ob.mesh() if ob.dim() > 0: printc("MeshFunction of dim>0 not supported.", c="r") printc('Try e.g.: MeshFunction("size_t", mesh, 0)', c="r", italic=1) printc('instead of MeshFunction("size_t", mesh, 1)', c="r", strike=1) else: # printc(ob.dim(), mesh.num_cells(), len(mesh.coordinates()), len(ob.array())) V = dolfin.FunctionSpace(mesh, "CG", 1) u = dolfin.Function(V) v2d = dolfin.vertex_to_dof_map(V) u.vector()[v2d] = ob.array() elif "Function" in inputtype or "Expression" in inputtype: u = ob elif "ufl.mathfunctions" in inputtype: # not working u = ob elif "Mesh" in inputtype: mesh = ob elif "algebra" in inputtype: mesh = ob.ufl_domain() # print('algebra', ob.ufl_domain()) if u and not mesh and hasattr(u, "function_space"): V = u.function_space() if V: mesh = V.mesh() if u and not mesh and hasattr(u, "mesh"): mesh = u.mesh() # printc('------------------------------------') # printc('mesh.topology dim=', mesh.topology().dim()) # printc('mesh.geometry dim=', mesh.geometry().dim()) # if u: printc('u.value_rank()', u.value_rank()) # if u and u.value_rank(): printc('u.value_dimension()', u.value_dimension(0)) # axis=0 ##if u: printc('u.value_shape()', u.value_shape()) return (mesh, u) def _compute_uvalues(u, mesh): # the whole purpose of this function is # to have a scalar (or vector) for each point of the mesh if not u: return np.array([]) # print('u',u) if hasattr(u, "compute_vertex_values"): # old dolfin, works fine u_values = u.compute_vertex_values(mesh) if u.value_rank() and u.value_dimension(0) > 1: l = u_values.shape[0] u_values = u_values.reshape(u.value_dimension(0), int(l / u.value_dimension(0))).T elif hasattr(u, "compute_point_values"): # dolfinx u_values = u.compute_point_values() try: from dolfin import fem fvec = u.vector except RuntimeError: fspace = u.function_space try: fspace = fspace.collapse() except RuntimeError: return [] fvec = fem.interpolate(u, fspace).vector tdim = mesh.topology.dim # print('fvec.getSize', fvec.getSize(), mesh.num_entities(tdim)) if fvec.getSize() == mesh.num_entities(tdim): # DG0 cellwise function C = fvec.get_local() if C.dtype.type is np.complex128: print("Plotting real part of complex data") C = np.real(C) u_values = C else: u_values = [] if hasattr(mesh, "coordinates"): coords = mesh.coordinates() else: coords = mesh.geometry.points if u_values.shape[0] != coords.shape[0]: vedo.logger.warning("mismatch in vedo.dolfin._compute_uvalues") u_values = np.array([u(p) for p in coords]) return u_values def plot(*inputobj, **options): """ Plot the object(s) provided. Input can be any combination of: `Mesh`, `Volume`, `dolfin.Mesh`, `dolfin.MeshFunction`, `dolfin.Expression` or `dolfin.Function`. Return the current `Plotter` class instance. Arguments: mode : (str) one or more of the following can be combined in any order - `mesh`/`color`, will plot the mesh, by default colored with a scalar if available - `displacement` show displaced mesh by solution - `arrows`, mesh displacements are plotted as scaled arrows. - `lines`, mesh displacements are plotted as scaled lines. - `tensors`, to be implemented add : (bool) add the input objects without clearing the already plotted ones density : (float) show only a subset of lines or arrows [0-1] wire[frame] : (bool) visualize mesh as wireframe [False] c[olor] : (color) set mesh color [None] exterior : (bool) only show the outer surface of the mesh [False] alpha : (float) set object's transparency [1] lw : (int) line width of the mesh (set to zero to hide mesh) [0.1] ps : int set point size of mesh vertices [None] z : (float) add a constant to z-coordinate (useful to show 2D slices as function of time) legend : (str) add a legend to the top-right of window [None] scalarbar : (bool) add a scalarbar to the window ['vertical'] vmin : (float) set the minimum for the range of the scalar [None] vmax : (float) set the maximum for the range of the scalar [None] scale : (float) add a scaling factor to arrows and lines sizes [1] cmap : (str) choose a color map for scalars shading : (str) mesh shading ['flat', 'phong'] text : (str) add a gray text comment to the top-left of the window [None] isolines : (dict) dictionary of isolines properties - n, (int) - add this number of isolines to the mesh - c, - isoline color - lw, (float) - isoline width - z, (float) - add to the isoline z coordinate to make them more visible streamlines : (dict) dictionary of streamlines properties - probes, (list, None) - custom list of points to use as seeds - tol, (float) - tolerance to reduce the number of seed points used in mesh - lw, (float) - line width of the streamline - direction, (str) - direction of integration ('forward', 'backward' or 'both') - max_propagation, (float) - max propagation of the streamline - scalar_range, (list) - scalar range of coloring warpZfactor : (float) elevate z-axis by scalar value (useful for 2D geometries) warpYfactor : (float) elevate z-axis by scalar value (useful for 1D geometries) scaleMeshFactors : (list) rescale mesh by these factors [1,1,1] new : (bool) spawn a new instance of Plotter class, pops up a new window at : (int) renderer number to plot to shape : (list) subdvide window in (n,m) rows and columns N : (int) automatically subdvide window in N renderers pos : (list) (x,y) coordinates of the window position on screen size : (list) window size (x,y) title : (str) window title bg : (color) background color name of window bg2 : (color) second background color name to create a color gradient style : (int) choose a predefined style [0-4] - 0, `vedo`, style (blackboard background, rainbow color map) - 1, `matplotlib`, style (white background, viridis color map) - 2, `paraview`, style - 3, `meshlab`, style - 4, `bw`, black and white style. axes : (int) Axes type number. Axes type-1 can be fully customized by passing a dictionary `axes=dict()`. - 0, no axes, - 1, draw customizable grid axes (see below). - 2, show cartesian axes from (0,0,0) - 3, show positive range of cartesian axes from (0,0,0) - 4, show a triad at bottom left - 5, show a cube at bottom left - 6, mark the corners of the bounding box - 7, draw a simple ruler at the bottom of the window - 8, show the `vtkCubeAxesActor` object, - 9, show the bounding box outLine, - 10, show three circles representing the maximum bounding box, - 11, show a large grid on the x-y plane (use with zoom=8) - 12, show polar axes. infinity : (bool) if True fugue point is set at infinity (no perspective effects) sharecam : (bool) if False each renderer will have an independent vtkCamera interactive : (bool) if True will stop after show() to allow interaction w/ window offscreen : (bool) if True will not show the rendering window zoom : (float) camera zooming factor viewup : (list), str camera view-up direction ['x','y','z', or a vector direction] azimuth : (float) add azimuth rotation of the scene, in degrees elevation : (float) add elevation rotation of the scene, in degrees roll : (float) add roll-type rotation of the scene, in degrees camera : (dict) Camera parameters can further be specified with a dictionary assigned to the `camera` keyword: (E.g. `show(camera={'pos':(1,2,3), 'thickness':1000,})`) - `pos`, `(list)`, the position of the camera in world coordinates - `focal_point`, `(list)`, the focal point of the camera in world coordinates - `viewup`, `(list)`, the view up direction for the camera - `distance`, `(float)`, set the focal point to the specified distance from the camera position. - `clipping_range`, `(float)`, distance of the near and far clipping planes along the direction of projection. - `parallel_scale`, `(float)`, scaling used for a parallel projection, i.e. the height of the viewport in world-coordinate distances. The default is 1. Note that the "scale" parameter works as an "inverse scale", larger numbers produce smaller images. This method has no effect in perspective projection mode. - `thickness`, `(float)`, set the distance between clipping planes. This method adjusts the far clipping plane to be set a distance 'thickness' beyond the near clipping plane. - `view_angle`, `(float)`, the camera view angle, which is the angular height of the camera view measured in degrees. The default angle is 30 degrees. This method has no effect in parallel projection mode. The formula for setting the angle up for perfect perspective viewing is: angle = 2*atan((h/2)/d) where h is the height of the RenderWindow (measured by holding a ruler up to your screen) and d is the distance from your eyes to the screen. """ if len(inputobj) == 0: vedo.plotter_instance.interactive() return None if "numpy" in str(type(inputobj[0])): from vedo.pyplot import plot as pyplot_plot return pyplot_plot(*inputobj, **options) mesh, u = _inputsort(inputobj) mode = options.pop("mode", "mesh") ttime = options.pop("z", None) add = options.pop("add", False) wire = options.pop("wireframe", None) c = options.pop("c", None) color = options.pop("color", None) if color is not None: c = color lc = options.pop("lc", None) alpha = options.pop("alpha", 1) lw = options.pop("lw", 0.5) ps = options.pop("ps", None) legend = options.pop("legend", None) scbar = options.pop("scalarbar", "v") vmin = options.pop("vmin", None) vmax = options.pop("vmax", None) cmap = options.pop("cmap", None) scale = options.pop("scale", 1) scaleMeshFactors = options.pop("scaleMeshFactors", [1, 1, 1]) shading = options.pop("shading", "phong") text = options.pop("text", None) style = options.pop("style", "vtk") isolns = options.pop("isolines", {}) streamlines = options.pop("streamlines", {}) warpZfactor = options.pop("warpZfactor", None) warpYfactor = options.pop("warpYfactor", None) lighting = options.pop("lighting", None) exterior = options.pop("exterior", False) returnActorsNoShow = options.pop("returnActorsNoShow", False) at = options.pop("at", 0) # refresh axes titles for axes type = 8 (vtkCubeAxesActor) xtitle = options.pop("xtitle", "x") ytitle = options.pop("ytitle", "y") ztitle = options.pop("ztitle", "z") if vedo.plotter_instance: if xtitle != "x": aet = vedo.plotter_instance.axes_instances if len(aet) > at and isinstance(aet[at], vtk.vtkCubeAxesActor): aet[at].SetXTitle(xtitle) if ytitle != "y": aet = vedo.plotter_instance.axes_instances if len(aet) > at and isinstance(aet[at], vtk.vtkCubeAxesActor): aet[at].SetYTitle(ytitle) if ztitle != "z": aet = vedo.plotter_instance.axes_instances if len(aet) > at and isinstance(aet[at], vtk.vtkCubeAxesActor): aet[at].SetZTitle(ztitle) # change some default to emulate standard behaviours if style in (0, "vtk"): axes = options.pop("axes", None) if axes is None: options["axes"] = {"xygrid": False, "yzgrid": False, "zxgrid": False} else: options["axes"] = axes # put back if cmap is None: cmap = "rainbow" elif style in (1, "matplotlib"): bg = options.pop("bg", None) if bg is None: options["bg"] = "white" else: options["bg"] = bg axes = options.pop("axes", None) if axes is None: options["axes"] = {"xygrid": False, "yzgrid": False, "zxgrid": False} else: options["axes"] = axes # put back if cmap is None: cmap = "viridis" elif style in (2, "paraview"): bg = options.pop("bg", None) if bg is None: options["bg"] = (82, 87, 110) else: options["bg"] = bg if cmap is None: cmap = "coolwarm" elif style in (3, "meshlab"): bg = options.pop("bg", None) if bg is None: options["bg"] = (8, 8, 16) options["bg2"] = (117, 117, 234) else: options["bg"] = bg axes = options.pop("axes", None) if axes is None: options["axes"] = 10 else: options["axes"] = axes # put back if cmap is None: cmap = "afmhot" elif style in (4, "bw"): bg = options.pop("bg", None) if bg is None: options["bg"] = (217, 255, 238) else: options["bg"] = bg axes = options.pop("axes", None) if axes is None: options["axes"] = {"xygrid": False, "yzgrid": False, "zxgrid": False} else: options["axes"] = axes # put back if cmap is None: cmap = "binary" ################################################################# actors = [] if vedo.plotter_instance: if add: actors = vedo.plotter_instance.actors if mesh and ("mesh" in mode or "color" in mode or "displace" in mode): actor = MeshActor(u, mesh, exterior=exterior) actor.wireframe(wire) actor.scale(scaleMeshFactors) if lighting: actor.lighting(lighting) if ttime: actor.z(ttime) if legend: actor.legend(legend) if c: actor.color(c) if lc: actor.linecolor(lc) if alpha: alpha = min(alpha, 1) actor.alpha(alpha * alpha) if lw: actor.linewidth(lw) if wire and alpha: lw1 = min(lw, 1) actor.alpha(alpha * lw1) if ps: actor.point_size(ps) if shading: if shading == "phong": actor.phong() elif shading == "flat": actor.flat() elif shading[0] == "g": actor.gouraud() if "displace" in mode: actor.move(u) if cmap and (actor.u_values is not None) and len(actor.u_values)>0 and c is None: if actor.u_values.ndim > 1: actor.cmap(cmap, utils.mag(actor.u_values), vmin=vmin, vmax=vmax) else: actor.cmap(cmap, actor.u_values, vmin=vmin, vmax=vmax) if warpYfactor: scals = actor.pointdata[0] if len(scals) > 0: pts_act = actor.points() pts_act[:, 1] = scals * warpYfactor * scaleMeshFactors[1] if warpZfactor: scals = actor.pointdata[0] if len(scals) > 0: pts_act = actor.points() pts_act[:, 2] = scals * warpZfactor * scaleMeshFactors[2] if warpYfactor or warpZfactor: actor.points(pts_act) if vmin is not None and vmax is not None: actor.mapper().SetScalarRange(vmin, vmax) if scbar and c is None: if "3d" in scbar: actor.add_scalarbar3d() elif "h" in scbar: actor.add_scalarbar(horizontal=True) else: actor.add_scalarbar(horizontal=False) if len(isolns) > 0: ison = isolns.pop("n", 10) isocol = isolns.pop("c", "black") isoalpha = isolns.pop("alpha", 1) isolw = isolns.pop("lw", 1) isos = actor.isolines(n=ison).color(isocol).lw(isolw).alpha(isoalpha) isoz = isolns.pop("z", None) if isoz is not None: # kind of hack to make isolines visible on flat meshes d = isoz else: d = actor.diagonal_size() / 400 isos.z(actor.z() + d) actors.append(isos) actors.append(actor) ################################################################# if "streamline" in mode: mode = mode.replace("streamline", "") str_act = MeshStreamLines(u, **streamlines) actors.append(str_act) ################################################################# if "arrow" in mode or "line" in mode: if "arrow" in mode: arrs = MeshArrows(u, scale=scale) else: arrs = MeshLines(u, scale=scale) if arrs: if legend and "mesh" not in mode: arrs.legend(legend) if c: arrs.color(c) arrs.color(c) if alpha: arrs.alpha(alpha) actors.append(arrs) ################################################################# if "tensor" in mode: pass # todo ################################################################# for ob in inputobj: inputtype = str(type(ob)) if "vedo" in inputtype: actors.append(ob) if text: # textact = Text2D(text, font=font) actors.append(text) if "at" in options and "interactive" not in options: if vedo.plotter_instance: N = vedo.plotter_instance.shape[0] * vedo.plotter_instance.shape[1] if options["at"] == N - 1: options["interactive"] = True # if vedo.plotter_instance: # for a2 in vedo.collectable_actors: # if isinstance(a2, vtk.vtkCornerAnnotation): # if 0 in a2.rendered_at: # remove old message # vedo.plotter_instance.remove(a2) # break if len(actors) == 0: print('Warning: no objects to show, check mode in plot(mode="...")') if returnActorsNoShow: return actors return show(actors, **options) ################################################################################### class MeshActor(Mesh): """MeshActor for dolfin support.""" def __init__(self, *inputobj, **options): """MeshActor, a `vedo.Mesh` derived object for dolfin support.""" c = options.pop("c", None) alpha = options.pop("alpha", 1) exterior = options.pop("exterior", False) compute_normals = options.pop("compute_normals", False) mesh, u = _inputsort(inputobj) if not mesh: return if exterior: import dolfin meshc = dolfin.BoundaryMesh(mesh, "exterior") else: meshc = mesh if hasattr(mesh, "coordinates"): coords = mesh.coordinates() else: coords = mesh.geometry.points cells = meshc.cells() if cells.shape[1] == 4: # something wrong in this as it cannot reproduce the tet cell.. # from vedo.tetmesh import _buildtetugrid # cells[:,[2, 0]] = cells[:,[0, 2]] # cells[:,[1, 0]] = cells[:,[0, 1]] # cells[:,[0, 1, 2, 3]] = cells[:,[0, 2, 1, 3]] # cells[:,[0, 1, 2, 3]] = cells[:,[0, 2, 1, 3]] # cells[:,[0, 1, 2, 3]] = cells[:, [0, 1, 3, 2]] # cells[:,[0, 1, 2, 3]] = cells[:,[1, 0, 2, 3]] # cells[:,[0, 1, 2, 3]] = cells[:,[2, 0, 1, 3]] # cells[:,[0, 1, 2, 3]] = cells[:,[2, 0, 1, 3]] # print(cells[0]) # print(coords[cells[0]]) # poly = utils.geometry(_buildtetugrid(coords, cells)) # poly = utils.geometry(vedo.TetMesh([coords, cells]).inputdata()) poly = vtk.vtkPolyData() source_points = vtk.vtkPoints() source_points.SetData(utils.numpy2vtk(coords, dtype=np.float32)) poly.SetPoints(source_points) source_polygons = vtk.vtkCellArray() for f in cells: # do not use vtkTetra() because it fails # with dolfin faces orientation ele0 = vtk.vtkTriangle() ele1 = vtk.vtkTriangle() ele2 = vtk.vtkTriangle() ele3 = vtk.vtkTriangle() f0, f1, f2, f3 = f pid0 = ele0.GetPointIds() pid1 = ele1.GetPointIds() pid2 = ele2.GetPointIds() pid3 = ele3.GetPointIds() pid0.SetId(0, f0) pid0.SetId(1, f1) pid0.SetId(2, f2) pid1.SetId(0, f0) pid1.SetId(1, f1) pid1.SetId(2, f3) pid2.SetId(0, f1) pid2.SetId(1, f2) pid2.SetId(2, f3) pid3.SetId(0, f2) pid3.SetId(1, f3) pid3.SetId(2, f0) source_polygons.InsertNextCell(ele0) source_polygons.InsertNextCell(ele1) source_polygons.InsertNextCell(ele2) source_polygons.InsertNextCell(ele3) poly.SetPolys(source_polygons) else: poly = utils.buildPolyData(coords, cells) Mesh.__init__(self, poly, c=c, alpha=alpha) if compute_normals: self.compute_normals() self.mesh = mesh # holds a dolfin Mesh obj self.u = u # holds a dolfin function_data # holds the actual values of u on the mesh self.u_values = _compute_uvalues(u, mesh) def move(self, u=None, deltas=None): """Move mesh according to solution `u` or from calculated vertex displacements `deltas`.""" if u is None: u = self.u if deltas is None: if self.u_values is not None: deltas = self.u_values else: deltas = _compute_uvalues(u, self.mesh) self.u_values = deltas if hasattr(self.mesh, "coordinates"): coords = self.mesh.coordinates() else: coords = self.mesh.geometry.points if coords.shape != deltas.shape: vedo.logger.error( f"Try to move mesh with wrong solution type shape {coords.shape} vs {deltas.shape}" ) vedo.logger.error("Mesh is not moved. Try mode='color' in plot().") return movedpts = coords + deltas if movedpts.shape[1] == 2: # 2d movedpts = np.c_[movedpts, np.zeros(movedpts.shape[0])] self.polydata(False).GetPoints().SetData(utils.numpy2vtk(movedpts, dtype=np.float32)) self.polydata(False).GetPoints().Modified() def MeshPoints(*inputobj, **options): """Build a point object of type `Mesh` for a list of points.""" r = options.pop("r", 5) c = options.pop("c", "gray") alpha = options.pop("alpha", 1) mesh, u = _inputsort(inputobj) if not mesh: return None if hasattr(mesh, "coordinates"): plist = mesh.coordinates() else: plist = mesh.geometry.points u_values = _compute_uvalues(u, mesh) if len(plist[0]) == 2: # coords are 2d.. not good.. plist = np.insert(plist, 2, 0, axis=1) # make it 3d if len(plist[0]) == 1: # coords are 1d.. not good.. plist = np.insert(plist, 1, 0, axis=1) # make it 3d plist = np.insert(plist, 2, 0, axis=1) actor = shapes.Points(plist, r=r, c=c, alpha=alpha) actor.mesh = mesh if u: actor.u = u if len(u_values.shape) == 2: if u_values.shape[1] in [2, 3]: # u_values is 2D or 3D actor.u_values = u_values dispsizes = utils.mag(u_values) else: # u_values is 1D dispsizes = u_values actor.pointdata["u_values"] = dispsizes actor.pointdata.select("u_values") return actor def MeshLines(*inputobj, **options): """ Build the line segments between two lists of points `start_points` and `end_points`. `start_points` can be also passed in the form `[[point1, point2], ...]`. A dolfin `Mesh` that was deformed/modified by a function can be passed together as inputs. Use `scale` to apply a rescaling factor to the length """ scale = options.pop("scale", 1) lw = options.pop("lw", 1) c = options.pop("c", "grey") alpha = options.pop("alpha", 1) mesh, u = _inputsort(inputobj) if not mesh: return None if hasattr(mesh, "coordinates"): start_points = mesh.coordinates() else: start_points = mesh.geometry.points u_values = _compute_uvalues(u, mesh) if not utils.is_sequence(u_values[0]): vedo.logger.error("cannot show Lines for 1D scalar values") raise RuntimeError() end_points = start_points + u_values if u_values.shape[1] == 2: # u_values is 2D u_values = np.insert(u_values, 2, 0, axis=1) # make it 3d start_points = np.insert(start_points, 2, 0, axis=1) # make it 3d end_points = np.insert(end_points, 2, 0, axis=1) # make it 3d actor = shapes.Lines(start_points, end_points, scale=scale, lw=lw, c=c, alpha=alpha) actor.mesh = mesh actor.u = u actor.u_values = u_values return actor def MeshArrows(*inputobj, **options): """Build arrows representing displacements.""" s = options.pop("s", None) c = options.pop("c", "gray") scale = options.pop("scale", 1) alpha = options.pop("alpha", 1) res = options.pop("res", 12) mesh, u = _inputsort(inputobj) if not mesh: return None if hasattr(mesh, "coordinates"): start_points = mesh.coordinates() else: start_points = mesh.geometry.points u_values = _compute_uvalues(u, mesh) if not utils.is_sequence(u_values[0]): vedo.logger.error("cannot show Arrows for 1D scalar values") raise RuntimeError() end_points = start_points + u_values * scale if u_values.shape[1] == 2: # u_values is 2D u_values = np.insert(u_values, 2, 0, axis=1) # make it 3d start_points = np.insert(start_points, 2, 0, axis=1) # make it 3d end_points = np.insert(end_points, 2, 0, axis=1) # make it 3d actor = shapes.Arrows(start_points, end_points, s=s, alpha=alpha, res=res) actor.color(c) actor.mesh = mesh actor.u = u actor.u_values = u_values return actor def MeshStreamLines(*inputobj, **options): """Build a streamplot.""" from vedo.shapes import StreamLines print("Building streamlines...") tol = options.pop("tol", 0.02) lw = options.pop("lw", 2) direction = options.pop("direction", "forward") max_propagation = options.pop("max_propagation", None) scalar_range = options.pop("scalar_range", None) probes = options.pop("probes", None) tubes = options.pop("tubes", {}) # todo maxRadiusFactor = options.pop("maxRadiusFactor", 1) varyRadius = options.pop("varyRadius", 1) mesh, u = _inputsort(inputobj) if not mesh: return None u_values = _compute_uvalues(u, mesh) if not utils.is_sequence(u_values[0]): vedo.logger.error("cannot show Arrows for 1D scalar values") raise RuntimeError() if u_values.shape[1] == 2: # u_values is 2D u_values = np.insert(u_values, 2, 0, axis=1) # make it 3d meshact = MeshActor(u) meshact.pointdata["u_values"] = u_values meshact.pointdata.select("u_values") if utils.is_sequence(probes): pass # it's already it elif tol: print("decimating mesh points to use them as seeds...") probes = meshact.clone().subsample(tol).points() else: probes = meshact.points() if len(probes) > 500: printc("Probing domain with n =", len(probes), "points") printc(" ..this may take time (or choose a larger tol value)") if lw: tubes = {} else: tubes["varyRadius"] = varyRadius tubes["maxRadiusFactor"] = maxRadiusFactor str_lns = StreamLines( meshact, probes, direction=direction, max_propagation=max_propagation, tubes=tubes, scalar_range=scalar_range, active_vectors="u_values", ) if lw: str_lns.lw(lw) return str_lns vedo-2023.4.6/vedo/file_io.py000066400000000000000000002133051444463326400156400ustar00rootroot00000000000000import glob import os import time from tempfile import NamedTemporaryFile, TemporaryDirectory import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo from vedo import settings from vedo import colors from vedo import utils from vedo.assembly import Assembly from vedo.picture import Picture from vedo.pointcloud import Points from vedo.mesh import Mesh from vedo.volume import Volume __docformat__ = "google" __doc__ = """ Submodule to read/write meshes and other objects in different formats, and other I/O functionalities. """ __all__ = [ "load", "download", "gunzip", "loadStructuredPoints", "loadStructuredGrid", "loadRectilinearGrid", "loadUnStructuredGrid", "load_transform", "write_transform", "write", "export_window", "import_window", "screenshot", "ask", "Video", ] # example web page for X3D _x3d_html = """ vedo with x3d

Example html generated by vedo

This example loads a 3D scene from file ~fileoutput generated by vedo (see export_x3d.py).

Nothing shows up above this line?

Enable your browser to load local files:
Firefox: type about:config in the URL bar and change privacy.file_unique_origin from True to False
Chrome: from terminal type: google-chrome --enable-webgl --allow-file-access-from-files (see here)

Controls:

Examine Mode (activate with key 'e'):

Button Function
Left Button / Left Button + Shift Rotate
Mid Button / Left Button + Ctl Pan
Right Button / Wheel / Left Button + Alt Zoom
Left double click Set center of rotation

Walk Mode (activate with key 'w'):

Button Function
Left Button Move forward
Right Button Move backward

Fly Mode (activate with key 'f'):

Button Function
Left Button Move forward
Right Button Move backward

Non-interactive camera movement

Key Function
r reset view
a show all
u upright
""" def load(inputobj, unpack=True, force=False): """ Load any vedo objects from file or from the web. The output will depend on the file extension. See examples below. Unzip is made on the fly, if file ends with `.gz`. Can load an object directly from a URL address. Arguments: unpack : bool unpack MultiBlockData into a flat list of objects. force : bool when downloading a file ignore any previous cached downloads and force a new one. Example: ```python from vedo import dataurl, load, show # Return a list of 2 meshes g = load([dataurl+'250.vtk', dataurl+'270.vtk']) show(g) # Return a list of meshes by reading all files in a directory # (if directory contains DICOM files then a Volume is returned) g = load('mydicomdir/') show(g) ``` """ acts = [] if utils.is_sequence(inputobj): flist = inputobj elif isinstance(inputobj, str) and inputobj.startswith("https://"): flist = [inputobj] else: # flist = sorted(glob.glob(inputobj)) flist = utils.humansort(glob.glob(inputobj)) for fod in flist: if fod.startswith("https://"): fod = download(fod, force=force, verbose=False) if os.path.isfile(fod): ### it's a file if fod.endswith(".gz"): fod = gunzip(fod) a = _load_file(fod, unpack) acts.append(a) elif os.path.isdir(fod): ### it's a directory or DICOM flist = os.listdir(fod) if ".dcm" in flist[0]: ### it's DICOM reader = vtk.vtkDICOMImageReader() reader.SetDirectoryName(fod) reader.Update() image = reader.GetOutput() actor = Volume(image) actor.info["PixelSpacing"] = reader.GetPixelSpacing() actor.info["Width"] = reader.GetWidth() actor.info["Height"] = reader.GetHeight() actor.info["PositionPatient"] = reader.GetImagePositionPatient() actor.info["OrientationPatient"] = reader.GetImageOrientationPatient() actor.info["BitsAllocated"] = reader.GetBitsAllocated() actor.info["PixelRepresentation"] = reader.GetPixelRepresentation() actor.info["NumberOfComponents"] = reader.GetNumberOfComponents() actor.info["TransferSyntaxUID"] = reader.GetTransferSyntaxUID() actor.info["RescaleSlope"] = reader.GetRescaleSlope() actor.info["RescaleOffset"] = reader.GetRescaleOffset() actor.info["PatientName"] = reader.GetPatientName() actor.info["StudyUID"] = reader.GetStudyUID() actor.info["StudyID"] = reader.GetStudyID() actor.info["GantryAngle"] = reader.GetGantryAngle() acts.append(actor) else: ### it's a normal directory utils.humansort(flist) for ifile in flist: a = _load_file(fod + "/" + ifile, unpack) acts.append(a) else: vedo.logger.error(f"in load(), cannot find {fod}") if len(acts) == 1: if "numpy" in str(type(acts[0])): return acts[0] if not acts[0]: vedo.logger.error(f"in load(), cannot load {inputobj}") return acts[0] if len(acts) == 0: vedo.logger.error(f"in load(), cannot load {inputobj}") return None else: return acts def _load_file(filename, unpack): fl = filename.lower() ################################################################# other formats: if fl.endswith(".xml") or fl.endswith(".xml.gz") or fl.endswith(".xdmf"): # Fenics tetrahedral file actor = loadDolfin(filename) elif fl.endswith(".neutral") or fl.endswith(".neu"): # neutral tetrahedral file actor = loadNeutral(filename) elif fl.endswith(".gmsh"): # gmesh file actor = loadGmesh(filename) elif fl.endswith(".pcd"): # PCL point-cloud format actor = loadPCD(filename) actor.GetProperty().SetPointSize(2) elif fl.endswith(".off"): actor = loadOFF(filename) elif fl.endswith(".3ds"): # 3ds format actor = load3DS(filename) elif fl.endswith(".wrl"): importer = vtk.vtkVRMLImporter() importer.SetFileName(filename) importer.Read() importer.Update() actors = importer.GetRenderer().GetActors() # vtkActorCollection actors.InitTraversal() wacts = [] for i in range(actors.GetNumberOfItems()): act = actors.GetNextActor() wacts.append(act) actor = Assembly(wacts) ################################################################# volumetric: elif ( fl.endswith(".tif") or fl.endswith(".tiff") or fl.endswith(".slc") or fl.endswith(".vti") or fl.endswith(".mhd") or fl.endswith(".nrrd") or fl.endswith(".nii") or fl.endswith(".dem") ): img = loadImageData(filename) actor = Volume(img) ################################################################# 2D images: elif ( fl.endswith(".png") or fl.endswith(".jpg") or fl.endswith(".bmp") or fl.endswith(".jpeg") or fl.endswith(".gif") ): if ".png" in fl: picr = vtk.vtkPNGReader() elif ".jpg" in fl or ".jpeg" in fl: picr = vtk.vtkJPEGReader() elif ".bmp" in fl: picr = vtk.vtkBMPReader() elif ".gif" in fl: from PIL import Image, ImageSequence img = Image.open(filename) frames = [] for frame in ImageSequence.Iterator(img): a = np.array(frame.convert("RGB").getdata(), dtype=np.uint8) a = a.reshape([frame.size[1], frame.size[0], 3]) frames.append(Picture(a)) return frames picr.SetFileName(filename) picr.Update() actor = Picture(picr.GetOutput()) # object derived from vtk.vtkImageActor() ################################################################# multiblock: elif fl.endswith(".vtm") or fl.endswith(".vtmb"): read = vtk.vtkXMLMultiBlockDataReader() read.SetFileName(filename) read.Update() mb = read.GetOutput() if unpack: acts = [] for i in range(mb.GetNumberOfBlocks()): b = mb.GetBlock(i) if isinstance( b, ( vtk.vtkPolyData, vtk.vtkUnstructuredGrid, vtk.vtkStructuredGrid, vtk.vtkRectilinearGrid, ), ): acts.append(Mesh(b)) elif isinstance(b, vtk.vtkImageData): acts.append(Volume(b)) elif isinstance(b, vtk.vtkUnstructuredGrid): acts.append(vedo.UGrid(b)) return acts return mb ################################################################# numpy: elif fl.endswith(".npy") or fl.endswith(".npz"): acts = loadnumpy(filename) if unpack is False: return Assembly(acts) return acts elif fl.endswith(".geojson"): return loadGeoJSON(filename) elif fl.endswith(".pvd"): return loadPVD(filename) ################################################################# polygonal mesh: else: if fl.endswith(".vtk"): # read all legacy vtk types # output can be: # PolyData, StructuredGrid, StructuredPoints, UnstructuredGrid, RectilinearGrid reader = vtk.vtkDataSetReader() reader.ReadAllScalarsOn() reader.ReadAllVectorsOn() reader.ReadAllTensorsOn() reader.ReadAllFieldsOn() reader.ReadAllNormalsOn() reader.ReadAllColorScalarsOn() elif fl.endswith(".ply"): reader = vtk.vtkPLYReader() elif fl.endswith(".obj"): reader = vtk.vtkOBJReader() elif fl.endswith(".stl"): reader = vtk.vtkSTLReader() elif fl.endswith(".byu") or fl.endswith(".g"): reader = vtk.vtkBYUReader() elif fl.endswith(".foam"): # OpenFoam reader = vtk.vtkOpenFOAMReader() elif fl.endswith(".pvd"): reader = vtk.vtkXMLGenericDataObjectReader() elif fl.endswith(".vtp"): reader = vtk.vtkXMLPolyDataReader() elif fl.endswith(".vts"): reader = vtk.vtkXMLStructuredGridReader() elif fl.endswith(".vtu"): reader = vtk.vtkXMLUnstructuredGridReader() elif fl.endswith(".vtr"): reader = vtk.vtkXMLRectilinearGridReader() elif fl.endswith(".pvtk"): reader = vtk.vtkPDataSetReader() elif fl.endswith(".pvtr"): reader = vtk.vtkXMLPRectilinearGridReader() elif fl.endswith("pvtu"): reader = vtk.vtkXMLPUnstructuredGridReader() elif fl.endswith(".txt") or fl.endswith(".xyz"): reader = vtk.vtkParticleReader() # (format is x, y, z, scalar) elif fl.endswith(".facet"): reader = vtk.vtkFacetReader() else: return None reader.SetFileName(filename) reader.Update() routput = reader.GetOutput() if not routput: vedo.logger.error(f"unable to load {filename}") return None if isinstance(routput, vtk.vtkUnstructuredGrid): actor = vedo.TetMesh(routput) else: actor = Mesh(routput) if fl.endswith(".txt") or fl.endswith(".xyz"): actor.GetProperty().SetPointSize(4) actor.filename = filename actor.file_size, actor.created = file_info(filename) return actor def download(url, force=False, verbose=True): """Retrieve a file from a URL, save it locally and return its path. Use `force` to force reload and discard cached copies.""" if not url.startswith("https://"): vedo.logger.error(f"Invalid URL (must start with https):\n{url}") return url url = url.replace("www.dropbox", "dl.dropbox") if "github.com" in url: url = url.replace("/blob/", "/raw/") basename = os.path.basename(url) if "?" in basename: basename = basename.split("?")[0] tmp_file = NamedTemporaryFile(delete=False) tmp_file.name = os.path.join(os.path.dirname(tmp_file.name), os.path.basename(basename)) if not force and os.path.exists(tmp_file.name): if verbose: colors.printc("reusing cached file:", tmp_file.name) # colors.printc(" (use force=True to force a new download)") return tmp_file.name try: from urllib.request import urlopen, Request req = Request(url, headers={"User-Agent": "Mozilla/5.0"}) if verbose: colors.printc("reading", basename, "from", url.split("/")[2][:40], "...", end="") except ImportError: import urllib2 import contextlib urlopen = lambda url_: contextlib.closing(urllib2.urlopen(url_)) req = url if verbose: colors.printc("reading", basename, "from", url.split("/")[2][:40], "...", end="") with urlopen(req) as response, open(tmp_file.name, "wb") as output: output.write(response.read()) if verbose: colors.printc(" done.") return tmp_file.name def gunzip(filename): """Unzip a `.gz` file to a temporary file and returns its path.""" if not filename.endswith(".gz"): # colors.printc("gunzip() error: file must end with .gz", c='r') return filename import gzip tmp_file = NamedTemporaryFile(delete=False) tmp_file.name = os.path.join( os.path.dirname(tmp_file.name), os.path.basename(filename).replace(".gz", "") ) inF = gzip.open(filename, "rb") with open(tmp_file.name, "wb") as outF: outF.write(inF.read()) inF.close() return tmp_file.name def file_info(file_path): """Return the file size and creation time of input file""" sz, created = "", "" if os.path.isfile(file_path): file_info = os.stat(file_path) num = file_info.st_size for x in ["B", "KB", "MB", "GB", "TB"]: if num < 1024.0: break num /= 1024.0 sz = "%3.1f%s" % (num, x) created = time.ctime(os.path.getmtime(file_path)) return sz, created ################################################################### def loadStructuredPoints(filename): """Load and return a `vtkStructuredPoints` object from file.""" reader = vtk.vtkStructuredPointsReader() reader.SetFileName(filename) reader.Update() return reader.GetOutput() def loadStructuredGrid(filename): """Load and return a `vtkStructuredGrid` object from file.""" if filename.endswith(".vts"): reader = vtk.vtkXMLStructuredGridReader() else: reader = vtk.vtkStructuredGridReader() reader.SetFileName(filename) reader.Update() return reader.GetOutput() def loadUnStructuredGrid(filename): """Load and return a `vtkunStructuredGrid` object from file.""" if filename.endswith(".vtu"): reader = vtk.vtkXMLUnstructuredGridReader() else: reader = vtk.vtkUnstructuredGridReader() reader.SetFileName(filename) reader.Update() return reader.GetOutput() def loadRectilinearGrid(filename): """Load and return a `vtkRectilinearGrid` object from file.""" if filename.endswith(".vtr"): reader = vtk.vtkXMLRectilinearGridReader() else: reader = vtk.vtkRectilinearGridReader() reader.SetFileName(filename) reader.Update() return reader.GetOutput() def loadXMLData(filename): """Read any type of vtk data object encoded in XML format.""" reader = vtk.vtkXMLGenericDataObjectReader() reader.SetFileName(filename) reader.Update() return reader.GetOutput() ################################################################### def load3DS(filename): """Load `3DS` file format from file. Returns: `Assembly(vtkAssembly)` object. """ renderer = vtk.vtkRenderer() renWin = vtk.vtkRenderWindow() renWin.AddRenderer(renderer) importer = vtk.vtk3DSImporter() importer.SetFileName(filename) importer.ComputeNormalsOn() importer.SetRenderWindow(renWin) importer.Update() actors = renderer.GetActors() # vtkActorCollection acts = [] for i in range(actors.GetNumberOfItems()): a = actors.GetItemAsObject(i) acts.append(a) del renWin return Assembly(acts) def loadOFF(filename): """Read the OFF file format (polygonal mesh).""" with open(filename, "r", encoding="UTF-8") as f: lines = f.readlines() vertices = [] faces = [] NumberOfVertices = None i = -1 for text in lines: if len(text) == 0: continue if text == "\n": continue if "#" in text: continue if "OFF" in text: continue ts = text.split() n = len(ts) if not NumberOfVertices and n > 1: NumberOfVertices, NumberOfFaces = int(ts[0]), int(ts[1]) continue i += 1 if i < NumberOfVertices and n == 3: x, y, z = float(ts[0]), float(ts[1]), float(ts[2]) vertices.append([x, y, z]) ids = [] if NumberOfVertices <= i < (NumberOfVertices + NumberOfFaces + 1) and n > 2: ids += [int(xx) for xx in ts[1:]] faces.append(ids) return Mesh(utils.buildPolyData(vertices, faces)) def loadGeoJSON(filename): """Load GeoJSON files.""" jr = vtk.vtkGeoJSONReader() jr.SetFileName(filename) jr.Update() return Mesh(jr.GetOutput()) def loadDolfin(filename, exterior=False): """Reads a `Fenics/Dolfin` file format (.xml or .xdmf). Return an `Mesh` object.""" import dolfin if filename.lower().endswith(".xdmf"): f = dolfin.XDMFFile(filename) m = dolfin.Mesh() f.read(m) else: m = dolfin.Mesh(filename) bm = dolfin.BoundaryMesh(m, "exterior") if exterior: poly = utils.buildPolyData(bm.coordinates(), bm.cells(), tetras=True) else: polyb = utils.buildPolyData(bm.coordinates(), bm.cells(), tetras=True) polym = utils.buildPolyData(m.coordinates(), m.cells(), tetras=True) app = vtk.vtkAppendPolyData() app.AddInputData(polym) app.AddInputData(polyb) app.Update() poly = app.GetOutput() return Mesh(poly).lw(0.1) def loadPVD(filename): """Reads a paraview set of files.""" import xml.etree.ElementTree as et tree = et.parse(filename) dname = os.path.dirname(filename) if not dname: dname = "." listofobjs = [] for coll in tree.getroot(): for dataset in coll: fname = dataset.get("file") ob = load(dname + "/" + fname) tm = dataset.get("timestep") if tm: ob.time = tm listofobjs.append(ob) if len(listofobjs) == 1: return listofobjs[0] if len(listofobjs) == 0: return None return listofobjs def loadNeutral(filename): """Reads a `Neutral` tetrahedral file format. Return an `Mesh` object.""" with open(filename, "r", encoding="UTF-8") as f: lines = f.readlines() ncoords = int(lines[0]) coords = [] for i in range(1, ncoords + 1): x, y, z = lines[i].split() coords.append([float(x), float(y), float(z)]) ntets = int(lines[ncoords + 1]) idolf_tets = [] for i in range(ncoords + 2, ncoords + ntets + 2): text = lines[i].split() v0, v1, v2, v3 = int(text[1]) - 1, int(text[2]) - 1, int(text[3]) - 1, int(text[4]) - 1 idolf_tets.append([v0, v1, v2, v3]) poly = utils.buildPolyData(coords, idolf_tets) return Mesh(poly) def loadGmesh(filename): """Reads a `gmesh` file format. Return an `Mesh` object.""" with open(filename, "r", encoding="UTF-8") as f: lines = f.readlines() nnodes = 0 index_nodes = 0 for i, line in enumerate(lines): if "$Nodes" in line: index_nodes = i + 1 nnodes = int(lines[index_nodes]) break node_coords = [] for i in range(index_nodes + 1, index_nodes + 1 + nnodes): cn = lines[i].split() node_coords.append([float(cn[1]), float(cn[2]), float(cn[3])]) nelements = 0 index_elements = 0 for i, line in enumerate(lines): if "$Elements" in line: index_elements = i + 1 nelements = int(lines[index_elements]) break elements = [] for i in range(index_elements + 1, index_elements + 1 + nelements): ele = lines[i].split() elements.append([int(ele[-3]), int(ele[-2]), int(ele[-1])]) poly = utils.buildPolyData(node_coords, elements, indexOffset=1) return Mesh(poly) def loadPCD(filename): """Return a `Mesh` made of only vertex points from `Point Cloud` file format. Return an `Points` object.""" with open(filename, "r", encoding="UTF-8") as f: lines = f.readlines() start = False pts = [] N, expN = 0, 0 for text in lines: if start: if N >= expN: break l = text.split() pts.append([float(l[0]), float(l[1]), float(l[2])]) N += 1 if not start and "POINTS" in text: expN = int(text.split()[1]) if not start and "DATA ascii" in text: start = True if expN != N: vedo.logger.warning(f"Mismatch in PCD file {expN} != {len(pts)}") poly = utils.buildPolyData(pts) return Points(poly).pointSize(4) def tonumpy(obj): """Dump a vedo object to numpy format.""" adict = {} adict["type"] = "unknown" ######################################################## def _fillcommon(obj, adict): adict["filename"] = obj.filename adict["name"] = obj.name adict["time"] = obj.time adict["rendered_at"] = obj.rendered_at adict["position"] = obj.pos() adict["info"] = obj.info try: # GetMatrix might not exist for non linear transforms m = np.eye(4) vm = obj.get_transform().GetMatrix() for i in [0, 1, 2, 3]: for j in [0, 1, 2, 3]: m[i, j] = vm.GetElement(i, j) adict["transform"] = m minv = np.eye(4) vm.Invert() for i in [0, 1, 2, 3]: for j in [0, 1, 2, 3]: minv[i, j] = vm.GetElement(i, j) adict["transform_inverse"] = minv except AttributeError: adict["transform"] = [] adict["transform_inverse"] = [] ######################################################## def _fillmesh(obj, adict): adict["points"] = obj.points(transformed=True).astype(float) poly = obj.polydata() adict["cells"] = None if poly.GetNumberOfPolys(): try: adict["cells"] = np.array(obj.faces(), dtype=np.uint32) except ValueError: # in case of inhomogeneous shape adict["cells"] = obj.faces() adict["lines"] = None if poly.GetNumberOfLines(): adict["lines"] = obj.lines() adict["pointdata"] = [] for iname in obj.pointdata.keys(): if not iname: continue if "Normals" in iname.lower(): continue arr = poly.GetPointData().GetArray(iname) adict["pointdata"].append([utils.vtk2numpy(arr), iname]) adict["celldata"] = [] for iname in obj.celldata.keys(): if not iname: continue if "Normals" in iname.lower(): continue arr = poly.GetCellData().GetArray(iname) adict["celldata"].append([utils.vtk2numpy(arr), iname]) adict["activedata"] = None if poly.GetPointData().GetScalars(): adict["activedata"] = ["pointdata", poly.GetPointData().GetScalars().GetName()] elif poly.GetCellData().GetScalars(): adict["activedata"] = ["celldata", poly.GetCellData().GetScalars().GetName()] adict["LUT"] = None adict["LUT_range"] = None lut = obj.mapper().GetLookupTable() if lut: nlut = lut.GetNumberOfTableValues() lutvals = [] for i in range(nlut): v4 = lut.GetTableValue(i) # r, g, b, alpha lutvals.append(v4) adict["LUT"] = lutvals adict["LUT_range"] = lut.GetRange() prp = obj.GetProperty() adict["alpha"] = prp.GetOpacity() adict["representation"] = prp.GetRepresentation() adict["pointsize"] = prp.GetPointSize() adict["linecolor"] = None adict["linewidth"] = None if prp.GetEdgeVisibility(): adict["linewidth"] = obj.linewidth() adict["linecolor"] = prp.GetEdgeColor() adict["ambient"] = prp.GetAmbient() adict["diffuse"] = prp.GetDiffuse() adict["specular"] = prp.GetSpecular() adict["specularpower"] = prp.GetSpecularPower() adict["specularcolor"] = prp.GetSpecularColor() adict["shading"] = prp.GetInterpolation() # flat phong..: adict["color"] = prp.GetColor() adict["lighting_is_on"] = prp.GetLighting() adict["backcolor"] = None if obj.GetBackfaceProperty(): adict["backcolor"] = obj.GetBackfaceProperty().GetColor() adict["scalarvisibility"] = obj.mapper().GetScalarVisibility() adict["texture"] = None ######################################################## Assembly if isinstance(obj, Assembly): pass # adict['type'] = 'Assembly' # _fillcommon(obj, adict) # adict['actors'] = [] # for a in obj.unpack(): # assdict = dict() # if isinstance(a, Mesh): # _fillmesh(a, assdict) # adict['actors'].append(assdict) ######################################################## Points/Mesh elif isinstance(obj, Points): adict["type"] = "Mesh" _fillcommon(obj, adict) _fillmesh(obj, adict) ######################################################## Volume elif isinstance(obj, Volume): adict["type"] = "Volume" _fillcommon(obj, adict) imgdata = obj.inputdata() arr = utils.vtk2numpy(imgdata.GetPointData().GetScalars()) adict["array"] = arr.reshape(imgdata.GetDimensions()) adict["mode"] = obj.mode() # adict['jittering'] = obj.mapper().GetUseJittering() prp = obj.GetProperty() ctf = prp.GetRGBTransferFunction() otf = prp.GetScalarOpacity() gotf = prp.GetGradientOpacity() smin, smax = ctf.GetRange() xs = np.linspace(smin, smax, num=100, endpoint=True) cols, als, algrs = [], [], [] for x in xs: cols.append(ctf.GetColor(x)) als.append(otf.GetValue(x)) if gotf: algrs.append(gotf.GetValue(x)) adict["color"] = cols adict["alpha"] = als adict["alphagrad"] = algrs ######################################################## Picture elif isinstance(obj, Picture): adict["type"] = "Picture" _fillcommon(obj, adict) adict["array"] = obj.tonumpy() ######################################################## Text2D elif isinstance(obj, vedo.Text2D): adict["type"] = "Text2D" adict["rendered_at"] = obj.rendered_at adict["text"] = obj.text() adict["position"] = obj.GetPosition() adict["color"] = obj.property.GetColor() adict["font"] = obj.fontname adict["size"] = obj.property.GetFontSize() / 22.5 adict["bgcol"] = obj.property.GetBackgroundColor() adict["alpha"] = obj.property.GetBackgroundOpacity() adict["frame"] = obj.property.GetFrame() # print('tonumpy(): vedo.Text2D', obj.text()[:10], obj.font(), obj.GetPosition()) else: pass # colors.printc('Unknown object type in tonumpy()', [obj], c='r') return adict def loadnumpy(inobj): """Load a vedo format file or scene.""" # make sure the numpy file is not containing a scene if isinstance(inobj, str): # user passing a file if inobj.endswith(".npy"): data = np.load(inobj, allow_pickle=True, encoding="latin1") # .flatten() elif inobj.endswith(".npz"): data = np.load(inobj, allow_pickle=True)["vedo_scenes"] isdict = hasattr(data[0], "keys") if isdict and "objects" in data[0].keys(): # loading a full scene!! return import_window(data[0]) # it's a very normal numpy data object? just return it! if not isdict: return data if "type" not in data[0].keys(): return data else: data = inobj ###################################################### def _load_common(obj, d): keys = d.keys() if "time" in keys: obj.time = d["time"] if "name" in keys: obj.name = d["name"] if "filename" in keys: obj.filename = d["filename"] if "info" in keys: obj.info = d["info"] # if "transform" in keys and len(d["transform"]) == 4: # vm = vtk.vtkMatrix4x4() # for i in [0, 1, 2, 3]: # for j in [0, 1, 2, 3]: # vm.SetElement(i, j, d["transform"][i, j]) # obj.apply_transform(vm) elif "position" in keys: obj.pos(d["position"]) ###################################################### def _buildmesh(d): keys = d.keys() vertices = d["points"] if len(vertices) == 0: return None cells = None if "cells" in keys: cells = d["cells"] lines = None if "lines" in keys: lines = d["lines"] poly = utils.buildPolyData(vertices, cells, lines) msh = Mesh(poly) _load_common(msh, d) prp = msh.GetProperty() if 'ambient' in keys: prp.SetAmbient(d['ambient']) if 'diffuse' in keys: prp.SetDiffuse(d['diffuse']) if 'specular' in keys: prp.SetSpecular(d['specular']) if 'specularpower' in keys: prp.SetSpecularPower(d['specularpower']) if 'specularcolor' in keys: prp.SetSpecularColor(d['specularcolor']) if 'lighting_is_on' in keys: prp.SetLighting(d['lighting_is_on']) if 'shading' in keys: prp.SetInterpolation(d['shading']) if 'alpha' in keys: prp.SetOpacity(d['alpha']) if 'opacity' in keys: prp.SetOpacity(d['opacity']) # synonym if 'representation' in keys: prp.SetRepresentation(d['representation']) if 'pointsize' in keys and d['pointsize']: prp.SetPointSize(d['pointsize']) if 'linewidth' in keys and d['linewidth']: msh.linewidth(d['linewidth']) if 'linecolor' in keys and d['linecolor']: msh.linecolor(d['linecolor']) if 'color' in keys and d['color'] is not None: msh.color(d['color']) if 'backcolor' in keys and d['backcolor'] is not None: msh.backcolor(d['backcolor']) if "celldata" in keys: for csc, cscname in d["celldata"]: msh.celldata[cscname] = csc if "pointdata" in keys: for psc, pscname in d["pointdata"]: msh.pointdata[pscname] = psc msh.mapper().ScalarVisibilityOff() # deactivate scalars if "LUT" in keys and "activedata" in keys and d["activedata"]: # print(d['activedata'],'', msh.filename) lut_list = d["LUT"] ncols = len(lut_list) lut = vtk.vtkLookupTable() lut.SetNumberOfTableValues(ncols) lut.SetRange(d["LUT_range"]) for i in range(ncols): r, g, b, a = lut_list[i] lut.SetTableValue(i, r, g, b, a) lut.Build() msh.mapper().SetLookupTable(lut) msh.mapper().ScalarVisibilityOn() # activate scalars msh.mapper().SetScalarRange(d["LUT_range"]) if d["activedata"][0] == "celldata": poly.GetCellData().SetActiveScalars(d["activedata"][1]) if d["activedata"][0] == "pointdata": poly.GetPointData().SetActiveScalars(d["activedata"][1]) if "shading" in keys and int(d["shading"]) > 0: msh.compute_normals(cells=0) # otherwise cannot renderer phong if "scalarvisibility" in keys: if d["scalarvisibility"]: msh.mapper().ScalarVisibilityOn() else: msh.mapper().ScalarVisibilityOff() if "texture" in keys and d["texture"]: msh.texture(d["texture"]) return msh ###################################################### objs = [] for d in data: # print('loadnumpy:', d['type'], d) ### Mesh if d['type'].lower() == 'mesh': a = _buildmesh(d) if a: objs.append(a) ### Assembly elif d['type'].lower() == 'assembly': assacts = [] for ad in d["actors"]: assacts.append(_buildmesh(ad)) asse = Assembly(assacts) _load_common(asse, d) objs.append(asse) ### Volume elif d['type'].lower() == 'volume': vol = Volume(d["array"]) _load_common(vol, d) if "jittering" in d.keys(): vol.jittering(d["jittering"]) # print(d['mode']) vol.mode(d["mode"]) vol.color(d["color"]) vol.alpha(d["alpha"]) vol.alpha_gradient(d["alphagrad"]) objs.append(vol) ### Picture elif d['type'].lower() == 'picture': vimg = Picture(d["array"]) _load_common(vimg, d) objs.append(vimg) ### Text2D elif d['type'].lower() == 'text2d': t = vedo.shapes.Text2D(d["text"], font=d["font"], c=d["color"]) t.pos(d["position"]).size(d["size"]) t.background(d["bgcol"], d["alpha"]) if d["frame"]: t.frame(d["bgcol"]) objs.append(t) ### Annotation ## backward compatibility - will disappear elif d['type'].lower() == 'annotation': pos = d["position"] if isinstance(pos, int): pos = "top-left" d["size"] *= 2.7 t = vedo.shapes.Text2D(d["text"], font=d["font"], c=d["color"]).pos(pos) t.background(d["bgcol"], d["alpha"]).size(d["size"]).frame(d["bgcol"]) objs.append(t) ## backward compatibility if len(objs) == 1: return objs[0] if len(objs) == 0: return None return objs def loadImageData(filename): """Read and return a `vtkImageData` object from file.""" if ".tif" in filename.lower(): reader = vtk.vtkTIFFReader() # print("GetOrientationType ", reader.GetOrientationType()) reader.SetOrientationType(settings.tiff_orientation_type) elif ".slc" in filename.lower(): reader = vtk.vtkSLCReader() if not reader.CanReadFile(filename): vedo.logger.error(f"sorry, bad SLC file {filename}") return None elif ".vti" in filename.lower(): reader = vtk.vtkXMLImageDataReader() elif ".mhd" in filename.lower(): reader = vtk.vtkMetaImageReader() elif ".dem" in filename.lower(): reader = vtk.vtkDEMReader() elif ".nii" in filename.lower(): reader = vtk.vtkNIFTIImageReader() elif ".nrrd" in filename.lower(): reader = vtk.vtkNrrdReader() if not reader.CanReadFile(filename): vedo.logger.error(f"sorry, bad NRRD file {filename}") return None else: vedo.logger.error(f"sorry, cannot read file {filename}") return None reader.SetFileName(filename) reader.Update() image = reader.GetOutput() return image ########################################################### def write(objct, fileoutput, binary=True): """ Write object to file. Possile extensions are: - `vtk, vti, npy, npz, ply, obj, stl, byu, vtp, vti, mhd, xyz, tif, png, bmp` """ obj = objct if isinstance(obj, Points): # picks transformation obj = objct.polydata(True) elif isinstance(obj, (vtk.vtkActor, vtk.vtkVolume)): obj = objct.GetMapper().GetInput() elif isinstance(obj, (vtk.vtkPolyData, vtk.vtkImageData)): obj = objct fr = fileoutput.lower() if fr.endswith(".vtk"): writer = vtk.vtkDataSetWriter() elif fr.endswith(".ply"): writer = vtk.vtkPLYWriter() writer.AddComment("PLY file generated by vedo") lut = objct.GetMapper().GetLookupTable() if lut: pscal = obj.GetPointData().GetScalars() if not pscal: pscal = obj.GetCellData().GetScalars() if pscal and pscal.GetName(): writer.SetArrayName(pscal.GetName()) writer.SetLookupTable(lut) elif fr.endswith(".stl"): writer = vtk.vtkSTLWriter() elif fr.endswith(".vtp"): writer = vtk.vtkXMLPolyDataWriter() elif fr.endswith(".vtu"): writer = vtk.vtkXMLUnstructuredGridWriter() elif fr.endswith(".vtm"): g = vtk.vtkMultiBlockDataGroupFilter() for ob in objct: if isinstance(ob, (Points, Volume)): # picks transformation ob = ob.polydata(True) g.AddInputData(ob) g.Update() mb = g.GetOutputDataObject(0) wri = vtk.vtkXMLMultiBlockDataWriter() wri.SetInputData(mb) wri.SetFileName(fileoutput) wri.Write() return mb elif fr.endswith(".xyz"): writer = vtk.vtkSimplePointsWriter() elif fr.endswith(".facet"): writer = vtk.vtkFacetWriter() elif fr.endswith(".vti"): writer = vtk.vtkXMLImageDataWriter() elif fr.endswith(".mhd"): writer = vtk.vtkMetaImageWriter() elif fr.endswith(".nii"): writer = vtk.vtkNIFTIImageWriter() elif fr.endswith(".png"): writer = vtk.vtkPNGWriter() elif fr.endswith(".jpg"): writer = vtk.vtkJPEGWriter() elif fr.endswith(".bmp"): writer = vtk.vtkBMPWriter() elif fr.endswith(".tif") or fr.endswith(".tiff"): writer = vtk.vtkTIFFWriter() writer.SetFileDimensionality(len(obj.GetDimensions())) elif fr.endswith(".npy") or fr.endswith(".npz"): if utils.is_sequence(objct): objslist = objct else: objslist = [objct] dicts2save = [] for obj in objslist: dicts2save.append(tonumpy(obj)) np.save(fileoutput, dicts2save) return dicts2save elif fr.endswith(".obj"): with open(fileoutput, "w", encoding="UTF-8") as outF: outF.write("# OBJ file format with ext .obj\n") outF.write("# File generated by vedo\n") for p in objct.points(): outF.write("v {:.5g} {:.5g} {:.5g}\n".format(*p)) ptxt = objct.polydata().GetPointData().GetTCoords() if ptxt: ntxt = utils.vtk2numpy(ptxt) for vt in ntxt: outF.write("vt " + str(vt[0]) + " " + str(vt[1]) + " 0.0\n") if isinstance(objct, Mesh): for i, f in enumerate(objct.faces()): fs = "" for fi in f: if ptxt: fs += f" {fi+1}/{fi+1}" else: fs += f" {fi+1}" outF.write(f"f{fs}\n") for l in objct.lines(): ls = "" for li in l: ls += str(li + 1) + " " outF.write(f"l {ls}\n") return objct elif fr.endswith(".xml"): # write tetrahedral dolfin xml vertices = objct.points().astype(str) faces = np.array(objct.faces()).astype(str) ncoords = vertices.shape[0] with open(fileoutput, "w", encoding="UTF-8") as outF: outF.write('\n') outF.write('\n') if len(faces[0]) == 4: # write tetrahedral mesh ntets = faces.shape[0] outF.write(' \n') outF.write(' \n') for i in range(ncoords): x, y, z = vertices[i] outF.write(' \n') outF.write(' \n') outF.write(' \n') for i in range(ntets): v0, v1, v2, v3 = faces[i] outF.write(' \n') elif len(faces[0]) == 3: # write triangle mesh ntri = faces.shape[0] outF.write(' \n') outF.write(' \n') for i in range(ncoords): x, y, dummy_z = vertices[i] outF.write(' \n') outF.write(' \n') outF.write(' \n') for i in range(ntri): v0, v1, v2 = faces[i] outF.write(' \n') outF.write(" \n") outF.write(" \n") outF.write("\n") return objct else: vedo.logger.error(f"Unknown format {fileoutput}, file not saved") return objct try: if binary: writer.SetFileTypeToBinary() else: writer.SetFileTypeToASCII() except AttributeError: pass try: writer.SetInputData(obj) writer.SetFileName(fileoutput) writer.Write() except: vedo.logger.error(f"could not save {fileoutput}") return objct def write_transform(inobj, filename="transform.mat", comment=""): """ Save a transformation for a mesh or pointcloud to ASCII file. Arguments: filename : (str) output file name comment : (str) some optional comment """ if isinstance(inobj, Points): M = inobj.get_transform().GetMatrix() elif isinstance(inobj, vtk.vtkTransform): M = inobj.GetMatrix() elif isinstance(inobj, vtk.vtkMatrix4x4): M = inobj else: vedo.logger.error(f"in write_transform(), cannot understand input type {type(inobj)}") with open(filename, "w", encoding="UTF-8") as f: if comment: f.write("# " + comment + "\n") for i in range(4): f.write( str(M.GetElement(i,0))+' '+ str(M.GetElement(i,1))+' '+ str(M.GetElement(i,2))+' '+ str(M.GetElement(i,3))+'\n', ) f.write('\n') def load_transform(filename): """ Load a transformation from a file `.mat`. Returns: - `vtkTransform` The transformation to be applied to some object (`use apply_transform()`). - `str`, a comment string associated to this transformation file. """ with open(filename, "r", encoding="UTF-8") as f: lines = f.readlines() M = vtk.vtkMatrix4x4() i = 0 comment = "" for l in lines: if l.startswith("#"): comment = l.replace("#", "").replace("\n", "") continue vals = l.split(" ") if len(vals) == 4: for j in range(4): v = vals[j].replace("\n", "") M.SetElement(i, j, float(v)) i += 1 T = vtk.vtkTransform() T.SetMatrix(M) return (T, comment) ############################################################################### def export_window(fileoutput, binary=False): """ Exporter which writes out the rendered scene into an HTML, X3D or Numpy file. Example: - [export_x3d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/export_x3d.py) Check out the HTML generated webpage [here](https://vedo.embl.es/examples/embryo.html). .. note:: the rendering window can also be exported to `numpy` file `scene.npz` by pressing `E` keyboard at any moment during visualization. """ fr = fileoutput.lower() #################################################################### if fr.endswith(".npy") or fr.endswith(".npz"): sdict = {} plt = vedo.plotter_instance sdict["shape"] = plt.shape sdict["sharecam"] = plt.sharecam sdict["camera"] = dict( pos=plt.camera.GetPosition(), focal_point=plt.camera.GetFocalPoint(), viewup=plt.camera.GetViewUp(), distance=plt.camera.GetDistance(), clipping_range=plt.camera.GetClippingRange(), ) sdict["position"] = plt.pos sdict["size"] = plt.size sdict["axes"] = plt.axes sdict["title"] = plt.title sdict["backgrcol"] = colors.get_color(plt.renderer.GetBackground()) sdict["backgrcol2"] = None if plt.renderer.GetGradientBackground(): sdict["backgrcol2"] = plt.renderer.GetBackground2() sdict["use_depth_peeling"] = settings.use_depth_peeling sdict["render_lines_as_tubes"] = settings.render_lines_as_tubes sdict["hidden_line_removal"] = settings.hidden_line_removal sdict["visible_grid_edges"] = settings.visible_grid_edges sdict["use_parallel_projection"] = settings.use_parallel_projection sdict["default_font"] = settings.default_font sdict["objects"] = [] allobjs = plt.get_meshes(include_non_pickables=True) + plt.get_volumes(include_non_pickables=True) acts2d = plt.renderer.GetActors2D() acts2d.InitTraversal() for _ in range(acts2d.GetNumberOfItems()): a = acts2d.GetNextItem() if isinstance(a, vedo.Text2D): allobjs.append(a) allobjs += plt.actors allobjs = list(set(allobjs)) # make sure its unique for a in allobjs: if a.GetVisibility(): sdict["objects"].append(tonumpy(a)) if fr.endswith(".npz"): np.savez_compressed(fileoutput, vedo_scenes=[sdict]) else: np.save(fileoutput, [sdict]) #################################################################### elif fr.endswith(".x3d"): obj = list(set(vedo.plotter_instance.get_meshes() + vedo.plotter_instance.actors)) if vedo.plotter_instance.axes_instances: obj.append(vedo.plotter_instance.axes_instances[0]) for a in obj: if isinstance(a, Mesh): newa = a.clone(transformed=True) vedo.plotter_instance.remove(a).add(newa) elif isinstance(a, Assembly): vedo.plotter_instance.remove(a) for b in a.unpack(): if b: if a.name == "Axes": newb = b.clone(transformed=True) else: # newb = b.clone(transformed=True) # BUG?? newb = b.clone(transformed=False) tt = vtk.vtkTransform() tt.Concatenate(a.GetMatrix()) tt.Concatenate(b.GetMatrix()) newb.PokeMatrix(vtk.vtkMatrix4x4()) newb.SetUserTransform(tt) vedo.plotter_instance.add(newb) vedo.plotter_instance.render() exporter = vtk.vtkX3DExporter() exporter.SetBinary(binary) exporter.FastestOff() exporter.SetInput(vedo.plotter_instance.window) exporter.SetFileName(fileoutput) # exporter.WriteToOutputStringOn() # see below exporter.Update() exporter.Write() # this can reduce the size by more than half... # outstring = exporter.GetOutputString().decode("utf-8") # this fails though # from vedo.utils import isInteger, isNumber, precision # newlines = [] # for l in outstring.splitlines(True): # ls = l.lstrip() # content = ls.split() # newls = "" # for c in content: # c2 = c.replace(',','') # if isNumber(c2) and not isInteger(c2): # newc = precision(float(c2), 4) # if ',' in c: # newls += newc + ',' # else: # newls += newc + ' ' # else: # newls += c + ' ' # newlines.append(newls.lstrip()+'\n') # with open("fileoutput", 'w', encoding='UTF-8') as f: # l = "".join(newlines) # f.write(l) x3d_html = _x3d_html.replace("~fileoutput", fileoutput) wsize = vedo.plotter_instance.window.GetSize() x3d_html = x3d_html.replace("~width", str(wsize[0])) x3d_html = x3d_html.replace("~height", str(wsize[1])) with open(fileoutput.replace(".x3d", ".html"), "w", encoding="UTF-8") as outF: outF.write(x3d_html) vedo.logger.info(f"Saved files {fileoutput} and {fileoutput.replace('.x3d','.html')}") #################################################################### elif fr.endswith(".html"): savebk = vedo.notebook_backend vedo.notebook_backend = "k3d" vedo.settings.default_backend = "k3d" plt = vedo.backends.get_notebook_backend(vedo.plotter_instance.actors) with open(fileoutput, "w", encoding="UTF-8") as fp: fp.write(plt.get_snapshot()) vedo.notebook_backend = savebk vedo.settings.default_backend = savebk else: vedo.logger.error(f"export extension {fr.split('.')[-1]} is not supported") return vedo.plotter_instance def import_window(fileinput, mtl_file=None, texture_path=None): """Import a whole scene from a Numpy or OBJ wavefront file. Arguments: mtl_file : (str) MTL file for OBJ wavefront files texture_path : (str) path of the texture files directory Returns: `Plotter` instance """ data = None if isinstance(fileinput, dict): data = fileinput elif fileinput.endswith(".npy"): data = np.load(fileinput, allow_pickle=True, encoding="latin1").flatten()[0] elif fileinput.endswith(".npz"): data = np.load(fileinput, allow_pickle=True)["vedo_scenes"][0] if data is not None: if "render_lines_as_tubes" in data.keys(): settings.render_lines_as_tubes = data["render_lines_as_tubes"] if "hidden_line_removal" in data.keys(): settings.hidden_line_removal = data["hidden_line_removal"] if "visible_grid_edges" in data.keys(): settings.visible_grid_edges = data["visible_grid_edges"] if "use_parallel_projection" in data.keys(): settings.use_parallel_projection = data["use_parallel_projection"] if "use_polygon_offset" in data.keys(): settings.use_polygon_offset = data["use_polygon_offset"] if "polygon_offset_factor" in data.keys(): settings.polygon_offset_factor = data["polygon_offset_factor"] if "polygon_offset_units" in data.keys(): settings.polygon_offset_units = data["polygon_offset_units"] if "interpolate_scalars_before_mapping" in data.keys(): settings.interpolate_scalars_before_mapping = data["interpolate_scalars_before_mapping"] if "default_font" in data.keys(): settings.default_font = data["default_font"] if "use_depth_peeling" in data.keys(): settings.use_depth_peeling = data["use_depth_peeling"] axes = data.pop("axes", 4) title = data.pop("title", "") backgrcol = data.pop("backgrcol", "white") backgrcol2 = data.pop("backgrcol2", None) cam = data.pop("camera", None) if data["shape"] != (1, 1): data["size"] = "auto" # disable size plt = vedo.Plotter( size=data["size"], # not necessarily a good idea to set it # shape=data['shape'], # will need to create a Renderer class first axes=axes, title=title, bg=backgrcol, bg2=backgrcol2, ) if cam: if "pos" in cam.keys(): plt.camera.SetPosition(cam["pos"]) if "focalPoint" in cam.keys(): plt.camera.SetFocalPoint(cam["focalPoint"]) if "focal_point" in cam.keys(): plt.camera.SetFocalPoint(cam["focal_point"]) if "viewup" in cam.keys(): plt.camera.SetViewUp(cam["viewup"]) if "distance" in cam.keys(): plt.camera.SetDistance(cam["distance"]) if "clippingRange" in cam.keys(): plt.camera.SetClippingRange(cam["clippingRange"]) if "clipping_range" in cam.keys(): plt.camera.SetClippingRange(cam["clipping_range"]) plt.resetcam = False if "objects" in data.keys(): objs = loadnumpy(data["objects"]) if not utils.is_sequence(objs): objs = [objs] else: # colors.printc("Trying to import a single mesh.. use load() instead.", c='r') # colors.printc(" -> try to load a single object with load().", c='r') objs = [loadnumpy(fileinput)] plt.actors = objs plt.add(objs) return plt elif ".obj" in fileinput.lower(): window = vtk.vtkRenderWindow() window.SetOffScreenRendering(1) renderer = vtk.vtkRenderer() window.AddRenderer(renderer) importer = vtk.vtkOBJImporter() importer.SetFileName(fileinput) if mtl_file is not False: if mtl_file is None: mtl_file = fileinput.replace(".obj", ".mtl").replace(".OBJ", ".MTL") importer.SetFileNameMTL(mtl_file) if texture_path is not False: if texture_path is None: texture_path = fileinput.replace(".obj", ".txt").replace(".OBJ", ".TXT") importer.SetTexturePath(texture_path) importer.SetRenderWindow(window) importer.Update() plt = vedo.Plotter() actors = renderer.GetActors() actors.InitTraversal() for _ in range(actors.GetNumberOfItems()): vactor = actors.GetNextActor() act = Mesh(vactor) act_tu = vactor.GetTexture() if act_tu: act.texture(act_tu) plt.actors.append(act) return plt return None ########################################################## def screenshot(filename="screenshot.png", scale=1, asarray=False): """ Save a screenshot of the current rendering window. Arguments: scale : (int) Set image magnification as an integer multiplicative factor. E.g. setting a magnification of 2 produces an image twice as large, but 10x slower to generate. asarray : (bool) Return a numpy array of the image """ if not vedo.plotter_instance or not vedo.plotter_instance.window: # vedo.logger.error("in screenshot(), rendering window is not present, skip.") return vedo.plotter_instance ########## if asarray and scale == 1: nx, ny = vedo.plotter_instance.window.GetSize() arr = vtk.vtkUnsignedCharArray() vedo.plotter_instance.window.GetRGBACharPixelData(0, 0, nx-1, ny-1, 0, arr) narr = vedo.vtk2numpy(arr).T[:3].T.reshape([ny, nx, 3]) narr = np.flip(narr, axis=0) return narr ########## filename = str(filename) if filename.endswith(".pdf"): writer = vtk.vtkGL2PSExporter() writer.SetRenderWindow(vedo.plotter_instance.window) writer.Write3DPropsAsRasterImageOff() writer.SilentOn() writer.SetSortToBSP() writer.SetFileFormatToPDF() writer.SetFilePrefix(filename.replace(".pdf", "")) writer.Write() return vedo.plotter_instance ########## elif filename.endswith(".svg"): writer = vtk.vtkGL2PSExporter() writer.SetRenderWindow(vedo.plotter_instance.window) writer.Write3DPropsAsRasterImageOff() writer.SilentOn() writer.SetSortToBSP() writer.SetFileFormatToSVG() writer.SetFilePrefix(filename.replace(".svg", "")) writer.Write() return vedo.plotter_instance ########## elif filename.endswith(".eps"): writer = vtk.vtkGL2PSExporter() writer.SetRenderWindow(vedo.plotter_instance.window) writer.Write3DPropsAsRasterImageOff() writer.SilentOn() writer.SetSortToBSP() writer.SetFileFormatToEPS() writer.SetFilePrefix(filename.replace(".eps", "")) writer.Write() return vedo.plotter_instance ########## if settings.screeshot_large_image: w2if = vtk.vtkRenderLargeImage() w2if.SetInput(vedo.plotter_instance.renderer) w2if.SetMagnification(scale) else: w2if = vtk.vtkWindowToImageFilter() w2if.SetInput(vedo.plotter_instance.window) if hasattr(w2if, "SetScale"): w2if.SetScale(int(scale), int(scale)) if settings.screenshot_transparent_background: w2if.SetInputBufferTypeToRGBA() w2if.ReadFrontBufferOff() # read from the back buffer w2if.Update() if asarray and scale != 1: pd = w2if.GetOutput().GetPointData() npdata = utils.vtk2numpy(pd.GetArray("ImageScalars")) npdata = npdata[:, [0, 1, 2]] ydim, xdim, _ = w2if.GetOutput().GetDimensions() npdata = npdata.reshape([xdim, ydim, -1]) npdata = np.flip(npdata, axis=0) return npdata if filename.lower().endswith(".png"): writer = vtk.vtkPNGWriter() writer.SetFileName(filename) writer.SetInputData(w2if.GetOutput()) writer.Write() elif filename.lower().endswith(".jpg") or filename.lower().endswith(".jpeg"): writer = vtk.vtkJPEGWriter() writer.SetFileName(filename) writer.SetInputData(w2if.GetOutput()) writer.Write() else: # add .png writer = vtk.vtkPNGWriter() writer.SetFileName(filename + ".png") writer.SetInputData(w2if.GetOutput()) writer.Write() return vedo.plotter_instance def ask(*question, **kwarg): """ Ask a question from command line. Return the answer as a string. See function `colors.printc()` for the description of the keyword options. Arguments: options : (list) a python list of possible answers to choose from. default : (str) the default answer when just hitting return. Example: ```python import vedo res = vedo.file_io.ask("Continue?", options=['Y','n'], default='Y', c='g') print(res) ``` """ kwarg.update({"end": " "}) if "invert" not in kwarg: kwarg.update({"invert": True}) if "box" in kwarg: kwarg.update({"box": ""}) options = kwarg.pop("options", []) default = kwarg.pop("default", "") if options: opt = "[" for o in options: opt += o + "/" opt = opt[:-1] + "]" colors.printc(*question, opt, **kwarg) else: colors.printc(*question, **kwarg) resp = input() if options: if resp not in options: if default and str(repr(resp)) == "''": return default colors.printc("Please choose one option in:", opt, italic=True, bold=False) kwarg["options"] = options return ask(*question, **kwarg) # ask again return resp ############################################################################################## class Video: """ Generate a video from a rendering window. """ def __init__(self, name="movie.mp4", duration=None, fps=24, backend="imageio"): """ Class to generate a video from the specified rendering window. Program `ffmpeg` is used to create video from each generated frame. Arguments: name : (str) name of the output file. fps : (int) set the number of frames per second. duration : (float) set the total `duration` of the video and recalculates `fps` accordingly. backend : (str) the backend engine to be used `['imageio', 'ffmpeg', 'cv']` Examples: - [make_video.py](https://github.com/marcomusy/vedo/tree/master/examples/other/make_video.py) ![](https://user-images.githubusercontent.com/32848391/50739007-2bfc2b80-11da-11e9-97e6-620a3541a6fa.jpg) """ self.name = name self.duration = duration self.backend = backend self.fps = float(fps) self.command = "ffmpeg -loglevel panic -y -r" self.options = "-b:v 8000k" self.frames = [] self.tmp_dir = TemporaryDirectory() self.get_filename = lambda x: os.path.join(self.tmp_dir.name, x) colors.printc(":video: Video file", self.name, "is open... ", c="m", end="") def add_frame(self): """Add frame to current video.""" fr = self.get_filename(str(len(self.frames)) + ".png") screenshot(fr) self.frames.append(fr) return self def pause(self, pause=0): """Insert a `pause`, in seconds.""" fr = self.frames[-1] n = int(self.fps * pause) for _ in range(n): fr2 = self.get_filename(str(len(self.frames)) + ".png") self.frames.append(fr2) os.system("cp -f %s %s" % (fr, fr2)) return self def action(self, elevation=(0, 80), azimuth=(0, 359), cameras=(), resetcam=False): """ Automatic shooting of a static scene by specifying rotation and elevation ranges. Arguments: elevation : list initial and final elevation angles azimuth_range : list initial and final azimuth angles cameras : list list of cameras to go through, each camera can be dictionary or a vtkCamera """ if not self.duration: self.duration = 5 plt = vedo.plotter_instance n = int(self.fps * self.duration) cams = [] for cm in cameras: cams.append(utils.camera_from_dict(cm)) nc = len(cams) plt.show(resetcam=resetcam, interactive=False) if nc: for i in range(n): plt.move_camera(cams, i / n) plt.show() self.add_frame() else: ######################################## for i in range(n): plt.camera.Elevation((elevation[1] - elevation[0]) / n) plt.camera.Azimuth((azimuth[1] - azimuth[0]) / n) plt.show() self.add_frame() return self def close(self): """ Render the video and write it to file. """ if self.duration: self.fps = int(len(self.frames) / float(self.duration) + 0.5) colors.printc("recalculated fps:", self.fps, c="m", end="") else: self.fps = int(self.fps) ######################################## if self.backend == "ffmpeg": out = os.system( self.command + " " + str(self.fps) + " -i " + f"'{self.tmp_dir.name}'" + os.sep + "%01d.png " + self.options + " " + f"'{self.name}'" ) if out: vedo.logger.error(f":noentry: backend {self.backend} returning error: {out}") else: colors.printc(f":save: saved to {self.name}", c="m") ######################################## elif "cv" in self.backend: try: import cv2 except ImportError: vedo.logger.error("opencv is not installed") return cap = cv2.VideoCapture(os.path.join(self.tmp_dir.name, "%1d.png")) fourcc = cv2.VideoWriter_fourcc(*"mp4v") w, h = vedo.plotter_instance.window.GetSize() writer = cv2.VideoWriter(self.name, fourcc, self.fps, (w, h), True) while True: ret, frame = cap.read() if not ret: break writer.write(frame) cap.release() writer.release() ######################################## elif "imageio" in self.backend: try: import imageio except ImportError: vedo.logger.error("Please install imageio with:\n pip install imageio[ffmpeg]") return if self.name.endswith(".mp4"): writer = imageio.get_writer(self.name, fps=self.fps) elif self.name.endswith(".gif"): writer = imageio.get_writer(self.name, mode="I", duration=1 / self.fps) elif self.name.endswith(".webm"): writer = imageio.get_writer(self.name, format="webm", fps=self.fps) else: vedo.logger.error(f"Unknown format of {self.name}.") return for f in utils.humansort(self.frames): image = imageio.v3.imread(f) writer.append_data(image) try: writer.close() colors.printc(f"... saved as {self.name}", c="m") except: colors.printc(f":noentry: Could not save video {self.name}", c="r") # finalize cleanup self.tmp_dir.cleanup() def split_frames(self, output_dir="video_frames", prefix="frame_", format="png"): """Split an existing video file into frames.""" try: import imageio except ImportError: vedo.logger.error("\nPlease install imageio with:\n pip install imageio") return # Create the output directory if it doesn't exist if not os.path.exists(output_dir): os.makedirs(output_dir) # Create a reader object to read the video reader = imageio.get_reader(self.name) # Loop through each frame of the video and save it as image print() for i, frame in utils.progressbar( enumerate(reader), title=f"writing {format} frames", c="m", width=20 ): output_file = os.path.join(output_dir, f"{prefix}{str(i).zfill(5)}.{format}") imageio.imwrite(output_file, frame, format=format) vedo-2023.4.6/vedo/fonts/000077500000000000000000000000001444463326400150055ustar00rootroot00000000000000vedo-2023.4.6/vedo/fonts/Bongas.npz000066400000000000000000001767601444463326400167700ustar00rootroot00000000000000PK!C}jfont.npyj̽y|0YFHH ,!$H!@ ɐg5 bDDTĈ(qQ\PQQ^FwL'\*3=U~NU>zz3@Bro7kK’9 -|a]`Ysd\_dcw^k_B^(Z|y}G]9OLSN `<OHִi{B EV'L T~<Odִ 5>[4cƌDuO=]𒞞hUbQqOWi+qZ O=Kx2{:<`uv&q@E*P 6` hC+JDO:gW'% E7J0Z)Jɓw\Ɖ`@I@DL(DF !Q!QP"3!|{23}2;LFMl^XRB->*< 7&6Y%z}?Gֱ|Zba3և@8@Ec$PQHo'$($6ItHRJ‹vE6`@Bc\[INi`e]IQҕJ0`h{( \d7J%[d)J/Ip AM?% 0| e>ހ0υ^*Ph,P0|h)zx{{&螉X,WaS"WFd WdQj0##=kAk/b[ه}'X`3_ۮ/aED'3nx,d{(ΩF e @py$@ChwE0{!Ape~ y2ʃG#F*cTB6R)6Rm6HV&BCL6[)6[ HJ)B;E )02tV20000m20 0)ЎX gFf> SήI-3*I-Jv Cw=Vij3s4Kj5gUQu6Q}ѽ;C{RŘn~e.ԇg;̗f QɵNL֑&RAiF3~DxO?Ag,K !>a6iXqFq^!n#6LqJ|+b> ȳr(DX,BcEhX~*sëZE8"6Z1FPFQ,$D,{~5ֱ/[a,/BI$ gEt1.bAQ[\1]ZY_ˣQ.>o~4i$ s]+:2JM:|~ujkSws^MPv2` ɘBoYvd\+ҝUGUE[N2"#qu-C/{b_\|VL/⩩ԶUqIbF-i 1>& ?iƕSԾ̋5o{QHaB' uoW4JF`(Q$q'O 8-^% VʠX b zUgH)^ j`X( h( b4He2EP(Zpp:R.X_\ ..Q@;%B;[le>V^<'cA{*f>>/oЪ @b.]w(Tih79Вr8+G&hFZUӠ偠bn"n(R`:NrӠn RMCq7 zy* u*Rr)zeH癣{涋y2;< $eI⑮~q?&]/psC+elMx=!ey랫ڇDjga5rHո@rZ*2$W/RܯKE.]#Qd)LiUX3-(:'7uӎd[=T>Xﹶ}Z(sxZϯS%aćG"0fǠ|OgjDEJ|X^_l+@ȷpmYQF^Jsc;nþYՎ[yZB#*Y?\s$/cHYfk;]?v||_?~\XX8!j~mNaU'x˝Y]﹵yMr9-)=l!b\Ma'n`yLXǚY>ϱ~ϊK5$[#b)i~xDFqr:m_:Q.)K˒&2%D,nuOA%I!u^2F O(u[OVI  dܡ;hphPj L\C]B$X,`4&D~ܻ<ԑ2 ׍@6OI& ~0h PE1pE&50h={6=YxTJU\WV[Nh_Iwp奴VxJq7nv;XBjM4. gn6O st l3={or4O8.W+P7sPj\a爼mQ9ڽ:Wۢ;kaFQh(zՎ>K֮F>k?;Usn`ߓw}9ޞ$9I?T2G+!hcKE$AC{<'uG8%"#'DnusI5U,'+.ĆмCn:RO^mR;-?1GO=O|?3Ls9Iy qQ9]:!Db3rmC9[žlK~%ok99ofLK4/꧵U$t%̣<6tCk5mZ{5?Ԫ85[+IW^/2zs }.4!rc7ZY&<%IZIwAS@g!ţbہ#XO᷀Gnl+Y\|ӏUVb~gԅYU>g]i0/ F_pbP+Y|&^[A'vA9JI݅"Ud6:ɚ|۾I~!-7\g6rp1#Q$^-bԪѸV E/`( PrAE`+\E`KdZ)td RLA0=S r`t=ug F#틤ZIFCQ37a(BPW?1@%jԫ @-3[Gw*ZTz'yO8`z9@o<@Wo8 M1z~d`O5~+sAldH9PfyHw ɘKq@/':z>3/]KOxk]K92ケQoh+ ( _\p^a!ɂL`FBxQv?Te1uT 1 #id=d=HDv_<ҪuGV$kQ<*\"4'EG/Hyܬ77{t ar)[ ,/'|#I ;y6:vߐ'r2I1.9îO*Th-A#RmYe[sTXQ5lMBü&}N,uGYOޗ| '"REc~'ū7 QY /]lD#^bl [ eftW$׷ Θe̱qH+/Q$t gvK;(-v(@fe2;Ѥ΀' zIhTSeZ|B03g\8w2<%^(zH I(P $HB! A $pAxJMW$ W$^R(uBiݯ֎;Wi?UWfqs׃@?ol] 3l-]ZTz c3']¾" %gh!CIf NZ~Fw4^$7gd/YOStYʙx۠>B<'PaԉΈr9犷͏Yf\G~#/LVŗ` i zhU e7\-\{k˴3DH\ j; F461S+(h-|n@m1C sG~9ɽ+| 5`'Ԁqw&^e SQ "KC6Yf>r{$cosxG_G2RFAssbv@I1X*!cfˆ^ s  Z- P w,@;M.gf 0)5]RwL(S=)ANT2ipm V\[>O>+ܗiav4 I6ܖH{:Z.v2" q[Puh%!9'^ !Qa;g9czp/{8{" iF2۴[Ftv11]b&|b7X9a|Udvc0e&LzGHf gb;G<ܯjmWMrYmb4%d 8@OӟbNd7Iw`Bi7G.([H%]HEƺPEVV1JƕFQ%MPXE)چj¤a)L :^G{P bzA7j>e^: uj$dIXOB])$i2(AEücSQ 6V'K*hkZ~eh2/5X'cCfXwRyQ 򕙩2 -`ޡ=o243V0 Gxt7b'>@-C?$Ɏډjsޢ}gAr?JΛ/S V?Ybh1N-)_T3Hr3(Dv{ bƓ Oډŀf,L14\ ZM9]բLzsˏsߝ!U!{+_ytw/WWg[O%6Z'#ZK :&2+VsD!IGi+%8;oz+v~1䢐Z2 ")xj jM(3w^:@Il֮65$44.Ӡ$4$4$4Կ RUP84mXj{ayKhad0;ObvւI] T\=ΨGOHy"OāJx8tWe?_c??F] ?хu;a @iY=@$@4$zUU^*C5Α2mɳ +Y=cZEl3q+fq<;ص,_`XM5X,@:lTBNKh3=OYz9Obhf G5o֙rt~uxAzkN2bܕj%`'/kj?L9Z`m1V_c֛keuD_Fco!ʶ,8$N l3˥oyoϊ;.*b&4H.;.wS|53p}2"i/b\b8I'jQw[C#9mh*Bc3Yo"jk6m9+UzzF9˥hǃa^OKq$UZ4\x4 iEMi[2 %cJ([2Fؒ1͵te-tC@&.|j)ꎦZ*Ւj<x"dE,Ұ':=QiD`O=QDzR)a˱#ld16k0b5@rp Vc D98@Aboc$'F0a`L=Fq(Ǣ GV]d`UX: 2k:)31J9X`6+.daY`YY-Nʊ YQ ЍEgLVo]u@YcQ=YN&2 +ʰ Kʰ zeXV6 ~AHNRл`r)@Yh6{lgw:f Km )|M2k 30{ ŝj.U\b4Szٵ}gդ_yFP3l;Byt*M?x&9DDb?1XD2Ef1&Dgя(kh0('ﵖϮ譚b-nH2$>VՍXd+F)d#Dag( U=X]"WIXZP|D]QhtE.Z_4z3ۓޙhgАCay  "pʆ~. P@XHA" M M M4+N \ES>V(7+XGc b~qax,㒁| \c"E0_^D#W ]D /_l^eOmc5ƈRnpoVZO *J)]Cڟh+^R⵶Qߎgdxc`<`&y]]㽮v=p +ۧFmߡICޛph7r=[p[/OoPg@ r u.YG 1uzG<-}մc̰ˬC DtjP|"m!!,|LUV=.c=m6wcn{,XUbk-|-$i:Ob, a>In?" ~?mn#kU&ͼB^E'sqB oWٴ|Ss>kfiG#88'.&9_aD>5'>ȷbuƠQg$X+}ǵecO ʞGSPPgh2&)v/?YP&uwb /W'\EX?I~3Cte|*,9=oe;G{Gb"y_BDGww%4昌{>ֽ̨7qs6ZO_hT?.!g̟h&{f#X: g'v=%g\f!㉓"-F | &H-yo넱fs5I='z][ڙӝm鵦lԗk?V5+԰vw/6" @KzdujV4YH,s1x\5nׅ>NO=^t|?3:&O<;ó&- ~E(E(MMdhdb=QKOyYGޠObil6`N4;{_DIvRuQ[DTpb}0 ivA=9mٿNhaU{]ۍXcQĢ~b,X,>Puxz@.Qv%恨ZP뒭Q(lx9P PO'?W_NI(f&`IГIhq N_8ǀQT ]9Je n邻.ЫQj}%aGK}rWbCk|ܮuPR>1| %I?y6YJ@7G8*)sQ8$hx.(GY(ůRpr9z rgD5RY -(%Ŵjrcĉ^#kk6*^\pu++^P(WzBO* 4~pJ̒NMvRn ڕ-j+۔&Ve @ٻ>] \׮Qn(k]Nh(wAFYnh(@FN(wPP:N\r6w mHlwޤ8KrosRf[sLӠm|7#|)|'m O/ĮlKJfsA g'N?s=29/m,KQ{9wy#Mp֤j9Y?jV>zI+w!g{0PB%'ݰ1.c5莇TȂNhvٗ_ddddd2c2c!N4[Yg򐬗`:2`:2O擇i(0 =4;Lڊ44 гLC0 4jKq2@i,栱LbK(.0Џ} qxC}0Z2]hOkyvǍTv+Wm|B&7dUT_1Pay)cy,*Χo>\9l$ Eֲ3,Fpi7n9^J=ݦkׁk ;kUeWX%^[ uj=C8{%8&S$S;c}S?hW#⟝0 wYNXނ>F-ЮK D錪3(cURi]s1_l :רKurpGK,AKrVHFW֭a,\l=bom.whHroN#џҒ1'㘻UEeqt"泬3jW#mYum/H¼l2en6 koJqh+ۇMڥ\K,sy;2cJiX=+ݞxNg_X=NYѤWd-ηdeC#`y<FXBқ{cs"l3!,q-n_у9:Q$AgKͲd/-o߸/pӿ44e?CqXf4p&Ixgc@dDs?s S-ќCYüp^@3"ZLx Ȝ,w?cyL:WY SդW+ê?, u|Gh߸2կtOT~5CD4~Ev)D!ϙLsn(i1Udw+5zxt !VDu|ÉU$VZ&Um~\0fX5yH}ֽYڬ#c{#\ kXXGW8g|ƹ'z;g:\~oM 6HLaER 9iVUw0ʷc3%u wP,|no$i;J'7,1Hx(ƶ~P9ݩXΕRn=0y$4RK 胅5RQ؛H|'#q(E8͈ye?ͰTT4RQiH^@D2o"N{c]YICЫccvVIᝄ3(@dDx?§ؓfOJp;Le Nżg6ZuV(:`Mms94Yxg#~N>~<밑7}m[ eޙ̪NVtk[kCa8t]tm4ӏIgH048v2*{V_[Y;O#ci.E77^77":=^_iiAbYMb]EF38Zifz1Vojoԙfy>ᯫSg(o;x#.swwk{8uݺ=Oi̖&6/9# PapXN`W^f1D<# 0iH, a(/JҽPHgno,m_,mWMcq:e#rl4B4n^\lr' ;j@1[:'4,xJQ]T%aW |sSֹK%d Ͱn˭sbAd5[<-fKAauٴײN%8K2{spsvK>^xm:Ov.n {tFQtF"x־RDW&Mކ;iT;gcaʼ\,'[@z%QO;ėT _IoE}\NaZ1#8Q菪k.á^gDrUk֢VBb/H:<^]Ǩg!=k &t9kVޠ"i#t;-6{;\rpȵ5GܕZrg9J6x2;m$M5D _T[E:!H7sYsўKDM6ڏV)mo xD$QT`GHH)HmwlݍAaVf:B|xl/ Ęϟ 7阩xoFLX[pW/6r9{vkV~iQ?I/+kTFg 5MʹaVuw VuOhnn{ p 7vH1tJIT mc3d<!t,uӛWI˨ȋKast_bFoi%uUݵK':sUub.2RP/WtcQi5SɄcUN64o*j[ZkkX{\bXfz+9r/{i=|IZ."qX!֊;EeYEұ_[| [Eԡy%ŏaG$]&]8˝S&՛aspaW5c0KPF9|Ϟϴ˜X9v<;C/iͷWuyI.`o瞀/ouJW&y+roߋ I'i7>w7wE<@+/}qNj4AQ El ~pHUyVAJܥ"TSxvۀ,?0TM c;!7he_J*⛿Ps@_kI1l:\nS\L:&UywwkYrM8tC1qr;uYG'X8JҥlTe\]ĽF+WQM-4 =<ÄrhD;D|Zxo& g#k svlCP+} pPu= lTp p|yPnpa 0\< )ExxW! XW Kؤ/D_"E|!B bÅ.,1+ב4t02M-{Zl; [o'#~pmQBvxY ">6( ' jQk]e:a@h+$0m.KM r5+LDIDIDID!c/cN=a n^0#6HxW Vn vG:(t(R1 }^pE޷WI =nɮ\qzDvw cC ϱ팰l O?!{{2Ve=aN5" gk@Q|:|zfHcyV{`ͥ{IY4Zܢgsj;2$U.Dlbϵtk5ؤ}~V}{o?pO BbW@^1|&aq ,A8/\ & ~9zEnP)BuSSE* Eej˳qa埬#JM(_Z'@yLA_Z?(- &_`tk!3=moCu,Ͼj=Ơ}(dcVruwߘl{|2Q.x"IA1%)`V Z)X8_-R 1+3} d5WD7^Y%#dʕ5۴÷]c%$5SzQ0V(Yu6^D,rNu{; rV!QAH dDx }=`1^m1 FcUXk jGUSDUT:CC!QcQ.g~RM/E++=2y rǵQdc0N:S:aX/+@޽˞yZLGDE[)}vbOSGqW{8{=$m??kߙEm'Ea((LTigmb!yYRpO[ZAMA E#!7P]&\;MveK_SqiK*=e~ZTsVM$ KvRsW֜t'uZѺzXLx5Z Rx; `K7tr ǗVl^+fS|%Ѩbr]~t`\Dm/KB,#oG;YoO-6}jD:,6T[I돑:Z^j8*-\_j=&ZJZous_=-b53E2E7:q ?Xq L?dw g( 1[Pxqhvy"y=B{:#m4/hj[ww77B`ajz;iShdr"oZ})'Rip*s*3 Q >Op2G Y-66n(U׷.6ֺGR^i,1VQv?ZEcԎ4`S Eͱx6mF ܀w=AKi5iӢ̖.6XF$`s v'fg8 YwM-4zL}ڸ Dcֹo/`h+n.^95}bϘelcD#v&DK`(?[t/ԗ^Zkz/i2ER:InGBNg < n.)JBy ŧxɻ(Sn`اh:0Z'QeTA`r͎hvpoz#@o:i-Ƿ!@TJ҃86Ù$M dI_ p,@}P[ =o諒ѷ׸Fk$OgTM /Y ވƠj %WJ)>Ӣjw[=H&-Mflvpҁ lY;Et-:|O`>[w+p/_@ٓbY3Fwy{ǵRdj`w66+ hۃWOE8P8(ovspjP[@q<Vr0 (IdHCJv]g Y] ԳL@TT🧂<R4=^n Ol S~h~OnICur{+V@נּ[[Q[]ۀ޷;} w,z@Ml[LDZ}FkE]v)?ēoƢQ HNz8 Wx*E[ɛ#Րjr>g~ܔ,3'5et; ody ?EzH".B?jQZ綜\7 [K-NbY,&դ謶K+ӊt(X?=cc%i=`YGBH)y<=yx4[2q~?;ag[u)밖?ٟ Gߨ sƒx^j ) g- @S8@Z =R-*?HMT}Zn`nݰ 켧 PuB!Int ^SgwXgiAjrHV WhM;U*c9T PZB!K9H=GC!L787;['AӁ]nG8r;2"^]/`뽀  {B CL> Q&DX P?Az8HFy [۸apn:zg!J0lK&D*CYKwxJ<G%3s3zx{{ExL 4A?'[<ҜTQծQMVQ$l%/(v@%>>vѯ?4-TZ-eNԡšG?:֭omǖ\#3g-3f̔ļX*t7["i *:i|>`{'PtPc$?)r6]{frqp"oś7*F(p8;4+zŽ:EΤTȌv-nƭtKoK<RB #["7w?fYVWԁ]~0_*h4O/OZ,Q6} @_ DȻ ,L=zēAv0{ڜ$q>ILf#i{.Q(JZsMIR"ѐFl0pVZ}8c!^;(6(6(6(6z+.h炛a)((MuEEW :Mtz+(E J/XxG%>%<'TVFx3H6Gy;/)*Xk|*.&7X5rpXvJJRuۡèOn0NtPs svAv_q}l|6g v 4pjF躝)QW \"0;%ҖPIoDt/  s)$WL먹y^Csd\Y`؋itâaWq:anG Ȍ  $ѸHXns׫iiܠ1Zh{`aԣWQ%VtNi/DI:oO$.9C3h:Ы>FT7Q'5$v}:biE?E51#6&̵@{8Jޔ؏R7i/6l7eyz gyY<oIFiK747T81yX8L mL*/sp74p+]Ql7[5i Zkkmɓܱ%펗 1v5gevdJ.I+.vU]P-VoL+?N Cl1+ #tT=Qmwo tv+eX@'ڭP>.'=e и!n7'†6@%!r,D3х<_ΫgQg*:Ё9ByflM_Tb(ߋ/H!yig:Zƿ>fOVJNz"q7|~iy?x=[oѼH`c,1.a XSXrZa}j}iz9M % c`9{7U<)[xI-@7lΒ }ٶm$n+)c?ս'_#i4@4wHIUqvBs~>pɫy ΋[Χ96逻 wPpvEgѶи:E %- SgRJJ7,Wmx>"ҏ92`^+;^:IRY7{ןZ+r%/? CÈwo #'|/h-7x)_^܎cIBm4$n acl3g芜4>K8'I <1( =ߐ5R* w#87 pf+m-%Wm*ASIߖ,G .8kp8pdAEgtQA]!mWD#+J#uBV*KUZa%m 4kkx/^@Qp>a (gs=Wam`n-ꞯ4^:.i}q6MC; ׶3|I/nWhy D0lg  ߼Bmʛ6>{s7oD9}s`́79́7oXypKa|{ɱ8>[n  Bw!hݒ8#>ॵP ??˄øL9%.nR疸_p;'2IG,-(B -G5yy1%p;\JУZ_m(=DIWV^`g_?sF*Ӽug,}~_ $->ViV.QBa ˝40@^2V^[pCL; nevQ js[:E HJjtD/YxH€G`}61@J'8, \ Eke/dzl҅edzػF_~g=g{ѷ5Ǣꌃmy{=*Oҙ4k»">N'x/d Jz汍ʟw `a0ַ[yz%F|H(]J̿vtRS O+TXgx()7m!FTNS լ>wl? :A^ (= -V[ Zޥȱ?.]z-Zk%uS@1n)A`K̷C [Ho "C-{ 3^P^(yg7vu 'Qp 'Qp Pp Q} gR}DjʒdldD'Q7O@s,,IE&mMƹS(onG~f-]\]*|ٻ[-dzJ2! r3ɯ&=ٝ蒾g4`p _쮛*lDNPPKnҵJ ul篍(WJQ U9Q nąfs̽}N`|&&v8V%#9ijTCH,M5: B2X WlE{4Ur@eb򿲳I]' L#'>Vs;sD z0|jvۊ6E|@ &l(`5QS%;)\TN'(%/SeðFGG?U :}N(Ϗgi7{hkC=c8RR?[?OViom/kM_i hFenz^_t)_Z&iR0%MlOi|?\53`ND||3u:Ra> MYozk7~.xyq"A쐾uiuP$,ofMi<[fHgb~S։<<9|/^s6m]YI3 Θ@X59oDx jc}qoㄅJ6@O\+/Y4vW_D8[ҋ,Bo0݋N[H]K 3N:"@)o]ZU0)\QsЂTm ]K`/2B6n3$;P{QaP(^X 5,n({Ѕ[=}=,`Op:J4ݧEj'z) j#xz7Ix:RoGh"$6kPMn.5-bA\+FbmJMyXLh=3bk+>=vhy]N'v/8jTej-mOŃ Ebt6t<+ zz=z(kCDxB?wI޹}{$;_,ְUbBMMC@uDŽ>YbA $R91jF7h2墁FD@MsEѴB-²܂~g9Op[CrK 廩/ityknC6EkiYYJ F3npLs۶Pv,. 3SG@P֊_̀ (I~|oA^o Ҿ;qh6f*DfsSnud'lyA9v~V2Jq+X\4L\g %[ۄ:ۆ^-t$xOFpCҒի;«S졓=>ZAo\Vv cA1%d]@WѾA+UM i3Ay?NKǵ *vhgm6(O4Q6MҦб#KhZʺ'&>CŜTl2>H񀁍Fx^h(H⸾xbMIwۥ³me%`j5ݩ=OG<}-QӇ{5,C^G&u,LhwvbmWm=t{-1؂b %v0J>QP۪8E31cz{4nfOLxxzWZ_[,o~ЛmTeb" hK}--wt }uYY846Z=/iI+?|v\Jcd #.Mf]b%wW[~%}ro^`74)#I:::CT%ۀmWⶺ P@CCq}[ކP6ă! -]vflf@h7owx*;v)eWGXQ+$E4[h&l2̮6 sKpPGY^ |h_8띌gxrC$ߑE+0gU=❊%y%BoD[{-&/ֈozXa 1"bH0afœwy 0ѡo7*I\}_7"ƑI?Sjvn ޅWw]> 4` 0 uDL 蜫K^І2;͡b8uxeQICĬXJkK 6x=ŶFVQ8*s?bJIY .dmRLdHJ*9>oɵV V|JCZ| $ŧKiHO?CRHBR0H-IIf. *Aϙ@N(yy@$x,h&ߒ[JxZEy]4G{mh`TV +Y_?{|D~O1akVdsz:CwY2d'定F~dY<R* I2+|_m۰?%^L(eޒߋh#Xurhl""SD' IXנ{;2H}Pջ +A@+pNlwk<|$@pk) ]@tY5[,Ikh`ŀN-?}:7cy5={Zh=Z=hQ|4P||U0::!GK Х;) 'OU(PXmnu6R`}(3+T4Cwѱ,oֿ?Og='z[̼ :cq<߰}mvʮ@ }7eZ M(ޞmInkMξ֙D"x9.8)y1HmtQ47Lmt7l6z>[! d*ҩ&z\$$zQ FoqJCE010xs^k#vՐp'<1o/,ϕ1缷^:|rY@t'}.^O;brtV,$1Z{_Ɛ_|k/㸄>K|;7UCx6+gϾ')3$礍UMgi>ꂒQ/TJn}4.!V9ŏ m͖h-=W1iK=:}V#n4ոFȒǼ^bgoN=QV!oKb7fw.cU<%^;+58&NȟN||H;kG>HMnmpu;k߫E?2RoB:bY߱cPGxkx7voU5k68ݾ'vv^j Ϗy?*դi I+juryr@NܣUfZu4fzDcHT1v2}$x8iф\Q4Hѡ6:&R@".*;M}qՂ47Ti=TFFmM[ l w|gi -Hܶ q-} 8>ܬ},ɍL#G;mY,nbˌ`+Tf'Dd&& fʑcks\rʓc|r>x^ H X'+1%LrQWL.%\wO xV9*?z*m{m3䓘vye\E\䕹Lye;䕹f+s)u|3w͑W*W+]8uqw+ABy;u;]P^9OѺ[,d.uwW%:y"ͶXm6((D4 oW+>_ ST*LJ_ ',iH1_%,3RyH.FKP~b a.dj^V%xP9]*FMi:s`)quimکrv-]yK[iga9`0vej Ukx̂cJ.N>Sy@gXKZJVi{ ;v` yG gjb EvA{ 2~fY>D{)gRJ<'K[(`dKB06"ca߳;Xe4M/Rf̗:%B#xI/_zG}J/뙋wի,{U,]L '(gA.?f)!E f6ųXւugIEy|!#(gO"rGIV Z{]Bf"U,_Y)zc}+.-?Aޠ:#i‹J)iǼOHސ3Y<}GY2.؇(H~ZH z\U.kEWc1\h6~{9z?:TJ}:Ejk4LU@!GMJBq|z*Hgp~+ez0{dI#J Ϳ8 2,WdԐ? ;6qCN3>whHn )։*h#``%, 7D: $Ր aҞnpR1N*>tw l/b4SVj_kIԾch}Ag}x9zj A6$lH  a3@fȻ\8&z4Ui+Iyw|KمgX 1XIWC[xR*Ր269ΐWyj<5sSl9!TywRt+)ʻyr+%Ty7_w˧Xu \(%"B)'˻rO~D~>Kooow/]:Β|9.Yukr=$\, y*YGuQy58e> )x\ixFmgaVM{%;V+| m{w{^e5Z 4\Kl9.܈Y3=ϒ\vgժծGc&9yy &zԒ82^Ҏk-)JV/I56ȟϙ&J5VMRdlm6 F8$ Xb0c1ZL'a"XkB}Q/N'UTznx=dhkly6Z p8@&Q@c^;:"_fAqj!W%('$:I঳쭰dȦi\H]8ܒY @pV]OR~1j9㺁i`%u[: BSH )A@2@p[t#+h#Y&C70l!.򢃀_6_~I^$H"Rm &FjOڥ~%boV[֜dґFA;Њر Vg?̬ILy|AR49CѴKh\Cӆ#(T~7fXJ5T+EcbC@iP7\UzX37q`ZۻM@ cF;TFTkLQ.5ƃr(19BEi4[`N9aUz?{_:wa},O0(*;VG:vWVpjnPGE Vɣr%d24h:-F[ssC"*F!k+5,e~رWCOT0F>kGQJЇ[,wԫpQFfwwdGJ$}~'?H|_/'=HKHHKu&{Og9FX #v֙a;x9[ jy^o#ِ-H%0,?^S/_kr'X\5Rƛ I< uIh #IuJ_FCQd [8XL˨Xȗ&eP09Ri*x.Ghʻ[m Sw4ɭOpw[FA h`49 9ZWWWW9}+#)3_ XGsu4 nl7Xy'<f=l|5$ϝ|` S|7Z("cpc0~y/J=kx& ovo 6to9Qeus{}CA?6|}IcyMѣtN$ɛvd/Rd;P*^7m/If-E]ORU(4?Է7C&-p_dX"LC!/Իz/|>G[\8?Rh^%-D13&ظxx(7ҍǍR=`.i[K;i՘?8v/_@'Q[9HEƚR7E@ ` QR A`DŽygCU6`ᴅxIrBTA8HNyQ)X;A-N m* -&RǦ@A I@R 8BIg NPpفPH|vnZoˊU:iD*~GvVp!sd#jhm`:o2y<;Y*&1bpqЄ 0褯N0G5afL u^|\P|=X[4]ҵ5 mmv*I(h:B P2< i@Bݠ]7(M~ruDn{=UT@PuAA:tQ?}hQ&r--We79vuF Ln\ k#EV_9Zrm &p2:M3 ȼ̻+ s('9dӞ8[%$LlΘ]}䐮/̡VCX[ X`:]=ulwmѴ?+fJQ^l~ \&^KChQhZN4"LKj>Qhrgwp9[7xf݀OO,>[ęc;r8v?]~̑ck/?>Wv|5{pa}Z6'^n *4Qg!WW]jZ=g$ UdPfkmۂޓ_vLC'˖J+H#JpDI66a CFfɾj?O? .Y._INYS Q$ŒJip_z==̩0[8+T;MZߦp{-k>/P&TY#QN`T QE392N͂j~,ܡ9YrZdm=O/W{!{YmvѺk %7J;/5= gw:Gq4oEMEk9agYW –InZ,ogy~Y5+"kb,7ʌیIqJԉ9`r?wρ7_g==ְ=!Wd՜ 2-Iᰭa3ö  JK Sgq iaq*,Q ڂY$NIDÊt@rSavF<ɰas%J͕ +YZ"â#!#-CyGKL-Μ`Azq{%aԅ\ڄ-Oxdu/{J;}gˍųI=G7ZZJ[Foi^gرyFO\|-~e t -#?\sI"<<9Sqj)6:q\!XjmC,P87:c12 _\dlcLӥI6M҈ΣěX.V"G+tgz@EƢo:hTGIZ^i҈KI-.%;%{#Sf௾dKm deG8T1J?L mh`U "cD`X'C',~3^{}^{=ũQwڲQLwWi {Ӵ2K rmf#+ya Mw%{>-I-$IRGzfGH_{zz"<]={=޾ǘd'A/w܌.2?d~Ay[X++h8 BbɁVsD~h!h#=;V.hlj}VdŢ'zo+}[|ǎƃg4<шh)g.͠5^|4S4r Uo ߐ5cJĎ9R[q.=;eVˮ0w{fg;KC;|oClۢ ?įĮtzUmV~}8F Yikn|=6-0j{T'x?;T[E>#CTc)v~2]Qm|wT;(]|T{_MF{:k%YY6]kF}hZx?n/ Tt~*Vz!NZC;h%9?2}i+}|}*2+#ةx𝎊wȩA<-ݮ)G";K4Yx;9񭿰Q:RK;u3gr\(#].g(u7Tf,Ld6DIdAe~PI4EUʷXV6w/ƷwwؗKH1ӗUVy~k_bN᜾s?9 $1ꢣH_PQXFpEcW FpuX `t>O$JF4d,M{]o;&ʏ_hɾ~FJJX%_}4Rr\)L (2L#UM-hZmƫW=WEW8+}[B_4ȱ0X}|UZ k v`5|ARݰ-bh,-:J8FX&6'6٫Pġt/kYMg0_ɐ`J *F* * +&Zc_hy !X@}<@X{NsJ@zЩr}~K#X$KV?c=iKJz {":HI> ik4@sooo/x8igl41AO2n W|aȮVDVdT+7}Wp̶Hp;DCopJSƨ23b9'#]\0@Ca~{'V(1Q-! D (T]P@DB! U죙F[k'F+[Wt8ۻـƛFt1"2ułu SwL]c glkgxK-Z"Y9E?ՂXC'zNeC 5h 0fi:&ԅ2:\Ty=NfoyC/Sn~9{wLԩ/%)b5|FaO'y>  -VIh_1B4K:JC$8W9,P 7U8vͅ0@$+ZDjCRēcM$3 KV.r3id[d\wJ׿cZRgWz+9*պk:ۤFe(=*d3ɥ zR!k`֞?tzigct*CI>v bi5-i)|pU~WiuEU򼢧rJ:UJHyg;)sO_0o&ii.O2@uޞxOsbo7dBmN } V09t ٽF{E3'6Ű`LchpVO"y0aP~"]ð5wg ]Dlk$۽ҥHfE®芆(a+O{nluì hJHd4.&c}2ј&dt$?aF|4?;4棱1 )QX9!+'$O)BVQ L L LT L#|l>&(ڥ``A#` ./Q[2LmzW*U妲=Kݤ(P-R\b!mE+U5_UO7+勼>x=.bRcQ[;lSkG,o{&o5vUXqfh.pla Gs!6j.B`b7l+y-A{2`eVׇ|o|RHEܾbni^K킆s[ =:ErfM[?5|ߥ6f.Ci]bwj9m-n--M^(͖~TTInvVr*#j,Se#]IkF7Źg_bĒ*h#AE<ɮd%UElqRK)pFa<&+@u&e5EӵԲjmHGc,=z&71WmU4W=/{ iPiQbЯ0 JzBXI__{>EjA>0b&TcB=GOx"z֭WI)0Ƶx~Y9!ƶa%`Cf="q;b$.SB|J;viiVItCA;ɶ.serZd2lz=VS ˍj6娡a>h>:D h{FUizi.rQm4TVo sJ#=*?i7?O6NyyVY!-Ή- O^m/Ü"k(X ۓ[Өfjp WUT3,i9IaVnhCMXdXdXdX`{ o.4 䞮XT-Hm,vV;m$~I]KB(gCh{0M.vݬ֫ߪDۭ^B]Zv}vc#̞b[F]̊`vn&ħtxUiֳĽ|gVұndLuIK2W$/s!xV#9RT Q rgIgeT9*9Pn}`EJR[OVdאqww!?.#]ThN_B|~^mF?}=u{=x~6,@ QVeu11=>m)K'xݣvlWRKS,EUڀwA zl/ã=mߌR"wB>o_GzT:c:˔b+(δ b8}888p9##c?TTwzCu]p?Ͻ(@cy(ԝpLT0Xdb /3}C1щPxoe$)rq<@ӱhl {C`gq&a bX@ o `V/֜/B-C8#aCRsM;w ك`Go#-KYM/c)5LPQ|Ωu.~;x m;GQ/R 0! ̓&P|QŇ|sXCbzF]Vzqi<Wt5=E ͿiGiȎX2O@T[)GDQ1\Kpo(Eܗ Ʃ0xz)g6iEŎK},uLT%Gu0ڗmjZ)mߖjX~fr%=zt ۔HrCvMi\>~]ZK ._y -BCZvMފ* r R00F9<ȓ\0 c0aOFa ,sh胫UYߪp'=IQ`FMeD=)XV'!j.`i*)RzQ>H]Huq0n?)\ޟX_p)y7_JʥOӒ>H3\]e J +Y%pϵ2\2U*Vv厂ݚJ潚$';!pAY:@'g3n3%KKMrZNk4)\;*NHkգp#}Ҝ{l[^Q}f,7Lr%;ɱStF5Lm ۯ6/ԛX+m4A wm$LW|:q[0ܾzTސUB[c.HdRV&w9D^C1`Ү"bF໷ѹlt`sOGO'1bN(c`6q4$6V[5`I&t(z>ZۡJژ״4aCM @z%{g}Vh9U?Jr75}&3DIW J( H%װ):ە+gi(Y%*o ؃v0Ɖu,4L:&cy:cy:a F ? Pè0K(;6rgΝQ7 3.rݐqlnjGL'1() )i+("dgtD[ʞXk*;&y{vm9f[zmVɪ5IW[(D)eqlzzRfWяq{Fy4٫ԑtAIN/,v?FO'UoFcTm\Rf."l2{B R89B}Y~D^ tK[K}hW{>*o{EyiS۽~tϘKG=nObd9.Hv zDz[O.-4*."r<殭BpGcbtjkL}1"2RV6W-*a8eo("Rbt zc0A.՝Twb0#bt?81}1+d Y;Sk0k`kgn%![K8uCqYX>s8;kK5 *[,ڣ&l'{ZfyZ94*;>:9㐄㛥pۇ [>\>Ԛ`Yl,zf..D (K8pX©C($}%Փ4uЯG$FН4G= =F窚*sy=2QS$H^$/$)5B \!_pp;Q6bf(FiV\BW/7ek$uS/R/GҷϕRԖfwִL'mI#q!IRVۮ+]Gj=(Tu+饮aYT ~G,LL!o?iLe"q.kh)ɸ~K[;KeRkUҘhZr=н`=Wښ={ wG]'{̎c`1H2$Rq׫I}֨E Q!Ro0FZ-QԚXw,GT/6O)'ԥTZ}~XA@F?Q%e]ܳ;}#Dql,8'OX^ ݆7/J&8 dp G 3[L m-L[yVkwXǿFI@^zgEE xi¶΋z $Q׋B^#ya̅q\XP[i"^f-u,-e)g#SL9˖Bd?a Dbd4ǧxIWoT,WjH\)+/HGʆJ<؈OqnB\E_a7FO%I.]'SrI$wCA)%]^墕yt"!4)̓XVvoYJT(MUr{;]W]u5ΆՏY|rTJ.R?RjӴ4}R^s'p"iK{>t3.bMY5Z1uA`sVUW\eFrw붂 FȀJưyq V@L{EahW"^a(D&wvގfp !]H,IgX޾ Am2".F)B\ZtFiaO Z{03 S/RG5dǖ 8F^#Ma⹜&1 810] `r#H J6ZPSP#bƋ"о^7 kP0_R&)e 納[Kp7 rߌ^b- |AV9pɈB߭Yݎ;C,EX&N 5ǯjy;D>.T&rPppX:pF}6᠗mwmc =H{9x|<^x,Mb @S戝G[o.G߆ J;NBFy8]-pvnsu)Mlh C G(E#dC)A$dMppft2躾DOw'2=Pl}^5Œ_|}n>K';0.|ƹ]x,)x2;r>Sٹx*"xb<7`e<^/+ctk>[')F~m&O lE0U3d<3"=j#Pl$fٗt=]L3FRX9GryzpƔ.Y(-)zeCN JOzLZZGGE(1fy&9$I.KɞrG4C[:&Mk ozx9t:}d 2uj3YtpЎX MoSxooԗ8C[\)egwpVil(qt:ձ<]K!.aӖ39zKO;~xiL rR,=Wby4ǫxp2oEXòJX(KF7+ȷ$U鴑Q |¤*qE/g(U"h]K ]T6EEr7iF)U\ ]3@J".N[Of%5D˖tu<Иf]ٺҲ]G Hîݥ+O:䈒 jbX,hO. !М9.v pLK$Wy\|-$sVg:>Glw2!u AxF (ږ ~is#Vg<(3:cVNXPJN}n#`7۳Z[\TVWKx0reBK,ÓP <<ҋK ,gAUsigϲX~N􈇈 KNVH9}8;9Vve_Ǭv"0݋mt7Kv|\͊)-4lcї }Kk Kc J6c! Ki,˕ JK_ _.pǺj7e[x汗):\,*RF{œ4(q%KF# S62%RO2))P^,!++~FPJga%ʇR|w3#wZsj%rneCK߸6~.ٯy)nԺ }k8 ~fިW{XoNQ5BRk>pmUX|ҟql [YIL@lg9Ϯ6yGrnT͎T]2#B 5إR>]-7*e ކFF`r]iD۩Ch~ օm9a|@ T(^<]V&J )4bVv -|}y=nT>iRz(xyb򱫵SyDnjVMkӴ6jV2fKsl{͇sqؕHiv^$Hz1tz p@v-05V4 C,Q8x83YZ pgtr#y/o!/#yQQ5">5nu(&#Wmf,G+ [QpN}1ɪiLGoV_Yj\&֞ [- +!}ifF F rC95a^x -OUvbi/å%vG-%RTtc~EW.uv]IA{X4',+Ti ^IeeIJEFRzRFӯlF$UxKL OkqV0֣XB ܗWc] R645T,9[W>UJ#^iRBطKdam^Kzr</8R?e*ˎ+G(<.s0a=VŜ**MLnVɢdѳm2a> цģ1I0ͳ4$r ?'|8y#O{ijz!YL9J]ݩo}e:w PR庶H&sU_IzJ-Ж'j"}:J>vAV|m>(`CSM *@oh  {5[OsHZ<ݰcEE.kghJqhv]vK5d5{پf9si?Ǽf;l!)J9HS._7Fzr _+W)v$6^(]Tx=Lc;]ByѻP콒%%RQPQ~%R2GjHrZrIKGBu<Ŷ Ī]CPfx˵JeuTuiyZg5fe3sH7,KM$[=!eqaW=@dK0mmmQZ>H!A;bnl'|+*$3ֹTrXh( @ B"`1!pOH)?R3cC"QnF'e$pZfaEDdtxι(;32ad%YM V{X>$'G/E@i=At Gpԣg ȴA-j 5opߎ!Bx[0D;BF6Dӣ,62|\^Pgѿ,{i)]^quvO{WJerIBh6mC#Q0򬒪yr(2.9O+іCԩRױ1 7wgJTY'˵,*j 9vyP=iy+"/*bZϭ99HwxO}!A40륕pXµ5ι3C WK܆! Ag[%!Q/X n|fp}2Xf;"bEcDUmp jE?Qhr @0 0*0Cm6>ǂFr'nu۝ci :ll_T7HĜ!isWv_ 7H rl`Vif wv6^KS3 l8s6kX/Y/_?t q͙?پAE8"h 8q8DB"!8A S2)ghO٨RY{"Y{ vl[ѬZ."^fiz8֤! -k=`=INq-r_%֪$-ca=: QD35ՍPX؇=C+w8X폫4K);;$Ԗ%&^ (*ʏeei^>'jvP5:F+͡2d.;;2Ԗ1J9"s3IT S6Qj%ySe3?N1Hvb䈗/5N ~b4˫ V^';A&a7;;:C7Œmkq3_2Ę$;g'Ɣ1Hs*>?N:Qh'Fxb|RQ֒ŲUAqDcQ9='Ki5"ZkrWj'6kgHuh->ح,cQ `kዖ ww o)]hWmAtI-hMx08q+cGl0%|kNއLKb* $sj5UALgApJn57վEe|w9*HC_T~t\7g <*pbLKԹC+)^Ku&kĊeי$!A-/WZ,3G(#2E ybB֛q!gAKU)N+ǀ#Mo)WJ,[V|(B,-w~.,8$4B~Q+}[]=捗˷(S1rU$GI u.Mki -JR>ay/;')w_u4L*C?ic/՝CP5OFk۴G5% pPτ3kz~XF0Rq=rs,>WTz}_o/wjl6^[u13vow-]3}|_R*J+^1߼*WTfŭ+^X[qRѩ""MI!F8PmT\mReZEzHrYvVd H54,Ԕ8Wk5 ,}'(Y;MF5/?Z(W-B/g+1S~OPt fn0n9\f~:J̯o󄔺P[5g[Q^7R=(S_Fc9M>>:zuRY ;Y$o+UEK3%jC?#[RVҽF6=ձ$jx{׹lI]6A*k\yE٨Jґ&j B\:jڤ,J^ΒkZ֖k3 -0{̜7Gkkw`+2ow *^kTÆ [{zWk8Jgxg;=]%} 7[`lHݬX` I b8+qOοޟIT& @5wbV;#Ik hbLD K܁oVLF|2dg 3bYffC"&ĝ]c31W7D>#{ q0lGa8%#>23yn&Ff68{raL4#{]0Nn2<8 4|M&FtNyTً/;Fm IzE*+O)k/GS} za _cҧJO;U=tcX__a,Ukm%D"Wz*̵ Nc;v t׹ :=;6*Vp4[7D  '5p7@ȃW 0G$]="JD vpDXy)` -(_QvxiLg:L6'>5 "/ӇIrp&8$yO5 Ë~22^bEZMK]DII"֭UOe8ke41ݩحwR}yNLҒYJ~ j%Leg<e%5X[':=󆴖\$k,mCcCBɺDrC:mH&*$D煺|jkyx yuC.$g+8A5΀͔Cm*7[uk\[ҷbkro awwE[? >ޫ{/q,nqq=x^L}zq+Ư53'.DN U܍V]L !3e]yzE͌# F4xFs\{߄<<<.Tp@oB?*DuD OzV4 A]NU[d>IP׀967Al!?'>UmQm='}@4x)VWWX_6?~EFtkzg '%$ܜ˞eq,SǤt׉5bg]lWV}Ucv϶K/"iMPz-њЪ#0<~^tSh5QR$^&'p 8>kFבoОof1ќj]bLXMb_fŎ[c'rb̃Nl8̩u:YdYI5h%Yӭ \|c7I?*Z|C~ZD݄HKr=f>r+Lj8-erIw>B :Z,]>7yLەIvZ7RPhtB,O :!p'u3D `uq?qeÒ`<*-@0a ؕؗ*%,LeWc{K!9EmLʓV9*2e.UD5)O RzEH#RݙdP؛WtpX6" )cu1p++U% h*8?`ey;DuY̖dOrmlJ"h9R4SQ29rd{ٔMؔyM"ehUa9%yq? 'b'B>ݟtJk)$gZ)-ѸPUI7ņv0Y,.qv:u6ڟ,%;Gd=kgVԢ&ľn$˥kڙ#3I OI gɯkoϰسz) fr#d/{ _h oo9͍5NhxH<'6.B%#W+6ߒ=QX5 lnbYq $6?_s z/ -[J@|6o28ɨ{$<$ْF U"\E:,I9 ,TQu] @},` jz=*^qQ(j#b(*V2֛" 'hQ,NC1>F_%7r7%`ry.W{-Yw6K*5TrYMb O{sita:fY,dIݹD^ ]LJsd3޾z2T¨3/s;I/wuwH9dZU(Ԉdso[SɕVK;O8sYlc9o~VGI*Ҵ b<ێuqL]@#u:hVKE'c<6._l!פ+P olsVI\.`ZAW]u>Jeh+ CwcGXjĽTy\JF\g0 #**{"\1\G @Fg#г |,(f]) \D9iǡr#GUVKKXՑI X|>XC}9J .ƺ;Ec_&ywR_qr3YwTˬ DqO}LOL*O){W9ko:Ht솞&aFɣވ;iYhr:ΦǝΧFoӻK^G+)W3t' P2K'$Z1MSbW>M $U?=]_+\볡0/W͓  .]vI9; ֕Q{Fm=-n$pBLc[?pac۽b4PK!C}jfont.npyPK6vedo-2023.4.6/vedo/fonts/Bongas.ttf000066400000000000000000001022101444463326400167310ustar00rootroot00000000000000DSIGFFTM_zGDEF)+zGPOSD1/{ NGSUB\$OS/2\hg`cmapu#gaspzglyf, cxhead6hheaVT$hmtx2loca'n hNmaxpoCx nameƄp0postc vpreph `B8k[(_< L,\  &&@@VXDX2  #MYFO@ R XMA\Ai9bdb!)Ay&D"20_ >V=N6,2&AA{AB" E7GG(C!Y<H0 3 "A " >6('uAuU!?b o2C;@<-p9-+[(npx#X,4 AU&b^s2%A{D"2-I Ayl-D- 2z----GGGG!!X!!&  3 " " " " "A 6666E!!!!!! !b oooo>p-pppppA{p((((x#?x#b b (!!YEYC;;H@ 3-"/ > >- >-[['X,_kxiL.$3 ( (&&NW"G^#.0FA{H%AKGAUA{A{A{ 77--*\7\77v77W67f@&~ )58DTYax~7    " & 0 : D !"!&"""""""+"H"`"e%  '07?RV^x}7    & 0 9 D !"!&"""""""+"H"`"d%njW%K5c[޲ޯK!   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`absefjyqlwkthx   m}do n~czr{:hz.BTn0V&D^~,H,b8^~>\  : \ v < f . V l & L | . V p 4J0n2|Nb Pd Fl$XF"NH~P,ZZ,~F ,R.f  J | !(!P!!!"*"p""#2#|##$$ $.$b$$$%,%P%x%%%&&N&&''F'v''(>(()$)^))**&*>*X*p*****++B+l++++++,,,@,v,,--0-F-Z--..N.f..../ /F/|//00000j00000011 121J1j111A7&47'64'^2 w ĕ4d%%Q7 '67'6%l\l\ ug ugi/7&'&'#67"'67#72767#72767636"636 qD<8: D<68 t "FqV+ )X*V (V t D&!DB# {@nsn?c^N JnK,nZZ ;l}!VA9*''64&"'67&'73254&'&546d6Fq ( TLD6 d XC=T4%$*KisO^&>+"*/03OxS9H E1o;N(]mAY %,32654#&462#32654#&462#%'7*'@HK@R2`*'@HK@R2M@t)N%D9%YRdrN%D9%YRdr(:'.&'#"&5467&546267654&27&'Li9Qi><7dK#? 7@VA@ *m$ /9+%81H7SC/N/]E[^CSF!1*<-P-= ,5Q5Q($@,0,'6%l\ ugd G 7&547\aF5`$0ؿ.*c6T!  4'7'6}\aF5`$0ؿ.c6T)7*67.'&'>7&"&4762&'6 3<&(Q-L7"  4?<>9-; (+(Q@!C +".3 "K5V$"6 @&#*s+m,$M,ddL3bq0W[oSJF>62"''264&"'6654#"'zazZtd7#fP2N-"iq'4Y@\'RQ4rn -=)g#O $>_%"'47#'&'6367#fw6@4xk2:U QQ;irN GsV"2'654&#"'6P_fx;* >:8n UNFl2P$ ./$=2"&5476676264&"+>^wg4/--0D&=-!8Zq~h9LB ~?NDY*N ''6 +v4Yq  l6#&47&462&64&&'664&vPAzc])3v1/ D0 .!+0%!jH<|w>`GN1H|n(=,-;#,1:8 051,7"&54632'67'27654&"McVE:%_WF//;-D?%qN`7kHCcpn- KDX6!027'64''64'    #m$ LQ&#m$ LQ& '64''6   D\#m$ LQ,[S 77$7$ $mg}aKr;oJ{z%2&#%2&#{d\Qd\Q x c x S '67&'7 gmg}aKr;oJ&2'&4>764&#"'6'64'MX# "-U (4' /e\^ w cK#0( '0& =?;+)cPd%%Q"f 1:".4>2#"&'#"&46324'3264&'&"327&"3267=l>Alj>sU/E 07M:B ."&62264&#}@7R?5'"]ܬmqpA &624&#"6E Tz7" ?q= Ǒ"pvjB"&62&'#327&'64&#P&<"%# @7) \5'"]ܬu340*mq--Rp>6'632&'64&"> nwXw[_`?Vh1P0 x;4pfvmrG_ךgT.R&64&"#"'&'73264.'&462. $9&PP: yLZ=,%aE'(2T.5zs1B+8$F24.14ZkL7R/d[q6V3\{\gI 4 "%&&54654''664&546794cxL4'uD=VVyk(1snQm>m);fZyd B;YL// $'6 P 0 m"4654&'756654&547&94cxL4'uD=VVpk(1snQm?m);fZyd B;YL//U62327#"&"'amw%X4XoU>?/pq*9S]2* &'6'&472 w C4d%%Qb"64&#"327'67&&4667&5/%7J+B d .99,d*/ b,.6[i5t 3? <*V}qv<:R`X$2'654#"63"67'667'677M=Eb#+IBm;+ .11 /$H-kQ" N_S5n eC9N $-T%77&47&'76267&'"'3264&T G'`*+3-64H19iU:"40U53 03&Z#w;K0>1-%0(a$2-l4iU>"$Slq4edH$75'7''7&'6763"63"'&E9 v$1 BI xJ=5o)5&= F'W0p D ( D P e z~K+KE> $ '5'6QP P ];ޜ@'36&47&5462'64&"#"'&'73265474'&'6`3)~s| #5+_2(xTS=2aH8(r d f6/8]my,)%9,/NQeCV9+4biF9B/{2:, 8+s{'64''64' _  _ T 15T 152 -#"&6 27654&""327"&46632'NaE2dux{,!-iFP Q9 / j~fr]ܬ,W~y2[FHLas["$B f62''"&46754"'277'@i2JH3X:+ US!{MP|.U>.3}' &'67&'6i$:.5`C@Mi$:.5`C@MZ\iD)Mk`Z\iD)Mk{ %2'655&#{dT x@# @$ %!B"72&#" l 2 &0#"&6 27654&"'64'62&'6654#"NaE2dux,HP_00J])/&~fr]ܬ,W~\"@9D=>G33^;# R-f72&#-3,03{ b  =264&""&462_!?+!@*\O\O ;@8DiK~hKyo&"'&5'676762%2&#5gFtf Ft4d\QTJZ U> x \K IK x -?63&"'664#"'6769z"K!bU&BrHB)-=,DXJ13Q:0(-}2#"''264&"'664#"'6*BJ #`@# 162=F!1,A}8'9')=AR" @0!$B0'67-qG6_9JY '&'#"''67&5473267&47zc 74 l t + ՞i *+QI + q3R:< '64'"&54!2&''654  P ]Ebg2 P JzsO7 Lz @2'64'  #m$ MPz632"'73264&"'67  "3B9E.#*Q/+-%B9- '&47'67 d8,.{Jf77!'5Og3264#"47632#"r b6->8B;{767654'327&47MX#"-U (4' /e\^ w cK#0( %0& =?;+)cP6d%%Q %''7&'7a&?p-b_6G  Z3992Y %''7'67a&?pF-qG6_  Z39JY %''7&''6a&?pMDF:422:H  Z3U,.#,+Q %''7"&"'632327a&?pf:;8)<(5<<  Z3[G U  %''7'64''64'a&?pW _  _   Z3T 24T 24 %''7264&""&462a&?pQ))Fe=Fe=  Z3(',&0J5XJ5"6767#'&''6747qaLhCWyUtu;z_Y{p< nx5n'4d 6"32667632"'73264&"'67&&5476632'4'& ,B\' dY "3B9E.[`:eAP$  ?T-0* y*Q/+-%:,rEY56*CM !G&763"6767#&'7KqaLhCWyUtP-b_6G{p< nx5n'I92YG&763"6767#'67KqaLhCWyUt -qG6_{p< nx5n'9JYG!&763"6767#&''6KqaLhCWyUt DF:422:H{p< nx5n'U,.#,+QG&&763"6767#'64''64'KqaLhCWyUt _  _ {p< nx5n'T 24T 24 '&77&'7 -b_6Gt Iw92YXF '&77'67 #-qG6_t I>9JY;'&77&''6 0DF:422:Ht IU,.#,+Q&.'&77'64''64' & _  _ t IT 24T 24 $2#"'67#'27&'6264&#"2&#u@[v  &a;.[A-,#',eyl"zlaU3!'''&54'6"&"'632327pRucO7:;8)<(5<</s % >:B .G U "&62264&'7}@7R?5'B-b_6G"]ܬmqp92Y"&62264&#''67}@7R?5'-qG6_"]ܬmqp9JY"&62264&#&''6}@7R?5'DF:422:H"]ܬmqpPU,.#,+Q"&62264&#"&"'632327}@7R?5':;8)<(5<<"]ܬmqpG U " &62264&#'64''64'}@7R?5', _  _ "]ܬmqp9T 24T 24J767&'767&'.G`NrdHctBUE2`0U>ZpLaJtDUK.M'46267"''7&2654''67&#""=0,@;;?CM*BdY ,IdX3-C6T80(AGOmVh)N|{%|./!oO6726764'"&547&'7.?&  "3|-b_6G4R8.QΔ;NDD7` r92Y6726764'"&547'67.?&  "3|A-qG6_4R8.QΔ;NDD7` 99JY6#726764'"&547&''6.?&  "3|:DF:422:H4R8.QΔ;NDD7` U,.#,+Q6 (726764'"&547'64''64'.?&  "3|: _  _ 4R8.QΔ;NDD7` T 24T 2475'67'&'67}FS.tJh 1-qG6_Mz p ZE]9JYE2'&76"664&Wu =H7RǑ"Q I 14u &bViB2'675462#"'72654&&'&4654&#"'&H  .\Y4A I/C#,-J  p3Z,xf6M 'A'GP(G $'#hl5@`T !Z"62''"&46754#"'3277&'7=TA T/b@yO&\Y&/0-b_6Gumqз AzXO5" T'92Y!"62''"&46754#"'3277'67=TA T/b@yO&\Y&/0;-qG6_umqз AzXO5" T'9JY!d'62''"&46754#"'3277&''6=TA T/b@yO&\Y&/04DF:422:Humqз AzXO5" T'U,.#,+Q!q+62''"&46754#"'3277"&"'632327=TA T/b@yO&\Y&/0:;8)<(5<<umqз AzXO5" T'G U !Z$,62''"&46754#"'3277'64''64'=TA T/b@yO&\Y&/0* _  _ umqз AzXO5" T'T 15T 15!Z$,62''"&46754#"'3277264&""&462=TA T/b@yO&\Y&/0"))Fe=Fe=umqз AzXO5" T'',&0J5XJ5! %,462632327"'"&46754#"'%"6743277=Ty#(:7& P&+L#Fb'+@yO&\a#5'&/0um-()D1](0I-!.*-"AzXO5" TX: } T' Y064&#"327632"'73264&"'67&&547662%7J8_ "3B9E.5E GnI ,.6[i5*Q/+-%@/ YOba5DpD_!'727#"&547662"6747&'7&+L#F+?V%KO0 P%#5'(-b_6GHI-!.*k[hZ/;<&$0'(03X: }92Yz!'727#"&547662"674''67&+L#F+?V%KO0 P%#5'5-qG6_HI-!.*k[hZ/;<&$0'(03X: }9JY_!,727#"&547662"674&''6&+L#F+?V%KO0 P%#5', ''67Err&-qG6_ 9JY '&''6ErrDF:422:H U,.#,+Q ''64''64'Err _  _  T 15T 15s("&546632&''67&'7674'&#"326szM F*A4/5X)-. 3 &%.0xY4~f .'9>0 ? !!8cr-$2'64#"'&4766"&"'632327 u !2u J ::;8)<(5<<t rM)k U9tG U h 732654#"47662#"&'72*!u&IZA!YP-b_6Gq:6]Y-9)"COmV92Yo 732654#"47662#"'672*!u&IZA!YP-qG6_q:6]Y-9)"COm9JYh "732654#"47662#"&''62*!u&IZA!YPDF:422:Hq:6]Y-9)"COmU,.#,+Qh &732654#"47662#""&"'6323272*!u&IZA!YPB:;8)<(5<3267"''7265"67&.'I.?' *(2"Y*6.!9/ /"9- >1z]Z9*)1"9,7Om)VmJQI4ABV<0('&'"&5473267&477&'7zc 7oBt + -b_6G՞i *+QLC q3R:<]92Y('&'"&5473267&47''67zc 7oBt + D-qG6_՞i *+QLC q3R:<$9JY("'&'"&5473267&47'&''6zc 7oBt + KDF:422:H՞i *+QLC q3R:<U,.#,+Q(''&'"&5473267&47''64''64'zc 7oBt + U _  _ ՞i *+QLC q3R:<T 15T 15# '67&6''67`SWn%`p!.I-qG6_8W O ֫9JY? 2"''763264&#"10/CV"u r CC & &jcj o šjN od,# '67&6'64''64'`SWn%`p!.< _  _ 8W O 1T 15T 15 &"32667#"&5476632'4'&''67 ,B\' g\lu:eAP$  -qG6_?T-0* {~EY56*CM !9JY q 64&#"327"&547662'67%7JQr[ GnI -qG6_,.6[i5IVZ\ba5DpD 9JY +"32667#"&5476632'4'&7'&'767 ,B\' g\lu:eAP$  DF:422:H?T-0* {~EY56*CM !U,.#,+Q `%64&#"327"&547662'&'767%7JQr[ GnI gDF:422:H,.6[i5IVZ\ba5DpDU,.#,+Q''2&''&'#"&463207#'&"3267w67!Y+2MER h $<)% |@ /3'''&54/67pRucO-qG6_/s % >:B .9JY-2'64#"'&476''67 u !2u J :2-qG6_t rM)k U9t'9JY"("&63263"6767#'4&5264&#bbD4wePnFZUt5X@7R?5'"]+{p< nx5n' ,mqp'(/62632327"'#"54732654#"%"674RIk(+=7% P&+L#F^')4&O2*! #5'9*.)D1](0I-!.*$)]Yq:X: }>6'632&'64&"'67> nwXw[_`?Vh1P0-qG6_ x;4pfvmrG_ךgT.R9JY>  6'632&'64&"'6> nwXw[_`?Vh1P0q)(4 x;4pfvmrG_ךgT.Rv$C3f 1"'654'632&'6*tK 12)q)(4ijFP bi$\ Z$C3f>$6'632&'64&"'&'767> nwXw[_`?Vh1P0qDF:422:H x;4pfvmrG_ךgT.RU,.#,+Q?"'654'632&''&'767*tK 12)HDF:422:HijFP bi$\ U,.#,+Q:64&"632"'73264&"'67&'73264.'&462. $9&PP: pJ "3B9E.uRaE'(2T.5zs1B+8$F24.14Wi*Q/+-%:*/ _  _ Mz p ZE].T 24T 24'762&"'7'6%'&'767$v]q{Xg{"DF:422:Hzwi,uWU,.#,+Q,Z6232&"'677'&'7677P(XV0A? >d[q6V3DF:422:H\{\gI U,.#,+Q (2'654#"63""'7327667'67766W0=b 5; H']y.-#) 1: vNs7 ;O(3:]kJQk0ZEAU/V,E!M6I%O6'64'+ n Q 15$"4&"'67&6267'&'65S@Bu!8D7+)2[jO~gfrQ3 j [;ѢU3 j )/l'677"'64''&v*{y3 rF# r ce `Sl eRB %2&#\Q  P % &!0  P  '6Ufv) t$|('67fv) t$|'67|fv)l t$| q '67'6Ufv)fv) t$| t$|(x '67'67fv)fv) t$| t$|g '67'67|fv)fv)l t$| t$|&|767&''&5#&TA?\ bS ZolB͔ A&| 727547#'767&'&''&'#&=Mb TA?\VA=]b%S*lS Zollt a'64' Wco!WK7'64''64''64'      #m$ MP #m$ LQ #m$ MP %/8?32654#&462#32654#&462#32654#&462#%'7*'@HK@R2`*'@HK@R2=*'@HK@R2TM@t)N%D9%YRdrN%D9%YRdrN%D9%YRdr( &'6i$:.5`C@MZ\iD)Mk 7'67&'7i$:.5`C@MZ\iD)Mk'7[M@t(G&"63'&76"'654'632&pbpDpY*tK 12){n wjFP bi$\ (62'4#"63"63"3267#"&''77'7UjUq8-ibrl|cOJ# n5[i *! :xN WN; K K<3 fD)D^p &&47'67"7'&4767'67#'&&'/ 5 N} ~OV?o&B@,hm60G6S `+<]J#o!2&#"'62#"&547662654#"#>*>Q~g2.Q4^I0J%*@*[PEte^%VG"&53254462'4#" &Nv;S&Nw:SyVJ.xOmRJ*dU_!62327#"&"'62327#"&"'amw%X4XoU>?/p mw%X4XoU>?/pq*9S]2* q*9S]2* {x%67&'32&"'7#5277#{J?0_!&E?Dx9\Q!4'_5X.Tu8c=A)8x c x [A4cxd{q7%2&#7$7${d\Q 6h n PmXb}<>Ro9{b7%2&#'67&'7{d\QF h n mXb}<>Ro9M  ' iib- Hc7 '64' n Q 247 %0'467#""&"#"'&546322632b@_7zN,R=Ahwd U#XkDbr7.+R>i 8m Vg!"P?aq4y/.462'4&"63'"'&''67Gl[f(C,QPrrd< u 2xf )2ZO S K Z#46327'&7&#"63"'&''67GlY?-av7$,58E' u  .82kR h7ZbV] Z-'64'  'w% QX-f72&#-3,03{ b * '6Eq)(4=$C3f7%&'7%-b_6G792Y7%'67d-qG6_9JY7` &''6DF:422:HU,.#,+Q7 ?'64''64' _  _ T 24T 247` '&'767DF:422:HU,.#,+Q6264&""&462|))Fe=Fe=&',&0J5XJ57 c"&"'632327`:;8)<(5<<YG U >! /   -     B  A  [ ^{ & & 2  1 4QCopyright (c) 2011, John Vargas Beltran (www.johnvargasbeltran.com|john.vargasbeltran@gmail.com), with Reserved Font Name "Boogaloo".BoogalooRegularJohnVargasBeltran: Boogaloo: 2011Version 1.001Boogaloo-RegularBoogaloo is a trademark of John Vargas Beltran.John Vargas Beltranwww.johnvargasbeltran.comThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLhttp://scripts.sil.org/OFLCopyright (c) 2011, John Vargas Beltran (www.johnvargasbeltran.com|john.vargasbeltran@gmail.com), with Reserved Font Name "Boogaloo".BoogalooRegularJohnVargasBeltran: Boogaloo: 2011Version 1.001Boogaloo-RegularBoogaloo is a trademark of John Vargas Beltran.John Vargas Beltranwww.johnvargasbeltran.comThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFLhttp://scripts.sil.org/OFL_O&  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()uni0011nbspace sfthyphendslashhbarItildeitildeIdotIJij Jcircumflex jcircumflex kcommaaccent kgreenlandic LdotaccentldotNacutenacuteRacute Rcommaaccent rcommaaccentRcaronrcarondotlessj dotaccentcmbEuro incrementdotaccentcmb.capNULLCRmiddot overscore commaaccent grave.cap acute.capcircumflex.cap dieresis.cap caron.capring.cap tilde.capɉo1L % $2DFLTlatnkernd-J`nv6Xz<*x @n \\ -%&'(*+,./03468:;<=>JORSVZ[]n~'+.38=RSV  %8<=n~%%n~%%n~%%%8EIMn~%%8n~%%n~%% n~%%~%% % %%EIRSW]~%mm%%%Y]n%~%%%#%EGIMSVWY[]n"%%%EISY]%%%EISVY]~~%%%%%%%EIMSYn%% n~%%X[]n~%3333%] n~%%%JZ[]n%~%%%%%%%n~%%%% %%n~%%%%%%  8<=n~%% n~%%%%n%~%%% n~%%n~%%A UK#KU n~%% -#--%8:;=]n~%%%.8:;<=JRV[%]%%&'(*+,./03468:<=>RSV]%!%%&%'%(%*%+%,%.%/%0%3%4%6%;<%>%J%R%S%V%[%]%%%%%%%%%%%%&'(*+,./03468=RSV[] ""DFLTlatnvedo-2023.4.6/vedo/fonts/Calco.npz000066400000000000000000001777231444463326400166000ustar00rootroot00000000000000PK!~#Mfont.npyMy|7H d! b$ -K-=, aSF@EE "*** 墢rEŝIy?&>U3]U}:uj<\6v}E' 6̠p~:=r?ků3cւb>3/1gzT ϼbvcpolP_´ DQ D`@cLĘk-HEQ& ݰ@KgcL;- ď?~EC21КݠN$-옢LLRTQcLu)VJ@FKWز2hқ!w st9-'G\꧷h{VgKSRï{ycZuNjWuUC"g[Gm|m|}˭W9뼽V5X7XD.c tZ A CG(J-%h,q@[(-)i+5HR&M4Iiii*$i*鐦*m!MU2 MU2!MUA4Uɂ4Ui iiGJ.Ў@;A4hgH.vthwH]]u^f|g@Y`)ˆ~[*ѫ zg9b?E=_,J REwL{@F](m 79[ o\U E+nCtwj圪k ,=YbyWvlk ^9rqTi82 OⷨnҬOR)'5<@@g`uJ"ѤHhplptWZw{"F!״kZ!ϴBމ hq"ߤ 4y|ri@Ӂcwrf=!MM Lh0g`h`F~z0z|cdv{هuA=5-W]I],_M}.>hL29|ʷ,PW[q#oI,-gC ̧aNe&K֍=O~5f3z'^q%d:2ٝjß6d~\f2syL{"i\EMMratcǍu/'=?jd]AD I_wSN'/_SL~V_bƛF 44\ahs F8^( T)@m;gq8%p FZo’,8iaš͂|l!xCjrqGhuANX'Nkq@;4 u%-ԁpR|"VnnŐsB> `+Rnr h?229 -c|6h" 0 a`?rc# 8 ȍ5r5@'o,s'a5@C V6.OȪr>^zi@UWhZ@ 1[BD X 5$HMIh0e*)@/tЩt73Wӕ+LӁ΂tTlTVmAmrU,:~X\ (WA@Ye !]R(\64 00JtPg !` }~Ӆqؤg> Xt] e˸>W/jS#@%|V Kfbh= h+&6zs=WxyϽՖQ-zi2ͣ5i*NX26v& ֞Hv$&xNxO e3nU?^7!uj %z3EK?wEH0e׵U>7³4USz~W/R]fGD10;,9\qUyb\o ,:Wj•./rJ!*=В9:i5} ?Q"ߪM2"K? nڤR[Mz=bզosb~[=޿Rv?~9?ؿnyf9,٦?&NE94L}wd;˖iNMkXv3TDtֵ2r#% .,oFZ@@ 8ilhYPB@VAS" <X/;0A <mot6n-:o輒8?GΑjW ƿ8,KhSw*J}&Jm%:cErE-Zi+eG;d#;cF<.{xRT/hCkȳ IHYM(>F7@R/Fד:r>PD 梋Q:3rmbDfܓkOm:1Td:=8~mǝP|X;w]}^5q^c^>ivsw:Ts|;v5v;iђggEK#: KD!LDK OX)zi<*W} |8% .p1𹬴$2\YqW9oBs>'zWku p}S*wwGH?w^CݥNP npLPR#jm6Ji &l{(vj~;L ׆;Al6[6XA,]f(k0B;Ԥ =Csd1Z߭ok}ȄwH:3{fᵮ>we:̹5lW~}GF/x-ޓOcEr5)0iowg{ K>^S J~y;ڽ#{1:׼H6ZwcHi'C.sy̼硞]d"'yp"A4%8 k 'ߊyN胮>胾># P1ݦ}mW i_tE'j_ӾD w4}jeZ>qާwL gܐ:#DOFbG8/DN 8mDݦNqԉS':L?4.HQ g *83^@o׊y^rLJ 3ޭ(5yY%!^ ~B:@E-Q+r &c$CY$ A&h1T64-+j @x Cۂ+h6|2i~g^?=F{r_ ][Tϱn֬?LkE#]~X%fX2> Va=IUE+U?vq @N1GSt7m^eE|-_a1o6Mtfg6}< `i9l0GefyE B(# #YGo@XdHKݔrS"lO[#E1m,C$P4P+ k"F`2h C$*HIGCP`EG#PґǠ]Й)''''' @ Trv2 7f e e* (A(ݔ@3` vyj3W !W۹| 2S0WrBH&=Ē;b2Q uujgW_Px{ .ug7fkkK;h v/gȿ ' 9 >wy$c;',Mf_t Ff+?LjSk*4i[ayٝ]~2>eGe jk V.C}\ ZP 0>VE}8q\B+V.C\Z rj2 \ڹhP QCAA.tt ZW'<+p³r:P1Yi:X`.2ZfCl."u$ Tdd[ǦLu^üuOt*g&5N3L1Wbxv~/ubE:/gKЌïZb"9Ȉa_GsǔKcz;Td/&G)X*72u{Z7v_g:E+V/ N6yO|3څa^^;\-]EJ4Ж_yF;Æ:.eࠐa{`(\Br\mg.gs8JivCN@ z"EHgM۳Mf&=Itg{.{ uO?G0BD؁"T"Ti*"8!BC &dX/9I^7btVy2~"@wj}w'Ipekc{$B]Q4GO,L7qv2~95351QsY fJ)f~5/Պ7Ui>F^ ߍ$e"#i=^)d\O7"D> pһGի }~%2Ydw1X?LWXb'iarWDD@(F; =XO`]=2 Zh{3nb(Nbb=C[XbOģ5͈x4#Q1^*ޭx pT(#[tDw@GtأBQSPڡ`v8 [<瀲Qc͇9X 5cSsEP ͎"8h/8S"PQQQQQD8uQzFhor( -Ǡrȍ:Lr -Pr (Prip42˜fQEQg7& oHވX+| l{{3̯^ԄRTA'V3ouz,A#%x5!-+҃n,|}^yUY鲢G~JHm7ѫ{rOƸ0tZ} ~ K1l=-gueC}iz,0298zc ],`tve3Lgv1͇,^Ctf}X[ .?T%+$KԪ3|7$2eP7)t}; ^Upog0#DƊ\oM!?ݹ\Z.'k)^@Ix#t=Xg2FRH\D$pdSLMBſЀʊB#* o_'ʊ{hX"'ESA J(8@BF:H1f 1Cc# h`ƁYӄё3ِF*8@#Ёí ?_* WЫr%{3wm0@+`UT%U@y}"E님1/b^_<Adm.60T hbVCR_-Eh)GK=ZRt194T>:J t1c0ԏIQ:UQC: F."I gfp &: RL Bʔِ2Ŕ)s!eWCB8س^2js}vY5[-z=OϹ.q(OF5,Pe 癩tb(3DQ:[X?}b{v%oGsYcGN6b7`~=2(ac}hAj̎f/2D&GUXCm-}fB9Y |35Kvw;h7fАapkDF,sQEqWJ)D*)c7Lh?^P?]HoyXo Nރǟ`!cqA|/prs;iMHZ_;.^deIvmk1oQa7lTX[t-Fkt&8D6+2dMV'iޒ-m1%[2Q!E#ۡSyb-.W;P].+B|tWXKb(ZN3!PKт(EQ+EA+E+E+E+ABJMQ&l~ ̉aV¹a`=H .GY]kS2.[o?(,x#>B\vݷ%V)TOL9kC V>E\'BJ苑E1:*4ɫ@ :T Ύ*U/V 7 (dt4U8Q3oCoK߉~pWP#=U\GzR46\b6tWawi,s ypo`]m Rk7hH o>WKv<8\F;M (݄n[dvKX[|o}ַ**v}gߣ&n}R{7L1i~ y~O22wkeHGwcO7|eg7GVVA³䜞m\Ю 1uZ{LVr(?`@p#9JIʵZ\?fԐh$k"75zsrg&IWC7'pcT}A^;}uT 5d.]YIp"/e_L>>*h="̋TP99992Vi?S!id@S¢ԁ`_TT`\&,CТ0ޣP: WɎѸw%+ykqX[L*B:xq%x܆ T\hE)nbY|r܏LwNN^k_G><$pNAK#cd YO |=GoM6gAp; T2 Cr?xk օױ&\:^ l0[N^Cy9z 76X~HI?ֶ$0{`Է}ý}>}ծ:) | OW4}]}շ_5yE֓s C[t-Z_xs7c'1v ,V!+HvJr@Kq`J*AyξJ tL{^ۦW.hiHۏ86֙^XֱnƧ kV&$@[0c<D_0#t,bU'e4כUn6CWf?͏'syſbi:IMeÕ7{!M*o!fa)hF `EȠh)$[4Nk\GIFqt"Tg[%XKipiR; @Y[/%3kE̊ j ՀpAn8o9 Tnt w[ tSrw)l9E,U&t ŗ!7Mn30]A,Y@7N+)O'Ozl.lslY@x6n@0~9|Hgx6:g P1wvp]v}OJ(5HK'Y|Uii4kښtQG83CpWM ĪO٥CYip= H9BFJkE" ݞp Dq@BCb?7-}.oihR=` TiU|1=d |:NX4c~ZSw}Ozy_b/?d~]MDȻ O`1v[X| !6MD\ "9i[1B)%~4\` Q1hH,d"kw ܳJ`q{zɵ@AA) \iHv\0"[@.7xوs)Ds g.C2Wc;/Ž1ȸ}ѴZ @b3>GxrwU@9tAM~hTCR%Gm@ G.P˧> Q {`;7Yއ9gjɾd;YO~MB J&답xu:{sݪOvO֧.]Fj$xBПh ~uj|~RПo5Fb]0LyV{35y[̜n>f/4 L|y~`*JO'̏M0oXkwXPzmɧe8fs=w[ׇ&bOߵdc=nM`9Fw` \glOD~ /Mv!|K(o7މ8 bx( @-\%־ָZJ&ڠM68'dT$U6F8l]\W-A] !wEE -R O6]T>h@ZT?8Z+@18m < aWbbbbb}wtP#h uFCHUG4rpܖQn/ۋI%xB`DHFEZ|)$&!-"- 2Br/{/}-s{y6̤q h3> hGEjem3yw~ ggVzLY#w1zKmPRo7x}d*}axVlEw{SJFY>enuOw-`?4mj RhLjDAU3̢.^EE`_5̯*h^0ҷUΠ/Of nvh;У#ku)/kTyF''f04Ϡ 6hVd_QbGŞ={>*|bCsˑ~t#9A/Gz9r!0%XЧY8Gp g!CavPf]lw aħêu(IeĪ8X3jKa bo:!7B6ʼnXdxDx17 Qܑ排1occCmIs,1,*(uX:ŢqXx{s'zjZ{s67FN{ąnZ+i[Sik:5C/1 r}k ~,ŁdKָ P3Y  `Ãϖ7ӈ73GL yM[Bny'-]]i_(y)RhA-nq-7oYbb"YRyU\:gX^*VI`V" RE4-4ho:{Ӯ.zo&(V/ݫh+ P-o ! 4S sIo{Y-7cb[ۻ淇vC&wQwY~HDY䪴D3xV}VzzVskU #єjs+dC chjsMss'ko?m܇VކK4wJdelM K6WG Y!{-5+lA5@(=[~vU9._g>l[++ ߇e*&Sə/Mk#,9d':urz :tON/Q(}|UeX5,2:,dv/x?>ܱ^> X ?-<7, $*&QMbYnE[-x$1]nUڐ,ܶn!vI+b .b RqTTFRQ2JEew*@C r±'B xtf &c[O9(K0o "cJlWA2A$VLb%nęJI;Jf$PPγJtUg.B1a $88g⌢(nD&,5([䫭WH*MۣIuLU@nWbAV p&gL?}ezD#a<@a|y9̫62' 3y3hctv64= nǦ?j; 󸔟𜏵о":m%D (*,?Q8n\}OV(wi(B"IYfJîM{\T&^vQ:B.W_Wk%?O.c-*rPO '6r.;얽43W yV* 1*?FĥaG7cD(b!vV4T,Af2!:6JqaDl<ʯ1b0ۙBa\nu`H>oW>>:Y2R'u-|W@rz+0}?Ü ;-s|͓]'Zy1*.^:rqw;Oc7J\?GcG{|D't49=/Yda{Q ܑȿ_^w1N9! گګ)n4J;E1vkju Yp V2(k˙,-^KP [@@;,,,TXY.,te( 炲pSG/EH0 *,VtY}q {鋁}vqF+TUը,O%:*3 7aFJ*i|-иK^ 4[JP?BJxp.|-x@^|x5j@EK yՏ5Rk0إ7Qkj0ܥC]>&ƏQi(%4HpdP1=/`0&_0hPSa0Sk#+qmd%ĠJyJ%} 8K8qЮv_ ֝=OLL-\dcxn;-#T,'gҷq~ O~l[ G=Ͼau iMqPPVx @зGcC|&]Wv%PE6t Mݎd;c;߰#6X,pK9KpɨzQ'-[ NPЖIo0P3X!fd༲X!1"n k E'"y  wGϊ_+&B"!" q7 j枉{ڹwWߕJjW,,l2ɗ]-7i rL"hNQwgw?c]G^! z>?u/1na!ZBہu8ї t%Oh Ǧi2;N1zUjțB{W%hZvv7 Ը[Suk_{xthiڽg^4F; ={'i~ڰӝ}@}ygU@Iq%zH~IN(YD߀uï#+|Dc|t'ѝNqJ Dig"ka{RF[gLerqPv7]6YK[2B2J~>#t}Vw"IQ۫zN4mW1j V3x7xq}}ؽS ~Mޭd;v\nYv띗To MD[RC{8>% 0v;.Ž[ֈ _j@ q;"ntD!b /g6KC7drQv؏q}d >M.I._ⳜK|QQ(㉉mFٸ>.Jry-cčƢKZzg[b٭pD3ZGٚ K꒢l>dٌt*kVcyosݛ0ΐU\L4,S-S\[6x+)fzӰ(lfݟ'V[1A8"PS%>I' Cг3^2l-Y:eo%GvKc,ϧY+s=ĨT}dCR+&@(@rI֗uʼnw1O]A'l+H[ʩ2!wTqxi)X.c8]/oo0S$!\b'hOgV'eXe=d%X~ϰAK"Lm5#т zz77,æۛV!U7_i==VJTmDw5vX{aU]ڴ?8wc1Y"j 84_p(6޴aX;, R(b1Y.RfԿ՟|oApV5ޤ1ܱX8;,D[M ٙ2ʽ< XvMs3`-6ioDY]VWf4f$ ~ vo#b9>YxDPdA ЛoO x{~{T˰Xne3N{XG +aKe/I۝,˝N_-&k Yaӛg`37cnV7#jr6Sj|Bvx8i<U5ڛ1G;˝gob#{ocei\e_ #x6cduWcu3KSY\M.1^E/YR,Z;\b"XƲ#nMXۻ%t{ji,GwފEm۱;w_J,ۣUx{woo,v {Om~ި٣IU =L6al}J^;!-jgϽ(a\jR?tݬ~Vk`m1v,qW:iuv0NcQ7 )brI ۱60⿟>w՞rFF ډ 2&au)QWOiWC>?,`ܩ#nJ ?Bz`[XO>^+:|, <8?2 By $)IGJ) d jC(lrqE^*2L(Y oJÑ++L(ltn)hG9ndRC3RE貿#p޸HUBETdp_"tq[k9ᜪXU崻{hxU=~_QU:r!-Q! #al>z}],n{ّ8?;gGH:hC(}MW%_EyH35:@n٧c;wZgבZ~Vv f0A:>HjRifr6c 3Є.{x]2 4ʖő9~S]Τ9tyUirmvwyj+ t:T1j+;y 5qޫ=OzǪ_f5Vt|*뎽!Q}TM>KYW½ *WcϞmP~/S' lV ~.^Ȯ}vOTh3sR6a (3WDo緇?y^ NĠHow&}ޖ\Z”%h. bRt6*7IIGJG"B”B 5c (@IBˀ 1JGJGv:N;'qσ|y\D%te7ԙP'%Tz#JP{-ȥԝ%B0(L/څ%ٮ^鬱5>\;n$_Bz^oQWio]E} }W߬jTm֫PS3ecX#*ߛ}# @BH 5Bd_rY{f.eEDDDEDA@TW@@PI@DET]UM&9=3wW(M/Y7xMֺ$T)Ƴ̏edL_6Y&r>LkƢ4BkT3|Y9BW6bgiN>c _s6ψ|3?^mg=bh]5gٙ*v!ɇRX踺rՁL,M+)]Ü#;q71W1eT/Ɉ q t*"N7C4Dn-qcP#uOg`~R`(Ȇ kqDzaԵm0ǖ3j_gYy8g᜕'`[{yʯvQ$KP HEhc7c3젝 iZ lvXGX)fK;Kff@yw$-cO*drQ'(t3ݡmnw-2:%3ڄ!d2M67*UiGQO*`uH4,ɣPm,=uL2{B3Lvyvy 1lP.K]ΝVW89KQա*_Z|˹uwl~|VGEVbUǯӠWg#>WtEL'>|׎mk.0޶2W#YjVs [jWi! z@lCܚ-_+PAe+kH,Gzg\d\^0 \'ںž3[$2"jOWEXEi[,V,V,V!#q<[UD^D'ňLxg\±؍t#z'}·xҀO_JC=dݩ'3vfjv_XfqlPߤՓ~KߢߡSg=`lcֈ5A˜gT3NgTx/؆SY^B"ck4y"R$X֍#n"' akˈ>7_XEX<~b *bvM-Q;@fK6 7s @HG40؛_co#7H$ډ;с!iyLBjH(CdU~RG+!J#;O1)&byUT9A}Zܭ݇gwB]/F5*.+Kݝ\ozd?y4D'=uŻ7$Wcr<)ʽH'5k+hi>`3GۍY@w[=t(MiZ1yh>fgCHZ뭭'CAz-[{ݠ*cG5M `}>Hº:5Y;z"2uPl,O`,^jK-~ }sV媞':=>i3Yד ':X٠N[ջ5vM#%) kYeujg^y{|TBwr,9,ux{[EHf{h}ץQ;FWg4cxcy̅Õ J5| '$5TBX {T-;cTnնjpyZ*=jG>#<ɬsLaG&,"K igkޮPӪJOU=رSN xǜ:)>jCwQ*3GVe:8ȸʦǜ͋H?/!$).~4e5B(DFPCCnq(b7@o fb: cd&"J*"5|rmW806? Vg1Q$,B앍u 9x{n.8suŀnhou9IyG%c.H1ZV 埼Ae__ZЗ%m|`TJ`TRK`tQ+-eɣGbQXZ1-Z'#ˠ~28ǫ+DPdJ? ڔA2v\n3{8tbys cйЎuO8*Jÿ'q1D0ģxtbiI[n26pwfL7?LqG^f8qB;q/s |BhsBxp,AC.r,!hb/v,b#Ŏe>X2 8p[X a;V~5ˡ]']X. _림p>!dş(+.raKEY.k˓~'-P;C5,Ćt8ABj fT@R{{`f|M)ab*p%棱$XCm#kyj+[bt*?e^a >*Oݭ~s +@K:su =lj8X`Ve(XT0ƨ7aQIv LD AõDԃRp*J0y֒3$Ah DwcwEjɠAE*JrABDU}ʋjD6pOiQ:QTQw4n_XUBfwFT5w;1)?~]ߨ?"%ehq1x n$A$jGEjMd׷"kqI".Il-2I [;֫R'Yfc|غkۇ/A<~">~x|5Z^J.\=%yl(@SJX{Ͻn҅T+ )-ɿK6Fwѧ~6t?{]!dyjrߝ>|pL5쫴fV5:#V'|﫺Tu敚]NUͥ[ԓHrQ(G[IRws/gA /vW2,3;#;HTKuRmŠwm3P#$d#uҾa)YVHmLˮ.ArsjEy;ΡQ<>Co ^ڕݬXžiHͷ:܋l5ĨL{C{fY-I~O{Mz_%b.:Z- y %[}x0uĬsiaxҐƚb6E=6%vkLr9F;m0i+~9F~#wrW=Z.[nm0&Α]}Sp ᫚Eж}\2km=s ˠ:oFbbJqڬႢWr5I}OdRleS}KZ&(u rmV=d),GaFsۭ Ϻݺjim ;?bA~V}3$fߘdTQk8¾qבӃd @ݥ`wq2 /}PY%OэPFi!+΁Nuttwc/0r[һ6x8Kd,\Z E-] fLg?Y-_B4Ci:@x|Ayu~Ą=bg4HY3ϸg@qX<6 oGa{\BnK1ԩ=z#L{ ǣps4Mu 8 8΀7 TQhXc ߔUEG$ rj<CcY8 c 5u,9L -q>A͸xN< _Vk2Yg5GՋ,,(?:Azϱz - u/.&)#hmt: '`O3$&v-HɁuY!6ėlg)%a&@;w HS 45D(Fr1,8P!O1ם A256 Y-]K8[``0"L-WxpFL xYX &W|х([VхSpֱ$Vdiv6.h6l6f*D1 2h򓵁 !P< Q'*u(>q(*GhXcwKX_DswkVI9cZ,,;sr(β3lvYwlͮΫo8D_EG[:8Y ƫ{6׻8[e&_DQmpkkN|v qf<?n9ulf ͵ٽ! ̷[ |Vmۡ"ϕ;r_Ӟf]ʾ-v=Ț2!mɋjJ"t ,kXkMFHG , UсaoU,*`k\êu>׃vbϪ:̿җ!`>hP$PaU֫+fwp\MĪ54TS5CC7a$%v2X*G}@˄?q.:<MKβ4=%=)waAZ(#OLϙЋR{ WO2A=Lٟt4X*I: m?TI9LenڍwA.PsxeD_\J<%B^)G**T'2PE b4\yS+r|JQn+/+f5ߨ}54īLeN 4̠ookbo2F92}b4D{M;YvhGȃ9/OmB =:t9ה*__>skgT!$']D.`7qW)11d+qC&q BHL#aaT\(,iB0O Q$%!&`=VEWzIA)({SPh,8b$U4GU9Г vQP0 *%pT 0ڻ3FwXȈwp$$x$rVXn-9:bBGRQ 1#w$ aBbaB/aT-aBVċǪ8^CT8DECT8DEmw6 p8<>, Q% Q0>/G/\$NPL6DA.( [TT Bi1_`wWru꼜4gV|eʙwOk}=>3v s#>糁6A\bh ?D.CϽn*=.vpCG jgk)FL8D\uj9ٓj˓DHkZŨYmLdKnwYJ&u2|;(q vKvezAB6e2e$EbrKv]vwo3{# 6{npv}|שS:޾jHwv8AhMϓ9'9\s:dVqbFOz*ߪWut<>y{~/>ELk][5IU[ pzCo;N&zՆ`&8Fb}cSdw;͠MEHem Jj1(bpҋAyG3^T7?l_DG[- .?sk0֡%´v`^O@\ VR@?G)g>f@ ۣYBX ңY6 3G_ȬUya|KglL,EIS>e12zURYHP1z[*ilO3U+o=1xCL6H9vtH*-3RVu.0稇Be%v$dwZ(IE6c$,O|fT)CiKJ0l3pƒl!I,jb26J™]؁_iV}}^䕈sE8LUa\W>譐_ӱh2lg&ڐm/zujb.&'ZyIT턫L{+V/caba ^חZ]~pܙZ \ۭ5FHCr^r\y/hK"o[w`]kB-X|#ܯ8Y3I&lhFx#@y(/}%gLa8OI iе@y)u3M36Ӷ6qkj+ ;ÚI92:iRw4b_/h[l$'H&XSo^sെL$t4 l0t"^<^djP /SݢF2č%l ɿ798 Y矈"^[ܴQJt8$vq*qcY@- ; rb'<꺶I))(RQdt;%㴟~2B'C2P4E1DغmѾlmv@7>aIiv ..E,`;QaK/>oW=5&FA1مdFP ESb' 0QȔ)CŅ@)\̴E퍢B/8G ,\0"d1L3sG* c s'=~v~VkM^D-OMeTM%" "}i};-$4ewhU'mJL +cZ6y ;zF)W rzANf Mf&iIki5AOg*$%/i*2/q46gH"+SJBo"3d,N>!_ Y!7HHr|C2E`tSȹRW+߬z˦ C 2R{ G^kq _i;%x>V^Oj"-04L,Za]On~"DVZB@G ˃h7Bk|# n؍[#v3a8I&q%,ġ(OWo?ivAj'nbxz ]݄N BzQ,waՠӠ.U+c`[ ǧPXITI>Adm]KZIkZ۠}#7t+*x=@om:UO|3Yo]/\JlA7 Wdj.Z&"cxث7DBc~,a~<$@%~Rb(U قGN SXp2`}}4hP hpPQ iNh l`e m6YB~!/j4i/B;O}βtm˲كlȤQ }KYP.J,xźݮN< 6{X>S/͔3ݕmrCGƖXvA v#ݡΥWڧmw6iϱ!l)}<,*ԁk'U(2}>.&9{JEî^۵@~eBpMSXʳq]!Fh q qNm,$)D}(.^%<%^LAy.MFZk."d}X** chrrU8HA^9އc0]{8nǖ !4Dk(z וh'ZՆ_dFj٨˶Cm#=\oZ} $Jh[EY]PEGB8K; U? RqtpC{pmZ[q[q[q[q[qp-<'B2qyv0{y硣!<\2}<ս9 a#:Lxw#v Ds}VcW҃d9-̑V%cN rW&Y&J7y~5CgzsJd'YiJwqz UYMܩ4Z͖Iʽ8yUSLA'IlUt#FmʷJSuڒ MFƢnmpt76 큆h4Dnm\upX^kah>sf8rnߒ'qƍBҜ%"Z0qCMD/ ([{\9߶osHi>ssJx-mhwD`GtvD`rY19797979797g7'POqzDκYO*[g}Oq2d(` ;G:Eǹ;oC79 \g]IR'NwrZ+ov쑤gr|rIUɫdW^Oo4>FI SP*_ȕ2T}JY%WZLɞheIHɝ4SZ; ֊mkh}He+g ޱZ4|{%݁UcdJ:(1p_3qzk$:^f?zD~Jҽe9nuJ#7Υnjh,T7 q5FW<}E^_߫O_Vv(jE_ra+wp(!^>'8g+ww2'2吼YV5bw/Jx䉯'⪚U}/-FyOڣӎ6;r9tfh#zOI'4$v s ۑfԒH;P_ﶯ)]* mhfh(xJ`:VLAy$Iʓ'DZhzoWfzdK>NƥGK"-qoR8ӷÙ1OFIp ʍ@ hZ@[mQnEk 2W2!r#Fʍ8 #G2y5k;`LbH?ûc,~<Jf|~ARہK t( mơifC H3ž9(hsh@Hj1f4c`uq3X;ҋU# x_֋J*ֈpLwpaw]p5e[Sp5ЖAk*q;+3`_p5WSp5^h+.xlhr lhv\h90 {-Qh>ܡ:lR ;a{lwM?cBi]x7\#o/{s.Žv4O<||AAA TWҎ1inPе1C*Ph-09f=v*^;=^ZS S&i fIo*NB1b\]x6 9=h'E[n],u.'3A?UJ<Tm&KOk?9!ҤMU=lp=e*&w'='8]nc/8=hz3-S =aE":ų|fCGū()d@(ǭF^/$?wԟ#iARiY3嬒b @dϬ.=팓fJ6-Vh0PF IU%Tr-0;ιN)Y.blvZKC0[뻔gC紻$m)-'ԓd$I&312XSm6I׊\dΩzIj 9S NM γ`gUͫˢMgaKD؃ l,&]Ldiw!X|"P\쪄ů-REsQj֎Zzo\h*0{tz扽Dhe Y9;al;\eCߒUT(Hyւ VCG 胱 },:h!Y. D;h93w$CGpta]>DZM>>UPYP`771Z^\ZHv*U@;U4P xj hd7<㡝.΍vn8dPp4~ua<M܍#r7p4AQGPFBUZǝp$0 ٰWAa ثg9 dl{%v`Uf9~RHnv|EU$5|9 dIr< ]< ܅ݞRJt|OO_ؓdB / L0OO]%7y ̿ SV{b=sxK IkmBU´]8YFVѕ`Hn'Z;fi6LU:'d5}2A".:u$yV}ݬ7~F{c5 WYK-ިo4VcZe3Vjez` 2.{-rov N S84OR@05猕_8i(}пv4k5w EgX|ts`|wXTFu[5t4 ť^KzєjY}eȩŰCKttDЖv-|H.PYcEPB%^1;ym1-V)jҍbQ[p]0 &+źDr^[~7B4Q>J@ 14_`r'j>J|qq)8( ?knDn ڄ$9 P  {:KޚXAi1i97%Qڥg𢝄뽄{9&U,vz+|-r ˻s^s?gϽܯx _p><܉\a̡|K(4P܉x\ogzG:p4Zs1  c7tՏE~,Mch"r<M=oF]DvO&%-anFyyΉ|./Q*E #RmyQPIQ"<$&H i&Şƪ)㔾J[_8~L_!.z|5lĎϪk%14NAB¶'g1 Aݍ6&=XFfustAOYMi}̾eZvvdz3})#Zw';GؽC`; ~`}]}p2-[m}~]vA?~|m"rzjר /=_x>@Og,SΔ`Ngi9of`0`uC} @vawuv '@$\[ Kup~Dp]_l1 EhqOy_4} ;jzUʹlnInO} (2'qe>cK:ҚLg (7"RBQU(ݔJ9%QűsqNokL2*9Ah'yOFy/Kzϵlvߦ_O`sadco_%VAA<>. ָB"6',5V'ՑLq19QiX`0 |ΓUƨ4Fէ1Hߦ{hX[7- ^^1F;#Ќ-z gTδRI3PGSHEhX7_~snt74f|f`8WZ)Q+F\mL7 `nl,sv's,gi8TB KKVbXFr^H׿XTKc|(&>5&*D!gA|ˮ[Ij Xo/a>NiS\Nq|Zj%[]#cb;!4EWT aN;~~oUyz/h$ؗ@˧ p+@վ P/5yOŞG@pE? $TP ~ vC'T;Tۡ]жê@b|*΄v $6Doc񶂘m*v;1ĤYd=[no'\q<v[NxW([lK)*ſtz|jWU_Pk$-ô]S{DZcm)b'qZBC<]ɯ Ҋ]~L>/+2hiQj;*pwf{^ٟx`Y+=بR#)sk+le߽?,G ylK幮2^pG;98s]ˣf7~!'Oq-k٫v,--Xȴufѵf" =.B%x׊pb C}8 اbB"p \E)5Kst*&C6!f8 %N-Q0Y$-QGI(*y~ p 1R!q^8mY{|/ؗz_6DeeBF3> s 9 masSЇF4FvЏBrT% FW[Tk`F|@۫%>߫6s[\Hld6H<`|!6@fC{JDDPHa~}B%*~֥%&Y5?DD/# -$vDJ[5l9Ƿ>#D~er^"9T>$#oRtRC&yd=BAB2 lo2y$V_q8.V:e'dV4:Yvb≀c?DdzUd555UzSU}+TYgs-Ã!W֯'@וhc)VU mcT*wq0lA&F&TqEXXXXcq\c֎E#*`n_j_&E~у}L`| 1R!k.)RVzc ^h{$11V\#͢;] C>4 0 8Z)_3SN?Dq`-BѷۑprJTVbV,^[i|Nվb]F?iLwt&Fd{;EK)Zc)(S1ߑbH2nGz[=}6ZcBDߨwӿnBP D⿿#ltQ H2sJ &hx g4;I5jW'cOTշbWO `O~5d`57( 0 G!NΘQG3 hJ(Q8GQ=\rp D6Ѳve6b[~0~`wBT[E n:ӀÜ,QGO~{Tۣ=<=Np<9sџ~\?6^]J6m\9;p'¬`]Bȏ.+{dMZD7ߙq{zsm_cuZ3|\W[`Ve$J#s^s0sg>x@G*sOK qDHYbK8+C*=Q~pCU~^:X4y7wGSi3}%nS8}2 aVe.gxo>Do"﷥ٍ "<$N,&"0aBf" [D]듎͸vc%a>m,vp,bxVgÒw~&)z ^Tl&k6-Yb,M(=@?=ySt552AgkQ% 쮫Fd;|0%šLUr')ryJ]G~P>!!h?^y&OJ mrL@?(]WԳj(LS_RPCH*i)|pVzkN ]O` pp`pmFeȩ]TmƢ=W c B= (+M CXQ;ZZN]tuNi$v~F bH4N e!ppHSOµ)~AA t͢1%iwiӑ4cm`YLvS 0asVmZmSXS. To՗v>G{~ MLnsf10 Q^M."0G)Cл|3<) T?gJ5)a |X,2Ӛ ofal\MF,+ytZN;.;C7EM6-8Tt␏D}-_\jƠWd@˽"g(uİ:q!"xv* HŀTTRP^tyrP9J#ڠc^~Ń'<ypB[ R~9Z+-GPk%T B&s K62ʐvM+H| c\l2d('>CJ3Iy}@S*+RRgP:&~4ꚮe3,9b7Kt4}vqx¥~MS '}.]?RHlξtL"QR\g:=՟|+?`3\ffˬ2\fX04+=?}_O9>Õ{:LJ*S6biJ| uxC : ?#Z+Ƈrc-6@sW(3v+ (.Q(ej1QWrTy@ȨEAh-f"O/Ѐ tf% 9@ z*M,08?@ xA=Qpy%G81 |ꍆRo |-: gG|g||^ zYŬJ^(+zƚZzcBo {.)a@ L_P@^p4Z-GBrU'EޙeRyW{Hۂ>t1<=XCOɧXSh?uHTL)0' F!17s7;֐/ >_7 SA0`馡"X0@6 `8_2b>;lO]֞m{9jJqcx~9?/YRmf I{iqy|.eG^!*[ V <^CGg𾾰ї{8+!EynX8Nv4H7^{;{w=`ۊEkgkg1Z'{V+=ONlLZӴ\\ݩ It65y>UyPx}JH^Wf*R׼{yGy{zzWy_xo/Ǽgzxό o+c:@ DTPMĘ,wBNP(2[:cNKqD_q(~w$?8<W^TXݪ)Oyj1|RX&{yh1Bt'O?{>Yv=~;Hncvz{z2Uq ^Qn? }b#cBx?8(.aCF;1ZGh[8u&HڜcrE¶0V:_-0ˎiZZj]kޞ G9h5GpxPl߳90-Qvʏ]Qm7꿇aVG*v(^7Cئx Z/1RΛaAK ͧjtKAl,vHtD &-vD|LT,DN##T|&y VsWaXi9rZnqۧp"xp-"|"-r8q6Κk#g%9+Q 1ZջtqK Qyd^^I?o.#ʷ iWSt7i(Nof2[ S}4H fѠ_'jXT/*bqwH FV@#ik:0ՁX%T u-~[^e/33g0e!dy=z?VnR7l c+yUYDzl!m*vf:#hd8G+crx)G<nUm9R@Z')oZMr,G6_IR&?0EƑBrHW*Yy"H3Gv|S}oX#av=^ڷU\~-eo[WKЖFj'LW32}Y=DI{mmZ{=^Q^Q%2qWG({o1vO}b2x(UT27X#\xtMЗ}>Mmh't(Q;HG =JG_P:DhQ"YioV \_%~nYhnYV\?Q:0v o1}ܻB_0Dz⾝2h9ʕrSP!.GOq9V VCt9& ra6 ߆Ęg?(:O $N!6Gg!ˋ/0xS\qɛIC%=C#|[ ii=Ùiy> ^E\+^[-{uXDxuZD Eg^xoc_`^z= @j7/E?qx3? !C}Q*iLŠڲ ')SFw$f7/<Ex[\=u=Sʷ o z|J;߁=d?݅~ ? ++]^]&5rH[-&ҽO~ZLdU6hbLE$5Iӓ LtBC,xCW.n ~1_E4,o`Agߚl籢KXoK t) bnZb]a%,Ϛhchgq⡟SRXsr^ZVG&mQúڌYs6XQunR_zˆ~!RXZ|+mhf^B$jgHx"8C$9Fk;;KP|6bT%⌖.ލo)g%~],㰺8, 㰖0kEeKn35*~wa)4 kOgHbzh|+Ƿ‚ބxE -n}PC6WdQfVeO|Um?UAUA5@⬻Zn>>{M[elC"ESn)di9$AA8$s,Qnű>DPT3ԭpeppi_η@ }pKqjZCGє.J'h=J O ֖/ePy'syV )I dU JLMգ)z4CT#Q=*bњJ'O]p ٮ2A{kp)&V|3b+|ʥO7]85_/X-@+ n?B[Khp S) k"*=_> |ˇ%_>t#f.}y {?ybtc!Id/,׿P,x C az ^ XXEhC5,_Ƃ6',xKbg!YZ1q]9daN!S./q!.\J\#IJ lҶ$ ))>v#'>}&ZKOCgy|ҍb_Ir$Yž(T]@3QA.?!~ N2[*AX~f#@(`MG'x]|kVe]ECgǦHRNT^Frd:)FHRT*HRNgWНtos%3H9[`,08b겞S#(1"d'pZxz0vMYޥvڛnom)xԘ[ioOssݜ6-3xtir_2ki?U_YQFP&Jæ~x/;?@Q^R+k$ndQ-nʮfilqz[Ϳjqo{PKb|1}^fj)oڡVJ3u{76=4gKMA1OԷ?{CNIo\3TK{(`n ns7s{N'vLᩏI +LHόp>p>p> ӯ4\j>GQM蘍D6 xc_/ΚSنG4,: j[VmЪ8=,{:u®e%FX]L%>6*yۦ 0 >]$#-<0? T"D$YqH3a.,гʨ?6qv'ݸȅn<Ȕk" YJ۹G٣,-񽪬U7S_&FB ?WNŗRj3x, S\MC tHe~ o(fk١ڕjSLnYa tPl/iZwȷ"PohٲR2,RV2iĥ< NF(eTa4*ً֗t' G#;␽qkK` mި2y6`=5b' p+t.rn rj&٭mѭ|SxO꼓S.:vwBtrrS+$m; N+)MNd[nE/r:s[|Y=/ܤ[AA_miU8i󁶁ONe?:uؖAlV(;z0:(&C6Doe)ybaR9Tȋ[&yjğC vl6gʅ\. s!B4΅e.\-s!V=G-'àb)2nN~RH-["p!JB(> !B-D-RPA>^e~7$IARJ+*S4O'Ze8kۍP $w$lnyBܞQ9N4H %%׶Pgv9==F=F'=Ft2T/>2Js'Y)\iZ)yZh ^xvg>`YWuX`4d^v-{b5f6Vr?do%>Wuob{ZVuܲVTy ]1*&x,ѿ$f^AJ}ieM C7 mV4deygsy%a~^zͼ$#he٭lԞQK;zZǂƹn r$sYQi0|eeӫW:׀p"3;K*uun{}(}{ rcV%;!1f`27k3:s:M5{2[B -\ӅX Gn8-58Y2!s9@H9yP }SBu!8P: 2hAhaB9BA@ d 2L n)pC/!+ʨؘ lLb Ș d%$C-, BA!KE^sx%q>*|Q)NVBpT/ReAr(ˡ8n루BT{P)T]謘ʱTP ԅ_+ˀ_5ETJG7'Z5cK{@mP*sr_-'W}?z+7*_(MFW͇k/zT>HKH[/KǕ5gFvG2]m^5 (>|0[c0!P]ۯw76::ԨW{IBF߽b!em[IQն){y<9~gD3ͻ\[Ua9"Ÿfi }[oܦ<^gr? *#_GȾ'\\cp 9LWb;\syeI!,9a1 9zb*T7+;ƈHܩIKAT8.!P=md ;P2=Ilj E|-pL @T-,nP $5Hgm!l30PVҺlbIOS>N>r[m*%6Z"tK:ˠ ǵ.t֒Ш T@(ׁtl j j ꀠ%,ASE *J?TY!fp k\XҞ ,ƂْȮqcuX,`!c>kP,Ƃ0݀aƂ/`, ,7nva*{` I"D8ej$洩?  Ic%;Y%­ܸT;*p wƜmj}.BXKN-' $v )Vw)b$ U1.S1MYH4|?Ʈ ^Q~SxueyZ1xFQFk1M?vxvu_^y0IDPEhg(-5eքNXX[CCBׇF>6BYQڡ]PP^1sU=O5 {(v$@Nkc\&{b6ٻbP̑nh0ax-L}йsAۢQ #L2AjqaIVucpny f{ǁOqI``;$"p)ۅ8m1F1cԅf5qAg]kפdEۨ04Ll'{28^+H"!{,9;B37jϵ~ZQoM^cC_YCCB IMB)/ϸ?~eݵ3z?}D_AˍOK2|d 矕8o_ 8_jm: Bti%҂KdJ)/]Rz6QGG>?}<GGORHHHHa ->Jx9ݯ :^IW.'̟̟̟Ng>BT Ot<6s=gS983=7q&:LٞtYHٞEtQ9c?fGbGK~ |@2b9(&Pr=5 a]JYa =\ƟX$XP<%T:7̳f3+zA9_ Ɯu\0m3ڜ{[VΚo)s:1YIۯF]NeLvc25NHck-a]eppnU{XV YiZ~iV'ݬ/z:[f񒶝Py3+ӆ#ƧlQ7%f2ޱJ?yw>QS=HT 9UzH V:8/[;6>ʘ~6,z! kg E3ͩf󀹃67WPs1Px]{]bjq6|W_7r1s$5Ppaa1fu^V">di=k)5Ab+LZ4G.n#)fin#c  2l?jK;M45ld߮%n;K2ZZ=c_>$$<2 tUX `Mߜ~ٙκ 5%T:2QW:[놔~H)z _O녔~ CF+}-0_8l 8[7}'{ noa-M#|䰟?9ſss8a}d>mⰈXE:_%كc,8,*ܿEYgܥgj'>VCdѱݱ8݃:nGpWޫ&!egw)N}KAc=AzרWqvoEW<`EsJffc]^\b-[ۭzݤ+JS A_Ig_`SY kjX wFsww_ĵtBq_g]&hGHO\1r%r;ggcu6sh#\'!ܖiPLI 0A&aLX’dS ֘x@tpP6fXK.Wr[@a L-m%n L-0):[abJl,Rb#J]BG{(|L7ۥ 270b]LLՠqMR=tVԝʔþzGj?=_]5t~Rs_[<ܧ,?`ӕiF֨jl7&,5 Msy!{NyoYdN77Av %6|F6<I{eҳn!m˅9S:b|a'jXwXyfwkJn#ٱFC+}?Y\ʿ>n >y` eRE{LƓF K6_.]b>f0A7(rT V9d9J'o|℥`¬M ѲFe˚2> VU\(Y<6.{8u6m7ev=UnR۪Wմ}ZS`,a4'Qs>/;{oLy7s(onN0AO/aGXW^D-q;0rh9$c0$c 0Ngag>s*'J a^Cxމ:h8h2Es4JhFӰLQ0::#+nBW5A&D&Ф!Ն8 0\bD w| iT̳# `q uk 'ETcom\^`` ʦNXBvbb`AQ)Fs̅yI.sr"h0::`lҏ`%tǃL&A{"ymI:t.S,yQA8 Q(G Dy40ȷ:;ͪ&[3ܧ6.gi\w4~?L\dƙqh[̦̚CEg^[=򰹉; in.>ʳLaﱦl! lfmU y{>a*7!\)V  sa!3;Oڬ3(r 71͵dOG_.HpkDˠ!R9T _Ua\&b 0 s˿dȺ)x(\.f\syHT |Oc.:xno 6TW[,jeQC@g6x(3@W!*pn$r Hd;g3oϝ1׺ss9w/BDJ9·y$A" $ ܹPrgߘ; Ewѳdahnqsb9 K0 a(z.pN-y ȹrx ]}xN7.DsnI4 ].y1 zfWVIY Y#Id{$>\⊃%EȏR C"qcm]blWn݊-m.rn|f`gI=t}o$BpECKߊ'nغ b6 7-T[/|t6Jv1SΉp )tU a^}.}^ ]F%{{l1C F_|y7y%l9Ï~, L=Y+W\Rn)TiOoab쇧;e?0KDs. 2|-2uYaI)KԖ~^ 'F:`Xd\my[jM g{)6.a؋Nȿq:4mwԞusVjI[X^ ت/gwi|.m7aWkM#𶿎}-~7ԼQy]P$LIj/hn-v,Ġ >6V p>-D} ?3KYMBNO0>P?#`6go+h+k>hw _dӄJSf͙*()r;FJuB3}M*uylLgص$tCovz: 𼛪.?.?T%~ARgQu4uQg%_t,Ӝ~)$#ؘOT)MExZAidbG@jRLJ,6Y=#@RAuEK3w1ׁKWu`Rg"NH8JH,B֣x1ʏGT&ͥ#bsöb뮋:}#R/vS`GL1FPQFM+b(ʄsԤR؆F!ib򣰕BG ؇A/8t8e7 p7Уr2<>gsffooHE`]urB٧U5&Y;FV~aټ t;SX{(1F>9|IrsܜnP <x{bǽՇjgv›v`ZϴC+T]p3(߽J157[.y\3[ś[خnSlC }F㦑we߽;馑$IR>I;o4F>M#ߣ F|馑d}&6h[I#Oi$Ⱦ2 SP!🦔vC?|聯dDmn)g9FqHtZZIGA"'@D١С-P 8G\4tXE/>Pg Ա(1]9=Ct&$}f|d g, f,4ewJdǹhj34Qqbh\6_|@ r򿑊+2p!"-r BvE8|X99ʳ'Л8aHK^g3  CqVhL)72ʹН1 ظJ>؎\t@:5#ՉW<^gmqi7 #f^R,Ю:kI3I>?ϯ]|"͔3S-ҕD3J.=V&ؑvz@v*j:; ng=qaxjg^UVolG/k&?6ņJS,߂[yt\Ͽ5{tM_TQ)|=wɼ ÿ` YκݣReDiR(_+guCZ]BX=z| uk=HCZ'w嬶okw)V{ȚnjcK[鼈Xw?kkvCtw#gȮm͔]W qD5gڡ[c$!P܏G_,pԔzdMgL},tӱmmC,nrR1ȆbF,F2S"*UB=@o)3]gR1b ߍT`L*&X I֤k)' I$q9&cڐd*! > B xmi jEeC*G𧱛`xI"77e!o!orjj)Q#3O1qV3ԏT+ffj23\ET+{=b% y5_#ԭz' S,_SBjcxcqHd5yM~9n79Ή7ݓyf xΑ|b޲}L;4`EcJ^LIRZo_;3,PfJMU' xG>=/& }}v+nh- 'GO`%SS "dFbRMLG"?l6H&@K`X0F,X:NDضD+d,Ll0fAvcdYC訲lHeK:fa΂2 ,KdIwtvSS:tmC,R 'ՑGuYfnh|_sAQO' Of|/4:“C7|ѾvկO ug e([Ţ2v??0`ldϮO7杦c |0}Е;-Dfo/w+"s>3Mn]e{ўn=MI:-w ׭ %uB|Thk8ͳ4@r=*us59W oš,"SeL%"S=o v;3UV,{b{>褾n K3Z^4 ^VWTF^w3%A ܠSwKJO]wߊ"0~lhy:|Gkڬ+Ͼ`]$ti4ۛ > eLs6n6 !4nVXovsn%qHpvzvgZG*ȵܵܵ*=R=t*Ca#J5HwH=dh28__ lC:Bw`7 < \f2 Ux#딞"G]KJ[cW.Q=k5j:_VP*Ot,Oq>cۈEfF|&of4/5im6Ohb2uq:MoFSi l=[?c+8oCڼlJpkuPP~Ebuݪ*^BmO=Y'֏ Y(x,`HU7 5f!C38s9 RșfN3Oz1K?ilq6(6>Yo*\3tG "qahbABU+7٣QwǢ /_d^d3&01U']+s }  ~F_dNFN]STM"$AHT2`LeL\GsDDm$qXF̡ dD(Q tA/!'Ό')&g"kL E&b%%0%0Q h{Xnyr8O*HBN։RSw"0lپlsmfȱc{ mlJoLV5 X_6o&e yXvٺ{7 , 4V*ՍbmQԮ˴Z?Y=jO~V7z}ά5)[9}"=c6vj|fY͎M9=~$ycfKČ#!ٚoL5Ftlm%TO*+&uc1+_eFZ7Z=hVhk9l`F"a?DŽ~#Vs.`2Y)~Mz-d]elXˌV >[Ʈ0[3aYVcQTd/NDdB0/ .BԀL*ĞsJ6J˩@@kI1gE@f`6Bow4,5/zG@ j#c];N(P@Ae@[`h#v0qG f#8{+bWA(~6謇g(\,u(F 0J`YBpn^EbaSº@b'ŧ%g&=CkѰ#`9TG"6tҠMRDhmL t*Q/^N}+@RtJET3*:ΤBTd 5Hvp \CgK_Oȧo"= tmCZyH3iq!-<řGXY[\Dv+Еڭv*o:A2]t~n*,n *{VR³ʕT/m }k=q>:j::O՞t\MX6sM37s1msOK,X2?.JrO0U7!(aav5QaZU{sڼƬjߛ⬭\ŋyeJ'i:eTa^:wT/,;7&OjZV)VV#ʺXF/՘zc񼱍Ƿ׵vsE\ IjHIR@OV fgZ>cZ?ZCVZ(%u*۷śZ2`[0ޡyG3:ZVbu3WS7R|x0.7|Eq.[ζq.W Xzv뾓vs8B9r-]k.sH< "my)MɍX6A-FmEd 5Z1f9rec}G̥ұSHg k:2g'lt g's 8E|\˧ދ^^={+w+7m%7># l[Q_Y>&|1a¢1F0χQ>(޺c/i,q`,T;\;wqv]G uYأ.]jm63Xokwǘo,幽 ǻ+c=+s)#@X G$vbdB=ݍ[hAq7^Y}|q[ffXgo:-?eH\k5df}?*]nx&w8qWgX @qU :Ut7--Dr7aY#Qw 7nn*w$jwqnNm=.qݸ(pF,FFl;PSbDvTݸgÍle}gz/H#w[E|g?9Tݸ=9HY G!BGu#F>z>ƽnaY%YyMѸe㺿;ڬao|iEiE֮TC\+s̝MG2(=J~M6͋uWPFTH dհeiLfwy1sg1o;|o):)?+Wkw/)tnN)ub吏Kqg /S?PPT#QIQ)?X]&jh{eJZ^eduWF2[Ě ,8>eSؓ|"?鼋y4m3ǯawxm3ˍl${~g|2it{X'i|*/5Y}R0o[bXZ}ȡnFE5%ѿMݢ}a6FRR/V(j@;&__NLOZoX$ux{~q豃ej8`h`ТRSM`ԗ|JRhXPVVP~>j+ˣ 2iYF7*ʹk3}VX-lw1i1T-އR.yeWZxX;!eU6Bf׫ z%֪ z ޫO3 D,0kPp&>$#LbIl0&1a#Lb&+={c 4eɖZ`B~15 ]a 94gm5kODOj &.СueJY 3&%n n2cT8J39_!ҙr@C]%=s1˨iE^6A*E^Ȼ ܽg^XE1R,<µ/}}Kg^*GPٍ~*#nh>98֗qݵ*-fz/|-/2X gi!a7qֱ Мm_g4_'4ͫSV^T*sү}{_) `QqVQKs|{V*)%4Pn lTQ'm~%Ÿ ܫkSh f5jӴO?oG<Ϛfk0㻼urwrw_D)PGYʨŎ-\66I['fq4"7Ƃ5{+Xܦ4x6V`eKQ6|DlE#БG|U>>Xc#R?%K@K8c͢s?YI/^~sˌeۘTzMb##]zUƴUEQlGNjVw54FH,^$.>,RC㝆fT({+ ^w{IF|c-CxxWk&5sEk6 ٯ%LnB6nH*Lwm֕ 9bU]o8њhyBS_W=!˪fT3v *nXiFg\xg.BFb {`a%5$Q(E Ev&np"M"T H6f_E76>lbmhiW|WqTgi37~P+u#Krzv}~bNaDѕ=lYFW}X4qwP_َ~hGَLAdsZp*rE]EFp죱R Gw VrJns|]"1C1./6{Z*_Q\[I Dc6>4>vdzoE_*_wgݫ$rho;ۇzmиq\E嚬|h4NzGnU>Q*Oz}Ad_wZYcemm3jeENpCm >jw%jw3ɼ~u֞hhucގIV749Ғ>2U$cow?:uU}E=.g}OQK^UX"%}sy܌R\3>)5>M;,Yi ^ϬjKxYExV *jUMfзn vy}*(9ERuu5QjJɾ{RPj{uĖln;KhʹZH}MaçUhji[?f߲8~60?ersM(zfU~ cxމkgI+f;.[TT!\PU?34@5Dsqx ,kc,4inOT >O'bH r'F3) *IK,i"6_s!F"F$5Nj3H V%Y99@,n\4DDP޷5ent}<]OHHRME"ՔH>ɧz dK ^"s X<¿y#o`쬊eʈ"sp#"wkGV#pzG ;>U/-W#T*ve5*US{3ǐiE3ɩnEݫ!&}Y x *ŢZ1@\qy D1@zA#ܰ 冽ђǀJ7NbaeX~%'H}u`Z>UBO7_??/'RVݣn֪=yoF#³M:>&Gz#C~ E',ym]!Խ}ishw33J79ecicb\R/׆[cMPt-[PR撴8Buu\>3gy3k|=įaoC3m̊i]fN2fo3\uTsOW'Kw4Ay@QW6յW˕l?*Sn7Zn |%+WS{<Ƶ!W}U]ߦuҾTR?cQjV+rʫ1r( .Hv~Ui6!I#Hc])Й"*ZFw@L ` `Db. ډTkS*Du(4&B< `HX$ g1Gp=rv;]n kG N2apIl;a]L=iiſJ#T7},FL ;]L|=h+2N^*EҜz@]:Azirri*FW`+@2: te1T;Jvp[ux|1_Ǎx{$ Y.Yƺӎԉ訚1cTsxM4945l$BB/kd:N8[+BwoqwbKⷺ;;sͯԹ'5ŧ\ƺ[[bu>k`B^oww;Q23tnNj2B8>c}mߍzy\n*YjT{|ose2SӼB VQcߋs7rgFcLDU46Fn@=F؛M,ނUM|Hαǃ i1~wINEMt ݴcCV$v1[o ֜%"t8gвoF1eMBVڱtGшD‘tUk;ƫ1iTZOKgɊݷ6]~n jЎ]tD?7@/{ sava^+|Gw\U6'rk!,Qperebn2 ŀvRQuW VM.oƜ:iI#]d*82tGLGb<6@uťP5pCax&u)F/Q(0Pߥ0U9h,\CFFqR' QQeWc1Msz/n-ˮPK!~#Mfont.npyPK6vedo-2023.4.6/vedo/fonts/Calco.ttf000066400000000000000000001777701444463326400165700ustar00rootroot00000000000000 DSIGGDEF X ,>GPOSnXlGSUB^b@ vOS/2>o`cmap)vccvt AZ<fpgmA| mgasp4glyf'l&0bhead 6Ҕ6hheaa]$hmtx"دlocangE2ڔmaxpQx name!jޘpostE prepe34< . DFLTlatn : AZE DCAT NCRT XKAZ bMOL lNLD vROM TAT TRK     markmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmkmkmkmkmkmkmkmk mkmkmkmkmkmk$mkmk,mkmk4mkmk R j D R J P jR J V jR J \ jR J b jR J \ jR J h jR J P jR J \ jR J n jR J t jR J z jR j jR j jR j jR j j j j j jR j j j j j j j j R j j j j j j j j j j j j j j j jR B R B R B R B R B R B R B R B R B R B R B R j jR j R j R j j V j j \ j j \ j j V j j  j j j j j  j  j j j  j  jR j j j  j  j  " j  j R ( . jR ( 4 jR ( : jR ( 4 jR ( @ jR ( 4 jR ( 4 jR ( F jR ( . jR ( L jR ( R jR j jR j jR j jR j jR j jR j jR j jR j jR j jR j jR j jR j jR j X jR j ^ jR j ^ jR j d jR j^ j=/=)=6=#====%R)R6TP)P6T%P 3)6u)u6u#uu u== ='s)s6hhB)B6=R)))6R=%/L)L6L /////{/V/BBH=NNR%N3DDDDDDD{hFFFFFF{EFZZqqF= F====={--;99;%;q%55555{5V5JJJH %=%& > fllllllllflrFLRRRRRX^djpv||V{h= ={==?==V?  DFLTlatn. !,7BValw: AZE VCAT tCRT KAZ MOL NLD ROM  TAT (TRK F  "-8CWbmx  #.9DMXcny $/:ENYdoz %0;FOZep{ &1<GP[fq| '2=HQ\gr} (3>IR]hs~ )4?JS^it *5@KT_ju  +6ALU`kvaaltaaltaaltaalt&aalt.aalt6aalt>aaltFaaltNaaltVaalt^caltfcaltlcaltrcaltxcalt~caltcaltcaltcaltcaltcaltcasecasecasecasecasecasecasecasecasecasecaseccmpccmpccmpccmpccmpccmpccmpccmpccmpccmp ccmp&dlig,dlig2dlig8dlig>dligDdligJdligPdligVdlig\dligbdlighdnomndnomtdnomzdnomdnomdnomdnomdnomdnomdnomdnomfracfracfracfracfracfracfracfracfracfrac fraclocllocl$locl*locl0locl6locl4]&efgnopqrsxyz{$   ' 9 bh  %&'()*+,-.efgCnopqrsxyz{ $*4>HR\fpz9/%:0&;1'<2(=3) >4*!?5+"@6,#A7-$B8.R9 AUUx    %&'()*+,-./8U=`gcC/8%.JDU[_hijklmtuvw|}~'8J`g/012345678U[_chijklmtuvw|}~8=J/012345678{33W  P {dhrm@ fH  Z`\almSXv]cWb^%&+.8;=CDJVXY]dituz{jTkdhi INmVR  _[|}Y TUut~C~  U "/124KMOjln~@> /~1~7 (8    " & 0 : D p y !!! !"!&!.!T!^!""""""""+"H"`"e% 047 &5    & 0 9 D p t !!! !"!&!.!S!U!""""""""+"H"`"d%%yeSPk3~Eߩߙ߆zX:|6X Z`\almSXv]cWb^%&+.8;=CDJVXY]dituz{jTkdhi[ |w;<U: }GDH_   " 4/12IOKMTNRnjlm|W  #!$('*)-,75063:<>@?ABEGFHQLPUZ\[^a`_gfespkroqw}~SbhyvxutV  'T!-H@EJHGU`P"""-",(&!!'- + 54676654&#"354632654&#"3T+9'dSW_L6427,1!F))(( "/?3FRXP35/++"'5%( (( (L/H +@( JfKL  +3#!##f9fHdL/6"{B B3+L/#"{B B3+L/6"{B B3+L/"yB B3+L/6"{B B3+L/"{B B3+L%/HC@@JfKK_"L$!+327#"&5467!#3##j?22"5$h{QVc9f;t7 m^JEZHunL/"{B B3+L/%"yB B3+bH@@=Ie e]K]L +!!!!!!!##nlÁ`HJf>b6"B B3+H =@:Je]K]L) +!2#!2654&##2654&#!˴9||yyHI@ipohPs{}s"`6@3~|_K_L$"&+&54632#&&#"32673#cc͡ uu 54힚6"B B3+6"B B3+%`"6"B B3+ "B B3+H &@#]K]L   & +!2#!%26654&&##?ss1OOH׍ii)H6@3e]K]L&! +#53!2#!%26654&&##3#?ss1OOZZ׍ii:96"]B B3+)HH )@&e]K]L+!!!!!!'}HP"6"B B3+#"B B3+6"B B3+6"B B3+"B B3+ "B B3+6"B B3+"B B3+%HG@DJe ]K]K_"L%$$ +!!!#327#"&54675!!;?22"5$h{IM'P"un67 m^FAHH #@ e]KL+!!!!#&} HFj` wJKPX@'~e_K_L@+~e_KK_LY@ $"% +4632#&&#"3267!5!#'##IdΡ(if0yb[5{wؐ7w{j#"&{B B3+j6"&{B B3+j`"&{j "&{B B3+H !@eKL+3!3#!#HDq)RH;@8  e   eK L +#5353!533##!#5!ooooq6"+{B B3+H #@ ]K]L+7!!5!!!!H3H͓!ߓ6".{B B3+#".{B B3+6".{B B3+".yB B3+ ".{B B3+6".{B B3+".{B B3+%HA@>  J ]K]K_"L%$$ +!!327#"&54675!5!!5!Hu1#5$iz/3H3ߓ>_, pi=|E!%".yB B3+qH.@+~]K_L"+&55332!5!#I؟1scNAq6"8B B3+q6"8B B3+BH @ JKL+333###ţ  HnJfBH";H@K^L+3!!HK6"=B B3+H !@]K^L+3!!3#bkHKHH"='H"=eB333+'H ,@) JK^L +%!573ɣ pp%lH(@% J~KL+333##### R H1%H @JKL+333### H'6"D{B B3+6"D{B B3+H"D{=H3@0 J IKK_L!#+##53255##33㲤ff HK^'H%"DyB B3+j`,@)_K_L&+&54632#6#"3ddΡcc΢65ʕj6"J{B B3+j#"J{B B3+j6"J{B B3+j"JyB B3+j6"J{B B3+j6"J{B B3+j"J{B B3+B9u'@@= %# J HG_K_L'&%)&+77&46327#"'&#"4'#3BvNdΡoXpvMc΢nXI"J15pJʕqkwp.kB96"R{B B3+j%"JyB B3+7jH5@2e]K]L& + &5463!!!!!!ttmB|JJ|**Jr緷qH *@'e]KL   $ +!2#!#2654&##HǾxzyxH .@+eeKL  $!+3!2#!#2654&##ͤ HǾxzzxjb`*sJKPX@&~|_K`L@#~|d_LY@*)%#"))+&55&4632326553##"3dΡcUUUUbASX5%>^``^H 2@/Je]KL    +! ###2654&##%||H:Rpxxo16"YgB B3+6"YgB B3+H"Y`*6@3~|_K_L*)","+&'332654&''&&546632#&&#"#n~cnb}ye}mp}boiƊijjs{n\j#)s[Um`gui]h#)y\6"]{B B3+6"]{B B3+%`"]{6"]{B B3+`"]{=`/[@ !JKPX@_K_L@_KK_LY@ /.#/$+&'732654&&'.5467&&# #4632#y/)Pf]c":3;R:zzygr%92CP3'EF):+ AjLj:[ZZ"R*<(&AiOfH@]KL+!5!!#z{LfH)@&e]KL+#53!5!!3##z{ZƔ:f6"d{B B3+f%H@  JK PX@+p|]K K`"L@,~|]K K`"LY@$%$! +!32#"&'732654&##7#!5!!w-aj}u=m#!P)8=59TCz{IHPX^##!LfH"d{H!@K_L#+&5332653#gѣ}jV6"i{B B3+#"i{B B3+6"i{B B3+"iyB B3+6"i{B B3+6"i{B B3+"i{B B3+%H#8@5  JK_K_"L###$(+327#"&5475#"&533265wy?22"5$h{{ѣ}HV(wm67 m^uj"i{B B3+%"iyB B3+fH@JKL+333#f+ +HR-NH!@ JKL+33333###- H-N6"u{B B3+-N6"u{B B3+-N"uyB B3+-N6"u{B B3+X#H @ JKL+333### ٴnJ+X#H @JKL+333#l) )lm+%X#6"{{B B3+X#6"{{B B3+X#"{yB B3+X#6"{{B B3+H )@&J]K]L+7!5!!!@l{9{Ɠ6"B B3+6"B B3+ "B B3+(JKPX@(~e_ K _L@,~e_ KK _LY@('#!"#% +&&5463!54&#"#6632#'##>55!"3bOȽzxbtɱɍ 0uxRlsdZI[LrtLJo\gMQQMHQ"m"m"m"k"m{"m%"7V"m"k\.5@e@b*J~~  g _ K _ L66//6@6?;9/5/531.-"!%"#&+&&54663354&#"#663236632!3273#"'##&&#"655#"3}CQgHOBJ _w "uV+uyP$ZLNOLTR^LAHWaKE|rNPRVVR4554&&#"3^^|j' %qn}DD}S}}좠`XfR_dTm1mUö.=@: J Hg_L.-'%&+&&5466327&''7&'77#>54&&#"3mfs`*+D]G{CFzBBzPPzBBzPsҊwQJuFJ^amuVN__OO_^Os'x JKPX@#]K_ K _L@']K_ KK _LY@'&" & +&&54663233#'##3#66554&&#"3^^|j' %qpbk'}DD}S}}좠`XfR_dTm1mUösf+r JKPX@%eK_ K _L@)eK_ KK _LY@(&$&$ +##'##"&&5466323!5!5334&&#"32665f %q~^^|j'1D}S}}S}Du_d좠`XCmUöTm?@<~e_ K_L!#$ +432!!273#&&#"t?>,ϡss  k"""""""{"%&-R@OJ~ e_ K_K`"L'''-'-%$'$&! +!!273327#"&54675#"432'&&#"?>'UFCq2"5$iz567<ߪsswFTAw md?xA   \70@-~e_KL!#+!5!54632#&#"!!#^\;Ǥklq%s3?Kh@e& Jg g_ K_K  _ "L@@44@K@JFC4?4>:832.+%# +&5475&&54675&&54663276633#"#"'332#654&#"354&##"3Y>GE@BE]|_n>N5T]|\B'+=6Z{{on{{n^X%8V>?e)[iO1Zd\TiO='.2cYYddYYcSLXTVVq%s"[q%s"[q%sh"]q%s"['@$JK_ KL#$+336632#4&#"#,mfdRGY_ú}}xxMV5@2 JeK_ KL#$ +#5353!!36632#4&#"#',mfdRGY_ú}}xxMV"B 3+" !@]K]L+7!!5!!!XX͍""""""{"% (X@UJ _K]K] K_"L ( ('&%$#"!  $ +&54632#327#"&54675!5!!5!! PP;_, pi={F͍"%~"0%X.@+~]K_"L"+&553325!5!#\!%5!ˍ%"0%D"0% #@ JKKL+333###ߠB3{8%"% @ JKL+333###ߠB3B8R.@+~]K_L"+&5!5!32553#J_R" 3+R>@;~]K]K_L"+&5!5!32553#3#9bkJ_R"R"U  3+R"Ls!NIKPX@_KL@K_ KLY@ "#$#+336323632#4&#"#4#"#s{2GX5hd36BKhCKzHK/NLm^^Ӛl_^DJKPX@_KL@K_ KLY#$+336632#4&#"# +qfdRG_dú}}xxMV"{ ""{"=XJKPX@_KK_L@K_ KK_LY@ %$$ +3254&#"#336632##dfdRG +qfxxMV_dú"y ,@)_ K_L   $+5432#6654&#"3jԅ 򔿺"{"{"{"y"{"{{"{b%@@= #! J HG_ K_L%$%(%+77&54327#"'&#"654'#3boFӬk^goFԬj^Bmz`Am+} ZnX}[olBePĿfNAb"{"ym$4;X@U  J~   e _ K _ L55%%5;5;97%4%3-+$#"#%$+3236632!32673#"&'##>54&&#"3&&#"Zs v['[\9E\y sZ?E E9;FF;wMPPM  QWWQ*<DERVWQMNNMۛ=#`JKPX@_K_KL@ K_ K_KLY@#"%&$+336632#"&'##654&#"3 %q~^^|j'1}S}DD}S_d졡`Y>öUm1mT=#8@5JK_ K_KL#"%&$+336632#"&'##654&#"3'j|^^|j'1}S}DD}SX`젡`Y>öUm1mTs=#hJKPX@_ K_KL@!K_ K_KLY@#"&$+##"&&54663237366554&&#"31'j|^^~q% }DD}S}}=cY`졡d_V>Tm1mUöRJKPX@~_KL@~K_ KLY#$+336632#54&#"#ݍ +nibN{E^eúq|MV"""k'6@3~|_ K_L'&"+"+&'332654&''&&54632#&&#"# pwWeɴ qaevXeCFPN&2K1)@.'CiKRH8@5~K]K_L" +&5!5!3!!32553#<aJ_RHH@E ~ eK]K _   L +&55#535!5!3!!3#32553#<aJ_RB@?~eK]K _   L" +3#&5!5!3!!32553# bkݲ<KaJ_R%H"RH"DJKPX@K_L@KK_LY#$+!#'##"&53326653ǎ +rfdRG_dúwxMVA"s"s"s"q"s"s{"s%"@V"s"qw@JKL+333#w -N!@ JKL+33333###-   -N"{-N"{-N"y-N"{X# @ JKL+33## xm%1@. J~K`"L"+&553326677333#}+9/3}!N%XqM%y) MHTfy7%"{%"{%"y%"{ )@&J]K]L+7!5!!!\\on"""=`c{<@9~ e_K] L!# +#5354632#&#"!3!53!#Ͳ^\A_Ǥkl㍍{/@,e]K_L#!"# +#535463!33#"&5#"3##Ͳ̠׍נ'+JKPX@/~e  a_?K _ >L@4~~e  g  a_?LY@+*)('&"""% +&&5463354#"#6632#'##>55#"3!!zCN` (aguCSYPH3Z=rMy9=:|܉JT=jAB=9@ 5@2ga_?L    $ +&54632#6654&#"3!!jmlkjmmj3ZቘX#H 0@-JU]M   +73!%#X5u-u^`#.@+!JgU]M&&' +735&546323!5654&#"!^qmpӒplq{illi{ 8ɘ 1߷ϋ=/#<@9!JW_O&### +3326653327#"&55##"'##a]KtA# 08UW (`y9 vyLWA*$ZY]fTtw7+E@B  JI~eW_O#% +&5!#5663!#3267#KlCY-7rh&2%7>plZ9- j7 &=@:g_K_L &%    $ +32#6#"3&&546632#N𛒑&?$$?&;O$@&K]]K$?&&@$O;&?$ ?JKPX@K^L@^LY+7!'%3!!X5{X͑bn7.@+J~_K]L$&+76654&#"#546632!! OHwyh}dYif\{RJp|9p^_zfkbs7+G@D$J~~g_K_L+*#$!$" +&&'332654&##532654&#"#46632#m|fftpe}}ejȈZrjurqtnkm}uhpZYoNQv]j P JKPX@eKL@e]LY@  +!533###Y PJ6V$t@ JKPX@&~g]K_L@$~eg_LY@$#$&"+&&'3326654&&#"'!!6632#¾spUFFUQ2J-0T{dlɊVqbsFWVE64/X01hj%\ JKPX@hK_L@h_LY@%$$+&&546736632#>54&&#"3o3FC(p;maoʄSEESS~EE~Sk^v!%ivkE}RR~EE~RR}E8JKPX@]KL@eLY+!5!#;Pa`o 7'55@2.'J_K_L(((5(4!++&&5475&546632#654&&#"6654&'3lgglђn>vQQu>m^EE^YnegfXXfgenYtf>`77`>ft8eBmyymBe87%6@3 Jg_KL%$$+#'#"&&54663326654&&#o3FN(oZ Z3+?Z Z3+@Z Z3+AZ Z3+BZ Z3+)R *@'g_L   $+&54632#6654&#"3JDDJJCDI {gppggppgJ0m m3+=+(@% Jg]L&(&+%%6654&#"#546632!!=* =67<=pKr3>3m#1(./+ >]2pa7U.u+9&E@B J~~gg_L&%"#!$" +&5332654&##53254&#"#4632#?@=DJ~eg_L#$"+&'332654&#"'!!632#Ό B6@CD?U(w+2ai{ d[""6225')Lu5pajw5R ] JK PX@nh_L@h_LY@ #+&&546773632#6654&#"3{B'/)1Cf8BzR?HH??II? 7gE5_?2[=9:3#1(./+ >]2pa7U.u+9+&} JK#PX@-~~c_K_ L@+~~gc_ LY@&%"#!$" +&5332654&##53254&#"#4632#?@=D=9:L   # +&5! #6654&#"3rsnggnmhhm-ꎞ) #@ J^8L +!'%3!!1NyH#Ru^}5(@% Jg]8L'(& +6654&#"#546632!!@2]SU[QdfOG[lE7O/ELMG S}DDWMxL5(E@B!J~~gg_>L('"$!$" +&'332654&##532654&#"#4632#f`^i\gnnQUYWfPVnCFF?F?A>?@}|=sN21U}C) R JK#PX@]:K8L@f8LY@   +!533###0ʞ }ۇhs) A@>J~eg_>L $$" +&'332654&#"'!!6632#dQcedd?^({7X #qG[Nv26TRST #-Շ&*LZ) 6@3 Jh_>L # +&&54673632#6654&#"3ԤY'12]XLZlchhcbhhbM]FkDoGV^NVRQWWQRV)@Je8L +!5!#Dw5!-2@/'Jg_>L"""-",* +&54675&54632#654#"654&'3[YY[Ƴc\\bqklppkkp~Tp1uu1pT~(B:yy:B oBAA>>AAB5!4@1 Jgg8L! $ +#'#"&&5466332654&#Z'1 E/XLYkbhhbbiib5M\FlDXGV]NVRRVVRRV'j0+ VdwDJ\w=`j#0#' Cl#(3#0Cl+#1"C(3j#)"C0j+#2#)Cm#*#0Cm+"C#1*m+#2"C*m#3"C*j#+#0Cj#4"C+o#-#0Co+#-"C2o#4#-Co#6#-Cmd*@'  JU]M+''%5%773%%#XjXA))AXjX)%ꚢu院uy@L+3`f@W_O&+&&546632#M++M/0M+,L0,M/0M++M0/M,#X5KPX@ _L@W_OY@ &+&&546632#JJOPJJPJPPIIPPJ,@)_ K_L&+&&546632#&&546632#M++M/0L,,L0/M++M/0M+,L0,M//M,,M//M,7,M/0M++M0/M,`N7@JG_L%%+667#"&546632`y  H[)J.VaZi;rZF-I)wsÐ'5F #/@,_L #"   $ +&54632# &54632# &54632#PP<;PP;APP;54&#"#54632#&&546632#MJ@Cwknuʻv_#TS>;1G((G++F((F+5OT;2GA)\gsn!PaKhbC2:0'(G++G((G++G(25@2 J~d_ L21%#&+#"&&54663326553#"&&54667>553G((G++F((F+\ MI@Cwkotʻv`#US=<(G++F((F++G(4PS;2HA)\fro PbKhbC1;0'yH@]L+3#3#)w)wH??H@]L+3#)wH?`N$1@.J$G_ K_L&+&&546632#667#"&546632M++M/0L,,L0݁y  H[)J.VaZi,M//M,,M//M,;rZF-I)wsÐ'y@L+3#`{` dD@U]M+D!!{{L@W_O&+&&546632#M++M/0L,,L0,M//M,,M//M,`,@)_K]L&+#"&&54663#iF((F,+F((F+0==`(F++G((G++F(d`_` `3+1`#JK#PX@gc_L@!ggW_OY@10/-!(!(+&547654&##532654'&54633#"33# anFFna iV ZZZZ Vi鰷BKO0m`{`m0OKB}p{3HK>rr>KH3{q}1c JK#PX@gc_L@!ggW_OY@10(&%#!+532654'&54675&&547654&##53233#"#V ZZZZ Vi anFFna }q{3HK>rr>KH3{p}BKD;m`{`m;DKBP>KPX@a]L@eU]MY+!!!!P\@})}+FKPX@a]L@eU]MY@ +5!!5!@\}}/0+$54$7ן)ʛvvߛyx222s 0+6654&'5vvߛ)ʞ29:222& h==3+& i==3+P; j==3+;+ k==3+1l==3+s1m==3+{@U]M+!!{{@U]M+!!{{@U]M+!!3v`{tNN3+{`uNN3+T@U]M+!!3TzT  0+55}1}duuduT  0+7'5%7'5|} ddDR0+5DObhR70+%5hP1zN#`%B@ J%HKPX@ _L@W_OY$+$$+632#"&54667632#"&54667)%ASSCT^Th%ASSCT^Th;} N??Plg(^;} N??Plg({`%#@ J%G_L$+$$+667#"&54632%667#"&54632{%ASSCT^Th%ASSCT^Th;} N??Plg'^;} N??Plg'`9@ JHKPX@ _L@W_OY$$+632#"&54667~$ARRCU^Ti;} N??Plg(f`@JG_L$$+667#"&54632f%ARRCT^Th;} N??Plg'fN@JG_L$$+667#"&54632f%ARRCT^Th;} N??Plg(J|3+J}3+DL~3+h7L3+R@ JK PX@(n~|o`LKPX@&~|`L@,~|W`PYY@ +%&547'3#&'673##,,#qjjq+    T ;?+B@? J HGc_L+*),)+77&547'76327'#"'6654&&#"3;AAgYwxYfBBfZwvZ_55_=<_55_<_vw^f::f_vtag99)7b@@b77b@@b7R")1@#0)1JKPX@ ~|KLK!PX@ ~|]L@%~|U_OYY@ +%&&'3'&&5467'3#&&'#654&&' SG7S[Mag'TK+ + BP y+  `OHP`O6D-T7)W@T~ ~e   e_K _  L)(&%#!"#+&&'#735#73>32#&&#"!!!!32673#c-f-oe%o[nxfoxo[o%bѧzz`kfzzelRo7 B@?Jec_L ### +'73267!7!76632&#"!!#J ?Jph 0 ʫVG 7RRd2/  q0iW9>@;J~eU]M"! +53267!5!&&##5!!3##)tdf7T^e^e >| 70@ JKPX@-~pe_K^L@.~~e_K^LY@ #5"( +76654'#57&&546632#&&#"!!!26553#!w'Ֆ&*\zϤxpjw"/DI/"R^'y oA_wMz;pUhmob,fjSMZ2 !-5d[Qbe JKPX@ f  eK  L@ f  e  LY@! +!5!5!5!5333!!!!#BBt tBBtt^7tt@W_O& +&&546632# U11U23U11U31U22U11U22U1@t +3#?Vw &@#Ue]M+!5!3!!#}} }w @U]M +!!ws  0+75f56f5f!55g6gg6w=o#;@8geW_O#"&+&&546632#!!&&546632#@%%@&&A%%A&:s@%%@&&A%%A&X%@&&A%%A&&@%1%A&&@%%@&&A%N^"@eU]M+!!!!ee^/}lK PX@)n ofU]M@' fU]MY@ +#5!7!5!33!!!#j1L΃N)0+75j)0+5jTZ "@HU]M +%5%5!!VEEݞŇuTZ (@%HU]M   +55!EVE;ݞTd 0@-eeU]M+!5!3!!#!!iie?k3O@Lg g  g  W _  O320/-+'%#" $"$ +&'&&#"#663232673#&'&&#"#663232673#a;2;%9: uA`:4:&88 qCa;2;%9: uA`:2;'88 q06.$U_16.#U_T06.$U_16.#U_w%4dD@)gW`P&!&+D&&'.#"#32326673#EF242'&1,EF232(&1<7:1-ti<792-ti`w@U]M+!5!#=:Z BZ9R )D@A '& J HGgW_O!!!)!(%*& +77&5466327#"&'&#"6654'3B|`{ۉS=w`}a{ۊS77.#"3654&#"3|{Vy1-Y|{Vy1 ,Y29%+A-:?>;1?>;)9$ +A-V^V^V^V^.FF'5?.d]]ed]]f.EH'5?.57@4JgW_O$%$ +'532654632&&#"#+;-SIE8-SI jwg jx^`X#H  @U]M +!#!#uӤw +@(JeU]M +5!!!!yL^no\\ ,@)J~U]M +33!##\jaqd`,I@F JggW_O,+%##&& +&&546632365!"'632#667654&&#"3q`s|b.fTq.@sIUG7dBdvwMI3gsȔ Di:OYNs==/j+"C#/% ;m+ '3?K@ JK#PX@/  g  g_K  _L@-g  g  g  _LY@2@@44(( @K@JFD4?4>:8(3(2.,'&"   $+&54632#6654&#"3&54632# &54632#$654&#"3 654&#"3xxx?<`7E?@0J~|c_L76$" "+&&'332654&''&&54675&546632#&&#"#654&''[ _HUeP^idVk]Z _HUeP^idWleP^^eP^AvM6=XJBK1"pW/S`NAvM6=XJBK1"pW.S`NcCBK-cCBK-9{B`7hdD@]~|gg   g W ` P  7 64320,*)(&$& +D$&54632#>54&&#"3&&54632#&#"3273#}}鞟}}|__||__|yy|ivZ?99?Zvi{n{袡zz顢{quulwxluup9{B`+4hdD@]%J~g  g e W _ O-,31,4-4+*)('&" & +D$&54632#>54&&#"332###2654&##}}鞟}}|__||__|၏@z4004[{n{袡zz顢{B#k)++)9{B`*3W@T~gg g W _ O,+20+3,3*)(&" & +$&54632#>54&&#"332###2654&##}}鞟}}|__||__|orrol{3113j{n{袡zz顢{:b__ab,,-+H:@7 J~U]M +#5!##333#####jn`aj r-sgaa XL%`8dD@-gW_O&+D&&546632#>54&&#"3UU\\UU\3O--O32P,,P2T[[TT[[T0T54T00T45T0@t+3#"@eU]M+3#3#^ H #@ K]L+53%%#RRq_q(@@=(J~gW_O%#(+ +&55'67463232553#54&#"ղO*9_SdN𸺜XMTV)-/\QkhJ_ ah|/ H2@/  eK]L +%553%%%%#RRRRhHH_?V 3N@K1$#J~geW_O!!!3!3+) )& +&54632!"326673#254'.#"3aJE{Y{a3  XPH] #.T6/O.Jp<  X@6U-  d` '+@  JKPX@%  g  e]KL@)  g  eK_KLY@+*)('&  $ +&54632#333###6654&&#"3!![[ee\\e }obo""""jB%Td&YPPY&&YPPY&w{!dD@Jt+D3### \/R'7@ 40*JK PX@3~  |  |gW]  MK PX@:~  |  | ~gW_ OK PX@A~~  |  | ~gW_ OK PX@:~  |  | ~gW_ OKPX@A~~  |  | ~gW_ OKPX@:~  |  | ~gW_ OKPX@A~~  |  | ~gW_ OKPX@:~  |  | ~gW_ OKPX@A~~  |  | ~gW_ OKPX@:~  |  | ~gW_ OKPX@A~~  |  | ~gW_ OKPX@:~  |  | ~gW_ O@A~~  |  | ~gW_ OYYYYYYYYYYYY@7632/.-,)('&"+" +&'332654&''&&54632#&&#"#333#####jk2.+1&*;MEeVRbj*#&*&*;MEk^/a`ks-r fXP&*+%(Q>Q]SK!%*&(R>P\cL%H%`333+y 2dD@'W_O   $+D&54632# &54632#II65JJ5dJJ56II6J56II65JJ56II65J7N &dD@W_O $+D&54632#PP;36GVHJVbnz.: $r:FR^jv H N ".,8d p>J:FR>JVbn  d p | ! !!"!.!:!\!!!!!!".":"F"R"^"""""##@#$$D$$%4%%&&v&'0''(2(((((((() ))*)f)v)**B**++h+x++,F,--n-..z./*/T//0<0011`1111222 202@2P2`2p2222233"3N3344N445N5x56@6b6z6677.7j7z78d88899&949B9P9^9l9999999::":F:^:v::;,;j;;;;;<<<<==>T>?(????@@8@@AA&A>AjAABHBBCCCCCDD:DhDDDEEFF.F`FFFGGHGpGI~J=?@DiAkljBCnmDEFoEFGGHpHIrsJqKLIJMNOKPQLtRvwSuTUVMWXYNZ[O\]^_PQ`abcdxRye{|zfgh}STUijkVlmnWopqrX~stuvwxYZyz{|[\}~] ?" B^`>@  !a# _ACNULLAbreveAmacronAogonekAEacute Ccircumflex CdotaccentDcaronDcroatEbreveEcaron EdotaccentEmacronEogonek Gcircumflex Gcommaaccent GdotaccentHbar HcircumflexIbreveImacronIogonekItilde uni00A40301 Jcircumflex KcommaaccentLacuteLcaron LcommaaccentLdotNacuteNcaron NcommaaccentEngObreve OhungarumlautOmacron OslashacuteRacuteRcaron RcommaaccentSacute Scircumflex Scommaaccentuni1E9ETbarTcaronuni0162uni021AUbreve UhungarumlautUmacronUogonekUringUtildeWacute Wcircumflex WdieresisWgrave YcircumflexYgraveZacute Zdotaccentabreveamacronaogonekaeacute ccircumflex cdotaccentdcaronebreveecaron edotaccentemacroneogonek gcircumflex gcommaaccent gdotaccenthbar hcircumflexibreve i.loclTRKimacroniogonekitildeuni0237 uni006A0301 jcircumflex kcommaaccent kgreenlandiclacutelcaron lcommaaccentldotnacute napostrophencaron ncommaaccentengobreve ohungarumlautomacron oslashacuteracutercaron rcommaaccentsacute scircumflex scommaaccenttbartcaronuni0163uni021Bubreve uhungarumlautumacronuogonekuringutildewacute wcircumflex wdieresiswgrave ycircumflexygravezacute zdotaccentgermandbls.caltuni0394uni03A9uni03BCuni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089 zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numruni2070uni00B9uni00B2uni00B3uni2074uni2075uni2076uni2077uni2078uni2079uni2153uni2154uni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsperiodcentered.caseexclamdown.casequestiondown.casebraceleft.casebraceright.casebracketleft.casebracketright.caseparenleft.caseparenright.caseuni00AD emdash.case endash.case hyphen.case uni00AD.caseguillemotleft.caseguillemotright.caseguilsinglleft.caseguilsinglright.caseuni00A0Eurouni20B9uni2219uni2215emptysetuni2126uni2206uni00B5arrowupuni2197 arrowrightuni2198 arrowdownuni2199 arrowleftuni2196 arrowboth arrowupdnuniF8FFuni2117uni2113 estimateduni2116uni2120at.caseuni0308uni0307 gravecomb acutecombuni030Buni0302uni030Cuni0306uni030A tildecombuni0304uni0312uni0326uni0327uni0328uni0335uni0336uni0337uni0338uni02BCuni02C9H=`%==H=5%2222, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-, d P&Z( CEcEEX!%YR[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY% CcRXK PX! CKPX!Kac CcbYYdaY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #BEX CEc C`Ec*! C +0%&QX`PaRYX#Y!Y @SX+!@Y#PXeY-,C+C`B-,#B# #Babfc`*-, E Ccb PX@`Yfc`D`-, CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`- , #B EX!#!Y*!- ,EdaD-,` CJPX #BYCJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B %B%B# %PXC`%B #a*!#a #a*!C`%B%a*!Y CGCG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E #B #`B `aBB`++"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-),# bfc`KTX# .]!!Y-*,# bfc`KTX# .q!!Y-+,# bfc&`KTX# .r!!Y-, +ETX#B E #B #`B `aBB`++"Y-,+- ,+-!,+-",+-#,+-$,+-%,+-&,+-',+-(, +-,, <`--, `` C#`C%a`,*!-.,-+-*-/, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y-0,ETX EB/*EX0Y"Y-1, +ETX EB/*EX0Y"Y-2, 5`-3, EBEcb PX@`Yfc+ Ccb PX@`Yfc+D>#82*!-4, < G Ccb PX@`Yfc`Ca8-5,.<-6, < G Ccb PX@`Yfc`CaCc8-7,% . G#B%IG#G#a Xb!Y#B6*-8,#B%%G#G#a B C+e.# <8-9,#B%% .G#G#a #B B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8#CF%CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-:,#B & .G#G#a#<8-;,#B #B F#G+#a8-<,#B%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-=,#B C .G#G#a ` `fb PX@`Yfc# <8->,# .F%FCXPRYX +-o,:+?+-p,:+@+-q,:+>+-r,:+?+-s,:+@+-t,;+..+-u,;+>+-v,;+?+-w,;+@+-x,;+>+-y,;+?+-z,;+@+-{,<+..+-|,<+>+-},<+?+-~,<+@+-,<+>+-,<+?+-,<+@+-,=+..+-,=+>+-,=+?+-,=+@+-,=+>+-,=+?+-,=+@+-, EX!#!YB+e$PxEX0Y-KRXYcpB@0 *B@ E5%*B@ G=-* B  *B@@@@ *D$QX@XdD&QX@cTXDYYYY@ G7' *DdDDvedo-2023.4.6/vedo/fonts/Comae.npz000066400000000000000000003713611444463326400165750ustar00rootroot00000000000000PK!  kfont.npyk} xUpe'! IȞB !BB6t:饪f ,QG@AqAqqApTEEQT 2θญΩ۝ in5A,kP\]pe7GLVaIuIO/gUW,qrtmŞp/JDwjp9uv`"¡՗O!|8Ed\BQF=$qlM`A$I% Z0qaB/,L2>m\cђAbZKC_(#Kk,b#%4͕,v ܵ` c%XǕ .@ p$U[-Ĺ.g۫3mɖTks~#/'~VN 5#'yLmpVI ԣJzJO^u#?)+O)ei^eYtjtFV{@{Bۧp|);@ye2^iz!]R:T蟑TMm07H|z6M ӞQr%K][lANKIuٽb*xQ"&ɧ͗,X)F|J̹TR L~ЮeTWv(ϫxY.z~Z,PY5?+IwY5Aџ¯ZV`ĒA:u+ɖM3MGrt]ͼn3 "mCdUHc$C 'L,$X*(#v=#Y Jd?zHN")?X 2$(G&I? R"DٍOG? Jddlc݌2, CJPFsp41ntVS rPʯK%*Us@o$RHhk Lϓ"T8Α> XN#I(OF3L#f:1FALg@3m|"ۙ ߴD3гs"1C+|/pŸoQaƤ~x69%624d@Qdc8t$}dK 2` w)K.v9+R ,c%ˠ @95.Cb= ЮְЮo\ rh]ckMlkUlx=p[ 5 ^56h|[`$N?3qJ-njd& 25K ]RRm a3Rz8T-],.fy1Fy|\Y:)ޥ2F |5G+@.v-R@}J}W}CH}X^iR%~% j 9D̑|琶CrHfG}H"ᣁh!2M9Cb^p #=+g*+gIC&C9| 2I$M"4L$2dO O%V&Id thg$ کg·*WM' @ DcM0d1)' ȼ H7t€̣9g|2DvڈۈȜc#ro#o#Ror.D;6 /F^4u49dXM:lDQoX@@zn9x]tAƝ%@_JD)#Kd}d5=l8 2==a{.}d$nO:X^ObXk781ܗt/e^.Wo%>w׃ IΙΡΩ4 fI sqB?o6Is8ӝMpM\& `y>.3'8xAF]?jkjڝhmI'<1dNN\H2ڏȫndiF©i6i^ϲtLu8J('F4"i2wO#d4ԝIp4(?'Fni}ӡhzcMdtv7qcu~ܸ'nx#\EZUFFYd>4xz CtLI$ƛHHxHxHxM2w9|NE;ʂ Ϲ·Ɉ7\#2pĽýF}7Gώq ʷ N>m_X7YӬ7V[n;E'})&J3%&ȝRhxx8OlqxU)o׋xa^e(.kml6?glr%z0q'mIH_: οݢ:SHm-S*)O*5S-RVU3V}^JL Т _VjS5H[VijBg Owzϻ;U {hxAF_=7wjxN@]-PݷvQ6[;pRw J'E ePF $d(z>`$1XAӥXڱ IɄ)ԩiKO$2ԉd$H.=+!B<x!B!$]^w16{$p0d.x2T٠d6!A-@+&]N:(HDϽ7dn"G4M3Gy`EOh"1 ,qY &,x7 Ğd) gmsᾋ-B݂qKp?CbR((_*}LNC%\s 1Nq/\q;=wo##Z|.y[ h?= /|h^e_T!i\}[Rz|Kt9hۤW.8Gۿp?_Q(0X\Qا`Nœ A(N3E@N_kiC@Y"F(8 =N Z[|π󩤟x6=F.,$]W<;̷SDw\C WO ]c+sifL !Ýr8 w܏o-'qv#]w(j #-wYX_%ZO~'’mAzpGmz/(o3}0_yo{eұ'߶k~?CjkMSMu͚Qkmm0ܮ?Oud/>-gi3OE]c1"H?6<>s 02 '_$3)4YnSL=du?&h{>~_9'E9+`1dA8NB=h$."ݭ _$ +ZݒѰdC?-\4Aqʒvu_c:~?lqcGJhp;7:+rw ;}!>v:G8xUHfWiqf)][HzꥺQ ;awﺽ >է-5[dGJ FB +C +C0 fֿn3]݈XXXQ\FA? =A.vKp/ujq3 p]TPIi| ?<>Q*Jѣil1ZN3b{G*/ٵC£B8tultwG  >qfm5QW- >Ěj ou9ީUl׾v~d5NU~%U.R8ӹ`morkHܚi+r'Xw31"~~z57[Z x\w/ \] hs1{1Ĉ8,tQ|)@\"ݻxCb06 $\Dp0 Ar 4|A 8}1/rػb E"} RRDE`\BMH\Ƣ*7bRm5ׯ~ S^1I/&>`1@?vÖ(Ogr9KW塸\~Cz[~k ֶvlC赘x͏p-X.GtJtԮujOjŚI Jf Q%5KgݿwӃ8 _a 'O {O %JgzK#Kf86&: UEUEUEUC&bqt@4~ 'ިMh'#~lpip"z)?( 5E ZEkR||ZTReBcby||BP5לg$+$%qAkڑ =7a5"f`o[Åvh܆88+C(̃M F3lQB@&C/AK$OQR5p\5L]i #kזBlv0yjzDΫ:Iavo92Z|G#hM B%=~:Պk{%*|LGxX,דJؖf$S je0Zdj0#S9A=KF !t~D5ԭ hH H?0w  ,ߖ4;,JzGi@$T'b2,eP\ zx1x?k@_$8|8>{0H)PЫ&.#'Bw<Dv]hvAz1r9B)xX /dn2x(sLZ^Y|'#1a+n(\F#1ChJA5rX7Ҧ@ hqrQ>*GQ5J5)Y^xl6o b˩'r"yO Ig82:Z?ta_|Aԩj^ '%Hu  Pꔜ|-"T0f '%4L<ăbQ x% `n9FxHO4ق0Se%e1%P@QW(Qh* z۵IxB*]P(MGJ#*m/;Ro3K=ń8X46.R&Pl3`bB6i IPע q@}aQmuΆW[F>ɞ/vQ">'_eZFA _D4-$:iQNHZ 9P4+r\Jnv$sErq3ܩatsr8dZ8r*߳BDM dכOS;Jߑ.{YxE)E^`aS6/mBCto]rK^kdIC&u_JoKۥbgbN yFV쾛K8BJGըk4ZzwDH&gxZH _.? E|Z 0pЫP:}Q (SH37HL4Mi& &S1Jd$\1޾t莗P"&Ɛ$cZ4hѤQ@Jȏ0tWնƮg\Y(ذNi3N+{3KXXGoooF Zv=j$J$-HZ:CYro|Xh$=c'g#8v2M:~ǃ#FX!1fS(DKFw8 1{b("r}q,$-1p%^a~ \Q BR$ ZIN'88R:9-Ӊ_J'nNtIPNFQm_b|Dh%LIij&#CYё&Hn"&DlDLUl!'+b$(g  i-'[Zx2ȢpI*@hTDkCsTd!YQ ZQR"Z"(GEDz*K%+*]%f/%/+ ȮZ Ȯ,Z Ȣ,Z Ȣ,Z Ȣ,Z\y\fwr"s{[qi-0  A @ig&xSg.eu%V+>Rq <^?;tAMLqqvy. 5[KT\Ef1?%a|H}N[yTNR/߃O'A+˞E4s"6Mn&Qx_?*Dzx8ޣH"#dDI-&$b:H?;#f4h"dd&WgO k^I⻧ki7Y,#p,\R· ߰BgѠAu:ܥt(YoIY?;YICʸ:{_Fz7x.ge&$!)zBq $)PmߙK ,ky}j{!S76!lZkĦulTӨ^Fiæ(vhiQ9;ɷ1u{!ڈuװ3ϵl|0aUX;_tw?ݷH׳ɍf*1LºL2d| Ek$C_z s,;_#uGݳ3adsQg&b+LD2ڼoiQ<:Оf:z.K>kS2Kbuj+y)a= ū~?X<7l3"Mo羅=w"Э>JS .MIz=#IH6$ ֧ 1I:$HW`V13"f0?hvzۺKv/;v{;b?n6muPя|}G;*6&0i8Mvnptc+$k?βcnĬf}gsth4q{mg_NM;pi]ufzlv쓳;gΉ}vs}U;fZ\_k.\\"*6 hj\Kf>۵Wg*Eh%L=-ߠ-7))8cz u|cN GK.}~E3eL ۷S jZ7(>(Ojx׻9>p(H^Bf|޸}h.odɷNhZ|bcdzw{o;;koΏt~xR#/VT :29Z-FɮyߴZ+ p9|cxZLoxW>>E^/,?!6)8Z:n'=s "KaY9hERRxPZꎓ֣^d"(!J9 $%j DE 8IT(:ӈ#98㈁đG|xP# XYMu$;2fZ-8Rb?z~GAZ"U+ѣ#;9UaFPO ^C7Qt*a&Tnkћ4Z#Ma6K[wIТ Kx2@[C DXl=0ݷ`%|K Ԩ.+镓59=_;yEO#v0-GO_De/Zh3-zL_˥Ae}1UA_m%ȟvyVS-Tx5yЏh2kz^O/7P1 Un2@/f/—MnX%y p [VhRK,|Mnn v n;Nhnwڻ{  _> # QhvG7vv~wqO| I)== p/Ǡ}pǠ{>;p?<>Ͻo܋_;9;Dގv <QxQcD>Ab룷8*(AZH-_KѢ4yDݭ>ޡ&r"߬^b~?;fsT[/m98 W-FNoEjm1 N(O0g igyӫ0R=?(`6woZb) gۖzVAyÉ/24=(#&XDR70g#c\~o~:3DQIMNΏb2T+Z%z,2fY$zIrcO)agFiTF _LlC=1sL-wJˤ +~[қR||B͘Y\_q;8k+Id%Ŷui-VkhuR308%\İY/ĩzPe 9#o+: F  \r6ї^;S՟ T;zi/h4"WlJ)9ŦĂ C#ѥg `Jň"fVGqi(Fh@ z PY$21q}fFG*Hd"I 4D`&&&7`cQ<Y<Y8}[<#GK /yG‹` S$tJJCqy+H!:h&@3I ԳTz bm#L0pXXS n`QH[n"cBÑ; ,*}۽=т޸`#avp<Gy3ThMPyMКjv\jiZ&kVYXPՊ)p|ݡn9YJ|2-\ei[5qiX\8&&<{,2LXsHH<˿oE{5o&Ewi^.o˳TX4]]]+Y`(Úh+1uZ;5+K*+=/jg_a-k^ϖG;Bc!)UYޠVoAQ=?̜6._4JYg!^(}%0OlUދQO]٘]MC(2Nߎ+RI¨39(1A&/O89pJ"ӫQN'J(mL]b (9=ȸа%DjbG-2^Ђ.%]@ bʠm r;hYQgi.ej4My1i1RLk7!A%[=t K7(PǙ@ę@=497ϫ*S|CPdJiO>xA8DUWiX+ed^K4f!], W]5oPxԺ͜N>Ϟ*./q+fѷR~5RqAu>2dwZKrFf`-5Ur',_aMXS*J~MiM0oA7W+>,`]!M+06+ թ)c1LZ &){/ZCidM(#݇㽈5F3fYBDPr!W硔-=Pr6XEݍɓ<cf*fj rxɟb1v z-=ݾ&{kLL\s aFӀxk-,' IBe9ય i=#M\2f"%'v:% %O W$ؤ)C,NeXܾH]M'_OGwoDuOo*)F:Gt i2 'ΊR*,UP'<ՃRI%!G;=7oɣi *eB^\h~b2s!׈8zhһq3p6ÈټdҼdy8p n]&{_} f0GƟF?xcexBÑcɡs݇w/Bc8'@XקKdsd/N28Cxh,tݏ$A$ b''nf׌#Cⶢ9TbQ--F.VӠtdO!p#`<ƹ8VX-,'+o/cBpV?w@Uf8~>%O +(QX4.h7⾯*1ї*?b'9%:;pقwWX;< |[8vJW۫mN7 Q4%e2MR6}N\&c2zXcI%S Ԁ%i8\",y1-Q$ƗA7nbQ U:@fRCi0%=zcADCv5+5t2SvSDW&&rsj9pᦱ35V 0n0NHgHvF#*@P7hX@0ؽa^&XZԾ80ڕ@h{hz"x zȴ>VzB&)ۈCY b|:N'Cϓ*a"xfɴلIC~lc(|3pcځC.!+y܄#V.aAoYưT.= 3~n3n bzKXt){+}qE+ӘҒ@D]LLe"Y,H<;r2Ʃ 42k|by\+*}(fZPki)-\-.55SLpn.\*:}凴ӳ^姿E[U#:n[\=;4T(˕4.bU,e{{b*C)-#ڏG)E t"%@f*'e]NNnv~[|mG^bBv4w.6wz@{r'r?4GnQuRuʗeb)YA Iu `J^:\{m&''OO7p<~<~<Ѻ3QcsGes<"zn UcV*QY4)dzٽ$fyvӒxʸ$9Ks4$aKs\^m& !7ئޭf53BT=6\cLGչ":~,?|J@eVj>ukuCtlsenl*Xk.oWEc:gsN(s-zzַW+?"Kr|nZkьt]T+VؖZ#[􊏜#۫w>yf9Ǧz?MT}-_Vz(\VlFWw(i>^9>un E[,vIvNaERXaBnMm*.owkk,׆" %?(jK!wK$]"%./Ej5 LjMxWM/A\&7L$nH0a"EԖD J(p(ҋDFc)h,TlTKaٺBڀRѺB*ZW L/*J,*J,*TL3*"J2*4"*`WDIFEf4` " ΰzWG<30O)z*c.儌ƥ"*^m S4G|S(o{c n~b }z9|iG]*'(GJVl 30z-m-HH^^*ޔ9ŗr=UoI`t_ ^`倳=,2ؐNCȁf[7BXTo dRo!YOBqm_"EU'̨IT^6v aʠnI~KGV$ $[q۩l)$.I*]_3h 18 H20Z>- Qo qyKX7$Q8A%7'ЁBa|9&hED`U,"EB I.$L!B"3r7 ^&Zo; C0d9.آ˭Wۼm!Ju)wOHXr9a{5+C[eS;/x9 W_OK6]~M*nQ_p"8B&?ho޵X[='Ot\l˅z\gR!&ߔ?<j@"J_I2errXx1޹.,HbG̑$i҇R\&ur+#=, &iE j^/jOo,~$>OkQL/qA575hŔֽDۨ=}BKx.'~&R~F;ޡwLGݩ.Sԫj+eRa1#Hq" 9{om]/:m2ޟtv՟ 'џ do==i{$ D4D!i:@z(342QH#L42T=K$,%5cB.HE _E1=lԘ8PJZX,6̢c>6ҵun*I#7fUSqZDŽ^R( 6 "S(g Ksַj4FJhfB;$$ d$3H&A2OR :`8zN艔,q\#Uf:T"dTP!#:rH!C`>ylm̔,}q(EJti;(ҜEJtHi"%:,R"𝓴>&zc:>)[H@?c껱ЗޡJTWK;Cm:iT,JŇC]]&tq.D.wH?jj~n\d/z/ػ Õ?[,iKޔ gq~Z qlұ a #0%0<_}ݍf)Boo6hҠ}m""n}yMzb>ڿU%a2f5E'|sY&"P۾ERyCAULv~aGC:ZKp- =߹æo&;uN6#0@Bݽr(W_q4??l(9$wqk/";.IGV=];ZEl,ŝ/F;d4 v6ŲdCoUÚs_|m!*>uF(Z p=#(Ȏ vqāF=@#_I7Z$6Xl. jnW}EstV#씺|N)_z]g(wq9$ӑZ.H^5=6wFq]u[Qksr vc<'(_-8Ȁ!A{{#CPoȷa;ҿ2I !B B zIM3skzka a׮k[ Y{þbYsgΐl{'Ϝ{Ns=oPR!S|V*8h"ʁɳ)ȴ\4y5VJFG[H4o`D,X+H/-m9 #%5nf /oV-dcZZxi9by'lo>evuRiٟ8ӮTac}|m}CV{ISkO6ea09sr;gևV”WP9[_A|O_5?v2%s>@ʋhox=4]};lZN]L]LQmEM>WMv`ojj 5K2k)l[lGP4;AV ewEZ(-p[ tp7%#b0ɇBqlk )d[Sȶ?ƣw鵱PZM?68rOW\NX) lm{T}B?}d}M2iaf o ҈R%}W'8(T^S_yNu}5,) V{zsWĎ]`zm mM1]05*%w ]Fɪ'Rk}ng*Ө3 -]r0(r (ZXYHiA#s\1({0v|ކa(rՂT:JjP2e3AA(J}3ߛ)Mg΢]=NcLR.ZU+ [p95{a1]KK?>٬GPX{:v8>Hy(ŞF}wLP[npU$5XWO!r}a j_"84$4L4ѫN8 DL&D!731v>;$2L pxKSºDae KA2H9]%Q)^>hI A$ć A](>P*~+pV(Ll #D&uPk,pc֫ Vw `JNHQ0&ѤV=o4c#>6d^ش{6 k=څew/|ig!\I! iFpVA7$LRPQJES䬖cVYT4MRz9 2pc+bQݼDDKŃͫ%֝}/ݾ'7ou'2Ubz̦;L>E*t jfD5sPB*G@jR^)н,ʿrgK(2e|2 F2WQcd\7d(uGvR1z{Z^|O6s1OA TҨSWS׉IZɢ<|yGD 76%Ƶƞ7yv}v=w$kBDp"hl΄Ec&*}nM,Gča9tu9 y&nR9NpIs L&ΐUGǓ]3U8ד Tm} fH~%nV]ƅz\2Qָ#2 2цμjX2[b#9aiWq{ĽD0v{#+jB{<iDA'DNɘSR$UGhEX~IɡӃoq8hxoEfoخ(Oj˭ 4kXmhMpxla[X?8Rʩ꒟&g(@SbҚɠS"Hm.՚ÄȂ]+}[ӰiX4p+G*k#{~] 1n]|׳sƲ-Wm-*l|>}szz7Qbʧ;^g]{ެm}>[έOгWsUw~RZ.ZGykh +5`(˚hEsZ4^01{~:[;u/>yK͎u!!](wY)fKPT͉%^PP/KhnOO879Η{~_!Z߫SΛcQ[r[A6tw2/De5tt<}, P69ý>1{juꯑv-n:ykA b's;G1dN}{*n4}9%<%ڌ"U͋&Œ}7Ѵ7FX0_4>4Y̓|iM[WZY*:g*E%g}'I ^nϵd]qwܟmT\. ߮FbC'kZ\acnP)o\MXCw4%;L1nIGz'޸  wLV؉s^H5s$n= VfpR er>8C3B%*DpVA |61PPB9C%(A@ 2J!P| _&soAݒ[UpAcw(d"!Ġ/]ITg@)Xw}u:;liz$Jp=SRXDH\-p4,Tp7&bۉi}AakM6} ITUq2bMW^jSkZ{<rJԚj5.pXTQp\{LƗD}R$Z2(](H?JP$ A.T\\\\\[+#>٢߁Z3Ih3=4rB8)B@Ϣw1,8:8br\2B 1>D`0 DB4 DDvf~hf~h#Bgqt wHU Jz#!Io X,<,4pUoNwwzf+j=bS=PӶmzzo@c_cz L ͨΨRuS5= s-r6P~@8<P}9"tylf- }, 00' \%C1@{g i  Ci쿞99;O8"#wb]'4z{BD>({B`u&} `gTgA-ϩ>- 0lnkSu Ō~ݜoGғlj}HTRfTv6%NBD{*rɱ*^zQ5'3 4vS^V]Y4홖pOfݘ*D,adidӪ$JٿR) z]K[QawzF#l^ jϽ `|z~ܧ-sy>OL߉ش;Oc?M0g`l0<q\dNPdW@04Rnцk{(-lys-)-()ڏSzaHNva3%Z25TƢ+d?[Ud=Ȝ[gY v&C+L;OAQ缇O?;:owU}ONOcP(W} 'p9,fݖFH}:Z*mJRl=Y$U$&";t^DF:L 66ƴl=Л#+ά4`́rrQ1F;hKGW6a6=.7.GK4r$0$:ˡqKq>U3c_ d0nd;~pvG{zR}Y>e5WW |, n _ hWGF˧ >GoYdkoֳֶ;n;rG}qKU{PEW7T6Dm:mzl3_a07ο%(+UX|-˷qr!aq/OQ>Y` yQ7C='cߞ}{2رO&!~Npbs5ڼ0tV3>^3ˤћћ0iJ0hmHh?F0 TO+}.5EC̥љ;iPjOC՞= mI5'ЖTO/|C?G;?w~3E?->BٖS(AVY8hchUsK͠y8Qϳɲo΍G'ju~#փ~M)'S<+boӰNMc1~׃fS]o}qs?.T7T=Ĕ/BYױr T#i,c@?k2a;\.߈eCD†E@ր7!60rh ؚc봆B5p[FpQ[R42 Z#ӌ1HF03Aw8U>>7˞3b7L̯0]sI LW"@LI/DAqmY HM㋁^c!b`.ujӜv\r5{-ҕZn﷋Ol(8ԓJmBn LI -[\QMht !'2Llއܷ䭒bVq;DۑJ;$Eq"{fWJXVk_(w[c:$(87Vvrc;.g 6=}DEc)K-NfGwFH6=ON̋-uoSڞQ\͏eBX `3Tw', iJR, !<t8t n9>G+[YwYzR$W'V_i[w{FTBM*M*(Y?hj ;U%e=kuъ`k QyZ3-vu02\@q"J +J?xxxY2᮱JЂSE,Iypej{0 na] R}鞄peIy9V=I |a4$z0g&5釣5^!ZB&V3f@Kua4{;4;D١r]a]fP_4R=瑔~?.Gx8 !|imMr(\PHRJW?Ư ԏtFW+r 2Ek !@[vxUWuDe['7wFKW+lmIX XʉRNS1SQ*b9/eܫ䌊p2 kbl)LjS7rUZݷf9FĘ3ٗV59~ɩ]X;Y'NYmg7Zxde|m7$:GE Xz׼w$|wv66Y*z}~~yڹ۹Y,r:.1{QdÚ/6|.RB70;6;(7/05ZXdc9\C[oG&?BWhw+MDZ+PO5S%LL{e534kI !%hћAXTtp[@R'\ ٞtoh<4nq5ܬM8]E|i*Km?U~rXt.Eԩ'A4r܉W=%Ԭ8ʔH&~aC z@ǮjM-0r1TE8aԩ 4NXF]zϥѷ+g1-clzhjit| i-qo1|Ѹw<@ l PeʢO_lYj4h,:zƤ*&U)0J*wޭRxJ*wޭi[JՓsT:Wrw!HcQQOvQSxI-'ZN+'W njQ_٢Uv}epSCHg^6q%! 5^ou'ʔ4NGNw1ߘ2_9ߵ#?30-Z7=JlZ0({g]57n&i ?5478S^@>1HQA4>dzXr**%XU>E.eZ_&bSJ~(/.3*V-cZ<"ôa~i*ȆE* u=vo"iESV΀b. 0t9#!0 sLMA[NC N4+C92$!] &CBe0`2 2 eB>4 p{2U,),٪XX=!1og>8L/Hd9 סrK+r+ULLbb]3^qdI>Md})2\D QVDjg"3HWAԠ·fp앨,J 8˄oA\%ĂZ Hzvq,H_7G706634ϛTM=%֧5ݴ56_6TzѰ^?\j&.Z?Yv[]l6Ϝf_n%׉gZͭnV 5$)N2L4͋1};9Wb.s5yrɛLah@\Q5|4#y&ٹf9j@vp~3O\:%.d,ʡh1 4zMF)fS%h65 ͦF(W`q&h{{:u\/ij]H>:9\hV?jHU7*B f/ 5^uyGs9Ⱦ500X}Lo}an2aL5VPS_@WՂ sqv8KG25t?O49f9֜`4my8 ?NDaKl63ŊY_Y}ֆl|NoЖ$XQ{Evu#laf3f)1;c{Td^fv'v>xOzic.i1<5d6`2%4/j/iy㈩6vM^q2Зkת,w\ Xr7H2[d:Vm n3[30|4Kҕ;"߰q6*)&IpI*vo6CadFѧEH~4zB1Mݍ35~$z>4ٵNۏ4߱wo-poluci썭w>{mvyFvA8χY5Rjh䚭hؐF (Wz@,B#Ӑ.Fg:1A#w#HoSBr*Pnx ~rʭR҇uFgJ̹Ұ F}+e#U{4E—G7?_ҽy<%ѫ#ojñ0[H>0݊p~OX}[>_h5Fm.G^[Tk%oos|`Lvh#ѱ*pƟʧ OaoW9wbj7&b$hNĥv+MB @0<4΃b /T`,!_!7AzXrk5t> |f~`~sA=P)jNO==ՎA|ll$m&NMovNCЛ ?FFNjBDŖ(ds}ލ'LS~`ŷQܚ*:yJ##AՓIZ ͬC:]MY8654yrNum vo ]ZqĂ0hc ZwUbvYZ( 1T!9cQ8KQ#";YD(hE=Lmn]R{=2*Gq/RxmO!4Fj%pQȁf nvnv`T~;Fe4sꃝv>i`Cz} xNw=2SJxگh?#ͽMc"2[IM1-@=_=y!ȿZ@ty)Ag@/dW1]fۥXBʾLZ~yW&|{4߼ԹY<,q*iS6R"9GѻuƹF5sYtVt3y/)\n93̳ǍXQϒy[\mb6NSG ĵ;S&E͏Ȉ*!n'M-)KOmTҴ1#)*R6}ϗ ;Av^V{'χ>dwDxHdxHT"HMQ:0dKe8z 9: [&C=i%IO2ҲEh3^F?Q'1p |Ⱦzwkwo\:^#I[U R 2@Q~}$ ' _#YMXpJ螐P/y;Kg֊5+xkz:4_bɊ*d& k kP)r>1{=ߕ]#QӏB/{LMExs ,6f*, ^$|6Yx<Ϸr4{E&]fAל1F:ZcV C9Wv$:}<*|6Cc4||PM>U>^¢3DWG`-W/Dx |f3ΧI*Od8=2=SzJMsobnLORF][yF>8vRtGDdG><#N^F!]Xu1H߭v1O {H顺mC;jG|mnmzms,BRSyع4u]Ntژyao~]V{wk*rg^H?uG61؏XT39;%zqZh'ȩFo4IN:7jHU>S.M\j&lIx))ҬI@ X3h(ث( ;WHuY e[ɆgϸK `[@l=p5  G6 2:Das.'x;AZST)B8sF>^ 8{#Y|.0F" :{d"U,)U5H,5q |i-A>9`E㹒Zڤ*y=}!.Z9)2.Kld*FPˋxx]G#z' B]x!)S}n[v*~_~15 _j.+ZH%9,RԷ+@ zeΕeLn'Gx]@vQPZWZ7UvWī y99&vV?BĎ Q(Dg뼇87I`aFYօt;!1$f! =U'XO0ЌXTTΡUUV{D߀YdpCdѬTY[_=35cqj\g Ѻ==ZE*K K[}KJeKK6刵~Fz4b{};v$;,&7 Pُj8 15!XJaa#?jzP5eHa~*L2#o9 gΣa' 2 6? tƕ7%#*pKm"ҾȟZY5;#:ϤRϥc Pc!vݾ ~ f_P}AbIQ%샥=\c|t1f':d^jCF~[?'V8UݫN ~\ j'TWMB&&2"{.RC^73Yz1ea7Z??[OsԼ||0Wifg}ݜi-kGc-&+\1(5 }s;:F%ձrIaIƧ*h%$J hoC`n &Oۈ*:&7 ^ "2|[[Q:p\x61*tZfkoo!t\v v7ԞB>˱_6Z'[C;$A:czWWmf[P42W{^w Ý9dyTdJjXL_$[7ɖ}zie"]Q~v\=dC.=yٗFb; s#C_跇ih\¬$&3Qz`li`l=fM4)\k5ZmZ_UPި/T<9!U@nck.f,22כ9# f/%/{˴eUUm,ѳbD.Gj~Tm=µ3Cv`ebɀO󟴲m@]'s&9ݝ6NW*:ֽCѳ%u;E{לS92g)Ov6S'uu+ <@[&j[#G?W9 *W͓K>K U5Zې[URB7U(թ /xnyԡ&(wB2ۤ9(B*@Jc|,xeA2r@PAND>=yPȼRW1@#MO3YMHqgȩbibҌ |3ѩB(Rs%ʘaE1bQh+e!U1Pz9UPNc,'5OeY4Vѱ ?)T)Wy<@ ǥ͚/BʢHtzWg13Bs`~aC>~_-j~~x@H?Vv[ VJ$ H<$ITja)նu7$#ƇP62_7o1l2Ӎ덝J}JS{[f dG"Y6z\[ VDN ko/Gn̎rSw\ozLOÍB/ilV %&kEZE!=™x%W;l*Nu]hHf[?3Vre[V17T7v,N+ڳCmFtus sK6JZI A$/f)XJAdmb][zKڝS"F鑳ßiU?\}qM@kt|}`Fh~ੁ5U:85'r#} mDžG>#t^N_ߣj#Ȑc>m!c44G3_c̹_3rs6I돌<%y$KquuˣV {W۶B:{OlW=ΚSv}wӾgؿnjݬo-^?{϶]mkF'B5kQ}M:W XL\Yfx60:\۱61G[[]>c瑶NZakI<{+Y.$ R_'u+f↚W0j4Y+qS*fO8XF;ă āhBkM4Ә՟ԮGݯyV~dZ(T!X K~#*"%21MpM[ 7"Yr$dU.#3̋/,YF<+ޕ+z8!#1Nқs4f(#8@M9$-mg} (4SVO:*}i\JB Xwxgq@ŖTl Vqo%C2W;sh-Gs}\j:^@4^HNjhƋhk|qwt\㻔ѸxxZ::]IǵtƵ4^Mkhw-xm㵾x:nZ7qF:nDǍw 7@[i軍[}xoI4n"7z ;9z+X9ObAϗA?^ ?>=d`f(2.?23d{'~#Ƈr#ͬ6Z_]̱#qm+Qm5 ~g8kh~;b4cJk6HbwWc..P/}IR2I^lYpFfDŽ*nPq0.EP֦cP{H"V  D]{ w 9^ rL%^i]+&&KBR;l>^c 'ޱ:YO~zaY:whf_h_ڒUOSE^|E٧CBs1xQO]H ~KQx )@̎ e琽bη9:'vSVk?rOq|__s3vG{dIJ)nx^k #ߪ3+HO{~1;vMlBl}F.gzٱv}71:3G?̋dZ|+G""˴V0Z^kh"B[֘o_n6.;hh8JtYl}yKR#z1ܸS-֥&rk^\chip%|[7L),2 |5֙$f{^d8; o߯;`gUMҽ^Ol@Wa$@WKĒ);1*VWglWB 1DШB%bVL:ZPX2ѓȂBeKuMZ(U8:;+Rw<:N-ѥp-EߡӠPt*pYu:T3hd)U*U*JcԨخ^N*T I 9PX:ԨHZAW*.Ŋ.]Ub: uR.:u r(VHBuTQSH=ԩu4^EǫX" 5PP6"uԩ Pu@g7/u_hw]h7Hq`S pcj`k2T_"q"&Lv63=c?# }L".L0ďf?D5sOFH7;Q[Ylv65kSa `u(j?L;^1ǘ- sSg SA/3d'f2.{fU"[SK6)i;LY#/]JT]BfEd:f39h)y2?lHv^Gy-!3!g#] g ˬ=&lTzv s{z^°%0}fFb W4 Fq,m!Kѕ 4RwX`I@Ț+E2-W`uwc' @#h`3vtMLBU持4rwS#hs{Hጻ܇\ǰ*MBF]-FDE+բ]s[GrJCbDTX!CcJr==TIȟSir3ǢK砢+tЦ!AB&lKSܞ,PUp:kJgPy>YsZ>|A]\sRRMJ0@]WbKϯ|n_'?֋j_o~E]W{ o{R#50͏ S-@ .>IɀH=(v[jwoi6Χv0 kEv{ /J"'e2y|Vj"Jm1ۋ73[[OvIZN|^= wTV/NnJ.<'4HDU¾,Yl/] |%tBv!Ծ/e*Q' $\/-Dm&^hA Y4}85ɩRUnt^~x w 7=Fc/+=0>'T?yM/:S-XXb؅ ,L]mڊ|MpC־a:7 Su,y>ΤBvԊFEzQuVhӌqs:_{M<65It\ GOP >*&%D{`DN -dCg9Dx=g '8xOojl 1NmɟJ *Y|/ղedM/BKe^пL2䞒I2zZ_joNj[HP_݅t;4"^xK8FOYa}M"pϴnl#4n2Idx ͨ=e|ڼ ?a~V8~_TN%r6Il&ssBJi '%~b U}V򽞥 B`għE!o|]oo~ʾ@45ͻ xJ.Ϗ*9d]mpy6^tK6V zb~4^4c %ϯ;؛K+lΧW[bZFKmR."#UT6)Md>Z$|qY,'A,6 &C: ҸiШxj 6 EܸSy}AP'pO]02onި(Bk"TE`"l@EpaO=B[|jGT;%%)K1vɴ굥|I瑗HzH=PM>(?עQѾU\R94h6ʴNuRT:?89_Z묃mf/s=jW,Wo3^βo?33Ϛbmw:LG;._bM.Uw,UT!"=wwfl|> ]nPTtɶMQV  KpˆY"= θ8?p!||||ӗ=蓻1@iJZKF1P뇦`[l-ӚF6a/Sf*('6IHPy:>lLAQt]k? nQp B(F%vys{z)RaR*JRR럦\ͱ.塟sbb2]'Fh@W7~~t+z &'v7RYX}Ccwh?!nwMTQ\=#ahs>+s;s?RyopoU܏yG7Wp#7Ow%%0=s#(=nhxɨ '{/ys3/f;.Ax$)q?cJNmNR-H'`;C/@|%/x[]\Eqt^xk*$:xz}mH~u0@{Q@ٰ|*H-Q>oI:Lm &'I)? p(ádPN<(ypAσ6-3]];dRpCnxtt%qt)AEYwO=ǣIX%z,ܧD$%""#kiVi"2z}ѣH-'oGŦfѣ[ў}}Z4O>)8 Ԝ,y=Tqۄ gC~|6!#5LQo>g&ۜt͜g;;CT[*;f6Yy"*9q֑)G|ԩw7@[Ofp\efw.M`+Ӧ{*4DNSwnY83@1-q*5,QXddAe>@'qC\1ϊVkʂa%#2P@#K,} GD9*rr6KV*&Tf8-8_s r5#sHjb:,i1ԭ42HKd 2/߾2瞅;[*',4% D&]oIAbKbXx5M[S̘TΫzLK1XQcaMS;y JΟ̳ឋɩ<SZ pƿ6o;5ftxm ? R٘Y*췎D))Dfg8>Pe|#E"F(0 I F:{F2٘9NN%Ș(Y1&|Nq20' /sϽKwkq\a9/U])կH>W{L3Uv!+|o#.v^6kO;I,BN^o[vɾgSFQnOw4qحn+ck>n4OM}2*7L^UsGuzGDϜ_ڵNڎ۝d\u.ss>uܩ/($d="tpg6isW['=tcu0o}kX zX!{9 ʥ=j]Lw伜\j7CG6TJ'Z7 |~mڹpFj䡶Wsyj5fyƢ]dU7 Eg/J^#>ȯ\}dg"!L@M4-zf{u |MR:9T;nr'<0G8yYaOG~:΃uS ; vmȋЫ/ӷgϳ _0γ'S1MFX[X{d?u J~7VRocFgOI_քNRSwZc;sɏv:kgxoFXِ! &7g HLcĹY Ά3o"NM\| E\_43~0(7@ 7)pa  |K1 C VY|M'St(3 i ?D~NtG!DGa:+D#p}>-4S D+ @tOGtGмqVP r:-tNo(L6Ԅ*4I#q*4J,-~. x7 q~Mw dq$+*ZgX]mw/z {]b/ۙvӘi&^b^bzW+sF quPo}^?tw?ǟʴ 5ߡ@y}+mBh}ZoYa^I5t Z|V݇}w6e7==GF{hoh'DFr:!,gd57i" v&E3T7' /Zӓ "ЙI?[ﴁtrŒICl3fXe${+DhȳX9NCP)pBaᥑQ8|8r|rF $2ɢSIaQ_FD::tI@4|S# eBj颢﹖&hf&Hf,dޗxΧc4~1h"_eȰ|~ͿȻθ+hde4z'{o*ݮEiɠKDb5";4<cn~Pwl#>|Q"t][z3oۓn.---Wg?yOO5cQ 9C8 ӻ]:[nȷ*@cze 8Wyu0 O5H=H"* ȳq+7Gy4ȀȀȀȀQj#胭c@!{Bj"sd\EEEEX7 "УFaa? 1/CͶ"4rznQYsnz^ (0zm՘xl_P&}C.&^Xk]vUvP+x+Rണ=hܯfCԮZ1yA싍 QTߡCW%Yd,"D+!ir~~WM ПosƖG~L=7~>. 8npe-CBB1304!|Sxg \濹%qI_%8!txEõh$oݫ4At+&140"TX%D%E]Ԫ=N?6騙H;rh޺9D;6oT#4dnVطox@+xbQNt K:Dр/z1HߑTkLs_B##LS*nk.Yyݭ9o&nnМfL2?7vF"s9A{Z;Kߤ"oaS_EdˮW,qHLsL OsiҖ4m\wܚG\wqI53sRqc'-ƨ8Rwѽc=zdiѣiHc}ar4$LaH)n.͹ 4C#2qG|,49o|)򫓴C9&Q WhPM)ѹ;3查ABBWVcCi :jV15bxG[쟸5SqbohI99WӠ~Д $:H1': YlxO+Ip?Į`>#M#81rs]9 ­a_+q-ְ]'j@^|X> =&=$uP(ەs`+ʶRVV5yYb6I%''d|_wիj3Aݕ:Gˤ!m~hL Ѫzihu ucS?㜵q]}"R  [U^VH weMd:Mbz]; b8z̵uvg``oc |eb\ 7 z8qww۞Iy\`=flō>k?i/h;,xҗKKۖNvZ+ͺ\K(N[[&(RY̓]kQx{o}tUZVROW:Cp|\8\ƎBR B]0v qFn@$-8 Q ^D@T6Z79ֽ5Т52P[#5ꯘ.–hޒfi~wRLXF~&h~~ߴ-΀w?<;51` ,BP,9gw![;=Ȋ3HeêBӉHFatl Ly8/>yL3g")yLd"n0Ld4 E3O$xGf=HA#GR9&OWmQح1/+VWlX< qtVVB:lt1Os$NO+ԥ G(CPOP/BGZkUb-VcuȷǨm>fk5Ǚ^3<@p{YcL,R z_y:3zcƃ7UQݥ>w I}>=?7R[yL>,oʇtFi؋Iiv<=f[V_;磌{.Oi= yd= s߱,`sk*k?[-QsZ7VqZO_A1;W1եNV. @`[->c;'+wcxٱݲ4v=r{ґq)2vz7wpNXڸ!q{MƇq>89 cw>PXhV@ } }6l}6l}m>nӆ>>d,*db>8etJub Hx 9L:G*Kujȍx)0we n$t2t?SZP.JRTW*Jk}s___v\NA!yX~X'RtgpTԩͣP ܘjﴝ%8eRo#> f[Q#:umN:K(jŃY*+eIncHm$XYڢQqcB678mhx-FÍɁBAÓ Ć}yg&VvPv,ntlÑٸs\bwyd.<{>.-#bMg%mVG'Ջ ۢK SUF0nQ/SӋ؝Rw n[$b\ bwi,vޔΔMQEB4Fl9VunZt@V{(t'x mHZNZ#C7:F^+"K!vb\\q/su-TݾSG/kܗ*H{7,mLV}rwɁ!Z-Wj%@ XYj=Ʃq3Kt9/1Z]+u媘:bqڊӊͽZGa8m n,E.TAь1;$8ltuYtfvuW*jx܆k\ŕv.l],M`qsu-%}o=UMzc4[T~OHV*{d.S?!_˾-׋K8Wa͍q-9}$DvhBttng;-66b;ZݔӤgShSlF>&BPy ?Nx nCl-ɥIWE6Bnvk-6ߊ|[\4˓4vIͭfgNZ>mH@je41~ga|C_/8*MJqR%`QG%YiZ֖yؙ;b;mW̅`#eH٧zhyv#zl(]ms}QlXrv/KD)S~4.>>3 )n]5wn i=qMuk`U蠛Xio |$(5Q@CX_j`k#' Z=L:&. Nf L&J1/vAa%a֙>Կ." 7Ǧ;Ѥrmtt70C%nQFUhٛoTd A\wJ?'8 ,D⹱4rJnRrӐ4,Ӱ`NÂK_#B64E>hn@׃x?,4I(m@BQVUfmjM6vݕ~Y~C$FKBNe.w4?]$D:ex FIvdz%Hℼ7+H=۽ō[nqZ.B'rNlMZyl-J=+~/ zG8$m@0K6@c,`F'wY*VKYK&4֢cKzI2RF)%GuZ<1M망Il @llX=p_TbCCCCCcA6ǩD!zN &F6L_=*V_T$dGeNl?T' r`iշ^[O%dڏٵC[ I аzZbg\a7f9Sz>J7tF|'!`"fO}sԷV}'~b?f1W9_J6 G}3߿QjL9^J$rJ=pa^[['k4J_5>4q_p#ыo-32DH4w0IOS zV&ݙr>; oh7Ĭ:p!|e"J>LC0 Q 425*V S S Sil@+ƒ)ON>ҋ/& +*D@X7tc&I2:i}1L bp p >,ž t#T~ ]/`~'-FdL 2 tZsr 81r"<)x0&D^B#;PU!A|wB=a~c^oVCh7VOYi&}nTZuL=E?mӍP-~ m7Bsِ,@:HU*R9|b_*ڄnAJ1^AXDT QB큨BU@U*}q.*ʩOwjiz'c5c5EmZfř5U iie(ܘ-<}{3j#7b[1n~q'1b}"k/A,Njr:"?HT:r v frkѠ '\e~7}ֵ^N32D\z\#_7??PYD2o?[7qd{L#G|XY "D;ٸR_5W u>PNUr](Q>RZSY44qk`Mq=5lkc=ڽ40qOW'gl\b%p#Gȉ п0% !cdYB"5.R"0-hxdpC'PGO<*ѱ\ދީiͩKf ᄥ΢IΐsW$"tE"B{oKW3p.86it zAD{}. #}{7 Au2Dy"wDhNە!wSgPTGؕhCgR)A?G;>%ogg}0'`"gs냧\76nYGqM65]RUDeyTVuWu6666Ս-3ʯ$IN/͎(K 3l``k#fr4=Ҙ o5'[ӬFFٚfNDB4lllllZ,W 2,:R4lJzܝzF(@?Cr^ɐ@-8 F lz}/+8yƵ2`3,_!V).tXtHuCW!j jvmVcgt5~մFPkjhGg'kWOgό73Tuz[[FgG18p8L$ccEO|DB^HkbX+:9iƘ LČyO#} V}].ߍ eGI  tX~5J!YnpnaN - q-NCpwWcpMr5n ^^]X qpz5#DcICзOF> *BX q:cH,Pf>R.qB##"#(2J`.Dp"yEvF(QԵjzh4~+HWl9^~K^j:%̀9w3?*cb40~yހ.Hoxu8! hfWѪ3htZпAFEFFw+Ȩt.Fb;5XJ&atBm.ibd'Rq.rhw]@x". h' ' 0_oY +Z mũ%zλ9Z6_1z^Ies^2G\69jLd:L0az8zYAX^>xNiಪn%q q 0J%fc}_}%UWƉ(]b8%bi1.(FJ0V$B9ܔƺ/I%8Yt" r.80tBigk b '&1Tй=]=Egtr;pw7A*-RQꝊ~G,.ۥ7FBЂ[ -[8A9ݫ/אsAG [S(')ד/Ҝny뵏UZK? Q+b${LA^cM:ƻz=}vF{C)k ie!~~*ƃt-7Ue1;#m|D־Ӻ/2]y5cj7؂U]`A#X3x_t[x(pQ*V*j(i|߬@4_fo-PYk4CGXۧDz\k5ʾԎCϑ'͚Fѫ.NUVr^VC%|]dZFdDe[ &bkt[^\ @uD jGB<,|,&YjeT 7gcG{>4EMQxP;,mQqV QrwsAt!lprCۃ!-]b,];,v|FNgꆌ Od Aӆ*1G揢ke\pb?(8V]EwRƑ;>Y!zt4ӜS*G)oa$ɰuWjDHDa&쿉 >LQdGt &#MFD196>9ٞH?Å"39[((\ 3#`k2m%6JY: O >~mD69+K %MZW>mAcE8Voc'Dd\MBv/yՕ[wy&:lgQjҒ~F*ՌFAW+̲R43Xcb4 Ϡ ]k;9ZjYK~Z9hN#z^5 r{[,5ӊ&Gm)+!ct?.UtCͪF1VJF^d/*tCW; d `WΝrGG`)3z#Z1LmF#beA@13f f3JfC׏XNՁV"8 l=IH,+ieJ*'я=*;ZwD^L^]_¾".tc!A藺o_ʳٞ7ls U~FK[ݯ]wN#Ao! B(ưo9Db7]"Ren H^쓀|NkHE8!.)s:L$7#FěN3NqF . ط}+_ _^vzGzi=amN`GhLOgb|a 5oX5kXx kkuǬ`,< ϽET</ ,:eqѬBh)"P@T:NB$pϳ4DZ ;SQ0^D*l:wa͑71rP 2`Y`dv"F~o~h5_64y|7{bݣ_%*ʂ+I\9A9 ^A-j{ԠZx+cq6K{U7璷ubdVI{7zllv͗;hڍʶS#}n~&vG3;}=v;r DV7&v&!~W2!8P c2/L7xB;4vnb׍qN: "VitJ&!^+t(˝8{^Q;^Q5E^iƥ^Qгe_YF]Y⹈KDAxHGx]v`؁3vb<=f eV@,bV,VaX$0ց#?ہH ̄ 0 G(r_.؂QF ` h\%4[ aY%ȣP\X~kq`n,R(SPn,zZۯ=I[?w6lcqT~-^/o7cZ6GN>\>ѡwR;̡oܯ|5y[\( /j gGGM_fOײv'{>yz*3Ϫj|gX ^ċ`,7{k\!D:sʼn]lDmDm` ކgoó`coXwЛs$A!4 9u<4LR:0<_D/_nq>}>}>E4.|黗{"/Bᶻ0`P—;%1g,snTPs6:Nk,Dh\=~N]kM$toi4?ۗ é7B^}KdmFⳋ6Ec/䯙)?v͋#U5ëqa(jWV]!o?l>Y\<:? W dXwZYuu׈x:cمxT0L;J_cZeZoMq Yky(1̆7yf=ÚhrNLނV'U_#Fv_tu5K8֥ Z[—W8mͣZd~x6ann #B_sې]B|_!f!o oHۜqP-Iv$1FĶ#jbP𺪧ZTF6۱M  a=2l4ېFmLTΎkkt@P{uPGuP:mDZBh`| Tkl9ܝ3a;'=~=G u% ClI’+?,Jؐi b?}+gUF3q܋VU=BlEpRP7*dWvH5xhGZ4G ZK!4v c9^ćlɈqTh j 9?[f%+0F^̅Řh\؊s]LAǹd) ؈ `<a{!K8s)%qr:@\hJ:^E W* Ą.oYBݳKtijxVq \CWϵt޿ʳⳐG¾|Yx X$®UVVVMؑIDl^ǰH+h Ed4JFuSpXg >}oD`6>J)V"m%]$M8,lؚUiHXt Y6Z}T88+t=H#.7V}g ߞEV"aAÂt$vt#lG&iU [LXL92a32a;2ȄȄȌU@e =z?"I H"Hi ONC,uoŠ(FN_~aǰ#aؑ0,I0IX`}4 V?!FeBc'zo6Mshd $ [+1/LC83=2(.č 99b,kzL^QXf#~^AȃJNjen3|a"^d=JzP!#y$3XIseӃ2!.6ޑf屢跜J5\~Z%(e^KၨȃQ\/>Of4$L592q6rjD~)M|v+72^VGIwRg|kQ߫!iͮahcRU,8BAZrv*,hAgZpNѪ$_DZ1+v}mפ]^㻜c?M3|õ+6ڏVmU>^P~Uѫ?Ҳ:ϼc{ϏeuKhqpLjK͒>VHp[ uZ|[xωiÉ΁Ntc'A`-OBs;̝0X*M"XAr)f@6ih@?N"s4}q.M/RM5P"fͳYBAKɱN)hc.M,gpH(9O5tnQ|H5s&wCS9(M6hu$7~ : jsYd4.TPV)CJ35ߚj]EJč NeA)sؐkw6EU5X*Y =jyz{P>f U')!5Gi4޾Zn]m]BFrڛ r|:d=ekvW"IЭ "D4_)tdZT&Oq*8$q< 4N@N?#D$!u>ԇׇׇCB=h==x~Zvfu;(%R @XQ<艴rdcٟ ώ5|ȡLqȕ% axa,F8P&=p+b6C& H:&(dPiV"%1|O$'2臐xfN!-(gHG"j:B"!!tэ2A8"_w(iQ*aC%BB%0JJ֩|rr`ϱ56?˼0h9,4Lo>Ykhvr)j4c2+ctC^]T6C{oj̵Rsn6&yθ˘o0{@@r+XVs  I䀲~FZꗘA2~VRnZU-[=3t{9*xU|ލ,?kӍf--5u=?uxبLd ]cME҇(MC=05i#:Lj#a#nt Di"DiRB=4dvd~UbaՇ @ _Eb?1tCL ƶ|kۂxDKD:6\D^] xWV 2&vAM_w"@˸Y Aft.5htl̆Ho瑱HOtj:5]k2r#[tikqkgkokok!ſ4k!Mhu-FOt19?aW%b7VV60CN; ђɘEz "94rA"aDeR/U{>¸|~-Bb~q,M)P.d~ 2 <ݍN3N3:M`d%yhκq:e +Zf{\A'V˴? J"gW~%EY: 5Z(*7~q>Ǎs->xŌbN_Gb:^SRw1G_I-{?h g+ o7M^icJj߽Q+XR{cu~Py S3fOzfON'8xc+x. 3(HV@3tj[9 axE>9Q~<4y" ]`u ] PTR-O:͉%jp3_PQ@B UA|O'GS[V:`~R1^ԣ"22vE.^B".w#B|^EB ԣ#ɔ;R4ʕ݈Jոk-Ĉu@gܩN[4wcz?6LԀHVL`!dR^Ÿh7?V@o : $SH20bbV̫k!׹Z :7]/z=!nHֲdid n7s!ZZʈy@̶Ǎ۝A9NC^DL&OBJF +5G(9^1u1cQ<^2;07Q<'7QQvk?|_ 1J>%vâph=>N+#"}g"I{cA3mw ;.%s<y؅["qQ6Amw=ʫMFiix *?駺@Tj)e"khpQCjt!zbz^($;;d<9jfOЫlpϫÒ)g^Cu蹪i(LuLY!{AT&Q?++fAu:^yEeʍL[%ކK;cbuړVPU6%`8Q' ujJuj @)gOkxvc D uDoɱ f46 n`F@@Ȫkx9c99@N |;lnsz6_\v7}bMJ"Ρ#h@Ii&!n0zܚ! ^%F-}ΥIF&֤mގۼCk߄&m^at4a%]R\he2ͬa6̕$9{3\ZI_m-Js E `t^jm NގOBFQB;礬@Xpony 2uԚZ4rlW7텝etVOj5ȨּMX2#Gs<.7T+.x~Wf:}SkCWHsZ1dC}G<[٭rhޱp_vkNqK_-}(} w4r8Zt ͍2g-d9=ciN)]ڗut)kmml-׃Cl A[x/ +t<6tl$dv$AGIh$;`NFwW8?ժ&SѩTxNV\*:zJߑAW7]Kʭh+:>>qtu5gݎ'GA004&H9c8{c}sl+71F b0|!4rbH̿"b9D"8ΖM3F^fcM5a6lxȆ]~t삨B"ot#n!oA|v#;.D:Y[i3l\5xdtw'ytN0ۭp0yWrV Jӂۃ#yRTEu*C;:yh'{ؖ|GVri6_ܬ2Ө 'ez<:N ȳ/&P?+|l) S42#6F▾[Z*n@Q](,>suQ uʩ jXԥYS`Q]xgVoLf@f@f(k&{+sxN߱?yk\dsY eQi U'Hƨً֨ h P(KԣbU*='R9Tx'RW¯H_сFoar:4 ,,@HKdq.oҘ/"OqH:BA"# 12J|::-8:I6 +4|1Ѕ6Gm>rM͏!h_m臱Wx@l`Lr3IU6*-[{z)d9||6- m>?6\!ޝI^ m5MQ|%JB 5J cE;F/0ƢutDa.y"%m5Dwշmzqx\"Rߋ[n1BsTu}ݸ|' "6ډǝ?Z=`ɢD\hzB0brAb %1X ?P?Jt/Bd-JT4FnG˲WY~ >|/oq{V3br' Ϟ~|~x$ϕ8t>?0udT8S`x'shdrOKᒍ;H E!n KH|HHG0X Ib@ "Ɓ!`]r@p6> =gpB>rZaZimb"7ͨ/[̧̳56]_}۴ ;h3r#buc151|D-~Yu/3n81B9ݽß=}ϴ۴>z~)8C*1m_[튥ji,Z[+awG[E}fyHXKۯOwjƸP[gm<2{V쪻FqCf{GފbFA]g_`Wط4vv],hu7SeR0$EXrILŒҳ ވ}ʼn~u/]Cwf>H*0^;{Y dI*C(qf"tLo#2$@h=0#L^:+^fxEGAὈO{{a셠>`+C eH(M12l < ^62lrea+&XI&e(&ѥA#rAJ 0PnzT!-CDD@{'rؤ }sd%p ,DnuK❬x{ͭe4c]o~+d /)P8WN)8~eFFK?Fn6Yj~ƥXmzZwgU 5zeGO]Q|Vn#htƩ1^~#1AG|K0cvxZ@R[RʙtT1Odbȑ;NCOD!; ā8؟HAS&)P 3i}™瞤&g2rS\L\Le\uv~=(% F(+ìA Yј? 9MYʽok+YGK_hnsnlJ< u g= {s5$ 3p.%Q"# P@d=4ByE9Oʉ'0)k5t*bAޅt$),gz*<\e /ua 5/bFEB{9&pf0+ uzfZ.{LThm3^A& Q ll~~pmz]uB\NTu"ugkJ'rn`nLc:[aAZg3ͽ#˧P>@d0Y`,u4ff .?IEb*pXl@'39'6ۚ(q& n p`N KBX:Fgx̦420::Ki.Wv\Q.x&Z$JY ҭ,:OO׎;!*k?MPMj_'7wxvi$cUɄ-&uDӄ9hV 1 7mQPzz聽 = q|B N^rq*yń88rJSzD +q*Xvv7ym4:')(dtT2V#M4%ٝ!cB⩍z,α&5/.3I&Gc0+3XVC#Wqt<\dYoQ !Ei؞{l:F6g g<>Jݕ0+i] 3Jx+şBcԮW ?CPTAxEE0Gڵ]DMGSb:sNH+S!֪4I|%L:3Cov:|*{!ߙ~gu4.Tʄ> +ƻZ&\W{09(s9s:gMsK9/kk>m̲J|!e{` ZKhl]i\ vw;0{&l܇_%s`ܣF$?e_B='˥,JG[5-bمoCFPEMo bhQ B,A˒aLa8َ33Nqt>ֵΟ@Z?cSI? JI Fk 3--ƔZI\G ei]"KCd_Gc;^:~QwuovK71G]?;mtbbP!vE[:"<GҖrG" # =ƴx 6+(F&g#fͅ9O-/l4Oq6([? 4:":3g ]<{V帝r?/9n个8;/a_O=q+v?33y©[UN# ˛\F3]]h=B֋I;;GY֑VY C熨 [p~BEQ\5v3^|oމ[JÇS#A(FzӘ* sDΕ^?pq܄d  "Wܜ-Hl'+#)F@0OPhz}*m|(#r2mRƙ'qyѯǙc#gZYZ3 ?c l3H_whgxޫUL;Y눵뜏aoY+VZ{@{ojhAX}^JVLqYHߒ@|z ;ޭoy}ǭodk4٫mL?UTN߿0}ŧHs)7;NgqRB8~dP_Pd)YqvaY,Pb i'3>}0!4Ɵ,{]@{i[ kKi;{ 7'ŵStƀ(cc@'OpJ!IdYC*,T\\ͨR^Wq7:_'Ryb\ԯJym7^\~a TmZywD׌O|,Yc?K2{EӦF%L΀.IvqPH#!)]D&邸v#ӤXMag@ 0Q 09 V9Ui*)ځH*Fה2)@e2^wtd<<.-r(2sxQDeɥ(0't_<&5q9Ώ8y;I&w:`tSԧbԏbLO$xS7[v)Z}L/׳WǴ;˵:oЫݼM&:vvfvf+dW>[&-K>H&lAVw%yh!`]qdژ=F;NF9lƝ' '3O\"YYKW"ԲTRmқM& Au gX40@kuKoЧ=ZL;^gCK!{)ytTSY m6 u!) .:H ww'P.3 W!ezCarTC1&KG?K:QNNܫC= C3!+[d?@37nlo/bWE wϟigWEbjOZiS#ȩx|2_0d4;+HzO? aabbMp>n`h~5ƾ |h G\/E`ߖCoE _mGSc G2 7DOYkߦ]_Kl\Io'CO}+rU3`N2(EF%%+|58oIJ ")U#QRP$Hxt0ds&gU,]<,II99qS6s\x%]{ϫ h(6RtuXUSƠde!5T8íT` tU^E*bYŲe"A`s|W1L ‘,8Ⲁ䙅%@ʢQŞy*_ik54.QFex#VQوzHϳ_GkkRdtlQQ9وFtVkDe#j(Q?3}"~CMP%DI@{vv=I]Z"6Ԯ;[:o_[|Gg]S-L|zχ?1xgܦ\M7+)V < K\lU#ӵo.U{CT4ys55rbɥ2,\3G[]Ӻ^Sä ;@*kq=l_OGy؂s2$@LI%shcd57l9 sЙl4d%6Jxׇw7Jl +A.Ԃܖ(Vң^K% . 6Hlg\J/:4􍚥%f'hp/rcdIħf/~ՠwF9%wj,:Y6 ;k}=im]v,R? }D}Ŷ?{726|Bh!ɸ%Mim_ImZ}"Y~OwUfL7+y H^'`JqLtU@b٢+5Wh󽅡_DŽօOr$oki~{`Js[Wnl.)6/S쥑Eײٟҵ OZd t9_HzJ%w^d}oecpd4JIO*Nn\%2{Kh!33 f4wF<~7ޡ>c ml(wiihzdC錁LvӤSAՒ ZU2xVkweI ؄s*z 1Gd.Nd."}.`,i)sF?Y6*KNe)کȑF@J=ڪ (54rx:p5hFnJ(A)t zNcA=Gc"AE@҆TIlD%ۜ6&%m $ ܝjlDž\K l!~m׼Cm\f rʲ3tsxRHWہ'TDD9)i{fş=Uz4"Mޞ]e1OЗ@SEVp3)ο|Nye֙% P !H6ڴeBL ,6X>i ۚwniIOlrM~`s3PexR# =5J^C ҕf? 9M\vF'cKC%OjY W腢 My4:A$pU 'g \Qd1Ef{l(dPZB.|8YX/z^D^+{#EK/I/qt}+dslImydȪ h, ?Q\\ !t*|l9L5,&Uo@,YR7@klnMQh ~$g->k!k!k!k!ki&5dx˔Z)JJa0 AubdHۤHVxg=ctOAc=N+XMȷ;?D>RGIvZ v:Z,WI\F>W_ߢo׿Ɖڹtmq$jyt@nk#:5ʌF?Qj_E_e٤C~69ԻeIpK`psWw4e`5_ b+_X;' V80I^j *$F?"f$3:1[.-NtF$ReΝmSۍ#3+[pДjm2ߕآړ |}O_/oY|%)x[ >ilL Re1| [E\3L2k'6D4 mjMKmm1»#\P?Fpk8'W$JՒĎ9JlCW %5T]9#8d4yՅȫaȫVК9ZF <:P.VA"OG)klO=n f4:c\4"Jq*\t*#UA?>RXBG /"sI6O\K%&<@n/^MAv!2-ϤBJSbKuoNw8 5v !B&/lи#M`WtRz +7޼X)qllu*dҢЏi4rр H3in֒iWhǓ=QGW_M֋W=b776iI s=A5=qFךh([~M3 ~= |*EK.]_ e4[kD]=r%P*KFBnAndoC!<CidEOTt>dؚ )^q ynk?B"y$UYgitM+i5z1.71m}~ ؕѥs"LJ?ly02?|bhlwo'0^5k U)?r_gl<3Ȧ?}j߹90Hwwѷ}+;23h(7ԣEhѬasY["ccVyYdǬ\Рҕִ֏*?~̺C 8FtHR[5;%J:5wF@Do(~*t+ҭDʶ$8428F2/d"L 82ndȸ!qC @ 8Pߩ ,J@/_rn:%s] s 3pt,MR I4g{{ =pxdޠ`>d |㷯uUCPCPCBHSdYd٭]HB:f{"+H;U {d6OW:-#M:Y[_ezݣ0*76i#cbqinڤugb41wT&tw+ǡd7lų߫?܆/-%pޞ(\9[Jt8P<8]^OpneO`z'H's" /ܮ\$9΄+u և=?*yJ/y|'96ˣrGDQ2 t:4nMy$揄@mӂ4quhwI_ wm^L^.%]bwh[_b0L$@pYerr[lfK[!SP*ly_좙DIFX68%BDAQgZȡ A?e9s!h(i,BU#ٰaugi2tf֣;wrBA@qvy/ea7Z9iI<$a- f*D2NO?*4eRyCe7M 2ٰ: <"-,Kh5~Ӑ_NGF`^tӱSN^9taL9{t&,$Xh#(G7tta>Ȟ{@<ʞX b}&-!=?=\9<ʩҿzQʩMI};0ot2+t{Uk ݒMnK GICtcJMprPdE^FhYz4@()6]aZ-K&wMcC#Hίj<=}ZfGhυۛvTP}֮Yc:?6gwL:PC|XfHVVк3P~[vآ O{{7{ܰ"kCzǼ^{owg'H34vVΓ=_^zJs;QSj+pZ?_eѻ7+/=gS2C;S&TJYz1#34SM#3~iHLBb_ FKԙ= jN`f%&,I2h,$H)XZ"}II0Dҧ}jJ,&@i$I5hd-rZT5jhQq/k5}iXGGMg/mElsށlyW-I}Iu,[>q֔CLG*,z9յo OR>3p*}!I?A _I+ueD9F#UӁ{ =iT1n#+1藒.nL5vɖ~.vvI߅ A?L#tAWM {C'E*ßEΎ> OwoށFm6;OOըй7B#krlǾ~Sg;4MfumWO{%+l.& 3ЖΉm , 6g Z[s/[\W:,`AK˖6Ǵr7rlm$=y^Z)O%=}*^p՛6VmCMG ~>`9/ zwL t؁hdD:Ja+ozn) <,&v uM&`b vtZ6Ms൘OGQh4 է hqhzx;9~'˜ӫp^/ d/Zj{}}4?%)IwN*d&_:׫tĮ-N_ L"5cjU%zǃaKTHvȮ r)fi;1 ؽ2ElT?q*] 8rBP@(b *!bIw) Fώy&|Mp}O1!~'ow3#FbV]}2%T~7Y?2Kqes^ЖY7"< Yd Sg]|Αx2&nnڏ'&!q,pwRۻ?h5}с@ / XDRG"ѧ >L}c8ƜQAg,eJ/<y,2A˼(d2"zypCwjd{1W>ئ_igDQ6~!Ŏ$޾xс`Oݎ /n㶧8:uO4]']hіȚ74ў/,n 5Ȋg:w\jb^-/DWEi% M}&- tہDUjJ}~;#Zh{67 R(.86#pp"qqBx[?#J[oXM2r`=`N6ynVی|N5fW~]U|u(69r/}_McrO 2P1M2i̔LyH80@o1[.}{T]Dr8&'D4U݄`t +SU S53j" 3dgCHοp: }I$]\4_",}C@=߼;-BR' lS #zH0i׵ұ~H!'e"H#yFh@ Bӳ paH GVq%u2p%2W"p% E%JϯD4Lv:g Ssa *4kPYi֠Nu5ԬIU4xWyΦ*:B*Ϲtif!CN,]}:tէl S]XT[VI.m yGJͮgF߉D\.8Gs!\x ^r&W]__\5}p y9 sRe弬¼U:8[xÝeFE D;{q(#2 NoʁˈF8 (p陳8:_(ӰaI|, jx8-M:2]ED0=im6!!zB_(k V}PkA>[bSj(PʫSl4rlsvC1}>r #Op>PCݞ ZK5c!!BB 1b,L08F6 o909q90}6Q/KEޜ\ys*o.z t*A0A?Hw4L -O.rh,ݡ1΂@Ypqf( \Dڦ]!;/hC&&+~$šϼN]CSM4{I Qg0Vg |eL2u%H,CN5Y;H]dq˝a6voicgKO\tѺG^pugRU\&r,re=N ^pы>4֩=jZwx\nKm<f0.rs%0%8+A8k4} h%p)X` L ܁%8S WYIgOlW*p*aΤy4I⼙4 =z@|] =d!4zNj#,Xj0aW!XpU5pXsY}}Hf##A#-G J g9WC.\ʅk%]U]/MDd,(soҢ0hvƥC\6ԡQ͹9qseDbw~> vnި2MnƳګM]4;r vDc; %ȶWk~ D@ pX ,V?Xo ݪPoAS)69kc6)NSd}ORjHN@FnB}840SAMZg:å%bE#u@=Qj_a]޻U{0[TcWJ_>qk {ĭyL2nz<pqk\h^b<` m2YXm E[K >ƅ) ۠.^EYz;( m_{#-rwxƔHI~ViuwEވЎҿ=震\'ԏb/5q%-B̡T{/,af惊U]b(R0Io ! 4AZčˇ֓FFyHC˨ʁWn5\:1i ?n4rX~t6iĥ2[i4Y^ #PRmCtxg#<[Y9trfQQ.BuhUOe4.+  /_2Bɲ+kBz5Ahd2tۄ&:c"to&X{M`5kDj#lF{3mDi#LmD6Zq "qۮJ'%Y?W|Zj~;1g yy- v3v/j9?mhﲛk4ŋkn+%pj벦1V􋿸k8mhhe7SKbt{7Y\>Ɵ4o&E#,͎7~tsW,aWq]5Ra%3tgrݛDdɂ?2]dEA̧QDS KRDtEa5B6q>X~ J<wd |U==rePT/eQ1` i.D*D*)}1u2': !b=8㠦>FpVB]L8EgHzrLztl $dU 9>Fi R 4˴ \㭆Bt.,9 G:H%4֑iB BGߴ KC9 tKk,E#16v6ۣhd{6nid0\|Ȣ̥Fj'Νzhdc9h1H{_y $?U$?*hKS;MNQ__o/f({ZOBQT*|Rboס}&?kJġnlk3~z| Z΄*~;_Se/s~Nb%[(e&MqLT0HN+_c hjYpdK5~k`YSF[{{s1k\PgNVj>SE8vze'g(T[NoLoJ|zjS30d 6Ԅ-{Ħť,QB@_бhS* ̾qs ˾DIf*4"oM2hκ( yhѲ4H^-@AxK-[4[c{o3h@fy<4q&6d9@$NwL=L>b:O#+$(FIňIÂgtFǛ<`\j5.8sYb3~ C}*WAa;9X~*_K% $|9PeV^^9x$%I^LE/F9>.`N IR^ܜ8~T<@//uPH/R{(L`/d~#9r,LWӕUbGgSLِ-X K1D>K1*؈G=tQ([xy?rRa@"J H MK-1+N׋:-4F'Jorʰңԕ-gg fgJ^qr+0|~f^VB:&kh%ڮ݉Ϣ߇-!~;.ڭOw<^`|f}ݾ6c_n:vް=/^bg{m|kn*߫/Z4ucΎP\L6#Q&EmoY o :‹DxӘ{0}>[IPq dByBIgJcYB4 PԟOĠe}w8Vr靸W/X#>@w%yEg4C: RЇޓ[[8 ,mΰhI3$: shO4h,bzbx8!;l1:,F|9 Y S%@$/?ȫ)Ch.ӟڔ4xA˕}ar»BU[႖k> 3UcgiiM/kj6QDߠo׳G5k_qas[ҳc"GңÕprzP,mhY}A7tUs4N0?+QadMt1<ͼƼ~GƩZq9.zNl1T* FF߉nWC9 Fq$6#Z2};b͏-~^* 5>vao-z5ǚlcMqa`$3GsFcw/V<}~:bzo0}5پn$aCcW#:v}HW=֙\+z:iRˌYhA|#W\Sk ='-ղXup_𓖍 ckiiNdT%X$H,pD29"q()H^`f`0)۞ ȞdןA2t8L^G7v3OmSۼm﴾V6-[nj~W-#LmoEsD[ȥ< Kyr8Hr䖪m{ n{B0<~':kzvxl?1\;kӰeŋ*1%RpHpL8fJF7g/fǃKD6HOMIvA2 $0p6yi2 $l`LFDr|b^b:֡ض[u6kaa[hV\cs86g6xM/mE-: ~xة dr*Y%9.]!ɲ^nZ/kk>m̲JIogXӬCCv.#K}С!]D ZWPRK.w@ބ|lpSˉ=ϑ90բ^t ^;x5pvegj̓7pܪ[ U7VqW2S5lHU,X>@IGb2N9 5s1)dys>,!X 3ҋ$YnᔠڡݎS8Iw 47i]FD%[{<(N 5쵻S8mH$  RB Y;Y/Qk|_6e(Хf$@4,T ѭkl/%5vm07o(ho7iHХ^xJPWNJV\\+@WtYU|U1\#;#FL$w?l9R{3V;1,fkWkjkh=ے۾lgہ֎'h+M/Z׵к\x:o̗L5%oU_7l?m+>_'+ }j.bzōרw;b:SIm1u7ȩͤvd'gHK_"]thhynؐx%Pȇ5|(gCAOC@/o$Y.a$H$ȷ$ȹ$Y$T(i5P冩&/0Q*XTJ FE/@ן z90Ka'B$j -dʝ[TDl ( @IJ.u]+kłFЈeWV\dUuL! ?'OΝ;`#|+n%!|vN»H`qw )qp$5aqk ]j5]q,j{ӻ ?8L} |Y#=BuzC]{Vʤ}X.D" w"rꚝ&ÑشPnh." ۴귉/j6f?4c8ESV;L䈲8j9S:yr4rd>2F_nl8d :*gh~D;@Ȥ%%uH҄@]/N >RkcՁ z;=`3czN$J%¾DW&{LӊR3|\iVZjҭǭP^kiJ M YɡUVu +4_B+]-z*N%+x58~lt.Ksmgy9rJ>w9\k\g[{7+Y P}$c /@(Lc_1Riuz]7@oʴXv{MbxGHx\jcXV&FJyS9zc\Ү^պ3uK3yL455]9>8vWB\1jk9ٜg1gOijOjk}̕u}J[t;B #FMǍM$m}luGjy'3Luu~KLzۋ |Dz I8*w(idB':d;`℁NHcJZmy LeQIoeP^;TE̓q2,k19=w@XC ૞Rk\UBrHe኱MgArfA-ςT΂t΂ZpnGO/~(nj5ħ'fLzsǪb9dL>29hG<kXIYbAH hN":dD4I+\<=km1?דV5M;U\8T?lVҔEeSh5yAt;5g`wIMY&i&F+.=󭛖Bk9NDό:k4IMTOfex: +|3> ܆/m˼g[7s̵kvеG|{Gt{u䪵(S2a49~INnC8@$ A8ѨA4rs^'ܼ,% <ʥP67096$ \ik3r{tQo1\ Q=YZoj'?lrE{.ܹ犦hgYv9/>B *4,9]jTs ]y\gW>̻_ 97ztWwO >9DCnmZh]k-]P&uR.Zk9 qD}E:4ɜ&zQ-}$.ɞYr"N'bn02ú:*Q-A)b~ªKvqm6-l~]Gz$wsQeݼBk/^;[*ܛcvgGաV6 ε5j?W\, ѿߞ);؝( CukRN!㳉r6Lx=x Ժ~zӗϱj[WoJ75 0Kn)딨^N^xRil٥Lsi,6PQlX6Q`%k;.AĦA%95*Kvoa ;B]q")򈲡H" Aݐm&"聦sy @m=9Eln3s`e&b7E\nOp6N&ՎNT-[YܒEL] vbTBXOXUV7kkdꜟWО0 dO476!+į2'tjG; FC h$PiJo&6 y.u@9}FvqڦCn" 36#' 7@-H`,0d` SnѸ 4v$~ !K{3[OqXmChkAZB {xݟCm&_!ogB7OՃZvYWWkYj7BdQf3>q\dzs;oDNRn^X2guup9qK:#vLS}glLJVMCVNЍvXn"<A NB#uM8r'vg -cG2Ҁ҅~͸T]hl,Q:H‘2H@ ҟ,~"` L[j}omn%Cms^k^s9˜cEQ+?c=Ytu7ӯ6"[ K`w`h+L+ݧkV?u{ABZ#KeZZ[emwߦ] NùpnX_Ɖ%%/K>eP_DFXJ&zJ/ E\Q3Нv <Z]l+:\NӮҔs,Bl7q!q1ƊnLY#'  ' H_TSIwDYRKEh.ATRKEP.A)4:% '.'N9q 2T\.o=å.VXX\?՚`qe>Xrm KԓM4wsE+-5Ufibm*6ӝR! g˅='1m "Jdt.ovVsb=BlE4Qo3q$3< D;[&9ō'oտ}v U} N)!343T:`!s(#'Gz UkuuiT-B nC .uXr}x?/#j{!c$6PF"J8Q‘0G $ 0m\(m&4O5I)L3 3'6M 8$]dӘ $\!`*9 IxWX'eN ,T9 ѷ YOs9̃drfG9R:sفΟg+,_ x6x-/FQ9Y<vx}C[V0{^`v>!wؽ}mi2u'@j􇉛9dG#FYSRmV/'C\c L7]^c!boqĉb;ș$[$IF?Icfjiie#$iL^[FqpʼnZvеd.XÁ\>Cy-\s1fa7f+`M# 40 0Fn[%ĪDV{94 W$ *wooWҜwcO8 pOx)Se[(4"ztcz+uz;cq1sm7Gk X?FImt?֯оR7Mg6h2CqVۭpRm^W`ThZekQ3p˼i nә6yWڭxB  Dx5 #"YuvP?E'X΢ "NΔOj>q 9ƑpH˲ۄq,;O"e Ήq1-'IdaeNԚ6e%@c"Tshˊ̢s犰?!w{dz!\4׊r\ ;%E#{:N hF|6l6|WTn 2+bmKUX94Lcj8L#$ӐRI#K$$$AgIsg derCS_UCuǘ,wtTQ-%Q|kB0tUn@W]tUl0U0VuhU:Xo!$ɲ7C"˲[q}!]WrrϗʷE^̛ܬ/l&)޷Ya)MMeL壀إ t/Q6IOݨFz!5u=^8'LȆf<^y$S~W>~\̕ y$#""|DpI1藓6K"! W/{-7O+{ܛX4 ?(ovőąKڗ<}~Ș ś r$*\ür(h?9} "pLv= Ҧ,m؉Yr:c$$W`+wώ 0@Gd#;^2 #^-4-Lr!or!wr!mJbx:Ng9C8!{,tB8QcXAsҘNSiGJZHȞ )AR`{LEX'Ꝑ7N'IWUöqę*,NȟEsI"]DD:Q-H}{?R>z^v)~BidkkĤC>:ZDiid]A9&-18%h, ^18D )]TwLF 0e L֕>Fqv Y5[H{2e~W,sKDz-%n&c tMuvcx᧍Gk>nd<'?I'+Eq='ٚ\-K$?9MO{(K^^`7e* J"mIbG2J;$g a4UBS"dT$uIN`U3Z`L#υm8F$Bh*&ww*`'XHg9{!xelcSꪺ"Mzw=3Sc[}yuK;óݫ2OSSc4ϧ#Di?2o2f?So 3C?oDfF;?<`|f3A?[u+m. ({rBOSBLv(A͐RۃGQ;8;l #aRكH~&vݝ)v,rhd۠>y5B/A//b:x>_>B4X׶x霟y5_; ~Ե5Wu,W"m>orLpڕtޝ|+U˘5N.6Ms#Y_@7;[# R=H3(mkE}ҷ-{m<_^KӞ6fiϭ U;o7j7w9#5?SѴ74pP`pg?ݰ჆Fл G_O5vyk!7(}+>pİ@@sB;< p2`laL'ق Q{Ȝ K =6x )X)S`*OnKQ}_,9zs\Tc1*/h*h})v"*mhǼ 3LedL>dēO nE +rf|~jx`I^Gc%sic騒L/7J+Ꮿ\ O|%t_4?xZLj‡N>vO.}b:A#Ӭ# x =*3霂F ZL(h1ń ZL(h1ńB^]^?9 )لt>ɱuF_3`g.ogl42 ww]CZ]n#`<קj$X%i=Am0;_&R5WcAj({!e:[7بv 4*ݔl%_&I`?3&_m򩞕O::x_;6Cn٧kQdixzoS, L#(ɤP>Ѧѹ2U `& @6F??qk~eؿm$ $lvsḥec&#) rux#FЩސ )f7M`c~En9KFGaRfAVf-!=3p8-MIFYy y7#:IN4q›V`q.,{I?%Zow'{7sj;];ܴysg7sR.Q.T/W'{_],twr]+|:튷$}{tz\<;{b9׆kg5^_{KL}#s|]w~ķ73]lu{7\;Bu=Wx{xprrtyZvH۩v6Fkw@K_gi~'_A8 Y$'wzw?ܜ!ːLA=A$I-`W D5,,c@܍Fu-?6 79 ]Gw@* W;fi O@ؑ4\d ~8B;qx NQDo,qlѨ dS*g c˗Hr,,y"IrH/Nvf쨊fEPHc_TIc5>زq~tK0p9H˟AWUuZi}{ 2f]!;3h6id g|8}>m~c1ZNmxϵ}(/?Jys{|UYmYu\ K58/tVܾ^ICng묜xj0?I,R`sROgɒ'$˓c#ӱtG~u(o']  1&d04:;Zt=ȥ9Z쎚BPH*P; 0 X`3 ga5 sA Y|$O4HHd6@@@VH3!C%{<&s] .d)J \?9p?p<\JT*g_x-p}`[?[?}I'9}}ՓTi_W>G]~\ܣݦ.U]"[[Z  #,*ZoX-]e5Z\IW[ˬE=Ǫ 9A: "A:YR'E_"#΃R&5^f#gl:r:l0̎DϦ1]f6 GNlhLOt:Z@z =q]x\.Ǖs /7eسgu1>ǹ4/p,\2:Σqc99Χqc;..ׅǁEKp1$Y)M}'%]RDF6qFQ8aDZ] mT9 _h$¸?,Nܱ܅bMlOdU,Nu)ǺT$IؾS~{㋓@ViE?|˼zAtG@ ib͆(`ɻ+"q%}id^؅ɰt+ˇR bRּ\% VաU LUkԏW׽??jL4ԘXwM40?NEX0 |;J*XN*I2a?1ױgST]S:ܪkWQxN†s /G?k Us.!Φ:6 FH|}>JT6rn}lJv'srcWDႤ߰,N6Ek= JsE <)P0RƦ3R,ʾյA9OYH#9Dqx$NÀe[Ðtlk7zTkPu  lRc-ӷ)un8h|DhnỆ/9sXX wݚaM֍v#`OmΨa_+qld&x=Hk`Ɍa~XY>bve Gӑk3/-{A_/α^_J7+Eg td' *~*)DdTp=M9i*PO30P~*'TNzt/m޼0|J6 R )IBۜԄwO'"#n -Ԧf36S))r<)Boq Ʌm 7ra @p7 r!%zљcN.}hhj 'gMc0{9cxF{ey:66r6R+ˋ}MK9F,%_ۥ%c}s$׃#[|]Kzc+OoR,WvHFl.,˜%˹kљ/I_÷^-Y,WA[ٝ#Ǵ=x}93an4N푼}[{fOng'[ΗAGI'\&IQ3~yo-QK.b;X\iG=z<1Mw68|8|0Jh̗wܺh 2=sʀ\9ܞ >חlS/p!=?LV=|zֺ׺Zn-N{NƖ}@B?Jh\YWؑl{egj1xɉFv/}4EW勵}:q]g|%A*TM듎W-kTobq`r! 9<ufɨbѨ!R]8Jt4;6P3E#GP;v"Ή眨w"_Ή|9'-wr:N :b 0Λc3S[e_!~]2D.CMPjPT3h?x\T)K'<Vy:I%\;՞5F?tɐyg<_. (ܠLS&+3K) F9vhlW6Vd3S̅-^1n7x}g0ld{u&ڄ_>?,'ILjRD䁜cмGEZKůGJh&Z7wa4y`hEm#cMގ X%zY~ L/u|[L/0()^={|7rUhqO;_ڝƚng" _-}Ogn3%nT-J0?4DWkU9ͼT[ "2 ;d{swU ~ }yyYmN0{ԅ#D؇FȺiN:@5sL K*Tq<5z0mvP?XBRM9=@Y?wroD/Ѵd͜ěg>9u¼d޸]Of0o9´ϟmܮ;͜mh;[Ȍz"C~X{.*wcO{ qQ-ڿRqx*xz*9_z ,"&H-Awx[h l}o ȍmE=gH.4v&%ǵ=!Rɟ.,:A>tBBJ'¸J/F] +@VtY 4.] 3:uN 7:Ant ^N ?{hp"J@nm|:;J2qaaOaK`La݄;iZ$~VYK\=ƹB{Z;u% ęk%JSl%\Hv\7<uQ7<uQ7<ykCBc u9^OgRҕ8bd"ӭShLbdNFt$aS Db Q:tt.ƥ4/n}8t4rUq|K+h.u\@sBK+iEc"Tv]LEU4^Lkv 4qyR8ҼYXO:e96x9Wҹ+iqM4*7Ҽ+6ӫ;y;y:;yc [i^︁m4q=7Ҽֱ济h^븙济[h^븕济ӼqkӼ~w]%ߓw( QA4PNBz066ҳFWR{js7 Mձka6mk?G{֥Gj:>$ƚuEZ$MS#sÄk; 04wtQ~Vd5HAD⳶ֵxXG: XdѺO~I$Z?(ݻ܍ j9#07,42QGT\=~;(.D(JEp#S,W,?sqmRBy-.s*OF#o-̥%ffv6̟6f9Ό-'< Xw5xmvHHᰝ#B~%sAq [*s!IǸ6[Ii+IðjG $F]rvYk}ZN(,Na°!CY$@B~HԢ208    edȖej\nvi`1n'f!fN1rXR: 24WG\Sc`Mf 2 *Qr8; KBH0?rROѤlK'^(=莔˅Xta9-@ޥE#e7i8eä@$<<} ?Rtƣ@1, -@ФA(ixIl|Iْ% n4H4H4H4K )Hn]5'KMM mⓥPHPH_8liU{"&-`l|JѸܬ3 ZSmKěF! Fc!BNF Y .o9qk>."5o):mfh?ۚ=tpCY~ߡPҟ}֜ӟRp/W|M i t3L> ɒ H#H%1Y tJ-m)rz8;@ >-Z"CC :#"wt@pC!͛"E$.N?F3ivi4UDHq:Ϳ6 b4ў (ǫN T ²I16RPH!B!"2B )D(BB  )D(BB  )B q#A; 2ҒC!S PTB"2L;c*Sz}gE&6TMj``*Y : '9'_5C_qr2;taC;CZ<464,40ԟBLzNO-+d֊ _D>Vֶ,'$ohΖYy2k.##Rۖ܀}I+_vLһIZ{i tYZw$.H =V(Jk[V%m t5HQmˇ4H1c:N1c @[#SDjMu6`R,9|,1^k 퐴.e7I:Mz!IχjY& 䮇`tPifGswJk*J 8u@p4[(2Q(}2\h_B8OGb42pK> Q.r>p RWvKB?~7;kitӼ h\iv'/*x!Up k.gGE)I83Utt1XU*%4߰Ҹȱƅ4zkhlT9:Xng\誝LmIM3<.N>esZJ6+Bd3U .8bvL8>unp"2ĖerMG:-q sZA  yk #qF0ykϏ-Wu&ҳ{&ѮU8(7A)9!Tьhew{ȼՁZB%D*Gҵ <9Furh8h0B4q/-bhR늣e1d(Jh!F*䮄mX -rsF?i'[zM;c@ nwʼ;NxM ̻l-;ϸL.zMT$C rC1Tx nHD W2H敢B V`;~`ODeHlHEwF[m(π80ghASCNG\@D"FDJeӫ*y jI*\TKZH͝,uq$7uq?5RڧvfIjU0b<خV[qVc{Z@U*fF5V#t΢O=Aq@餆mjf[k9Ěg]fGa({b[^tvis/]ʗ>m=fXR~ힺZ+d 'wB %[l6*L[HC ɒEۏn,=g'DhNdx{u24%.vw;(δˉG4%1 t%x6ψhԖ1tM:qBQ,}Bt !8I4A͒' n$ޒzK- ' R( 3b9ӓsT;w( .uy@]{ƦWT!DRLHҔ'NT0at.: g^ʁ= 1ιZ$J"Qpcn9$5İh䰈 .9".\qc%_X!k,^TםR~gwdd}i T?RUn_Z)ap5I{'|3u񞐇Nm{xz~:iIxw(L}5h,߆kیw FhcmSG@\D WJ4MQi_ңyMdAQU9}>kHV`K,ɲ9E,Xѥ&9r#/5O1c@xi Hډ~-HC4GE<-R촫HP#ɕ6p;K5Yoc!IoT$[,NZ;4il=~h >Hn/_?^Z"hcr7NmyBd.;?i蹆^9M8+뽂Tx>}g{"6kpk bÂ..LJnƋ'C eK3]JpwK&Gߤt^G}ӕĈ8U {Zhi겠3xU`U@Kֆj߫CddVkQSS{wXH(40 H8ۼKdD8~>W\mjFԞCz<Șke䛗=B?YB{fm sg'*s.^ɯ+wʯ<ë$Z,,ݥ2ɯ{[Ic-4$ 57 9DT'd&xNe$? \Aǐ0\1^[^& $o],a@^)|sK?DVn%*YݯV#e\k؈g**/:聗pDJhhЫۗ}_66bCt-UvF 227byXX% kŀ  5s'o*E2@2@}2-Ǥ}2Їo=OJPp*)IE,٢4gnٶ0h@# JMGhf 39FwBGZ,u2Eխ܀{MܓiL7 ܗŭ=)ux鮶u)gW4f>syYk13N"#F':B^7?VHGӵijAq}:u:~:8M/2n1ow7Gx,2*>d9̜\ʏɥ̌>}L7K{XL$w&N@ԉBO&8 h<5<]`/}d'CXz{z@tDsWCvUƱ3FYT;v!`fX(GeiJ5^E/rdV"n2<ls6w{{7=~ls`rRvƿ#p]v Y,Է 3tVh]IWN706BHlκzKg'4?:xpprŸ]w2oG`>g ])Hվ>F3\]}bdyi3?l?s =YKSs otښfoTߪVډ}|2k̂WwZ/XYp lFҳỵ v/`' 6-hGq ._1ڄ9r~+|nsCׇ9bl7뉴._V&Yg%`ҭL+zNݏc~B3ޓm;G-C߫n{Vm_IտIԞN-Y}'|L;{{rϩ62uOn7\Ty6k %-=BP|YWchX%u?Z?[_|}e` 6"a!kc^[nGFpv;c 4Hf<@ $۠^ן*ٷѤh:4U8N|xqtw(,clOQPV]Rj锶'׏ZZuָàA~4|X"$]rje=h84s; /D74ҷ;҄g)y\-OC2yt29-sW8.@7%tk8.BZ4^dɋEj$KqR8ȵ+QS;6|9"/w\|N@4ny*7"c3PUPUס+7~ j9n7x|#=s+nC¿qͷ;.:w|rK]hƻh|i09vr>nT+Uv4_XCjߠZ:o-:ަkh|[4_O?sK?sGu t\HM4}:nqc зvlLJ4nu|D4~LǏ鸍m6'4N:t^@].C.chl RHWC+/hG RRG Ǩ]7tn?lVA#`32w] %ڬ35kԘ̀μd H6}n͇.pg+'9 z|o]gwoPog??+3+ LNQF燶'_|-|2$H:_\F-MTySU;0=p!yK =Q;GYenN.5损> X7\T}L9\h~lɉHJh5=SddGo5lUlҊWz+)&g5г敦i24h5Y+5dX@ uW㵯o4 OMg%D(YJ=ݗx%ne۲}j)*\iES/q^U.g!UbrTb䊃ؿت)4;,ggi%uGdAHo3cUA`Y 8fv=LjqPjH f%l@jJ6*uU}a@%H#D!J@+uӱYuB5d52:4Vpwisl ,(ꦙƩtnM )S7fZPi۲P{GP:PzAL+xW0J̹7֍82LCufg0qu琫M"Vaھ52sE4m]čauֳ[a6\Q&&̹r3{ȟ[t bHu=[ -Ӑ&1q,0)f#!xTy'ڢ\--x8Nk+^KH,Xmb1]5l@%h zp$ b%GIcE.F?ro،}2١!u+"&zxzy=/p}"eeR1{7FoeyMnsJT>b쐉`xO܍K9S˘dd-A -cZKPi2x1m &W+ ?ΊM:=+] Ldu!bٔ Ttg'YvL 4f g¼ɴL[Q_bȴצ-F?#~# a ͞]*`D9W>;Re 'ff(5v6_38q-i}ݟy6bƦ"ƙe1/2h jPteFo/2vN>UZ3 >,W2m}-<2m}'1)v-hr.fϋ@l*;jQr]*[E%D./3ş#sr:՟O#ۍw tcvȫNcڏ^A5k|Xm:9iEՅG#/Km m4_y|K<T19h:hlHa $Id!&}z7<|OWeRI d\T c^.BOXɴx_Gd:z %I_E|2r{S@ 7)AW0,9{mx&*T M&$V&LLS&LLPV&dS>Ra\2cV6)aR&bUEmP謫x Of 08ԕ&u y\?Z L[5 kLOD[g8mƊ.;\T*\*DivX3!.-Tաx _& sJ^e ͅ%$亄~иVo_huϫ4&gN[ѵǴZ8btJɟ;ɞ;)֙iTgBi;UvE*lTȬTPW*̗x*gsc2V ;)K J$יgBV2T<KٞV3)"VSTmmW2jikD-1[u*ao~c#3~/ MS xS{'Q=34S&tXLf ];M9&ܖLq:$g!j(+Z ksBl,H]0k:D/bF4朤O+3di ]uwX,C7u6P.jY*pVloH3=]G[hq<G!<al4[br:dq'u: HRe=qzE;;Fc{"=׿?7зû<05ֿחw.S*@Hc^,u>4x?1m;eԞhtv]jռՉUa_9Piصɡ$b0 ='*3) S̐9˼|\WM4̞FmGiVTaڊT*cpY;i^`ȗٽ@A'Aa ; v@8}g4y =sBlk($; D2b +]^*Jԁtz9?R` y*f m[]7T_eg񜷓&,`ٔB}ri{^"G<_9<$w  qdhq᮹ddlshL402ⱍwPXQ@>0Y :Z>TMsQd:c1@&baʜ6498#QGxEo}Ϫa&i#m6MFA= md>)o_հ˵%"M*9q]Cwe65ḞͫIbE53D&s: :uˈhP'lf8q< !6`"-SY7F;A; ZRZbZCQ~<97G؃=` U~~heXB3Mi ,~ vxi9hY?[աKVyL 2 k־RhA$ރh/nT7bɺ96ՏԹjX-R];'٫DVT657=V*q0'̝0͡O+/ qpM[$u`2x0&X+N51A^,Dy/#_IWZ%`]?`^ߵoWߴ f^.!ZYzͼa&48j}+s&p7|ڳEE^N3Cm7©$y ,ǖ=A|٨DipaqhdƀAV+ R@кlV𝚥H56W7eW$u~*Y͚BG}]$/E RkMƽO^k*z]KB_"zeVx).- Cn>Ia9YAjW#2϶lZa|HV|azCpā\;qyȊCEEodh$DE9uIuj_1rtH4~6aQT"\*ygy/smA M M;A&qciE\Pc.ed@QvG@/td8*woglz `&bT$ou9d:Zb]:Rb]`]u*@BKzOh|ʿmןЗ)/#9O_U,y1ݨ4Xsmf]k_Wk͓2w٧VkGH E3eb3~5U+i[3bsWy~fm7f0Fa`4jp֯?U )Of+ԩ'U+R_@xqW"įOqFZJJgW\FgW&裌,;~?eЄ;W*|a@ߋ[gWwJX^ՠkdVu )\XboGi"imEHnK\8:^۞Ҡhvk'vbUxlJnEq>Xb,KlXXe #3: Gxg1tĜXc]V#&;d鮽 b ܞ!t\$͞=@B8 a<`Üc;vZOoyh[̥PMİE8ͰGf5h=ӡa? R/@0x$[##aC<`H>8X>OU =@UP` 8 n R^/eM ыh aC4*HX\JB@oMex[$o1a59\c!p3?Le+4,J;kU};s_N̯|&W=# ߞˬуzs?vCF"9bcYjqQjswW }1x8h lx1ӼjM6 vxS,,BTGgSa=1SOp"fq"% B.cJXcK< !k̑hLbH?qRD&]H|0WB?$lK3h"^ȯ^(rd/9B`/dBS//w,abbOY Sb+1cI"ƻd6yںl'Mw{NU}Muv}Ӽ?4j(?n'pث \\=_SFi}nY+gX_VF)OPi7jZmVKkyo챂KۂBJ͡?]SXrCmz &L<-mol;|t;l)0sDEE&Cv[d(m7>I1g롷"#xiWd}ȑȡ#!WG[ޚa:>yZ~2,K !]rI`g]yH L%)I0I~6IL'7+Xp'wBwAYu 90qEfwDVWD7X/ i4Y14ﳅWe\<Η =U4xfȴshU5K=i,h,8ς΂΂΂΢ouXU?*b,x_* bO [CAf/+Q!v-UoQխʟ"pA 7ԽV[W=xt/~ h>80~;NܯSSR׆. UB[4?kQ>Q߬ԖkӆbmCF#k;qHDXVok4~#[Կ!M!;TWH;e+MgZCW_飕R*eRZ(uzF]K7)DuU=lV&nBV&qtҮmrW7;!)`]ѥ+|7++Se_&^3xϊW?sojvV&O'OeܴS t̉iS0fg!] ]节`(Jl(&zC*bP؉BD.fYThM˱ btf9tf9tf9LrQV+^DufCx(Vh_  kb Dg<ޮA Atσ <0@cwb "|*,~ČtdbA.]۩{I秐=fR"A/"!Edn`"mi O7;hϊ#Wj5[n&;WFOeq }9x(7b3j3lc_:׋%Kilk-'I4asL0s&yNԺ;8]OhE /٬n(PF?<5mz`  . ڵep1:W E X Á&8h#&8fq.lQn)( 0#FM2=f,?*`r(mQV^_Ba-ѯ'k5zKD;W&yUf ,urQ&(ͯQV+a|2t|G7i䓱qqq'ͯ׈֎n`8aIi\_w7 2|,Hx}hETY: <QTrԎՃz60KC*#Xk1֬3F=̱*L2ﯠ=`to,$@_wҿjjk;|}\zˁ}wЙ#?׉qS39>̭q7])9YV]6t8eʪ4Cd<,HGO3`E-Nࡍ]c&$єpƌX 9HAiP.4fj%5"jJx9Srd.Y o"HƜmX*vV}c{+ S?X\+wpl7z fS.K6>??@@AACBDCEDFEGFHGIHJIKJLKMLNMONPOQPRQSRTSUTVUWVXWYXZY[Z\[]\^]_^`_a`bacbdcedfegfhgihjikjlkmlnmonpoqprqsrtsutvuwvxwyxzy{z|{}|~}~f~01Y~ O\_   " & 0 3 : < > D  !!!!"!&!.!^!!"""""""")"+"H"a"e 12Y~Q^   & 0 2 9 < > D  !!!!"!&!.![!!"""""""")"+"H"`"dccsqcaD751߽m<*߫޼ޠuޅLP*,w   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`apcdhvnjtiqfukzbmll{>?dwox````0tT.TL6\ N.j > n B n ` 8 & L p $Z6NlL6h,bDp6 <6^$@x"T^jv(4@LX"v8DP\ht  " . : F R !&!r!~!!!!!!" "0"V"p"""# #8#v####$$>$|$$%*%t%%%&&<&|&'v'(*(<((() )&)^))****h********+++ +,+8+D+P+\+h+p++++++,,,,&,2,>,J,V,b,n,z,,,,,-<-H-T-`-l-x-------...(.b.n.z......./6/B/N/Z/f/r/~//000(040@0L0X011 11$101<1H1T1`1l1x1111111122\2h2t222222222223333(343@3L3X3d3p33404@4L4X4d4p4x4555X5566\677 7(7H7P7X7`7h7t7|77778 8888@8x88889*9~9::l:;;B;N;;<<\<<==T=\==>> >\>d>>>??2?^??@<@@@AAVAAABBBBBCC C~CCDDE4EFRFFFGGZGGHH$HvHHIIIZIbIjIvI~IJ JLJJJJKKKBKKKL:LFLLLLLLLLLLM:MBMJMMMN.NbNNNO*O6O>OOOOOPLPPPQ2Q>QJQzQQQQQQRR RPRRRS$S0S^SST*T6TTTTTTTU>UUUUUVV2VjVWWhWWXBXXYY Y(YlYYZHZZZZ[4[>[z[[[[[[[\\\P@!-1A#"&54632#"&5477654&#"#"&54632!!"&5463!2###ӕj{G##j|FddJ4&%55%&4p<######ӕjsFd##jsFdd%55%&44P8###8#P@@ %#"&546324632#"'&5@F22FF22F/!!/!!x2FF22FFF!//!  P@#"&554632#"&554632##/!!/##/!!/##$!//!##$!//!I@IM%#"&7#"'&5476633#"&7663366323663232##32###"&7#37!!'G!7!8!&8!F7!!'FF7!!'F!8!8!'7!G7!!'GT88P!//!!/@/!!/!//!p!//!p!//!!/p!//!@P`ENW%"'&'&'&54632&'&7676754632#"'&'&'&'#"&567676'&' ƀ/!+ U\k ~Rb/!!/[ /!!  ,:_qO\/!!/)#LA+<# e U.;!/%f l~kEY!//!Zk!/ 3&oƀCd!//!AbcL4Ue5P@ #/?#"&546324632#"&"32654&"32654&"&547632pꦦꦦꦦꦦpcccccc!/[%!/ꦦ:ꦦcccccccc/!!/![PP@ =7654&#"3277632#"''#"5477'&54632z|wcuSSuqttRib!!//! jniӕӒK}^O]SuuSSuVftRm/! !/ʶSojӕ~P@#"&554632##/!!/##$!//!P @67632#"'&'C !!/ /!!  /!6644!/P @#"&547&'4632 !!/ /!!  /!!/U@C'&'&'&54766'&546327676'&'&''#"'&&767i   < :/!!/: <  ġ %! HI ,    u !//! v    p B B P@4632!2#!#"&5!"&5463!/!!/@!//!/!!/!//!@!//!/!!/!//!@/!!/P@7&54632#"&5476s#F22FW##F##22FF2Ą #NP "&5463!2#!//!!//!/!!//!!/P@ %#"&54632@F22FF22Fx2FF22FFP`p@632#"&5476!!/ !!/)/! /!@ P@7632#"'&"3276'&PuuuucGGccGG uu uu`GppGGGP@%#"&5#"&547677632/!!/!/  !/P!//!1+/!! P/!P@$%2#!"&547654&#"#"&5432!//!!/^/!!/Ҡ/!!//!!^!//!ǍP@5"&54632654&#"#"&54632#"5463232654&0!//!ccc/!!/ꦦ.)/!!/ /!!/ccc!//!ꦰ(!//!P@"&54763232###"&5 !/+!/!//!/!!/0@/!!/!@/!!/!//!@P`@)2#!!2#"5463232654&#!"&5463!//!1/!!/ӕӕ!//!@/!!/p1!//!ӕ/!0!/P@#632#"547676324&#"326+.M !!/ [Ǔs. /!P@7#"&547!"&5463!2!!/g!//! !/ /! /!!//!h P@ 3"32654&"32654&%&'&54632#"54760cccc~uꦦu.)(ccccY uꦦu (Ǎ(P@##"5432#"&54732654&#"+.M !!/ [Ǔs /!煻P@a %#"&54632#"&54632@F22FF22FF22FF22Fx2FF22FF?2FF22FFP@a #"&54632&54632#"&5476@F22FF22F#F22FW#F2FF22FF#22FF2Ą #NP632#"'&54|!/)T)/!, /!+ff+!/ ,,P "&5463!2#2!&&5463!//!!//!!//!0!//!p/!!//!!//!!//!!/P#"&547&54632,!/)T)/!,," /!++!/ "P@!-#"&5432#"&5477654&#"#"&54632/!!/^/!!/^F22FF22F`!//!Ǎ^!//!Ǎ^2FF22FFP p@ >"32654&#"543232! !27632# ! !"`ꦦHHPmĦ!/ QaapꦦꦦHHpPmJ /!! ZaaQPP@!#"&54767632#"'&'' !!/,!!,/!! >0 /!j!/ CP@&32654&#!2654&#!2#!"&546cc@p@uJ?p!// cc ꦦu#>/!!/P@!2! ! #"'&# !276.!/+K/!!w :/!!KKշ!!/P@% !# !!"&5463 wK+!//!w  w++/!!/P@ !2#!!2#!!2#!"&546!//!!//!p!//!@!//@/!!//!!//!!//!!/P@!2#!!2#!#"&546!//!!//!/!!//@/!!//!!/!//!!/P@*%! ! #"'&# !27!"&5463!2~+K/!!w ϟ!//! !KKշ!!/rn/!!/!P@4632!4632#"&5!#"&5P/!!/ /!!//!!//!!/!//!!//!`!//!!//!@@ 4632#"&5/!!//!!/!//!`!//!P@463232654632#"P/!!//!!/!//!!//!P`@"4632632#"'#"&5P/!!/!!/: ,ִ/!!/!//!R/!!*"!//!P`@4632!2#!"&5P/!!/ !//!!/!//!/!!//!P@!%#"&54632632#"&5#"&/!!//!00!//!!/021l!//!!/**/!`!//!M'PP@7#"&546324632#"'/!!//!$/!!//!#,P!//!!/!//!`!/P@  ! ! ! pw  w++KKw  w+KK+P@32654&#%!2###"&546ӕ@1/!!//0ӕӠ !//!!/P@+%! ! #"''&5463265! !2j+KKմ/!!/!!w ഴKK+؞ !/!!/ wP`@'!2654&#%!2#"'#!#"&546@pAL\ /!+/!!//njA"!/)X!//!!/P@:7&54632676&'&&767632#"'&'&'&#"'&`/!+ U ~q /!&Abcbǁqכ!/%f ka!/LbcƀsP@"&5463!2#!#"&5!//!!//!H/!!//!!//!!/!//!PP@463232654632#"5P/!!/ꦦ/!!/!//!@!//!@HPP@%#"'&'&54632632 !!  /!55!/  !/../!oP0@163267632#"'&'#"'&'&546326!! DD!!/x!!!!w/!! DD)p/!v!/pPP@#632#"'#"&547&54632&!/ /!& &!/ /!&{"/!^b!//!!/"P@%#"&5&54632632/!!/- /!))!/ -P!//!!/!n!/!EPP@"&5463!2!2#!"&547!//!`!/!//!!//!!//!/!!//!P 0@!2##32#!"&546@!//!!//!!//@/!!/ /!!//!!/P`p@#"'&'&54632/!! /!! !/ @!/ P 0@#!"&54633#"&5463!20/!!//!!//!@!/!//!!//!!//Pp@#"&547632#"'(!/ D++D /!(_/!!!!/` "&5463!2#!//!!//!/!!//!!/P@4632#"''&P/!!/! !/!/P` "32654&#"5432#"&5ꦦHH/!!/ꦦꦦHH !//!PB %2654&#"67632#"54632ꦦH/!!/ꦦꦦH!//!P `!2#"5432#"'&#"3276!/Hқ/!pꦖo/!!HH%!/cꦦbPB 4&#"3264632#"5432ꦦꦦ/!!/H0ꦦh!//!>HHP`$&'&#"2#"5432#!3276 XuuX!/HH/!XulsXuuXs/!!HH!/sXu_P @#2# 32###"&5#"&546335!//!!//!/!!/P!//!P@/!!/RcFGcP@"DC@P@"DtP"DP"DP"DiP@"DgPp` D"32654&&'&#"#"&55#"543267632#!327632#"ꦦXuuX/!!/H1##1H/!Xul!/ꦦꦦsXuuXs(X!//!XHH1881!/sXu_/!!P  `"FxP@"HC@P@"HtP"HP"Hi@"CR@"tY")"<iOP@ 3"32654&'&5463276#"5432'&'&67ꦦ" /!.%A4CHOGhAꦦꦦ:!/%?O@PyHHQ@P`"QP@"RC@P@"RtP"RP"RP"RiP@p` %#"&54632"&5463!2##"&54632D;));;));\!//!!//!;));;)););;));;[/!!//!!/);;));;P`/&#"326547632#"'#"&5477&5432]a|Aa|@U!!/Yo运X!!/YoH~B|aA|EU/! YoX/! YHP`@"XC@P`@"Xt@P`"XP`"XiyP @"\t[P B $32654&#"5632#"'#"&54632ꦦꦦH/!!//!!/2ꦦ!//!!//!P "\iQ@` 4632#"&5/!!//!!/!//!@!//!P#"''#"&5477632(/!!/( (!/~~/!( P"''&546327632(/!!/( (!/~~/!( P "&5463!2#!//!!//!/!!//!!/P463232654632#"&P/!!/^BB_/!!/Y^!//!!//!!//!i@GP@ #"&54632@F22FF22FQ2FF22FFP@ #"&54632'"32654&vSTvvTSv*;;*);;wTvvTSvv;)*;;*);P 0M"76723277632#"&54762!l#/!E!/P=Gcf5$( IN&!/ 3/!(8*ctP,Gq#"'&54632327632#"'&#"Zz^/! /B8,Y{^/! /B9)P^ !/0#P^ !/0P@%"'&54767632"'&54767632'%[  '%[  $$  =$$  =QH1 #"''&5463232654&#"&54763Ec;7[#/!N!//!!/CJU8YYy6&!/ 0 /!p "&5463!2#!//! !//!/!!//!!/ "&5463!2#!//!!//!/!!//!!/xu@#"'&547632u;)>?#b_);:ps# xu@4632#"&5476'&x;)>?#b_);:ps# xu?74632#"&5476'&x;)>?#b_);:ps# PB'#"'&547632#"'&547632M;)>?#b_[;)>?#b_);:ps# );:ps# PB'4632#"&5476'&%4632#"&5476'&;)>?#b_;)>?#b_);:ps# );:ps# P@'%4632#"&5476'&%4632#"&5476'&;)>?#b_;)>?#b_);:ps# );:ps# P!@!"&5463!4632!2#!#"'&5!//!@/!!/@!//!!!/!!/!//!p/!!/  PP!@3%!"&5463!4632!2#!!2#!#"'&5!"&5463!//!@/!!/@!//!@!//!!!!//! /!!/!//!p/!!//!!/p  /!!/0 #"&54632cccc cccP #%#"&54632#"&54632#"&54632@F22FF22FF22FF22F F22FF22Fx2FF22FF22FF22FF22FF22FFP_67632#"'&'&54Z !!//!!  V /!CB!/ P_#"&547&54632  !!//!!  /- /!!/ (p@2#"&5476!/$!/@/!^/!P@-463!2#!!2#!32###"&55#"&5463@/!!//!!//!!//!/!!/!//!!//!!//!!//!!/!//!/!!/P@[&'3&54632#"'&'&#"!2#!!2#!!7632#!"&54767#"&54633&&'#"&5463ꦦu/!!Gcc"E!//!"!//! ></!/ M !!/Vk!//!lc!//!D4KKu !/$Fc--Nf/!!/2/!!/x(/! /!/!!/3/!!/P@CU32654&##! ###"&5463!254632!#"&'&#"!2765&'%&'&547#؆.[$GJp*** ̜/!!//!!( uhc.[$G>z0ӕ(/"%FccJ[ !//!!/k!//!p!/* uh(/"%FcZFP@72#!!2#!!27632! ! #"'&# !//!D!//!m.a !/+K/!!a./!!/'))'/!!/t`/!!KKշ!!/atP @'3A7#"&546324632#"'#"&54632%"32654&"&5463!2#/!!//!$/!!//!#, ꦦꦦpccc]!//!!//!P!//!!/!//!`!/VꦦJcccc/!!//!!/Px@c7,C0P@ +"32654&#"5432&'&#"#"&5476763 ꦦH_U!/ix*ꦦꦦpHH/!!!ZPP@3"&54767632#'!/ - !! - /!uEE/!  o!/sP P@!2#"&5!#"&546`!//!!/@/!!//@/!!//!0!//!!/P P@!2#!"&547&5463!2#!!//!./ /!`!//!JM/!!//!!//!!/P "&5463!2#!//! !//!/!!//!!/P 32###"'&'&54632676!//!n !!  /!!  /!!/  !/  P@` 3"32654&!"32654&#"&5463267632#"'&cccccc]uꦦuuꦦuccccccccuꦦuuꦦuR% &-"'&'&'&'&#"'&'4632676763! !!4 NCQrK+/!!! 5 OBQ{B+/"* c=5\6@*/* Ec>4W6@*/GqU#aaPQ#PP#!P$@ 54632#"&5 32###"&5#"&546335! #"&54p/!!//!!/!//!/!!/P!//!P|;));!//!@!//!P/!/! ` /!j!/ CPp@`w@0#"&54776327!2#!!2#!!2#!"&546R !/!!/!//!!//!p!//!@!///!/! p/!!//!!//!!//!!/@/#"&547763274632!4632#"&5!#"&5R !/!!/P/!!/ /!!//!!//!!//!/! !//!!//!`!//!!//!Y@#"&547763274632#"&5R !/!!/Q/!!//!!//!/! !//!`!//!@'#"&5477632 ! ! ! R !/!!/0w  w++KK/!/! 0w  w+KK+@)#"&5477632#"&5&54632632R !/!!//!!/- /!))!/ -/!/! !//!!/!n!/!E@E#"&54776322#!"&54633&'&! 32#!"&54632! R !/!!/@!//! !//!KKդ!//! !//!/!/! /!!//!!/")KK+)"/!!//!!/w  w @ )54632#"&5#"&5477632#"&54632#"&54632,/!!//!!/ !/!!/G;));;));;));;));!//!@!//!h/!/! );;));;));;));;PP@$P@%P@663!2#!#"&5P/!!//!/!!/!//!!/!//!PP@P@(PP@=P@+P@"2o@@@,P`@.PP@7#"&54767632#"'&' !!/,!!,/!! 1 /!j!/ P@0PP@1P@ +2#!"&54632#!"&54632#!&'&54767`!//!@!//!!//!@!//!p!//!  @/!!//!!/`/!!//!!//!!/!!P@2P@!2#"&5!#"&546!//!!//!!//@/!`!//!P!//!!/P@3P@!2#!!2#!"&547&5463`!//!3!//!@!/  /!@/!!//!!//!!/P@7P@<P@167654'&4632#"&55$'&76% ֞֠֟/!!//!!/vnjwFwǍv!//!SS!//!S  PP@;PP@/4632463267654632#"&5&'&P/!!/o/!!/p/!!//!!/֞!//!pnjpj!//!p!//!pl!//! P@5%2#!"&54633&'&! 32#!"&54632! !//! !//!KKդ!//! !//!/!!//!!/")KK+)"/!!//!!/w  wD %4632#"&5#"&54632#"&54632/!!//!!/<;));;));;));;));!//!`!//!);;));;));;));;P 1#"&54632#"&54632#"&5&54632632;));;));;));;));/!!/- /!))!/ -0);;));;));;));;!//!!/!n!/!EPP@3C7'&'&#"3276#"5432767632#"'&'#"&5477632 IuꦦuI'<H<&F!!//!! !/!!/ffnGuꦦuH6G<HH7/!!/6=!/'-'uuX!/sXuu'c&7k!//!6$ /!1'uuX /!7Xuu'P `#&54632632#"'#"&547 /!/LL/!/ { /!..!/ @!/%U%/!VV!/#W#/!P P`/4632#"&5&'&463246326765/!!//!!/֞/!!/o/!!/p!//!pl!//! !//!pnjpj!//!pPP`746323265&54632#"'#"&5676323265/!!/uSSu/!! ӕooӥ !!/uSSu !//!HSuuSa#!/ {ӆӕ? /!SuuS %4632#"&5#"&54632#"&54632/!!//!!/<;));;));;));;));!//!@!//!);;));;));;));;P`"iyP@ '#"5432%"32654&#"&5477632HHЦꦦO !/!!/0HHꦦꦦ/!/! P`@+!"5463232654632#"&5477632X/!!/ӕ/!!/ !/!!/1!//!ӕ!//!/!/! PP@7G46323265&54632#"'#"&5676323265#"&5477632/!!/uSSu/!! ӕooӥ !!/uSSuE !/!!/ !//!HSuuSa#!/ {ӆӕ? /!SuuSP/!/!  "&5463!2#!//!!//!/!!//!!/I"BBxu@#"'&547632m_b#?>); #sp:;)P @ #/AMY#"&546324632#"&"32654&"32654&"&547676324632#"&"32654&pꦦꦦꦦꦦpcccccc!/[!!/ꦦꦦcccꦦ:ꦦcccccccc/!/![ꦦccccG@@&'&54767632'(Z 2%# 0G@'&'&54767632&'&54767632'(Z 2'(Z 2%# 0%# 0P@"BP XP Q( P0@5AM2#"&54762#"&54632#"'&#"3276#"&54632%"32654&!/ B!!/ H"oꦖo"PkwwkO릦릦owww@/!d/!"`ꦦ`" GwwF 릦xwwwwP@%/4632327632#"&55#"&547654&#"cc/!!!/J`c .!/ 9/!!/Pcc8/!//!Gc%/!!!//!P@P`!327632#"5432#!%5&#"htl!/HH/!0ttr_/!!HH!/rrPA'3?[2#"&5476#"&5#"&547677632"32654&"32654&'&'&54632#"&5476!/ B+!/ M   ;UU;;UU;PppPPpp FddF TwwU@/!d)/!p0OT<;UU;.*1.2O.4O.D.F.G.H.I.ML.R.T.W.Y.ZK.\..O.O.O.O.O...................q.b.lV/&Z/*i/2Z/4q/7/8/9/:/</D/E/F/G/H/I/M#/R/T/W/Y/ZK/\o/s/Z/b/J/i/C////////////////////////}/f/lV0MC1MO2$}262729}2:2; 2< 2=2M2}2}2}2}2}2}2[2 2gl2il2o3$3-P373;3<3=3M 3=333-353333m_3o47u49}4:4< 4M]4 5-57595<5D5F5G5H5Mj5R5T55555555555555555555l6MM6\666lE7$7&B7*a7-7274Y767D7F7G7H7IB7J 7M7P47QJ7R7S 7T7U7Vw7W7X7Yh7Z7[w7\n7]7X7h7`7A7P7A777i7R7i7a7R7R7*77Q7m77777*77Q777Q7Q7`7Q77h7h77o7Q77U7^77f7h7l7m7n#7o7p7qC7r8ME9$9&9*9-*9294969D=9F 9G=9H=9I9J=9M9P9R=9S=9T=9U9V`9W9Z9[9\9]9999999999999999=9=9]9|9=919~9=9=9]9|9(9=9=9]9|9=999y9l#9m9nQ9ou9pQ9rQ:$i:&:*:-A:2:4:6:Dz:F\:Gz:Hz:I:Jz:M":P:Rz:Sz:Tz:U:V}:W:Z:[:\:]:a:a:I:a:x:B:Y::::::::z:z:z::z:z:N:\:z:z:z:z:d:z:z:z::z:z::::l[:m*:o*;&>;*t;2\;4\;F;I;M{;W;Y];Z8;\;;;;\;;;\;;;;;;lC<$<&`<*`<-?<2~<4~<6<DV<F^<G^<H^<Ic<JY<M7<PX<Q<R?<SX<TJ<Ub<V}<W<X<Y<ZZ<[`<\`<]`<?<^<^<^<^<^<^<`<<~<~<~<~<~<~<^<^<}<<}<<^<U<^<^<}<}<^<^<^<}<<}<^<<<<<`<<<f<h<l<m<n4<o<p<q<r=&?=*?=2]=4]=D=F=G=H=I=M=R=T=W=Y^=Z9=\?=?==]=]=]=]=]=================?==lCBBD7D9D:`D<DIDMDWDYD\DDDDDDleE$E7E9E:`E;E<E=EIEM9EWEYE[E\E]EEEEEEEEEEEEEleF7F9F&*v24IfM0W~YZ\6w4\lZ&*24FMHYZ[\lF&*24FMJYAZ[\lF&*24FMQYAZ[\lF&*24FMLYAZ[\lF,MlM9lM1l,Ml$7!9;B\lH7f9:`oYoZo\ool>p7p9dp<pMVppluqM>qqor7Tr@TFIKNsPsR2     !"#$'(+,-/13g579;=?AoCEIKMsOQSE*&EEJ= * C 7 C Co = *7 !*"#$%'&()+.,-. 024i6C8:$<>@A#BD$F0I8J K%L*NoPRvh)+,y@)BFINPRT{+,E+,#,8+#,g>R%o+,9>?EMOQRS#r+,;>?EMOQRS&+,W42?EMOQS6E  .&#*$!'(,+,5@F&IKNePeRe95tT   tx"t$%'T()T,&-4T6IJL+(,e>L!N!P!RQ2y+*,C12?@2AEQFM2NqO2PqQ2RqST2~+,H'&     w x!"#|$'(+,-/13A48579;=?AICEH(IJ&KMMOQSE*&EE|o  C i $ coCivci||c !C"=#$%R'&( )P,-.00204i68C:co@cBcD$FcI,JVKELoNPCRnnw+ 1?7@AOEFnIKM/NnO/PnQ/RnSTT|+,E?&@TEFIKNsPsRsG((o+,9@F(IKNgPgRg+ ,P+ ,b&+,b42?EE&&+(,V@F&IKNePeReQ2y+,C12?@2AEQFM2NqO2PqQ2RqST2***+,;1?*@EM*NO*PQ*RS*T)+,eB*LLlLl+,>-7l?lClSl+,e___ ~+,P- 4?AES5&% s||   | ||}s|| t!|"#x$'|(+,-/13485|7|9|;|=|?|@)AEBCEFIH'IJ%KMNOPQRTC6#CC   .   !"#*$!%'(,)+,-.024568:<>@BDFIJKLNPRz4954 T   tx"t$%'T()T+,&-4T6>BIJLRl-06-((+,>-7-?LC-E'J0SLqqq2qqy,C@qFqIqKqNqPqRq++ ,e,`51+ >R+%,b?EMOQS.*+,b>R7~+.,H?MOQSI,IIh8+#,Z7?ChSGGGg,97?CgS} + ,v>R+ ,E?S'+,E>'R'u6~+!,96?MOQSJJ Jjnj,<-7 >?ACjInRS        +$ > ? R S        +- ,E ? S       &  + ,> >& ? A R& S       %  + ,M ? S    + ,V ? S+*,V,9?AS&m+-,V1&?@AeEFIKM&NeO&PeQ&ReST&nn+-,@1n?@nAEnM/NnO/PnQ/RnSTn+$,P>?~RS~|+ ,E?S,+,V>?RS{+,E>?@RS*&3+8,H6 ?AS+&,>6?SVVVVVv+5,H-77>?vCVRSv+1,;?S,H>5?vAvR5Sv+1?MOQS+1,9?S,>>!?R!S+1>?AMOQRS++,\1?@EMOQST         +) ,E > ?s R Ss!!!!!!!!/!!!x!+!,B!1!>!?!@!B!E!Mp!Op!Qp!R!S!T"""""""",H">"?"R"S#|########+ #,@#?#S$$$$$$$#$+$,Y$>$?$R$S%%%%%%%4%,E%>%?%R%S&&u&&&+!&?&S''n'J''J''J'''/''j'+',<'-'>/'@/'I'R/(r(((({((((+(,M(>(?(A[(R(S)))))+),E)?)As)S*+*,N,,,,,>,R-------,U-1-?-@-E-Mc-Oc-Qc-S-T...........t.+.,>.1.>/.?.@.E.Ml.Ol.Ql.R/.S.T////+*/,T/?/S0+&0,911V11V11V11/11v1,H1-722222%2+22222222 2 2 2 2222222222222222222 2!2"2#2$2'2(2+2,2-2/2123`2527292;2=2?2Ah2C2E2H'2I2J%2K2Ml2O 2Q2Sv3E3t3333*33&3E3E33=3e3V3o3 3 3 03 V3 P33*3 373i33\3o3J33*33i3P3o333 3! 3"C3#03$93% 3'&3(3)*3+ 3,3-3.3032034i363873:7303@3B3DC3F73IE3JV3KE3Lc3N3PC3R44n4J4 4J44J444 444j4?44+4,4-457474A 4C4I55C55555'555#5C55C5(55#55C5C5 #5 #5 5 C5 C5C5'5f5C5#5C5#5#5C55C55C5C5C5C505 C5!C5"#5#C5$ 5%5'C5(5)C5+5,45-'5.C50C52C54C56585:C5C5@5B5D5FC5IC5J5KC5L#5N5P5R666H66H66 6H6666g66k66g666,96-67 6?6A6Cg6E%6I6S777777G7g7(7o7@7F(7I7K7Ng7Pg7Rg88888888?'8A8E 8S999999E9e9&9m9@9F&9I9K9Ne9Pe9Re:::/::::::+:?:A:E:S;;;;;;E;&;&;;+/;,V;@&;F&;I;K;Ne;Pe;Re<<<<<,9<?<A<S====> =R >>>>>>>>> > &>>>>>>#">$>'>(%>+>,>5>?>I>K>S???????? ??4???T?(???? ? ? ? ? ?????????????????? ?!?"4?#?$?%?'T?(?)?+2?,&?-?.?0?2?4?6?8?:?<?>?@?B?D?F?Is?J?K?L?N?P?R@@@@E@@E@@@E@@@e@E@@e@+@,V@-@7@?@A@Ce@SAAAAA4AAA'A ATAAA"TA,&A-sA8A@ADBBBBBBeB,VB?BABSCCqCCqCC2CqCqCyC@qCFqCIqCKqCNqCPqCRqDDDDD+D?vDAvDSvEEEE+2E,eF|FFFFFFFF+ F,9F>F?FRFSGhGGGGqGG GG|G+G,EG>G?GRGSHHHHH HH'H+H,VH?HB(HSIILIILIIIlIILIIlIII+$I,>I-I7lI>I?lIClIRISlJJJJJJJ)JJ+J,EJ?JB*JSKKLKKLKKKlKKLKKlKKK+$K,>K-K7lK>K?lKClKRKSlLLLLLLL+L,EL?LSMyMM*MM*M*M*M*MMM*M*M+M,;M-*M66MJNNnNNnNnNnNnNNNnNNNNNnNnN+N,@N-nN7nN?NCnNSOyOO*OO*O*O*O*OOO*O*O+O,;O-*O66OJPPnPPnPnPnPnPPPnPPPPPnPnP+P,@P-nP7nP?PCnPSQyQQ*QQ*Q*Q*Q*QQQ*Q*Q+Q,;Q-*Q66QJRRRnRRRnRnRnRnRRRRnRRRRR R &RRnRnRRRRR#"R$R'R(%R+R,R-nR5R7nR?RCnRIRKRSSSSSSSSSSS4SSSTSSSS S S S S SSSSSSSSSSSSSSSSSS S!S"4S#S$S%S'TS(S)S+&S,&S-S.S0S2S4S6S8S:S<S>S@SBSDSFSIsSJSKSLSNSPSRTTVTTVTTTVTTVTTVTTvT,HT-7T7T?vTCVTSv2\ \el \   L \ \    >  4 "N p p  4& Copyright (c) 2011, Johan Aakerlund (aajohan@gmail.com), with Reserved Font Name "Comfortaa"ComfortaaRegularJohanAakerlund: Comfortaa: 2008Version 2.001Comfortaa-RegularJohan AakerlundThis Font Software is licensed under the SIL Open Font License, Version 1.1.http://scripts.sil.org/OFLCopyright (c) 2011, Johan Aakerlund (aajohan@gmail.com), with Reserved Font Name "Comfortaa"ComfortaaRegularJohanAakerlund: Comfortaa: 2008Version 2.001Comfortaa-RegularJohan AakerlundThis Font Software is licensed under the SIL Open Font License, Version 1.1.http://scripts.sil.org/OFL'V  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_NULLuni00B2uni00B3uni00B9uni02C9 commaaccentlirapesetaEuro afii61352uniF001uniF002AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonek IdotaccentIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongs Aringacute aringacuteAEacuteaeacute Oslashacute oslashacutetonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9 IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonos afii00208 underscoredbl quotereversedminutesecond exclamdbluni203Euni207F afii61248 afii61289 estimated oneeighth threeeighths fiveeighths seveneighths arrowleftarrowup arrowright arrowdown arrowboth arrowupdn arrowupdnbse orthogonal intersection equivalence afii10023 afii10051 afii10052 afii10053 afii10054 afii10055 afii10056 afii10057 afii10058 afii10059 afii10060 afii10061 afii10062 afii10145 afii10017 afii10018 afii10019 afii10020 afii10021 afii10022 afii10024 afii10025 afii10026 afii10027 afii10028 afii10029 afii10030 afii10031 afii10032 afii10033 afii10034 afii10035 afii10036 afii10037 afii10038 afii10039 afii10040 afii10041 afii10042 afii10043 afii10044 afii10045 afii10046 afii10047 afii10048 afii10049 afii10065 afii10066 afii10067 afii10068 afii10069 afii10070 afii10072 afii10073 afii10074 afii10075 afii10076 afii10077 afii10078 afii10079 afii10080 afii10081 afii10082 afii10083 afii10084 afii10085 afii10086 afii10087 afii10088 afii10089 afii10090 afii10091 afii10092 afii10093 afii10094 afii10095 afii10096 afii10097 afii10071 afii10099 afii10100 afii10101 afii10102 afii10103 afii10104 afii10105 afii10106 afii10107 afii10108 afii10109 afii10110 afii10193 afii10050 afii10098uni0492uni0493uni0496uni0497uni049Auni049Buni049Cuni049Duni04A2uni04A3uni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B8uni04B9uni04BAuni04BBuni04D8 afii10846uni04E8uni04E9WgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveuni0259 ,latnkernB`fNTZd l  4BTZdj|*<FDjp    & , 2 < F P Z l r x ~  : L ^ p  ( . 4 : D J P b t  , f p p ~  J $>DDJlrx~>b`f8Nl2L|f|"8Nl 2$.h,2<NTbhz,$=BBDLN]$4Kjry~*,,.;=S7M9C:7fR92     !"#$'(+,-/13g579;=?AoCEIKMsOQ+.A#++8+#>R%+>R#+>R +(>L!N!P!R+>'&     w x!"#|$'(+,-/13A48579;=?AICEH(IJ&KMMOQ+ ?7+?&E++ &+42?E+(++++ +4?AES5>&% s||   | ||}s|| t!|"#x$'|(+,-/13485|7|9|;|=|?|AECEH'IJ%KMOQ6  .#*$!'(,+,5IK z44 +6>BR06((+E'J0+ 51+ >R+%.*+>R7+.,8+#} + >R+ '+>'R' u6~+!6>R&+>&R&%+++*+-|+ ,+>R{+>@R*&3+86 +&6+5>R>5R5+1+1>!R!+1>R+++)>R/+>R>R|+ #+>R4>Ru+!/+>/@/R/r{+>R++>R+>/R/+*+&/<%+     !"#$'(+,-/13`579;=?AhCEH'IJ%KMlO Qt+   ?+,577A CI(+6E%?'E /+?E+/> R  (+26+'++2|+ >Rhq +>R '+B()+B*+$>R+y+66  &#"$'(%+,5IK+&6vedo-2023.4.6/vedo/fonts/Glasgo.npz000066400000000000000000004532321444463326400167630ustar00rootroot00000000000000PK!HVefont.npyeV}xUB B =n-SNHDADPQX(EAP,YYTX =ߝDu}Ν;3w{rN0`bn ʘgIȒNɝnܩ{r9%%|3Dzh>oovs]'/JWoIM9{9%nڬ3KS9o)-+K녍^fȧ]#DZpGJ Gk1y`wc|zGam&M ?4@ u]څcpSt&Sq8_>՘5M8=nQuᖿ=Qn%VHć#N[<]5)+N[)da[^vuMx:{q͖e=Y ˶3lg$Ylv;/8ڬ?Z9|n]/4Kn~qWv)\~sѢ1`fBm}vd}m>ۖ[ t>Mwε5KuS(?k["%S ?\%T84ZTD}ϓ|6_sywϧ=o =w;Ew;FMZuuF} Ȉ3!B͠!8al:^,m-l H0ZA&B'A6Fv!F#d#lt GV7$;I5z@vLaN7za1B1A5C3@7B0A42 [^1:=3PQu1 heAL>F1a6Fc:GC4JK}8 wd w|dݦX1%v$'9dP,;6[7 P|TvMqgy?W%_X(k\lqs<`~+? Mfcvw3N[ ѹ=ST*^ix Qj:p-Q;xpq_'SC몯:^q+;nPC^TjUV{͍vkmW\>/V<oQppo`O_#=qkQ0Y Z誵ЊQ2C B= dClŶ40`(4F) fz4:kY @ VPH'n}Z x⡓j 1 :`hbt hEE{t=%2ݿ nhu.?@ t 3 9={&ZY΢㍄?Ξ–,lm pzi7R}p!_?@C`8̻Pih+_dkyu)zͺn`By݅sMEW1B|+т ^O)\?|),4+?_&ibdRy@tLs}RR';`ЭebyFl NYz< }c~ 2VNO);À x6BMJدz1No»i>qg"\$NJ֪^M.Gn#TUSOn0X[ŸR*ƨ [9ykPi adk5ۙ'ʮB*WRrLc5ES='΋oD)jY6Gz.kR!.':O>k,%`;Ad1%O)W:ANz9P~j?|;˝|xw#>>Nܩ7?;w7y$~Cn_Lj6=-p-ƻB<e;T[^UKVufVhסwtwZ/f{&|<-{ߟ |uBf`TI 4'Siث7ޥXb2V~$+p${ MU~>qj_xhdiU #]T4tc>c(> (c҄qLȩ433gAN7fC2@6nc!o6J ø3j=(9Ԙ r.ޕN.,3n3n5B.^ yK K;; AXyq7rcJ*mڃȕ@15V^cl'k@16A?hl16A>h< aȭ86QqZ;?!wB0vA13vCk K'pu`ȁ{OB69{7oGA| l3>9`>`>`< c> ,yqI58>iSE {< %!3^|UW'ps:7qxЧB6ހ>m }8}x Q6imJhǍ `\.EsAkZg _ĵ]3?Ƈ \9|z#CCW eĶB~ i ::Ӹi|i\4>4D/ gyDCxYM5Gkl/Dn&rA~[E'lXl}xqŸX[>Dh4г ևVf su]4sp>X,k/S Bp~^+c ]X ۱&9Y|>$ g-BYff:5g2˷;Csj'ÎbMARX5~T*[U`--r<'_b ~yI~$?Kغ  wWSb? dA}OfϛwZyk[dmm}̧E|Fˀh(v[$k5vEN[}$>/'QgSv*qZvاdޔbAzZpX_r9I-Nj7\O3?^޳[󭅸m1 0/:'恢E%btϖ8;Ŝd6oš{<_.P}իoAg eTm(.(,AA!E~1e_"!_dr<%+vUc5 ePEtq%yXdL:' H-P{jzT[5wnOв*P}dSϪ&Umf{Nv!y# {=T/9n;=F t}h|jڣX) &Q@ O M&juoIT P( D{:IiT6pHM=)f[RG{ɋmI&K6%_bwS;:xIv_1hD.5B:*@F(S]| RuJ'm]jzT-M@dQ>DuC&O}(3P\p\4uqZϫly5"*ETj 0r[ 5 P Ck2(RГAr!{C/}ANsCA@ J>FPƱBh@|zD* R*Ȋ ɠ}DB>]7 XFKAJhCTњ yd]hD*TM#Z5 Sρ:52 ]t* 5 B 5 ysA@U9-* S%mBA/"r(IZK o*CNHMZ$HVZq2PhXh»0s WC%UhZȺ \kҴk z~D@l3Q-xmzh׃D4 #hm|~=⑱**GvRS2MvCtj#hcxן$u `=Q"KGAQg1C"]!Bw A RS@N@>ODs @po_]I4l%ѱ [g _&2Z#,g: 9r}[^ O* OHpRME|!||4)TZ>7^*ZucEsބd_ ( m_q<'|?K%}DAP;U7U '.Oϑa v\ܯJT/J?Y6ox?T:0C_&?dKy"t8k|VΓEccY{0IIL;Gl!fY/':M̦o)}_>rNU>fةqyc 6.3ͧB -Ss9lko`Įmf" 6ugg5]l-0/Ciw[q^7ܺfORKg fK_(3-T'(|03p?Ο_ 25YuesB-fovĩ[Y ;NoNfM 6lM1) &98\H?M 4 Gd  G`8节.6*ѿ {3A #(2zW1r&# MHz@ }GJoX\lӦ_GBn~>dџB|l]H1eY F~)EZRe)EWhF)dCao5#[0К3Ixw?ÿRyDk{<3D6GHL3р L$`n2<r/ÐChD &j0 >HyWa3a ;fiTᾰШrVQh/xg n (*U5T.208 l/2Z%xVuS}U#grY2{rjgK*^i*#+wT4Ԛ /CCB1UvyYTo1"37,P]T/q-1i"C0? <xxX`ˎo1879 ?13ʵ޵C1ngvs5a6Mfgm&7: Od-5/U O%oxjr/jK| [⾍cW_ fWه*;dmPvy̶(ժqY2Kĝ1rE1;Ʃ-s) ,~1vGgn(X$MCWMᦻ}Ӳwm\w=RWyR <],\=ꪜ/G\+_WT^0w͊oe`SɡzA>PR>Oۧ-TY{}溽 c[rݚ_-3)jV:#k_|9V~L'9Yv[: ?G'L%~ w5!7M RLMWCGBtÏ>^un;۽X7m~ª4Vb=nuNi\s1ֵSEє&Ẕ21ˏ!;ֱ v,X2-h"_?Y k rh>+Ѕ^BYwuGJtuYd`g"=fz ̰NBj>-| nV!b? #mQL-m !QC䋻d]j O|Z3q8,c -ٔ蘍ٔ긙L0RV 3QJ)8K}> B aCBm@/Y#BpIBy7%! qڟ0{zr/SБ6ڿ}AJwG8cd»? ᳧!c:r>sN^i_< OY@OY^>h [igUS 7k$l)Fcl."{ro.ʗq??TvCa?fs焳^I6ŃG}\ @\KGQ*3霺=VpIij.W;6Y|7]#Eu jQ\j_: \ ϥ+47%NJ# 赂nIUH}% Ѷ[nJ 9 Zn?y/Xt9-+VYjpa7xQq2g10c°}ҍ ]//D|YYyCnYo蔭Ee4 0}p6b>sC1vzb5Ճ>} Ճz0^S= kzmau嵎iސq )֐bk iF` JU6$ Uut-1ckӰԉ$J%Q-S $I4 D@vhz'(MWU D ^Tǔe"a_ЉKZ")1H4IIKd[8QJ.{"d%R-"cD'}O$H=mmK\"%trsP]p}-WA.0 ]pl&ʼе`@VrYGދrvNfn`uBɶ2qtNlKa2WxdHdb/,e|,oɮW1cǪ3v sU5uW+k&U!`ϲ>3ϝN$;b6 [v;;Mqe/2}u!9yټ`+XWY);žŵuӲZ Zql-U tiU{FݧKQTRX 6ؚemGm Z\{~.ԫj=<+3{ᮼ"}yʲp%`FE7&뽼$RqT1/W+ˏ#Z.lCᇫhtNNC6 E5/nz< zĒz&БP~Y@э"h] #u_G w@~UNSBIŒ8rwۅh~!ER^.*\Nœr% n܃5r5уZ|kuh½U7X 2uNeFx{iAawV]zlc3 mFU0 NjVw Z}#TwU*еF6=n*`jzݸ[A5*g|Cp>pA6༯[`{9g>3˱E2k^OO"^M/p]b7vu)S f6{gTzJmUJ}'sx1%EY*[ /o!r&| 3 ,uV)#.&7D:\s^.+>~4D5XI_)@,il\x[SCՈCVc d#M<RVk"XmI چgU)4.v*˻{)NQ eAL fp轮/ V 2?{ú{>X=^tE=>T1oBgFo9'e`v`Y4;vɉػ=K1 \ ßA>_l#?/K2vl5{߼Ũw[n;މ{ `S_.u>.򉋳.~{a;+WL >L'mZP)o=O+GKOWg/< EzQ(ѾM %&DFmryѭXϻ% t.4OWrXV[H=~4H!6B#Dw]>t4d ?X{—K~軁1P?ď5rV Pd E;4[ gMgWoBhلh/Nh6f%lY MkCNZ[bL!&]}=8OO(ښbBekMٚHk :yۚfwyzn~q֍\ߑ;Cj#9tɾw(Nv4@#Ii^O^O3_~ u\oG.;V3f,쓼]i_{y&?z5fÀ>{O`+^G|{3[{x+ѼWM+Jz[ug ۭb#̙(b|Z^Wwxu>q} NFL{ӧb|GeQ)^拉88LVueMp*7Xr[8Ηag&Ags9(- |Vz+|[|]>ecR:e% +Q̟c޳ n jn Zj<粑_cu޳}#V\WT/ qorUe~k}蔹Zod߫Fe6&\_g9č\~>v *zY `ڂ^ngY3GjgX1M n(eKD6 w4*&,ABxB/!+ ;ѐofܸD&F@jEkHM1KЄ%!xn#-)H$Ob9hڔ-MkCCB2dddddddd8 ɰ ;(pFFF_ *d pWjbB:95J$f\\, W{P'79ɡD1 ɨ>rWt({䣭] 'DmPEL YW:[mA~S4HWH1!bC6ՃTb$Xb96My)dSmM~H}|]hB~O1?~SO?E}&C̸ROy]@s3t\'25݉DtROhb rx n[SS{ ɻ|8-jڪN-0jZWG괺Z哟%?nw9nCiuD+_ի˰?B`A%Qо6 ̕F'EQnZu 4D'TJ=·zt0?ȏƹzkG$!.h;8:+q9n!Z=²zesKk/v ԆzszI($Z?V{j1yOm:wI}_##VVyHN(ڜk~eְ;ayy,[ÿ˯b ?=diRjͣ U'Gt@溃q::g m4g_^<òD ǓҸ:^5ή,VPߕxtnĖK.^2l) תRA$w F7μ.K<>ww6HIrhU}zƺWc*h[)`.ď|,eYN{f+'55;:mòYhZuejbh#Py={c҃7XэŐ TIo4飿Ty-ɳl0mh8e4z`h荔yFUxⴤBnКrz+g7/?ݛ2qئiКbC^vxP"H8N2[]4@{A TD҃P!^Դ7Kөd8.焌HHq c诔c,H\X~cko\(XCT>MEɔL4c2rh@gCSٸzRɦT6fSij6ɦDT6)%M)) 9:4J#74#HҚ{}^߾[CZ+ѷq旡dkҐm Y-ͣPEkuvsIem쏱eÇgouBuB[ )H)[%b\\6/s·Z;Go-5㬊>sog->)KgO8z9CJ͇ug(6S,?c1Oߊn^u)?kLqO{q9"op!$p?_b5 '/ng7 Znpowg  rX)Vəb/rߩtclܝK+)k3Nj'ßZ+hp/a⠸ `v*^U;@z24sZF`2_^2lcU>f̄oLƂE1˪?dPLm1=Ǿ߈W$E4,W_]d0&% Z^JnVwilAf;}T+OĹ Ԣ {-3ۋ'mfe}buckK4h>^*)2J$uz{ퟵH&\t.|K#/G^4yi>FASEYy4NOYCBTw+oi `9Fьo(TbAB0VcTTNRE@1v$?P^6󡼫c >SSdUs:sYSiwşأLXX,}s虹=,;ҵk.)|_f+?e%֛3 fUi%:ł3lz艧*sFʜL_^ Xb-3eh^,W9k Fܖe>A 7}?L:k,qƿ%GMv0m.ׁvH:{}8.qUkPl1ˆ,|k nwK+ (ņ3$_%ӢLD;t.9:%tz]u^WYaVe)5*Ϛ^v-ZފreC7V&3[!E Kciz["֫!;[6HսN_E\eZE.R&uʷ4=)Rt0'M~r(} Gy\THol#FiMKQ㈭G:BNĕO@kd*W\TՍJ(C0*΃ΧQ7L:9k޴ή@ 58klQ9VA R A΃&T(x6riĉmL ͑͢97T K #n58OЮ!z:AtHNeT)z!B6B2 %i4,z JzTӽ҇FJ_oܡA0R7jZf9j(]Hy9!BY#f.~}>T:n8;X]y>Xc1s*& 1YN&fezތqZ8>ah\te'.d/ }$LBʮr#ˉb|T Lސ?c[[Ӌ/$\)bYb[K{;jl+n  ^Nfn侧֫HˣWx6_u4?vOqSO G2'LR;>+Ojj˒ԣ3O}n@[bגT4uc*_qߪ3 M:#,5TGT*䭢[:dЙ Ri -F@7@_ҏ?q}s,-éa՝3JonWNypaIJ(Z-:ZHlĒ#U:X0wq"- S`<x ux*Ҧ&זP"f\WXmoj k6-)O@O@On84|>18o>k1d>bbbbbյ:1SQDs_iC.u4/o w(f݈v#ۍo7YVo A3W_2`x؍0<GY4FxA #=qtsҩc'%N _xΰʯy䧬Guʙr\&X?v\,bi쒳wg¿JKk5&)@sg9V>:cශI/k'[ .̩genXdA<֖-I'r/[[%g0vℼ$?s  b~r ԿyG9ʅVx yuQ9Q$Gl_;nCj%E-QS:E=bF^S_:n/w:NP>ķCjcpH~IBz8d'0 @*^@ f @*Tbݩd R1Hhq*ES)ZJT6L*)T$DI"hCaA)M[lDQ"EL@'4hPJa[ o;); wBbL5(W2+!W= @ (-]Fk AEӲiŴ^bJe/Fȍ8b\ml| ^rȻ-!J%hp, (@fifi7'x$mxfI3l9~]'T5[YKB ||N>lqH0Q`Ӯľ$,d_]'=b:=k9tvКfjWfŲ ol -VWqK$"/8?G"=^FCMݡn{Ɲn^hB ߘ|C],zн<~|n+sr2W[%Ώ|rA68%ߊǂeEU:{_Ha5+.U⣧w#{nyw'h- ͨ#pmPͩ`fuL9 )jF"9?ӊot:+ۈ4nB˯5!~+l(kRBWjv@?M(ѕ+L"ߎuYj5ȦchvE{QYCloWJi(LY-։w 5B)h Bk(7 z0!ĭXI:FAz>ьzCz븦 2h$>;қ9c%FO] @Xq ^W^د }B/;n ͱHm``k)VXz&:C! e8a[m5|$jv 8\3:l9a񴬔/;Z͙f{36̏C>iWЬge5\Z9Z - _Up/wOknG6ampkx9(ql({h6l'vLOF4x1/J7XlNv7cjZΪBE|XCy|p.Vfhx\#YN-KnN'RU u7B z9ΐuicIK"D0DL4h1$$$U4"\~C;I򵀚r-ߞ;ķ7^斺%ף7[peTjNy3'd>_ d>c0\S\P1^7ƍrRG'O5_gMd0O)|? |E>B !BBL#w2飮&)r  +,,"(FDuYTu]@PvM2,{gzޣyOĩ8:op;~ڕk4YҐUuߨ!l$JC$6oem/l?Vi\aߋ. 2`X>iw&J~g8c,Y$TV)Sc0SKVP[068 ME5R2T|F : oIFf_7rqݸ/qu_Zxo{;RJ ˰K8{/fGdX8ɫXZ2 n6 :$,U Oyz͸K~d9Gչx #pf2G>&g>|-woٗY/}Gg?jgvI`&;D7%0x_a Xf5n x1P ="xTxw;oz8TŅ@{1cxh名D+Z$ȐD qLF9"QEXKAZ*N. dVkGN(:a/Fٸwp˂P  -w)WVjbo8B[K.7v8m@"0{i->qRmcϥԃ^zzвK2;ml"q0`)FG6N,'_`Qum֑FFa42,YcNNX5v]Żs`hE*`vJ*=<]F!uI$n 5JxUmӶ,r\'$/b)zdF;}PRSb8f^$`$0c}T;e*Ql'٧zmE$cWD$F^x. ?7xSyDx[Uu?[zjb`θ31f~ nEkU+vLMY"UqD>9ˤ{V| Gra$+m2w 3*5wov,[ 釈AD@H 3~JGb뀾,EYnϣZ9GWjQKĐ\̜HDKЋCo"?s"X7cJ2S /c`։Qm Bճށ Kک\o5ކ(Hy717yH<)a5~ջkyR5UcV&i${e"N%ρ@buEg?+F2,2MW}S2Z`3߲W٧l_`4#3>{=_8ㄵo^c_i8rپfWOs?y,E7!W^O p,Ke]t)7I1=`%ut99t\(H] ^*jPѦlQ+WlRf_!w7$vd>fW=q$21UT΃b%rHb"Hb8;I_ݾ?;n 9^RjNvtiK0+Z$Ԓ=)jTsl[&ު a` %7}t`đ&f'KR&wNt,.)Ph;DN6Aig*L4'T&M`"o= ]c-ȠZ9P LBm0 V&ƄlLći0zs|U=rmAX0a{/hbk!2̟-Yhג`|LR/}EIcjv2[}?kߑ8j~ ͂Of"Zb1_679нH`*vvdSx[|gv2y$>`$}zKn6]|+d&zJzm$T {0/o*O/ٛ]va'M`מkގ7Q, HBʨ4_03OP~"_4\|i5Y#vYL拇a IboGC"]AzfEYLY9lsde1p'I|$V ⦐bg8[ag)k.i$88H3''8No'ɁOp9MY\ w'z0UC7B6o*2췖^hתqMpP)*5hLpomJ%n%'B1"\&ILU]PZ#l'|&.e֕fv$1Gs{ZP嵒b-E6tŖt*L"C+xaD?Y.?^'WJ%Ql#^x<$Қ^KY Ny\fxC 6ZYNzC'.N3Z4[iDoJ&z+MVfb)87*ug@+Cd{0CC2a?S:`}G͚wqּfi 'z년1k#Mi,n/y/1\Ky< lMOCi1LPz!{r֮1/?Y+~PZ<~E^  stA'1뚵."k%GR׿~OӘeρE_!XP"&&E5ăfWkQc $5IzWP1W ԛxdhUvl+b>*3t6w@R>!0gV\ Cc&z[ ? `놯Qaø;kY{Ifڏd$<-MڞT^c$O=~eşn./?^lE Z(vpm"w ó5vZve'w ;w=<tf9o8'J'Yys3g]5Z+hځ Iw$Z|9Sb޻Af2YKd@#.v'Xb))7rS.3lp6q|gn`'ÉvBl= A./Y_p'OAwM'q Ԕ}ZIا|SO i?B<] 3J~@(9g3VOsZ%,NK]ھT<[\"{'VB[e-=]Qq<޳H#vX GXWAy׫3<׷F;17oĿ2Z8m Zt"S;And'=fӡKکMρ*&kNM9`OAUO]g"g3Ylp6RxURHď {) v>rGҹ`A6qv؀ rEz]6u$5CQMחoh[(k I|7HMj6QuKVou%)淎h7~+\ U-axZQon$IS2H {"_J&˜:$h T3Ю@\w60 1=Mj~-=2[Gڦho@Hϣ0]zpouOB< (n(]l !sahpxuSpUU&6NC}hPp I5Tc(g5rVc(g5jRWJ{0j%5`? Zi{ j@oR( L#25P734j}_jߵ0ưB*4ZZKzV/\VyŌ[+gd=$; 9sy54s'lYfYj~A/kXC%1Fֲ8]~y_3᳟D~?,veE?,Ĩ-|aM"DJ783ݎ9JOvt9(rP(@13!Gq(:#`5`t?z)CP4tEzk4I. ? ˠI.I 1 (BL 9 Kd Xh57P놢]7ȡh EwP`ipXXZz1?xY dBeyo2Zwк֬[ YXݏm7 C;CGo>Zx+0_ZqT9+m Wa=6@+MJJ{0|Ris{#ˆ{C`խV~n.7WP( ~b|ChP$u"AĉhJP|Nk< لvѯAWk]~dJ H)D{?}k8 oJRv5;n F# sDk} aH_=Inp"8w<7:a66;KhSbCʦHM҄V::QPIG"mt&(TѦHG&˸VJdm}@Cr:BJ#"RHFpDD;TY2^rM#uFT#[t VeQL5hYC[/ѾHG`:: INt(:Qttw\W` `!a` K9:o4lӚl.5Ym$hvZߤw0Wm ] IneY[Mh>kښaʳ`-ܔ P]4l巳HGtY ^A p_ff>{ vGgEIoE!eevwGpqMl&x‡ʒKj{F'FmG gY\1v ~0UVMDCFl^x[ψ"S`66QQ%!}~U$jߋz/2g3@ߟ+rA׏fyz0X 6M,> a>֚n!J9naXH6RC1Ȱ l qaR:H 1fmkk]NA(tHŢĊmkHm"2&.U<]EǯHG }ev#EDZF[_cg~22eZ-9oa[k߼pnslwCfԮG]W{W58-yԹߙ9;'N[Y06^'81N7'iԌj?"hWɶӞ+~ڋ0c~VxAZM}Kg0[ۧ'p5%rF; @_LVNQ>֗nbY lQ sP;M.6j^D6X`G)Ƨ:bԣn:V=*q188)B aZČ`;--Um[%<+{j}n$U%v*)E .jpnzuU$J':bK0%Vb;EjyRG Ij@jPϓ^e heo܃l#1 0 ZW{i˿V.TE.)'C\ =ͭpZjP+l- dV*KSB,gC`a&Oz}Q?4scpZ {zڱ)$xh%RE_ECq8lՁp݅(, / pY)VؾÊ IBЖV]08ԫYܷ̳qjr99SQMڝE fNdrpӷ5N$ӟ4%vjD8a QDGөl˥Zɿ5;X[G׬"3xX/j#>`Y >|RW[1*j_q!,9~/OKUGM|j2$'R]nрX 75h#DK1N,{qT$>gES P8٠HI'9NoI𙻹hsYH|*@5tټʌRo ' \c!@_HĿ*z6{=SIz6v wxL.+u }*|#m7;{;V>OyY8T{Ydo[/ ʘ2*Zo^SU6׍V\4J/Q6H^U gH3o$O.h)\J]-F`ah`9\Y-. 5$$4Acڭ"C@+tm;tmPk4n{a^/1" VhnךCk+`!hedjjyW^{aK_(E*4BB]YUhR4>)(NN X Կ 씕XvY CWFg!h|on,ДCxw΀A&駓r*OU = BoC+@4}q'}⡷Y\K?Sqg*.L Y{ کJ2' C,\pe ,sB}9:?trAJ')Ga([' P(JjL40.-iVGZ_mwA_PaT85A8A 3翰'kG֍37y.0J <\lӏrq'&?HW֎5ſ௩Q#;*u3D-^qѸ4^gO@o,AO#q 5_^=zϼ\ q8}e&`&_/Pb],'nρOs;}v0 >JnK*#*cx%$F%k50$o/W^JfhsFt OїJsQVJNm|- |L腉T6p4 j 3T RH)!oj( ~'(tKD!ńKH.731^&&*c-epSytŲP.ulIA!EQۖ+2N0{MdL H}1AId p jCĤ*B@i6MS p4(rkcA x%Ѫr*RWEX 9ZVa9.cτ+KnL]*@R(\%"wX MU,Y/z/'bW]F^!tLYqI.q(34bg̵ 5\$[ڲ+,f@al3.^VC}1>V;~~ٮGH;rV5tLюD}ynmG:_G2 `' 0Ez[u_͎,zOU,OomQܦlqłA+i32s<$$tbIpWyRw|nu*sqض:Uwz{މwvV;[ml5@nN\N[|'r!+w)iywV )bz%HK#(zs*,DʷӠD`PAl.C jɨ%ˌk}gjvHEˡ;!\OֺW2JjY ްrҳ)"tCp$\rŻ 7!]qrC]9u8ԙ(`Rr⍀CCB:Ps·}!.;G06^).lJeゎ\w9nBNFjY "-Bp,B_gBcBccEEqHVH%'x(((-+%'^m mizs!0f^-gl_A=Ml#[˖٬}I ]tb_PA#$f.g."?qVkcD+W:YukNf[VU $w^$^RXL_' gS$ezj$MI`Xs4WʈoMǣ{kNnNWe˶Wx{WvY ao/ AHȄGǧ.~D.4 &MFڔ%2``>15GLDu%`\CdR%tFS<@RU J L +SFaLY5*{]ʝ˪-[1jd\j~^ZFqu9M_CP 7ֳ=]5v8 ^JOqPi:qiq2I'i:VMS;XamjUVr_[}ȷ;x E(}w̗#RHQ^usjg5L Z#ۊP([y"?È^t3ijd[^׳DI7I^$y=H'sl:s>ކ-{6_E_''jj,2#9xubm}3̵95f: Ȃߖ)8~023q:T:"Y>LA2ה]5ZN{g;_ }>LUVZ0Ö9Wq^<.D5NXKæCy$N `EXLo/˜"GtM$#ȳq%z>:9yޞW1FٶD"҇ZRC|@;y:9#g|0LPd"Ij-.'I}*Ӑٶ1 ih|MCk&ʞ-t2N)uP:? sd#C$TPP+yU]^f4;ghr}z~=`[ZOۑ>17{t鮡+ct2dVZ2 ,s>,579`,qdۢBiIY^3в U#+{e7ݻiJbR2E]*CB$EB0ʻ#|^ !8cf´wYxWg[xf*Y[0H4KM" -RSdmaR; [4ţYM X8,iw@c#N2v i`o$}L_RtvzݠmT;Sѿ$DiwK9Y 摈t5Q;).[wW܌cԺ"ir ɰ^I7'˰wB0@(!ͯ{qB, \OszX&\3_*fmaxl oI*Hv5xϔLhS txUc[iWO-_>xgoQdQ %L#b$Ȇp^dӘ{zp- Zk^Kx@EZ nC[ tu#.H"m,I+,P(uV!*-GZ8d͖J-2+R߮."CSS0SdC8MѩiH5Wr0UN;ku tHoD!]CHu -aNj`I\3X*RbN2}1?z5$LURj!ՐPEߍ}"2g;h"CdtNtFZٟB9^Wj%*urD]ׯ|nj5Uu,:CJL$8hB;5Ы]d220{xrVu7<W , { s3C' XS`!HW `q-GƬ,z. ͠'R" d+`ȿ a}u0Qn-λռK:6<qhDȂ~ykF!pd4Y,j`.jWFw*1U{Pl3on"-a+sL>û=QsԸ^y2ʿE`5>/1Xțt$͇vky ը_PzepM~Nv@ozY4瀐u h^Fco^xHjsTdC,LJ#_ G.Z[-fWE[B_bVrr^ %KBj5aπY73D w#;Gs"-󼓈_ޢ?`}0nP|#>Q. Pۋ4SK !̺UaÕZi`AFUkmo` z$F ~wD`1¦ؓ'p;ޕL^>ۥq u`Tڡ)D X#^ibsf .63A8Hy:,cnF[4Fh67͍f+FQ q)i`a&7J/$}HPmiZ{%oT 78((`g"ZXd2Lw, LX)B\dGȶcjToQՋ%mS@&dޠ%hFZKOld5{X<@eTU1cgs|T0}}|ѾiW_#>CMYOlF{]cO5~7)B~[uMVM"7hx)bƊD0AvSi+NJb^R@wiG6Gc&{p Mpʈ+j!!WI!Sƈ+ʈZ>M姾RsqŌ2RzמD3+Cʶl+=,?BH;η_ERHs]>67(|pF GrW~קH'۹0bWcN ag^__'_X_(66ܚDWNoQm$;Ns`qH<%Iƈwn|ֳmd3@jV˿G֎`p|B 8F8[ܩaVoskOr b7[nҬao@3,XcdBU8&TuĄdL)V13HE Ujm @[k5]ڢ-zڢ!-Bg[&? ]ȄVhkj:[#tպhoˀVep5Zφ) SM Ȕb*_97@i%Hz гV:qU*@Ct=hMEGX\o(E, S(Edߪƒғ6ȱ:zJnUHhPj9Ƙӫ1ur W:0tcjjjc̛=vs/>jcER܍:.AC0L?^_雙l?h_z_M:mc 1l_Qg>MOӛXyfsz$={@o4Lnvm%Ep̫T1MY%4l[Ú~|1@v~KS8{û'[u.jZI8MK'yWD;<`ANOL2LdS\6v+yCeNp+eC4@"IlKy299gi k™5cxOXsqW$|޹a8'Hs@tb9/ s8 #GG~?o5 bܸ)nD߭:eg[( Ss68mѰo(8a _"2DUZᅮ%LTKf 4eLLPMB=4 $\oFu^ou &C  L@?`zPL@3t $A+UN4( Ie .< )Vn[ d"DP9Cf.P!}\q`#V tJ?IF L#5wYZk*c)0\ƂMT.{2h~RA~H?IP{Yfӽ4^t/ =Ż \ڃn"{lΞkɢM [K֟64^ &d]ve9ݲ+?muEM//J r.qprUi~eL29/}I?u0&&lA;ph/QxmYMHEK0G2Q𰞛bjA^*O,4A4,?EW!grR?x6 CWcxׅ WǦibD>,dC,~?t&oy"Z_^*)bQ͝\ʙa-βfy k<Ϗ")&yvoqѨr fKqO>y{6iN4&JǑ2ztN1g;wixCvz>oY;E |5Zvwwww"{ ?*kx_/c..lK^笋FyӃ?joNe5)Fr1+Ox/t7ٱ>X}TG4Ū7f#xcbhe2a.xS.+{7yq )N#S@uy?#$O0isԨbe0k0s9 C: 0t5H:u\a:bQU_ɸ, O P%#̧bJTa8XXXT\)y>>>>>> ݡMVz;:5'wG}Y.4E'4  4ppkұxXԠcq5:XX\ŵXԦcQg(xuښ<^]:}0usG0_  x/`DN P{v'cGy2Lǵ+ua?y|\$at0 pv ڲY>%Hi$ X z@}F¯p!B^x7cxeǃߌ]G8k ymW,6ZtCv"$s~w"[[R8/d ڧ=nhSXa/Y˲ozzC nv3_3C^V[azV;76LD5^6Ys.&+术e_Xz_o,|N5fIާKiib}kgX^՜`Ƃe&$+ڟ~,3>u51x'i[V$5v;pw'd0}ޠ] me;g l*֝ylKmV)=S\SnKS_ ʼn2yi%O ]0hg>®lWuItf5vNrdO1Mhv10|k %s6#;8I99 tdprih<ΑvO8X<>yx>Z O;7Ԍn|O 8ޯn k,MGREEOc rIMЩ\Ceq1@Q[s5{缴BR"MM>b`Enw*e3񄁘KVJ!ҷ7O{mBf)z,a jN 4K=Tx6c!JP6:1/1?<ؿ>-ʆ)P$W}bv hɸ.7f Z2nwTU9A ⡕"nA(E3 t (YyҠWdIÞn0;M8ipC˰ V! }0~R(8u m  &A;S&̗Jbq* E)Rbp ȸp L82 j91glLw.BqS S%39 ,sd΂ h8 {+?xN?DQp*X|iUs) (Q j}5z[-6x8}лOy1i~G.<#It)Vl_t#mOw22[Z_5225o|NJ`-^6^5OXE|{HkM+nN=v[ߥ Nz9F>@62+da;fu%NAv\f$6?{i`v2AZ736#;Í]ffg_Yhg1X'1h)X;x']<ϛb;v-`5pGxO{zvU+XxeD>A-{%FtؖpgpUL7޳X sH7dK!-} A8?ʢ=B' $9(_56V_=^>M7BM9ޚj}h-Ր+HC s.wDo^Q"pgo8b?W,O|XsJt8.J vX>c @f0ōwD*y:a Ft6:ch 5iUbecuq3"n/\}d/.f`L\5Y-P;H;0$6?*J<CFVB+\{k:@āR,çJ>2c]|p}-./Fb\R oͦȍv&q Au@i!9j"c" 9h%uVRZG99hpA!1Z6!"bJC0fF 9C@,VKCT}BAy]0 wA ZR]0 ZP]Вr킢M;_T$RvHAA"eU7bVØU 7՜8׉ ?P\;y9/‚JM_ +5KCi*@hGQu6ԗo>Qj՟EC6ZoyM^=!3I!Db&bOmJJatCkS .2"۳Y =fys~~Ux#p>$|goE3v@'03;*%;[QN%JS'&yb:F/6(o ݷ5& l7akƗ/u[ou$~ TY^j>dPZ^+0 .Jׁx;0]m3`C>Bzo3'"#c(^2``kj>Av@mh\w( ZSz:pnrV/<9Q#*o;597}| ? ,7gWUi ycŠ%X6x=2m ]K3>I.ηWs1v~&+¾h{iƋG.zfy^e+!fHL!b$h5ɼX^[8d]ٗ`8!b=eb}m?G&ifohYW د}FgS9Зq2eőuꋻA fTK *4xXRՑV-:8BS ][=ԗC[5-!DNFp8\MF xl @M lEš. \.ati(am\7]-Ap83dK1..5U]2^ sԙ:$Sgԟ:{7i2ku)78@&'yw07#7n9I$M\^,@c /@B*4jhKk$&y/h%h)|>磦W>壾W>jZ67Wisy  A7XQc5^  ( A9U+N&=Hĉ5%JLqBEh]̳KHc ^CwvspjYQ%pUU'@QPIqPy<=ao9cEj^ZMfe-ͲLͿZylP#".̴ɺ}zY~>^y]z%%$l# !ׯVml08{ܖQOˌ>pq"8l?"e]cu'п˚0p[sgь9e]I=Y|IiK3p8M;VfkF 5}_J~t}*}!jaӵY)BvH=Gk__q%| go+|m8նВOtiuNZ(]].,nU01`dh!8/ VZ2`Cz7m7wJᘍ\";gG16@4R1Cb4| AA8UOh­s8zӺlGkŸl|`,Xc]Sc%#N3*q5=Qfo˔,tSה$FgArll>ʌ6gA a+y9}>Ns,~^^U:+G㩛bjv-.BaY,]5o/(>guZkҮw+cdPPeʹRV7ppzZ]n7_@E˪5皗͏Jqp7d̿[wtתpKIGMՓS#ڋY~}ApIbyͽَ+'w*Գoy2/Uڎ9i L~4.}6 NW3 -N$Wiii ?bkp} &#*qc[zD( 1Ws,-ZY*) ñ .󧑡h}d%c!%vWr[S#0r$vJ g&Aج?F|a`@5WPTǶ5ccCsMA2tDƠC2FQ t;<;c>Rz J2q]F'ܑp\<Ⱦi@6 XLD, )ptCKx8ZM (݉piR E} gJQPhgnm 0 *Qq=k0f1ac>VW ,QQq |r7智q`hE<"b!yVad]_Xˠŵ|\6q`>.̇XU(%Cs1>4ZQ9%skp]?Q!8 A8A{~ ڣ՜8==ќ{9#q~ۚb&IfKyDyRZnu3 };+PMĠS=l7%IJg/(oȾM^xɣ}v[n+u`h7L齓+cH>uET3p'ANbꏀ,+ ڇʂT] yU"#<ǡXPXDLaܶCaY˩p I1Su!F"$ma;Yh&sNTQɨ ea@XbE.c[, mxSplj-]tHlRebɚ ߯N Z\Sd7=Eh eAπ𖡈Gr梀\Lʂ6@>Kf!pxi23l7 :G`9$̀UNζHJx <CmV.TJ˥JjJW;I=Ycœ=XEVMƫ$,3 _FzH"4"9XdKkщ;Az: u/+[nܘ ,Y2.6skڽ׸ȉY6Кk7K]T5> T!7]Ҏ.'|~q}Ma"w5փŧ,iJ7oz7pwAv`zh3F{7SG`RĠM)DFz`͖Ѳ3B_7%vGC+xd7 @gؖee:4|ox:#d?ZTԭ?`]7VRSG\K|yݖ6<̦N?bUXc=uVNpIz XX{]kB֗G_Z+j.>msy˩\OY]3 jԩ]5טO P?, .QX{_uݧLRY1E^l,9ȕߖpT魕l lqTߴ CmQ`BL"J#$ǸT8 {_0:E0 &H@I:H=kjzZ3:{k)$4oGOd)8tF"ø] C+G!<$WD=zcqBh15CH4< D8N$7YFϐ!G \JW :N)!)=RYJAΑ#9G F :H)$)()2-VG<8S\/Er,X*c)ILR{O^[ /\_WWa-ԷߍҖjWmwѦk_pĈ< F*}yGøL-"#V,Qԁt= IzQ7 fA+ ˢ/k[{yKj-K3v6OoqЌRNZ8 7+ny]d][ެ{\_f޺1g>Q{3`BuvXQC`ά{ڝ9ѧ[0e=1<T(\eMku-+|9Xxʽ'R$w%*/IHD輷2D xӢK0[ ZuG#7Fhn0\[bt)Sf I:+ ^0pt[+(F,G!r S6'H4\cXFk<{48Q(%"8+G+ AȀF/g|o>4gZ(w X4i͞YF9S]2wk]-f[9BPN/0 AC&Q3Po̷ ubu|>ЊV\Ya|h88H + V|0?7-]ު3Nu(κn8뺡/fU{ Auw޳E;ށtҁqnH!ojFb.:/jGyE+r"H#u[}A⽹MYJ/;{d+=r^.bl-KQM su$9nFr)nwGYM6qgX賻 ^lʺ3`+RSJޚagF}Vo7)ze;.Ĩ[aI?x3#?uLEorWE;DJ(񼇢//YTw 3Ҝ7Bq0bcd#3A\/'V7Vy*Aw!&r,׾.j]z_O蛍*қN XGRMeH k'X4ӗ׭~k%0Z5jkm5_25_6wg̓ P3 |j0/yk?&?{q[@[yCNckzǹ]I#-2޵4l/[h6\E` HݑHwG;ƽ±petYx8< H=O\}?z?£>+feF&7y;Nx2&j?|6 %WMwV7dq;YNod}S7 WjNmFhگ2P.]~7wdM"ܾ{dIm&Y|}H}>ؠu% zMBG:0vZڝeul!dqRGS_vNd'NW;>fy$V|8Y8X. Z&IfA:px^d&8{7Lƭ[sb1;_$vFYJGKV9AP,G 0,`ԣXDH){îu&xOA;aXZ1C | wU:`(   ͆C5^0,6b8sXK.7#0Cd6֐gvBCGH>!+LRƵ&@\qvϤ`~\VHiObTM=h6d;ٸK1.(J;z~ɱ EseXfډFN,ZDQ#޽B& A4 Yh&X7;40B8ʍ2(ڻpHb@cdB a!&.DՅREc! Izù D̆^hF٨1agɘC$Vi; a4Tј*Ӱ'$HiӰ~;[MB-#\a2JQ 'V9_x'~gkX6k\`=^~p~ٵg+FE.K| ϣE]\?)<Ϙ,Ăy ,*I`%z.c&\|dN]ǵ;]S:Z035cok2V'?Ê&}$u70`{]kt~'尫Kx(JY\_ZW<' 25eoyr(Ca $|oS׿ o wknwGx @WhE%yJZunD,&XFD ]OtP=`_TFE@=c`U;U69ppaXrHKp},d:@)sPTit"A0NGAoQ4thPOd`qշ?t1a?r0Y}LfqC2/NpN(↾H)G7n3Kt$hOG?b16bӑ#OǴ!Ц AXɮCP p A@GĊ!8U0M!za9Oߗ 8FNq38%ྵu7T֕ xLLexv[M}Gy Fy:O-VMFKD?pl8{Z~A_f$76bruv]增nc/.0 L&_zB)ďV-4ޠt;mg끗Oe{ T0}~Ro7$w5 >1 Փ7')~2N]~%sYNgqnus)o{nË//}sZF3MAhovNQxpsh t)|v[OY'J6>\ޭ6m[/3;p0n80oOorBk\wuEo5=2V P x氁[9oPp}2dIUtVJeGZ{"-r 2@f 20L-aL.Ygf݆%:br_*ޡ/VZqU%zABVlmTdldl88h D#F#F̽Dg $@E(%Q2c{sMBOEcd>>XxE W$ZUlm,h K@ Wrv E*@(8!u @T sW1|\J>r| 䣘P>W*͇v ʯ @[X_ Zd 2eLY-c rd9YA GVw/wxFҏ2m}6@ghUjcBW+D;_NkxНKc]?}൐ηh6C{Q $}MuB,wڤNֆ,ۨj_ [Ɠ@Rm$ 4}#5ohZ[~`/<ڙ`_ `(p ./HGљt{ 7,L1ow?} ;"^ےUvU&mHUj2W?63>Gq+yheJ?g v>u;wɏ 'W G4&l8u9ڕp%,Bѿ6D_/T2,^ L0Y/я ֓2 O֟Qr%)Ƃ~:Qç:a4?1ϛi޼`2?ˎ"P7v4xV$wi8\lid֙%VgX<3f=_9 _ɡrʡHE *9 KZeZ{`KRm$j[6΅ ȫv%yDGJ=v\?~0<!7 ˴Mq#8;Yv$7VmIĮޡX: e~XqtQn(.]^q LZK4)ǐ+-HeIOBhk SpK)rgYK,H:qϮ {I7K}(/fI!Ή:AuܩkAώ;ctNZQN.}Q tr ryR,X^%|<\C6lzy<Zg!zB,YrxVP|zT#ge)ʙ+TEt<Mȧ GL #ɣsp8V]8$U+ʯJk%Tgk/okIj]ېZwdxG^jzEB=ߦ^SZɘHvPzeoֹE~vQ t9vet1-@u#I60hDipꎏh'wcCݦr?RQGj\j~ЁQ_%k~5; &LYc}JWkW4n#?iǵmZ-PUk`$iۋya7gV0PNJC 0[ּ$sN&g44^k,n޸酦ڦn4|kөMc /,|rhĒ ^{1te$|KǺ|5eJ#g/yv^yաmj+;JSFI kKɲG]ɪkRkGn5j 5Nox!a٨_\wj4g^SbXhӬ8Ov}7k t񘞞x5Kf1`KI\fг Y2 A"%mbgww()\f]f7bd86LتAh1 ?uW -hz#ǥXaxG }| 䣑G#%LT̤'. ́(-t.svU8sf܄1E^@zwC@1J2x@ɨ94ɘKɘA4ɘIj&C+413i13i1رŨTj@A[ 1xx /*tЊ<{ "3p| +,1h0a9dJ0C7Bi#lUz=QGTDx^v+ΫJZh_+X` 7;6^@x u ǽwױ{xڽw=8GU߃Mh߇Qh߃39>Ch?#8~ :=Ǐ?cG58>qO= i8r)G O9>c- zоS+3R_) "&1v@Nw-v*]ަt /5mo?'/ 7>|֪{ԋ77tzJ|NC|%s WtzE= "]]eUoCnѫ5F<#u*W[GoEMyz9kt-FMPL6YKֆiGkUS`U[9bGNRgs2Z=hm޷6M(8|NW9\] 6+nʭw˓Bl y1kk"Ӳ:ERelҒU;yul5t9dͮXimo4὏'nRohh}sFl6j28֑]o!IG Vg6~bXb0~~=xm0UܴAGO_?1"Dц`fan;`}*mbۂQ =pM kYsp((,V[zA+zx3B·+b0XZabơC#;pť, PZ9MPu@A X/5Ms z P4F, Za6桸y2<3+r&F< gt\HǞ*P-,%hs[T07)zcrPDR*qPCa q0 >Yy4&uO/H(CyC2s<4b]&MX)@3= SacnY>dZ YG0tª?.4.xS?"z lr.ǹK$_HT%Mno6hnh#zo#i&$s <ְ!f'i6Fڃqo28RQ C9g%;Ӌp:'%_/P!g53G=H#~H%ǵ.ʓ"?U pw`k!Ƃ+fUda4̇{:\`Vx벙iY54MO'ʝ-H^`!2o]$ek-Ҷ-j䎪-W"u)|X,K(tWE°[tF3_g3:#uFÌx?( ~ЊY f?eL쏋#8Z>D1F_/3|p_Q(2r< 4Q3dEa}I2.EH^McbТ BX mMRyJG}BSG! 8paQ[*v暝D&d±Zc"aD/30b!:0ly!t092{ `sNtI M32BnЎ?wΩoGunz07wՙja t]g>^P 6U/6MrrTF}ދIoh,#qܾ@|h,'yuhݠiK @xN:}y= "}Ml |+,7ĪT?CUvl80AS@8.e᱆NoZc\c`WM&4t6}ٴӦ  lz)@4$ՍՍ4he\U۪Ź/kf]IcO묄e7dҥt iymF;~ 5k\cZϘ͕"s9jX-jf冾'GM7xC7>r%ȟ}10G ;k.R>#!a" ^̡zXX8"e2""@I7\X&Dtuf A {eWjl.!q9uBU4 a fx1Z kG#`dšSceQAX1 &"d >$AT){8?31̑u C}|hRk\j탡>Y}0rxec\}sC 59X\ 7)cbl?aa.͝r1y!UOKyXjk&b,Q]zx,>lo3ūx=Y>"enh w943bw (A<~WTM>9^~کvi##l?g]Qg|?o|1{dߪs ϋ`K^_A.W'2w:Cqp=~%sFh-Q^!?N"cqQ#8r5~Fjw$l6E3rp_ӊZ^Ӎ},kV2\X&Y[,J-q-7< woj ~q\L^ǜ~ZmZ :9)ѩl.WX&ShMJ`j^n^v(qa3 :֝mEˊ)CY;Kd '+B05ROfO8cC џopA8bbsq8<580Jάwba͟(#Pg\ 6E93PBgkzuBx^nOBQ&+杄ʼmA,6c,B5U8k GW,}I޸/@^OAv Eо"%[y O@xUr& ކ|Mm{qer,e Ak'e.2$<((vL/fë F'QK0-Q8CPLF,cy \Fbd| ^2͐X2ׄdEQn;tt{g 0YbG.We/ʅ As:Bi!:3杛v&y P-7`=`x+l@ y1 r^d ،9N_p6dpvg_wv{7n3'p9}|ړŤiK76xK,9&FQ.ic8Е /ec`qXVWuuu:o]Ϯ/)ׯ?:zn;sr#m~kU`2kuعEٯU"H5E|;sASQV/+(/̩Zo+ɟ8C@O7|Z hq4;ɪ}"4_t;}{tGdhEAA$?kfga@0 Ia7e<9}~`kv^PBxpr||||ʼnꋎ/:z9|[d O#Q}$p&b$+LEg3cln_"VK8[4Pj:jc3/uR陀,{ȫ?$y,UN`xeLs9ج4sA@Z,ԭcp Z|d5puEޓ'zwspqNf.:=c`m0wZ 81Sk\c4`@Cťi#%tr/ 9k`9l9 g$k 'OgΣ!%ލJ2\#ѫ4~<`vZ ]%SWK%-KZ~~-ٿrw"w<^  a a;[嶋WdR.[Í՚z!jF8wω=t:[T~vc0jn}n-{+ǴXL'&Q3==Q~Tp:p˲F`g!/@jSp+F n=yy #nmD P>%%?@&hj .8+ V,zdp:YBBBB,,TžQpHZgǍz&Gk+C$Hcob%._"c~X竱lm+ }+o%di2"z%ǽE-d"#/gQG['j,l'At+p3y*80olDm!i5Zc}> #Vk>KŵmޙU&E}rZ4n%ˌصueهo;eFɂM L;LQ^WܿZJHWl44.}pÝC+v{݀w_fbNf=_ dt4:Aǝ_WyKm\jr?/!fsJQڜҿnĹu/X{sN0c0(#$ aOG&P/u,u,#~e_ʉĔ8ֱlV^ D hE @>H‰DĥHĽa)%G艸]֑J#X̲ 4@@@@bD/higNV6XmKye%/4 WY0^=;D J+Fƚ5@1>YKKK&tQi& 4 h24Х![MbiKC>4 tiF5h w]`Ӽl3pTke 6Kx ^AMކGm+UWB_L(}P+PtuZ 7Avv7}>AP>s g@mJ?\MȄҘPƆi%xW7k=Ϸc;@1|WUV/]dgsↂcᑨ:J]zcRTu iIGu?>!U<ͮ"6.HUs?Lu8FvplzM!_tm4eGe|UʦS֟\0qk?c\cjʆY{ʙmP&]A,0*Vc~MZP-~2]># FcD1#Q%PQ> -0jb#PMl$ ;P%ZjƢLe*vDoaI(^#t-Ua;8q<:P#G@\u\Ŋ\hEPeA8fa|ymp.ƛ/5ڎ-2zc>繐繰't\ڗcn]yD坨=f+([?]dV *@+VzavR|7/G悛*Tpb}pξ9лZ090zЊMЊ p砮t;?9nka9Js0^h.WIW~ dq|@h[zO&: n!;r2`{pz@&dC _yvwN0K>z^zj "kJ>I'ڍ7('o#c\w zj%wXrGTFBԧ`v"!(W0)Cahzf4PQX[64P}{KT)͓-3р \΅rZ/\w0Ia}jTLQay4% 4 3ZRg֒O(#4 M'&Ze >NZsUP Dh-€Cۛtuq7"JD$h$$bB#"$w8ιP\sjHjzPbUTUTCIMU RUҪN:^${=s9{Z{2*tfTSzȧr?.x@^&ORGX㤱SDTʶR6\-tԐf8:d ar%:ÑbitWͿb]v6]^@Y|()Bj]]^[PEbԙJrSi'!dUR0[Ҍf&`YVPLc@E}omЬ+xgǻ<SJq8`ir 'Y< Mbege`y1 H'i{0F-`&s#͸yU]5aXYĵ.DamM}#FBF]mڕ|ŵ1Rp8{逴=av¼ +:bԮXUd or8.M#Q'8j 2d#E})SNA=LMA.5)(ijPYd# x>8k8ŋܧbYZ4SLbs{Gu;dYM~G.H^ț/抋ݤuR0Lr$MH`l_X!Lk=y\ʑcBG#ݱ+ [8^a忰cl0CP:), h:LmG*0}KdILݧ+w l吚HSɥiv<\0S' ݣR~?ˎڟ:`.-hi&~v> cY_e|qPfjy-mSm>Hj~I$Y$`#2lRۨImꀣbv&c V{c b%~|[WkǜjG3?KJ2VIWra5[a,C+LLl! [ۣ"V5 l"m@‰DS"|h#:B: 퀣pPk%NUXjk܅ZsfÙ9F !G`>d&dMP!r\!e.sU 2lY0GCtPd>[4}`U]u'mTy+v_Ŭ)l9VSv&uj?zyD~"?8)UԟkԩK}Q^3^jA3U>uV rz:k9vV;֎k;4-^ ԎlagX\7ÆU.^ Gj1n0ȳoUm5"DLVk[6n|uq{[o>ֿ(D{+ #B@X3تu ֨0Y`RZE\\F30w" F. aNF[,ՂVj!TKS*4@3ꋷC1Ĝ&EFq̅8ėƂٳaFŇ>X' eˆ>ЊX=O !%q(*d?\KAt)bkIH0MRPZe6Pvh2=b,Crp,rp,IЊ$,ٓfILh$vI\ gIp gI0R#Aڏxn !>'n-v֢ZjP4xm=&ٖ.KAxqf*2Xߑ&#,UkX9995ed+0TwZBki^;Xn"(m b7lt$0] iD˫(-dSy" L/@%uYoӊrb0.|~^eˮ ʬb%VFQڛ:Lnå)~)iyv0U!o]HcP0Hm  /k q;*zC.hL 'O S8NOO~YӪԜV8fj3I`>XO>#Ӗ흳> +EȞ}"k*%rr %rڽe뽜K٭um]h< zROWhQZJh¤qwv(n'q #`rM]LUd'Em]d_i+nvrS:i)G ny.ddxa<6:QƱG`&a"oKir{`%9lQ<ea, FXd&ߥ΀^ ,OXW6(-u}rd%XV K@?~6\xxƃ2륕&YO(i<1w663V6@| _d45MIroEsT5])ˣJ|"+k5jBo4Imf=^ԟdOi;.RΛ|.V)L"JNSA\4 . #!`FvqxuWGEQ\)\' Clhp>4*88&s4 Ce`XvhC0DC2iBa M*a ê/'#PF!V<%ģoYbˮso& 5s/I_ ΁ahVQDNr_D QeOlkTkXqTVNQ C#1FIzЫ=YO0' G*>u0wa9p]us]ssJl_xxolGc#~'[;ArR3{؞Gw:: GKke`-E3tj\;X=[R^RRA0/ k]䐚qy7^Pg?: hn%t*=EnT.LRYfst")e~t$K"݀X}MYIڠg{fe/ڿ a0n^ڸgďLj<(&[VY U8i (.E̗}MR'aV ɗR2.;H9rcA-a_Z$UD]Z:>#EIi!(TlHG/O˗Uu|"+w?ͧ\ULg 9UT*UMߚ`!VD4֝9k8AXje;:99D9z(^dB۫3G=R `Z/$!$T=Tgz" ˿˽1ù1[BBյp>D|h[_?w_Y~|k\j4pT& ]xc^T px =Avt")"u9ͶF3C>CW9o*Śt@A*C֛(zG@$l?5y3sLB\X1dF`KkG7sCFU6Fe'+Y6zѓI~0@!'uhw"(E/+>jALvfd_f5 l읥Yyzpl߰cMN~55oZ:zޑJy9/r[(ZAl]5~,B Xo3 _%*^S%UܦTLu/㙙/n /c!;`Mx G,eTC.#xw}}~K|HyWF8V>'~cԋp]rU=5{쥞A'V܇`'z4,Ҟ|RתK"8Nq`L.TO3.}߱T}]]P?TOnT|]:lF=BwdR~96zr}.yg\ZvW\L SORy4;«3j(rB'e4nZRozsһ5~@Gߡo#qxg}Z.*}1d}3~Hv~E/.]![ t%xy'<ҷ923mmNO9{4Gϒd~]ҋoڍ4-][Ulbё-l8N G*sJwZjF_:Osm}4yMG5JbCdkhFn~ʪ!d#C53ӕ^VA4&|0=#qcBʠ5M qVZ\% ~#vqBͫjSOQ;Bq:8 X9F鈖;IH.Kt &]{?^Wk <%h~Gߕ7)mpa}&RL*(Ɛ1$Vt-{"$5M`"8&bMѱ>u1A[q)1 ݨHn M66 ۈ( 84_Ēz$2~! M8/l)<5)Xڴ5i抙aDb,Èi!SALu`ꊄCx7̚ `3R׳AKg3#PK3?tƎ_&raOI치O8@2r51@͞ okd>Wb},QB2dm2։x`&7֏vwxpa;@ L!pJ7 { esZ$kXOuA]Gλ(sYXoou;n ua=bJyx4k5__o9@rH7Q[-{=G;TUE&*weUN% |@ @̞e@ڑ r]'K Z4&˶ҏR{%WSlJr_ yf[ώYM~x]3Nbv̟oX4#omu3H)'h)ȶ,O[=KboOF -=JO8ta/ )C %pȦ(3;ZLznup1鈷ykHlĪϤ[6퍸WjRQ \3=O D B+(J~hlG>]誏FW}8 >>].<~vl>ۻ HyEq4դ&$ P< :1ߢ&u0MSv0 0ɠwav[Fx9:TRKfB(Jdm%wNuxgBd9lWkj#FݣU[dKy#}]o{mue3︞|lurpT9%fÚp5r-A2S#2_ uȾ3Y kNy6{HtS&+/yO`^^xy[-ÝhטU0Jepz?oe :/R_sNl711|[fMMQA#j!.793!І#cv5\'-0h9mMVs+hЯusaBq6?#r2b1.tg3H@DOVhn.L1f'vb,>xcW2Υs)żf7o.1s4}Q&wth0Fc"AӴA=ij*%fG{7@|>~n-xA z"Ri:X +Q0꒙꛲蒏ZhHa~EҪƬy'e%O PW}hѠ-w.U9S,출Pހ3{3UqF1دFDI/G|ԙ0kC#/{Gq5`KNӻJ,yoE$Y"8xu%I#!_Sk"%]Q2wN٫hx4Vj NfZm0ͣ=Z*9G:NU3H9 X@)y&sR:iJVcx0J-tmyQer9תNy|H]fUaˠbi@Z^p|Q::i 9y)H0{j5lgﱓkif"XZ-G{Q[Zw%= Mxn!#s#ẖ&is}%M|xd]žo%MDc\8jQ>2/e]#syݝ!(a M_ jqLZ黭0۬"5Vj>pn] 2:UM ' sYq%#oz9ujppa[0'Dt5z%v-^fE/V,]#8GL$1I8bp$ІC+I""DXu.R$"JIDp"5ep 7Z#B" 0=4<36qVQWT8#XYT+bc$Lם#04hE%Qt8C @ C*{wp\tE gp·V̂Bd 3^b^^v1,A%0*VP/K`,{ 8/E7J|%^%WZބ~e=+tJ, ڕFX6A_b }e ^}>h߂~+ފ彷bX{e'[aW& ,7=֕z8][MdCd7 VxZ<0gO79r %p.ekZ6Pu)N:(tP!`}{!THA lS-B6C:[{y+TA@!1Zm)Gw@WbitXj,&!ՕKlcRP)ʐ !貋$ZhܿTOVnHӛPXGɟ>B :}?Ie4 ;/&"eH6\'UQXH66. ~4l]d.hC[j(O5j,r 5FVJwuͽ6vy$^߇_Xld/'eVK#4iIKفvK{}mj-@si:~fHߴ6ˤm]۠Goâ7IB&R+K۲3ZI ֓Z>S_g^4NNZ Mcooy(QZz=^[':{4PD6!I2蟬} Dm5VO|5^ ¿5?-X+旵bm< XC2c /Zǫ`YnC`퍁fAwV厨;%UdKX&+v6ܰAp6_pd 5 3us.#nVy8jHYZ مocT(2 ) .CҵQLp.b 4LSȇVhm' 81)NLApb uEgC? D쫨A+v&'WzZzO ׯ l]^)-öA MF}:dо+|2 =udݓQwOF=udדQ_OF}mɠۨ߆6BCo]/RnC 8ױɻоve{-Aп[ ߇=h߇X>~ Ϸ~#[C?rϷ~8-C?C!p:BwNS F7|o \k W^x=ZjKݯZߤE9֜kN@R\жV#PTTvRs9cb[. fV  -&i /ʶ`3(2YtM k2(zl#_ J {`m]umެUn.ZՇx+vY q2X(^5'{bluEr]ҏvWYvO{g)!ik.pc!?Է W4hF4gm/pObܛk񀪮e|IdzH}$ݖ7FNBLNQS"K.q+d/d 5@Uid6SU%)6o6lmt1E%u.Sr ᪶мBC [LՆiZ +J7~I|A=k/ %6/l2Pb7OGvW5G8k(>pq󋕏3̔Dw^A 4Q8=ިER72Յ6!V C4#X0kKcvs 77@P;`˃+kʸڼѕ5bbx$rGbVLSEV=, VϬS rHѧhba0Yz:`>t/h;LDk9'A/k_MN~ 5_?WR1Dk ddS!Ӹ#NHDw$s6! $\4;APښ +W.*f UA" mp/̡A?frVv@qE4@PDQZFA?KVQ&o"A:ʴЂx`:>myt4 zbEuL5LgA@ @0 ]'f/@:WvDa! [:{A*lj/Vu.~@+<BF]my[ \$t]mUhF} В_[\P0v}\.}cuXSXCa1`Rw$U$} aUV͒S7:u7I;zW5M@(3`rhJ:xȂy}~5QڨARg*vl{ۧdiHğwڊʗ@|D njQ>穡\EAW}QMVnAylIr_9M#?=hv+O.]B=ASAo#T eiFFe\Um0_OR8c̗Z7ث,s/sǝ)D8x ]O7˗ritQ)˅~Sh;qӚ~% /rF8cpͫlRt! va6L}>37@`pWfi^FrE: Օoהj-N:Q[M^ xPXD۬ok5^8r/Mw뮉(&/k/B//D   oP R@ !x٬CO:˛ЯGOz$}߈#X>UЮ}7h`e; Jw@ X/ ;~|Z/w7}x7`t-h!h?DGq>Q} 8пo9ih߇|G:r[| >9YCr}\~3Y.C9,W? >h meО*guhZʡnr h| Mh -_Ùv!g M-˿e -@{ro] ޱ܅[w޵܃;}hYh<ˏ>k]SQOsC]_vGM50LS DDP uZP|'{mr:A*{0^GwdbS"&w:fYB!l;]>b' J|==ֲ;=@jWZu;{3h?ӏk`zU`L+*k3]6s%᫦: _L5M}wĂ\m_ 1q$_YU(LOTbi]8=x"i(>t03)ܤS 3JGyjt'Wmu[-(FFhk^n&|?v/܅Xqd8 +lق. QrRYqăFV54kO<(hC6Nf,;ͦhՉl%I<2s֜s+rȏ>. 9ʶElaeHZ )§G" 2GžXe)q>peu=i4R WfT#J0ZVr_$ď# T_#~tZ]=Զ~qTԵAɹIxiQ |MgOlPvN9_L 6LֲRj-zC+moݣ.Rfs5egkvv`Ώֹ/%on|C^JKyT|}F:VhviHה|TT~H'Œ"SEhOO!WV_o_HZs-s̀ -~Ij{wȔb qJZiU+ 0Pu%rtD$m'I&DZ3hW| o7@vp-vdK̩:Nbsjl)=sa=iL2 22Ϩd+ "7يeڕ\AHl[kCm>,"ʚad0A*R-Z Ai,ZJA+mjlNkK6kc`Om V6pp-!0fY}<|F?F0?G!8]}1?t:%h_ , ?!l Y`ʅ[@t )yg8ބ#O^ @_Mn^-Њ0"0^, Xa:O~%W™ }=NEu0X[# ~ty :оX[%J\[&JAXs-CZhb;(1EJyL7L& v.5ϥO#+f_>mj5P=PoG=~PߧBz3wpջ;cjΛz>H_-=Je[1wkVֆj]4/_֙M+o3h fLF+R~bs!+˫`B#e j7?b+3 0`r~ˍb RYbr*<-aV/Ҍp_ U[h[c8hkA퐭Sl֘{Cжk5o&oM Fvlb-c*OXF٤"13DdQ"]VH%\pC`D0\AdR-CLK.fQD@}""_DRGd]|I(Kz?>ug!IJ`0[<%iMtm0;'1F' =fw|7z5_Ks[r] Qq#ľ-0VG:ՁЖ4FQxOkrG5(as=6;]RY'BO_;]'fcM].Amdu1P fy]uѭX}]~XhFIY Epl 4Gq-[Z"RKDbDFo+[]<p.u53;"ո#xᏺ=\=~lތx3N7x@O*7b-גEyإYOS^!L҆RVf.44@mЕegXKlNJ(Z*t,;m=mV[mMr$I뤏Hrf| y! |Cv0\--^ӊy`-A#d@L7鰟 a\~{jUE 'r?z~@^'VF(0n gnTA5.KՅy(<jS:8`.jW2s0?z Uc4a`]jZ6G :iXU:}H79<΀뿚t}-6f.ͥ]Ԇ[țiv>Z-v}vol{mbe6N]1YS᧦<[YK-q # `jBzK-ޕ-t6#112ifbAȄBϛyՏ3 |1z @9 b%eb3  (!p%Y1| Dih%1a9(bF 0yFFN&Mn, nЊj^ AgR#YL\H6s-4H<'ѰzcBs"q EaRaBoӈ@P YX.ة&yL# :=]0c]oh)0R ߫7 Cnf3f!Ǩ 390ra8# Z0~q4$Z&`F-ca>/cC>FcC>,e1ceYU0 sGR8/GaVkXc~hE,c:.eYqk7Xs 6@?]k,0`Fll¬A [0 a-跠r Fl(- "`ޅVD, 8gy{-w-}AI8hz# AD 0G`,G[XA+ܑ;`1ǡ=I?}N#h?ODlGp |wY@ П3է9vD/%St~): go"e.7KZ%T&v k]@߁P] (>4Cɻv- t6t G1;+pe_f Cwf( >O2<]Kġ b_ʅFľX!'PA)D' 1fYhb,`, lq^+{yӼ_㵸e^^DUAaPJ5mdQN<@R6[$-/9=:ɀo3,M^"+gX3u7=LcBT2.4O]~&qfJߢe6>j`ez~Hkj!Z@]zMS[2Bߣmq@Tֻut=O߬{7tFxX38Ee`.}4u/7}nG;Ex3\ b/z= idmcaOW]h :ZTETG~zAȽyZ})AA3 I6!Ӆ"Ahœ%&-",xϾpT7Y UjΕnn֦\ފBk:|{A"Q-3S5r]ZQ%p3 DIMgRwEY\w;\}N<0oxSzUԋ99'j[HnH3xzcëP@CbPCԐ^v[k9Wن""p" R"r0A1""**B9(*{|Lg?sfnkwwdfSg֖_d#VUZn nn!g XW&ӖVe~2ޏ,Sϻ=Z>^JYQ&]vmhAcWMoj,3B~}'yx-/5f[zO=Wtr5H!gZ#XAj/l)!;C6Jj=w2̓"o#?)#uN<# oD!rr$HшyeJ:¿3)! ;CuFWgxVF|cp<HRM/גT %pTCEث)T`?d˾P()[jEɖ[EYe'ɖJgk$ =ҍb/x$6 sE)?A+3Ĭi&/alIbfyNb9߼¬ԉ y-џOݼmbFҥ:i RHzGԱꠈ#F>G w->0"0ÿwth+ IIɍ>-'}sU;< ';ŞeY>ݶYLj20YC߭O0>60μd]b|_#E%>˼ϒd{&+j?ƾdlH?fd4OҸY벞ɼqWj˗ W_gV/{\ٌ秝|ÒJ$]ya57薒%QG^h҅.t,vn^Ѹ3OY􄇥'zD78zXB,!%_U%itS eL}}`H GK Bi C!Gl%o&s_'IހʿQHXƮe&Ʉ Kc_轌c ޕ6Jgit2.鲟N}v3^q{;= O yS^i7 u\D~kF`{*iGF{ۆt;hO}v3ߑ7Ï#U@.Ej$&ᴰefATy KE& AuPvueJ "d&)ձ6:UڴB㯺W”wEQQg[տ;RU]^2=htSS!_vY>b,ye)`gϐ)/K[ ^" ۼl "<]W0:Ђ@\ i1=9c:<П"ciWOUzѕ6ˢvJ| m rDfYlBkx3|9?F&Ï֪$~ʬgn^ϊ\gOq${4]-a#zXbh`fx\e.'jeY!c+nm_/ۏ՜vv]jtكQo6c{9՜td =F_Fz{]baqv}rwŝ1]1AM_*0=Q"&**EYyVugtnLp&HFifMAT:ʤ Mj4Je?!j vF 1!1ph`#vtD+2E<r6zʳ^*ɠ ^MBo@oeT˄2BFKЩ"Uh=Tn(tk9Fcc0 QPG( GQ0FK㨈D\8 '4SH]LS^Aѻ`SVngCB@;. m3@ҧھ@ICP@Roio?hZ>G4l.ݶ-gHcN*w^"_`gX ?$^cIC# *wVw3ۋ>«}ogky[1N-oyb/ GF%V=*#IL. Tz4Vt6ukM3蹒ZM5ӿ\Z2M'HA=W2iA! 88C Ìƥwody14end.ǿrURܧ$K}29M3ɜEZin3 ?kqQ'i[=-M 3 UYZc[,:6֪mu[kbX/8#y|1EQlEG Ӭ/zbqV&X@l3x O<<==Yͼ&>S^k?_ͦFvm1W|×EcEFO:]/|s;7IX4+`^?>E2}hR=[44rYẍ72ʉ2<$$Ǔ}4zQ㧹/|_8w}dBAtEP8{"\9Vrݴx,ݽR6aI̔_"WcDZԵBf+74:^:m'y; IpNv)KOd<D&d:?ILG \9Ҧq1((%yB_.\eAj}(?wz-Y2^kHWaU(OXK:lqC&jxsjmch6 e3 S U$Qv(KOvd'/wANp׭䵢t3[Kl+{s-]._,:Ѕ,FZ\o.I Ll hNj>Zj}#Iy;ЃlZfl54z1CZl>Eh-/;kvv7lc}CGMҙ>Nobg%ֿ3y?o:*{kv {UׯsĕĶoWGOJu M>f4 V$R/eXy#xdoүt.5LW(UZA"i{H7 IH'8K:b|D9"r l+Ֆz[jRH` r+nSu8QCqR t[ Ë\ߨ[:BSTWu16a VLoC j+)evCvnUKmpwEc7ݤs'BSw_{balY;v썆UJQG*_Hdct4g(PFz4&!I@4|$si 7 N4K/^XX>uV?,?F>F #uU-F hfy¹T& !` LR,hKܺ yUȷ 4NC,B` SOlzT3 \z!ޚO- ,şw?j-*o#ѣ %º(^maokf~_x5F("x|d6[aP6Yk7{RdlHw)f l{b+kB6{ݵxd(a$&Oז2LOv^'NBf%uC \ $Y~FĘ2r̬6dgyyzҟH95Q#ykDT)9"rK}sHר=8,p 01{o7ݑiQO%g$-H,.{Q32|!5UW?ɎN}f';xo;blmV~OW<W8>j/'>)% vĢQmSe؞=K2{h; dX=äzło}cOO3tF!;fFc:;:'SWlq6ѭ}:F]ɮbieUYgUV`{|u}KP ݂%ZYutә?u9w;GwEEU[mXo/5QSvv_֓5t^kVIfRv"bSvY-[8Jj7)Fq_ۍwUSN DFj7Iwmű27PI0  nD5CA]3D Im.k߱wb M'V5ƥ%V$] ?$p$Zc!} q4!a WZzA¼ eZL%h1OXj4IwޕoHt;"Wޏk^n4J _H7z x*(gƀ# $ч*inqtAÉոMÁOAq\ƣn&}2 r?,>zMy*Rҍ )mIw)nwt^AL Ms.=w"Xnw@yBqۈ.C#& rF6ñ &zC4>L^:JM:Hn @)ex8 h|#`>i|'=FM:FRmm%F6G%;xh>jS| ?Nlq*,gh,,(gE,lBC6DcID)y.#3hݿ >>(2#'|<_4|< #xė4Wi>o/xOhLg$#Z74~MzV@6CO@P~'QaHveIkJ4mhf^'dE'FF:>nl=ڲ>%/GFc;[g:dyVɍ*ɾ2:u$@6_ۡo m6ݦ%jqy_YG5}iCX' ڤQCqH5q =Ҏi|Ch\4ܪgǝpv\QKE}ϖ4bCL26l 󲚬g$z^L/Q􄇣' =EG+]94_:;h)&SnD=`"|NC{o=h%~""9@zVTN'9t<'32'"[dhnYH9m`Tfͥgzw-/__ac&VSڟ1vKk</ޤ3i%U27J,?YMɖlAXdo-ݟc=:/W3rb.ZlhP>'׈Sb(`x qHb̎6Uz}cQ #[cl's^+>ȎO!SMċDYYۑUy_Er'6;z/~z!+hDtJs8D<Æs 06.J9qu(F_:3n|JU32J2G&^ $& pdѨ mSNOɞ=f{˞_ҬTOzh(lJ-p@?_ʜ`屼`1׌t>}%F,/5. x=Vk_]`>뼵,"fvcϲ٫Kv 7b}c`H7Iem1s-y```N|0,dNwbN[8 0gq9ؠ4vDGud0<.%=K%une%/KYv ]ٿ `s7~M kxx?85S>V|ժ<"WiHj[)y `;e $]TYSJt;ijZXwUIYR]KG5Aua!6'6beJ_!olEnz1ӼR'+m"h\4? %hta5>k!t xy5Y(;Hu l\ +GЫ@CD6^rWk9oƚ:fU9qF|%EdW4a]xhC=daLd_󮢈 xю,llH-aT`Jmgr&j1'Yu9=zN]VsI zw~N6,qBo~+Vq\'ԥU; N|I *,\<>%莶 MіӼk Ĥ7>"C~P7krhnY,7xMt|>ߊi[&3ҘOs$a(7?T{/N)>Di%(BgWLDE[^?x6e -lUmf,ObMQw׉-B{$+?5'lN3 Z u3yvOw2I`rp4Đ`wyt '9;mnw g"_陴E)4tp,R9\RRyT*#sNjUTyLGа&|xPv#"URx]_7~YsV@sZUU@Ҫ+hK@G4K,( ^402 G[^ГzE!ꢪh-#(}mnoe#޿Ń)JxZ'LdFn!KRhPTѲȖaYHk~3GD@?_X!2E[gm^+ \@x4GxS^/i #&O',XO0v5Xc*:!oM^Jgۚ???JNm: cxCQW9Agvj:5ۜ>LFvdglv;9Ώpg3`YZvQ:9o9.gY欤qBc}ڗV'ڧj-Q_ _iٮggڮ #HP|1|ːu?OlJ΃6؝C<`w0<ؽ0{9h5j>p[u7gSANdqF9;PVi|ζUOuz4h|4uV&[A#ُKe~TBG-~A$*dWhP1VGiOQ$ͯ(3D'ѼIZE~yOEߓ:AɈx?~sBR]NbB̬2/yjѭf:BtF?: b3X 9F"wLNYUdEY0{̕Yl1 \_CZ@LmX>D+PO[덴lvL*<^<)ΈFv}} dt 14(>c5ɤcvEXy7~ڣ]fj5 vZ\%51">}laQNDA+CdT[__S1IԯqkEW$Yy3f7Hi ħ-k\X{{UݖvhZޑ^C6j o o m Dc~c$ B+gCr;|MԄ6P~ GW&Pa ttWM@0qy0uЃ}>8L Cߡ v\Њ+ ٷqj++@eʀ#ZV \A""-KVFk[YKj!e zQ9 >#Xz1FeCx4ߚZ&i=h%r/bnh. ɒRr{sGݐdLz"b0t2_eCO|[F),P^^\ LB{wT>O, 劭A.#4#X-&Bi)@L>BZ:'CVhu!u(b*w!LVMoIUO?i9ӛT%^TcŢ ~TV\J:WW"DRM%KtUE2ӳgj}^>!~o1=-*]O&kh֑xKoiG^};,-D<3[]k)lbl9jYìV9˚m=;(:z6d̪5+k~Ŕ@1;^`[X.Uϲz֟,r[﫽1=JF+%ۡgҳdbl+h Wabg[kfj[/]Vb ӱݬCf_'EW$Bأ!ɖ{fD[s.ok=/Xs,[lYUo~cylY'kdv-dxôK)E E ^:tW=3Ѹ'Rb3f{_(eԽzZYռc^W:"1-wȌ4O\ 7."bVg`Y<#=3<<2Jgbu tEDl ,U";oIWzwt>ix ?h4 7YG|Ճaղ/Ym;߾^o+`&: MLnjcvm/ᓸWlqti4*Bteod+1kHv-XĚbNYXO/t HpC]l@]O!tMY©OR[­&z6ڽC]N5B:4J"FN4*Q]s)#5oƥ X(ϑrQ$nU9]1J ;Ve8 g=wYDu CkK !l4,t~4JK]Z}ygpE EHZU#D3*]1H0AJH y5`p`pDqh ,N9< p1!>]"o ".0MƢrg,x,@cziZ/Sl) 43DR*x\߸B2#$T־CVFځwH=*?g*5< °ЭplnQ#JDa zhc% vً>cy\j^12f[Uߪn$jZW&V5:fhh#V:T&VskRQYҿ!Pc2b1T^bcu^5h6hmRm=[)LnWkbrM)ZK5@YΨQ q-ՎjUtL,(12"a;W2mBbo7g!P!к!P!к@c](&h!moyrf̢nl?0ŗ1lW n]_G>qxe)S.ǨqDy ?BwHq ͻ(;vh:թNM/tʽB]6YykmQnVE=@2_%Kߠ*t5af:4A:Nz]`sww|TXn I,Ug>{iK&1V\iΥQ>'DSBDe}"C"D D D D d{\F2& ɌrX} |55?|i|ΕOk2`&hL軄ƍ@di:/ѡq X7}9w9w9w9w9w9|;_]#XNh+ÖS=M 2zƇh^FM20jq2O(2"M.йB'V $W;}׉ul_6{ 1]iexn6V_0 }5|ߓSuM%ƫC}پf)T ey3\!LS L֒믘A%d CKf>ZXk5tJ͏پTzo7nS5ڵ@E@w&hWIZ5^YgQe5l{,"ۦ {GO^[goOYhlA^'x"O)+^8QHٜ~&͡7ٽ. Y"p5(& 6}ٳmr 6^O6ٕeɶy3Cc/YD4M8.zZzĪ쯬*YGvVn}O{òr8jxoV5#Q9Kc8uR]g\v]eLb]Wu*u(LR]\+m2I*7E>ün؞e RUZr(+BTfKl(h+/S37D70CW\=`ޜ,`mhu5 ֭l~ܳn*06 1pU_4*3XW PFL;x.uךƾѧt&o 0Fig)"d(Dd؍g֔Qbʉ4J&ք}cht1Ѓ QtOk¼V5[ 4hf K;3@G :6 fI/XI9 "l4`otx'Wy<|͕hi46[,qp bӁTkދx\x"|.lPq6LχEyi .k˙)mE?jb$?Hυy I@nK^= zz@/!{cCQrā8p`ϕ7Âe 6z.Jlićz%Sv){?5H^\ Fa|E$"Hd8";f;͊qFL@cэ^)M`nmlVwy7/2rm$u{ηZw?`Ǔ|^'dSf)fNJ$.&)i?e.g3J'=u z6{7 v][ݪzx>By{bd>] _%Z|-&<߬/S섇#YEzkX%w,qjzNs-n_2%9@uI1Ha#"Uq»D;tsGY](ZX\C4!$Y 2AEvD(C{B{B{Bؽz2HkNR}3vUӅdm:N=aHtH@r? AoTFl7z鍕ĂުNZQFJ2K6 m~/6 Àr4D3Y)l0%gyRH !4%i%g@D@DBTGi]I \8ס9HX:r}gBX pOBwො FB7nZCӔU5xFW$*I*cVp/a볼,!:hayh =Sz.gp @ȃ~f!긒Yd/-G=ʺ-4Mp4plu7H4C4z<-jK-kօ$ha[l|7-QܜUC GሉUi]癄"x'M.d'#&`%qbl t,dKte&kJItF TJU 3GU”K_Yxvb:2:ké4i~FimiA?|q~ye9Oy)+Q+4b *KQF&Jo0Cod_7޳," =. Iᘔ6y*6y$&+L}Ro;%J-E3FHv-p>>nYVJUx mK;Gk8|$"B6!| Y,]@呼nţb1IᢍWPf,Uk1_DBs)P5& A5Ɵ9%_WgTTGYHS:j ,==ͱ26WV#;q}#>w8EF>Z96ʙ3e*|d-7&|ᗉwnH{.[k@?œ07e-PޒZ{(y8֗פꖁg~MANf+lN|Ƌg,V SG٪g){?j~gvgEw;KhҍTHj$o:#ﳫ!-`j X B!TEdz}Ѯ-4"s]c;0{4W+W8W;:A"^UqqדXpLM2iFKlJP"Y?݇F@oU$dS3NbBH-Fv+_4H3kq.ae ̢{2$xQNCg7\`pJx+Ss!k0om@(oF,n1y&o+Y\Rx#8b&^&OINExAHQ]|}ުkbYwgV,wVM C oK}ܙ(^H6SɊ'|K9ot/rgsG.H*vn]'U;iw?~&^Ukܚ>>%?W՝ ΧVS{ޜw;uedDƓ%$&|/mo#{/:K&D*KTXZP(ֈ^kk[KZGk8&ڲWn,rWnڲwӸȝgm/|M]^Kf#*7^︊ő|=Ҫ86.'ʆdٕmoFk"lT5% ݈VeIckR EEK_IcI=w3Tn<.J[~wb+dœh)R2;kSH?Ok:VBg,]=;G\T^צi2:hK諸: }M*M"*˞ HCnĔMzGUa=Z,DNueϽG*k>v?W*rGakIO v3G㲛e'O0.)AtS5bX#Zg̚n,ٗ}nM@/ڊ P1qv;;g{`kYcQx4DPZY(FԏeQea"s6 O8&4s{8=sttZBԦ{ d0!=WaA: v&L`A;d~ϳ@A㉴ah]G6~N,yй R-(U4&<cQX3?< Xx4š'5\Wm}ivX"3zݺ۪cOn7eYYe֬ٙuc]YKVU`9SVy{1-Φ<4>@#v߈IB_!&lqE|O&>y+m=x0PgzYOmlz^;szZ:ÇtX]ӕL:^{K1h̛/LDw._媬+"1W_U]琈:r E@Dʮm nj\"N|-P3UEZ5;^okduZ [Ӯ+]n]Z[ҡ5;zZ^zr_k>EC?Td" ڇuu+מF_ǴVt(Օ*l!@Aib8Q3vU'gtʫ|Sy5qw*!3e;uqS,ĮȫVx:]*NFfat*tNUTM#t́#ADM! NaX/3ldY߲lGכ>ɖT+ue+Wnrl$9w:c䎪?C?6;~Mmٿ8,__r"Nl ?oyVN:{=/_dW^0f"؏ |;{7pyW Ttr +98]>x-2QyNB|w9h&̻7.|ZU˾] _鞖d%ܛƹrkyX| <x̸ _;ENuʕؕk _ү5ajrK,9 cdyXAWsLazH)Tut`{UTJWQ&&A4.ٔSjz†W t.aF +!t?j:&k]P '[q{i9fwڥcShSkoS裧h"FpjKhi_<5x0xdBぴ+AZU~)=*4hVh*KlVF*̒X^" TCmʣ5 2`*#9QǑ:9Rgv*̃RT`aNG^g5Y$ŧWM8 |~V 9vIԼ?B*pӪ* p*j.Bs**.<9+/<`u0;y<7zhͣU!$ $^LB$ $NnOnOB$z 150DZxN09({Y딗 "v S;qd'hmΜY>`4?.kntYN02r{c<vӳX-9Gﳿng4|{EpTPݫPR`Qps0}NQ˘c}^,s>#f:kƚ#[1hML7Xj&lEv,6;:_D3Ylsv99w:bi끹Ɂ= ]y|,,26Y͌m&WO3-&~~P9{0ke@gk%);>C\qV"_)t{I\_Nqqv;}?8bwu]άyn'7&T2[n@,xat#< *iNxuJm˲:byK.3-3N_3'|f7y"$;q.9l++D߃cV ifo6{uȾtS-6[e6}U]k V3-*V(D`jEY`f`}4֖Ӭ"tb]ut}CGOWn*эPw͔oiGE~{r {V=KkV\tCFD~jĵ>0ZU'XZS؛J5z]`04>#1^vT7i|X֮ هݝ@Uq ;An>=W=NG8PuWD] ՌhmD%_b U|*Vz"jZJ:ȕEnUU$.o]BuROLv!ݷ jk·&FK]6i8fZB0م` 4|v!B:KΧc9Q] kô QST2m4BN&@kCW2[?ڐ8Y'>ܬ"b V~M\ρSS[Y g bĭ_u>we3-:b蜫ζn2c3^uz:͈|%҉KWnAZOE'g"4g:hoc}b4=,%ٌF/j֛n3L#fLu뼕d`6څ|yl.QLeyBbwRDٿk2gdfYo#X9ݹ&K+xObW-lFgU^ߟol@Yn>^ƹ]Krrg+w%,s|>z\}A3!k:PF9> F,Vp˻< 7G&˚m{~-5l9ZWy?/Uz|µS9lt[[S!#Z,Vi7G&6DmRۯ cn1VBFk͍jD8;!+ԍ֡5VudZ-UlVsse[ ڵUp o ĉk N\\\\q5'A6vE O B\eoѪbe4=rdhE&*[Wy;s]] ~dW%L?Ed_J^UP%" ĔMXЩh4,6"ʃP; qeu*ifWQm1Ii8*ʜxs&i2b3g3g3Ǒ f"lq< umTؘe#mumL)쵵j &jFלtt^FufMt/xBEt9̿^0/BO\=q)0xVB Xg9(5PnV(U h@]0r!/ B¯Eܫ4i6 (&ivj:xX(4gvbnϳX݀J>]my>OMSh?/r_cѨjAqzDwnz^GA2KφNl ޓ@@/:WOKT: "pNz5E&yxn9+O] кP3N5%s5&z0Yzs*frkU|tʿ߄yx+ jLF6;UzAsj9f7cDK1TL nve6t4'k6'Zn44;[']eXv!;&*著  GG[%MJdx&* A4Z~INo5ZV+I#.Q*J]TEzCUZ5DMK)J:)nՑZU=toiwx[ d[SrmD}<'x(ɘ!p {ba$S[tҨ:^G@ګ @vBem'_'T)NB&3yHhͥct`6:&66(ѓv6"V (lOTD\OtW\ŞDܵ'J !DѪ&9on 2aǵ%dT]【hMQChl>yNAF>bh?*O )?kl={-0tyo40i` /(ӛ+HѪ g8b $/,. b&=KHY,D-R!⸅mE,w3 ]\m!ة(niGzFX|Ma`3`ic\L13LJ& H4Ήڎ+9gS9~^5I!) ~2 , 4 Ӎ49:lʚfaX[ú3]EȋknM=&* Q;%> e ;ouMUeXrCkB3 աשܫ?k;lȗ/EH[;5+ah#=(TH^ϳtuy'|K}齫O?,{ 7?q> /_9Jy3z"=w KUx/sVIAň FTX1`+]ʮVx8||#||ISb&VlNVdbx+jbVd\Wļ*׭׭|aWczb~C1G0wjv>GUh}[cޤUM=@bަU}6=ڽߠW>s(dqD{'jWȋ&E ;lm"kgb0yYl:c Y;JFϞh2ZX++lb?@Ͼ<ο$oNOp D *&xK4x[E`!LKD[v o+qk}5Sڐ|'9y>ϴ5'Y3")3Ƀӯi©! w\PPuFi5E5麷c\,;z}+Oɓr.Mrj`/#q(6eZMjl kf9Aߌo9Yz\}\LV1ƚȚ_ N27n3Әfz*GyXnX[֗\ yZޏ]  ^%}}KT^ߵW?T3˗2*nLC!~Jd~D""H.RVW[#heM.%x=L}:.ֺ:yt&~~]n(D{D#ڣ̫t&鮥$^zRk:ᩨIњgGda>RGxKz*OAt.Ek<بRU:A@ѝL:Gt}y)riЪv#=sQŕj\5䢊ˡ5VU Ѫt}uMpUpUpUpUpUpiU)rwAWT} ݹ 98ry ڐCU+C =A>H8~1'($U!E{tJZG,*?I??)x"QyUFׄ)c֪[+ĔRc=f*c%y+1 i%>ӺROBc @]dzbv/ѺbڽLBi )ݫUG~`1c/ 8'6/S&6vvv {F;_Uճlf{LrLj:b?)1| /Wl9;>VgX.G~,Y' kQht[9]NsMcolw>{ImL56)l#/iuޚFƊD6o&_g8ˏ=Gsu5v7심6+[4 SDyV~'zM2aE?E#T[C{ܨpïhi +D@HoǡkAs"JT j~#CW$R΍iUDU ͹Ef:p%+֞# Rh)t_&)V@VZ@]S ګx`VKPʷ!B~06`U:vFm]~3+J5^GPR99rWZ%UzQ&gVؐN, `҅9@4-wwȡEY TT_[*^Ke+*Qb(_U|Ee3*Ul)zuOgxyM$hTvO'}+o{duJ3)r;趃|ENؙG x%ҕv.~dY"I s%% h'xމwCf FzV8,fV3f&_f~pr`]?W@Mw ysA_Y,t>( o=KYJ{,-'$[!>￘m&u55ĜyjqT`}9Y2sg6EpYveybmݐp0hIߧ}+k-?|)(/oe u_!dYN~A&a5ٳ4106}YmcWűx;J7cS}O%>fx9&2ELx)qO}[qUǕ%K6}IS8A("ָlT, U. PVw(bqxDuz\Ytpր\uAfq5.&+NQ*,xUpUD>ls~Dq`>wA=O0+=8-%oK,f;1[FAVVٝaǻMtHӇ(Ee`]!"AMyA?FIoXޥjׂ;Vl~&iN⠙ks9ʟZ:ńTX(.gB?![66966 vl~EsNMP=engB!q?u*|VC6XQW w!Se, w'q9B!wl`.93dd]$0=][[َ1Ǻ`0?S_34lvGݒan G3^nz^cѧEa͑wrd}'$6}ڭ\u*j11^LY|pA~>7͟lw[8}/ZņӬ(~c@> V7G,!B5C]Cw}CECgB?:eͫA6 =t6T&y y5F|yջ+ڂ7__Ǖ[[7-M ?n=!z][cDOQ6/i2T3eLJžkuqr8dX燵u.Y1P~LWU`bOafxZ<%8GCt<` te3BgQُ~~n("|/{hF_xk/ʾ߯{ zxTmYse6ىl%&j S%ÊTV81@p֛}ji.c=l%iljM 7ÎTQ B YA~J8Q(}6B aͯ#L4Fz93]B5 pDa'jg7L1( L ]]apxh, Mѣ@L̵?_vuׯUvm/<"bmbutB'=)#&)~wzDYxkPvPuYvlI^RZcJ<ՓGfDOR tؑy؃kڻ\]}d6e߽lʺ"m; ݛf["Slmr ʶD C?l,A=LYxOCԯ{E~(}/ެɨL7P'SQe7v`xxħᵏu<<7BR!DBO !>B|*Ek(&b(lX lx03 grȸD†ަWi4YYff-4?![eβKXͬmƘр5fwNaB޵: ̪e{Kc7c<'_x^G}O{V`VvUqE|$ț#xyU/Ӫ+}-ۊFFhJїA/\e]aTQ(LW.ʪ\Zu u>EL7FV=M]aè0itySWB+2'j З60QA"S8B!@-E>Pcti5dJe*FAykV h2a"&.LBhbGҤRd2*RD*" B@5D!J3O|J ʌ,@fd YZRUӔ哥ZP uK_[Wyȓ,:RG6k)2#KY@RdGhZZPFd6$lGf#?2ȏF~10$0vU8?cӴq㒮45~KvG ,_c[ߩ%t7tMwVr h}lAgtzV+z^%\.9չn,_CQtz:qS q+.w=o;p8nڳ㢧s*իb7_τJ#ΗI,ou< |E`W&Ke&+zQ+f(hT*6zf]ȵ;-xAgʑ~g̪"zaPf*z-1uQs'Ձ;w*ߐFa7ԵQ oD6(ޔLk 'C1R!Q/]u )l7S1QV SS"]L^B}I Ԅ'^3]Wb QaVV]NaP#tB;/6Zg=H<@j]p ~RD]E'#"Fee]W}hЗJ/Wu5upQ[lt\c7Βm|xⷋb]d7c&;Ǟ6ߊThQ,kvĞN| ,vlUJ5X#wq(8yn=TsDɅ)b6[b_W, k(tC{)y_[_Y }-'[y:iB'E&Uήf7SKvM֑-dopCޙOs/'̹1TŜL[VoUsۡ>|֬Ͼ+o~78u`5׷/_909s((gN5a-cRF5Bk()@2oOp./+)_Us|&x:؆'D5[$:3ΆW~b{?X3)#Oʭs^ClL ]DKMstwIaw)=j<žhvO#E76VNvhC -x8le +lvH'M#g˻f5c\F"?ܻܶng+kK]r6\rb%%I%}֤t8x)oQhm,le~5oBtb.3Zg$RTХ A3?W_96|Wn8&p9(qKP(Sp S 5xӤx*:'աtT5o0zօB;J#pwjrf@Gܜ^[߂ޡ3Z wܭ'}U_ZOghNR:uwt;Gg0:YԢsAke:vJkuE]iMIK&I7Bn%BX:c%S*I%$$$;I`7I`9I`7ɴ&$k"p9:f;+P&*'j$< ʄV/_ނWU[YZΡu8 [Zn$ jiM0 kZ#uejq< wj3^T (S ĵ8]-0ZȩעZ2#KHE=to,"v`I`I"VW^cgG+%.(NY@TNOhͨh䱠v f*ԉf*입b XL'& *Э *Vn _eV_eVAcvy'e1-AzTcH?}t(A//qzf_uļL%].%1踄bˍքC=!ڜ 9{H'0L{oЫ]o%^ Iĉל$9#&Yd9sF y3fEEka2M<9bKFQ}eb~P|g2k̩VĹ)~=EYh7 Vgkή[È; :aVД|W'D {͏C1d>!@gs9&Js΅y?#. ]:qSc=aMX)1 byQkj^A󱬐&{~^/:'QOZҚf>?pCƙ/ $}=.+swJZabA従9dys|A޵y?9 &ˌ/,KsYex(Ew3g)}M1Q#WVlWhfdl$G߇Vo^^*X{g"ۖ[&Xb&Xb&za@/~/D\ἁX(tJ:%K]W! Ô b}>QE:ǔ+.c(ǀIg!@B8]9zg=B1*9\tftt'hU|1{:v:^5vi}0}20^E`#z5zhb,݁ :ҹ,Fj] `GH-mnElSUzo֚s6]C~ou;q`F:0-c8 n~4fᤨaQъ4=Uz5 l`w׀0뒝:Ko4¬\g=4э/ |@8/l¤t3t^[ye8$bZ_zBയuC_-8T4sϥ^R,ʒݞ:ȥcgL^n|:6pXGYJI>mJH+ _݆Z,{`ا+36E!!PH>TgE59'/&;"+F9sYL)be:13_O~>xgKm6ϴyE^ώfns=.+d̗{aMWt&du7m Mv?~un_w Hw;ٽmCd\G}Le0M_>QYU6CԶ<^*Ɗh)y =VV1H0=S*OpM0[8Uh[UUU{ WX&U~dq{j+.ixwJG/S [bU#̽}+mԽV;nnMU5hU*U8n,"`@Xn,"@xBۮꚍhL)xti,Oy2263cfteA!Z}&6eIyhY* 6&0؛OțIgyB9h.&HkDuj3={LZ)P=5*O(]3y Fg6:>-11A NՁpOqR|6O5OV5]dd.+{XOzV['9!*񺬄IQ1w6_ 9d~MS6-seo9B 8rέv=ӑ.`څVa~/ZSPڛVuTґOr? AB`2 FBwBN7P>z`4/^@^@^@^@^@^@ehU6iUHٶ^X{= X.>HdUEP]:F+L9“Uֵ &㛬'y} jN$:t \~ x0qAΦq: T\;:*b<=@_e} %Uu0gUL B?l~u?Rw!} 90_ׅ|^~Ʒ lķ2:~Z2(3m2(3m2)ݤWUJ{ϤTT5Rx(? "mȞ![ *?i&Go62LXk!Oh"utN90 fOYY愝ߊ"`#ꐨʞdk#,`Ogy<-dy{b߳ylh+E3v>bF#)7yN"{!]\'_ BUmƹˏlwW̗i2Y~&a{=nWn77N׊辚nO9Tv"m(^g |K~)"ysŸDK r}~hTfff:V0* ,DR|j},s~u=&n Ky C")x*#،Xf7#.yz>^{ɻxUԻh@ʪB&}2黐I߅L.R*.R*tE;s]1z {NӇwǼ -HH} o'SZ;cޣN=ZߦΘ:Oz֝ttٛ|GJB듲#=d ^XozN y:CtnY8kK:ju7j:^Ku}A_qYnҗڬ7)հ+]eP^Q2Ɣ/T lRGeO}Z!8 #Q2Aeb#RAbz~}:OE5_wbUCw!"k:iv}ڡFSlk" B=T+*' }ɺk8Vt5 ]KzѪx+wylzL3^D&K>N6O{rt P<5ML(;P@Bіvyq>D: 0z<<b+DW> @te8T" G|T+-LMATLך4ٚFGJU0W3ca01#<U:RQTIE,&TDcrɽpoCMdIKYFHm ʲtJkZʚq5y|U,o2zTn=W^vd w6ga?O]$!c)Tz h'<>vң*|t\v j;viU:;;OKyC;9Jk~1xRqhbݻCqڕЪv':N? 8?UAt[`,F5lkt ΊQSvU2ef~g9Y>J4ylFVg=nm}y ~-b{*ۑn߲6| Gqviv@BbfC>av]fUx>ogu77,{+ O-r'gMpC~"{ & X4wM~[c@'KG[75^u/߸B,jrhmr_wKz^y\}ދ.{rf*˛U,qUQL*LY<Zk> Fy5u(n1|b4iZLlYfIلIŷ8k2r>y 1 P+H0΄o7UdP|}̙r,S+l,W$"5VWU+lvzkyhfibaS7lO8S|mO :~ Od}~~*,| 'NyɖT1Fΐ \G|H,{f˥I}#rS)'^Py|X9@N?Xl]>`V5盅i Q݌SbbXʥ,R.Y'wʾcPT;.?doOR憬S>y#O>e7fF,boZ3|7?$yy߳"?a|lfl $#y.;<;ljBՂ 9;DEc\N`o3)YK(rlg3ϙwd`d03 e̙X@~GZc[Ge1o;/,"C,"2kByQN\Y N9J O$PC|<>G>hkR!ץHZQ+u}Eś;6VGX.N>u<=:~ {!2QX<)g>ih=A98<ҧ@`ԹeTnTte.+sukHusxO*b.sP}ZJ/`踒QPԬ/LV.ZR5/^i=&*/U7[J܄&lB&Tnu0}o0u*a^稈&ԾlB~zd?=KRY᭼Jˈ(_eTbLO9J;: OE)U-_Tfï4l x6o\&塼=5N?'/sp^@ylv<H'͹9!ƊݼNV5I^D3ր`_6W,Ke&sY9$'g9;3oyQa۟{yT_]MH7gէ=w\Ny{MgƜy߶|HV<;ĉsCr&y<:}Z|x!YuԖsƕwyޯ~xgYL˽%B~G=*|{}[9' nDU$| G؂qox?_͓x ;`l#Hh>[~׿}8.752uiKIM>.vPIuhTkmoWq-WQGEZ amJ44oKo M)M$ow+HuuoR:7XKS (i 4iD_ K~itmD驐~DxiR[Ѿ V"C@ш!'ZDP'AzJ$h:4T0u)$dOgC &)Rh .T:P'Ҝ OEjjAj~_w+ i>ɕXf0y kgHJxP:25F׵;!Nϧ=dLXQ 4/H/ ė=,_h_EC?")ѻ;<dVcIF\% O!dx HF%~d`y s]vJA%y%)+I֧SHҘ/s}$Kh/ %oD]M|e&x 04< 4|' (.DY%2hBRξ븗0XnL#y_X&DErdqޚM4@{]VÄEd}F?/~oOњi8/ic'^wTdX?Afރ7 QcX[_7u&~;a VOM0;GZt%DUfaQ1Kƌ=COD,0Ks~X.U'3ŚlqG UmB-G"w"㵅!$Js:E8_ *A|\ ߐ A2!w帴Gs2yu?,C|x=! {kjq]qquQEomi xGi"Fu27\nx\[7}MB5=.me|TQ8vvvշ]XVA2٣ jqpTg=y!GYsd>-&T+^:lf4[31Xk\4VfMeޘ.VքExDZ)7l8o/UqK@ծb9¶ʸ&1M♋eGMf$UK\&7/e#>ma׍PZD2֕~:xpodIT'$U<hEh"?ϣrEÀnҘԞe?hWp ْcq9h9Ü63~ ~Kpl.2"۾?6[ҞЭ <ѰbP}ЌFiՃUWV !w]0LZQ9tCvQb[k`[k`[5m=3"[o)^=7֜ęe֜D.tā4ʌ.`n`[`[`[`[`[`[mѺݯb&:rDSdQ@TBn8NJ"a\[{*FOזVimm -쨶"&|xtHċ *ns//#5nfQ\]s|.ßĶ*Cz,`l:NƤR)ȹJ]\<[DT8Yn؁m[WV9Ҽ ^)Yu V!NZ}EC$oyQ@O+ðe`7 A(U ۾Wv>.^vYAmxA*]F$/F ;BBIpchUz"ۼh&|0Ȋm 9<@S=2q֡ OSa?N]:(Zq!DB1dfCږ_d '&Q_]S- لϓmX(|3qeVTv&ͩbW8b;Wk%P_7ڛ,WѤov k:0_k#>&G~AZz4k別V_jXޤﴫҶ^_DH߭,c|2_̏Ox1V"n1'u;\T?+}]vHŚ{鲦7@qOXG;k l=`#@ٹCF]DvT6O{dt-[#[KbDǚ@ǚ@ǚ@ǚ@ǚjk# =it"OKbe{kϴ=ӧQ'dd h^ G"ޙ'lvl8ZJtz z.}Pdfjf`Q6='ʤQeIh&G:YYCھYWS tܙ@YYyn s s qO/( `1p 6 `Ms}*P}@nS*Po*\B4J.( 4EVy.*s@\9.:jZ-q*]ҕ"q2KFG '%c}V`J^i5&]:p߭ eihm+VhmEVToGTaڧa:7vlݎ,ڎ,ڎvD<^*w_ I ㈨0< QRUrGxܓtsٞ5u`#X.rk47cFcB*/'|z2xyu[W#l_/i\'[U/9{+usqo#Ynh@vƬ^)9kFUk k$P3dGʲ*wuUAW4VmӪtN"ެtwRߝV=`/G ']vr }#ҡ*IFH"B:9N}PE'TKƑ4BeP5{!,y6lFE]Y:yUtVޫwy]va;.y=Ne^BX/+%Λ4ꈃtSQq6Wڽ*̗}};UMk߭3]L=sQ;6RXE}QȾ],ܥd5ɬ&饝VAnVρv2s;C;(x-+w~7vjrQ2ճ4LQ]yd_/(sCsz,rE.ӳezL"Y(z^Q1DFAd4DFAd^D>Aԕ=Gs&:QW54kkPRh4$.XHH|lf1ij"=1H+ XSERkU<4o[~jNMvoJBki%X ߉d]ngn4kb{ :26mao苵Il1ڢF|ߋhNo=?}pk~h1g QBIUnY߷7E7 X̋{mVoENo,UYk8^ t墀rQ@( [Qhڷhbn@X\,P.( U)]ZhUtp%;e"dgtΕ(B{W\v\(aٶ~s<]s-]L أUQZ*Ȍ~ʺ̓׋]ݞBbDȊ#UL&2uGإ[W w""$Z" O- Z˧Vm pIVɧ-h#zocI''cΈ3omIK_-*f7V߳ 2xobڲYn1=:'H{̔E]MIGf-*߀?d8F=zqAŽE]ְnj5y_}Z}ƈh$~,%F ߿&Js7Ͻ*R)ٮ2YsTEeŖ1LٿfĎ {q+bKNlɍ= å.?{,yDIhU:Jrk6joȫrR^&!! **^ɫxȫxȫxȫxȫxȫx%jpJr,2Q~,0Y %a7Ou.̧٭Huz+dW ݎwRS ,UPlIේBO"M$x섋srK.n zc=Q$z/]#YHT<Bʩ6gdOjwFb;N|#i\eIwvTikNic)ˌgcmqQ\Y/-_|452;1 7tsy3cODt?\6ҙaO>}L=XDZz$_m{!".('F?*<SV{ яC*<씆W%LSH~*s])Eo3~I"Pp[].}p$e};]E !HD'RJIAG؃u!kRECECE+OyntT7EU{:'\]ȹsu!Iɸժ{u!PW!e={/ӳh{Ѷ'7xSpF"\CQv 9'#Ci<$J R^.ƒ.R/Y*d]*d^*tThiNUL7R KQfˊ$H$kIyIzIF$A%A%A%A%A[KKK6A>We#G;[!U(]|*ɦVk:ɥ††b$,rmmuṰᷰH7D0': \&d nA&Y#e`%SG4}~Ib5ojj+zscL-֎Q;Z,4|vt{3Xcd$6$&៱sl!ͧN F bLYDOWY:ӏf~Q6w'Ihl֟I&pxhlGH֚ɤ^f e6m֍KHD# h=Q 9 9 9 9DR^'MHHኤ1XcQT0d 3o3U}Hn~aUf7u `x; =TȦkXvOL[u  Y}U͇ K:䰬ő888888888888R99sY`ȂE@!4WӑD> D>EEa9`(DFT!|ȅ"{\/ilEգMj lܪ4%&̜1@`b 1@ZuQ{D 191@41`b V w֝VJzJF.G ⍬jde$+eP,#itt:=ܜ`b&"#"C̜9ӊX/MӱK2Z|V;î㝙BNMBdxeoFZ*rhb߭rPEst%aL&.瀉s*}_G(y7$>>:шމzE,f:!|TX=ˀ2ƺ1V Vb`\Ig}4EOmU]#~W2ZJDXKXḼlYf߭7!NmAwQGs>/QDyQT=Pȧڅ)+V0EH`Agh܇rqZk;_F`/`D!_=(٭2ۙA _Q^=6s;7s7|X#6s 7|' @? Ȯ*Ay@'>hi/=Wh 4~X_#9SBO\-fyvPmfiPӵMV1)낵Ͳihd)>aH8g#Ke:/߭+:. v:/'adKGҖQz#>D/w%go~m.fj\{t4}8&7ŏb!z1Ρ5lﬗwXӭ4+zZ@fqM)=8mls }]wjڗ{?3ꙥ]&{~tsLL#u?RyseQRRyNku=mRfd#7̮Vh$ZVG䖥,Kj1seNy1yɾD˜aMhAsR`u+٪bOg2+J#D+cebv8vI?`gM`ozWh}Ӊ]N]:n nga*"QY'x'***rφ7@O3Uu+m]EjM!zCK_W#zɌmMcK$տaMRw4FІƞ $fuR@{%hآ\8d `CQI;/+kk؝j4톩dV29TCDz;7$YH : tVcNBg5GH(D?X~+Ix.cM\@-_R/ӏ8U~Eڋصj/2L"oˋx:چچB)âEGsѾ Zm`M1}KbpR CEE%ݒ O,@X-.@X3ե/gz*t-jΧnuzTWy^'z qF䔺^ق {[-+lBsX,kٿmiQjIe^ 2EVUjZa'Rs؉g}ǒYh|FɈ(F6| ܗXᅲ,Xz ٽN`cF;\ߨ;鱄KZkxY/Ǽig}IZKxWEx1_lgizYeQYFohr3z427F.!6lq?ϻsYM3]d1e>V6X+̛4m^kd~+|~8[d h2$gc;~ho~b.dI'hNHz;}IiWğD 6S2jr [LlGgvlc&,Q|FGrYX@)J-2ՍcHx[ej}eȑFD4r$F"5-#+YDnjQk@o2B"Q"80~י83 3UGr6"Uղ8`-_XzO/W;+Q"9Wd?Qvܔp8Qn;q.T7C')>-NlWL{+ℸby$^ {{FkҶ_2ZI9#Y=qLlY(33u?p.dMxsQSeCQ6Uf_s!l]6U>8l]Hq)/ Ǘ경 2un\TT JP,p M*.9Ҫ}Fl5!s%jdF&jW2szFk賆Vh d H d z z zm6p@OBT/qy${RF>,~o B H\doa_{/{=Zoc:v?c{ve/wmяam|IYZћ>a< ɚ5t,U|y_gcO]dO~Jknl1%Y3 5CjCB'Y|Ql7^31ky|*'8QS ?L軔&=jO =+Aabq;Y%oEbI%vM~m}:e=EXXbE,0ڦ}:OwgOh/~O#1bˆ"*5}_\Q4=-kօ=w#\*-^u8@|]>gٹĊ6@6;l6"2/ z=ЎX0CĄ8z]MuD@@64v%Lh6@xuBrO*[` ǂlp܄cA^ r{m,&ea:zE-_\2gq?~P~.GW޽^m~LmA~#(2?1ڟo# ak*^[o*h夋f[ì:YhƳBkuҺd;v=,;hJMp#.R~i-mΘ# ~ܰp-[O &Zkoҵ ZY OjӾou+zA`U)?Drd \aCHo7Nzf4[.}X'I~C✱Y_Czfg9~odclxO-a k5ݚM5ҚgM'C5dꢫNbCj/$yNڢCRqA ){'L3Ma5||Uy;sf^𲴲RoВJΙN4jy3ͭz@oF3rs|yh[ǿWoVSv)PV1xu՞ђh}dlˌ oo7Yޙ- 6U^>-OKݾ@{=5/LvU#-{A mɗh/v} ".%u)¥>~/\k[q]EwHq5R׮ l ~f zAHؤRA;A66'I(zDl9$͕\'wgveE7t^tT)htnc-3Ԯg@FJ_W=Xn_gfAJEFWDp* V[U /a dfH* 3ɥkǫth_g0xSǏj?璽m.DhòNsH_V4r5,Mh0_F\lI!A 71sZI#3[K{͠U6gNcU'h?p %lxʆ+lУGgCVzjUt-ϾE / / zt42> :u4thE#G;h:ڀkbC+?/fxnwLjۛXQ=/C< CG~߫Jdx-<;aqWwu_$iŒmT:KKZU+XheXk!4hl-$ZYkOn 蠕$LB;/.k"dhKoEh} zUewb%74/AT=Ae(1BE8%mxU=b-j|I6E]f1LO4zzك祤eDU^ޚ09|fcsEyVq!<=>ъiR\Iʇ' @|DaJ"'&c323 QQ[V"_3T9Hr4yqFgnEw"N9*xe^Rչ.E܉يE&9 +)U=q'X0lmd86R7۸9O> (l<ט_gt䟍dh${͎dċY"_- ?c⢘EʿLxW3e;I+ ԒETugpg.BXŠŊŊX13T,FVPXQQK3%Xt62 ōbdM*zYiiݔ3V/ K _H䫸<0 y!xa8\P7Gi?V7cC0d-=KI^f!i9]ܧ/5U [ȊO,Wo2"v3G$|%cX)6olϬƘэbt1XskUž G=.bmbKH^A{K{L[y y|H h xSAG(uEaXmq7'[iEOD]-BxV[oF՛2~!}أ773>Ih5.~Hm񁸠2t{=&mn )ʶ^o?ndk̕N2ͫc%I$CFLsaZ"8gև;3qLY0&ByӚB$3Xf:`QV5+rΥ%ǧ+![a>d4ɼY?k5jɁo|Y75seeCg[X֒6%F~YۨheC=їfg}Varsw@u+oi%VeX".?c'rgQa=W?s5 27ھ2nWONvfMY.}?PEmK{tPڒ^qu5: #u ?[$p*x O[86,F{sS)sZyIjEcgAsgd`'*rnTe ]SmuAs CeAPpO˨C6Gwm;y\_K}:G2 ,U9 rU9A4/MD52(L7H%a,бZ!$>Qd}=#^lqks\ 짪|?Uwu`4Xucsr :Mr lx5*WT4Bƫ.4Y)vڸ3-VCDa!9˳_*;5"4)G\d:߸ '^'.=|{gJT.d1;+uwp "HKB|Kf2t93sw7n`ƻw&N@7ugFd[oB9Ѿ+hЯP2OkV OkV('M|?`D4V0n 1ni|F6W~:ghLN{?A\qX\( p7@ސ#jDMgփ}kn5;=XkAs9FOiܣ׏hZ@v`ɍ@@̀G#g@0Cha$D$#ڸI"h_KXVUW 3bhJ:7BηpgD*w{Kb(Doޓ 6sΉ(]ФiV)vڱd͵QMv;N*{s~3ylﱏٵם肘Iqz:?۝6N'uOhR?~A4(_snLqJ5V2݉)HsUjߵj0ȨV ג?a 2"kPzq5+]Kۯ*֩ߊ l|| 5 ͐$LgS0 +A $m2=E(P3LvQ)1pVͶ&dpdUW?KǞ~nG=w8b8Ѵr|+|ӐHCBYCtFh8Fj A`$VU;3tiLy hf44 <ܢjMZ]+Lܤ:kДb#Of`8;g6z=ݫݧohY3m>80L2O kf]ց1f։űڮ\/#wޏnyΗC ϓ>?]lyM\S߉ "Ҭ[ran[K\kՋ7}$VXDHN8iu]^m׶7Oqp&qιnN[˞jױ7M 4+yTu@b™:옂I$־1Q8>‘w9cpFψ)}o \t4T?[#lB*d[=w~;ɻVVtܨ p4F z#|*z=DSPgk蕍I<8Hqb%ɖ~G:NtFmI@ԧ%mKy3 (}3q4H\4P J*4²z^̔r 6+t!q1 #<f43q}1)蛓ۥɤ1( @I3>D\)|pHL0TƂ9e,: h 4ȇ2hl+:\Pl @P4 +)(Z*A.=vQ)Ĝ߰C__Xފnf1?l3Ϙ/M_:vJ/7^#Uy렵LH˪Ebx??$? m<'pogZV=|3_du`[?eL6qdJ9 gXIށEj h|=3=c=Vc#^SO=yP|lt?l=gZAUn`GXWKʯ6}V%l6Tjf5gnkwB=$ڶZo<~3(e}GF"曬'3l߸ui~ζ9۩Ӓ$N _UC6Y0V]R: G: RHӵfH5Ay3 ԵWIKjK&/%dɊTN-! ꤚ@bʠd9Qc%\HHBP.\h  ÏD"*Npb/4%L!!"G(9ZJj#i q#ɘb4qepqRBmć#|8%Cj<$Cu@Qfli$u*0oe R.Œ30c. ^)~ۇ m8N'uvzBGIE 6tq:h19G͵@O ܬ́9YK3^:?n[꽟nd^TGX {l vKl[e^2Y,Jӏ+I_Kβӫ{V#{ڣ=[r}qnY\a慲?ڢe~wxf_l3wO~oKV'|Tlm&aw˒G[]}=T_yR7i?5r+tj)B97΍HTud(40Tv4N}Fa,ڷ@R9xgՙ_&U>m8ǐ/K6"Һ*$~f1I|#6;cci2nv-5އ9?޺${v91!uyo7s;xz'e\!c .o=yLw)% 53izGZcA&K}qI/:^gr3_|(?;tb m77_o;-=]9i^t~?6M!L0_6^`DX7?MSN/ZPKw˿dwf3e;ϻ]ֳIgs%slLsrI'Vg~E-]?Y?*5'>S߫7gu$BIk࿙^~kbG8&,{>O_JzQh\9Üha7Í=fqXlfO"&ޕWhg^#vݩhg9v7 Ɏv~ٿ)"ݐ ǯrӠ"1̼)z=[V'`H} r;C HqQRU"|v둼r4 ( 5ՄV&j pB7h~%iʠ~ z3/jXo-Z(XOhB!LBq'yOݮM(¾3tuUsC_E>*hCxAJ(?RLEHP GHƀm,67-q*I[j|if@[HAcZMˆ^4b9BAQz^ D[hKtm->)D'=ox^)ޢ4$oyNxƷi>9M;4ϻ4]{4i|s=x>)χ4@}i'?>Շ43z>Cϧ4h=i>?{/>4M7'{վ1pVK۪f sg/cbkXcb#0?b-zR"^b}8 I;m00ms.: Ih1q>S_ #{m/";G~űWKy[_[gV6UT:JK_sVmjF.M='e8tv%bZ~ ltɜ/_Cd́ }۠Kn9ϫSgzX<>[U~կūSߦHS}jV"qV 7t]}&Y-mZݮ?Lץ{R_:>qN[d˾dA;;TBd0v8{͹8u}Ҝ7Ch^߼^i5o{ѬϚ.Q]S՟.ov? @TnkU?;}lɅ_~4sȎNsgvo_/z~ Ȳ<87Kd19\Z*~N!K^k]v܄+7r1z wCMnT~:&5{!;NeƳG] nr0@-*~5uD|#tF@+d]ݷ1UQk5(YC#| [5+t3!Ռ5FԉQGQe:x0#5;/Y݉3J*]odZ*8-e5jv(S|\EH9$ljۏp9Pi CDkT'8RKx^mtDh`ق6̪T:D-vQ'0 $1 bL'Ep+Ha!jĀ-BgA/Z줢=t`7TUȢ^Ļ0z}EOd9Ru?zާΧwa/K T0k0JOf @_*}b%G`a:( s "GٍQPf7@&;88{8N{ opNS"씨(QXP<qۋa q]PNhAlDE ,t$ kRStg(#BPq r3ɮѓ b xLᘏ'=ˈc2=xW!U؟|M٥icGM#a*3g_6"lO~PK!HVefont.npyPK6NVvedo-2023.4.6/vedo/fonts/Glasgo.ttf000066400000000000000000004317401444463326400167510ustar00rootroot00000000000000 PFFTM" 3GDEF'~3&OS/2XVcmaphhgasp3glyfY hhead '6hhea6$hmtx>Dloca{(|0maxp`8 namecL7postS-`2_< ս ϭhfhXf<13' WltE@!"dR ?fffp&^7O=iL\mn/q^`^^@baJVjjJSj2j1$d\F>1(64[Ld_]h\dWNZaZ^]xthZ@X?QjhNh94d~%>4B| bJjjjj.1$$$$$z$11114dJ`````` idddd2Z^^^^^>^ZZZZ?]?`__JiJiJiJiV.3jdjdjdjdjdJNJNJNJNSZ<ll"^>p2bbjjjjF1Z1Z0Z$1Z$^$^$@*]x]l]xFtFtFtFt=h>@=h1Z1Z1Z1Z.@1Y4?4[Q[Q[Qhtuuhh9$  ~~    " & 0 : !"     & 0 9 !"zj410/,#5   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aOpcdhQvnjWtiqfukzbm?l{RGHLMIJ8VTUPwKNS@FoBCDxEA&  V2rj 6  v  J8rR\\>d*tRx*L N!$!"H"#^#$8$$%%&'<'()J*X++,*,-@. ./(/01V1233|4D45v566788l9f:j;F<<=>>?x@@hArAABC"CCDE&EJEEFnGHI"JXKKLMNP PQRSTbU0VVWXdY^Z*[2\\]^_`^a\bbcde\efghijklmnopqpr|sstTu vwwxyfzV{F{|}b~$Ё~|X@؊V܏ΐDԖRޙܟ,4,nn`<ĩ櫐F^(P𶈷&&0ȻR2T*äĴŜj`Rʖ˚F(ѤҐr"՞^צ؜ٚZ$ݬސ߂4v(` DP2v><<@tBp4f3 70!00!00'0!00#0#033fpD&'454767032#"7&'&'&'&'&'&5&505676762#"'&    (  " " EE`3$%-  -%$3xrp3A&'&'&'&'05056767632#"%&'&'&5454763200#" 2       $21+ / -K)&Q+*   +12&@7&'&7476765&'&'&#"'&547676327674767654'&'&#"'&'&4767632676?676763236767676767632#"32#"#&'&'&7>76'&#"#"767656767654'&+"3276          0        $   84  48 8"     $   (0  / 0  /     %!   %!  $    ^&'&54'&'&'&'&76767654'&'&'&'&'&5476767676763276767654767632'&'&'&'&#"'"767654'&'&#"3267654'&'&'0#"32% '()  ("!      ')(  (!"     [    k *       KJ '        KK'      %P !%7$  b7g!&'&'&'&54767632#"7654'&'&#"3276%&'&5&76767676767076767632#0#"'&&'&'&5476767632#"7654'&#"3276 / &#  ,3""     %4(- 44F)' + #  ,3""   3# ) S""  9 %%0#&%$D4< EE\6'&2Q''7 # ) S"" 7/}7&'&'&'&'&'&547676767676'&'&'&'&5476767632327676767632'&'&'&#"767654'&'&'&'&#"3276676765054'&'"#"3270&()   &( 4         R(6  !  C      /    8  & ! %,&$4 )/      U'(6H8!  ,-  p3&'&'.'=6767632&    $d*  (833I&'&'&'&'&5&50505476767676320#"b 2&&  ((2   bLLY""*)S>[ML    )(:F*?>:)(   3I&'&76767676767676767054'&'&'&'&'&'&'&'&5476320#"'&     2('  '(2c  ():##*))*?:()    LM[!"*)*)>[ML O%&'&54'&'&#'&'&'&76767654'&'&'&547676763767654767630327676767672'"'&'&'&'&#"% 66   66    =!        >>!        >=){N%&'&5054'&'&#"'&'&567676327676=47676;2732+"#&%;CA; #BA"  A"  "AB;;B\i)&545676767654'&'&'&767630#""   "    !  .23 iP%&'&54767670363203#0#"'&|  12)*31  ./:<7AW    pf&'4547670320#"   # " L9&'&'0547676767676767676767632'"]& .*   *+5+*+   8K)>>Y512,S88  SSiSST=" %\ Ao7&'&'&'&'4'050565676767676763200000#"'&767676767454'&'&'&'&#"3036'&'&'&5056767676320#"(""" %& "!  d  &%  ! #[       .#:9;;#'  '#;,;:,;#& P"#* ! )((<*#""#*<(() ! /$# ,''1&&>%&'&'05&505054'4'&'.'&=67676767632"t (*  8@  TzMM    & )aa. mb7&'45476767676764'&'&'&#"'&'&547676767632303203#"#"'& c22$    !( G55 &+N A ('  @369-- N9983=$     AA] :HTH     n}7&'&'&54767632767676'4'&'&'&'&'&'&'47676767654'�#"'&'&'&5476767630303232"#"'&*((  ,! *   P4 .DD0  :, ,        )*7 )  $#    K": !!">/ /7s%&'&'054'4'&'&'�#"'&'&'&547676767676767632327676=476763232#"#"f W:    1= 6-,,   "#R  )!!0;44 1166(& ((1+.7 qq7&'&'&54767632767654'&'&'&'&#"'&'&'&545476767676303032#0#0#"32"#"'&()(   5 ((=* *<=*  7.*(23$ 22@     E05  - )!    18 0!)Q22^V%&'&'&'&50505054767>7676732'&'&'&#"76767632#"767676565454&5&'&'&'&+";2764&(  ((. &"  ,"$  $"(    (, n       , (*%?+8+,< !    ++D  %XX%V   "  <= `N7&'&547676767676767676'&'�#"'&'&'&54767676303030322"( [<*  3IL& 9    NN`2%&0   :A<-,!M"")!^U%&'&'&'&547676767676'&'&'&'&54767676767632#"76767654'&'&'&'�#"30327667676505054'&'&#"032764&'              (+ n         .'  , 00    &(    ('      00 %V "!   "#  k !' 0 '^Ag%&'&5&50505&'�#"#"'&'&'&'&'&5467676762#"'&6767654'&'&'&'&"276 !(    (h* ^ <    <  *=o)% 12% %HKjwb@  #$  %$ p/&'0547672320#"&'0547672320"#"       " " }" # \(@&=676767654'&'&'&76763"#"&'&54767632#"!   #        !  .23 " " vC%&'&'&'&'&'&'&'&54767676767676763032#"&'0#%%0$ ('6 C4'( %%0$''1$ ))6 B5)( @&)+W7&'&54767676763632032#0#0#"'&&'&547676767632323030#0#0#"'&S 89G;5&%  <&,.*+ 89G;5&%  32#"        4((   *"  " " ', (     #& % 22 $L.'&'&54767676;2#'&'&'&'&'&'&'&'4767676327676'&'&'&'&'&/&'&7676323276767674'4'&'&'&'&+32#"6545&'&'+;276.<.0"(&HDL$   0",   " ,"   . 06<" 6$ F    %4TTep^^4%&,,(//).B  +    !DG $#)Z78  } K>J,  $ Q[}7&'&'05&76767676767676767676320'&'&'&'&'&'&'&'&#"#"654'&'&'&'�#"3276&         238-$$   m!! LL  D%76MP98'   '89PG3WT $''$V bD((,-<`  aIw7&'&'&5&505&505476767630320#"'&7676767654'&'&'&'&'&'0#0#032766767654'&'&'&'&#"032727676wJP""$     **3 !*&  //  + '  & 1  `9QFL "!  22 & L  -Vb  ' +JJi7&'&'&'&'&'&'&5476767676767032'&'&'&'&'&'&#"32767676767676#" **334<&    -#""#-    ,H.('&%!%&H#8 /  $%?<(() ! ?$$   5VG7&'&'05&505050545054705676767032#0#"'&7670767676767654'&'&'&'&'&'�#00003276l ("  <0.244f. ""&&  $  `}a!&%2 '+3'/ 2O  /:NK!"  HKkjJHjw7&'&'4'&50505054767676703030303#0#0#0#32#"0303032#0#&'& 12GG21  *;5%$ LYYL $%5;)  A599.- _FK   IIVV je7&'&'&'4'050505476767676303032#0#0#""32#"000#" 0GG0  );5$ MXXM `FL   II ''8>, J7&'&'&'&'&'&547676767676767032'&'&'&'&'&'&#"3276767654'&#"'&'&56767632#"'&'&#"#" **334<&    -#"$%6! "   5   !% ''#G'%!% 8 /  $$?<)'(! C##" 0(     S7&'&'&'4'050545476767600003030303676767670505054767676320'&'&'&5050505&'&'&'&'0#0#0#0#000#"i  "$12$"     "$21$"   _ FL  '80""  ""07&   )@AI5>>W:  ,@9('  '(9?, g7&'&7676327676705050505&'&'&0#"'&'&54767676363#0#&00007632#"#"'& ! " $$- -*3 !   ! 4(* -%$ CNjkMD  DMkjNC jA7.'&=476323276767656=476767632+&$@ 8, - $"   4"%  (0 B=$Us<=  8:AHG& 25y7&'&'&5&5054'054547474767676322767676763032'&'&'&'&'&'&'"#"H 23EE55 #$/" ((43'& '!7))##  _9Pz :' .-=F('-.AA00 ##," 65ED34 2+J66  E% jK7&'&'&'4'05050547676763200030303203#0#"'&   $%5"**  -.:83A _FL  $5sRN  X7&'&'&5&54'050545474747676763032032707076767654767600'&'&'&505054'&'&#"'&'&'&'&'&000#"$ "!)HHK!  #3  4#  &9z :' +,8`''`d+  )A@I1/0-S:;  G,ko.;#"0GG0"#;M.AkKG 15}7&'&'&'4'05050505054767676763033276765056505056767600'&'&'0'&'&'&#&000#"G    !!-;,,  --a2'  _{a +#22BYAA6G*;lKG  ))=!&L]S:; A@K$:$$6Fck,G $B8q7.'&'&'&'&54767676767>7632"7676767676=4'&'&'&'&'&'&#";676&P   P(**&(*  *(&X  0>   0". #J''!!%  .  %!!''J# U %@@% $ !")))>"d?c2&'&'&505050505054767632#"#6767654'&'&'&'&+"#"3276JND$    "8,  &  &  0 .`L  $#  ''8>-, I+'G[&'&'&'&#"'&'&'&'&'&'&54767676767676763232#"'67676'&'&'&76767632327676767454'&'&'&'&'&#"32  2 ")()   ()'**'()     $ $  ?>  "/<    "K''!!%    %+-J"$$ *  + !"))(>$$>)))!" / \ Z~7.'&=4'=4767676;2#"'&'&/&'&'&#"#"6767654'&'&'&'&+"#"3276rJN" &   ,,8 ."" $$<4 &  & 0 .'9FL $# (  #!<.- .-QD#  ''8>-, I+'F w7&'&'&'&54767676323276767654'&'&'&'&'&'&'&'&5476767632#"'&54'&#"#")&& 6.9 5'(BZ""  (E(,W3(  6/;;'(  [   )E)* #  3$ &  !%. >063$ $ $  . >(U%&'&'&5&505&505054'&'&'&#"'&'&5476767676723232#"000#"$ 8B  &9((I99 B7   Y4JtSO  O!1tY 15g7&'&'&'&'&'&'454705676763203276767676767056567676760000#"'&  89  ! < &'GH';8  ==tW$=  =>%2t==  8;BHG& (>I%&'&'4'&'&'0'&'0'&'&547632327676767676732#"6  &(4*$    0LG4WT RSlxHHxlSR TW4G/X'H/.V7&'&'4'&'&'&'&'&'&'&'&5476763676767676767676322767676767632'&'&'&'&'&'&#"#0#"'&                   -KJW/+,&F,,  EE]\BC:9NN;;;;NN9:CB\]EE --F&++..++%E,, 77HG5445GH7760k7&'&547676767654'&'&'&7676762327676767676'&'&'&'&'&#"#0#"'&J  )/)(I)  ''  )I'*/*   &'   00@H*)@>o> !)<*++*<)! >o>@*+I@10  (<*++*<#! 42[%&'&5&505054'&'&'0'&'&'&'&50547676762767676767632#"$ (    &&    (   .D9$#'>21 !);+**+;*! 12>#4%9D/[ e7&'&'&'476767676767676765&'&'&'&'&'&'&'476767;+&#&'&o %!e>./ 47NN74 " ' ! d=.. 21?.!")#11C)&&"=''  @)G;< #"#$ 3_&'&'&'05&505050505654767676763232#"000000320#"'& $#+1-1 RHHT #$,*'2h&<1I{0 #2ee2" L=&'&'&'&'&'&'&'&'&'&547676320#" .-6(  *)  9!YYi-.-)N89  88S,224Q:9)0! 3]&'&54767632767676747050505050505&5&'&'&'&#"'&'&76767632320000#0#0#"'&  RHGT ##+ *(1  .Mh "2ee2" 0|s\(' d7&'&5476767676767032#"'&'&'&'&#"#"'&w $""%"! /   !($$!(&& !  4` /&'&5&76767676767032320#0#0#0#0#&'& .Hg[GH  KP"OgJ97  a &'&'&54767632"'&'5 0      % _a7&'&'&'&5476767676763276767654'&'&'&'&'&'&'&'&76763200#"'&'&'&#"#"'&7676767654'&'&'"#""303676#  " G <$ @  )!!  '   E  !, &,      &3, !53  Z  !   ] b7&'&'&'4'050505450565676767630327676763200"'&'&'&#0#"'&767676767054'&'&'&'&'&#"#"3036s  $*)9'     '  02!eg **8Z "/( )" K 91    #hl%&'&'&'&'&5&5470567676767632'.'&'&'&'"#"3232767676767676#"#"'&   .& 22     "    "* M ) "      79      \ N &'&'&'&'.=476767>767627>765>76762'&'&'&#7676767=4'&'&'&'&+";676$ ,$8     ( ^ &    ,   $K/" .Z8** >=Y/415N+  ]  5*    19 dYy%&'&'&'&'&'&54767676767670323232767676767676#0#"'&6767654'&'&'0#"3276  &'209  !%%)<    !+T  %  MK  -          " Ws7&'&'&5050505&'&#"'&'&547676327654767676767632'&'&'&'&'&32#"000#"  ""!  2%! +   * 910'   4 MH5B!3    ""$    .*=  ,  C )    Z }7&'&'&'05&505050505656767676303276767632000#"'&'&'&5054'&'&'&'&'&'"0#"p  "   !*  1*<g!**7[ 9:' $.  );A+,   79L*+Kc%&'&'&'&'0505054'4'&'&'&#"'&'&54763200032"#"&'054767632#"M      o    **;=)    *;>*)   K" " Xn&'&'&'&'&54547676762327>76767656=4'&'.#"'&'&5&7632#"&'45476732#"         ( 8 h        W{hIF     GKJw2$T7# " ay7&'&'&5&54'050547676763200076767676767672'&'&'&'&'&'&#"w  "3/0  L&'& $#"    )=JP  ?A^V$/ $!!  6"!-,#$ "*''+@K%&'&'&'&505050505&'&'&'&#"'&'&54763200032"#"N      MQpsRM   MQps0!M  H7.'=6767632367>323767>2'&'&'4'&'54'4'&'&'&#"#'&'&'&'&54'5.'&'&#"+'&2   ( (@    <>X+0?=   <234(( 10A<*   **#A01&'T#**    *767322767676767656=476747676'&'&5&#"+"2&(    <        - )76767>76#"'&V,  "<8"      7V$:  --6Btl?)&%  /'&84%&< P7&'&'&'&'&'&'&5456763232767676767654767630323276767654767632'&'&'&'&'&'&'&#"#"'&               CBX3%$3  549.$###-743  447-###$.945  3$%3XBC)(54&''&45()Xg7&'&767676767656'&'.'&'45476763232767>76;2#.'.'&'&#"#"'&n < 4$$4 <,  <0  " H 6#,,#6 H$8 F"8?'c&'&7676327676767676'&'&'&'&'&'&5056767676767676767632#"X    ! ,   $   #"/ ! I)CCY6%%.  &'(<21#$R4#$+ ,GFQ+*)%E// =QU7&'&767676764�#"'&'&'&547676763630303#"#"#"'"'&f 00AK)'8[=*  ##0A44 0/AA..$$L>-. 44B 0#" 67GS/.   67HH55 j3~.'&'&'&'&545&7>54'&'&'&'"'&'&5476767676767654&'&74547676767676;2#"32#" "  00  "   D$Dp   (0 "" 0(    6$+#    #,%6 HXq;&'&'05&50505050505470567676320000000#"$   7,!!+7 D5I6JV9;+7h3w&'&767632676764'&547676?654'&'&'&'&54764'&'&'&#"'&547676;2##"~  D$""  0  0(0    p 6%+#    #+%    (0  ""  0(  NE%&'&'.'"#"'&'&547676763223276547676#"l$   :$"   )*"#  %6*$   & p-A.'547676767>567632#"&'5476732#"        *76745&'&'&'&+"'&'&54767632767676'&'4'6767676767676;2'.'&'&'&'#"32#"32767>54767632+&'&'&+"#"J    0,$ &,"     *   6*($    V*"   \6$&$    K/ B!       .?  #B     . 9`-U{7&'&76767676'&'&547676'&'&'&'&5476767676327676767632'&'&'&'&#"'&'&#0#"'&%67654'&'&#"3276O     %  ! %% !   $  g    ! %    %   %     #! 42&'&54767676763&'.'&'&'&5&547676762?>7676323+3+'"'.'="'&'&'&547676767634=&'"'&Z8*4 ( " $&D(   ( "4L <>, :4L<>,  c#*83A_#*B ,>12 !8)<*++f*8! 21>,     2..0!  ,Xq'O&'&'05054547676763200#"&'&'05054547676763200#"$         68Q_,.  7"SQ"7  78Q_,.  7#RQ"7 d\&'&'&5476762327676505&'&'&'&'&'&'&'&'&'&'&'&'05476767654'&'&5476767670323'&'&'&'&'&'&'"#"00#"'&676767654'&'&'&'&'&'"#"3270   ) %      *)4 "  * $     !    $$)   !!  "  !? "     -)) #" !%7!  $  "?"     -)) $" !$&  #"! "#' | %&'&547632#"&7&'&547632#"&     T&J&'&'.5476767632"+"'&76767454'&'&'&'&#";6'&'&'&'&'&547676767632'&'&54'&'&7676547676+".&&0"&(JNP"0 &&4 :""2 *2<"$0F &    ::   ! :8SoWX5% %5XWoS@@8< LVVvUV w]II) [''$#&'!   8RS8 3@\&'&'&54547>76767>'&'&#"'&'&54767632'"'&#""#"767654'&'&'#"276 " $.(*4,  ,   T 2  4    &32PIR   ~5j&'&'&'&'&'&5476767632#7&'&'&'&'&'&5476767632#  ,"  "    ,"  "  # )*@3   8%+# )*@3   8 %+%A7%&'&54'&'&'&#�#0#0#&'&'&5476767276703032#" 6!OY=<  *?[#P?? ;4   SRX <[7&'&'&'&'.545676767676767676;2#"7676=&'&'&'&#"3276'"'&'&5474767676;&'.'&'&7;67676754'&'&+" &$$44F,lL&"&2" F42 &0T$|        &  $>-$&  &$G54U?8<%$$%  32G=7I[ KC        !&'&5476767636320#"'&  X &&$*   45&'&'&'&547676320#"7654'&#"32  . &$ ,4"" ! 3 #) S""   >))Ho%&'&=4'&'&#"'&'&47676;7>547676;232+""&'&54767676763232;+"'&%;BA"   8BA"   99H<6L  =&+0++A"  $:AB8  $:B$    }3[&'&7676767654'&'&#'&'&'&5&767676767632032"#"'& b   ' -  - &'%+ f/    +"#$$  3\&'&'&'&547676762767676'&'&'&'&767>54'#"&'&767>3232#"*  ,  2<$ <&&$,   ! "(  '  !" ))b !&'&54767676767632#"  8$ f    4z2{&54567676767474767676320327676767676=676567676'&'&'&#"#"'&'&'&'&'&#"'&D             ~ 33|>? &&Q"))    ));?// 9:H=5'&  $0 B$j%&'&'05054'4'&'&'&'&'&'&5476767676767232#"'&'&'5&=4'&'&#"#"$  ,((  ((d$    +-??/.+  !  [4$+ YtRO ORtX, ]p&'05476703200#"   c# # H7;&'&'&'&'&5476327654'&'&'&767632#0       &          &q19&'&'0505054'&'"#"#'&'&54767676763200#"W     2   v +-?E,  6"PP"6 3)M&'&'&'&5476767676762+&7676767=&'&'&'&#"32"   4  $$.  <      " ::    :: )M  01   "  "|1c&'&'&547676767656'&'&'&'&76767632#"7&'&'&547676767656'&'&'&'&76767632#"   "  ",,$    "  ",,$  *% 8  3@*) *)A5  *% 8  3@*) *)A5  iZW&'&54'&#"'&'&54767676767630327654763232#"#"%&5476767676767676767630#"&'&'054'0505&'"#"#'&'&5476767676320000#" E; ,   #     i&%*)((   +*2%  8     2   &1&&)P  &(      &$ )/OPWTQP5   $!ZYg,+,'I43  +-$E/,  69OQ96 h`[&'&7676767654'&'&#'&'&'&'4767676767632032#"#"'&%&50567676767676767676320#"&'&'0505054'&'"#"#'&'&54767676763200#"W b  ' -  - &($+ +*5'$$+( 4     2    e0    *$#$$  [\l...*M77'%MMZ.0/+P99  +-?E,  6"OQ!6 {dU{&'&54'&#"'&'&505676767676767632032765476322#"#"%&=4767676767676767632#"&'&'&'5476767632767654'&'&'&'&76767654'#"'&'&7676763232#" D<  "" $      **4( <:n>4 * * 4<,$&&<   (%1 &&) AF   &$[[k...*O76}^    "(  '   ! R b_w&'&'&'&547676767676547676303203276767676767672"#"#&&'4547676320#"4&&  *"           - 22 $)* (     #& " " Q[}7&'&'05476767676767676767676320'&'&'&'&'&'&'&'&#"#"654'&'&'&'�#"3276&'&'&54767632#"'&&        238-$$   m!  LL 5 1    D%76MP98'   '89PG3WT $''$V bD((,-<`     % Q[}7&'&'05476767676767676767676320'&'&'&'&'&'&'&'&#"#"654'&'&'&'�#"3276&'&54767676767632#"&        238-$$   m!  LL  7% D%76MP98'   '89PG3WT $''$V bD((,-<`      Q-"'&547676767676320+&'&'&/&'&'547676767676767676767632'&'&'&'&'&'&'&'&#"#"654'&'&'&'&+"3276               238-$$   m!  LL          D%76MP98'   '89PG3WT $''$V bD((,-<`  Q[}7&'&'05476767676767676767676320'&'&'&'&'&'&'&'&#"#"654'&'&'&'�#"3276&'&5476767676327676547676#"'&'&'&'&#&&        238-$$   m!  LL   "    "    D%76MP98'   '89PG3WT $''$V bD((,-<`  !         Q$I#"'&'&'&'&'&=676767632#"'&'&'&5&'&=676767632&'&'547676767676767676767632'&'&'&'&'&'&'&'&#"#"654'&'&'&'&+"3276     u        238-$$   m!  LL (        D%76MP98'   '89PG3WT $''$V bD((,-<`  Ro7&'&'&747676767676767676'&'&'&54767632'&'&'&'&'&'&'&'&#"#"4'&'&'&'&#"3327276654'&#"32&   ''7      $$-823   p     O L""  C#45J.**%D++ "!  +   +HHUE23"R $''$Y)+=3"""_c #"   N7&'&'054767676767676767676767672703632320#"032#"032#"#"'&'&'&50505&'&#"#"676705054'&#"33276*    -" =3 .10.  2< #" '0      B#54JTHI,  J* '-1V S+''$S %%5o$$.965J&&'&'&'&'&5476327654'&'&'&7654'&'&'&'&'&'&'&547676767676767232'&'&'&'&'&'&#"32767676767676#0    **234<&    -#""#-    $$'  &       ''"H'% $ 8 /  $$? !(((<?$$      &jm7&'&'05&50505050567676703030303+32#";2"#"'&&'&'&54767632#"'& 04FF42 *<4&$ LX(ZL $&4<* ..884@4 0   _K    II$VV J   % jp7&'&'05&5050505056767676303032+""32#";23#"#"'&&'&5476767>7632#" 0FF2 *<4$ LXZL $&4"** ..884@ ($8$!`L   II VV      j."'&54767676767632+.'&'&'&'&'5&=676767;+32#";2"#"'&        V 04FF42 *<4&$ LX(ZL $&4<* ..884@         _K    II$VV j C"'.'&5&'=476767632#"'.'&5&'=476767632&'&'5&=676767;+32#";2"#"'&          04FF42 *<4&$ LX(ZL $&4<* ..884@(       _K    II$VV i7&'&767632767650=05050=4'&'&0#"'&'&54767676363#0#&00007632#0#"'&&'&'&54767632#"'& !  ! $%- -*2 ! " 3(+.$$I6 1    C$*jk)$D  DMkjNC J   % i7&'&76763037676545474'=45474'4'&'&#"'&'&54767676;2+&0007032#0#"'&&'&54767676767632#" ! ! $%--*2 !" 3(+.$$K  8%  Cjj C  CNjkMD     ,"'&547676767676320+&'&'&/&'&7676327676545474'=45474'4'&'&#"'&'&54767676363+&7632+"'&      #? !  ! $%- -*2 ! " 3(+.$$      #  Cjk D  DMkjNC $I#"'&'&'&'&'&=676767632#"'&'&'&5&'&=676767632&'&7676327676545474'=45474'4'&'&#"'&'&54767676363+&7632+"'&     !  ! $%- -*2 ! " 3(+.$$(        Cjk D  DMkjNC .8O7.5&=4'&'&'&#"'&54767632767676=67676732+"'&767676767656=&'&'&'&'&'&'&#&#"32#"3276   ( " <\ 2hf.  (      . '82$"    &'7>-+ J6 0HF 1 2"N  ++hE20 R6%# !"2,(15}7&'&'&'4'05050505054767676763033276765056505056767600'&'&'0'&'&'&#&000#"&'&5476767676327676547676#"'&'&'&'&#&G    !!-;,,  --a2' 2   "    "    _{a +#22BYAA6G*;lKG  ))=!&L]S:; A@K$:$$6Fck,G !         $B8q7.'&'&'&'&54767676767>7632"7676767676=4'&'&'&'&'&'&#";676&'&'&54767632#"'&&P   P(**&(*  *(&X  0>   0"6 0  . #J''!!%  .  %!!''J# U %@@% $ !")))>"   % $B8q7.'&'&'&'&54767676767>7632"7676767676=4'&'&'&'&'&'&#";676&'&5476767>7632#"&P   P(**&(*  *(&X  0>   0" ($8$. #J''!!%  .  %!!''J# U %@@% $ !")))>"     $B,e"'&5467676767632+&'&'&/.'&'&'&'&54767676767>7632"7676767676=4'&'&'&'&'&'&#";676     &P   P(**&(*  *(&X  0>   0"         . #J''!!%  .  %!!''J# U %@@% $ !")))>"$B8q7.'&'&'&'&54767676767>7632"7676767676=4'&'&'&'&'&'&#";676&'&54567676763232767654676#"'&'&'&'&#&&P   P(**&(*  *(&X  0>   0"       "   . #J''!!%  .  %!!''J# U %@@% $ !")))>"!        $B Az#"'&'.5&'=47>7632#"'&'.5&'=47>762.'&'&'&'&'&547676767>7632"7676767676=4'&'&'&'&'&'&#";676     &P   P(**&(*  *(&X  0>   0"(       .  %!!''J# .  %!!''K" U %@@% $ "!)))>"zZ7&'&7676767654'&'&'&'&547672327676767632#"'&'&'&'&#"    6     5 $Be&'&'&747654'.'&'&'&54767676767676727676767632+&'&'&#"&%6767676754'&/&5";67667654'&'&'&+"3276z $ 4HH4  *(($4   ""*  d6&& " <   &&  B & !'(J"    "J)'! %     p%%M60&9  @AS$%%!>+),iLM++e60&9KK15g7&'&'&'&'&'&'054705676763203276767676767056567676760000#"'&&'&'&54767632#"'&  89  ! < 5 0   &'GH&;8  ==tW$>  >>%2t==  8;BHG& L   % 15g7&'&'&'&'&'&'054705676763203276767676767056567676760000#"'&&'&547676767676320#"#"  89  ! <.  8% &'GH&;8  ==tW$>  >>%2t==  8;BHG&     ! 15,"'&547676767676320+&'&'&/&'&'&'&'&'&'5475676763232767676767675656767676#"'&      #  89  ! <      # &'GH&;8  ==tW$>  >>%2t==  8;BHG& 15$I#"'&'&'&'&'&=676767632#"'&'&'&5&'&=676767632&'&'&'&'&'&'5475676763232767676767675656767676#"'&       89  ! <(       &'GH&;8  ==tW$>  >>%2t==  8;BHG& 42`%&'&'4'05054'&'&'0'&'&'&'&'054767676327676767676320000#"&'&547>7>7632#"$ (   &(   (  $( 8&  .D9$#'>21 !);+**+;*! 12>#%9D1/       dCk7&'&'4'&505050547676763232#"#"76767654'&'&'&'�#0#"3276y  ?8 !!    !! 8?  &  &  /`FL 3<  $#  ?3I 'JU7&'&5476763276765654767>76767632#"#"'&'&'&"'&%6767676765454&'&'.'&'&5476767676764'&'&'&#"356767632^ $$: *   * 4$"&   "  "( *       5HHHmL:"# 6"#$   -/##3 L  0$    !%(O!(  `Z7&'&'&'&547>767676276767654'.'&'&'&'&'&'&767632#"'&'&5&#"#"'&7676767654'&'&'#""323>&'&'&54767632"'&$ , H <&B ("  &   F  ".D4 0  &, ,      &3J 953  Z  !       % `Z7&'&'&'&5476767676703636767654'.'&'&'&'&'&'&767632'"'&'&5&#"#.7676767654'&'&+"323676&'&54767676767632#&$  H <&B ("  &(   F  ". l  6&%-       &3I953  Z  !       ! `00#"&54767676767632+&'&'&'&'#&'&'&'&547>767676276767654'.'&'&'&'&'&'&767632#"'&'&5&#"#"'&7676767654'&'&'#""323>       $ , H <&B ("  &   F  ".0        &, ,      &3J 953  Z  !   `Z7&'&'&'&5476767676703636767654'.'&'&'&'&'&'&767632'"'&'&5&#"#.7676767654'&'&+"323676&'&5476767676327676547676#"'&'&'&'&#$  H <&B ("  &(   F  ".   "  "  %-       &3I953  Z  !         !     ` ?+"'&'.=4767676;52+"'&'.=47>7632&'&'&'&547676767673636767654'.'&'&'&'&'&'&767632'"'&'&5&#"#.7676767654'&'&+"323676          $  H <&B ("  &(   F  ". 7       %-       &3I953  Z  !   `EZ7&'&'&'&547>767676276767654'.'&'&'&'&'&'&767632#"'&'&5&#"#"'&7676767654'&'&'#""323>&'&'&'454767632#"7654'&#"32$ , H <&B ("  &   F  ".N 0 &" *2"" &, ,      &3J 953  Z  !    2$+ S""     [}7&'&'&'&54767676767654'&'&'&'&5&76763236767632323276767676#"'&'&'&#&'&7676767654'&#"#"3276767654'&'�#3276%! - (/ 0#)$$%/ &#  J#  #     "!D '5 % 3 " ( & ,((          *       [  + '  ! i &'&'&'&'&5476327654'&'&'&7654'&#"'&'&'&'&'&5050567676767672'&'&'&'&'&'"02767676767676#0     !" !.( 11   !      %        M) )  "   79       &dUr%&'&'&'&'.547676767676763232767>767676#"#&#&6767654'&'&'#"27&'&'&54767632"'&  && 40: "$$*<    ,T  $  B6 2    $ML  -           (# S   % dUq%&'&'&'&'&'05056767676767632032767676767676+&#&676754'&'&'#"27&'&5476767>7632#&  && 40: "$$*$< ,   " *T  $0  ( 8&  __  -     "      # #     ! d00#"'&54767>7>32+&'&'&'&'#&'&'.'&'&54676767676732;2767676767676#"#"&6767654'&'&'#"327  (      0 ( &&40: "H*(<    , T  $  0  &        0MK&  -           (" d#D+"'&'&'&=4767676;72+"'&'&'&=476767632&'&'&'&'.547676767676763232767>767676#"#&#&6767654'&'&'#"27        && 40: "$$*<    ,T  $  7          $ML  -           (# Ki%&'&'&'&5&5050505&'&'&'&#"'&'&547632000032"#"&'&'&54767632"'&l      v5 0    *;=+)    **;>*)   Y   % Ko%&'&'&'&5&5050505&'&'&'&#"'&'&547632000032"#"&'&547676767676320#&M        8$  *;=+)    **;>*)   )    ! 3x0#"'&5&=4767>767632+&'&'&'&'#&'&'&'4'=4'4'&'&'&#"'&'&54763232"#"  (            0   &        **;=)    **;>*)   #B#"#"'&'.=4767676;5#"#"'&'.=46767632&'&'&'&5&=4'&'.#"'&'&54763232"#"            &    (  7        *;=+)     **;=+)   24 7&'&'&'&54767676767632327654'&'&'&#"'&547676767654'&'&'&'&'&'&767632327676763200#"7676767674545&'&'&'&'�#"3032763'&  )!$    ($   ,) &'  (+ g  '   , 77 %          /@C- %R     (   Z q7&'&'&505050505676763767670303000#"'&'&'&5054'&'&'&'&'&#"0#"&'&5476767676327676547676#"'&'&'&'&#"p   '%&&    *,      "    "   ;%X+0?=     );' #/  );A,+    )){C[%&'05476703200#"'&'&547676767672322"0#0#&'&7&'45476703200#"    99H*(9%   <&+/++   # #    " # ^ >6767654'."327>676767654'&'"323276&'&'&767654'&'&'&'&4676767676726767632#"'&'&##"'&(  : >v 6*    ()     )"$  ! >9 P ?*F5'%W     %    !J% Z i7&'&'&'&5&505050505>767322767676767656=476747676'&'&5&#"+"&'&'&54767632"'&2&(    <       4(0    - )767322767676767656=476747676'&'&5&#"+"&'&5476767>7632#&2&(    <        ( 8$  - )7676;25+"'&'&'&=>7632&'&'&'&'4'=4=47676;232767676767656=676567676'&'&5&#"+"      2&&          7       - )320+"'&'&'&54767#"#"'&  E  !, 2#  " G <$ $@  )B    %  ]  !   K&,     . &3, !5  $&"Je3&'&'&'&'&'&'&5476767676767632'.'&'&'&'&#"32767676767676#"&'&5476767>7632#"**224<&  ."$$".  *J.( ($8$&'$ %'H#7 . "  $$?<(((! ?%$    6%     ik%&'&'&'&'&'&5054767676767672'&'&'&'&'&'"2767676767676#0#"'"&'&547676767676320#&  !-( 12   "     "+  8%   M))  "   +9     )    ! Je3&'&'&'&'&'&'&5476767676767632'.'&'&'&'&#"32767676767676#"#"'&54767676767632+&'&'&/#**224<&  ."$$".  *J.(,       &'$ %'H#7 . "  $$?<(((! ?%$    6%      ik%&'&'&'&'&'&5054767676767672'&'&'&'&'&'"02767676767676#0#"'"0#"'&54767676767632+&'&'&'&'#  !-( 21    !    !+N          M))  "   49     )       Je~3&'&'&'&'&'&'&5476767676767632'.'&'&'&'&#"32767676767676#"&'454767632#"**224<&  ."$$".  *J.(    &'$ %'H#7 . "  $$?<(((! ?%$    6+" " ik%&'&'&'&'&'&5054767676767672'&'&'&'&'&'"02767676767676#0#"'"&'54767632#"  !-( 21    !    !+      M))  "   49     =" " Ji3&'&'&'&'&'&'&5476767676767632'&'&'&'&'&'&#"32767676767676#""'&'&'&'&'&=676;676767232 **334<&    -"##"-    ,H.(0       !&'$ %'H#7 .  $$?<(((! ?%$   6*       ! io%&'&'&'&'&'&5054767676767632'&'&'&'&'&'"#"03232767676767676#0#"'&"'&'&'&'&'&=6763237676732  !-( 21     !    !+      # ! M() "    49      '   #   ! VG7&'&'&'05&5050545056567676767032#0#"'&76767676767676505&'&'&'&'&'�#00003276"'&'&'&'&'&=6763237676732l ) ! =./ 253e- ""'%  %     #  ! /'9}a &%2 '+3'/ 2O  /:!NK!"  HKkjJH   #   ! `3O3&'&'.'.=6767676767627656567656767632'.'&#"767676=4'&'&'&'&+";676&'&'&'&'=6767632& ( $8   ( t  &   *      0$K/#" Z8**+E51cY=>  ]  6)   29 22*  (83.8X7&'&'050505054'&'&'&#"'&54767632767676505050505676763032+"'&767676767676=4'4'&'&'&'&'&'&'"+32#"3276   ( " <\ 2hf.(     .  '(82$#    &(6?,+ J5 0GG 1 2"O  *+hF0 S6%" !"2 )33}3&'&'&'&'&'&50547676767676763232767054'&#"'&'&567676327654767630332#"000'"'&'&'&#"76767676505&5&'&'&'&'�#"0323676  # %  &    ' s  &    +   K/"  ! -&&'   AE`k,G  ] 6   29 jhl7&'&'05&50505050567676703030303+32#";2+&'&&'&54767676;2+"'& 04FF42 *<4&$ LX(ZL $&4<* @68:..>  2Z  $("* _K    II$VV !   drTp%&'&'&'&'&'&50567676767670323232767676767676+"'&676754'&'&'#"27&'&54767676;2+"'&  &&40: "H*(< ,   " *T  $0  4X *"$$  M^  -   "       " (   jk7&'&'05&50505050547676703030303+32#";2#"'&&'&'&=4767632276767676#" 02HF40 (<4&&LX(XL&&4<* ..:84@"  (  4"& _K    II$VV  %    ;dUs%&'&'&'&'&'05056767676767632032767676767676+&#&676754'&'&'#"276&'&'&=47676323276767676#"   && 40: "$$*$>     " *T  $ "  2$& __  -           #  %  ;jl7&'&'05&50505050547676703030303+32#";2#"#&'&&'54767632#" 02HF40 (<4&&LX(XL&&4<* B4: :..     _K    II$VV  " " dWu%&'&'&'&'&'050567676767670323232767676767676+"'&676754'&'&'#"3276&'4'4767632#"   &&40: "H*>     " *T  $     `^  -          " *" " j37&'&'&'4'0=0547676767030;#0#0#0#32#"030303222;2+"'.'&547"#"#&'& 02GG30 );5%$ MXYM $%5<     &:  :.- _FK      $ * 6#!d<>7054'&'&'0#"27.'.'&'&=67676767673232327276767676767676"'.'&547(T:  $0 8A*&&40: "H*(< ,        %;  " ("  0M^  -   "    *( 6#jk7&'&'05&50505050547676703030303+32#";2#"'&"'&'&'&'.=476;7676732 02HF40 (<4&&LX(XL&&4<* ..:84@     $ " _K    II$VV   $  #   ! dTp%&'&'&'&'&'&50567676767670323232767676767676+"'&676754'&'&'#"27"'&'&'&'&'&=>;7676732  &&40: "H*(< ,   " *T  $0d      $ " M^  -   "       " &   #   ! J7&'&'&'&'&'&505676767676767232'.'&'&'&'&#"3276767654'&#"'&'&54767632#"'&'4#"#"#"'&54767>767632+&'&'&'&'#**224<&  ,$$&&4  "   6    & ,  (      ''#G'%@% 7 / "  $$?<(((! C##! /E6       &     N&'&'&'&5476763276767654'&'&#"'&'&'&'&76767676'&'0'&'&547676327676762767032#"6767654'&'&'&'"320#"'&54767676767632+&'&'&'&'#%""   ''2 %(  )<4<  !+S  :6'' I/3&  *!  o           "    #"/>$    -*=  ,  C )    R       J7&'&'&'&'&'&505676767676767232'.'&'&'&'&#"3276767654'&#"'&'&54767632#"'&'4#"#""'&'&'&'.=476;7676732**224<&  ,$$&&4  "   6    & 8     $ "''#G'%@% 7 / "  $$?<(((! C##! /E6    % $  #   ! N&'&'&'&5476763276767674'&'&#"'&'&'&'476767676'&'&'&'&547676327676762767032#"6767654'&'&'&'"32"'&'&'&'&'&=676;76767232&"!   '(1 $(   )<4=  +S  :6'' J/2'  *         # !   "    #"/>$    .*=  ,  C )    T   #   ! J7&'&'&'&'&'&547676767676767032'&'&'&'&'&'&#"3276767654'&#"'&'&747676320#"'&'&#"#"&'454767632#" **334<&    -"#%$6! "   5   !%     ''#G'%!% 7 /  $$?<(((! C##! /(6    &" " N&'&'&'&5476762767676'4'&'&#"'.'&'47>7676'4'&'&'&54767632767676276732#"6767654'&'&'&'"32&'454767632#"&"    P2 &(    (<4<    *R   : 6(( J.4&  *  (      " 4   #"/>$    -*=  ,  C )    ,c" " J7&'&'&'&'&'&505676767676767232'.'&'&'&'&#"3276767654'&#"'&'&54767632#"'&'4#"#"&545676767676'&'&'&767632#"**224<&  ,$$&&4  "   6    & $  $ ''#G'%@% 7 / "  $$?<(((! C##! /E6       !  .32 N&'&'&'&5476762767676'4'&'&#"'.'&'47>7676'4'&'&'&54767632767676276732#"6767654'&'&'&'"32.'&54767676767632#"&"    P2 &(    (<4<    *R   : 6(( J.4&  *         " 4   #"/>$    -*=  ,  C )    ,= '%    ! ! S7&'&'&5&505&5454767676000030303036767676505054705676763200'&'&'05&505054'&'&'�#0#0#0#"000#"0#"'&54767676767632+&'&'&/#i  #$11$#     #$11$#  j         _9P FK  &(70"  ""0 '&  9XAA/L%"=)(  ,-%9('  '9?.+ $     Z }7&'&'&'05&505050505656767676303276767632000#"'&'&'&5054'&'&'&'&'&'"0#"0#"'&54767676767632+&'&'&'&'#p  "   !* p         1*<g!**7[ 9:' $.  );A+,  79L*+        `&'&547676767476767663232320350547>76320'&'&'&=&'&'&'&+"#"'&'&'&5&5&=4505&#&0+&#;6767676 8 18($*  /  *  #$12$"   *"Pg "$21$"  +K &7  7&  )?   F|X:  ,@9('  '(9?+  &9 _!  <*&'&5476767676505476767632;2+76767632"'&'&'=4'4'.'.'""'&'&'&=4'=47&N $< H:8  >&,.m "  # *   %/ 2!*   + 9-:C $.  )+;A+, $7+ L*+ 1f**    **;=)   #!          hk7&'&76763037676705050505&'&'&0#"'&'&547676763032#0#&732+"'&&'&54767676;2#"#"'& !! $$--*3 !! 3(+.$$  4X &&$* CNjjNC  Cjk D !   rKm%&'&'&'&5&5050505&'&'&'&#"'&'&54763200032"#"&'&547676763032#"#"'&l        4X &&$* *;=+)    **;=)   2   g7&'&7676327676705050505&'&'&0#"'&'&54767676363#0#&00007632#"#"'&&'&'&505676763232767676760#" ! " $$- -*3 !   ! 4(* -%$h#    3#& CNjkMD  DMkjNC  %    ;K{%&'&'&'&'0505054'4'&'&'&#"'&'&54763200032"#"&'&'&505476763232767676760#"]      ]#    3"& **;=)    *;=+)   + %  ;37&'&767630376767050=05&'&'&0#"'&'&47676763032#0#&0007032032323#"#"'.'&'47"#0#"&   ! $%--)3 !    %: .H CNjjNC    CNjkMD (* 6## 3&'0547676320#"#"#"'.'&'47670'&'&'&5&5050505.'&'&#"'&'&5476320032363232    %:    *   =" " * 6#&"  *;=+)    **;=)  l7&'&7676327676705050505&'&'&0#"'&'&54767676363#0#&7632+"'&&'54767320#" ! ! $$- -*3 ! ! 3(+.$$p    CNjkMD  Dkj C %# # K%&'&'&'&'0505054'4'&'&'&#"'&'&54763200032"#"M       **;=)    *;=+)   "DAi%.'&=476323276767656=476767632+&%&'&'5&=4=676762#"8$@ 8, - $"      4"%  (0 B=$Us<=  8:AHG&  _ L  /aa. ^K7&'&'&5&50505054'4'&'&'&#"'&'&547632000032"#"&'&'&'&'&54547676760327>76767656=4'&'&'&#"&'&567632#"&'5476732#"%&'5476732#"      0          8 X        **;=)    **;=+)        W{hIF    GKJwVT67# " # " >(K{7&'&'&50547632232767676547054747676320000#"#&0#"'&54767676?632+.'&'&'#$  ,, $   z         "%  ( B=$Us<=  8:AHG&         p\&'&'&'&'&54'47676762327>76767474756=4'4'&'&'&#"'&'&747632#"#"'&54767676767632+"'&'&/#          8 &            W3Hh+F    GKJw2$T7w       25y7&'&'&5&50505&54547474767676322767676763032'&'&'&'&'&'&'&#"&5476767676'&'&'&7676320#"H 23EE55 #$/" ((43'& '!7))##    "  _F4 :' .-=F('-.AA00 $#," 65ED34 2+J66  E%   !  .32 bx7&'&'4'050505450547676320000767676767676720'&'&'&'.'&#"&545676767654'&'&'&767632#"x  "200  L&(( &D   Z"   "  1eP  >B]V>. #"! 5"!,,$# "*N*A   !  .32 bd7.'=47676327676767676732'&'&'&'.'&#"x   "200  L&(( &D   ;?X3 CK  #"! 5"!,,$# "*N*AjKm7&'&'&5&505&50547676763200032030303#0#"'&&'&54767676767632#"   $5;+)  @68:-.  8$ _8QFL  Xs0"N      Km!&'&'&'&'0505054'4'&'&'&#"'&'&54763200032"#"&'&54767676767632#"$      ,  8$  NPqs0!M   N!/qsQM  #    jKt7&'&'&5&505&50547676763200032030303#0#"'&&=676767654'&'&'&767632"#"   $5;+)  @68:-.a!   #   _8QFL  Xs0"N     !  .32 Ks!&'&'&'&'0505054'4'&'&'&#"'&'&54763200032"#"&5476767676'&'&'&7676320#"M      N   "  NPqs0!M   N!/qsQM    !  .32 j3Kq7&'&'&5&5&50505476767632000032030303#0#"'&&'&'&'&'050567676320#&   %4<+)  ..:74A    &9FL  XsRN  #22*   (833Kq!&'&'&'&505&505054'&'&'&#"'&'&54763200032"#"&'&'&'&'&54767676320#&      [     NP0AsQM   NPqs/"M  (22*    (83jKc7&'&'&5&5&50505476767632000032030303#"#"'&&'05476703200#"   %4<+)  @69 :-.    &9FL  XsRN  b# # F[!&'&'&'&5050505054'&'&'&#"'&'&5463232"#"&'&5476732#"     b    NPqsQM   N!/qsQM  g# # F `&'&547>767476767620632032030;#0#"'&'&'&'&5&5&=#"Y $    *%4<+) ..:74AH  =L  X"  kRN    &9r ]&'&5476767505.'&#"'&'&54763206763232"#"'.'&'&50=#"    *  6  "  H  KQM     NP   e/"M    NPA15&'&5476767>7632#"&'&'&'4'=4=47676767632327676547=67676'&'&/&'&'&'&'" ($8$    !!-;,,  --a2'       `z ` *$12CYA@5*fkKH   (AAI]S:: @AK$ :#$6Fck-G Z "&'&54767676767632#&&'&'=676762767676;#"'&'&'&=4'&'&'&'&'&#"#"  8%  '  %&&    *,   )    !  ;>Y+0?<     *;' .  );A+,    )!%MW: A@I==$ 5Gck,G   !  .32 Z q7&'&'05&50505476767627676763030000#"'&'&'05054'&'&'&'&'&#"0#"&545676767654'&'&'&767632"#"p  '  &&&   *,   r!   #   ;>%4+0%<     **"C $.  )+;A+,    )*#L*+   !  .32 06n7&'&'&505&5050505470547676763632>=47676'&'&/&'&'&5&#""'&'&'&'.=476;7676732F   ",<,*  .,`2(      $ " .'8{:'/ + #22BYAA 6GelKG  )(>!%MBAW: A@K$:$$$5GckJG & $  #   ! Z q7&'&'050505050567676276767630300#"'&'&'&5054'&'&'&'&'&#"0#""'&'&'&'&'&=6763237676732o '  %&&    *,        #  ! ;>Y+0?<     *;' .  );A+,    )   2   4X &&$*.  %!!'(J"   %!!''J# U %@@% $ !"))))>"   ^r)a%&'&'&'&547676767632#"7676767670505&'&'&'&'&#"#"0323276&'&547676763032#"#"'&3'&  (43(  (* g       3Y %'#* ,JJ% %JJ%R 2"   3     $B9q7.'&'&'&'&547476767676767632+"76767676747=&5&'&'&'&'&'&#";676&'&'&=67676323276767676#"&P  *(&**(P  P(,,  .>   0 |$     4"&. #J''!!%  .  %!!''J# .U %@@% $ !"))))>" %    ;^)a%&'&'&'&547676767632#"7676767670505&'&'&'&'�#"303276&'&'&505676763232767676760#"3'&  )43)  (+ g      b$    3#& ,JJ% %JJ%R 2"   3    %  ;$B=y7&'&'&'&'&'&'&5476767676767632#0#"7676767676505054'&'&'&'&'&'&#"0303676&'&54767676767632#"'&'&54767676767632#"&()   ))'**'()  )('+,  />  1!  8%   7%  %!!'(J"   %!!''J# U %@@% $ !"))))>"        @&)Z}7&'&'&'&547676767632#"7676765670505&'&'&'.#";276&'&54767676767632#&'&'&54767676767632#&4&&   (24*    (, f       8$  6& ,JJ% %JJ%R 2"   3"      !     ! *@j7&'&'&'&'&'&54547676767676767670327030303#"732#"32+"'&54'4'&'&#"376747 *,&D$0 $>2  00. 2>$ :266.,V" &'#H&& $&  II,$1V fn. J ""2<(((! /#"  J .Xe7&'&'&'&5474767676763272767632323276767676#"'&'&#"#"7676767654'&'&'&#"32767654'&'&'&#"3276+ &&3 &1 %!  I$  #   &( 2$): 4  +/  2  #     )   " P 'D 'D   ] e7&'&'&'4'05050547676763032#"'&'&'0'&'&'&#"000#"6767654'&'&'&'&#"00003276&'&547676767676320#"#"sJO!"$   ,+8 -"" $#=3  &  & //f  8$ `FL $# )  !!<.- .-QD#  ''8>, '++'w    ! xNo7.54'=47676763232767632#"'&'&'&'#"+"'&&'&5476767>7632#&   " 2   *   Z (8$<%X+0&=      (;>0/&     ! ] e7&'&'&'4'05050547676763032#"'&'&'0'&'&'&#"000#"6767654'&'&'&'�#"#"003276&5476767676'&'&'&7676320#"sJO!"$   ,+8 -"" $#=3  &  &  /c   " `FL $# )  !!<.- .-QD#  ''8>, I+',  !  .32 lPy7&'&'05050505054767622767633#"'&'&'&'+#"'&&545676767676'&'&'&767632#" " 2  *     $  ;?X+0?=     (*#?//   !  .32 ] e7&'&'&'4'05050547676763032#"'&'&'&'&'&'&#"000#"6767654'&'&'&'�#"#"003276"'&'&'&'&'&=676;76767232sJO!"$   ,+8 -"" $#=  &  &  /      # !`FL $# )  !!<.- .-Q(#  ''8>, I+'}   #   ! xNy7.=&=47676763232767632#"'&'&'&'#"+"'&"'&'&'&'.=476;7676732   " 2   *        $ "<>%3+0&=      (;>0/+ $  #   ! F w3&'&'&'&54767676323276767654'&'&'&'&'&'&'&'&7476767632#"'&54'&#"#"&'&547676767676320#"#"*&%   7/:6''BZ"" "(A"( W3'  7/9 $  [   )F(*   8$  #  3% &  !%5+2 >062%  ' $   / %    ! tn7&'&'&'&54763232767676'4'&'&'&'&'&'&54767676763#"'&'&'&'&#"#"&'&5476767>7632#&       0:   $"8   "  0:  &$ (8$ &       +        +*     ! F u3&'&'&'&547676763232767676'4'&'&'&'&'&'&'&'&5676767632#"'&54'&#"#"#"'&5476767676762+&'&'&'&'#*&&  6/: 6&(BX""  (D(, V4(  6/;:(( <\  (F(* 8          #  3% &  !%. >062% %   $  0/ &       tn7&'&'&'&54763232767676'4'&'&'&'&'&'&'&547676763#"'&'&'&'&#"#"#"'&54767676767632+.'&'&'#       0   :$"8   "  0  :&$4       &       +        ,-       F3 .'.'&5476327654'&'.767&'&'&'&'&54767676323276767654'&'&'&'&'.'&'&5476767032#"'&54'&#"#"  "   *%&   7/:6''BZ""6 #(A"(W3'  7.8 $  [    )F  %       # 3$ % !6%5+2 =15 3% ' $  / &t3&'&'&'&'&5476327654'&'&'4767&'&'&'&'&54763232767676'4'.'.'&'&'&547676763#"'&'&'&'&#"#           502   :$"8   "  502  :$! &        &      +       ,   &F *"'&'&'&'&'&=676;7>732&'&'&'&547676763232767676'4'&'&'&'&'&'&'&'&5676767632#"'&54'&#"#".     $   "D*&&  6.9 6&(BX""  (D(, V4(  6/;:(( <\   (F(*     #  .! #  3$ &  !%. >063$ $   $  . t*"'&'&'&=676736?676732#&'&'&'5476323276767654'&'&'&'&'&'&'&547676763#"'&'&'&'&#"#"@          S  "   0  9%"7    "  09  '%0       &      +        +=9(}&'&'.'&5476327654'&'&'&76767&'&5&5&5050=&'&'.#"'&'&7476767632303#"00# "     8B :9HU8&  $B7  &       $5~tSO   ORtY     'h3{.'.'&5476327654'&'.767"'.'&'&5054'054'&5&'.#"'&'.7>326547676;232"#"j  !  $B&&..&L & $  &       8% -":  .%'.  /%4''      &>(U%&'&'&5&50505&5054'&'&'&#"'&'&547676767272323#"000#""'&'&'&'&'&=676;76767232$ 8B &&6I99 B7        # ! X~D0SO  OR0DX $   #   ! @&3f!&'&'.'&5054'05&'4'&'&#"'&'&5476763276547676232#"000#"#".'&'&'&54767676320#&T$"  &&.  .&&&  & & h    &,."'.&'./46&   ( 22*   (83=)t&'&547676767634'&'&'&#"&'&47676767232#"220#0+000#"'&'&'&5&54'050="'&P 98F 8B$ 99H+*8& $B7 6&&  =?,  h%+ 6     6  %tX  $4~t&h{w&'&54767676;05.'.#"'&'.7>3276547676;232"2+"#"'.'&'&=4'"'&|  2$&.   .&L V & & $ ( %C%$*&     .%'.  /  6''   8% -"-15g3&'&'&'&'&'&50505476767632327676767676765474767676000#"'&&'&5476767676327676547676#"'&'&'&'&#&   99  ";[   "    "  &'GHC#8  ==t2%$>  >$%2t==  8#BHG& !         Z q%&'&'&'&'4'05054505676763032032767676767650505676567676'&'&'&"+"&'&5476767676327676547676#"'&'&'&'&#"#&2(&          "     - )>  >$Wt==  8#BHG& $   Z rq%&'&'&'&'4'05054505676763032032767676767650505676567676'&'&'&"+"&'&54767676;2+"'&2(&       L  4X &&$* - )>  >$Wt==  8#BHG&  %    ;Z k7&'&'&'&'&505050505>767322767676767656=674747676'&'&5&"+"&'&'&=47676323276767676#"2&&   <      $ 2$& - )  >$%2t==  8;BHG&  3 # ( S""  Z ;m7&'&'&'&'&50505050567676703232767676767656=674767676'&'&5&#"+"&'&'&5&76767632#"7654'&#"22&&            , $ *6""   - )>  >$Wt==  8#BHG&         @&s7&'&'&'&'&54'054505676763032032767676767676547676767676'&'&'&#"#0#"&'&54767676767632#"'&'&54767676767632#"2''          [  8$  8$ - )#B"- &&Q")(    ("?/0  &8)*H9:  =          1(5{3.'&'&'&'&5050547>763227676767>76547467>00"0#+"'.'&547070#&2   ,r  2"   %:  &'GHC#8 ==t2%$>&   &>$%2tz 8#BHG&6 (( 6$$!Y(7.'&'&'4'05&5454747676;2327676767>765656767676760#"#"'.'&54767#"#"2N          %:   <- )<&- LQ"(    ("?/0  &8SH9 (( 6$&" V7&'&'4'&'&'&'&'&'&'&'&5476763676767676767676322767676767632'&'&'&'&'&'&#"#0#"'&0#"'&54767676767632+&'&'&/#                           -KJW/+,&F,,  EE]\BC:9NN;;;;NN9:CB\]EE --F&++.UII, 77HG5445GH77      P7&'&'&'0'&'&'&54567632327676767676547676303232767676547676320'&'&'&'&'&'&'&#"#"'&#"'&54767676767632+&'&'&'&'#1          1              C3%$3  549.$###-743  %$.822#$.945  3$%3C)(54&''&45()(       42^%&'&5&50505&5&'&'&'&'&'&'&'05476767632767676767632#"#"'&54767>767632+&'&'&'&'#$   (   (&   (  b  (       .D9$#>21 !);+**+;*! 12>#4%9D/   &     ?'c&'&7676327676767676'&'&'&'&'&'&5056767676767676767632#"0#"'&54767676767632+&'&'&'&'#X    ! ,   $   #"/j          !I)CCY6%%.   &'(=12#$R4#$+  ,GFQ+*)%E// =x       42!E"'&'&'&5&'=47676762"'.'&5&5475476767632&'&5&=4'&'&/&'&'&'&=47676762767676767632#"       (    &&    (  (        .D9$#'>21 !);+**+;*! 12>#4%9D/[ f7&'&'&'6767676767676767654'&'&'&'&'&'&'476767;"+&#&'&&'&54767676767632#"o $!e>./ 56NN74 # ' ! d=..12? .!"  7%)#11C)&&"='%  @)G;< #"#$     QVz7&'&767676764'�#"'&'&'&547676767636303#"#"#"'"'&&'&547676767676320#&f 10AK)'[=+   "3$$A44 00@A..$$L=.. 54A 0##  8$  67GS/.   67HH55 $    ! [ f}7&'&'&'6767676767676767654'&'&'&'&'&'&'476767;"+&#&'&&'54767632#"o $!e>./ 56NN74 # ' ! d=..12? .!"   )#11C)&&"='%  @)G;< #"#$ " " QVn7&'&767676764'�#"'&'&'&547676767636303#"#"#"'"'&&'454767632#"f 10AK)'[=*   "3$$A44 00@A..$$L=.. 54A 0##    67GS/.   67HH55 8" " [ f7&'&'&'6767676767676767654'&'&'&'&'&'&'476767;"+&#&'&"'&'&'&'&'&54567632376763232o $!e>./ 56NN74 # ' ! d=..12? .!"     # !)#11C)&&"='%  @)G;< #"#$    #   ! QV7&'&767676764'�#"'&'&'&747676767636303#"#0#"'"'&"'&'&'&'&'&=676;76767232f 00AL(([=*   "3$$B34 /0AA..$$M=.. 44A 1"#      # ! 67GS/.   67HH55 $   #   ! H&'&'&'&'&5454767676767676767650565054'&'&##"'&'&5476763265465676767632'&'&'&'&'&32#"#"     " 2& ,   * :0 0&    >"/o2%?8  &"3     "!=. Z7Fpg)* h 1&'&547676767672323'&'&'"#"'&    o    i /&'&'&'&'&505476763227>#"&    m    a/&'&'&505676763232767676760#" #    3#&f %    ;p &'0547672320"#"   # # 5&'&'&'&54767632#"7654'&#"32  0 &$ *6"" 3 #+ S""   (=/%63032#0#"'&'&'&5476L  & :   $$!3m A&5054767676327654767632#"'&'&'&#"'"       "$ s "           hH%&'&5&7676703030303#"#"'&{  03GH31  /.: <7AO    H^/&'&547676767632323030#0#0#0#0#&'& GFZKC//  KN#NfJ8N  -&'&'&54767676767632#"  !     '%    ! ! '&5476767676'&'&'&767632#"   "   !  .22 Zg)&545676767654'&'&'&767630#""   "    !  .23 t-X&'&'&54767676767632#"7&'&'&54767676767632#"   "         '%    ! !    '$$   ! ! u(P&=676767654'&'&'&767632#"7&5476767676'&'&'&767632#"!   #     "    !  .22   !  .22 uZg(P&=676767654'&'&'&76763"#"7&5476767676'&'&'&767630#"!   #     "    !  .23   !  .23 h ]&'&'&'&'&'&54'&#"'&'&547676327676'&'&56767632032#"#"$ /).( $.)/ " ,+5PPO )  )5>>D&"#7h &'&54765&'&'&#"'&'&'0547676327676767676767654'&'&'&'&'&'&'&#"'&'&567676327656'&'&567676320320#"32#"#"'& $,**,)  $-))-(  @'  ' )  )5'  ' ) .'&'&54767632#" (  4"$ 4$"  ! 7    8Xf/G&'4547670320#"7&'4547670320#"7&'4547670320#"0        # " # " # " h31Qi&'&'&5476767632#"7654'&#"3276&'&'&'454767632#"7654'&'�#3276%&'&5476767>7632#"'&&'&'&5476767632#"7654'&#"276 * $ *4""$ 0 &$ ,4""     , 66J\\ ,,6(  : , $ ,6""   d'&7$+ S"" %I 2$ ) S""  ED[sn 77F5%& j''7 #) T"" 3&'&'&'&'&'&5476767632#b  ,"    "    # )*@3   8%6+/&'&'&547676767656'&'&'.76767632"  " ",,$  *% 8  3@*) *)A5 9/%&'&'&'&#"'&'&547676327654'&#"'&'&547676327676767632'&'&'&'&"32#"32#"276767676#"N8-,      43@ )    ! ??I I@?!  $. 66H   $$   P77     $%-))-$%      X33.'&=&54'.#"'&54767632#"00"7&'&545476767632327676767632'"'&'&54'&'&#"'&'&54'&0#"|  LJ             4O  _#  UR,-    ,-UUN=   PNA $ Ma { Q* $6      5 Y e  "2| 45Copyright (c) 2017 Walter E Stewart, SIL Open Font License (OFL).Copyright (c) 2017 Walter E Stewart, SIL Open Font License (OFL).Class CoderClass CoderRegularRegularClass-Coder-v0p1Class-Coder-v0p1Class CoderClass Coder0.10.1ClassCoderClassCoderClass Coder is a monospace sans-serif typeface designed for software engineering.Class Coder is a monospace sans-serif typeface designed for software engineering.Copyright (c) 2017, Walter E Stewart, with Reserved Font Name Class Coder. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.Copyright (c) 2017, Walter E Stewart, with Reserved Font Name Class Coder. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.http://scripts.sil.org/OFLhttp://scripts.sil.org/OFL3X  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmuni0100uni0101uni0102uni0103uni0104uni0105uni0108uni0109uni010auni010buni010euni010funi0110uni0112uni0113uni0114uni0115uni0116uni0117uni0118uni0119uni011auni011buni011cuni011duni0120uni0121uni0122uni0123uni0124uni0125uni0126uni0127uni0128uni0129uni012auni012buni012cuni012duni012euni012funi0132uni0133uni0134uni0135uni0136uni0137uni0138uni0139uni013auni013buni013cuni013duni013euni013funi0140uni0143uni0144uni0145uni0146uni0147uni0148uni0149uni014auni014buni014cuni014duni014euni014funi0150uni0151uni0154uni0155uni0156uni0157uni0158uni0159uni015auni015buni015cuni015duni0162uni0163uni0164uni0165uni0166uni0167uni0168uni0169uni016auni016buni016cuni016duni016euni016funi0170uni0171uni0172uni0173uni0174uni0175uni0176uni0177uni0179uni017auni017buni017cuni20ac WW?ս ϭvedo-2023.4.6/vedo/fonts/Kanopus.npz000066400000000000000000006005671444463326400171740ustar00rootroot00000000000000PK!a'wfont.npywܽwxT7:ݘ=NƄL3MG]gZ§Ϛ6sn13͚8|tn34f(Tt4v7xh,z F:P4ΝiFyÕ`67bZoT%FWWW m͖kޘ6xHo+hwJ&[ ě4o~J7iW_m˖ /6W%-L}Upor{ܫ cKE?/譵Z?ǽ}5pw8=3ғg'kGm6V=]mƍu~D_[4l3̋V_O\z;=SVO{ 3l4o4o։8q>q )+a<ˮ6b{x&TV [lMU{,x#7gxXsfm_͔;ptoվJٲ};zs}'e;Cemm!P €F@mEm e-h[(#F1m -o%M%M e-$[*4C-kK2X[PQ큦ѩpf,4[-˖i4hv e'AɖeNB[ B],h7(ÑݠVba'@K7RP# le>@ˡ h(t  :hpnow7ۉ8sy7e dv.,S41uЂHE,]iomvWk7R+5oFoזR,֭]^ =&, h VСlޒFoO!;zK5o-/ۧW^@>d|ȍMgY:9{U q6Foѹ!whKGM4;B6);:zpuzzh2IgԷkv{e2US6q/䫊ۈ9rfhZg-βǍ4E> `KCiZlUFݣR:e)=HYTIK6zmIY4~D2.kY/}:z:BXX,|trIJm>Kl+㔾J vex$1SExAw|+>R SS{I~g@9FgcPq(XaV7zY;^ִKuz9>IpKp |bY ~ZL˸M%Q$O?iQ@\ ;*S7_8.9rNV"k]xY?s2#Ub{if3̛t3le fXj2_PX^(68ZNly>}E*@75^-n>O}/m746.%ΚX/s9{Bnf6};>Tyꨈ4",5 ">Gs̹a6mS MdYKd=X:nx}_r;=Ci:7S+]x~STc{zћN7\:>L~!]m*CUCOJIg//6]j_OOiX^a\u4z-``AGoW4PTf+3: h ZC)em lqgb,ٝp%MF5MJZ[i[^LGJGrY([Zk{Kk:kGUsR{MF` &h>PYfP_1@r%hO@=z>+!7T\exer0jJJ*^C6Ap@+: (((j r$(K %ځJj T P7* S j:P 5Ƀe01&@U@5ḧ́gckjD @'A9}m mSltv"PN̈́}^Ozm^tP6@y-F\ڮ:v=l^t> z3.@gڼjW5ϫk^\Ze_VKp\,ᏲFO 5sT Q#,GP ÙP t4jcQ;v Bȕ RG4tH$6* d(X``Lӡfp @}^8@PVPJ@W,wn@8^s י E@Cm7]d 荶@o tm ЛP.Ķ Rrl+.tm%[lj@tɍ){ji-?]rZLɕa3fQeF^_~ngΪΖgH~#! tymεn_N^ry"k E: o>NwI_&QW`2PeT{+ØJ"kCG:hEs282\ ?{: ƛ?cw'xq9tdϏ}1U:ܻ< =A Z^F7z' _fo7 9F@< G2Ҳ،gRJf^hCh"IpPa&mR2NER"^;Kl T|2 fV ו]]juUg2ͻVֻVaW8^x.ZεKI`udz~?;ZqJ]K$||w'xȎO0~WVc/H׃d>PFZ+Zm-]u{@W,lB-?4@DovbZw҃ɻ<^}Bޥ'%2k6)[#PeBgJ*ka/ާۭ}Z>x|yk|2U?r׻s?9Tزa~s uU>҈/ɧY}Y>}lWd#C6hUv6?NIhm,,fNIh%[R"]?d' xF8o1 4/ˁz*ڒg1Z}Ց]4|]67,ȷdGv:NW?  ۍwZ]y{=PِˆL B{!A%ߔަFփ{?Լ{[#yk}|Ez:lhh3aˆ!!9ؓqV]smc#ιJ#~Gf.)7*3\e[O=}9Gݨ\9[5V Y3gȣx7z4AԇjS8"_~6|iQȤWԜ@?x Db(4a![2 ѢdZNr(p,hiݼ5-vBgޓN\vZܩB<)?S-vFEKyVldTg_[7=yϷ<ߵދ*yo & 5\̊E1"ڋ?A&yg~/9G\Ϻ; "͡oDN-Fwwɏd]BwѾ0JYqmr=n>aܮF$]D;_<_5rni@^#Igqѧmqz jI$Hvm0طEl.St!+|qdBq_yB9[3lhS q鏩}=moФRl珎$gZ~ CGCB?$Zf B E E E/1FGnkZC-upDp-!j)kmQ]O1MG!xǣ>7Q0 B`dC PbQ ꌮ_ J'؟c&C1a0o:6hm(PPtUSxnbKﯚR &{Z-Os)k]8e;NQ]g( FR{Q-t =.iHe%b1_˄6Ҿ~8zƾvIyx*^Oh HYR>WOy8AY ,}!+b;BPV" T';2ml$ l9P+ *f׬-t`p&!@T±4XM*VYТYwB/ޫ_+(4_l&((jӾh`ck(`@Nwl*'l;Dqqfiiu)! w=x!]Rk]S§l&!6HWvD? :ג7!!ZEҙtmK=Rm u6ɝ^g f_1TW`&qb/X:Rm/ţ0 3Dw1\OH_-VS.[E%ز1eՌ،qV3VȑiCdR<1 y( 4a>wZģ"_pMxDxDRmcM'-Ɩ ZY[yha+yxC{(-1o uZ uW8'j)PGnȗ KJ2V*q%yP-CwaT,10n<i FO_Fr kX}}fbPUcskOXPK6O,MDj׳}]Q8mr25̽6^PP=}l=yF"hm K\s!P]<ֳct Y0/f$˼̋~O0礜H_sF@EYz~CMg dqGݔq?s /]ϖ'Xұ=l!#;egx"@,~gJZE*"R,DFx%Qb3; ͭsz Gw; :|eojF+2z^72ScA=n_?x^)=KmȞVWǮ̴I̲sL3ʽ ˳xťjjL<ɞm,Oq0 =Q_Eߣ?vSL| vF g_-ղlQw? "TN:-P j--AE:.dCեVeOTPzZ9}V~/#%0bC0D-c&E@-h ($2QQCh+aj8(!JL5@Y g` mbNuP@eܤ#( TB g3=KiUIXJT04 daMTlne0pdJ}92A&pdY#|? ]Z#C8Zx苣},V[C^Շ?@ꁾoxy.rC%)![Zc~6US:Uf7\2r\r$@J,Wߝx~i%-QJhbT $t3SJC 3 ? eih; ? 14-~ԗ-) ў~l. p|JE},Gd5YBƊc>fU###c<>q D6@`XWcR> *]R.8t-^)L(Q(G P%@9d\ލQ|?Wo B@(l cC1 `\zYopqjI@9[q;RQk9eҙa^֕}FP;X?jӸ2%"S /X,A ~a +좋%s|UR y"FŽr~ղT!Q7fڰX6}0^OƵF _i5}XR{ϕ:O]q+i̵LXWʦ My{0e9opR]ܚH&+lN,*wEQ|&*zC'WbC"`~6;.Gh7]/b9\`^of8 e7lv~OQ.Kzdu[^%Ia/VVbVt)H 6`?;?7!Pqhwf) Ȱxpj I'"TF;/ -dґ5z, _IIIIIIia-W"ampGBhXd(LJ Ip#`2ñ&n,t)ZwPGgzwsrw9JCJV)JLRri2 g2q4cg OxLZ @EBFT`M&gW`rv- W:`_-bN-*p՘S 5̅jX 5X 5TTC̈́W|pxB}|cP5bo B5B9z@uA$9*rҩ, 3WJ;vx_cA9Ш`˧?翙]v %>xW^Ys9sKrZ}tBI#]~pbg $ %DNT$Ul`Ar$E(+C| Jw;<ݡZkkNaX2Y(#0:Fӣ~2,3I-0S;?rոt_Np +\{?W'kݺIP72=GO;KR-{Gz$N> 4;g78zY`GJK`]lBRh ,坼Ǯ=ē:n"L"qAA|G MLE=anƮ6Xдqc7s얺 aOrNv9g}]]f|t%D(.C՟x'۽u>y^0$ju!9zH *{ 7z.!ҜoLo.YPY9Zěl*Nt;9NWE3GC.+F<}^|"ΉVYͱ36-yq(;|<, q;2}ҡltH tdVL:fdaN̓$tPH3gg"(7Qkhkq9tEC!fPtp(seTR1G/*-RUK4 [b %6R~c0a1N"]]0BJ笂̚BI"]cA1q莨ZW}FE'8pz?CehʜxI0b~<üxJ:LCi[ vt7ء΁b0Pz(1k1;S;1S;GpPOkekam5Χ8=W~;L}T1C,V!&ƂJ#w繏bM2 dd A"S{4eZ?6!"V ӷBw2A? we=YYN[2Jȍ$EXmʌr*kTev1ڷ]Ox}Cw>ylOkJR!3 $3D/6#B;EA",>([6ΩM4yЦLF}醏}d8Yi$iƓz~fhY^zGO^IYng#ϛ4dB}[_a>},3s_!ƾmxǮ@O֭[o콧{osRvhs vzvd=7K>p33xg_9_|{/ϷҕWۉr૽bUk֭'WeOzcl0BU9x}Z=m׆k+th\2R6΋Thszq83%RJ'0=H'8ym`3Y2[EM26?/= 調fRXFJmM3:lAELY!GNE&oh+ĿE, %.'`s,T0ŝcn1j7wy&sYhP\fS'\&"H1TYZώt$d5e5 Vbk`X+\ڿuP߯4MA ]=pdauؽoYkʑ%`4O J(&4#ߴƟ⟋pux `m[<1+%YkIi$1ޥD 18s'}I%=I;% ?Պ@H?R.-]B)g򛉂F >@{hDkYBX9raTjmP{kZ[;9PH3uxD`EF1N"# 54L qŅz$9piUfVJr}K:؃c L2 W_iӀ8 &@MTN+P4Bў@(zM8V?z EZPD`gH)D8qRFӻGa yǞd+`hjZqY%qƱטM׉XijE߼Lm(2 4< u2K1C'ңѫa\܆u eHH~KyLjf\ĉmEK$jmO^b'O z*RMV#l3mzXD2kT7=]+ޡJE&?E'Hq1d4syY}YNcQ5ux;joߊ{{jECN`Ћ4(?*NӜi6^0`xQxA dgh} yP/`|cfᬽ8Z? я'-C`tkCS6 kjB0$^>FFQSnY+c[Yz,h`JS,i0XLc dWO%DJZ }'0;0sPC 8]E~!T@#7аm6fX}WwSU  NzaF/QIMG@mvPJB ]h"ePTP+#e2B5Kʕqej\WFƕھڶ Jjlkv+еۀ vۡպAm6 ڿmI;T1;|Bs8P(r1K9n){ m3|۔Wo c.=- i0QYgcͼ|q)c]8ڭZ -JJۇUl*ۛ32_?CWڬvr9W֎(׫y[>ÞZU1ʣKc!OiNgV;vNY(7j 럒Ꟃ>xT s(KL$pG"%#G!´LL,.,wN*WQe7Jb* V#ReLciHkQ0W]-_:>#ҞqV46+q _Ư^8 ShL~P,i";l%b_lv#&NNѺ4^f" UQƽ~;}>IPlƹ,@9h,2B2im֠M׶j`π=Y[VŖ&Fi <ݞ ԿR(:7mn]F+׺b:iA L~V " 3L<%7p9HK%  %lAw&39 r5źy"a 2ܟ1.8 Z"-K[S,R0i(L\R0Y(%?S)Տ2[̲"DٝR; gvupILf(֔Humi]8)(B/j O%lՒ yV<-R5J1PQ0RQjd ZY>֥}Q|t䣥Ν|yJ9F|aWK`|A,$rZ_XHkg09c y Ysk*e֘ggt|+&(>=YK|5ۙNT{ba;J2mE o'I ~VĒ@i&aJ2]82]82]tqMP _hǬ(Qqa0J({0J(:! "2`5*pT$Zbd$匽FMY>$~K[. Ű`Ȯ ~mKKzDTnbUw{Fr;dOl<{$J|Kbq:?w=a~Y֖m-d) `)rQvWDE8j`R+3)):l%dP%2QedD&Df*PE{Lm, P): JYjR))3 6Wq!V!--*Y=>@%GFk=2Z6_;+l5*3~~ܜblc\3ah.x5MOC^eϱ\qb!v_ G Ur'JڅvMam=:VY UayRIH0lpFw8#K| X%r,ott℡"⸑ 'h+P֋qnXr )rP>2ɞVĚg]Lei^ dW芫JU%jQI=p(jbJTs0yt\vn,$"d.LbnVώLb9:%ژOv;XEŜ-Wx3 J+FuGяYJ;bFZ΢6Xe&eCl7 Mt_De]B6Dߪ ͣq!~Rw`d:0@YI<ݪX{FtP"?Oj)vr3;(_نoւ]5UYs^4(_3bu"H[#I>~cxp _l@i5s)6s b@@ tӄ"DXa PSB1+W/` qY)I~ R sq C2ĞXƢTEe/$ˠyJ([jV@,lllvV&2Q&*y)0@2S8S8V(r)eSʦddt$JA߁+AHJA;+RJA;+zN({ժ|ej偬q ƀ"YmjrrYDa[.'C}r5!mηV DKȆ:3 W f-Gԉ^ "ST RNf>DOuf<'@\ nȳ ԿrLm(9iQpDFTd1~fo2 OQTWҕ4v ([KדM<̓Vkq8֞hw29ۢ#~5OOlR#IQb ω˟>M~XW/v>68x4u|wznr rӃ{޺?7&R"]4jg}YmtNjLQ$$k.\ 4p%Z!%h(mDD45fH1UK7 iuǐ h|]c}ǘc vv16:TKc<nPJ"f1Ρ4cNrwG%sf_mr{j/^=?éE_K"(EwJl4盡fx@t'$A{|Pd8% '?~!b>Qh \/}Y1_L%H%΄yriG>STj wBY OY=[igMįԣR?#{m oW`ϋ kՈk5Km ]^NxvZ4HFIB!Z@zN9meEET"bWD+U"QD$!"*" w&~߳ K9o/ׅ] UʖH__)ėGːFqCk_*Ͽß6E-jSG&mfkMsQ?i%U ݻ='9'E>f*j_/Q Y 2K1U}φUwUs$W%m> Bix9Zu+q[cG"sc:>FFq*Mvjٓ%$(lҮ]*^@<dC*M1Wt 6b9\>oϨ#ΗZV,;f~Yv|lye՝fyFe=]o]bԿʗQ}=Bthe;f"6d{ȼp̯EL,+m,r=,~ZugZ8cZ4ך,oV E\%pjeF[ʚMP7l)t􌲩eMoYﲗJ ={k)f?ujr :VkyeeZ& qlN% u7*m(+-MJn,h0}|~Vӯ s<$tCBw`௏Q0|tjl310$`@\9zv2u@CLcL:З}YSay~.w0&B5Gׄy&tj",yV~ sy.?NwǹDD~ rAˮvK>|W$>A܀ w ]\{\nenDПe ;H$fJ֘7p!Yy7Nݭhߓ4Aoyh\ >I6q}Js'퟾\7)OGT ZyI&OjRv U54Id#"]IQc.ʄzCHK[a8o'ui]%'uy>L7#Mzݪb5wlמgKƠʒ߹e˹Un.P?46"I;zB1]<[_r_ y|7ec=T`Xٓ ds}e;Ym2Bei߲؏'vf;ٓl&k)4v.?[c(> EcFK4DNn I2g# iA/&.dy" U52am~-m$+P"z!t VɃ(~ؒ] R…u00`uL+ͬj(sdN1(Ed`  RL_@Y'j1ñY B'? okq>rZ  -G+ E?OȌg u~x<&A<z@+}? Q:peF4';OT?P > Cz?=,WR (n'Iaαރ]f{?U)[lÇ p_4Mps74*nmM;ѫB|D#NҘTx+ꃎoW)f_Z3Ao+v;uBi6f}߱9\v1_l5}+$[#3j4sP墳0gCƑWҖL;pkz;g!;V@#ImaQX)+`ZE_18Oi}Ec< =~ @VB PRRW@i_?NJ% %V3%H҅{^r3"Tfh2 ]r7)M❚x 3:u8:p_pl;Ukg;B:$L:C¤ $L !aR`S+#POv YYX_ʻjIL?l^d^`iZ"s'#Ck.33 Ew{ۛag99 Q]ڛކ^]t{ܡ=@~={η "kϸϸlC [;މMeǻ5n3aelK`s&+L7"j%',<6W+&_AㅑγZ7}9*ܯ+t{)t ȿ)_bjf+}Oz?Q#}W=LBfܩy?W&+2I ;Bh63Eg#J 25T& ` 2^v$0lz ޮb08q ʅC.tB3# -~nyBuGLROty(zZEԴ+?ʙM -RPI𣈵 6` %ZB4NbBС+X]!b]! @bͅh.sA (P.( 1.˥zvvvlg+~8]p 觇`0KԾKodOO>f _EUO. 1뉢#\FIÊ?{6)NR_+sen3GsuqMfS;fi:a4C!c8oXYLP8͡W41QP(P(-йwXfK &LDP-I0|?wf$'HLo=(X:J Jmf#M`GqJ(Xoa7R|=h:'`)_T|F1JN4\"Nv|l>P=M+.8=DC؜h>:rɞioqK)W)HSW!/ ՘>{5ZHWOW̷2}S6|YZyqYaY6ee',6n mƊ+'xneM5{;Kbٵ R"dIV.Yfr imeN[>Rwqb3bUg5E}gt)O%or2`w/aB_a,縯Ƿdٛ>zG'k?U̐s'rNKLԭ9@PB'¶'m;gkNك8WTHC9㄀?G'{M4+) X)KCZ6br| (gl V(@PPfYL(֜8[dgD[ 0EAooU+E+˫8~QA\K+eOB9Ų~>nIqWAGa{7濡4p\̎=`+A2"~+ lʊ;*rA*1 _啡B BN#:_[gw@d)'JR Sc+_7QMMg!!a'("q=? z@[3I@a@.ޚK&܃fFn[&ï)=So$S6Bי:sggzqX;XKzΠi^?q3l}j+m:wQF^QoN=0akF?pZE6ݞ ~i%+l =&> 1'Xpl+r hHZ pW|WJ Q?l![T(Ϲ[zvYTy-`'[nIlIK%N!zZIc`u]٥s33ѪlC"pH< ǪK+*Jj$Hصk;ē!j!yՌ<(%j ©NG9$>usMMo{ȉ1)~PKg۵& h`Sˇ.9yW c6\̴r@ƏEP00zB́ 5 z6GAy\Z37;m%T4D0vdlC:eb .n88*.m~1fQU~x*K'+zl"kQ $=Aw}GUZC*tE\0m3d%1OrAS[z5> $Z>E;~aE3%f570+eG!sJG[l9+gEl!݈dI{ &V9Znb@{Xv(,ggSvLB50DpsO)PcAN2*X6X 9. ٲa ̒-AW8GZYuϓT0S: %c>`=8ܶ.PSxU0mS_hǏ"݉GQ??[0݊+Bv a3ֳ/P.)@K/n^Sj|h֣pm cm5C}x1fѬHn ICe:*~jc*:m=o;\ipݗmiTs5_o1c tWQjz?ȿ˷?b  N}}/3_]@IuQM 6Yhkkp'X = VԨK$(IDhjy,(ej(r`G_ L<@jk KAM  \~՜7kV\O. vr"q(,0ۼI.yyZ&»\wLBsGҪ3,,0r}?>TmhM]Va96Dfun20glqpkV* __@ܚ[ZjWӔmj;U܏ x+xŭVR]Z|^?2_A+}7Xp7)L0e?>?2ȽU/eb_ҪӪ&|eOϟhߍIW{68}7`?{ߚ vn_}#|Mĭ䭵JU2/ϐw3h!: xt}g47M-gϐPLy[v" KeQj 0pCs74W~<ԑbkH qaUgg`|m9w ?~-  qWC-{ $6kypu6wM\7Il [ ̋l6Uf`|rϿO~ H  ~]t]eq0К|>lGx~cg`qK+Q=]Lb6L{KjGtYo"oW{飷CɭG÷vė622jB(}R9ANjW^ R ,63tx Zj֧h3)F=֞Ѱ~XD Q7m\W˖Tl,ӇUE}mq O/J{kbMtłW{H&Қ]Tܾհ}OmU:4-`eɹդBJ$"}yD"D4N5F2aܹXr iM"h-cX+YoUr ht-1l~UQX`kh[ 1,wAs 6g,9υZCS8U(#dP~Q+" N`w [`U hQ^$Z !%E8 B1;- >B[c_l0/?XUT@h@h@QԂ67PTXLH! R$M>4|x1סI?N㹅.d#Ofu`Ud wD#h4ꉷ|%Yr:7̎oc,m\!5Jq'xWWۢ}Ὕ"x . *2ҽ5̊x NC~G31#ܸA;wzÜw9Wܞo罷ڨ%+f7Q /;juҌjtm06:ΦWbrYbid)'s iN>Ý;/ z`97-'gMW|)a-=Blo,7au[k< X GKea7w5IY N*t~DLٵnGT,+!4-@0ԍ?Q<~!tmB4YË`x!Ď:B \NhGΌy^pqp8)AG gwp9K"~mmSڀ+C`3lC[u^Vׯ^&`ץqf2IF*MÃpW}Lнd ϡhW7*ܿ;z~q\eyjs%\BM1/M(Q)U ZvV fk_itů|{#/]H'i$ J"?'WٱqY烸;DLM}#1)y,<ҳSqxN+i CH X7|MvXZ|C"*~ 9nX7f5i v# 19'4QGpD4p]=fj6YI2J z[g je3~4 6O6<ٶ ߶||PV;@vTwGAi)MB@* /U \B\.\ہ9o6 ߓ>a9Zs.oX C80~9WNJӧ56jՃΟG\/zx,ͥ܋񧸺ƲP[[n~ӟf>Kg,6ADk #pH̤[z2.!zISG֐x(F$܌@K#wQ>UoPe/ߚ 򘹞?n560:7icr*L`-qcw0{i7l{SIPsp?왯-vêﱳ^[b%_Ӝ* kp[)=Q`/c<؇ \i)rN:6A(Ju2QCYA&X"l~[550TkiB|2 JځmxP'"(   Js  J# 9"P5`3qj p`h bhX$ y0 ҡO< jGKr#lzf33'>J8Ąd D%^}~zh|i?O O&)9}ToX<kW!xF1QOhsZ)yF_Md;+1ßp6><M{_3?s|vR&:%{$;U?I;~֡PwLmHn#H6 ߉Gס˾nqLcW2[=?;]h '}RTO"szohCҟ\JX#uda0Baud((ΌӁ]U jR`W$J"/ aJUR W$H=3# -`L {D= "9am Vam \`h(fD=DU]Al:˩PTi Z*5k0h ep>0,ӶܶfKW' WCElrU=;jt\{-vD.[_tgrW\U7H!+v*}7h7Xܹ8<2FձZ¿¿շWӿXnPXk$Y54PڋnŞb;b; ;vs? _73;Ns9u533䂧DT ٩\SWyϽ|_ykV'aelv_qb"`(Oc$BP@4G$Z$Lud4!h7T,$!RC>18Xg- pFHo|#Ob\&i%RM tnRK5Z]?_Vyzs:ͧXXM"5U+$_X}U/iyos/=Pw;U]_ӻiBT"gFMq;؂dҘ@8_J[ҞNk{8;duShAj,'8ߢ~O1mLF=`_3$\kxT.j7+4ԟ*"ʏ;vj:H4Y߷ 'OwJQ=d@];~>;.}V~_kjꧾ%y5/״=NWWS۫J*\7&]ogkǛ&׎?R[yMgPڨ}7!tYݯ`UqUAG Tx."~$wH:"7)"D鿇4@ڱqcVF-%*\hX,Q86Qui$AoիįɀŃLn䀐G%@ͮ oɺluf i"#DJc)R [!rt;tw jt,{GtylilTV01&es,aAhPS}8`1("!9JC5`Sws)TYuUr8t{}PW燺?Er((+ѡ>̕F0Fكr/]MsSy*_Ϗbz4r#?nr7IГ'׉YѢ^Ỏ6/tʏc?w:yc.?^_1}:}Й9t׾tLӡ3}:tOY8E,O鳠?}%oWsgv^)L\pѮz 8O{ -,ϞeQwc2Zr"z|EyMz7͠vڕ%9-bE}A<(2 !Cs:EW4n21b O؊p2YnTQ /4Ki&]$R?#x \"Q>WW٤tuxgy6x'Iya%pcs`f7 \L 34\,gXx(<ߋxTS'b\D ߢ)dcbdM.>2jWgAm|;&CX2[\| ߥ5L@fh VծY5~0t{Y'fHTYUVA~}aq.[6{d.ZrA&? &to~-_ 0%oFt(}U "\lf:vh.%2.QraGqvinK$s:XOvٿȘiQWꗵxo8u~AORջ];[;4i2M`/g};!Oy>zDÔuq㏉1?b,Xb ]&6?ׂa -'Y{-]I)J@r>5~|Q#]]8c 6HSqr ,2mV QlXhn2JNHB]*ENfP/@d!mB~:u0[90sU9OKg  tMQ{A6iQ2oFDZesO9Y<{˜BGkU @lWb=L $$ۙ E`*`Zx3AdѺ:SQ-9ZyQ-G'#?ӧGk#V7F|wh᝕^ᾠ|2ugmswNV>vTjw E+qe7o7tUxx{E 8g\&WQS)@U_Hznu-S˰sͷ5W87ǻrO>ޯ&qUV5t~_UݥBUT>s%q?! v$@r?J0Pdu ",lj?u~ O6:נI-cyvL:|ʛÙ0ZVֲܴۭI6 &ߐd';x眲ջ[O{{r' #Yk&Q| B7~}7sx#ɧ^܌%=e R'L(B jk1d E%GJ:4YNf#sqCYj~K,6ѻXnxR򼋵߱J.rI6@[X|;Ynu9{o5"'@+ gʠnZ!&/YnԻH7-&O 0VS0V|L* F6F]^[!9*^-ȟ RyAÎEj.`Oi0!'?\  Frk@unuPݮbbɄY/a3;ճ˔@g`.vv)Ho`n jOi`.x匷;s>=B vӅZT2ygGXiViwRf)NfS `c7uN=o-hq4"ZX "Η)#A\ cρ[CMHlpu`0tn(k}o@ؘ(onvbcK9TقSe~j=%)XHeN7O8O8?pƟguʲ4cC5CͧYO.`'M-P6v3tFٌΚgAyo7$:}̱R|t?/ϔ7Ϲܘesx(JsE{W_3QxN!0հps9jZGWē&wdz /*E/jXM,7{I5` F۝$O\ĻIw=wuׄ\ědڤ0%6O4=B O9&H4kQ ]5VB$J @M3 vћw302OɁx_sB_;˺-$D[[]J)\w4dg?ȢXww{? ٙ3 "}iKC 2ɥh.cqPYCkYD Ymc 7b}e~]P(Et?C}bJ1HGQ4R-PZ'įH|;?Zn G1Eİ9ȏJ9 YG;&\;^T]j]T4<hx\m:x)t OB8%ƅϵ'(z_?(Aqr.N8pɥtRz+\(Rvq/5W̳%A$AWRCȲ[hhoޛI0@3Z&ŤHLjV嵂qya\ըY3rmD;Gv4ͭBip,bl?[ 2ڂDF[mJ MQZ)`^-EP]/lInIT;hrguY#6I&pZ6_;fkŽљ3Q9ݫubgԛFy\n@c0@u~sINm> Wx!Z~hy G 1Fi*_B5@c>ACJ G߫QG;7Lq鞩.pE'sQî*/]{rD؂J(Uqy'Xs}T|ţä)^:{#K*H35`Xybg *2uL2лT2)ݬ!61o`PG8h:J:YT58Z:Dњɲd%ʰ΂߱9  Ղ׃@2T:9nD,aTW\oNtWDx3ḓDzֵY [E^. \"Arh"z#P?n Ldgɒ=Llwd;|>WkmmcQ{c2Zzu>ȸEE>'+jE?B&ҒTh FqFx{⏃d'^c4m7۽m(TZw]Ya#rGPG<k0n dvJQjQZH6RFVWS,f#׹8I!PO̅՟ggȥKn9;&yϿ"Gu62І[Bݚ6y$"D2T`ףP%+' WEUK LˁQrɆlٮ mJ@0*ZaJT:\5Bߦ+Q '2~ [`ֆ@hW n@J4PDOsD3 `:@Pf}{N\v  ΀wJ g2XaalvXAfi6u-EoH`S=G^&בxr}U1;=E(I}w>dwIG]MYF8UCF۱tMvdyēNR}v$mt=ɕfNgA7!I%Y7<]<ֽܵ^;,cYxasr%= ؁CaD+Hh{r`,{PNPZɲ[!bMīpۂe iz] aViK(*}ZCHpO,ȑ㕬4VCj_tij0Y@#9?#ʛUSr]x.ȩa7LW*q g|/*Ֆx ރnɸj7L,@ff Vߛj7D/{Vzga 2pwS68ho0Cb|ۢ>mOtF 4ch5zTTh}øK]&NjqCr;{# L{}۸sh1.ʍԛ%c9tG+2qGKK\z{yT4$ZĴ3d'T  OzZC 3.! <;8,vl_BZVݴi5ԵaB/U X S9'Y5Adٵi!}6AUM,~́x rHDR`~|H)T0_ܭM1)S4"GQм.;ji1gBJ! ,"B5p/b}U>W"+,|PA ȗ@BA[))1lXCa2Gl$O毮giI=J߳R),A{TezZb3}'"eVuGZU~韢;gnh5⫉(칟=3s=6Jپb2 4O;]Ҿ}WÜc'S}('v~ANjp/tN&**ɭH aX6's{L(HкhIS ˣG](n PB! H<l ސQkHyl;MWFM,eX-rY:}Ent2~g]* vp>M70὞0H}T{Wr?>Cw&^eR ֡aX|cn$\0VO7-ܦHnݭ>I琹$D[<0~İFwtj,%Ridxw4 ^: RxS&׈pCCeZ2liGCVtyo ~+EVpCq3 Xj[E(ƍK8 ,` 1-ts" վ:= ,YC5prC `Cmiz-vz)mXw zzWqY6[Ckv}xH_VWNae:$$|Gim׵[K>挦C@گq_n"(+' r E$H-\3ۓI=4󁼯]p_} #Wl@.D*Y-hcSdUƁa#aC/:*x 0r@;2Ad>gӮ+cAWƂΌ快#z2dPa'r8֝v@ڡ\Cd7 TW+ L cֲekļL"|yFLf#|0?y M:Dx);:\5>c]^ȓbR؏[BuNr(o& N<餘"j .$3'h$^M'f2|xmi4%O`>AVZ u}~-j%$@H;hr'BT.GPH'm& m4Y'vRRrRRd)H?)u#H͌: @V=vUy"*)*٩YPh@_f!?w E7V Ьj ɯ@O:(逨!tTv>& :VV^_˻N/,-ST4p B["uEn 7i50?V$SF5I<W-wyڌ~#W=7oÃX0y*}4xsͺ"\zn C_N2]Sܨ5HsiD?!׃ݙYeX2sxrܷ(}%GJzoe+pVN_<erʵلlUY%>i i*(9s&0DHV9#AƟAqRLJ'BҭZB_Uk!#23e*-0K>DAILTGk:i~ C[Ko^u64ifCh6B60C!.XĖ,FQhUeu6s1 Pď9:_fgYo]N[~n:8^_uFn(O6cWi3 E]6YQiɲؤUJ3~ӭ{Y\\o bJ瓛5zsf?b\{XZCB5Vݯ1}( R━TjQڹEv8~5בd #钚q?uy;չ-kj>%뎧'dGMm& 0~7QZhSzHU>r᪏?f)VU~K,ᶪkՁ5F8-¼$/Ul!bU /5X0Ucb!+cegs6ZY,&C&o' DF6 \h y0hlR6 Ӵ]<%L'Icϕe;b7Hu\!! = MDcblL$R?:ԯ`v>iځuQ=\= LI˝vBK™䢴^y>N[џJ{o)it ]A~ g+0:<< 6J&;Z#qNF{\j!Zcuw^/ހCI#$Z:$Dz -kȩSvs"pDņ`EDDT Bׂ5;ax]=ss^띵^]s)6'rp]/g򒽧G}e-HA :~Ƀ@kk?'k>' ӯDS/kWuͤ0Wt5I_*  .>"pRS.sº{>q-LG鮏qP-hIx> $, cid^"P#TYh8`py*Gάp);U#a VBrlB{|M4wG|x1lgfh dbcd{B{B󘝍~b#ة/x6wc'Z;]HY/ү~ʱ1yc-GX/[clVmBzҗLg$}QV{]1Z"Z*Z]t(u(gu.-܇u]Uȏ jNzwҧ ;]-!V -]YŠ^d3_!X$D>XtI$(ק ҎYjan}5X&)٤rs=U+fzlT )u3`Ir\fo? ,egUHtzeU&2Z^2WezM " Ҩ. F6 zbMii4ƴuyڻ 85PFNITC\ 8)A+]֜ 4ov@n;xfG0'GzxxZ[d*JG Ү(p:*{3O4h~b<,4w>JoBEv__"˘QM3C͡gm덍h-ŗGk)_y$WCOҖjs9'C˂|yA-k5ȔcM@P[rHEAJT<"}λh3G>i2~˚rzX?#FE#m?>lom8, 6x9G0Gk6.R&eS}hWY b{/TQz9U79i} >M✬ 4ºSѽοf]2I:l5161YWhg;s ٤Xat3R3`yVO1./t 5!5I Kj\u;ϔrQ!n'DGҝʊ;F3C>QpQ_ގEI[Le{.ֱ8ENDv,w&vGf`TW^wg{(嵼z_829]Խ[#{ĕZƵz'z}VK/Bj/_X=-vw@KK )|me=(JP\ۨ ryzx0.gZyϳ'-]_k=D{Q}H;Y}5ޢߓ䛅Rh!K~N%Ol"kC%y% x5.vd}q7HIs*1ilc`h^lT5ȫhw7kwYC2xTLJXbf=Fx(޳aN?#xq"nG` VZv,ԹRg$VFGWxKCQ=NQPP]'E9YE^˛x;NDPPqmc<_Nb0gVb=q|KuD8RV]Г{+!9FMsٓt8<Ϛ"7WdzNoP9mIK,c}6S' ]z[Z3VJ M۬)31JoMƑ#2梫h& /W})RL=ST (L*<1S<[lO"`_*V7%{z#~C÷_7?oF k5ךmY )[zD\=p(p&rOUthG#51H@lk|4 ?]'Yd/3bxG| gi5ݩr!'*\RjN;:+.zap(4ښ6c1ok3a6y%zmLÜjƚ*FnfemA?#BPZʵ#,rLЧ F sٟbX%ހm6H|'L?WNj<uC4A!Pd\UTܶ1c9yAAةf!H"E5]P)7j&j2]Y}IW/X9d*휉`23M*P _+LFJFJFs8d4bphMgĤ1: X  $q)nHUٴH̪R *˥+|Piy>Af>K݌R7# (%V`x& N b b#N"6ɁÈ1ETiJn1]!DU6eYvPA(-4kKr/eoǙb0F,HG3Z-=K;,w}g}{[}3^{ߋkIc*YNuLc݈0MIc_gmヒs~4ɛ{wc1gr};IcYqlI#͡_i4ɴdڂE1127'QqJ|M"x^VeMVX]zzzYzoEY ZK\,I=<ĮSf&t*}nsjz[gK[!Skȧ 7WGׇl.[|옷*5K|8FŃWr{qk-r#wÏt:2î[n|e pfXJ }Hs 띨5S,5GVd/z<6J,ZP*Z5<&/+#LPEcVѣ?LY@jǖU1JL㆚ ]Z&)dXFؗTɪdV2ϵX^S5ѣYJ&Djvͼ%5p9.od` ı g3 W g@Og/80"+]v0E m_Hn!3 G51J⚴`Yx/ Ļa&`cx-L$VNzvTHYKa;Im!x$6W0}]{x5 pMpMpMpMk\tطlYH|;5\s`; >5"΅~Aa t CLщR݄J@)U &g>Mi?r v-" кA B[B (m}v6Pk쿬[-C;9Y]mkhu3ڣփVAm4ƉC vhBnX'"USwW?No ǩxǐ/۽؉WKԭ]vYDYprW+!͕w:D~-s xieMRk>.oW,-T0ƙa_ħ9[`a7[+pHW:4ͨA85h8k0/tҠ9#IWQ1 _g"5^ymz'G%6L!'GF%RGhH䥡$E`+$ [;A/GNrQ1h?xHl'BX;`/dDS`;hL~2X2ӐDYhBb~6l$V\ػ]a{Z[Ik Z [M7߄{.?'oPJx/*FSX?Xj4LO!$VڧX?b`{ԟ=[u{xSmm{bc|, aDfB[o|?Q@7VMs:NFzu8-e4jYm6НFhMœy4^8Q3_g@'u~x#bX!{=?m εAk /3odZm ^l21-q0/q0/q0}]Fq!30j.8 Z$>ByءA}ԩ['ya_ 3?: bo.bYg\ {CY"{ɾankI(K{<3W_H|Q _#Z׀_k;0v>)}Mv|~D*Szr/u/8$ߒuw{X.ԦM֑g/d4N&2?B9xg_=&sQL,Xſȃ"ϱ6t'Յ!A_(E+o󄏢XsI('ojrR=uw_V(lRHZVK':QML':Wz{mU( 1^>Ww)|5{I>x=so7UZwwLym)fu2xȃfl'ی˼h} Iq|Ʊ$#_xU#9FD:?ROO:D91jc(|_9_ '!GLWq<:0Zg#y>>)c\>ƫNYFRKdيb,Pܜ]y;w?ͽ6󑑣}af;̦c׮!GO4fYsf{bx]T֋w` ЏnQ‰xoj9/I݇xV_]{[zTEUAHIF\2Jzm2;'Ġ<6oY4F_H"㺷1]^956 yZ34[`b9G㧆{uԺEm%qّR+"ij. cQ!!Fs8X2/_eI0Y&#Tٟv*6/<,"d%ǘ%C :hgbQdqweJj[#gKŵTॢ/S]k:T1P5U RZ(ooH Nj$#1$Y V̺$fZCA@YpKVNj~ NHǭ]d3i1ͱ&͟p.f{ wN<:yE:X#,Z9{P+vW0.ډ0+/ihElnԛOSQ*2 ˓1ɫbD"&5Ę,,Pb%a5~v $Ul-FRx?&x3umMkk ・dHuLJ}<{Rkhs|\{ϻП"07aOX/nVk:a初0k0AF{j\=㎝Kcq%*F񰙤jSFKaOgԶ&3ΨY=5pDjF(_#ֈӑo,B&5,S͜\qx#|: $ HGj+Ze">kf{n0{'|>ˁM.JOIy7M8u6 Z ,% N&tuON*k8 #635$IOK9MvF&֐7 yC6}~z YWi{N4Fߠ_wkSG>؛. GjgbX7茣G3EʊJZȏzu}x`_1?w; ojQVkAx]oY 6v|wYeCt۫U}#ɰZ?Ùu^E;#agg#O^tS].zL#{b.\죢,%N7Rȼe(3YJ vּ^ZsSkTC{jhu5(oњZz Q_|/+w~l "U,ӧc)z6){bK+Q:||c"/I&}X+7(6HۘԼ~edB1}22z F vs ab a7 a0o0LUa5`A;bzX8`h\(D[8rā8Qt0r<yNmb Uy$h2"^z1[E#/QzGkK|&BdkşkTߊbKWC |Kv(,XՈ?jOaP ڏCP̰MaQćK2j,STI w7zD1K 4̜(쨥k,q$3FC*BF8h"8x"[ '+"N'b=g^+9XAr!nBOk*Ydӯhd QҍN2%kG^cg{7[Nf7t'mJdy޸h0 f`6J z} f2<)34w;,h%f 'a$ެ.Zd,Vx47ˇK>cq%cJ&IK;׍W=6{*Ne2ŕ$\IHS[TsU,YqJ\߳8i(Q6̦ٔj&~''laWnd࿭OmWnQe%9Rɨ6;O2 l\5pNygxv+:]Uwc J{N_ 8 w24im %?%|95);DCb_nuG/Ecy>`', wE]*Lp)q@?Sj?!<YV co?7=Y,W|S i?7Gg=,3%"NZ<, >SϫA")_+#\+z)b9Eq_NN:bښi| K!֑ 'mD8m?%]ӃPg`qpQNhyChp`^C(%T%S7pi?NHNz pSN)PDH%i G(ZB.P8S(,?:yA'KN}Y e_͖ܝ6h{EHS7 O;S }Ļt#Gd,4&ߑ(s& C- wimDAhOA2§W7;:l < O {BˁV Z`$thmm'vo?[à >XS9*QRTF٢2CbMD5+5tTKW9tCC@zb ,z#1j\F:[] -rYxr G2Xv)BA$WS\B$%<>' z+v*)u#Lm`aXN^RLLgD;1u:&Nw͂觻‘ QQWta8:J"iLI)ECH$tI!LzucCvg 坹ܖҚl<=Îze|҇d&Rz=}5G3ގ$Сa8 X;ɡQ0EnaJ-VjpraQKzp9mw|rVzpJQ.؟ߩ)8^q(ÛDj(kP&% ]-t޿_Dj"*nʱMZVr ue!M#Sa]zC@끈l}.K\R`w\]{Ľs"IG$Ym(71У rݭU؃D==|>zpqI((\q)1btD8+Y:v5Eg~>!yRЩP/~ - ;PעWrsv >|?=ٚaJK,M<* \<|?'wط9YBCZ+`V-ko5:: R Vhe'y^Ǘ enaOGh)z]yf Ō2vWE}Q56ٺJ [d-t?.mG4dkP=-VjH1% ~ I1b-1 HS@\k}o8\,F {=]lbWd////ʒJ;8ziI .-tētDt¶?Ej'z" Ő3Jrc^Xh[墍x#ÀrT>o-0.}2C5iZ-mзvf9jq8Ѫr(_8QIԕ"_U#Q,,aM率ɓ\Qki,}t_tOɤ-"BE[hSۍӚAӯ9~'M+}n4uWi5:C}Mh{sbKkF-k,U:`,s|t?zrYMfKd 8\Qɓ|N6{3`=|$vK$ք=b%KPpbB`PPЏA w!<58]4]~KB[NPJhD9MhT$M=$W)H*;dX`= Y\"èsZh@/cQa/ =M)' %F32K ˫[g& ұ}ˊ gnL-+< ȩnu=xS/}/AJcRc~C#5Hݩ ł(X-5*SϨ_,6YoXmQ7<OB; ڱ0|:pv@; M_4Ќafn\0IwжC[ Bkχ pHr'* %~_0FRHRRJNT}g˓ G1XjAY) yRȎy0~.N$ihw[m]Akd{goO35=ds@'ONA@lN$BeIf~6&$fn,<3jY ܚS\:yJ&njiZt2_]SSG-]|۴<;x(CwDO Vd2ޓ)Ꞵ 5UT۫5qU(k䵗(|I G$2Z%7TMD^N\}$ k#{*~bO*.ЦbO*.u4k ,gʥEarVҴdmʵl7{C(WgP^ʙjfv [L)T>H %I#\O78r'7=ʛ煲b15ٯ2E,}Vz f/tE(BD ReQeܿ ˕P]@" hwśڝNڀ"bw;enl!cə@A jD-O iR@ZH pbeQ01Hf(fU v u U fW=Y߂׿J]K)& -tN1E9D+l yCn E[-ozu'KCMݝHϐS;.q4ݟz;hwFc Y;{ Z@+ ԂmdRZV4'] 2hT3B{Z D%㨏4]@{ڽЦAmnB mS>[فQi aെ<YdxQ@bkJz_u<f)XUJjXuLhmsIk%9dRkEh덽F"pܟoS\c6'g:fusK"[q:J%q5gZ@P/j'ǂf  0U%{KkdowN gVxմݤehw 8'Z1`\LxG,Z/a1.> O_.ow"`:fwN`fGo7CmCkBBuh<l>A-8%VpU0;t1x,88QY5>KxA`߇ǫP֢TtJ$IF'tV.w_Υ36 qn\b+vLjǣKB#9A ǔAR]E@׫~7j|KVҒHC " -Kdۦ-L`+S1 4U^%3Zy֗Ԯ6GŭW9[7Kj۲T>ʐ&W:4}Q=PY#pYwei5MZV-TXiexEkY hieR iHkC$Z=q_Da|Ɂ;k/#rn%|-J̢ EVo)Eqp' Olg~i.$9c/b(=mukXmX+)XqO+Y_vF 3zb'OUb["/1g}-Y>CKh?BҕfV%Lħ{*?ͥ`\8XxԷ'Lv9;ZM <[֓w1K¯)ҢXZ8qx fͲZYs!q@ou0j<7g;OVlł_ vUwA=~ 'j^5T~%o),I\.͎mX6BQcT+L&^ejby"V̉ X\.'g,hcK,IX" 'Q' -I8oIyKMVHJe$$!$aglu$- Avg:-v8Q*!TBDR 2pՑ b#ë/IK®aЖȃ^2J"q%%-<(ТMbLbM.\a_WNWlI~L\ `h>pkx?;NT8D]NTxfo'IsҜ";dLVQ]}DCj>ġ*vP0Б TY;mT!FL XqQDcNT(UvEDT 1I *'f:[KfDcoNP}DjX>a$,o ~/!rQ#]OQp8t|],gN\ (L0M: t[}onCA>0g>ғto&C?7v5?dž=t]E}q{ȟ (XqĒo5?%eiAF6 ǼhIR%5@2z:*L+JF+% WHtLT vk<= 1I!Cd\-ߛ Bn 8wщs?(A'%%]R8G*qn.[ihǡIbvx)'抙8Xr ,$:YO}.9I*H;|*iTc!1ۘ J}Mf?;jH~Fq_h 艢VbphgT 70ضsīRz5Da}b ۦٰȇ]b ^?W*F-WǩP Fm41WJ& C?5x~; {e8ʻsἋ0Xڡ2WJ !2W]лxchjخr*׭յε`{vخVWrT*W0F'LD mqTTh5&&e8omHBHBH%@If̜IJ"tX$QQQQQ, f3k{5O&bɞ&pdO/#ٓŎZt4ѬB)a79g`~Ja.ToJ|Tq[n8U蕊 +W5 c[B-+A{P`U.Ѯ@0KTS/_u/}:]U1WwYWfut:ٜj[Fu}vL1W1P}pX| -3b[?P8Nο'-'"Z2"@TtpԻ3UJHI"]"1!uQ$p,Yp:ɉbh}*cleeXb*C }XOmU,SF#FOuǮh`mJ]UEO3'*GEQI]̐ Yj?!T)SemMB6PAK8Ŗp6h * 71 A?Ɉ2TpC)Ȍ.|y0X _AƗz.|d_oXJ_MֹAsv}{]bmDZ}5Ewg oXA}|x=wYg_wr:f˰wY>@|o-.Yti 8T,F۳Z.^{`,@ދD_+_ìE —gl*',O[!zɸ ћ2ZA@? Ix"1UJ .-0bB%zZ \]Z`2m Qy@eZm:"M:cZ:z6q1n"'mp,Mds"5}=MG,_ mJ7؅KY7b|/Gh!whN|Žw vTW=eW-VVqNiK7vR;ýZQ);LD'U`62Z;v, GƎ:!usLt =f⯃I4Y*Z^OuuRєn݊+nusDw5U=pz$NR8Qo?+1T> oH0Y)ׅ˃ OW_d~VH$诐`lċ0.>5ѣpr!NaOL1jgAz&(td5L:p< pfafpˆH߂, } bɐpy! ѧ я$EsC@!q).rK΁rx8 SCbKj|n=W@J 22#Ek_%fU*/ $4qs*ٿf7L(HG|g%N]HĐLG ?}v ;y#vX B/DZ1˷Z-zw/[Y-ͧc٣?/쉅a~PHCcsefqzIXv\,;ھ,>bx@;uZ@KXN)f-b(-tR@"U_ XN*?u.6&NUn?+q+\=OyId,-^wãw1,wūk+H1 XAr;hy8`.RM5C%vkcq)ue$dI,č=)_m+ř#6FDmyč117VMs߰cibʢ#PqP齽 s:*msg!,q/lYrwq8c?5@SBv`f[6+140%2=E?% ~MGPѹu`޽D^%#id=d+e-ֈXM~k$9 Ѣ/_BD/!OVoY"cN+ʚ$h'bI~#&l8;XmxJ"Y$U$$@֑r Kӎl.[Ɵcl+2NKmuP{h^-3ڸͺ++r+48e7F*qb[$nVթ̕2N&aW2R# ez6qqĠS+ TW5 TÖ3iˑ(P VH:rt=P3YRz u)XĄ3]вB* > *(jciv-4ɿ )yG&1;jtW[%b @e 'h[$n8iYuBC3#Ѳ4*;ZYUwvweho+kh\ =ꁱ2:1#qecell8Piec]6`X #>${VMƢ]6m  2 wDBhy[Q$ƇM _r!@н9 l=.c {2[^ azi/ߓX2g6[,P9*P_nX#I=BԆ ,#lffN"L,EawG;x;n{"N$5$NV8*` gEH(iXQ SZS1-LS2i iiy%aS$KwɨD*Nz*~@Fd6: e#=L,s)mtYh݄W`)<3cI;) [J!2Ys@ĆgR1V|V6=MSYeUtOj J8 a*ZELE{(cR9P&W}5gsh55gs8t \9O5L|+Sq@eCGܙkюGGP"M]4\aqJp]{i!RGWdHm|u4ܰ+,)i{ "~Mst3r(ğq2ͣd6y0 -,XV?\Ka$oYxO8m5- h&f:a%=[]c,Xy-Ӱu>@< Az|-dϴ*ER$J7lxT;&*Eyawb]dQþ,4ybU"vC;M&kqޣ! W,4Ez!eQ/QOK<+'Fz;{$IV Q/[F6Ze nu-Vv 6YXt8<^שjAX :=rm <`~̫rG$C&1GF#$E1" >ɍț8mAqڪiD'"O#Z4Uǻ^d>`!uF_ԟ2j/iS` &N>?wO k/VM,QlY㩬}wDe_?Ho|/4'iЪM6HZtYl4Ǚ%$qV?767؏0^xmaqUXa=h:̄Ƈ0*zvwVWɷFzSë/1ςQss`__}|d-EG ku0Øc X}[21S,c&_]GW{&F%]>,[[<{vޏHm7R-yGs źr5?1'Ό+~r7`,1*#w[?6*uZ3:G:ѠZ=92A^+! Sr;RғT58׺d1>D yY|xxݨn h*߰ګE& bX #º:*hxP|+Ջb߰g~\{|Y%zY+~{誽JWUlHbUŇc,W7EeE9uu UZٌDm5ecq#7#PW@5W9#PW@5-V }*<%1"5\8JV`dTVwacix6 4KjY@et[ӱt]Q{M@e=p Kg<܇:c[g miRgCHyErz`ϳ53Y2Zm7{߈#P,G 9`?v,?L6cyz-VCsiDGS`2Exa5n5Z`TXkP>ШI;l$U+E4D&|E>}}5$݀W"hˬ7 st%9%jۏ|[-| +/Ɗu~bX,4f3k᤹*KVzy` Z>wx;yd1Yu_&]z\_/&į5ү@?hLms>W6P4uYc!5rڐfrYyԂףYk H='{ DޗOLg+fM96/d3yAYNޚ&҆rac٣8Va[t<)6z-F3$V؟rCvđQz +ް:}bݠx8qeWj`H$WeY$`W RCDbi$FȫJ QO@R'aO;Tx3Y%HFx&5 0_jAS%VeՎ^a#Ck#:Ps$I@ѧp쁱g@;{Z 4DO=QWxo7:9ِׯ䖏_v 'V"(ZU|Fᓣ  hT~_D}"J_\Dшq"&ÕǢHqEA rBq2+FzDžGucQ%ljAmǰyvX[GtF_>z1|?s`w7&A4[͝Gfhg{h풯?P>:n2jY ]$,*A%)d9רk4n7BG3>_i?δomNٽ[ud!)3S&g. `,}[~Ἇvښ%ZZsK MbQ Lɰ>l [ֱz({ѱ5 Ѝs[1a럄]vVڽˉ-j8nV)nx^;QX*R 1.ѯ:ڬ@e{eo+Y 2r2֝ O&yKpVZiFFջ-41c/8Miili_yw_?],Ocfea|"Q* ک30։Uf#jze«]YCdW5IXQ& * 1+ #e0b>IE'eų$u'Z ǖ\c,h$<"nO |(%bϑ-N+ȗ< jZٷAxIqcAd _j*O_IH'tBZ-VYkf0&m[|?TƺDRA$s?jwb>x\l} aNn~m᪓h }$e6Z'axVL&gzoR Be6R>dq"y|IZfl>^bF6by:LVLI5_?o&׽_ir%?9֟32E{Q^,+DM+1`a+tQ5N7aiG gtuy%j<8pՊUEIKףÆX * #,a2 jHVvv@FGFF-HJpJrJmfDU!ɹJwi4ag heʼ^5 (0ʷ#-hy/^i^'d890mq+Fk[< .uu+ @xtVH[d\!=n=Gdn%7yM}-?|KX>}H"x>Kh-JKw{Irқē=fCk/S|l[>ρ<>Aj'ȿTP[wl2zB 7/ڙKnYרk1Q|c{n.ڊybHOv{=ҾS[v/i[v[v{(N#P:u/!\vƠ\p wldr[>ܑ6v\( $=^a QW+i0uG,JZ_KNsa֙`$@TX2Jb$VUllbX%>^wDf >'n:ce9ìB:n ]JGVq#|뤙k5_1 #Ii_pMdYҗHS)\_Y,iBjXo44Xл6 aehAt} X_wyFeսk2}b%`, , 'Ja{aVqaL1F?v-hk,ombc60᯵sxWZjȊqn4..Aݽu-7uF=?s+Ҟ3X֣]^[wm VO{lv8Yrup{=a zaLxqMEU)ҧ4QU)5ʧ7i rq!&r8X|.K ǹfc^5P\z`Mn=2ȆRv@;A}xL{;WƳ9ȷvmd= 4'E$x3s; dhom.tshYތHјqΎ LQFmW>yy.(l*JHyX߉v7{i/i}ߗ.8Nިn$vh ԕqPbi!LeGc刺*cީ@jPǫq x oi&}2"O(dx;uR0ݩ?-}uq7PMU{<9t`7.~l~5懛Jnr7ɷ>| kXwzJD#N~K-]o-羛WN;쉳=9-gZ,K,T#$$}> ]z,Oz>t@ljfMyL' ^GR^8= c#i00j¸wY;kmҼ$X(lc4q@?OX'y3g~Fa{O~v+i'#9{OE _,#sk߻QF1p8tZ*:zGԔuR#G̱+gGb|W$ZpA{;y!WW^MUISNv""{ǖޮ,8RҊn6t{hvcAv0iEK/}{ǂrjF wcoe-iy\7|^K}M8Jm>TZӲ Bw`JW<ȈZf/U}[}V9@v?'tIf[x9+k}E;k-t1V%G,sD1R)i@7XU^WelWIYډnAf |U"Q?W/;3O%oD1ڒ fmǑc;}FY1+,֟jf53Ҍ6'&+dch%zFGf#xY*3u^Wex\&4۞mW/gϰS>ExD5g66e%LI/t`f (dh1e5:GGoyN(E+?h1|;o%3v ?O f[6^>'T_Q㢤EڻvXßb;سl ˚ ]:!ݭu%(]a*'1R뚾et-+ TdѺr_U'KD]+ul Q-;)ŚYv VJ V nFJJ?{@ ,'cmDRR0(Q((QM0HJ3pvJQU)0=PEqIqEqUÈ8\;kKGxG܉(o@>"\srYZKs8Y;D~B!C,dHb5`eΊpp_;%U߃~={\2)wrq Qu;GG '2IIFa(r_.k/ N[)SxgQa  CKP3M oO,*,R`~k#ۿ~MƊ z, 9,eg}[V977 k %3~gyG}7bۚL6{Kt"Ee؊௰b)+r:tb=*_H濲;1oP!}eH5co4j [xmޭZ O6>RjKZyl?+<xۆ9<)`m=ܸkٷQX\I8d52 rO4>vY5\.qծXTF^f<9P k&#ūYs.PsvV,VUd,|;*&H6Fk]FbS\Y]p1|^V52@+e͕h}bXŌEǸxɌGK_+]1?ė[)[tө'Ŕ֘הx'-<^菨'm2v9$Zѓph$yp7s `֜$*/fvy0f҂(τωHdQ.y2x3bh7SA+1fQ7 jL**xSA&o1֚Q?l="7Vw2 >>,Vie<=Wp6_5 V*lIEڕ_f6WFVRF>X&eŠ0 ~}3Vu҃0i#Sͯ ?'o(,f+- &9L _@᱂=Vx7wac=ErޤM˓Ҳl#Ė%i"y2OX|mL}l J>8 $/ڈP1_<(Efٳ-8UbpZnWR(Idb9Dpb *ӍY91]ʡ7ZFB/^,f@R$c$v2FmK$R:"IuDh=UG+:BUGIVoOT ~@HCz#D|ik,nm"M_9đ&*2\5حUv[.퓗H~lɵ%$~d g'ݰhw*q%GK\õĵ\KZJ%|=!yHc+kk!vN@ƙ񧂓P'e|b;e|KSƓ"U/redD|~`%wY{vEvAsU!$@**M4ӌ#\~HaK?1aU.n5?zyp>d2mE[uj5lhhT7 d3jnO>zXo~ +$@/I{:>Lߣ,E6F.O[ &=Z >^TH6gY![W y'ܙpdf5ssi#օK6FEc76۱f)Ed ,O>A;8֐OcO)b)2%Yt=F m]FvD%f)%_>/vj5ndxHM8kTB eFd(y*!O?9Υmh'r/?F5i #w> 4pP{68U^d@eYVy)P̡qӆ >l΅Zۃ6QkbǐW|DM VgF8{SʞJZ􏯤ҟ~<~&_55[0FF"}&ۍNv=|Rn^'s`t5қa{b1>6-|2c>?Ɩ^:|+gG9=Yz'+ah성k~eV5[㭫-!samaDxzi}kɞX4?ֲn|>l$۱D"߁+1,gDO8JL3f})08b1z{f(Vˆӯ6K߶ ix-ߍEus$6quhYUɉh笈.+:9('*sܫ8D8ND[zdcdPl4W+E*y8uY3/c:-wp+!v^ONtHk(x>N8կ$n{UMk8wߑnJ3%:],"3xd%@GV7"-XVwr9qFfecA$]A;O_9WbE>$iIC$Ҏ/_ècUL_+@7a"͒ õc|{ J͝0U6R0w쑆4a[TQC?Fԙ%_x-2%AuJyC"SV M418N۲(2eQhʢ7WLi!k\N[M,}$~ℽ6R ݸUᘈXh"A4f5hh4Q(PRhRPd[\(h6$c)&L8/u:ND+),-PhZ@iŵ@a  yB>f$tDMR;*>34 XIW' B<4yYS޲f^#}?vduiV6kbKWZFkIpzFf.2tA4퍲m!0SlG_',Ԙ;%,rAvA Zv}?}Lqj~e40(޷܌G=:Qk*F}MP#a#/Iet4E`hj 8q*x%!S&`lAXGGF 6ҒCUDU2vgHVbUU V2q1_-ZY ~-Z@k;BdG+z ttXmᙴdG8 qdO{BM̧81'.2孟"BKֿyo;s7V G_gʭ0odl4c*$x'k~{ͼߪ'{51$B7(#ҽ4ٓ64B{ s-d6i{}#a\$Y>0m_o90)WVV xɃ r_˲XUvHsx~t3yu?~$5oF'w5 ^|Ŋ;"+fK_[/ˇ[dg=y cُ)z+9o[}461Hqc+ fg\;Gbs~Yj`$`47W/$<}V6`,1P}`AXIo¨l'ۗ)>&:ە<.}v\7:W_kȿDHV)r[lQAh)#|y=R]uBN䶨BJ;YD1Ck.zws;+;wa?m醻~}8QR`GM8^/Sd'dwJeJ? q sg`VWsu8:V~(F_㾟g0d+XxpA0"BbaF*B*v;tBګ{v{VԵ)lzAjA+$>  x=;gY~ 3fh`l) Vc 'Mպl.C*_jw$io$Gs {M#Yd#]eε6<ӟꖸZjkT)%EMeŴ,X DjDP},qq@q%d+aA K,cEY E'[J,ZӢSpg-4)e*6ʍd:l-7@b:i#,>W.غ(euQRMricgtlTn3 @V(TRJN+m%TgQvr,4KW, tDz,8K/,"]nmQ Euհs%Uq&SD,".@\puj=h E@{tµDp&KDKמP'Sj^5Ae@P9t(gu`:Y}75P,,Pxcfr}z'L6f=32Dm޲Z+s?O l =ϛ:`QWp ͎"@WK mR!±9B<"jv5zͽ3SP*37j:p̐`3y]̳(yZohuC%USwSVNhz'u k*M`6ܓ^]^kdur&[+NEYXԳ'g0yzcC3o]\nq+n_]} zo+]/3oICp?p࿱6,4gUl?6O^שMSI5QF |hg_OnM`&VdM 'R`_tq:d=CbXb5&Yσ|߱}}GXcÀNH4 dX#ê ;DQxS^9m?یERFoj/<=탷7O^r*ix]s֩Dh#UF܅JCIs, d*V]J&ʩTpZ'G$,%+ hƢZc0WʁNF#7%!J\VeYc,\k zL膘 JO 3\:>mІNe/y׫ؗ൓ +*xxD ֧wL<)o7Lp|-о!}|ZEeGೕD!vxbjj<Ň( /Or:5b'6CbV"V`mф5ѱtA$/<+SxUJYgDExgu@)ΪJis,FQ6\Z[ZnY!Qskʎ#E3DsmT.n½ƛ0׻ Pi+Y͢)`wPMqB2&+(.2+VۑN7@@NG2BGC*4##py-{崂M@01 03\P˽N5/EQG}bQR7+EJh%G72NPb0`ҕ @n~|6-Cg^INcW9c1$1^u6_˂LbMʲR->ϪhSW3mlrV*2Z3ўN*%&JxMUur67_SQSQSъN88»5%Kw#Yދwp~%s O<<ұQRhXij}Rh2|6Wk?l!]L>ӈw0lf}|Ϭ @ND< !Az0ͤnWSWE~~oGٵ_D !` i+71.cF.RVdu`E;츳0K< q=;#iC+A0Kټ9;>9 ʈy}H}kKO8mK᠘Oֈ O*y?.ѧ۠AϊP;8m)ZSʂ>Ϫi$ pj(VEETJm&] 虯ɨSn GaR3 ÚuQ %auzCN:*HĺX-uQ΍[ga@^ -׉i0&*-$塗'1k5j6#uUVGBM+ 5W"hz@JDrȊpTh9¸JīA;<;`p+G-hr.@=hB8vABm]PuAB־"d.X\pP Rʲ ? '9mGQ%_l'qfWymAԦ vZGǫs${o-KmGso Ts5_ UQ*]kWĨ]^Fө5]p^-8Jڣp% Cj(Q%Bk0 @tv+{E:ZQKNJu ǠŨdd=/Qu}\%!^b{-8x|Q9i$c-3`π( ۶['-lxα߷;'~ԨIБn[/ZUT趢aEC|Dуj@!4BHHB !Bz $=j;TGADDE " "| v T`lxzJs?g̤̬{6kuOjJ0//3"i/.aځZ6 D)@? yh[d'J} ̵2׋C1<(K:Oe2. :v(%^gEuq:V*_xxW/Ѭq+11Kl]R ~Dz-ٶ9W85CIж:9Ӂ~xÙ7j!oZGj) g>xg9ys=md|~?tV וvK^3O:J^[D؎v۞K7 x*WDS}C`H竘ٓ }M%/K~k=NBG ItCm94Dx#›_7$lySMoIM"rT5*tXxQf[5ިx }$kc嬆u_F{j-lսae; kE&e2ç4}hDiǍI4? Uo2veyhǡ *Ҽ*沃X s%EV6%1V(wC.=ڱsKv;^N/>g2Ew .۰͛|Ͱ[䖖>|W@{¯q (|TxEVk-5E|\$4O1Hۄ.i>HK}BwړS@kw` @4>Kk _c-HL@IvT-)./qjg3isiO7sumNu}1,5`F+{Y8'|(#8揝~'?ia+{KԶ7(m6nRp=oO ! OsM㹓Kz=,Xӛd@?J&jړ>K:ўF1F1O?iO皟.e2L%e$Q%8Tq uWX|PlOhuPz4Zh !CL1d-0 lto66]:~{JMXu^75` ăY"ޗѾ|;EXC:.;gW2rZV 6v~Kx]6z-vwH7@NzP\U RJl7`X%P\XB wqps^%h?g?AFz '[%l|?/rȽH㈃Ssrj$@.'$tzRF..tsws/V7 VZZyz*ť5A/Y-PӔ_ 댾Z;|k̆J =a}kڭc3k53Y&J@6Z:ٚlMZA(UagRR#U`k\KUe^gwJhkΈ߳a~4u󟂽;d3r}:+`%[iE]\ q #!# JF$gP|(YLV0*wd[QXA0r09H0^ӠD,F~&'BL Gb_UK~Vp>e(GCQOYekUzT^h%͢AK2]w*|dP}aPz=Dxh1h>JFꇢ!nŅ%J| / t}FG(Ӭ߸{2,5kQuP9YYckM >[>a)Gq!?mFxD>D9ݼF,g33l a)͆x `Ax”hr2;b%@< <@AuP&g$_'I˔!Ȧ ͿShXY@ -LmI) SH;!&1ͱ\w`&r lj`q}S#.E!rh[-ERX훪ϓF+)n!G8rp TnvwbsX5rr 99%?{5}{}e3Gx0d>^Bc3;@r!SjEl ~eQ|Pt-I͜ԝ,8y.5xpN8T50uSMC!'썏獹OF Q "9pi^Փ> h; <$-Jnc(6@mnUTϼ &f[Yi 53efpOSķGb] _E6B?:s/t g~ݻBFE[U:W+d~PS9 E\YW^)^Ur,eϑG7{qKTb܅̏i^[D6Uk`WQS3?g(/#5DTFXgv?[u؋, t=O LNY@mR$l 0dvR limMh׺ξk9v! =~ \āڀfu]P]!fWS!~ ,NNv͐fP}#v2=Cr~dn 1ڂs(ٲCD.F2bdCVHvr!&A-v]N"M#LlW@ &rОB:$tH e.Gdq\خQ}] uz]8]*N78%T~!,&1c05l< l_36nnETX+CԐJRf^^1 GMjgFs㫍Wц( \ ȹ:C5*?*I+IWQn@Ԩ;?\ Zt2;\jF#ՍZK}݇4=fĽ$CkδYu|ܭngf=~bg-VO)=zh}q,W*;jd v(Lkk׭u`іkgv;ˆ*v/r)ROrP)wk@,]]l2M]n[Y!Sg|*Gk#-9Cw7ݵP Hf C C`"UV@NX5~Q2ߜ ;&nwǃj K胴!E>9,i ͝Qj+W9`oZhcgq'~kE8UbtGdu [e{Yb@ %OWQ'[Y\ڄɺ.5ZNӚ˙Vn}\@'@| 7 BB03B2 wٽ[Q bIF~}%g4 @h*-ŋJRUy/P|r24\j%xĎYO9>+vi7Vcęcfro,˶uYvNU/5uYylCqcml-^Q߂ij,sV[#?揁}>Iq)S<:H7Yx>8%e -%vxŶ}p.Zs6%j6}MwLn:[V h17,0=hP>}d]CbB  mwL5 nQګmmY[8;EN& RiUezC0n#p"`k\?%@$@% Ld$˃Z>L9!MAL'uuK=>AfH3d_K x6IB&<lͳoYYDb #SAX@d#=HנtrzHlbgB6=̹9<9qtrF$F1L; .foH) $— x_m^1Y;>Iaߓ+[Oe}k5ͪ+P(9kY+H>eӭS"=I .槚djۼۼ#~ݧnvEDL}a7;b%곾cD'VCz {H˝ҪB -#UT .oAB˂L8R e=xMeN-Y%@%ܲ!.Xo϶oåPSmҡ>ˡ ҥec5 r,iPEH !! D*wCObs"@>EL$_#Lz' :tDayX[{ڂ잶Pb/mi }ZWQѓ,$Xx^9 r!Y.T2 ϫ1k9$]E*j|r*'zr/,zr+˅\r r? :CQrD!G 9bJ9`'hC=KȇZ TR+Gn)G&ȣqC|ƈ؉PG%zXYc-C1I-R% GDxrDAub#EjTaF YN*`ݜ zͮqV E#dFYr %uoJ Ec[. )،-\򡋬vZܴ(* ڱMsQZ5|>|%H AZEC#r9̦vI2@YwLtpIᓝ~$)@FSjH8-9Xr7CFBHj1p[]kΎgu3tr,yq,Ysj4Qfڛfz#UM6W iH-N[Q[#7L3ֈ0&Foth9G٠=HIAxpvưh 4C$hH% z?SdsIRCn >mI^P<؛'?I'=,rTA w=$1-;&NJ)Wѿ/z!^/S.܋ +\i>^K6Fikkz[3m1h$-&$EG{Ovx>֡zݣO6jR%j_*:CH}XQe{iţ ^ګX/.q2}'$~G՞J͎h:Wk!#2#z~N{_[et&KvP*G$>U=mhDwۢ6ʹWj8?PKs^oP*'g/;aZS*QA4\ɺ oJL'߭SVʭ2XcaRM]C> W̤'i_v[¬!8ku~VU wSvGuGe);fנ:V [vlP_>U^G@+dGȔPOba͛Ty4.c Xw!@S}2 FU1FxY cbNJ,V,e,8m@ ,YOǯ"NV{wNx~UhE @.4?ٛ˟ n jÀㅌ(pk`T%'GpÕOXK. =AFnJO tS 87-o1~![bLDg *Sљ"AtHδ +@kgU85IL_d%$i._>r#ݭB5W0~?;4?p7hj飌{Qo?gL\ ^EG:Fv8{ 5bfӱgiZ`JICcKp|@>80kogd7z >Nt,REov #2Y-0`:؟ c R7=*jà jbìV r$IThVib(TT߰[*T fo:xI[~/MRL՛" <wyeϽ [j~2tMDl}6OZk_YsZoov2 cJ;oN>؇qw)4]6]Z"m~W0g3ѣd6 Ҕz*^yg?G ն⤽]jau4$:!`¡+XG|GwO<;Bz%&P ^;) ^$:AC h8Ptސ Z@+cKTcW|翭 襶UDoV7Hv5Hh 4 t3_E[W4A 4>dkW{zAn*@4x4Wz@h {DI?~U !d̴slC 2fW++Q?1BOڅ*U*U$!!6w)!vKdWP!!I %9w%p{tyf*^\n$|ԍ>yc~Wgz%i^ ߟ9>! 吏jqOtVi(s95O]\s_/U?=afqzl~'&sa3ÿK"2K׽?\wuՒ)Op1uq Vzi]}Oqo:-׆*ܑ {/4C;&QF>L'F|qt^Uj>p}+Gksh>3+_Ǎ4}vC_.c>߈EVXbkZMֱYy|u7-ZeeYoakފ;l|Zdݯ}ZXJnh-sRU=yrbu$nU:zϘŖz.16tUozKo9tl#{Sk`;9ΓvuZrȨNúvigDw)g#Bt=tftP4 Ѩ:XΊXd,\ _οTsB0U;7HeuI;YgY5datt_u;iPl#cd@:zΒrAwi1vKp]~Uwh _o% ZY g0r[/_;y'Hҟ9XēX6ÈAl1Z&Ϩ+'\#=ZJWLZA_0曗8y{Q&|Ƙ7_x!FhN1h%gM9'ៗ#˅1ߜ/J/ J2lSQ:y-Lф KG@ j4S$ts 0@W Pj %O?;Hm/@:I=F,`o ߷sP. 4dwҖ=P=cqc}kN$ Nl5cvݱi>)9KoߩOxu]Rp8O_[_&o ?Ha`]R`¿6 7$RjcbDDC0ld,^e < (ABϷkY)rМ W(\'ƕIuP\!AKGp7rAu0 eyͻA0ZSmo;;r Tp1_EU%J9AV/q4}0  _UK ?KN&׸v?(\pmpۤS?ۤ\pmH`ڄjvC)_(Gm sw`VG@4`k$þ!|p77 o|ɂ#@ Gr;h839>s̽35^_RO{A.cء3VӴ#t9-\F~D)此7h8sx).mpo_6O'Gȯf I ֱ%3h. >Cyz$$Q*ZDҀ i(=ɕy7hKgTb)$?r?71V=Jch9ڸoJx@o)x Q ^c'$=k {$f6zS#޿Em,Ƃi$ Dz>= ltۄY  `09h) i-bV{+t^3mk80Bs ́B':xDD`OY/̀ .ޚe_;x` 'm 0Ayow]N?6ЃWiʯd8o7Ou|Mv˖l0k4MBHщ7Ed40&z;ew'O;_1 683 m2D3Ӿ5}e1KPք[ÿ:X'rEsQhxt$]B&yPfMyyn۸RDO:E5j>L'vSUB~V] ֣_Ƚvm߿oֈ!U|6MaDۋc/e9ro7Ǜ^ŻNB./|yZ B'mC7&kmy}xZk!U_F)b`(Vm"*軾4HA%3R.tM@](^5n MF)QD 'F7 8p惜g>Xأᵽ̇IY:!\'9v<gqaOq_4iAï zSf"h|la{6Fbvo;㒮iR$}d6Q}2QR<Q}keyMckCG)*t7R{whC+(՟Jd-QisZ~u}͚Vjʎ|42;+"hU`OX=%&ċh,; #_GZ&CGWPڡUJmdZ{2?RF"z{QMm}"+OXL(K=BH82yl r)s뒵Ρ72Of7؍duA$($cmɐy}H`sP#EQ7`0\;չ`m8?;4a ;N{0/SZ .0;Fq_H׍+Mm=Kd`p2ҭvkhŀg0$_Cu0]{~dQa}$ }B(wߝο_ 0CϊQ W2=d)3I|^ >_x- , Rik$X<΢Yjm cț{Q'{P==G4?]h"'u$5MۙlQV,}O-7g=8Pt14 s]z=H/7K#aZ2s'We*F?~_7TY:Zq@3Θ>:YGo",!447މE\Ax̡<2#;nBf,d58rm9wO Z],醐fE " eH! .Rq2uQ"ě芁]1 bb!s$dN (E@&D'vXn@u@ ;.$F2D =:H k3XrEubvr.FnP E7H7unP2, %0IȌ)}V 3M,QFȍ@ ƕfpJI"DF;ڤƄ_kjư$6ЛMf} T:FŲop/$3pF-/{|vj<lu;'Feh ǂQΠ^D/#yUij/o,m{}8~g媱ޭCw{GsU(1jT1 p(BRi'۟B"#8?9"MO&zSSxsյ6K5srxV*XpmiV+0)6epϏO>4EL?Tk,/mK1 |(ЮQ`FMx8.OS6L G65X z7\{tB&hLжooaV4U_9'Gh" Nj 85[C57֓=`{O(<S;7H>PVQ Eς*?v;N^\2YrI8??zzNwn1CI7&/-f;*oYHiJC(pMZ*Q*Zhek{=*+C`m@fyȘԆj++湼 Jo~An()Ci6 ;,wIUx*' |4Cͫ;yFѲ}EyJ{eu͙5U[r|_h߁Ochd2YHRFы z(5Ccq<ُWT|rOf:A' 73mS{Wqnt%WD p*犻ݞ6S)[_S>:s\vj֣B =iG[U4 jffzfinRhfzд_]p,Od$^I£{ډgSUіd6j/t>E_կ h H i|8۽mW$҇[wHI$98_2ms?w? !'̖[0lpG6:m6{j i$0p!0'L(GC^c^<FADD}GI,y}BBj^>&3J}1vFXz y\HJXoisO~.#qw?(]1s\`&k8ѾE&=A"GZ ϙ3Q>#\@f"nEH'Ҋ{U2ΤQ'h&"tei4o;++J}zi_qUq^ow.k=;g2Ͽ)'<-u!l"gΜ ^"Z\ 5CeV[>M,Rհ#G >M } 5^67<"&7أj, CxC-س_4s F }$l$iIY tL09@A\.M贠u77u@} 꽤wI(Xt!DB !RBE1?=_ Ƀ~<\Oh۹{ލ$6#d' _7-A;DqK߇^dWDwPoإWBKd!Fi܂| D+a%+$&Q4opE0!UY3ʭjgjŭޱ1#[(W$] _ᵣ9&]}}԰8MAסl7DvyćBElݔXȏ's]b{;;IZN6P s$='H)ن;e(kW(R{we'ӳ݋70ҏ5 }/fvz[)p9}y\q}|\fWcQr8FBq +#‷lDฦj;5*3ij6897q:qȊ@VlwʊvIȊOJ<ϊٻgzbHe]@Z(+FAO l:Q$@qG}qdY@s@B}h$m,5C+$o=#Iv9=c=O'*r?\{رՍžQ՟.7?^ğ♛a8q܋}Ur/:F/M kY`0\ @%BA"FAb]EȒd6  Bk(W"Fu6V+pZQV2$VP:6OxQNtd%pL/ ^d=9  6s1bI| pHKa*޻rl6&s- ^H~TWnxƓHwK!t%HBh3m{>-`_p%eenĊY'FZLP~x47VIac[zE B-(^62Ǫ2V91;y2UQcڒreukZM㳫Al֛/j zc]?ͷݽt82yNO$jA;u)d.Kz_ѳj7ܫh1ʼa/gCZ8ي>>[՞([i }=|)^PpDGpT18yK~=NA6 x$n'fS^HC0j–lxD@!c")#[5EW;F3m03.]l + w4PSS3d9'#v`\ N vy<z˾OYgRM@ 55 EZ7\:%k5MQ2 TRPI;(n8L"MڏР r7& &6jI}{8_OtSϧ|FW@@gk{\8?-y fm$|[YH۳+;^NF ku/ۇ_d9MƓz81>v;=K^6ju]A;=r`=k7ˬbduaoX[C/BDt'nal04ms7}gZ]FqtӮ7|+.y2}w(YZc+R|J)Rz^7p,:y;yNAh9NymGQЌ ]dEK-[L4Wr [,$%c$$S`~_:eA- F[3ӎ!vk-@ek퀯saWLӕ ]K8orMBv@X7 _["KEilCwiog]Q 4R@ S-D h4eCPV_؟$ KcdZo[=So'VUUq[v}N">s2>A"2L]tT)*_e;9@svzEeZMj#`LD]o6#jWXgu7&Ϡthࡁ+p_'Sr=ryzS{>p#7zv%ZE@[D]?㌓94˲۳sF !Qv}gCP|kn-Ρ u@=? 5ll/`,_i*a"_EP@E>Z"(w@1&Au ˯ ?ar@;ɑo=_9+G8ՋAP'OqRsᾓzy~gpqW 'Ȫ&"ojS-]Md Ba1m7.(znK''8 ?ew?7#6b,n MڛVrSn'=F{EúJr}/{Q L{U / =$$B ! i@ZB 5ݳ̙  ( QlXPT]XAEDADDۍ\sٰ?RnoR[]WHu4N[s$螌Rt1ڸT8h9m\?%XDP).J%H\\7 ɵk? ~CI&r(% ]U^RFHSTCRJn,$$tیKcfRmFriָ5敵I! Mgn:CPY?5Pv򉋿 M⥔GIyZR%5YJy3%岃 }rGH}7NtIRsʋ.p$(:N:NG X%JY`nA[[,xUOfy6 /J^͛;QXaKf h&AS֙_/-~F[<Ͱ 8Ϲ]>N1Qt1&%8 7^8ˏ}+gG49~\yOO{_{_7Mbٴ%[ݞee~vG O\t]Lob +2xGXowӜob%KA". <hɴkfpvh@ RB(q*ow&{yP8yN _ g1:d'~orbmo? ѷ~Zj;Fsf+Ź瘿]Z|1 1yLc"CK c4C  [+?j+,kd b![ axת\wZU,:)^1m.Q1-\==?mկo&֋c#cXlzXD-6&_ vk׾4-/GxcE3-|jmYCm-leᴃGȷa5Nmiu}eOx^j?T`rvb<4x˻Fnv[X{{aߚu2.zQږTQv?28Alǧ)WlVW UHIHt6&*ۡ%j D1&]Īpv lALDu:!Ӂ!/L^ݑîPWA24-q*TBŸ7bT^q)M9-M9xC!tw0'}RmR~PPMnB=pꁛPxaȐ7. %c=QzEXo"((]mϯQ@ 03-Z^&[m[`-}f~Ϳ4:.Md i.TϾful1{>P_~ Azo9G>͏[>?B}¿,lg4M].s`\4jFD@L֟,ox~3N]!OG{w{O_j,IOk}mm:}2u{70Izr:^F'rV6U$婞r4FNdH&XL}RnS@kd~m?H?t$3$ W:T K&D+^J,Q9 ɽctBJW;4 ۡiMC-'z;\<\uBrթӮr9p&Wa{?'_aOKܥ(RPPPP$ s$5r!r5TM|N05\ Wr^X$^,V|3x[,N؉PR cz#ȯʞSY3F^{=VoU"u`Ug9;zB_kk׼BAhL ڳ֐:!X? 4 2^ D 53tPh~(, ~L=qgb?uyS0m׃ヤ`rhQ0%8(* b)֨_[Iq~n;1/UӴlHh[f0ZV_Az$@di%> ȿy-#nbkvnSx/sv/> u6'>6->pܳt]޻\:A{,s>Ϲti|(؟|W|'"_Oa~8c&Xj=ֶi|YvSv Gs^a1>w~>\#R-QGe|į1 ތonH#IlI)Uz}|0Ji_);cc'*#qIHUmD: ҕH%yyiCW]bu ׇrTh^J#r4B nxzP0j_wg[3R<;2SpPFiNfY A'q2]S` *| !vOoZ⚎ xtW~ S\|:_t͆:5#]s85#]h8h.1 00ʳEJ~i%0^Z U0.u] U0p\ 8 e0^Ǚk8ӵ+`x=WncF7Xƛ\`\[`\[\ae]rW k\xk-nqkqk=w6] 8[b7qN8qfl.׻.0.jo-<轭ZAE}፿@}]wh`|sUnF{鷑S-Tr69D ST/6:"fk@ʝo(1p]B)Uިy:DT/UNHJL,PFw5) J#yMd aHH4~ R c[G`HeJ[L,(eJ):K1HY8V8UygKM\v;ptý?TRјTR#{ߤb7 ͊ŒaA1gjy%f:4da,ih.U6iZg>>[VZLI$3<y|T9<>pxͣ|#O׈+ׁ!|$wj8'룸^DR34Bd}8D6HfTԈϝ\y%z__8SƄ5-pZ&G &)L8e]*RXsBm0HNGK2Su'Yc@9IvLxVGLYq[LPBJ: Yh?t넺_.䠏%sBQBУwL,DHz'Z%"ZtUKs4,JbGTH 4 aPr0CWD' (c>I+=hJ}?Q'쏺ae8ė𚁘I#C{^9jQ>%اč9#]ɸpD(Ӣe|ZL3p1bNL%y1d\ОԠv/ ynS$卹/"o$C~cy?E֑$!&yu3״&5d9@F?h:o]|1gaɹ/96X* }?;C BCCBClWpXhKpspyP k`^ /Dbm  ^8 ¥wY4fVl.j]#1k¬j_?|註蠭@[ vW\֬֘~ q"ڧ0J%0HΝ#q*7pfm p6 0΄,'59 ,Zi΁q6Zslر`\`.un a9`.q ƫ89`JkzW:ή/g[W3gQ.u }+P+ I|R(. *\*>w[E| ܔ8>Zg`]Ŀx -6r՞!nl/;ri@bYz埱;{}>sEI_5z`|get'vEe0o1ڣIчxsx$z //x'🼀OO׋n.^WiuV!f7_ Ėɡ h6H1 )MSNC/UHU -illơcn:0FH52b6 7[QdbMO춓u=zR0)tt*F_]=13Zbh*`gDT@v!1b$飺[Ejuڡci7f^HdrL* >} V`7l -8m0:Yϥ0G$Һ*8s@Ee-fb;75Ta9lf;xR%KG\Џ8W0Vя'~Y?⭴10GaAEcJXzC|`Ѝ afjZZv-{̾F׈ ?F{J^0Să3l=M;1njuw#^eԘwgzJ$r=5񒿡/y==LgLOk6Ls s`+yz~[o򠽂?a> vՓ+r؃y|f, L۴+xv7-4܅pqR 7+)<0@>ζl9G+EB 닚aVXcSjyKR+GwDY7]E>X%vN"1 B QwCj7L.OD+ ы+q8}^/R CBs娚$'/Rmz~t=Tƍ$"e#}Ҧ #] -x(V :DpL"O%G!Yhs>wrZY<&Ȍ{p%-E̓jhRvRKz᫸aaqi+ˍ=% ez*Mj$U?q(7uu3y.$ x q!9d_¯+/*SGbޖmI#r: bXoWZ,1r礃aBD*%n-;91ĩ,7q叹wxN (õ`~:d&Խ_Kj;wx>/'xH_GqG8^FaGqj*yJԶeb5k%eaw[=m|'QڷGKSjI=K;ˆUo52<!3*c MVſoH*!Uîk&җ@ǰ]`yw|+򉼣lQz65pnZjdQs9,=G[>q1ɡ[ɭƍ\О=,-/ѯjf~_ai{Omw1&7>o }l2ͷVh?{Y#~90/XAT;_G8C\.9`O~sޟgyq~hi~^ֿX{A_k%qt#z>GC׫eAo2Ay'#MiuVAFWm4qŌ==E^iaϺ`#C  HG^Je# 7\X! 8zb)~^:?/ɝ,m$vݼ"S^]cC`|_~];v q̗%YƸ/x%JR Z\ތpHSRϺT.C 5b CdEI,:1ͯyrx%PW B,IZB^#:Cj@n8_ 2lL!zy< G!PGc?o(]uD(=މnWXViާ>Hz[e -BlL%bxK'!ģ&31ʚ*H z˒v^ljH@jgi ݡQ=:25 Sh%ٌ&hPQ.YJ>owV?;+v"(t':Jh c :(Kީ#+jIo %n~OM8U#j .q4#IdydVK \"_FHDHd=;Iy? p|{}`dkL|j&F_OZ{kRxK+ NVctپeiZ]-a20Vfuq>м'0j| PlѪ߼~o~q"N&U8m/>0nFjgw9toB.I v;=O?n>xMѧiwhk唇m*Z [5.oET6@y^1$KFCU宑*/-N9]4Y {J9D2?a2R/ _eT2`OZX X藀E Y LrJ@NyN贺"O#, dqA{*2bUH-ga0% Y(YBBB,4PP?4'p'Q¾*>RM}|57EA Z3Zj#YtX)< ,,{!:-nX{_IخG[GW팧7<GӰ݇-s=H"P^G@aXN|BjIpnilu"}`5KpVqojU29b;K3+1Hɨ>`Ŷl7UXy;*6Bɕ FBD(SN3LlE#bda<>[RUmY=`` .xeFy.]Υ}a,C|6EU;LT23Qjp} $p)9$8&jgJɉOp$g/֒cZF#opu10OZmf\ֈ'VgϯX6*g/ֿ V,\Y1;o1S ?ww]/)4 qINIO7MLnh. }f--"6:s³5`f^3C+f4Na@[j/`;>fW" |L^OՂb|9%Fk}^+s~vwhO&XPU4]G9*P[ЛT;/,/8MiNMI{jJ%>uTtQѧ/0ġ!4$H p\4uh3p6MSQIW:h!DxcZ"ReXj9$ T]H%RN\Dp!9w(~ҜfaSڶ2/HLjao;.'uIyGg ,d5@q8J+T"Qz`un ct ɨatɜ*tU(F[d%3P;GKvZFYouI|cq@;fnG|gn 8Rĉ;+27ӃQJ&5`.Gڐ.Y)z]2k 7 |2XoB$ 䱟Ǧ!&A;yr?L}0 k ð/ĉN۠VT7eNq4|Wc0^5‹|kkL_jY|ubɢ+D>]pRm"e]P6`3"٘^{eʮ ˰d̐'[ F+wE+J\Wѻ~ue]1֞]imhlr,½A0JYY0FFa~wݘs#k*1ǽk*Qc+\K<005WyBTN쐄 9`02v;Y&ͤ1dX#bEeMeMl(xyƳ^{ӺfۃkBk755/y"]mx3i)«φ~yuO^<= o 5 }f@|7 ՃGeG`(:pb9ο?ϧFd=H<;RGxj5yϕTDK05 qF$DĎL9RB1ʹBrjJiF:IȶW 3:< 2=w讈+NTƅdF'.q$:jqaB.PL%1}q(%vk.:t~؃Cvpbx̏T Qgn؏0U:C?B#88FYk(\a?.@ <h0py(@.dƯeOa{"%X/xX< LqH&_c(fC> {c/qp۱be,}Y;xrՖ$+)H{!ʊӶ x;V$0 G^Jk<^k04sm2?C.x$߽;mF3)| )Rک!Y ҙNu+ 2&7~_k֫&w{6|O u)Ҁeцl$5?]|إ{0鲣%85h]"v婯&衏{r'*ڦ,* Q;HDHD <%?%29tN*@^:.Hl$IFةo L[Psn9뮒:2+>WUb:Sw 1I{y# {ۋ;M0yߩCTPL`Z[K D9F(=b|!"E!J`*%^!F>"ϼy5&DIC(%Z^SpyMUkiJgRA+t+Z` ~.gD{}N̻"2=75Nik5U/9++#˛{o|wSw4'GOl/])U%m}} U4#l@lIb#SBSBCDψq*X)^|(6Gyϋ{ţp|'zSx^<|93/x,X Gx_moƆ^zO?-g7EQkIhb:^9M?]&yte(W[Fw'9C{"~#I`M-_0^xOtH¿'/%2^N%4#j2K-%]˘4D$PYGU&b%BN?/*睾+I3DfFT&L" m'Nqb)HeCȘ 0()Te|V; N'k0YwUP!<+Z6`LpUn'=~L̙}jc? 6AIeUW2 Iv!#P_DC8"GBl9Qpx.h|r Q} &\k?_' axNјXM8Kj0k¬bI Qһ5 hV-tVKNItX5 ZU/?a=˯x1_he<1ݸ,z<4kh!/RD+Y|Y<ȷxwC:Y5|@6FA|?;f_}E'qh˳|;n<"7TjF |o6o*k\I}Z_7җ;2kI NM^+qT݈Su*򛕔lbibP8 t.5GN3-` 1 )|RjIH`yS,JQ%RM)zA1D6&bl1sn1摈1DLD)QqJhJ"O8k4woJIl~(úòZ4Rj%|"@)d G6GaH=sF{<[@BPNR5<Z@< Hki.[`Zd"[F+< ֥7d3Lshye%tgҎynU[d0+ϒG mv{α4b==.Қ~2#׫%FdI\S僬a, ^zbU&wQژѥe8]WZ`,m)2)iQ:Ɯ1C*20wɸȄ 1D5Ɯ Yh ɪ? J1RSmZ[Tw,,g]GP#R `V@̙.w+Gߐ#*Gsx̜#j3n#Qoj3#$CG~1#p `@ /a2@jQg@l6F`s)Y" zV,6Fr3m)Le23Si`;4 .2녖Y/z!d/䃜 9Fep.~o0 ' #l0 0J>9 ti0 #tdL]Wq:|s2rut]] x=+ a\kFX]7w}rRou+\]a]k0NkS8ƵFٯ6<oB+jwz4|7Nw{ߋ~Irw_N+hk)Zءfd]I@rw]o@{{پ=0 գ_؇WZXv1]<]eFoW}I@ZF:@r'i@Z[KM4>dշ[7C}Fws]h20'-tͥin„3Ϟ{q|/::>эLLkHWCvf~ h zFMgk09ACbm;dt}P}LUhyܽJXՎMV1ߦ"]Lv,냜c[GxtYE1`a.pvɷWQ./Cq7_s:jL!S 2dfG+;6>KGJG#|!0c=G$jYF푫=(kdQ0Vb(0HfXh2=VGۺ=zx)S&HFy#B晎g:jyc| +?.Xq)_DLy)S^V\&D1pp\bXYY* H亭а=b7VGr^}Hҩt˾M1s!z3G,6xFmdlҋ̭hDgH1# ?h7bws.!Z&r4$1dyXZcf{4@L'U){?W>P!NG W Wc,CTHafUcYɫj5&4&+Mp$bGXb_bQB,K,ER*iqŢAYSG:"J: ұJ6C#N"~8HHp#tÌj'FX)]; ҮhaU[!!ArD e!brBo56@1(S5e@a <2RZ#jϧS,j ksVjm9y8̻g38 xi4T 3\pԂ˓x{N=]l2?Z?.geֶb$igINv3I '֞@ri, *N,(-C짟wl )ff<'k{9l4{.ڶ;<}o֟eTdX0~/K=Gsy?_@:T}]-oX%*>0s#x4Gwz,57 |~s>w,I[^liIML0kuw;ϤK%I8 O/L 'h(.Dh;,$x`tOvIwt ASe@8TKѸ2 Urtp7Sm 5IRNW. .]Rgu!Z5"f,,ZZ0L<5xvYƨ&aQQ .*ue \MLOF],J`xJGlSѾQE',q)B"RQ6Ҿشj:C6f#=FP,rBHHo}/lxRRz`] rIe 1Hl o  (Qf( YB Bb 5ipn_.Ӊr)2Q?+R}t%Ao$76ŠzCXC-(a?h%]cօ,q+of_a!Cl a+Ǟ_zcWO?a_+}FC>>}{ڷ+/ $D&(Q&(;Rͣl1+77rSl:+._FP9FSg[1ڝmw?m׳տX;@o֚P3.Kt N<}qNP+Nf_{[ڇ H(qQUwoMoȞ@/E0]1P_j,[b$,d&Ro, mЄdF,j³v @a#b êlE[06 9jQ[iJstK7G? d r!;бKc4צb&Ka2";fH ÅށɧB$Gg\]X(0Ub~tLMVl^7fyy2Cf,^05sp=KW<=8ol%9ugh"ƾ('hͰzZ8&V#ox|G|`6fr?~y.N+Q\Fyr(hLOIc~/ C*d!{D]$4/&`;"dZ,H(4 mtQCu0`x X Ebk'(i8=QR@+Ǡ3FLυqh4hB˙GAYߜ B;ӡH8q_ ~ $%=MGzG"|]$D ly\҆_O͋l?Җl#=3.f?,fItֲt56^3'-*eKzME"=>ޤUi [Vv]id6a vۼFͦRF0aلiS5I i)Xҷ e $Eݴ: iQmld,*Şa1dH,{"`&8XL Ͱ^6nH#U S:Ovn\;"h[Z kFڢ-zD5.SKfc R$l:]624M_mmV2V"DZӾl ܽ0XȤՅtG۩rÑ GO/c 37ܹ(m"\ݽ1*3؁!R'Ƈ4 p [!g t0h6|0_ԟO*iKY{/-O`:F}=zxw̏󑀪h/lyz+d9h>nl>FWVtoNqv2| >[ |;V2hd}_[+ȱ7bXIEkORN?Gv Lc_ˌGI/zv %z?O9_׻s;Tu+,WX!_a[qx-#'S?&Nb1.bZ$]lWy$ZXb{ܺ蓬hMh;U bﳫ lcpzGb{Heն~b/QЧ=ſ:bΎ8mvhg ZaG7L톩"%K^sX{`߲:LHAD tbZbuOO~+q;Fi ]<݊1o j=owQeTi^ckA]5Fc_炖2$U|+֣|y|֤RB=4Ό1OɬVk'܏1Mz?D] M8iƑ-=:R24ls 609gٳ]shܳmfnt ʜzW), 9}ٞ{:֚~f/jl I{dVEHǩ1"r(Nu4c;0=ńtene?2ud(,0)K߉d4X1~&%طB~-sQAp8 j )j`# E`[`^1E+Q&K膾 tL:"%.#(SQ|o7y)g5+< 3fPv ~Խc0l{+~KX%Hǽoz}xAe@,7@-(}?#eL/!_Xx6k^uT|q8]x f"NͤXGɱAp5^D j}mEDL,iriV.6]f7]]Զ.:ac(H)'Q0"6ET,t H0G96HD 龜THuu @TD4'ڧ%5LJگhj.V< qL?ֆ陁,iƤȌ0l[FMRFH\vaX+6QjrUyWh,ȿ=7뙓paJ~8򋡀:OI ݈$ :(mD#ť{ǻ+vѪ?GXόj}Po6;HK=BE$dQngꠛGlj }gX,ny@v~Ub, Wkynk({0T@Z(;FWF`phoD`^ ];!&5`H?@H%U1&6p=JGIHI{NBΞ:iR$I{v$XՀ}zk`*"8N2\8CM,$НA[/f.sBYWytG+[?le'wtȹcGwݑgwG|wGuvB[ZhN| -@-tn\7X,DwϜ/?_n@>XG` rϗ6m*xJm{@Ƙqv}/|?|cu9|_TNbx=؊`³xg֐mapV]9=d؞?Vrd}~gޝJg_wRBl8TB2?^óZj({ ^rPVJEp#g2;ƋSIM$ B6Ρl1D'L6ͪIq7 V2߲5kl7s4C7BcM<^[*h6. } v@_H@3 L4[TߚZKVR]#6cƺ7z|<:3ޑ7nSS`H&FXt>iG>0~ř`Uk3ifn#"3B~#ϒ>T;@sYf>iKxٛ~8i:MΌ?C`45v z`bO ]l직3C0ZAs1uH3( >h:TB&6V &V k~jʩN>pzi驧ltg_U+{W0d]mJ=Rd}OV>CwD:9=w@ݱW15&PjȾ`vGFĒ,G# 0# jcݫ0 '阡+}e`7fX++dS9#B|LD$"VѼ(M'66#hhH΃DDH""!DD4tն Eݱz.b%;\ Q$p"(X$s5Ic\u.wJ'N4vb/3Btᔢh+s8;ATPQXGa1r-˱ICNj5E`<\P8hнHsҀrmEv\d} x@2{}z%845G#=6ͣn W:zle!(&-(P]{*1I[xKI2اWM-ZGXUCMoV>uQ[*eTM֕f2 ݱUc;FiPg*}Lϲ,xSʦ dbnT\6O{7nj$Hߢ,߃N@nj+&'tȔ@Ab|(딺DLh\Q:lYݚ5,l-14~ŗH/CgAгcjm`,OB#h45FH>Eߧ~d.NW:d |3~BlyLfY[fo(7b_h7=΅|O{x2ѫ}\^0e!IVOFu1& PjO¾k' yͥ^30, %tt5hpA kxYn;-ɡ#֞Ý;`sLDڇ)\z~|Fg 7%{/r*BlV__5>oy,4Cקݨ޺3j}VKr#g#}*z/{4k>ߍ&s3UtmhCqJ򅧶]N'MVaq$#ar걓lH@C͕F~yd3-9s=ri:srn`)lC'ZwX֝h'(_*U{`$WAn푸Z6D9M@˺_^! a) lV5NBJts\-`D6|/ aFcEP{De¾ aΉ=q^6g5~vEBCr-#4Nh.-e( uE++@90~BAxJB9( @WeW(Y:(yՉԾS[%f7*A#5?&x{pF Ox{UNʚ'y5Jz[K,Ӛaamv&t=}4P,ϟ2Q2.'ɫhRN8^S%臵a?w7UaHl9ez}ͻ?)Y]dY Ji}u5jdY&}~D53k|,{uo 8㍹8'f>UZC ߻hL4~-CtmH֐5~}qQۤVV)\wrR/DwȣϽÕx9~~ ~ʿ ~쿭?V3i;֐g~}+~J=O/9Yr֏j=dVR+ vz}`iNkg^>RMЛ3rl!^f;؃l\!Гޣo\8y~{d©Sa K-\foeRPw$^D#e\ Zʵ&i6$Z-kq^ȮqHgDZJ8uFw9!gl^-]V,s92$Vj/k>pRա ;R AOrPʑU{&+3a\iGjE.zzOတz2ȭbzc1n6~2#c}>51bTz+whElr?!CC09!%"p_J03|i,<$6dqz6 aq̳=iJ}w6OSnwN+>u<|XҺ5dbЩO12F!O$HĔ؇:(N-e_\~+L$g}& D )%LIDwGTwE%͎B(YKuڣlX9i]&:Q'm.G!7E쓉 >dOLi>m9 ]Op2?ueq3Y'^ ' 9^?<[,:(o5f&eY| Y!FcX{w&6|KKTd{TUZ9 dɻZLef[F \_ '!}:g}3|aB(#Lkޡ;&VA>D{G2X湧wE z(ƻ<<#pIq'v0ddpBilUwћyJ+|_;A|g;;/Y/$(kEVs_f ְ?=whܷD3 U6mm]*+8m7QhTlݞhjo\klK >jCfPMtB!2v 9s}{Ȇ xhK6B6jQkcKA8BXKB?ɹS_T WD% j)d QtOplY?6j(TM |g #ߒiMڏb?zn'\)'<7G J7o~Li,uXُff4Y'J7Ma30d$+sjuI3}'V 5#Egsxֆ]f3y8kpݯ?76v_~"MSvy~S(JBp~swWp-OEagzڭd[F!:3qy~,vXJWCt5ETt74dqN8Kǹ1%Q,TQn-qvvj*AME"VRu"FR+,RQ0njO,&c %P,nu2"eXG|N%]ˆ2%R.90( 9l8\p \t qi @b8{YԌ"2.H VD/ދo7Y$rEY;wϗ{Yp}Slӽ̀3v:nqC=_o^J#pt-_@6@}_TBD9PX[:9"J]Q_lTES$OK<-6\ueU=%%bh:֬hN1<#Qh b0UP9nrUSF^VkW]_"n)c7)ҽ!yU> m"hD^ / |ʥD[)۝c6J+_#ylVC#YZk\]{zv^/Ǖ/TT ?$$ +!4}kFPɛ +u-hN௖25BNC,DrzqeLzB^f2Yty^uGO 腒mW$M6{> : X@- DۉZ/N"ND C7z8ZhX-[*R;;gzg߻Z)DL?Fg͌'6qPf'Ylޡk6ED Do׍xr1hqU#ulg3YFjљt3-?$!72tBmyyw,=$Lj 1M|j)z_'6[qGReey88k6i  `3Fhj}5B]#lDlh0}30 - =^ihgOoxYUZaLguN1i@ :"舶`Aw:A"Ӻ5C kg((Uo8-t1a}lSܹF N1)A\j\)V *tRlW2|)6mt.ZXW* 䃎} <`չVixgUoUp!m*nS4ヾnmu>'SؗT58CRz>ԳU?h`/&l4yiuѾt% w2z?^ 㤷ɩS7NN.xIo OI=iKvz~ZC@o7|Nul6J69#)HiS06MRN5HLvPeɿfa%I(FE;"RM`wXB ~dX񢩬xv@ndMD۠R}5W-iv{yg)}*mמ&Y-j`}؏i20ߛx73i Cv;lOÖ6'L'( x+Bb^*_u2 ]ʚwѺh"7v2!Y3K/IdTjј2u8!qv""R-JYwL/=mxOd޹0Ě |QmjG+DhRnu"dEb v(oT=N"j'nu@Mg *]%ڜ@Xom*(qoa_ B}E~hyZ>NߠO WSiII48a[ȓx JW@Toư!k <.:8!{"!^|eXVK+Z`[/a{`eu8fFz/yg7Z6'nz-;Pk E u8w91vj߃o}a(LZ#q/tm;8~20(d"EEtE] HH-|2Nrc7›Y{?fYpt}G Qcт?koz7I" ndo[l:b}>5yw&_kp{`V;uo%ǭVoKp@p`O.kŜ9|x_gHE*so1S7s&lxh#&',N8GQ]T&DĵPXXλI"ad pbB-P9m{Y|{5enT{ xo +NeaN<5T!b+!aIVYYXM-S$RhVG{O/QDcapl t5d` P\mVoWkIFVA03HѲ\W8Pb8 [J(T^/ *0+GEm -ۜ Xi rA{Y}a6qu,>8 6Rz ~c+X;s&+0M1ך-X gg泰5=k;t3w4Z]oU?YZ{_GޥR/Sa>״״Yڟ7÷L[?Y6з/[V66+0pF88\}+z 3|.;wyyNQN±KNc8ջT# "zH ",Ѳn\3lG l$(u:wqe]=y3& zS%Ci^*x5,w&;4'?:ϻ#Go^ڽ.{_6;`eIz (}(@v ģbMVJetP Z*#Gȴt ! *4x1܋-F в5 ~}0/BdIu° o0: Oa4`09'< #0B|IvDI5٧}^1Ljv?bQZ0@_ 6Z9r~J;wʗ*'WՎ7N |'xwptmpn0H3 Ucև֧֯VBcw 4s-0nvmq ~|s!~k;췹V6N.8z ]0>nz{a^S0s= S0> 30N9oq+tՋ!d/9˒4찤a_0ATLUVlV~S:F%'/-P'<tl#ÖоQ%㌗5MT?mU|kz(*~pѵI٣aӖ\9˷m͍~n҅d\gl՟R~7M X41ɻd}7 * xRޜmVş#(߽JW=Uo_1#{G/s}r#ooeZeV'aͶ[_o=_0YGk$B{|7'-|?m3QF<:1z):5NVS% 7G⮝ihkWW}u'ܣd)1 &Tg&u3L`%I.rBڙ՝1׊] g {aXTvaOkbĒ#j QS:BG:""j (R\(:0 D>2|d*CKa(~G) u2x> ,G#aM9G,726t-2d@>d?~5{: -1X:6w]U\eт|`iZG-ؔZ':йrs~'!-a[\8a__ImW%^9C[;9[NJ9*.3l|ѝ&IK5qJwD9}+2fS>a2-V[F+Iޞ*R՞du>_mm>>vZhNyX;}܁g|i| |+OabC/J#%8jEon| +__Z봠ţxg> |7 ?[eMi+)VΙ _eG|]jdjdDjcs &ݔWIapK.K$ZM"/]R,@a$ ](EZ"&hWͥUUڡ1. ,SÑ1!רiҴM (41A>t¾BuiɂP7Iw'Lr͓sKLzJ,i]Ss_қ')9s]hZ.P>Jkh-he?VA a- h Y뭭׾њMI_'=KivQa,60ƒ$Is9l]k׷2҉c^6Fa|ht"edy4t } gb1|4U'?c%EG:Ϻ͋m^ r"ke+8S^hΦk*6JÙߢIlS<,C͇&ᯂ+||0ji_**U+~7#:2{Rq6 gxz5M]2֐P/|'4{׷z$4j\Yf$B3V+pj`]ҿ NĞv3d-ڴ0:eȾLRaWfVuߩV0KBf0 ݛIYHB &`]:#;% #)2D-Q2L@h&35hJFP&!ᙌއd4P%#@@GQ~AMizX!PG}-fqudPK45TQuO'Z]y8@ Ga8"v8*g+"oybJwh*{$P.N04@'Q)r"* R,ōNy, 6)FYo7&͘Zvkp^\CuJ:Ce6XäA ZBh)Hx߲GF̮7ѳf@&|+Ȑ< B$Z-GKeuymx9=BaVc!N}v> !G`v_G!C6Tei9,|)&74{3f߬y y/>ks#_|ߥ|{䣷 r{7ޘ?T-נo=@PIP(C}? ,WJ^UCw#ا:BrJrzNJ57FLpq@^mQh:;Nm`EL rk"i_&2_,cдr_kL=m툶ݴP`{<noئaGYi4Wu\~y }QN'\! e(%1 ȉM}MБJ ӎ>+p% Tщ*ً`[%)oč>h+%qAH>.GT>2|d6l#G6l&L><_fX0̣(#eh pl`$,gD(!D.Y:ChΣaGF:\ckqhN5A艸']Gɒz|?h>-q7;\wħu?huB!'ZsOsO>7eй_!Sa*(4عQRtfծw>ޒ,|7[ǻ1xqʣ!~<-9BXk&V{-R| ܋w-ƫ-q>R|e[.of:[)P>H<[XԐܠCUYXZ5Ǎ5z}_mn S+}{S̙s2"xG[i9{I3~?[ rG>l( 2ܚ293g-',Z8jB;%.+ FUQd;+vD,+Cp%'11b :DD)H>sI@)Ґ$`YŴ tN pZ(D³zLԹN*{ܚTˑ^#*ʞT6&}]'?(mxERU YBh)_[6Ǣ @UU=&h@{x\P;AF3r{{Y AuR"%u<'s3%}akc*43߹D$ҨJ`68̴QTܔOY<>R'*X˝X!k%>*X*VKThDF]2ԕ8oLLLRF,/Tm^iku=Ewk ԶrSJ4)uq#o>-L&ƇQ I24SG}ZԳɣy}huɢ ` 8k(|Q>K/g)PV2x&Usl%t%㚠),_`^A&8'WjH;ձBXfb,BX [)hu8x3ڀԳI=݄#S]l 1E kz6 j>TixZƣ]:6^wA>C;r+*Kua+.#"P9ߴ؂򚓚^Ͼ xu"MOO厓H 7 ;!JDJļQ BtVBj*&RPM#M怏9ЌO@C>(=V"sU,T&PM@5QD-TQMAEQ#l빬m8o9 k;R'-GNu+.vMQ %BЍ@-rX1 zǢ6ߜo j7P&j8"ŇTP`OdFn|=N+.yS]w;u.bҎDS"?9S]D:ݬ.axҮ*Er%uӬ8QqP>ևX⣐Hr7!iA?&d&i3sh<&lkofFcq-E2#m"Vd Yچ#CIFKV.W P$5Y{:[EqX;Kӱ4#4嚯/|DuOQNuq 3'L#|rDO∞#. I=宂B<;43g}} -EǗΰ.arvxo[~+;] w ~}(8o>f= R6M"{'5pL 1Ϫͧ|'=oy?YR[i # 1 <' `Z?i6EH8)BZ(;05.t/tǚ(3;|k/tuQ7PI񇙢m_h03]9ĭp8pU8Nע~qs- ڃb}hY//FMUĜB0f*sPI1C,+^ɨ`dxOE2T0SGU8g`>Q,+T"ReU]Vv^,\#Ik$ eDzP 6] VcU(vdcx, rإW 07c ,֞~Du韝4 կN-D)L/KkWW8>s_zNzԀ$$wQ9Ƿμ`1ϐI @"RlG0^1"RGIW' OJ5M sapLBar]}s|ܭO~9[O<x=ο1{<8x8ih ),FSMҴ=2i,tĿ!M [kʕ:Hu1[[t-iZD6wA#MG/i>tcZ8hzUSO[ޔOgtv0W'5x1Jz#IΒ?%o-Wj=y->?6PNe*G. ~#)HdwCEݢG}?z2ect)% |jmp֢j%о1 aҮ>pLPkVM%qB/G3!Ô$f'jIB2 F$$Q TjѸh\D®L-k:V Dճ8DuT(@u%EX KF!*$8;Q/ A`hv5.aY)xTgb9;&$$CHyӞ{{6zInQBKQC{0;HweS!~o iMZmϴ5ijh5z1֚4Ϫ|!wV&v25djbjĈ-z҅A*+UVOTC+= ThL$,`ۙVc]@ε@wdF1@?r Sܯ*F0~es>[it`4?bs@}}S H 9 iPb &hn|yVk|6i+`{'wq#cqlUܕ>{ʁ ?wuuqw&ca:; ;Gz?Pt}JV+D:H^z&d_@WtxvU+A\d>O(_hI)[}9J__Q7[- k -VҺMHxØ mt}n4&7z c+AUK7d6Dg-#Ѹ=7']+& x9-gVƲ֍f;`Xof 6& fJjKCpbosWJ!ϗ;}Mș]b1|TX9:2h/AD+a1,A 86CX~,]Aa@ILYUn UhѢ0@1媆X '_Րz;Z+C礳Vl=Xw!f~8±l%^Gۮ.וwyW{湓ܫ=)ҝ@'T%t(4pCd~pi7_ݩDk(>=N&^|K>GUA7Iu3%ܩR+eeP\| 3!bq[gA2B'X,gIEAW PD5`O[#G:d9^"̓RKSRj3 uel; 60~rh&AZ)7 l W';YWϞ4 -o=j#3p:p(T_hm4 ||g9|񬔘]LbHY={*Koӥpv2vQYĎvL_Vw4Fht/5!]L,zYb`D$E8ND9'Yu1?ee3,^T<UN,YKw)˔ Jzo-QoYOrvWϩHzE/*#4CMQFgOh6(v'.HF!@hpV)yYp}"}^L'5-QwT[+wPwvĤzvq F.h *W;KpIW UOv[ gqzi"vi'wۻs0I@|W9$bHb/9E"ek"bHw$(E WI}`lPW9`冁/͉l[E-"nus0 A0D_; m~I^PQ(| zkxzΠ8Au=f{ 6̚@^`qCP=かyMWZ ފ[fdVd(F>SSVY" ¡MC@x&A.B%n+wg?狉 &~''~2DfmYeY94 t8 3!?qZ 79Eʫ[$j )cns9VQ!xibk>8-NѸ|)YTE4x( I*CBU:HD͞O x7) =N-,WeɅ$Un@и@ToIb$¦$-h ?˩Sjk+_!T$I:I,E-.7/% R["1F$H8 R"A(%"zc2^o̪$ČK_&%9BAThPO؉nwpM vPށ>sA_בl:R So:6Io!-ow:wwLI6?yB dGqNy]xN9Njuڋ{>{N?r}g?u >f'IZkiC~;;q 7#xO^eN1#wvNgS?L˘ȅ~`9)y/~>Sӡ Ensvzu;}G$W[nhs09[r5mcubQ;(adzH}{*wcQx2IW5xxf¯y:1Dhc}|"7Ҷo1 x7> xy. |o~]%o,-[.k8yYѿ"Zv;B^,>w`A`bt*+hcq-tbPJĺmDEA(m|٧ Ν;V;ʓ 6yw^o1ZۧXv8y|Jh{b]hxFoϚxvDzfϊ85}>Č7ts='NZ'c^0?6יs>]ߥS0FErS@G(eg/r|g{t8-%4eXG6fCE2G|F#ؑ%x_$iuz#0nAhGC/'5zı,ǤsL< ǔ]zЯx&Ɂ` Jc.+Y*)_QWqggU%"^2K6-Xݼ1gE}88MF( Ԝj5e昻ݥ|cm7|_7%fh&_÷g[d`upNpwuo )p&8"xi~`hy)x9Y@`|<0>B@h0lW+X!$x%o4(X+N^y]yՂk'OK Ҽ```nE~C_ւ~XiN!Y:ZdBeI,JJp>è&R{PsJ|1Tt8p3L,hgEY9p>,\ w-t=z,_Yb\K0swxa.k9_pk%UWbg3wݿ_|\k1zhE MUxgk3@~=mrpk+]o`f7l۠o/'\ۡG\;]zUw] 6\ns߄jv˵׻|@q$[mYEϨRJ+TXZ*kkv!5m5b .6&P=o 0T1Ԯ,3LfW 놪-(֨Bb2 f" * LGc(po(8nn̷w!G+Jk:BT_/FUQ+Ֆ)\mA`>6Hpy}2w$}Tz•F77 T_#JZ\{[\S$püLS%x]$& lWhG[s o7Jl O} ״p{kl _#-} sd9TSG> ӷ>W| 15@Պ尚[980* \jEPB (Ya znCq;+ PYmh~]0Y0P|a(T0TPyݱa+YE-7e%Ti8Ob7JFUa Y͞N4l6JY.ܞOv͆ ΁s&?g< 3>g8}ol ta%0U^(+%uh~+fv1o7c6RZRwg\s8gav+j ׊jmbУ7`^o\i:r,w:r w:hw>Ŋ{o^:Юq}vkvChAn0B+\C xwVh>v+`p+s} >̧C{ >g9@g'PwvV.hX4r-7 UwiYwiQ,=UV}^kJPϞń|#1綀iyy )7ai ^ywR!s'ŠjZ´:/X 5ʺ<LA{EO;\w/g~)͟+|b 6kh5C+w2^VI^3?+X5chPvLGK5/ϚϘ RO-u v 6 f 1CN7|$6nPaѯ’+(.Y|jbl&w0hmFY9\|(8$8?;ppi Ssq s.J|~TO(%r;[Rk.W, %ۧ+xcz%e?l uڂ8EB6_&2Dž',?a?ri޻ewMX}w;O{zٞwr[`LVz~!;.ʐm50Uw;s̭,kF(V͌ŖBCi0P> S0-w_Y8"ƶ'w$cؕYs9K-مD|𙆡"gCܕc&h6Ől,C) 2`քZ1mq9,Bp`͆"`˜~hF6фUdpq%}Gfl4`; `쇞>3*ؕSGUmF_+Cϊ֠0yk̳" ً, > ߃b%Q@>4bY`.%# FR4CWb UX>x5gw68hx p<0Rه>(ø.Au f'p.8z mpv # (<[p Ǡ=g')'~i Á<: 8gp~^s} 9%hϹ׮ˮo~෮+s](^xk ppsgϮ\nڟ\?\a s*hXaE XJf,hZ̑s NE &ϐoeĽ4fLbCeHHcހ[wH̐TP7wt汳6;+s%w)6Ԃf™H&Z6K%GwŅnhнpbfXi~[sEQOxMZ,eS[m nVJqKGY'4:H btutKc-:r&^/@xJ!Na(L H*C*J*%):lOĝ %ߒʚ5irS7oh>G ?B  1]0d{JceҸϩ4K\{SiGi%4Dil׶k5 i-A$1N1GiTAr*xT;ɵk e Ta7Cb'H:t0A?GfuWplc.iwݧ'yg~ƆeӼ}}]JZEA&Ot>V{,yqp̄#Gk~P4:ueF#cX /yqGGuมPco򈷏R[ߓ֏qr+w_you[HkH6C Pd(-ChZ^ۨЏ<Ҝt!HkbMB?̓%GO(B0OSvYCYK.Q(K27%\"oMY aY(#7KWمSP<`_.tDwLvD\3?\Mu.zt#\ e Yjcm(ҚHn!>0,QĹLՆn j-$"'7.GJz/[EIfEu7ȃۉ|2͓H$6s׫`` Xl4"/dn!ꋮaEWLB/@@EoXQpNg!Ύ Q-:L;>z賤PS d+ZNiy҃T=uѣp7m+yTIH&U5j?/"lg;KGV+!wꕄBfF oyЗX=}֧pKrVC&!d6ed>ԉe˱+\BJ/"2ed:PC#j#R+ R+"+!R+#R͉$D1$f\OE&byk>j'2Y/ 28p0^G s4P֦3) vPS#Uox;5OI^lvv0+m.Ö#e$}֨$/+'e| .#?*hy7nw)ҍV!]$[aL61z卟AvVBi W*i|J25hqQ5'{yST9m̞0GZh(֗vWi4D/Dޡi#QoO9S7*;RBl7Gh .ނܭ+mK+EiJ>wdMdfCwWb7$ S{^ =͕Cm9bWW!+!9`&v*jHip}EL/wfB.70 %J*pM[ :ecPK$(["l,Ӏ7m\ zm-(hw^cYC\Z/ u.Lh qN%Wǔbq[L)W9j]:lJ*펨;a]~"f^m0$n΂^v 9 ;0ocmYXv871E(]֫H,Y5'˾.e+uoJ{:e:%wo(W:ɿxYF ~J.6k PZ-c',?{e*ɦ3UU|C{1,֎i=kV߭IkD$r[ҋTK( YczN*}=|o_Y^OjoKEFQդ [CZ[[orA_ _e -'?mm9>قޑ!}. ;kQ9Vq[N}]94VPCqop/U~8LW^BwWƺHęec_9J(x"PIDs8WWҥA9DžA\ܘp*:R{:é) U"pN:ڕ{q}=ܹ/ Tz"3,2]}|w~J r?yc"(%}sURSJ Ւ܃C=CV)㽳|.]r?*eyxgf3cJ[ucA=COyecYMaLJ:यe?tbNx\L@;"4C9uG`|qԉOClHow5r 7h_2f="4OZmbIkݣo`׎;#j֘Ƽ+I# H$ Yd$J<`@,NcP9y\s d̓)x~v咲jwiE6A4 b.FDiDm Z,QW# AfL"{ ES_88:ds%{F8><%huRJ7;R ,?wV[oΖ `I6f/te{ KI=n-N*}2=BFdy|@ca8g*TR>S@|DY<@|"{10BQ_Bm ݉K׽-YJ =.x=R=_xkG9r2Fc+ q6~P_ x w2θ;YrsLg"S%'L*#$8%Q^^rcnYEkt=mN"zGeޝFo A4r|ADX'*6eHE҉^c'*w:+oY'^5#ȖD;cю@n<6,{rcаRpRUUO549>MqվcVK5=QHKX;砂aͲX#5;0{N*`U+Y"Vg,9B8詂*Xê?*fh Wfu%VC|9k7lOO [5j0G:̱z}jZx5NRPɷF4k N}Drl Zqi%ͮfϳXcCLǷZˡlCVe[Ao?uDtur/?Kzi(j@\PUE zo,#"vC/X\ ˶JF5>qY6./7zBʍ0)[cKn#:8Yq#F''k%Eⳅ`,t]H3/1'}Mžg"&Z\N#2q42\ׇikP;Aveil4ګUXrEZ4A48ALohyVVf:Y6YCO #d^K6tU+49Z{CTV\W'wcǨƂ{Jo}S ȍDaP-%q`S}IY n 6a8< r/em-VlkKAם1XYR̫1Hv 'N+$fm!Vq*jT5N ͻ egu=ƠlfJZ]V/NbA~nARg"qJ}uOr<`[E?11 <ѯ+* Vfqkh90U56Ѣ {x̂*;.a 'fm*-OۑϑZW=\!D`60}Oz6mKdN˃uOXח@$7 K;ju1[7UU \1SpU*kI#6WgPC1j9 5dž!(ڛ0o"jL57Su:cGLeiRJS-D$ 3xV2%+7{L06{O%lĪlo >іn2C㴒>f$6eZf{֪ŔXuwҳ;o>eZO+cнB/-rvL$('R i:\+/#h4ED'C@<9Y7(Q:Q:P$Ym>BvpQbܹ7'Fm8W`=wc 7Vu7\n sc_OĨ8.ܘ?\q# ,d $p# q'(bqaEz#G/vx7xq>ug%6<74^7gO>XgG fxS95|c1ݰ pyGr:W|w5چbtR4(S媢ñ: t8VGd&혅c Gf&DNIk4ӃNbfAb$qr/ %|W9>w1:7}eVLR٥42٣4FNN )fow^z\tzz++}c$f)SZjO_-XeԸ ߨe,bWt!N;Pٯk=K>$Q̬ 8xDGq&9Y+fDD1\(!B + ;ނc+ + mw:dR`!\1% }D!!_MnObR]ʨ):pB0 mBŝB1!˨FdޢZ5Q񸓎[S: i?]ϐvU &N~fT꧗H+BX߮< ji5}YMVmMYIp-5Ľ{@tIjsM[4:C=TwjCA,EeR{zvGng*Y; 0ރsk&,'ϖC$dcjr+@-NIMXRBe҂Ñm]jJ)^%$J(t+!'vF-# @Tw KӔ,Ǖ!s=&K ZŤ]v箳tHFr-`Y$0Mi `KBN+)j[G˦9nrhbWnm"NҚ(}B3B ,35 =+UV7P[GSD"|N:^"9|e:^*턳N;!whԷHRpZHr>P߮=go"і7rf?GF88y^p\7aT7uVέq0^rsg P~~.T<ʸ[R+(Oyn"k>UêOA [}2zkuQՅ3kF'Ͳ^A$W@nƁ" פRFS"]oNaz?L:O#]O‘wx).յpuD|i-Qhn&yWu¯TU___} +L#k;TWDǷ>p [~#Ut;G2xO:uȷtWtO'`guV'M!Q&bDE7AoI%7쿶Cθ1ITEglYIYT)$|LI~i7KD6g9nϙMX]/60&Rm7FgI<vS܁B&Uu~(؉Lzۣ]l[Y;}ɛvOt'njn>?/&t m7I`Eg[o#dѝ.v!]vI̗P;mR;d~SFInOr?ɝm8اSG)}h8d_bXwvgӃVw:NudW8c2!v W$?a&~#F iFϭ>{Uwo}Sp}[ =Q{<GKEp^Z=EITd_<Ζiethr_D}jyQkg^5?C2Sw,## a}q,͐U5ip_غPf;t7Cvk,YT0`vk,>N}:,EIⰓE?Y0na6fћHѭ$Xi^O~l6,̔73m?`@?^76mP$3#O,zTSD1'~?Ģ坼AӱЉs*eJƥۻ7ug&zʣE2uIs'αN t)I_ ]v6o֤.q]Zﺏ@uNa ,8pԀc-=@gQBhkB"pk>K2Ncc픚-S۩Jje JrJ]W8?"~9YDDE'~/3g &E#fn0`;h7 \f.WNk]FɢH;'^ ZQR"h8+ß~{w'M|ɧD~Wy^p2pĘWy<G}8:+/wvw_eR {$Wp#KRe=i֜f r }9p fFjCy/y} 57jjgUj]QSUeoo?E"~w5?:Y?e"Ȥf~.j;E\K'HngűS 홓?{mm8BMH N@BJk6UEEEDĆ"(zX"v(z8*񮹓Eɳǜee9(|iv1_T"$ziGl#.#z_/~mK#7.<#RHi"xJZVr=@kz\-wyISnK;R㲍: @w+u+95sxNܛ$%2WFi?TE`On_{|u[מ{:o3FtFc_3M/!N1VI8O]uj%c66n a.$ܒ+[-Il% 쿕a{8uʛ%/v&gV*GaoNMNZ'85҂1@~a' )&g΅?W f%;ZZZXKX u# Ǯfbgqz@Ccw@[2Z l,@eg}t-c` sos,}vN\9nE>*}-IieOgǭ>^v} %)U˧TX*Oď#^p]VUmUd:3tiJޛ;ؙ70SSzu̓zidMgqg/.&MpK;/ҎZ 5ۃO'˷2+36-\2ƻ$#%|6 g[~S3KnPi(vNvBh[zuni-ʹːe]->תnxg>0>}T}UDp'j1zRK%{KVHjs[6guM.h1obpJŖb'ًmƋ7.~VX^?RϺeh dd~C)*_ﯰ߈.֔GGd&6 Q\  .u0 .k/ {I [O$NpMY""8/,kSFʗWp3')|Bh\k‘ &UyUW_>'Y88͜fA7 mɏ*N1(u קל~3|KUА G sw[}PoGO!ȵG|FM"I]e%f!6#F~h-6ʏb ,_"{]"KzmEGKbxL}TgWEE=2Ջ:^Sv@zyFu+Tw.>)ru殠?N$d$$G $;zL6)G'"""WD?jsuzQ0_doc5 22?RTgr=YO!Z,s)ofiu\njE7nN6 ͥf]$]i47 SbvzY}*],zC饛mRLߚMdId^Kf˼RYez#uޣ\+hK]W#/G֑+#DuX9#2D΅Qc@G`=[N:F?:=~Vbp D9\i@?m(aCUfs.шζWG\UDVąe".,blKl~}>XF>Q`i>#JtdkNdai{Ty至PgS@Nk w;?8kCj#J-'XbN?1X:,~" NDMrD n9bKHDė"y ᖠ n ᖠ%IqsEoqnxm8?.J)C~*,ĝFz㧠)qgXw&g8Yc=_| ѳh\Xl\|!/DC޽Ķ\ /qP| r\jW.hq%s+rǫ<)e8̌|6L\yn ׏.n\}.0\Kl+tv^xTxfO8!G{q+?iE#Z<>ړWop@s9w' šYI!hDgU[s 714pQ)XS).9r DۘfҒE{#1SG@4) h!=!DV(AA$ i}Kpd i,\:B$$'ea9Bs<̭!@k<"!2g=fܰd"ڕ=Y8BM(HRclUew4н hG5~4Dihݓؒ!>@Aarma@T7t~es|bv=_ ԿAtz;#3f@M`1"}V$uկsTeOtؤ>I0/9娃rA-rDcA!0w9ü3@6j|F}cEP3mBGMBb]|"&/t#Ӎ s'9Pw[8Wn@g#aO hI'/44돔"t@AD`2:::#,%DZZZBo %%% %H">ZZZZZƃL ʡ k ߨ ?WM*Gդê&cTQYu$> 8 ޣIi6EWAb=Bt:l:]K1|y,<9tKՐG*|2jp*['Q1rsYf2s zSgWD'9yP/hԏgpp=S,{3~C(e݋r;TdM J^/W^2J+OFa_V [nEZ)>0Qr5:>UJ5XNJ@#cԳ1R{nZ&\5%16&MGk̮Յ3æ HP9+=1d!C3C ,GrQXYhM@nO%e#3n*@7 3k*6p MfM%ʠ̀ܘ1rc\ @p6 T*a1eqx@nq54ȦY>4s:ِ!!CfC̆ =HM` 5lQl;ng?0͐<<<` Dّ?O4ZYvs&?D-&z.%4.;N{v/|=>a}D5\HWqZ$zh4^w1 n]E4kBAjzJ_F5[CiD]N#;pxB>uR,e[n K]x %ƻڻ}=T% w:Cߨ )ry|V,7H>|Xϕ&G+;ltgFcE{Im2 mHxk)eE52<T >M՝\GnSݸGn&%qlu>qVk^gN:^N2 j(Fя+Ɖ/8h{H w}nn;C=7(qzƁB}<ɌT#*}V)Ĭ?'Mpܠkd{6G|KfYQu21N/j t=T ڋ➪NU'O7$[L7Tl9ٜmΡ|m=` IiT} 4l^A X'l6vg J-92d榨RʥConS֩ߕYmbۓg"*rx&L@&X@͑샪ʨ~3lWpL˅ ],='лFNLΉV9j&(]8ă-gZ ElzM{nC#idk6Mt r":>g ͢:-pLh5G?f=`4=(<3AL;4+B WCDbUX"t;,I~&8@M= |BS*ŞSS-(H)'Ȯ|Wq\~0O}K{9yzT# 韣Xj5'wKF>N-0$Yta> ź29&$۽E!Q0Z?fv_UUz\G\/,urImC$`MRSrGdOEOKΕ栒X߫)M MίxM]Vy^oWhFPrz dzګdٲ:EϿudpT[Llw璞 Gr$"d Y!Vt?vK}!ޠ}g3|jx\xT8yr[Ҫª)UVMu7MQzg%FZ\[m zz_#(& Kվ )Dl,)V @e\]T}Zzm:*FXmHߵ!9׆-7crSKRc9(^U$jt[by=m2Xy^⺡Y0d95GC}KY0~d3b0(gb3!g3Q4:>h&h>P?؁2CjC#E()4Ɏٰcˆ{RЖ"ءv)Br,oB.]Hl2aCTB20~h0VNCi-,O%D}G0}el*QLg o? n{*QfoA ̰'#N@'{.d l3 vu@2@1 6Oyyz2]~)OdCDݨ'Iu:ލn t]\Q{Cl]wIn09$e T3v5Gϊɱ^֒unW@̦RlUqzILiiC}PT;A5U,~44 J9L5,2tF=:t[=I 7{XY( d2 /SnS~vQsSD̩ۅ :4<[UʇcWtݽHmDH4/o:{pr*/\\_WDu=╊pzEIO,A^j.!dL4{K`խz{v;#o kmj[j6V6/M?k(kb!m'X=vv c@J^'u"NeOqdQ#s ^0T5ͷ퇢{0clٶ?BQ#j,E iTWe׏]_!Վq -v"۱ɶbf13h3k$XvH"A^ Q'R'\,˽ pr4Q D1L4!8fYk+%ie8-ƊB+ a(ƊBg!s B SS`?q")DO1ƋD#$|3F"!&BbMĚ5k"$D2aHA#v71aH wR1ƱYG Ǟl¾2 ϝ׈+199db@3rl+ṷSxxilƚb3 7kS0j5 `o(^~,7#=bxWDwKf<&4*c'mN>B<~f &͌ [uK˽g<]m5\:O:K1`H P}U' 8. ,'bAZNJ _J_;V!|Bmf6Bhn;8d'5. iQ m6tMQ;q !k6嗍 ?v' 0JG@cGD4B|~#c#@d#@d#@d#ȝ?@5hV`j}-Łl #ʕW!2f"@L"#p"F#` '&xD'S˝h}[I\t(6HN>C#$Mz%Rb2I3IF ;bb3(6R 3kO:K4}CwZq ė>oQ/H7[?ovforjm3]ϴ6mMXVVI4}UV\.r=)w8׆W \N{H|-#=n0h#,tMxk*Z$c Cuzmw$Nbuǁ: CdK QQ>>] :YkŹ)vPc;CΤGP[Cm ek(ҭH5=N?b7؆6̦pi5"^SH}MeMal @jgCh [5[>u rmS]uD@ @K [G#w%e-9cl!)VY.JB@.YDZ*t TB%DY."]f!BȂ ,8 26_]}~i,t6Ngll#o6\Tᬚ gl]vDπrX;g!l䖞EpZ-$niu~] !խRED/[I(;5f^wqk^wEڸˑ6Jzf ͖l=4.:GvL< 3.bs<؞㋘L,&]SoENB,ݕ5bZ_MQNRk6CI2EtY"ٵ4 }$s3nS12pbՑ̪Z+?,g.UB>A˄9Wĩ %f98ѝHG'"UvɈ#[41Xdv ψr|z}SuF2Ho ^򪘝t81.&ϴ0{EfJ&'\q*8-MMn*QKt"]cEޯnLaɐ흢0KSjʓH+SՕ-.ji8p\H:e:-s./13MmR3z~_ݠe.}wbX'kxOl~!Z}Wd-6zjYŰc̚Q%L k4 m-6e̯,臖16R;ʊ&ь> Ʀul _9&=/v4oӊz bªzb:ӧpj.leec@0 P3@0d- f, ʉfec@90Pc@90Ue#e Q 1 l>xEpʃpxp_*{C8a{oew,@{/b:ilN~{y5>l7ܹ;Gts> _$ n!/D7!# }q>3Fy)3͛zQg|ʌx`_Ǹm2G1 /d32N\]?x;Ǜu+BV!)"֧)Ԏ^3i53fy2t];܋ވKpF!>=ZCfDx3t[Q~Dz8/·  iSg6E4|U{+n sqns]xKSH?Z^}Cre;9~ޤ~nw;EFWQ aV[،l:7\-׷&`4k\mdI5 RFV}TW$@,KCtD03kH4X3i&T `ynR `nV`D0ha\鍈ް:7Ͻa\aF`VCVs< Y7ȋDDDXajIKKkK J6|oƣj󘋫%:]l3Yp2SӬ4+F]-`2l(d`h`3Ѭ h(1aD  3P pfsi׽9K셫s h,#Q```ZZQT (d8**DNDTTTTTTTp [!g%QW.Fp%T.*P.šj!zi)EWYz9W•sBUDE]kQ':'>nQõrnH#8hvQ r6B&]I#WDc*"x4A8L,s5ζno!b|W5}ͻ6e*Qe}*TUw?VM :ÜC*k{u5#6EZC\sb{60?|+r쬲tc5U_y}ho"'=]&W{j]c8q{[ 2X"z&ѳ.l̋":ӅgW'67q\%G;Z]b+= 1[|d~4=?Vͬ19CZ=03H{GLn99i*B9 Λ^M_<0G>~=obutţ銟U=0'.N{.n<{g3oyJ|v%cp4 iys| %:4hNptbq-G{ݕP2ab;o~s b >2l_|Q~MǠ^ m$6Ru96G G^r"[䢦"j7-8V2! ¦C_Ɋ:N]x`~]YGM ?CO@i`7`(NӏFyO ؒӂv ϰ;R3- }wJ)ZztDAD $4X"x$j:S L}e:ݗ$Ȁ }y&8Ngf:st|f9LgLgaL,E`y]3p8ST0e̹.\vLgkYAdY`;\Tu.W\f9klep0EuD\Jq׬W]N,C^ %u4~Ƴ6eJ?^ Jmn$:"z!uq7n&&K`f%6ŶkFP.ݖݖicHmPEa ;!+!wfV;n{]+/@86! -MH% `}uhík-HF!!m%A-DgAk kD=T:YK=Z5t8t ݂{{ɜL ˞qﱧy3{-71fnjnoit~_}*CuUM8Gx*Msrt(*?J7TN_)Kzŧ3IG ӇJ~Ul(?M؟RB?Pzo<3H}M7d~P tfÜ<3[1j5ulnRS`NK}RH6:BV}ퟮ&2Y/"AF8&Uډ*Qs6:?9^;ONyr2K9&̯>浣' !#|qK0pv21يc`1!eznMZuW0S_  t\v tfHYfD[@M ٖG)L/X[{~pl'eX2gtyYcLctY4G5t˹LR "qJ4c75ӵdeGmͳ_u#3AL|0`~í#7 /,c65lj-B0"uLc""wu`#3|QYOe4XG,E4;lo9Xb}ͳU:O0s;X|*0qtWÜu5Zu-\!n8^zt}F`кJtnB4BMX=؄;hƻˋt݅]wh~V}Ƈn%0>DtӸKaӶ c_ƾ#(1X3?nMS˽^=4ⷿX~ oOғ>ә!=cҬ#am=ڶ`CwwHAxODD!,:xEDu[b=wٶǺ}uXw=0%: ZX6"gAτځ 3j&4lѝؤiE9߃ݹ/`hw L/ŒjAmь4#fd;>Rrt>/o*,QeVu/WSX_A-/[dwt'Fz3ۜu3'==⥋UC?Ta KkHs6&ni1I;MkoCf[]h v&`ak Fv訇z]鷞(]znZU\yXv*h-\L]O 4 3-6@cpfos3*6@BmXƻEʝX0w} >[i|̃l m4n=nNQ#iLj>A4>I?OiO}ƝD&,$NQr: A= -. \cqq;Xc ϫ\,_㥖)Wb(G@h#7D|Nﵤޛ . bxFE,we}[jOP:Mx=JM$>a:ǔ&lcUQߒp1\K .Rs>ќ&A֢(uеL}z[QMeQj̑!CdC96=!5P4 +w99CBdZBi8t7Ltz==qWWhܡީ/!:s^PtxpD>>"$:|dEpc%f2_5Qy,Q'6&( e3 ͠[0`M1X)6hmєh+_kʲGCm?;UβAj0, &`׃$2ד̺.BG,=:&w:BߚCt(]H`2؃QFyS`=־Y^y.9 84JKJ9K͔e-r8 áEG@SN@qMz%w*#:i䊫#YQdQd1ÆY^/.̅^Ά08{Hֻe`(_ .,p6E$0%0rVApXR8W#62kptbH). .̃06{яK{'` O-V}g6fLεbiyxC6Cz-72mmgR|b7SՉڡgf7 3\iyĜB{ļhDߡoMHou_Y4㸫Î4ҙ&5:Tׄ  _ϝ_U}+1oɻͲ˽E'ݧ8yzܩJ/wԫ_*X %~oaVe_9Vk}O)3WNgMZ4]bQ)l{v1ZlM?FpMۂn =(7b1Q6;Ec0`I Co6X@8Xk!?Ć r >+3;9L~(PhCSPxb&^l-*^mٮN|l]b}|.| } Clhp9`!Ȣ9Dφ>xͥ6mذ }k7AxQ[0E9ȑˌ1X+^cevFûvЍŽZ^&o\wQvx|Wqinw`^ԙPxБ<ӞL{3L 1N#D}293K5T#|N]!jh?~js'aBCV$eG, dgա"ŢɵDX>l6fp誙j6F_͠ӤZ9hC }K ͂x4CévxitBK/}y VRV֙\lm_"͏47[ n o`j(?v!m,}T#Fzׁ<"_q~ QZR;vݫ=wz|/M7n1ڑ:S&o@΃zm5^p^ "FJKjJN~W!'dUXMwd1t~N9.i.>[wL/,DDqy@]tSCĿX}(Wt*&u>CJ}u8g$ZuǍ[{qT'qHp>A|q5L1\B)!L :Y`Xqts=No$z~Z37-`bH*H-B`fcUm췟:<_(j-nz\8#7e kM!`jq\PARG/ 1~=6Ənk:wD~h5PGʮNA|Uz0}r0j} oՃϝC VedP@9_+{$٣j1 mm h:zX)t2mWj5*4P4m,,Ch1_eИC#ׯMCXQr`́NlFsɦA7ltih: H/MiϦAO ±hK6A8mkJ; g8`4}TX95n *t{qnP.bp'%6eGJ\~t>[*TǔHH;gzpJCsd4GdU{y6C)3}7Vpb* ?ZFXώAd3..]L 3֊?P#P"X˥xDV6Եum5İOTffhS|mF}:V6p1;򘝉244JGs64pDP{P{~8~0X9O pv[S a}hf".ݰ{{JEemz;ޢԎEKj:rL!n8N>.+9\GH@)c4nnuQ!>P6xyW[Jx*[DzzT同Iפ5$ѷo~ y o,/DT^AG% Z:o2']jUsrpz?%mggNrJCrQH~4㏡#N.IT?tX?duvhnk@#mc(`+^FW6ژ+,&M 4Ef8'@hD𶀢J *|@%Uqa#ڰ]]~suՒ`y7 퉈^T"f}rc"| l$$&0j qLA6<ǏUA6<&qh}[ݲi :c$=8烥F!qջÝɂI%F* y7mzPq"*>,&biv?ut;x+bh9qқMC\KR8HYn`0*5M zT$ y%&Q%*A%HLLMV}{jҪ\}-Q4)flb4_-D7@k%m|KN !%8W629/Ne..U] xU$А( Aa 0$rNE LTZTD6MEQ oF |舎>}2sNp}|9Ut{vgO+ g,ܿ Αc_9:7(n~͐Dp [%c|e^VˡZ(3$p C!TCMsF; ]d8\ D"3ᢄ L]D̜\`<`6lD hLi$n!z93 gWw! I""^J8DR,)B!K2'"dIYR, C"dE=dT<!{ȼx(BP!Ӓp%-Nxx;*>]W*n?w2 tX~gekWzv= J:Պ2 C̃<3yU4=LPϿVqu#;w{:#RN}W'RDR̉HlK^J%')ܓhptvDqiDO3wK9h1!E N,QaT k~ePIˑTC()pC)}IeT2)iIy(, gC[hA?Fq1&EQ@ yL`N#<44Nf(. ]@I Abt*Tyg8&P:R8vc!̀7*%[)=ADG9> QNrBޣ(' ~9a< $|=N%:|/)JtZ%Z%UJ`L[}c,}DsݺݺNlWnk g8~عg,g<Wo았dMAV#dh{Znoe/̢uGh:\c ++\\9岭~2mv?xodH냷nOD ?j'9kZC]k5"t5!va t-^ +4zx=shO:QSR::$c է6ۧdd!g h}u?CqV=Yzf෴ Tǒ⍧hOSQp=9{qpJvV;K՛8*7cG`62(_d" r"o2ދSE%#>#[͗=_j4FV1cY>f{*ᬈ-d~>El8sɦЖkMZ%dϜ`l'ڋM4"OaSs 0;1%.>_0jv/3Ho :T߼ј7jK '@vXv"a o׊>!k,f.` {l&/gY<+7bY>ܘe1sV^}gc8g6;㬚Mfi@wЌwk)ŧ=_MjDT_d|w7cP3Osx O啼f,<,3r!ܻdMLxK__+ _Uʰ}ʿ f/jc4ceahʖl's٭w0o2wֆu21vap5;M~]"FEi _Mow4R75R@?-0ޟW|*yIJ.Xww缍& ;?{;j!Le쏬/$xF 8ĺZkmXeb8(7{~/H)rlM$uiY}8,F; ˣ19Or+'Id&kN_M4U^WSe̓nnZ:. ΂~=]d"{~Q+ڟh%HFHdD?ڏg?)slQO?EG:oNu? $ .cm d=@&*loca)JTU7$maxpo$ nameI Dgpostl*r &Aprepň+S6FL_< {{Y?646  0qr<B4B4}dHL 4` FXO[CzqkN*0&'&&5MPjh/*\UrzmP?cFwD}X=XXX=XL]~{XlX?X{=KX=XF5_9!! A;XdBdddd\fi$OOdO&ThXqaXXvPPODOF{1PPgvTcPjd|djddddrd@'~d+ddb.dFdDdZddjddddVdd4dpd dFddxddd=XXXXL]L]ZXzX{={={={={=d=_9_9_9_9;XJnLnLiLghlOAf$OdOZ?r?zGdq) qTO??GGjdOPPdd/hg {f=?=G=$O=?XIOOXzGXzGXjOXzOXr?=c=c=h=cXXz!ip gN]tL]~P']q!~{XXQlXXlXdfXXlXX&kXPXPXLR)XR{=G{=G{=G =3OXPXSXTFFqF~hFq53P5P5P_9q_9d_9d_9P_9d_9P!v;;XcPXcPXgTTiPXi}XB=OP MUXORl~5J=! XazXJk!]aP{==IO=xOP4XlfiZPIKZQ D9EPw`al!X]PlHKICdzo&?|ddjdd sX zd OX[dX XdjP]gZX ){=G_9d_9Q_9q_9d_9qtfh]gAf3={=c{XX=O=GMb }X zd O=cXcSXPlOAf=OlOgXr?XzG;g{=G{=GXTXq_9Q_9qF{53PSXXIdOl?lXrPBLXdO{=M{=M{=O{=G;fi PrPpfkO;O=$O}X7{CP_55X[XdOq)=pOBz-2Og8OI=P"OOoOOflfeeOMKdKOW#XLL,)*Qr/iRX|dfPWPP:QOOOXOX|0=QY 7Q={5hf b1-ePFiPETpPPSIOjXd423NqQ5PO^QQOBAbOOOEPP@PT&X^XL O ddddd#dddd)dsdd0dddd:d:d7d7d%d$dZdZd:d<;E:d<EddddllXdYddddzddJdddddGdddddddddd$dddZdZddddd$ddQdddddddddUR@E|9^:GudSEF4"0R4lbpzh^6O(u&e|_ |-4,''#&/'\-'<e@PP)d)de@dJ_2UJ_wfydH]M  I H^Fceccc{ELh{c'cGe{EdKcrS3S Q Ab ^P@(T nVU_eVnV<=-VVZ52Q<g<(P7<VUFVLV^_{RZQRVF)KO)QtTQTz(V VVrQVQgVTVRddFPPhdVZLVZdAeFxP$Pd^d/P^P0V[cQVUU'KQ##|(ZQZeeRdHZViX(FdRhee3 eeeeB,e p<a\ddgd,,eHdReHR3 d>e =d =dRddH ivV8d$ZTddbU dedd@d@aPdSAUAK$UgdY@Ad-A-A2A"AJ_e@ddUdU-(Td$U{e~cdd!Wad@F dP'Fid  Ji AbF( iF{((2 <{HUK K H9U_U H (FUdPn6Ndd@d;dKeJdd<T(bdd d da\eddd d[dg<(|2FeSAe}AdPH'UH$URd;  ;  >@RR d ddW<<<<Lj p< ddsd,Pd+aeSA,dc\V\VAVedU]t\ p< da\erSLdd@dd@{HUUQUHJ_3 3 3  deTddAT>@ >@}UUUUF_XFp_dd ;d}A`HFRpRXd=P2222eJ3F,2HU v gdaL22d%AdAdWj < ><odP,P|<2KF}F<-dFdK-FMP<M<FF7K(Y<FKFFDMF<dF_F6(ZaF3ZMQ d{HPddd<KdZq_]ZZ_]H_^F']Z&_Z^kZW2"P<Z2P_%2ZFZZVZXPdQ$ZX|<U:FZded!d!ddeDdd$d<ddJdFd<dd,ddF<FdddZd>dWdZdPHZP ddFDPP|dZddd]]]EZ]dZdd2]]22]5_5db]^]Zq]dddRZ_Zi]`Vnn?d"](P(:ndeZd BFhP]FZn]g]ddZPUPPPPPP|P}PPPPPPPPPPtP<PPPPPPPPPPTP|PHP|PPP|PPpPPPPfPDPPPP|PPPPwPFPPePPPPPxPPwP>PP-PPPTP:PDP=PPPPPPPPPPPPPPPPzPPQPDPPFPUjOYQPIQIQP|OPg)}PdPe/.$jatt^fXiXiXi=$OX?XOXOXOXOXydXzGXtOXzUXMX&T=cXXXXXXXXXXn{XX{XX{XXlXdlXlXlX ?vP?vP?vPXPXPXPXP{=G{=G{=G{=GKXFKXFXPXSXtX#SFiF{FiFqF5)Q53P5i:5$:_9P_9P_9P_9q_9Q!z!g!v!v!s!v!v AT A:;XgTXcPXcPXO>v\fT &&:.M\fBLLgJggJggghgXdOXjOXqX?XX~GX\GX\GL]qL]t{=O{=O{=?{={=?{=G{=?=9?=IO=IO=AG=IO_9P_9P9EP9EP9EP9Yd9EP;;};;X)abIU''AddZd dd>~>d>d>d~ddddd*ddddddd d)dudd7ddd:dddd ddBdBdd}d$d`dddddd0ddZZ&&>dBd&&xdjdBdddddd]+d)d]]3ddddddddeddddd ddpdddddddddeddddddddddd dd0d ddGd5dRddDddgdd d\dldddIdd 5dkddddddUdd-dd/d=d7dZdEd|d|dCd1dd|d|dFddddddhdddd}ddddd @ddd,dWdddd)d"dddddd%dddd >{Xd<dd^ddd ddOdHdiddUddpdNdAddsdddXdXdd dddddoddhdTdH"sd`d`dd`d`dzdzdzddddcddd`d`ddd`dKMK K jK`F +F hFF -KF 4F qFlLVL mFFFFFF F xF.FFF Fk$ZZvb dd dB=PQddd d`d*HJ:+dd+dd+dddddd+d+d+d+d+dd+dd+d+d+dd+ddd+d+d+d+d+d+djdddddd+dddd+dkdkd+d+dEdEd+d+dEdEd+dd+d+dd+d~d+d+d+dd+d+d#d+d#dd#d>d>d>d>d+d+d+d+ddd+d6d+d6d+d+d+d"d+d"d"d"d"d"d"d"d+d+d+d"d+dd+d+d+d+d+d+d+d+d+d+d8ddmdHdHdd^d^dddOdddOdtdddd2dzdjd`d`dd*dddddddddd|d*dd*ddddd dd xd dd xd d d dddd5d2d]ddddddzd ddddcdddddddddddd2d2f2d2ddd2djddjdjdjdwdfd2djd2d2d2djdjdjdjdjd2d2dMdMdndddYdYdjdjdYdYd]fYdYdYdYdYdddddddddddddddUdYddddddddDdEddddddddddddddddddqdqd}d d2d[dXd~dd2d[d~dddddddMdMd0dddddddlddddddBdgddddddddddddddIddd{dAdAdrdrdqdqdddddDdEdDdEdydydddddddddededNddOddfOdddddOddOd9d#dd%dddddFdXdXdXdXddddd ddMdd:ddOddvdD2Md=dRdRdRdRdd(dddd^dddBdddddddddddddd^ddddddddd.dxdddddddrddddddddrddddddxddddddqdqdd4d4d4ddddmddQdd@djdEdEddd%d%dEddMdMdd'd'd'd'dqd'dMdGddTTTTTTTX'd'd'd'd'd'd'd'd'd'dwdwd'd'dwdwd'd'd'd'dwdwd'd'dwdwd'd'd'd'dwdwd'd'dwdwd'd'd'd'd'dddMd\dMddMdMdMdMdMdMdMdddd'd'd'dddddMdMd'd'd'd'dd'd'd'd'd'd'd'd'dd'd'd'd'dMdMdMdMd'd'd'd^d^ddd'd'ddddZdddddMddddd td d'd'd'dddvd'd'd'd'ddddoddodbd'dddd/dtddd'd:d'dd)dMdMd'd'd'd'd'd'd'd'ddMddMd'dPdPddddzdddddd ddddwddRdd'ddGd-dddd<ddPdddd<d dPdddddddddddZddd^ddd/ddMd d dd ddddddMdMdMdd'd'd'd'd'd'dMdMdMdMd'd'd'd'd'd'd1d1dddddMdVdad'dMddddfdfdOd\dddd@dAd`dd*d.d.ddd$d dPd]dd8dduddddKdududdMdMd'dudududud ddddd'd'd'd'ddcddddMddMddMdMddd'dwdd'd'd 5dd'dddldldldldNdd]d'dd'd'd'ddddddd'd>ddddddtd'dddddddd'd'd'd3dAdd(d,ddtd#dld<d?d^ddd!dd'd'd'd'dd8dgd'd]d'd'd'd'd'd'ddnd'dndndndndndddd'd'd'dod'd'd'd'ddddddd'd'ddddd'd'dd'd'ddd&dedjdjdjddd,d'd,dCddd'd'dXdXd'dXdTd(d(d'd'dd'dvdvdsdsdddddsdsdddsdsdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdNdd&d&d&dd'dd'd8d'd'd'dkdEdbdbd'd'd'dd;d d d'd'd'd'd dd dd'dCddJdd'dd'd#d'd'd'd\dd>d>ddddjdjddddd.ddddIdIddddod2d<dddddd0d0dd8dd'd'dd+ddd ddKdLd\dOdz\Quda\fNPXXX2P`=?9K!,O O{ONLddFZXPV-PUf@PY(_U'<V_Z,,V# #XVJV;R<\VVZ^VZ<P KHV(ZZ.Z_VQdYZFc\ddd8dYdddddddddddddYdYdddddgddd|Fddjddd dXX5PQFf f Sff*f=fB=PizQ{XXz/6^+Q+z)bxM=O =OKXDGu+l$=O=JOa5mdFe!g!}Ez-N%z8 S?3SF @2U`dOX sPPPQtPh`?/`"D}atmMqShSDO9zfZddjdJoF}5/dXP.HO,X5dW5~:`SZ4 =OTdd d8QNdZddLd xd*dRdGddd%ddddd4d9dad W WZZZ{WEd'IqNrU  S=d*dNdd Pd dddd ddFTqTTTTTL{d &d >dd dd, \, x~XY?Nw/V_?  "5ky ' _ q !""#5#####%%% %%%%%$%,%4%<%l%%%%%'''))))))))))))*+,f,v,-%-'--...../.@0L)We H  YZBPz1Ya?   5ky  0 p t !!""#{####%%% %%%%%$%,%4%<%P%%%%%%''))))))))))))*+,`,g,w--'--.. ....>0L&0WeG 0/ ih65/,+"JE߿feeeeeeb6b)-z-TXN?T ' +,  ~boXIYYZ?BNPw z39@AUN/1VY_a 35??89_`a     "55kkyy   '" 0 _: p qj t l  !!!"?""?"#5#{# ## ## ## ## %% ,%% -% % .%% /%% 0%% 1%% 2%$%$ 3%,%, 4%4%4 5%<%< 6%P%l 7%% T%% U%% V%% W%% X%' \'' '' )) )) ))h)) )) )) )) )) )) )) )) )) ** ++ ,`,f ,g,gT,h,h,i,p ,q,q',r,t ,u,v+,w, --% -'-' ---- .. . . .. .. ../ .>.@ 00 LL &) 0  x }  WW ee  GH      ""    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a2qdei4wokuj r  gvrl{cnQm|8b%&./*+ 8fCD 3,0:py, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-, d P&Z( CEcEEX!%YR[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #BEX CEc C`Ec*! C +0%&QX`PaRYX#Y!Y @SX+!@Y#PXeY-,C+C`B-,#B# #Babfc`*-, E Ccb PX@`Yfc`D`-, CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`- , #B EX!#!Y*!- ,EdaD-,` CJPX #BY CJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B %B %B# %PXC`%B #a*!#a #a*!C`%B%a*!Y CG CG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E #B #`B `aBB`++"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-),# bfc`KTX# .]!!Y-*,# bfc`KTX# .q!!Y-+,# bfc&`KTX# .r!!Y-, +ETX#B E #B #`B `aBB`++"Y-,+- ,+-!,+-",+-#,+-$,+-%,+-&,+-',+-(, +-,, <`--, `` C#`C%a`,*!-.,-+-*-/, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y-0,ETX/*EX0Y"Y-1, +ETX/*EX0Y"Y-2, 5`-3,Ecb PX@`Yfc+ Ccb PX@`Yfc+D>#82*!-4, < G Ccb PX@`Yfc`Ca8-5,.<-6, < G Ccb PX@`Yfc`CaCc8-7,% . G#B%IG#G#a Xb!Y#B6*-8,#B%%G#G#a C+e.# <8-9,#B%% .G#G#a #B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8#CF%CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-:,#B & .G#G#a#<8-;,#B #B F#G+#a8-<,#B%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-=,#B C .G#G#a ` `fb PX@`Yfc# <8->,# .F%FCXPRYX +-o,:+?+-p,:+@+-q,:+>+-r,:+?+-s,:+@+-t,;+..+-u,;+>+-v,;+?+-w,;+@+-x,;+>+-y,;+?+-z,;+@+-{,<+..+-|,<+>+-},<+?+-~,<+@+-,<+>+-,<+?+-,<+@+-,=+..+-,=+>+-,=+?+-,=+@+-,=+>+-,=+?+-,=+@+-, EX!#!YB+e$PxEX0Y-KRXYcpBr^J:&*B@yeQA-*B@o[I7$* B  *B@@@@@@ *D$QX@XdD&QX@cTXDYYYY@{gSC/ *DdDDaa 44aaA4A4ff4'4aa44EE.VF+ 4$VF! 4YYzyj4imj4Ld4d 8|8 (  , |4pT<lT(4\| D !"P$%&l''\''( (\())**+\,(-.../0X123 345h667789:;8;< <=(=(=>@ @AA@BHBxCDDDFG<GGHI8IdItJ@J`JK$KKL$LPL|MXM|MMMN NDP0PHPlPPPQQ4QXQQQQR RDRhRRSSSTTTTxU@VV(VLVpVVVWXX$XHXlXXXY Y8Y\YYYYZZDZpZZZ[[4[X\\@\d\\\\]]<]`]]]^^$^H^l^^^^_ _D_p___``,`P`t```aa8adaabcc$cHclccccddHddde$eHelefgg8g\ggggh h8h\hhhhii(iHjpk8kdkkkkl nTo4oXo|ooop p0pTpxppppqq8qPqtqqqrr(rLrprrrss$s<s`ssssttLtptttuu,uv w`xtyxzzz{|}~LT8l8@H8 ,(tLDTl4Lx8\4|T(l< 8d<`8Ph<`@l 0T Lp4`4X|<8t0\ XXH 8dĈİx\,X|ɨlX˄˨ HhdtL8Ѽ$xd$D$4ٰpڈڨHT$@Ld 0T84Hh$D(8(@X,D44L@lT X  d    P    4 D T t    ( ` `| \H X8<,p ,$P|p |\p(P(<Xt<\<  p !$!!""D"d"""##h##$$<$\$|$$$%%@%|%%%&&''@''((,(\()))**+l,(,,,--$-D-d----..//<//00 0|012(23@34`5567889:h;P<`<<=>??@@@@l@@@@AA$AHAlAAABBDBTBdCChCxCCCCCD`DpDEEEEFFGLHTHdIJlJJJKK<K`KLxM\MNOPxQ RRhS4STUUVLWTWXlYYZT[[\`]],]X]|]]^_`|aabbcdedf@gLghij$kl<m,n n@oPoq4rxrrt8uvwxy yzz{{${|P}}}}x$ DhxPph< 0@(8H ,PhDhtpL\|hp$4DTd|tH@dt8PtTl( L($P Dh€tŨ<ȼxʐ,ˌ̸άLpӔԌDp՜d4X|,xtݘݼ޴( 4(P$H8\LL$T<l 0T,4Dh<`0h<pHlLp  |     4 X | \H@ xL "\#$&()))))*(*L,<-x/80112235545`6809,9D9:8:;8;<0<<=>>>?@@@ABBCCCDDEhEF`FFG|GGHI,I<IIJJJJK K@KKL`LM@MdMN,NxNOOPhPQ4QR R0RS(STHTU0UUV,VW\WWXDXY8YHYtZZZ[|[\\4]_`8`\`alabccdLde`efgdhhi4ijkklDmmnno op$pqr rsttttuvvwxxpxyzDz{,{|h|}0~~@l8\|ltL0@P Tt44@l|X \ \4(xPp<phXPd\ X@8<<@<dH$XXh\lDh4 <4pư\ʨTD̨@TT`4XԄԨH`xդ<h֌֤ \א8\؀ؘHt٘ټPtژڼ(p۴ Dpܜ \݈ݴ Dpޔ޸,PtߠH|<x 0\T8\<xDh,XH|4Lp$\ Lp$Hl$X|(0@d8l<p @tDx 0TxP T(LpDxH|,Pt(Lp0Tl,Pt(l$X<X,XP8 p , < T t    ( X H`Xx<DtpHHh`@0|x  X !p!!!!""0"P"p""""##0#P$0$%4&H' '()X**+l,,|.t/0|0002244<4566(6\:t<8===>>?AHAB(CETEFGHI|JJ4K KLLLLM|NOHPPPQRLS0STU@UdVHWWXYZ[\^_`labpbcccddddefggphXiTitj4jkDkll`lmo0opdpq|r rtrrrsthuuvvwyzz{{{|,|X|||}}4}`}}}~~<~T~d~|~~~~~$<Ld8\l 0@d4(80Pp0l8hX<|4l`ht@tL$dl0X@ h@|$Tt\0| D pPHT`XTH0 \\(l8\,X@dd $<h040$Lx4t88P|,X8X˜È,|(ň<hƔȴ$`ʔ$dˤ4Lp̸̔@p͜ Lxψ$PtИ8\р8ӌӰ$HtԠHtPܘ\ݸhDpߜLHt8X$dD|$p @H Dt$($Tl(Ll@d@lX | 8p$dP8`8h0H48p(TdtlXL| 8(XTx$   l ! !X!x"\#X$ $%%|%%&<&'''((0(h())<)**T*+P+|++,,D,,-0@257 77,7<7L7778@889 949\999::0:\:::;$;X;;;<4,>d>>?(?`??@ @l@@AA(ALApAAD|HlJ$JDJxJKKKM`N NQQQRRDRdRRRSSDShSSSTT8TXTTTUU4UTUUUUV$VLVVWxWX0Z[\H\\]`]^,^__0_`_`,``a$a\aabb\b|bbbc,c\cccd4dddedeefDfggh4hhiiDitiiijk klDutxxyTyzz{|l|}@@ LX4LD@<84(pH  T$h8`dPDtȬ˘0XҌXTh`0hِژ8ۄ<܀h0(HXxT$XxPP ht``T  $`t\L`<`,84p "`"$&(,*8+,/p8T:$:p:;P;?@$B$BxC CDDEHEF\FG@GHHHIJK$KLLLM\MNN`NOP\Q<QtRST$U,UVPWlWXXYPYZD[[\\\^_`bc0deef gi jl m(nnopXppq<qqrprs4ssttxuutv$vwx|yz4z{| ||}t~~(t8 8X0<(8 ,hL$(Àà@ĈD|,DɈ,Xʈʸ@l̰`$ϜDєH@ԨՌ4؄لlL۴Lp$TX<@hL8$t4`@\X8H40H`(tp$H@(d0,XPhH| @@xx p     $ T,`(XLh| DTLl \ (  !\!"""##4#T&','\(L(())4)**d*++T+,X,p,,,,-T.T.d.t//00\101@22<3,4456789;p7.'@⪒&2*@ 2 (Zh!OO!"NN"^V"J0&ЀZpX(B&xzbN"!OO!"N!5@ JGK/PX@ [L@ tY(! +#"&54654632.'>B*0& *ZB0RXRX2<2LTN>*4*4((l #)/8@5/*%$#  J_\L +3.'#7.547.5467>54~\Bp8ƪĪ`"\°ʦnP`PZ^F,@NFvBnV0>F|> rtN|^Bx>q$,W@THGg  g _[K_TL&%*(%,&, $$  +'2#"&546"3252#"&546"325ppVqv}qv}0V.«çWD«çWDk8>@3/&;7) JK PX@'~|_[K`TLK PX@'~|_SK`TL@'~|_[K`TLYY@ #"(#$ +674&#.'36#"&'%&'4632674&#'327367"^Ex/tSfy dtŶ>OK^J6ssrseh~eF&q[dZj[ %raMaF~mf6>8 7iNr0+7 t^4^@ 0+>"3T0h@ 0+'7h>>V&:G)V' a@ JGK$PX@~c^L@~|W_OY(#'! +6327#"'#"'&547%632%&l<*2B>4\8|`RL^H|F.ZH@BTV&p&m7@4JH GU]M +573#'5#'7&5m"+w$h"0h$&r&> 0+%'654&'>7;Y% &jQOuKo{l:'WW,5Z@JU]M +!'7!"$b*h&rMF0+.'> 'YY' &[[&FY' &[[& 'YP} @UL + #* rH @g_\L$$$" +4#"3>%#"32/a[eE]_fDż9[Yj&@# J HTL' +35>74&#'6$7&#"c(6^6>ULQ( J[UL !2@/ J~g]TL%#$& +)'54&##"'4672!267]JNG4>몰n7?2@/Zp!#K[ mQUK"&D@AJ~ggW_O#%"#" +%#&'7$!'$5&##"'>32( 1շ\i cI bp]& hg.@+ JHG_TL# +)'27!5673&+(GYsn0.%KEQi&Ei ,=&@ " JHK PX@'pggW`P@(~ggW`PY@ $#%$#" + 463264&#"'327"'6726Q@Eky&?d&n(  9[;dP+A$ (< $7@4  Jg_[K_\L%$$"$$ +32654&#"'632#"!2&#fuoc~hwl:!񚇔!QLA]$ \$@! JU]M +!'654'!ڔzN! /(>|a]  T-o  '%@"J_[K_\L((($ +32654'#"$54%$54$32654&#"MtiLD7 }c[~luiا}vر6kVolM$z ":@7 JggW_O%$$"$" +&#"32#"&5432!"&54736pevrgv^j|.W␅ NB[%r r#%~%~3+3+m#EG 3+?{ 0+'7 SS[V%w%{cT"..3+3+wz 0+7'7-wS#R$V%w%zDf+Y@J($ GKPX@~_[L@~W_OY#$%& +#"'45&##&54632.'>f2$V#0&̒b 'YY' &[[&o@:%2BXY' &[[& 'Y :@: 9 /JKPX@*  gggc_UL@0 g  gggW_OY@86#$$#$$%$! +&#"327>5! !2%! ! #"&5#"&54327l"z%2|}wB1x4oQрjKWO6 =#BzyBUZv_X M |wjg =T+@(J_[K_\L$%$' +.#"3 # !2]ɭ)~SXe=P)+(aD?X#C@@#J H~p]SK^TL" R +35265432$3 !"$#"732!"X11qaW2qQttuHZoZ {p=X2N@K$#JHppe^SK]TLE",!60 +3 7.#"3>754'&+3267$'"52674&#kNF>T5Fp_PR81U_ѩ6Z>!lȑ-t Zg#WiX.=<@9* JG ] SK_TL;:91aQ" + 3&#"4'3&#"526543267"65432767""waXfsQ<|d2i{59mk.,vp<(D#C4'Z OlPUZ ZթTZZQ&Z ZX _@ JHK/PX@p]SK^TL@~]SK^TLY@ E31 +327"3 67$! 527674&#oxuh?>."Y>!|:e ZprEk Z14wn?=p@ 2#J6HKPX@ ] SKTK]TL@#~ ] SK]TLY@:754AAC + 5327"3&#"567654#&'3&#"52674327@e@lFn%iPi:N6qS+fG ^8i~e@OH;R Z;Qe>=Z Z0 tEENgCZ ZMSN9Z #lX{3[JK$PX@]SK]TL@]SK]TKTLY@ AA@ +327&'.#5327"#&'3&#"5267654&#ZB=R  <`DSN9b :`F9[? ?y LhS.,Z Z$#0taaQ+tN.$Z Z&&`]M= (@%_[K_\L   + ! #"32#DViYY0; M(X )9@6) Jp|]SK]TLaA& +7>54&#"3&#"5265.#532632&']uq@[2y_1B\a[xY[$+_\Z Zl}cQ;W  = 5H@E!/J~g_[K_\K_XL!!&!%$" +#"32$'&! 2367#"#&'47>76%:ɶ,UX֦'-R`Me_6F9[%+N*D/FL8-H*FwKXMb4< !&X0J@G%#Jp~~^SK]TK\L"qa# +65!"3.#"5265432633"!'-+G$QYLIJ/lFLUN Z(4#e81$Z Z5i=5M!FOqK PX@LA?) J9IKPX@LA?)J9IKPX@LA?) J9IKPX@LA?)J9I@LA?) J9IYYYYK PX@   p ] SKTLKPX@ ] SKTLKPX@   p ] SKTLKPX@ ] SKTLK)PX@   p ] SKTL@   p ] SLYYYYY@HGGOHOFE84Aa@ +32763227"54&'5327"#4&&'#4&.#536767&'.#"654sU+%-]HzZN:NVGHL?NAXBp3Io#32/ W=9B%JC2 * ZD81(Z ZH0 #(1Z  Z$4#e秡eM#e!,DA=A@>9) JH _SK ] TL=<6540A"0 +327"7654#5327"3&#"5654'3&#"5267 .#w-vmWWcXQMM^01KBarz:կY%IDHW]?U;ZEZ.у4.Z Z2B<1Z Z,)W@8 Z ZDRYKm/7@4+ JH_SK]TLA"@ +327">54#5327"3&#"5267.#pR|#ש<#pHKWBFJ5t#;)bJ Z7;@z-qK =Z ZHkzWxMZ ZMt9)NgXB(@% J]SK]TL$E$@ +!27! 67&! '67!"'6f)BhQ'1+\F/Jf#\5 T9`b \;Dd@ (@%JeU]M +!!!!(,& t$vd@0+'7X.<2 :d@ 2@/JeU]M  +'7!!'7!,&.($vZ&trd60+''7~&v"B|FvFfX~ dD@U]M +D!5!|d.0+&'?BscU'T3 f\ )%#"'#"&54$54&#"#"'4672323276&h pj54&#"'672!"'4#567;>muvfΊ [ ѤeP5P(fwiO&@# J_^K_\L$%$" +%#"54! .#3283T&ny| r`.\H^ѐO7 #@@= "JH#G_VK_\L$##! +&#27#"54324#567=LIas*^xfN]1/$.=P[m_e9FQ=O(@%J_^K_\L&$## +327!"543 %654&#"\yEK*iYjAZӣ6 .$C!^[XTv!d JKPX@"_UK]VK]TL@ g]VK]TLY@ A# +7354$32&#7'3&#"5265@d`~ vz.*h\Lm+6TFf4 jRZ ZVdh% >@,6!JKPX@3  g_^K_VK _\K_ XLK$PX@1  g  g_^K_VK_ XLK/PX@/g  g  g_^K_ XL@,g  g  g c_^LYYY@ ;:53/.+)'% > >  +2654&#""&54732654!"&547&54632367##"'nKlQ_Tg ?VTwۺq}#V %:N2 Hmg{v|`hYqZ+;;IGqLJcpŚFC]y 5+XB'C@@$J" H G_^K_TL&"#" +3&#"527&#"3&#"527ȷ632Ot_^w\nu_^vhҗ|K;SZ ZS;SZ ZS)P(iqR#Y! 3+a#C3+3+X81p@.*&# J HGK+PX@_VK_TL@g_TLY@ """ + 3&#"54'&3&#"5254#5677654327"`uwJW :Lo[YqcǐF;oonovgZ :$+T9JOZ ZO1P'c}\P[ Z{X/A%@" HG_TL! +!&#"5254#5673/]\tfĔr ZR/P(f_KRP?KPX@:6'J8H/+ G@:6' J8H/+ GYKPX@ _ ^K _ TL@&  ~_ ^K _ TLY@=;5410.,*)#"#"! +6323&#"527&#"3&#"527&#"3&#"527ȷ632ht_^w_u t_^w\nu_^vhҗhJ@;SZ ZS@>R;SZ ZS;SZ ZSP(i@HP'KPX@$ J"H G@$ J"H GYKPX@_^K_TL@!~_^K_TLY@ &"#" +3&#"527&#"3&#"527ȷ6323t_^w\nu_^vhҗhK;SZ ZS;SZ ZSP(i@O: @_^K_\L$$$" +#"54324&#"326: R[Pi~׽?Dn+S@P!  JHG~_^K_\K_XL$%$(" +%3&#"5274#567>32#"&32654&#R\oeQomp4%K,E/?XZ ZCNP#P@0-::!*4Or"F@C J HG_^K_\K_XL$$"$! +%#"&5432573&#"525&#"32g\H~:^Bbv.C:XZ ZX!%ϲҹF(i@JHGK"PX@~_^K_TL@~g_TLY@ $'" +3&#"5254#56732&#lXWna<-sFbNZZN(P&az[|#*u{.=@:J~_^K_\L%'! +'4'732654$54632&#"#k W<7U ȕk%JFغ`Z Z 1?Z ZK-NNZZ )x0&ZZIr)3@0$ JH]VK_XL%&21 +327"54#5327"#.'673267\0ftjHV,nJ=IudRa\Ke|,)]Z Z<.@6Z ZTb5O=2&A^P!4@1 JHG]VK]TL&E51 +3!2763>7&#!'67#"'6]{hU"@|XR. wwvv$?|[ET( V+Cd4 Z$ CTd OJK$PX@c_UL@gW_OY@  +"&=4&'5>=46nRffRnllBf "℞f@Ƽ|P~Ɣdl0+'7..> : d  G JK$PX@c_UL@gW_OY  +32+5>=467.=4&'d nn pRddRpƺ~P|Ɣ@f""₞fdxj8dD@-JHGWg_O!#!! +D#"$#"'32327jRTqVjXTxN5[XJDr:@ (!JK-PX@8~~   ~e_[K _  \ L@<~~   ~e_[K TK _ \ LY@421/.,!%$3$ +7&54$32#"'654&#"%'63227#"$#"#"&54$54j+ Ί w dE`{:  O>VGU;rT_Vr=]uts`\t\W( I2UL:Ef[)NGd2'B@? JH GgW_O$-,! +6327'#"''7&547'74&#"326ll^PP^pl\PP\xxzzfRR\jj\RR\jj\vxx'w"<  3+3+3+dV  0+'7'7./+1< < >$ >$d'1p@-JKPX@!~|c_UL@'~|gW_OY@ !+!$ +#"$56732654547&54632&#"654$e޺_uiJXZׯw&DO8M=Kw-ifiecH!z^|oIXR=8Tf.3\wdW#3+3+bPy:]dD@R/.#"J gggW_O:842-+'%  +D2#"'&547>"3254&.#"327#"&54632ZVcϕoJq9=WI]eu_y96&l\ƔkysGpΗҴXcF 8S EBumwzN@-d )/@)!-JKPX@$~gb_L@*~ggU^NY@ &$#"'"" +#"'#"&54$54&#"#"'467232'327!'7! z@[iDC\K*2J @{bW#&5A #!9GD@[=oO3.^76GJX/"0%KHd#CCd~%@"JGU]M +%'!'7!~$J$4 (H$ "v ZHy.@L!dDK-PX@ #!(J@ #!(JYK PX@<~p    gg g W _ OK-PX@=~~    gg g W _ O@D~~~    gg g W _ OYY@BA0/HFALBL97/@0@"bA3 +D65&#"3&#"5265432633"#'2#"'&547>"3254&}Gq5KBAL717:]b<-*4+W71VcϕoJq=;dt=::%9R1:l+"% !sGpΗҴXcFdWF&dD@JU]M +D!'7!W$"d9 *dD@gW_O$$$  +D32#"&54$#"32654cbdc34HJ22KbccbH34IK23dx#>/3+3+dz1!5@2 J~_{K]|L%#$& +!'>54&##"'46723267!Up!Y/*xzY`F/z.˓I)0@13]FJ~|c_{L#%#" +#&'7674#'65&##"'>32#=kqj`Lx ^O9c]fG [ebKKzG$bbT =>S^I2]gd-0+7'bqB43V&VndV"+K@H+&   JGp~  g^SKTL*(t$ +!&##"5265#"&'>32;27"3"327VZa:RJ xPFz`F6tJ z$$F\*FDXvԐd.u/ /3+d dD@ Gt +D3'654'*f^(rNNdV dy &@# J H|L +5>754&#'>7&#"uZ, .&x%Xgcby>@L$  >-1>I8>d XJKPX@ga_L@ ggU]MY@ $$$" +#"&546324&#"326!'7!tF%*BF%1;'.wjilky^maxH Gd#DDd|F6"z"NJ| 3+d.6"z"Nzq 3+d|I6"t"NM| 3+d+U@J($ HK'PX@_XL@W_OY#$%& +454'6323654'63#"&.'>7dt2$V0&̒ 'YY' &[[&Go@:t2BXY' &[[& 'Y&$C ̰3+&$u ΰ3+k&$X 3+p&$ ڰ3+n&$j#3+3+3+"$z z3+aM@H  %$JHK/PX@7  ppee^ SK ^ TLK1PX@8  ~pee^ SK ^ TL@9  ~~ee^ SK ^ TLYY@ KJBA@<;:32/.-'"  ML + !3 7.#"3>74'&+3267$!"526=!3&#"726765.'5HfT?F>T5Fp_PR81Ujѩ6Z>!fk|^q TJAee2J;I]&r7!1S A7umOÞ ZJq; Z Z1;Z=T"&yX&(Cd ΰ3+X&(u ʰ3+Xn&(B 3+Xn&(j3+3+3+]&,Cr ΰ3+]&,u ʰ3+Xh&, 3+n&,j3+3+3+z2"'"p װ3+X{l&1k ְ3+=&2Cs ʰ3+=&2u ʰ3+=n&2t 3+=l&2" ְ3+=n&2jC3+3+3+d* 0+7'577''d<"44""44='9@6! JH G_[K_\L)#)' +!"''7&5!2&#"632xSÑotDW|{okƾaPc7<AVe++9#&8Co ϰ3+9#&8uW ̰3+9#p&8 3+9#n&8j|3+3+3+m&<u  ˰3+X.:@7&H~g]SK]TL2A'$ +3 >7654&/3&#"527654'327"q9}^$^v_oyj棵_+eÝ [.+Z Z+6Y@g,KZ ZKJ2/6@3J_UKTK_\L%$*&" +#"'6532654$54$54&#"&#"5>5322TvL@F6B~pXdddn:RhШ Js v|48Ʋb~ظ Z,p,4̜PjLB&DC 3+LB&Du 3+LB&Dn 3+g]&DM 3+h^&Dj=3+3+OE<"D 3+f9N@K+!650/ J~_VK_VK_\L#$"$#'$'% +367%65.##"&56$54&'#"&546763 327!"\N/b(Zcx|vj9RXNP%,;hHXb"kwENDbJ=P$M%ZQvWnʐp@nVj .(SJKoz6O"FyO&HC[ 3+?&Hu 3+?&H 3+G&Hjd3+3+3+dl&;C 3+qR&!uV 3+)&< 3+&Wj3+3+q" \2  3+T&Qf 3+O:&RC 3+?*&Ru 3+?*&R 3+G2&R> 3+G2&Rj_3+3+3+dg2#n/?~3+3+O:+"RR  3+Pv&XC+ 3+Pv&Xu 3+d&X 3+d&Xjh3+3+3+V&\uL 3+/ 'A@> JH$#G_^K_\L$'$$! +%32654&#"4&#"'67632#"''765bj~jb 2 lXT2@6BjPPB"~jR:F82X&\js3+3+"$p 3+h^"Dp= ʰ3+c"$.1 13+g]"DY[ [3+="$' а3+fB"D**3+=T"&u ʰ3+?"Fu 3+=Tr"&s 3+G"Fq 3+=Ti"&3+3+O"F03+3+=Ta"& 3+?"F 3+Xa"'P 3+O8"Gz& &3+O7"G 3+X"(p 3+G"HpX ˰3+Xb"(0 03+G"Hg\ \3+Xd"(3+3+O"HC3+3+X"( а3+Oh"HPP3+Xa"( 3+?"H 3+=az"* 3+c "Js 3+=ad"*2 23+c "JE\ \3+=ag"*U3+3+h%"J3+3+= a"*I3+c "J*Ұ3+{3+X0r"+ 3+Xn"K  3+zyAEk@h@JHe  e]SK  ] T LBBBEBEDCAA?>;:95430/,+*&%$2A +&'327"!&'327"3#3&#"5265!3&#"5265#'7!5(o*?k iv*g"puY+9ZZ7(^R,?ZZ>*U"hZ ZhjZ Zr^"iB"Kp 3+Sw", 3+8"k 3+",p 3+`"wp3+`",. .3+"t 3+]0", а3+t"L 3+]e",3+3+P1% @ H]TL@ +!&'5254#56731quptfΔrZRP(f_gR]",-!3+3+q"LMH 3+~r"-3+3+"M 3+X.".g3+X 8"N3+QX-K PX@)% J@)%   JYK PX@._VK_VK _TK _\LK1PX@+_VK_VK_TK _\L@)g_VK_TK _\LYY@-+$%""" +%#"'3&#"5254#5327"273&#"32>ZnrXVu|BBvZ'E[>/6y'CZ ZCCZZC Z@[lݖX "/u ΰ3+X/"Ou ̰3+X  "/3+d ;A"O 3+X "/z33+X,t"Oz`b b3+X "/xT3+/3+XtA"OxPP3+/3+&>"/4 dA"Or 3+X{"1u  ΰ3+P"Qu 3+X{"1P "Q3+X{`"1 3+L"Q 3+)"zQI3+X{>m@ 9 JKPX@#]SK]TK _XL@  c]SK]TLY@<:'AAA +&'3&#"5267654327&'.#5327"#"&547276_ :`F9[? ?yB=R  <`DSN9|Q+qN.$Z Z&&`]MZ LhS.,Z Z$#0t!F[/ jER'5*H@E% JH~c_^K_TL%%&"! +&#"3&#"527ȷ632#"&5473268\nu_^vhҗhئxs;SZ ZST(i@;Gfy0="2kaa3+F3+G2"R3+F3+=`"2P. .3+G2"Rl[ [3+="2 3+G2"Rx 3+= >g@21JHK PX@-~ne] SK^TLKPX@(~e] SK]TLKPX@-~ne] SK^TLKPX@(~e] SK]TLKPX@-~ne] SK^TL@3p~ne] SK^TLYYYYY@ 84/,)'$# ><$" +#"323 7.#"2674'&+3267$#! !2ĺļN6< v|*h\Lr&ddL**Ff4 fjGZ ZVV6iB"E'p 3+PO >@*JKPX@8p~ pg]SK^K ^TL@9p|| pg]SK ^TLY@76is$13! +%3265!"532654&#"%"3&'46332672!"$#"527674'&FyHO=!BĐBT{ tNY.'_#~~w]s /d ą ` ZH8߀+X",@ #JKPX@2pppg^SK^TL@3p~pg^SK^TLY@ 3""11e +!"$#"5276743!#4'!"323265!"'_#~0heb0ezHP>) ZH8v]_n "~i &@ &JKPX@-pp^SK_VK_\L@.p~^SK_VK_\LY@ $#11%! +%3>54'&'"&'3!#4'!"672!"';>.9uvhe0[ Ѥ[neV&._n 65X"0@-JHpg^TL3")e +!"$#"527674'$7323265!"'_#~ezHP>) ZH8K]El~y 0@- JH_VK_\L$(%! +%3>54'&'"'&'$7672!"';>.9uv[ Ѥ[ne=[r5BY=S+o@ %JK PX@$pg_[K_\L@%~g_[K_\LY@ $"$$%$% +.#"3 # !265!#&'65&'"]ɭ)~SXe=  k**@t(e@?-;G t'4FO-@&$ JK PX@%pg_VK_\LK-PX@&~g_VK_\L@*~gVK_VK_\LYY@ ""1$#$$ +.#327#"5672653#&'65&'"R/al n7۱I5 " h();p>-YFHQ]  3q%<8XP /K@H Jp|n]SK^TL )('! / /$! +%32!"%"#"54$332$3 !"$#"52654'&lvx Jfjb0qiHY3xHv̂-=+]?koʏ}p Z#6#-@ -JKPX@2pppg^SK^TL@3p~pg^SK^TLY@ #6aA2 +;&#!#5327"3&#"# $5467&# 327te0 Yeh0~#_'˸>PHz nZ]v#8HZ 鮈)X|M ,@ JGKPX@.pp^SK_VK_\L@/p~^SK_VK_\LY@ A3$$#! +&#2?5#"5432&#!#5327";LIasN*^x0Yeh]1e9FQ=$.L nZ.&VU 'o@'JK/PX@"~_^KXK_XL@%~~_^K_XLY@ !((#& +654&#"63232654432#"$#";țY5`-#B {a`'"Z6џ_U18RP_pF5T>FN2ETݠ|ZM  ]s6E R06p%O-@* J_$K_%L$$(&+32'654'$! ! %4#"Yʕ]  I{s*~ l*_5+)amMNl&A@>! J~g_[K_\L#"%#% +67.54632#"'654'"&' 67"5l[/ (d %aoa  Hbh~-|@ (JK'PX@,pee^SK_XL@)peec^SLY@ "#$!5A +432%.#"3276754'&+#"53265=f@ 9Q+Si05QQ30eՑOBo\GZm)`HQU^#5$>@;  Jgc_UL#%# +&#"3&##&'4732#'7353bOs&);2Dhp NB:FFZ|n8&O3"FVZZ^^&` :@=2@+ JK PX@,pgg_[K_\L@-~gg_[K_\LY@ $"&$$1$" +!"3275&#'; !265!#&'65&'";^1dz k1ih  k**@t,l P>O&;G t'4Fz!7,@)7-Jc]SL*AA +674.#5327"7654&'5327"&54?fo[HPI#7R8@E:LSHE3"f\; ZQQ l^$EZ Z. Z2¤2,ZZ%Hoy{ㄝXj5[@X0. JH_ VK_ VK_TK_\L31#%'"% +"&'&54#"3&#"527ȷ6323>54#"&563ʦ ZOr]\tfΔщvh{bymy4 6ăi;RZ ZRVR(f`ϩ7 4xaiE HKPX@n`\L@`\LY!! +3273!"4#567WN%fΔ8+R(f_zm",Zp װ3+X?@<: 1 JK PX@+ p]SK _ [K]TL@, ~]SK _ [K]TLY@?=9853aqa + 3&'&#"4'3&'&#"526543267"63&'67&'"{x)/g?%fsQ<|:<2i{59mk.,vp<6R!-lFyZOlPUZZΩ[ZZXO KAXJ9:@6 " J*&GK PX@!  g]VK_TLKPX@# _UK]VK_TLK1PX@!  g]VK_TL@  gg_TLYYY@97$"Ba +76543267"3.#"54'&3&#"525632&#"F;Z`*nJr`J73'#H@G _ SK _\L=<986421.,"#"$" +%#"&'#"&5327"!27.54#5327"!274#5327"36R;Fj@zou_^vA>Q t_^w<9Ju_^vhҗzHFPDIKSZ ZS(?@SZ ZS%(SZ ZSGT(i2j@# ,*JK+PX@]SKTK_XL@!~]SK_XLY@ $'AA +43274'.#5327"#&'#"'473272 JpB>Sj[ݞA]$$2m|d$Ɠ ZOO5*644u[OI&O 2+H@E!JHG~g_^K_\L$#!$#$! +&'52654+#"54323273&#"3262pqpq3/HH¼*p>7B-p}{p  Z5{72RU7|4LwSP< 7`@].J~|_ SK _ SK]TL 641/*($#" 77  +67>54'&%27632"'3&#"52654'#"54673@]]uqTTKMWt]Uhv4^9 .@#.J+'GK PX@(g_^K_\K_XLKPX@*_UK_^K_\K_XL@(g_^K_\K_XLYY@ "$$%$" +32654&#%32&#"632#"'3&#"527>^AJK qlOi^H\o-X;SeJF~Wt]%XZ ZCXf5@51#! JHKPX@8~ ~~SK ]VK]TLK+PX@6~ ~~  gSK]TL@3 ~~  g]TLYY@42-,"4"A +3&#"52764'327"633"!'>5!" 2miَ|zT<{N#ip4ddɶIM_Z Z12 B+.ZZ&; Z- lM$,@)#!  J_[K_\L')'  +323267# 5$54&#'6=P$h&ŏ~!d#b{ $ ISof4@@= J~_^K_\L  +"&54$54&#"'67632327NePL!C@@!J Hc]VK_\L"  +# #56!#327&'67276= I_e9S=-*U iR" t4AU6 X7)e JZK<&D@AJH~]SK]TL! &$ + 7.+3&#"52765!"#"'4$35}&= P`=}z[xxyW#}=v:/1Z Z7'mrK'nʅQ9#@  JK PX@)g]VK_VK_\LKPX@+_UK]VK_VK_\LK/PX@)g]VK_VK_\L@$gW]VK_\LYYY@ %##$ +!!327#&'&5#525432&'" %B9S=z%_{#ceBKat*"4A$,eRc0iOT<~WDO@J HK'PX@]SK_XL@c]SLY"#&6  +#"'67) 7.+327#"yMPZEL&= P`=}oBO<;=v:Ի#h9"8P1"X=N N3+`-<@9+J]SK_\L&$ -, +7&'&'#! #"'673! 3254&5!6HZ6T+JO,T6ZHtPB&d3"&wwa!(0y@ 0!JK PX@(p]SK_[K]TL@)~]SK_[K]TLY@ AA%" +>32&'654&#"3&#"5267.#5327"2wl 43#$55xjif;(N_pR|6[~q`:+0>)xNZ ZNt80DjZ Z0.^s&;@8&Jg]VK_XL1%!%  +!2&#"#"&54732&'.#5327"pF~2TpR( Z H#3B0ft0p.>Px$bH:2*(^LYKZ Z<XB"=p װ3+P"]pC 3+$T@Q JIH~||]SK`\L#5#$!" +#"$54332654&#"'!"'673!632zi}l?h3k*/mI(v퐒NN$ 90l$T@Q JI H~||]SK`\L#$#%3! +6327!267&#!&#"3272#"5l(Im/*k3h?l}iz9 ӗNN횄v'K#B@? J H~gc]VL#$#%#! +>327!27&#!&#"3272#"5KYACP:i%sYxqW?z(+L-v휆fI-@%$ J'HK1PX@.~ gg]VK_XL@+~ ggc]VLY@*(#! -- +23673#"&5467654#'!"'653!6aBGetf $ɗӳƌj";~18dX l`_h ήą dd-L+Ld"pv v3+zh,@, JK PX@3pnp]SK_VK`\LKPX@4pn~]SK_VK`\L@5p|~]SK_VK`\LYY@ 11$#$" +672 463264&#"'5&'3!#4'#"2nyQ@Eky&C|e0(2  9[;d)1._n 3o,@, JK PX@2pppg^VK`\LKPX@3pp~g^VK`\LK1PX@4p~~g^VK`\L@5~~~g^VK`\LYYY@ 11$#$" +672 '4632674&#"'67&'3!#4'#"F_|ߟ36zT|_4 aP2&s. -G ~OB'$KW(&S9@6JH~]VK_\L!( +#56!##"'4'732654$5_eN⢮k W<7U nR" t/,?ߔAyW.?5E$K)PX@ JHG@ JHGYK)PX@_^K_XL@~_^K_XLY@ +'" +3&#"5274#567632654&#"a} en6˴QdNZ ZKla)gm/Ne]rdl_dlD#_,_dl#_ CC3+3+3+dX \"'#= 3+d "' #]& 3+O7"G#] 3+X5"/-d"/ M 3+3+XBA"OMk3+3+X ~"1-dn"1 M3+3+P"QM3+3+f"$J 3+g]"Do 3+Xa", 3+)"P 3+=Z"2q 3+G2"R 3+9#b"8 3+d"X 3+9#"8#pj,$3+,3+3+3+Qw"X"jKs,3+3+3+3+F3+9#""8#j4ub$43+b3+3+3+q"X!"juu$3+3+3+3+9#%"8#j,Q$,3+Q3+3+3+d"X"j|#3+3+3+3+9#("8#j:Ch$:3+h3+3+3+q"X!"jC)$3+)3+3+3+f(@% J_&K_%L$$"%+326#"&54! # %42iYjoT~ YL%Z[Ne4.n"$#j6p$$63+3+3+3+h^b"D"jJr+3+ְ3+3+3+F3+"$#p63+63+3+g]E"D#q"3+3+3+F3+a"Xee3+F3+f"y3+F3+="*%8 83+}"J $, ,3+=aZ"* 3+c "Jc 3+X.f". 3+XZ"N 3+="2m3+OD"R.3+="Ud3+G<"3+f"v 3+b"Pq 3+"& 3+X "'=d "' ]&O7"G]=a"*uU Ұ3+c "Ju 3+X|D_@\9 7 J$H e ] SK _ ^K]TK _\LB@<:640.*)(%AA +!3&#"52654327"!4.#5327"32674&#"&567"5U/k!x33p+@l9SBw+r1xgI"$kZ Zi̚bZZ^ E@R0ZZbϝ&=Rb%S5$'@$$ Gc]SL%A# +%#"'765327"6763 //cv&Bhʴ9[bSP)dS?-Edfbl-7I\ Zx.=+/X{"1C а3+P"QC 3+"$#  Iΰ3+3+OE"D#u3+3+a"u  ΰ3+f"uR 3+="uU ʰ3+O:"u:  3+"$ ΰ3+OE"D 3+X"$p3+ 3+g]"D``3+ 3+X"(I Ͱ3+?"H 3+XW"(%3+ 3+G"H__3+ 3+", ΰ3+"b 3+P",3+ 3+"Z``3+ 3+="2 ΰ3+G2"Rb 3+=W"23+ 3+G2"R``3+ 3+X"5 ΰ3+T"Uh 3+XX"5 3+ 3+q"U+``3+ 3+9#"8 ΰ3+Qw"Xa 3+9#N"83+ 3+q"X!^^3+ 3+F ;"6$3+{ ."V3+5 "7I3+P "W3+S{p"%@"J G_[L"  +5$4&'5654&#'654'632;rcLlicثiXk:X'͇y+)MP4@ G_^L +5$4&'5$4'&54!.0}R?T^|^wSq? j"?eHBX0f"+ 3+X\"K 3+dp 'N@K"J HG~c_[K_TL&"#" +3&#"525!"3&#"525ȷ$32~QΛOQNѽ7ڽƷZ ZOISKZ Z Y7oMO-U)3]@Z*3  (%JH gg_VK _\L20$")$""! +%3674#"#"54324#567632"'#7&&#27h"H 6;R*^xfkb4zypLIasnO:$.[P[m_3R51l '(@%# J[K_\L%$&& +4%326# 4%&'&56%67&'5 KPrb8nP__ C f gtGg3>@})Pese^l)]KPX@ "J@ "JYKPX@_\L@_\LY(')( +654'632# 4%&546324'326pY%[4b>m5J7DIh]\WubmTAnr`+wHݚnˊ5jzX"4@1 JG]SK]TL "  +'67!"'67!27!2'654$#B/Jf#\5f)BhQ#IMH \;D T9`ޓ@T5#]P %>@; JH$"!G]VK_TL %% +!#'67#"'673!27632'65&dvv$?|[ET( ]{hU"@|IM Z$ CT V+Cѓ@T5#]e"$3+3+LB"D3+3+X"(yc3+O"Hy="2#pCjC)$3+)3+3+3+M8b"R"je+3+ְ3+3+3+F3+="2#pC: :3+3+M8f"R"D3+ڰ3+F3+=e"23+3+O:"R= 3+="2#pC03+03+3+G2h"R#5"3+ܰ3+3+F3+m"<Idd3+F3+X"\3+F3+i-fi?@<J HgW_O")"! +%3674#"%4#567632"'#7&"H 6;/fΔkb4zynO҈R(f_3hP-6`@] )41 JH g g_^K_TL320.''"""! +%3674#"#"3&#"527ȷ>32632"'#7&5"H 6;-9Ju_^vhҗ;Th,kb4zynOo/SZ ZST(i@HFNu3hP-F!D@A J Hgg]VL"$"! +%3674#"#56!#632"'#7&5"H 6;9_ekb4zynOR" t3hf$@!JH_XL' +#"'&547367654#567 ]B>18LM eZZ|0&8?!~c/_cP>POU (2_@\)2 (JH_VK_VK_\K_\L##$'$#$! +%3>54&#"#"54324#567672!"'&#27);>muv캎*^xfLIas[ Ѥe$.[P[m_5<1O 3>@| 5 4   (3JH0,G _^K _^K _\K_\K_XL><8621/-+*&$  $ +32654&##"&5432567>32#"&'3&#"527&#"32#0%K,gsxQomp4>\o:^BW 4u.BF@0-::!"?XZ ZC6%ϲҹ "$NR ذ3+=HT6"&N@O,"F!3+!3+X"/p װ3+7UC"7Nc 3+ 3+{&-=@:% J~|d_^L&*%'! +6'4'732654$54632&#"3267#"&2 W<7U ܕk%JF[t_W~~SLz"<঻^q"P-AZ Z>(WS(CZ Z;)Z"-. 9 3+XK9"(N3+3+O,"H5!3+!3+2"-1p 3+"M8p3+3+="G@D  J H_SK_\K_XL%$%$ +  !%27#"'&#"36U[Fz2 Zgy I Kh?dZ3aXhSO&v@ J HKPX@"~_^K\K_XL@~c_^K\LY@ $)$%$ +$"5432727#"'&=3&#"36 yEځR^(z E:Q 5&KJH%dYATz"52f]]3+3+2("U; 3+m"<%W 3+o"\%>>3+8. D ǰ3+ON (K$PX@J@JYKPX@ p_VK`\LK$PX@!~_VK`\L@+~_VK`\K_\LYY@%#"! $ +$7.#"3#"56763273327673#"'&'VfMXBWh\WgM `B/!kT4&NFc'X~::bE."IH  3+O9 "@ JK PX@g_VK_\LKPX@_UK_VK_\L@g_VK_\LYY@ %$$#$! +%3>54&#"5672!"'632&#";>muvJKzl [ ѤeT5SP_FP4O1 0>@;/J-,Gg_VK_\L%'%(# +&#"32765456% .#>32#"''67& #9 ?FO+T0doAD2WKN$:E{,Scf S49DC.\HJd5K@6qkUoH/O U +H@E JH~c_VK_\L$($##! +&#27#"54324#5673272#"5=LIas*^xf{?e709o]1/$.YR[m_dE-5NOW9(@(JGK PX@g_VK_\LKPX@ _UK_VK_\L@g_VK_\LYY@ ##%$$$ +5#"54325632&#"&#27N*^xQKzl LIasYe9FQ=$.{SP_F1O)@& J_^K_\L%#$  +!2# '73265%$&#"KϣEy\jYi*6Zb[Z%Cf" 3+feeU"QQ3+O*>@; Jg_^K_\L*)#!$"& +$7654'#"5432654!"!#"'&547636Ry]\ᱭkoQVp՛چ!^w*AG(*k|VjJwFMkEZ#"gp 3+K|+6[@X6,  J~~_[K_VK _\K`XL43$!$$%$" + 6723267#"&5635432#&#"&#"367ƭjc8+ k@VtBo907QSkF0DVe *!;|+Rb?;CN5-Ed~ ]K (F@C(' J~_VK_\K`XL$%$%! +&#"367 6723267#"&5637F0DVeƭjc8+ k@VxCM~ ] *!;|+Rb?@:OV >@; Jg_IK_KL$$"$$ +&#"3275&#';"54!2Y.𑘭_t of/E vJ*c[ft`F'0 0S@ &# JKPX@]VK_XL@c]VLY@ AA'$ +%32654"#"&54&'567"654'567]3-"4`%2n}ciwxww jjjj6G:9(a!FlȘdg~BCZZ'f&Z#N -6@3% J~_^K_\L&!"$($ +326544?#"#&5463232#&#"#"&#G*"/FKEMSg\gAZT>I.Tq`~R`*!2"<6S`c-#|v%#Iz\XpX K ǰ3+Lg/M@JJ G ~  g_^K_TL-+*)$"#"! +6323&#"527&#"3&#"527432#&#"|t_^w\nu_^vy907[I^N;SZ ZS;SZ ZSļ:N5-EdL Cg3W@T  J~   ~g  c_^K_TL1/.-%$!$"! +&#"3&#"527432#&#"632#"&54633265F\nu_^vy907[I^|o907QSPs;SZ ZS&N5-EdaN5-Ed"L'p. 3+)kkQ#@ ]CK]ELA@ +327"3&#"5276=4'&#]rpT<2c_َ Z&;^ZZ02+.EA"Ol? ?3+/QA#O    3+i lA)@&HW_O$( +4#5673272#"5fΔ^SQ709oوR(f_$dE-5NXA"OPd' Pw ǰ3+P/B@/J73'#H@> GK+PX@# _ VK _\L@!  g _\LY@=<986421.,"#"$" +%#"&'#"&5327"327.54#5327"3274#5327"365y;Fj@zou_^v>Q t_^w9Ju_^vhҗyHFPDIKSZ ZS(?@SZ ZS%dSZ ZST(i PC@)% /  J' HK+PX@5~   ~ _  ^K_TK _ X L@2~   ~ c _  ^K_TLY@A?>=9720,*"#"! +&#"3&#"527&#"3&#"527ȷ632632#"&54633265_u t_^w\nu_^vhҗhJho907QS\s@>R;SZ ZS;SZ ZST(i@H6?N5-Ed+@JHK+PX@0~~_^K_TK_XL@-~~c_^K_TLY@ !$#"& +ȷ6323&#"527&#"#"&54633265hҗht_^w\no907QSnT(i@;SZ ZS;N5-EdP+S@P JH~~_^K_TK_XL$%&"! +&#"3&#"527ȷ6323272#"56\nu_^vhҗhd]e-09os;SZ ZST(i@ͤnE-5NQ 3[JK#PX@]CK]EL@]CK]EKELY@ AA@ +327&'.#5327"#&'3&#"5267654&#S?:N  9\@PK6  ]; 7\C6W<  vv|*h\Lr&D**Ff4 njGZ ZV(@%J_^K]TL&A +3&#"5>7&'"&'47632x&rL\h*|vv >@~r3NDLLB"<v?Pe9FQUCD"$3<$3<"FC  Ȱ3+P0@- JH~VK`\L$%$ +4#5%325'632#"&5ND~h›3< 0ӲA YH İ3+P ZW 3+L \L İ3+C(6@3$ JH_CK^ELA"@ +327"654#5327"3&#"52675.#jNvjDGRH3{n!}8']F X5?0:X XN]jrIZ ZIofLJbPLr"]3+P1@ 3M@JJH1,+Gg]VK_TK_TL%#6%# +&#"32654#"'673!27>32'67#'6 #E?[ET( ]{hU"@SpYaANiAE{(Izvv$?f d|D CT V+/@6q\`oBy Z$I$H@EJH~||d]VL#%#$!" +#"&546732654&#"'!"'653!632m65W|O}%i:PCAYz^O^텔-L"+j :W@T)JH,+G~|gd]VL%:#%#( +327.#"654&#"'!"'653!632&'#"'&54632OF? 9#  ro|O}%i:PCAYc3y+($NKWDD94S I-L"+ǟ/N5D:kq6@]d/4 5@2 J~_SK^TL%(A +3&'52=&'&56% .#|x_z{R4,Z4kw L?nRZZR"Q .\HJ[3 S 3+q\&@# Jc_VL$%$" +#"% .#328T0do r`l>`e.\HJQ"2x-3+/3+Pj  3+O9.K@H)! Jgg_^K_\L$$$$1$$ +&#"3275;"543267632&#"W"暫BJH%Ĭ5pr ALE.'>4#56767#"&5467{ E)^#o 'YY' &[[&Heٔ d>.CM][l@4gM3c8ZY' &[[& 'YP*dZ!<"On\X]N N ʰ3+Q'_@ JHK1PX@p]CK^EL@~]CK^ELY@ E1 +327" 67$#"527674&#hxah?("Y>!K|:e Zprk Z14@wnO$/W@T/%   JG~_[K_^K _\K_XL.,$!$$#" +3&#"525#"&54325432#&#"&#"327\H~go907QSu:^BCnXZ ZXv.C/N5-Ed%ϲҹA"RpEb"S.pZE E3+OS7"G]YOG7"GP|O17"GObP 'B@?JHp]VK]TL  '&2 +#;2654$54 #56!2&#"!^錛U _ek%JF;953.,'%!  II +%3&#"52657354$32&#$7632#"&547326&#"3&#"527&f|*h\Lm+@d`~ vzFhئx\nu_^v3jRZ ZVd"TFf4 m@;Gfy0;SZ ZScXA,E@BJ H_^K]TK_\L'%''0 +%&#"5254#567!2654$54632&#"#"Me\tfΔ<Z7U ܕk%JF7&#!"-;[Et\tfΔRfh}U"@XR. wwv2I CT ZR-R(f_q V+/d4LK#uu3+3+/K PX@!pee TLKPX@"~ee TL@)~ eU]MYY@  +!#!!#!4MfM4Mf+\J-Z +S@P JG~_^K_VK_\L$%&"! +3274#5327"36#"&54&#""&54632\nu_^vhҗ|d]e-09oY;ZSZ ZSۋT(ip nE-5N 4_@\"J~  ~_^K_VK_\K _ X L20,+$"$$%" +%7#"&54&#""&546323274#5327"3272#"5F|d]e-09o\nu_^vd]e-09o t nE-5NЯ;ZSZ ZS nE-5Ndy'F@C'JHG~_~K|L#"&" +3&#"527ȷ>323&#"52=4#"099DP8;3mX0r@>:9DO8:u BB:;={-j[BB|dy0@J GKPX@. ~~ _}K_~K|L@, ~~  g_~K|LY@.,+*$"#"" +>323&#"52=4#"3&#"5274632#&#"00r@>:9DO8:u 99DP8;_x9R"#&!+3-j[BB|BB`+!)G-Rdvv**@'J*( H_L'&! +.'>#"'&547367654#567W..//l 0D^$")(?2|Pv.//.-h-c@P!%B)/:; 2dy+F@CJHG~~_~K|L$'" +3&#"5254#567632&#&66AL571hU3^d-3JBB79:P-yTH@dQ,tq@JHGK!PX@!~~~K_L@~_LY@ $'" +54#5327"36=#"'4736i66BK670hU3^d-3JgBB6::P.yTH@dt$@ JHKPX@+~~~K_K`LK!PX@(~~d~K_L@%~d_LYY@ $$"$! +#"'4736754#5327"3272#"&5i3^d-3JC66BK67"%"$"R:xRyTH@zBBAT+F)!*ady{0@.) JK PX@&pp_~K^|LK)PX@'~p_~K^|LK1PX@.~~p_~K^|L@,~~pg^|LYYY@ %av! +7263""&#"526=43267"3274&:'Z-'++I_ 0828M" %G.7tR$#o73;%;<?Q<+dks.@,  J&"HK PX@_~K  | LK PX@_~K   LKPX@_~K  | LKPX@_~K   LKPX@_~K  | LKPX@_~K   LKPX@_~K  | LKPX@_~K   LKPX@_~K  | LKPX@_~K   LKPX@_~K  | LK!PX@_~K   L@ g   LYYYYYYYYYYYY@.-+*""" +327"7'327"7654#5327"# #*-GU.'LD#,AW,'KT2-@4,: >tj<!BB &!BB BB![djs)Z@$ JIHK!PX@_~K_L@g_LY@ %&91 +327"654#5327"#.'673267\ 1i3X:]f5K$Z/%'>5,75#-:x(BBBB$IJQ5-# %K.ddD@ Ht +D7bZ#%d#wJwdFj 0+467.dti)vY>J8R4NVL(==d dD@ Gt  +D'654/>tVKXG/[kK d(i 0+>7.5dJ?Zv)is==(LVN4R7dPfF *dD@gW_O +D26544#d>NP2 &dD@ HW_O$! +D#"67327>|w!3q_4,+!d 3+dZZP *dD@gW_O$$$  +D32#"&54$#"32654jjjh066NL88NPjjhjN88NN88d4-dD@" JW`P#$ +D%327#"&54pR0(<6BjZn4z.8J6nRdj8dD@-JHGWg_O!#!! +D#"&#"'32327BY{72.#J\>GJ/G=B+I 8 E37C$AAu+Hq X9+#XER+d))&dD@U]M +D!#!5!)sd)),dD@!U]M +D!#!5!53)Dsd)),dD@!U]M +D!#!5!3)Ds3d)),dD@!U]M +D!#5!5!3)Dsd))&dD@U]M +D)5!3);Dsd&dD@U^N +D3!!di\dh90dD@%Ue]M +D73!!dk>h^d а3+d5*dD@eU]M +D!5!5!5!5//XZd\#zzd1!dD@Jt +D3#3N5L}Dud1!dD@Jt +D#3#'L5N{1ud-?0+%5%?%{N9M{d-?0+55%d%NM7N{d 9qI I3+dSC 3+dM#C C3+3+dM#uu3+3+dCdD@8 JH GWg_O#!# +D7#"&#"'6323qA;M39E=;SyA9a!XX]d~3+3+d;-dD@"JGU]M +D73#'d%>9d;-dD@"JGU]M +D'#'73>%U#9dP-dD@"JHU]M +D73#'d>%69dP-dD@"JHU]M +D#'737%> 9#d  )dD@ HU]M4 +D7!"=7!\7#?2</-d p &dD@HU]M! +D!"=7!p!G2<-df ZdDJKPX@noU^N@U^NY +D!#&'5673!fWFLMDZJNHLqCCmMIU.CR-uH4>@[v 3+E8 F3+j2B 3+|V29 3+^Qj3+3+=:dD@/ J~W_O#$%& +D#"'465&##&54632 /cT YpPsMEr')EfD:2.?6F< 3+5vR*4P$N:Pt#G.#CCuOn#3+3+_ [   3+dFjyzD( { z43+0 3+ 3+S 2dD@'J HGU]M +D'5#'7357A?+B} D 2dD@'JHGU]M +D'73#IA?+\?\n ް3+E/ dD@Jt& +D7654'632'(1AMOqd39H<ELF Z}rX X3+ j /dD@$JHU]M +D!'73573?K?B j /dD@$JGU]M +D'5#'7!#An+B?F T?dD@4JH GU]M +D573#'5#'7,[ X/[ ^ [)^ Z-4ox dD@U]M +D!5!xDo="(,dD@!W`P#! +D63326=3#"&5"907QSnokEdwN5q2,dD@!W`P#" +D#"=33272qod]e-09H5NЕnE0UwV V3+RTF#UUU3+U3+hD D3+4` 0+'654&'>7`x0]=U0F-BJA#44ly3+b 3+ }. 3+%8 0dD@%J GU]M +D'57!'5!A?AX323 A4dD@) JW_O!#"! +D#"'#"73273327FaQFGNeD/-KV-'5ML- %p < <3+z(  3+hBd d3+^8 F F3+6ql 3+OB6F3+ B3+#BB3+3+(J^v 3+u8 dD@U]M +D!5!v$ dD@U]M +D!5!^;dD@t +D #YJ;i} x|lX X3+KCc? ?3+& j >dD@3 JeU]M  +D35%7!!'v? ?檪22eCEe4dD@) JW_O!%"" +D>32632.#"#&#"e6bA[<@UCe3/"S+b+'+a,S, % \\ ? 0+''7'77M+--+7799|!g0+654&547|h_e_I29h0bN'.< p#ZYq 3+?8dD@-JHGWg_O!#!! +D#"&#"'632327e7'P?5n:"X9{]e]gWdzRR3+_sR#juC3+3+ w&dD@J Ht(! +D#"54'67327wd:;N8hHr] 8K 0dD@%J GU]M +D'57!'5!2A?Ak323Ce 4dD@) JeU]M +D!'7!7!'7!ff?B?B#3+3+ fV-dD@"JGU]M +D'5#'7!fA!5Bo>CdD@8 JH GWg_O#&#! +D327#"''7&#"'632?/3LE6o(I'JN&(FI5n4@)O9{.5'jy+9%.H4 %LdD@A%JggWg_O!#!"$#$" +D#"&54632#"&54632#"&#"'632327+ ,7+ ,7o71FI5nD,GJ%4!%33%4!%3qyq{8 XdD@MJIHGggWg_O!#!#!#!! +D#"&#"'632327#"&#"'632327hj)~1Z5!]t6~"OB"hj)~1P?!]t6~"OB}}IIII}IIII  4dD@) J H GU]M +D7!'7!'76PO88OuP8% 0+''7'A Y88Y3 Md d3+PF}||BV"_WC  3+ ް3+U ذ3+ ذ3+-#ذ3+ذ3+PF|rxUD /3+HdD@= JG~|W_O(#'! +D6327#"'#"'&547'632A$a'%8!K9e 1-Pk8+KS*6v,''33QD4p#qq73+3+,S{$ 0dD@% JHGU]M +D3'7#'7. HR/JT  '\ \3+'< &dD@ HW_O$! +D! 67! 7$BfMzh6+!#&dD@JU]M +D!'7!d4h%Vx6x&8 3+/L] ԰3+'< &dD@ GW_O$! +D! &! &'Bfh6+!  0dD@%JHGU]M +D7!'7'7!O88OyB5G )IdD@>)!J~gW_O'#"'"" +D#"'#"&54$54&#"#"'467232'327i7N[;9P$,@7jTKv| .9z7=;;T;jK0-Z44DFU,!,$,3dD@(JgW_O&$## +D327#"&546327654&#"MOK@1Yn|؈@/(1@3N"cV'ps%),Q 5dD@* HW]M  +D.'>&'5254#5673..//C;EB:3mX9.//.A :;=0", *dD@gW_O$$$" +D#"&546324&#"326ԍxkx~@$(<@#.7 ypbacboVdZn>AdD@6J HGW_O$" +D#"&=4#5732754#57_*V A@'M'& 9G#WTj,"Xj,"0;.@ 5dD@* JgW_O$%$" +D#"&5>72.#32&{^k 5A/2>NL6ASq R:,#XEYVBO #LdD@A " JH#GgW_O$##! +D&#327#"&5463254#567#DO.2PJ`}{103dT* ]_26ny:;7J/1;" SX'RdD@G'JHG~W_O#"&" +D3&#"527ȷ>323&#"52=4#"99DP9<3mX0r@>;:DO9;u zCC;;={.j[ BC{k@AadD@V>/J@H73'#G ~ W_ O=<986421.,"#"$" +D>32>323&#"52=4#"3&#"52754#"3&#"5275ȷ:2] &: 9e"B=;:FQ9;d::FQ9<b;:FQ9<4oZ$, &_` BB !! BB  BB <<>Ue-FRdD@GJHG~~W_O$%" +D3&#"5254#567632&#(67AK670hT3^c-2K0BB79:yTH@}?dD@4J HeW_O"  +D#"5#5653#327_0wGu8.*(<sN^-=dD@2JHW_O"" +D327"7654#5327"#,/JX/7eX4-D40< P"BB BB"\ 07^dD@S7) J.I3/#HG ~|W_O54+"+" +D3&#"5254/3&#"52?'327"7654#5327" 1;KQ6,:> 7,,6<w})1QS+! **'*:92-g,BBTJBB"#BB:2 BB!}e*?@< %$Je]/K]0L*)#AA +3&#"52654327"3>754'&# .j!w22o*?u.p_PR81UjZ ZrƐsZZo0R ELs]@*n@ %$JHKPX@ e]2K]0L@ge]0LY@*)#2A +3&#"52654327"3>754'&#+ge]00U(<\+p_PR81UNeZ ZlmZZj70R EEs]Pd4y. HK&PX@)p e  ] /K]0L@*~ e  ] /K]0LY@2/-,&%1A1 +"3&+#3$#"52765##"527654')276Xi@=dӎ~@iَEsV%d.+Ǯ20Z>/1Z Z7'pZ02+.d P6@3JH~]/K0L"3!+!#"&54) 7.+ wP^rH&= (`5uqyڞdwdF w) 3+e0Z%JK$PX@]/K]0L@]/K]0K0LY@ 9AA +3&#"5276#654'327"67327"2miَ bY|zT<R =By?^ZZ02v[t+Qaj+.Z Z&;kZhL ZM]@%%@JHKPX@~]2K]0LK&PX@~g]0L@!~g]0K0LYY@ A:+4#56767327"3&'525#65fΔM :?s7267@Q$ 25U6 '< *#"  ."_+@( J_2K_3L$%$ +$32674&'"&54!#"'7r od0Tζ8JH\.`U"Fx\3+/3+_"4x3+/3+f 3+y-du 3+Hs;"ju-3+3++#9D 3+]x /3+ *"9~H 3+ )+"9J 3+ -#9L 3+H+"9R 3+)"9}W 3+F()"9}[ 3+"kQ"ju$3+3+3+3+$c% eZJK*PX@p]/K]0L@~]/K]0LY@ A5A+7265432%.#"3&#"ev1=\6 9Q+S4pF?Zs"\GZm)`HFXZ @H]0L+ !!'7Kկ9~Txc$( cM= c;+ E "2M 3+h, c9. !@/K]0LAA+3&#"526733&#"52654';TJ7GT'~FQ\;M;5-Z Z1;bZ Z!0?'0c1 e#?[@X76.- <;)( J Hg_/K]0L%$31$?%?##  +'67$7&'&$767$'&'7"'654'7327674'&EK5T>>T5KEPT6ZH׺HZ6UOT08RP0)kk*/PR80p%%p%&  &%ks6h RR h6skE 2dGc3 S?@< JH]/K]0L +67&'&#! !2767&#!' 5!Jȋ>T5K5J %p!& JnR37 "9@6 J_7K_7K]0LA#$""++'632632&#"3&#"5276h +N<+_g'zlmipLg%_L/0[ [1&Q F5@2?1) J]/K]0L<;:654%$#+654%67654'&%&'327"3&#"52767&'&5476>/Y`,9 ?/W_- |zT<kl miَ jpP7iw87FN!2*9iw73.Z Z& if!1/ZZ0/ jcA; 9@39JIK2PX@.~_ /K _ /K]0L@+~]/K _ /K]0LY@6421$A(A +4'327"6323&#"5276=#&$&#'632|zT<!3w }E2miَ.pz+.Z Z&;e9*c@:z^ZZ02s`c!P-=@:J+I_7K]0L&$ -,+ &'73&5! 3267&#!5>54&#"!8!>Z6ahRemb6Z>!tW2olbؽ(j"Lj3+3+ j"Wj3+3+3+VD"c9 3+U"g9O 3+_=H"i-9 3+e"k)9 3+V"w"jYu$3+3+3+3+VD +B@?)%J+H_2K_3L#!  +%>7.#67"&'#"&5632654'674.yENf mK(0VpC5Sk u’ɚ T#R~ >=I3i!<,%c@$JGK0PX@~_1K_3L@~g_3LY)%$!+%2654&#'$7'"&''!2 SL  NWP5wLBq*a xr?vmX%$/7Ė\8-.@HGt+'7&'&#'67567.^c?3Wdt`ukS~-1"&K>A$V-$q@$JK(PX@%~~_1K_3L@#~~g_3LY@ !''#+'36"$#$%.'672327 {7$A7 |#I.\$)*'RՇFw% w/ 'V%z@%   JK2PX@%~g_2K_8L@#~gg_8LY@ '#"%+&#67&#67$'67&'4672367y9jOZ0(CJ&鋿' ЪP)j>j u  +y fYF1b ' Zo0C@JHGK,PX@ _7L@W_OY+'674$&'&'727o#PPhrC?iBdlb/Akg t"2=!3@0JH G_2L !!+ '654#'674&'5676=od@weL@ 7\9C00zf|#1Wq IA9Q m@ JK2PX@e_7K_3L@ge_3LY@     +"367426&#"#$32uq `^lpq Z|d{-l :dATCvzA<~%@"J H3L&+%"&54#567327~kLH3 "6jyiۙL">AE<T"W@T" JH G~~|_2K_3L!!+%"#'654#567632367T^[*1_>/s M~K*2`[yF2lLA9i 0Z\1#( 3@0  J G~g3L%+$367"'6.#'>32G(c{m}W4U:?(8w-9T/TuO[C8 `u`QP,D@A,J#" H G~_3L'"!+%"'&''4#567327&'6727Diz<czoia<^?c %]0  *M\~_xN#3+"iM3DG^fA&(@8q ]$@ HGt+'.#5>764'7]L_Qe5a5Q k81i7H, 2\L;<V$,@)J$H Gt#!#+27'674$%&'6?#&'7367 (@ #To/ '*_)n2#˚ wWqAxcc%e!@ NVA 1;Z /@,JH G_2L+2'67$%$'"  _c6% !  9K V*0%%4y6a $g9pQy\(@% JHGt!+#"'ȷ676767\Lpm3νv~lHrg/ɭ_#dF%<gnJ @N N!4"A,G3%R&@ JKPX@)p_7K_7K]0LK2PX@*~_7K_7K]0L@#~Wg]0LYY@ A$#"+#'63263"'67&#"3&#"5265VSf)7AԦ"a<'9Q"u_ot%f,R& <+4lufFp pNd.#9 3+(j" j3+3+3+V`|% "0+'67$%&'67%$5&<_a6\w*? H ? '<<*00B,"71c=>"A*oV7Q@N-+)'#! 4Jgg_3L6531&$  +67&%4'&'3674'6767&'6%67#&'$ G;V_\1̛ /b*>KS-8*|YA ~'"6T),<.,+)V5e+2B@?&#'J21.%H G~c_2L'*"$+&#"63&'$7&'"'654&'567632'&'67R J& ^9 ǟNZZ@&q0SESC!nj4 Uc7 % u^)4|xK ?9TR\(&:Q %.@+ J~b_7LA'$"+#"32&! 3&#"5265Ƚý >"iy%].C'EMr#fFw xNdV-< %d JK PX@~_2K^4L@~b_2LY@#"!  +"32654&&54323&#"5265Bg~kg~"iy%}Ļź_ 0fFw xNdQlJ?$@J#HGK PX@_7K_/K_8LK PX@_7K_/K_0L@_7K_/K_8LYY@ !$*$!"+"&#"32&'674&#"!2327JGQ=Ss$|76!"5z5oAqY# e@4#\%V7F@ H GK&PX@_2K_2L@c_2LY!/!!+#"&#"'674$323677z|[X\u'Wh 2t+\n@s6מFyu  v)T(?@<Jpg]/K]0LA'5A+7265432%.#"!4&+3&'"T)1l$1}&xL7{Zm,TZ^PQ8o $A<9<[z+hgp palfD LdZS@  JK0PX@g2L@W_OY#+3$5$76/; $kqb\. B t1 (K5@  * JK,PX@2  g  g]/K]0K _ 4L@/  g  g  c]/K]0LY@530.-+('!#$AA +&'5>54&'567632!"$#""&56!23 #"*{w.?fh=ʡ ^nL[,"Zl_hg\oGxSi  iVuq-G.0#V*9@ 2JK*PX@7g g  g  c_ 2K _3L@5g g g  g  c _3LY@9964-+*($#!$A"+3265"754#567"#"&#"3"&'>3232654&'#"54$IFc~~|wyxs|篨XGSb||qQr{+CSjDppD3Nht䒷Z_dA,/K2PX@/*!J@/*! JYK PX@"p _7K ]3LKPX@#~ _7K ]3LK2PX@-~_7K _7K ]3L@2~  |  pW g ]3LYYY@.-('&%$# ,, +#"&5>327632#"'65&'"3!527&!:QuRF^R{RMkG>/&5w8`A 08:MقR;~<74,nn*_,DF),/K2PX@ /*!J@ /*! JYK PX@#g _2K ]3LK2PX@-g_2K _2K ]3L@3   p g_2K _2K ]3LYY@.-('&%$# ,, +#"&5>72763#"'65&'"3!567&!=1IkL?yUyJptJGc@5(!Flzg)0s5E}vsJ6rz40.B&nn$8'*P/)JKPX@//K_/K_/K _2K_8LKPX@/_/K_/K _2K_8L@-g_/K _2K_8LYY@)((!!!%$ +! ! 76323273#"&#"$32654&#LuJʛNO6kgűP'?@<Jgh g_3L'&'!!!$$ +72#"5323273#"&#"632654&#H >5G$S>.}:m yQEtZ쬽a`N*2",⿹dX/L@I.*JH~ |]/K]0L-+A&2 +54327""5674'3&#"5265#&'4hyjXYG!_o%JZZ Ihgp palm*RfDo pLd+nd>9@6JHG]2L!2+4'"327"&'527'67eLuce4=)LAm*` pAm*`L%P &0@-& JH G_3L%#!+%#"&547'64&'567376%67327`uk4{dtB?E9~R3<('pp咣U$52L$=D*X:d },* 2= 9B j|*U7$A@>H   gg]/K]0L$$2A + 3&#"52654327"$.(~"_o%yjV OFo pNb^m]p pRg4K !Y@JHGK2PX@_2K_3L@g_3LY %!+%364&#%&'&''6767Pz[Kipi2gg(0r^5 9a A ]aZ."!h",+u Qh&#0#Z<>@#0J HK PX@%a ] 2K0K^3LKPX@%a ] 2K0K^0LK(PX@%a ] 2K0K^3LK.PX@(~a ] 2K^3L@&~  ga^3LYYYY@9543AA5 +6765'327"3&#"5267 #&' 3&#"526743278F =>~c*: vU\v&//k6'!vRI_)D-a(78 " s&BL*(p s!A}fnA|Y)n q/3q K{(#spP P3+Zq+@( J_7K_8L$%$ +3 !"'&'7!2#"'654'=eXS~)ӭ]eqa(E+)Qh"&x.3+/3+Zq"x3+/3+e& ΰ3+e&o"( j3+3+3+RE7W@T$ /.JH]K _&K]K_%L75#$"&6$A +3$#"52765#"'67) 7.+632#"'7324&#"=dӎyMPZEL&= P`=}۬^YB7/1Z Z7'p<;=v:1 bd"Fua ɰ3+H_"& M 3+ZO6i, (p", j3+3+3+-Ff,6@  J. IK PX@/   g]K_K  _LK PX@5p   g^K_K  _LKPX@/   g]K_K  _LKPX@5p   g^K_K  _LK'PX@5p   g^K_K  _LK1PX@>p   g^K_K  ]K  _L@<p   g^K_K ]K _LYYYYYY@---6-51/*)1&# +! #&'47367654&'5!3 !&'5>532654&#3-rS::JfD9-,RZZxxTW7"! tT-NzLYY##vᎦ\Gr d D\@YJH  g]K  ]  LBA@<;:76321,(&#"! "+32654&#4327"!4327"3 !&'5>5!3&#"5265M#k~##z~#fEZxx]N*`- jo_ _in_jo_ _inחY[qwiWbb_gR8R@O$  JH1-G]K _&K _L8632""&6$A +3$#"52765#"'67) 7.+$323&#"525#"=dӎyMPZEL&= P`=} vrr]\tP/1Z Z7'p<;=v:EűFRZ ZRp e"u ʰ3+eE"C ư3+ :dt" + +3+etG+n!HK)PX@! ] K ]L@'  p ] K ]LY@+*'&%"!!2 +4327"!"##!5>54327"!#~#IeمbeJ#z~#Ujo_ _inK]s]Kjo_ _in$eB e% eF,p!jJKPX@Q ]K]L@%pQ ^K]LY@!!2 +!3#.#!"#65.' !)eI>LKQYoI{XJ:u`P#e&( < $Kj@g.=872 J~_ K _ K ^K _ %LHGFBA@;9641/+)A$##"+!"'7327#"&5672354'327"23&#"327# '3&#"5276+YRMcx8XL|zT<LX8xcMRY2miَ8MQG\+.Z Z&;\QMr8^ZZ02\%<@9" Jg_$K_%L(%"#$+#&'7$!'$5&'"'654'632( 1 qc]& ¢i cI|+)MdD>:@7>J ] K]L987321AAA +&'327"3&#"52763&#"52764'327"y |zT<2miَmiَ|zT<D.Z Z&;^ZZ02Lu!/ZZ02N+.Z Z&;dDu" , ,3+d4U@R&0/* J  ~_K_K^K _ % L31.,$!AA +3&#"52764'327"23&#"327# ,2miَ|zT<LX8xcMRY^ZZ02N+.Z Z&;\QMr,&@ JK$PX@$]K_K_LK-PX@"]K]K_L@(p^K]K_LYY@ #A +3&#"5265!#&'67254'&'5!*~-^εN gw%$[R\HiW]]_g _ O8&%TTK,0e=+ H2 dG+XKPX@ ]K]L@! p^K]LY@('AA +3&#"52765!3&#"527654'&'5!~o%$fe%$i(/ZZ/0gi(/ZZ/0g7&%ZZ%&e3 H_& R7 :d*5@2*&! JHc_L%)*@+327 654'5367#"&'67267.' }DroooXsHNeXv)>eEH;eiH/eKPX@! Q]K ]   L@" a]K ]   LY@/.,+AA +3567654'327"!4'327"#4&#ee%$~%$fKvZ%&=i(/ZZ/0gi(/ZZ/0gɌ&% f2B@?-JH  h_K ]L0.*)A2%" +4327"3274327"3&#"5265#"&-bptj-`h-bpt-*mzl-YjoZ ZingVjoZ ZiniWZZ_gad4K'PX@ "J*H@ "I*HYK'PX@ ] K ]L@$p ] K ]LY@430/.+)(22 +4327"!4327"!5>54327"!-vt--vt-H[Y@-vt-YjoZ Zin joZ Zsd܌PZZ C"joZ Zin di" R@ +JKPX@,ppe^K]LK PX@-p~e^K]L@3p~pe^K]LYY@ 14d13! +%3265!"532#"&#"52674+"#!27""fh?a-[-H}5SDQ5?]B$(\IJ \\G8]ZCVd",d (dJK PX@e]K]L@%pe]K]LY@ Ad13!+%3265!"5632#"&#"52674327"ej>ay|Z-H|5B\||\B#'eױ \"VBZZBVH_"am3+i >", #2:MC 3+F0J@G.) Jp~~^K]K%L%av! + #&'7267$5%23267"3.#"5265.# :dd4pi#&J4ki=?ymVRt<$G+M-Zb PK~ݏgZZOVLDdZ'2KPX@2J@2JYKPX@%pg^K]L@+ppg^K]LY@ $13"ia+7267432632#"&#"%32654#"53267.#"ZXKM< ~TJCH/]g5 ,OvYL+/SMuN8Y l* }bz{^PcCXB\d[JK-PX@p]K]L@~]K]LY@ A%A+72654327.#"3&#"dl1=\6 9Q+^S94fF?Zs`\GZm)`HXZ d"hKPX@!a ]K]L@'  pa  ]K]LY@""2 +!"#.#!"#>7654'%!HK_< ;W66iByc"#Gx:UHdEK PX@+'$A@;7/ J@!+'$@;7/ AJYK PX@3 _K _ &K _K _ %L@/ _K _ &K_K _ %LY@DB?=:842-,"$##$"+3&#"525#"'7327&#"&5672354#5327"273&#"327#"uVXrnZ>9/>[E'ZvBB|Z'E[>/9>ZnCZ ZC*'Ly62Il[@ CZZC Z@[lݖ26yd%:@7" J~_&K`%L(*$+#&'7674''65&'"'654'632f2B'f mNccW[NrUgr a+}^ac:"';@5D@A5J0,H ~ K^L21/-+*AA" +.#5327"3&#"52653&#"52654327"p-Xpz|V7*mpl-L#m`l-7Xpk|V7Q\ \U5*]WZZ_[g_9GZZ_[1e\ \_5@"  3+ahPc%B@? J~]KK_%L$#"+4&'5!"3&#"5265! #&'473>7/Cw@0#J5 HKPX@# ~ KK^L@& ~~ K^LY@9643AA5 +6765'327"3&#"5267 #&' 3&#"52674327LF =>~c*: bU\b&//k6!bRIK)+-M(78 " _&BL*(Y \!AfnATY)W Z/3] K{A7C@@H  e _K ^ L7610/+*)&%A"@+327"!54327"3&#"526=!3&#"52654&#I(@> 4(JH0,GK$PX@)_ K_ K _!L@& c_ K_ LY@=;7521"$'$$" +32654&#&'"3274#567672#"'3&#"525"&543M7?MJ7MfΔZqr]\tuÆZ3i62ϲ=R(f<a^RZ ZR`.A@_[Ai+ [ Ȱ3+d-K@HJ H*& Gg_K  _  L,+)'"#" +"&'5327"3274#5327"3&#"5253yxW\TtX] s]Xe\Z Z\v4A\Z Z\IZ Z\A4=@:H ] K ^L43.-,('&#""A+)52654327"!4327!4327":;.GfzfC2y/Fbub5.x.Gf{fD15@ZA|qK[[GuUpL[[HsUqK[[KqapHAi" w2 +JKPX@&pg]K]LK'PX@'~g]K]L@-p~g^K]LYY@ 15d!3! +%32654#"532#"&#"527674+"#5!27"bKGd].2l!;4}^/-2@kJ)zbdWkb13a)#Ie):A="(|A (3@0Jg]K]LAd!3!+%32654#"532#"&#"527674327"KGd].2l!;4}^*UpRpP.zbdWkb13aqJZZGt_"4P| |3+@"(#RM ߰3+d0KPX@.) J@.) JYKPX@.p~~^K_%L@2p~~^K]K%LY@ %av! + #&'7267&56%23267"3.#"5265.#"Ma=-a8+@7`\[57iEUGd4=&L'NE EAmL|YNND<^U"HC 3+U"HjV3+3+(1A,N@K*J%#HG e_&K_L,+"*! +63256&#"3&#"525#'734#5673#ѺOfpir]\t$fΔ$ <&*Y֓RZ ZRbR(f_dd"uL 3+U"FM, ߰3+{.VeFL 3+"jL  3+3+3+cM3+3+d% 1K PX@, *JKPX@,  *JKPX@, *JKPX@,  *J@, *JYYYYK PX@0 p g]K^K _ % LKPX@* g]K]K _ % LKPX@0 p g]K^K _ % LKPX@* g]K]K _ % L@0 p g]K^K _ % LYYYY@/-)'S#3! +%32654!"&'5!"7 #&#"5265##&'473>:5ix*4?A[5wlbv9;x'#YAZVqU>YYYIqzZ@S T=694do;EX@U<Jg ] K ] K] LEC?=987321,+*&%$1$#A+!54327"32#"&#"5>=!3&#"52654327"32654&+4IlllJ:gJKww@=o3Jhhh@54AhhhH5r>;etiQ dVZZXbvtZIrqKZZIsqIZZHrrOOsWB 3+ah"uR@"Cy 3+^"\ 3+F+;@8  ]K ] L++)('&AA +4'!5265467"!467"3!EZ[T+*UuauL3+TuauM1*TVThXDxqJZZGtPpKZZGtcpLXjd DS@P3/- >#J ~g_ K _  % LA?=;7510$$A$% +!2"'674&#"67467"6##&'463 !&' IOL%!O7ń6SuuP9!%LO>[^X` '27$ rj\WW\jr f,Y2' `XT :0?*@'93!J,*(G]L84NA+%6=4&'5676=4&'567&'&=4&'56752DGsrGE15BIooA@YT2OpoW6.fy^@8ZZ3C]x{`D0ZZ -Dbv~[:7 ZZ<8[P4>K PX@$"!5 J@$"!5 JYK PX@)e  e ]K ]L@/  pe  e ]K ]LY@>;8621A&#d1& +3 7.+632#"&#"5267#"'67!3&'327"3265!"&= P`=}y|Z-H|5yMPZE!\||\!ej>a=v:ױ \<;L!ZZ!#'F 9S@P2"4 5J  gg ]K]L971/.-A&#d"#! +%32654#"532#"&#"5267#"'67;327"327.+KGd]^l!;4}^#E1yMPZE7 ipRpnU= P`=}2pzbdWkbnW(b;qr", #p3+3+dy"(#p3+߰3+2H@EH  e ] L220/.*)(&%  +3&#"5267673&#"52654'#3&'525wuO(;6JAGTp6'~PQ4;l|TSWmRVh#5-Z Z1;$bZ Z!0?ChRZZR5C@@&H e ] L10/+*)"!   +#3&'5276=#3&#"5>773&#"52654'%n5Vz:FOZ;1 pn!8dVcv:Ok25&#"56!! !YNOcPEV~~XES`LMV/;:ثch8M[  [Ls[qx((+=@:+( JGg]KL2E1 +!&#".#&'5>="&#"5>!! !CDCXo WW RhWEyTE'i >", #"$ 3+F"(#$  3+(I=Ve@KCMF< :9  JKPX@W~ W  g  gg _K_K _%K_!K(LK$PX@U~ W  g  ggg _K_K _%K(L@U~ W  g  ggg _K_K _%LYY@-VUSRPNJHA@?>7510/.+)(&#!  ==+#"&#"3267 #65&'"# 4632324ᒑ.#"'6563#"7672&#"#'&'eht,"1H1m%!I`w݆*"]X$r- 798-)  m!n'Ș}"Ў bO}?JIg#-WoGc" x;&"("K6O@D<F?& $# - JK$PX@T  ~ W  gggg _ &K _ K _ %K!L@T  ~ W  gggg _ &K _ K _ % LY@ ONLKIGCA:9875320)'!!"!#! +2632#65&'"# '723254%5265&''65672"&#3#"7672&#"#'&'jf? Ndb &s dvsi&*}S/ 798-)  m!n'pk6?<x  Ocdmyvt?hB7" x;&"2>@  J6HK PX@9 p g   g e ]K]L@: ~ g   g e ]K]LY@<;:75410,+*&%$A$""+33"'654#"#3&#"526=#.#567"34327"0{gL07GSbФ%_o(XE?hiB#)({xiy(/p%3DIjLZ ZThGZZ SkdZ Z^oTB"FxQJe2z?3+5WI>II0ASRR3>F!=&Vo o2->,o oMe8UA47J]U AK'PX@.* %< J@.* %< JYK$PX@)K _&K_%K _ ( LK'PX@& cK _&K_%L@- ~ cK_&K_%LYY@?=860/""$$$" +#"54324&#"326327"54#5327"#.'473267']38X]2BOB"FxQJe2z?3+5WI>II0AS$F̹&Vo o2->,o oMe8UA47J]_BNP/ @,($J Ht+>7.'$%.'>7$ D:8E g E8:D tyE8:D |xD:8E |)('&G $&v #&i|UPs+(0+%.'$%>7>76'.' <22<~ g <22< N522:cV7228Y %uu$mod{!&uu%Wr&is'_)~'mo'nH >" #9 ~86~3+63+ <"#89y 3+(LOs@J HJD><:4.(" GK PX@peL@~eLY@IE3/!&6!+5#"'67) 7.+654&'567654&'567$54&'567UyMPZEL&= P`=}7UwwO@5Yt~tT0BYh7;IttO@<;=v:y\O YYUXwuFQ YYWKFbF YY Gel?U@ POF93!JEIMHH,*(GK PX@ pg]L@ ~g]LY@@@@U@UTRLICA84NA +%6=4&'5676=4&'567&'&=4&'5675#"'673!27.+52DGsrGE15BIooA@YT2OpoW6.HE1yMPZEp= P`=}2@fy^@8ZZ3C]x{`D0ZZ -Dbv~[:7 ZZ<8[3<;=v:Fp&:@7 Ja_$K_%LA$($!+%# !2.#"3 3&'525bee]ݭ)~Srqupt1D?P)+(RZZRU"6@3 Ja_K_%LA$%$!+#"56% .#3273&'52523T0vd rrqupt .\HJTRZZRd{\ 0+'6/77/7'bskiz?S@ezho|@S>)>W+LVX(NWM'W(OWW)N gdD@  JKPX@nW`P@W`PY@ "+D7&'47f }L }[ [ P ,dD@!Ug_O!"!"+D#4&#"+4'32632U@11b|GI@JHLbB 0+>7&5478Om088*6AP>p8 0+'654&'>7:0mO97qp>PA8(88n8<ddD JKPX@gW_O@gW_OY@ ""!+D&$#"#"'!28h lV=5nw;KȺ''610 '1;EOdDKPX@c  ppp  po  ggg  g W_O@f ~~~  ~  ggg  g W_OY@:OMLKJHGFECBA@>=<;98764321/.-,*)('%$#" !!!! +D#4#"#32#4#"#32#4#"#32#4#"#32#4#"#32#4#"#32#4#"#32#4#"#32{}~{t{~}{{}~{{}~{{}~{tz~~{[{}~{{}~{'')''ũ''Q'1'N/Mk{dDK)PX@KQWR d> F,(#"   y u J43 HpoGK-PX@KQWR d> F,(#"   y u J43 HpoG@OQWR d> F,(#"   y u JI43 HpoGYYK PX@L   p  ~ggg g   gW_OK)PX@M   ~  ~ggg g   gW_OK-PX@[   ~~ ~  ~ggg g  gW_O@g   ~  |~ ~  ~  |ggg g  gW_OYYY@+! `^\[USPNMKIH:8&$ /!/+D547.#"'73267%2&#".'>5473263"&#"#"32&#"#"&#"#&54654&54'654&'>7$'654&#"#&'4654&567232632#"'732654&5472326323uU=hKtBYB=+<<~BOL35<<# R:1 ' ( *7H :#J9 "( P3uU= SC(  $ 3g7H :#@C ' " =AtBYC34==3uU=3uU=I7H :#6M "# } RM ' # `K~BEV=+<<7H :#J9 $ " S:1 " ' 3dDu"wP ,3+@"w0P 3+d@ -sJK PX@%e_ K]L@+pe_ K]LY@-,d33! +%3265!""632#"&#"52674Ȏ=33ej>a\By|Z-H|5B\\BB\#'BVzױ \"VBZBVVBd +:@7J gg]L+*d#3! +%32654#""32#"&#"527674춭3KGd].2~P.l!;4}^*UU*.PzbdGtkb13aqJZJqtGe"3  Fbb3+3+Jt"S kk3+3+d(dHK'PX@p]K]L@~]K]LY@ +3267&'3&#"526543£+Q9 Hi4pF?v1=\6H`)m FXZ Zs"\GZdh k@ JHK'PX@p]K]L@~]K]LY@  +3267&'3&#"5265432s(^+Q9 ‚9+4pF?v1=\6H`)m XZ Zs`\GZ<"Fp ٰ3+("p 3+d(0@ ' JKPX@7p p   g]K]K `!LK$PX@8p  ~   g]K]K `!LK+PX@5p  ~   g  d]K]L@6~  ~   g  d]K]LYYY@00,+$5AA +3&#"5265432%.#" #"'4725&4pF?v1=\6 9Q+S. VJXZ Zs"\GZm)`H)_xln3d0@ )JK$PX@+p g]K]K(LK-PX@+p g]K]L@,~ g]K]LYY@00$%AA +3&#"52654327.#" #&'47>54&4pF?v1=\6 9Q+^{9#QP*tXZ Zs`\GZm)`HoUj d LOn@k@!JIDJ ~Q _ K _ K^K_%LNMHFCA=;:9432.$##&A+$''3&#"52765!"'7327#"&5672354'327"23&#"327#n}2miَYRMcx8XL|zT<LX8xcMRYK+98^ZZ028MQG\+.Z Z&;\QMGdIK PX@.*'DC>:2  J@!.*'C>:2 D JYK PX@7 Q _K _ &K _K _%L@3  Q _K _ &K_K _%LY@HGB@=;750/"$##$"+$'&'3&#"525#"'7327&#"&5672354#5327"273&#"327#4WuVXrnZ>9/>[E'ZvBB|Z'E[>/9>EK6'CZ ZC*'Ly62Il[@ CZZC Z@[lݖ265Ͷ \x"y||3+dz"y~~3+d8R@O)32- J  ~ a_K_K^L761/$!AA +$''3&#"52764'327"23&#"327#m}2miَ|zT<LX8xcMRYK-98^ZZ02N+.Z Z&;\QMCdk1K PX@,+&"  J@+&",  JYK PX@' Q_K_&K_L@(  a_K_&K_LY@0/#$%"" +$'&'3&#"5254#5327"273&#"327#9WrXVu|BBvZ'E[>/9>8K-'CZ ZCCZZC Z@[lݖ26! dBb@_  "   J  ~ _K_K^K_%LBA<;AA##$' +7673&#"327# &''&'3&#"52764'327"2yuXN8xcMRY}Pu%(2miَ|zT<'~C1WD|\QM9_4Z ^ZZ02N+.Z Z&;d)8K PX@'3/    ($J@'3/    ($JYK PX@7   e  _ K_&K_K_%L@4   e  _ K_&K_K_%LY@875420"'##$% +573&#"327#"'&''&#3&#"5254#5327"20h䞕Z'E[>/9>ZnW1r&rErXVu|BBvIc"|D@[lݖ26y:$ CZ ZCCZZC<"^ ^3+(p5K PX@  J/+ H@  J/+ HYK PX@9  e  _ K_&K_K_%L@6  e  _ K_&K_K_%LY@554310.,*)"##$$+273&#"327#"'3&#"525#7354#5327"3Z'E[>/9>ZnrXVu"|BBv" Z@[lݖ26y'CZ ZCEnCZZCn24^@[ J  p~` K _ K^K_%L210-,+5A##$! +23&#"327# '3&#"52764+"#!27")LX8xcMRY2miَSDQ5f]Bu\QMr8^ZZ02G8]ZCVF52K PX@ J@ JYKPX@7p _ &K_ &K_K_%LK PX@8~ _ &K_ &K_K_%LK'PX@5~ _ &K_ &K_K_%LK)PX@;  p~` &K_ &K_K_%L@9  p~ ^ K_&K_K_%LYYYY@0/.+3"##$# +273&#"327#"'3&#"5254+"#5!27"Z'E[>/9>ZnrXVu/-2@kJ)b Z@[lݖ26y'CZ ZC)#Ie):ei=8I@F&He Q ] K ]L864321,+*'%$AA+%265!3&#"52654327"!4327"3#4&+d-\.cj!m22o*?k.&iv*g13cKvZhjZ ZrƐsZZo~ZZ}:hAi9J@G*&He R _ K ^L984321,+)'%$AA+%26=!3&#"52654327"!54327"3#4'&'#r*P+qeq00i(4 JKPX@4  p  g ]K]K ` ! LKPX@5   ~  g ]K]K ` ! LK$PX@; p   ~  g^K]K ` ! L@8 p   ~  g d^K]LYYY@>=986531-,('AA+3&#"52765!3&#"527654'&'5! #"'4725&!~o%$fe%$. VJi(/ZZ/0gi(/ZZ/0g7&%ZZ%&_xln3P8@ 1  JK$PX@)  g ]KK _ ( L@&  g c ]KLY@88.,('$#""+3&'5265!3&#"52654!" #&'47>54&05JpfpM1_5IpfpT+4K_G8#QP*zB[  [@|UpL[ [OmqIZZFtoUj H!)P@M$ Jg_K_L)' !! +&#27$%327&'#$$!ȕQ*E`o6#4TsRwr/*" >K]"  ]@57 mfU'K'PX@$"J@$"JYK'PX@g_&K_%L@)g_&K_%K_%LY@ ("3$+2 27&% 327"'# 6# Z#  -' <=):k)=`^Uj" -yw@vS@>^$$`uWHw_"& y){{3+Uy"Fy$}}3+Ri #7@4 J HQ]K]L"&6$+%2765#"'67) 7.+3#4&#!yMPZEL&= P`=}KvZ7'p<;=v:/1dix#7@4 J HQ]K]L"&6$+%2765#"'673!27.+3#4&#!6E1yMPZEp= P`=}2@KvZ7'<;=v:^/1 p< p)4@1& JHa_LA"@ +327"654#5327"3&#"52675&# cHmc?Bad/sfu4Is Z7;9# =Z ZyxMZ ZMt p"<p 3+ p"apq ް3+>i>H@E3$J.*H Q _K ] L><:9870/"1A +%654'3&#"5267 .#5327"7654#5327"3#4&#!oz:կY%IDHW]?U;ZE-vmWWcXQMM^01KBKvZ,)W@8 Z ZDRYKZZ.у4.Z Z2B<1@i_" RiZ4KPX@JH@JHYKPX@*Q ]K]K ]L@+ a ]K]K]LY@43,+A&6$" +#4&#!56765#"'673!27.+!4'327"ZKvte%$1yMPZE= P`=}2%$fiZ%&<;=v:i(/ZZ/0gɌ&%Ri}0J@GJ($H ~R_K ^L0/*)"6#" +#4&#!5265#"'67;27&'&'!4327"3}KvG81yMPZE= P`=>=15IpfpT+4KiZFt <;=v)UpL[ [OmbqI if3I@FJ!Hh Q_K  ]  L31/.-,2%"$ +%265#"&54327"3274327"3#4&+1l--bptj-`h-bpt-*mKvZ_gajoZ ZingVjoZ ZiniWdi" N f"#''3+3+3+d"#l3+l3+3+d  3+WBK<r*D@A% J~g_K_%L$$$#$$%+%654&#"! 327! '&'#"'&'47232̗Y݀2cI#)dL 6.J`5HN+N Q<.)u@$ JK PX@$ph_&K_%L@%~h_&K_%LY@ $"$#$%%+%654&#"543 327!"'&'#"'67232y*iYjKY\yEӅhD#g&+%SC%Z[b.eZӣ6h k$/r+& ,21J~ga_L$#$$)%+%654&#"#'&'&'&'#"'&'472327! 327̗Z:dΐ#)dL 6.J_Y݀2c`5=$,2miَ|zT<LX8x`_^ZZ02N+.Z Z&;\ylo "Gd3@# .,*JK$PX@/   ~_K_&K_K!L@/   ~_K_&K_LY@33%$%"" +3&#"5254#5327"273&#" #"'67>74&rXVu|BBvZ'E[ OPCZ ZCCZZC Z@[lD~u`` સ,"wQ Q3+Pc"wQ Q3+d<9"HK$PX@4   ~e ] K]K _ ! L@1   ~e c ] K]LY@7543/-('&#AA+!3&#"52654327"!4327"#"&54633265\.cj!m22o*?k.&iv*g1O8(.T29jZ ZrƐsZZo~ZZ}bJ<<?{@.8 6 J)%HK$PX@$_K]K _ ! L@! c_K]LY@;943"1A +3&#"5267 .#5327"7654#5327"#&'47>54'گY%IDHW]?U;ZE-vmWWcXQMM0&m6H-G8 Z ZDRYKZZ.у4.Z Z2ɠk@H8:=_R>,?Z ZK-NNZZ )x0&ZZI>";p װ3+@_"[pr 3+U (d JK PX@e]K]L@%pe]K]LY@ 4aA#0+&# 3274327"3&#"#"$54$32oa>jeB\||\B5|H-Z|yَ#VBZZBVއ\ ״U7GU :@ 9JKPX@/  g]K_ K_ LK1PX@4 U  g]K_ K_ L@: p V  g]K_ K_ LYY@ 8610/+*)$" : :#0 +&# 327 $54$324327"326=4&'567"#&'oa>jeZ|yB\||\BsqoFHsssGGӁxَ#״VBZZBVtt|]QQ]~66U7,6@ -!6 + J HK1PX@6~  |_&K _%K_%L@4~  |_&K_K _%LY@53$%"($ +#"54324#567326=.#5327"#"'&#27Y^*^xfYT]L+1VjiV,,;;LIas$.;R[m_^tbcI,0I I/-K~m5/1F4R@O310Jgg_ K_%L.,('&%! 44 +2326=4&'567"#&$'.#52654&'"'656ؠn[ZoFMvvUEnR%o)ւv/yrsxHS  TG}axsyO_3`@] J~~g _&K_%L/.-,(&!  33 +'65672326=467"#"&'.'52654&Tuf" aDD](;tSSt7(ڐ"`oxjn8 bP!}ozmjo^5,R  R+6KZ74'&'5!"UcbR/?fqp\;/n'#YAaC =55dnihf-4JJ0+XJH T=69$$VU9dE@ :6 J"HK PX@5  ~  ~ e ] K `LK1PX@?  ~  ~ e ] K_K `L@=  ~  ~ e ] K]K `LYY@CA<;9754/-('&#AA+!3&#"52654327"!4327"326=4&'5327"#"&'\.cj!m22o*?k.&iv*g1xrryPHxyxEZjZ ZrƐsZZo~ZZ}'t~~tRr]\ \]tFA7E&"HK)PX@4 U   g _ K]K _%L@5  ge _ K]K _%LY@CA<;:654/-('%#AA+!3&#"52654327"!54327"326=4327"#"&5pP+qeq00i(]ώ3-h]?fWe@ `$tRq* tT7Xy_TT_y{bmW2%@  JK$PX@!]K_%K_!LK1PX@c]K_%L@$pc^K_%LYY@ $%$#+!#&'473>=4&'5!"'473265"덐-'Z]l7Z|X9вU dq;p fI1OjSLLSj}lat2zM@J:*  J%!HK$PX@,_K] K  ] LK)PX@)_K  ]  K_L@-K]K  ]  K_LYY@%GFEA@?6540/.'&$"  MM+##&'67254'&'5!"7654#5327"3&#"5654'3&#"5267 ."εN gw%$[ mWWcXQMM^01KBarz:կY%IDHW]?U;Z2| _ O8&%TZ.у4.Z Z2B<1Z Z,)W@8 Z ZDRYK2qFd@aE<0"  :,( J H _ K _K _ % LFF?=9742.-"""+"7654#5327"3&#"5254/3&#"527&+ #&'473>754&'5BBec$NAtrOO> FWaWY!4?W[XWm;:Jn'#YAa/CZ )x0&ZZI`Z Z 1?Z ZK-NNf T=69HqH[e HM@J>* JFBGp| ]K _ LECA@;:aA% +>54&#"6!&'3&#"5265.#532632765432767" 3&#"4'uq@[UwxY2y_1B\a[ (D#C4'fwaXf+_ = \Z Zl}cQ;W sk&Z ZiZ OlJb M'KPX@(" '?1. IC J$HG@(" '?1.  IC J$HGYKPX@8  ] K_&K  _ K _%K_(LK$PX@6  ] K_&K _ K_%K_(L@3c  ] K_&K _ K_%LYY@HDBA=<;5("$$# +32654&##"&'3&#"5274#567>3276543267"3.#"54'&%K,E{ Fmp4R\oeQoj.F;Z`*nJv}`:k1LG 74hY!"?XZ ZC`>#P@0-:::GP[Z{zsZ:$ FI+K1PX@ E5C#"J0IH@ E5C#"J0IHYK)PX@3 p  |g] K]K % LK1PX@9p p  |g] K]K % L@@p~ p  |e] K]K % LYY@@?=;:942-,+%  IF +3 7.#"3>754'&+3267$'"5265.#  #&'7267$5%2ZF>T5Fp_PR81U_ѩ6Z>!l5Rt<$G+dd4pi#&|%p60R E6s] MZOM-Zb 25P@M+* 10Jp|~]K_%L#$!%%+%654&#".#" #&'7267&56%232>3 327!"*iYj=&Ma=-a8+@7`XKY\yEC%Z[b^L'NE oZӣ6 H4 UxT : MZd" $3+3+ah" c 3+2(9A@ 0 JKPX@>  p   g]K_K_K ` ! LK$PX@?   ~   g]K_K_K ` ! LK-PX@:   ~   g d]K]K_L@@p   ~   g d^K]K_LYYY@995321/-)($#A+3&#"5265!#&'673254'&'5! #"'47325&*m~l-^εN gw%$[HRH. VJniWYY_g _ `8&%TTK_xl~32<8@   1 JK$PX@/   g]KK_%K _ ( L@,   g c]KK_%LY@88.,$#" +3&#"5265! #&'473>754&'5!" #&'47>54&*Jh_rF:n'#EUa/C3=7#QP*oK[ [FtWf T=69HqH[ZFtoUj d(J@ AJ0HKPX@9p  g ] K]K`!LK$PX@:~  g ] K]K`!L@7~  gd ] K]LYY@$JJFECB@>:96541/.+*'&AAA+3&#"5265!3&#"52654327"!4327" #"'4725&3c ld-\.cj!m22o*?k.&iv*g1. VJʎhZ ZhjZ ZrƐsZZo~ZZ}xln3AJ@ CJ40HK$PX@-  g _ K^K(L@-  g _ K^LY@ JJ@>:96531/.+*'&AAA+3&#"526=!3&#"52654327"!54327" #&'47>54&M1ggr*P+qeq00i(t|>j7&iv*g13c ld-#WiZ Zg~ZZ}:hZ Zhj)9HK"PX@4   ~  e_K ^K _ ! L@1   ~  e c_K ^LY@7543/-*)&%A"A+4327"!54327"3&#"526=!#"&546332650i(;9876.-+(&% +!4'67&'&54327"!67"3#.#!"#676*Kʖ kPk-bptj-0-J,0b85t>LKUpkc7R>QjoZ Zin3 ZZ4*O40H@; :7) J= I>40HYK PX@+~a _ K ^L@6~a  _ K_ K ^LY@" 6531/.'&%$"?? +32746=!67"3#.+"#>7.'5327" TtuOb6.9RA,gFؔ EWGxgW\ Q(JU4B"&\X>noGtcEcQpr\` `\!`,i'@  JK-PX@)Q]K_ K_ L@/pQ^K_ K_ LY@'%# +%265!#&'67254'&'5!3#4&+X-^εN gw%$[R\H*Kv^_g _ O8&%TTKiW Pic" <T,0+#54##"54#5327"32654#5327"3!e=o_o_S~aZ ZēZ Z02/# 0+!2#54#!3&#"525432#54&#";_o\_񼇅xMCZ ZŭŒF +#0+4&#") 6763232#54+3&#"525||))|BK^uKPW/_o߉؄tELWgZ ZSF&0+543232#54+3&#"5254&#"F\_^uKPW/_oELughZ ZŒ<%#0+2#54#!326=3#"54#5327"?;ʳo_MCgēggZ Zdp"0+67'$$6332#54#!#3dYa"0 ;vd  MCF" 0+! #4#!!2#654'!4'327"NwVy:qyjp ѪYZNOLH mh-0Z Z0'ldL0+432#54&#"!2#54#!d\_񼇅}&ŭŒolHK~%-*&0+! !34&#"3&#"52543232#4+"325>l:ؼ_o\_bZ񟕔TOŒZ ZF( 0+! !2652#54+# )54#5327"-|OuKPW/4o_^pēELWglZ ZP,#0+4'327"632#54&#"3&#"52765gyjf o"|zk_okO-0Z Z0'gU؏Œf%!Z Z -e<80+%!2#54#!4'327"Q:qyjp ol\nh-0Y Y0'lM.;20+3&#"52764'327" 3274#5%5#"&=2miَ|zT<7C\LBmjq=xv2f^ZZ02N+.Z Z&;hC?3OVF_lM# 0+%4&#"3&#"5254323&#"52Y_o\__oŒZ ZZ ZF0+ $'7$.#"#5432X^El1b \= [F +Œ<K0+"'4323&#"527654&#'=HK_oxC'|]Z ZC#sdp ' 0+4&#"65&$43232#54#!#336ǡ:\ E ^G5dZoLꝷ$G88,MCF/+0+32#54+3&#"5254&#"3&#"525432C^uKPW/_o_oRUELgJZ Z򝺻Z ZF08 (,'0+"&'5327"3274#5327"32#54#!Ov}}{L_w}||^uKPW^;\Z Z\v+\Z Z\ELugZO6FC 0+54&#"3&#"525432R_o\_ŒZ ZϭZ*60+&0+32654&#"!6767'&54632 '&'"32654&cD_O5:lgo簬rf|4?LV@?MYC]K2jPP\\ PqYaom\_mnMD30+3&#"52764'327"6323#"&=4&#"2miَ|zT<c,;]|Mn^ZZ02N+.Z Z&;Zvb7 k~jTbQXd 2+0+! .#"!2#54#!3&#"52=#"=3;432)))||'mo_p%#KMB|GK%kZ Zkh.hH2 PT1 *  0+4#"3265%3267$5>7327" 67N]O.:I'Z<8h kk$9yAP"Gd@+%rۼRdp+47Z00+%&54#5%3274#5%5#"'&'#"&54#5%32NDC\LBmjq=x; RS=xvNDB-6c3 >3+_0+32735#"&54#5%!C\mjq=xvNDB< ?e9FQUCD/3<] B  0+%&#"32#"&543257!:^BCgA%ϲҹVv.C:_LA0+%!2#54#!4#567!!G&fΔBolHوR(f_g^  0+3&#"527&#"!!ȷ6323t_^w\nmhҗhK;SZ ZS;T(i@F5 0+#"3253&#"5254#56763232#4+! !34&#"΃zyr]\tfΔqO1pnOFϴ?RZ ZRKR(fZJr3.tWN]b0+!$%34#5673!# 3229 h:KH< a+oBYu6Z B'"0+3&#"527&#"3&#"527ȷ632Qt_^w\nu_^vhҗ|K;SZ ZS;SZ ZST(i_ X 0+ȷ!hҗ  T(iZ =B10+&#"3&#"527ȷ6323274#5%5#"&5T\nu_^vhҗ|C\L8js;SZ ZST(i?3ne9FQUCDc3PZmn9 ud602) 0+3274#5%5#"&5474#"'4%327C\LBmjq=xv7 3duV4H?33&#"#&'4gS_w[-B?2g R|hwq'I m.!'_Q2%$"0+$5454673>3&#"#&'46rDO-[-B?2g Gl>2P^F%|e'I m.!'lZ 4-0+%#"'&'#"&54#5%327&54#5%3274#5%3&'525.q=x; RS=xvNDBfNDC\LBrqpptsCDQ)S""c35&#"#&'467&$'4323>3h:_ 2g p ȟ[-B'maȷp'I m.Z%#0+3&'5254#5676367!5$!"rquptfΔ DBRZZRR(fsX̮ nIV|XZN0+4#5%!!#"&54#5%327LBnq=xvNDC\3<{CDc332#"&'!!3&#"5275#"5473Q%K,EeQomp4NR\oFrH>74Q>#P@0-::!"lXZ ZCRdp+47U@RF ', ,(0+3&#"525$47$!256'r]y\tSg#6$1nbRZ ZR8a YPU J yY=Z 0+%#"&54#5%3274#5%q=xvNDC\LBmjsCDW373*% 0+2##"'&'&'676765&567&#327&'&47%2.'"6365.#$7##"3$5&#"3>7 #"'#27&'1ː.iʅА d)RT|.K:-WSW!O~oy.a. L?|tXRڑ@LQ`{iaЁ͑f 偷gPy/V ')~ngB;f SVQ \0_REpt oz*.FS /E@ d a'4@LYfr@wsrk`ZYTGB>60)% 0+#"'"'&5476763%"6$%325#6365&%"672$#"'#>74'#"3&5>727&'4736##"$)d זi.8ђTR[SW-:K.ި~O!.Ày-t|?L .>@R߇`Q?i{ag幅f7Ɓ!p/뽀yP8n~׃' !,VS ;BN\ QR_tp.*z+@E Sda.&0+'735#'7354&#"#54323#3#3&#"52=""_\t$|t$|o_Th0h0ēгr&r&{Z Z{e"% >>3+d'"0+2#&+3273#'! %#"33 ޚ "3wUs}p RDZ'd+0+%6%&!"5265#$%67674327"v8)=3bG^Q*s"Qyj  Z1IIs42[p0h]Z ZWld)!0+!3&#"527654'&'5!6%&!"5265'^o#p o"#(9e3^K!j)#c c#1h$XX$ $ [3Qd *0+! /! '&5%75&'7!27$7&!#g1nݖֻ(9y3Q|T(9y3;%^pr\WŠ(T$$d( 0+!3&#"527654'&'5!3&#"5265;ro#po"%_(j)#c c#1h$XX$jLY YThd?#0+3&#"5265!3&#"527654'&'5!!3&#"5276=%_(;ro#po"p#ordjLY YTh j)#c c#1h$XX$X$h1#b b#)jFX %0+"32654&%632#"5&'7!2%"`gjgM(9y3Q ^KPٹ(4K $ W3Qd560+&#273&#"#$%2327"!3&#"5276=a{^s-{QQ4 hM`3p#or -c\  \7W}X$h1#c c#)j<+n0+3&#"52765&'7!2%"_(9y3Q ^Kj)#Y Y#1h $ W3Qd 2$0+"32654&3&#"52767#"5#4327"632fjf%_oR xiQڌOʿjJZ Z$,KV*udZ Z^{Xd] 3 0+"32654&632#"5!3&#"527654'&'5egjgo"Mro#pPٹۿ [3+a a(1`<Ol&0+32654#5327"#"5&'7!2%"Do_(9e3Q ^Kˢȣމ\ \"7 $ Y3QF om2/0+ 7.#5327"3&#"52653!$&'7!2!3B~jM0dtt++ttd0Qu(9y3QDQp93_o[ ZssZ [o5OU $dB>0+5&'327"32654327"6323&#"5265.#"#"'& xi(o_O Ke'iv~ؕHH,+a a^oșfTY Y 5%"36%&! 526743263!"'xnpo EAl#(9e3^K2b~Gr8g('+ } $ Z3QW5Z ybpZ 20+#"324#"# '&76! 6323&#"5265ǻ»^`ѹ"+w_o(!a4B~!>ۿ[\PH# Y YThd  : 2! 0+&#"3232654#"#"53253632#"'3&#"5265dQBG]B˳P̐EݛffE;|׵@PCr"j9uO``OjV{n nd /0+4327"6%&!"3&#"5265&'7!2 xi 7(9y3C_o((9y3QCikda a()K $QH# c cThq $d# 0+%4&#"3&#"5254323&#"52p_oY\_oɘZ ZZ ZZ ( 0+%# %3274327"3&#"52655u]Fs xi%_o(`oh&BBk\kdZ Z^ojLY YThd,-0+#"=33265# %2 3$7&'327"y{pf|6; xi ,((șLf. #H,+Z Z()P$0' 0+27"3&#"5265!3&#"52654327""in%h_og(%h_og( oxin a^ojLZ ZThyjLZ ZThMkdZ Z^oHVO0+!2754!532'5#$%2,rM0_9{i0#$KeD'Z-'Z ;4'0+!"3267!3&#"5276=###"543!5.#5327"Rgjg}f#~[rr 0dtj+@ k[$h1#d d#)juo[ ZsP  40+27>5%"3&#"526543263!"'36%'654'xnpo EA,R,2b~Gr8ť!])n('+ gybZ XezjW5\ ybp ף cBd)%0+%32655>32#&'65.'"#"$5x)_qgf ߩtG9&S4El?3@}'ᒕk[SJ-wg޶ʮdw20+%36%&! 52674327"!4327"3&#!7(9y3U^K(o_%(o_%iy $ M3QhTZ ZLj}}hTZ ZLjo^a   >8%0+!"7674!3&#"5254'3&#"52>7 .#&'7 %CR Qzp aae:OKOdn\|@Tb[C/3*]o(9y3|+!*zⴝ/'uS rMY Y&aRF*$Z Z*9D@H$ )9Fh6)0+4327"#"5!3&#"527654'&'5!3265(yW%Yhe#po"y{hTc cLj^j)#c c#1h$ZZ$|PșP%0+32;#"+3&#"52654327"貲ndlw%_o( xi#yffjLZ ZThMkdZ Z^oPk6 0+3263 $7$# # 0 ljB${6Z+ m6.}]BW 1? d+#0+%5# 4$7367&'327"3&#"5276l ? >xi_oGi r#J.0Z Z,+NaL%#[ ['(Z .0+3&#"52654327" 4327"~'`o*k"xi" "xi qoQ[ [Zlank\ \eri nk\ \,&@d) -8 4.% 0+32654&#"'>32+32;#"+##"$54$;#"3267 ;]e;8YŮzzt _baB`mXYm̀d{d*j@ &JK PX@#p|_7K_8L@$~|_7K_8LY@ '#%'"+! &554&#""5463232654'672VSF\)HXlpit`F\g.X}1K;<'prĖA5d |0+#&'7! %"36%&! 526'(9y3Q3 ^L膥7(9y3^L $ W4e $ W4] 0+6736$54%$]; &Z1Z [r鋹HQf]H( '$0+4&#"326#"54767654'6.R[PitxׇxS5Ƭ ׽yNVQZ )&0+4&#"326#"547675'#&'! ̉R[Pit`_ׇa1I,S !t׽s H'w]> :'0+"32654&!654'67&'&5432632#"547&#"}Xqz[Xq{K% }߶gc4EqfIб^NoO677\#B&+-,c,W[ d|Z0+ ! %32'"&5@<=f I@=sO=b K1^ d& 0+ ! %3254#525'"&5J<(f I uT=bg K'^ 12L 9 6#0+"32654&54'&#"3276#"&5463267632#"OnvSOnx-$21KP41!) deX^ ;RnqB4cgsu,8}`Tz܎bS$7] '0+32654&#654&#"#"5432632߆|be|br|L8ms {Ϻvޔl %fb] 0+"543 #654&#"Qy; )!D2 0+! %3254#5254'&'43<=f 8b sJ=bS,)%]B50+7263263 '6#&'65'&'65'"!654'67$4TZ0Kf_"ܛ $EO Px #HR O  1* 4<( Co) l6. %"7gB977PE&+,A_ &0+"32654&754'"&'! #"5432WoxZWozzHŎ"ͯ1 T0\ #Qd &0+32654&#&32#"5%2327"&#zoWZxoWj&:x&Ec#λͽYT@>C ]0+$#'65'$!26! 'ٟ1d6An# ffF0q)K1s]%0+4$'47! 5%3254#527>kk<=] oXN NM i3:XSZ*0+! 4%325$56765&'&547$7F=f ק uA7)w""`M*+.Hd-v: 4A˥%CDs#?al$M>#%HJ oJ!D >[1 lZp.0+67 ! 54%32&'#&'"#$'63232{%<v<=f v/MY 4Lc^V--)A^=b)pz[u_m 9%0+32654&#"$#"&5463263! %!254#525'5bLNkbLMl=/.׬׭WZ) \ bXPe՜HE aP?bSZo$0+4'"&54!2'$73! 6%325ǵi^By-~9ggB u ѿH.B(P 2$KIw3I6P]00+!654'67$4726%'6#'674&#R   4<q!ߦ[h1T^t677\#B&+-,,td{@ts&-mgsV0+3! 5%32# 336<=f 2Q ؆}sT=b' a1  3.0+"32654&##"5432&##5&'"&5%67 WoxZWozZjŏ9yv{kB cI%(?#ͯ6Dz)22d0Q adn  0+#$763 '67#"#! |v; ~xL T=b/jd}2$0+4$'47! %! 54#527pkk   pBVVn M ۤEh4'S]  0+"32654&#"54324%5 WoxZWozZŏ93#ͯ)>GA(m., 0+6'$!263#65&#'65&'67#$ ϣf^(1?~D,MXt(\& ?5ZjjtygngG0#Lk㱌 (  MI'0+32747&'">3&#327#"' 47672!$74&5#$'%267&$'47Y`f_ CoY+7%ubP7 t5/!T@82 sUHBkk"n),Up@*A3)#=Ϸ\)qUwƬz(LLqn  0+32654&#"'632#"&5367UoWZxoWX1.c9UͽC+D&12d-A0+2 65&#'63"' "/325&/%&#&5!27654#&'48VoXg偮[}_CM t|mu ڐd )=` Y V}u~n '܀Vh `Z-0+! 4673274 54ᘪ$'47<<v ty>kk @Na*C19T+8 zekD D}8} :d43:84-0+23674%7674'?65.547# 5&'"FǷϦ Y f,8 CQe {{M"""""NN"!OO!ǏzົmSSo oSSmN"!OO!"NPc0+&'#654'3&' ~H2"""(G1vn%UmSSo oS&h(P 0+67&'#654'367&' i\c"""i\e~[YaKHmSSo oS\aJP0+&'#654'367&' L["""um]hxn>QmSSo oSzPYb˫IP]0+$'#654'3$' %I"""IiUmSSo oSiP#0+&'#65&'75&'754'3&'k({""(ā(ā""({WG:xY*mSSo`J=xZ-J=xZ-oSSmH:xY*P0+&'#654'3&' +""""+I;xY&mSSo oSSmI#654'3$4'3$NN$#OO#""""+2""2|VWWVmSSo oSSmqSSkP0+67#65&54754'3y]""{{""^))q:CmSSo5m;oSSmP 0+673#&' #67&'3 0C/.C11C./C0)k^Nk iN^mTm^Ni&kN^kP#' '%" 0+#&' #67'7&'36737'%7'͘.C11C.˃/C00C/U!!L"LMiN^mTm^NiY-kN^k)k^NkMJLMKLP 0+ #654'372b"""]PmSSo oS P0+4'3#6=#654'3""""l""""oSSmmSSo|mSSo oSSmP 0+%#654'34'3#65 5l""""""""llmSSo oSSmoSSmmSSoP 0+7'#65'7'74'3WW""WW""s``mSSoc``XoSSmP, 0+#65&'&547674'312/*-;""2.<+/B""45YE59mSSoL/>V?8:$oSSmP0+&'#65&'74'3~/B""u.8""@0vN +"mAoSSmPB 0+%#654'3 """"mSSo oSSmP,Po! 0+ '67%'&'7%567&'oK:QJKR=ML:QHJR=NFFCDAHEAEP   0+7'5 #6=554'3yyz+""""cxxx6PmSSo PoSSmP0+'674'367#65{(ž""(ȥ""*Yx:HmSSo.Zx=JoSSmP0+'674'3#65{(ž""""*Yx:HmSSooSSmP0+&'#%7654'30l"/c"yr$mSyo! oSP0+%7'#654'37' 5OIZ""ZHP¦`-nSo oSr.aދP0+ #65754'3x`""_""n\mSSoq\\oSSmPq 0+&'567&'567հpɜVUaWP 0+%#654'3"""""ߣmSSooSSmqPzB 0+#6=4'3 """":mSSooSSmP,0+#"&547674'3>.*|gt+-@"":5MPxX<59CoSSmPA0+67#&'74'3HԚHЊ""dZrt\ioSSmPA 0+%#65'673&'""HԚHϊmSSo\trZP 0+%#65'673""H"mSSo\t\vP'  0+#65&'&54767'673;)#$+8""9..**AH"71F;09mSSoI53K;47X\t\vP  0+%  #654'3- 97G"" 8hSjlSo oSP0+4'36767#65r""(ȥ(ȥ""mSSo.Zx=J.Zx=JoSSmP!4D@ =5.' 0+2654&>54&#.'>2+654'3.'>&ŵ"NN"!OO!8>""ڼ/S"NN"!OO!&-Zq}0)xrKN"!OO!"NŒSo oSŦN"!OO!"NP<0+  #654'3 lnR""""^y`mSSo oSSmP 0+#654'3 &'3#65 """ >@ """ mSSo oS%.$SmmSSoP! 0+7'&'3#65%#654'3  """""" H2SmmSSo[mSSo oS2P 0+64'3#65$4'34'3""Z""Z"""" oSSm"mSSo{"nmSSooSSmP(0+&'&54632#65@.*}zb,08""72KF}XC39 lRRnP 0+4'3&'#65r"HЊ""v\t\oSSmP' 0+4'3&'#65&'&54767"HЊA+)-/9""8*%$(;v\t\74;K35oSSmK90;F17P] 0+67&'63#,]]]]ҰҲ0||||P 3& 0+&/76%67&'37673#&/#67&-de.-de./))./wv./))0/))./wv./)):7zz7::7zz7:2 1:88:1221:88:1 2P 0+  #&' #654'367 6$""FE""EF>}SmmSakriaSo oSairkaP` % 0+&/76%67  !&/!67 &589897J6po6KI7)6I:9K6)7BEEBBEEB/ADA//B@/BFFB/@gHBPN 0+67&'#65&'767EfrYy_^""^_yYrfVUqѺGoSSmHхqUVP 0+7'#65'7'74'3WW""WW""``|mSSo``9oSSmP0+4'37'#&''%F"ZHP"ZIO5oSr.aދoSn-`ԌP 0+%#6='4'3x""_z""|`mSSo\\qoSSm\P5  0+7'%7'7673#&/#6=#67'7&'354'3%$Q#%QR!22E2ן0F3F$$E4G0Չ1G22$$OLNOMN0kk^NkiN^mmSSom^NiY-kN^kkroSSmP %+@+( 0+%7'7'4'3%&'3#67%#65%5% :" HM "" "SYӈoS22SmmS22So]ЭP 0+#65%4'3#65'#65""""""""oSSmn"}mSSo"mSSo oSSmPB 3+PA 0+67#&'7654''673&HԚH΋HԚH&3&[rt]((]trP 0+&'3#65%5 """2SmmSSo[kPb  0+3#3##6=#53#534'3rzzߣnn"""tt""j,q0jmSSojjoSSmP.ux /3+P~3+3+PO0+7'7%%'YH QHHQ HOtNMu''MN'P 0+!#65'674'3&'#{(ž"HϋQs*Yx:HmS t]mP30+#65'#65#65%5$4'34'364'3""""""Z""""""ZP"mSSo mSSooSSmn""nmSSooSSm oSSm"P@ + 0+>54&#6=&'&5476754'3c_W""}yy}""}{U0 (mSSo'9oSSm:P 0+#654'367#4'@R""""N *?*,nmSSo oSSmffiN]nP0+74'3'#65r"""""@mSSo q{oSSmP* 0+#655%&'35%7*"" x&wiFmSSoQFJvu|P0+/74'3%53#65rC>t"".B>t"".H]mSSo-I\ZmSSo P0+&'567&'567&'567zwrpyuuy\u{huwzxvvxXq|UXl-YqmX0EpX-nZV{qX.XoqWP0+&'!67!4''676k1yQof 69SxnjOZnKx+4lOZlNw/7Pc0+#6=%#654'3 """""""mSSo =mSSo oSSmP 0+ '4'3a{""}bJ^oSSmS^{U"+@(Je]ELAA +73&#"52654'!3&#"5>7!1?xoLqC9420.,+!5AA +%5!3&#"5>7327.#"32674&+3267$#"52!? 'lcBoTHE!;\w #?$f3aT}`< >k'b.q3C:mri   bbA x;+Ju[c' AbO,@) J_CK_KL"% +#2# %2/Xkv[8&#  ,rZQ0@-J]CK]EL  a"! +%3$%"5265432$3"$#"yd}z3?Xdm 4Ui| c ]qnXE\AP" 3+Q1@!"JK'PX@-  pge^CK]EL@3  ppge^CK]ELY@10E""!5@ +327.#"32674&+3267$#"527674&#ep\ #?$p3aT}`< >k'b.q3C:m*t=@:0.J G ]DK]EL= (=y9*k@diE`C;o+a!RWVi`VTV:8TT_P(O (@%_CK_KL   +  544#326?R_1ғP%B@?JH~g]CK]EL#RA# +265&'"3&'"526543263#" ?M+u||vj+4Ms?"^x`i]==\j K<= ~"1@. J H]CK]ELA&6$ +72765#"'673!27.+3$#"̎E1yMPZEp= P`=}2@3dZ7'<;=v:^/1Z ))-@*]CK_KL)&&A% +">5'.#5327"#"&5432g*Rm 1E8:g&b{{P[}bJ+PP<0ѐ!WPb%)@& J]DKELA@ +327654327#4''&#|M9-lQ6PunkcM0Y8am'.kV)4rsD0YZrsu:, DQ?GB@?CA?9*J ] DK EL@@@G@F8432-,A1!A +'327632327"54327"#4#4&'327674#j?x\!!'$-KtQ(_~aoEm^AtH1t)H\^d%#   05IPX  2( QPX>>+ f$ 01MK #(`%,(%+1PF"P@! JHGK-PX@]CK_EL@c]CLY%851 +;27327>7&+"'67#"'6ڎIXKXE[8SFCbm!1h==Q9Bv cd;+O=#dzU!@g]|LA@ +327"3&#"527654'&#jj>=f2 Iu64wK EUB On'AA'aP"XHez'c@#JKPX@g]VK_XL@gc]VLY@ &### +!&#"!#"&'67&567 &'6$&$'`/>XTݶ_;TbFYanr>y\K^  .~dD@Gt +D!%'KX~BB$<F%dD@GW_O#$ +D654&#"'632޸0(<6BjZn$z.8J6nRA  0+7'7''(i/> pdD@JGK PX@n~W`P@~W`PY@ !&# +D%3267#"&#"'Ik(" $N8=\ #R'( '2n} Rr3+Y8<CdDK PX@.'!9832 JK PX@.'!9832 JKPX@.'!9832 J@.'!9832 JYYYK PX@%~gW_OK PX@*~WgW_OKPX@%~gW_O@*~WgW_OYYY@ #$"'#'$'% +D32?65.##"&56$54&'#"'&547>7632327#"u| .9i?(,79Hy;9P$'#"fDJ2VJ/Y3J?1Wr!) $#%%5SJNT;mH0, 9  +0#$XG9V'O] 4dDK-PX@0, J@0, JYK-PX@)~gWW_O@.~WgWW_OY@ #"'"$#'$" +D4&#"326%327632#"'#"&54$54&#"#"'4672@$(<@#.7| .9W9\~xzHqM9P$,@7jTU cboVdZnI!,$],^yTTT;jK0-Z44D= 1dDK-PX@-)$# J@-)$# JYK-PX@%~gW_ O@*~WgW_ OY@ 1 1"#"'%% +D327&'#"&54$54&#"#"'46727654#5327"| .9E=[;9P$,@7jTKvb4-D4/9!,$:;T;jK0-Z44DFUBB#]-2$6dD@+ J$ GW_O$%& +D&'&5>72.#327'654'L4E 5A/2>NL6H&iSI]U[I* 5Eq R:,#XEYV.AG .A,D:*"y "5dD@*JHgW_O$'$! +D&#"326546#"&54632&$547,12?FH;:D{rp8 :&VS`e[[Q󈫗nu X(5 2 8=dD@2"J540,+'# HgW_O$*$! +D&#"32654#"&54632&''6767&5476767,12?FH;:DX{rp8 |:MJA:&N("ejVS`e[[QY b󈫗nu F*F\; 6>(5 2aa[& >dD@6!J,HK PX@+g ggW_ OK PX@2~g ggW_ OKPX@+g ggW_ O@2~g ggW_ OYYY@ ;:53+*'% > >  +D2654&#""&54732654#"&547&54632367##"'1!1#+%/ T^`. $'C_QH\ta9@ F: Gw]( ?-K8>0I.G#83>2 !1=),6<4iQm8%"?W` Y HdD@= JggW_O$$1$$ +D&#"3275&#';"&54632ApDFQH-2CB3Yqx=R. WSHVf)%GF._%ptS5VdD@K2,%J+I" H GgW_ON"B +D3.#"54'&'3&#"5254#56776543267"z-E(5%.f#88BM792jVi %8/70Q8_DB"\BB89;R-dh%BB;?DX+dD@ HGt! +D&#"5254#5673D9DP8:3mX9B:;="?dD@4 JHpgW]ME1 +D327"267&#"5276754&#]<0g9A@"%x}B 6B16B=g]BC9/ @ZdD@O0#J5H,G~ gW`P9618E +D6765'327"3&#"5267'#&/3&#"52674327327"NJ83V*.Q73 FI 7O(%M--M \Y ocD& AC 2>'?)@B@ C$ @)MdD@B J"H G~W_O'"#" +D3&#"52754#"3&#"5275ȷ>32::FQ9<l;:FQ9<4oZ2g -9U BB  BB <<>U$+3=dD@2JgW]MAA@ +D3275&'.#5327"#&/3&#"52676=4&#VQ &4a '[-q - 6d!h3 ?*0Ɛ&?? 6.16$ ??+k(  0ٱdDK)PX@ 0%#*J@ 0%#*JYK PX@+ppgW_OK)PX@,p~gW_O@2p~~gW_OYY@ "qa3 +D65&#"3.#"526=432633"&#'St8.G% #M9380`J++2-Z& ,8$J!xT%ALt&ABvFT:BX#6?wPY$ >dD@3 J~gW]MA" +D>32&#3&#"5265#56pQ3##M 748e.&f<22Jdr(:"_Q32BB#D!,!CdD@8 JHGeW]M5651 +D;2763>7&+"'6?#"'68=>1%Q0AS(=E;;B&L1a) >:f,"Y^<^1W"$vI I3+f\"DP P3+Xo"%3+3+iB"E 3+XU"% V3+iUB"E V3+X"%dd3+3+iB"Edd3+3+=T"uO"u3Xj"'3+3+?~7"G 3+XU"' V3+OU7"G_ V3+X"'dd3+3+O7"Gdd3+3+X "'3+O7"GX'"' ߰3+O'7"G ߰3+X"(#pw .w3+Ͱ3+d"H#jCj3+3+F3+X"(#pt Vt3+ǰ3+G"H#kjuj3+3+F3+X"( հ3+O"H{ ְ3+Xt"(  3+Uq"H/ 3+X`".3+M"U`Xk")3+3+Tvo"I3+3+=a"*B__3+F3+c "JX3+F3+X0o"+A3+3+XB"K 3+XU0"+q V3+XUB"K V3+X0j"+jg3+3+3+X"Kj3+3+3+X0"+y  3+XB"Ky  3+X$0"+sj j3+X!B"Kg g3+xI", 3+{"LK 3+ ",#j0u`$03+`3+3+3+&#uf"`j#f3+3+3+3+X.".u ΰ3+X"Nu ɰ3+XU.".p V3+XU8"N V3+X.".dd3+3+X8"Ndd3+3+XU "/ V3+dU;A"O w V3+XU "/#``3+F3+V3+U2"O#w3+F3+V3+X "/dd3+3+A"Odd3+3+X "/ Ͱ3+ A"O  Ͱ3+?"0u ϰ3+P"Pu` 3+?o"03+3+P"P 3+?U"0 V3+PU"P V3+X{o"1b3+3+P"Qt 3+XU{"1 V3+PU"Q V3+X{"1dd3+3+P"Qdd3+3+X{"1 հ3+P"Q Ӱ3+="2#  uΰ3+3+G2"R"HubSİ3+S3+=$"2#">jCV$>3+V3+3+3+G2"R">j_$3+3+3+3+="2#pCn n3+Ͱ3+G2"R#VCV3+3+F3+="2#pCp p3+İ3+G2"R#juNj3+3+F3+X"3u ˰3+Fp"Sua 3+Xj"33+3+Fp"ST 3+Xo"53+3+P"U  3+XU"5 V3+SU("U k V3+XU"5# dd3+F3+V3+tU"U."^3+F3+V3+X"5<dd3+3+S("Udd3+3+F;o"6C3+3+i"V 3+FU;"6m V3+{U."V V3+Ff"6#xu3+3+/3+i"V#uGʰ3+G3+3+F;&"6#xWt3+t3+/3+q$"V"ذ3+3+3+FU;o"6#M3+3+V3+U5"V#3+V3+5o"7 3+3+Q"Wr3+3+5U"7> V3+PU"W V3+5"7\dd3+3+:-"Wdd3+3+5"7d հ3+:"W װ3+9T#"8bU3+U3+PTv"XU3+U3+9j#"8/ 3+Pqv"Xd 3+9#"8 Ұ3+Pv"X Ұ3+9#"8# u]3+]3+q"X!"]u:İ3+:3+9#"8#po=joB$=3+B3+3+3+Qw"X"xjP ,3+ 3+F3+3+3+!x"9  3+M"Y?!U"9$ V3+U:"YW V3+!":C ΰ3+I"ZC 3+!":us ΰ3+I"Zu 3+!j":j3+3+3+F"Zj>3+3+!k":3+3+I"Z 3+!U": V3+UI"ZK V3+Ae";3+3+Ts"[f 3+Aj";j?3+3+3+:Y"[jl3+3+mo"<3+3+V"\e 3+XBu"=R 3+T"]w 3+XUB"=, V3+PU"]M V3+XB"=dP"]add3+3+XB"Kdd3+3+>1"Wj̰3+3+3+IF"Z 3+XF"\ 3+f\F"D|Tjo"?3+3+ "?L ff3+&"?3pV V3+:-2l@iJI~||] SK ]TK`\L,+*&%$ 21 + 632#"&54732654&#"'&#!&#"52656$3ӇRws}l?=Zo|*h\Lr&l 횒NN# jGZ ZVM-fU"$ V3+fU\"D\ V3+"$  ߰3+LB"D% 3+"$#L\u2\3+23+Ly"D"ku3+3+"$#NC 63+63+l"D"~C3+3+"$#KD3+D3+J@"D">X3+3+"$#  {3+԰3+g]"D"e;}3+}3+UM"$#M3+V3+JU@"D"R"3+V3+)"$#)ufi3+i3+g]"D#UVuV3+հ3+&"$#0Cf3+f3+g]"D#KVCV3+ְ3+1"$#&v3+v3+g]"D#PVBV3+3+/"$# k2,23+3+h^"D#LV(7V3+73+UV"$#)$$3+V3+g_]"D#K`I `3+ 3+V3+XU"( V3+OU"HU V3+X^"( 3+O"Hb 3+Xd"( ΰ3+q#"H"KXl""(#ub3+b3+?4+"H#uk3+k3+X""(#Cb3+b3+"H#C3+3+XI'"(#tl3+l3+GG"H"srD3+D3+X"(# L 03+ǰ3+G-"H"s!3+3+XUp"(# 3+V3+GU"H"sM3+V3+]Z", 3+qR"![SS3+]U", V3+tUU"L} 3+=U"2M V3+OU:"Rq V3+=["2< 3+O:"R` 3+="2#tu ,3+,3+?"R#u 3+ 3+="2#wC033+33+C"R #C3+3+="2#t C3+C3+?"R#3+3+="2# % %3+Ѱ3+G2-"R#>3+3+=Up"2#tM3+V3+?U*"R#a3+V3+=|"_u 3+?"`u а3+=|"_CW 3+O"`C а3+=|"_5 3+O"`\ а3+=|d"_/ 3+G"`P а3+=U|c"_G 3+OU"`p а3+9U#"8[ V3+PUv"X V3+9#"8p ٰ3+Pv"XC3+9"nuP"ou( N3+9"nCP"oC N3+9"n}P"oN N3+9n"nsd,"oL N3+9U"nYPU1"oU N3+m"<C ΰ3+V"\CJ 3+Um"< V3+V"\: V3+m"< װ3+V"\ 3+mn"< ذ3+X"\f 3+X<@ 87J% HK)PX@" p]SK^ TLK-PX@# ~]SK^ TL@! ~g^ TLYY@3/+*)&$" <: +% 52767&'&'5327;6767&'&'#532732>7$!A|oxur>1N!xur>z_p>=Y>! Y144X Z+r+ 4ҋ4X Z+r+6]F )A#OR"O$ °3+a\JK-PX@ _[K]SK]TL@a_[K]SLY@ A"#" +%$!&'63 !4327"+='M9hPcX9w ) '.|lJZZIib@ JHTL +654'67#1scd3?foI`-B@?*$ J)%Hgc_SL*G""" +2&# # %2'.'5327 654'5367! a`kRS! 3+dA>3+dL 0+>7.5dj& %Y;`,WW':l{oKuO~B+ 3+3+dw#>԰3+԰3+d1#>3+3+dt#-(-((3+(3+d:j,7@4GWh_O$!%$! +#67#"&54632&54632>32#"&'$diN (04$$VV>..>VV"&40&"Pa:4cF6*(:JZ0>>.ZJ8**6Fd O[@X( B J h g g  gULNMLJFD=;6542.,+*$!%$! +67#"&546323.54632>32#"&#>32#"&'#"&547#"&54632&XN*(04$.BV>..>VV"&40&,FQPP*(02&$VV>..>Vl"&40&,N̖F6*(:Pd0>>. PJ8**6JD4**:LP(.>>.$Z E:*(6Dd0+.'>;HH;;HHH;;HH;;Hdc$0+ cNdFdVF"dG# #3+3+3+d.ux /3+dI$-9Ak@hJg  g_ [K _ TL;:/.&%?=:A;A53.9/9+)%-&-" $$  +'2#"&5462#"&546"325"325%2#"&546"325N\nXvvxF?xՉvvw .BŸ85TŸT8 d L$,8@LT·HGK/PX@5g  g_[K _ TL@3gg  g _ TLY@CNMBA:9.-&%RPMTNTHFALBL><9@:@42-8.8*(%,&, $$  +'2#"&546"3252#"&546"325%2#"&546"325%2#"&546"325ppVqv}qv}7qv}7qv}0V.«çWD«çWDW«çWDW«çWDdwd"<<Ld]"<#<K<dGKPXSLtY +7d#at( d!"??Ndk"?#??Ld 0+%'' mmbgL#L d>0+7d>>J2`\2d>0+ '7@R22Nd-pF/?vX@Ui[N<84,($ JmlfdHRQKI GgW_Outrqa_^]YXVUFDCB +.'>.'>.'>%.'>#"'&/4'&+76?'&/3276=7657;##OO###"PP"###OO###"PP":##OO###"PP"##OO###"PP"D-]Q+DD*^Q6 DG -[S*ED)VX6 _O###"PP"###OO###"PP"###OP#"#"QQ"#"#PP#"#"QQ"#"#PE)]Q6 DD:]R)CF*\R6 FC-VX+d"d-?1@.8*.$J G~[L;91/ +.'>#&5476765&'654#"&54654632 'YY' &[[&/$ MmShO- ?tB*0& *ZBd @ GW_O#! +! %dUia[T>d  0+''Q˦cclYa)B#B @dx# =X#  ZXX3+3+X3+d3,@)g]VL  +'654'7>74&giV UgnpgU Vi(j;OQ''QO;j(dH60+'lVrz6.'>.'>.'>&#"'65# '654'7!35'73273 7&!"#PP#"#"QQ"#"#PP#"#"QQ""#PP#"#"QQ"#"#PP#"#"QQ"'u-`!)/!c_%w-_f!)/" O###"PP"###OP#"#"QQ"#"#PEO###"PP"###OP#"#"QQ"#"#Pa!)/"g`(u-cf!)0#b'|-]#x!"xx/3+/3+/3+]#x!#x.#xx$/3+/3+/3+/3+diS @_{K_L$$$" +4&#"3>7#"&54632.%* +(+ieknysdzmzdwlx",@) HG|L"! +.'>&#"5254#5673..00;DO::3n[9x.00.C 8>>W/d#@ HG_|L +!'6735673&+9PNnŝZpd^ $5@2  Jgg_L%$$"$$ +32654&#"'632#"&54632&#=:.6?2/7A[Zxrw6CF9V[ rqF@GS18~_r+%6Ed9 @ J]{L +7#'654'!9M04 # T;dpc^ '#@ Jg_L((($ +32654'#"&547&54632654&#"?VC60AqjvacK8.*81S7D@1];_qY}84yQq]Jn /G&21!LI L "4@1 Jgc_{L%$$"$" +4&#"32#"&54632#"&5473>=9.6>404BU[tmxי8EP9VWjB?EO05y[n+'5;dk0@- J HGU]M +'5#'73573#gK }L{KKd[ @U]M +!5[  mmd % ,@) JeU]M +!'7!7!'7!%z!z!kKK|KKd 0+$%p+ךKU;d 0+'6'7,+ <<dw)i@ J"H GK2PX@~_~K|L@~g|LY@ '"#" +3&#"52754#"3&#"5275ȷ>32n:=EP<<j;=EP<<4p]/h -:VDDDD:?@Y  'd&Sj 3+d- z 3+d.1s 3+d=t 3+d|l 3+d]m 3+Z$dn 3+d9o 3+M$Lp 3+ILq 3+dr 3+dQ[s 3+d%t 3+dhu 3+dhv 3+dz1 )g@)!JK*PX@~_jK_sL@~g_sLY@ '#"'"" +#"'#"&54$54&#"#"'467232'327]k7QY;;P#+>9lUKx{-8e:E?;W.'0?ONbW*qt$(+Od$r, 323&#"52=4#"39;DO::3n[.sA?:>W/d+XA@>/J@H73'#GK*PX@" ~ _jK hL@ ~ g hLY@=<986421.,"#"$" +%>32>323&#"52=4#"3&#"52754#"3&#"5275ȷ7/^ &; 7f"C>;=EP<;b:=EP<<`;=EP<<4p] ("\aDD!!DDDD:?@Yd+Xw 3+d O*H@E  JHG_jK_hK_lL$%$'" +3&#"5274#567>32#"&32654&#.S;^I;:3e\O:Tp_8< #BPQU CC3A515 gpbWRXd!5=@:J~_jK_sL%'! +'4'732654&54632&#"#>DY$vOH>=#I yU'BNt$@BwGX;DX"5?xP\d$4@1J H]jK_pL"  +#"5#5653#327`0wKu6/-ܙ&?sR\0R:A/K1PX@560 J@ 560 JYK'PX@8p g e_SK^VK  ] T LK1PX@>p p g e_SK^VK ] T L@Ep  ~ p  g e_SK^VK ] T LYY@>=<831/-!5A" +$%2#54327.#"32674&+3267$#"52767J"#/Xkk'b.q3C:m*tI  @S@U x;+Ju[c' A \MBd}v ,3;J@G;73" JUK_[K_\L%, +73&'32#"'#7&'#&'&76?3&'31"~*10J O6>eBF>9"-.*;V ~V;a-6% x)+O(a z2D?Ѱp"Wm2.!dD3W@T$+"1-'J~g_[K_\L0.*(!  32 +%67# !2.#"4#56732&#qcKOظS|JfXz6(h(aD?P)+a'tF"XnR!w%i d"F 3+3+3+dsed'P"PE E3+d T@ JK$PX@;  e ]SK ] VK]TL@?  e ]SK ] VK]TKTLY@@ RNMLIHGFEDCB=<;76510-,)('&%$#"      +#''#%!5%!5&'.#5327"3#3##&'!3&#"52676=#535#5354327L`8s&s   <`DSN9bf :`F9[? ?yB=RIHssIByS.,Z Z$#0tyy_aQ+t2.$Z Z&&`byy]MZ Lhd M"3 dkdIk@h(  ; =* Jp  ~^SK _ ^K]TK] TLA?:80.'  IH +"!'>5!"3.#"52654326327654$54632&#"#ɶ+G$?ĎQ + b?d:". %ʰ3+d"7/# + +w3+w3+d#.8APK PX@95/( G JLKIGKPX@95/( G JLKIGKPX@95/( G JLKIGKPX@95/( G JLKIGK)PX@95/( G JLKIGK1PX@95/( G JLKIG@95/( G JLKIGYYYYYYK PX@Epgg  g _SK  _\K _\LKPX@:pgg  g _SK  _\LKPX@Epgg  g _SK  _\K _\LKPX@;~gg  g _SK  _\LK)PX@F~gg  g _SK  _\K _\LK1PX@F~gg  g _SK _\K  _\L@O~gg  g _SK _\K  _TK  _\LYYYYYY@POFD?><:8620,*%$!%#$ +!"&'#"&5476327"'54%672" '3 &#"32%367'%&''%(k"Pj.>g`!;'quY`fIaJAKVB5 \Yh_3rg-BS)3 x\G0B s@ 7U%x&=h>H) N,5(#d +7@0'  JK PX@#ggc_TLK PX@%gc_[K_TLKPX@#ggc_TLKPX@%gc_[K_TL@#ggc_TLYYYY@65&$#! ++ + #$'67327654'!&#&'%2364665%&#K"W|59bEZboʴ Ќ~I,P~왖 v!j\y *f  C[פzD7/ d[ Hy@v" Jpe e  g^SK  ] T LF?>=98765432.-,('&! # +&'&#"!$!!65473#3#"'3&#"52765#535#535&'327632#U@[EH.uf p%t]yKԀ!!\a[stYh+!O ,6"hJ:3JS ./V Z78}JJ@QZ rId"*'_W<<3+dW#N#$ $ 3+3+dY8S@P)'& J e  e_[K_\L887643&$)$ +3267# 547#536767!5!654&#'6=6323#!/Ҕ$h&$$jW Kz~!d#]:p5Y^b{ $ ITBVM(VOvSoM:1VK1Vd{"&'_II3+dB+\@Y% &  JHU  e_TK _ \ L++)'$"&" +3&#"525#5354#5673 !#327# r]\trrfΔJ!e9S=z6vRZ ZRRQR(f_ t4A-dN@ "&% HD M>;961JK+PX@* W_[K_TK  ]TL@( Wg_[K  ]TLY@KIGECA&-#3% +54#"3274#"%554$4$32'"#5"'#5&'#5&54726326326X2,)2+|P#d!~ˑJFnDJS$D8+c CMTCU&5.:ҾMoSɲ#)3[ev=ADDd +@(e]SKTL   +!5!#!5!e*)eN&ڧd# 0+3#3"!'6767!'7!&'!'7!!"1ip4dd[G$ #jx$"5b0hgZ-Nd2H@E10/.,+*J H~pSK]TL9" +54327"%%,5&'7"5265'?5'75_e~p/\]% @PY %czX X~ ollNolmɲ_LLֶV=Q/e-O.gdFPb,@L ? S;76/#JK PX@Fp g g W  ge _ SK`\LK1PX@G~ g g W  ge _ SK`\L@N~~ g g W  gg _ SK`\LYY@ _]YWVTPNJIFEB@:8!#%($# +6$32#"54654+#654'32654'632#"&547#'"'6326767#"&5673674&#"63232654&#"2%%輅)PQ/q]FTBi9F/!FP~uw9B{ BGA/S&N9EFgh1 6 wWs vDCcUvsY 0<p ;2PjR IWdV$@! J HVKTL +#%?#'f"nG WrKIhJ0O; =id,6^@[6 + &J p   e e]SK]TL53/-,,*)('A$a +.#532632!#!!3&#"52767#'735#'7!32654&#"B\a["Oy_$$@[ Q;W )Yc$.Z Z6*U b!ad+=@:)"  J+*$#H_SK]TL9)+ +'&#"!!73&575763257~k Ӥ!&㗣X|O=:(2t&gc{W {3碘2v-qd$C )/G @ 92-*&!0+#"'#"&54$54&#"#"'467232'327'#"&5>72.#32j6O\::O$,@7jUJw | .9~P&{^k 5A/2>NL67=;;T;jK0-Z44DFU,!,$PE_EMASq R:,#XEYVd$C )/O @ >0-*&!0+#"'#"&54$54&#"#"'467232'327''4'732654&54632&#"#j6O\::O$,@7jUJw | .9~Pq<@Z%uNG>8$J!xT7=;;T;jK0-Z44DFU,!,$PE_EMW%ALt&ABvFT:BX#6?wPYd+%0+.#"3 # !27&547']ɭ)~SXQe ymyQP)+(aD? Y(X,d"q&ydrC30+&'327"&'&'673 67$! 52767&'&5476vGQ exuhXS 6 ;#z;14TM>."Y>!|XAyAT_ a07Z Z8+N MT U/ q~VV"k Z13@u{?d$C)5 @ 2,&  0+#"&5>72.#32'#"&546324&#"326?&{^k 5A/2>NL6~Pxkx~@$(<@#.7ASq R:,#XEYVmE_EM]ypbacboVdZndC: :) 0+#"&5>72.#32'#"&=4#5732754#57?&{^k 5A/2>NL6~PT+U B?'L(& :ASq R:,#XEYVmE_EM#WTj,"Xj,"0;.dOd{" M 3+dA"q)cd;#0 )$0+67!"&54#"&54327327>"3254'&'\wPt3 ); >,x\*&TKR |"YS '史8=ہ#+&?dHA10+#"&54632265454-2327#"&#"!"&54633254#"aV[pOY*B@7Jd,6Of*H0L x_UA_\ceLQއm<<:80+327"!4327"3&#"5265!3&#"52654&#3#3#d*k.&ivg13cld-\.c!m22o Zo~ZZ}:hZ ZhjZ ZrƐs()dMP: 0+%674'&#"'3267632327#"'&567674'&#"o*я*34QDDW XE10ko@rr+Ri L% .m\ dP"j  3+d/-54."0+!"&5>32#&'"327.54$%6363267122cH;.Ɓ4gBD\6 OM0rl;;\&;P13B23fT:aő~/$ Y Xvrd72,0+7'67232654547# #"#"$#"327#"&5463232,7uO BjL;HG]x]zd~yA&IM?+ vh\d.44P(%3tZ^o$L!pd1;E C=820+327!"'#"&5463267$54632&#"!32'654'&#"$#"32iX X۪9- qĜ=$@Nlॾ#@wFChe;C?LE8OYNXN;/$g+ji44+CnQ!$+dS 0+32#"&56324'&#"`Q$X7[o K  Რ3!.e"d.B KG00+%3>54&#"3&#"525&56754#567354#567 765672&!672!"'m;>muvr]\tp}-xOfΔpfΊ zT.(Y~[ Ѥeo );G @ A<2*  0+7>54&#"3&#"5265.#532632&'2#"'&547>"3254n(21I?':\4(S7(L)'d my}f4&$Ta˒mHoSJ:9EpA'''.6u#%cQTq+qEnʔΰVa2due C9 0+%32654&72632#"&546323254&#"#"&5467&54@IJI3.>Qݼ! imUchSA(3,#n568e Wn_x^e(`>K`ZN@5e!ރB2tykX|1*5o@'OD&UcX{nNd )-9 @ 4.,*  0+7>54&#"3&#"5265.#53263 &'3#>54&']u]@[2՗1B\ybxY[$+_\Z Zl}cQ;W  $K$Í| bkd 1?M @ F@?9+0+#"32632327"'"&'6767$'&! %&547'!654'4·>fC%&ΪKkF0~QGOW졤WOGQN*i5iw4 3S3X_/FL[i _?CC: ?_귶idD\Q 0+32#"&54674'#"&5432654'!"&5632&#"3 %.# 32654'#"&54! 67fKY%Xg- %Z 5@{xE~ V2a381HQGh )ܳg[0GSc&IF8`K./1 %-|xtVaO3* 6'&i19b~}ۜt1+7"dZOK 0+327#"#&'?&'&#"327#"&#"'6326#"&54654$5432>3 ND5^t l81PP E?+JEh2$G4QU2oÜWk;L1g.*A> ?F~eΏV[KPE2 (f[9Y3Eoծ/Jd K @ G; 0+%3#&%7>54&'65#"3.#"5265432633"!'Khb Xx}:W;GQx+G$54&#"6&'3&#"5265.#5326327654#5327"3&#"5254/3&#"52?'&uq@[tcxY2y_1B\a[I$NAtrOO>FWaWY!>24?W[XWm;k6+_ # \Z Zl}cQ;W 罊j 0&ZZI`Z Z 1YE?Z ZKɋFdB[ Q2 0+65&'&#'67&#"63"&'3&'27"547&#"526543263&'%'7327632p>McIK?Wip4dd@) -,-# UnHJmy?=ik4J&mX!+ J\ i @.OiYZ-ZQ.ZQ "XZg#~KP " PKdl"^4& 0+&'"#"'54'732654$54632765327"3&#"5>5 #&'3&#"52674327-q9@?~TN/HK;B}l>u9+55 =?Q>6P:7- M0.T-+u36mhf5 -@z!T/\ffT0N ~JN?;1&I7EVA8)?A99%+52TL954.$d"^4&"0+2765#"'67;27.+3&#"%765327"3&#"5>5 #&'3&#"52674327 =:9,#0('ht#$8-6; ;x(_)^4R X.#6M6a3} ;~2P!Z/0=(R QV:$>H H:$6T8|*9(98CG5"9*9&99y9)PdB8MI0+&.#532%"7654'%'732763254&'5327"#4'&'27"54&P|LUN%:WQYLIJ/l#M;2( UnkNMZ Z(4#e+( PZ=81$Z Z5i=l3ԡ3f "Xb d>! 0+! 7! 67&! '67!"'6%#3f)Bh)O1+\Fv/Jf#\5rƷ T9$b \;D d00+3!2!2#"&5673265&%"'"'7#"'6DyFʢ {: +_|uTOv .>EWZ G= sz_D&1Jo F?!%(f,d"[d"pd3J@0+#"$54654#"&'63232654#""'67&5463232654&#"#"'6332$32%aܤK+Io?XT_P6YL k ް3+X.. z3+dB[/0+!"&5632&'"3 %&! 3274'#"&54! 67#"&54%3265&'#"'432654w T4c652LRxo员M#_?M7Wki?.Go-q+-Uq\MU_N2+ ;+(nEi҄$nwm۝7q7#)tsH[R6Cţ?/9d20*0+#"&#"'674546$3232%&#"! ! !2:]-!\9 2+$<V?>TXBcd.jc6[mM9 mPYAmqC6#a/~<d 0+&! !!$73! ! !pƟG[4e}(__nCD`d 0+327#"54!2$54&#"(nN'} mm%\IR*2;_Hj9dvBKHC"0+32654&# '!2#"5%&' $54632&#"3&54$32632#"'6$54&#"Dج]^@4)3hUGNMk\2a=6\.D&uX~wmrLG/\x-p^~\UYGq*-y5;d3S>80+!"&5632&#3 7'67767632&547#"&54632327#"$#"3267ν^5_;.0ՐYW4.9Bm; (۾akmEإ}ЉwȦXdU/-<,'hB5&"(yK@DM?3&5ښ]3ux޵  ) 3+d19#0+32!232#"5#"&5#"&5632&#"32!2 O#pi&iu|kW]J,V3#&;*asE~$60 CbxGVC5* 1)#2d#!0+!"54!2327#"'&547&#"3 oö+jBM# \X[>/9! *@Ũ8A3 1 i^[eo7Hd.! 0+7654&54%$54637&5463#&'#4#"'dQ:[Љ<\EX :\x}7K:O=?JjxS7caZ4jVwL|*dp@HKgd0+)63!&#!"&54733! 3dSQi/v70<'rd66MQ^@1jd!0+&'!5732=4$54739 SIpre3vV|/%@Hľshhds 0+%65%!"54733!2d4/w 73$fl+ Sjm\^D-NO~Ǥcd&" 0+!&#"5254#5$73.'>~}.77.-66 TRR(f_aR7.-66-.7d" 1(0+ ! $54$&5454'67&'&'! ! f(P5iw4$ S3X_]+rĿ>fC%&ΪKkF0%:d ^/RW @ {XWSI1+0+72654327.#"3276754'&+&#"73&#"52654'&'#3&#"5267632327"7654#5327"3&#"5254/3&#"526?'.#dP Bʏ&C\r2TR<E E:SS)j~? 6c g-#eP%(ZS# 4G8H6j/O,!11!'F# J&3]!b&.P1M="$XR*!y "@;H4'JcI!?) 5c2 k2 O,K L!88 Z] 99e@9 4MG299D~89 !sX199 "d#- ,'" 0++3273! 5# &'6"#!26#37&5#(RVI^&/ G<_g>`%nIRR~$yܣ&qp7X YT Ed#"0+'7&'&#'6756774'^g3Wd`u$xpkS~-1"&K>A$Z!8dX!0+72654!2%.#"3&#"3dv1=\6f 9Q+S4p{Zs"\GZm)`HFXZ td+/3 10-,%0+3&#"52765!3&#"527654'&'5!'3!3aʘoö%$fe%${i(/ZZ/0gi(/ZZ/0g7&%ZZ%&IId"!0+67&'&#! !2767&#!' 5! 3 #ȋ>T5K>7.'3qptfr&/jj/&&-ll-'''''i=ZRR(f_gRj/&&-ll-&&/jz''''+d)9? @ >;91"0+#"'&547367654#567.'>>7.'65 B>18LM e&/jj/&&-ll-'''' _9ZZ0&8?!~c/_aR>Pj/&&-ll-&&/jz''''p7d  0+2+!!##!332654&#¹ɣKռVi^WlԄ4̚gXLrd1;  0+367467.#'632#"&'4767.'3!567&#672ݴ^ExtSfy tŶ>OK^J65eh~eF&"[dZjl[ raMaF~mf6>87[idEQZ`fp@jgec][YUNJ0+2#654'!"47&54%654#&'"327#"&546323632632&546654&#"3&/"67&673274'"Ǹ?6ih$ a<2 !VE3LגDjFFoF+ $N6 *Vs bg6Uf_U4jp&(?X .,'g/:^cPG6tq Œea BJvy <V'Fw$<Ÿ@d$g!$*M @ K9(%#"0+73&#"52654/#3&#"526763'%&'"#"'74'732654$54632NCz')}5 &01o$!e+% A]>~PFu;Ac`_HKO=D|GR;+AA  svBBQtE_EMC\ 2%]Yo($D_`G8-a_b"-)0+"3$#"&'7327"'654'7354&'527z.:aг 6M)ZOe.2MM0-1~B)sjubWIU h'[EMPYRU  d[8@HP @ OJGB?:0+ '#"'#"'#'27&54632327&54632327&5463234#"6%4#"6%4#"6nkVmfnBfXQiQG_T=9tKHp1 <:641.*%#!  +#"$5463225&# 3275332!"63632#"'32654&#"&#"327# !26763 !"'&eWSHuttuHSV 99$=$99YgQq2oNNp2qQ`=ż_  :H~pBYP4dp2d1r: GKPX@ SL@ tY@  +2632'5&5463246.?N6AKKA6M@r6.e=%J9-@@-9J%.6d!5N@  ,!"J? HK1PX@B  ~ pghg ] SK^K ^  T L@@  ~ p  gghg^K ^  T LY@666N6IE@>=87$)4%$" +%32!"63632#"'67654'&'32654&#"5265432$3 !"$#"tuHSV V0480R99%=PSVPR11qaW2qQt9=E49gs?6 ǵoIM}PKZYoZ pd v1:CWs@ $ %  M ;2 }W JK1PX@=  g   h  g]SK ^K]TL@;g  g   h  g ^K]TLY@3]X~|{utkaXs]oVTPNLKEDCB431.*(#!  +%#"543225&# 3275332!"63632#"'67654'&%&'&547675&#"327# !26763 !"'&32654&#"eWSHuttuHSV V0480R/95/VPVSP=%99zT`Qq2qOMn2qQg,PSVP99%= E99=E749gs?66?sg948KP}MIoɵ :H~pIM}PKi ǵd6"j)"N{e 3+H 0 ɰ3+: < ߰3+d0+% !!7P|77dc0+ '#d&&ӧ@#E{d0+!5!' }Q7dc0+%37 6|E$d 0+ !' 7KP7PQ8Q77dc 0+%7  '&&D!DD Ddo0+%d1udv2dn0+ '' v1v1dbdn0+77nbv2/ad1vdo0+!2uai1vcdQL0+3!!#! 7654'&'&'!#"'&'&5 a^`_+*6'b1)nEZFN_cd!C| 0+% !'7 '7!7'_dRd_y_dRd______cd__dRSc_J____dc  0+' '7 7'7'_dc__cSRd_J^``^_cRc__dTd_``n``d#  0+#'#d_cddcccd#  0+#5'5'#5%ڍdcc_9cccd#  0+373!ddcdddcd#  0+%!5375753ccc#ddcd0+!! !!!rw^c c^Q"wUw^d  d^wd 0+5!'!5!'7 '7!5!7dVx"R_d d_xw^dd^wd-0+ 3232?6323276;#"#"/&#"#"'&#KP7P'$%$#($ (! #*77Q($$&\rrd-,*0+"#"/&#"#"'&+53232?63232?6;' 7+# )$(#$%#'Q7Qrr\&$$(Qdc 0+##535#53 '3#3ݧ&&  E#Emdc 0+#3#7 #535#533ҧCmE#E d @  0+3#) !;#%3#'3#8/P7P6ڊ77񌌌dc @  0+%#5 '#5#57#577񌌌Q7Q6Gډd @  0+#53)' 7!+53#53#53Q7Q6Gډ񌌌dc @  0+537 =35353U񌌌ԏ/Q7Q6ډd  0+3#! dc_P7P}77d 0+%#3' 7!5lj?Q7Q^nd"{ 0+%3!%!!5S^)Y&ddc  0+#'57#!!3'#&*Y%dUK]d"{  0+7!57#'575'!!dVF]ST ddc 0+!3'57337#!&TT dcKUG]dc @  0+!!!#'57#!5%!3'#3&**%%df--U?dc 0+#57#3!33'#3#!5#&~dfT^΀dc   0+#!5#7'##57#3!3CFUUFFU]dc   0+%!5#3'#3#!#57#3!3;$sTs$_UHUVT^dc" 0+#'75#'57##!3!3'53'#&*Yff%dddJUJWfcfdc*( 0+#'75#'57##3!3#!5#3'53'#&ffdddJUJjfUU5fd"{0+53#5!!!75'!5#35!U]饥VVGTUYpCddc  0+! #!1uΊckev2'cdc  0+!77 3!5nbv13_e1vYdc!0+3'573#'57##37#3'#3TTfddfUUd$0+3' 7##"'&'!5!676322654&#"Q7Q1MllL2J2LllM12II22II@2MM2@@2MM2H33II33Hdc  0+# 3&&$ҧyD  Dydc   0+ 7!5! 7!5! 7!5!8IsJ8IsH8Isߙ>ᛌd0+! !53!!#yP7Pl77d0+!' 7!#5!5!53[Q7Qznd0+! !53!' 7!#yP7PQ8Q{77d0+!!#5##5! !53353nYyP7P77d0+!' 7!#5##5!5!53353[Q7QzZd0+3' 7##5##5# 353353Q8QP7P77dh5  0+ !%*:fgߌdh5  0+5! 75'd;g! _dh5 0+!75' ! :;sfg! d  0+!3# ! =.MIhds 0+#"&54632#.#"3267ș䢦x_] x__x{ݜͅu]Emttd  "0+.#"326#"5432.#"'763 L_`A_ΰ WzzVbW]bTex?7d 0+!5!!5!!5L5tΛd} "1dVm 7 3$0+.#"4&'32>%4>32?#"&''7.690&u?UwDP;&u?UuF+PpXb0R3J^``0M6J\vd"*Mlb"*Ml]Z1>"nA=Tn>"gE9TdGPd G 3+d00+%! 3!!"!!30gf 9 |  |d70" 3+d0+%!"543!!"!!3<?İ3+3+d">xİ3+3+/3+dH6Ndm =M M3+dZb b3+dj4 İ3+d  0+##'7! !.|$6HL(f.&Hd"tl3+d"lqq3+dW +! 0+327&#"$# !"'&547632!27&#"327`e96==Z[ ti-Zd75_NIjklzWj*dkm '  0+27&#""32654&%2!2# !"&54eo|B\x* ż1l_NľchXzz'd*0+3!!d.:dHy0+!dhdsIX0+%!!'65!&'7&'/LB@d5qBsp<|gK^u~ʨdOU 0+%'67 &'7%654'M3Ebr:9sc@G3 Ion\[nEZpvWdl_dl#_U 3+dl"__hdl# dFK0+3 # dqq,.KdF+0+3 3dҞ+d040+33 #4#"dgfyf.fd0(0+! 33250(bvb0d 0+&#"#"&5673245432ZNl.LXdn,"d~P^fl@>XLh&jDd,@d{"d "#nd K 7 0+#&'&%67654'&'%&5432&#"##"&567324'&'&54767-'a_3B  (#ac07"d~ZNldN||>LLXdnjR|{BTI'ba6uȇnσ#ab._:,@8P^-lN|z>8@>XLh&,bR||Dd{ #{ @ T(! 0+&'&%654%327&'&'&#"&5432&#"632&5432&#"#"&567324'#"'#"&567324'&'&54762&Zi \gt lpsz"d~ZNlrtnl"d~ZNlQlLXdnxc[LXdn50mM!QYb]wmTfnRq v׃p.,@8P^/p7,@8P^<2Kfo{ o1@>XLh&-g +@>XLh&9{ngHd  -@ p2*& 0+&'&%$54'&%67&'&'&&'&'&5432&#"6767&5432&#"&5432&#"#"&567324'#"&567324'&'#"&567324'&'$5476-$~ >  u  "d~ZNl"d~ZNl"d~ZNl `LXdnLXdnLXdnFS\]VjWkr`\S"z #r̀".j҄% ~ 5,@8P^6& .,@8P^+c"I#,@8P^?,=fo{~4@>XLh&3}$'@>XLh&*Y $F$@>XLh&B{ng,d@&0+&5432&#"7'7&'&'&'#"&567324&'#67676"d~ZNl-)a=XcX2N LXdn  P+)M33a =,@8P^-m 6d14!Ɋ,*R, v^l@>XLh&jՃ 3NK]q\]?d" L L3+d"  3+d## 3+dt ##|Ű3+Ű3+d!(~3+3+d!#((~3+3+d"x3+3+/3+dI"@P#3+P3+~3+3+d5g#<"P<$~3+3+~3+3+dDj#RK~3+3+dxjadxj0+32$32&#"#"dePW7!##"&''73>323!.''*/WLE]1%( ~ '* ~ %(]ELWO'{r{ty3oGE,'{DG3oyt{rdO^  0+'7!'73>323!.''*%(U'* ~ %(]ELWO'{3o,'{DG3oyt{rdR#."[(.3+[3+3+f#*#/"Z*#3+/3+Z3+3+d#."Z#x^:,.3+Z3+^3+3+/3+d#."Z"x#^,.3+Z3+3+^3+/3+dr#/#["xx4/3+[3+3+3+/3+/3+du"\#1#H"\3+13+H3+߰3+dL!#("eq(3+e3+3+dT]" qg3+3+dT>" G3+3+dT " P3+3+dT " P3+3+dT"  t3+3+dT/"  q&3+3+dR 7Rb@i[SOF)! 0+!'7!7!'7!%&'&#"327654#5675#"&5463236?#"&547676327>5&'.#"%735463.#"7'3&#"525"$*"$* ,7:8 %B; } >N`E 5"6! *?HX*(<ni   /"R=@  WE;-0/.-h&rh&rMEGFGq5*/JV/*#!/ pRZ8 463Dt[W=; , $1a;4Ri$$  uA..dR#."ZV.3+Z3+V3+dTS '? @ 4($ 0+!'7!7!'7!#"'465&##&54632&'&'&'67676"$b"$bl +ZL QzfIh    h&rh&rb8  :b`SH!,BYM    d0+!!#7!'7!7!'7!73!!;w"_$a$$S1t$"_""0hpp&r&rkk0hd##3+3+İ3+d" iP3+3+İ3+d(D# , 3+3+dC#&/Ȱ3+԰3+dB#!/Ȱ3+԰3+d( #& #3+԰3+3+3+d( #! #3+԰3+3+3+d # 3+԰3+d #!Z 3+԰3+d{#%dz#!!d @"  d~"CC3+dx"%==3+dc"!((3+d" nȰ3+԰3+d" aȰ3+԰3+d#%,,3+ٰ3+d#!,,3+3+f"  ,3+ٰ3+d" !,3+3+dZo#%!3+3+dZP#!%ְ3+3+d)" $3+3+d} " %ְ3+3+db~N0+ %67&'$!dPz΂ΊzzShLnnLhTdb~N0+ 56767&'&'5!~zz΂ΊzP ThLnnLhSd~0+ %67&'$!&!5 dPz΂ΊzzzShLnnLhT? d~0+ 56767&'&'5!6! ~zz΂ΊzPzThLnnLhS[df~" (<a<3+3+df~" )2a23+3+dH~" (93+d1~" )I3+d00+%! 3!!"30gf |  |?d0 0+%275&#!5!2)5ʵ fg?dD0" 0 ǰ3+d;0" 1 3+d0+!"543!!"3!! G 1p[\9d 0+2675.#!5!2#!5!5!e G '1p9dR6'2*("0+3!!"'!!'67#5367&'&543!673#"J1R#uS);v-20L;4*4c&4+NѴ ! H2RZ=O c\2]F]@Ip:yd%.(& 0+&#!5!267+!!'67#5367#532$75&g !3A, NFK.p 7 nzIX<]@pO9"=O7$L:d" 4 63+d!" 5 63+d0("} }3+d0("x3+/3+d0("Snn3+dE0+!!!EI  dD0+!5!!5! Hvd  0+!!!!!|>d  0+!5!!5!!!I}}j&ڌdm0+#!# v dE0+3!3!dd$7C =8*0+#"32767>54&'&'$32#"&'&'&547676!!#!5!nkk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cbdd''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbeed$; . 0+!!#"32767>54&'&'$32#"&'&'&547676Jr$kk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cbתa''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbd$7C C=*0+#"32767>54&'&'$32#"&'&'&547676''7'77nkk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cbxyx''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbxyxd$; . 0+ #"32767>54&'&'$32#"&'&'&547676pxgkk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cbpx''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbd$3O B4& 0+&'&'&'67676#"32767>54&'&'$32#"&'&'&547676 ?? @@ kk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cb'? @@ ?j''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbd$ 6R @ E7) 0+"32654&'2#"&54>#"32767>54&'&'$32#"&'&'&547676PnnPPnoO@v+..kk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cbAoPOmmOOp1.-rB''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbd$8T G9+0+6327#"'#"'&547%632#"32767>54&'&'$32#"&'&'&547676&l<*2B>4\8|`RLkk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cb^H|F.ZH@BTV&p''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbd$#? @ 2$0+!!!!#"32767>54&'&'$32#"&'&'&547676kk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cbj''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbd$7; :8*0+#"32767>54&'&'$32#"&'&'&547676!!nkk]\LMLLML\]kk]\LMLLML\bc1111cbbc1111cb8''LMmjML''''LMjmML'dbcwvwvcbddbcvwvwcbd$ 0+!%!!!!#!5!X>ddYeed$ 0+!!!%!!JrPX>ת\d$   0+  ' 7 %!%!!kyykyjjX>xjyjjyk$d$  0+&'&'&'67676!%!! ?? @@ X>'? @@ ?hdN0+3!!#dRdN0+3#!5@@d 0+#!5!wvd 0+%3!!5Wd0+3!!#dd0+#3!!!mW W$$8d 0+!!!#3!../d  0+#!3!!# d  0+#!3!!##g   d 0+#!!!#3!☘ ɞW Wd7N" P3+3+d(" V3+3+d6" W;3+3+d7" YL3+3+dHV  0+5$54&#"'632 #"'732654dER@SGWTi|TWGS@R43HEjmvCCڥvmjEH3dHV 0+327#"&54$%,54632&#"R@SGWT|iTWGS@RE3HEjmvCCڥvmjEH3d1L0+ 5s d1L0+ s uu:dLQ 0+5! 5ds-dLQ 0+5! ds-uu:dt)$0+632#"'&'!#"&54632!6$#"32654OqpttM01PttqpS1T>>WW?>WFOrsM1IH1NttQ2IJX>>WW>=dt)$0+#"&54632!67632#"'&'!32654&#"6OpqttM0T1PttpqS14>>WW>?WOsrM1IH1NttQ2IJX>>WW=>dt 0+5!67632#"'&'%4&#"326dP.WqpttO1W>?XW??W;J-UttN1HH>XY=>WWd{  @ 0+!!%!!##d!8!siii[[[""d*80+#!5!btJdF+" 3+dF."r r3+dF4"x x3+d0<  0+33!%'d)K.'>*:~ff~:f66f1 'YY' &[[& 'YY' &[[&:f6f~~f6fY' &[[& 'YY' &[[& 'Yd"n 0+7 ' d"LFDaxxdd  0+%  !k׿DLFxd"n  0+5  5!d DFdd0+75 5dk4pFdd0+% 5 4kFd\j#N883+Ұ3+dF+ 0+33dNMP+m dFK 0+3#d. ld0" 0 ;d0" 1 3+d04$0+33 #4#"!4&#"#47632dgfnX??XVT}{yf.f?XX?3{VT{1d0($0+! 3325!32653#"&50X??XVT}{(bvb0)?XX?'{VT{d 0+#47673#4'&'#@N]rs]MA*Tfȍ|=|fTdb0+###!5!5!5!333!!!!'5#ম~~~~48Ȧ11d{"%xsKK3+/3+dz#!xKK3+/3+d{# %dz# !d|#%#7!3+3+3+d#!#7%3+3+ΰ3+d ^"%6 3+d `"!6 3+dN~R + 3+dD~H *  3+d~" *%UU3+d~" +SUU3+d/" ? 3+d;" @ 3+d:" ? \3+d8" @ \3+drk#E3+3+doB#! Ȱ3+3+d'~" ,  <3+3+d!~" - %23+3+d1L" `(3+d2L" a(3+3+dL" b 3+d$L" c 3+d#F#$F3+$3+3+d#j8#3+3+3+d"#$mF3+$3+F3+d#F#$mF3+$3+3+d#3+d0 0+!3!! 3!!"!53#Y fgf @|  |d 0+!3!!"543!!"!53#_u<qW{<!nwqwlwqwB?}Wp>}Vd;X0+5DiU/d  0+% !a`qbdd)0+% ' xbcdjdd)0+ 7 )xjdd) 0+% ' 5!xbc;dj {{d)_ 0+! ' 5!5!xbc;;j{{{{d 2C#0+'54&547654'&547654'&547654'&546=7?PPQQPPQQPPQQPP>QQPPQQPPQQPPQQVK.7E>77>>EE>>77>>EE>>77>>EE>>78\5)F-((\DE>>77>>DE>>77>>DE>>77>>DE>7d @0+!!d 4Kd @0+!5! Kd @0+!!,p@K4d @0+!5!p,@KdR0+3#3%!5dd dddR0+!#3'!5Rdd dddRx0+#3!5dd vdddRx0+#3!5Rdd vddd~0+7!!'d *Zfd^8ds0+632&547#"'6! %$! 001\\\\1111XXXda$ 3+ddkh 0+74$32'&'&$#"dtt}6UīS8dsjmiimdd  0+%'67632%" &'&TIaϿaJUdUI5ff5IU`x`df0+%&5432#"''$32654&#"fƥGܾٚhPaܘڙd?5% 0+6767!5!&'&'&'#!!3%#&'&'!5!6767673!Jbb )2[JNENJ[2* cbE vvEvw 3IT_@\WPKE@<;" 0+;54&#"72!54632+32#"&=!#"&546;#"&546!&#"3265326=#"4&+326[_V8Y__LFUP]X_Y8V_[]PUFL_sG[PXUکzwUXP[KKTXT[CK[TXT2~ n  3+dd #/;GS_kw/@,ĸztnhb\VPJD>82)$0+%#"&54632#"&546322#"&546!2#"&546#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632! 4$#"!5!5!55!%5!%5!#5!!5&'&476463232+#"&5476YY|ppѠѧi44ssϾ4$12G$8p-@@p??p??L??p??o@@bb[s3cc3s%V[ $G21$ d #/;GS_kw@{tnhb\VPJD>82,&  0+#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632!547!654'&5463!2#!"&54`1W11,-06C7  5H70N1NL2C)IG,  GI dg0+!#!dg0+5!#dSdp0+!!3vdp0+3!3!dvSd~F0+532#"~\xDh~|v{KkiB>dv60+#"&567324o[Lx6C§d! 0+&%'! Џ-9d! 0+! 7$7!Ӭ0Hdd# I#/3+3+d-  0+ !!!5!!5;`Qd[QE   0+   ' '! !!HHGgGHGc d[E   0+  ' 7 %!%!!OHGGr:eGHGA>Xqdc #/;GS_kw !-9EQ]iu)5AQUamy !-9EQ]iu)5AMYeq} #/A+% ztnhb\VPJD>82,& zvrlf`ZTNHB<60*$ |vpjd^XSRMC>82,& ~xrlf`ZTNHB<60*$ ztnhb\VPJD>82,& q0+#!"543!2;2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";5#"375#5&'7"32654&6?#36+32=3;2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+"2=4#!"32=4+"3%;2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+"4+";;25%!5;2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+"2=4#!"3;2=4+";2=4+";2=4+"2=4#!"3%;2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+";2=4+"2=4#!"3%;2=4+";2=4+";2=4'6=4+";254+"jP``jiijjjjiijjjjiikkjjiijjiijj}}lF>i$33$$22BFFl}}xiikkiiiiiijjjjiiiijjjjkkiijjjjjj jjjjjjiikkiiiiiijjjjjjii!0jjiijjjjkkiikkjjjjjjjjiiliijjjjjjjjiijjjjjjiikkii_ iijjiiiijjiijjiijjiijjiijjjjiijjkkiijjjjjjkkDnjjiiiiiiN``Qdjjkkkkjjkkkkjjjjjjkkjjjjkk;``?!hm`Az3$#33#$3zAamh!?``:kkkkkkjjjjkkjjjjkkjjkkkkjjjjkkjjjjii}iiiiiiiiiiiiiiiiiiiiiiiii}jjjjjjjjjjjjjjjjjjjjjjjjkkkkkkkkkkkkkkkkkkkkkkkkkkCiiiiiiii}iiiiiiiikkjjkkiiiiiikkkiiiiiijjkkkkiiiiiijjjjjjkkkkkkii}iijjii)d3 d3 d[QE   0+  ' 7 % !%!!!HGGgeGHGAaa>Xd( @  0+   7'3#pbb,888m8pp@_>Ebaabm.d8x+0+32>54.##3676323##"&'&ddcecce?PPwnwxdp '. -)  0+&$#" &5432#"'&#"6?%3267! ot6tKD)3鬮Ri]RiQ^&ʶ Srsw_t:z4 921)hdL 0+5!%5!5!d0H~PPPPPPd0+3767&'!767&'dMs fI J#@1Ms fI J#" Z|XJ| Z|XJRd1x ). @ -*0+>73#5&54753!&'3#67%.'.KK K 7888 F贵w{QEdd"0+%!3!3"BaadWdZ+ 0+ 3 ~ 4:d" #  :3+3+d4|x 0+7 !!26577 {ߗHla#e$FqQBHKG#c#k~Tkqdd@  0+!5!!!!!|K,Kd  0+&'.#"!5!!4$32!!!9 &;wu:' :o@@pLHmuumHLPJPfPd@ 0+#&'&54767312/*-;2.<+/B45YE59 />V?8:d)" X3+3+d####4#%&%&33+3+3+3+&3+&3+d<S#lrl3+3+d`a##8#4# 8# # 8 O3+3+3+а3+а3+3+3+3+ 3+dd ' @  0+%!!22$54$)!&54i!ߜcN}iccdߜߛpъZ!%+) 5EE5d  0+%!!5!!!!!3>u*q*]K.K<yKKd2V   0+ # 5 5!5!7'v0bn(Ds:# 00nnyyA8TppTdd 0+%5!!!5!!&'3'6i59OV22dnn0n/Xsefzd# dT* - @ % 0+&'&$#"3  676767#2#"$54$=GF>*+?FrztzsG>&ڟڞ&|uu|AuF=  =Fuڟ۞%&dT+$,@ ,% 0+!"$54$32'67654/&'&#"lڞ&z{r5%DrsD$6q{(%&OOڟ۞A =F|vCj>EE>jCu}F= dT+%,+(0+32#"$5476732$54$#"'fb&ڟڞO.E"F86P%8|Yڟ۞%U>\'0 .` TdZ/W @ N8-%0+2#".54>32>54.#"32>54.#"7#".546767&'.#"67632E;l::l;:m::m5''H''H''H''''H''H''H''W! 6::l;:m::7*-24hh` p!r{|{:l;;l::l;;l:rH''H''H''H''H''H''H''H'Fl;;l::l;;lf_`g3Wf={|ddxx 0+!!!!!5!,,x7K7Kddxw 0+)53 )633#3 47# p2,2S,pgc6c6R ddLL  0+ !5!Xv WvvW KKddLL  0+ !5! vvWWXvw KK WddLL 0+  !5!ee W~dKeW KKddLL 0+ ' !5! eeXWW3dKd1KK Wd?  @ 0+5!53!53!53dKO\!````````ddL 0+%! ! ! Q(kkttdZX0+7!dZ* dd~w '37;?@><:85420&"  0+55!5##53!3##53353'7!5#53!!7!!'!!533#3#tF]FtF4t\`F^@FNNF^]F/,tFtPQtF^zz^5EYF ddx  $*048CGK@IHED=;6531/-'%#!  0+!7'##535!!3#5!!3#53#533#5#353+5353%35 5!535353!535?tEEztT񊊊?FttFNFmt_EF`E.G^^GttE2FZFFFt1tF"zyyӿdE(q1 @ 0# 0+357!!! 7654'&'!! %&547675?!ҵ9HOH5555HOFfZEEEEZfEEY+J??PͳJJͲEEdfjw#'+@ +)'%#! 0+%! %&547$! ! 7654'&! '!II++Io888$8(&%م'$ڻUUUUGGǸGGEJ34;4;dd  0+!#7!!!'7 %PP b&BK(K  dm 0+% !25!)5 5! !!`lqd +ІKwr%Qd'0+! !5'==ad% 0+$6767u0ei1 R( d  0+$67677!5u0ei1 R( ssd  0+$6767!5u0ei1 R( ,ssd    0+$67677!5$6767 u0ei1W%u0ei1 R( ss R( d    0+$6767!5$6767 u0ei1W%u0ei1 R( ,ss R( d;%0+67&'$67673i1y~u0eځL *  R( d0+!3!ddd0+!3!3ddX d 0+3!3!3ldd dX  d`  0+!!5!5!5!c______d,  0+!=!#!3#!#5wKP3KKKd0+7! !dmLо0qd w #3 @ 0( 0+   32767654'&'&#"54>32#"& [SR+,IJXWJI,++,IJWXJI,nponnop"F"WQWWKI++++IKWWJJ++++JppnnppnndMP 3+dA0+!!İ>dLH   0+!&#"327!532!#"giRQhRQ\epp.KKd?H )%0+767&/#"''&54677632d=!%. L;D'W H7,/+)9N:8>n1GA&{kF@H24#%eA\#c"Ee:j:d("yx3+3+d0+7dA d0+  C=>d'n0+)%!'==@d'Z0+ ! !Fd 0+7#dAx >d 0+  #"x=>>d 0+7 ##dxx>>d #/;GS_kwOA&}xqle`YTMHA<50,&  0+"&54632!"&54632#"&54632#"&54632"&54632!"&54632%"&54632!"&54632"&54632!"&54632"&54632!"&54632#"'&'#"&546;6767463232$54$#&'&54>32 '&'&'67632#53###&'&54$32#'#"'&+$IHGIH!@-- #EEF@:#YTSSUY";@EFF#CCP22 S55R 22>Y ,-A!ݐ @EFF# 9-S S-9 #FFE@PP5U4̧~SSd! '3?KWco{'@$ĺ~xrlf`ZTNE@940*$ 0+! 4$32! 4$#"#"&54632#"&546322#"&546!2#"&546#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&546324632#"&5476'7''%#53##bbTTppѠѧY>+,=@/89/&8CCPc%Vp-58+,==,+089/%8PP5dr !-9EQ]iu#@ ~xrlf`ZTNHB<60*$0+%#"&54632!2#!#"&54632%#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632#"&546322#"&546!2#"&546#"&54632! 4$#"! 4$32Y0 +,==,+`!XppѠѧ8bbTT7=,+>33p-Ӧc%V dZ #/;GS_kw@{tnhb\VPJD>82,&  0+"&54632'"&546323"&54632#"&54632'#"&546325#"&54632#"&54632#"&54632#"&54632#"&54632!&547!654'&5463!2#!"&54q?+<<% N!  R"  L(LJ)W+GE-  EG d_ |d_ rd_ nd_ xd ]0+!)! VV]]d_ \dr d2Z 3+0+2#"&5462327654'&54632#"'&5476):C '=>':d^w{'n A$\_!Z0514415018xz=[Q}81]ul̫d4Y ! 0+ ! 32$54$#"%&'6 {qqqrY{ ncLccc 0+5!50+#3  0+#! 0+#!5!50+3! ׌50+!5!3W )50+#3!  ׌50+#!5!3 ) 0+#!5!50+5!3!  )׌5 0+#!5!3!  )׌0+5!5!NԌT\50+#3#3h J  0+!!!!# T 0+#!!#]T  0+#!!!#\]Ci 0+!5!#!5! k\ 0+#!5!#]s\  0+#!=!#]v k5 0+3!!!!  W5mT5 0+333!TȠU)׌T5  0+3!!3!!U 5mA5 0+3!5!5!5W \5 0+5!333UȠ))K\5  0+3!55!3T H5  0+!!!!#3   T5 0+#3#3!hU K ׌T5  0+#3#!3!h U ,m5 0+!5!3#!5!  Jk\5 0+#33#!5\ )J\5   0+#3#!5!5!5!3\ U Jk  0+5!!5!!#WԌ 0+#!5!!#  0+5!#!5!#!Chik5  0+3!!55! NmH5  0+333!!5TȠUN ))׌5  0+3!!%3!55!U 5mH5" - 75" , 85  @  0+3!#!5)!#!5!3UC Um k50+!o0+!G50+! JX50+!Y JX40+!XY Kt'/7?GOW_gow9@6}yuqmiea]YUQMIEA=951-)%! 0+#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573#'573XX|XX|XX|XXXX|XXX0U]!'/7?GOW_gowAD}yuqmiea]YUQMIEA=951-)%! !0+#'73#'73#'73%#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73#'73 w, CGKOSW[_cgkosw{3@0~|zxvtrpnljhfdb`^\ZXVTRPNLJHFD0 0+#335#35#35#35##35#5!#3#3#3#3#3!535#35#35#35#335#35##335##335#35##335##3#3%#3#3%#3#3%#3#3qpNY^6tuut6!^!݊iꌀd_0+3!d__d_0+!!!M;__d_ 0+!2#!"543!254#!"MM;MMa_M;MMM`ad_ 0+!!'!&,_M;'d_M;d_ @ 0+3!'5!5!5!5!5!d_M;;;;;_Md_ @ 0+)!#3#3#3#3#3_M_M;;;;;d_ #'+/37;?CGKOSW[_cg9@6eda`]\YXUTQPMLIHEDA@=<985410-,)(%$!  0+3!5#!5#!5#!5#!5#5#!5#!5#!5#!5#5#!5#!5#!5#!5#5#!5#!5#!5#!5#5#!5#!5#!5#!5#d__[ d_ !@   0+5#!5#%!!%5#3!33vQEnQ_2&EEMsQEbo2 d_ !@!  0+#!#!!#35!35352QEbo_s2DEaQEnQ_M2&E*d_ !%*.26;?CGKPUY]bfjosw{Y@V~{ywusqoljhfdb_][YWUSPMKIGECA?=;96420.,*(%#! *0+'''#%'#'7'#'''%5''''5''''''#5'7'77'37'3/7'37'%7'77'77'7'77'77'%7'77'7'77'7'77'77'37/7'!!|iih$hkj(&h.$֐hki''iifg&iih$iihc'hi'iii%jhhE'i&ji'gjihhhi'iih$iih*&j'hi[hji%hkix'&h$֐hki'(iifg&iih$hki'hi&jii%jii'i&ji&hihiigh'iih$ijhz*%i'his_\iij$ijh'&ij%$hji&'i'hfj&ijh%ijh&'hi'ijh%hhjs&hl'ii&iiiihh(ijh%ijh(%ik&gjjji%jkiy'&ij%$ikh&'i'igi'ijh%ikh'&hi&hii%hii$L'i'ii&iii[ihh(ijh$hji\(%ik'hidY 0+!dYPdY 0+!'!dLYPMdX0+!d_XPdX0+!'!d_M;XPMd_0+3!d_d_0+)!!!QL_M;dX0+!dXPdX0+!!!dLXPcd_0+3 d_d_0+3 ' ds_MedY 0+ dXWYPdY 0+ ' dXW|YPMJd_0+3d__Pd_0+3#d__P3dY 0+dYdY 0+#%dJYJdX0+d_XdX0+!%d_!Xd_0+!d_P_d_0+  PQs<=__MedY 0+  PdY 0+ } PMJd_0+d_d_0+'d_M}edY 0+dYPdY 0+'dLJYP}dX0+d_YPdX0+'d_M!YPcd_0+ dPPQd_0+ 5 dPZPQVYYd_ 0+ 5 ! dPZFPQVYYd#] ) % 0+! 4$323254$#"#"&54>32xxBBXX敔x~|QJMQzDW~~NNNdX0+ {y' dr  0+! 4$32! 4$#"bbTTppѠѧc%Vp-d %4AN]kx%@"º~yqle_WQIC<6.( 0+4632#"&4632#"&>32#"&54>32#"&546632#"&54632#"&54>32#"&546632#"&546%2+"&546%2+"&546#"&54632#"&54632#"&54632#"&54632#"&54632#"&54632  6<  d<846 F dr  '5@1*'!  0+&#"327!764'&'%!67'&'! 4$32...-,//-I2TWT2IIH&UbObU%HJbbTT#NAXY@%99'&c%Vd(b )7 @ 3,% 0+! 4$323254$#"#"&54>3232654.#"xxBB\\ᗖ}{QJMQ\\:j88j:yD[}}NMMO\\:i99idr  0+! 4$32bbTTc%Vdr  0+! 4$32 4$#bbTT=pѠc%Vp-dr  0+! 4$32!"bbTTpѧc%Vdr  0+! 4$32!4$#"bbTTѠѧc%V-dr  0+! 4$32! bbTTppc%Vpdr  0+! 4$32! !"bbTTppѧc%Vpvdr  0+! 4$32!"bbTTuѧc%Vvd&r0+ 4$3&bT%Vd'r0+ #d%rcڷdE8  0+4&#"326!vuuvzvuu+dd  0+7!! 4$#"2#"54$d_äð_=Tdd 0+&'&$#"#!!676$32WYäXW_ MNOLQd  0+! 53!!#"=PTd%r 0+4$3"dTVMQRӦd(r 0+4$+52ۧѠT-Md(0+!53 (bpcMpd%0+! bM%dr0+2#4$+"#4$%TMѠMTr-QRӦVd0+%3 3! 3%pMbbM:pc%d_0+3d__d_0+3d__d_0+3!d__d_0+!d__d  0+4632#"&2654&#"dvuuv]]^vuum]]^^d_0+3!'!d_M_M;d_0+3!!!d_Pb_;d_0+3!'d_M;_M;d_0+3!!d_M;_;d_ 0+3!!!!!d_*<<_;;d_ 0+3 ' 4632#"&dsZ@?Z[?@Y_Me_?YZ>@[Zd_0+3 'ds_Med_0+3 !dP<_d#|;  0+! !  ! '&q uwSU1tuKSXd_ 0+3!'!!!d_Mw=_Mw<d_ 0+)!!!!!_M;VdO'0+!dO>d_0+!7!Y_MY d_ #+2:J@B;730,)$   0+3#''%#&'5!!'5%!!'53'5%3'5%3#'2#".54>GG 48:8*7=A{j869GG%HNLKJLM_B99:3\IIIIxo:&6:nBJKJLLJKJdG"0+3263#!5276;'4?'4?26p&3!cM{7,2 &(@.,sR!g/1E` &.f/ U(_d4_>0+3 #.+"'&##"&'54;23265"#'57#&'#"#5676!=A' 4(fv>>>= ) N =>Z4_y=O +^0 =92@@294 0:9dg "?_9e<hpx0\oA6J4}yuqmiV@*~iS=(ycQB6' 0+273&'337&'67&'67&'67'32654'&'327654&#"3672#"&54767&'&547'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&543'4327632#"/#"57#"54?'&5432'4327632#/#"57#"54?'&5432''4327632#"/#"57#"54?'&5432'4327632+'#"57#"54?'&5432'4327632#"/#"57"54?'&5437'4327632#"/#"57#"54?'&54327'4327632#"/#"57#"54?'&5432&'67&'67&'67'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432J9nk!4m$&!$%#8 !jԕkWw4&9lOPv9&/z}r*GB_Ky{OdAA# " )( " # ()     %#   #$     %#   #$ X  &$   #$ u2O_N # ! !#-  $$   $%    %#   $% 8!>7632327>767654'&'&#" "   #   !  !  "   #  z !  "   #  r "   "   "   "  4* )*y>)!, )+z>+!   -[   -[9 +- -( ,0 *! * + + + + @ , , * +:!&!NDEa ;!$ "LDEb 49,L43;, MdE 0+!! d>=0-/j"R!dE  0+!! 7 ! !d>=0-/Aeq~.,j"R!` [dvh0+ 7%7&5476>6 R$Q=n h0# W$Y <W db_0+!2 7%7&547!&'6x<T#K 1kDB_M @_ c).\?>5dr ) % 0+! 4$32! 4$#"#"&54>32bbTTssϡΩ+gJHh/U,-U/d%Vr/ѨIggI/U..UdEr G B6 0+"32654&!"32654&%#"&54767654$#"#"&54767&54! GccGFdc-FddFGccW}|VNjttwTV}{Wu46cFFccFFccFFddFFcMV|{{|VNnmSV||||VLdEr G &0+4&#"326%4&#"326! 547&'&5463232$54'&'&54632dFGccGGctcGFddFGcRSuW{}VTwtAAtjNV|}WnHFccFFccFGbbGEcc"L쬇V{{{{VUnmNW{{{{Wdr 0+"32654&7#"5432W"\Q'9##Ud5r 5 + 0+"32654&"32654&#"&546327&54632#"/ssrsss%{{srrs?rssrZO`zFQ{d #5AMYe} "?Aymb\VPJD>8,%0+3#"'%&547654'!#"'4%653!76=332654&#"#"&54632'#"&54632#"&54632#"'&'&54767632#"'&'&54767632#"'&'&54767632#"'&'&54767632632#"'&'&5476%632#"'&'&54766732#"'&'&5467632#"'&'&54N #es; B!"C }@W?86/-&$ 0+3+&=43+&=4%3+&=43+&=4%3+&=4'3+&=43+&=4%3 #.+"'&##"&'54;23265"#'57#&'#"#5676!M0M/M0@M0M00L0L0A' 4(fv>>>= ) N =>Z4 #7.#6~#6f #7$5#6 #7y=O +^0 =92@@294 0:9dm*Th5FRGA"bNG?62)pbXE+%0+&54654'5467&'$&5>54'##&'&'&'&'&'676;67654'&'#6767674'&'&'532+367676&'&'3276&'&#36767+&&'47324732%&#"&'&'53276=4'&'327676='&#"'65327./&'&'%3276?#"&5476763267>54'.#"%;67;27#"'5#"'&5>7654'&'&+#".54>7672!@ 7'gNQWA)1 Z>I9RI.+ +IH!4{[\<, ճUU]5m^b) %=L_6VKD #*ϭF '4) H 37;  *,9A809{.dzp2~\jFnF ;F ="  ( !LO % !$IE>! " &0  :,    *"  ( /8    m]ZKUoNZ|Caq^vX]aMj_gIbSdG[|/ZNOT $ ,"߫- ;q3C <.!X  "   2 &=(?M#1*9m0 ?#B^ '!!' 4>= dU?FD@0+3"'43;27&'#"$4727%672567654'&545&fD3-Z5F x?{)C!  k8di`-@S@ vNF=4$0+3!&#!"!"'&=47632"'&=4763"'&=4767!2476?2#"'&554'&'7654'&'#7653254#"'&=!"'&=2+7v(9_- ,,}     !p  HvhJI+lMMMMlG!'-! ,+ !   -.$ .% - HJIh+XLLmmLLdi`/CW@ dYQG;1!0+2#!&'&#!"67!27672#%&'&=4?676363!#!&'&=4+&'&=476;"'#"'&54763!#!#"3275#++!-_9( Q 4! mLMMLm+IJhuJ G++ !-(  NMLmKlMMX*hIKI - %-%-dE&?Vj~@xnbXH@/'0+%"'&=47"'&547&5'!"'&=4763!5!2#"3!6763!2&'!"'&'"3%676=4/&'&#&#!3!676=4;676=4'&+27327654'&#!3!32#"'531""?"""W;+**+;}XYYX}r++ !-!9() Q  ! PmLMMLm8+IJhuJ E""//""/1 T"+*;;+*}YY|}XY++ !-(  NMLmKlMMX*hIKI - %-%-d &?Vj~@skaWPF9.0+%#!"'&53476;226326;2&547674'&+";27674'&+";27674'&+"";276754'&#+"'&'+"'&'5#3#"54'&+4'&+3!276=65 YX}|YY}*+;;*+"T 1/""//"" (-! ++ --%-% - IKIh*XMMlKmLM}XYYX};+**+;W"""?""1V(9!-! ++ )w  ! JuhJI+8mLMMLmdE&?Vj~@yog]M@5'0+%"'&54763!!2#!###!63!2!276=4'&#"276=4'&#!276=4'&'!"4'&'#"32765=4767'&=47673'&5#"543276=!276=!";3'}XYYX};+**+;W"""?""1V(9!-! ++ )w  ! JuhJI+8mLMMLmEYX}K|YY}*+;;*+"T 1/""//"" (-! ++ --%-% - IKIh*XMMlmLMd &?Vj~@skaWPF9.0+4763!2#+"'&5'"'#"'&5+"'&5&'&5&';27654'&/&+";2765+";27674'276754'&+"3;276;2763#&5432;;4'&#!"7dYX}K|YY}*+;;*+"T 1/""//"" (-! ++ --%-% - IKIh*XMMlmLM}XYYX}b;+**+;W"""?""1(9_-!++~   !p JuhJI+mLMMLmdN $(,048<{A<<:8642/-+)'%zd"0+ 3656;2#'7+"/#"'+"5&54775%"'5476;25'7&567635&56;374765'75'76=4'&+ +"'4!#"'5436365&5&#%#754'&5&&547'5367&547+&'&'735&2?"5%75537'7'3533553535'32767&5%2?&#%55'575775775A4[(!9?9Q8?VE:.?FA.( 4DPEa??#+6y a ]?  ?[Ps @tf"_N*3RF!"V<=\@/ /)V:[+ .#p>$-((Di3 (b  @hhF*g? @- 9Ve kRDpeb5-=<8z4"+j)b +&=tt\bbbVnB-* b6 Ann=V[n_~usPm81,C ]7+ \B#J+ !1P[*c*9 1 V PN H&=eom% t \S@# 0 8h-5m/0 @d$HW]NYC$\>>\OVC ,,1 .211/=;7777=10 0600y8/7fM%`[Cg+(f>17I00 011001 10d_&0+2%2#"'&=477654'#"'5473g1r Y)G ad= [ 3 Z_GHZ9QYR13d IJ: d& !3CS@OG;4)" 0+%#"';27!5%67%!&'&'2+"'&=4762#"$54$32$54$#"Z/81.Њ^]|^]"*zPQ7C)-P8G'0aa%;;æñ[XiWH^ :.1fNO%-G5Q%&H7C_cƯ:>d,Sq@~r`TE.+%0+67654'67&54&+&'6;&'&547#"'&'#"'32767654'7327323.#'54'567654'&&5476;'&'67&+")D&!##6AT =KS= Vr{I/ZEg;2*l-1Z=t\^z~SO659.C" ?6?l1DO\Dhv nD>S3wl, &cA?o}WYw(J?B \Xi$#+@5!N & ,m\OR$WD.J'-_[cKO)&FA`Wq(B34jn B ( FIVXrSt`~V+'TC&P; $HJdn '1Id|5cA0  wl]QG=/)'#0+327&#"&#"#"'7'632&'65#5473254'&#"#"'5&=67#&''5&'67'654'54'5$'67'6=4&'67&'6=&'''5$=6732#"'&#"&'65743&547"7&'7&'7&'7&'54'6546767675477&=?&''5&#""'6%5&'.54>32#67#&#" <1Sb!6 ?V L^   :)(6hCt/Mf,?HCfF_^fAB5CCC 7.aR2;EH8e h)Vi"&VrH-8u/7#]78-/7&[(iS'%#h[-HK8/C98$^7/-C)B&QL=Q%%O>KP& > `+:u9 )9A!h  s55&3, &]5T V(C@$'D+ ~ #[1 .P@%$Z5 )&GOA (} vtju8+)_T/< 9;-#6\;Q(xAgGGu[ x< s\4\VK#-;e;\'Ax@GR 76=.#;254+5!2#"&'7654+5!#";!532?5'&+5!#";254'G?7 7_Dl6rbpRRMJSQOJl^%5%GӋW&$gȃ^$j%TSB [F51kYFJ&^>hQV(deefE:N!)) Ύ((/Ì))"F("OdD_0+33#!!#'!'57!5#'5735_h5hd_+0+!#!573#'5!3!'573!#'73!#'5J aamii _mlaa mdr,$0+32#' 37+ &5%6323'#57'53#YCL3}oZ:Ş==r2۔B/e -TMwuuwd_L_p @ i`UM30+32732753"'#"'4323$4'5;+"'#"'53275'&'&54?72'#&'&547634%476=%u;*!(=?))K-   fF,JkCv@?4}7oOQs![k !X<{U$qHyxQ1U_E,,>)7((]|; rR <#[[%;iD&@[Db_Ag+çKMNdrZem jfb].0+2#27654'73&#"##"'&'#"56=+"'476=4#"4735#5&547/63654'%654q?Mw15qruݍqJ5q ( (9XKbgJ5' ID+Nmu:rpR€AT/'[<rGu+KNO]Frzjۥ+%'7.Ck78nIY 7=OK!';ܜq,rFWauDGcMwF;l]`:dh20+2#'#"'#&'663327'#&'756=4'&+"6`sȜ=ict<~o"ZnhǺzfQSzOajk  Ss!^?3dr !@ 0+! ! 67 654'd$'dbsVk&bd%rEjKZdr*6 @ 3-'! 0+3265! >32#"&546324&#"326%! ! & y8%'::'&7m8'(55('8db$'Ñڢ'77''99''99''79%d%&bdZ  0+7!!'5!!'5!!'5jSSSOOdZ @  0+7!!'5!!'5!!'5%!!'5jSS#6#OOdZ @  0+7!!'5!!'5%!!'5!!'5jS#6#SOPdZ'@ $  0+7!!'5!!'5%!!'5!!'5%!!'5jS#6##6#OPdZ @  0+7!!'5%!!'5!!'5!!'5j#6#SSPOdZ'@ $  0+7!!'5%!!'5!!'5!!'5%!!'5j#6#S#6#POdZ'@ $  0+7!!'5%!!'5!!'5%!!'5!!'5j#6##6#SPPdZ'/@,($  0+7!!'5%!!'5!!'5%!!'5!!'5%!!'5j#6##6##6#PP d#/Mkh/AJnbN90  0+32>54.#"343263!'&547#"'&547#"'%2#7632&547632&547&'&#"'#"'!6767&'&&'#"5#!6326323676'&547#"'&547#"/#67667"543&5#"'#"'%7632&547632&54?!&5&563263263&'63&'&547563267676?63233###"''&'&'&'#"'5&547&'&'&/767676---- A $&%#<     )3s  >$%$$ Bh%%%#  !@   }u0   (0u  $%&% Aa  yu1  5? ?5  +"P ## P#+  4> <6  ,#O $# P#--,,`'0u~   %%%#  #?  ~u/   (0u  $%%$ Af$&%#=  !A  }u0  =$%%% ?  -#L $# L#.  2< <4   ,#P%%P",  6< <dr "*2@ /+'#0+! ! 3254#""#%#&'67&'67d$'dbJM"FAD;?\hmehnc&bd%MKJio imio imd& "*2@ /+'#0+! ! 3254#"273$33&'67&'67d13RPY[^JD@alrimsg2PR2\YQint nrnt nrdr & @ %!0+! ! #$'#'"&'6%&'6d$'dbuJ~MW%wx}y}&bd y- ~  ~ d_'/7?GOW@WSOKFB>:62.*!  0+3#'3#'#"&54632%"32654&57!!%57!!?'?''57/7KKKKKwvvwOppOPppB B4 443 T444 3_BBgvvxHpPOppOPpKKKK3 3(4 44 43 3 dr* 0+;27$4'!"7 #"'56765%&'567K?$ `\veZ_퉉ycg@.(VYN.\&5aJ$ds*( 0+ ;27&'&5%67&7#"'$47!2A]a $~>L7bz؉`ZewBEW)z. K쳲5']rcdH`-<5. 0+3##5#535&'&54767&'&53367653#32654'&$!yxcvczz %% zSMj#iNRy!#jMSvsRN!wr[ `` \rw!"wSLLSw"WMRvwwvRMda\" 0+5#535&5! 3#254#"s tZ  a as ٰ  d^= $0+32654&#"%#"54767#53533#ԕԖі֕xؘύ/ڍq``d^  0+ #5!#5! !23254#"{\!z{OP[}  wzd_0+52654&#"#463233#!5rsrgՏPopp漢qw]d_0+#53533#632#4654&#"#aaded.dRozCqpjd;_ 4#0+"32654&7#"&54767!!53#5!!3!!#3!!3II33IH8-FecF,8叏  eI35HH53Ij,GdeedG-okkkcd_;0+%#5#535&'&'5'73'3#'73'676575'73'33p`G^\GappMM`HpGbQQŠodr_0+! #!!!'!27674'&#lw\62E=+wB!K_GWUxNxJxJ8dh&0+!#"#&5463 67!2#654'&#"kFmMw/kj0wLnFk*ʕ uxy{6.$$.ʬ{yxu 6d_ 10+"32654&'67>3"#"54767&'&#52 yGOZqx+'&,xqDNG8>dd&É'd!d>8d_0+&'5! %$! 56?632#"'@^^=klkkkklk0SS,9+SS0  d<{( #/G @ ?0)$ 0+"32654&,'532=&546322654&#" &%&#"#"&547>,Z~~ZY~ Q8t}ÌbEZ~~ZY~)ZQ8u}ÌbE~ZZ~~ZZ~')uPgČbII~ZZ}}ZZ~X&)uOfŌaIIdrT' 0+67654'&'&#"32463227#"&5454&#"#"'&'&54767632254'&HF%$#!H F$%!-ԫC_>xj^}x,$/o5598m,0o55GF-cF$$"!G E$%!"HȗѦ%uRDpriǷ~z9;]gRAl*.q43:8l+& Eid?t9D@;0+2>32>32#&'567''#'&+"#4'3>64'&+"u:p$F:K-y@7]+Ds+5|; &SSl"typœμupY'_nR9˻_,31jjJWBD?df$ 0+7!!!5!&54632!!5#67654&#"dvP@@pQttQ c||c PsttsPdEil4*0+%353'5#"&''#'&+"#4'3>32>32G327&'"d&&eqr)urb.=5"JE{&**&rAVy tlpϳ`|n_ҵ\SThd)f,YB6 0+32327632327632&#"#"'&#"#"'&#"#'32327632327632&#"#"'&#"#"'&#"#'d4n* 55QR5366Q)(ugY<[/9R5584PR4635R23o) 45QS4456Q)(vgY;[09S4585PQ5544R2%CCCCCC!02IHJACDCC]&CCEECC"02IHI@CDDC\d_ 0+!5!37!!' !ߜ!cCC7&'6d_!%Ue@ aY=&#"0+67&'&#"!3!67>54.#"!&'.54>325467675#53533#63232>54.#"!.EGGLKD;:EJLHGE/c'"?de_IF! cc`dd !FI_fd>#')**)y(%KJJ%%JJK%(` 1bcb!:2@PP@2:!bcb1  ((**dhHNRh~@sj]TPOJIF!0+&'4>32"'4>32&'4>32&54>32&54>32#!5!'!567>54.#"32767>54.#"327732>54.#"327>54.#"732>54.#"Z 2371O33,)@12?#+32 RW)33 ^%I!"# &#"#m[#!#_. " c ! !X..;+U--*K-002*'..N~)..WSE8+:'  !  !K!  !B !! ' !! d%+0@ .,(&" 0+!35!#3!5357'5#5335!75!!5'57!mXXmmYYmu#NNEFꜜM99``mvv5&d6BQa @ ]UPH<740+&54767&'&'5676767&'&54>32!535#5##3654.#"!32>54.#"c 7!''(H)H&'H)G(((!6 l8)G(&G)9Xm22211580 $9CJJDF& $&'F''F'&$ &FDJJC8$ 08626rdssdr+C'I%%I'<2C 1122d,8Aw @ oc<93.0+654'&547!&5476='&'654'67&'&5476;+"'5#"=6&'76767%25#654'&'Bt*g V4, *J.D c3$[)AD '!I  8*Fb\!cN >%+ I   /Ycb57=m,Khtiq<,!. 2.\#:$ ]]+*HDF rtv11 h ( >GF( dgT_ @ YU;! 0+32>54.#"32>54.#"!5&54767&'&546767&'&54>32'&'.#"7`45`67a33`8 9O $%)PI)J'&J*HQ(#$ W54.#"!&'.54>325467675#53533#63232>54.#"!57!&'.54>3234'67632!!1FJJOMFFEGLNKIG1 V'$BfhcLH" ggcgg "IKchfA%'*++*9@Bq<;:&(9;=q@>9y(%KJJ%%JJK%(` 1bcb!:2@PP@2:!bcb1  ((** p=>p>  >p>=p dhHLP NMJIF!0+&'4>32"'4>32&'4>32&54>32&54>32#!5!5!Z 2371O33,)@12?#+32 RW)33 ^MMX..;+U--*K-002*'..N~)..WSIIJJd#' @ %$0+5!5!!35!#3!5357'5#5335!mXXmmYYmu#^^!qq4M99d4@:510+4767&'&'5676767&'&54>32!&535#5##3H 7!''(H)H&'H)G(((!6  l]80 $9CJJDF& $&'F''F'&$ &FDJJC8$ 0862 1rdssdrd6BKQ @ OLJE?90+654'&5473#!&547654'++7&'654'67654'&547;2547#";65'"3# 7Q !*h ƺ>o Ub.emT.^c4A)[#m D:2dH*$,ME - 57lcLNٴhb "#?s.!-=B2!"T*'dg00+&54767&'&546767&'&54>32o $%)PI)J'&J*HQ(#$ 55I#FLM& #(&H&&H&(# &MLF#I55dW#0+#"'##56'##"/547?d)9Df,X[(2[Q P_5QK'Z U|E,mdWi2%0+22732#&547636=4'&#"#4'&#"e `˵j z4gFųY=3K ?W]iIAHK =t)$h`#HѥAdr  0+ &&5 } 5AHrA` _R /3dWh70+236;2"'##'65##"'&5476;235&'&=476] n7CNX$A]KM]^8` dw4@5N AAeL `dW!;A ?<)"0++"'##56#+"'&57477;2732;276=4'3&'"އ[$2i,X\,V#=o|{*(, fF)Q Y[d]!2R @ 93)"0+3#&'&'5476%3#&'&'54763#&'&'5476#"$&5467332$654'&'  -LP1  .MPH  .MP*­°{HRQI|:Zumi/Q g=?W׉G~\aSGq弄V44 <;KVo'JJIJ 44;~F32.+)"  0+3353#5#3#7327654'&+%32##7254+3#3#3!567654#"#476323#!'7!27654'767327'7&+'6"'&547'7'3!GHH.E"QQ"EH>99>%{8H55C,!F c//HM./7DZO*(TΏ2F#TU[^Z"EE"@IU,+[][#E}}4st3A$$65%$@om//^}@ZAaAS9*,CS-+((BGGWPIIGHii>V44 <;KVo'JJIJ 44;d0`u@xuiL@-% 0+32##7254+%#3&'&#"3273#"'&547633254#"#547632#"'&=3327654#"#!'7!27654'767327'7&+'6"'&547'7'3!|8G55C-GJcc,^Y= I+*8Q*$$+[  dQb40DM1:IQ<5WH.2b$%m 7*(SЎ0G"STZ]Z"ED"@IT,*Z]Z#D|ol/.]|r9=<5TP5@vM@) C+'$*LB. ^K+'&)EVHIGGhh<U44<;MVn-JJII44: d$+7BEZn@xol]ZNDC<8-,(%# 0+333#7327654'&+%32##7254+3#3#35#533#'5#!'7!27654'767327'7&+'6"'&547'7'3!,H-E"RR"EH>99>*{8H66C]OOX_W*(TΏ2F#TU[^Z"EE"@IU,+[][#E}A}4st3A$$65%$@om//^}@ZAaAkMZUkmIIGHii>V44 <;KVo'JJIJ 44;d@Vj@tkhYUI,  0+32##7254+%32##7254+#632#"'&'3327654'&#"##!'7!27654'767327'7&+'6"'&547'7'3!d|8H55C|8H66BAJ.*76SF+/cL(#HW*(SЎ0G"?STZ]Z"ED"@IT,*Z]Z#Dol/.]ol/.]Uu73KR42"%QD-'ACBHIGGhh=Un)44<;NUn-JJII44;d8Tbx@{wkYUO;4 0+32##7254+3254'&'&547632#&#"#"=7632#54#"632#"'&57654#"3%#!'7!27654'767327'7&+'6"'&547'7'3!Z|9G66C;BO1O>1(;6$*J:H # *!;2*@'3pA,.bA]%AL.,34Pk,!R')*(SЎ0G"?STZ]Z"ED"@IT,*Z]Z#D|ol/.]_F3#  ;<A6-  @? vJc&(K 7$51LO65Q @*)sHIGGhh<U44<;MVn-JJII44:d(= 2)&0+#!'7!27654'767327'7&+'6"'&547'7'3!u*(SЎ0G"STZ]Z"ED"@IT,*Z]Z#DHIGGhh<U44<;MVn-JJII44:d&'9HR@LIF:/(! 0+!273!567&#2$'76+&67'#'6765'533!273+#'!"/479 Ib`" eh)10Q`'|oOc ]r.SS}65 `[V/X'e:9o >)[( :s s#/1dr%2<J\e@c]NKC=;5-' 0+3 + &=%62!67#&'&#367&#&#"3274/"34?3'35732?5##!'53v[hN*"1r7 |OJ?0Z1J ]p]_( KG I݀z#9d =erfHp1L|f) wsv-I92s/9?*Ww[`c% V'dr /:BR`j@ea^SLC?;40)!0+ # &5%6; 65%&# !27!57&/#2#&'676+'%!#'#&'47'3!27##'%!#"/6(auYr'E,LTU*'36MgIJU+q+}e_J RJ4M%rpT_PmL]A\)!1$ CPy zS/ .ZQa)/dr +6R@ @:0,&!0+ &5%63 %&+ 3 62654&#"!267&#"67632#"'&'#"&54632%afY+UNhTcX{{XjY SMh?X{{CTwwwwTUvwwvUTToOpPØM@|WX{{XW|xTwvTTvwTd!/#0+2!2!!7&!"4#".547673267ɘ   0( Tpzz|?!/'SRR*D.dx(W|>{z{p;.;CRSSK1d_' $0+2#".54>!2#!"543!254#!": :: 9ysssM&y&&&>: 99 :!sssyss&&y&d_+7 @ 4.% 0+2#".54>2#".54>!2#!"543!254#!": :: 9: :: 9ysssM&y&&&: 99 ::9 9 9 9sssyss&&y&d_/;G@ D>50' 0+2#".54>2#".54>2#".54>!2#!"543!254#!": :: 9: :: 9: :: 9ysssM&y&&&: 99 ::9 9 9 9n: 99 :!sssyss&&y&d_/?KW@TNE@;3+#0+2#".54>2#".54>4>32#".4>32#".!2#!"543!254#!": :: 9: :: 9:: :9 :: :9 ysssM&y&&&: 99 ::9 9 9 9x 8 8 ::99 ::`sssyss&&y&d_/?O[g@d^UPG@;3+#0+2#".54>2#".54>4>32#".4>32#".2#".54>!2#!"543!254#!": :: 9: :: 9:: :9 :: :9 : :: 9ysssM&y&&&: 99 ::9 9 9 9x 8 8 ::99 ::: 99 :!sssyss&&y&d_/?O_kw@tne`[SG@;3+#0+2#".54>2#".54>4>32#".4>32#".2#".54>4>32#".!2#!"543!254#!": :: 9: :: 9:: :9 :: :9 : :: 91:: :9 ysssM&y&&&: 99 ::9 9 9 9x 8 8 ::99 ::: 99 :x 99 ::sssyss&&y&dr/ +#0+2#"$54$32$54$#"4>32#".&QQB*+֞ըa98 !88 rOU=ץ)-ӣ 99 99dr/? @ 70+#0+2#"$54$32$54$#"4>32#".%2#".54>&QQB*+֞ըa98 !88 9 98 !7rOU=ץ)-ӣ 99 999 99 9dr0+2#"$54$2>54.#"&QQ8! 89 8rOU9 99 9dr/ +#0+2#"$54$2>54.#"%32>54.#"&QQ8! 89 8 89 97!rOU9 99 9v99 99d0+7!!'5jSd 0+7!!'5%!!'5j#6#d 0+7!!'5!!'5jSSOd  0+7!!'5!!'5%!!'5jS#6#Od  0+7!!'5%!!'5!!'5j#6#SPd @  0+7!!'5%!!'5!!'5%!!'5j#6##6#Pd_,+0+632327#"'&#"/#'!#632327#"'&#"#5;~EH4415aJ J43LKhePF]eIN 3 WtU11pUHHFd_0+#'!#632327#"'&#"#J J43LKhePF].11pUHHFd2_0+ '7'77 '77 ''%ͧ(})02(~)>!У$"J4()4*(i˥&ڪdrR5 0+32>54.#"##"'5##"$'&'!5!5&'.54>32!!676?'%'$C$%B&'B$#C%#$P RQD|fl^9@As>=tB@9T]X{EQ R Pk$C%%C$%D##DMYQ<2r<Q-&w/ s?@t??t@?s .w` -Q7.6. 4GVX:8*CbW%a??`$Wc<&G;XWGgi 56S/'uR(!Rp'-Y<C1= 6:nE=( J6?//?6D !IEn:6a` j k6WF>#5R&2#>FT=dr 6Wh@ `X>85&0+3254'&#"#"'5&=67#&$'54%'6=&'''$'6732#"'&#"5$574%'.54>320   "<HHH >2jZ5A"bgH((P  ><, ;L,,l="h[+>%/+R[K,1!.![@1.m96 e **** dr < 9 0+% 32% 3232+#"&'&=!#"&'&'#&=4;7337{{zwzz{3%)+SS+((+SR+*3..rt/$$$&'@::BB:7= ?8:BB::@+-ӑd_(0+632#"'&'&'&#"'#!#!#y/-B 'qC>*)cI"#*ElhZxPRxZP $JM777"%D2!?AAA; dRj3A ~ohU3 0+767#&=&$32632#"'#"/#"'&547"'&=4?&5476;267&54?2654/"57&'&54?27&'&+"63267654/"2?54/#";27'#&547327&#"%632"';2?4/#";2?#'#"'547'%#"'"'32?4/32?4'"'547kj@$3')(Svi S%,!\&DZY#)4'%W$4 O*,0WB##) 2"'(!2IJETZ*25I8/?!uG9( OL7 UH S:": -tm'H@ "ow2Lo 63!qs- ?A 3:P5 %4(  4.? :#B 0DB2!'2 YY$׏~䛑{rhiUb #&$ ' U"," K,-0SX')4!+Y +(@-s)|m'0%  !or9FOk8)!.'+  Nk ,:F2(B | ? MDE=2!64 !3P#(-!2CA7#  U643I?pF?+~ LP5Im6 ?I5qn! -A!id__ H( 0+32>54.#"%2#".54>''#/'7''7''7/5?'77'77'7?3777'/}~瀄z{$A&%A%$A&&B*Ak8ULB"\!BKV8iA;%{#` ut _$x&:Aj8UMB \"BKV7kA;%{#a ut _$x&}}~}} $B%$A&&A$%B$A;%{#a vu _$x&:Aj8ULB!\"BKV6kA;%{#a vu `$y&;Ak7ULB"\!BKV7dr  %*/;BIOTY^#@ ~][XVSQNKGC?<50-+(&#! 0+3&547"654754'7&'7&'7&'7&"32654&7&'7&='547676767&#"#"&5476;267675&'.54>32#67632#"'&#"#"'&'&547a57@-A:B+/e5BC)8pD/f3HH33IH@75AA*nB:Q}5di7*p/y :8n~i//E+%2%$2&*G//km892%2 1%2+>2\T u9 r[FtUAdHc;T*B,#7wG13GG31G32 Tk 9u#^rFV[AL<;c0!#,BZ=%"  $ S #$$# R %  G>YE1&A&1Ed^r #+;Gow}#@ ~|xvq]IE@6.($"0+2#"&546&'327&%327654''67&'&'67654654'&#"%632632#"'#"'#"'&547&547632&#"6&%67&'&#"676&5467&67327&/BB//AA]DQ4"$#!4QCUC11 #]DP3oo+%vJ`dd`Iv&+oo)%vJbdd`Hv' U}{Velm|LRoZYqR"3PD\B22CQMQpRLZlgW{}Vf B//AA//BGOqU+%YbttbZ$+UqN9:9:8;$@\IX~!t\"cdM;75C&E-+O #-m8Ap)R{{S(pABb,$ O+-DE&C67:NdXƚr] d5w #&+1;@;5.,)'%$   0+#''!7'7#!!'7#7 3?'# !! 3b)Ac()8Nh@@8#*ۇ3TAW9=7*U2:7442g12.{2MzTx ]n|Ar.c<J Nd 0+!5%7' Ssso>no=nd 0+!5'73 Rssno*nodA "3 @ ,%! 0+#".54>7#"&554632 672#!"&547'$&%&B&0'4+:G"LHI|/C$$$$ji 5)*V&.56%2o?$& ?n?ȝ" `oQF apRF?Fݜg#]ߞp@d{X5AP @ NH<6+0+67654&#"!!#5!5!5&'&54;632'%'#654'&&'&54732ZZHpPDRDy%ۙ&7o_f.eUpQkVoS(QD4[GpޞOGp&D݀jaa8( >o?fpRgpQB&E݀jHpd ,0+4&#"326'%'3##5#53&'&5432ԕԖԃe.f xz*}ؘg>o? ڍq__8t.d (#0+"32654&7#"54327'77'%'yޞ>7p^@<5e*h4=wߞߋg98(gNePW>oWgeWg/g}ؘ/mMfNU</o;VNfMl##';o<``,טd^S )"0+"32654&'#5#537#7#3#3#"5476aԖwwx֕zXɚؘɎvggvq/ڍtd '#0+4&#"3267353355##5##"5432țؘȏvggvr/ڌuԖ◗qxx**zdy  0+#"54$323254.#"z|Jˀ~~dy  0+#"54$32JdS  0+#"&54>3232654.#"rijqˏ\XW]nmmoˏ\YYdd !)7 @ 5/&"0+32654&#"#"5432632#"654&547&#"32@JțJ?yp0֓psّwjic܃=JؘJ\ԕC*+DCiiiďԖd9 ) 0+32654&#"5&'&#"3276#5#&5476;253632#"_SlɚlSQdؘdQИҋjlQjԕjQlzqrUjԖjU*Ӗd C 5 !0+4&#"326%4&#"326%#"5432!67632#"'&'ԕԖԕԖ~*ҕww*ӕ~ؘɚؘTv/yyvdK0+%db&bd_0+!&5476=#5!#< qnq{>![#>p RR}d^ 0+4&#"326&5432#&ԕԖ/*+x|ؘύ/ڙqmd 0+%#432654&#"'632!!#5!5!H͐pr*ybBpmԋp\\db 0+  !#5!5!`aLMH`aH\\d_0+7!!'!#5!5!'7!5!'73VDVUEU֓&VyUp\\UyV4d._!  0+#654'&5473 ! !! !|y//y.YIZ^fjMRQ3333QRRQ3333Q798%s[d_ #0+"32654&'#"$5476737 '磌fV!VEN76NN67NM5>XW||WX>4VUd60+&'&5432#"'!#5!5!W=!;7K>HV@G-A! %BښK&__d0+!! '!5!7 jsjhrhdhieihd 0+35!3 3!dE"!Dz%%zd 0+!# #!5ޏz%%zdr7  0+)!!!!!!!5eaș($b}] dr %/9CM[n@zqmcTNJD@:60,&"  0+6327&#"63267&'&#"! ! 76767''&'&/%676&'&7467&'654'.'6&'676765467&'&'&FF_==_CuklI6CAB>>GYTB\8Ibb%$<-F"!!V12COIXWdPD11VsWX;,;!"&!3GOl+7?j2T~ ;5J8ksS-i<:zO5J#C/#(Yz;5 "d6))$_BJWVVSb$%b6_9;UMdgf J*%#Eb??E$$*I(??OU::_4zfgCHD|AGm;K=X;_hA:0,M;!#!*7D?'6_" >LX0, dr #)/jv@pkN1,*(%"  0+'6'673'67&'7'&'73&7&67&#"&'&'6767327&'&'7676'&''676 ! 1*::>z1)8:3:*10%>:/8)1.P:Ξ!01š1/c&$bI':@IBGR$:@FHBMS@:'BGBL@:$?SMBHno")'bd'  )3%%bcd_ $(, @ *)&%0+"32654&3##&'&546323!7!@ZZ@?ZZR>X~|Y?QxR8>,,==,,>9)QcK3GeffeG3RER_ do)5AMY_ekqw}@{xuroljgda^[QNGB>8/*&   0+#"'&'67632%"32$54$#"&54632%"32654&#"&54632'"32654&3 $=! '&'5&'5&'5%565656 =>¿`ˏ'kKKjjKKk6NN67NN6k&!!! !!!!!!!!U! U!!!wTXXTw4vVVVVvllllMnnMLnnBT::UU::T!--! --FFE C " x* d)5AMY_ekqw}-@*~{xuroljgda^[QNGB>8/*&  0+#"'&'67632%"32$54$#"&54632%"32654&#"&54632'"32654&3 $=! '&'5&'5&'5%5656563 $=! '&'5&'5&'5%565656 =>¿`ˏ'kKKjjKKk6NN67NN6k&!!! !!!!!!!!U! U!!!6k&!!! !!!!!!!!U! U!!!wTXXTwRwVVVVwllllLnnLMnnBT;:TT:;T -- !--GGEC " w*  mFFE C " x*  do)5AMSY_ekq@pmjgda]ZWTQNEB>8/*&   0+#"'&'67632%"32654&#"&54632%"32654&#"&546323 $=! '5&5&5&%675675675 ̏ˏKjjKKkk:N76NN67N]6!!!U! U!!!!!! !!!!!wTXXTw4vVVVVvnLMnnMLn:UU::TT- !--! -M.#C+  IC " d)5AMSY_ekq}+@(~urpmjgda]ZWTQNEB>8/*&  0+#"'&'67632%"32654&#"&54632%"32654&#"&546323 $=! '5&5&5&%6756756753 $=! '5&5&5&%675675675 ̏ˏKjjKKkk:N76NN67N]6!!!U! U!!!!!! !!!!!6!!!U! U!!!!!! !!!!!wTXXTwSwVVVVwnMLnnLMn:TT:;TT-! -- !-N.$D+  HC ! G.#D+  I C ! d "?_gow@tplhd`QB6'  0+273&'337&'67&'67&'67'32654'&'327654&#"3672#"&54767&'&547&'67&'67&'679ok!4m#%!$&"8 !kԖjXw4&9kPPv9&/z~q*GA_Kz{OeAA # ! !#8!>GPYbkt}7@4ƿ~wunlec\ZSQJHA?86/-&$ 0+3+&=43+&=4%3+&=43+&=4%3+&=4'3+&=43+&=43+&=43+&=4%3+&=43+&=4%3+&=43+&=43+&=43+&=43+&=43+&=4'3+&=43+&=43+&=43+&=4%3+&=43+&=43+&=43+&=4M0M0L0@M0M00L0 M0L0L0M0@L0M0M0 M/=M0M0M/L0M0L0L0|M0cL0M0M0 #7/#6#6f #7$5#6 "86 "8.$6$6e #7#6#6 "8] #7G#6d$5 $6$5%#6_ #8o#6+$6$6$6dg "BnHr LT\d@kA4.~hc_[WSO:$vaL6  r\F4%! 0+"'#67##7&'6'&'6&'6672#"&54767&'&547'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&543'4327632#"/#"57#"54?'&5432'4327632#/#"57"54?'&5432''4327632#"/#"57#"54?'&5432'4327632#"/#"57"54?'&5432'4327632#"/#"57#"54?'&54327'4327632#"/#"57#"54?'&54327'4327632#"/#"57#"54?'&5432&'6&'67&'6'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&5432'4327632#"/#"57#"54?'&543224!ko9{!%#$"&$$! !A~q*GA_Kz{OeAA$ ")(" # ')     %$   #$     &$   #$ X  %#   $% u1O^M# ! ! "#! -  %$   $%    %#   $% 8!<>!x%'''%(&c"#!fjUijJ@iѕiD Jji@5 6  4 2  2 2 / - D2 2 / - 0 0 . , O                    2     {"#!!#"#!#"^0 0  . ,  /      _  2 2 / -  dH"+4=FOXau~@xvtk[YRPIG@>75.,%# 0+3263#!5276;'4?'4?263+&=43+&=4%3+&=43+&=4%3+&=4'3+&=43+&=42'4'"5%5'#3+&=43+&=43+&=4%3+&=4p%4!cLz7,2 %)@.,sSL0L0M0@L0M00M0 M0[4( M0/M0L0)M0S"h/1E` %.g/ V(_ "8.$5$5e$6#6$5 "8 # $6+$5#6$5d&  0+7! ! NVPErABk\d,0+7! NVP<kd_ $0@*%! 0+4#!#!"3!3!25=&#"327!2#!"54S%gR$$% " ysss1%%SU%%r!" sssysd_   0+#5!3#53#5׍.׈;:_)ҍC:da 1 @ ! 0+2!57! "63!2&##"="5>?63!2##"=>RU#/":1& E  :%;  F %29\XO%%O.Ol#44#lO.O%%Od6?:70+332654'7#"'3673+"'#"&5&#"&546323265(>2>3H>qX33l*A 3qsRLM6EH>qMIPP?LM:UY!ZG]>linÅ1q;6=HS(F*Hg2Vos~sYBC d'0+#&'7677$^!|P2, $X0G'6'DA:Qt!w {ib)A *..4.4& X H  9  {볬! a W '#HaV'PS*R"+V 3=)R.#3!% ()vb N=Ra ۭ a B ` {q%[Q L a d6r/6 20+ 0++3356;5#"=#"=677632+#"'&7325  p QN NO b  ߲  k 13 21 Ϫ9dt %  0+?32?654'?&#" ! ~Za|XRņƃ~!&cb}RY}{_Xcb$&d_/K@ _L800+32654'&'#"5%67654'&'#"=543267654'&'#"=54323#4'&'#"=#47675&'&547675&'&535432676&'&547675&'&5476753#%J65L&&'&&&'%%'&x&&&'%%'&S>0@@0>>0@@0>S&&'%T?/??/??/??/?T%'&&A/>>/@@/>>/@M@0>>0@@0>>0@L 'bcMMcb'$## &cc& ## &cc& /##- &cc& ## &cc& /##؅=/ /==/ /$,( 6 }C_1  f;K ?1t(    d0+"'&543!2654#!"32;j2K2k#W# 04-'--'-  d_ @ 0+#!#3#3##3#/fje9999v99_q_[owd_ @ 0+ ! ! ! !=& a c _d_  0+65!"!27!"wm  lw_d  ("!0+!2322+#"'!#"'5!"=#"54!5#YaY% &(4:< _ƶ~|d_ @  0+#!3#3#3#3#ERip88888888_֔}zxd_  0+ 3!7!dHX;n_Nk;dlU=I F@8$ 0+32767654'&'&#"7#"'&'&54767675#535#7#3#"&54632/<[=9pg/=Z=9p))jG7{CFkF7dk.U;=UU=;Uh[<:oh/;[;:oh0ߕ 8{DEiG7zDGk9 LLj=TT=J @ GA;51# 0+32767654'&'&#"7#"'&'&54767673#"&54632#"&54632/<[=9pg/=Z=9p))jG7{CFkF7dke]BB^^BB]^BB]]BB^h[<:oh/;[;:oh0J 8{DEiG7zDGk9 B^^BB]]BB^^BB]]dS @ 0+! !3737'377'2L6EM&U5UES[6\SACO傊ݰkkdS @  0+#%#'!''77!72FSB@AN>oó@j_%0O:./DF&O%٘.dS @  0+'#'!#7!'77BSF+Az>Nnj@ͳH0#P.OD>/LOF%).'d7 @ 0+! !#%'#7'#'%'9٨UL6TES[5"\0 RAN僊ޱMkkd_   0+!!#!5!55&5!'65!5g00P)()YG:-*-:B2&C&2d,_  0+##!##5!,R_5˔?d_! 0+3##!%!#55#5352!46jTUEUSZ_v2${W$vJNMMNd_0+!#!!!#!40ʒ4_ ndid # 0+#"&54632#"&54632#"&54632Յ^^^^^^^^^^^^^^^^^^^^^^d_ 3! 0+4&#"3263!!#&''&'!5!6776qOOppOOqSN@ =4 y 4 :@QSSB</ ~ 2:APppPOppy 0 BFJ#@ HGDC@?<;87430/,+*(%$!  0+3233!$3533!3533533735335%353573533735335337!35'35Χ%Zq [я2Dž<{<{2ga>|;C|<Ʌ_rccț-țțțțdW @  0+! 32$7%!"!!"$'!!3!+|85(I,BFuq '^OngVU舥~/d_  + @ &! 0+3!!"&5!#!5!25463!!"!4#!5!2\ Zn_nZ ] nZ\`]Znep]]pe]peep]d_ Z <0+#"&5463267&'%%#"&5>32%654'&567#"''76767632%&5476732#"'&'hIIggIIh3 o Q+LB2%;A '0 G- !2?.j{,AWW>?WW?>WW>?W}ݗ=iDi=p*B)F0?WW?>WW>WW>?WWd`  0+3%%%I2W{e9`N7 d#r0+ 654'!  ! &547jk̤̤gg Ńƃde_  0+!!5!!!5!!!!5!efn_;;;d^(,*)"0+!2323254/7#"'4+!!5346!56th0*,0(0 ZNv07'Hr,^kWxF_)c=T^YD^Ann냂d_)1;@42-*&0+!! $54'! 32+%3!273254!5&! % ! '6#"'532B67BVSY A_z}bQxzuuvv\}}__eJ;;JMm`mژj''02202dL_ 0+!#!5!5L6_\E_d= #U @ M+ 0+"32654&&#"3265654&#"34'"&5463232%632 #"'%+#"&54636W>@UU@>WWWW>@UU@NrrSRq8++E7J7G)+"0 qRSrrNU^^B?^^?_A@__@A_74{UW||WGP?9D AB6Q RU}}UU}3d/ /t @ v]=+ 0+&#"32767654'&654'&'&#"3276%'&/#"'&'&54767632327654%&'&547676323!!'&#"32767654'&-3/2.3-L֓  C(+J" D),^UJ" D)+I$B )<4<:       (+  ')* '+  E: $"7 <%#7*#K=%"9<%$9;9#$=J#*8$$=8#% 8Dp    dt GS_k@se`\VMH=0+"32654&4&#"326'"3265&'6732?65 4/&#"&'674&#"37"32654&#"&54632"&546324'"&5463232%632 #"'%+#"&546367#"&54632)3FF31GGGG13FF31GzEaaGEb$[#F*G#a(bEGaaE|W>@UU@>W@UU@>WWNrrSRq8+%JHJ%+"0 qRSrrN(''(kM64LL46M6LL66LLjJJkkJE/W8: V7AKjjLIk9NMu?^^?B^^_A@__@A_74{UW||WGP:87;Q RU}}UU}36((((d0% 0+&/;274#"72+"'4768="F,p$f7W0,[&Q'~_|H;/= 8`N6[vd_H0+% ! '&! !#5.'&5477632#"'&#"3272+3q *n}_C. &'Oe9pq )mm Q: %$9  !&ed_ #)/9@51-*)&  0+! !  ! #"&5463267!&'%632&#"nmQqq:wTTwwTTwFt .D- sKRFFFEmmZpqUvvUTvv]=))=]7 d_?60+'3%253232#32#;2+"2+2++4#%#.Jg-GYIwZ*%$NL)%"C4R}}R4C"%)LN$%*ZwIY-gJ[fD-{\`?>`\{-DgZds @  0+! ' HHssc$}d *cow@ztpmgaY(& 0+632# 54672&546325632632&#"#"&547#&'#"&546732654&+"3254'&$#"32654&#"67&65&'&#")(BTiOss@3,AX`$G((4π p%#<5,oB@B##E;5'|,C= :NUII )S Zo4`Ag$W?9_ #aA?w)  v(:1H'@W+-sQ\&*BFS:S/*5 7 * dW%0\hu@ rif`[J.*0+632632327>32#"$46763267&#"#"'&#""'67&'"6$6767&#"#"&5&'67&5&#"2"&54>I\-!:?A&~?00AfP ed -,4%>1/ ?0'"XA)D%9G'd =9*2<3c# $"`I GI`fNSH2$Eu Vl)تB^k$!5*=7d&08ly@|zvpkc52.)0+23632!"547654'&5463254663&#5&#"32&=#"'#"&547654'&+3 54'$'"32=.#"67#"wgT_?+F{7΂|#&+O$W 52,1V~'3$ O, DNulD(MI"rI2)B+ ))-C+ &GAz>?fXey5 !/=TxF68>X O4mR/3/\5 15)ld\W܊*L1s"3DBE&d_ 4Fmw|@|xrncGA;2% 0+32?6547543!!''"'#5'67>32726767&#%27#!"654'7327;27654'&'3654'2765__' SX@R,G"ӭ*lL4~;PD5R36f(>#p01g)vyg9&D=^%R8Abi@- bX&B.Σ@>D<4ҋ"FD6* S7JFH]`I 7S䘐0fW7> ++)( ;1*#$,~x}wyz˲~Cd  ,D@<0+# 0+#%737'#6767 67 327654'#"'&'&54767632?# )0mۿ4/FVlbFMZ( gO#-$! ( /# ( =.)!D/:N@4\(QM-& .& dU $+0<@93/,&% 0+!2#!'5775'!&'7654'%!654'!65!'#"&54632:e7/4E걾4Ke2w  (x !!  )%)?7A5Aloor2,"7542w;<6LL66MMd  ,8@5/'! 0+37%2%!7'!&'&''&'%654'&#"#"&54632nd3) ";xxl5R"V*`MFg '^G21GG12G"(-<)r:1$\4@(KQ72FF21GGd#<&OD20+72632327#&'673&#"#"&+"3'#4;2327>32!&'67!#"&'&#"#&`SHY3Y5rxys8Y3ZFR_r1r@"rGr]APMNQ]rGr #?rRxe`}~` dyQ.55V VU W55瀃-d-2) 0+#4;2327>32!&'367!#"&'&#"#&enC)lEma`qZUUZa`nDl)Co3z5,`]\`-5z3d0+2+"'476P)(Z)Ia} /Z4< gd0+2#"'476?%ln_*T!>\,Ch[dt  0+ 7   '( 0+ __ ]___d0+37 #"'647732-==Lr[)Gs>-+}6D^ 7  C每" d"0+2'#'#'4#&'&67356;3/X]GHI+/mj,#'PGIg  d_3,0+"#"&54632;4&5463232632#"&+#"&5465A@[[@Aգ?}YAAY}?@@ZZ@@ͬ?}YAAY}}Z@AZ}@?[[?@}ZA@Z}A?[[?Ad_O/0+54'&54632327632#"'&+#"&5476=&'&'#"#"&54632;676P-YAAY-PJA,@@ZZ@@,AJP-YAAY-PAI,A@[[@A,IA AJ,A?[[?A,JAO.ZA@Z-P@J-@?[[?@-J@P-Z@AZ.Od_O/0+4&'&54632267632#"'.##"&547>5&'&'"#"&5463236767-FccG%1  ;A&EebbeE,A,  1%GccH+7 ,@-FccccF'A9 .+A,EddddE'A: 0&FdcG+7 :A'FccccF,A+ 7,FcdF&0 d_Y0+#"&54632&'&54632672#"'!&5463267632#"'&'#"&547!632#"'#"&54767#"&54632!#"&547#"&54632&54632"+??+ ?,,?  +??+"?,,> -,>>,- >,,?"+??+" ?,,?  "+??+"?,,> +,??,+ =,,?>-,= ,,??,, =,->!+??+! =-,> !,>>,!>-,< +,??,+ =,->!,>>,! >,-> !+??+!dZ0+%$ZdZ 0+%$ -2qpZbeqed/?G@D@=5-% 0+%$76?'&/&'676?'&/76?'&/7&'6yXuuY;:<;;<:;=;:ONNONOON?NNONOON:=;:2NvYtN''<;;<'(W';:'NOONXXXXNOONXXXX';:'d _  0+! !! !)AA=A(EfhdeFVCG [d_  0+! !! ! EfidfFnmn[mmd _  0+! !4&#"326)AA=A(wwwwVCG xxwd _   0+! !! !#"&54632)AA=A(EfhdeF____VCG [``_d _   0+! !! !!''!)AA=A(EfhdeFUVWUVCG [d _   0+%%%%'7'?RA=Rm%HhdH$mq)(qMfM7p7k>'qq'd _ @ 0+! !-7%5 ')AA=A(b ccyVCG 4KEKd_ 0+! '!!%%!QIT?fPU2]G|LJyGn_/3*4.96d_0+% %!'-7!{}}| Idj` @ 0+3'!%7#`=>``>=`W d_ 0+''%5!73!!C`kD;lC`Dl;C==iE_Cj=Dk_lDd_0+% % -zIfgHggfI~fg|d_1AA90+'&'#'"76?37'3/75'"#76757'% % -3-xg[Yx!-33.yxć.3eIfgHg߳z)*/2-C6n߳xƄ-2/*y~gfI~fg|d _ 0+%%#55&5I0/Iс_3t v6vJ 6td_0+ % %  RsPOuP!POvOLd_0+ !  % !lmFkpd_ 0+ -% %mLWBGXLmDAKXKnHAnKXd_H0+4;263632%632!2#!#'%#"'"'+"5#'&57#"/&547"/47%!"=43!%&5763&54?632&54?2   v -  v   x  - x(-  v    y  - x  !v d4_ 1Iay@|sb[JI61 0+4&54632#"&5465>7632#"'&#"#"'&'&54767632327'&#"#"'&'&54767632327632#"'./#"&54632]>BX}}XB>]lI6&(=!7%: RVlI7$&?8&9 RVXQ!9&7!='&7HmFVR:%7>Il#C//CC//Ck}@?[[?@}~@?[[?@~2? 7$'>!1?5&'= 11!>'$7 ?1 ='&5?v/CC/0CCd4_@0+6767632+";2#"'&'&'#"&54767'&'#"'&'&547676;27&54?&+"'&'&54767676326767&'&54767632&'&#"32767654-m096&(=!72j`rnc v67#(&7>1f 3>,"*AY>3 .e3<8&'=!86w bn q`k28"'&79.n 3?-#*BX>3 $   E #IWi 7&'=!8 5 ='%& lXF |VkA?. [?AkV| #FXl8%'= 5 8!='&$  iWI Tg@?. [?@gTq     d4_}v70+7>7632+";2#"'./#"&546=#"'&'&547676;2?'&+"'&'&547676763254&54767632%s6&(=!72iv$${ v67#(&7{%},"*AY~%z8&'=!86w z%%tj28"'&7r%~-#*BX}V 7&'=!SP ='%& Q*A?. [?A֣*Q8%'= PS!='&$  V*@?. [?@ͭdL_ -@ W/% 0+67&'32&'3276=4632&547654#"432327632#"'&#+"5474#"#"'54%654'4%&=4?2365654'&4&#"326)" k)Q2i l SDy*~. oV$Z;e4o"U'f.D X#\=e4vNߢn+_.%1 >,,>>,,>f"$Fu?*PC> A9 Ei-nnUzT>;#O6%:8Q NS+Q;4 Vz>-;7R aQ+ )h+-==-,==d^GSMHA#0+%#"'&'&=6767'&'&54767632&546327632#"'&'&"32654&St0)MTI5v58EJcbKE85u 4KTN)0tUccb)&t( 8vzr# ,bEC^% Ɏ %^CEb, $r{v; )s'dbbdd e1^fp ,6FWgwK PXA.$+(oi0,& +m< *X3 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/  . J4IGK PXA.$+(oi0,& +m< *X3 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/  . J4IGKPXA.$+(oi0,& +m< *X 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/  . J4IGKPXA.$+(oi0,& +m< *X3 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/  . J4IGKPXA.$+(oi0,& +m< *X 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/  . J4IGKPXA.$+(oi0,& +m< *X3 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/  . J4IGKPXA.$+(oi0,& +m< *X3 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/  . J4IGK$PXA.$+(oi0,& +m< *X3 5ht%vjP%6%U6nV. 4x?;e4c}Q zK/ 1.  1 J4IGK'PXA.)($+)oi0,& +m< *X3 5ht%vjP%6%U6nV. 4x?;e4$c$}Q zK/ 1.  1 J4$IGK)PXA.)($+),,+oi0& ,m< *X3 5ht%vjP%6%U6nV. 4x?;e4$c$}Q zK/ 1.  1 J4$IGK1PXA.)($+),,+oi0& ,m< *X3 5ht%vjP%6%U6nV. 4x?;e4#c#}Q zK/ 1.  1 J4IGA.)($+),,+oi0& , m< *X3 5ht%vjP%6%U6nV. 4x?;e4#c#}Q zK/ 1.  1 J4IGYYYYYYYYYYYK PX@0~5%5%~%65%6|2/./2.~(g*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  Wc_^K&_'VLK PX@0~5%5%~%65%6|2/./2.~*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  Wc_SK_^K&_'VLK PX@0~5%5%~%65%6|2/./2.~*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  gc_SK_^K&_'VLKPX@0~5%5%~%65%6|(g*)(-,+(+g g5W3755g64 64g 8   hg"!$#g / h2/1. /.h  Wc_^K&_'VLKPX@0~5%5%~%65%6|2/./2.~(g*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  Wc_^K&_'VLKPX@0~5%5%~%65%6|2/./2.~*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  Wc_SK_^K&_'VLKPX@0~5%5%~%65%6|2/./2.~(g*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  Wc_^K&_'VLKPX@0~5%5%~%65%6|(g*)(-,+(+g g5W3755g64 64g 8   hg"!$#g / h2/1. /.h  Wc_^K&_'VLKPX@0~5%5%~%65%6|2/./2.~(g*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  Wc_^K&_'VLKPX@0~5%5%~%65%6|2/./2.~(g*)(-,+(+g g75g3535g64 64g 8   hg"!$#g / h/1. /.h  gc_^K&_'VLK$PX@0~5%5%~%65%6|2/./2.~1. .1 ~(g*)(-,+(+g g'&g7U5g3535g64 64g 8   hg"!$#g / h/.1/.h  gc_^LK'PX@0~5%5%~%65%6|$$~2/./2.~1. .1 ~(g()+(W*)-,+)+g g'&g7U5g3535g64 64g 8   hWg"!#g / h/.1/.h  gc_^LK)PX@0~5%5%~%65%6|$$~2/./2.~1. .1 ~(g*(+,(+g)-,),g g'&g7U5g3535g64 64g 8   hWg"!#g / h/.1/.h  gc_^LK-PX@0~~5%5%~%65%6|$##~2/./2.~1. .1 ~(g*(-+,(+g),),g g'&g7U5g3535g64 64g 8   hWg"!g / h/.1/.h  gc_^LK1PX@0~~5%5%~%65%6|$##~2/./2.~1. .1 ~(g*(-+,(+g),),g g'&g7U5g3535g64 64g 8   hgg"!g / h/.1/.h  gc_^L@  ~0~|~5%5%~%65%6|$##~2/./2.~1. .1 ~(g*(-+,(+g),),gg'&g7U5g3535g64 64g 8   hgg"!g / h/.1/.h  gc_^LYYYYYYYYYYYYYYYAp--qq|a_^]OMFBA@>=98-6-630  qq~a`^\XVOM$%,&')9 +#"'&'#"'&547C&5434'>7267654&#"&#"33673>54'&'32654&#"67&674&'#"''65&547&'7327>326736;2#"'6%&+36732654'32654&'654'&#"'67&&'"'&5467&#67&#"'67&7"&5467>32%632654&'.'6326763227#&#""767>54'#"7&'&'ɸ#".'&56&546;232632&#"#"&#"#"'>54%&54>32.547232#"&546#"32654M&*L3k7'4"0!?C *bA9cV:G.6L }<}zN)}QPqS Y*I<J00BB00B"!/0 !1~gc7>6}#AOC> bhbN7'Y AG'BM(U(W5dLLT,zBgfj9N\kZE[ DaRTp** ! : G,*!S$IK@ /,On1?U!4/ @H(ei1 2 (@WD4+MO >44;$C&- Bu@ $H $',*!,  o-!(&),A4,*8!n   y*1[j%T )6'Z25@*/) *&.%h    /     ~ #0( $3 ,J .DFeDc9@T"p\0&;;q:C* Y<]iB00BB00 /!"01!! dd>Vn /Axj[TA 0+2632#"'#"/#"'&547"'&=4?&5476;267&54?2654/"57&'&54?27&'&+"63267654/"2?54/#";27'#&547327&#"%632"';2?4/#";2?#'#"'547'%#"'"'32?4/32?4'"'547<H5>/n'#)182BU?;:T#D /GN$,/k18 9B'Q8@$A5Rw#x o2 DQVw\L!f5]t]@ /#$|Z'u3 _6 0_H?ui7RzU4WR%5Ig%h*S]%W=T"#@ )TKe]:)*k14Nok#R5?'Q5d1/.:=;4>7H7yH -IN$3+#&?BU5E3 F@iI1C @M!=6 \r#ZB7K?+!F"~F#]sQA2,l3.e5~(o0p+c-Q5 WU5T/8AI5Ql2h&Y9.XURxf(*sfF. {+WwWf&w#V4Ii6 d_ #)/5;G@D>7620,+%$  0+"32654&7 632%676 &54%&'&#"77-'! ! [[[cc-66'&bUr-&'cc-66t&'bV-'&nm[ZZ[V-'&dc-66'%bVu.%'cd.66p&'mm d1_ %8K^q|@}{rk_XLK=8*"  0+4&54632#"&54657#"&54632#"'&'&54767>7%>7632!.'&'&54767632#"'.'7654'&'.'327>7'&'&#""32654&5#yW==XyyX==WyT<976M6}7&(<877679>(%8}6L778<(&7}6(/010/; 2"!/24"!/w;4Kr 5Kqp>A?[[?A>>A?[[?A>;TT;A?[[?A>>A?[[?A>3JJ34JJFQ:)):PP:)):Q6eie6d55c d_ &3CGKOS@SQOMJHFDA9,' 0+"#"&546323!2632#"&##"&54654&54632#"'&547632    T?A@[[@A??A@ZZ@A?xW=>WyyW>=WxI***;;+**+;;e6e5d72f5wV=>WxxW>=Vw>A?[[?A>>A?[[?A>[*<;****;<**q6e5ce6d5d4_K0+54'&5463276767632#"'&#"327632#"'&'&/#"&5476=#"'&'&5476763232?'&#"#"'&'&54767632Q-Z@AY,Q96&(=!7$)5(''(5)$7!=(&69Q,YA@Z-Q88&'=!8&'5)'')5'&8!='&88AJ,A?[[?A,JAv!j= 7&'=!vu ='%8>j!v@J-@?[[?@-J@v!j>8%'= uv!='&7 =j! d_ %2?Rex@xl]SJ@;5.("  0+4&54632#"&54657#"&54632"#"&546323!2632#"&#%.'&'&547632#"'&'.'##"'&54767>7>767632Q:))9PP9)):QI44II44I?A@[[@A??A@ZZ@A?,--  4.-_,,.-  5/,_,,_-.4  --,,_,/5  -.,p>A?[[?A>>A?[[?A>3JJ34JJFQ:)):PP:)):Q-_,.5! .--,_,.4! .----. !4.,_,--. !5.,_- d_ &3DUfw@zwkf[NE=4/)"  0+4&54632#"&5465'"#"&546323!2632#"&#%.'&'5476;2+&'.'##"'&=67>7>76;2#"&54632yW>=XyyX=>Wy?A@[[@A??A@ZZ@A?--/+*>?--B,--/*+=@--B.,B--?>*+/--.B--@=+*/-- T;;UU;;Tp>A?[[?A>>A?[[?A>xW=>WxxW>=Wx-B-.?>**..,,B.->=*+.-,,-.+*=>-.B,,..**>?.-B-t;TT;ZC>d  0+!#!3!_CC C_M;d_ 0+3!!%!d_C:_`;d 0+)7!!}%:_C;do!0+2&54$654&'"'6"&54632ōA]OkFTP~D^^DD^^NjoV5?h┣g^AA^^AA^d!7C @ =8*" 0+63747$54$#"4&#"3262&54$654&'"'6"&54632>[MpU+ U>>UU>>UK'XdUe@LbJggJJggt rC;M s;UU;;UUDЏk^x0:^IgGGggGGgd #/ @ ,'  0+"32654&">54&#"&54632.54632aaaam+,ܛmmmm)>=}~aaaaԔ\\ƛpmmmʔʭd[  @  0+ d8786Q8787877:H8d 0+%#"&54632.54632mmmm)>=}~mmmʔʭd_0+#{__dY_0+#Y__dP_0+!P__d"0+!33{O"_1d"0+!##d_{N2d"  0+!33!33{O1{O"_1_1d"  0+!##!##d_{N1_{N2^2d\0+!##d_{N\2d\  0+!##!##d_{N1_{N\2^2dJ_% 0+3"54;533#+"&54632265zooؚ\\[w{~jjz[]]5-d^ 0+%#"&54632&$54632bccbPOccc~~d_  0+%#"&546322&$546326bccb>}PO~11ccc ԕ~~{{d_  0+23246̈zܥMT__xrod_0+4%$5463 327#"!"&d_wd Zˈzܧ/d_5>a [?<8 0+2#"''67&'&#"#"'4632&547632327654&546654&#2632265432#"546"]UYMRq Gm9x5 3HG qi%=l/ bIb,BI D-:/"VigFPB 2|_~n.!.27pIl57.54665"@]`$vKO9A*1ꎿR-Z^ >$0 A3w)&# maGYP[! .l9CC/PYgD<#^aiL!#1)*1W- 11E:66d` 0+%$'&76%s:fd`  0+7$%5dq8z:d_ 0+#K_XWYWd_ 0+#YJ_XWYWd_0+#z_PQd_0+#߿{_PQd9_0+ # 9 !_PQd9_0+ # Y !_PQd_0+!_PQd_0+!O_PQd_0+#'7z_d_0+#7'߿{_d_0+6543!"3!"54dzqzX++Xd_0+#!5257&4#5!2O{}}p{++dr /# 0+! 4$32#"326323254#"'74#"372abTTl,/RN'%MR11g% =#~c%UCm&%&%mES).1 $$ dr 63 0+! 4$32%3276323!2=4#"+"54?654&#"abTT**IT9J$+_2:R ric%U:&vSD5FNk*>,&2 ކwgidr ><0 0+! 4$32%32763232632#"&#"3254&'654&'"abTTT&6V/4OUO#T?\m7N* 0NPpd\c%U#Z)235P-*#%lZvR$!"@~ ApJQZdr I> 0+! 4$32#"326323254#"=4;2=4+"=4#+"547654#"3!2abTTV.1..TC##C-f'  '6c%Um'#$&mL #" 2'.   - dr /. 0+! 4$32;2#"32$54&'&5767%6?4#abTTC_6U̓%%AR4 "c%U0.Ljw(#|5 ,P%dr 3 0+! 4$3232654&#"32632#"&547654abTTQVĿ|p?k%()O:68m$c%UCu\Ѥł|@"!oqmf i "dr '$ 0+! 4$32%63!2;2765&#!"abTTR?! 3c%UB$" M C dr "-8 @ 3.(# 0+! 4$32%32654&'654&#"%2'&546#"&54abTT\OzCSXNgGmaX?AUc%U$;?o{Zp!;bxFWEf#$*X4KL+)n?W_Idr 6 0+! 4$32>7654&#";27654'"#"&54632abTTfQVÿ}DCm>45#(*M:67n$c%ULu\ѣł~KM  opmgi "dr /?O @ G@;3# 0+! 4$32#"326323254#"'74#"37232>54.#"%2#".54>abTTa(+KE#"EK**^  7!q JKMJLKJK!;&%;;%%<c%U]b""#!b J% *+  joojkmmS^]UU]^Sdr & " 0+35733!! 4$32! 4$#"abTTopџҧM)+%d%Up-dr*8 4-&0+!!5>7>54&#"5>32%! 4$32! 4$#"L 8+XH5ziY8,9abTTopџҧvG9O%:H#5!t6_Bd%Up-dr D >! 0+! 4$32! 4$#"#"&'532654&+532654&#"5>32abTTopџҧ? ldz<|RUs?jkc[SQVS0ocX}8`d%Up-ӂwU+IFAH848:~jJidr ) @ % 0+333##5!5%! 4$32! 4$#"+gXabTTopџҧ+ƒid%Up-dr+9 5.' 0+!!7632#"&'532654&#"%! 4$32! 4$#"į;zQVo>`mm`.\TabTTopџҧf,XNPZ"d%Up-dr )7E @ A:3,& 0+"32654&.#"327632#"&54632! 4$32! 4$#"HTTHHTTMY-mu+;Hظ0babTTopџҧZSS[[SSZ| IRd%Up-dr"  0+!#!! 4$32! 4$#"u6VabTTopџҧYEd%Up-dr #/=K@ G@92,&0+"32654&%.54632#"&546732654&#"! 4$32! 4$#"'MWWMNWWb`mlQJGELLEGJTabTTopџҧKCCJKBCKClLk}}kLlyTTy7==7;<@ :3,% 0+35733!"32654&'2#"&546! 4$32! 4$#"nlb<>><:@@:w~~wy}}/abTTopџҧ$~'ovqmd%Up-dr  0+!5##7#! 4$328ɔabTT+),d%Udr*&0+>54&#">32!5!>%! 4$329,8Yiz5HX+8 LnntabTTB_6t!5#H:%O9Fvk*d%Udr(62+0+4&#">32+32#"&'32654&'26! 4$32T8}Xco0SVQS[ckj?sUR|32#"&'32654&#"5!5!! 4$32T\.`mm`>oVQz;ĿqabTT"ZPNX,Hd%Udr )7 3, 0+#"&54632"32654&#"#"547>325.! 4$32THHTTHHTgرH;+um-YMDbfabTTS[[SSZZ褆I Ad%Udr 0+!35!! 4$32ʱPabTT&EUd%Udr #/= @ 92)$0+#"&5463232654&'>54&#"2#"&546! 4$32WNMWWMNW m`blNELLEGJJ abTTBKJCCKKCTylLk}}kLly<;7==7;><:@}yw~~wy}abTT+v'~$ d%Udrc  0+#!5!3rQ=YMIHd^  0+!!!!!!  d?0+!d^ dd  0+!#"&54632#"&54632d^X??XX??XX??XX??X D?XX?>YYZ>YY>?XXdXAf0+!777Avz3m{X~Qdk0+ 555+dXAf0+'''%{Pmz2Q~dZ0+!5!='[Bar{KJd] 0+463!&546323##"&547!"&d@.%@/-@@-/@%=e.@.?D,AAAA,C@d0+!5!5ir{dZ0+!5!5 m VBdZ  @  0+#3)5 5!+3#3CCV2m||``st=dQ @  0+#3!355+3#3#3FFUU^ee#ύ###d(60+!!5 m tåyydw0+7 )d%Nd{0+ !f%iLnd_0+ d8_PdY^ 0+ 5%"'3!mV2jcjct3d  0+!"#67!5 mjcj V2sdR_0+ d)LNPQLd0+!55deeeád 0+ !!53 #5-@p9`S`Q. d 0+ !!53 #5p@p|`S`Q. d 0+ 5!5!7!!?t_ufɾ77td 0+!5!5!!4oU |fF_17>sd 0+%5!'!5 !!~Ek*gdlI 0+ 5!7!5!!.aF,Ii(0dV 0+ 5!'7!7!!'smm6_lx6V:3tPW*d  0+4&'326"&547463"MC\\郞۞I^=xKKx=d  0+!'7!5 !!mms 'll_kr4:(WQdb0+ !676! ! '&/(1\n\/'%p[nm]g d!%)-15@32/.+*'&#" 0+!!&547&547!!3'33'33'33'37337337337kD1hnnh1{J0Q)K/K֖K0Q/Q/K,GTAPRWFE.+d"0+%7&54767&#"&54767.MO4 *z`6:3:{)"ATW$!/ѱ('I.N#,8/GI2&;d-0+!7!5!'!!&547&547~?>a0hooh0*,GTAPRWFE.do"0+'%%&'&547327&'&547OL-3@$"'<6:2`#0 $V S>%3>E3:-&G0='(d$-0+'3'&547&547&#&#"67'&#"%632&N*,  3`l-6JkRa@FVieKIJD _T1-iWNJ857nd0+7"'327&5!!&547!!47- kkXȀ{@Aߒ{Xd[9*&0+7#7#"'%32?&'3273&547&547V@aRkJ6-l`3  ,F*Nn75~7Yg.0U_DKIKeidU! 0+67632!$543232#"#"54% #"'&'d01Zfm"bxM>>MxfZ10Z,+gqpg-+Yd?0+&547""&'473'>33&547ffj-VV-Fjff8C4;..:4Cd Q*0+#"=7654#"#!"543!23254/5432GQ#0O[,Y]QQY,[O0#QG:R /X_EE_W/ S9d]*0+#"=654#"#!"543!23254'5432GQ#0O[,Y]QQY,[O0#QG]  +MӏL+  \d!?!  0+!5!&'67!5!#6%$'335I@#aIIa@Ig|Uk} }kU|g?,Z``Z,.jllj.d = '0+4&'326%4&'326"#"&547463263"#"&547&MC\\JMC\\l郞۞I^^^==xKKKKx==dP @ 0+ ' %!!dJ ~Id& 0+$5&#"'67rTl-8"p&w'P)d&0+$6%&#"d8-lTr)J'w"dX 0+ !!{yN'6d30+7 dB,DU^"j~$d30+' 7D,B$"^d3# | d3# | d+F0+6767&'&'&'&'6767BefuufeBAfeuuefBcۣlcڣ7vefAAffttffABefףplףpldWT 0+3!!+33342 aa+2'$6dWT 0+#'>7!!'>7;#1A4 aa+3I&%6d7_# X# , d[ g 3+dZ_#3+3+dC. 0+&547#";!"&=4&+5326=463K20IC5UU5l>>lmGСBk>DdW0XdtsݓdC." 0+7&54&'>5!2;#"#!532654&+I02Kl>>l5UU5D>kB0GmstݔdXЎWd3" x: /3+d3" [x /3+dd2F  0+73!!%!!dS"dd(b d#] d  @ 0+% 5-Yo|e_y_7yd2 0+%#3 5nnlE2/d2 0+73% do(CpM2`:d0+7 7dacӄhHd0+7 'dac.hHSZd0+7 dead0+  cdcZd0+5  5dde9[dW 0+ ! !!5!hqSQa+dW0+ ! !hadgr)5 0*'! 0+!67632#"'&'!#"&5463232654&#" #"326544WuvyyT3Q3QyyuvSO9:OO9999OO:9ODC4UyyR3BC3QxwS89OO99PP99OO98d 0+!#654'3!54'3#65%!5!8$$$$8$$$$8"bhXXjejXXha_jXXhhXXjڲd~a0+!!#6=!'7!5!'7!54'3!!-5"$$$-$-$$5"^hXXj\^jXXh^d_0+ PQ=__Med_0+ QPs=__Med"0+ `d? "FAV~3+3+df 0+3!3!!#!#!5L3ͨ--Ӫ--df0+333333#######53Ϩ---Ӫ---dO0+7'7%%'mH QHHQ HOtNMu''MN'dHP6#NTNd0+% %9?>;;<<d0+ 9>>v<;d0+ ! ??6B43d0+! s=<<::z,"/" 3+3+3+QA"Od 3+3+3+c"/Yaz3+d"3*/ 3+a,K@H! 'Jp~|^SK\K_XL"%%"q +432633"!'>5!"327#"=ik4J&#ip4ddɶ+G$xBOs~KP Z-ʻ#hf\;"DIP"W 3+Xi.>D@A6"J Q]SK _ TL>=;:98aQ +!4'3&#"526543267"65432767" 3#4&#XfsQ<|d2i{59mk.,vp<(D#C4'fwKvOlPUZ ZթTZZQ&Z ZiXi84M@J, JHQ]VK_ TL43a" +!54'&3&#"5254#56776543267"3#4&#5 :Lo[YqcǐF;Z`*nJv}`Kv:$+T9JOZ ZO2O'c}\P[Z{zsXB4@1JG]SK]TL  +% 7.!#'67!"'67!27& Z\+f/Jf#\5f)BhQ  \;D T9`PN>@; JHG]VK]TL  +!'67#"'673!27 7.#`vv$?|[ET( ]{hU"@t .Rb Z$ CT V+C 4~= #@#JK PX@*p_SK`\K_\L@+~_SK`\K_\LY@"  $ +$7.#"3#"7632733253!"'i|o_}\~o+:}Xy,7peҷ$]ҶTT|}?<=@"8 JHKPX@']SKTK]TK _XL@*~]SK]TK _XLY@;9'G2A + #&'3&#"52674327 5327"#"&5473254Pi::6qS+fG J8i~e@O@e@jJp_dd^tEENgCZ ZMSN9Z #lH;R Z;Qe'JNY 9@ $" 3+K  I 3+!LmK PX@HF ;:%#  JIKPX@HF ;:%#  JKPX@HF ;:%#  JIKPX@HF ;:%#  J@HF ;:%#  JIYYYYK PX@2  p  p] SK ] SKTLK PX@.  p  p]SK _ SKTLKPX@-  ~ ] SK ] SKTLKPX@3  p  ~] SK ] SKTLKPX@-  ~ ] SK ] SKTLKPX@3  p  ~] SK ] SKTLK)PX@/  p  ~]SK _ SKTL@.  p  ~]SK _ S LYYYYYYY@KIEC@>8760/+*)  +"654#4&#4&.#536767&'.#532763227"632"'65&#"-2+*AbBp3Io#32/ W=9B%JCU+%-]HzZiH{vi|.&Rv<M#,D0#(1Z  Z$4#e秡eZ Z$\$f7,KPX@ )" J H@  )" JYKPX@"_VK _VKTLK"PX@_VK _VKTLK1PX@ _VK _V L@  g _V LYYY@,*&"" +# #327"'327"!&#"Lb]!NEEM!!?BBLy[ {(R>NZZ1SNZZ2Vtn h%{K PX@%JKPX@%JKPX@%JKPX@%J@%JYYYYK PX@_^K_VKTLKPX@_^K_VKTLKPX@_^K_VKTLKPX@_^K_VKTLK"PX@_^K_VKTLK/PX@_^K_VL@g_^LYYYYYY@ "! +4'"6654#5327"#&''63?G u\hEjIqÆzPZ^e&$&Yq/ ' =s^;nC%Z[bw .eZk{ ; ʰ3+O:#R 3+L 2 ɰ3+d***L@J*( HKPX@_lL@W_OY@ '&! +.'>#"'&547367654#567W..//l 0D^$")(?2|P*.//.-h-c@P!%B)/:; 2dnbU% JK PX@g|LK PX@gLK PX@g|LKPX@gLKPX@g|LKPX@gLKPX@g|L@gLYYYYYYY@ A@ +327">54&'5327"#4&.#d3WI0],&c+ 6w#%&-TA1BB2M&j `"F:'0B@? $# J~c_[K_\L'&'*" +3272"'4654'732654$4$32'"!"7oPx@&h$P#d!~P'U$ $ {bҾMoSɲX~ _@ JKPX@]SK_TK_XL@c]SK_TLY@ !$!E$ +'67!"'67!27 327! #"/S]#\5f)Bh%M蒌o \HzD T9$X P 0+'674$4! 7$%F CawYPKj1Z8%y&w|aQ=V  V+ 0+%5#"&54#5%3274#5%! 673 54'&q=xvNDC\LB%dtm_N%CDc3RGSZ ZS;SZ ZST(i@H(o0+$!'63&'&'7!27";M]pӽe%8F1jPYp d{{\ Ý V=QU! 1)0+4&#"326676323&#"527&#"#"5432&R[Pit%lҳTh,t_^wJ c*K@Nu;SZ ZSC׽?<0+%3&#"525&'7!2%"$Hۊ\k%BP1jeAPYXZ ZX ͝ V=QV {%# 0+6323&#"527#"&54#5%&#"32Ƚrvt_^wëvNDpaJWNSZ ZSđW3<t/A_0 2/"0+4&#"326%5#"3&#"527ȷ632632#"R[Pit/9Ju_^vhҗܩ|>w99SZ ZST(iJZZZNo#  0+!$%3&'7! 7"2&#!# 32R# $%LZ1jPYoooP W Ý V=QD hf1ךQ&V A5 0+%4#5673&#"525#"'&'#"&54#5%327&54#5%32 fΔr]\tq=x; xxvNDC\NDCR(f_WRZ ZRCDQ$c3R;SZ ZS;SZ ZST(i@HK%$0+$%&!"67 !$'47236!"'4"%8Z1Wpj   _YP ͝U :7?Q=V V%!0+4#5%3254#5%#"'3274'63!.ND\CLBvxak +8wj3UXo@b`#L;WIDL G^W W 0=W (t/%Z)1+0+&#"3&#"527ȷ6323274#5%5#"&5@\nu_^vhҗhC\L8jyxs;SZ ZST(i@?30+&#275#"54325632&#"6323&#"527&#"HLIasN*^xQKzl ht_^w\]1lRe9FQ=$.{SP_F;SZ ZSFp\] dX@]SL +!!#dVRed)  3+d&)  3+ d!%)-159EQbs/@JVUHgfGK PX@Y e  eee g  e  ee_VLKPX@[  eee g  e  ee]UK_VLKPX@Y e  eee g  e  ee_VLK-PX@^ e  eeUe g  e  ee_VL@_ e  eege g  e  ee_VLYYYY@*qo`^PNJHDB><9876543210/.-,+*)(&%$ +4>32!!#".547!5!&!!!5!!!!5!!!!5!32654&#"532654&#"467.'654&'>7#00#=#00#<<ww`HH888 *TLVA-6TLVA-6M0##0 g0##0g mm9ll,mm(w<&9>7,,(w;&8?7,,d"! #x# 3+а3+3+/3+dz=# R R3+3+d ^,D@A+*(&#'%$"!  J,)HGt +77%%%%%'7777777'@+ 8(:|Aco*d^s.2Iu,Y,&c0\% K':pqG t6z@'6%!%2QDA?T<E; Td)a@Jt +7#7s,(.a_q`d)a@Jt +%#'-(,sa`_rdjo"ax`3+3+/3+dOj"a(wP(3+P3+d.JK/PX@eUL@U]MY@  +!#3.춶|^^d.JK/PX@eUL@U]MY@  +3#!5x|dfXJ*@'JU]M +!!d-#f"ndiZJ*@'JU]M +!'7!/#iQ"ndZ*@'JU^N +!!" .%/'idW*@'JU^N +!'7!W8+ %kTd[>KPX@a]VL@eU]MY%!%  +!"3!!"'&5463!?,,X?j{VU|k,->?XVT}{d[>KPX@a]VL@eU]MY%!%  +!2#!5!2654'&#!dk|UV{j?X,,?{}TVX?>-,d,@# D d,@#  4dt Ű3+Ű3+d 3+d#J~3+3+dg#x#x]T#x]#x]x-/3+/3+/3+/3+/3+dD2Z@J2,& GKPX@~_[L@~W_OY%#  +%"'654'"#"'65&'&'&'&'676767q/Q*@ N ( 8877lk0&Щz6DQ7887|!gd 2 d\ 7MM@JC#!,+)(%  0J H321Gc_SL74"! +3&#'$%5767357&'67'#&'5&'.5467675R7?+&v )YaX5;YX_(97oD5/!\\Y1YooY20nkkn0R @Q70VYYX^3`A3b ab j*(%yLX 7K 3qq4 4qq3dT 3+3+d_Z  0+%1..3PPZ{[*X|)N+daZ  0+'7'77'a1..NNj`|X[{)*d Z-2@/-#" J_$K_%L$$4"$4$ +$24$#"'6763 ! ' !2&#"36d9ffR C.~\Vh-CRhYô&څ$3—[ 3I@X0yXGB0H@E+ JH_^K_TK_XL&(("! +&#"3&#"527ȷ>32#"'&5473>5P 18Lla 91RZ ZR.R(f_FYűxZ|0&8?!~}5*;"7v> >3+P+,.b@_ -,JH~|~d ]VK_\L..$!$##" +327# #56!632#"&546732654&#"'9S=z_e`Ym65W|O}%n4AeR" +z^O^텔-L4Q/F@CJpge^CK ] E L/+$"%A +7265432%.#"3276754'&+&'"Qz/:b1 6M)YO73[-3MM1-W52~B)VkuXHV h'\DMQYRV  FP/@, J_IK_KL%'%$ +&#"'654'73674$5%27u> g4nhbSKNAY 3"eH>d ?8@5> H e ] TL987321-,AA +!!773&#"52654/!3&#"52654/!3&#"526767;u6'~PQ\;Q E4'~PQ\;Q f;TJAGTp):!$bZ Z!0:}bZ Z!0:;5-Z Z1;$Gf@JP@M:6A) #J~ _ VK_\LIG><"'$"#$%'% +32732767672327#"'#"'&'#"&54$54&#"#"'467267$54&#"\N/b\N/b cB(F&h pjJyj$J"He_[K]TK_\L$*A"$# +!%#"32$#!3&#"526767676! ! '&uAkf;TJAGTpC<0E&DVH,M(L;5-Z Z1;$JAYYDfY 4Q@N0, J~_^K_^K_\K_\L#"'"$#'$" +4&#"326%327632#"'#"&54$54&#"#"'4672?R[Pit_\N/bxj@;He]SK]TK _ \ L1/A*A! +!#!3&#"5267673264327"! '&Baf;TJAGTp(p1~SLz-?׍;5-Z Z1;$1B%j-XZ ZvRَ7fv,5SK PX@  5-)'J!H(GK PX@  5-)'J!H(GKPX@  5-)'J!H(G@  5-)'J!H(GYYYK PX@!~_VK_\LK PX@(~~_VK_\LKPX@!~_VK_\L@(~~_VK_\LYYY@ &$$#"'! +%#"&54$54&#"#"'46723274#5%5#"327τjQYLIJ/l׍;5-Z Z1;$r81$Z Z5i=6f1@-)# JK/PX@-~_VK_VK_ \LK1PX@'~W_VK_ \L@+~ W_VK_\LYY@ 1 1"#"'%% +327&'#"&54$54&#"#"'4672654#5327"\N/bvh pjQYLIJ/l>3& +%׍ -l$e;5-Z Z1;$!x81$Z Z5i{p\m_f7:K1PX@%!90 J@%!90 JYK/PX@:~  e_VK_VK _  \ LK1PX@4~W  e_VK _  \ L@8~ W  e_VK _ \ LYY@ 88 8:8: 7 631.-,+*)"#"%#  +#"32754&#"#"'46723654#5327"3!#&'#"&5!7N/bRb%\ ǣvthEjIj%yh pjBD=Q3@f V[ eE׍;5-Z Z1;$lK@YW  WerrKO;%OK2f@K PX@(# @: JKPX@(# @: JKPX@(# @: JKPX@(# @: J@(# @: JYYYYK PX@5~_VK]VK_\K _XLKPX@*~_VK_\K _XLKPX@5~_VK]VK_\K _XLKPX@*~_VK_\K _XL@5~_VK]VK_\K _XLYYYY@=;&2#"'%% +327&'#"&54$54&#"#"'467254#5327"#.'67326?\N/bbVpj."Y>!|:exuh?k Z144wnZ Zpr4+*A .@+ JH G_TL" +4#5673&#"5257fΔ'r]\tوR(f_?RZ ZR1?z."/$3 33+)A"O&z z3+G"2^&Q3+>'2@/ e_^K _\L%#### +!&'&#"#73676323##"'&%!3276 4ER[A0خ'hd)u͔K=EPi:15QivX{}v{Savc= &+@(!J_[K_\L"$%'$" +#"32$7&'"! ! 63 o#3 Vi&$PM(eY0;O %9@6 J_^K_^K_\L"$$'$" +4&#"32665&'"#"543263 R[Pitkpf y { !Sz׽?mv= #22O#RRX"3#g g3+Dn"S 3+ D@    +/9 JKPX@7 p  g g]SK _ TK]TL@5 p  g g  g]SK]TLY@DB;:64$A$a$! +32654&#".#532632"'3&#"5265&'"'473654&5>39Rͩ@[B\a[xY2y_1|] ;\Qi32#"'3&#"527&#"'473654&5>32HTEeQorR\oh] 'RQi#P@0-::>DXZ ZC97jYN`VJd >aHw+z ?G@64  JK PX@1 p   g]SK _ SK]TLKPX@3 p   g_ SK_ SK]TLKPX@1 p   g]SK _ SK]TLKPX@3 p   g_ SK_ SK]TL@1 p   g]SK _ SK]TLYYYY@ ? ?97#Aa% +>54&#"6.#532632!3&#"526=#"&5465&'&5672uq@[lB\a[V2y_132#"'3&#"527&'&5465&'&567232654&#VeQo~R\o_k\w7 v'SFz\@E0>#P@0-::fXZ ZCGR\uNd !;Z[VPCnϵ =F ;@+*13-:9JK PX@1~n|c_[K_\L@2~||c_[K_\LY@ $%(%#$" +#"32&#"&'6767$'&! 632%327"'&'7OQKkF0%:ɶR=C%&Ϊ^N*U(S3X_/FL85iCR*(w4 NO"T 3+="4 < 3+O"T S 3+5K3@0 J~|_SK\L""# +65#"!3"!'ƶW #ip4dd՛%Z-A8@5 J~|_^K\L""# +65&#"33"!'0ӊ}^gמ8a-=aM^ EN'd *~@ %JK PX@+p|o_SK^TL@+~|_SK^TLY@ %"&& +%3>7#!#7!'67&'"'%!654'47MZGAd?&w  tܖ/BHrT k] koe ,@ 'JK PX@%~o_^K^TLKPX@$~_^K^TL@"~g^TLYY@ %%%&  +%3>7#!#6?!'67&'"'6%!654'47IGAd?ˊ{G+%v  Y>ܖ/BHr~l:*Sh}] vko!h"9 3+:1"Y< 3+!FHx@H:($ J40HK)PX@" ]SK  ] TKTL@" ]SK  ] T LY@EDC?>=65"AA +#4&.#532%"7'.#5327">54#5327"3&#"5267FLUN%:W7654&/3&#"52765#53&'327"3 q9}^$^v_oyjMܙ_+[ U[.+Z Z+6Y9iKZ ZK (iN " 3+z4Q@NH~g  e]SK  ] T L4432/.-)'$#2 +4'327"3 >7654&/3#3&#"52767#5yjq9}^$^ v_o Fg,KZ ZKҏ_!e s0+Z Z+!-s8 " 5 53+Sp'!qK)PX@JH@JHYK)PX@a_SL@~a_SLY@ #A +3&#"5265ȷ$!&563 *~-eę 7=i!iWZZ_g7R&MyAy? d!X@JHK+PX@a_^L@gW]MY@ #A +3&#"5265ȷ4#&5632*Y}~pX-eęT |77QCPPIP[wD;]3/> S{"%@"J G_[L"  +5$4&'5654&#'654'632s[O WTl Pɥث1X:X'͇y+)MP@ G_^L +5$4&'5$4'&54!uXdBD2Cc^wSq? j"?eHBF'#-@@=) Jg_[K_\L%$$-%-)($ +$54$32!"'4654'732654%56"654&껮&h$~`dtcI $ {b`E3oSY_^ &A@>  J~c_[L%#  +2#"'67265'636754654#"<T7;(k4,.T?)AIɆyRH$y6{`v@'@$JGc_SL$! +'67#$63'$ L _W(# @q7 wdTU%@"JG_VL$! +'67#$63'$֯ I '$}# ;g\ Gm^LdF@ JGKPX@_{L@W_OY$ +&'27#&'>3'6aOU F R rs1 \v1/"O7 ?d@a;:0 J%#H G~_VK` TK`\L ? >#&$$(#! +&#27'7#"5#"54324#567;54'6323267&#=LIasg)hN+p*^xf* C8qlJ(' S)]1,))$.;R[m_eduL W7C,|OXA/@JH,&% GK PX@`TLK PX@p`TLKPX@`TL@p`TLYYY@ 63%H +4#567;2754'63227>7&''7&#"525fΔ3'DC8qlX0,"Qd)fe^vوR(f_L$owL W/58Z ,) ZSP L^K PX@>84 [ZO%J6 H]-) GK PX@>84 [ZO% J6 H]-) GKPX@>84 [ZO%J6 H]-) G@>84 [ZO% J6 H]-) GYYYK PX@7~  _  ^K`TK _TLK PX@7  ~  _  ^K `TK _TLKPX@7~  _  ^K`TK _TL@7  ~  _  ^K `TK _TLYYY@ ^^XURPKGB@<:32/."#"#6 +%'7&#"525#"3&#"527#"3&#"527ȷ>32>32;2754'63227>7&d)fe^v>Q t_^w9Ju_^vhҗ;Fj@zo1'DC8qlX0,"Q,) ZSn(?@;SZ ZSl%SZ ZST(i@HFPDIK;$owL W/58Z PEK PX@%!A@5 J#HC GK PX@%!A@5 J#HC GKPX@%!A@5 J#HC G@%!A@5 J#HC GYYYK PX@1   ~_^K ` TK_ TLK PX@1  ~_^K ` TK_ TLKPX@1   ~_^K ` TK_ TL@1  ~_^K ` TK_ TLYYY@ED>;86&'"#6 +%'7&#"525#"3&#"527ȷ>32;54'63227>7&'Ge)fY^v9Ju_^vhҗ;Th,1'DC8qlX0,"V,)" ZSl/SZ ZST(i@HFNu;$kvL W458ZPH.E@B%#-,)'J G~^K_TL&" +3&#"5254#567;654'632&''6qglXWnač6,%JHYW<&YB\[\5NZZN N&az[A95X;P"b*cQZEKPX@ 1+)7-<JDCG@ 1+)7-<JDC GYKPX@9p~~^VK_ TK_ TL@7p~~^VK]TK _ \ LY@?=*qa% +%&'&!'>5&#"3.#"526543263654'6323"''0$^&=4dGKEi75[\`-@!יI[C8ql:-QWb)?4V^ąDNNY|mAE EXL W: '',)FP z*y@)('JK$PX@%~SK]VK_\L@"]VK_\LY@ #%#" +#327# #563&'&#"676323#'F9S=z_e! I"#Y<M&n4AeR" :'b $RtC!hO*5=bK PX@=42$JK PX@=42$JKPX@=42$J@=42$JYYYK PX@(~_^K_\K_XLK PX@,~VK_^K_\K_XLKPX@(~_^K_\K_XL@,~VK_^K_\K_XLYYY@ )%"$(!) +7&'4'7&'&5463227#"'367"&54&#"65432654'8, W!J)5ܬ@XDA$*2-P?3% dZ<EtrZi#LT QZ  bf7:c.  0M /W 3+qKH O 3+Sk4@1 J Hg_[L'! +#"#ȷ>323 '+9Jhҗ;Th,{/T(i@HFNu!W>hk 6@3 J H_VK_TL'! +#"#ȷ>323 '@9Jhҗ;Th,{/l/T(i@HFNu+W>Sn3@0 JH~_[L$' +#4#567632&#ač<-s0>N&az[6ݕ*uDn 3@0 JH~_^L$' +#4#567632&#ač<-snFN&az[6ݕ*u9E8@5JH_[K_SK_\L##"!! +%6722%! 7$b3 q B / !V zf{8@5JH_^K_VK_\L##"!! +%63227+27$gZ)憶鼝 )/=UL#d0 3+d~3+3+dT 3+3+oi .JKPX@ [L@ tY$! +#&'632i&,HJUV4#8@fFw 5JKPX@ _[L@W_OY$! +#&'632A&,HKVV4#: 9J5 *9@6H  e ]SK]TL*)&%A2@ +327"!4327"3&#"5265!4*?k.&iv*g13c ld-^2oZo~ZZ}:hZ Zhs/QA#O    3+d.ux /3+Xn{78@5J Q]SK]TL32AAA +3&#"5267654327&'.#5327"3#%&' :`F9[? ?yB=R  <`DSN91rKY9N.$Z Z&&`]MZ LhS.,Z Z$#0tqg>kPi"Q _"&;3+"F3 ְ3+O"F\\3+XB"K113+5rB`@];JH~  e ]SK ] TL><8610/+*)&%"!  BA +327"!4327"3&#"5265!3&#"52654&#"#&'463*?k.&iv*g13c ld-\.cj!m22oEh{Zo~ZZ}:hZ ZhjZ ZrƐsL$RidW (r@(' JK"PX@%~g_SK`XL@"~gd_SLY@ $%$"%! +&#"367 672!267#"37[? wp IB=9SpCW#{`b8,mmD$UMp"/f  x  3+5':@7#"J H G]SK]TL&6!&6  +%3267&) &'7;#"'67) 7.+yMPZE= P`=}yMPZEB&= P`=}<;=v:d<;=v:: .h 3+ 7 3+h9y@5& JH0 GK$PX@ ~  aSL@%  W ] MY@9821/,1"! +327"54#5327" 3&#"5654'3&#"5267 .#8-vmcXQMM^01KBarz:%IDHW]?U;ZE`;(C;``@gVUM?` `95p R) ` `Wj\ts`Sp% ;L@I! # Jpg a]SK]TL87AYa3#$0 +3267.#"3265!"432632!"'&#3&#"5276#BzyBUzHP>0heY/鳸'miٔjg |v_X M//ZZ024p+"JKPX@+~na_[K`\LK'PX@)~nha_[L@*~|ha_[LYY@ (#A$ +$2654&#'$7&'"3&'525!2"'47WQv HQrqQptiQcpi; RZZRV4^= _Op{d|K)PX@Ue]MK-PX@ee]M@!Uee]MYY@34 +654'33!2653#4'&)"d Z&;{^ZZ02+.|zT<2miَdy|UAEn@k@J5 H G    g ee_|LBBBEBEDCAA?>;:96430/,+*&%$21 +3&#"526=!3&#"5265#'73&'327"!&'327"3!!5"66_55`59@$5 :{9 <7Z;|7 ?#>^E,BB,QP-BA1M%R BB#BBRAAdp|2<@9/.*)%J_~K_K_L##"&#(&# +4'&#"3276?65.##"'&54763263227#"&#) ($.?-(79??wlJR@MzqDFu0J?2Thpf;*65#"'654'7;&#"'6732%"3+F4e03QQ50iS£+Q9 @f=1 ZVP^UQH`)mZL\{pd )9@6 Jp|]SK]TLAd" +&#"&54$32327"3&#"5267E[@qu]Yx[a\B1_yՈ2P+$$ ½ W;Q}lZ Z\d;D@A;"! JG~]SK ] TL8432AA3 +&#"5265.#5327"6734&'5327"3&#"4O@e~i8J Gf+Sq6:c:iPaS@nFX@e@Yl# Z9NSMZ ZCgNEEtG2Z Z=>eQ;Z R;HdpFK"PX@a]UL@gW]MY@ A@ +327"3&#"52764'&#p|zT<2miَ Z&;^ZZ02B+.d =X'JK)PX@] SK]TL@a] SLY@:9AA +65354&'5327"#4'&#4'& &#"52>53V&#T“>QYLIJ/l# `#“>QYLIJ/ls#(`#l;[81$Z Z5i=l?=lEr81$Z Z5ij=l3*p7U@R7) J3/#HG~c _ VKTL5420.-""" +%3&#"5254/3&#"527 327"7654#5327"FWaWY!44?W[XWm;8:JNABec$NAtrOO>غ`Z Z 1?Z ZKNNZZ )x0&ZZIda)9@6'J_^K]TL#! )( + &'7;54$323267&+5654&#"#_??%X4]v7Y&>?aQ龍ZbnF FnϦ~̐d  0+&'7>7y#'' 8 y#. Cd( 0+'67>L('=-,(dv0+''73v=AςB|{Adv0+#'77A=A{|Bd#0+"&#'672367hn:n-A+FW}=m*2<MO MTd$ 0+&'767&'76;Ip CRsLa#3Mg ]& je%pdg 0+'672'672hF5hGBG)_Q9!l "\r dd 0+&'6767[S.EG/˶rrd 0+67&'&d]\1MC+$trd?  0+32#"&546#"32654LLkiNLi$$13""4?[BAZZAB*,-d8A0+#"5>74##&'67239s?1 63 .D -*C $Gdl+/$ 0+&'&'&'67676%&'&'&'67676 '' (( '' ((+W )5^">5'.#5327"#"&5432#"32$'&! 2!$7! !&'47>76Ug*Rm 1E8:g&b{{%:ɶ,Udc_Me_6F9[%+P[}bJ+PP<0ѐ!WPN*D/FL8-HHdMb4< !&W (Q%#"&54#5%3274#5%#"32$'&! 2!$7! !&'47>76 2q=xvNDC\LBmj%:ɶ,Udc_Me_6F9[%+sCDc354&#"T0do r83-%9S=z_vPq^_C@.\HJT`@Mt4AeReKW}a`DZ8 4R@O'!JI~gc_CK_ KL 4 4.$!$$# +54#326367"##&'676767&'&54!  A'"Nئ]n5a230XwR?ғf&>*Cq)32/(zv=A@>9) JH _CK ^ EL=<6540A"0 +327"7654#5327"3&#"5654/3&#"5267.#&c\I$%ITJEA@mx(*?7R_g1pOK=9=IN5ܲ2L: L&s?2n,&L L*82)LL%"Iok/LL9EK?W%-<@9~ g]CK]EL-,#$AA +3&#"5276=4'327"3 >54'2c_َrpT<rڲE1do6M^ZZ02+.Z Z&  +yj  #.7@2/%$ 0+5!&/67!!&'67326;2#"&#"#"'&'7!R2oM N;%%"` r{jfCjo<4B}\tb %GS:IGR>FJJQ>FIxBBǚ::?>:2dI 0+25&'43$5672d<[ ]74'&+3267$!"526767&'3&#"726765.'5HfĖ@T?F>T5Fp_PR81Ujѩ6Z>!fk||F  TJAee2J;I]PU&r7!1S A7umOÞ Z!0?; Z Z1;ZU!&73&#"52654'&'#3&#"5>731?xoLqCC}NEnF_m7< a!',bb(4m/ bb<FK%67'&'#3&#"5>7327.#"32674&+3267$#"52763' 'lcBoTHE!;\w #?$f3aT}`< >k'b.q3C:mrs)=)` 0m  bbA x;+Ju[c' Ab E33773&#"52654'&%#3&#"52654'&%#3&#"526767ذTذTt6'~PQ\;`E4'~PQ\;`f;TJAGTpP{P"$bZ Z!0?}bZ Z!0?;5-Z Z1;$G L43%#"32&'#3&#"526767676! ! '&ذTnf;TJAGTpC<0E&DV7P~M(o;5-Z Z1;$JAYY9 63&%#3&#"5267673264327"! '&ذT_`f;TJAGTp(p1~SLz-?P;5-Z Z1;$1B%j-XZ ZvRَ723'&%#3&#"52676754&'5327"#4'&ذTfcf;TJAGTp “>QYLIJ/l# P;5-Z Z1;$r81$Z Z5i=l$:83%#3&#"526767654'5367#"&'67267ذVxPf;TJAGTpDroooXsHNeXv)>eE:;5-Z Z1;$lK@YW  WerrKO;%OK2d% MB!0+3&#"327 '&7676!&#"!2#!327 '&'&57676'I$&ڟsr&$$I̸J+I#&E;f#+2"#$IUyR+-o Ks?S`V358bV&Sxd*  0+$67'6]+vt(Hwk]wmdz)\ @ A.$ 0+"&'467'67654&654&#"&'>32632#"&'4672#332654'#"'\5Y<2:~Q$76Z|%Eb.3$/ |un3ssXDDPP<WLt-0= _F9L{lX>3Y~<*[j®p(l~vgBq]A:R$TS 95d+7 4.("0+74&#"32632#"&54632 #"&54632#"&54632dZEPy ,EL7@Y/-"+.!)-"+.!)8^O. C08IXEwԆkJ$.2!#.1$.2!#.1P <JMLKB0+!3&#"726767327"!4327"3&#"526=!#"53265!> T^Aee2J *'G|>j7&iv*g13c ld-\ՑOBo^=; Z Z1;_IZ ZgT~ZZ}:hZ Zh#7de@60+#"'67) 7.+!4327"3&#"5265!#"532654yMPZEB&= P`=}&iv*g13c ld-ՑOBo<;=v:7~ZZ}:hZ Zh#Wd UI=0+3&#"5>5#&'3&#"52674327 52767633"!'>5!"XFn@SPi::6qS+fG J8i~e@OE6D#ip4ddɶ+G$Pe>=Z Z2GtEENgCZ ZMSN9Z #lH;R Z-dU*$0+! 4$32&'&#"327$#"&54>32j^\eWLN>~ѐfVQOf$V\7_tV*Eu^RUHbZd# L =# " M=# =3+=3+3+ 3+d# M ># " L># (>3+3+>3+3+ 3+d2 7t?0+2#"'!"!5 5!3!5!!5!"'&#!+"'&54763232763!>O@E23o.ZCT=/)QX=Y[|a2@BQ lGNYf UtP8"L;#p[ԌŒ op2_6MzOQ\  PdE4>d R , 0+%3265!"53267.#"754'3#6=&'&'#6=5267454'3676zHP>#BzyBUP$$y~鳸$$<5$$8~)0hoQ$$>F|wjg jXXhY^MtrhXXjhXXjZv_XjXXhT?54$32&#7'3&#"5265!3&#"52657354$32&#`~ vz.*h\Lm+*h\Lm+@d`~ vzȘTFf4 jRZ ZVd6jRZ ZVd6fTFf4 T:2!3&#"52657354$32&#!673&'5254g{*h\Lm+@dj~ vΔrquptJjRZ ZVd6TFf4 P_gRZZRT<A.#"7'3&#"52657354$32673&#"525.*h\Lm+@d̏>r]\td jRZ ZVd,')[_KRZ ZRTPP3&#"5265!3&#"52657354$32&#!54$32&#!673&'5254#*h\Lm+*h\Lm+@d`~ vz"t~ vΔrquptfJjRZ ZVd6jRZ ZVd6fTFf4 TFf4 P_gRZZRT\UL!3&#"52657354$32&#!54$32673&#"525! 7'3&#"5265*h\Lm+@d`~ vz"֙>r]\t.*h\Lm+JjRZ ZVd6fTFf4 ')[_7RZ ZR jRZ ZVdT.4#"&#"5265#5656$32!#327# #56*h\Lr&dd9S=z_вjGZ ZVV6f|xt4AeR"{ Bm@j9 12J~ _[K_^K _^K_ \K_ \L?=8753"%'!'$ +&#"#"'4'732654$54632&54632!#327# #5654&#"%JFKIJJG@'/-)C9B#> KIJJGYKPX@5p ~_UK _VK _ \LK1PX@6~ ~_UK _VK _ \L@<~ ~  |_UK _VK _ \LYY@TSOMHGA@=;"+"$% +5#"&54#5%327#"'47463"'65&#$73274#5%5#"&54#mjq=xvNDC\o Fb~bh@#+]EC\LBmjq=xvmPe9FQUCDc3<:96410"$#$%  +#"5#"&54#5%327! >32&#"525#"3&#"527큂mjq=xvNDC\xw~9vrt_]u<76$$#$%! +4#"5#"&54#5%327! >323274#5%5#"&=#"3&#"527큂mjq=xvNDC\xw~9v^C\LBmjq=x8 9$ 9D99F89G89H89R89T89V89X9 9 9 9 9 9 9 99989898989 9 9 999898989898998939H89`89b89g99i9o989 9 9 9 9998989 9 999 9 98989 989898989 98989 989 8989898989899989L9L9 89.9389489589689798999<79G9I9J9K9L9U(9XJ9Y89^89a89b89c899989899 999#89%89'89)89/89y8999999 999 9 9 9 9 9 9 9 9 9 9 989898989999999999999999 9=999E9 99 89 89 89 9  9 99  9 99  9 99  9 99  9 99  9 99 /89 189 4+9 59 989 ;89 S89 v89 ~C9 89 9 8:$ :D9:F8:G8:H8:R8:T8:V8:X: : : : : : : :9:8:8:8:8: : : :9:8:8:8:8:8::8:3:H8:`8:b8:g9:i:o:8: : : : :9:8:8: : :9: : :8:8: :8:8:8:8: :8:8: :8: 8:8:8:8:8:8:9:8:L:L: 8:.:38:48:58:68:7:8:9:<7:G:I:J:K:L:U(:XJ:Y8:^8:a8:b8:c8:::8:8:: :9:#8:%8:'8:)8:/8:y8::::9: :9: : : : : : : : : : : :8:8:8:8:::::::::::::::: :=::9E: 9: 8: 8: 8: :  : 9:  : 9:  : 9:  : 9:  : 9:  : 9: /8: 18: 4+: 5: 98: ;8: S8: v8: ~C: 8: : 8;YA;ZA;\B;l1;x;{1;B;5A;sI;E;;!A;"/;C;l;m;pL;r?;s?;A;A;A;A;A;I;A;A;B;A; B; B; B;9; A; 8; =; AA; CA; aK; q<<<D<<FC<GC<HC<RC<St<TC<V`<X<x<<<<<C<C<<C<C<<<C<C<C<C<C<<<<C<3<6<8<HC<L2<`C<bC<g<<i<o<<<C<I<<<C<<C<<<<<`<C<C<C<<C<C<C<`<<C< C<C<C<C<C<C<I<<<C<K<?<?< C<.<3C<4C<5C<6C<86<G<I<LJ<U><X:<YC<^C<_<aC<bC<cC<J<C<C<<<<#C<%C<'C<)C</C<12<E<y`<<<<<<<<<C<C<C<C<<<< < <<;<;<;<;<;<&<.<&<;<;<#<;<)<L<9< << C< C< C< < << << << << << << -%< /C< 1C< 3t< 9C< ;C< Q2< SC< a+< iI< q<< u%< vC< C< < `=\~=~=~= ~= ~= ~DuDKD=D D EEEE@ECEEREuEAEEEE E 2FFFGFHFRFTFFFFFFFFFFFHF`FbFFFFFFFFFFF FFFFFFF F3F4F5F6FYF^FaFbFcFFF#F%F'F)F/FFFFF F F F F /F 1F 9F ;F SF vF H[HR:HuH H 5IIIIIEIiIIIIIIRI_IuIIEI 6I nJFJGJHJRJTJJJJJJJJJJJHJQJ`JbJJJJJJJJJJJ JJJJJJJ J3J4J5J6JAJYJ^JaJbJcJJJ#J%J'J)J/JJJJJ J J J ,J /J 1J 9J ;J SJ vJ J KRIKuKHKAK K N PR8PuP8P7P P QRIQuQHQAQ Q RERKRNRORSRYRZR[R\RRRRRRRR5R@RCRTRRRRR!R,RR(RhRiRuR9RRRRRR9R;R=R?RARGRIRKRRRRRRRRR R R R R R R R %R 3R AR CR TR wR -SR/SuS S >TMTQ TT0ITATBTuCT T 5T >T U7U8kU9UJ UK ULUTUUUUUUUUJUUUUUUU U U (U 5U Vu?V W "Xu?X X 7YFYGYHYRYTYYYYYYYYYYYHY`YbYYYYYYYYYYY YYYYYYY Y3Y4Y5Y6Y72Y8Y9BYJHYKHYLEYYY^YaYbYcYEY!YYY#Y%Y'Y)Y/YYYYYYYYYYYY(YY Y Y Y Y Y /Y 1Y 5KY 9Y ;Y SY vY Y ZFZGZHZRZTZZZZZZZZZZZHZ`ZbZZZZZZZZZZZ ZZZZZZZ Z3Z4Z5Z6Z72Z8Z9BZJHZKHZLEZYZ^ZaZbZcZEZ!ZZZ#Z%Z'Z)Z/ZZZZZZZZZZZZ(ZZ Z Z Z Z Z /Z 1Z 5KZ 9Z ;Z SZ vZ Z [F[G[H[R[T[[[[[[[[[[[H[`[b[[[[[[[[[[[ [[[[[[[ [3[4[5[6[Y[^[a[b[c[[[#[%['[)[/[[[[[ [ [ [ %[ /[ 1[ 9[ ;[ S[ v[ \7\8\9*\J0\K0\L,\T?\,\\\\\\\\\\\2\ \ \ 5A\ ]uJ] ] @l;@llll7l8l9lT9ll@l@l4l 5%l ~&l x7&x9Ex:Ex;x< x=9xx x"&x$&x&6x4Ex6 x8 x99x;9x=9xSExh xmxrExv@xx@xx&x9x x"x x Gx7x8mx9xJBxKBxL7xRxTx7xx&x&x&x&xExExExExExExExxx x9x9x9x x x x xx 9x x Ex x 9x &x 5x >x @Ex BEx D$x }dx ~x  x 1x {;@{{{{7{8{9{T9{{@{@{4{ 5%{ ~&{ 79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *YZ[\tx3t5!t t t t A C q3YZ[\tx3t5!t t t t A C q3YZ[\tx3t5!t t t t A C q3YZ[\tx3t5!t t t t A C q3YZ[\tx3t5!t t t t A C q3x>92 @ q>DEJKNO@CTg,hi9;=?AGIKF !        % T Z w I LDEJKNO@CTg,hi9;=?AGIKF !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF !        % T Z w IDFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay 7       ! / 1 3 9 ; S U V W Z s v > DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay 7       ! / 1 3 9 ; S U V W Z s v > DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay 7       ! / 1 3 9 ; S U V W Z s v > DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay 7       ! / 1 3 9 ; S U V W Z s v > <D<FCGCHCRCStTCV`Xx<<CCCC<CCCCCC368HCL2`CbCg<ioCI<CC<`CCCCCC`C CCCCCCI<CK?? C.3C4C5C6C86GILJU>X:YC^C_aCbCcCJCC<#C%C'C)C/C12Ey`<<CCCC  ;;;;;&.&;;#;)L9 < C C C < < < < < < -% /C 1C 3t 9C ;C Q2 SC a+ iI q< u% vC C  `;*789/LITBI**$J  1 5* }/ ~K =RGn3o3q3r0st3u33)3k3w3 t R n- 3 RGn3o3q3r0st3u33)3k3w3 t R n- 3 r?s;u+EI RI I .r3s0u@  :r?s;u+EI RI I .u9 FGHRTH`b  3456Y^abc#%')/  / 1 9 ; S v u? R/u >uH 9 %uI RIu! CEKNOSYZ[\5@CT!,R(hiu99;=?AGIK    % 3 A C T w -RIu! C 4RIu! Cu? 7u? 7 I789*J0K0L,T?,2 5A EKNOSYZ[\5@CT!,R(hiu99;=?AGIK    % 3 A C T w -789*J0K0L,,2 5 5A 79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *r3s0u@  :79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw L  5 62 < @ A B C R b n o qG x! *r3s0u@  :-V79:<3Mz\x13V("$&463783AIPVQS\KckmrsH3h. 40ABkD7[nopqrstu~v;BCQS@@33  3  3 3)kw 9  (J )J 5R 6 < @ B M O. R b mJ n o q1 x   Mz\%7Q1R0ABWD#[u7&*CQ    5H M O uJ @ 9 9DEJKNO@CTg,hi9;=?AGIKF !        % T Z w IO 6 YZ[\tx3t5!t t t t A C q3YZ[\tx3t5!t t t t A C q3YZ[\tx3t5!t t t t A C q3RJu# 9Mx2Q0AB 5 q2 Q0AR+u? ! YZ[\tx3t5!t t t t A C q3uH Q0ABD " 5 Q0ABD " 5 Q0ABD " 5 Q0ABD " 5 RIuHA RIuHA ix>92 @ q>x>92 @ q>-MPQ_\0A_BD[C 5 O QM+Q[&0A]B&D[C 5 O b FGHRTXY<Z<\LlKxa{KL35<H`bo K. !<"6.3456C GIY^abclm<<#%')/<<<D<<L< L L L9 < 3 / 1 9 ; = A< C< S qa v   G79:<"$&468AISckNmQr@ CRDlmnoqrstu  kw  ( ) 6 ( ) I*D*F*G*H*J*P*Q*R*S*T*U*V*]*****************<*H*]*`*b*g*u******************** ********* */*1*3*4*5*6*N*O*Y*^*a*b*c*****#*%*'*)*/*U*W*Y*[*]*_*a*y********* * * * * * 7* * * * * * * !* /* 1* 3* 9* ;* S* U* V* W* Z* s* v* * >* + I,D,F,G,H,J,P,Q,R,S,T,U,V,],,,,,,,,,,,,,,,,,<,H,],`,b,g,u,,,,,,,,,,,,,,,,,,,, ,,,,,,,,, ,/,1,3,4,5,6,N,O,Y,^,a,b,c,,,,,#,%,',),/,U,W,Y,[,],_,a,y,,,,,,,,, , , , , , 7, , , , , , , !, /, 1, 3, 9, ;, S, U, V, W, Z, s, v, , >, - I.D.F.G.H.J.P.Q.R.S.T.U.V.].................<.H.].`.b.g.u.................... ......... ./.1.3.4.5.6.N.O.Y.^.a.b.c.....#.%.'.)./.U.W.Y.[.]._.a.y......... . . . . . 7. . . . . . . !. /. 1. 3. 9. ;. S. U. V. W. Z. s. v. . >. / I0D0F0G0H0J0P0Q0R0S0T0U0V0]00000000000000000<0H0]0`0b0g0u00000000000000000000 000000000 0/01030405060N0O0Y0^0a0b0c00000#0%0'0)0/0U0W0Y0[0]0_0a0y000000000 0 0 0 0 0 70 0 0 0 0 0 0 !0 /0 10 30 90 ;0 S0 U0 V0 W0 Z0 s0 v0 0 >0 1 I2D2F2G2H2J2P2Q2R2S2T2U2V2]22222222222222222<2H2]2`2b2g2u22222222222222222222 222222222 2/21232425262N2O2Y2^2a2b2c22222#2%2'2)2/2U2W2Y2[2]2_2a2y222222222 2 2 2 2 2 72 2 2 2 2 2 2 !2 /2 12 32 92 ;2 S2 U2 V2 W2 Z2 s2 v2 2 >2 3RL3u3;3 3 4$ 4D94F84G84H84R84T84V84X4 4 4 4 4 4 4 49484848484 4 4 494848484848448434H84`84b84g94i4o484 4 4 4 4948484 4 494 4 48484 484848484 48484 484 8484848484849484L4L4 84.4384484584684748494<74G4I4J4K4L4U(4XJ4Y84^84a84b84c844484844 494#84%84'84)84/84y8444494 494 4 4 4 4 4 4 4 4 4 4 484848484444444444444444 4=449E4 94 84 84 84 4  4 94  4 94  4 94  4 94  4 94  4 94 /84 184 4+4 54 984 ;84 S84 v84 ~C4 84 4 85F5G5H5R5T55555555555H5`5b55555555555 5555555 535455565725859B5JH5KH5LE5Y5^5a5b5c5E5!555#5%5'5)5/555555555555(55 5 5 5 5 5 /5 15 5K5 95 ;5 S5 v5 5 6<6D<6FC6GC6HC6RC6St6TC6V`6X6x<66<6C6C66C6C6<6C6C6C6C6C6666C6366686HC6L26`C6bC6g<6i6o666C6I6<6C66C6<666`6C6C6C66C6C6C6`66C6 C6C6C6C6C6C6I6<6C6K6?6?6 C6.63C64C65C66C6866G6I6LJ6U>6X:6YC6^C6_6aC6bC6cC6J6C6C66<6#C6%C6'C6)C6/C6126E6y`66666<6<6C6C6C6C6666 6 66;6;6;6;6;6&6.6&6;6;6#6;6)6L696 <6 C6 C6 C6 6 <6 <6 <6 <6 <6 <6 -%6 /C6 1C6 3t6 9C6 ;C6 Q26 SC6 a+6 iI6 q<6 u%6 vC6 C6 6 `777879*7J07K07L,7T?7,7777777777727 7 7 5A7 8<8D<8FC8GC8HC8RC8St8TC8V`8X8x<88<8C8C88C8C8<8C8C8C8C8C8888C8386888HC8L28`C8bC8g<8i8o888C8I8<8C88C8<888`8C8C8C88C8C8C8`88C8 C8C8C8C8C8C8I8<8C8K8?8?8 C8.83C84C85C86C8868G8I8LJ8U>8X:8YC8^C8_8aC8bC8cC8J8C8C88<8#C8%C8'C8)C8/C8128E8y`88888<8<8C8C8C8C8888 8 88;8;8;8;8;8&8.8&8;8;8#8;8)8L898 <8 C8 C8 C8 8 <8 <8 <8 <8 <8 <8 -%8 /C8 1C8 3t8 9C8 ;C8 Q28 SC8 a+8 iI8 q<8 u%8 vC8 C8 8 `:uJ: : @<uJ< < @> 9??E?K?N?O????????????? ?@?C?E?T?iI? ? ???????? ??????+?,?R?_?h?i?j?n?o?q?t?u?v????? ?????9?;?=???A?E?G?I?K?O????k?w? ? ? ? #? %? '? +? G? I? R? T? n? w? ? ? ? @E@@@@C@@R@u@A@@@@ @ 2A %D7xD9D:D<DD"xD$xD&D4D6D8DADIDSDcDkDmWDrDxDD D DR7DsDuD'DxDxDxDxDDDDDDDDDD D DD D D D xD (!D )!D <D @D BD D6D RLD b!D xD D LD ER/EuE E >FDFEFJFKFNFOFFFFFFFFF@FCFTFgFFFFFFFF,FhFiFFFFF9F;F=F?FAFGFIFKFFFFFF F F !F F F F F F F F %F TF ZF wF IGGGGGGGGGDGOIGGGG HHHHHiHHHHH8"HEH9<H H 7H 0IDIEIJIKINIOIIIIIIIII@ICITIgIIIIIIII,IhIiIIIII9I;I=I?IAIGIIIKIIIIFI I I !I I I I I I I I %I TI ZI wI IL0LR2LuL L NDNENJNKNNNONNNNNNNNN@NCNTNgNNNNNNNN,NhNiNNNNN9N;N=N?NANGNINKNNNNFN N N !N N N N N N N N %N TN ZN wN IOxO9O qP$PDjPF`PG`PH`PPtPQtPR`PT`PUtPVLPWPXtPYPZP\`P]tPPPPPPPPjP`P`P`P`P`PPPPjP`P`P`P`P`PtPtPtP`PtP#P%P3tP5Pb c$cccccccccccccccccccccc7c8gc9cJcKcLcTHcccccccccccccccc+c+c+c+c+c+c+cJc+ccc c Jc c c c c c c c 4Ac 5c ~c d 4e-]e7 e9 e: e<eMe\eeee]e2e" e$ e&e4 e6e7e8eP]eQeS e\Eemer eSe eeeeueAeee +ee0eAeBYeD!eR5e[ eue5e?eC eQe e eAeAe e e e e e e eeeee e e e e eeee e e e  e 56e 4n?.n@nEnG7nHKnI7nJnKnLnN+nO+nP?nQ.nUnW3nXnYFnZ4n]4n^Fn_naFnbFncFnhninjnnnonqntnunnnnnnnFn4n3n4n1n4nFn3nGn+nn7nnnnnnn#Fn%Fn'Fn)Fn/Fn13n9n;n=n?nAnD5nEnGnInKnOinU+nW+nY+nZn[+n\n]+n^n_+n`na+nq(nu(nynn7nn7nn7nnnnnnnnnnn<nnn+n+nnnnnnnnn>nnnnnnnnnFn:nnnFn:nFnFnn7nnnnnnn7nn n nnnnnknwnnnnnn nn nnnnnnnJnn9n n n n +n n n Fn Fn Fn 4n n n n 4n /n n n n n n n n n n n n n !+n %n (n )n /Fn 1Fn 33n 4Hn 5n 6n 9Fn ;Fn ?n @n Bn EKn Gn In Q3n Rn SFn Tn U+n V+n W+n X4n Z(n [n ^Dn a>n dn e n gDn hn in mn nn on qn rn s+n vFn wn }n n n Fn n n 4n n n n !n o 7q7Kq8 q,q7q7q7q7q7q7q7q7q Aq r$rrrrrrrrrrrrrrrrrFrrrrrr7r8vr9r<'rJrKrLrUrrhrrFrrrrrrrrrrrrrFrFrFr r r r r rr rr r rr rrrrr9r r r r r r r r -r 4r 5r ur ~r gs7s8?s9sJsKsLsTBss&ssssssOs%sOsssssss9:s s -Ds 5s uDs uu?u xMxQx0xAxBxRAx x 5x yQy0yAy y z >| H}RA}n}o}q}r#}s&}t}u}}}}}}}k}w} f} R} n*} } } ~R/~u~ ~ >-M\7PQ#\dis+0,ABD[lmCOQS    , 5 G I M O ^ f g t  E-M\7PQ#\dis+0,ABD[lmCOQS    , 5 G I M O ^ f g t  E , 9-MPQ0ABD[C , 5 O ^ f g t -MPQ0ABD[C , 5 O ^ f g t 79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *u)  7DEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IRIu!  CDFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  IDFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  IDFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  IDFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  IDFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  I[R:u  579:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *u)  7YZ[\tx3t5!t t t t  A C q3u9  CMQL0EAMBD[C 5 O JQ0ABD " 5 FGHRTXY<Z<\LlKxa{KL35<H`bo K. !<"6.3456C GIY^abclm<<#%')/<<<D<<L< L L L9 < 3    / 1 9 ; = A< C< S qa v   'Ru  RF F   'u< Q0ABD " 5  1uJ  @Q0ABD " 5 9,:,<&(4,68S,mr,; 1R(u,,,,,,,  =  ,  @, B, D3 x@ } (((7$89/J9K9L:: K  5* ~J  LRIuHA  79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r?s;u+EI  RI I .YZ[\tx3t5!t t t t  A C q3u9 RIu!  C79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r?s;u+EI  RI I .79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r3s0u@  :YZ[\tx3t5!t t t t  A C q3uH YZ[\tx3t5!t t t t  A C q3uH x>92 @ q>DEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IRIu!  CDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w I 4DFGHRTVXYZ\x:35H`bgo  !.3456GIY^abcp:u::#%')/y     &            / 1 9 ; A C S q: v  @ 78n9J K LT J   I 5 DFGHRTVXYZ\x:35H`bgo  !.3456GIY^abcp:u::#%')/y     &            / 1 9 ; A C S q: v  @ 789*J0K0L,,2 5  5A DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  > u?  7DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  I Fu? $/DF G H JP"Q"R T U"V5XYZ\$]"x//////    $///     """ "35<"H L]"` b giosu" "///&  "/D//5 "/  "  / 5"/  = "     6 !./"1"3 4 5 6 789<#@5GIJKLMN"O"UXY ^ a b c   "/D# % ' ) / 1U"W"Y"["]"_"a"y5$""//////////// D D D  $ $ $/=$9  "     ^ < /  /  /  /  /  /  !" - /  1  4  5G 9  ;  A C Q S  U" V" W" Z a i q s" u v  ~=  !  5  %R1uB  RIuHA  -MPQ0\0qA5BD 5 O +l&x{&C8l+m+nopqrstuv kw  R n q     F #Ml8x{8Q?A"J0@A?BCFD[l+m+p'r;s9C9 J ,@ 5 =. q HQ0AuJ9J  5 79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *uK=  YZ[\tx3t5!t t t t  A C q3[R:u  5DEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IEKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -DEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IRIu!  C<D<FCGCHCRCStTCV`Xx<<CCCC<CCCCCC368HCL2`CbCg<ioCI<CC<`CCCCCC`C CCCCCCI<CK?? C.3C4C5C6C86GILJU>X:YC^C_aCbCcCJCC<#C%C'C)C/C12Ey`<<CCCC  ;;;;;&.&;;#;)L9 < C C C  < < < < < < -% /C 1C 3t 9C ;C Q2 SC a+ iI q< u% vC C  `789*J0K0L,,2 5  5A l/x{/CCl9m9nopqrstuv  kw  R n q    l x{ C%lmnopqrstuvf\kw  R n q   { xDp3uvD&D  qD $ & EKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -EKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -x9r,s$ 5 q9 979:<"$&468AISckNmQr@ CRDlmnoqrstu  kw     (  )  6  %i8K 4 >79:< x; "$&46 8 A I Sc kmr4  RLnop&qrstuv&     kw   ?  (/ )/ 6 < @ B LI R b mK n  o q; x    YZ[\tx3t5!t t t t  A C q3 8H A -J Jz Mq S \  S  e e z e  J     T z 7 Lc PJ Q \2 d s xM y ~    e Z C e a    b  )     + 0 : ; @$ A Bj D) F P Q5 [ 5 ; 1c 7e B C M O Q S k m qT s uT               { { { { {    { {  { "  3 5m D/ E GT I J K Ll M O) Qc Zz ]o ^ ` a da eD fY g zu  a    J M S \6 6 4    74 L Q d s! ~     A 4   % t   0- : A B D] P [s  1 Cs Q S k m 6 4  6  6  6 4 m    3 5 G I K MA O Q Z ^ a g    D F G H R T V X Y Z \ x:               3 5 H ` b g o                            ! . 3 4 5 6 G I Y ^ a b c p: u: :       # % ' ) / y                          &            / 1 9 ; A C S q: v  @  7 8k 9 J  K  L T        J         ( 5  DC FL GL HL RL TL C L L  L L C L L L L L    L HL L= `L bL gC i   L C L L C   L L L L L L L  L L L L L L C L B B  L 3L 4L 5L 6L 7; 8 9D J= K= L9 U: XC YL ^L aL bL cL 9 L L C #L %L 'L )L /L 1= E C C L L L L ' ' ' ' '    ' '  '  B 9 C L L L  C C C C C C -' /L 1L 9L ;L Q= SL a> u' vL L 7G825555555K5  7 ARKu):  R0uF  7 %EKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -R<uI JMS!\   7LQKd1sjxy~ [  }VV0o:=AKBDP1Q[17 CQSkkmquaa   T F 3! 5 E2 G I' K3 M O Q Z ^< aP g< L F e`E1K:LMN:O:l{ 6Y :1a:::: !#+@1C1EaKT:YZi`>>:kn :>:1$%)+1,:RM[_\h:i:jbnJoJpqJrstJurvYrJJ@hJ111379:;:=:?:A:CEG:I:K:MOUQSs}#:S8 22SkJwJ  :  # F : # %: '$ + 7' GL IG O R^ T: c/ nr w: J ^ @  k !EKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -Cl m neoeqerOsteueeeekewe z R# e #FGHRTH`b  3456Y^abc#%')/     / 1 9 ; S v u7  IRBn$o$q$rIs't$u$$$($k$w$  R( $ (EKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -RIuI?  <EKNO((( @CETiN((+,R_hijknoqtuv'9;=?AE(GIKOkw    # % ' + G I R T c n w      &  [ R: u  5!7F!8! ! G! ?"7"8"9""JK"KK"LI"R,"T/"I" """""""" ""K" " " 5" 5@" #M#Q##0,#A#B# 5# $u+$ $ 1%u&% % 3& A'u?' ' 7(F(G(H(R(T(((((((((((H(`(b((((((((((( ((((((( (3(4(5(6(Y(^(a(b(c(((#(%('()(/((((( ( ( ( ( /( 1( 9( ;( S( v( ) C+J+M+S!+\++++ + ++ ++++7+L+QK+d1+sj+x+y+~ +++[+ +++ +++++}++V+V+0o+:=+AK+B+D+P1+Q+[+++1+7 +C+Q+Sk+k+m+q+u+a+a+++ + + +++++++++++++T++ F+ 3!+ 5+ E2+ G+ I'+ K3+ M+ O+ Q+ Z+ ^<+ aP+ g<+ L+ F+ e,F,G,H,R,T,,,,,,,,,,,H,Q,`,b,,,,,,,,,,, ,,,,,,, ,3,4,5,6,A,Y,^,a,b,c,,,#,%,',),/,,,,, , , , ,, /, 1, 9, ;, S, v, , .Q.0.A.RF. 2. /Q/A/R;/u/ / '/ 0RI0u0H0A0 0 1J:1MI1S]1\11411;1;1:1;1111:171L%1Qs1dj1s1x1y1~_111w1;1311;11181111`1`101:j1@1As1BB1D1PM1Q1[1u%11 11%17;1C1M1Q1S1k[1m[1q1u11111 1 1 1111111 1 1 3]1 5S1 ES1 G/1 IX1 Kh1 M1 O1 Q%1 Z:1 ^f1 a1 e1 gf1 1 :1 w1 3E3K3N3O3S3Y3Z3[3\3333333353@3C3T33333!3,3R(3h3i3u3933333393;3=3?3A3G3I3K333333333 3 3 3 3 3 3 3 %3 33 A3 C3 T3 w3 -4uJ4 4 @5R&5sH5u55 5 RJ5 J5 6E6K6N6O6S6Y6Z6[6\6666666656@6C6T66666!6,6R(6h6i6u6966666696;6=6?6A6G6I6K666666666 6 6 6 6 6 6 6 %6 36 A6 C6 T6 w6 -7 8889J9M9S9\V9V9T99999997T9L9Q$9d9s?9x9y9~999B99999G9T999@99990Y9: 9A$9B9D9P9[9991979C9Qw9S<9k9m999V9T9 V9 V9 V9T99999999999999  9 G9 39 59 E9 G9 I9 K9 MG9 O9 Q9 Z9 ^9 a 9 g9 9 9 C:7:8a:9:J:K:L:T:_B:::::::::::::3: : : 8: ;0;7;8o;9;J&;K&;L;T;_*;;;L;*; ; ; <7J<8<C<C<C<C<C<C<C<9<C< < < 5=u=?= = = RE= E= >RJ>u>D>6> > @Q@0@A@B@u+@ @ C@ AAEAKANAOAAA8AAAAA8A8AAAAAAA A@ACAEATAZAifA7A7AAAAAA'AAEAA8A8AAA+A,AR A_ AhAiAjAnAoAqAtAu#AvA"AAAA'AAAAA9A;A=A?AAAE8AGAIAKAMAO AQASAAAAAAAkAwA A  A A #A %A 'A +A GA IA RA TA cA n-A wA A A A "A BBBBBBBi BBBBBBBBB_BnBoBqBtBuBBBBBBEBOBBBkBwB B GB RB nB B B B CJCMCS(C\CCCCCCCCCCC7CLCQDCd0CsqCxCyC~*C5C5C]CC CCCCC CC{CC4C4C0kC:8C@CADCBCDCP2CQC[Cs6CuC3CCCC1C7CCCOCQCSbCk&Cm&CqCuC3C3CCC C C CCCCCCCCCCCCCCCC <C jC 3(C 5 C E3C GC I2C K4C MC OC QC R/C ZC ^4C aAC eC g4C DC /C C >C ZDDEDKDNDODDD(DDDDD(D(DDDDDD D@DCDEDTDiNDDDDDDDDDDDD(D(DDD+D,DRD_DhDiDjDkDnDoDqDtDuDvDDDDD'DDDDD9D;D=D?DADE(DGDIDKDODDDDDkDwD D D D #D %D 'D +D GD ID RD TD cD nD wD D D D D EuE E (FJFMFSF\FFFFDFFFFFFF7DFQ FdFs2FxFyF~FFF FFFFF0FDFFF2FnFFF0>F:FA FBFDFPF[F~F7FCFQOFSFkFmFFFFFDF FF FF FFDFFFFFF  F 3F 5F EF IF KF M0F OF ZF ^F aF gF F F /G[GR:GuG G 5HR2HuJH IR/Iu%I Jn9Jo9Jq9Jr"JsJt9JuJJ9J9J9JJ9Jk9Jw9J BJ RJ n!J 9J J J BKn9Ko9Kq9Kr"KsKt9KuKK9K9K9KK9Kk9Kw9K BK RK n!K 9K K K BLx7LLLlJLmJL q7MFMGMHMRMTMMMMMMMMMMMHM`MbMMMMMMMMMMM MMMMMMM M3M4M5M6M72M8M9BMJHMKHMLEMYM^MaMbMcMEM!MMM#M%M'M)M/MMMMMMMMMMMM(MM M M M M M /M 1M 5KM 9M ;M SM vM M NJNMNSN\fNfNNdNNNNNNN7dNLNQ$NdNs=NxNyN~N'N'N@NNNNNdNdNNNSNN1N1N0HN:NA$NBNDNP(NQN[NuN!NHNNN1N7NCNQNS=NkNmN&N&NfNdN fN fN fNdN[NNNNNN*NON*NNN NN N N 3N 5N EN GN IN KN MdN ON QN ZN ^N aN eN gN %N N N 8ORIOuOHOAO O PuBPBP P 8QQQ0QAQuJQ9JQ Q 5Q R8:R=RCRCRCRCRCRCRCRHRCR *R ,R 4SSSSSESi SSSSSSES nTuKT UQU0U7 U8U9 UAUT%UEU U U VDVEVJVKVNVOVVVVVVVVV@VCVTVgVVVVVVVV,VhViVVVVV9V;V=V?VAVGVIVKVVVVFV V V !V V V V V V V V %V TV ZV wV IWEWKWNWOWSWYWZW[W\WWWWWWWW5W@WCWTWWWWW!W,WR(WhWiWuW9WWWWWW9W;W=W?WAWGWIWKWWWWWWWWW W W W W W W W %W 3W AW CW TW wW -XRFXuX YYYYYEYiYYYYYRYYEY ;Y RY Y ZFZGZHZRZTZZZZZZZZZZZHZ`ZbZZZZZZZZZZZ ZZZZZZZ Z3Z4Z5Z6ZYZ^ZaZbZcZZZ#Z%Z'Z)Z/ZZZZZ Z Z Z Z /Z 1Z 9Z ;Z SZ vZ [[\Q\0\A\R=\ \ ]x0]"E]*9]C]RD]l]m]n]o]p]q]r]s]t]u,]v]]]]]d]]k]w] ] Rz] n] p9] q0] ] z] ] ^^E^K^M^N^O^^^^^^^^^^^^^^ ^@^C^E^Q^T^iC^^^^^^^^^^^^^+^,^0^A^R^_^h^i^j^n^o^q^t^u^v^^^^^^^^^^9^;^=^?^A^E^G^I^K^^^k^w^ ^ ^ ^ #^ %^ '^ +^ G^ R^ T^ c^ n^ w^ ^ ^ ^ ^ ^ _8_ ._ @auJa a @bQb0bAbuJb9Jb b 5b cR8cuc8c7c c d[dR:dud d 5eeEeKeNeOeee8eeeee8e8eeeeeee e@eCeEeTeZeife7e7eeeeee'eeEee8e8eee+e,eR e_ eheiejeneoeqeteu#eve"eeee'eeeee9e;e=e?eAeE8eGeIeKeMeO eQeSeeeeeeekewe e  e e #e %e 'e +e Ge Ie Re Te ce n-e we e e e "e fR<fuIf gR?gug g 0h[hR:huh h 5iuJi i @lMlQlll0AlA#lBl 5l mJmMmSm\bmbmm`mmmmmmmm7`mLmQ3md!msNm~mmmFmmmmmtm`mmmRmmmm0Pm:mA3mBmDmPm[mm1m7mCmQmSqmkmmmqmummmbm`m bm bm bm`mmQm Fm 3m 5m Em Gm Im Km Mtm Om Qm Zm ^m aTm gm $m Am an$nnnnnnnnnnnnnnnnnnnnnn7n8{n9nJnKnLnnZnnnnnnnnnnnnnnn%n9*n n n n n n n 4 n 5n ~n to$oooooooooooooooooooooo7o8{o9oJoKoLooZooooooooooooooo%o9*o o o o o o o 4 o 5o ~o tp$GpGpGpGpGpGpGppGpGpGpipGpGpGppGppGpGpGpGpGp7p8p9pJ=pK=pL+p+ppGpGpGpGpGpGpGpGpGpGpGpGpGpGp Gp Gp Gp Gp Gp Gp 5 p ~ p q$qD qF!qG!qH!qJ:qR!qT!qV;qqqqqqqq q!q!q!q!qqqq q!q!q!q!q!qHq8q!qHqH!qLq`!qb!qg q!qq<qqqq q+q!q!q8qqq q!qqq;q!qq!q!q!q!qq!q;qq!q !q!q!q!q!q!q<q q!qqqq !q3!q4!q5!q6!q7Lq8jq9eq<q@;qD>qJmqKmqLhqUqX"qY!q^!qa!qb!qc!qhqq!q!q=qq q!q#!q%!q'!q)!q/!q1qy;q qq qqqqqqqqqqqq!q!q!q!q!q!q!qqqq9q q !q !q !q >q q  q q  q q  q q  q q  q q  q -q /!q 1!q 4q 5\q 9!q ;!q Qq S!q Z:q aq i<q uq v!q ~q !q q ;r$rrrrrrrrrrrrrrrrrrrrrr7r8{r9rJrKrLrrZrrrrrrrrrrrrrrr%r9*r r r r r r r 4 r 5r ~r ts$6s6s6s6s6s6s6ss6s6s6s6s6s6ss6ss6s6s6s6s6s7s8Qs9sJ3sK3sL%sT%s%ss6s6s6s6s6s6s6s6s6s6s6s6s6s6s 5s 6s 6s 6s 6s 6s 6s 5s ~s t$tttttttttttttttttttttt7t8mt9tuJmuKmuLhuUuX"uY!u^!ua!ub!uc!uhuu!u!u=uu u!u#!u%!u'!u)!u/!u1uy;u uu uuuuuuuuuuuu!u!u!u!u!u!u!uuuu9u u !u !u !u >u u  u u  u u  u u  u u  u u  u -u /!u 1!u 4u 5\u 9!u ;!u Qu S!u Z:u au i<u uu v!u ~u !u u ;v$vD vFDvGDvHDvRDvTDvvvvvvvv vDvDvDvDvvvv vDvDvDvDvDvDvHDvL6v`DvbDvg vDvvvvv vHvDvDvvv vFvvvDvvDvDvDvDvvDvvDv DvDvDvDvDvDv vDv/vvv Dv3Dv4Dv5Dv6Dv7Hv8]v9\v< vD>vJsvKsvLwvUvX/vYDv^DvaDvbDvcDvwvvDvDvGvv vFv#Dv%Dv'Dv)Dv/Dv16v vv vvvvvvvvvvvvDvFvDvFvDvFvDvvvv9v v Dv Dv Dv v  v v  v v  v v  v v  v v  v -/v /Dv 1Dv 4v 5^v 9Dv ;Dv Q6v SDv aKv u/v vDv ~v Dv $LLL7n8m9~JKLG        43 5 ~ X$78{9JKLZ%9*       4  5 ~ t$78{9JKLZ%9*       4  5 ~ t$78{9JKLZ%9*       4  5 ~ t$78@9EKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w - u@G9B  ; EKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -8J  D789"JKKKLIR,T/I  K   5 5@ FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v   !$78{9JKLZ%9*       4  5 ~ t[R:u  5Q0A 79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *uI;   %R<u+  ? %E@CRuA  2 %R.u  FFGHRTH`b  3456Y^abc#%')/     / 1 9 ; S v  D E J K N O         @ C T g        , h i     9 ; = ? A G I K    F   !        % T Z w I"D"E"J"K"N"O"""""""""@"C"T"g"""""""","h"i"""""9";"="?"A"G"I"K""""F" " " !" " " " " " " " %" T" Z" w" I$D$E$J$K$N$O$$$$$$$$$@$C$T$g$$$$$$$$,$h$i$$$$$9$;$=$?$A$G$I$K$$$$F$ $ $ !$ $ $ $ $ $ $ $ %$ T$ Z$ w$ I&D&E&J&K&N&O&&&&&&&&&@&C&T&g&&&&&&&&,&h&i&&&&&9&;&=&?&A&G&I&K&&&&F& & & !& & & & & & & & %& T& Z& w& I(D(E(J(K(N(O(((((((((@(C(T(g((((((((,(h(i(((((9(;(=(?(A(G(I(K((((F( ( ( !( ( ( ( ( ( ( ( %( T( Z( w( I*Y*Z*[*\t*x3*t*5*!********t** t* t* t* * A* C* q3,Y,Z,[,\t,x3,t,5,!,,,,,,,,t,, t, t, t, , A, C, q3.Y.Z.[.\t.x3.t.5.!........t.. t. t. t. . A. C. q3/R*/u/C/ / %0Y0Z0[0\t0x30t050!00000000t00 t0 t0 t0 0 A0 C0 q31R*1u1C1 1 %2Y2Z2[2\t2x32t252!22222222t22 t2 t2 t2 2 A2 C2 q33uH3 4$4Dj4F`4G`4H`4Pt4Qt4R`4T`4Ut4VL4W4Xt4Y4Z4\`4]t44444444j4`4`4`4`4`4444j4`4`4`4`4`4t4t4t4`4t4#4%43t454D92D @D q>FFFGFHFRFTFXFY<FZ<F\LFlKFxaF{KFFFFFLFFFFFFF3F5<FHF`FbFoFFFFFFFFFFF FKF.FFFFFFF F!<F"6F.F3F4F5F6FC FGFIFYF^FaFbFcFlFmFFF<F<FF#F%F'F)F/FFFF<F<F<FDF<F<FLF<FFFFFFF LF LF LF9F <F 3F F F F /F 1F 9F ;F =F A<F C<F SF qaF vF G HFHGHHHRHTHXHY<HZ<H\LHlKHxaH{KHHHHHLHHHHHHH3H5<HHH`HbHoHHHHHHHHHHH HKH.HHHHHHH H!<H"6H.H3H4H5H6HC HGHIHYH^HaHbHcHlHmHHH<H<HH#H%H'H)H/HHHH<H<H<HDH<H<HLH<HHHHHHH LH LH LH9H <H 3H H H H /H 1H 9H ;H =H A<H C<H SH qaH vH I JFJGJHJRJTJXJY<JZ<J\LJlKJxaJ{KJJJJJLJJJJJJJ3J5<JHJ`JbJoJJJJJJJJJJJ JKJ.JJJJJJJ J!<J"6J.J3J4J5J6JC JGJIJYJ^JaJbJcJlJmJJJ<J<JJ#J%J'J)J/JJJJ<J<J<JDJ<J<JLJ<JJJJJJJ LJ LJ LJ9J <J 3J J J J /J 1J 9J ;J =J A<J C<J SJ qaJ vJ K L7L9L:L<LL"L$L&L4L6L8LALILSLcLkNLmQLrLLL@L LCLRDLlLmLnLoLqLrLsLtLuLLLLLLLLLLLLLLLLLLLL L LLkLwL L L L L ( L ) L 6L l$llllllllllllllllllllll7l8gl9lJlKlLlTHllllllllllllllll+l+l+l+l+l+l+lJl+lll l Jl l l l l l l l 4Al 5l ~l mR/mum m >nDnFnGnHnRnTnVnXnYnZn\nx:nnnnnnnnnnnnnnn3n5nHn`nbngnonnnnnnnnnnnnnnnnn nnnnnnnn n!n.n3n4n5n6nGnInYn^nanbncnp:nu:n:nnnnnnn#n%n'n)n/nynnnnnnnnnnnnnnnnnnn n n n n &n n n n n n n n n n n n /n 1n 9n ;n An Cn Sn q:n vn n @n o7o8no9oJ oK oLoT ooooooooJooooooo o o Io 5o pDpFpGpHpRpTpVpXpYpZp\px:ppppppppppppppp3p5pHp`pbpgpoppppppppppppppppp pppppppp p!p.p3p4p5p6pGpIpYp^papbpcpp:pu:p:ppppppp#p%p'p)p/pyppppppppppppppppppp p p p p &p p p p p p p p p p p p /p 1p 9p ;p Ap Cp Sp q:p vp p @p q7q8kq9qJ qK qLqTqqqqqqqqJqqqqqqq q q (q 5q rDrFrGrHrRrTrVrXrYrZr\rx:rrrrrrrrrrrrrrr3r5rHr`rbrgrorrrrrrrrrrrrrrrrr rrrrrrrr r!r.r3r4r5r6rGrIrYr^rarbrcrp:ru:r:rrrrrrr#r%r'r)r/ryrrrrrrrrrrrrrrrrrrr r r r r &r r r r r r r r r r r r /r 1r 9r ;r Ar Cr Sr q:r vr r @r s7s8s9*sJ0sK0sL,s,sssssssssss2s 5s s 5As tDtFtGtHtRtTtVtXtYtZt\tx:ttttttttttttttt3t5tHt`tbtgtottttttttttttttttt tttttttt t!t.t3t4t5t6tGtItYt^tatbtctp:tu:t:ttttttt#t%t't)t/tyttttttttttttttttttt t t t t &t t t t t t t t t t t t /t 1t 9t ;t At Ct St q:t vt t @t u7%u8u9uT1u u $v FwuHw x Fyu?y | F~ F +$/DF G H JP"Q"R T U"V5XYZ\$]"x//////    $///     """ "35<"H L]"` b giosu" "///&  "/D//5 "/  "  / 5"/  = "     6 !./"1"3 4 5 6 789<#@5GIJKLMN"O"UXY ^ a b c   "/D# % ' ) / 1U"W"Y"["]"_"a"y5$""//////////// D D D  $ $ $/=$9  "     ^ < /  /  /  /  /  /  !" - /  1  4  5G 9  ;  A C Q S  U" V" W" Z a i q s" u v  ~=  !  5$/DF G H JP"Q"R T U"V5XYZ\$]"x//////    $///     """ "35<"H L]"` b giosu" "///&  "/D//5 "/  "  / 5"/  = "     6 !./"1"3 4 5 6 789<#@5GIJKLMN"O"UXY ^ a b c   "/D# % ' ) / 1U"W"Y"["]"_"a"y5$""//////////// D D D  $ $ $/=$9  "     ^ < /  /  /  /  /  /  !" - /  1  4  5G 9  ;  A C Q S  U" V" W" Z a i q s" u v  ~=  !  5 $KDFGHJ=RTV4Y Z \%xKKKKKK%KKK5 HL`bgis KKKKFKK4KK4K >88 ! 3456789<2@DJ/K/L#MUXY^abc#  KF#%')/1y4     % KKKKKKKKKKKKFFF % % %         K@,9       < K  K  K  K  K  K  - / 1 4 9 ; A  C  Q S Z= a i q u v ~>    4MQ 0ABD  5 $4DFGHJ@RTV:YZx4444444445HL`bgi4#444I44:44:4 #11 !34567 89<(@0J K L MUXY^abc $64I#%')/1y:444444444444III4B)9       A 4  4  4  4  4  4  - / 1 4 9 ; A C Q S Z@ a7 i# q u v ~B  &  :MQ0JA(B  5 DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  > RLu;  DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  > RLu;  DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  > u/  'DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  IDFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  >  I$ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8789*J0K0L,,2 5  5A $ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  $ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  $ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  $ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  $ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  $ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  YAZA\Bl1x{1B5AsIE!A"/ClmpLr?s?AAAAAIAABA B B B9 A 8 = AA CA aK q  GYAZA\Bl1x{1B5AsIE!A"/ClmpLr?s?AAAAAIAABA B B B9 A 8 = AA CA aK q<D<FCGCHCRCStTCV`Xx<<CCCC<CCCCCC368HCL2`CbCg<ioCI<CC<`CCCCCC`C CCCCCCI<CK?? C.3C4C5C6C86GILJU>X:YC^C_aCbCcCJCC<#C%C'C)C/C12Ey`<<CCCC  ;;;;;&.&;;#;)L9 < C C C  < < < < < < -% /C 1C 3t 9C ;C Q2 SC a+ iI q< u% vC C  `789*J0K0L,T?,2   5A \~~~ ~ ~ ~ 9\~~~ ~ ~ ~uJ  @\~~~ ~ ~ ~uJ  @RIuHA  FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  789*J0K0L,T?,2   5A EKNO @CETiI   +,R_hijnoqtuv 9;=?AEGIKOkw    # % ' + G I R T n w    i8H Ei+R_noqtuEkw ' G R n     %79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *uK=  79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *u)  779:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *sL79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *rIsFu0  879:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r3s0u@  :79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r?s;u+EI  RI I .79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r3s0u@  :79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r3s0u@  :79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r3s0u@  :79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r;s8 I79:<0YZ\~xG0~"$&456080A)I)Sc)kmr0 6!nop3qrstuv70~0 ~ 0 ~ 0 ~0kw    L  5 62 < @ A B C R b n o qG x!    *r3s0u@  :YZ[\tx3t5!t t t t  A C q3[R:u  5YZ[\tx3t5!t t t t  A C q3RJu#  9YZ[\tx3t5!t t t t  A C q3RJsF J KYZ[\tx3t5!t t t t  A C q3uH YZ[\tx3t5!t t t t  A C q3YZ[\tx3t5!t t t t  A C q3YZ[\tx3t5!t t t t  A C q3u? DEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IEKNOSYZ[\5@CT!,R(hiu99;=?AGIK        % 3 A C T w -DEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IRIu!  CDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IRIu!  CDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IRIu!  CDEJKNO@CTg,hi9;=?AGIKF   !        % T Z w IRIu!  C8,H======== 3 8KFFFFFFFF  +8,H======== 3 8KFFFFFFFF  +8,H======== 3 8KFFFFFFFF  +8,H======== 3 8KDDDDDDDD  '8,H======== 3 8KFFFFFFFF  +DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  > u?  7DFGHJPQRSTUV]<H]`bgu  /13456NOY^abc#%')/UWY[]_ay      7       ! / 1 3 9 ; S U V W Z s v  > u?  7$,-189:;<DEFFGFHFJ(KNOP+Q+RFS3TFU+VX7[]+x45FFFFFFFFF555+4++  )F+((*,.0237468<+@CHFL3PSTU[\]+`FbFeghino7qru+x y@|~AF+4$F#F+455F+FF+-FFF+JF F 9 F4+FFFF  FA.. F#)'G(4+,-.7/+1+243F4F5F6F789 :&;7<>4?.@EG7HKI7JKLN+O+P?Q.UW3XYFZ4]4^F_aFbFcFhijnoqtuF43414F3G+7#F%F'F)F/F139;=?AD5EGIKOiU+W+Y+Z[+\]+^_+`a+q(u(y777<++>F:F:FF77  kw  J9    +   F F F 4    4 /             !+ % ( ) /F 1F 33 4H 5 6 9F ;F ? @ B EK G I Q3 R SF T U+ V+ W+ X4 Z( [ ^D a> d e  gD h i m n o q r s+ vF w }   F   4    !  7$,-189:;<DEFFGFHFJ(KNOP+Q+RFS3TFU+VX7[]+x45FFFFFFFFF555+4++  )F+((*,.0237468<+@CHFL3PSTU[\]+`FbFeghino7qru+x y@|~AF+4$F#F+455F+FF+-FFF+JF F 9 F4+FFFF  FA.. F#)'G(4+,-.7/+1+243F4F5F6F789 :&;7<>4?.@EG7HKI7JKLN+O+P?Q.UW3XYFZ4]4^F_aFbFcFhijnoqtuF43414F3G+7#F%F'F)F/F139;=?AD5EGIKOiU+W+Y+Z[+\]+^_+`a+q(u(y777<++>F:F:FF77  kw  J9    +   F F F 4    4 /             !+ % ( ) /F 1F 33 4H 5 6 9F ;F ? @ B EK G I Q3 R SF T U+ V+ W+ X4 Z( [ ^D a> d e  gD h i m n o q r s+ vF w }   F   4    !  7$,-189:;<DEFFGFHFJ(KNOP+Q+RFS3TFU+VX7[]+x45FFFFFFFFF555+4++  )F+((*,.0237468<+@CHFL3PSTU[\]+`FbFeghino7qru+x y@|~AF+4$F#F+455F+FF+-FFF+JF F 9 F4+FFFF  FA.. F#)'G(4+,-.7/+1+243F4F5F6F789 :&;7<>4?.@EG7HKI7JKLN+O+P?Q.UW3XYFZ4]4^F_aFbFcFhijnoqtuF43414F3G+7#F%F'F)F/F139;=?AD5EGIKOiU+W+Y+Z[+\]+^_+`a+q(u(y777<++>F:F:FF77  kw  J9    +   F F F 4    4 /             !+ % ( ) /F 1F 33 4H 5 6 9F ;F ? @ B EK G I Q3 R SF T U+ V+ W+ X4 Z( [ ^D a> d e  gD h i m n o q r s+ vF w }   F   4    !  7$,-189:;<DEFFGFHFJ(KNOP+Q+RFS3TFU+VX7[]+x45FFFFFFFFF555+4++  )F+((*,.0237468<+@CHFL3PSTU[\]+`FbFeghino7qru+x y@|~AF+4$F#F+455F+FF+-FFF+JF F 9 F4+FFFF  FA.. F#)'G(4+,-.7/+1+243F4F5F6F789 :&;7<>4?.@EG7HKI7JKLN+O+P?Q.UW3XYFZ4]4^F_aFbFcFhijnoqtuF43414F3G+7#F%F'F)F/F139;=?AD5EGIKOiU+W+Y+Z[+\]+^_+`a+q(u(y777<++>F:F:FF77  kw  J9    +   F F F 4    4 /             !+ % ( ) /F 1F 33 4H 5 6 9F ;F ? @ B EK G I Q3 R SF T U+ V+ W+ X4 Z( [ ^D a> d e  gD h i m n o q r s+ vF w }   F   4    !  7$,-189:;<DEFFGFHFJ(KNOP+Q+RFS3TFU+VX7[]+x45FFFFFFFFF555+4++  )F+((*,.0237468<+@CHFL3PSTU[\]+`FbFeghino7qru+x y@|~AF+4$F#F+455F+FF+-FFF+JF F 9 F4+FFFF  FA.. F#)'G(4+,-.7/+1+243F4F5F6F789 :&;7<>4?.@EG7HKI7JKLN+O+P?Q.UW3XYFZ4]4^F_aFbFcFhijnoqtuF43414F3G+7#F%F'F)F/F139;=?AD5EGIKOiU+W+Y+Z[+\]+^_+`a+q(u(y777<++>F:F:FF77  kw  J9    +   F F F 4    4 /             !+ % ( ) /F 1F 33 4H 5 6 9F ;F ? @ B EK G I Q3 R SF T U+ V+ W+ X4 Z( [ ^D a> d e  gD h i m n o q r s+ vF w }   F   4    !  7<D<FCGCHCRCStTCV`Xx<<CCCC<CCCCCC368HCL2`CbCg<ioCI<CC<`CCCCCC`C CCCCCCI<CK?? C.3C4C5C6C86GILJU>X:YC^C_aCbCcCJCC<#C%C'C)C/C12Ey`<<CCCC  ;;;;;&.&;;#;)L9 < C C C  < < < < < < -% /C 1C 3t 9C ;C Q2 SC a+ iI q< u% vC C  ` 7 8 9* J0 K0 L, T? ,           2   5A  < D< FC GC HC RC St TC V` X x<  < C C  C C < C C C C C    C 3 6 8 HC L2 `C bC g< i o   C I < C  C <   ` C C C  C C C `  C  C C C C C C I < C K ? ?  C . 3C 4C 5C 6C 86 G I LJ U> X: YC ^C _ aC bC cC J C C  < #C %C 'C )C /C 12 E y`     < < C C C C         ; ; ; ; ; & . & ; ; # ; ) L 9 < C C C  < < < < < < -% /C 1C 3t 9C ;C Q2 SC a+ iI q< u% vC C  ` 7@ 8 9@ C  : < D< FC GC HC RC St TC V` X x<  < C C  C C < C C C C C    C 3 6 8 HC L2 `C bC g< i o   C I < C  C <   ` C C C  C C C `  C  C C C C C C I < C K ? ?  C . 3C 4C 5C 6C 86 G I LJ U> X: YC ^C _ aC bC cC J C C  < #C %C 'C )C /C 12 E y`     < < C C C C         ; ; ; ; ; & . & ; ; # ; ) L 9 < C C C  < < < < < < -% /C 1C 3t 9C ;C Q2 SC a+ iI q< u% vC C  ` 7 8 9* J0 K0 L, T? ,           2   5A <D<FCGCHCRCStTCV`Xx<<CCCC<CCCCCC368HCL2`CbCg<ioCI<CC<`CCCCCC`C CCCCCCI<CK?? C.3C4C5C6C86GILJU>X:YC^C_aCbCcCJCC<#C%C'C)C/C12Ey`<<CCCC  ;;;;;&.&;;#;)L9 < C C C  < < < < < < -% /C 1C 3t 9C ;C Q2 SC a+ iI q< u% vC C  `789*J0K0L,,2 5  5A 79:<"$&468AISckNmQr@ CRDlmnoqrstu  kw     (  )  6 $ D9F8G8H8R8T8V8X       98888   98888883H8`8b8g9io8    988  9  88 8888 88 8 88888898LL 8.38485868789<7GIJKLU(XJY8^8a8b8c888 9#8%8'8)8/8y89 9           8888 =9E 9 8 8 8    9   9   9   9   9   9 /8 18 4+ 5 98 ;8 S8 v8 ~C 8  8FGHRTH`b  34567289BJHKHLEY^abcE!#%')/(      / 1 5K 9 ; S v  k$kkkkkkkkkkkikkkkkkkkkkkk7k8k9kJkKkLkk]kkkkkkkkkkkkkk=kk5k9$k k k k k k k k 4k 5k ~k tw$wwwwwwwwwwwwwwwwwwwwww7w8{w9wJwKwLwwZwwwwwwwwwwwwwww%w9*w w w w w w w 4 w 5w ~w t78.9Z:Z<Y"Z"lB{B...."$&(.*.,...0.2.4Z5"68AIQ7SZckLm5n.p5rZ....... >!""9*=A7BCDR-SBlm"".....Z Z"Z"Z"Z%Z"Z"".......  9 7 @ Z " I  ( ) ,J 5 6 < =  @Z A" BZ C" [B b h. o p= x * 79:<"$&468AIQSckhmVr ABC Dlm  9H r   (4 )4 5 6 <; @ B b o x ] G79:<"$&468AIQSckhmVr ABC Dlm  9H r   (4 )4 5 6 <; @ B b o x ] G79:< M "$&46 8 AIQ:SckNmQr  0A:BCDR>lm      r   ( ) 5 6 !""9*=A7BCDR-SBlm"".....Z Z"Z"Z"Z%Z"Z"".......  9 7 @ Z " I  ( ) ,J 5 6 < =  @Z A" BZ C" [B b h. o p= x * 79:< M "$&46 8 AIQ:SckNmQr  0A:BCDR>lm      r   ( ) 5 6 lm      r   ( ) 5 6 lm      r   ( ) 5 6 lm      r   ( ) 5 6 9k9m9r 99J9999 9R9nH9oH9qH9tH9u9H9H99H99999 9 9 9 9 9 9 9#9#99J9J9J99 9 999kH9wH9@9@9@9@9@9@9@9@9 J9 9 9 9 J9 9 *9 @ 9 B 9 D9 R9 b9 x9 yJ9 }9 9 H9 9 9 7 9 : < " $ & 4 6 8 A I S c kN mQ r   @  C RD l m n o q r s t u                       k w  ( ) 6 A ?A G@ H L R@ ]/ ^@ _@ ` a@ b g j; oE u/ xC z |, ~L <  / 2 @ @ % I % I  2 2 9  @  @  @  @  @  / 2 9  @  2 2  @ @ A I  ;  / 2   @ @ @  @ @ / ;    2 @   / 2   @    4  B /              -E .E // 0G 1/ 3 4 5 6 7 86 9 :" ;6 < @ A; B D EC F GE HE IE J K L N/ O/ PG Q? T, U V@ X Y ^ a b c d; e; f; gA  g    / E  2  @  ! # % ' ) + / 1 5A 6@ U/ W/ Y/ [/ ]/ _/ a/ b@ d@ f@ h@ k m o q1 u1 w9 y {9  ; ' ' E E E I  A / /  A   2  2  2 . 2 2 K 2 2 K 2 2 2 2 2    % % @  @  @  @ @  @ @  @  @  @  @ @  E 7 7 7 7 E 6 2  N 9g ; / @ . ;  2  2  2  2  2  2  !/ ,K - .@ / 0@ 1 3= 4} 5 8@ 9 :@ ; ? EI Q S U/ V/ W/ Y; Z \ ^@ `? a e g@ i s/ u v z# ~ 2 @ J A A A A A A -O D F G H M R T V4 \ x            O   7 H PO Q \9 ` b g s    .    Q   4          4   4         .   &     0 3 4 5 6 8# : A B DV P X Y [: ^ a b c  V   # % ' ) / B C: Q S y4               N             9     E       - / 1 4 5 9 ; E M O4 S ^ a g i. q u v    4 u3   F 73 9# :# <4 4 "3 $3 &/ 4# 64 84 S# m r# 3 4  L u 8 H 3 3 4 4 # # # # # # # 4 4  4  4 4   #   3  <  @#  B#   uB B   8 7G 8 2 5 5 5 5 5 5 5 K 5    7 R< u+   F 7 9 : <0 Y Z \~ xG  0 ~ " $ & 4 5 60 80 A) I) S c) k m r    0  6 ! n o p3 q r s t u v7                         0 ~  0  ~  0  ~  0  ~ 0 k w     L    5  62  <  @  A  B  C  R  b  n  o  qG  x!     * u K =    D E J K N O         @ C T g        , h i     9 ; = ? A G I K    F    !                %  T  Z  w  I u#  D F G H J P Q R S T U V ]                 < H ] ` b g u                              / 1 3 4 5 6 N O Y ^ a b c     # % ' ) / U W Y [ ] _ a y               7              !  /  1  3  9  ;  S  U  V  W  Z  s  v   >  u?   7 $ D9 F8 G8 H8 R8 T8 V8 X        9 8 8 8 8    9 8 8 8 8 8  8 3 H8 `8 b8 g9 i o 8     9 8 8   9   8 8  8 8 8 8  8 8  8  8 8 8 8 8 8 9 8 L L  8 . 38 48 58 68 7 8 9 <7 G I J K L U( XJ Y8 ^8 a8 b8 c8   8 8   9 #8 %8 '8 )8 /8 y8    9  9            8 8 8 8                 =  9E  9  8  8  8     9    9    9    9    9    9  /8  18  4+  5  98  ;8  S8  v8  ~C  8   8 F G H R T           H ` b                   3 4 5 6 72 8 9B JH KH LE Y ^ a b c E !   # % ' ) /            (        /  1  5K  9  ;  S  v    / / / 7 8 !  5&     $- 9 : < DA - - - - - -   A   - - - A    4 6 8 E S gA i r   -  - -  A  -  A - -   -  -  -  A 7 8 9 <> J K L U2 _    - A E         A - A - - - - - - - - - - -                   -   A    -  A  -  A  -  A  -  A  -  A  -  A  (  )  47  5  6  @  B  G  L  n  x  }    7 8 9* J0 K0 L, T? ,           2    5A  D E J K N O  @ C T g        , h i     9 ; = ? A G I K    F !        % T Z w I !E !K !N !O !S !Y !Z ![ !\ ! ! ! ! ! ! ! !5 !@ !C !T ! ! ! ! !! !, !R( !h !i !u !9 ! ! ! ! ! !9 !; != !? !A !G !I !K ! ! ! ! ! ! ! ! ! ! ! ! ! ! !  ! % ! 3 ! A ! C ! T ! w ! - "xT " " " "C2 "l "m "9 " =* " qT #  $F $G $H $R $T $X $Y< $Z< $\L $lK $xa ${K $ $ $ $ $L $ $ $ $ $ $ $3 $5< $H $` $b $o $ $ $ $ $ $ $ $ $ $ $ $K $. $ $ $ $ $ $ $ $!< $"6 $. $3 $4 $5 $6 $C $G $I $Y $^ $a $b $c $l $m $ $ $< $< $ $# $% $' $) $/ $ $ $ $< $< $< $D $< $< $L $< $ $ $ $ $ $ $ L $ L $ L $9 $ < $ 3 $ $ $ $ / $ 1 $ 9 $ ; $ = $ A< $ C< $ S $ qa $ v $ %  % G &F &G &H &R &T &X &Y< &Z< &\L &lK &xa &{K & & & & &L & & & & & & &3 &5< &H &` &b &o & & & & & & & & & & & &K &. & & & & & & & &!< &"6 &. &3 &4 &5 &6 &C &G &I &Y &^ &a &b &c &l &m & & &< &< & &# &% &' &) &/ & & & &< &< &< &D &< &< &L &< & & & & & & & L & L & L &9 & < & 3 & & & & / & 1 & 9 & ; & = & A< & C< & S & qa & v & 'uC ' ' 9 (7 (9 (: (< ( (" ($ (& (4 (6 (8 (A (I (S (c (kN (mQ (r ( ( (@ ( (C (RD (l (m (n (o (q (r (s (t (u ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (k (w ( ( ( (  ( ( ( ) ( 6 ( 4 , DD , } , " -R -r@ -s/ -u - - c - R -  -  .$ . . . . . . .O . . . . . . .O . .O . . . . . .7 .8 .9 . 4$ 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 47 48g 49 4J 4K 4L 4TH 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4+ 4+ 4+ 4+ 4+ 4+ 4+ 4J 4+ 4 4 4 4 J 4 4  4  4  4  4  4  4 4A 4 5 4 ~ 4 5E 5K 5N 5O 5S 5Y 5Z 5[ 5\ 5 5 5 5 5 5 5 55 5@ 5C 5T 5 5 5 5 5! 5, 5R( 5h 5i 5u 59 5 5 5 5 5 59 5; 5= 5? 5A 5G 5I 5K 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5  5 % 5 3 5 A 5 C 5 T 5 w 5 - 6$ 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 67 68g 69 6J 6K 6L 6TH 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6+ 6+ 6+ 6+ 6+ 6+ 6+ 6J 6+ 6 6 6 6 J 6 6  6  6  6  6  6  6 4A 6 5 6 ~ 6 7R/ 7u 7 7 > 8- 8M 8 8P 8Q? 8 8 8 80L 8AL 8B 8D 8[ 8 8C 8 8  8 5 8 O 8 C 9M 9 9Q1 9 9 90Y 9A: 9B 9D 9[ 9uI 9C 9 9 9 5 9 D 9 9 :-2 :MX :X :\ : : :2 : :3 :7 :P2 :Q :\ :o :' : :7 : : : : :. :0 :A :B` :D, :G :I :[ : : :C : : : : : : : : : : : : : : 5[ : O :  :  ;r: ;s' ;u ; ;L ; ; z ; R! ; n2 ; ! ; < < < < ' =RJ =u =D =6 = = >7 >9 >: >< > >" >$ >& >4 >6 >8 >A5 >I5 >S >c5 >k >m >r > > > 3 >nL >oL >qL >s3 >tL >u >& >L >L >F > >L > > > > > > > > > > > > > >  >  > >kL >wL > > > z >  > < > @ > B > R > b > o@ > x# > L > >  ?RE ?s# ?u ? ?- ? v ? nE ? @$ @D9 @F8 @G8 @H8 @R8 @T8 @V8 @X @ @ @ @ @ @ @ @9 @8 @8 @8 @8 @ @ @ @9 @8 @8 @8 @8 @8 @ @8 @3 @H8 @`8 @b8 @g9 @i @o @8 @ @ @ @ @9 @8 @8 @ @ @9 @ @ @8 @8 @ @8 @8 @8 @8 @ @8 @8 @ @8 @ 8 @8 @8 @8 @8 @8 @9 @8 @L @L @ 8 @. @38 @48 @58 @68 @7 @8 @9 @<7 @G @I @J @K @L @U( @XJ @Y8 @^8 @a8 @b8 @c8 @ @ @8 @8 @ @ @9 @#8 @%8 @'8 @)8 @/8 @y8 @ @ @ @9 @ @9 @ @ @ @ @ @ @ @ @ @ @ @8 @8 @8 @8 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @= @ @9E @ 9 @ 8 @ 8 @ 8 @ @  @ 9 @  @ 9 @  @ 9 @  @ 9 @  @ 9 @  @ 9 @ /8 @ 18 @ 4+ @ 5 @ 98 @ ;8 @ S8 @ v8 @ ~C @ 8 @ @ 8 AF AG AH AR AT A A A A A A A A A A AH A` Ab A A A A A A A A A A A A A A A A A A A3 A4 A5 A6 A72 A8 A9B AJH AKH ALE AY A^ Aa Ab Ac AE A! A A A# A% A' A) A/ A A A A A A A A A A A A( A A A A A A A / A 1 A 5K A 9 A ; A S A v A A  B< BD< BFC BGC BHC BRC BSt BTC BV` BX Bx< B B< BC BC B BC BC B< BC BC BC BC BC B B B BC B3 B6 B8 BHC BL2 B`C BbC Bg< Bi Bo B B BC BI B< BC B BC B< B B B` BC BC BC B BC BC BC B` B BC B C BC BC BC BC BC BI B< BC BK B? B? B C B. B3C B4C B5C B6C B86 BG BI BLJ BU> BX: BYC B^C B_ BaC BbC BcC BJ BC BC B B< B#C B%C B'C B)C B/C B12 BE By` B B B B B< B< BC BC BC BC B B B B B B B; B; B; B; B; B& B. B& B; B; B# B; B) BL B9 B < B C B C B C B B < B < B < B < B < B < B -% B /C B 1C B 3t B 9C B ;C B Q2 B SC B a+ B iI B q< B u% B vC B C B  B ` C7 C8 C9* CJ0 CK0 CL, CT? C, C C C C C C C C C C C2 C C C 5A C D D D D : D En5 Eo5 Ep8 Eq5 Er+ Es! Et5 Eu Ev: E E5 E5 E( E E5 Ek5 Ew5 E q E R E n* E 5 E  E E K E F;6 F<2 F2 F62 F82 Fm& F2 F< FI FR7 FuF F6 F6 F2 F2 F 2 F 2 F2 F F 9 F F DH F } F 5 F D GE GK GN GO GS GY GZ G[ G\ G G G G G G G G5 G@ GC GT G G G G G! G, GR( Gh Gi Gu G9 G G G G G G9 G; G= G? GA GG GI GK G G G G G G G G G G G G G G G  G % G 3 G A G C G T G w G - H;* H H H H7 H8 H9/ HLI HTB HI H H* H* H$ H H H H H H H HJ H H  H 1 H 5* H }/ H ~K H IE IK IN IO IS IY IZ I[ I\ I I I I I I I I5 I@ IC IT I I I I I! I, IR( Ih Ii Iu I9 I I I I I I9 I; I= I? IA IG II IK I I I I I I I I I I I I I I I  I % I 3 I A I C I T I w I - J$ J J J J J J Jn J J J J J J Jn J Jn J J J J J J7 J8 J9 JJ JK JL J Jg J J J J J J J J J J J J J J, J, J, J, J, J, J, J_ J, J J J J J  J  J  J  J  J  J 44 J 5 J ~ J K8 KJ K  K D L 5 MRB Mu M M $ Oi O O O7K O8 OF OF OF OF OF OF OF O? OF O O 3 P7( P8 P94 PJ@ PK@ PL@ PTI P@ P8 P P P P P P P P P P7 P 7 P P E P ~; P QE QK QN QO QS QY QZ Q[ Q\ Q Q Q Q Q Q Q Q5 Q@ QC QT Q Q Q Q Q! Q, QR( Qh Qi Qu Q9 Q Q Q Q Q Q9 Q; Q= Q? QA QG QI QK Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q  Q % Q 3 Q A Q C Q T Q w Q - R$ R R R R R R R R R R R R R R R R R R R R R R7 R8m R9 R Z % [D [E [J [K [N [O [ [ [ [ [ [ [ [ [@ [C [T [g [ [ [ [ [ [ [ [, [h [i [ [ [ [ [9 [; [= [? [A [G [I [K [ [ [ [F [ [ [ ! [  [  [  [  [  [  [  [ % [ T [ Z [ w [ I \ % ]x ]9 ] D ] a? ] q ^R< ^ A ^ ! _i _< _CL _lG _mG _ H ` 1 aQ a0 aA aR+ au a? a a ! a dB d 5L d  eR6 eu e8 e. e e  f$ fD fF fG fH fJ fP+ fQ+ fR fT fU+ fV fYL fZL f]+ fx f f f f f f f f f f f f f f f f f f f f f fL f+ f+ f+ f ( f f+ f5L f<+ fH fL f]+ f` fb fg fi fsL fu+ f f+ f f f f f f f f f fL f+ f f f f7 f f f f f+ f f f f+ f f f f f f+ f f f f < f f+ f f f f f f f f< f f f f!L f/+ f1+ f3 f4 f5 f6 f7 f8 f9 f:1 f< f@ fJ fK fL fME fN+ fO+ fU fX fY f^ fa fb fc f f f f fL fL f+ f f f f7 f# f% f' f) f/ f1 fU+ fW+ fY+ f[+ f]+ f_+ fa+ fy fL fL fL fL fL f+ f+ fL f f f f f f f f f f f f f f f f7 f f7 f f7 f f f f f f f f f f f f f f f f f f9 f f + f L f f f f p f  f  f  f  f  f  f  f  f  f  f  f  f  f !+ f - f / f 1 f 4 f 5I f 9 f ; f AL f CL f Q f S f U+ f V+ f W+ f Z f ^L f a f e f gL f i f q f s+ f u f v f ~ f f f f  g7 g8a g9 gJ gK gL gT g_B g g g g g g g g g g g g g3 g g g 8 g h=E hC hl hm m$C mC mC mC mC mC mC m& mC mC mC mC mC mC m& mC m& mC mC mC mC mC m7) m8 m9A mJ- mK- mL) m) m mC mC mC mC mC mC mC mC mC mC mC mC mC mC m C m C m C m C m C m C m 5+ m n7 n8w n9 nJ nK nL n nh n+ n 5 n q7& q9E q:E q; q< q=9 q q q"& q$& q&6 q4E q6 q8 q99 q;9 q=9 qSE qh qm qrE qv@ q q@ q q& q9 q q" q q G q7 q8m q9 qJB qKB qL7 qR qT q7 q q& q& q& q& qE qE qE qE qE qE qE q q q q9 q9 q9 q q q q q q 9 q  q E q q 9 q & q 5 q > q @E q BE q D$ q }d q ~ q  q 1 q rM rQ5 r0 rA5 rB rD r 5 r  sM sQ5 s s0 sA5 sB sD sRL su s2 s- s s s 5 s s  u " vQ vA vu= v v wM wQ5 w w0 wA5 wB wD wRL wu w2 w- w w w 5 w w  {7 {9 {: {< { {" {$ {& {4 {6 {8 {A {I {S {c {kN {mQ {r { { {@ { {C {RD {l {m {n {o {q {r {s {t {u { { { { { { { { { { { { { { { { { { { { { { {k {w { { { {  { ( { ) { 6 { ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  uni00A0uni00B2uni00B3uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccentuni0122uni0123 Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonek IdotaccentIJij Jcircumflex jcircumflexuni0136uni0137 kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146Ncaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01C4uni01C5uni01C6uni01C7uni01C8uni01C9uni01CAuni01CBuni01CCuni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3uni01E4uni01E5Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F1uni01F2uni01F3uni01F4uni01F5uni01F6uni01F7uni01F8uni01F9 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217uni0218uni0219uni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0222uni0223uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236uni0237uni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0242uni0243uni0244uni0245uni0246uni0247uni0248uni0249uni024Auni024Buni024Cuni024Duni024Euni024Funi0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BAuni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C2uni02C3uni02C4uni02C5uni02C8uni02C9uni02CAuni02CBuni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D4uni02D5uni02D6uni02D7uni02DEuni02DFuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EAuni02EBuni02ECuni02EDuni02EEuni02EFuni02F0uni02F1uni02F2uni02F3uni02F4uni02F5uni02F6uni02F7uni02F8uni02F9uni02FAuni02FBuni02FCuni02FDuni02FEuni02FF gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0342uni0343uni0344uni0345uni0346uni0347uni0348uni0349uni034Auni034Buni034Cuni034Duni034Euni0350uni0351uni0352uni0353uni0354uni0355uni0356uni0357uni0358uni0359uni035Auni035Buni035Cuni035Duni035Euni035Funi0360uni0361uni0362uni0363uni0364uni0365uni0366uni0367uni0368uni0369uni036Auni036Buni036Cuni036Duni036Euni036Funi0370uni0371uni0372uni0373uni0374uni0375uni0376uni0377uni037Auni037Buni037Cuni037Duni037Euni037Ftonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9 IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03CFuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03E2uni03E3uni03E4uni03E5uni03E6uni03E7uni03E8uni03E9uni03EAuni03EBuni03ECuni03EDuni03EEuni03EFuni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0487uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni0514uni0515uni0516uni0517uni0518uni0519uni051Auni051Buni051Cuni051Duni051Euni051Funi0520uni0521uni0522uni0523uni0524uni0525uni0526uni0527uni0528uni0529uni052Auni052Buni052Cuni052Duni052Euni052Funi0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055Cuni055Duni055Euni055Funi0561uni0562uni0563uni0564uni0565uni0566uni0567uni0568uni0569uni056Auni056Buni056Cuni056Duni056Euni056Funi0570uni0571uni0572uni0573uni0574uni0575uni0576uni0577uni0578uni0579uni057Auni057Buni057Cuni057Duni057Euni057Funi0580uni0581uni0582uni0583uni0584uni0585uni0586uni0587uni0589uni058Auni058Duni058Euni058Funi0E3Funi10A0uni10A1uni10A2uni10A3uni10A4uni10A5uni10A6uni10A7uni10A8uni10A9uni10AAuni10ABuni10ACuni10ADuni10AEuni10AFuni10B0uni10B1uni10B2uni10B3uni10B4uni10B5uni10B6uni10B7uni10B8uni10B9uni10BAuni10BBuni10BCuni10BDuni10BEuni10BFuni10C0uni10C1uni10C2uni10C3uni10C4uni10C5uni10C7uni10CDuni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10F6uni10F7uni10F8uni10F9uni10FAuni10FBuni10FCuni10FDuni10FEuni10FFuni16A0uni16A1uni16A2uni16A3uni16A4uni16A5uni16A6uni16A7uni16A8uni16A9uni16AAuni16ABuni16ACuni16ADuni16AEuni16AFuni16B0uni16B1uni16B2uni16B3uni16B4uni16B5uni16B6uni16B7uni16B8uni16B9uni16BAuni16BBuni16BCuni16BDuni16BEuni16BFuni16C0uni16C1uni16C2uni16C3uni16C4uni16C5uni16C6uni16C7uni16C8uni16C9uni16CAuni16CBuni16CCuni16CDuni16CEuni16CFuni16D0uni16D1uni16D2uni16D3uni16D4uni16D5uni16D6uni16D7uni16D8uni16D9uni16DAuni16DBuni16DCuni16DDuni16DEuni16DFuni16E0uni16E1uni16E2uni16E3uni16E4uni16E5uni16E6uni16E7uni16E8uni16E9uni16EAuni16EBuni16ECuni16EDuni16EEuni16EFuni16F0uni16F1uni16F2uni16F3uni16F4uni16F5uni16F6uni16F7uni16F8uni1D00uni1D01uni1D04uni1D05uni1D06uni1D07uni1D0Auni1D0Buni1D0Duni1D0Funi1D18uni1D1Buni1D1Cuni1D20uni1D21uni1D22uni1D35uni1D6Buni1D79uni1DCDuni1DCEuni1DCFuni1DD0uni1DD1uni1DD2uni1DD4uni1DD5uni1DD6uni1DD7uni1DD8uni1DD9uni1DDAuni1DDBuni1DDCuni1DDDuni1DDEuni1DDFuni1DE0uni1DE1uni1DE2uni1DE3uni1DE4uni1DE5uni1DE6uni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E14uni1E15uni1E16uni1E17uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E2Euni1E2Funi1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E4Euni1E4Funi1E50uni1E51uni1E52uni1E53uni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E64uni1E65uni1E66uni1E67uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Auni1E7Buni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Auni1E9Buni1E9Cuni1E9Duni1E9Euni1E9Funi1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1EFAuni1EFBuni1EFCuni1EFDuni1EFEuni1EFFuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni2010uni2011 figuredashuni2015uni2016 underscoredbl quotereverseduni201Funi2023onedotenleadertwodotenleaderuni2027uni2031minuteseconduni2034uni2035uni2036uni2037uni2038uni203B exclamdbluni203Duni203Euni203Funi2040uni2041uni2042uni2043uni2045uni2046uni2047uni2048uni2049uni204Auni204Buni204Cuni204Duni204Euni204Funi2050uni2051uni2052uni2053uni2054uni2055uni2056uni2057uni2058uni2059uni205Auni205Buni205Cuni205Duni205Euni205Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni2095uni2096uni2097uni2098uni2099uni209Auni209Buni209Cuni20A0 colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20B6uni20B7uni20B8uni20B9uni20BAuni20BBuni20BCuni20BDuni20BEuni2100uni2101uni2102uni2103uni2104uni2105uni2106uni2107uni2108uni2109uni210Auni210Buni210Cuni210Duni210Euni210Funi2110Ifrakturuni2112uni2113uni2114uni2115uni2116uni2117 weierstrassuni2119uni211Auni211BRfrakturuni211D prescriptionuni211Funi2120uni2121uni2123uni2124uni2125uni2127uni2128uni2129uni212Auni212Buni212Cuni212D estimateduni212Funi2130uni2131uni2132uni2133uni2134alephuni2136uni2137uni2138uni2139uni213Auni213Buni213Cuni213Duni213Euni213Funi2140uni2141uni2142uni2143uni2144uni2145uni2146uni2147uni2148uni2149uni214Auni214Buni214Cuni214Duni214Euni214Funi2150uni2151uni2152onethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2160uni2161uni2162uni2163uni2164uni2165uni2166uni2167uni2168uni2169uni216Auni216Buni216Cuni216Duni216Euni216Funi2170uni2171uni2172uni2173uni2174uni2175uni2176uni2177uni2178uni2179uni217Auni217Buni217Cuni217Duni217Euni217Funi2180uni2181uni2182uni2183uni2184uni2185uni2186uni2187uni2188uni2189uni218Auni218B arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21DEuni21DFuni21E0uni21E1uni21E2uni21E3uni21E4uni21E5uni21E6uni21E7uni21E8uni21E9uni21EAuni21EBuni21ECuni21EDuni21EEuni21EFuni21F0uni21F1uni21F2uni21F3uni21F4uni21F5uni21F6uni21F7uni21F8uni21F9uni21FAuni21FBuni21FCuni21FDuni21FEuni21FF universaluni2201 existentialuni2204emptysetgradientelement notelementuni220Asuchthatuni220Cuni220Duni220Euni2210uni2213uni2214uni2215 asteriskmathuni2218uni2219uni221Buni221C proportional orthogonalangleuni2221uni2222uni2223uni2224uni2225uni2226 logicaland logicalor intersectionunionuni222Cuni222Duni222Euni222Funi2230uni2231uni2232uni2233 thereforeuni2235uni2236uni2237uni2238uni2239uni223Auni223Bsimilaruni223Duni223Euni223Funi2240uni2241uni2242uni2243uni2244 congruentuni2246uni2247uni2249uni224Auni224Buni224Cuni224Duni224Euni224Funi2250uni2251uni2252uni2253uni2254uni2255uni2256uni2257uni2258uni2259uni225Auni225Buni225Cuni225Duni225Euni225F equivalenceuni2262uni2263uni2266uni2267uni2268uni2269uni226Auni226Buni226Cuni226Duni226Euni226Funi2270uni2271uni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279uni227Auni227Buni227Cuni227Duni227Euni227Funi2280uni2281 propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni2288uni2289uni228Auni228Buni228Cuni228Duni228Euni228Funi2290uni2291uni2292uni2293uni2294 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1uni22A2uni22A3uni22A4 perpendicularuni22A6uni22A7uni22A8uni22A9uni22AAuni22ABuni22ACuni22ADuni22AEuni22AFuni22B0uni22B1uni22B2uni22B3uni22B4uni22B5uni22B6uni22B7uni22B8uni22B9uni22BAuni22BBuni22BCuni22BDuni22BEuni22BFuni22C0uni22C1uni22C2uni22C3uni22C4dotmathuni22C6uni22C7uni22C8uni22C9uni22CAuni22CBuni22CCuni22CDuni22CEuni22CFuni22D0uni22D1uni22D2uni22D3uni22D4uni22D5uni22D6uni22D7uni22D8uni22D9uni22DAuni22DBuni22DCuni22DDuni22DEuni22DFuni22E0uni22E1uni22E2uni22E3uni22E4uni22E5uni22E6uni22E7uni22E8uni22E9uni22EAuni22EBuni22ECuni22EDuni22EEuni22EFuni22F0uni22F1uni22F2uni22F3uni22F4uni22F5uni22F6uni22F7uni22F8uni22F9uni22FAuni22FBuni22FCuni22FDuni22FEuni22FFuni2300uni2301houseuni2303uni2304uni2305uni2306uni2307uni2308uni2309uni230Auni230Buni230Cuni230Duni230Euni230F revlogicalnotuni2311uni2312uni2313uni2314uni2315uni2316uni2317uni2318uni2319uni231Auni231Buni231Cuni231Duni231Euni231F integraltp integralbtuni2322uni2323uni2324uni2325uni2326uni2327uni2328 angleleft anglerightuni232Buni232Cuni232Duni232Euni232Funi2330uni2331uni2332uni2333uni2334uni2335uni237Buni237Cuni237Duni237Euni237Funi2380uni2381uni2382uni2383uni2384uni2385uni2386uni2387uni2388uni2389uni238Auni238Buni238Cuni238Duni238Euni238Funi2390uni2391uni2392uni2393uni2394uni2396uni2397uni2398uni2399uni239Auni23CDuni23CEuni23CFuni23D1uni23D2uni23D3uni23D4uni23D5uni23D6uni23D7uni23D8uni23D9uni23DAuni23DBuni23E2uni23E3uni23E4uni23E5uni23E6uni23E7uni23E8uni23E9uni23EAuni23EBuni23ECuni23EDuni23EEuni23EFuni23F0uni23F1uni23F2uni23F3uni23F4uni23F5uni23F6uni23F7uni23F8uni23F9uni23FAuni23FBuni23FCSF100000SF110000SF010000SF030000SF020000SF040000SF080000SF090000SF060000SF070000SF050000SF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000upblockdnblockblocklfblockrtblockltshadeshadedkshade filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2601uni2602uni2603uni2604uni2605uni2606uni2607uni2608uni2609uni260Auni260Buni260Cuni260Duni260Euni260Funi2610uni2611uni2612uni2613uni2614uni2615uni2616uni2617uni2618uni2619uni261Auni261Buni261Cuni261Duni261Euni261Funi2620uni2621uni2622uni2623uni2624uni2625uni2626uni2627uni2628uni2629uni262Auni262Buni262Cuni262Duni262Euni262Funi2630uni2631uni2632uni2633uni2634uni2635uni2636uni2637uni2638uni2639 smileface invsmilefacesununi263Duni263Euni263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647uni2648uni2649uni264Auni264Buni264Cuni264Duni264Euni264Funi2650uni2651uni2652uni2653uni2654uni2655uni2656uni2657uni2658uni2659uni265Auni265Buni265Cuni265Duni265Euni265Fspadeuni2661uni2662clubuni2664heartdiamonduni2667uni2668uni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2670uni2671uni2672uni2673uni2674uni2675uni2676uni2677uni2678uni2679uni267Auni267Buni267Cuni267Duni267Euni267Funi2680uni2681uni2682uni2683uni2684uni2685uni2686uni2687uni2688uni2689uni268Auni268Buni268Cuni268Duni268Euni268Funi2690uni2691uni2692uni2693uni2694uni2695uni2696uni2697uni2698uni2699uni269Auni269Buni269Cuni269Duni269Euni269Funi26A0uni26A1uni26A2uni26A3uni26A4uni26A5uni26A6uni26A7uni26A8uni26A9uni26AAuni26ABuni26ACuni26ADuni26AEuni26AFuni26B0uni26B1uni26B2uni26B3uni26B4uni26B5uni26B6uni26B7uni26B8uni26B9uni26BAuni26BBuni26BCuni26BDuni26BEuni26BFuni26C0uni26C1uni26C2uni26C3uni26C4uni26C5uni26C6uni26C7uni26C8uni26C9uni26CAuni26CBuni26CCuni26CDuni26CEuni26CFuni26D0uni26D1uni26D2uni26D3uni26D4uni26D5uni26D6uni26D7uni26D8uni26D9uni26DAuni26DBuni26DCuni26DDuni26DEuni26DFuni26E0uni26E1uni26E2uni26E3uni26E4uni26E5uni26E6uni26E7uni26E8uni26E9uni26EAuni26EBuni26ECuni26EDuni26EEuni26EFuni26F0uni26F1uni26F2uni26F3uni26F4uni26F5uni26F6uni26F7uni26F8uni26F9uni26FAuni26FBuni26FCuni26FDuni26FEuni26FFuni2700uni2701uni2702uni2703uni2704uni2705uni2706uni2707uni2708uni2709uni270Auni270Buni270Cuni270Duni270Euni270Funi2710uni2711uni2712uni2713uni2714uni2715uni2716uni2717uni2718uni2719uni271Auni271Buni271Cuni271Duni271Euni271Funi2720uni2721uni2722uni2723uni2724uni2725uni2726uni2727uni2728uni2729uni272Auni272Buni272Cuni272Duni272Euni272Funi2730uni2731uni2732uni2733uni2734uni2735uni2736uni2737uni2738uni2739uni273Auni273Buni273Cuni273Duni273Euni273Funi2740uni2741uni2742uni2743uni2744uni2745uni2746uni2747uni2748uni2749uni274Auni274Buni274Cuni274Duni274Euni274Funi2750uni2751uni2752uni2753uni2754uni2755uni2756uni2757uni2758uni2759uni275Auni275Buni275Cuni275Duni275Euni275Funi2760uni2761uni2762uni2763uni2764uni2765uni2766uni2767uni2768uni2769uni276Auni276Buni276Cuni276Duni276Euni276Funi2770uni2771uni2772uni2773uni2774uni2775uni2776uni2777uni2778uni2779uni277Auni277Buni277Cuni277Duni277Euni277Funi2780uni2781uni2782uni2783uni2784uni2785uni2786uni2787uni2788uni2789uni278Auni278Buni278Cuni278Duni278Euni278Funi2790uni2791uni2792uni2793uni2794uni2795uni2796uni2797uni2798uni2799uni279Auni279Buni279Cuni279Duni279Euni279Funi27A0uni27A1uni27A2uni27A3uni27A4uni27A5uni27A6uni27A7uni27A8uni27A9uni27AAuni27ABuni27ACuni27ADuni27AEuni27AFuni27B0uni27B1uni27B2uni27B3uni27B4uni27B5uni27B6uni27B7uni27B8uni27B9uni27BAuni27BBuni27BCuni27BDuni27BEuni27BFuni27C0uni27C1uni27C2uni27C3uni27C4uni27C5uni27C6uni27C7uni27E1uni27E6uni27E7uni2980uni2981uni2982uni2983uni2984uni2991uni2992uni299Cuni29BEuni29BFuni29CEuni29CFuni29D0uni29D1uni29D2uni29D3uni29D4uni29D5uni29D6uni29D7uni29DFuni29E6uni29E7uni29E8uni29E9uni29EBuni29F4uni29FAuni29FBuni29FEuni2AFDuni2B16uni2B17uni2B18uni2B19uni2C60uni2C61uni2C62uni2C63uni2C64uni2C65uni2C66uni2C69uni2C6Auni2C6Buni2C6Cuni2C6Duni2C6Euni2C6Funi2C70uni2C72uni2C73uni2C74uni2C77uni2C78uni2C79uni2C7Auni2C7Buni2C7Cuni2C7Duni2C7Euni2C7Funi2D00uni2D01uni2D02uni2D03uni2D04uni2D05uni2D06uni2D07uni2D08uni2D09uni2D0Auni2D0Buni2D0Cuni2D0Duni2D0Euni2D0Funi2D10uni2D11uni2D12uni2D13uni2D14uni2D15uni2D16uni2D17uni2D18uni2D19uni2D1Auni2D1Buni2D1Cuni2D1Duni2D1Euni2D1Funi2D20uni2D21uni2D22uni2D23uni2D24uni2D25uni2D27uni2D2Duni2E00uni2E0Cuni2E0Duni2E0Euni2E16uni2E17uni2E19uni2E1Cuni2E1Duni2E1Euni2E1Funi2E20uni2E21uni2E22uni2E23uni2E24uni2E25uni2E26uni2E27uni2E28uni2E29uni2E2Auni2E2Buni2E2Cuni2E2Duni2E2Euni2E2Funi2E3Euni2E3Funi2E40uni3018uni3019uniA64CuniA726uniA727uniA728uniA729uniA730uniA731uniA732uniA733uniA734uniA735uniA736uniA737uniA738uniA739uniA73AuniA73BuniA73CuniA73DuniA73EuniA73FuniA740uniA741uniA742uniA743uniA744uniA745uniA746uniA747uniA748uniA749uniA74AuniA74BuniA74CuniA74DuniA74EuniA74FuniA750uniA751uniA752uniA753uniA754uniA755uniA756uniA757uniA758uniA759uniA75AuniA75BuniA75CuniA75DuniA75EuniA75FuniA760uniA761uniA762uniA763uniA764uniA765uniA766uniA767uniA768uniA769uniA76AuniA76BuniA76CuniA76DuniA76EuniA76FuniA770uniA771uniA772uniA773uniA774uniA775uniA776uniA777uniA778uniA779uniA77AuniA77BuniA77CuniA77DuniA77EuniA77FuniA780uniA781uniA782uniA783uniA784uniA785uniA786uniA787uniA788uniA789uniA78AuniA78BuniA78CuniA78DuniA78EuniA78FuniA790uniA791uniA792uniA793uniA794uniA795uniA7AAuniA7ABuniA7ACuniA7ADuniA7AEuniA7B0uniA7B1uniA7B3uniA7B4uniA7B5uniA7B6uniA7B7uniA7F7uniA7F8uniA7F9uniA7FAuniA7FBuniA7FCuniA7FDuniA7FEuniA7FFuniAB57uniAB65LP_graveLP_acute LP_circumflexLP_caronLP_tilde LP_2_grave LP_2_acuteLP_breve LP_un_breveLP_ringLP_hook LP_diaresis Qu.lig.smallQu.ligctQ.smallX.small Thorn.smalluniF000 Cyrilic_BreveuniF6D5uniF6D6uniF6D7uniF6D8uniF6D9uniF6DAuniF6DBuniF6DCuniF6DDuniF6DEuniF6DFuniF6E0CE_markstrokeTrebleBassAJHTJHMRPwr_PlgCtr_PosCtr_NegUSBBitcoinuniFB00uniFB01uniFB02uniFB03uniFB04uniFB05uniFB06uniFB13uniFB14uniFB15uniFB16uniFB17Spike|}*+45;<;<<=            *8latn NLD kern & :{\ng0~G)637L2!*%!FIt3`j`tLtFD(; 97 9 88(=+CEL7JABL??1E/I8IK<<C`6J>;&.#)LK2I?:%+t~K=A25:6,HAI8789-(>/C> I(k J?"?7K2BHE!( %A*0,2?J@%4&9@&E 6G&1mB7"  9 @$d>@21*$/IJKB*/=30)t-G?;+EII.30@:9H9%I!CI4 IA*0,2?A*0,25314~@9RJVz(KHh.k7;)J7&Hz%1RW#* 96#9J2?!+"__Q+[&]&bGI2 /:5/5("':DI ,(!?:K?8.63FIn J w% G0E(7?!*H.y"HA4D0= /3C;L9 I  xW'xL! 7!6I0"<2J* =4 *-!0KF22 DHL J 4 S&,H=3+KF 0q5+ ]$%')./1=DFHKNNP]ll*xx+{{,-48@JQRWXfghiklmstuvwxy{   "8::<<>ADILLNTWZ\eghkkuu~~!"'(.035  68:;<  ='(>,,@00A34B66DGGEMMFOOGVWHZZJaaKcdLhiNPTUWXYZ ]""_$$`&&a((b**c,,d..e00f25g77k99l;;m==n??oDDpFJqLMvPPxRRyUUzWW{Y_|bbddftvy||~~               ! # $ & & ( ( * * 0 7 : :( @ C) G I- Q Q0 X X1 [ \2 a a4 e e5 q q6 u u7 { {8 9 = > @ A-$$%%''(())..//112233 44 55 66 77 889:;;<<==DDEEFFHHIIJJKKNNPPQQRRSSTTUUVV WW!XX"YZ#[[$\\%]]&ll'xx({{')*+,-.-/ 01234454"6789..:;&<<=>?@0AAAAB))CDEFGHIJKLM  N  O    554 P  Q      "" ##R$$ %%S&&T'' (())7**++7,,--7..//7001172233U4455#6677888::&<<&>>V??W@@AADDXEEFFGGYHHZIILL[NNOO\PPQQ]RRYSSTT^WW_XX!YY`ZZa\\]]b^^__c``daaebbcc dd5eefgg>hhkk uu ~~V477777/AA&A-/4-.00)45 P 9"7   Re 49<     2  ''"((,,003344&66GGMM#OOVVWWZZaa&ccddhhii& >#  ""$$&&((**,,..0022330445577A99;;==??DD)FFGGHHIIJJLLMMHPPRRUUWWYYZZ[[\\]]^^__bbddffgg5hhii5jj kkll mmnn ooPpp qqrr ss9tt vv ww0xx yy || ~~   RUU779######G8V&#8W.-....>0 4444cdcdcdccd""  8      89#  `   R #    O          "    #  %  ! ! # # $ $ & & ( ( * * 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 : : @ @ A A# B B C C% G G H H* I I Q Q X X [ [ \ \2 a a@ e eN q q( u u! { {  5     $  G$$*--R779:;;z<<=={DD#EE$FH+JJ%KK&MMSNO&PQ,RR+SSsTT+UU,VV-WW.XX/YZ[[)\\]],llBxx{{B*#+u++T***#++++&$tuu,RU&&&&,,  +,""##.$$%%.&&33/44556677T8899{;;{<<,=={@@$AA CC$EEyHH+II LLePPRQQVSSTT&\\W]],``+bb+cc gg#hh|ii0jj.kk mm oo/rrssfuu,vv}v+&,*g**#h&+}X+,*#i**uu-.&+{,*++T$,.Y+*+L-,w*+Z[  +  CD+,+g#+\j  +!!""E++,,&..///,00]11,36+771882993<<k@@lAA^BB_CCFDD`GG/II/JK4LL5MMmNO,RRMTTPUU6XXnYY+[[a^^+__xac+df.hi&jjlmGno ppqq rrsstt uuvv 57+b+, /*#$$$i##+%%+''+))+//+11e99&;;&==&??&AA&BBCCaDDEEuGG&II&KK&OOQQSSUU,WW,YY,[[,]],__,aa,yy-.///Hzz{{,{,&T#*#***********+i+i+i+//          T'ckk ww 89:98;8<*=>99I # . & { ,    J + Q + ?  {  &    .  o  *  #  *  #  *  #  *  #  *  #  *  # ! !, # # % %& ' ' ( )N + + - -p / /+ 1 1+ 3 3s 4 4@ 5 5 6 6 7 7 9 9+ ; ;+ < < = =K > >~ @ @ A A B B C C D D G G I I M M O O[ Q Qe R R S S+ T T& U W, Y Y. Z Z% a aq b b i ig m m n n o o q q s s, u up v v+ w w& x x } } ~ ~A  O + r  ! " ( d -noq?2ESuA+Y!5 5?A6A4%DBGn,~:7!+JJ%KL+GF439  J/H+754)( @J4 )G7.K.3i<>:4 7AK ,7 Fv'h  g:?&O%DBA>HAf*#&#,E)7CLEMJ'F<1(;1( @,=3*($/9:JK1B+&8 #?@?HA;9+@8F'JJ. 9/C \{f %D$&D3D&9,$KZN<]u0|K9G=E(4@@8 7;I74K>L? ; /K&& 4IHA2Cb)j)5mzqeezec${"JSTMa5;TDY/lZou64At-]sm !%B>CL=;D=9:C'B'KG257AK:)0F7<IKoKe!   1j [}V=1kaTF2'3<PLFMrhF@#G!r^r`1:Y>kn1\bJUS82SLk@Ya 6#a$'/z#eOe 7IB(($I'$I?<I'N(GF?, "KI K/^efijlmnoqrsxyz|}   !"&+DQbf  P ]eeffiijjllmmnnooqq rr ss xx yy zz||}} !"#$%&'()*+,-  .  /  0123456789:;<$!!="">&&-++6DD<QQbbff5+>  1 P P( + +Xh$$D,,i--j11i7788k9:l;;m<<nDDEEEoFHFJJ#KKpLLMM$NOpPQqRRFSS%TTFUUqVVGXXrYZH[[s\\]]qllxxI{{DJitiknEFuFFvDDDEFFFF&'()pottutuiiqjpwpppiqiqi    i  xFqy(!!""$$&&((k**k++,,k..k00k22k33r44l55H66n7788n<<q@@oAACCoEEHHFIIKKLLKPPjQQSSlTTpUUzYYZZ[[z\\]]q``FbbFccdd*eeiggEhh{ii@kkmmnnkoorqqzrrlss+uuqxx|yy}||~~~,-hFpiqDkkkkkLDDJE.&pFF)iqDJEMDDtutukkG pFqDFFnoq FDFGq DF    F  N  /FqFLEF0  F!!H""##$%''((w))++,,p--..r//q0011q22w36F77O88P99Q::1;;<<R>>w??@@SAABBCCDDEEFFGGrHHIIrJKTLLUMMVNOqPP2QQRRTTUUWWWXXXYYFZZw[[]]w^^F__acFhipjjkklmnoppqqrrssttuuvvAUYFwwwFHqrDEoooM##F%%F''F))F//F11K3377'99p;;p==p??pAApBBCCDDtEEuGGpIIpKKpMMOOQQSS3UUqWWqYYqZZi[[q\\i]]q^^i__q``iaaqkk4mm4qqyssuuyyyG}}Z55krkrkrkkllHlHlHl[lHlHmmnqqpHEDEDDDDDDDDDDDFMiiFMFMFkrkkkkkkrn    n    n  nzkkww\]^]\6\_D`a99? z E p q  l H F F 7   p    w  b  D  E  D  E  D  E  D  E  D  E  D  E ! !q # # % %p ' ' ( ) + + , , - -c / /F 1 1F 3 3% 4 4d 5 5 6 6 7 7 9 9F ; ;F < < = = ? ? @ @l A AH B Bl C CH D D E E8 G G I I9 J J K K: L L M M O O Q QK R RB S SF T Tp U Wq X Xw Z Z# [ [ ] ] ^ ^; ` ` a a< b b c c d d e e f f g g; h hk i iL m m n nC o o q qI r ri s sq t t u uc v vF w wp x x z z } } ~ ~e   = F f B w ! > g " G\]n_K5@,+1&3C2F';SIs8sB%::]4;;:;%j_w3`jM [S/Xhfw &HJ8G$Y$C VT?BG@ w< 8aB3 o&*L*5 9CJ E?J6D+C # 7E' "8f' -" j D kDZ<(0q*5] {482b&3C3244AD>6/3( > / FD2 02n~OJ2%/B99!"B7J$H$8fd='@dS1(=&[*O %H!B8B4*HC: K %EF;=,Ddz0E9C@.0?A#3P3aFb`!NFtRqQT$At{Z%* =+G \ :H8+;>=Ljemh !;Q3%%569mF1.=^6H/>GKH]\sw DF //Xnm~GL3 (0@;6K8BEX GG-7@;GBDJ!;I+?<F.%*CIAHB BM ~XBXcD;~%J$e?$)t,F*F<*MM@$%1+=% >8D  /#,K>4F2@<   @106  $)4:#I(Bc"#$%)./15789:;<=>@ABCEFHIJKLNPRSTUXY[\]^_eglmnopqrstuv/1ABCKNOQSauw  ) / = K R T U V g ]""##$$%%))..//1155 77 88 99 :: ;;<<==>>@@AABBCCEEFFHHIIJKLLNNPPRRSSTT UU!XX"YY#[[$\\%]]&^^'__(eegg)ll*mm+no,pp-qq.rr,ss/tt0uu.vv12,345678,9:;<//=11=AA>BB?CC@KKANNBOOCQQDSSEaa>uuFGHIJww,   ) ) / /7 = = K K7 R R0 T V g g ,S$$y779:<<DD~EETFHJJKKUMMNOURRSSTTVVYZ\\xxqyz~VWXyyy~UTYXXUUUU  W""$$&&4455667788@@TAACCTEEZHHIILLQQSSTTUZZ[``bbccddgg~ii\kkmmrrssxxyy~~ !S]]U^y_yyz~"U#$]yz~yyXX%UyTyy&    '~()  !!""u**v++`,,U003677G88H99I::*<<==s@@+AABB CCwDD,JKJLLKMMPP-QQ.RRTTLUUXXYY[[/^^__MachiUjjalmrnobppxqqbrrossCttbuu vvcRbdDKN0b1y~TTT##%%''))//117799U;;U==U??UAAUCC/EEXGGUIIUKKUMMOOeQQ2SS3kk4mm4qquuyy55Uf~y~yyygyyyyyyyyhh          i6kkbwwbF787F9FOyP99{ ~ U  Q    U      y  ~  y  ~  y  ~  y  ~  y  ~  y  ~ # #j % %U ' 'k ( ) + +W , ,t - - / / 1 1 3 3 4 4| 5 5 6 6 9 9 ; ; < < @ @ A A B B C C E E: G G; I I< K K= M M% O O& Q Q R RE S S T TU Z Z ^ ^> a a? b b c cl e e@ g g> i i n nm o o p pv q qq u u v v w wU x x ~ ~} A  b E p n B  ~NA7B&J(/'J@H+%L08FII8;JKJF 'KD:C@@t]=5$77*-.Z"BL55>9=B %7@IJ B]HhV r4;G::X> NQ rAJ''{5<% H@  G#J>*JMM9:<+2+* 3-:H4U4q 6K 35 $-4;=IJIfH;#,GJ<D"D;;:}JG; 6g29Ng4K6?@A/=;E-0.7%%-1 IC ,L<@BE"6CEG?,9 'K.I@#2E#QVN:V9O4&4. 8H3#4/L4+F<#&!/7-A>22*TGC9" :9D%L 4D7c /@<u@O(:A.?LLC1Y:9IDz!2':L'zL& 3 53 @#FvE-E# :q5*!+K8:(DF72&96 ? D E F J L M O S W Z ] ^ _ ` d f h m n r s v w ~  U      kk99              !  "  #  $  %  & " "' % %( ' ') , ,* - -+ . ., 8 8- 9 9. ; ;/ < <0 > >1 ? ?2 D D3 E E4 F F5 J J6 L L7 M M8 O O9 S S: W W; Z Z< ] ]= ^ ^> _ _? ` `@ d dA f fB h hC m mD n nE r rF s sG v vH w wG ~ ~I  J K  L Me$$1&&{**{--w22{44{7788899::;;]<<;==^DD|FH}II~JJMM PQRR}SSTT}UUVVWWXXYZ<[[\\]]ll=xxh{{=12{k{{9;|}~}}111|{{{}{}}}{{{{kkkw    {{{{}~""8##$$8%%&&>''((9))**9,,9--..9009112293344:55<66;7788;99^::;;^<<==^>?~AA?EEGG{HH}II?LLPPwQQ RR{SS:\\l]]^_{``}aa{bb}cc?gg|hh_iijjkk@mmAnn9ooppBrr:ssuuxxzz||~~}1{99999112|{{{}{}{12|{11kk{{~998m}^1}{{{}{; }1{}`aC1}x  {  }    DE}}|}y  }!!<""F**G--..//00 1136}77.8899/::;;<<==@@AA BBCCHDDIEEFFGGHHIIJK3LL4MMNOPPQQRRSSJTTUUVV{XXYY}[[i^^}__ ac}dfgg~lmKno!pptqq!rr+ss*tt!uuvvu"!v#4,}j}<!1|{!!##}%%}''}))}++//}1155~66{BBCCiDDkEEQQSSUUWWYY[[]]__aabb{dd{ff{hh{kkmmooqquuwwyy{{88LL99999:M:<:<:<:N:<:<]];^~^^n<|~1|11111111111}{}{{{{{{{{}{{{}9999999;    ;    ;  ;$b\kk!ww!-o5o-p-q16997 | ^ { O P : < Q } 0 }   ^  8      1  |  1  |  1  |  1  |  1  |  1  | ! ! ' '% ( )R , ,S - - . .{ / /} 0 0{ 1 1} 3 3 4 4 5 5 6 6T 8 8{ 9 9} : :{ ; ;} < <U = =V > >c ? ? @ @: A A< B B: C C< D Dd E E G G& I Ir L Ls M M O Ox Q Q R R' S S} U W Y Y Z Z [ [W \ \ ^ ^ ` `z a a b bX e e g g h h9 i i n n( o oY p pG q qh s s t t u u v v} x xZ y ye z z } }f ~ ~  g { }  ! '  [ )   ~  6latn NLD dlig,frac4hlig:liga@loclFpcapLsaltR"*2:BJ@tP:2 ( X  W W4FV6 ,     ! !)B   "( IL IO I L OIDW  Z(]2 >  M 4 D]  ~< &.6>FNV~}     R$:F -- MM - M,L:Dnx $ $ 2 8 9 < 02 $ D R X Y \ 1R W$2DR?N $*06<BH$               $     vedo-2023.4.6/vedo/fonts/Normografo.npz000066400000000000000000003306461444463326400176630ustar00rootroot00000000000000PK!4m font.npy ̽|U7>I =$! iГ-3;DņbAD@EE,4AJ(byTlA{n>}ޝ9|93Kk*~Lh=3GFJ4w[*Os3oNi4q:2zeM/t^>uƕӯԧ+gLiաЧMmlrЛB]Щ̳7^_짹nvr9oߍ@@tt#daB+[nvTB{aWXyyGd&Wv䊘jדIuEJkS\1䊝93_J M-Żti'Nn1GΞ`uߖoH$[f[$D&Y)I-8͖8]olVC06 ?A䣎 k؁#6&;ꨶ֯^_4PVt*[~jK~&W';8tr%p+IY>8U4 ċvkQ,_/ ڂA AB0hhP! m^6Dh6DD"D B4m, !^G$64mg(t m7.BwnB:hwhh/=h2@}A3@3+GWխ]3\钫{!U͇⼓醽 Ix&m/lO!>^&qO?Lh Y5񽰽;qS6ZWV+䥮ɕ<>\|Tgq^^*:CEk?*E2NVjuxDD^s[MfHu `llX-#jXrcJVo__V8#::A=WA7~[:#./'ecT w nr WgUaFx +^ &a 1U1W\|B!1rM14lgRqᢓJj[l!*ijM'u^hR=!H"QE6mRHl@y/BO=傶Em' =4?_½ !ea"Ao"m$zA/04c<pn0B(Aba$h v0Z%#+ZvP.V:AJB-jm=h`Ԏ&8IAe CMP (h=IDt2+@' S@&W j S+q)\tsW :H{iw0:Ch]@o8hFlw#_7R tu5T\EاKrRpW:)(Tރz:'JAb=*hսF)=&e:[/?:ݚaKyiP 8JRt|\ DU!M*]z,3ؓl ZmRg~%;[}A]0bN]֯ў,uc$@ވ+R{m}z(gi >%Z78rmE:0z6{=aײY_7ۣ_o'x)XQuM[E}NfΫF͟f(Pcq(6GPAyObpa;1}>L{K}LZ6G=(_|#k*GBA\l|EKuGjT=?{4(v#Uxs8O,j{x̦[{X-kW/ct`a`}*q/3;WƯL0cѸݘbld,7ٟ4T8Δ\)હu^ﳝ@'ǟu(Y=am0"+[;Q= #&  ^ h{RɾI$ m ΠZ"D;w)8G7|8Xt!YbN'{\D= 3@Dj={YBAdj"՞1E/<jy zAA;JhvpPr\%<JyH߱ǣ-;(*@'@ B QՀVQ蕂yj.&\ \t1)bRŤK AKAEŤI.&^ 孀r%^Lʼ*\5hAcL@LcDlBJ)S^I}:P|/WMPnv^v jYlЫk@g s@ ׂG;O<ho'zp3M-7 ",U tp;m"@o$.F;I $a IRehA':6棽t"ڻqw +@ Vރ;Y)܋J\M &twUHJTqrpO- |yP^/?(!S@ݬ<R\ah4;oy)TR%g屎7-^P^``埅? ˽2:Uj#@۠? ۾flKP::X+}~hOqr_L=~c]SˍUXcR^g/-˨g2g?gn>Fu_ל睩 8:C5d6 l(jPҐP4M倨'kY|l3EkjuNV+]=DIAGlݣ|II.K< vO[PG^}4c3lFZQkF=1qVU^ff-N/YdTa sKGvV{CB9㌞FQi|e=,QKJK=ծ~HLx*aK+<|1T=-ʛRխ*/*JtR*=r-կUy*y8ڧ8 ?vu<λ`ww଍=UN *kƅmv\^ Sy5r A 8(`@@A)v"@(Ma3O<'6!`7Pq Z<t $͠A eolO8v';z)LLAR A咯622 Y8z0ǯPhPf`f7@M>L6y3dpf7F*xpd 440$b{5r<^N%n(R&N} S}u[9ڰE6`U$ 8ENS~ GI@0@9@?$_$?$p"r (DOT$hl$l4Py5 r6zs.sћ 8Öml6 y#s .7 y3r./`ʁs!B䝠 P9Cmd\cFo!nh WD> .@PXv Y qȘx!G> 㠏'pIO}SZO Ϡ]#GY|[:azlوmO ϡ}JxS h7a6 /e/[о[h^* U5mоu ›o;@!}KSxt۠uM.4 ]% :ʥy:7 `͵חkk=j(?$gm6?PyO-H2zF ^R{eIkq5.MQ; f{$JPV˷%NJLi(k5M렽.Sei*qB EQRf2?˻$Rݭ}tݍp5{pUu,WʯQmYTl]jg;B&=do%V,=6w{XvvZa6QCߴil{Yor#='>k|VQq+1YK|T`\CF+wKl&;?32+ >`FQ<;uRc#W~IQnSv)kKm[r[ca${eMuߍpXQż/-wx>{jM0JklOZ?c-G&9D͉:>W9{mk,j"mz%88őG>dȃ#O6m 11Pq]q-1 xa?~AxVqV JJ"#,C6Tl ;3ः : D`F|/#e? t2 I)!x2~&BGBAdUk2yɧL|~qtCǩ}y=ZJ;yZ]^Jq|vrlQi8@abbmݳ/R}OyfkgOKV)JCz#2gSw^aF|8q\99c5k4=Ѻ#m7;4G~xQh#u>U2j>bE>18wQoYۮ\uYOwjʺ:z^(w+yM> U|+8?V Uu#9~<~8qiʧЋ78.&˘Ls)4y 6۸[ĸTBTBTBt߬38gM8k:V:!W:9@S5^bghKhGX6D` l^!Y!ZXYYYYY\s`Š<;t1|*,\tKGt<0+++++#7MMM1ErÅ+nrι".8ԣbs濿O?F3Go>EYK[)HVKծTyHlUoQvwQ˿|??n24ET(~oϷ{)G dm_>th56?vԁn.:D#et G 1͕z ՖR>[ᔆ9;b\O._Bۧ}o!F/}8h5::3P;\wq1\K<⸔~d8rHB`s:7c 4M=" LALD3E*:A 6$$d7œInn\v 1djDۃ/yC!nH6gӌ'|۹$<“5@id0`nm^3'Bgb8ܜ.J>3]|tgz R_<52R)JTڤB+@u*^sV-56EkZ{8r9}\49sYY[gC+/-MRl쫬oPGTfa[`Ψzgy.y>{=W _? 'ųlfU'#IL_ ·*I*Sg۽S R^}z?찞z~<%uR}riۤveNV2o{dGm%N|e\Di\@ 㢴R_Qy̡ 5ɓP3MlKB'# E_ƛԁD# P'ڃ&$x3Э+t_&P..;H̲CAu\LAw_yPh%DP44;"zp0 @M]4@ &&Kq="cI=^z?|Or+?Ls66*<3`ֵ7Yj#dTݳݛ&IcVuIMjV5 ]"GGSjޖ}rWyQi|ۧlFC^"#JNѕ+~}_QxʵBg9p&ñ~ǯɯk GI7y> {R.V)J]anfN7'nfzRo_'/OJ)-\G.7Xо<-]mIAvB{Dre-<(76(|_rmyq/WU;WkRl-Fɿ;b6{bkqIVb;hU-̱xo?}e'&js^K(muY㶸҉ן{b͵^WʵŽʋLN N&@B,H]R)v1;D#$ځOpfh_ku߀nFM߀F' vӧZd\lK6%WY<+ɋIr\eo{&N߀Wv߀_^UEn)" (2 ʜK 8`h; \t\{}*[xgK- {,$L?8dVD#.ؿk[{:]#߭зj{Yg%C߲6> !~\GU<rg =\\ڎQRg;21ameZ &1sK;/*)ec>gw~d ef {ma/0ˬSc )wf`7+{ީM -Z1qߠi3|>6r|s^BKĆ(2r$l{h6l%hr/%W_*7Ru>PrvzZkWc |D+(x/Vb/ _w@ٚu9C>/͕BZ1Zjl}=ZC!*8c2;Y_fk}v{,-`l09c1(0αnFN;+6հl ul=>?B/[CpOd7>5bk10 #ϸdT#O'sljqq?VF۪wٟ6F7}hSME7UF)/*6~Xԟe%,}hiw~U= 7/4sI"̉` մ `ad4Mc7`Rehbh2pIESƳ$h"̍$s @dJDE"PnZ$Ho"1&yHc"h{dfDMF47FMF4AGdjڐ9h0V0&1Rb Σ GLƧ&(q1R@!yPHc!q c,Do#Wme}}8k!7XH~c!\Hy4 QHuX7{<`M9v䏠d0rFPN {M_L1Oy|[w·ݹke;cp2O*-Q)Ge6(+ikw夼NY~8RPyOUs5 pz[N?2vg;5_?_}O*1nPA5mYɬ ROG^Mw3Yt\W\Jpn?UnP~ ]!J >& +&AA::`-<8PPCIB)MEvhWy<4lx6&w[PfH > 6''w]fp~fe+UNZU}[MaxV YO7y}CU~Xvs-kmqAp-bt@QMԢ$9lKCqpY TKԧԉڽNO:_oc5WT'nެ=P`^-V<_vŸ6Xް՘]{ 4a?P N85JpK?M댻! ;H?Wo0$d6Ԏe܃;J*G|Gchph,2h{I7(t/0tWF.FmspǑGAw"=ͨ`a}iyg9!`$ߌ #}Yҏ(*8W,͖R멪5/GٗOKG1[.jށ8oHwTƱ VڳH3m<˅f@cߧ3JC)a(}=7]&ԏ ] SQQdmvu^hcKvV{tLzΑec&hz> mmkqgT߆*]{Xhb.>*v}6!qx:dj˟0U;UhaD~V?Wh+ZqV?;f?B;K`d3a߳c_}Iݮ<_M8>\̆y*%2ncU]Guaz aVu:V~" J8G2~G޲Z'(Iz7yJ{xJr#D~KeP n˴}B2ڪIP5PDNZgE&,zWhɦB[wQ@ʢ- 6WZ!U[8VN-TZHzaXGu @q,FSi&zb)&RXrKm442SLug/ KILfR/G7#CHPjzhjc8MkR3?z#8 UB|Og +ʧ3 hLL(\P>QAi%UdVAZNi)d!ZJh)dzb*UDhEd!" z:eCS> OJAza0 c hpa*MCJa:#[\ c<&ab)15`b)&Rc)15Vm,%ƂTRz)Rz)RZQJ+;J)r_JiG)hFxzi7-|J]-lBPbBa!Bʅ)Bʉ)ύ)drʈ)̘rʌ)ܘrʈ)̘rʌ)̘rJ`-rJLqum @LNҝnJ7_}z>M_M\֋cr1 Um*WUXX3.ޯrTկV}GgKJg8Rft5 =HCoϱjo?892+ WɊ*Aة,6<Njo'9e/>ᶼH3H%RqZ6ǡCoZ.Eǁ7t\0PkCKFKmG9Q Dz:͉!ג)lRHK&P$Z%cM<@JY襡%NƜGy&u=&\{f~`_su? H%-ss<Ÿ4к3ipc?qܘe>lz 9Sʹ146ͬ/w֗[޳S_emޱ_YX޴^wJ:nT -[,ˬl*÷zw͂9s[V{Y$|-bz:N[E蛠Ұqb6OcۤGq5j$fbPVikgLO?p?wQb0gՁ{Q\n'wG&˻0Z2Ŀ7[Ja$hv4Xv7[;6N;njیɀuhmR*/`8BY/4K(nF0IU=&I2G;6IcSb~ Zubei#.ZG>`O7[/Գ?;OFE< c<%)LI+$YOS­:+%4yKdvHeЋ'3(Oי|;u&ߩ3LFGg2>fffQ 5LLFHs)xgH2;FbcxD,̎pU;L`2>SB`Z?:Pf0zzi5`TC(W<F4j0RaRHF*5Tk)T>!kOmiϷ*+~dDK(]zV<9-LN8U@s5~KB%RFQQjGd; G' 7x:giX-%U:tyrhiRHN e AR1ܓ#O.<9"BUSf#SLEpuM2e6z *𛼜J V!uYT+{5ԛFBZPC~[ m5ՐVC~ޛ7 yo,Yo0eX@ڋVo zׁ tTɟ&.liC6yoeM~[6m]-ǑoRPnJ S*q4cC-sznʌ͕_T\sw-ϰ(֧huKkm告WVOT?bÏ^/ƅ h wZukRcG-Gyi\ԛ-bTS %AXc`"(a&yr^y\^f!dmBrBB ! @d%`x6z֏W4Eaqr%7әcj'jK_oB zޚ` fem~H=PW]i XXHJ'ؗكDU<&^% rt`i?`OW_h6ZrLzk7!J }M)Q $PŽ(!l(4 dOӜ1m~VߠMzG7ilhWNKs60i~>G}CӴՋYUە#6n}=f!w$vĞ[ :1ӡi*?q@}Hfg8n=["Xg7b#D^#)7duՍ*5O''-XJEkT| ?P/':sWc&F1xդ/{ [Gƅߜu+đjkLӉ~KT&$˖ { a &IPyҙ?eqa 4K bI =c # Q4m}z&b!de b7R27&SӉ8W/J ʧ)KyΝA] ݻԕ\JL]]JR (mݥ3<4GiSS(RBER(6rRszД}Ӆ*dB3n[B)O@R7Xm10#_DBz9Y (>Jw! [TN[F p#Ĭ#g.֑UGU *&Q䶚ܨjr$ڧ.>h]D$SqW6 i^0+A]LvAO5,*4p5(_8*̠<3h x1޻7"3(;! B3g7@[򵌍~*4JF򵌍~Šp;IXZc{"Ǥ1ٔ+H~Ǖ&||T4e#we2H(uJ_~w-n{(#m[J3-Sb$ͥv}ju?EƲ[ͶwA_jV5ȵɖG-IV?vvz]STTVڱapWMۢt 9eql6ߥbGm=3ٯr`5_{I+a=Yօ}ҿ>QU12Zv9>{%Tg^ӟ0o&IbEl7l#eq愂-4gg0pCƳpq-fb_ؓ:֞հ%z?}vFM?qG"Ù]R9vK_[=G*:^w+3#*8޸M#gYO}_q)1~G1ax}%kM^wJ\95L7YE, ф)6bZtfлN8lH[hK.g F{lc5DS(_pܴDGpX!1rcZbLҋ!!IUMIX\[rK{QtN@7AmY[S6R߹8k|Û6t" /@ci8EŠu嫶9`c L1c908l3aUP `0jlk ޠ,*g(˪B٠Sb-Kt {Z3Jkϼ.7]:u~r)J$ R#(_߻5 G3;>%$ .WhI n֘7~@1־֋3ѪZ Ə~^ܹi}7 ŝOjG=|<ܥ,ݥS$G=ooe%,Г%2Fߧoԯsib)Űoe|]LJt( cqsqx҇`Lmjc8?g{_[޳<iڵ-\7 qݺ\9i7V*GN(lK$ 3,f3o,+{f!=V[آ[g=*G*P!>U%O餜c- QUstϷkDbkCE#)ɕDj=$%"ã"W4I*IBG_|a wozżWƷ7>?̘h;NB$>ͶIX]sW{ &$1C<,Kmm6[[Gɶ-0[x@c$OC"}lYm/~ړjG.e<[$*Muӯ׃CVPY^;fJJI׵??t4;"\ِߗrWP*j:S]R=fq;a6FF1xb7)!w76~gifڻuQ{E}IKg%j[_ϕZ *J3p\n 6R3l?u!Sש~.=m@mA鯔)v-׉k7LyXd"3lej7/oK51|.OM#Uod]%0/Y~Y)B $LQwɔ>5h_Km(ZeVEZSp/hb0Q#V@ X BR:y-bqP!"4ٜA vΠ ZA<[jX9WyFY&j˴sYj*,8G?n?xb5ǝ8:W[/qsp"aƲoú:@Z٭Z|+:b#\7^ڿ>=3Ǟe$ߛ fX>f;m+܁\-:bus#a^UvZW!U3غL SUAdmg {IȾO"{'&崽<q˨\"+++Z .Wu@ %^OՖ^t| /4u1uyf%OuUd9]@.Rz) VB3C(=C(=2Q9~.U/c^$J)ݒ+UAUIɧU/U azs~B@/= |zP8ppp zT8,=&|RZd4im455p3ic@?fX`wR@iT"y_~LGޫȪpOYN[*O[ViOCQG<Rwٗ;3pѯ)Ks wmlg+UpM]DzYcaEcc*nZ"7mW8*5HP)\_2jlϲʊ9Ut'[#͇}ǭ&4<.cښfB(6\ЎL4.*J 4I L?wAPQ@.-EÔtʮ;&ڤڰ}hf*L8ݟn"=QF_{4Mn~űWVy56Gcz, jWmTA;=ՍlG#ͮe#YKc_1qBsZv̾y|y:T{A_7ޡZ**f蟊юNە|u&;%Z|u;ClqP+ |9F3!ѪO ;V?]ӿ[CVKcDo\q\`|ְnJ6UDoǦtWn-$g =o;SH&7!P3I35Q5(&LPIEy)Rߞ%ChĂ 9??_QGfeA{Q2{O_2{ dvy?.~rh&P96b}aET2RaRdPb[#d1Q)x Nh ҟxP?~%o=%.*/f]byYEJ*rk(Yd$E ѣA8"Б1^6l h{(,RKY(ԙE ), uf"œE'Ozpϱ@>%9TR9(uj\ZB^J~F~N~$,f Ē4Oϟ+V'åm9px=aX۸1da,Rj#S*=@TBO`VX6W Mv5!eL8;(t7{|/V/UZ?uM˜1lqJ[VC_e ~z%tBϘ z&"RɝWx*2S?} A!‚ma߰Dc1h 16֩1>3~0-ϟnP $[)sCi|Q͗9{ 5[Ky=2x>E]P)*?]\48BI-0@ Chro"~Tʣ* Ygo>4I%-QB_.Ƣn+6(T$㏡do(,ϓRxzaQ)Y)"+ܽ6;]xtGxFhOĘ|2gG?I|A_yZܷZlO׮V38hլ'/f9:+4\Z'﫚l@ZܲM6!65-.Yu=˽c!-L6_E˗InQ]B%`Z; YJAL*WEY[y[ro.L'|%Rp 5ͥZ(Nҁ,a@HB^V5X¸ͨ(Ǡ"⮨3 Bq\qA>uBdos%]}嵍±i0Vine:l j2 h<x'Xq|%()[nR:R4D|$#Fh]>:ċC'|#u$#5@5C1jA̮1ѕyR$"rWDR$"fW])bvtf1 ^}ӌV7FX8A󼵊1^׏OZ,IO!Y7Qfbm@fjy$j4Z�_Ӷҷ ;^ bg'ej7Zu[Xq(ʗ3I݊sV5[1&`&ZeAIb^xLȂ?5ɺRNpv3ܿ'F4}b!:n1#"}`"i0;JyqHm9ӎ:? ʡ1iL1LyRSAӬ:]HVdX3Ĩ:2ZS:!n}+)-dmW*V%~_5~_}QkR[;jc z8)ؠ@f=6-إo`MbEwMN81EGs7n}ԅ¨7XQܚVΧ%#|HLe M=fj؟\vؾ38Qa<_;eBU#ERޢWz{b<79JDUGm-m|1syKܿ#Hgcims9Njg?uYÍYSŔĔqj| md3Cϥ 1ݟܞAb󙁄U Fc_cn>M猙:e0`-ܐO`:ИO\ s0`H8ao$qH& F,$8kM# GŊVK$H T 1 q4+bX9V:7]4}XcX:l䯴Fk>-u,iRj}w@Y[hnU[*VWͪ~iu7lWӣjeK:vtm5ȚT˻69yV?WyVଵ' ҄(vwll %؎Y=znu'C&A|lE 8^t A"adMh\RyY9oxA\@y.|D6 s oGNc8/mBLVR +.+rVQERrvڵ#WbmG=ۨ.Rԥ_߿D.wmۺcOU }%ʹV[4As7bAZ8 t+CKYe\\j]?Sq|)Ky'wT^&,mry36W=O)w+LE}Fݪzmu~TQCoG;]NwOiw|~$Z>ٮUT{֊ѳzՎxԏzwFuoƝ[\T^U7N#bSwd,/<$sB&m!ˍ|{; ]2No< 5{P_3VUH;Ƕ2f}0C'?0: #M@#y?7) +? fB1F&Б]z|c71n²5D3AѷX)zX[R[ė ޺=(BiŹԙώucXHMռ*z.mI3!ld[2TVkU6; )2ΪCz;dR'pKeg =3r:gf^ %*ƀ^c@1]@@x6}lП~H/sU/(`(+C[bC:@P#qd@.α`j Q,>PJ+U]bjtg܏}4e\e|(4kom}o}g< b\3#3Zc>}>!s 3O 1?^ђ5bf.J\ߐγ}Cn*{^n--*=Jg3~ӵlv[ D3~mC@<Û rLG/$&Z*ǔ VՑB{Jmfk>Ek<~ψ\|68 v_Stцm)m,q6tOo Oo-JVLE /JE{_. X 6gH1Z2N111H7Zhw?[{"&Gd VB }PD@RN l0x$-U+6y,/u6ZYE/a_k}1gMuxFP+w0Mӓջ ғӥ2W}' ӥ2^OڄkIW]BdžU]SnܥSgR~UWVN:}]mQ~H#vַ;~}OvNWyýgkwU֕T] ZCv%__K:R5Ny)qfjg՟/|};<-zOYXY-%KY>Q"&鶆C ǃ_/+Kk}3cvnC+ZXt̲yPVxU&b3 Y"D" a@$D@G]9  4%;HfR;A1pA4p 0> VOs[J;o2aȄ9 C8L 6τV.L0y"4rfO'`D0y"=fBLD7T^]FcV0 i!Xn|i4r]]]]]]]]]4ON|a(%MAVxrY^K1\7ht(O}.]]h[@.3K^g%P9 >y! I+Ѩc"ni&x3$.k .n||@[PۄH.%}Ziw\_asp1wdm\&k9*:Z^xQ3}6GGILߤ4uu鐒eQ[.l1Yt Jҕe_j[uj6x-,noc5ޱbw` N=B$}tGtVIG~$'`{z!o:N=Jl>:Fp5@E(@wGJ"!"!"!"!h䂖ܣ sMc}{o{6)I\`A`A`A`A`A`A`DJ~傗gYfiL?i&SE!y:UOʅ(QR FAH qx~Qg=uoQj޺_j7,lLqWSyok#EQ]ĎL"Suy|nD+7:8/zF?@蘯c=+.e뙬Pgs]p'(ݿ7Z[}ųF&up;񄻫{FZ9,xf>KAz@=Sϑ+|G~ͽ5TZ$ q=$Ycngƚ5u3W69>Nh8$-FKkȦXTo'tzf#3u?mZG'pHe'~O)b)R}SPj Ƒe;R^Te*.ldT5һ !"2Dёx>W0֨l> !JFZF`mQ6H9Rd`kM㳎*ۦ m rܦ@La3js<Cn+Gv[9,Vt}\tp %xc(l1rhxPG9r`)H9Fʁ](lߪ~|.c!'bv"m`JrO9/q1YEL*n9pˁ_rFN1SN1SN1S<ήz9L#`Ns$0'9 I8[@ e`ǏBʡVO ʕ"rJNQ+ŴKJg|wkCy`?} oܰnݾT3lڸs ֪IiKnJ#޾})m0>_g=K3a&&AT,%&,p=| ; ,6) &`78fp4]n2 }"z[Q+A|'&{LbҦqQX <**'kHTjnbz9*g:t.l̖ py]dUt6KŮj<tl]'*+Azu+FKۥNy~<=+a{4 ]}ڶ 9Xf,p$WǹZVq͞U}|6g̪.MsgGŽԕZ=BZcs3ŵuG8J?==Hx#z<)vng&ɳO1SAVIs}bޢ(1DUm;0,yt с D2Ȁ̠3_ 92hN#׍03`gHπ#=1z2zc:9l:2ӡ-ӡ#ӡ+ӡ+ӡ+ӡ-OH?!22Fz:}T{kLXqRkEX`#d"mmF{]nJN'knm|̑]zl;|Qr|NPE3#uuB" YOY~J?Hn%q7WO8f5oT5?t#"߆=Bo9qVpVlhT uфhA8");M ArrČ`OT_JdlD.DшaY8q b%ڽњy޺{r tu<}s3{wv^Jc9Z?-IKWU6)w+_(SI~˗" :әBZI|N/h!{̟٫$>U1ؚy>#i}Wo'O}t\$a.zDlKT aM`>2ٻBuU%,RIbtvGD[izLи[)WLItAx=Bh@: u#"5bkd g><ѝ[")u,fd Ѣ ZLb1KG7G9;u^RbA5m lR׳7|+Rm mJ:FOjQuZ4z}ِ_>Vs^ygNϏ& ENѳf3?I!FnΕ=ϭaSupuzZzSJwFXzdD޻1l\u7eRY jTmrK@=DkԀ`.(D~U$%ؗ,r"A}ekȪ]{LHٌAe9!V*f8 3LlRE܂[`Vn֚W[[ō&7M¯竈6{Cw6]҇PGJčRˉgeu;mZsۙt!I7z/͝ ̹p?AZ0h`CYӊxyat"BdDnvAP(W䉜ƹB54XIcEaҸxށ}ȵ׹w~r&x$ByFYY|My9ɻo ^jj5!wIַs{|b֥Pދ{/7/%b׵\$0SiYfA51<ZفK'i!79N6.]Z"Ktu|%nKRDskR_6jz~p{[y3^W]~mÈ5OW[.R}|X[Sn+m]̬z gb.M}%4qF$n薀.Z{ݧ9;<(w&Ir*[* s\9vIv._|cӍeZ6{nE+:Ev HcۖE 5v1;{ Mb܅):[p'ҕNݫULVޖ/uLk|[/{էOTKR/upNkZe|!{x ^{dZ&W[<'2QZ*q4Ўt#mDAn_g|kޅ*YUnskMO}LJU}-EMfAJB$W}Y 3?/6Q~()/L# kDQ#j֑Qv8vi;fp:Zj~̤V9I dx U<=Ԫ (e0zƷ3Y4B+v4H}* (V33 aکWl9ȅA-A-U؀ܟ*PhDSu^T&档f6q KG7|.x>$H,sVA 5z ( -1´nqne߲SA;.T#|Ŵ1lZv.g;Zv>gY\& ߹yZ4Oj=HկpVKZvFII>FڷQ6xFx-SNCnCc]~ܵ}+5w;se36][s!kdkBC Y3i:uMDL=jmuM6zxթ>nLU6d`ڍQHܳ 㥓REd|MNJ0Î[UEKVXMXWrxUm Aa;B!Wj,5jj{z&@KS|ddnm1 ? Cib*iob2RaOX! PU`TAXHxHU A ""!Pɰ-!*\@GnWpQQ((2pDFYt ,YY!Y!Y'`Od!=0 wY˂Ȣ3 "x ĵ9$4u-V7Aoo zx[ dq&VL[$Yhqm8VIm-*iq.? Gh*mxnK"-6$~LV#INwжԹ-]?z[ba.whێkQ(637CaQ ;b2pP\8q0`RKQ˅a!$:-avuibDF0ǢE,)PaNÒpu{HG/Xaq 12۔\L ]@!(^dn;[*51J4!)l3ȦbތE#C`GpD1 ^g4DM`Wp2b:Z!.QX D1 waC qn]/&17Qxl]1ee|VP圉 &Z#}(PDas;sk;˵uvgO&i7'e@[lx!MهjE6[lH1/k|WЧ'((&u#MDG8߀,m24n)%R 6H1lb р A&dlq{3BBݹv.Q"*90F#+:] p 4@kpv.WC٣GͶ@!4li'M,oJq=Ji3{W]"5c@j䑠<|; -JBDf/u2_9%_-=ٞ>5IPW@lZjxTWΦ@idۨD|uz\F,}GWW.R7u,Lavs|#b=Lv)WdV  Aq8u;+G5 @`xC H, 'W9nX-7c?b^ ©T?~R hG#UyUm;:ʃʃʃʃ%!GnthiKdsv`Qv EՏ[Lc-J[@'@'>r;9yubU4)v|,s<<=!ŹiT0+lo3>#,/gz_/Ӎ8LIOw[EO/9{o3I0<-xD-"jN+i+'^m3-G~P284r? %u&uԪD2 ,Ȗe31I! g%[)^bgr K1)lR1/nhAsu;M=f7Oj|޾_Ç{|֤67>qUgo?W{p;&1^-Mαݏ9&9[i_|"Jw1IqtXHd s()4x;Զt-77v`Esw;Ws8ЖiD\HsYniY7MFdNyn*Z:MLy_Ly?{@kQD4n`Ɖ̆6.t^6|X}&o o0Bن "NpOAz?ŶE igy7+lh5Vͭ/a|=K:Qߠ5)G{cMUC|%OΗ_PLUCyyay)8kּ8ğgX) S;LE1Qx7mMRA#%᭎:enJ-:[g)<7q @ytΟs#ӟ\PjRŊ`E ŊZ$(Y9pb%\@TyT^\)Ws:eZdQrPid´[Dh{K.QXA :*#l Z[%v 8:ғmA&SA!Tf*U6MaUY?B<-zҹ4R6 t e&CQdÂ|cxKMMkt2aqw-ϻ-;/5MjKg*7+WfezP*,Miok~Ӻz?}^; ߴ"c~B_zSJv'w7ULS('\eMӊ8m fԹ[l͐N $߼3Eݠ=h'ВPKN1Iվn8ᴝo9-o~7 $תխ_ Sj'Vnf?zJA%dh=NڋϬ?= \鬽_6Ax>]y^)W)Xr+;NK= K=],<Ύ/o7x6by"^*;t%y"`/gU+fNk׬PӃ{ ;rDLvc'^Np FΜsbT9ΣN3Lܚj"ܨ*QUFU@^ pW00!FFFF<;x5M<2P@RʐT2$,mv9lN:s V;W8pщnv:S6FJEg.y .N#w•7gp]+K ]9pv.̈́1d[Z *V5KPr5(&"Uk6=$mlm֢PZwt&7ܳ|;I'ljo)9^;h m}cٓ .lEH4TSKw=1uV!Q/Sh696E ǐhpئf;@D΁TV2ZDLS\,$I:a,ĢMdzO?KTlhQ&C@ba4fiw.< < < < <X28 1B f+Ŋp21,i}6y]=+]qr}pnXݮ_GA}vs/GYɺ*mRzY&(Xm&k_lKkƲyn${]u;ٓoO7.ݑLyk3ڙݩk"_%L>@JRUX>1H>KcG'k+}LrHnvZ/_֩-Jr\(&}39ܹČ`UT+1@["~}+zgxf`o]qo^`7;09nh/4;큍],}W cU}t]C:}#!kCOC;CKCKǃ㡥㡥{v-_dV[fgC<9Œ(`l`=Li"Qdj"h"0]):L^X#?ur-yvGvzvUxQm/E/ːGzBMa-9CWϮhuӜgpxYF=:>2$5EvX0bEY||oqp/_Mi V@f( +8# ġN|A<3_`fb1z7_Z1ch!F9Nt[oh)y$T*å0MVH {"k4TF`ף~#Igis}:}{G\d -sRK8Kg"bY'?DmKGI:W`R-R)T$>^g`@ Xh`GZ ضa,0m7OGsJ{-8&a N73?DTd =+hsÝ J5aߛpK. y[Zs&al{_ױha"IHp1mVpRJHDBpL0J(D)~ 2O-H37A#'((G*ο5 kC0* ,/v$ në%ZyS@Ge;Bܘ*JEW4æਓ3Wj`c>Ά=y60s=TI>7ۙ[áôrT0erb~n, +o\Y;fBg6ØVq0Л*<g|D=|nq%E#?s΃-^@w*|ƹVy>|XGk>Z~G>Z~͡OWҵ<0?#? X,Y~,@۳4|9t\H9fижF [l"d!.F Kh9ȉDNl&d4hhi-?2jDDVDXE󃂧ր[C`J`zl)j oW[ʃG E-$ʖs*Tgj5NB$*ZPV^c0UEܼh~m8},igW/{Wy/%Az\ o=SH̏5k 5k r~{ZotzYkdVу-a O]'us'lG=Yqbw_Ax+*(1<\=.D^\8TD$tThb } h `AA]'2oͶ8`B&0HQo%ID8n#6ڣ$4 n>jl("D^veP܇* 4V(i*v%vXUDz\m>}{Kr4Nh2Y|%c%c%c%c%H)@Gi: w[p_h<ZzVUg'Ї_%M~DPQlmi?Ugk4Fzե<񬒦qz-4-zaTW0-[}ݘe#P&Z킀U%c)L@A8Op AQ: BR"u ơhE"4I apc7"&x6]nUt3MRE8Иe"bcJwŜ7c-SZm˱9ay]!uz'ctcb5I%Oݩ,P"qj szYMVj[-/57~iqqOO}zZՕ}j&_9j8P>pBN4d_٭,Vʍu]>0fee|^y Y[j/q?[ja>^ s)ѢuJȷ."Su͔+=0h1MxwK3o Lo S*Ylh GɻA4r+/yXx87 56e]jeR1_`38e}%,3nNJwJFI펚:dz=;f8r]I۱?krk -!kZfQVWXmgTHt7:75lt{>+'@+RKj#eggw+]! F{<Ὗ$Wթp᎑=[<{ߡO}˔+6մ3Yho3kM_N=~ͷyeyKS"ғU5뤁x >d_~쵗^~KX[G-Qe6:l,bTQO,V1 4veIu&)oWd9_V}-V Fvf$Syqo0oY4헅1̇ @˽1ghW cMD$ &}-\đ{~H \U ߪW=@PlԦ؃FɚOtl֦c6ly˿:v-Atl܊ѩr<\hs19W.F|bx*'m C2DOVAMPZ̭[ 1Hm"Ŵy;#x;n^&ww,G>qyݓd^e?YV5kuu49q;ppΠ1LVM)vKbXΜpLxLD+l]. gxg tknRQ X],ñpew!;n$e+9LV.kt3^.jE) R#"S=BEvDHK0'*2̙ekZomNYZVcO հZ4-Zr򄒮KMj:M֊Z`E3Q7l-dX\VIRSʛ\ntdԳ}sT {Ox+}|Io|wzɥݾ> ]{F[;N'z}T<ϪE: JMQWS~Rjd?/п߃&-UۻzyAUvmyߗ۴}ڦlKRӪ]/7r]^}ĎQԮ쯴]@ :}|Vm SloG=aY^]>ԇSWȳeJm޺`:mcCgMn/ /Z}UEm-~OҽOѠ.d 2s#Ot=3iΪ}DD54!A8!n$|h\w5&@N*3d͒PU9jrҭI2N`=e^ΩMt 7r^J`<3\-@9 l >syύ]rg7縂iU\y=F[k!4:6?}a90!h3v.Cf>!@snd2Y W<SCWӵ9ţq>/qRypf>]N#0Y@gdM.ƁNtC{mK/s)F0bs)F0]@ sc2LpqqHn-*;svw:{^v^t9'wʥ^y Ow/SH?Y:kY-ȩZ-=ƐLikDYcޭ2է69=Eꏎd gs|DUJG呮?vIBo/FMP?STUu7^4V@+E S B aPRc'@1Cc:}*ih^>HTA#dtfb^\/F^T"h ΃*n})5S=C~wFOo}{/{g(7)TqI4n2)okQ{[i>0mW7'nszc*}o.}2z}WT:>QJύfya;Cy)d~<%.?%&Gs9`OOӞa5E~u:@+A5s 3&bNJ$WUndˠ3^4a@˰uz ٭3@vVsvb][DlcJ".LuweVT(3ON_77W(g(J=2N'DRLn-h nc%3o[x6^nAܪVP6Z,-2B ɀ& f' "#Yej"=BqR+\kr2!]b 14n%'9ֹbZpr:Gҧ CFm6}ZoӮiwjh%mNu,-49RF*46+M[TVV }D/.rK>\"o(׫GdV)#$޾ob=a:{е*z#%U7F6ɹ>x&xts.þoiZѶ\(rm~y]9zW+O}_}5-I[WX^R%促v,JOZ7hT\5B?w{/wP ?B"| ˝rQ>gٷ)7լhWk6Y}˶h3}N s˜+K䧕9?\)?.s=JYdZ^;t]3Ew*߯iz<<.D);$˕KԢwGUmmZH( Z!!Hr>3tbTAl(^ Q;W "+IN({gS3sZ^{wvbX@/>N EۛhُB黅@Ǻb R1Q"klN G( Ł9xP(ethO~F翝<$tHD \H,iRK<-%iīF$Ӑ> Qi-w{iLL4i4c= i0Ow! i1א|[βA4 CPEcC|Y>d7|Y@dW OGs(tOx һE{uM)m0 ={Bt<%K>|Ng"ۆ††LBG3gC4 F+h!t:<3A1䙉JYt D:> 4΅'3l:: t\YHE4.gW沀G}Rke%==˾bXPˌ"bqУmY6d#5!~k+YIOڕ ^c`/p^nl7&ojZ xWސW۬ͽus4{^hyn#nsV'qnlWOOb2k5֚oWr\F䩟S?*_-Qd Ga+!V6'ZފVs:6ҎϷ"*, Vc궊ҵR vd^lݱjIʸ(s] H] [-Gka?ZK"t3s+2O 'S"!ss^fΞ-d]1q-etth,N H[/C&"@*LS3}lGc&atw/D(ҐCG;Ҵw|n:1˥³׸5Z).s .s+F>ISͩ6ך'#.vs53O_Шd1G9ZJl2 Y,E]v~{QЎh{/gU{gƾvXz+ zmTovG.ٌؚ}g$ #x 9k/g_2|ܪ@qnsQ"J=#K*p*өeG6j@_w>FWhKz4xܼ\fN|ulis?ӳsy9 ,l'ٓ>̞Ti3v=I7icylo ckԩLZ)B+GR%<'8^.5wytˢ{{.REiV,e5b쮪IQ*@ @H_n ruUu NS8RrZ|}T*橮A8 1('TTj/* 1L, L2z50YܦҘya2l8%YdCQ:6|dИT /ug9db+"KlfE:ާ#>At sE0ABle4tb[֋m[/ͬȒd9hbS{S@[iOÆVlvETԧ `*ͦV ElcWmI&v&3}6=[8Ӹ3h FIR[JǙv&3I4m4gz렸֖X[6ז2?e~+H)KL:NfGx57PjYj9#M{Xk#/3dU3JQ&%l9&rH >ˏ!v`1`Ozse-{]LoIueph0)x~.*:m'[7;Yݼ}ϲʻ.>}ox#Nn$Oc8u:gUB^UrI_l+H.@ŊŠr(eȪyWxXp9tUaTYEX$+^1\|M&Lc%#$t5_i9n`>8X8X8XNҤ,<30p*{@TvwwAro{¥ Btk6y9./@ OKMh@Wc2haػrP' I&g1 39b*_ؐOWnwOy|}*=,=#޽{=^ML|,b9~bgeOkXc[ވܵEIS.:))z>2ίa+q?b#+tXG!, ?S[Kyi/E%k]ˡ<_Kܹg͈EÖ?SѨtm7R.R[C` 4- auE^"e.ru]Ц$Yhe4_.cEV`s\Pt >ƾ2Nњ*Dc~pwӥC/A^vNy_U1¤N:ԡ$Χ!پm,ըk~lALV{wLhʷ(^_->>rI3ma<&U dk?{Ӻ^bI{=3YVUgn3ב]zlgALfk==zAzpLp&2=+U)t >|""v_n{s̓?o0o0_?Uuk8ͻGҽ8*FBHK7.?4s;$w ]"l߻z (TѰ pPV&: KV$a )h$4Ԩ tNۣL:RRUMJUYGiG#zIݺ#( ,*R%d{c&-z 'e&G[ؙe"~Ks ֜C2|X^BsFW2YF~yU鬊uW?]IM=o8[cLe2^}KcgIO椠'?=c./1vxyD|7t-dKi|-ҿ#u3o1xE;nNܞH7A3Zx[`(80,X7[{Aщ?jMe>j$Lɼ#v4 +vbkk*^8cR C NH1Lh[R s*jēZ^Ő_xx"YNg:KM#Xoi zY7;#ͩª55i v(ۖTbD ؑML;O/*C&lLOg&fG,G{}/I Dx9A* 0ITa@yd=Qy"A-KȇOWǾzIZz5Ni'(,BzֈJ- f-t`{>C@J> On jHKo$at!ahL=fI.{<]7B})>jo3E Q&XKd5o#w/^2VkcanCKW~y7ib3vC|ǏJ>|*OmIͰᮈtUJtU/P lRF`m= Z _/qNrӯotH32cW^Juf{w_ۧ/h=vbD6Bm_~>׏%ךO% &%I[yI_E7WmT&".3/5|Wyeq'*ڕ\[>Z&׶҆i,suXݭRcQN}||/y?'YCIPרkz|_SU{G[kֆ%izSk?7j(-GN(X;޾ o(,|4f'oT;7:c=}G>>3?[~tZq](].͇X?]bY%ɞK Zm6\y1p2 PG.̷wѼ,[鸔,ϓ\Kf=Vmϲ}2;`o=P[~|hWخNto7`uRJذOg1aMr-eN 5@. $`J%%_\u w_,4Yhع7_>Xw=z{c^QsO_^R}jS 2+_*UvRna2L1517~2Jg-a'K;V.e9tsnlo"&{=ȬkͱZF}/D#L@O}mM'ZfgS|)&8nk*Om3%DՉu~r̡,Ϊ =ƲAᚐ4wƎ5 )jHJPMQM5a,"ak iW@ %BRZ(SAi-7[È.C&A=*Z[ 2uv*xSGAma>wD#fEEKK\f=nJukVkypDZfxwuookxqR?l6P([Uȸ9}wڻUߩYR'mi@ח=޳=a4>353?1ӌ,vGFņwNI8"g>;5tcz[Oi+ 2Kdz'a[7-ͻImy]p]Avnh/K:KF1BjAE]9(RT8ɻ%3%l!8VW$ "w"j#͇IR&ݐ&IFQUSU5CQUdBz_[9Г-ʯ.)`9' @` Y; P| OZ)TvJy@s+Ūf}k6[?CxU5U[1KWO+ Oxm,1*lW7찵kumSrV䞰?=+O_؇{g8{=FcCcm %?\>[}|1,F6b b-`RWEoW!xma6ZX&qehc9q?p7NRe/Нl[Eh|QfLG֐fi˒hh4([EŻN7Pwx4faII2ْa/,CDxyeV P:I^ʰ#9vF9\xwr_t~A0dEѶύ~&/NF "MLg%Ph6FS@I!a4!Fkxh>t%T. et O w)!胤/x78bһvWi7hC~InRjM+򀚩N$H al8k*[lVШHM&4jE\,Uyo\坂XX1ddFѭ>lx#;ǡ"9`_C{/&Dޘ)_LA obBZd莵 z#B5C d: OV'uRr\ۻWV]k`[ 1¯%*eKq\Ԛ!YIvH5UsR&i CSxh'6ZcvVofKhDۭLT3vu4&D1;.f#3ظ˘b7;fENCϓha;K44=f'[Ze#AY|+Ư&cXkn5OOMnN1{ s /u1o6a/T^RmPESbER$XND2~wD0H-=G*˼Dd%ªODF_m'ªOU/Fa'H> nV}YxŚ)G yoTrKɦu4.MVXƀ4LAßBDVe48MFME&Ԓh.GAT@W Y ]Lf3EĜMY2Z?Ny\6C) l9fl9flXG8tyͣy>cqlq7{q k}'i['iF㓞hNSiyF1{~}X8u0:oyS- %~oi|Ljr>Tdf,?ex-~'1!<{Ψj(jEr}r3yǖY1Ǫc34 _2u,;\uZE=Q+Uh>W}GY{o{V4wށ'ʗgf5x@-WH/,vtбiǪ|"|boE_BVv-rh-IW6ڇkïN->xxZq#Jyc3>qY'F\b+Ol՗m|Tk#{Z^[}ldhc8 ̣/s7߿wmʻo>Iߨ TVnl}'AՑ8:t[s,g\\pbri\ #EdX5mGQ֔/!vWRfgu~nM[[jĒ*K91./˗o:LƬ%j}",rfH76%Td'KW_`w;I:&#lFXaj5.NuK(W)`K_){V r8FJGqs:TXұ'4XQœ-D"X.de++[؇F5:ެFXaav0VEuƺgc?6cލź7 ғd˰C 'X_4bS AǗ拳ݨ9IePp+yrti&j&Xߧ/i=^AG -=m}egV{𡄝 O[=?vYY+X+,o~n1o1lZIۡv^R?Wkkodc1GXK7)Ynm/9;o߈ b0d~BٓG0.cl߀̝1گ=|.xeP n Zz:teH CyK!\hwh_(<yeSz9NѮL+K3&2.ΞN][SZFA 4&fyD+9IXMìް 1Vr 5V$9Y8IE I$âiH4H"($#DmA۶^9xm;6}М/ 6sOrOxsz"%pGv":n4C= s'|.t\͹ڭ93e<ۭ9hFy39Bcv z:ƤI{&I7cY@Z"t&hA ! y4gtgwPZ9n͙+OKR;$eJolgku+lJǢNc7D #B(f=K=/ܲa4Hv1*]#b}kiG'6yȭȓBchg"sKï  ߭=1Z]ʩs {Mb"օ42F{v r8ҼYONCcy#m`ϑ&6:y[8_ky/^/n59m /YQS!z3R>|%gY1f=Nk<|eYYVYhg gOG֥b ӻ4} Zw@+T+_xw2}{GKi^g_Uld#XCvVWVz+,ЅnJ& ӊwxU7ō:Sr)6h}cMxч/n@i \_iA͹:?C~W=vmqb;Nܣ)딯Kv:vקeGv?bȷ{r"kc}vxmLJnzc{|η}F={$6Yņw.?鼧]|ʜoY͔vGi}Y+)]ԠggAsB Rc *j!Qa)@7JqQڣ¿P$!5GNt פInY&ەA:94~- l&=Nme]o}o$s+]h ;}0DͽR͐McO v'JVH*Tفm P &Jꋺ\`Hə35htab [l\9C_PECrP嗀\D 5Xh+l ]OrJ6ld;zU]]3=DLɄGMIdϕ4^jWcrU5lg:E)ė@Acg6ͮq"bMWE9tV2ym"Eɋh&/M^D&(D&;gs& 4 Ι Ι@y%}k1kH" k=Y~fzE*PRz\OC~1""3(eĉ^ m.% y:!L7+) %#4N3vήb>BMbZٖϨLD?q_m qS+n zWS#Tq/OSҽ22HQU~7o}W0Y}I}Vf>X^^^gG? 6c>0yȂC\%-v2CNs(v>s^S=iz D](|[OJzK+Vj74q<%AkrtfFQK k%dB+-ͦmV}%.Wdž ^ڈyU::>;ʾ> %ύ.Z7>17usq%s5$y'n&n7ƒe8{I`G#b+:^.G1P~ - Na#` F#^M8|&I+ty)B?:Y>U#TT`?ȴNQPV?0~ŸO?s)_@@v|-y^U'N W Zv6Y륭 -Z4'ws^⨝#gxGgG}@ DI690T/qnq+iy<|j](^)1RRd^UcMJE dMXS28= -a^Nrp/NIV=IWiM@| ۦ  \*\NKb]ڠT[ ڡ]{KQZm!%!v?gy>_KŮ6Y-rުEC 2H V;\{W>VSODIRwֺ7Q,VNu8I~Gt}2!C/!-ijck8pn h$Oqc&1sSp3<<<\z, S8BQ\ ] ] vA5XPDPO*SݰD,m[hCBXn&Myǻl͈$aaja:,$$$vFt @HXʸ t`]S) #\m).i3&-7&pkRKySp[*5I tV*('|I3n=*m! :M= 7NS\$}F>ax:oIB mnZ^Gm~lUlnu]iN\9vTmF,U>5Wz?%މ绬zok x̒UlV][RW+g/LsZn5n({6aFQ u Ň;g;OѸ;x*u\qhGPݠ'T/t 2 B6MǵB_un\˄6)x}0^3.T.t$XNLS(b6RB."0Ahz;+,c:Y]^^U6`i$!E! \;I =OZMO~'!]"4wkBGǛhy*ihr!tt)ЪIl*S*@ElKNk/$t)-W1wRa3>a،`8ˤ2iaL[Ck>O!p}6ٴ5X$9&=%A( =le#i!LZ ~ڲkMpRơkq$h 4Q 8PnE8(rR;B;IZ\grIOͳf6bbȞ~&~1k*j_c{6j@l t@ @BYcc[fGOsL{=lggys;în2XXuxgϯ+ʍtcy~Ǫkb67ZoͶFe֒^KxВ9RK2/=?53o up <.YCT&B0dO s:9'A=y2s==]HӘ$s!n\(*<(rEH"Ѝ"QdH)4տ"(RQ e],8ۨ ±][<јK4iϻ\tGn?ܨt{!IBN'Pl-f3q|[ֻ 4qnR5oշ~214m9vq/ƟG,묟V^7ϟ@W^́v .l c"фfI4{o4BmZ8-G2xVIwY#&*Y4SaMi9 .3jNjU*ԂTI- XLt̟ИpNLtsxa#.T\T|ԍ?!ќ#y!|xr.ϻ#u6oSy&k6_==ww?93~^fϱw٧%|_ηj>vTZ?D ;J1xbMex_TٮXQ(*,PP_ bEBHgaJd>f7kuV/) \IjhXOEE(%@Fm<1^xH>s/=`h-¸(Cb9 SQ$@R*I(]7a*Gt.(Er]P(wl=Q&KrvG~wuuG@F}6CLr 1>tN.9Zs2Rz2P8L̀_* `bp03/b-K'l=EYRo;+{I] pQ. Du DI4Gx5zev.+ Y7='y n{?Eo$3 'opG}߶z:H8g )/<O7$eN77}}"-A% .7xA10X.=6+PG\@Kǰ'  ƾ=RBDr K?/٫>dVUDhjj2[05?M9D~e(;u6hߨO&٫.B^:X~r=`' _pcA)&o@LI1R`cڅ/_.Xb%5vTȾxL NA)๞q4H ]WDQ>s2L|,wBPb>,=cRICINH%^`[KG'bvSY1MիθRQ-5Iqjm#j1Gr7_7Ou}dgOW#%v#Vh]BFk&^y%^/^.}}ow!^b"U!I nTo "w v@bZ8\ ~])c$E0Eu:=^2_.S:/#_rՙHY4ݭEE<ϧQwBz,߇b}?rcR>}J,4wg,Ni@ߤ?}EY?&Ti"H[c>?dzaT}Bͺ`^vX3}f /ǚ[۬(3øʶ[du5Ѽ\e~d̡oLC%X>5ZuU|@}YL7b9S0Jo]JSa5Mߢ~ksV!«S7#~}Є7sxӠx)رz;rl_vIoS w:.@]rOqL{- t&usB8~y7_C^߸{rx';R?&]J>ӗ|`;5+ϰVf`ݯ5i1ج绳0 j^c97vg̪V72$VwuDWe2~-_ߡ}PUZ*.n}/ܘï _K1\.0GLV(pWUlAXx/3xĤ1ܪe hɒjf[v}X5P ڿ/b|[Ӆ,Ȥށ[ 0 Hڠܪ  b 3hV{,X{t)I[vo ۽%6}h{q@8fԏq}хM%Xa6|dt "W+r6"Ӡ+2biJ;EA,7cb%= ?s,XXXb.b=9D1 f*c%EiÏ)}0vҊ8Vhl}AĢ ~*ҦJV}+A JB-W*E* TXɅѕU$TR%V߆zUT$ ħj%V QFոQoTPW# l)jS# K'_K2\h(u4|$aM5-t4:6^Ozd f!A5B@ZnT-U%(Ue@:U;P""߀#1$W]7֓T@ҵuJԭVou[6bZu2;wl47 ˀa`dD v |Wut#}9|3(DWWq5|Si94NvLq*y"rn5jB &@d7J7 \ -$J(]w߶NKt ' u)1 X!xYLo{M _nC=j៞YE Y %YJ YrA/Y Աkx0| VvUTthF%WdZomVGZ+2>jG:U}O+/Z_;]^yfTQm)0@}}TlǕ&ƧY5nrAϗo {HHÝ^ "9sko,'1#R5™87PI8]*Lutf*/;&SKLEZLUFЬ2:TYfbUMD$G$!Q.ZKERE,J0bŖedRj&Kv6bpn'Cnxv)JϩTLŃO(ffωA7"ZԫUJb>ψ]sh<M!z@D3K?jWTUfPpjP {8NwN%Wo\ P6z^;hwO'vu <(PGW=+;j$^U`;{E %==PCz $ @BB23;s PQ+VT@슊(@**B 6"v,ߜL gLw{} 乲RM@D4e5,Lvab/Z^Sw \UwI2AJ0wn Tm6%_mfqPDdc#`$Q!eM* zs6G5@?m ygd9b\Wot#H^=ұ@p<.0@䡃S7:F<&~2xuc{OK1EƏ cjyX-Lm*o/AzxC+͜fN3ѬYf p~C HXQqTG-u>*d`ڃn0[bmc{]pZO:4^~iX~,Nu`,y5tILV]]] t}U '/*|Wy9;yj ˖ul+[A~<`S+󬗭D]JYne}es}zǘlg^a0Sgy~]=/y|+];Oߴl~=fv= @TS`ρi{wra|UE|:.U`p N`\M xB!l ?ύs6@ٙ/Tq5o]X@_n%y*6f}!]ዪ|w'<EX?*pW o&w6Awman>0a|7&BsD/3?vc[airUJ`֍g}X9،6_ ^lwGo_"HZߍ(Z ZHR*=ݚ :;;{ 'zz#Pd 숳A\@. HL_@B8d {@GFNEZ%}Iυ6wsF/`_ w}!Nڤ8IV;,t>hfm_–m$&GikKy|}DީOxG_>J2kG+o/35{! }v6Va=c t]kudz[ge=cC̺UM?fbwYIj&sqSvתּSF[4q#ޣO;ѡ pKɵaNJb&mM5SڡXƗܜZWd[Ԓ%g8MɊjGάT]g33Gcջ 05CTpiSu68Q -U,9.L0WWX;; Qrc{pc{pc{pc{pc{pc{:s<->+ә BB*딫 ;o0{rYNKq2Z/8/x/_ (: ,X r cbk2RN(Fy|1/-?cvl:ٴXx d 6:FԶrCtl=F˒( X,Ę`T({СfrT:S+;S-XwqLcQ4HFFb ?C(V݊e0d q@q8!C)Rh%4ʳ :ᎌQ=] \|}ntحHCڞp/'B n7BL^md\gjWkiZuúү\n`v668pQwA]wz~ woML!2s~ņ8z|УňQrXؘӰFJ>_yb,TASNA`(**q,OB ?uAgn\ /\:8* F!LuM>. 蛝 ?RVW>']JAUVDJ:X tU&t8D,:宜rB- ošv߻E?R$>K 6uK}Яvx㫯iڋZSWMb&=k*DT4#<0#nM,dMS+3qa{`YG3ڪo;ɘbi$ךҚ:[S=,lCu ggEV\k0GXkiw7~5 v6 fJص]֗cD&{jUkbO޿hKZW۪.ϴm{m^ :Q4g7DrXIn?ah{r @ށk_h7_?AhNoxM[t$ͥOdoU!CiwʪVT˞=~)v]dWΰC@WawSzk}DCxCD z<) j_LKJx7S))!̀nIL6C}K[iuY^ <ߙNH׶-,*~7钁t@d&#+ kr$/?2Rue 0䛌v: Ź*rr%j q 9h U)z[?:NqJ]a,EKjpņX DNcGӧd~83A?P?[?5CGcb3l2(xe2wt 9Qn7ݢ\x8I%ѭA.Y?>k)onvzyW <>em _dmZXēplŵBqqb"AG8aJ`~Y|leP:l礽+MX>vYa}CfL,8 ǭ']WVE˞،Bs9≂ҒC ĹX9Vg3>r q+ֱS@<u6!RM@H2?!C&I`$$!eL($D!?8ꁃ& R ݐF)(Y""X)A4XIUWo0 t\@֓FgHHt1Iq8 i&jZ`Zi%83r M*^A BYO+|LIoWqՉbY>ˏXTg1^ZOR[*. tGHe8ƋxӪnӚs2+VzNrK^S^y5=f~{:?Î6y3m>ƸĖ/]˭9bU k]bY\m9>Z`la 978(.wY<Nxۣ*]oK.[rn.J+yxDqwjQ#7;!MSAۘmqv.mm'~ш+Dg~#D_QټfXT74W˙s䒖KNBCpS~![_|C:Ja=l{N"e|$ղ =^MM 7'7NxE|!\GQJP(UL 1Yw`V}!6aq?# @%sY;LnriEs PtN^zA`C/ IVL yOgh@މ-D4e170;`oqVAOۣ =6x8<Ӫː8:iafq,}-:9C8)Cv-6nj=7]nGC6vMM85+\. -G;q aYZBEMɠ߱2n;zaҪ_!ztbh|<xUtxgJ *IBtq35F o n< ~3[Xl\,SBl@$a 3,h$;G#1'Z%X˞7梏vr-3Z^0[$ADbJy7?]A{EA66#AZQiAi@Q₡5-C}qYV7_媵{ڑ+4Ī9jA hkꯇDS=z6V)֯X(t!eHHLmKPk`k!q:Z;A/'jr\y/b(xfl&{%%f߰r]Of6F u\TC,1Xce(!c0i``V`nwvGu[zgm3l`N&r ۨ kvW5e`wl)hDcJ-2CDc&bY.!%%P[: .54D;MEjabaƩ#v">Co#l =Ec]dn>Clɔ]1RYe/En12`*:0q=Q_ b7!NT; [J]_")){L1 c$@K8[DHfk: eR9h: dR2NXHXHKӓ~$:%EL MP9h*ԴNŴzz|> vqUTjn9ĉ ]W-r\$! +LhD6LRM!u{b[fyj՟tp]sne45/:P'-ȭ[CSǭ6E!B>(kwq-]3js1*ش`s(حNE6@šu2jw* Y{NP(@QE(aF$j)ٟUӝz~EHIU%$Ԓ\"IuR_+ك,]h@@Vn5r}:KHIbDd_mO&myn&,r{}=.U*Rhw08=z*z &|'&`!į|0B$s4ο:tNZ0yofͦNW>ؕv}\\jkv8\|$ v_DF4+d54?ӣ5ӿ/ךks} F(S'=IJyv4K3G#,Sg~(c77E3n5ם;=U2Bzn&=+w^.Cf9tE.g\Ό w&>Kq'b+ q9JI D88V (ؾM# Ri4an՛GxpjRG+#id:G vURM7::m,Ԭ'l4CDdEy S&A }/|1&ErGU+, pY5eʒB%(<qBXj_9reؾG@ kFg#`x:">a200)`<,?>GT ;HF"Ja$#ag#xȐHG 4U8v:|&§EZWtVRMn7!x숳P|gsl=#3T=9q1ZVΠ Oh&l|=Ǎ!00*i%<% VS٩6:\_MZ*"35j5u=|/PBK }RS9j#{ώ1=04xΞHE$.qK1~qoWŰ+b^!X]zT?IX/wLQ*Ȃ5DJĬĺh_a_:O]KGˇ?aRɆ]ˆUzzi*!r3d'yôUubvuvh>*/Pr5v_NMq< _E"gq5*Ϙ2d숼%"l,+`BÂ&l)y^T[JڇUMǟb-nZ~R[m#I6kꢟXFQu9Q*(I%Ł~"h})4jJ.p)` Nq)4P߆m=qwhYN]5Zn=q5:S`6 pVmub'wH}ܺF${8-ɋ$ÞGuR `b'mbvVF`ȏymTug2_H|"E!_QJt:QBl3zO<"&!^'eI?&R=zD-U$GI7ПHP䚿iSStBySS`FI- 5c'QuF@I$I$i2+7tMgp}>P#QHjkrV'Z .0 UQ!HMY&\fJSR_>54|mc0.޹/tw] Wwn}Mp}آ@٤mj~m`3uN Ԧtցbl%M}2凊+pbUGM!P͏nIϘcC/{jQRNTNɖ[ nGJ% &͚$GID ֲ.NGQ_`{ziE/ jYbas\lW~ w 5`i0% F;$8Y[>kuF&6/1Ph_2oWw+/^; ^[Cuo$Y;M5v>姶-áO"(}7,t8%@ ZgC"]f- )X#C:=l 謦k#}w {٤) !nlg4Fgw8 QrJlj&PU?s¯myƸ&nh/,%%aϡzM6#11ppĀB!ݡ(((hDvl$BTи0SZcUwGR /E@-ݴJ]k]xWE4oZXЊb6.ȏsl[EE1b,޾τMdvb* a}PxDqX/~ok;^?۴|'3}ʹhɰfO7u[b/K$L"™kϵ+WQl`M0._ä;XU'/2ۙ͹Τ=۞do"fB1IlIL7 :^]f+2CR(f P hd'v}Xl6b*Kn,6R=f B䞮Z2S{'G8ɸP3X֖GnH@ H֫STh(%vV4ʝFFFs`DI*oDpwswXAo{j=!G}3ǯ3Ux!Fƫk'UB=,03`1C'pp:J# :F `Tt i,T9c:U@>`rC>-k萏,|d#6f#ȂIcg x*h憑07D& Bա@nnP#>!ve*c>U().w2m[`VWHd94*: ,Gzvx~%nfVҎ[;fcN13p瘌#͝(ώ֞ٻ,x$8wUwvSN|gƒx" f8za.zٰLwp9abf'Qï;>S]`O^`Ĩܐxl42N dݶ<ôhlC(J\'n׽4Jdh{սf%#q lLgքrݤ?xb!Ikڜ7ijlF ]kp/oot@`jOxz-&KIjl?]-St^hu0b\_ӦQEhBʷ9C2斗V:Hχ]>ԷWm6b^xVҷnH`+VYL44tn_uUdGtvՈ^}B2D-P,xW!V+:R!N\"rF娄$cJ$cJ58]wNqRgvn+Ot[z:׈O6}Yzrcˑ[WXuؑ6`tܳ?]m12\fP%ncpl<ñ9>մ9MM! SdB)׋iL,DD][Q*9 d h6Bؼ a.&TMP!6B:5?C G8 eљFܜ > Va|Ð{: gdщa e ʌrL"BhE%ʌQ(SDo  g1o't>ץ+>–q*t!Q\_x/yycą$ =U~CMBbB+_A|=E %!zjf,N)sH,>Mt mܫ{xS|.l{׺?JN"*CEX{#µV+]ZO23hh6&Z-}ky_#?QVw:Q74u˔Jrz.EHCńK+wWW2`b,/˴ JV# _K hP;r!km$ֈHIYAJZCÇfmݞnϠx4R4v!]1 iCE ˱ntHpܰ,V3X3|1|NDiK TM LEP*壣POđiPVePƇR4>xC)}[2^CؽFgg/>f],I4p":+CsPiڛQAh,QCSж>4.y.3>huZDz"ϕ4FZZhs* .*4.\C՞kisz: 4^YH i\蹉=hs34:%C\;Ɠcb2kbrǘvUĩ|9]h oX7!GRjuSv]> VLlKD?|ҎU^c ,>w)"}f+h6$c}O3ya0d\2{ZY:O%D=QOh_K%;_ySċ36L|~/^'6yhƱP|jy}X^dy  P&QarCe,t" as(6|;=:ì{KNv&ߣDu1{v#(~`?" OEݛR}#cDX(C4ƮPcOgzݟGc=:>8)fUZ۬حeiGGT|M]H>_o}Ȓ#Gx<5mx?hxn_h}7'sa.6No]ne=aav4EbAbEHpr!NS-Z}4p2%4ۖv5͕=r#N5_._N")b:zAV8$'Ӂtd:P1rn2d!&'dd2p28 LNFӘLArrrQmJp ijZbAC8a0x<AEQʱ ǎBaQfy$ԦqTmQry@- 42ΤS%$ʒ2I%4Jiր4k@5 f HXr9րk@5 (+cIi6l8Hq$^Nt#JcIWx5Hrkx-mR ;ÅOڟF+RX!^'f5 Ǚ?iz[}6K%~m|3_-BKVodMG{\^x'O]gU\u{y䷦v ^݇kKUUiUKrdNdIWX$)ҭ7":q =6Pn2E7)l@Rh:kX7OQbOd"XE*Z)t ]\t"pn.Hԥ\~󃓍b3U gp^<"? 11}nE6׮^zEQ [wZ=XOlwD36W6مn=>YX&">1A "I%l/Mg1ۘ6 B=kӂHʻI_X5I$zJemy='Fg֞s{}}cw=vԴVv{=SKzKt*1ĞlsȖ^jM;܍XW(5?B^XW)ʫW[`AHylǧwфS`IyTT l)@Й%n ZJsq@8 S]*ԬL 5.] dv)@v)Rp&˛y "!y_}Ah}j4,S#`j(ji$2 ppVL$Ւ4^Irp'hV2^+<2)iIFTGS;d,Ri(F>+%lzTMhm64ltlfC͆f+?9FY$e6 JQ;A.,eCr )G#ՆΥq6ڨ6DSU)ѕq,WNg(j9]LlZ!6_R]"HuE A+TWR]"HuEtk<`]L`nN1`^-1~xoGco0y|4Xfl41^YXޓ=q=n}a d-,_w;Wdih't=߫nEnY-Vdu[W[F&tHU0;LB2m"nPCBm 55웎ӑsj:)N etGLw]rmk wP݁=!ux| ݱ*5ICU}*7A`0'LʛݕlY`7,KKeI$/} x"&urنKj54J<· W.R+Pe3H.1?a~^Nc^-Zz9rz*N^x9rh 6^m-}YrFᣁ[si.c)v!c4J?S!]I0|]E|:ig6}gh k ׅnfS1[Hb] ߐT}k%eX!_OL7qՓ 4uE\˚{"*=]b\m~絭*K~z2^e],+XLjT/лeXƂYsً~QA\z bWlz_}}?u j߮x?}bu:RD%9N+YiΪ_4u^n|[~SϼW&Mzݟ~pǮw:W.*~Š S):.kf<\Y>k޷[ͬ/f#Os{U=0wVqQ9kDCw69sŕ;TS 8:}x{`,9wqs9@b?rAH5I)u ):2tp86Y:2ul9s`U407@3`Й碥jY 0Xb .e:;FVKb B{@${t:i=ZĻߍx(r_ r_.[AB%?*rv6Bav##jj>vDvDNJ֜Z7fU)TU)YS[H叶kbsJ|>ɰDs(X`AD- ؒsPO2+ sʺW0Q@( L& . Ada20@L L&dLX 3gҙL2<:J|>ধZgԒHnzVqZ/{̧L<Xv7^++H8>mپ]Zȿ2XOӌF _j;ӻr}W﷽k[- }5sڳ٩BϹm1OQ-Hxvwrǁ Yr:*96MLTUvH"KGA,i:RovNؽ; Nw Ne9iVVqmߤg!G\dj%R ྶqy4>2#1auȧ}#eBLG>|Ш71ƶtd!t6Fl!SjtA&\\\h3%7׾HΖxWWUS !Z4\i>\)>UoO.N??+:,,~n~C7ƻJnWcn Q{(:N5@LFi#U :&ʶ.ZQ}lwP%~{w{{Ntj?J#(M!ab+?KB* RhWNs;=OX:i 'aR{ ,E[EvxoNXS;uN'6n,E5XN^ g:i`[r8uB>ªz [gKo)xh6,p{_}DQLnNM±?kP^WmfJKT9O%i Eѝmn|wVE?SJ3%Ϊ SHDpS*')JPR򠐅rfl( RiF s(t̅!;WJv}sifCQ>D+ha',.z!t |~U w+Ok;ӷk_2IUݴ;#94+Mt牑DE17_𧸠}xE(}EXkfcY}<FI;ld>H}}Vh#vb#fb&ߗ;cq7њM$)`.߱DR|D/-~b:[YwlʡY@mwb#M=IpAZ8,dZ%$$8|n{㛤:nhXMtm<#X^1úljIcWcvo`I{v~?÷8OK6iZkQJa!W&7_jv#ʹؤh"o ;)6|}'Y=5):xXo,6cqh>OO?եB>*Y+&3|Ok-K4K֎:b\be{eǶ!"~䏰3hg!F{LLk0cY`b+[߱W̲2Mcێ#jqaa/'>M̹?+=z?}VIwt sﳺ# .%+rnrn>KM.OqxMuKɑ.&TpReY{50 pܝU##x ,b=abT"|*KWI.J4qP40(=yd0)C'P .l< fQp9e '=2hi&CH#!c 7AD YuA'Lq "KZ2!)t `<t\y#ʃ#N<8=l$7΢Q;Y?N ~sQtV:2(^2! e*CP4T14(C th B th R/h-fÄu5L|ut\O| t,cF:1s=hdf:[B"Rx+znRt\깃KiIR]4YF]4nynϽ4YN㽞4.q>WzVx}w-FPSAkj.ս5W2L63 LFݖ4G>Ԍ/fxij + bo41pˀY pف-`3;o1&*G91J璄(,j5K :-y=+.Lj.W3WW K׏Dt":c"$DH!9DJ"ediOz)TJaoHeӘ1\Ά%;B@lؐ$jni8QmwWBgi>X>βQ#zW6< ,g#(E4f&Y(ѡSw uvrsjgE.]@.]\n z-[Vg,5|n66{?_N&4La'_y*ls}2߷Eעɧ-.oSdOV?~4ldv8Bc-;Wi'<>p.Bn6'W;_De|u|MѐТUݱ!ܯ!1rG߶?)EA 7ʡʚ6}Te OEFKlgz7XD2uS4nlϝ0б3{{B}0.R<&l$9X~jITsզ2Vy"a}NcZMAz;*Ck9<tP_66kJ.SL>]?hR~b&A_Eێ;zOjlv Qhc>}d4Bs֌Mozzx{Ou>X{O >;+:E^+}CJ2ʣDqI~.YYKיY֕;4Մfŗwث<4QTߓBH!%%HBJ; 6DDAP@ETTT+l`DAP~fB{왛ٙ{s=m0=$w‡@? e$aa6AB|0ή_fgZVήTHQ3LJ I Q`zb.a2R0TMa?0Ew[As6Hu2DA.\*X?65e/@G>CdC.Ǖ/("gk.2eb+"pQ9/+"i"\Qb8S# ױtZd؞ch *F U1bZNXbT ỌRQ'j,. (@j y|R`0n?n ~9c``?F `ă/H<=yAl~a#WVzpɾ/I=y}!s*xoBR-*c G*wϊW6U zTˆJy Y?Bذ~&W_ #5V23Gx@>bxFax. h-ϓ#ۛPh`3% kQ96 "Hu[bGv>wv9RDxtaJTF3q R%αCWmN]_ 7`vA0l0dz0d{0f+Ot0y:v,9,>av;$ƀuJ,_b.x$aha&3͍jڲif6b#!wz-\ݟ|(.>[۠_]f*|O nj"O MzGc,$e>'-wَueMѓvmh6;f{Wy;v #+`j+5N-B.Y|go׸Ƹ׹=rCoh۵)=aXtbL sz& 2:8ٰb 1H` $0p$j WGgV.ֵqtvvԊ!9>!w|=q5if7bى5y]Θsjm$M`k_|H6=lmQn͙,۴FF[fen061,[ٗzY}ر'h]so57y{ߨya.3v~'iZw!\_帊+ >>ݨ*(9߻3nj̡ƫ ^iI.{*'z{_55w+HV]Jo ԉ;\v؁c@m(P=̮V'usD5-DTi*lIZ}Jܙԙ%#T+=I7 =l320Dr'Ґ/ YKӰtHy: QP=  wJ`Q8Q wH Ĝ]:!3tzt<`E"XV+y^Duy/{!zau>h/X'SEԓRU#h /6⛁^eSbcЇ QbR*DV# $l K-I<jxVID/A\FiDJ4Шs r0 68Ӊ0\ a\mjrM9乽9D)rn-gcz%B*|g|>B4-ʽF{ݹ'$éHo6ku`a@vV7nr(LGM.bI@Vȵ6JdI^6d<^WT:OW_"WFQ&>]#̛)3%_Emmooׯpj0Z~0h^*׍Uyڕ2~™eeE1\~_Wۉpo(\%'9KqxztOB -NlX$p1Gb.`]ų1x֯  v ିn׫{ -]*vl$HaA2vA_;/[9供p,ZEz*0 *l º/ؕ7J BH݂̆`2<7K4BgBɄ %h&Q$CI &՚yXh.\&pM&Mkȅ &K.t\uBɅݱu)ԁ( ˀ(;e`;w v# (m^|mqMm:QWF}0*GSʟo;þa_؏,J~cݬOVeM<\kԺ)n[,5ڳ{ waZyuE]]2/,L|QcM̽Fwەl[^b-(^/Íx"cZQV>gi_?>a l [H lRz;Qr6ͥBn(o<"u>585Fomz1H4ZqH٘d|ϒVF>go\xۼݛo_ IҴy'ŗ/7.K* -\')>wOC[+7T9cv2ܭ<1T7W|[tn',wXn`Ex+6 as:[OxغNa`Y׶b׵T?E*Χ)uR]"Sd/ % z7{"'P'ҮXXtn VT%a MD;a= NД:ASMz %\B{eGm^"%/:x痯&ҟ1n"0nX) 7WB*MV9QUϩ˦3NS^L:* kA Vg )s_F t|m66]~4(VoT|AVLATLATLAԚAz /']CyvD/n 3FEr:ES:ES:ES:E:],o$X҉9wVc*x9<(!G:Qk5ע4I{F}F>u'p۷Է7B]&#G3[od {CZx77֊{ .j>N9#N.es PmD|aT$ԧz0IxCD &0Zr!d#K#K#Qb585Zq }kwmy;F4UߩRSH'KM[(fsyظٰQFb66n3YO3-e.}ދ=5nlV ,C٬wݳ>}io_yׄʊʖ~{{yr.ѽYo.-xl+*;7oTVtׄ.W.7oѵ?yGc٥~N/?DLd8kդXIBIQG9sTLy#Ca/Pg+Ζmo2CWp~ngFWgkg }v`p 2G}CrXSK\0?;)/NUowr󻐛tPA}D]SΚ!yGXZ',f]c}i}k}m}f^nVnRoi%_ Wu5ei^Z毡/\op uO}WPRVrX#Õj~RTߨg3W>[hkd21Ci1z>U_@gG=}5r[_Г@֏l[b]"Z|f ZƲ<6^c=ʢsaV'IgɎ?e?~~ڃmF+qBt(GZ:>&czWJz\zKOit=6PiY蝍&:nwJ[$=OM t$HMt֋Kt|\F%i;mD݌3^+m^f5:nvq]t,Nt,fM:nޢD7K{=;DJIJDߣw{HHttGDkcq:~ }DǏ K=AONJI'/xR'x^_7>'ҷtD'~"}O~/H'?J?I:Eg_"FW4ߤ߉&^#Iq=:-C)IaQ+vF G6 k@G5cDX$#1 vc/Qa1DXz/",aMOǦi šmNtKc<}֒a kMUXÒ!ڔDMkGmX{:m֑hRu"Fѿah6 u\oP#b)a,"#cF ܮuC f C?ſ :v9)[Ӊ^G;xmg(tX-/Ş#FDm턅X_ƇMJ55g #9;?A<\s<\X2Qt_kiZs :[>J3j6{T̀Ϸ{[?b\q: DrrkmI;drviZ2Y$9vw %JCӎ! :]!={_:^Ǚ ޡ6=݃hOdE,ڢk9@{]'uNݖ]'wӺN(}ejc\k5־-Nk-h_2ڷW;:ЕzWpX({c?U왠ifclɺEIO_5r.*p|.3%N]:_؊331` qi p/ސhs6 {9n43Wcdsa<j)9 0 .xd> ĀLȵ+=1eQn('{{y,y7ZvprwMZvx\VV_;Ji48t~Rgh40;00޸>+1Oc>`yᔝͭSpFS)RxݧFWgj.q Xr40@ 0 88T<|b{w$qԋ؋ufQxhkdj?anmZ-Ê2qe֍֓KsjJ/Ud388]?uxpcC b,;̣qxͶ[㬯^v]52~4{;+"^y;wf5QhkIW\c;jݴNZVBLuf1MrصfMddfbo/6L~;M-{kdy8]s^[+;I__X%Y-eMYZjg g|&㬮O;ɳB݁2s!+zCWX~I:neXUĊD9JRG1e$,o9amy&=x̘bXŋo~S{~\"Q>Bg>dsFZÝ8BHg`\ 4T-BBqso iེSc0w78l" {($G(MFP&;!M0raN}K@ٝlz#at^3XXNv1YvQ|d㶋bC Bڙh;vi.&18p "U"< cV%lv(iӸ7ZLgO։qtg@Kx1l1 V^Lhs)..ŰETqg= g$z\fb gX,T^zDyްZҢIsNr=Q^ލ+_7DsVY8g`9+EY8gZY7GR[^/FVi 7zSDyӥDo]*Nt(϶Ǩu'QwQ.+rPB<1{0p&Ήg챐"!xijz[+i uZ%ZR[#8_+-9^]+5M~6O kauf[bh࿘Ccqֈ4m+7_WR/,)wͭu??zϪ!ˊ05R#a;jA,VZMdk~޿Z,:~ĿVOK=?1~6a;Bg44SCĸʿпۍuI|v>+FmklJ0@]* Y.S@=^uaiOfdnh`DqF\7}1.iv `dTI#A drONP;y7@wv^|>>@!$ 9c?"DZ/m!"F-OhQ"c/KD`"ܤ\/KPT{=zr*t7#OV> r&DdWLkID'ekeܟ"[` $P J7#2W,2oRۥQ(b||ǔpw{ZuZk1kJO᝾}hu?֟SSS'3V{]&62t2i)g]Ymƌ` ,Zn,&zayK,3Y< u:A mdꌠtOkV.Gt'].u ' _7ea)[Kjk`rġ7YYY5ʱvP?֮n& /L2_ĆoppWhh[0Zڊ[; r lr;3^g 7ԅ;;UP1δz9B[䷅&V;o/gڃa-t9upṇ"BiϤ$mek lr{`z']xpnnj9%p>$wՅxGSЕ׭ַx׎靭6XEN3PɽhW\%l.e f+$)wXGO`>:&',wwnn76F=*7-DEDOФRd F\% :SUp:pzȲ] 7-7#9xtE( ;x ^0hcLp>FkЅ|?Ji4HYHN t~ê޵YZ#9Z3=FQvҁTiҚ$?*%~_iDޓ_UP_uZΧ &[Pm- Quu&[3 ArtNS ]r[]8y"x3A] $#gٯ̓Ii#8# GJJl!|33ً{L="kjwf"DHq/D#j.]19б@L8g[LoHߙ9:EgVbXqs:y>1VcV:>[Э;tV?Ӗ'v9oѽH f6U1]>ʵ3]u3Cs.\sw .к{]2Sh'l<~/_;64-_7_~9n]'FA;7 U04븵rY]{V_M- !8]0`7G8ln$hv\ٮ0ܰ;Dvh %G j&@$ HILHxht^bt*\5 *ѻmU_p 9wHQ?L\ϟ/d[\ B}X;˿A:Q^ }?< GaAuȆh9DZ cNAXA[<.xRpM\О֖`Wn^' y3JΤEG$ۭVR|A};}O1Ju-a'LP/uyF\Hb?;ì`Yk*ƝN}~̷̽r2TZI];۩kSt'*c|\m6yXL}[ ^>|ϮZmz)ĺ=;cn3_I6tv}T/-6+G#(Uv GM-uNda]lMеF[V[`|h40<^#x؈0c}dv{V5ZimZ[\Ol^vטv_/ҟk~>W;ts&4-tP>>Dϕ\ȻLqQeO[Q)ɩrwg tx\6zl1V.t m=A x #DA4*G 0 4!_f[lV!DP4;y0y*V"Hqp8D\U{DTcVD<#nxaǶM<$P(/URvG^ao#<8X` C}6uA1D&Ob386 8f:sǕYS(Uį,:ξ~aagQ&]MY5DyT4DOCT4DO48N48N4jͧ=mmq眀 y/ 39$G)^jnuf3 2Ȣ !T:O@_N'%E{q@lS#+ݡ?/;)FGQHO{.4g=v?X;uemb/XYoZK `e;cEY%/ZVzxGWVݚC#>J:i*{m`$iomN}Y +WCb ws; ]imF5BYxH;㋞VH,rZsKB6u6O$O{& N2 nMD LhfYXd%eX'|A-4v썔v!NL4@$)ߝ)ӽ杕p((P+?_LO[plґJD4h)KX\u<:C ĽSU)b˥/\&7_rUJCW͡hi|+&Z4AS|C96ftw/[ :7vt^w[ڞ[1YZs08/Nt!W^\iADr GhSJCKC;hěٴv.c`pdIwwݶҴnZYHZ{C>w^^vCoTB\s{F/O$j^7+h黌㶀rm!ijQJ0:舓jD_E_}ч3qU]1tպ9, 'مְg5eo`LU{-ӠG5,Dr@FxTNvNX˻oqky_D=}E>~-η:F |ɍN?qrI1b>#0sBgYCre66|W|Sư VZVŊ5qbo崨tt ?v?{>EKl k>65#gumUizi"j8m$ q;Cn,^Uل9.Rixk0و%2Of/vwIMly#f>B"xЕ{wK)ELC ~^s=m5Ff3Xm\ax}[VKo1F NJ oBK+SYvr =&N3~3,\Xqq0:ҶFRH߁hPȷFaaAtJ摍x .,O9DPĴǵ0< H }H3)G`?(8q3,#ZJ-od_UM-XaeXaaXx$KOWZxx, cI8KH=o<#:Qc;0N/@G'H$gp)OsE˼t?qȪEU;TZհ:M/ªxj]RIgWUW]Wu.v9}3J:zW·NR=9zPLӺָ?X[Xk>-n~ٗ,*fZ[mZq[n`3XZm]e`|g$Yf$0=VLa5KS҇蝌3F'X[?Y&}{oOx CO' p[Y'/gԇI5"5Y򭕼l3q!uˀB6#\AUvYۍ~poYpuAgF8Z/Ar,7]f9?r8f#G0sa\X.,eRWKϦYBO­iը3(w.ݮX ▻v .܎W,Mg-v1ܶH^R(^`ba4I֜ܚ:dռzg,vB͋PE6/BY"E/BY"!<(]d!|>[lg#|t+}a<|iѥttrj/ oV>F);DVёDJj fKKCBP.j=D%!05#D%(3_5_Ilj WR)O3;Ձ3vqN 8=q2Z jhєe5^0/7.zCc̥m-z[h-t-W%kIW] ryO#i\i,hL ;mGۯOk)y 6x eF_vwYyû<|xҝn|C];@|Ʊ^xE~Æi' Z"ݬb 6X+T/ d{Nv07g:*M򡉁8>. ) *4l,ǝHWH(=_Fpމ=)4@B9vsI]vҰj;C3wjNlݵ |/,b=DJ+Y;1谝+=m0q /Ftz0"ß1&%j'ĒDBG`{ClG #P$v옣n %j¦-c-E@4$&!q\|DN=V͎U{ީGU/T=UJ:xy<:r콣sf\ߠAǪU}j.;2`k_Rժ*+CI#<2fIͶ5KsC!h稂*U%xtgM+XT‹Ԯ4j,^s:T֡@:ё(&&&&&X7UvvvphW;x;hoMZ}!9Ԯ#rl+/.F6r΁@4s 9dkNFj^ ' {}!}!}!}!}ڗ^@kFn $Ad"VK;K8G q)$l618I"ݭghk5S&QmAEH;c_NvH2>E>b)Cs>-rYa60o0Ϙa9{xH_as2vhӵ/|@6ΤWC -R}? ~7hoڒ>owF:S*6-ΑBs)$qEU&Õlem𵯳K(C!tboMM}n>>XF8lDr0TC0CP9G"d>B 0ws!p1Ypc ĦSlf&[ ١l" z$,>B}wcy|G)G]]վ|w ORQbԧkwcUfy1Nh=1c=ܨZ^fVFЂANlv,Xi[Or(ƒd616cm#f*02-z}hn67HY"d6I4Vn֘e6.7Ӎ{mFy9͇cfK~07̧A3v7 +Z^/n,rdFI;&Llz~cV 4N)XX`>B@TfQj}νF16W\ku6]?'G|:T (\P#w< Âx]%{@i*%SE͑ԚϧmGtI/< 7;a1W@7sX&3,r}CF^m={dB&9rPd Rmp ":4}ʵ g~Wj%<λ?JsYMNfH0 6rɡL&ij/bj~@OտѺ.^Sk=ީT>fj]Cz &{YMOFj92b^^nЪ {V  qPZy`aqX.`:ji3i R$i.R'L*kJm MR+N"i<)Lxj<`5> i4jtCNC Qt:0*!(aUۇ.4C::DjaX"0Vn(%vrj9v re9?,a9`~]@Ch!t q]ɏPyI]JˑC/!80=0Csc4)W`e0B3t r΄+)jz\KWD(w )Ժ?\dhnx竤Ȏ 7;#kUR`DjWN/r6 rvJHĶg 6dr-r{{;R'wL@5BGsݡMNgUԾ] AW|F=od붶Zfk+\s:f;aӔGfr2W[ߔ9#h<9_veM$zZfL*=Qv.пYοYŠ].߻䥾sXmi}3N?6[paN.yDW97փx]:ix$4,GSkV?gG hO0Ŧݝ ҝ ҝ ҝ ҝ ҩƐfY΢zL4TlgLnbAB:Ch'lg?+FC+{W  @ 0ԪS49Cgb{plG\:q2t{d|} 2/'u~9ٕt_W; amU*?8ߴѥC<:ZX6a$Ua&j֛$!b_~tD3O3_,9%L#B{u4mz_2h=Z G228LWn5UdIC(Xim[] 9rwls=Q6 < tl&YTpԥN&z2nQӃ8e )g+>B|Rxkk>כﺾt}jn~ܣ?pKogg:LJ/4yT媊<%uf]:Fv7tloca#maxpC8 name07post72L#_< ըsըsOVOV@  H H;jPfEd " OO O  ;UN;F; ; :; ;;#;#; = ;N ;N; ? r7O jO jQ O  O N;N D ; A B;; P V; F 3; ; ; ;; Q ; ; ; ; r V; r V; O V V S S R O#; @#;#; ;g: z z; z +bO z;N; ^;; z; z7;bObW TbRbO ;; = ;B ; = Z;:jGjEjD^E^D;F:j?N;;; ;;^G ; ;#; ;x;x:j;N;;:\:^? ::9 B; P P P P F ; ; ; ;__ ; r r r r ; V V V V z z z z + + + +__; ; = ; ? ; ; ; ; ;; ; ; ; ; ; B ; ; ; ; ? ; ; ; ; ; ; ;; ; ; ; ;D ;;; ;; ;E ;; C ; ; ; ; ; ;; ; ; ; ; ; ; ; ;;f; Cf; C ; ; ; =; = ; ; ; ; ; ; ; ;;F;`@ ~   " & 0 3 : !"!""""""" "+"4"E"H"a"e"    " & 0 2 9 !"!""""""" "+"4"E"H"`"d"OMI>5߶JްޥޥދތO:Zffm  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`avkuqlzpwr~ntcsdijghbfm{e|&&&&Jtd~*lLp&X"H.LtR  L @ p * B |  @ , v  Jt"Nvtr X N0"HJ<vNx@h$|,,~< ` !R!!"H"# #f##$H$t$$%%h%&,&&':''(D())~)*l*+X+,B,,--J-z-.*.l.//8//0H00181x1122<2j2233T33344V4445L556 6p67&778Z8899:9j99::B:v::;8;;<~<=.==>>^>>>??v??@dAANA~AAB,BNBBCHC`C; O!#!"&5463!2~C\AA]]ACA\; ' {?ZZ? ?ZZ; O "&54632"&462]\]@A]<Ċċ@]]@A]]AOċ;   "&54632#"&5462v\]]A@]]A@]]^ A\]@@^]AO@]\AA]^@; A! '.7#"&463!#"&463!>!>32#!32#!.7!wB?FPA]]A&$'.4676$7:*:::eeϏ2 R2U`ee4/-%TL96QDcrCSSCqGM M'P8[021 "?[[?r(b (D!u.t!?[[?,.& %28j˓WW ; O /AU>.7"32>."$&6$32"32>."$&6$32 "t!#"t!#Qww77wwxy99yxؼ``(0ccxy99yxwv77vwcc0ě{<_ 6@|66@{6 ,<<<d=VVV=<<d<VVW; O!T32$7">7>54.462&/! '&5476$7&546$326PuJ ==nxKK(O{@OKx\]$5;|$w*AOOAepHSqkj3}zhZ) r2peLrZ7nZ.9DrƄ?ZZ?6y%$6varqa/l"&۝fx?`; v "&54632v\]]A@] A\]@@^]A;G+2#". '&76>32#"K@]\Azʱ,5GG5,z@]\A71-DD-1~]A@]t .-- . u]A@]u±죱u;G+"&4632>76'&.#"&4632 A]]A+{~'-DD-'~{+A]]Azʱ,5FF5,G]^H  H]^uҠFt= #%6&' '.7%.64632%[_CH&55&&55&IB^~ZeGFev2|%&55&%|2w>YY>; %"&5!"&463!462!2#!%ee A]]Aee@]]@ >XX>J^^>XX>]]5 >'.7uz;;-Fy:;-d6)q66(q6;  "&5463!2#A]]AC@]]@]A@]\];z"&462Ċċ_Ċ? K '.7> m8 ""78"C" ?u4'u4 A' O"   $  $$! yynnzzj?K 5d \ Ҍ..xDD֋~hO O632"&5.7/DB\]\,^, 1Y@?ZZ? .V.O O()"&547>54.$#".676$!2 !20CZ&%Gnثj2R 2F(fS1A]^X@9+*,\XW) d)wаu\]^Q OF"&463!2$>4.$#"&'&676$!2  # $'.67>32$>4.$#FaaF߫(nnثn4() 2F)n"!H;@((jɭ#ttݥ]\WXY(12)xΰn~u󎺕3BJ"  #"%KdݦdO O!632!2#!"&5!"&547Y(-1JF^@^^@_ckB[*51YAg^^>XX>JZA=, m O44.$#!"&5463!2#!!2  # $'.67>32$62tݥ_A]]AC@]]@Z#n"!H;@((jȭ##ݦdZ?%?Z]\~􎺕3BJ"  #"%Kd O0B6$!2  #"$'&'&5&5476$3 '&$#"4.$# 32$6ڼ!q/b2+3ZFbkA2 R2jӍO4Rsi#"O2T혮~nn#"콴n۫)d )Wtp*&ݦd횃MdO O!2'.7!"&46CC["78 "@]] OY@*%6 {6 ,\]  O,<32$>54.$ &5$    $54./l,J.ll ;YPڶPT<SO ̚{M(32$654'! $'.463 $7&$#"6 bWVÝ"!H;@((jĪ*lCRR?LxS]L99 ɭupsv3BJ"  #"%Kx1yk٭W`q@`%L;"&462"&462ĊċĊċŊċċ4 >.7"&462uzv.G{v-Ċċ;-8{;O;-8z;ċD .676 ',(#7C9}&9Q8!!!8kq(>"#<';  "&5463!2#"&463!2#A]]AC@]]@A]]AC@]]@]@A]]\R^^]]A &'&67 .7> g--78!!!8R9'}9 hs '<#X">(;  O2:#"&54>,32$7>4&'&$#".676$! !""&462]A@]/P == P`j/Z/QAOOA7<Ċċ @^]AvX'u1j1uf-^-aa-@I8Ҋċ;j 3v32$74.#"32>54 '&$#" 32#",'&576!2 #"&'!"$.'&7>$3 >329kr2hGxk9&CC+4usiP0dkB)I%gC``ChG8H=}1\ꄎA?NN?A$ YpkG,*By'l'I%6.'!. |X<4.$#!~y˲+ղ5ZA]]Ar1ՔŽGG+#ݦdCdn~uZ? ?Zw^9ab9 O16!"$'&5476$3 '&$#"32$/Z//bFZZFbkA2 R2jӍO4RR4O2TL-^-nڝn۫)d )Wsuusᡫ; O$!2$4 .$#!  #!"&5463!2 v{O+ WA]]Arp';H PVbsvZ? ?Zv; O463!2#!!2#!!2#!"&5;]AC@]]@ZFeeF@]]@A] ?Z]\\]C]@A]Z?; O463!2#!!2#!"&5;]AC@]]@ZFeeF\] ?Z]\\]?ZZ? O:"&463!2!"$'&5476$3 '&$#"32$7FccFA\6/bFZZFbkA2 R2jӍO4RR4O2T}]\Z?BK2nڝn۫)d )WsuusᡇX; O462"&5!"&54632!~]\\]\]]A@] >ZZ??ZZ?_?ZZ? ?ZZ>|;v O 462"&5;]\\] ?ZZ??ZZ?Q O"32$>5462 # $'.67>jɭ#t\]n"!H;@((Kdx?ZZ?󎺕3BJ"  #"%; O463262 &' #"&5;]A@]6....?! 7<{! ]@A] ?Z]A..,,(x7x"!7y%A]Z?; O462!2#!"&5;]\@]]@A] ?ZZ?]@A]Z?; r O$>32"&5'&'#"&54632 AO4B[\]Q77T]@A]\B4N ,:Z??Z^@-8;,HA]Z? ?Z:,; O%46324632#"&'#"&;[C,G^@A\[B,G]@A] @Y,!t ;A]Z?@Y+! A]Z O"   $  $$! yynnzzj?K 5d \ Ҍ..xDD֋~h; O# #!"&5463!2 !2$>4.$#! s\]]Ar1ՔŽGG+ #w?ZZ? ?Zw_9ab9 O0  3 7&>  $$ &/yyn)n)z?@'44' \ Ҍ2}L2)R.xDDhhv2%'4; O*!2 &'!"&546!2$>4.$#!r1zM! 7<{!<\]]ՔŽGG+ Owб$7x" 6?ZZ? ?Z9ab9  OD32  # $'.67>32$>4.$# $'.4676$! '&$#"1M#nŸ$"H;@((jȭ#ttݥCSSCE2 R2jչYM::;`~􎸐3DM$  #"%Kdݦd٭WW٫)d )W`%LO O"&463!2#!"&5@]]@CA]]A dd \]]A@]?YY? | j O&4622$7>5462#"$'&5]\bcCBcb]\t̆t ?ZZ?Vй.77.V?ZZ?:p6AA6pV N&676 >.'VB:;t  }lW=@U ;] "0 bEeL"+,!S ; O">2 >"&' "&'&> WzW  o??Fb WzW WzW b .V^Q  $22$K,1 [3$22$K$22$ ]-J -)KS K6 > &' '.7 &6<{!"78"b!!77""78"`! >&@'u45r'?'u4OP5qR K>"&5&>#66#ee#l# 6#"}44?ZZ?5{F6O O)"&547!"&463!2!2/B[@]]@CB\M,A]]Y?+$ -\]Z?)%]^;G463!2#!!2#!"&;]Ar@]\A+@]\AA]?[]A@]]A@][@ K 6&'&67"D!!77"! ?'5r' D5r;G!"&463!2#!"&463,A]]Ar@]]@A]]A~ K]^[?s?[]^; z N.7632&' q1 +/HG/+ 11++ $n)%%')n$#Q#; "&463!2#A]]AC@]]@_]]]]: z. N &'&6761+G+11++ #)m$"')n?56!2>32#"&'! '&32$74.#"%""j V:A]]A/McFՀr9%??pAF?;JZ>A >Y5'\Aq..ei@*/fZ:ieCOP; O2$#"32$46326!2   #"$'#"&=<5ӀՁF_B{go]A@]:X ggvJ/A]sk:Zf/j)? A]]Aiss2)*1Z? </6# '&76!2'&$#"32$J6|$%6McFՀr9%??pAE?A]]A ?Z5'\Aq..ei@*/fZ:ieCOP? 4!4.#"6# '&76!2#!32$=( FՀr6|$%6MZP0dh`O O/"&463!4>$32.#"!2#!#"&5@]]@h :&A=>`Tk~ۊN @^^@jJIdb]];r˕m7)G.8A>_l2^^4>XX>O?E32$74.#"32>5! '&76!2>32#"$'.>=9r{>cFՀr9%??WZ|хJ9 ”cp[$l; O(%#"&54.#"#"&546326!2]A@]Fڄk[+]@A]]A@]F8>YX>0f[;'?OQ&`>XZ? A]]AiU O 4632"&5"&462;]A@]\]ċĊ>ZZ>>YY> ߊċO O&4632#"'.7>32>5"&462;]A@]؝;&@<@_Uip~HĊĊ>ZZ>c *G.8@Bi@ ċ; O463262 &' #"&5;]A@]}....$66$ ]@A] A]]A..,},_4{#$6A]Z? O"32>&"#"$'&54624PiU_@,=FHBko^]V'L@8*B( bRT A]]A(; r;%"&54.#""&54.#"#"&546326326$32 r\]:f[\j=bc=j\[f:]@A]]A4S6jk3Jɗ>YY=7kU55Uk7`>XX>7kU55Uk7`>XY>o>Z@/o}ln{;'%#"&54.#"#"&546326!2]A@]Fڄk[+]@A]]A:V H8>YX>0f[;'?OQ&`>XY>o>ZM8U   !2$65  xiW'0'bV) @@;O1$#"32$46326!2   #"$'"&5<5ӀՁF_B{go]A:V <X ggt\]sk:Zf/j)??ZM8ss/'@]]@3 O?532$74.#""&5! '&76!2>32=9r{>cFՀr9%??']\aTk]uV*]@A]>ZM8*G.8A'?OQ&`>XY>cB".4>32'&$#"32#"$'.>32>4.f¨}HH}f7""~8Pz0''0:آZZI6H6T{ևJJ#BhĭhB#dT"78"2Wl8aa8l&"#"$'&5!"&463!4632!2#!: QiU_@,=FHBz}@]]@dIJj @^^@b&J@8*B( aPR]]A]]A^^/()463232$74632#"&'#"$'&5]A@]V06\Ec]A@]\A/MzҎko>ZX>($&KA*b=YZ>A >Y5'+1aQTW &6 >.'Wz!/0!zQ[?BWLj ED iL] ** T  >2 >"&' "&'&6WxWT]T(WxXXXWxWM".."{)* $M.Y"//"{"//"KbD{R6 > &' '.7 &66$BB$66$p#532>5!"$'&5]@A]U06\Fc]@A]vI6H6T{ֈJئko>ZY=($&KA*b>XZ>9 ǧo\$l$8^Aj@cWaQTO)"&547!"&463!2!2vvB[@]]@B\cA]^W?-&y]]W?,(]^;FL32>&"#"$.54.#"&54632>546,32.#"@OxQFW@2,=FIBcNp@]]@ŝJ>:&A>>aTk|ՆK_S[J>|g@ }g@]A@]<]j032>547.54.#".'&>32 32@pȅNc;&@=2@WFQxъOK|kTa> +$>(E@>Js@]]@g}>Ftўu= *G./< @g|>YT;0j]<A85& V0j]<]@A]B z O!.7>32>7>#"$'.'c}r&L"W'!#~r%LW'! 2"8o2|{9WY82"8o2|{9WY; P OL32$76!"$'&'!"&463!&547!"&463!6,3 '&$#"!2#!!2#C5hk/Z/1g+#@]]@1%@]]@D=}=2 R2j ϊPRDbbDK/DbbDõf-^-gYq]]v\]H)d )W]\ؓo]]=O O@"&463!4>$32.#"!2#!#"'.7>32>5FaaF4d:&A>>aTkz҄J@]]@ ç;&@<@_UivχNb]];r˕m7)G.8A>_l2]]c *G.8@Bh?n; z"&5462"&462"&462ޞޞĊċiĊċ_baċĊċĊ:V O 3GWk>.7"32>54.".>32"2>54. $&6$ "32>."$&6$32 "r ""r "Puv77vuvw9&Gr^{<<{+aaqG&8ww9&Gr*~տaa++aa^rG&9wvuu88uuտaa+{<_ 6@|66@{6 ,<<<ԏW&WTWV&Wԏ<<ԏWVVV&Wԏ<<d<VVWG&&7> &'Gz;;-e68%MJA@@)l5C9c !E ' &'&676!-;;{F-:;z J6q)6k8n)6D & '.7>gz;;-z;;- 6)q6i6)q6E  &'&676&'&676W!7F-:;z-;;{!6GG J6q4*6k8n)66q)6i6r*6D  '.7>'.7>\GG6!{;;-Rz;;-7! 6*r6i6)q66)q6i6*4q6;v &6 v: 8"&5463!2#!"&5%>32"&5'&'"&54632A\]@DbbDaaO4B[]^S77Saa_F6S ]@A]]\=XX=T,:X>>X^@+;;+A]X>>X:,A?# &676.7d-;;{G]YP{^5l)c?A)!0S/;O 4632"&5"&462]@A]]\ĊċA]]A?@]]@ يċ;v O 4632#"&54632"&5;]A@]]@A]]A@]\]A]]AA]^@ A]]A@]]@; vj O"&462"&462ĊċĊĊ vċĊċ; ~,6>6#"'&47632'&$#"326 !   h2^1mu_-66-_֥Sn5 +,5/aY9..9Y^KJ}r%F-^-du"bb!cV)22 )$M|7ڄ7|WN!!x;Z +".54>2632#"'3274.#"}ffs0@A]]A5/x";To *F);"Zon00^@@]%%Cp%dpC@G&&7> &'&7> '&'"$z;;-e78%LJRGG6!/-EA]]AFA]TN!!x; z  6  5yyFx>2= nnn<<<; $"&463!462!2#!!2#!"&463!A]]Aee@]]@ @]]@A]]A^^>XX>]][]@A]^];> '!"&547>7.#".676$32!29C[&x \,2R 2hC`}HA6ipA]^W>6* N FN$) d)Vc,VvZM;+]^:> 7"&546;264&#".676$32#"$'.>3264&#A]]A񔳳\,2R 2hC`}HjXj~f/Z/1_ ]A@]}~N$) d)Vc,Xw[mBvӓUxa-^-/Sę; z/ N .7>q1 ++11+G+ $n)"$m)'#;"&462ĊċĊ;+E##"&547>32#"&'&67>3267B\e(p>)^4'4$VD/ LV<6ThPqk\IE4' :Y 2"&5.76B\^],^,0 A.-BB-/X/#:Z" "2>54.  qN!@@!N`JTJ |!To??oTtvt?% &676.7 &676'&767d-;;{%"]YP.!7GGG(i`DK{^5l)c@@)!0S/^5l )c?AA04J : y O#>!>'.7632"&5.763232+"&5!"&547q׺#:8 "#78 "0IF`ba,^, 0DB\TA]]AT]`F`,F6 |66 {6 52\BA\\A/X/ 2\B^];UU;{[B@,: U O J>'.7632#"&5.7!"&547>74.#".676$32!2 #t!#$78 "0HF_aDCa,^, T8Ga( ,OOa.5V4mSzo@6hq@]] 6@|66 {6 52\B@]\A/X/Y@:* P G@)N$) d)VcIsO=]@A]9 O+a!>.763232+"&5!"&547"&46;264&#".676$32#"$'.>3264&# Ը#:8!"#t!#0DB[U@]\AU\`F^,3@^]A`-2R 2iE~to\ajͰf/Z/2cÓF6 |66@{692\B]A@];UU;{[B@,H^]}~M%) d)VcItpDQyxa-^-/S֧;O 19462 #"32$76! '&476!2$>"&462~^]џ`P == Pj/Z/AOOA 7ċĊ~@^]AvX'u1j1ue-^-aa-@I8UċP)! >6.'!.&>&' |X<6.'!.>.7 |X<6.'!.'.762&' |X<6&'!."&4632!"&4632 |Y<3267?Gb3~FZZFbkA2 R2jӍO4RR4O2Tj/Z/yB ,d8)7&\I2#Q\ADfn۫)d )Wߧsrssߡc+Z,scIE4'2; *463!2#!!2#!!2#!"&5&>&';]AC@]]@ZFeeF@]]@A]/ j// j/ ?Z]\\]C]@A]Z?b1V 11V 1; *463!2#!!2#!!2#!"&5>.7;]AC@]]@ZFeeF@]]@A]/j /!/j / ?Z]\\]C]@A]Z?11 V11 V1; 1463!2#!!2#!!2#!"&5'.762&';]AC@]]@ZFeeF@]]@A]/51 +44+ 15/ ?Z]\\]C]@A]Z? j1 ++1661++ 1p; (1%463!2#!!2#!!2#!"&"&4632 "&4632;]AC@]]@ZFeeF@]]@A]kjkԖjk ?Z]\\]C]@A]Z ͋ĊċĊ_S &>&'462"&5+b++ b+]\\]1V 11V 1?ZZ??ZZ?_S >.7462"&5?+b +G+b+]\\]1 V11 V1?ZZ??ZZ?/ 462"&5.7632&';]\\]+b +/HG/+b+ ?ZZ??ZZ? j1 V1661V 1p 462"&5"&462"&462;]\\],ĊċĊĊ ?ZZ??ZZ? ĊċĊ; =%46324632#"&'#"&.76$ >7> $'.';[C,G^@A\[B,G]@A] r%M0S&!% r%MS&! @Y,!t ;A]Z?@Y+! A]Z 9%>~9Ë@ee?9%>~9Ë@ee ".   $  $$! &>&'yynnzzj?K 5d[- h-- h- \ Ҍ..xDD֋~h%1V 11V 1 ".   $  $$! >.7yynnzzj?K 5d/-h -,-h - \ Ҍ..xDD֋~h1 V11 V1 "3   $  $$! .762&'yynnzzj?K 5dm-h -33- h- \ Ҍ..xDD֋~h -1 V1661V 1p "*2   $  $$! "&462"&462yynnzzj?K 5dВГГГ \ Ҍ..xDD֋~h QĊċĊ; %.7 &676 > &' p1+2+11++,+11+3+12++*/YX/*"="*//* ">" j&24622$7>5462#"$'&5&>&']\bcCBcb]\t̆t/ j// j/ ?ZZ?Vй.77.V?ZZ?:p6AA6p e1V 11V 1 j&24622$7>5462#"$'&5>.7]\bcCBcb]\t̆t/j /!/j / ?ZZ?Vй.77.V?ZZ?:p6AA6p 41 V11 V1 j&:4622$7>5462#"$'&5'.7632&']\bcCBcb]\t̆t.60+4LM4+ 15/ ?ZZ?Vй.77.V?ZZ?:p6AA6p m1,*~0661++ 1p j&/84622$7>5462#"$'&5"&4632"&4632]\bcCBcb]\xчtdԖjkԖjk ?ZZ?Vй.77.V?ZZ?;q7@A6p ĊċĊ? O5B6!2>32#"&'! '&32$74.#"&'&>%""j V:A]]A/McFՀr9%??G+ 16// l/pAF?;JZ>A >Y5'\Aq..ei@*/fZ:ieCOP 1++11V 1? O5B6!2>32#"&'! '&32$74.#".7>%""j V:A]]A/McFՀr9%??_/l //61 +pAF?;JZ>A >Y5'\Aq..ei@*/fZ:ieCOPP1V11 ++1? N5H6!2>32#"&'! '&32$74.#"'.7632&'%""j V:A]]A/McFՀr9%??k/61 +3PQ3+b+pAF?;JZ>A >Y5'\Aq..ei@*/fZ:ieCOPP1++1551V1q? O5=H6!2>32#"&'! '&32$74.#""&462"&4632%""j V:A]]A/McFՀr9%??ڙڙmmdpAF?;JZ>A >Y5'\Aq..ei@*/fZ:ieCOPuċĊċcb+=O7&$ 547>$32'&$#"32$7632#"&'&67>3267+"&545K<>'8D8Pr9%??%9r{Q6H6u yA)h9+:'`K5#VJe*kʂ.qt͖WdT"~p"1XjfDDfj\3"f{"KdreHF4'2[B? O 4A!4.#"6# '&76!2#!32$&'&>=( FՀr6|$%6MZP0dh`1++11V 1? O 4A!4.#"6# '&76!2#!32$.7>=( FՀr6|$%6MZP0dh`1V11 ++1? N 4G!4.#"6# '&76!2#!32$'.7632&'=( FՀr6|$%6MZP0dh`1++1551V1q? O 3;F!4.#"6# '&76!2#!32$"&462"&4632=( FՀr6H6MZP0dh`ۊċĊċcb_S O &'&676462"&5,+b+E* 01+8]]]] !1V13*+ 1>ZZ>>YY>_S O .7>4632"&5s+b++b +]A@]\] Q1V11 V1>ZZ>>YY>0 N 4632"&5'.762&';]A@]\]-01 +//+ b+>ZZ>>YY>0*+1551V1q O 4632"&5"&462"&462;]A@]\],ĊċĊĊ>ZZ>>YY> ߊċĊċ; O'I%#"&54.#"#"&546326!2.7>32>7>#"$'.']A@]Fڄk[+]@A]]A:V H8c}r&L"W(!#~r%LW( >YX>0f[;'?OQ&`>XY>o>ZM8U)9&>~9ċ@dd?9&>~9Ë@ee  O  !2$65  &'&>xiW'0'1/ j/!/ j/bV) @@1V 11V 1  O  !2$65  .7>xiW'0'R.j //j /bV) @@1V11 V1  N ' !2$65  '.7632&'xiW'0'b.51+3NM3+ 15.bV) @@1++1551++1q  O & !2$65  "&4632!"&462xiW'0'{kjk!kԖbV) @@6ċĊċĊ;  "&463!2#"&4632"&4632A]]AC@]]@^kjkjkjk^^]]ċĊ;ċĊ O)7463232$74632#"&'#"$'&5&'&676]A@]V06\Ec]A@]\A/MzҎko+ 171 + 181>ZX>($&KA*b=YZ>A >Y5'+1aQT1++11++ 1 O)7463232$74632#"&'#"$'&5'.7>]A@]V06\Ec]A@]\A/MzҎko171 +181 +>ZX>($&KA*b=YZ>A >Y5'+1aQT1++11 ++1 N);463232$74632#"&'#"$'&5.7632&']A@]V06\Ec]A@]\A/MzҎko+b +5SR5+ b+>ZX>($&KA*b=YZ>A >Y5'+1aQT1V1551V1q O)5@463232$74632#"&'#"$'&5"&54632!"&4632]A@]V06\Ec]A@]\A/MzҎko eep=ppe>ZX>($&KA*b=YZ>A >Y5'+1aQTcbbaċcb= O! >6.'!.|X<F:,  /A@.'E0"2'v'3"0F; O $24.$#!!2$6 #!"&5463!2 !2$>4.$#!~y˲+ղ5ZA]]Ar1ՔŽGG+#ݦdCdn~uZ? ?Zw^9ab9? K6 > &' '.7 &67""78 "b!!77""78 "a" ?'@'u45r'?'u4OP4u; O! !"&547>62B\X<ZZ??ZZ?_?ZZ? ?ZZ>|;v O 462"&5;]\\] ?ZZ??ZZ?; r O".   $  $$! "&463!2#Uzznnyyjd5 K?EbbEEbbE \ Ҍ..xDu*gh"]\\]; O463262 &' #"&5;]A@]6....?! 7<{! ]@A] ?Z]A..,,(x7x"!7y%A]Z?; r O$>32"&5'&'#"&54632 AO4B[\]Q77T]@A]\B4N ,:Z??Z^@-8;,HA]Z? ?Z:,; O%46324632#"&'#"&;[C,G^@A\[B,G]@A] @Y,!t ;A]Z?@Y+! A]Z; r O"   $  $$! Uzznnyyjd5 K? \ Ҍ..xDu*ghB O>2&' &7XxY} | "/.!LeE bDeK; O%!"&5463!2"&~\]]ACA\\] |?YZ? ?ZZ??ZY; O# #!"&5463!2 !2$>4.$#! s\]]Ar1ՔŽGG+ #w?ZZ? ?Zw_9ab9; O)"&547 &5463!2#!!2 C[c[CC@]]@7@]]Y@*!&.@Y]\#U&]@A]; O"&5463!2#!"&5A]]AC@]]@ dd ]@A]]\?YY? |? K>"&5&>#l#ee#l# 6F{54?ZZ?5{F6; r OF!"&463!&4, !2#!"&=&67>54 .#" #A]]AjVa~aVkA\]@jHf ,1q٤dIhdq--gH^]Y[%vvsK]@A]Y?Z2T=:rQVyvت=Q+g?Y; O %"&5463!2#"&463!2#"&463!2#A]]AC@]]@A]]AC@]]@FaaFFaaF ]@A]]\^]]@A]]\\]; r O646267>5462"&5$'&$54632cb݅cyG]\ֳbcѳյ]A@]Gyc A]]A83';^A]Z?¢FL?ZZ?RNFC>?Z]A;'3; O)"&547!"&5463!2!2 B\A]]ACB[L-@]]Y?*% -]@A]Z?*$]@A]; 832>7&$#"> &' # '&76!2 8 nzžn8%@@(U^T(/ TieDf8;*[6}hXt!]G}Aq..qAs;O O ? #"$'"&5546$32"&46;2$654&$ 32$>4.$#ݫit\]@I憢HaaH`Bz(uuب/'@]]@4֪3ᅅͪpxagW~W刎)@cܥc;O-2#"$&'.7.#"&4632>b@^]A"zv/TA]]A!z;;/k ^]b;.6z;^^^^;/v9!F Ak; O,4.54676$32'&$#"3 ! $  lG4e7""~8Qj|3 .. 3:|'di6i H\@}kM"78".\w; i&j :w\<lP;G.54>32'&$#";2+"32$76#"$'&5476gky7""~8P5,,5:GbbG6= mGYyJc6H6oQ`pMրtɌd0dT"78"1Xl8aa8l]]P P ',NTB$l$aj\KP;O /=2 "&5&'&547>466$54.#"j블b4SޢeeXl=K+24 /T@%?e@kJ(VԑA\\A$-(q//))~.XQDu,)X ŒI%DO/2>54&' &676 >  .547dts]:#":^Z,:;z87z;:,vsK[[Js4[P  P[ 8x*;/;*x8!Lpp􄧔;O(#"&54.#"#"&546326!2]A@]Fڄk[+]@A]]A:V Hڣ]@]]@ F1g];'?OQ&`>XY>o>ZM85jo;v 4632"&5;]A@]\]>ZZ>>YY>;463262 &' #"&5;]A@]}....$66$ ]@A]>Z]AQQQ,},_4{#$6A]Y>E H6&' '.7 &6;z.;;zz;;/q/ E!)6j!)h)!l5Qx5l;O,%#"$'"&5463232$74632#"&zҎj\]]A@]V06\Fc]@A]]A/M\+1OA\@]]@ ?ZX>($&KA*b>XZ>A >Y5C"4'&>2 #"&'&6>! .>E=1 #C}Ϊ;[W|pb'[)H. 9*pwx;,oWz\$G;     i6i'0'blP @@; "&463!2#!"&5!"&5A]]AC@]]@aeeab^^]]4>XX>4>XX>;  !! !   &ii'0'6;@@;O/  #"$'"&5<54>32 $#"32$gt\]]X ӀՁF_B{gs/'@]]@3 ođj5s(k:Zf/j)?; # )2(  a'@]]i6ib@@]]lP;*32>&"#"$'&5!"&463!2#!: QiU_@,=FHBz}@]]@@^^@b&J@8*B( aPR]]^^/(;,4'&> #"$'&5463232>  -V_Q #C}Ϊko]A@]V06YoȜ[^V6Y&?9pwxaQT|>ZX>($&Kq); rR!"$'#". 547>3267>546232>54'&> L[ZtΡ^A-XX>2!AL `bY'D)9(lt];O OV&546$32'&$#";2+"32#"&4632>4.# $'.54676WB7""~8Qy=33=-yHaaHy4 == Pף\\HggHՀFFՀANO@l?Ů8܁dT"78"2Xb(/-'^W~WYL0j0t7mʕm7\]>_ldl_>_pq_;O O846267>5462"&5&'.54632ee\OS0^]^keeԗkÝ^]A@]0SO` A]]A8YYM@^Z>`r".A\\A-"r`|>Z]AGMYY;O O<!232#"&4632>4.# '&547!"&546fB\1%o%@@%9rآ]]HggHՀFFՀ=Kʝ(A]] O\BC/*EEgl7mʕm7\]>_ldl_>Dr1r]@A];L I0! !"&547&'&>>!2#!.76z^/C[ik,n,QI"78 " @]\A Mfa>  A Y@*%x2~P2Zr6 |6T[~Z9G T8f; O<&,#"32$764632 #",,3 6=4,#" FssvAy `EJ5gqߪ!;EybndݧdՌM]pfٷ7,WW󎰖7;r  "&4632"&462"&462zkjkĊċċĊŊċĊĊċĊ;#%&547>!&>&7!&G z. .z G&w'fnf'v] "8+4u8T8u4+8v$V TT ; +%&547>!2#!&G z/ @]]@9h'w] "8+4v7T]]T C O 632'"&5.6(&)$:*:}:PeeP:|:) Txp)>?ZZ? %)px; +"&463!&676&7A]]A 0=> G&w'h^^7v+8v$V TC O #"'.>4626 be$)($d:):|:ee:}:*Txp( %?ZZ?=(px; +8.76$32267>#"$'.""&463!2#"&463!2#X'|j&c>Wk7|3&j&c¡k7|ҲA]]AC@]]@A]]AC@]]@5L5|@itG5L5|@jt^^]] ^]]@A];\ V."&5463!>32#!!2#!'.?#"&463!A]]AH-./-7@]]@l@]]@w-./-6A]]Ai]@A]Z.-(s)]\]])((s)^^v;  $!"&463!2#"&463!2#"&463!2#A]]AC@]]@A]]AC@]]@A]]AC@]]@^]]@A]^^]]^^]]= ?.76$32267>#"$'.".76$32267>#"$'."X&j&c>Wk7|3&j&c¡k7|3&j&c>Wk7|3&j&c¡k7|5L5|@itG5L5|@jt75L5|@itG5L5|@jt;-^32$7.#"'32$67>54&'.$ #",'  #"$'&76$32 >7>32 8j/&`Vj8%@@ "&/j8%??%80S8jj8S=KK=S&nF7eA)}n%S=KKeiZ($PE.ieD`OZieCPODei̛q؋qq//qhЇ1'fp>q=O /2>54>$32.#"#"'.7>vχN:3&A>>aTkz҄Jç;&@<@_Ui@g~>W*G.8A<^j1Wa *G.8@; #!"&463!.676 l"+[BA]]A,("7C9}>&9D+@W^]ek$nx; )"&5467 .>!2 B\,"Q9&>}9C,-7@]]W@+D\ xn$|bm9]@A]; O !!2.'&546zeCB[kV<@Ul\a;Z?/;>. ?Z; L-#!"&463!&>!>!2#!.'znA]]Ag ,:F>5 66 5>F:, h@]]@1W=ATO^^m'F0#5(;(4"0G']].<=-u; !"&463!462!2#A]]Aee@]]@^]>XX>3]@A]; 832>7&$#"> &' # '&76!2 8 nzžn8%@@(U^T(/ TieDf8;*[6}hXt!]G}Aq..qAs;N  .'!"&463!2>3!2#L F[ZFA]]AA_ S ^@@]]@ .?A2^^O8 5K]A@]; I/ 3 $&# ! >! ''.7eO '("78 "/"78"y!m/dH+] SFU6 |6=I6 {6; v "&54632v\]]A@] A\]@@^]A;   "&54632#"&5462v\]]A@]]A@]]^ A\]@@^]AO@]\AA]^@b9O)  D 1$6  )  A RV   ( "bR 45Copyright (c) 2017, Cristhian Gomez, (gomezcristhian7@gmail.com), with Reserved Font Name Tecnico.Copyright (c) 2017, Cristhian Gomez, (gomezcristhian7@gmail.com), with Reserved Font Name Tecnico.TecnicoTecnicoGruesoGruesoFontForge 2.0 : Tecnico Grueso : 3-8-2017FontForge 2.0 : Tecnico Grueso : 3-8-2017Tecnico GruesoTecnico GruesoVersion 1.3 Version 1.3 TecnicoGruesoTecnicoGruesoCopyright (c) 2017, Cristhian Gomez, (gomezcristhian7@gmail.com), with Reserved Font Name Tecnico. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.Copyright (c) 2017, Cristhian Gomez, (gomezcristhian7@gmail.com), with Reserved Font Name Tecnico. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.http://scripts.sil.org/OFLhttp://scripts.sil.org/OFL;  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abdefghjikloqprsutvwxzy{|~      !"#$%&'()*+,-./0123456789:;<=>?@AEurouni00B2uni00B3uni00B9AlphaBetaChiEpsilonPhiGammaEtaIotaThetaKappaMuNuOmicronLambdaPiRhoSigmaTauUpsilonXiPsiZetaalphabetachideltaepsilonphigammaetaiotakappalambdanuomicronthetarhosigmatauupsilonomegaxipsizetaangle therefore arrowboth arrowleftarrowup arrowright arrowdown congruent equivalencegradient universal perpendicular proportionalemptysetminutesecond =Օ}oըsvedo-2023.4.6/vedo/fonts/Quikhand.npz000066400000000000000000002732141444463326400173130ustar00rootroot00000000000000PK!QcvnLfont.npynLv̽w|i$@ !@PBN6B"" ""**WZP"hDE/?D,׋Z#rP!ߡxÝNt66==KTv)_r|Gp]Qg@;ߟV)Aa_\5^u2GN9#_PxP TM<sC]#|+?c? W❴QaI VO)Wh<9N_tU*v:A9%v'l}fc+K-qLf_`DZ1pia'7zD!\M`Ǎ'lIqHObC&33s'ͯGiVu{V0Ҽ:OԈ3,g6nVc+k\~r#R46xm~d5z/ߍ{Ɨ;#Z83B)kp5ႈF:##D 1D^}iX'6?OP/`KEP~ B0C2a81xpQ#rQhri ޶'X186p881xqMܱo9p4p8`Dy'N[t`[|$|$xi4YIUTV%T/I~'y_R$Y L%M2%gE [PQ2)M6P_\S4АfK].^72CڀހrO/Gi |(5kgˤ{8cTgl3'Zg_w &]!0Nu~MmTp8xr8sϱZokVխ䦚Rer2Ri6Ƨ{7?(6cy҈1A(fՙFOWɉj2\^3 b|'U gY߯/buz[s!@/C3hk{, wDc5RTr,YF~,OVC<ȧCRI}X路ol ESU}(ϑWj/QI+!Z{A_nfZgmp|/+PamIixEE")tJXL"~ȞiOB)l!E#4M [!Y3B,xJe#]p+ ,Y98M.nJ%AJB*OI#!ؕDv{,r$9!DTOU}s)$'E䬸h $`=6X޻-X ڦ8^li q6Ե}C 1zFx+6~F$rVnJ ~EI"DTy!Ɛ/'AxMEP. B? B?)Z7dpc(dcO'7֏?,8`oJaԝ8BFI0  KɂYR(\AJمkH\g/FiLdmW +VYx|6^7pH\y߄Rx#Y+RJ2=GipT;ͬkCu'`MVo >5cd|^}l:+flyR':ytc1/X Gk;b&Sf=Q׮z,ӔNUÂx$)?)&XW6 v"^_U-JX2_,~潬eEY̗Cf92z6<>*ح,b~w54/)voN5`=g k߬en'٣BBMYag-͜lN5fl:_xcVqD\>fBn}o^[ݷoKcZ7ePDyq(pO–Bx)EKXabsނ]{=4+\FހA]Fe%(5߹ %p5YK.Xjg)V(9.QwMkb4e 눸ӂa}'O'/`||+G)G0 8;3tΚkZc~V~ʪVَ=Ǻ݊e{}'mt 78 xxEbVb/eb19(wuaBW" m q,c,B)d A4p$`ԉ“nRy2hHO 2{;UgEs#Y->gh53ƴ~ujށ15@i`\0TP?n~i1am2t[S#f~dJ=\W3n_|}~2NYM):OxGE@٩ǪA>k.MpQ DܤPE,TBn\d-kъ^s,%~'4%noWRjsmp.ouu֋!:J5b"L5}# ;XvSZsђA∶,syNaĐ/2N>LO(,܋84\/ijz=P_{b̽]`=G:{&5&@,{q#ReC(0Y1`}",F@O"R 0qJΆ*8UgS3o}tuEQk;/B_AM~]G^R S_TV󵿫Lb_Z.X66)/V6Iw2VʵZ&k&U)!R g`ѡP'uvbvuVOb3+Dzvoeyw*ݣ {k Vf9_l9fAu686S6:yܨjF "uK&jFh3M[R()ݞ nCdc2(8ŵps)(8 +&&פpYLIJ BNHtf Yq݈v <p1^$3 7ph\1s{NA=p%,/]*pvM4th[jUMACRU \x= Oux2GZNIJ_`'X=[?Փ^r |z ߋ8ܥ;Kb''.S-v'E"flxrIoG< ?\V^QD JOB[믩An厚ߣvC5l_Y?X_Yز ~%VОo`/oCηv}l{۝ֶny}&5 Rn~gǹ-Xb*<PjWJ ńL˴nݒ4{jX bwvv585EQPS ˆ&oɜ(h۞m$(¨#dށr,"55ukх2}Qw'V!݉dw-tR̹=R) /{Gҷ;vECHhǗvEΈ"q`1[Bhv,­HO.sB*'AS":j;vNCI(zzɡ 1!׏ЃsU'7HW➓U( GoJphmѪ=Ѯ]+peaЛˡ1*rE(CU:+·_P'ePqAxhJKW8WkJsWs0:{Tfqjګ ~0za=`ş1 ^j =GĐmÀFq880Aijԥj`WO蛌JRhl6@SO)I/j}Eo|i|"bpWY{$)YMۿ79fsF9]ᅠ.tVW䗃g_l3='|WtAc/miKU^Σ\b#5*M e;='QQJ%Na%fg$%yx2byym˪^jxhIJ7Fze_0I9s(zc}}zQcweOc+̿Ve;w1iE &"-==iߵ+j~]dSl/1~S[ۑF#f+E^],Fv"E2ܦ췧IQ͜B锢Ejc[br+J#b"o7LeMCr g`=< ֍J)Wp(RDWlp89:6w:GES<&:pw,EV+w?*ow|*FAUʕ$TS*僁F~yy>u%H4{W4_0Y9(D}bajuqݬSSze]p||<'Y| odq`W9<.>13G`'=Y;2jo0*Tͫ u2G*_+龡yR&zk0*-0M}vZmڟn'#8]fqk=9vZ%#EX^ԯzwnk%X1) [O3̹c]/VVl6g/ `Ou }nKR^ЎY``z̞ng񴩉uz*FqZYKp߬_-FZ类Vʾ0lir@q586wu~_Bz;ώǸ3&()ˆP{$kqD9.ԙ?9"I=\'mTQQoBE2" S#ek<0bu(`a&T!xb'0Ƒ= Ӊx X>+?P)"yIu8VzL!Z&Dơyp쉔^J&:P=JVU#`7C=a{ 2GJS8(QXQD 6Άp~:ٔ~iX~90@?`/`8U !p,DGWi6D$9"Π5Vo+ݍl#I#)T;hG}l-2ʶV[vVhN4=.tOڲ=!4,zXw.48\d*a8Ю(p4hI.q ")ĸIL奩.KgyDLG"%XK^K$K }q]ISlM!?~I!VBb-"OΗ1Ȏ niYuĺӊ vd23ȝ 9hο $j7*i+"5[vG9va'ډfOfOv}z);oI([Qh;RPf:)F:!&%G1L;v/iaYF&tqgu1PHH*T$ а43J5AS 0s!9..zQ/Pcɡ1p8ͱk)\),XU]j"Ɨ.y R{^(L7ywJ%9G&@(|y(U14e J"#Ph(£9V !]4$3Z.mt$҆-dgwH` ai.bϺk ^eP0O;!x~ցgSNSz.,5ohC䏙0ҞQTS<Ā.7^1$c$/aXZYה-vи x`cbsf{~ ҆pϟnɨ7;x?0W)Wf7:wK/VW!{o$7uݽ?g|#ߘh̢^ӡCCkŝ&ڧuVlV\oO?CA5]C~SUohDhr|gve7ϳ,?a2[γ̷2Ia$aoG™Mʸ8şŶ~1xxxڼLXVybg|9jzʔgYY,/]Ȗ}JiM(vY,}SW:5`h~ .6W㋰W~׫凔}؞Ѧu˹ʗ%֚'Yk3_fc#\3`4Xa(U}jW\(Qg,2ۍǍqmmeqqʱh-N}|8fۧ}c}=G׭r~Aq י_[e|:enuCуa{Soiz ܮK]ڐ`=]cW#|nt5ND7 5O #f# 0B/ L)TR@bVzO 3"!Sw1^:taXF31ΝKL$H1`.MSeT\1f0Dm*IlCxNPoK,_%GNSlAa8 l+2qЊie(Ł\(WG(ߤ DĔTW=>6h؟k<غdM }uqu p0zӢ! x ClN[Ālql[  x "fTؒ;(إY q_?_SX Tb9NrZ-}rS9b-e_އ-r 9ֺDbgn{v{yi~vBv7^0Oډf[,k5eKYvꝅv`TQggٽ?V'NT|amfwثv1ώW0|O|3ޟCIE^b̃f},i{kp ziK4˨˚ 0)-sSK}JzLņINgǽ`dA6nt1ͣ3e'] '!XSĉƔFqX1o%AәLסL9yT\FXH.5;QG#iJi~1#оF`_s跜2:eh#FXbP8CakWTD8J}NS+ idD F6J31^8E+U[04/ͷh9>Hx#`2pdJܭ'GXG̪'SQJ w(Wrp'?Zԍ'M?Y, 4"s^ȉZDLo p,[ߩdQÞ 8P 4PL(ĠJ#Ajɠ]M;ƥ^M0.Z 㯰|6_Z]l7#l~mg7hMzga>Oc,O,?6G-29m<Uﭿݳ?Gܪ6庤ׂx혖ϲm|`O}ecTkRNwX~J˸՘/Ozߩ N\={⿲ՅBg}`^~Nm'cBv/o|- >VƲWF}4o21F/,xf)#OZ7Bg8j6uWT\VͺF2ezbqiF0f ͪ;BG`Z/4;mhG=p(x=Q.Ѷ`c> j ܒ}%v'M42jeUPޚ`VbA:rN+(jYMUƕA[J7s,Hc2*hNzhp%KL4<ԖLʥiD.Le;J?Um.Am07*Y%뇽DL8jv`a|fx@uj~oUDo ,W7Ú%zoŖXz}Ūߪ~::yl]u(}{?j^j_su ܛ8^g ~{D0k޳7"veZbjXoX@Rֵnz nGE("b$Ң]Klv^\ÿCik mG3d#%-gy|2iiq.%d6ha N_1+ji({~us"YTb`/f*S\dYb&) 2ih +B(h4p8:XԫmAVϷ@U,d ,WoB>PZ-ljMBv{ުaPUc笾7v^:$y=Ž$߯{zY,Y@>eQ;jZ$ŊyCf#rv`fPYE/<~(ʊtN+2l>o fclqbSzTgn;|q1M5yFy-qVJtBj7uG|B>ow 'C?oُٺإQ0uV]a'd, fwƲe,'BMl&ҷr.Pj$`RHM۩Y"R"S[w"hgRm[NjV=ijI>lE!^(U@l$RjC `pDA[1$u•PK@ڍ)#ߎd};beHI9 ,| CݘL99R i4޵0]h^W)-K۝&Ѫbv4M4%{<'*J)W=hTJ+ǥ(u'Q] 7Q,4<‹ix.i9v /]_ޖp>mA}\[4Ak` @ #A4 v U qW.Fi | cW\!p ~K;20Q#-)QGyiO6r_`543UVuú`ev{$ ׶54{X!]kni,YH~1_PrYOVQg;nߚCV6l V7M]2y6%jW'3kc<&e+LX5ߚfm6c`7Ǜ1B(|XSiޯav 6{{]bg_?cN ~+}5fisvJhOBD;nF&|ZA?=M}W@}^{@;v\f^ep)TͶof͓CL;~ff}L/;ak9X,0Nw'oRb|'5/ ƭRs5bjX6"xQDGZ\Fѣ)sr[(@Mh FmN<~`5erFO@dHPCGtEp$r ~xL|Y ꌥ#t:]5|rDMYµXD"r-koΦe܊ h+9bRTJc)8 8x\bZm - Ym X`ś $f;/,DZZKh5m=C3qVz+Qω4J\],~6Rb:i=pP,EUAZy&`P9IDϤg[{03P8΋(T$]\p6pPx%`Z6JZ\z J5iMҁi遴@i@&h4/ Io)x>rG >!x\ ;-6PXOXe x{_շZY[pm1Cl OohV7_(٩k?#S2XYխ ?RjFmjca>1ùrX4 0"m1nfn^0C+tZ"[V#`i8c3F =2(K6e_B+|ew&M㦹,0\>oZ}\WC<÷ѬKgj iQ}BΖʧ[5R*Zы" c:μQlƚ&`7{m`u;/g؍I9g/DXeFp×svh45-YzFc=j2/VUR#ھ^b?c/4ZٻGqM?|?[N2CNh]mtٙU b:G c 0byLUݠa<5Mm*45Q ;TƛF'_yj\sJ2i?|T>C'{4B-@&{̜D4C !" *AQzVDDXϼ@~ssyߙx6*?ex/Um^EdZm2v$w17Q;l_GS--ʼ2טbˌ?xu/ 禼)_{eUBqUW}+ONzc(\iݲ(sŞ}KBei6D{pJ6>fg{3UqYkv_ŭ"K?9/Ǐw}ysmw\.7rSЊ&{=RA@ "QUS~vƷd^/XY7xD5=pɧq^kxԈ4QK0;oO*%`x,)n(*/x 4kͳ`Hc꬚* jnpW|?{Apy$T(j!:Z졃?v  4%%)>^ YƐ&ZWڷ*:\/ڦ!HҾ$b "!@ 9/R1Hm (N7l[`:$PkskZs#hk$+o"pg]n`j EGŊO DSiz{&IX/В,5T{x uI@u䁷$r: HJcPN`'PMjNy٘'^MD%P IÑ 'IH|f zH$<18y K(ň jVPl8L %fdPM4+C/%g&uwgggg;1';hYqz_e7.=Hw=󼂫aY xB-K跆͑;R,^/-to8Z`~;Rmpt**֡]Gуӌ*#A#0&ys *_-];ZA- ;6 "5OEs91>V6F+x2t hsIc. sAw =vFz} :ҭ'0V0ZP)Mv{"yn9= 9tuѲ U\DZ.͠A!݌4t3uu2HGJ{ĨPQOxf˟³DͨfT43lv%^~f?gckױ[E@?ϩ*73tȹA@Sgx;V_΁ށٕ5W&KЂ,Gڱ],u?9{vbUm| :Fw˹VAǽa_W-玕i_xӓן;J+~3wOL0 uywhX1}d7uGjtYlqĻ`u{{R#%PmMݐdڇO&g$N5)rRz6|W嫫rY6D{1RִK)(mX[}1r6!#y4;yCvSsT˾͞3*_>'VȮ -j>?]ݭbf#?u_ G7zD~?"4Kq~8lQڳ{]j$iiiV&}EKtc&<5 [y&Q-%GhdjYoV&LݸW&(?> |ԃB=(6iYp0QOH~/4'soX~ȅbHlvgy`C4B^IҚi\XE,ݕ%g!P-bt" tB =_4 Dei!i.w4r 6 4$gO4 : c8$a8юaa4x7T2p$q$$:RHor)Ň  Z$() t k$g2YR9Ȫt6'0HH{QҚgbpWy=~%oEL34^zX@jsh f -30 1^H9:/Ercr$.#~# Ў3j.2;CZYJ: AZ{"u$Eҵ}1/-.9mVׯFY+A@#MEA p3d\r zKt9/b6͐jYz>ތ֑̽|о"Oq^@c[ e,&y0Jچ j;ރ]x ɉ;qd/m9t$Ճpo8={t+;@!}w#2HNv@nz<:W;^%(?1t Yehb+UIBB\W溊nf*YSHE$/7l+?c!埲^1W&gİVI1@ J2/X+mzN9*d'WB (7+;o,5"\ ubh%jl_ weٱl˶1ZoV橿${6_wx&f<'mwf&_wU'fEi_3[͛c+5݊wڤIiz}\7}>y(Zp*Pbn]!vdJͧjll_L+jZf%8Oj3Q_f#}vSo PUNURL>իDy''']}$w1(f6 L;a߀ 6[kf+u>{THk!wIΫ=yh_:4,:Q[]!;dޕK\/2+O5J\ vE5wdC/9߂eEżv$e͝ yBm1C~pYVez#ǿ=Ï. 5P_!+JlBlQj9R I2*<^j)R$e"/ Z %F2TL]sǜ&^jSR9nF 1MhḘp7h12 )|oC 5$SH9$)T?IJ=ق~C3 * <ߗCh3@A՟nKzٓ ԇlCAGgg"7* hEMZRt$`_a\ʝL=xZn3ǡzwDGhHͥTR~pA{ϵAB;<@ ]f.<^*sZ3OՑ#9@`Ig@=\@р4}\Fit.z]pPͨmFG/ tJ|9Tj0[pwU[ЮogЧa'Z&p635;h4i:Y4c x'riy;lGi@sn'av 9Z6} ׮En-oBANZPߍeդ#hUNAh?< Z*c2kZ5 &Jk(^pe{ sǻCD&?W%R܎([a:y>lVA+v¨eje^ tϗY ϰGF.O;3-קo2'nU gM dAS-ȁȍ޹}u|oei)w\)3zʩ~'ϸ*Z5t.Ci_\KE ]k=l wAz'ҝb!ξsEjHOG08(4GiQ0, 3;O_%1KK>W *!C%_yNRВeH(P H -W> ?&δ+ؙ"U!&d1Jƒ$SvۊB18&2aAE됲I"ĪkHKhaMhzت%om릟dɘ<^j1zE nB{ CQh'+g|^>ǝԺQK&鍒MQ3#Vj䶦;ʼnQB@izs ɷEGPv<;ڈ!=Cy)3ȹ@>&igPKouuη7QN'9=-MZ$ت$:GѓC `$x">qBXnfҷҗ_f//w%F)'^Q?IKxgfbxO5^Y[VVd8V^S.G_s(gsÎݸh1Eg!sD=b+kf1Yߣ-w1a^dUv6/5[  J7όw;;&7&6Ubuf ,r/Xҁv1)SbE>_4{NJn]h?kg[]R&'}JJXKcBm,b"?:PE~&;ƼWj_K&0-1.J=O{7w[TV0W Ƙ'wԄ ?f8#S' ʩR{;])nb'jn@ SZ%ZuVa쏳,g^NDB6|Qt_ ߻w.6=`?E۠|7`tr(FuWSa.w2&l(5j5Z骫2X(UfX62-2T5:^nEq׺;eV5ˏ$ߙۭWw~{ ɺkEöA;- NÏ{zܟ ?;D _ * ۋ[QEPHk7Z̷6ŁԶh $ )Ij SiМ~m^싢ž>/#,v]u$~Vkc$n$hgDЏ?)YRӸǢ]&P|J`AV/hiA$:}(vgh% #TPಠPxXЊ]O-Z_y/& :c$dRI<>?C;Y\miH !b cɐ 9#PU)$aLè'$ t3vʡZ(D/MfzS ݇jj!ad$i>I2 =EKZeR7)M 5Up\ԋc@%D5GJԻ YAgA"t58 -G֢AH / @x_Dn),"= GiUP7]ߟ-Z aIN݊qބ\^M͆t1J\oG֣/IH/@!- Zo4䪁]:^[v`V!mG 2J܎LԲkC4ytzYO|v.]I ']Ina:|H,ݯe^<:dq;~yrL)5wɨe>gDUB{p˓uF_K5[#՞`߷EiS|/6]$$-OFQ^?]J-O߾C >l%m9c?Ua{m,O~J/_ycYcduU]]SdE1O+Lϳevmk7=IeVy^\0 =a|{sL7߾=Z(0'xVwz{G=zÏ^>a(Kf%KZ)YpK;W:dYyZ\+.5Vst"VŇՌ&Z*w'd*О=&d'-t`G򨠞ƋYNW+6 V ^_$}+}Uo [udYM[}WD=U1gTO9rxK, V3aqw5J;>0?ƺo8pY%3qjnud j|[[tG!&s[cAd .8Q'Dz =Q''ͅWɐB=Gq, /HSxHż2-KtB J"S Ғ{'QB1*v^y*GB-)~Dҙh^/~吶I"$"/i6&4}dpRz\ LQOBRI(sJ`h)z&$BO$Xa.Azn6yPv@T<'ףx=@a"\E!b:ɲv WG ԇvh,hKrM:1d (d(LJCP(1Z␛1= YC I@iÐK$ݵ$@{,}@PN&rAU)/HNU2j mU|[ٚt3=Y)>Ⲽ4ϼyߧ@x;4i6̾cU0[Vo3L~ 'FD/w|3G9',rXX~[ʍ}*ho?3lN8Qy)Aysi,MVXxUuu:cQʩk# ;5ц;=Sa}>7\fj|b 3S:o;jʣ|%QB+dʩkp;5vNcx.1c ?кgtN83q\QSYcg X| f?syjd]6oas˾F?\z}(s{=` |r릵 {2SŵyOdqW<׳_EwQ-"nT{~NJ? M6EcurD+S44Qb?b/*?Pxm^}8i7>iw j*" 0')5n uH^T5SU*j-e#?Po\vֻ+\-{Cp3gKb% ePηܥ6*Ҍ-Ty%O5Qe|K [e[a+`+<|0ߪZѰT8줷y(A1@C{B&5q쵨ڴTe}Qcr__(MMöF:piZASW cȟVWIbR?eYoGGI+,4WiM4Gbs͕qcouA#-_qR֖<̙%ٖۖ҄x-Vȍ`AkgHMYxw,á-gqp~9ăe$- Gcжh]m[ij#0bګx%_z}-puU&ejrtYStg~kJ:HH\ys15˧(S/!% <iw(%9mA+ !c9d54oz,h}%lC˳F^hvNU;pt;N=N'۩A#6$(,+HAI+ {VJ3ڨz GoGiw`K+ bo^:"'7S5U_H"eXsQQEMs;AT3FqS;zҖ>~?|*USPSijoLڷ\j`.j澁z*1V1UTYYFC7_Ev g;&n{QIj z1VR]j#[J/ycWgXqu*=x3>Rrެag{=ޙ{֑a`}{'eH<"h ֨z C CBa}5 6 jj0LmǗ*ԁK Uhw6#)@jV%UڭSd؟E b,xj?R` Mt;PdKAMݰ iyi7Gov-2OcrK; ^]iR 18V7E34Tqa"d8)us\= t$dPA`#A5Fnv\"$L dH'l"An.yૢͽj029xBhgE=f! T30Uu0`8c=Zi>%@>t)d_'-hIi\qj431j2I-gUK s1NA7! ٓ5&я/>k _VA{&F'54@.8fLzlL^ ,l۲wqwpl1}K.9 v *线Ւ%wnvbN+gɹo711u0zw6>ޘj=r>[j0&,<>WCmĔW&zO-QQr$KV^j/4iյ*[Z|_?1ϩ7RUj5^Rך.5g˜2k<ݥ g÷d"ݒ·$UOٓS.VaPǍBp!ҳ*DRPpP!R}sF8I(PTTÝ|{Κ>{ц&6ABK`U(0X;R'( at&.Hz\E4"FėvEZ5*?EqMqtD7HOhGgZ((!AӛPwҪ,uxR;Iih#iIaG*.~#p$90SG>#f/x#}Q <d#k:{dzdl}S[}-۲cwߛ([)e#oEq=)-̏x^cﳓ3V /1pbrzV4&ȚL-D Gٷzіd$f$^OTf]N(J/>[83||(7|E^ Ѳ^;Nxػ|?$~%QK>~]z)|c1?---lJ}>f'[oٳy.| tˣgh"!m;=Ϳ l5~OgyZnd{qBX[v՗eܖ63c5R=2tw[_Vd`O``ݠV!e_z^/O=|%-=lyŽ}f&{oxp7ϼ̣eۗշNuZ֕ud:o&-#eoL ZísG>~Gȱui8WپeE9e`(_73d]4{9x>7 V@?~PߪsjHŹM +b1y.)O.;Ğùbuye#z[-U_ N9O U}Frv||ݍePūJCl ˬM)89 V鵚S9mN m!Ǵ[,?~ z qǏ,KZwh-JEN1i=<#iR;=u:-PUN1@DZWIsEyˑn)߲ < ZxjBѵ!NO( a FhNjfߝMP//2rȽM%qV=F/ɭ\r|H)dڧmv(5 ~ųwm/>_thH_sMvz信]$݅j=zG((9tG~=уa=#: v.).sq`v0r0\Ƒk8Nv=3@;mqŒ ry4Ucԧ[c5]M~C9QQhD;QbE9Ixa @80ىHkPz| e=[q,u'o!W2[H܂;Ad_Q 8O"W4 ȭ}Oz$ޑ5ȝ5ȝBkPߐ;Tmzo>>O؃0r y3АW1vMȴ1iiڲùaiCmbo2/DOqPm҉9yhAl Km >Oa01z5|AE0a]4hНv'vMVHa!G4vFѠZM;1q3z,B$-{C-CG˵LUCna܇ 75Ib[㺆 i (7hpPOTr*gAshigж,0rm@ƥ0E)\ x*f6Z,p FJ{?TtB}ߞVMC+]4XHDr;뵷vm9 @n*aD܁t'B^JZ]8M: @D;e4O/t6 e4V?їɾ0Xm*'g,3yZFW|%d@Ηݏݍn>ϖ/ɠns:GYqKr7 ʧe# #ꊿl&Ipp*K{daQU|ͧQ1 ;M=duuAwJݩ|%yY!Cn>6=ʷcb8hWEH#Fw \k[{t]_x]#ԃY>{]qg3,EWo W*>YUՄĠ E\D{79 ] Ʃ2W  6 jo٭Z {C&Aiy9Lv\5@Ũzu-J#&WI&=HfeQXlggZVe&\~Zkk +.bgG,6%1ns04ORlӃ5c/;>Ɏx2g.Im~cܟ6֗c6mIgw|f*nvvTϩ|sQ_o.ɑ{Jʹwiq^ə~YZGo0!:miSAIv_$قvEÎBQ[R.O#c@A PXUW2S %K7P,?Ivm (dDug C!jnCgu]*8 ΀h աUBXDWTĵTE{N!_ePB+=+z#Z-D@%pv,E^δ.uLEcОĘhoxq|C{rE<9! pvABNjC^ׅ k#cH>5vf,̐ <LGjIk>J|@Zoh-KHgr%Y$a"{3rˑ kIN BpA\-c/ն3!kot  Ou@B~ U1$Y$Fovad 9|U$kBORہԦjw;Y-CzA9FЫͬv: m܋*5=} w7E>/EX&~-Ov~z"d8q~gAiאSZER9^iU'f# MڽֲԎD! ztdԵd4bU.r{Ķ되XYn'usr:ZGs-x%3VYyʈ4@U5NFLJ%V}fn[ V7{Y1(A{$hwcEzi{sG1}:f_chC^ hxuA&d'oM|N%CRR{%tCX){J*ށ߱8oTʪ̢n_7VrUjCsϊE)SSqTv^tv'140ܸ6_,c}]#~K%],s|#okm/n+Y'xO L:E\c{KuR ߹OKޭlQO+^&O#9R _"le)j8я&O1歂ֈw!Fuhq/5noƗjdGL>?ɚjjTkW #Q0/5dH[|Yi},xY2-CN|ʑcyU! ˖*JJlW$ݚd[`&$@Ij=p8@!ȅK`낞ZSpִ֔ûƠՊݐ\}# }\ ҿFJtԬ9zZ |%GZ 'rm<;(=) jU }^B&-HPQ$I<ѱʆFfn:in]dZA5b8>d% A߻!W>Cn2ifbx6-ۤE \3 n"M sp ƙaX~GP^~A)mj8w]Cm+՞JJ@@SQN;jxT@WE :#HKAH>ɠa&5lR2&O4-F)IM)6WSZgiZڀjEMyhJCyC]Q䖁.m4 {FIY#7(o{^ Q{UΟ*亱fGsy˾eكV3+>X-.E33Z3N\bcXqy1>eeyOu|vöYn]`}ţuw|Q i}^jk=oY6~uCB;-^ 55*Hw8+J8߭>g} 8ʗf3XvAҦvuYsu(/[Vtϻ ܛvcrwΣ5&zނeRD˖dґJ{dl,>}`X?i3my9]‡nO~'|.o"J`/6geR7J&Ce_aY$'⬗{acfm'aӄurlvLB='JIps 6=PRڼ' {7έ7%}qL Xr#Fuj- Qh%T? euő٥%x (KI$1wYn:{W:Z)+1]$(iWvՊ9]H*Bq.c -W7WmAhr^mMfûP^ڦZZI/B;ڠVdc(bQy)-Cϧe -j< G|!-ـɀٴ(bP<,Y8͵iW(cUzWkC}ÅD,pQN@ S@G A]:B;Z=DRo#pPmUGAw"֝ȕw^V+}Zf]]E/ʷ(]s$5 6cSi"e,FӔRIHWZu֖y2gFpdpJ:{K?O$O+K֨v4ZYLI&%f0,XE s,EtbX!`ڦvYx>i0?0E{Eg1AUFEYvKn;/f\2y+6R("?|?AlF1"{! Ieh@# 2 Mʓzqb[*5zhuWaSڛnFk iO!1sfG ٚ(DFhEy4)A^o@FpE\]ƠM͗뵁F3c4&̖ ƤI> 'P׆ZAèmVSVc BX}AR} L  ڡ`z`:Pu0sѫq80 1- Zu-CmQ2ЙHpnO H&˩ ډV@P:b3:^ C /R~@ތ[%l:`ab=(s'-o;#GQb`t{QB#gAA9ɨurA`G 2~\ Хhz Bx T,ĝQ :vLC;vB: DQ~sccg"7WAyX%]G@?%A vf _-~ܱԒ 0m7Ebf>A?Vro|/wJ3ϙM)!ne5VXYi3d~*=bxS<' $Zul7ؓ(Y{h1SJvi~UѢ9䠈V+p9߳~v[=yi,~ucYsgY*$Zd'kK[=@e˖N<0:p+P'c ?AMQWT`HUqm+i7{+@9 eܗ'n S[ʫ5{ޮfq|` 5^Op_9bʝ*w %v/=9SڪzNhof}f’؅%縒3H ,杝XaȂ#A, "(YED@QDQPDD@DL\z}9zo9U3]U]uRwu96w03xNx-y^N-b. AxE6C_ w<_ƾxk Z0)`5d*"30Rc[4 Ms2r hRod0b5r!E{&;٭ 2[ŷ '4R#X`ł촣a,{JbL^ǰyG\ lx#|eL$͓XuD-P%ڻ.dc[{״/$7c 0 I2wP$OA\eқBP6q(8rXU( `^{l% p.gڞr@"sq.j+i{.KsoIO;s9#\AK[wy-oZ4Bt@j7뚒8xVd%c(=32=$vf;cb<1A?Ԉ$[z1F놾7I[TJbmQA"`)6b ű.fX?\~ba 2P(:9h.lzx M@J8t-FԖ뀤5b, >adv6}¥g>~>~E—0zO'q쩟37NluRΒ o7N);O}EsÕKrY=HVob5zjܜ kŭAy;Ήٟm—fw;-- D˻;Ҳ,SiTp:D֏&EvFg1V$-^!meuvǸC|F6y #fٱ].J ?Y}?D iUlz_o9mׯc`XWRIqM8%[]NVO[ѕoz`Ѯ*o5ܘ@O*vZEԚe"Әf=pmԈuH:c,mXl T1v}ueeC ʆX]`Ն.6hWL`!2kqu;~9Wnؿxn_-:{~_?k >+LΗ'v mN[OXv8-kY/k++CH Y1' Adf}$Q;kobWU*#ժ?/UִEMy@=`@=y 1h]^TlS^yT+VIiqAjտ>YPz92Uv7zQ~6#a5p}kZ4dVR6"qHVz9P[C55 $n;MIҔ9ǔ"ԑ*{|#b4^D7I,쮍+lO~%i `+:ÝCb!)$gvyg*Ѫ݁迲;#G ƗF ZVqG^ YVA_ՍGnj6&=<>JE퓂Sf.,^GMSG#ViU9eͷz[/YE+Q<۪r(#*mzG?E5?SȈώux[| 9$vFZ>R?}D9n=h= @rKa#ʀ)az=-z` s(oTpXk<_DۅCY߇)Bm9G{v^<h6kIQݏZ܅"pC[yl1MDb p`Ar(6 kBaԴ47`) @GqDKq1}oeʖlђ7r uxr!ڦc)BN}}BJҦ @ʘHn '0o,yN@H5"}fC+/"WK@uH<[$ѥƗT#bM.|YJD# :Y ujZ8{j|re(v~m?E>(Vcx/g-c" D돆7 Ïl&#SO?k8K6Y$ߋWye_|V+{NXi| Doq]?4|!y 6d>3_ wACZ%G~/(6av$Z\2k/g|W̔dq_# d ~/Gr4 0h>nm3w#<4ڸ1>‘+?/?7TIr4s>rfFLeޙ5-#7V} Ǖ^w)~ݥ=~§/z8v}+M@o[n"|p(O3gdF-{ܲWuS s>DZF" {mXRأR`5{'^)uo2o$# Ge& A6q ~UUNf8tڂHey<"a@"LAH(#0Ъh8`w68tfdg5j9S9}Se_+.wUtPCPVߢѣ"kE)xޢp4Г<Gp/A5Hd6;Ɲ)yCl m'wd V'oWA| B_JA_|?w/P[d567:_M1Pqب~sWn /hzu@i+Fw#O'n3{5xxֵZuVe?Im}3䩙a%EΠHX0-|uF3j[v6}ǹs?p~F bfg:j8κFi%$OI6g g{Er8G=BEG,qf;i+p ;\jr iC\IyZnE,[w<9)Թ`]y>qF[jNG[-6p/;{Ia$.7n;݊~r™i=\3-|~~>cqrz/s}=NeqY]'Ne޸:luZ2kEGpբe?s=xzFYe}drWx O@P}Mމ;EqW\޳87N5[ÜNMgL͉:՜g8q5-KT7߭§8s19~}%WO ՜LGNvp ReS}2/\A9|h'H%H,ګK*/[Kڻ 9^pt/J2{ȕn%N/U KUx)!HĠ< F.s%V?]k (luNJPy+8xN`չl\~#KܘRQE}=U +r =Rc{{^A~\o)ȽN$CZGFф;)?7d6I YOQxQ=7H{ @+A i9jhwus38ÿ,d5V?}'NGIF_fe:_AHv{mۗ+B͕z?^#3<Cݭ.a2.q%#h.Vw+~S uӪeD%WY&CNoKùKj)~̾`=~2n5[Oѓ: !$KÓ" ڇs!u Jc~"òd{+]I}Feq:k,+C``5mn ׇ ,9ƴ`Jf5vI}Y[/n6絵iyI%+e{]*Rs\-C~PW>#u*d ~j42O¡p@K>~1#nwvO:  +琳'׉wItt+Es_Qn|pヤSWnOƹ=h>4=砒 ˌ4̱ յSCp4{9<<'jWg28KqgYwI賹/5#댶/ky40d/%V=@i߈N5: Ve!;#X} ƆlS?%al{KYt{^qIȮT^8&vrQCL\hT H𥝖-JRQ.BY)|G7?a j>"RR/ta&M)C!ξԊ~JwrsvC:{w@YM ԞdM$EyyrRA,}+@>) -ȧq-Y 9-Bsv,$sF\ H' n`Vg>)H6'z"lKa$ARMf6 Hj0f[89#p,QA9#@ƪE%*5(6WP~d2(kLGn{1sd986] ̮_m$8l!ǴZAiy1G"[Ve"z -E ~Ѿ9ż]yda^#*/dq1 2^ jKcX@)/f K$֜ KrQr[*nDXZ@խ%yfPFf)Lc^ωg|E>!PH};.k'IQݙN[;k5J~'Fo=piU?;haG451s3`ŬI eB:Mjp1Lh 6x#5Kٛ?UΑJ2BBgP#">tp yx)A ߱ޱ.X?[gpl5F^ZlW:oa-Y=i{>{RA=f RXǬD!ɸfۀ Ipq5xj,[-'co+)h&/;1,\|3xAG Z~vBUz#iac]Y9TpO>(|RP*/V5i 6Mc6so.0 Ewqy oo'A>3hwB=V ֑_GGWvc|x!Mrm҈7G?XEKC7Wyg-VOirA)q.s"_V #wOjY5QIR{GE8o;?<͌ OsGt=Nd":d^n1?*czs q7Qߥ~\m14s)jVڂ֡'zPWy!/C,.Iy4N<5 rYʎRu=>M0tb޴:rZvLцhz)610Oۇ~/x)^snw ŝܦn;e6VsjEKE)H"zZF?s1Ŭn&՜Xf]/8,ʺu}zZy8k`?G{e2*-a#@Ƨ_xbxV{d Nsգ:Rl N;փg`Ϣ䷗?ztOD~7ZKy- B&8GE&/rpq8vʱ7~\%8K pwjq\)RΖ`[*"U6YiK!CH6nnBPLԈk@lzY5HNֆIZ&b 3@a w){'KùYȓ ЕWN߆y0~=!h_Za䀔5UԿi쿜FyT#Upi0ËX#QRr&DW:\6jiHr-RnXr.2fc YGΛsc: چ㌢qFj4(J`/{b $t25ec;M`剀pñHLvҔy̌LZ,@? g5w קqT46cɄp.@Kc<ơC+i8o* 8#Ntki-ӱ~@&fl$bfْD"R=12uO_:Cn:귓dHI,n#D,[txy~An6o6HW6ZDHU^YLQ 6NRj>n=3GuvFznG{I+ᄋR[UJtKKJ[R8S_k|v3zqnYeWq\Ez^bGu1Gd~@2fEi m[97Ma0Ğ[Zo@.2Ѫaȼ8{ \]`EU/(~k춛?5V-=m'l'dg5 xU(K[RKZ*eQdЎOf>E3wqb%=jwcLQf1R*m5ܪ&6)3l-,St{Ey]lV~6Mz'`s,7k,3tPVt3_Ϳhn6>f+1X-U&FizZU){ZcQff0Ms5!nH5N%|~  G%$>s2V$+cel]ɳ1|/GQGԔt~ZC^UP2Lɮf>Q ʛ[eIR i ~͡jH_#_KG:9WP.qCcC0MI爱b^NNɷaD!.jx"L-dGT!#G#FE0ONM3[XMJv I!kΫvyH&Zpg=kB~Q%9m'Kx.b.h59̟y6Z#}E¯f͞~X$cVo#_~5&XXO%',y 'BG7n-Hd%6(i {C-v†4٬#ā@T7}z 02OGS߳8e:Gw 8QM'JvMIa<\ v ĒyLDIB)v &mY/D;d8١!>A))7a&lCzḺ13 8eFm y$ 6wXaOdž6䵘z՗B{XdXIq!Di89mۗݲ?RP wXu6p2qPs4I`M8]{Iǡ6 p&8fXҙ0[,`-J#8+Yı=饾3֊p,9#LzGk;b-c,Ґ*V|mT]AR5/E=|p~9i@ᝃbVֲ xb=zj؀V&ބyxC6-FyQ`F&Vl ػر>8nhDbc>o?):]vŵ|DIQXUekk(omvzEKr1'j yE_h+ϨEkVP,u}jwMP`#]]!=jP(T¢$P2KlTΨ!%?%zEmKVR>5KIU)3_q mxyROp#~Aّj,ЛѪGirh>di|.$D[/?) =?:%fn5 5k EFj`-FN7MM>Vm9g*U!a&tU<듇[%o ͉Ji8enU`.o{.y?)SU搓sx@8[g<ˡ,&rD42C"4+qqSl#˓TO!-Dk3#MF J-9MQn -q#TvcDz8heKn(p28C;q s'h;5+ɢX2֪=Е -LNlԗ%A~֥-+dӤ,]y̹"!.h> @-קb$ɦJ,byM } EY7g  '1Gkpb\L;Wp^"4΢Xtr\d1=7^kipjdfd232Ni:<8.2\yC4^c&Kb6AzHc@o0-3~7z}q)( & 3f4s3YZYb6;2UlME4V-y{sZVki8ڂeOFmvI;y/?ve9]n2F-E2w~Eq&ɑS{pڭNF3б}7藴λfm&kxs:ds^hװ+[!|N~!o'j9H7 @?D&FZy;GӍD|YgE(vnZ >Bex΋7]auS,]O 5h Fq[pٺ(5+r(` hqܑތC۔ǦEa,cdY 7>T#,8"Mc󊌄jڟ@i]jF ^5xI`S&vx.()]EIsbBŰT &cq8qEm}{2 w~q el^czs 8z02.uK!(DXUC/%TBWcoo3U9:9kk0.JQ քC5a$ۄM|ILo{h*i{7O3қ|> u芶o@~6оM 8/w:Ai,{y`&EJ*;sLu3o;RdRXP|G >gF6o} ꦰ𜂚I'Dm `sbgcزmDiʘ0C'{;ey`\5Uz$tù1@cZ HM|L{^,o{BNr7ŕq-rˇhSbLg\4 em,JAd"GNgn@ P>;hw)mJȊpRb dX>( ru֔bx[9!\YYO孊<.IlQʚvhyo2 9jnp8XM*V} ?o=vg|4u7V-[b)14uA%H# o;1P&f!NM8 eKkzkR4 )𲽃L=F2u)PG?mG@v ]8|DIAir0B% V[^7$7ꌘ@ُsW\::c/"psFiu8qOND :e zsG Ô) WOD)io)Fs(:'2KZn/hl=/ EFlyٟ'.ɷ&KZJ#VYbPtmDS>q=]K?4ex6׷/'RnNIS5p[#[V#K]nm]́8GoH{.L{;>Qsmn#د_q9_8Ξʩlsk[nhhr$My`vw99};ڥs9:`zwp[ޭn<:FCхwSvq=== z0ycI|G':VyѵvsRLr ,nb_trP:g`[~jV;s>5)w3>82;S^v[ߪV {gEQ Sp?zGU߹yo ((b<3rIk OllUoz'sW/?/V ako1 :逴s-,0GNS^PYyB0/aQkʢ_#u; 2ϖ{#Пg1H *EoqYuͼJ6[g?mqYyُ6=r ofdL749=y@D{3P/;%ku7p?F1Na|b|d`.G+Ŗr2ˠFт!3RbL OGt(i1wGxfɴƻcp?y--SqZe-5z~ށƵb!J p4J/]~]w8msd鰘shyhad,B-e[E _qy;#K ưv&;j}W+j=IcMȘ" Ih74w |?888$NS>fLjrgR͡qZy:S PӔ3gRɘݡ]>җyO y9#PC1Lm$*7fz]S F)Ƀbд#a+ai +bzL֩Nw0 GgqH0b!m->K-4e^6Dh/5'*i\=l&1Y(֗"G}ZݧR -8m<-geGSyO=vvNF]pZۭ^ZkPS!_d|(lAL~ Ey\k=!`4$;Aʇ+N|xrys=Ɖ>鷦_0󢹓jg#O呋i5!)j`YqѬ#L*nh΢X? <#\$Fz?PAdmER8bSՙt ?l'ssE)b0'H&gVb`b^j︧+΄?/N(aB_eZwuG1rTD3-G*wMRZO^(Bʅg? 0]k}ֳ"(~U)3]γ2kc*'}pݫ'18X#;U3BɳOM?g{/g,4 J6x*s#ziCWyUV`K̽>_3/0x&oV}o[W.h:LPf ʾ`EDV5pޢz=3W_2g_# (@\K\Җ p' 'RUL96@ygzċ'>+Eư^>NwV+!j.GKP_ +Lxp0өI{{B1G^#<ϗl ,(f !3Vnj^g 0+O:XX6pJx hl=(|?y^ "}-/]x) p0 m2pq('spѹ)\s9!g,(FFIbw|Ff.>%^N[ V#_"FXӭEjk!`YN E"A6+V8kv/#OIW˧qI~]D|Zx(>Yg.ΝK~SjȆG=-︾*cOX"㔹WM )tC!%7@V"3?jl͵ϔqڞss+J2h&E!q9}lu*2gc5I_?)xQŬU}>rv[OEEŢWeuWqKBs n^6#fkNSG뗖]+̓D 1^mN(N)->ڣ,~Ҟby*J8_{|4#>|Y<8*~L^n2L,:5d;F%bV&^TUO$CΪ{s\]ok҉@e/O2N1YJScʡNHuH CQs:b߉gR\򸟞,z&-B"%ȉ2nJ$Vŏ^Lɞ]rF M ) +r蓊:8H[! CLL-W, xd$G[d8,F0'B}Z{6's8H,:`cG]{6B=PGN*Gp)|6"#E VY?%!S>"/[QL*~XehiZTYkJjLN_FkfZj n#TP7k}*\R}'fZIOym0^΢:mѨU0̽.xs\;}}Ľ}9wr;et;nCIٻm' sT坈P m(c5;]dyYg,\)#᳐YW꣝|Ze(ݭfTH!UӲ29RE&f b'PU[A9ϳ9.>_~}5:3b|[ b3bRF2T`$4UQ9^Sg"s$*ÆXYaֽU9dB_ <,_гm(Ch9xܼ[[#޽rj>E|)Cn~lXאf ^Y'K6 )Ԃm9 EZ8\mU⬎#`:jXFÀL;>;qfq(ğuy}Ϻ7i\ uDQRiTh?k4G0VEΆFnxCyC(dN9#nK58W7mEciӴ:w}Hv5kZCbX&a!.",+01 lZ2o͛;#sFYg E[v7ahgb^53>N_3Mݥտ5VK ۘފ3ypw:K@6g40xBw|YT>FJ)#TȩK(wEq$tJۡLcnK2X5OMkhZ^ѧFg_ եZP,zb5ԺO:cNy 7sم }bGdU8w38H4FKDa+ι玝ib+NgTN?>=R9D7:{,!ԩ v|tIN U9 R^Kbzs|_ rtnY^qq!)3,OĿNb3s;+E/liF|UX SueӨA2&Kx%R 5_ БX^l3*U~v-r끌Z^|O\^ ;y' LjLtD \uIV?Skꐢ^$k!l' 0zڙqPa͡(עxC!*"@Z82Nvp9Ezjshx~FDY5[0g[]2#`ٯAِ աe#ņr=:jl+LIkUe3"j|/|,9[phGkOUfy}f|y <Gxm hGv=(K )^`{1%Lr()ÝZbҭ8r'D6^3Ż+XuC)vᨂ X ܀VNCBj0OןLOSxW *O&385lnD &QN$U)&h'N| b@:jkl-5-'oQo[c+c_x ͝]rS4;eUdX,4ȪH D2J)h/бȮ4%MIHI  HJAJT0洔=\I).TS9+^LE_q)^nuuOlhsh#N97 y,Q-GmhEn{1{WnVlV#뀌.j46ƛ5O!,3tǪP̱zKIWYa"sHAdawI,k:'^stI^y )֫+2?3;YNPJ(Gh;ofh?e&jEWFSGԺk5 ȈJ-;(!kj>G|9q3gw"%&S N= ݓ?>Șoocڝ!d8Kv*cuݐs){~jH9n`'^[01CyR}?ԣO|jhqǸrx'R^S'SV#8"_]}Q?]tџO'ϔ;[2L\]yUr< n+hO:{VcԊ`2Z4l^ȳM8M"e%Vd$7>k2PXάЖw*h1&ΕȯR) xh9#(lK#_CO_ w7gx7%wSX< m,Z Yٓ{ EQ.dRaRf (SyK.ǽ,B9 U!c\> GdI/*;Jr9xo(㟆PRVT O,sÒKchx |ҮN>`Y(`yq6yӍW&)b2USDϜ빃C+%Rj҇y@exZ`3{L͝L ^ݯy)jl4z%}v)ΠO( JTmJRUG-T*ko{=YG]MZkMJYLc=`SvN[iLԷn1ѭ2,Su "wl YrNt׺Pʭ~StX?Z#WusN̫-ZwHs}UsFmhl6{SRbITS&job%^$=%ǞNhdI[ћyvr I΍$+ˆ%|'1JNb5gՒ-+gsN)JL^I@OTS-><T[%H^s1*ũi*rN^w[`%Uc\AކqWU]6t؝PVh ?ϋFU8]>tLp>)Hi ,"qh&`]6 mم-&J(Ub+]cEcYVYQޟbP[K6OI~\jn.5/a3B=jeմ.Sv&:-A?m6Xn&ٕZ%&k-EOA_w\sC 6*觭<kLj,ql.)/|Z-M2>yieIDGgͶf> X'kvNL2=7/9F&F}:{WX+CbV5+*z#'1oeL9\>,$<>c/_u'"PS֧_^rN{g/>xM7ɷ/5bc"N0C3WtZo+jj5s9qN=c&ٺA҆BowlA0ǧ惑#QzXLjp(:/5X?|x`ڪ܀8"Kwkۯ}-uJ~& S栿@]^(Jn!Ng|9J~= }N{Ǵy ##8 V,5`Yndt{3zhoE/ TʯZ$8]d]B٪N{^DqZ>:|mM*[ki^B:5yN)> Vy~O?MϪQ8/-R}0/OX:+jW)T6a(ki((ӘsHYو5b'o.8^%Mbճj@|jx*oǜkOvĿ2Js9ƒX}> =Ms<ŀP&6ǿP[H1'*6I Ƌ0Aq"(z |e`5&ۚtkoF\˙עBy: ؠXuhhq3sfǣިMgqQ 0ߩLdeem)$ܒyQ==5E8y 63p+:ڋu6/nDdP}ST(W>3tuo_ߐ! $)$"b Bp{Ͻg{s5+*jhUjy*E ESUE#UQmA}ZU}>}]{sg}^{z)NR8>&M juD6(c pRu@@4T;!UǡhH4ކ(;<hBK GC팺9x\Ō>=! #Tt>Ny]鼞ů"_շlXy-K!/s` "˒B6̍SqꎕC}%,ynA/1Ua*b~ F=ώ]lVsh=]=] Y\`,s5_L!a3;;,\ޒzݸwNJ6Ksy0o0ϾperOެRܬ/th$8XQ"Vbc^[FWz#qCH,λy18VΒgX#qNk8)m3U]݉2K,,~ w5"E])J8XS2HZ >T{1P* 9_EM(0ID "_!,@۾00t 0xH{=i!Ff(9-&Xx0%J8@mх08pkA^C-`Cv6E@6>Y2]z{ 7LĪPr`a] 7PTh4 FIp/삜=- KO^[! w#ʱ(5&ےg)"&>s~+m+"T7+EUװ[%w(>soQo/i\߫gwdG߰Ӕsߴ*go9wW_lBDs}bcT1a:S_;] [~Xx ?)O*ϺI>fN1=p﵇u֚qY+SH=#qkmtg?jݡihRskC)mdQ^RZwKwoQrqp6aJ Y?`}9|t"2QI5ÔnQ]ڍeb]]KUca> y0!|3'2s]7uuFS*qby#Uݯw)rcq,N,~d¿qrb~Mqq$%Hٸ!mWȳF-/]O:aM1?7^W.? kK}xM/n,ZSZʧxӕ4u TP}!ūTF8#؈0&F&kk=|c1QU[uZm^?d lr)X&?L4^2໠@ZzC ey%zGR/J9%̲syc~qXO//V)7zӌWJo_Q_wiM_}qZHo?wd4z՝}w}3E?MՀ9kmt tx&}R ^)h7 Xq(œp-Qdh/H!14C[1}tc#@Qqi3ڏ`h؏&?RԂ<2\RH{Dt0J\U<;Q$L 0zT%Yp?PDiSiB. zwb]@I ͫGk~TҙH: F ( [7Fbػ[~9@=p 8cᚦ YEWZ0G4E*X)ýA>ۂ0wPKwD @qã&9G@ۅpׇ l1 ի3WzzY 5?X] vFXqɓO/mpkJ3ڎǟ?=l[`md|V wpfaV W!k4X!1WV5BWRED4Z֤%+cW|ƿc1Y5$_./Z>ўe2k IiւGrH@evV sOR] ;:Ztȃ\@:pH_2@и5ӡ|nBM&.$>A7)sȽLH̠1ppޓ?F'N%ەiH$LFd& (s=GBn,БtaCO׺ 6opz7X}/h\y>be ܕ:Dʥo wz=]E:Ϯ;mycIr\E.f1JGi_T<5ϳ\b/2S*rwˢzΛrVsr82SIJA:O,Xl] b6-S)yɮZN}Ըvqm2C5N+rRpjwH3L}Mjt4wPْ~a~_tF?G=uL=LP_VMz:&$DsL{G[L/ ;Ho4:ij cl!3PY/({&%"Yds͇;m0zDj:˽,v_[h"zuGXJFh&LC,f0Pb8)0LE]Qjc hCr&J>-?fM'6dhn&=$ دћ@d;'FN >A'kF| !ۈ@ LF"D[ۃlb.e=ҁP7 i&N C )gݣxlSXP)8zI-9,maP^{VMgjUM9͒Yw/KG\+|^.oގe-* zU#kdhZWPZ,?Lp6LC([Eu--'.Sc-vONrFEn P "Wd9ekpEf.@ql:i^ BxiN16ړ4kOs% K j niA ]\"3 )8zrXGw@PdLݡ0JȥN%Y.ؕ#Pdfෞ̏8=$]-?zmZnғ /E^[4L vDM<Cií3zH A<+jV韞<{Y箳yv]r>'HsQ [j>T5:|@Tv!_Y5V,I#SFwedSۃi=mo#|RM=!XzB z7\:n]3D5`)͆pSpu\nBǕ)a~=ȇ:%)h?R*$遞uzeC gNvn52++gRx8jԹMjPZC5hTf:8TJ]eFmj6YTmjJ!V#&әP0, &w2EJ rip5z!#hI`іyY1p/1}3'1La4ùLF٤ʡPXډ:YQΣ"^xM_mm S^kkXn%K__{bc3۵^ʕ$>PiTz-`#XR>ʚB.w{OYķt̹ՙz>J Y[Ro*w{D36O'SQ2sJ4AzN0×A=ibzO##i1[횋?Z~hYCڔpDl0)‹*ٷV>ʒ\Ow!ʊ2aUcA@c+hejCIĐ>vL^jzQL>E!Ptԕ¢2=L#G[q@r4x$.GyTMLTpc.͠4d2@ U&0BjiYPbO8˄@h3'K@qiZ +4~-Z1B`\k;1H:tHGuMt2(Z!E"\uo" {PjT]FAvZ28b͢^W AQQ=L\rCE@@N!H*3My_Nᰟ]B~W˨_-Xay#[o=sv[륭<_;xP&) .D/1,D Q_lAzOoRz8"{=8+P}M2uUCd8k >%®qlr.>8X/0I eFhR#6_K,|~K1ו|Ti"R;EeV_w::4XQ2`_ly/^e"` AF,b.<&_GKFp0G,}jd~_&J \䮲́5)>{ngxCeILe7¥0/XmU*fz{ٱFa<Fo);^nM*jJP◵;Y)!'fskg~3z?#cb=Z.smW 6aˁ!>d4ջzK,e묢O؟x< _ ׷k{1 ӀL}oy$@S#@KZ04-<-CCM l̄rK}+lZ%r/D}GaqeB I߁^]! Z-rip/4K@Iu>Nhߚ +t%޴֜}5\, σO:"B1ЦmL{{qN2A[ׂՂU%#*%Bݒw+@i '$PᴴFy)O{YdN.liB㡄~O=8twB *YMZ6( =aØO@Mz@nyf%@ItxWU}<*@GC:gt2dt:id< r(M#,$648E;;aЂ5=/f8Md8 k7=ez ,=_Rcٞ.WV5e>VS#_8RwZxGG1Qtۊ7fK,\x/$,L̕ql&,oR7Z-zݛ|6?wB?ӒtXonNf &)1bmkBBteXO2XgMз1ܻEEa"[YIZS%7Y#ZY +'Cf(PP E 4``1(EZE"B1κDv!֮@hE/,c32^-ߙuo+ѻBmpNLS\@P4g@ NH1"!#3 'Iqh!`a Y$١>>0WJp9ҡ@q7 lm6 4IO$v@#@\Nry8mL ѰIQל==[)mľVIy՟!m/Ѯ竿*A.l>1OVƊ;aE`G{NXW\雑e.ɵ=Br?YloTuOxTrQz)Ov݇sω.5o(R$oXf Wdn9qIЎ׽)ͣP\ !%dr2]ZE)2L {OLVCɰs]-WXkm2Զ5\;Qڬw@64#D-rsJ~ PZ`m\!6H7,P|!!b 3I]쯪z՗/+}≋E.]q~O[Bu{+\Ń ݳK:,rf>}oؽVG]rEbgE(YD- &6њ*-i6ƭAo vGn(N1e;610Pb{|N#RjAC?rPEskYQRDR zd]"j̀zrɃ-Kk20(hwV,$mZNfP82@J6Ol ;vzQx)1Ц$& GҊvG[sbfp\ W5( D4Cx}hrkD{}?bEt$ &%=y3P@m P(jCtݖag2('$=`HMw y L(_ESEFAч|#P(+1X-v k o.Pj ~r<]'&_ÔD咜$XZ:;eY[X N)s#nQRak{^AӽF>溢tq* ]AnK;{}DY*BdQRk5x N]gt>uc3ؕc6juk=wE{z8V"1r &>~@RT]:7rX<rJ{u`״=Z4+~?4{r=$sM"!\A-Js58`FvΚȅw$?D90W[-^.θ:=1ncߋxcMc1)M 7z]=Xpus8/xpp7z5-X=Ldp:Q9fu8& ֏0hYU0h *qsČ?lnFB}5(\ՙ9\S T/dhrK$ Hm˒WO!i%#HHđ .^W5siw8OWOѐ i!HVP&!yN{ ~GC)Kn 3$ڑr?vо,p~G N*BaACPcVoVi=n9q <dkOh&z?al\"8GBci j$#$8N# 7 <$M͞%;άFW*MV!'Q@%8h!F@5c )d4(u:|&A@GHMFڼ'h|Ȕ~LL/S>m34>FVWd%&S+"ƕʥ0VCm9G }PSIvXW>eZwvK^.hf5`kؗ,xfu̥jkC&`яsj1WE%~O]eߋ.}8(pgJ{, w{x^znGi!÷2?duv,]{Y.xsubϹ=aμ)5Y_N^稽>+9y DZ[}fM0$_2" !tږCt_D2w\DjPVa\-^nD+V8:0ZQܭ |p#̹Úm +VV` ^*6JLH/ phK)9s9acvt*`BrSHCp&Ĺ:?- ւ"4ѽ/]^>$H^ܗ%RecluZT6beQ_+V9_S9Wr*K|=ko܏޹co:ջio*|7@|@c^ o||#+k`l){? |NU}^ˣlC ek4Ҁ eWՎAeGIfeV3Vy y8pA-{Be|ՅpaOc QMMkj>cq'*ר 46Y!C.M|sTQN#}/ s4hgmШbqiBti؊gc|œO&192C)4qE[B*Tڌ1hl&1$2T 4`,yaz+a/zϾݧ֚a/`_xAzqF8Dg&Ulkr# \y~P?lRCI]h>¶b"fxzLf[ًl1[;Lh#*g{{Gݷa=y'{_3k+Tr0;bUR?,5LpMR֢2tKBZ® (.)rEVS%\5i*@A[وL #-Ț4&&_Ԥ.Y&잨zF;j//^92y+;6 6  .x>?#"NCn1˔ʎ ΟOt>[m=ſxʦ8Bw{a{uܐc&jlWR'QScηgd֗"4C+E~A掐ky*|D~_ܕˇ 7A8h(:`w+cq?"MKQ'(ggggg'ó͸oy“zWշ'VM1"J3<=ɞ_ }e fM-IĐzM}JZO׬n5{5{ ٳk ?Y2 +HG bdI01ɢW +βjP$(6o7[M=@?#6֥SwFX>iCk7JƨBJ sD3H0S*9wCMZF<."іb5ᴙ#к##b5Qnݠ(c7,Vi('ͬZlBFh8Xd8!1njlQ2-7cmH-_z $CMVxú= u Wd}:rU -jCʏ0jMeH:وZ}aN.` D)~wq؅t!EG:]N8Fq:t0##T餕O'H9o#2>#z7FtQcFMxaDZ#6\unݴbu2HVF)ԙb.xk3Voی c}ROq1N{D !gQξr.`vkM)?^ Ti%^RkD1o_~>?-!v]߄tjqXh3NAC8ژn=Wz~ X'_>:>!BoǪ3y%>[@Z85^ƫ*WJLDo}>[]x6$"YB-sԊc-dUx֔ç5k"xs:^:YubKYaL2#P#h Gv} 71;'x_ >0]VBF_#`  |(/z߱}mֆтO+즶Qhe`*Ŋg*ra!u,즩F#5~7NS_n&iCmaq[]6ĬjIF!~u0){}av[ {7S\&o ! } |-!QPr Хv: v)r7PDX8B^p- Frh 6yKt P`o~5klk"^Ðn!Em&P mlDѶ-Ŷ-mn'jDt'Zbȵq@_wrmo{mн@C(>x !BnPmR-!𶦹\`1ĤYL*\3\UYnTX~z^}_Un !\ ̯zF.*7ڼT^'Mw{u.t=Ǻw+_f;@r>-IJx q:g'`=נ,syRZr&q·l0K+x4J:,=uQ(7Ν?/e{JR^ϳAZrhqid+`,OYO2W]!אhh"ib+BqAވ6=e8Z4sWY(:rȁH;u];v=vе{[7ФU)iy8jڭN)a &+@{z=kPHqLGjm>Mk]ԄfXr}ߔ{_ddy`MSjo5dd'K&RɧۂUQIm݁tȃi8|21YG0}lno6A}SP|FQ VVj ipNY`t'΀?rOE h3( M ?iA7!)JG)@u82%pl4HS  *=qj kͷy3iP6x;?jC5)ߒterMe<]q5uQ^5G ,Ʊx*1k$~ a"* 7,?4X&VIO[Qf|d6J/ Uw:ϛC:ЗZϕGϕPNŸ4- kKdW}jn ބO2Wm#p&|*Y 3N MZӊX aN3Bک= }Fo{wZm$Q6ڀmkmR|D>#SV+hko3ɳsҳsOaߠ(x|gG8o1F[qMYC`X5˞VJ_>ed?pqUr~( 22_zYtYPsK9:q yYNӾP>_rP€2oWߓ}=:̤iF'D?"Vᢶ8Cx1oŗ0 'peRoˬ!E>Xߥ#[^umvKͺOwxxegz<OchOG|9B}SySkٯ MUXOC>׳St{nVE5v]_دr,[vm~ݠD#|=}cq[k}T;T^ZJSѕ#z enܓ? VJ\^"7"3DT?e}ԎpVi/!]੦ecܘ L`8c|F"Qz0H+SwW|jum68%\&9}9lk #a:f:%-1Ms  Ahlޥ6Iݔ7mތ;L`ZZ$BLho9Ԭ.KKMk lBr$$dDMEG0 P{Nn]h/#VՏG5-Wα,s&^r6%a,BZd֓ =j`O9T&n&#ƛ1l@( '+$![e/yǍbyܡIM'6O|2t_EYִ`F,@:BG+9$!+g`xtfE@7E,"9ˌ rf|%v%!%ͱU{x4ϒY=< ׁE}V}4 Jl^AA 7y = e &1bp6jIB݃X_\i,q oʷ_9Z> |we/aw$wuȪF[JwIoNM5ɀ41ᙼcc}bKm1η-[u@uhթ $-|Q[ǐaz$w2gsN|ʜf9z(9Mȉ42;J}ҧ[T|k?Ӻ, jUEcŢ>W|Z47wn}Vܹme2[&Ɖm-1]ΣNPr-c'lKR(TĽ@LP^5IGҎji1vҚYuN;k=TG~QQXM(f$& `ˍ;<!h'umXly/BQ$@]D r_"yxXj$5Fq "z됮^]m#m&ڍd ړ3pn m8܇} r%b9/۽hF~wF^mW Pw_fd@sO%Jk )N'9Qw/ u,- w' w8 }Ud~Vs0-h3J'6ŲW֒ȗhXK0vQ{ғi)Y~=<6aQ'z69ݦusbe6`~ Ƿ,}iG/{{)ݷp@?:/ ,(偍ZGL@nH}F&ߑz[un^gm ۬uH26~;pO 4y"o 1Si]h2#==<.NەvZEm;kzޔ }f_ j:YțB]| = }jקBX<@|תe{V MGp5|`?)Y(11Nrщ`¢C\e+Ƶ4œ)5nx6>*1sڨygT֟W ?cgFP}V=hCU[ܽ q * O4IXc/*9* 2yףюehDV A!Ŭ`ASD6h 4=Bw~D;:n= z3wrKܒ%wq.VJ12sKWgeqRdl:[p,T%2|5ʟ{vڷXQb#SGSI7p̽AYg>{s;o M.Z/,Wj3JDҖh%Z"cò/SUs^ʻ8߄ g ,[ cj6tfQzG Z_R/ʪ^vqe塥||G}qK)]Tz˨/.8bEE%z/}A,YʬgwΚP-'͝0ø~@)*!rC}:"ԧh4Gkz4GգyKHQzGW%yWMY/j>֛޺.$?Py7_Ϯ_9 Q_IޛT[} ~ڢ*$?T&~Hr9!ՉW# =mqx]߶gGOujvjw3!i*>3^Zۨ!&jn j7>=s@)We ZV/Ţ~XJf=V4wwn!KQ[zT we/;=YzS)eYvfa~Oaw[v.q>mIMV!e_#=IoKE,7〉Fo^@|@6 =kUYcW 4,h<񸗝W0u\XdQ{A$V9:yFT4c&Zs|׬eӴ"P[ (JN-XCCjZBV+G֩m%Kv:kUV ͅWRGnYj&1OyIIU(QlRgD~Df~|K"S#G36_k1 g}uS}:' V HH01imKTn5Z`k ' 0,{P u,(3#h%.zs 5}Ggg Q.7ƈmDː@j2`Aexc>}۱Uf,jǨr+χ6bA6Y @ؗIBesPdqXE@DeU6PPPE@TD&((WQ}50{ޗ99=]U Ad6\JK^M-M-Cm+V7W0I7 Zct,<~GXQ@ZL?dy⽏܅HIw'rUo(/( k-]D3 J}'$wץ0Miԟ?†^!p,r $?3Px58PǪB& FPgn;-2?2:p`uS8p??p`r7+z lv"M]h?E1δO ;pl*U*%UGnlPdԆ_%aHK*z`Z^qNG3tq0JGstTҦ6rm0lZfOְٌٌ !lγt"ثL#I4'jcU9~H.d+!!9qEe\D[ԩ*-?V^|)O~،=Nx=y% QuqR8M(Z0Qu9:NQE1T]Alg }}9D>@&JXd%IAtG rT ]QO 4cS=ج/קU3p,~ýU<߫֗95NqT}UU ]"jCPTcqipvDa\(p HM HQA1[41Hd R2{ ~%DC6>cNBNSuhEV@GUN&2uzUNR/uj_,\z9lHOʗ[M2ƀO4qK$0a):CQ,%:P1A7qVABf)Å? -֦I-  Z&$Cb"Fs-ɸ2U(:`Ԡb- -q7.so~sDb MI龙!U[C<.X3[پRy  :񆽀7[|Kd6fվVsaR=ki3 JpIZeJårχ|nyT騇3ng (QqxV~}1hn|GW~| ;D9wb9wW}Vbx? HuId4r3'KЙ"@bOkU2 Rp'8 0wc ܋yN}cE?dA{{S}|~//ui8:iv3q)C^ I-uRw,Lם ߛu;r[7+F>CV6uc>0`?#QΏ?A8$Gƥ N <9b'gÊXAz$=^Iv8&ߐ" uq]ֽ{qh/-tlw/J.x{ױX),r=tNi$;AΊ~RT 'A~Px #Np 'x\*IIgJyt ɠ''9Av±$±#WDR 'Y$l&fГ+ƛ ?A߉?4Gu |[ .?xz]?y+;|-<.8|*WC=nZ*L:jjQg.|bO, \@g:7GQM^O@] Z"8y\D&; ҎOmzQ?1?/ :|tl+!IR4GRyA/-)zJ@%W)~dXT3>U!$V㙄{:|M>&"᚟=%<19kDg#uߴߴpd8Gzo'x0f?gg>Iz^[#k[B^5{B몝?v?SpWniY5wϦ6Q?W"fn +qGq`ZL)F'σiL'(yk %AWpp$uelAd DVWge^zec`dFyFypyϞ~bjXVtm%ꋑv;M`f*aVT fϐ͟B)j _-?Cl Y-Ɵ"2Ϩ0k%qjO&RRd3,T ٩QuҚHj 2LFx.s=,;K-J99K&edYJF24$+ ֟Z-@;hT')% wya0a 4⸛V >d_6Ll(F3#Gow'βz{ac}rIЇeP01nSC+'&^tUdt]aNX!jxXwNG lhfTa]_"Fvlta'4gLX7[0um*Qގ"( ; ꮕa{ N1܀: a8_x,tAH>-r®+F{;=!p;.3Q w8$M>|O)kG3 u݁9dx$b1"a"$BL@J ̚( jDmqIqɂq"|-rhD#zʋ?b΍RH~M9AN-FKFjN';]^s{>ve{,AkKYwG~dVw|OKwFou[%oTpXןklG%209\_?5&çiE\+NNfiXYP5D"yP2T#K>"iy =+N]=ѹlIG'?YU-^VaÂOz'<{;&ƦK]a~~yE$Ya0; ħ].< VNCV'Xy ~}81#.H @ b"Ԩ+!(uc M> g NA'1xLȅ͆f3s੹tǓpg6wc>b<>=(]J5~3qA>ANc෣K?sx[) |&8VBCze pb= *Dy~˽$B4q5s<vބk!]O>~D,Sp,_ P ۇ5fCهB64A4-z~W ], MP8v6a+Qؐ؉a6m6FYONB􍸣vhY5:vB+~ ҐGї0c4 rqϸb x  $ZŸBDaѓZ@j)^%ch[V˻Vi¯2!> _e4-Y`t1Jwԃ&pBO1JOsjיsDAz\' 3Ê )ӷ# - BxY4W{G}"XͿty>?ȟJVXPfH" .ObQ^D6a7~ 3Ɵ濺{YC:Vh`cL hV1cg0c}SF;TAG9xg.:A^J( KqYP+&ͺ. CۅA]"; m!RUMen~h#Zmn"aq֐)6nƒp; !BYM31t_Dh\[JtБ/=_ڏџȗE҅8tu3X90v)#/#j| 8ȯ1hke~e7F7wRV}>40%H`j`\z<}3-e|TH t_oF"m/׷iFLom__'F4+Ʊ'mڷ-Uk,0S$`UHl)pW*k[ #*D5NU4@fqlX y0FÍ@>e Y%$ 5= 5| ^i 9݇PJ)GWOǒNdJ>J;ݱمX~6`5[IyLQz?dm6k%:QzaϒtN9;❃Qm)9R-v?jC`qY=ApOFjj%63$$NAJ9S=&:x31dcØZ}ʃ>>h8m^gީC}z&ry33k?CoZA#-1> ^c=/@:  Hk0$DZq& yN,ZHy: }m:MGT6QVC::2oMf^wނ+ -6`di9vyc9ޅ6n89@~{z\+s!Eb*CSEW ?pá0D!38qW|! p+r!-CFa.n"h.8Va., ps5s6q4s vqNȳ/U8Z/`O4MfJIGҔUO(R*_J]龞G􈷞<[d j]҈~ r Y ɢaUPS+EʛIC1mQ PgqoԂo{Tyt5܎PUC搋hTxDyt4 h8]gS85VGFeeBֈty¶ºL:!lB( X!劐tB(2(v1ZGGK܌ϑ%"tpEPIYR3Yp<c t >EᒋmB,vBʣtEh Hl;و[ و[v x%6LU@|r]^%jtcjcja/y[E~0w"+vE*!v@X%{]Xw-^_7̶e"[]dJeT'8\Mn4;7.9T?.pߚX^;x֦,_2񍈑S+N?iKV 1fJ:e.K:^L \5\=>l@~lq|(on4XhX{.VjH|lB0TBKMD$]3nngHM3x 'g6!9.қ6q V82*qcX{Qg=\ܪctVö6#$v^`DӇ>EZ!<=d[^Wo_ѮhmmW&~þaÕz: W%89mqߪUeO,՗S/V1Z}%ȧɒS5 3uTx 1sQȍ2Sr4"\HhbEGܤOq)(0TmjbdHQI49Y̗,f)֯N $I;EOaOU"%> Th|ao/E^ǼΉJ4`טy{Q2/`Q[Eas| 3^"+aaw9^Xk"2fM?;r ڭX5ր+pހ! Ȕ6#j!D_9.01O++PTUw yu|YDA"EQotm8 " Tk*3+oHxa"xc"dw9]_:t:ۺҜu;ˋ{ܑm3iV+A\2$6jzZlV>TRt6Iu _j8q-b9M`W<~;Gې4Z&sdHD2Kk5Y9 MUcA2HyAVFB Y&5D&$ap5Bf'tX҄Q%*UFլd-UwKPhʹ`Rt#߱]l/ޥ}Yy-ɂRR[=ٝ޺3,pNB*;w%}=u>`tw̸cEOFܱHp,ڝ:s:AQ@up^U2~q,L0!d$'Y7!̀5+>== Cs az>}*=bq >h]{9ݱ +B*T/ʇBER/k~wǭHCa H Q 1E#<!bTȑolh}?G98yKg{p4OmsLS0Db nq9{yF))p4$<1C%>,L 2f*0d'٬..7P׷ c/ln[5:lͦ=1>BG7嫤L}ٳPțLK;v(Avi䚔')4y2C2# oQ( I3V%E6cG Qc˳g{' O4-=b<}9#P|R8Pi~ٸ0? cz@[Km12{|+cefcl&viTS3lᶵZ;*2'T tvP-eh5װJ--Dlz6MskXv=˞g5i[U뫥r*S.IF"2Wݩ&?hz,* SU2_IWa/ flnI4ugl.nUtW*}s8}HtQBkj;VD +58P]MTe;hqFF,b.]$bq&H4EcEIMxmxPaz6°lR>d =) mw;P/0`wܝqvoct@ ig1-V>r1!ۻ:v)ҿ?VG^)h"I}?mHv=mf{,Gob ,W,zTXv[UemG 0{+`dx@| {%WT5Zճ*zc9Oe%)v3mˇ+Y(Sq+麵GVzwd1+91*PK!QcvnLfont.npyPK6@vvedo-2023.4.6/vedo/fonts/Quikhand.ttf000066400000000000000000002327401444463326400173000ustar00rootroot00000000000000DSIG5GDEF GSUBf(OS/2?M`cmap(7 bcvt ,+`Hfpgm6+ gasp+Xglyf',head<]!6hhea!$hmtx*" loca12%maxpx F' nameJH'post*+8 prepт5@ Dlatn    afrczc2pc~c2sccligdligdnomfinafrachisthligliganaltnumronumordnpcapsinfsmcpsubssupsZ, }|~ 1Qa33fPJHL @D$  \@J@ ~1~    " & : D !!"""""""""+"H"e 1~    & 9 D !!"""""""""+"H"d53/߻޺ޞރDBw  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`apcdhvnjtiqfukzbml{̷woxd$8 @ 1' &+3!%!!67632#&5454&#"7632#"/&54d8,5;\p.@?H #B:&@9 8 8 =f26_P1cPPh/&_a3LK9B: < > G v%T@Q   @fYYB! $+#3#"56"#&=4]$5P2 #CCv!22;1MA,0@5.-,+*)( $#"   @?/>KPX@&fddiQB@+fddiMQEY#*+#"'7'#7632"#'57&'"'75'7'57.%/A;>/  ]]: #/ ; .H0$]^j Fv:i: S "$;; y_h@^] YhPOb`NK# FEDC87 52 @fXUeTQJaI  G*(% H) ?>K"PX@uhhh^^d  f  d  d  dfX   WZWB@vhhhf^d  f  d  d  dfX   WZWBY@-dc_^\ZWVSRMLBA@?>=;94310.-,+'&"! #$+32253322#73273372#''#'#"#57'7'#"#'#635'75''7737'75#5#'5732537275W *D.40 :3 ?   * *] 4   TD# #*]> r3I )Hs"**)"|y%%K]K%&8%8 +Dpp%K8p8]%%K%]K%8^(KCN(QTY^br@SRQPO  X ZW H~}|{wvutponmlgfedFE@j D <:98#543,&%$ @VK IqGk? ;"?T>+*)('=K PX@d^    f  df  d  fiXWX  ZABKPX@ef    f  df  d  fiXWX  ZAB@gf    f  df  d  ffgXWX  ZBYY@1sscc__UUsszxcrcrih_b_ba`^]\[UYUYCB>=#+332?'7337"#'&=##"57'75"'737'7'7&'476'57'57'35#3735'57'57'7327'57&'p  %Q 0@J P1P  0/01 0 @K A@P3!a ? /  &;"VgS>S*)M>()*=aS)RS*= Pj>{*=?**S=SS>dD)5=WS*==Sg))Sg?>|RRhR>*_ !O!0BL@1& 3 FA4, @?5+ 7 @ $*?KPX@[fff  d  d  f  d  d  YQA Q  B@Xfff  d  d  f  d  d  Y UQBY@LKJIHGDC<:21.-#"!!+2#'#&=7'256#$="5'3'7'22#"675743$5'"""(6IZl *  oPzCE((7{ +xitW sĈ (5( z#%:)\W;(=)$  @  ( ?KPX@c  f^\fdd  d  di  WY OA ABKPX@d  f^dfdd  d  di  WY OA ABK+PX@e  ffdfdd  d  di  WY OA ABK2PX@c  ffdfdd  d  di Y  WY AB@m  ffdfdd  d  d  ddg YM  WQEYYYY@IHFEDC<:750/,*&%$"+3374;363"+&#'#'#'#"536;674'"6565"#"} D;n#! (6C4CU3"/3L/i8-#v퇙2fwDCe6nooX*YB-AJ 틑 B,/.J}f/Kw@  @KPX@fMOCKPX@fQB@fMOCYY +32#'575"'75'7'56+K F:  : "\-p-@3,+*)('&$#"  @!?=K!PX@%^fiRAB@&ffiRABY@ --+""#'75"'7"'7'57&575''5?S#Lh*Rb) @ ) p ^NN?.n0~?/ }9rF*T@  @K.PX@fAQB@fTBY+2##47'57'743W@ i=E]hNJq'#>p|;P@6NMLKDCBA  ; 8743 210$/* ' @>K PX@e \f  d  d  f  ^ d  f  \iK ZWQEKPX@f \f  d  d  f  ^ d  f  diK ZWQE@ehf  d  d  f  ^ d  f  diK ZWQEYY@JIHG@?><:965.-++367"373'#"/#"#'5##57'575#575"56;5"'57'54723'57'54G3B%##4EE)6"k  + o"VNM$!3V #(X ; J.Q "%%   (v. A.%Afy 7 o  .%S S  %4tp<@A<;:8765. -,+*)&%$#"! @4?K PX@;fd\dddMQE@<fdddddMQEY@210/('" +32;7733''#'#'"'75'7'#4'575'4%'5qbz b%00J< I0 1 % UU I%77) R  E7 D77Dn | 1 )E# "@@hh_ +#6?'276a7"& OB+7#&5434Db)P^[cP3'3i= @K)PX@fAB@hhBY'+"#&'54%>-5CDi Q 'J-WD&Jl@7+  E54321  8"=  @< ?>K PX@kfdd  f  d  dd  d  d  d  f d Y RBK PX@efdd  f dd  d  d  d  f d Y RBKPX@kfdd  f  d  dd  d  d  d  f d Y RBKPX@efdd  f dd  d  d  d  f d Y RBKPX@kfdd  f  d  dd  d  d  d  f d Y RBKPX@efdd  f dd  d  d  d  f d Y RB@kfdd  f  d  dd  d  d  d  f d Y RBYYYYYY@'''J'JHGDCB@:9760/'#+2"##5## 3'56+5'#"#232725'"'&q8*++)FVCv4 %,% > # ?;N 'ED& N/^N>@? .O*H;}:IHXZp8tf9l?}@z=<;:98765 43/.-,+*'%$! @fddQAB10)(#" ??+2###57&'5"57'75'7"5'7'7'7'75'54';N'';S'';;'''l-J=,x;[;L<KW0-.,LY;[;.-JZ-iY9g@d0.*)741&  !@/ ?+>h h hhhhB32 +#377373733#'5&=66=&#'5#5'5#&=6%",6 ,-X 8m 86(PX&T C!"! CS0YGMs''&'L&9&' -o]a':&&M''9oEc@@< 52 : 0 *& / @6 9 8 ) ?=K'PX@X f  d d  f d dfd  Y QAOB@V f  d d  f d dfd W  YOBY@>=<;43-+('$+ #32#'#5'#&'532737654'#''#"'65#'5'#5"54q ]82 \ 8+aD9B{9 n|E+"?*S")S8~cj{#nxԍA)#)ejX4fF#F6z?#XXuwR@LRQ&%$#"!  N KJML7 IHGF?> @ @'52-?K PX@Cf  f\ fW W YA  BK PX@If  f  d\ fW W YA  BKPX@Cf  f\ fW W YA  BKPX@If  f  d\ fW W YA  B@Cf  f\ fW W YA  BYYYY@POEDBA=<;:984310/.*(% +32372'7'63273'##'#''#3##&53'57''5'525QG 0!11!A! (!!01!1vaRA11 !!!R!A99w-J79WHw-V,H++)4 ?+WʭH :WV<^J@DIHGFEDBA>=<43210 5 -*@C / "?>'=K PX@:f   f  ddQAAQBK$PX@8f   f  ddWAQB@:f   f  dddWQBYY@:876" +732#'##''37#5#'#&=73$'''#+4'57''57'5776^V(0~]00k?o0N0?N?_? !P ~NPm^Q U  QB@;"@1@ 1q 0 Dq @1b"1K&1@@!A` Mz$6@.5%"  &!.@6 /?=K'PX@8fddfdYAB@8fddfdYQBY@  +323547472!&5"5'##376="/K8"%LBF+89X`(d*qr**89zzh?9W4#4+ȭE4lJF4rLR~WE&i4@.1 (% @.#)"?KPX@7  f\fdd P  AB@5  f\fdd   YBY@440/-,+*'&!  +2 #'#7'563'257/#''##'"'547d+ +KGut, 0I:t -+z5:i;;L;I$JxWv&-w,9B@04- 0(' :% =<#  @=K0PX@N   f   d  dfd YQA Q AQB@L   f   d  dfd Y  YQAQBY@?>9721/.*)! +22"337#""5'#&#&567/7'#%"354'#"3$54~0u- Nn_~7f ?o2k?0>/~/vg~!Pn wOvOy@/_//~X/ :@5>n_,d8o/:k@h6310,+'&%$#"!  @7 ?=fQAAB54//)(+73'#'5#'57'5'5#&5'%6$75#'=k]..[̘.2+zLwuo3ixS/._? 0W$n/NN*NO! PKKo 1@.  @YMOC%+3#"'52#/4Nu;kDNVY'uAG8D(--4icn @ @>h_+7#&54#M \%JoWU^L<5#@n-O*@'>  =h_+73777''&54A &4 @ 44+"+<79RB0@4  /$!+(@,?>K PX@: \\fdf Z PD@8 hhfdf Z PDY@.-*)&%#" 00 +73777''&54377373#''#'#'68 "- 8 ,-"YYe Cp8e7 O !"88  #   $2-/ $   GGf'@$ @> =h_+'''52?54'4#&5hW%&pp%kJKރ83"?xfD),"`m-p )e@b  '$#@?WQAQAOB&%"!  +723#'5475'7&#5'#'54 9:: 9VWZ*h6*V.7C"vp;b]=  ^.S^MO>.8x}$GkH$D=8IU@C/.-,RQPOJF1#"  95 A@=;: @(?>< =K-PX@Q^f  d  d  f   f iY  W W  B@Y^f  d  d  f   f  d gYM  WOCY@TSNMLKCB?>87."+73 2#&'##&575'%473275#5#'"673''#'4#&63637'57'#~Ơw9  3u,8Xa|Wcy=?H- ;GۂL'N8o+[AOw,B-G1#kY+,,---Xa}_-X,,X_KnzWAmth@pedc_ji\ ~kY  rquxvywt?>|{ponmba^][ZXWVULKEDCBA@9854210/,+)(#"  hh+323277337#'##3"#&'4#9"/7"'&''#'###/57'576363'73'52567#57'676##7767"/5/$7 8# )? $R 0 ;: 3  1*8[  =H%6 6/@+ .4- D! ,  )? $'& Z?&&~4 3 4& t B& E4'AY1+ &oq32 M @ 1g*1 YA&; ,X $ V ToF|@   ~}|{zwvu SRQK qpYXWT"! j^]\&% h( edb-*)c? @mi _?@>=<;98754321 =h^ddddfd  d  d  d  f @x f  ddd  f gW  WMQEyxtslkgfa`[ZVUONMLGFEDCB+72##377322'7#5'5&'75'7?23%276=/#7'#2#''57#'75˲'7&53'575"575'7'57'57'53'57'54776''672734?'5#'#'  3 3   a D < 8 N,= 4fd43!{)q < 3 )[   3    HH R R4d_ 34 F @c @ I? Y| &3= /q%< / ' "8+> "7 &3&2>ua  e # X & LK % J 04G\  ' %2&&>X & 1 > } Z B&(3 = 1D[ (g[@B[ZWTO M) L/ H @>:?9=K+PX@]f  f  f d  d \  f  \  YAAQ ABK.PX@_f  f  f d  d \  f  \ d  YAQ AB@\hh  f  f d  d \  f  \ d  YQ ABYY@YXSRQPJIGFECBA@?=;7654'&%$+3'#354776?373?"5#'#"'#5#+4#75"7'47527256?379/A 8T  "8MT](/?1 V#:J( % / O*8% Q; p6 /, 8.g&8b a+*FH +|87P,xU49k{~.[K77**ajFoFp88bhH@hgfedc`][ isrqponmYXW utUT yP}ONM ~!!"A$'/ 6 = :9 @alV#!D"-2. ?KPX@f$fddfddf%!!f  f\"\""df  d  dd \  d  dYMX!W Z  Z#A  BKPX@f$fddfddf%!!f  f\"\""df  d  dd  d  d  dYMX!W Z  Z#A  BK"PX@f$fddfddf%!!f  fd"\""df  d  dd  d  d  dYMX!W Z  Z#A  B@f$fddfddf%!!f  fd""d""df  d  dd  d  d  dYMX!W Z  Z#A  BYYY@K{zxwkjbb_^RQLKJIHGFECB@?<;875410,+&+37372737"#''##'#'##5#'#'4#'473'535'2734#5#575'73&'75'75&'6743'56'53#234%47434743&#''353535 ))Gf M-   ) 3  )  33)Q 3 *</   )   3  R3=({(R[ i &%  q ?A2q% &V M= >X $$=V & &WZ"%&2K%&%? 2%&h-X K  % 2 2%  % Xd 95<252 2 K&&j Q#H@"  &'(;6* 0 DA@>=<.+  OIVUJ~YXWyxwvutsrqpnmlkji] @!   )9 :51/ 2 GTKHc ?KPX@}fddd\d fff  W  M  W  WYYABK PX@} hfddd\d fff  W  M  W  WYYB@~ hfddddd fff  W  M  W  WYYBYY@){zgfedba[ZSRQPMLFECB8743-,%$  +32777'##'##'#'##'543636%27377637377'#'#'5'#&'#'##4767273"'5''"'&575&'757'7'7'57'7'6 11k'DDa DD 'C *$  1 X 1 ~; ,   11X''#5' :~NX A; ' Q) (7 'C7Rm)PQ _PmQ) )lD ) ( D(D(H^)C')_  )^7(  O+l)DC( 7 79yek@kdcb %$ ]\[ZY/ X1.,+ W;97 TSRQA@? POLJIHGF @e_^ 0- ? >K=KPX@j^ddfd  f  d  d  f  d  dKY AB@k^ddfd  f  d  d  d  d  d  dKYBY@a`VUNMED42*('&#"+773375373#''5#'##'##232777732/2''#'77'7'3'5'7'57'7'#7'7'i*!5j 5+.R uU+ J   N ? !IK8(7M<= *   55 6  y:  C4j B)) ()  P -$ -= \'C 5BB  4) 6 B [6 (i')*bt@hso   :9 > @ AHEI/. J  hS$"dbM!c^P@? T#?Q=K PX@ff  d ^  f  df\dfY  WOA O A Q ARBKPX@ff  df  f  df\dfY  WOA O A Q ARBK%PX@ff  df  f  df\dfY  Y  WOA Q ARB@ff  df  f  df\dfWY  Y  W Q ARBYYY@%qpnmgfa`VUONGFDC<;876521*)+3'5#57&5####337563476347675#&543725732#'3&'75#"'5&5#5&=2563474g&  &7R/ %//,:7.$_7"B%F0J8T//. +%3 8b &#G2Kw(A&2Kb+] D($(:`^P)_() m5T'> -g6 &+ )'DRy)D9 RQ;:95 \WVUT @F= <S X?KPX@cfd\  d  d  f  d  d  d  \QARA  BKPX@cfd\  d  d  f  d  d  d  \QARA  BKPX@dfdd  d  d  f  d  d  d  \QARA  BKPX@dfdd  d  d  f  d  d  d  \QARA  BK.PX@dfdd  d  d  f  d  d  d  \QARA  B@efdd  d  d  f  d  d  d  dQARA  BYYYYY@cba_^][YPOMLHG"!+3#774775'7'273223#+5'7'757'5'#'#'#2'#"5'##"'375'7'575'7'5'7'57'57'57'575'75XBO ! N "YO !9N  !! "    ,$Z.  , 8e-"D R "  "8  % "  " G7B6 (** 65Q_7(^))2(7 DDRQ zˈR7Q *6l  Gذ _)C  7 7 ( D _z()D 6 7  )zDTbK PX@a_  W V UTSRQPONMLKJIH.-,%$#"! G4/+(&D A @ '?>B@ =K PX@c_  W V UTSRQPONMLKJIH.,%$#"! G4/+(&D A @ -'?>B@ =KPX@a_  W V UTSRQPONMLKJIH.-,%$#"! G4/+(&D A @ '?>B@ =KPX@c_  W V UTSRQPONMLKJIH.,%$#"! G4/+(&D A @ -'?>B@ =@a_  W V UTSRQPONMLKJIH.-,%$#"! G4/+(&D A @ '?>B@ =YYYYK PX@Ufd  d  d  ddd f L  ZA  BK PX@Vfd  d  d  ddd f W  ZA  BKPX@Ufd  d  d  ddd f L  ZA  BKPX@Vfd  d  d  ddd f W  ZA  BKPX@Ufd  d  d  ddd f L  ZA  BK-PX@Fhhh h h  hhh f L  Z  B@Ihhh h h  hhh f g X R  FYYYYYY@a`[ZYX?>=<;9+'73773''###7737773#'##""#'/6?'7'5'75'57'57'75##&547368 //.   [ @ BB%S607k *K@i  && q^ %T( `((FE ~ 7C  7D (T:^ kj,CR E  m(R _R)_6_) eu{@m kjhgf cba`\" # %$zy+*)('& |ZYW10/. ~}SRQ=;:98765 PONC@?> ELI @l DF?t  >KPX@a h h f  d d d d d d  d  f]  W  B@W h h h h  hhhhhh h  f]  M O CY@&vvvvrqpoed^]VUKJHGBA43-,! +7772#'5#''3##'#57#/75'7'673'47'?347'57'3'75/575&5##&'4327'7'75'63'4 'I4 &( >R%  @& '  ' (j& ](?M% ' +<(4 y u 3 %5 e*S!WiMN[ A :} ( e     3t V k`I ` *7+ ?  A *2 + K i - ! T5 V t^ 5a 3 @u K ? 4aG:JJ` 8?4  ߫* ^U2Y@'$# )0/ ~}4215: \{bac W vutgfedPrOL? kplGDBA @(.3?>onC =K0PX@ffddf  fd  f  dddd  d  ddd  d  dYYA  B@ffddf  fd  f  dddd  d  ddd  d  d gYYBY@1zyxw_][ZVUTSRQNMJIFE<;98'+#37653'736774?32#'"#55''##2'#754#4'53'"5##4'K#"'5&'?/3'5'7'7'65355w&(   X1  1 D 5@ '''  ;=$+H#'  ;D  N$* # ; #[<     Y'Z8 9w*/'(/3r 3% + T;I6 )[#) 8T*rfa8)?@6?< CGd')rG8GTTdF(IdD/@IB ?   !#+.-,*:7 @> ?;65=K$PX@@  fdffddYABK)PX@?  fdffddgYB@A h  hhffddgMQEYY@ A@(" +2#22?32?7#"''+'5#'&57'3'54^L+    !Y! (W+.  X .A @!W dvO ''i4O 5 B'BH"# K(' E':(' ]tvO 4Me\@ cba`510f 8 ji\[?>=<;+ ) m qpWVU zyxwutsRQPONHGEDC%$ I! @d @* X r ?>K PX@|  f^  f  f  d  d  d  d  d d  YAQAOAAABKPX@}  ff  f  f  d  d  d  d  d d  YAQAOAAABKPX@f  ff  f  f  d  d  d  d  d d  YQAOAAABKPX@~f  ff  f  f  d  d  d  d  d dX  YQAAABKPX@f  ff  f  f  d  d  d  d  d d dX  YQAAB@~f  ff  f  f  d  d  d  d  d d dWX  YABYYYYY@-~}|{onlkhg_^ZYTSMLKJ:97632/.-,(')+67'5732&7'5'3'5735"57'#"#'##'7575"575'5#7'7#"###&##''#53'75'57&'7'637'36%%" T +   $ 0!3S:  ;$C7   $ $ \ H $ $ $ % $ ; 0?    +) HGF/ I [O Q,URWV @i e *?KPX@xff  f  d \  ffY  YWWWW AABKPX@{ff  f  d  d  ff  YWWWWQA AAB@yff  f  d  d  ffY  YWWWW AABYY@6pp{zyxwvutpspsrqoogfYXTSKJED=<987654)'&%$#"!+37'435'5?2"'##4+&'774'75&#####3#5'#& 5'575'7'57"=75&=6#53#3#7 M 7 :  # /( E / '+" X 7 ,!  #4 + !!" !!dlK n)S  *K  S6+m'28E886}) a(Kn)  + *naD8~ +?H-~()*)*S)n* C8nGO@lTRQPJ E{ x`A@cvutd?>qpon!jihf:'%$# - @NS  W z= ?41=K PX@  fd  d  df  d^ffd  dY  YZ  YAAQBKPX@  fd  d  df  dfffd  dY  YZ  YAAQBKPX@ ^  dd  d  df  dfffd  dY  YZ  YAQB@h ^  dd  d  df  dfffd  dY  YZ  YQBYYY@4}|srmlba_^][YXVULKIHGFDC980.  OO+3234;33237#2'#&/"5&/7'7'737434353474''#2#""#7$537'575"57'67&'75"'&5#&5: 8.# /  : # #!. & !1> >( Z.\$, #..?3QE- P"Oh gQkL/ # !## R &)Q FQ(z# 1 _5Q(j $-#IJ  3)_ 7l m(,k_5 s0) ( )Dm)f2k  )8Q1m#W $;KSz@dSRQPOwUTLHGvurp]\[ZYFEDCBA gha;9876!  32 0/+'&%$ @K^mji<:?K2PX@uff^\fd   f  d  d  dWYY Y A  B@wff^\fd   f  d  d  d  dWYY Y  BY@#zylkfecb`_>=54-,*(#"! +372###'#5##'#"#'###"5#&'7&'7'#75'7'7'7"547'7'7'7'5474?57'#367377'73547474?57&'#,4 1m4 H ) @ 4 D     5^s J s   X  ) ^th / K e eX%& -EY 2 Lr 3 X& +"+& Z@YrOH &?2r 3 I3  Hdff323  -+ &3 016U O<N}a}@[!W!TjRQKJI ONnMporFtswvE~zBA@?32  &%$#"@Pux?>KPX@f  f  ddfdfddddddd  f  d f  ffY  W  Y#!!QAQ"AQARB@f  f  ddfdfddddddd  f  d f  ff#!!MWY  W  YQ"ARBY@Nbbbb|{mlihgfdc`^]\YXVUDC>=;987640/.-,+*)(' aa$+37373##"#2"'"'"'"'#'#"5#+&'"'575'#7577''575'?437347436;4#3"3?5&5##57'47336?'567335'&'5#4RJ* 3 ZP  (-*U? *5+& ^- CUjM#< *!3T U5 _U:_K* )X I 9-HH4 ? 74 3>2+?}*E$p F}SoSa|b  }-$G** '(N 8KOB'b'5E#e d4 p5="w K PX@rp"o#$xnl #{ j ih  ed) a`+ _^] RO [S;3=U@ w"$ < ?>K PX@rp"o#$xnl #{ j ih  ed) a`+ _^] RO [S;3=U@ w"$ < ?>KPX@rp"o#$xnl #{ j ih  ed) a`+ _^] RO [S;3=U@ w"$ < ?>KPX@rp"o#$xnl #{ j ih  ed) a`+ _^] RO [S;3=U@ w"$ < ?>@rp"o#$xnl #{ j ih  ed) a`+ _^] RO [S;3=U@ w"$ < ?>YYYYK PX@$"#"$#f  f  ddf  ^\  ^  f  dfdi! X  Y  ZWAA""OA%##OAQAOAQBK PX@$"#"$#f  f  ff  ^\  f  f  dfdfi! X  Y  ZWAA""OA%##OA AQAOAQBKPX@$"#"$#f  f  ff  ^\  f  f  dfdi! X  Y  ZWAA""OA%##OA AQAOAQBKPX@$"#"$#f  f  ff  ^\  f  f  dfdfi! X  Y  ZWAA""OA%##OA AQAOAQBKPX@$"#"$#f  f  ddf  ^\  f  f  dfdi! X  Y  ZWAA""OA%##OAQAOAQBKPX@h$"#"$#f  f  ddf  ^\  f  f  dfdi! X  Y  ZWA""OA%##OAQAOAQBK PX@h$"#"$#f  f  ddf  ^\  f  f  dfdi! X  Y  ZWWA""OA%##OAQAQBK2PX@h$"#"$#f  f  ddf  ^\  f  f  dfdi%##Y! X  Y  ZWWA""OAQAQB@h^$"#"$#f  f  ddf  ^\  f  f  dfdi%##Y! X  Y  ZWW""OAQAQBYYYYYYYY@E~}zyvutscbZYWVQPLKJIFEA@?>:987640/-,('&%$#$&+27337322"#'5###233732737##/&/#&#'&'5##/#'6?'575#57&/7'?/57&572733#343475347435'57'5#"##  )G>* 43 (-\3g G3 G ) 3)p4H"507)I  .J     )p3S SG (>* z  #B$& & &3(A' '@z[] A & $"e26@#W{)&Ϝ& 3RQ(=(23 ?@[2b,UF B., U;,;7J :K PX@"$!# !  A@|rB^]\FXWVkhgSM @#4:3 ;9/ ~{}Cqj ?>K PX@"$!# !  A@|rB^]\FXWVkhgSM @#4:3 ;9/ ~{}Cqj ?>KPX@"$!# !  A@|rB^]\FXWVkhgSM @#4:3 ;9/ ~{}Cqj ?>KPX@"$!# !  A@|rB^]\FXWVkhgSM @#4:3 ;9/ ~{}Cqj ?>KPX@"$!# !  A@|rB^]\FXWVkhgSM @#4:3 ;9/ ~{}Cqj ?>KPX@"$!# !  A@|rB^]\FXWVkhgSM @#4:3 ;9/ ~{}Cqj ?>@"$!# !  A@|rB^]\FXWVkhgSM @#4:3 ;9/ ~{}Cqj ?>YYYYYYK PX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fddfdfd\d^NZ WV$$AA PBK PX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fdfdfd\d^NZ WV$$AA PBKPX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fddfdfd\d^NZ WV$$AA PBKPX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fdfdfd\d^NZ W$$AA PARBKPX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fddfdfd\d^NZ W$$AA PARBKPX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fddfdfddd^NZ W$$AA PARBKPX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fddfdfddd^NZ WV$$AA PBKPX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fddfdfddd^^NZ WV$$A PBKPX@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fdfdfddd^^NZ WV$$A PB@$h"$#$"#f#!$#!d!$!d$d$d $ d $ d$d$d  ^  fddfdfddd^^NZ WV$$A PBYYYYYYYYY@CzyxwvutspofedcbaZYUTRQONLKED?>=<876520.-,+*)%+3"'''#7#7#75'#3733733534;737377333#'#"'637'752?#'#2474?'35'#&/##''''"'&'57'56347'57373354347 68()

KPX@1ffYYQ ABK+PX@/ffYY WB@7ffi MYY OCYY@//% +37+##'7'7537'574'"/472348t"?"Eg# 9?&WbX-8e<(CSyoePyxg)[\(12.@:7<  |zyxDCBA@?>543210/ HGFE.- wMLKJ)('&%$ rqd`QPO"!   efSR \[ZUT on @=vI# V ?>m =hhhhf  d  ddd  d f   Y  Butkjigba^]XW+3#223733'75'57'57'5673'7'75'757737#&57'4#&5'##""'&57&#75'75/6='7'67'6 ! !  "' JJ; # F , 8   [ B0   $ ".8 !9 " ! I0rZD 06   & E'mCz6() *) R')+)+  ,v E6 b2) T) 6]6q' B6) X s7?%D MU .0(`BDY  '@y(6[61sX@KXW; UTSR8  NMLI65 4 3 @ V ?*)('&%$#"! =KPX@h  f  f  d  dd  f  d  fdddg YOBKPX@e  f  d  dd  f  d  fdddg Y AOB@h  f  f  d  dd  f  d  fdddg YOBYY@POKJFE@?>=:9210/.-,+ +3##"#"''75'7"'3'3'3'77 7#'67323465635'572?5'57'5(& l :" ' * ,  \C   ( O_P\%+65 Sx'CH]". 's( \['h& 'i M ( i ( 4BOu(;(,A\ 4A  A   @RNML Jxqp onH kjVG ZYiED321fe^7 a :9) @=A'=K PX@ hhfdddd^dffd \  \d  d  dd  dNW ARA ABK PX@ hhfdddd^dffd \  \d  d  dd  dWY AQA ABKPX@ hhfdddd^dffd \  \d  d  dd  dNW ARA ABKPX@ hhfdddd^dffd \  dd  d  dd  dNW ARA ABKPX@ hhfdddd^dffd  d  dd  d  dd  dWY AQA ABKPX@ hhfdddd^dffd  d  dd  d  dd  dNW ARA ABKPX@ hhfdddd^dffd  d  dd  d  dd  d  dNW ARABKPX@ hhfdddd  f^dffd  d  dd  d  dd  d  dNWRABK+PX@ hhfdddd  ffdffd  d  dd  d  dd  d  dNWRAB@ hhfdddd  ffdffd  d  dd  d  dd  d  dNWYBYYYYYYYYY@A~}{zwutsmlhgcb`_\[XWUTPOCB?>650/.-,+%$ +###"2#'7'7"'####'37&'7&75'57323#237'57357'63'57'54343223757'6763'5673535 - &, - !C# 2!-!Mp N %,-! N! Zc . .  !p,  7   7 C !p, 4<;#+367256732#'##'75&'4#4#4/4#4'4'"#''7'474?435#53&5"'&'7'6sD .:' )Dh )r)}I\U P > = 0*I4*S4 A ) >_4S hg ]9-< 3W-{-> l="MKkd3(2u`9\*=@z>D&I"\ZCFRd-/.yW˶>aU{,\L=7z$@~}|tsrqponmkjWVUTSRQPONMLKJFEDC$  eYXB dZA@$  *) ]0/.-=: @  & ;<?x> =h h h h  f  d \ffdg  M  Y R F@ {zvuihgfba`_IH876432,+('#"! +%567?7?'#?'?'?65'57'#####+'#'&75'7'7'67267252?'7253'5657'57'7'7#473''&/%4 a6]! 2 $' "  %LN  M K& : 3  /~ && ZJ,&B5%  M '    $ < Y#$X  = 4 &Q3 "+VHs+#H96qHs:I* ::IGtX>+s+sH 5L ,,WS;!`Gs:d+H* W :Vid ? " FK"- Jdhlp@P^[Z EC% pom10/* n<9853 @cL( '64 ?>K$PX@f\dffdff^   f  dd  d  dKZWW W A  BK%PX@f\dffdff^   f  dd  d  d iKZWW W  BK-PX@fddffdff^   f  dd  d  d iKZWW W  B@fddffdfff   f  dd  d  d iKZWW W  BYYY@7iieeililkjehehgfba`_]\YXWVUSQPONKJA@>=;:-,$""+"#5##'###6;73277653'''5#'#&5#47474?5#&'#2#"'##'57373734353'75 )?;0 " #) t)V.))+'= 3= 3R[> b-f \33f3)h'5' G3Qp)3HJ`SUڵ*8)[R* |)))) 7 8#L DF77/Me+1YN7))7D(# )`@KOC+!!d<7 @ h_&+#%.54632E)!)#7((#h]aO@{ZgdcbiXVm ponQPON6yxrML54 K  B @h s  *HE) DA C ?K PX@fddddddddfdf  f  f  df  dY  YA A Q AQBKPX@fddddddddfdf  f  f  df  dYA Q A A Q AQBKPX@ffddddddfdf  f  f  df  dYAA Q A A Q AQBKPX@fddddddddfdf  f  f  df  dY  YA A Q AQB@fddddddddfdf  f  f  df  d ^Y  YA Q AQBYYYY@9^^~}wtlkfe^a^a`_SRJIGF@>3210/.-+('&%+37##33373'###4#'5#&'"5"'"57'#"''575#4#'57'7'7'2547474747635'#'#;2767672?'7#35G$5P     83,%$ -$# ? $9(, 1#..5 $S>--  wZ D0SU  h@ Gz4W k V `  , 5 J6?X ]# 6  *0PJ+!65 Y ,28 5 NS!` G ,L /?JB+v 1$/A@):3 54@;?,+'&%$!>K0PX@+ff\OARB@,ffdOARBY@ ?>=<7621'+?3##"'/654'?/4?7372675#'"֞G  %< 5  ) ?G,%,#" mr / .COP'=AȽF%xB> HK8-A0Q8"*5mMQ@T'*"ON G1/.- FE3 BA @ @)40?>=<;8=KPX@@hhhhhh h  h   f O AB@>hhhhhh h  h   f  WBY@QPDC?> +/""#5#273437''''#'57#'&#'7'5?>3;^3VI%/? < (  )g ( B 2-% 2 (2 2MY m y@G08[@[& @A'4&%4[ 'U-( X '@$:$   % @  0 BZ@@?>  T  87Z3E&IGF/.#"! + @ ?>fd  f  ddg  YWA A Q BWUKJBA=<;:+33##&'575"'7'57"5'#4/?25763'5?2357'234767654/7#"k   %( . C#: 2  ^k5 +"pC t] ( j< n J<-<<ۜ-Ai---<0 x;<-xP<NKe^r_)'iYiPZX&4b@_0/',+( #@fWQAQB31.-*)&&+#&'577/#+&'&54274375'#"/'+OW ;(T G B c'$4<:(4\FMXZ'2--w+LKPX@rffd  d  d  d  d  d  d  dfgWAAOBKPX@tffd  d  d  d  d  d  d  dfgAAOAQBKPX@rffd  d  d  d  d  d  d  dfgWAAOB@pffd  d  d  d  d  d  d  dfgZWABYYY@"|{zyxwutihgfbaXWPOMLA@?>98+#&5'""73?73'#'##'#4'75'5'575"'7"'75'75'3'75''#'5473657'57'7'5672734334pIGC)]l]K0 ( < K  Z`=;876432.-,+#"OO+33672374747"""#"3''#""&'3'53'57'6-j!:y$K<.Z<e#j2q(f-O9+^V"VwD4f3gU' 6S335wDx2zDEEgP0Q@POLKJ G!  E'&%$CB-, 0 A@?>=<;:98543 @FD?KPX@\fd^f  d  d\  ^ fY  Z O  BK PX@]fd^f  d  dd  ^ fY  Z O  BK.PX@^fd^f  d  dd   f fY  Z O  B@cfd^f  d  dd   f fY K  Z O  CYYY@NMIH7621/.+*!+23#+4/3'3#22"#3#'57'7'57'57'7'7'73'7'63'54e < _ W_   + 55 5?    Vfa'H'H <2)  3 2( (=Q 2 )2)o3 3[ 7dq"@q  lkjigfd baut^%$# |{zyx\[+*)('&}X, UT.- QPON6543210 K:9IA@ ED @h/ ;<?K PX@fdd\dddd  d  d  d \  d^   fWYQA R  BK$PX@fddddddd  d  d  d \  d^   fWYQA R  BK0PX@fddddddd  d  d  d  d  d^   fWYQA R  B@fddddddd  d  d  d  d  d^   fWY  VQBYYY@-rrrr~wvnm`_ZYWVSRMLHFCB?=87.+24/77327347'#"#2#'#"##"'4'43'7'7'35'435'27'67435'65?5'575'5"'&'"#236767'7'75'7"5' WnI HG J=7 % %  %%  % 4 6$ /%h2%%  % 9 11% =% jۈ+ 2  %   D\=    n<G< o^G7Z) T ?? _S S* 44 s C i *_I 4s*5 5 ? s~5*h T *J4 * iI4  ** I}@}}  zy #vurqponm'jiK gSRQ a`WFE _ ]\X,Z=853@khTU V[Y?KPX@}fdff  d  d  f d  d d d d gX  YAQB@{fdff  d  d  f d  d d d d gX Y  YBY@#|{xwtsfedcPONLJIHGCBA@:9!+233672327222#'#'&'4'#&'75"'"57#"'#'75&57'5434#5'7'7&57'7'7'#75'3'7'3MG$ !!     @O^( %G@ 56">+V CtU452 BI J    V !!* J q+  5 J * JwJ6h @U J*K +?!!65 k J * 6u .< @U 6 5 _ u j`(f:@;:987654 10/.-,+* ('& @2?KPX@1ffdAQAQBK'PX@1hffdQAQB@/hffdWQBYY@ !+22#3673###"57&'7'57'575'7'575'PJV  (( B'F%(^PA ([/Z-_[L-.CZz[=.Te-A<7@&.-/0p1" ! 3B  onmZ5Y6 sUT8:}|{dc uePJ vK @',2CA 4 @V79~khz Q ?KPX@ffd  f d  d  df  d  d  d  dY  XWYAAQA O AB@fffd  f d  d  df  d  d  d  dY  XWYAQA O ABY@@xwrqjiba`_^]\[XWSRONMLIHED<;3+7'5'73'54356723'7'75652?4;2347657'573##&#'57"7'7"57'#""#&=35&'75 ##&'75'7'57&'3'7"'7'7"'257355ND  1 X  $ '    I"     D'X _A 1'& .  +1~  Db ; ` '   #   *D I=G  %n=%U %U% 1^N $ 2$1cnU%>VDR5b $! = > % %$Jbn$1   =86 aI 2aI1 % $$ % (glp@u\[ZYV]c`P f2 LJI;-,+  =<@?># & @ON K    ' A EB ?W>KPX@fd^  f  d d d d  d  d d  d  YQA A ARAPBKPX@fdf  f  d d d d  d  d d  d  YQA A ARAPBK PX@fdf  f  d d d d  d  d d  d d  YQA ARAPB@fdf  f  d d d d  d  d d  d d  YTQA ARBYYY@'ponmkjhgedba_^UTRQGFDC:97543+2337'2?3'#'"'75'3'3'73&+#'#'#4'7'7&'7'5#5437373#367273#j    W |W  0 C .)L' r&    _   A0'0 9/ 4    EJ$ g?>&L?(] YP!K !i2W' 22 %- & 3e d&%&2>1% O& !L&W 0 2%X 22}& 8BFquy}@zBA@ qpGj= <MQPN;feT:9YXWVU6 \[  #   @I>LOgbSZ 3$"! + ?KPX@ffddfdddd!f  d  d  d  d  d  fW W  YOAOAA  BKPX@ffddfdddd!f  d  d  d  d  d  fWY W  YOAA  B@ffddfdddd!f  d  d  d  d  d  fWY W  Y WA  BYY@E~~vvrrCC~~}|{zvyvyxwrurutsomlkihdc^]CFCFED8754210/-,*)"+3737337###'5"5#3#&'"5#5'3'63'57'7'7735'276?5"57'7"5'"5#"'353535#35A5@*h  J   V J@J+ J5! J7 % @ +` K ?6 % 5  *J?~-5!!  !OTT U   8 $$ # 00:$ cE"')  $$ "T=#T 00$ $ ^$ # <$ $(Z$`$ R0 xb $/=<43  E0/.-,+$#@"?K$PX@:h  f   dfWQAQ!B@8h  f   dfYWQ!BY@;;;P;PONMLHF(&! " +337273#+&57'57'4?'57'7'543767&#'"~DVwV3 ""@,E#;""7C#D*#4"=D>gv!L _K 0D  010:I<1HU%$ z(0 I&G=0 =U $N1 $$$Py Ia@S`^   .-KJIHGF"! $ ) A@?>:9@45/ # D%( SN?K$PX@]  fddd  f  d  d  d  fgA P A  BK%PX@[  fddd  f  d  d  d  fg XA  B@R h  hhhh  f  d  d  d  fg X  BYY@aa\[XWUTRQPO/+3656723'57635'57337#'75'53'5'7'#'##'#&5#67347474S/K7)D/2E`U){   (8  7{PR mA  ]D 30]ERIK60@!ifB?,/=AR"R BB1CABcBSB tB1B1!7l<41!BdX@UWVU QNML" KJ IH. FED:98754321 ; @T ?KPX@_ff\dddd  d  d   YQA A  BKPX@aff\dddd  d  dQA Q  A A  BKPX@_ff\dddd  d  d   YQA A  BK%PX@`ffddddd  d  d   YQA A  B@cffddddd  d  d f   YQA  BYYYY@&SRPOCBA@?>=<0/-,)('&$#!  XX+32747"56?532#&'"5####'##4#'75&5'75'7'7"'7#57'56)Q   [W =   ":4-H   2   2=     d#/ #$ /A)o#k A# 2 ^ R##^:#R   #G ## h// R/;#i  #FH9@251 -&$@ ,?7>=K)PX@-fddUAOB@/fdddUOBY@ -+2'34'&#"'&547365&#&'&'7'2?'#?473V ""MVUp*#%>eM<")$  ^ <+p  1Z.% I1&~`%J7& o[NK=cl5G%$| 9 X@WVURMIHGFEDCB!  >" = 0 854' @N/ ?:9 =hfdd  f  d  d  f dMWW Y  BXXTSPOLKA@7621.-,+%#+36373373&#"#'2673373"'#''&'7&3'57'57'7/#'&56757'60 :>9;C9T2 !!;O? F* *}>/ K %P /7.A!  <. D 8I--&o!? - | 6 8c"#L z "v"T 3F2 X!,-V@aV UTDCBA@?>=:  RHG8  ONM  (  /  @   5?6 =KPX@O f  d  d  f  d  d d  YYA  BK%PX@Q f  d  d  f  d  d d ^  YY  B@W f  d  d  f  d  d d ^ g M  YQEYY@QPLKFE<;4320-,+*'&%$#"+2'#4#'57&5##2#'###'&'722375'52567'/   ( ( O Z(   < c ((U#   ; d 1X4 -W Et: t]"F  "/"  /q $#A -.t s##.Q] l 9". C@= /,+BA@=(   ;     @?K PX@Y f  f d  d  d  dd  d  f Q A QB@W f  f d  d  d  dd  d  f  W QBY@CC?>876543%+'####""'"'53'573732354747375'6HH )) 2  3   < -  3 &T/.\4 9F  %+4= S % _ Uc 0S%4Sm0 1< 0S;J % g%@`M L a`;: PO98 ]\[ZYXUTIHGF543 W +('&%$  @< #? >KPX@c  f  d \  f  d d  f d d Z AAA QBKPX@e  f  d \  f  d d  f d d d Z AA QBKPX@`  h h  h \  f  d d  f d d d ZA QB@b  h h  h \  f  d d  f d d d d Z QBYYY@edcb_^SQKJDB@?+"'#'7&#"##'"3&''75K'7'5472;67'7'63732'75'5735'527354 V WB   6+V (. (  !?.> +3  KR%N 6 &+  &b  * +   *+ +Vj  !D g+*L6  j 6 Wi u , 6+ (6 Jv   k A@MH@=LK  + /65432 > =;9#  @<:?K"PX@H  f d d  d  d di  YAQBK2PX@F  f d d  d  d di  YYB@Mh  f d d  d  d diM  YQEYY@GFED@?10-,)(%$"!6 +23676;2'##'7"'&'"/##''57'#46735"'&'7'4SB"_PV k " W @5 i'p&)"_ 6 K*A6  t 92q aB:+K5AL HT V8 6+6! J!M@! L  l!! *B ,"/N\i@GF A@ MLK?>=<+* RQPO:987. WVU'   0 3  cba` @N; $ ?\[CB> h  hh h  hh h  f  d  f \ d  K  YKQE]]]i]ihged_^YXTSIH6421+#37#"#4/76365'#7##"#"7'575'75'7'72#3'"35#l#3WW4Wg" JE.""s"4(!"3y5""3D"ZQ"8>.%YM. k\.]6E+6M+O.a...k...\\.z>.\<...\dhk@kXQkUS CB)(% /, 63 @`]da\YOMJNTPA: <9 ?; =KPX@fdffddddd   f f  WAAQAQA P A  BKPX@fdffddddd   f  WAAQAQA A P A  BKPX@fdffddddd   f f  WAAQAQA P A  BKPX@fddffddddd   f f  WAQAQA P A  BK PX@fddffddddd   f f  W  XAQAQA  BK'PX@fddffddddd   f fY  W  XAQA  B@fddffddddd   f f iY  W  XAQBYYYYYY@-eejiehehgfcb_^[ZWVLKIH?=875421.-+*"+27322#'#'7735337373#'#'#'#'5'#"=7'6767635#'''''63737733535\%<:KQO[#J%3-`%%Y%%%Q`C-{c-3,%,% %%B\ k"$;I:jG  $G  $" // " $ # :G$ivY# $ #$F: t+#<@9fdYYMQE!%!%+>546;#";#"&'4&'fllZ=\yRRz\=ZllfCJ2C: SS :C2JB^K)@OB+3#)5+#<@9fdYYMQE!%!%++532674675.5.+532fllZ=\zSSy\=Zllf~B,J2C:SS:C2J,C^,n0@- @> =MYQE!%!#+#"&#"5>32326?v9<;3qI@v7@74qnH3a8TI4c8L0C@@@  ff YWOB/.4&1 +&+"!!!27!7654'&'#53&546;2#&HXdZT5h#;1g1":K:Ce]<?Kք2MB B8=YMQE><(&.#+3276767654'&'&'&#"'7676327'#"'&''7&'&5476^)::)( ();:(' EvPv,7,-)*9-vPu uPv-8*+*+9-vPv  0(()::)( '(:;.vQv vQu.8*+*+8.uQv   vQu.9**,+7T@K PX@A  f M   Y Y  ZYRBK PX@B  f Y  Y Y  ZYRBK PX@<  f  Y Y  ZYRBKPX@A  f M   Y Y  ZYRBKPX@<  f  Y Y  ZYRBKPX@A  f M   Y Y  ZYRBKPX@B  f Y  Y Y  ZYRBKPX@A  f M   Y Y  ZYRBKPX@<  f  Y Y  ZYRB@A  f M   Y Y  ZYRBYYYYYYYYY@!~|yxpnjhec_]RLJHED97!$A$#$!$$+%'4&'%"&5463!'!"&5463!&'&#"&54632;2#"&#"3267>54&'&'&54632;2632!2#!!2#!#"&#"#"&54676767># y 3+A` D9!! )  / 84F & ?TC .e C[ J   9b   D+"F    f   9o  ' rH   D^K*@WOB+3#3#s`LT]@Z@ @I=fd  d  dY QBQPMJHG52/.+('&TT% +67654'#&'&'&#"67654%.54767'.547676;2#&'&'#"5+"&=3!8)I[;CN^qHH{iYCg({iYR B3KFON^oe/4l.7e|B3KDA%Ae =BYI{?@e}@hYA@hYO!Q3/YICoo'8>Mnpf!Q3-v]'@MQE((("+7632#"/&54%7632#"/&54G E E L {G E E L  H I K V H J L W d&/Zb@_  f  f d Y  Y  YQB10WVTRGEBA@?><970Z1Z.," +2#"$'&5476$3267>54&'.#"".54>323273#&'&+2653Hhfqqjijjoohf_ffabaahh]`&J'*H,4OHKV)! u[H^|5qheiimoih ghq`a`fe_b^`gg҈~~ ^~rZ^y1(pFd.QK)@& @KOC+3#3#VV/%%//%%W#@ @iKOC+!#!WHbd&9Qi@ "@KPX@;fd  Y W  Q A R  B@9fd  Y  Y W R  BY@';:hf\ZGE:Q;Q310.+)('&$! %+;>7654'.#;!53254/"';!53254+5!2#"$'&5476$3267>54&'.#"!= 0ARd2"-EK**$5+%%+d@=32#_#)!)E_#((])@&fWB+####.5463RTײFU8{F@MQE("+7632#"/&54R P P  X TV Xe h^Z@ @K PX@^YRB@fYRBY$"%!+32654'&#"73672#"'hUCB91(>0?% V`ufmP4+--hQILY e)@& @KOC+7#553#553sVV%  %%  %sU' &+'7'77ccbcjcbccW,;@8@YWMQE'% +5!7632#"/&547632#"/&54WGR P P  X R P P  X TV Xe TV Xe &@#@hhPB#!!+%;!53254+5673Hd.F.do0'0߭22M,Eq7#@@h_+3#'v:7c5B4@ .4 *)&$# @ ? >f  fddddY MOC32(" +72?32?7#"''+'/7"575#&'7327' Ky "J$'K O " ;!vq>@"!; !!  = hN}:7#E @hMQE""+332673#"&3tmmr3{zEIDCJvo]@ @MQE,#+7>32#"&/.546E GG  K HL  L W  O7 >K+PX@YQB@YMQEY$$$"+32654&#"4632#"&:**:;));LfJLggLJf*::*(;;(KfgJKggq^%@" @hQB%%+!3267#"&5467GO6.(;$mAFXye>s7/8!?DG7L7l(f3@0hiMYQE2""2++"'&#"#>3;267(aN2?B0'+ 6bP.C@0$,fgf)3ji(.7& !@h_   #+>323>32ِ+(+(7,&(&,&(&8@KOC+5!8xx@KOC+5!xx!^=7@4  @fKQE +#"'75'67'73256+! F:  : "\x17@4  @fMOC +32#'575"'75'7'"56+1 F:  : "\o47@4  @fMOC +32#'575"'75'7'56+4 F:  : "\1-M@J%$#  -,+*)(@fKQE' +#"'75'67'732#"'75'67'732o56+56+ F:  : "\. F:  : "\6-M@J-,+*)(%$#  @fMOC' +32#'575"'75'7'%32#'575"'75'7'G56+;56+2 F:  : "\2 F:  : "\_ -M@J-,+*)(%$#  @fMOC' +32#'575"'75'7'%32#'575"'75'7'$56+;56+ F:  : "\2 F:  : "\G2-@*%#@SQB$'$)&+&'&5463267632#"'&'#67#"&54632.9H<9K7. `Qe1<7- hU^fj&lf `Re1;7, iUaQe1;7, iU^.9H<9K7. e4e -9H<9K8.F[@XJ<.Z,*@K PX@YU QBKPX@ U QAQB@YU QBYY@ US))$*$))$# +%67632#"'&'#"&54767#"&54632&'67#"&54632&'&5463267632#"'&'^Uh -7<1eQ` .7K9<75&# ,&+327>7654'.'&#"#'7;27654%.547%#"'&';!53254+5!323!6732#.#""'&#"#"&'#)C9; DvUB88 }"5G17;9F\;;eVI8)2cd[!fa`gg`j\Y[42 2*D6*{H@Mz[Sf~:/|chj f3,nW\t*#$SQ&,,45Sf|4xUyIe]r@22`2<>sq|cBTIlWG:>Q"+,(*)T(1Y+&23x3 LtBJwfrFJ0oit<< -,  ˬhk<7654'.'&+#".54>32&'5 _G@@FsaGA? DtqppqtlmgTձ2)&z95rIL*+z82rTA 71&+ ! !j!f0^#&+";!53254+5!#";!53254#ffa`gg`affa`ggh332222x`x&+ !273!527 !#&#!#{;1gg>,i,>g1;$n25 [92W&+5!WG&+373#JUؖHg#<B`:+O 80&&+&'&#"327>7327>76=.'&#"67>32#"&'&'#".54>32;.& 1W3. /W; RE6 >oC:%'Cx0 "zCCzDDzCCz" ^44`33`44^g E2.,0R  CT`90 P=66 ++^' &+#"&#"5>32326#"&#"5>32326?v9<;3qI@v7@74qI?v9<;3qI@v7@74qH3a8TI4c8H3a8TI4c8W &+ 5 5!qHG2S(W &+5 5!WHqGScgЌ.| _< ? ϖ+B$Dd4]N~![f-PFp4Y%3-E&<-M&-T8Knl-lRu-nD" ~B9I42G(=~e9 9uP@^(  IU'B^sLzdWd<<]heFwNNNNNN`sTW####dd)OqT8---GFwweV0L0M90xWB^WW19^^^^^hfv f ` 2 v 4jFD4p !#>%:'*`+-.13F5j68>EFbGHMOhPSSSSSS2SRV6VWXY:[.]^`Bbd2efik4lmpo0opr rtuvyzzznzzz{{}~~~DDDDddĂPPPPPPPPPPPPPPPPPPPPPPPPPPPPnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn҂҂҂҂҂҂҂҂҃$ f܅2N҆^ˆ:^z܊TR>Xʌ\ҍLZl :; B;B B[ t  ?  v W I 2W W 2   ~ i Quikhand (contact@jotaylor.me). 2011. All Rights ReservedRegularQuikhand 1.1:Version 1.10Version 1.10 May 12, 2014Quikhand1.1Joanne TaylorThis font was created using FontCreator 5.6 from High-Logic.comFreewareQuikhand (contact@jotaylor.me). 2011. All Rights ReservedRegularQuikhand 1.1:Version 1.10Version 1.10 May 12, 2014Quikhand1.1Joanne TaylorThis font was created using FontCreator 5.6 from High-Logic.comFreeware'!#!tMO#?k}dO$D}mD$D, `f-, d P&ZE[X!#!X PPX!@Y 8PX!8YY Ead(PX!E 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #B*! C +0%QX`PaRYX#Y! @SX+!@Y#PXeY-,#B#B#BCCQXC+C`BeY-,C E EcEb`D-,C E +#%` E#a d PX!0PX @YY#PXeY%#aDD-,EaD-,` CJPX #BY CJRX #BY- , b c#a C` ` #B#- ,KTXDY$ e#x- ,KQXKSXDY!Y$e#x- , CUX CaB +YC%BC`B %B %B# %PXC%B #a*!#a #a*!C%B%a*!Y CG CG`b EcEb`#DC>C`B- ,ETX #B `a BB` +k+"Y-, +-, +-, +-, +-, +-, +-, +-, +-, +-, +-,+ETX #B `a BB` +k+"Y-,+-,+-,+-,+-,+-,+-,+- ,+-!,+-", +-#, `` C#`C%%QX# <`#e!!Y-$,#+#*-%, G EcEb`#a8# UX G EcEb`#a8!Y-&,ETX%*0"Y-',+ETX%*0"Y-(, 5`-),EcEb+EcEb+D>#8(*-*, < G EcEb`Ca8-+,.<-,, < G EcEb`CaCc8--,% . G#B%IG#G#a Xb!Y#B,*-.,%%G#G#aE+e.# <8-/,%% .G#G#a #BE+ `PX @QX  &YBB# C #G#G#a#F`Cb` + a C`d#CadPXCaC`Y%ba# &#Fa8# CF% CG#G#a` Cb`# +#C`+%a%b&a %`d#%`dPX!#!Y# &#Fa8Y-0, & .G#G#a#<8-1, #B F#G+#a8-2,%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%aEc# Xb!YcEb`#.# <8#!Y-3, C .G#G#a ` `fb# <8-4,# .F%FRX , G#B.**-?,+*-@,-*-A,E# . F#a8$+-B, #BA+-C,:+-D,:+-E,:+-F,:+-G,;+-H,;+-I,;+-J,;+-K,7+-L,7+-M,7+-N,7+-O,9+-P,9+-Q,9+-R,9+-S,<+-T,<+-U,<+-V,<+-W,8+-X,8+-Y,8+-Z,8+-[,0+.$+-\,0+4+-],0+5+-^,0+6+-_,1+.$+-`,1+4+-a,1+5+-b,1+6+-c,2+.$+-d,2+4+-e,2+5+-f,2+6+-g,3+.$+-h,3+4+-i,3+5+-j,3+6+-k,+e$Px0-KRXYc #D #pE KQKSZX4(Y`f UX%aEc#b#D++!+Y( ERD+D$QX@XD&QXXDYYYYDvedo-2023.4.6/vedo/fonts/SmartCouric.npz000066400000000000000000002634721444463326400200070ustar00rootroot00000000000000PK!mYϴfvfont.npyvf̽ XUe@A@PPQp`gD {ZFq}D4sNKlpHM&,˲Q23,2+nl 6wo{<9Z{ǵ{ǵUy4v$-6ࡳzQ+vsja::{egH& [g͝9{Af͜;a*x0Sgi ad6˰kV~ 4z 4̮ 3C$M7۬Y}Zi}Ǐ`F5yٶÌR^uRޭ]ܪ}AܪUf:sN1fl[__j0Yti6NKz =KeD'夈MEzg|'G!$/ߞRc1nԷB}XO;=R}~RʨIfjyyhޕfh${}bWnQ6+z5 CӗvUhC=?:kmed =JҭvdTjN< CT' PG f)4&".iMc@ Ʈ 0ha6,;bw.Xtr,tfܮ@v.ePQ{b&X$N2sv$TsSrkU5gN20zkFer^J)H.YLv䯵=TUqE=kjLڛ 4K~vECC+geA'w^t> AgH[gI:&8*5A_X;O';\*2$&>?x_i6Xi1{m$TS<l>(anajG+F}qqȸۉ-lz:PtqTC6ˌƒ &TȩW6ҍl<[cXw}J]пW{Zg \1*A\{"<ٽ>&#|/! +"? em^B8*Y7 0n-طbŸ1Pvf+p)X``]ݐ}#6%eOD=4(j*ɈA{ҡ4 Ѩ/fH@EP,  T h (jA@pe;P?(󀶃4|pt4jP]$JCHe4Bb" 3hY {GKri Xcq@JぎDB U(MZ)U$UZKrJId T T*\KҡdPI@ i2ZS 8E eБPNաwZRhIL(9P -W pt8F$͂r0PQ*C}*a pz#T _%K+2)aZg=Zۤ>krZU{]H{~c_\{"XG}UjA3`ZlP2ǔtY!4?uA8"Y\sŮLҕt!U6RBT Pv!;zWև:cY'>1t?O<^/Wؓ7!|./c!y{gM| }aә}ˇ{a xhr#' UEz3^1f;^cxO4:Y~Gd6\Odu?fXJ4~GI-Wt7i TecO=)^kT{g;Ou=(q+IG| G;os:c7ѝ8?tJb wz#;O:s=;gIjGCU"{R$Zރ.?~7N/0 a?J{'t/P9`B5'zEd@If@"r3%ΕFT4iבm2@>G7iqUqtOW(}5~цg1{jXkS 5jL4m) H 4a#>'kFA92OgAfg`)᳟~ކfЏ)- `$=I9/ح(I 6=$ԭԒ*uU)U4y|RVjUʴ-+X߭w&S$;~ox@}ZyZIS &Wgךٮ:T[$%rjO"Kq-4,&ԻJC2T7st uCy-DMn"(Yyn| }vZ[ɟɡ'G6=,1["_w"B`nh0T>J؍0z^ˎpDꏼƸadlc ~xd|MɂTuc*Ly@ﵹZYY4 Cq#<p7dmQDpB~|эN@2pgBOpGk+M<:KlI`n5˽4JG+kBL?46W6 a 22PQ5266 1aCb#&"t Q"@èew8ơ0BD8&@m4Q*QTNJ"5OZ _s3JV{z@օv6QRW+U]ۨ|.P;}L7/>d^oVϫִdS>3}cF?ZTZ|6lwX3D'蹧֛z+{߽˜n?[5p]6qaљWG.js[^i 6LJK 5hH*>i#u[(m ;"r[a -q̀n膑DCIh$#* 4hX(=*1j1@J!(&A \ Vw @Mx˺  T4 R HEY*"v*0~*ܡ?S%sUyժ׋^\eul~,0. ϶ڳP{M-kZ1)&/K2y'.j^Զs@I]j)cߴՀ\fsI>l.5lDTinͭ`dd ,[let+i!w];xoq}%SPۑy5y~LO>m61 & rꢹ+}3~jrŸX>#q'ҴPvV=v(i^/i7hAꃽ['lFÖg{p.4Rc>W֝l>;_N)5m v/ xGS4``]7loz¼#kվ.X ^wFƏCf];]݅]`x7;" 1= 1b4D^1h]1}툆pD ;979i8C2 ;a6ҁ 6̎qdtC1-#,s"䙈$@ 4tK1e+*=fyg}=yw8-zJ^ћpOt;I >5Н|wr؟O$66l 14;XM3 vb3ɝtC gtWPjt-E휧S<]i>#"FtγsV.xezK vRwy3ȋ^:cYbxa|x/>Ri(hD_~|G#[lm0_61qW*nѢ^DLe 3[{n5I6H6`-(Ec^` |M5_6IHoT#%xS4H_0f} ]o~0L ?3` pT_i>稲]ySTO|dy{k󚟪fW6|dduƉuJFo5o{xw*3wo"V3ZcrW6e6b6_BZqW:&@!eU*d>0,5۝lRqV懕G5EgCtF3kvu]ՏVgq_5qr'7%y짔)CF61M37-mxdԶP[{OlJx6kZѴsq?OY,_Fk[B?؛S;G}3i}s՚3:`v@}ԂQ0!g bgk0i7h?j~m 4@D~#@ aH9Xk>U{Ƀ|AfY{PWGЃf4Dz_E"A'YZvX(4I\ wi}1ZoUp'4E?Gusd"a,{VoI8c9P_Ep,ƿ%b}_|V"v+LeX:)hfDaOP pObGu5Ey@Ķssn5Q|+ƅ $ 'Æh:\Y'?t5:c㤃:Gኮh w^^^t濬^Q[뛾yָlX Kal_1;x} mmQ ݁Ȇ+0.Q`[q8E"w qڝ³ΨtFE hg@Ex* qơ8/ġjq:@sгUJvd01ogbwtIspgXx?=f,dbqpv1G\b 0wŘqSȻ)Ì2 e.Cp;\2Z&?5?m*-]rrRXsz\zP>+krQ>G6*JwEA AC*"Fӭ9$Y}vk7 #xI9P7(%n|]#w\8ͥ=>X/{rF(Mf&և3z'Rz=9Mѧ2?ЇkZQMRF1ꍯuJTr"jT xd`oy5 3Qn+W@=@жil=k +0.bcw U;WzMNs'p|==m!8#¼bF=@{bc -59kMAC r8yBXs<Y\uh[.Td4۩ }Ƚ[Gh^tn$}YQ4-#1s9F{ჰ<hN-//<"k@ {I\ݿѷ]ܿ(.F)SN6z9nAhgDiPsDD?FkF% r=}̤4 ~ث,g CX|0{m`q/|E:,v- J'V H ve|-`,}B]pb2<_Et )t ,]5u΅w+·\{* ',wp39֛(ȏC>{v5O2((rWxwDrbdC Í]Q [x-D \gvL` Os7:978TôuF}ޢtPZk>kЃ8 \(-d,2ڨ0ա' /jm"6je ߧ+(4! QajɄvnw[AKYIDHDСyn_RJ=qv_OD=Qq鉨= ."Ǣ/lµN@ @)@*\BSN(5~vJ' o _C/c_ h Pv@<rC[ϳ;1)zR(KSrD}}>'h?e\(wvPvO\?h1Y2JNMҞպkȻd=E7[K6Nbml!oA4rl8RMӷ/4*rĞh$Ct`#7J |cqkZP?DT2$wa|Yt629A.;Ww}.rt-p|~w>F8yq/Ud=~'?{٣_jvjEe:J_]& lڝH7h0m0A!Bz{=ߝ~Oa$z^ijX[~ @ߡ{#3*vZ{PbµKG<ɖtonp~9٪鿩.::UuS$m:R9LpЃnQ]/:tmpՍu^(9sݍƉ?7q,ڙ9N91TZvwt=YC}KDAI}%I"7qZIt:̃VCnڍt:"ci?B7,Вi{#nm ٸХ p3w𡼗˃l whŏ]_zQ6]>;Jd3f(.;FC"!)g[(77ǾfPKV:D`p%HL:F3(=ERf1bwrIwo*lɶ mˠO}Qg i # Tn_u(߫߫~/'qMi!2b+KmXkD@ob{(6ƻFЕF{wL.x㠍="|PEO|1ĩY2L8m\-lq#ȾlͥbsivsmlNDbrZ[ǰ~ Hld?ݩ.՟Qڐܥs>7r-[ާ>#}/X#WmROoa7B9[;l/c.(ٺ:(df wzTf.s緩wﳛ&2Ov׹U_pWMjmiD†kϩx={ekl> P< w/ېlއwtq}d?yylޖ=_|2F(&Y01F38qn;35[](uvO~Qߝ 5]_T}>%9fK}_:O %v\>٤ű7Fd^rXu:cVG}ޅRObGJZKZ+hzr#f=gجQZ[) =o-n`-e|Vmm۹% 9ݰ ;|}Y)vRym$ڡ[Zf@-]SpJCM$],>hS\ \Q+ Z.zrQA9;Ȗ#lS׾rOsw43Wuq1U\J\ja0*B AI&P]%~HY[[P?X'HOj-71t &! eq }rٰg& 8AQl@')!XEhO]F~KZY%oI4@[i*]C֫jv,h˹SƉ CIukc vʍ^`V -_gY=fYe96x?6 EK,]f>צ+\0BD%9!v]̂A+銠-+ +@\C*ٰ?.A?liey@dC/xs|52ęNX*% ?N@; s:0b*p 85dn\52@e08Ϭup (9.ͽm-}6 >& 4f4Dq~3ʱ6d-< s[3*_osm&o ~|~/yͻ|.%v]lǾә4sd/zak^ ntCh,AyWn@]== %; 9$ " c)i륡U!T!D!TmA7#φ˓>*<˰0` d V۽/~),;"y)y/r{v9$̲y9_ϱ]99˿+:MF}h[=n#I06]x*vX5O W> ZJkVQ 'v\Ey5lN6ujeN-|`7+WGni\#,G'7;=ρPl6т9;svv.Yf۽{WS P;hu6-(]ZAF껵׵.|}=~Dѽ{=[ XNHV'tktN.]m܏@Ky.}ȷKM06#]KӍ!@E=w'k\ݏ~umte]aar3(#$Wا`^>ba̶_]=ۥx {Eɭ,,yIPk>VfO{;N;bO;M!gwY ͋QWi8Yqv@<k7s,f%yU?K$P^o"/sd ,|rnP6d5&;nWǾbx+9|2|,lNAxAfh]bػt O'iZ$*#'uFD[_Hw:TZ_K@_@;EFgm"Yߪõ? [C!#pFh"ߑͧ@$3<&:n=,"lmє2{gJKHl('TR;9DARˉAԠf(lGU~W[hJpP{&+[o =P1>l@ MGCiQZQ>>I8]I8rk0tpNœI9>I`Z t*r2z`S1p: kil{y^A: ^ڜ܈|xfW`$u~:S__X7+cq&uu3l*kk9 F֏i#i6G#LRGVCn`6hwv};Y0[LϑhRFul_cSh F-)'׀!t~qkt5Tݗngl+ei[c1SNWf*srW syFq`Fdf3W7i"u쒯qutU]n?]r2L=ʾd| ߇KP% ?)ρZh l#Z-WWeC۩D4Z n\M? e?w^jL9OZqd39E glN.r:Lqqظӯy̍g}3׷ >α:YNN!g?W+WrF)C;#\׹w/5>\sCeɈ7]y$?lC-?σfo3ANw{s[RUIzyHpG[W)?*W+%RtZ2TD)t1&UUy\VJ mDQ %M=`4K'Ӈi-y)Kx;<:+ް)>ozlA*2vMEckiB"K1iV?@G13 v u7 AԿX_ /żXĢ8Eq bQĢ8E!5a 7/3v WD:sl?:Fhg`j8ze ZThY"7ƻ"XO@.q7]yCσZP]wX^OK1^G)~4(@I CA٘~h4gIf#g/?M!-cpzP`~/h 9s_s؃{Fpy[ '/ݴZai7ևKCZ;R_qU|uK=\9pe:jyڇ>Hkه2˞=%[ u0ۓ'p`#ٵpY*ʗM4bkaz>/<4zàJu>V8 ^~Ɵ\eoo(9|D>c飣\S1^em5 `w|S Wg]S|+Y>EZ^M/ OF2MCP=_b/]T_]5v7v8ŠTS|b21+=vhCGኚQhIGs" [ $~ ./p\?'A/ *W]&T..廂[/\-aDXɊ}p8V{he+$g㼈lԩ8<MzCJ1]JL B;ּ8`;n%(U W.h{ FڛmrnqѶUn'PFUJXP*XbyhwZoŞpwhsO]?e=kA'WLޝy ,2xc;6:Cy g$(>/"ynٷ4zL%"u|M\W+OtWi}49,Cn@/=ü;M֐F=V=v/[jY; 28 2#QuS(J|g)wOcg9Þ$X_rؽ=} Ҙi7n1eJ3ޗbw;rt{\&A,ExsKQIJ9bќ5FяaT,xiԋU8q1y]')֙Ŀ~F8ǡ'lgӯ*ҝ<#~\eeyW,#Ol&` #;ﯖ`lv3  Ҽpo2 |b|oy` g1ty 0w2iMf>jjͺLKmҖD=}4g?azie8@>nj]a!_ _60L:gL͓/\Ո#Z4hc0 <ʜq:/T<8iCM75g{j*uȕT5T{\K bG'_v 6 6۴!<|gO? Y %fyI{Cam WN6>|J/ZKB>hܥ$~PUOOa18EJIS@MF2IF IF IF$ɨAU~ͩ-l~vrO6&u 3{,@(@ TAFbl@h&fRILM$6~@ $O$vuۖU;ٽ{ϲJ[Uj6 F-! l_#Xntz(˃d1@.=z~Kh tfc!x6Al/8;u<|% JN>?0k=_߁ w fؚTjlaT\Mݫ]Pk[5SZ%l"ǔ(Ϯf}X믝Rzm-SGYxo*{8T{7h`wvtYV)e|cՖ;Z<f~eB[ŸO jeG@1 H@dѸrnKߥZA{)oL45L(M]2ʟ3;:sA 0;ּc杓\Jsm4\6_Zd"Z-/k]+OZr;dN `PVs%5(b200a׉ڙ 2QB˰/taww*Wb'~Xaj Agt.,#(|:f '釴3ˇ=#/0샍Al AjA!> >cH[} ov{]9ěyb apO{0}({_UE;Rwk!5ɬ3 el3pT.K`(?MoBA '{N>>nbH[~!m-Lnۨh A A89^5Z(};#p $cE|h/S{֯"DB`^>A uG=P*#PZ㪗yrGړњ{:}y T6WCZGedh8p8N)$a>z 8!ep;83mBks18كSқ>Dqz'@U3l@)[ygu! 1f{`X+"?6y;q8GVT&GvVvv!mZbi$O zW-Q]+3ǝT(G_k׹a=_?VBIR>#.JMWoR|R^*X}I+z:I'?˫\s$֟E0 aX*_2?K} t~7?ˌzC,x֞htp;|s)̭'>yN [,ۼ^#Zwwv'9&@1cW ɵ_.h)); ; a6i;A;\z =*Wkp=$۩:"=U-%'-?i/˜Oi \N2Q#h_z5|ɕ+]Ѡu236(:+lp{ͳ;Yy3'`y'XDY8eu@}@$T_~ZUhW_>*"*bUmn0v[:US:U3g]W6?AO0K0Kp%..V#%ӝAA9Cp\Jf t n(G|EEYNgt ͢-[hOCs^Ԗ㶠af44 kq}Qnm}_qCݛGQlm Y!;=DHHȞz*Ȉ(UUQP7DPAQ^T.ޮygΩ+b8Z㿙Bnݲ}FlgI}fs93$itAZ8K; `t ,jQj(%*R,˳8L>IZI"YA"$.AN;BObIt\{L5U%&;@ؑdy ]sUTRdfbdHh@~YF2Jy/|X452Js8jeRtoy953M_5UKJ`L-WjO1P|gg0L""& jL)n4HA\?5Z2n iO3Xπnf[XCǨŷY7[oY-{::w"m+m Iɸ)n(QU*k4)oTCnB'K}v+ (J7i4J V@ duotŎ* +R^'}K{Ϧ22 &0 ˧H9 KzHۇtu{=ķBDx- xk7lsm)=M$ Do.r:kJm/QZ=ֈ1WO7K5swWUgMYk`6eifg5z?[[]Qu/ړwhRsV޿ `S=9ۘ⿋όr)(Sӑa} P&DfwLIn^A 0l 0TuZg{)r64А[avKKAq}sHs; dBusQWd|<<b.\Q4!2dP} BJR4naH͉J< T?ЕΥVj%JJrԖ\ ɮRa9^v%!aʀS _42h|e&Cכ dxvH3HÓ5B|FʠA+W2DjggE= 0ڠ~F`_a}snw0/Rs>GJui RiTyWx˿55ͱ#ަO)7~@w{o"~I0_x~2VE|*TivqpA8-zujϮ0wohIZueAH-mI=)w ^G$2&/l[m}n2?S"*m+eWld1>őeru{*ZVR6^Ko'0X~aeZuDM Svl.̾b{n[QY<"g[ 6="{Կюihk~L&X0}z+vC9?-V5ROB&!ɴ-dS'?HW52E*–%BJM'c' B8h<&r<$Rij{ $i"YRך.886f,sF:Iy&Չ jqt4RJ tLCé-m1-a0\pkU)_bVQK/ctX!)@y!k0CnP3d$ε8IULg YuYeuuKi*#.ѳZʿ!חr x,eo{.%}rcEwVzzcZꓛSHO1.BR'Hhےvr8>˾!-UJ̔ +x#MnB[x:5Eh#5T w΁)΄Du(m`=hrs16"Cx< x 6IJbȓI0a%AK( 6.I |rUD QB')I+ A.}W8o <ȭqJ؅QP;GAI썔%B%[AIjLoǘޡT ީHCB4K,ƭ\۬>joz;2ҷo=5}kl-?ۈgM5 lߑXoUo+`m !{O+EXOҵ`4=I'ڃ1\օBVĔ}YSF*cmy#Q!>-yM|C1NVĔ} :n>'(7Á7wm}wa4&ǻ݃72󑔙 |Oڠaa$M`$Ƀj6>Œ<Ӟo#KQ+Ads7?}}HN*|'޲7QDo}kk6qI{>hGX~v=A<귤=V-}a ƚEkUgM:n5n5lF;=r렱 c'YNڲ߬J.zE|1lÂuc1oc~C DJopXX JB#΁-D?Da ' ͟ȋrb21 x3@4Vr$"Lp+ٕ=&g|xad";iOkv62kڳ+ek(jr}ީuJxWB2\5FcXv'Vnv}8ZڟZև  ?sv+H!zE|şѼ1-g,9՘rgk[R#W̪<ųޒ~F@Jm <ץrVɲ|)6덅Mf~Bk.*-}7UL{Pw>u׭ oս[7s}ߡ5}k?WЃ}o8VQA>ZvRmOt{Osʱ嗗Ry0wgVw`́&XޒN%Ot>Kb FYɞbCyw(R_ţĂlbv-yr%-~:ϻkMӸ䟟3Wt혱ϻ5=_Į^TscTUV5OaJTaFL 8JDJ+H) 8mXK?:C[@44BwI6Fҡ`>ojK'Z{7TCoCU>3Slh0T3ڢvS>x'q"PQZ8:Z)1818HZ䥭Fg?AԶFmUȩ-рtDHd #rB-mL9H2AQҋr`,AzQҋr^OmN ć̤A WU9Q0C#pDɕ %%,< p\u1B$z/w_xEw_.'ZF[ 羈z˩q1mWS+!/j5Qk!FjFDQ먕>bG\L tG_AYʃ` ^v++Fhbu9ޔnɯ'k.3=[8CoX͵*!`)^¿q-.bxcY6^b7#:{mhm'Þ',a56HLy(?O"ʧc˭&Nl|z1Cf^1TjYbH;ϱ"A՚m; /֙%̫c"뤵[wXY5~b?lL^ҹMƬf|[6 /gmؗ@vYb1뵚_{o {|ݽ9r?gнm=ӟӆjyxcu/x%`Z6:@;Lհi2JF:^ l4|ѧXR¾PtF>4 rhL-r: + FQ P>|F#B{G Z6focbR tT Mi BVa h$k!NaEp2W O^ AS4'#tZbq\Ge)hT0,Ptu0| _σ<䧷πgSV͒~:m%ßtbN߼Zuԩ7ڹtyZeĩX~u>ΧvmG䩄_| vV =f*9yOzB)*s L2h#bhI,ok`kjjOhOЙERAoB-R ֝Ncz}xSE^CLo&H~ E'ͩƇf#IL/Ԗ rS}!ZO_I-~-Q]멟oUF7sѸ\>MLrtqd]VB$ Sߚiu%T.g+l{@,1z_\Ja≯YA[/E5hg,׊k=G۵lz+{_}_s"6 zAI.~zIJ)vG?KV=4%5RNl8i\DGkwtMbo5M:s>_UzOxt!oo)c'--7Ͽ2zwi{?C;I=fKYVm#֔[IsY×XPCz1.~9-lY\mWx}n]e5-I}T%1g06 [$X16؝X6ʉ.ҭ d'ѫ>@(H{=Y,p].^gŌ#E"O7Mw~5M^Z_ÉY`[4}bk( \3*LK1gOv9vpqv@نHn ֨8-EְS8IDYBe#de  <80_M0 r"2<=Qc-F.E"~|ns۷T 8>hSGYSȇtHWG+$m&{N|d=!@uW[C֛bw4ģd$_of73&.f6]oݻ7;d2S4w*a~Αw<>{_}wFze$ly?`~tOjH~Ɛ(7Ed"O,jDăTdFa|0wYs J8Cvpǘ5p @s" \iSU|B5|"CC 2l <8lj @tW0$ ?"NH1 `NHx FBLد~IBoj0BHx#R;ąBdj .B  !8Bp(P1Ŵ ){O O5$ay0:&TIQ@폠b^eb$;ؚ{LJLP'^oϚo{ivWq=)2b[7f.l gS#C7&ȭP/*H]([6EOx]>cb䣑ajqCl,&<=1r&ĸf`z-ԓ(g`KgI_fE}v=yq=ëDĈ ,V$'،-?IFyA{^l?c^{ERʛh Dfun"-/о զGc-q1Jdf|s +ą;?'vgF1+LޕF8cmy0ʜ%lܭ#N#NqaE9+KEO 3B"'t DY2>BCz$2{2s8m% 9(?"AFc(X8!X-#Wx8Gb"   ~f+CӫW\]ޡ2p?_iG`z~ ~ۗKrH{=jGX=4o4A6ٛ1sXk7B&y}MIy}-uNGep}#n$gF3&Nj(:c(ĸƜ-n*\kIRҰrw:RlR`Os$xcqS뉳ZtzѝzdQ Id=4W݊pzb8:+~UMIMhveDJ+$"iy'$wtIJ őUNMD';Ifco?ވVշV ǣs|\F2DB5N;~]giU M Qxiٟ:Ix$'2&u vE8s mݩl M_#ΔG` v,lviV'#7TbɹV:ʔ4q)A/8Td1S3uqjD:ș:^ԅ#uzS}$mۢB&)mS8G.jG찻-Pu9T{ԾTtt2ΖF'&gP'!ggOg$҉ԈwS* &L!i"AS+EL0&(+~ {%FKp!҂erU[-W[NCTh~ҷN+S/ҏi봃!zzueXmQKX-_\7&5ڭjd~Y{mmV:^7ns}qM5mkjV=^KC!YwlqSHN5$SW~:<(*C5V#Y8 re pN&F[Gu܇yzģgGխ ܚ;Dn囩I }=HwuJh!D  |GI sTNwSnj. *+Ɵ%1֍0ժV6ԙxvyK1(%ShzTp&oVd!nܘ QP цuMIK3dm3F,D#kgKX!̲ه,wE@fg"6A S[oZmd]m-γJ\20_17[Sit}}1mor5ڱ&=>q}^[‹, U!\ЙŁC&08S?T34u g*\J0rbLKIyqȠ/ :UCĽa̽a 8<E ^!_K#ZGtzDrȗ!Mn;^M=q"]d8-3=63`FcaF,xEѼfT铌l-EL 3v7%ܡ˝.w Q?jtQ}+4F[o;2PF6=Y[b I*R::pmMN*Y`529)[J[/8mѭ5TPqaȡV=`tտn=TT+ʲ!0U~spJ]"ݪ?b&cKrܣ5p!n4B\G#u4bFTÈ8:%p{q B[иh漈QE+*چ"$ځA*AC bJ'%1K%U%졭W?#GEGsJPEQ; qSI5 Kggj(|CTQT:!XKSʀXL {"Vf)ڹ)ƅX@Ll=hw3v5ꕥ啕fVOײ5zwL?_d "=?y^y~)enc~C U N;9+J~߸~~wXFgOīpS4Gr F,K _eG^AQWtntj7wtԝ^R28N`j7a;XRv``SͤjE)L0L0L0L0LX2O Fpd<,Oj-EAT]aܡZGz4=;`"`F,6XI5ZUN#N=GfU`U2QUK^ ZRѕJZ,RdFR"&(E6A8H$Hfse`e`e`5 >ɾ%`OV5*&Tӊ >'vd!=*O qB.$kU'yY'?c2>A~WGQG'V-"F'{9v;{F?b^}]!'}Eɿ7ȣ3Rq|oJ7Eޏ=;=y^Z;Of6/dأ/пѶi7hLkJۢ}$736]*h`I`u;~B?_SDE{}FbҞt|aɬ),]cMa]yXgw:wONU'F&i$wlo mO^O쀙h5T?W9dτ-<㼷y#Tnvљ?ki`&be=h4FmZ2CکʹnYľzZGu[{$7r[[u$<$Ea??ɽ 'Ki{_~`diõ|y=Z2˾^Ar.Ow!s7X w Ir$VAoE&j1a"~;ƚ8-|+U<3b5 'ֶ7l %&:nK#˵ }"p j[C)nkV\:dJ[g0ΐߤ7R~E ȾZI :,,,,,,LF} 1pQ$------QPq_`s`wِ!eCˆt 9;\H2<2!)N0Ԉ]Rŋ$f$+C@J%*ϒ!BD yWMX$ f̮7]o`s&WMq2]5$jHtՐ!UCDW ]5ljIۇ Ffyo96;1(˓X5_[Fg݁ZKUޑW@\/2*^|/ymo7۽CV7;ZϬX;ɺG{Yхs=zsJ}1=hX[llE}jb7`]`墝'F"ޜn!n71^?S {>X<ʎ$Ie{ODsq1\lea$/;Rؘо }пJɝokc}U*T5OyKfG]f#Ymgww?.F렛;:QS$ IW3qXS3~ bHWJ0S^!X;ġ92W*w!Pc:gПPwiTNMuʀ ^a M̆I IYGX:t ct g9,,'ԓņ d v(.TVсQ^/Na)1bH! 0"TiϛBP3Dr! C0jPd>EP<VS.B 5av}(&Ϳ߷W A;}+ {}rܗK,~RU6SO}ry kkG۝ |+*G׋v+{˺GYRQ]OMf'X 'sԬ3ְ2ͧ/]!d3^O[Fg>s{ lyf.%4jL{dV/;&f틫?_ 6Z7;ڛqc4>qGy 1g+\+%$gK[-CP.TM(RApgGU\V4sI̮W"Tb;$w22C4 sy *f@+u_YGE;R'I)B22-c~dI22/L8R3fȿ N׊8eiIk GFjk!""Ib;*B*TΤ,웫|zwkeJJyp檗9]L,zߪK}WgoRR7֍YkL%k_sH y;n$v5z1̘kbL4!6l(?W ϭTI9 'Qo++SIm9TˡCa+k--`)GϠ_ʉfӃc%hbMk<6C,#! Dm lW` bUI|?d-{[/ FUsq&?=Ŗstf?GB{4;__M njȕHkl_9VC"&kMA]A{bj&VC{0IȖgZ4I=xVb]*ɱP%FI)ŚZ(ᬑHONޔ;x5Jb̧\G?{2p4%%}|f{S|('Dǯd*_ߤHh_R_rsՇ֮y뵿iQhuUG'=pБ G 5׺E޷yZڔlc2dc+97+lɹg_2N9F[#Ƥ3U|hGJZۇkӯOI:C֏tJ9b).0q8)X"WFzoP1v UNt$>XP4yO.TuF!C>bt* ur<9 d9 lQCGr" S[m<_ʣ0M:Gyf 39%{*bΣ/w $c-qH__5UgX9G OjG?ɕ'`!I$&ф&,񅫀/\ |a)GB*Dp!\pB*U9rITLiFrAp: 7#f,l\(lHI=dQ# ~Bekzgh8)óL d8vͪ[ri՚)fesKfU\Z ]v 㬎 {z_Od?MJڜcʸiշ/p"d̏AϰDniPԕ&S7$KV!' 2Pd4@iP AJ:NJ0 3 e !NXT$ d@ډC.S$B7ū%oTQ NbjR&!G2'':ةq8 u8 `EE9EVx5`7dJgFdT4JWkT# _JfA yHhiHhZU!a&mI٫BOPd*V!= RΦ-k@ #snpB7XQ"P%:KƹX1Ce^®f'lzPco@.:z7؛E(K/ObyjxӅuo:ed=YYpB瘿pF2Pl ߄i/,Yf)S yb/7_J h1)䯏jr]&i&[%,O-,d0DH} IB2D&dNP*w,܉- LkdA˂L.KG1a$ 3H13z JuƄע(Y8T)߹ݛۜLOA*W P1ǦV )^z֯LXɼ̳J"b Ej"9%C".1ήAP%p*MC}J {-Ia0`~0L? a""L2 LrIPq I^dWr5t.AW*/|i%z2s>IF޲L4߶,uCO`/qheJ8k* cv%>17[sH &?B9h8(BjGHDtn|Ͽ" W*Hi@]|o41H=CO|\j<'p8KmHqBzC|2"=r;Rzᨉt5 7N "41bH 9۳n:䀽䀽䀽P/}Qj}aHIɇ%*&>Q0k#duaFMnZfz57KڠK ͫ"6 GjQF #[|kuXFO;K/dWl;sOW_"y{klc=zY;}7h|bMbBe֝/c|@ΓIі$vBR4|+"WĊ\|/[Ʋ$l372me<5{ޥ{KI |/Dŏy0mLof,1>2Om&["cу3(>eD~>+xւab6mtaX'cص,Ƭ2wVttɻsŚKT4 ?{oVFk^;l߼=K0vfhW xo_e{<7y6{0&0֕P;)nlMg1>RڵTE4YPu:* %uRR:en0MeBM(R}"|$ɂ1IѮ`]:iv Į!v Th0yԶ t+ȨV8%5zq8P"!0v >H8/ nq>& ق!U8PYI_~@ESkȲWU\P[SyևlYPОպ`"kTγ4K#&/7zA`C@l6kj_ŦeTM!5?Ara'~'<ǚ*mBTjeTS[LaQm{Q^Q7eM,.Oϼ=7}}%++E> 4oI n=&اp4%d>!HYn5Cdn|+ )^ ϞypY{#.MhG uM>4}j3K9(~Lm'9R@i*5Be;4 ED0v#Ʀ890pm'PKWXZ*4Ke至iiZYRHU>Q1P7n*hH' -ܶ0:Y4pᷥHֻd LTa|rz:O; (cqLtB '~Rjآ~ͥF]hh;ϳCiy糲g ͧo`_OGxX-C;dXM0זnS*V ׼Mp(2*f?Mlݫh< i;goV|³,(NzW&y~œ5cEDXz2 VT(bٹd6y'gH0+ҿצ+'"}Y-ٵ^3_EUɮWDgz\G 3 O2ޯ v*.2r\CgfF.9?du<|*j_F> O*Jiv.WѬ:xM1 DB&4}gl9-pxIX"8[F¨ NK^-$C$WVqeHu!.Xw-F#o[k#7a]`O;VFB[Fk Kt4$ f(^;26v 66o"+O||Hv$Sdyl=Em5-i80o}5PzĤKoTҟO;9 +kyEL8W3ˏM;JQ"ꋎO&[ȯ 2366ѯtt؝Gb G|а_=[s;>hcÏ#DBj]b(- [b+[ru$r_ہ^LQIeM:j#bpq>1WF7wH=N_% ѨE㴉 2zSGO JM*j{5a? nXޫJ2M@:ߏf/ 5h@ "W S>tmk[6胍b]T,' JY `DT>Uu$Mb###S14SJ*6腵b|JuF}ubT BlBTgTO204p_ Ml 0C:ySR'r,[F{ޟt<*jLؙ}ņ: ƅܰZV< h𢡊("ʉe"EUʮ5Ѥrg"/}35UiRY}n絃z8ՇW4c,"ZҌ t?{ !C{ˣ\&Sq.wvHOOd!l?p46|I"Qں a_@j%!|^ NHН]ٰwx ܛ¯Wxv>Cϖ&:dz/Rے-iU[ZAOA U,Xq!Hd:Ta<ưxtx,my_K%ev΢=A:GJ9w#l0jв=>sHH9K6dl@atLSh;ڌ~g'^f=y> 7c~-9L1hA[R@Ϛte^YE]4]Cl~?q3By]tFaRaYDߩZ8ؾKVTwS ngTB("n2ĵ[ek/RQ۵UsO%"SG%nq1V_d˞vnCކ6tlBڞyDn'$moӇa&/I &kv1Nxt޷W쫙s&_K5s{&(|[2|,`|$8Ⴛ"?Ot8?" ^]b `|k~w[~sbHu[ `3Fg {*uŞ_.DH専KbPAAAAAAƋAj (k # Y%B{Kd-U_^6v7i˚5/yHHec\c pN2Ͼ" A}kؽrF&ѽI>RA{;پ.vU6KxYWdEK: _>O&' uOjҭ{w*9BcS%uNwrJGFZC1a=X +T# $\.zj|dY8LpdvYXruc?osвRam˽M17D; B3Y͚kЭZTBU<瓿 D »0B{=I49Z02IڤaTNMT 0Tl>QC&s/ۡ".:m`#nZ ɵ1R10 T5IʁkC-W+CT|ުJ9nj=*2Vbce\DERLi!#0B֋e@e`_Z"ȣ1:v FhؑX%GŽŨر;FV$@,d4)TdA)X}6xD,>'3!@8|8QlXWX[bZ<8yjXQX;}=}'Ea|wE?eIB"&('|#?^T=<_qr ޏ'rևKVKi'$}βx 0_٬ ^ Y95cX(H?&If10CI]0>0s/͇RQ4J9-vjDeAttZ^>G1f+l 53t]a^QQ7ͦK#It)=G7Mͮ[ȳd f8wNQKN-M,5ٵٿ&xoo]GlȈg:煹f7v D71DT'b+z`+ڽ1v2\v'[H+|;{+=Q2d>ێd7=ۍ^܍lw+f6|Nj4 RWۑ^&蚒J]\[\cKޠs.g>^cy>?ww^SQӐ-u;~MdAXpoI&t nj]uڰmXClI*rI*NE>y{v7*Ҡl]m;bխ;L?o|eDn +eDcKkcTQˆj+,r4 A,bkPQ-*bUL@X[c% @`T: 4L~=4-+2DD<ՏAL Tf%! Tⱁxl`Z@ė=&s#.w\scBwlPh&|,xON 1&2زbPV:3a&<-TO/qЅ@ /*Wؾ0`2 2J2]p} &I|%.1t [Q!깃;JL <KK?/cKm|xhs%DЩ4>Jl)`i xtnjh6];z/t} 3b_Okpɯ`@ɗΗ<v bބOc7l;2 77;2혶][xhi1k`$[φ|s1sw^{e̙` sō=+/yc/Gn#J G8~thdqi<*(qxm={stlұuGr?|] Yj~j3vK] rVr`W} {n*z8<\:ѝDҷϙOunf/y-yQM^M,awd' Iue~u相v 7Ad#H|ʟwW} ]kt|إXn ÄU] jᶶ[)G"FT';t,9Pgw߄,QEؤ+GIm?['{DI';hvue#G*:#%H$4hDD 2$HtNl(Kvam]]{ _h=}=e (GzY=]-ݦr5b 2"u Zz|!PŸ́79nsܤUdcPYnPXmF? %( Q^}<#50z QLD 2FIQc"Dyb"ʋ(+&b"8Raw!vV1H;.}1fKP:|YuˀFG af,,d䜂s},do_M70ʌ`c_^z6Q%iqGy<&Vse-B?Uw <*;īC+Ή"Eċx_PoMoW Suw݂V;MW6t3ԥ%qmµA+KCP RBOv@;at0ɓ`cKchvuc\~(}0 p<>^= g} W.{.2|V,{֥O8Њ} (3^78|2ԚީD{ž{Hѩd9y^i<+$⬒殷\.wf꾅wؑibKȴT!7׵ǃ5qY^u诌v%dDBuTUe1e=XĢ`#Ul@\YsIbSSա" PJBDJB+ $'Iq%H&bT #ޕzW]Iw%ޕ:WIG&ĚJR1\ƄØ, ڗh'V"k[e[aae iIX5 뉻UO"h۵,ʦ-k'YtxU7IA[qԲ8jY,ZG-αnG;II#V=eyPA;݃vu-n33:  `3p;H}ke>taɪ.3K2 k ,J_ U@r TVX _X 9{Xtc@786 tc ͎{nq^a}nulzہ>xvC@ta;΃oBr|ķ%v R]|n%!XBw8Ȁc̖F7"LҏknaXkOe,E F󌹄LE,%h!Rޕ7!d R2!eBp `A ` T}"O@o}0)G2(W %:|XcNP8)*# P~J&֤Åm.!.%.!.%.'XO77n\{sF[]ֽm@híG}6qkb{S OV[2cg1l;=syŒ'ao%38r OB:ьq7~X_ MW֖/ 5^㹛'p8p [*Br22˽۝pGGx'4S=TT66b٧k? ncnK%&<0ar;^I[a5#w"T ?+5ǰjTQuRGlF-JցbW{칂zOW G{#Uy"keDL&!A4%$`xd 6m<{gY𘺅-|Br|,16V[먵5ۚI,ܛ=K餄"\֗H$I<|UdSuŪo `Uo)'jcEeYюaV'u%ɺD?geQwU5 x_c#%A}x56ޒV )%ҪTY #cvEMoij#Y?K05L\ɄQ_UȾ/P=}+`F8Wjc`\6R`%d¾ 3}&wت'#2q'#2q'#F+8eބX#q-gPEF1fNS'j$=8 =w0cc 8+%Sa4 : ρ̅TrkVՕn(ꇵJ^υc,RtwIW)WP.$ߢN(, <Hwc\SΚa$?=$[Ze.m6J* eQ*SɈ4g"B[o &]1A\JJ"u ԓ$RO%={癁}U1SEeRbAC0~$#`AQrwocY9>UCn}~_i^iS@҉L$)^$1U^S8EzJGv ^BsugpyMD}RU_3GZ̢U 1Pʃ}{t*Wjɥ;KO‘5n >kv>y.^/Cf0yR'O*j9bo *=!ȅ(7_=(1%0\vbVSUGm'4{}st5WE}єo \}lVպXljF!uܪʒp*!2 lǢ ח}G4;*#?kp.Ʋ;} ~kg-oɥZ`n y֟ڐ~m0h5\ N6sc ;voHb?y?йt}'0?4cH/zƿ"$^`7^`=@փH |f/^#QT#+]Ke>5?/&"]pU)>;Z^#Bn.x~ς%//Y{af8Ѭ E3VZ?-:jVJwCu+"Q4…UV@ek! P%xٳ c; ]XkrKw΃86I2 8' jFtƪs~C ieh`4a`o GFuV@4d;EGo4ezQGo4jzQFoѵ.,m&>㻂3LۉllQiD9L|8'gZ_}T?jRe 9mi"Y3q1E68~CYBGXeX]"l%9^: vÞW,к׳)0?;-iZT7;=M' @߁=OOџ'><^M)7cEZdp1F8~DL~'R< >^[1k,E'c6dHR^WPވ`/[Ż∘GH}rֆ4-BS:'6~7Og;yC* i16YF#CgWhXc,dpUwJvqn}(֏Pi!b)!*i0PvZ تUN2PUЦH*C jGZ *Q@D  4Pc .GŠS#%b 1b!{WU$Œ|_;v |g|?x^OGE1g{:t0Ay̐Z鸜5Te#.duąQ.J`w`ȩ\Ӱ[cbڃ&됛@ &.WYXM0 %U:oh!Z*l)CbT ?ٮ_|x׾oM5U8Fak3X::=Mӫ|*]{3[Ӻf)h[t<¸7׼n5<8kIߓwߝ~wSyO=yZ ;g[{$I(ޓPaeĦo-񿶴ݷ|𾵶߷oo};SԥuiM2Ke2c>ݼ_I^!?齌cz:MߤR'dAPnAސ!-H*MzC &Ka &FPQҜEttmE;r&u|ȩZn9OM8Yt˓Nw9}@WɧÎ~j]p+˗\ѯY>|qKוo.|mkOSSO~ZQ^Qd'͓'cOP]QwxR|A]x]:9mfdggig?hV(UDb|a=T##cĂX9 5AY/#+Uv0 `pF2Eg0r% ׄPiˆ8\B3 3 (TPB:I5:8q(NPC2NEv ^4늬Ϊt[CݒU{*V]yFE{\O֝F 9Ex0YwtyT΂Z_;*ݤ;-!NMxI,D(lQ߻k~zY `-"d-gHR(|?eY XꗟXq5AU׶@"q7y(y(~8*< S(Jl2/6M", [w^{~/sԵb@hЋz|:['qܠw<Ɂ"-DhnV8k TzJ,eUR_HrTSƂU|+\7e0jc\zo-wP76Y*}=;][,atyX\diF!k ]8S 3PKK_V⬌/@&/lo뚾Coּ]Yb=ؾ}ot<Ɵȧ;>>-abR ;0 &#¬h0IնyfE|.VЃPstge|ٟTDTEDzqUS+8׫3_?_VJuƪdU7NŗatY5+FIG$F,(d)am9eVawމ/eE_m{opKKŗW \:14gYg2meY@[ u ^5 [;lkcЗ%r7k?k/jr0CVsz!a~77LRdw}DYk{i#RN?W^_ EGEʻ| |D<-y?-q'oi"DuoxW/vCΪVgaQYo8Z?mg ݯiփY XjGJofإo-\Ȝ'158i^1-QXiϕ7(Os0>Ppv­C:郮YGffmN4}exKo7Z>]1jh_a^-4j< WCD]H3ܶ5(=k>KUkƣQ▖mm{˕UΚ1 {6aR:+cG`i_}.6 5Ae"]ŷ| bUseH |Jh.. ֳS,e~Eof)?tN->4|wys`\g 2gl¼#ݏ=J-\[{r?N#Fmmޫ_?֧mZ=q-DߤjZ'֘ gSFϲ=7Yg*6lrb)nU/1JqQC/Vwƅ?ӳFݯqKZ1;b6PJ`5cX;+tJA|JA?5_e(_e,Z8UYm RD!~+²ŘXB%]Xх%]X-:60JA?9X{T`a 3`Ո5,hYc)?kLƉ舿Y&`hx7Ɠ1Sqla4kMgeշiu"F;|ӑoa櫾39KM8fw#s_vǺ/^^(kȱakXtIZ}߮?:.9X5ծh+րK X8l;UKSJ/{d5ћMݮZ΍g@FF ҌS77/̋杦]%Fw6[ˁ_r>s1ha4^q,2QC9> Z!l+vaap~*]f"ID Yk,`F]@O"R,l:|*{`օbX5Yl$PŒY 1H4z' CA fÙt`&sӢE>3W?)~, blD|.|[^-c9;%A"ϳ| *_ 8$ÿD,w/mA'ڂARFl?N t/0:^q8+%Z@ ! dSU:i_K2{2$5m6`AE[m-[l67Z^U>vx.C-Òe3\zU233p6=Q}Bafa,D,,,*wP\\E]3u\\zť\^>IfnlعF1㹈۹๘e@eF:O&E^JBB,D,Lς4`oŜĺb.$e,?s0|*s1|!֋uh t PY~7,OrҭtϽOq7F50 1w{o:wa="Gֱ:`7:6affoFǽqc>62}+oہnxFob{ͷR[a9B ?6ݝJڽ0l&Sɻ $BSO7ÿc^Ȗ[Z#d!'F3|Xb|ռFh|Iw!Z = ̡}%w.4.Z u5<`dϳ|ޓWl7դ3-ed5}f$|a10C`Iҿ&j=KbCk`QҋN5szZ}auMr9~v4ԦkI{^PѣJlئF`Ѡ]q|y<,*4.i_[jX~*^TZ݌;fUUtm<=T?/5#%E\i%G{=RRc]'ۊ<2;E6K  X;1LU|.P~"9ZYk%rTg5"Pba"P/B`oUb q{Qb q|kmD!z79m6+"[6.qRY-:R{|qI+J,yRAz!R0_tVWm,"ﳇyMx~ǡx]EMr+gYx{[x7x:-v]aG2KxvgꖼU%kΫ[g9˭5$3uLAAZV,~kAuiMHc8pW6e"VP3_V,,mf3-~[;F}m>^^d#;օP5hOx=M_ɞuBف\aǞ&mHUd}~7oo0 -.=3-jm=̓{ s^}<|{ ޳#|c%rSȱ? KO,C߉S1Vջ4VjhK.\3,ECsK^R砗:9L CG}be5a(֤>SC*P9z; '9~dڐl"A;Rl!aֳ$}1=Ym~ gcT= 7Sͻjʣڏѱ4؞Ginb٫yOG4GJ{h5Oz~ɛ6G2EՅGho xݓY#FGHxLqdr2%PHX$E<#TtO9!?S#*G:> AT8Qq8QQbBO4U=zb9"O^է:Oc ;r΋e:awqXiV9~VopEn̍s܆qhU8iCSzFMT؎/AׁE{a4.SBdc8I1vQ[#30jLJkzoSO`E{S'Bv|Ʒ$ >ouQ+ opYX_W;H x쁣زeʆieL~\Vw%9^ o7_D8D.[>Dx pn|^YdsvtTg2XBKA9ZeV>I&VVI&V+0 7_[?/I4 y#z^ڦB[1%HRpc$#!4+\^qRPk|͂Lm*8˰^k2Q+\Y}Mk`r4^;v$"HDڑ#iG%ގBx; v(QqGaT(3 8]Bߗ_QB_FM!M u'A5,p8jdMgyZ{jk3pzkO\,88{QFIzvx!x2"ɧA(D'd5ȃgi*ה[b "Kdo1g/سF.1*Uf5E $F14-c&1#y+U~rzt=`:*qH/2&ˌA,MgmXc68ZϪFFb {,Iv4|ގvԭoQ]뢝G묒=ڽzouOud>nD̫qAy=Mpߪ]C 2bX`fX=0H"a$7X=}5 "SVI Unk617'"%bD93>_hZb{D.+Kms"WU⇢_}U2/jOD%h"b4q R`:aztr?}?!lC;| BjGlwowBzd~mS㼜?N#Mx^C; }#EO+6}!:!Ľh.ڈxׇeI2 s2 ֌m`^:;Ncm#4~Cډw0g鋵_ݛcahXDX5 m4D4NC0 4 q5 4D4Ca,D}6$fVZa6j٨fVZa6ehss2@; x@cj{436wFfŝ2l= ؏: ~dX:`(5chwxXٯi6P:F4Mêi3 b9}vL4M.Mie4 D/nfh99@G~PMy4vSw}v}6fce1n6/gcl6@hYñF;k8m7plx!د W݉Z) jJiX3& k)Ȩ cᡖ4 hVQlѥbqmql[8sQlz'% m'~"a N/YK%yW@zE+u,x*ME8[ +.|o =\Osœ5S2wg]P&1R⬫0Ϛ'0tbo-S\ƿ8(l4eV$sH Gpd#C_`[S4ҩF:v/(`ha]:F7l/l.L--0Qd/ot]ػGS<;Iq8TC,@2NFƹ\`Q`0f,Hp(.asd!mµZfi:k7*i̛D2yO}*NY [n,%gAy `6$mK,n/R΂N ׹sx8̆8qǍþe"b`3vs+;f Y:g&/KhK$f)gOԵ[ W(mȞOAJ2iEgl5u  ?'wj%tO ?Wj_D/CWMo.CB;- ڎk8#`gh3蜙K4ܡKN)/(\ #5~ݟ/B?Uџӆie{վWT JRnq/8a()(SYkZn^|Q6s9NɸAi.wsFK;N^Z&fMrF^77#*k#Xrv жXW+;l[Mm ͝5* .ul5l2vA~t; Bs41Dd΀+4=W=[uTUQH P7<nE1ti/S\7u+0j8:K:7;QgT[jjuHԙHZȮ~cw2~ּ?6f|czd=KL1k3'zl?Z[PZZ^GBko{M㜏L}Sz\.*,eJo[>H#hj L2%ـɈQL$_/ɨ U?޲~~yCx?ā'Lzd`M2&X IF`2|^}%c5{+0V@e9@NԸU<|g|ǂ+wZY2+{3|2gkgͳgѽtZ)Va}sFяnbB3OxoZK1寳l2Aq̧|?I|&KټlUګcnҚ*JG'uc;B0x0f#c>?cd])l罉ȧ zK,qޥ8CrkZSX8# nw:rt~iN zņPEN$Z,` `3cw8M[E&Sc ?BmT=Rģ}r"E6f$̨I2]1MPE} @h$Ƣy:DnE\]^傽e瘎Ղm|zsz\o:v ٞH?]-}Wq -BozJ}eKv 5vML`M&&X ,%rQ-} e/@x®t{d.* x* Daӑ:"'9U@29E\G&r(m[x‰w+.L'CG^lg-z$!Y+vPMj Rj4443,抩| TQjպAb,70l7.[v~uV7TLz],vTgo_ c^Y_=Tn\'|abcș3l-e,%>+,>!^Y>}֘M b>FiOSQQĩwe;Tq'mPx݇#JdnTj{z^q;D Wy_Ӊk[DH,<; Za_Q6D6h{!Bd^HCVY5茚X - V]4vTFaª/ ^V}Qܢ'igGb ԌjF~X)P3+H^"Ƌ-u^$:aہAR^"K.}ۗŠ/M! VJznu}oPA bO`bOzʺ0.EHYOf== )GLdbd6")p2$X&bݗ`"VX&b`"Vؓӿ2 urIChBq"X1؇GHIñ)IƊ^!3QW=4YS^މ؈qA7!5kGԽ>]]l*P!ޡMz>^ŮfN"UACN}:^G(b 3 CM0ae2r0XtT15o {G99@α@q@ΛK'KE6^L= AǎAS";Gwu;~C]p".OJ/sD#u7fOg7yyHdur`y`w`CaYbtPSXHM'OA:rEi3N|VN0%Sb@}-J_hg6utӽ/@_t~zz-h7ƙWC߱csda Εp9"##ţ%[?iu%  ƅ@Bخ] QM,\S阇hr Qԥ*EA$" { rXD:|'lM)YdCD.js>tGЗr^3BSGךLN?k8byy^UP7|'aAʷyTo9߽~a,Ϟ5˯g uo"#RjL9+:COV]yV׿vm5 ;'h2v-[N2$f -6YJJ֕99Ǝ5KZ~LS{nRN9gK? GUZ+k̡?ae)^TaXυ1bBNnmh3>c[7m#-}ǃwZˬ[ɖfZ Po40 g}Z+xs:}. R n+i-<;lǷm7fue5efl4bk5t,XЎ!UMVoQ\,bE r 7@Dr#Y񵑬bhYߔ Q#̢R4⵨smz"Pǥ[Y%9"° b!3L6۶A7ܝ>Yma$"/' KAXa)$BH !Al N@o.lwtGNwwGNZ' 8: esHCQۈ, 6۠;l 6۠;l 6HAR"aF6$x:&).9[c]+ְZvH ٚ`?$~H!C VM U_Wk(7L#-0;'&~/' @`yP"+{~Jw>jI{r>])8w=b:_0TK{K(x9^^r+¾(jgmX"Z"W Z-zWW#+.@ec˒ 8ƲUn(Ɩ"9Fj5R+6Hj5{6Q X%51;ZwEfvCETuhBMDԶ9ѫTM*#KZBⵄ¦PfNtm.UTeh0еDWuto|rū`Q-Z]7Qa-U Zl3hhs03RrGC#Q/GNDA[H;r '})@)%)@xbopk. o><^*^*^aet{E45Kx+SA ĂA:1]t  Ģz5Pe?K9/{z'l*Ə;1|<;v|t#6ex2kۓq{0cQ]}aZ]%MLR׸u3JD z6אbsgYz#.Y''v .OWyyvhK{?.ޣ A$ˣŕ\JJ.e-`ъO)b7E`p4pk85+plM:ֺ^}Xm<&TfhGR zhKJJ%8V"{(1$E6Qv(v.[UGPwD͞h腝^=WOvZ3edYeJ>%Yz)0?,fhbHv MG1j}7?9vͮt}=tw{ ιC*SO(ST\%Yң CgednH>4%Qu*⯦i h&Ujޣ>CR023 d}mvfͦLcSFq0Iv5' 9R0~ _s d; Xovȴ!F"bx\)cVXva-?Eb,ڰg|@՟5 ,d ,^|:NVkkVz:mYY*f\Mt[3>V3i~9|L2˘'7 B+ޡϣH`ss7빇fޕ{PZ{R#=u8%W3sCU|qWnc(2Al+kk:=kv1b}iǔ9jQ_W3@o̍N#գ/ԣT k%ּ;{v=PT4a G5ckkaÅuepDGDJ̱wrV `e:S]+Xw e@"ѣ҉AvI',fkH,Vbѵ}dŽ:cP,+arb+0Ēk0;%]D@Dv&t$J)5L;z fVHI$b1 Q=ʍQT֚%,!|ۻMG 3Lt`3F ^_Xk}a}eDݏFC0IH+`7R*' Lrb9DB>kHiiP)Y?Ɗ|Zy{zҽD-3ZG1Y-WmigV{|Õ!zo0{8‹);JsNuI{P18ct0Y:£m#$ =?7B6&j |Ǭ*>j&id40 ^j gޛ{)TgkNe^v;骪ic.mjRQʫjQDWd^[ү*׮gԎ!qLӞ S*pGǸs<ihvY]iu_-g֑uiڱ_<{ي4=f|k>>`!oEgWމ7k3؏mk=b,L>bWeY]V7_0zgkC elFH1j(m^TohYjRNSOUءLkVĜ9st˩N99k+UtPL+^gIzJZ^v[E4n8W؃v_(]S SSIé$k5$Y"&Tׄ]a6+Hrj5A&]Bg5 <\\dvVkO7!nfXK7CfXO7va3Yϯ3p5Έ(&kl^AKH0$_vɗ̣s@FW(qr qG?7c%J`Y{"ɨS?FO?gS;#;Fw*\:G|b- i=q"c=`.z"ZwI;+ҝ\T_I@6&1<c|r21'Ǩ989Zg۫ fjuzڱ~*^/c[ɦ?fﰷȾ9[b9;orU՝cH41:\瘿0L+f흉(; ^iN9 shdsbYnnYfY nnsA[[[۬ۈ> 71cr''pLL3BrL_ch__><ªc-}/JZlMX$FBEG9eT1PǂPGKg]W9W0D{pX]y=\™X,e 0葙${b"d)dɥ. 0Y:d}`&'x&D9|ri>uu:n[ZwYXV7+JZìIZ@k}+sc-XtVK+EVWF5o`z2',fv(0 S'_M>>UI*r_._ +yY3>\5y`[Vjh1,`1SWWWYb*:Vïw\kX亓Et,rE"t,B&|k\q>zŮt,rm6ҽ"tȵ]"tok [zE豇hd3!09ɟ%PH@+sϯߎx%fiU V55֯V9:i:{%^׍^>p+<'ΗeB9]v ]$7:^߿ ^5Ssqvq[QLx$ggg%g{%bk!V ߵ] ߵUi*BV AGQf!DM`߻uѽ$Mq&,xw#Mt@\:nn>Lr|ĵVף$|$s$8ɝ'H]tzn{踇OHK1%H+s:qz\æqu(`1syFGT7Riq^VW3Xn35)6LvɌc~m4)h0w9U5wYGh1s99W5EN%~E}=g5A9NJ'Y*O/=,8~ SI5y#$sQcn>|>$)|>jͧ$Et>u$OhGcXLMA0Ļ[Hno~1zDmtDv:n"^Ng>FI;I>AOMI LS4 Pwqr: ^ $_/^ݏe>o33o#ƣ"OM}p1ƛߵxҢ,ړ7{&;=֍:f6wg=9?#-noEX#<;Eww4ZU}X}]=O= I]#wc[_/[=ޮ}JvP릟ܑ\̎4um6_5gF^1כSLL1= fzHյ[ߩ xc lΚ5m6e]d!i2:[['Vml|=8.ѻyZW:*\uПЖOhՁ82s\}CV'!d/|r_M&F6UzzLVUeFtx:rgRJeeצs;>l9zx\63k8}ץ4[ gVͼ#+2;7?5VfSS׼18I5IݪS2S} <==س3;78lӷ~ˬFA`wg Y݂g<*9R/*`]A j> V>@NQF34uE<UYĵ"ͬ%V纈kkm#2IE,ۘ`[Zs۫}E]d\:ЅCk{_bO] ޲sbNi'ĞOBE!ȶH/"E6Cc@D ٖ:- lKlKlK ٖ9ȶ#rqn9\99\9`$)x3Fc`M'vvtF{f{0g{b7gHڬȼ Gf8j|ZĜ"Cm2IN8`N?V~p~4jIr6}"FlGRX)REX)R`:od]~<ے`ۖMo'Nǖě?Q{-H v{x")VCC8M/ v $>N1v~_wDe=|Unv9sKce&ֆm4w?z?k_kFf$Mg-Y[ֳ!YOV=O(!W# $ܧ~ϓ1v%xwIUq%>Gꍆao_µXmҿk eb(VV^k<`f3x3`6-]YOt&3{Otf鐷nvǷOKvϞ3 k-uɾgUk;us76~'˝ur'CߞgƟ>w*|'x9L717^++YlwʓϜЌv}!sckвM}rx%wg[Uُ99TͶcF*?}Z??tߜZqwҩ _I 5j;JJ?.Uz`'$(sqv dWh9k *SR*4/pM\ T/JR ʜ2VtW̏m,Jn )rZamdX-2*2Nfuch֍*cXde[-5YP ;LDĺ'V=e%^T:vl2?֕)H>WK#;w6 jijv4Z:8M#?-iX+ƣ@<ֈxŃsx𜨤ILKEfZ*b:#5`*X-YjX R,@߱$Z0LM 0c]I::c=e*W91tptM:&)YMxyMDeҧk%)+ J{R^`TV*x+U@2ʤ0dIOxS<)~kʬo\Nσ/fw[{5|Goxe\z.d<>3d@Wqb<+H*ieSwUrB-s2RA^ $xQ2źf;9X*'31T}B=-BeujQ"r+HZYHBN]RYRm׫BhTuቬG\ T[z 5b5TB]TO"" B6G*.4XCՅ**@|, ,Ds`?T͉x/Iu?u?D#0]Mk"s(e'*w+N{:]GE<_1u/&5|ܥPi,pҙ@| aGagagŮx w" oBO;![%5W+-GJQGXG(e)TƝFey#:u8D3ҿKNh/!ݻntב:m9T5M`MǁsY"ʚd2p¾O$)")o Awۃ@vNP񏤊D7nJoeJR[QAHH+ i=3BOhsԜaNR6ѳZX#Kj1-/HQ;\+"o kܽ8FW8u}?)TT~&wb{}5;Ӷ2}IH]s~z璴WDf:Q)q^i,c/*ǔL '<_&VSSjvXkSyMV$cәq܈UX{+ĻUss*|g5r>nr9VUc>Zj=H{:n>XgEdl>fYL m*GYncaϰ}l [͞e1xhlxsy5sjjyffl5}[G{kCy׼yfyy=k<_o!>.@;c{'IXz{.mjTVAPa ߗ2D3s;Pć' *MxM2Z24.o߈3+!4N8U+8! /Zl%mL(`y8A;3L.2脠hA$ZWG[&t.&xWs/hEJ4VKI6G(퀧Q$ۡQlgFFQE|ph%±u1։&FhhFG[QIޗHR/MMG@D a"0H$L&½D a"[@2eI8xB`"2rcǦQ8FXqA2pn *{/@jZ\"fQpukG!0qG5 QpxaUW^p{UW^p{UW^p{U$158@W0E7'S5AN%)%S$ЫWf}Bvgg&6gϘߓ7jξ!g{dݐx0YBɞ3JeZ XbժlC~_MS_??Tdc~G|56U֞u$p;ۜʒQsla1jsuZZL~XO1O?X[9mWy϶Xm)l̶v/h/o۽ͦncq(c5;󤹐mg_,ޞ^f+OfVIm_T57ߡkUz@{:Y"I]/]ov K(Yw+Yv;gzÊ?d2seQebU vG4XNr-ʒ<$B9D9z^Q"=M, QU[k*` ryC`$x^V6@h:"bt :07iz MHrNm L!{ 78M|#@a)G8z0FlyجZnx]*Ũ]+G}@-ySs1UHߎUdɂH+)l4`}ʳv5G~QZcb)2BܣTOiFi>C,fVc/1{,F_t"}2-2mMPyѬj+T{kIj5Ey~ȮϪfhWgN~gv,Pn${^r;Ӈ@W RE@EҤL=TbizU>^QCdH /6/;lgUæwx4lh`y4SեG#G#tH2"ӈ&IR87Gو F4VXDï G!:_RpZBGB&"!vwK!N+J'Ǔ`'OO؉tL$ Hr ,~@DXa'O+? 6~l$&!( Gv $l_'a; IN&v,ӱ$ o6 6&F4ăC6zĶu Áǒ)GH9Gى|GQ>P,JTp cL hApczxBЫ ,*6}PA"*TDs"~A#AY1rxGDX 60CvpZ>rrc〜79N k8``*`@PDPKNLaӃ4W";GuûyPN̗11Rx$rp9#翉> JgRH> _],-Ft@ֱh9h9@ 4 q@вЉ9%bJs^{oC'8xTz-h|D+zou4wwi]~rDqʑ2nJ_X`@Bq!иh\۵k!B̓'7ueXSue1!@|&x~+K|g['=+) uxZYj:nYjKseWkW< 3sK6q=>a\0?q ,e͉K`yWI=;9vr(0ZZE hH q$#HODH$FbdDr$JF"v݆װ #NmifhB_I:mmhV،YnhK BB]&Pl H{v^_YV~7 ) l%_풸C\P;3sW` fΙV]PZ393 ,oo"xuc~*YM Gk$Y| _ۈ)EO92J3<,* &{:{*CV=Iw~}>cu?YA˴#k._nfN2kS-lMH%EwP2N=5aPg*{5zTxҸ՘a~dLey)ޙ/Ob~lى7<`l#ͶO&LnPIKKM8RSim'ڃӻ\sh@ֆ/ 1>r>XvwʫV?k6I;iťL+jo#lM_"۴ CO3.H:> ~؍aeD)DB$dTT3" #GU>*[\uZR"ˡ:0BXm%dyф؀d=q^5jAf slh$ElWC44 !Tf2#B=ӫ;avngW#K`E7$Rډ͂*J⹂\=ՃF1$EC 'HH bdd"+XV; \Y-?|$E$W#+tB%ٵvaeѻhXk'EF䡄Rմ+xiG~i?m?21OF]ara񳞬>:JVPQ+kJ ߧLTBN &a{9גW;>V䷲hX殟mwQ6(=1kieCMBʴ ֥UgGV!YWE\cXcL-";ŷ};a .lgmVQz]5" *7)Ɉkv22@DHrM\76 v$zɌW,,(' 'tVaXKmh46666r6$1i폘[MG貇@lĮf˖^WXZXbU 2Xt`Ӂul;;8dqN%z7I'&q!mµZfi:k7*@ӄlTɳxKVܵcWTaǞ\g8u㘻 {щcBB 8$ı]}ܤTH}Z Ϭ6o{Mc~#Xy cўΟb\;(Gbbs: 58İ%?*/y%MaA ӶƲaY0`YĊԎ @/?k`rWKYz4p jwz=x^:T +zYZBZ@۩f)5Mwm<+/59ۇFs3+ˎO{͏-&*ǞF}H3g[?_;X(H;bνUsv9P7zR[PSa`BY}{YWV>cY)؊ PV*`U`*X PU`pp!I;g|& g"ތI$oƎ⦲B"GDLFtdNdDLFtdiNdNƾdNd쿊ɈY,E 뺀F\ ] &6oTs7}mǻNxO1Sʙ\6qܸӞ1|g|'z1j^rXil`8aaYu>'./#}_/~uZOPM1 XbL76+cJWլFƽA>o2e1Zk<rku5ҭff62M׿|^k8/΋'~]'\#g/./F #F~5漣oI>(0Z[ tF#:aOt:B^0:N˩!8(ۂU.$I;a3y&$ߥ?kDK߽IʸQN] .]Uy|B׫ٺ޻nn:]Ê-_\>hsG@CQ"v##P `Oqg$&B$/RZ5uS ;1-`ZiPSb]k, o6h2fWo}f 5S2g3YqYmUxEc[Fi ˻18b7-lvFV{d4hg=2;li"'8b|`|!uI/|jpxd a[Cj8ab[&`&jK]]+u팀z&DVT1laNaY36Ǘ4'me3s KYGX+)P5՚A,ʚ3,'"35)ZnNL_흾,cQ[_dL4׆d}{${wW}\lf_*^|ՕʗDVT}-ɠcVg{}>w&[c=_#~ Hw|&u7ߍߍsjv+r%4?eo:WY63(S^zX/z+x2ߥ䷼;\{ӻ]*O]s>ܻ;SߪgU*[e?W3~pmw>q'=4Sl)Kpe "bw CP`,tTF1٨UN@XC5:tn:udUQk|A Ќ{&r!4zMD ,3E[].&{3YF32]б+IgIvCxU,1v(e%/vH$ fc< ' L/W5I31@@0B ).CQLv(c ŖPP^JB-os8_-b'plyqhd/޽{"ʋ*/.^]H fIk"H\Xi Gͮ[f;-pô.vˆARrI$g!~:: wp̆f60$# `%%Z Yg8cs^! y9/@0|k ]5tAk/;brkq݋h=Hn@t\ﺟ]޵;Bq!:nq=L-GŵI6ӸFGInsm'1];H>Irq;]O|ܵ^ŵ.ד$w|=$r=Mrb,r9Җk=\/#ϓ|/5i,{F/::D%Qa$^qut|5=&ɗU'uo%n3ĹcYlH0!!!n?$! Blgͼ"ꀠ)" @QQQQ@ V9R{i9\5_Ҩ)2>00/5Χp?@a7ɊYQ`1H)tK3-㇌"bߥ3٥O :N?zu {*t}h~pYpXc0%1=KDh˖^v_Rÿ_ocL`)W [s:Xq7;&WE3'@j{msY B|=+ h!g1?1?i'qz? ,#7#ڧ/~SgGd*T8XZܪ؁ V}%zV؅’1.Y)زu`RG 0e?۫g{L[`:LԉIqODyDd2-2rߪJ/%?=0'fʀ] l.0'(W % .X̙?c0SER.}Ur^6Wr_!zK<ɅWc^dOD[O%J(Q '}?Z\U{:hAƙSZT_GK~]f>2M`L61m*Z} HՀ17Ij933 [u Op'\ .nĸt 4tLA`*9m kHd 5h@c i:Ա4-22ܹ䪹s7_LܦMDX/РUjvxl-y@'o̡tykWLt_~l}?jyXfZ:е{U[#F:iOzQ۟hOʾ}c2moG$?Ģ "N"nOnK$ne&&!a]08 jlRIFb6#yJG (ģ^js%c>(r9cU܎3NuLj`=kkt-Ml+\2+`y t`4fZ(]u=.@O>2KH'_%KzOD-xDѠZQjabBHVIiA-^p#]7JuƳF^7qBZ, sVC}5T]np75.eIMd8& y 7.9d4ej:m"M6{k7{b^`@&̲m3M_vy4W$IK}l6ǖ}E3X6k#ڝRmԢ`X4VkK#&juy v6c`x>FV6fY n1Pm;Omy۵wmIط d`n,d`"K{~ q'=X$# LuV'Vi8o;l/#8sN`g`d0Fžݾ{ݐL*̉u65(VJrQ6`<ı?щc8f̷᤟= d=^?9s <) (q, q, YAN4(9Zc_ Ӭg;7!Cg[ekPK!mYϴfvfont.npyPK6fvedo-2023.4.6/vedo/fonts/SmartCouric.ttf000066400000000000000000002775541444463326400200030ustar00rootroot00000000000000pOS/2tyXx`VDMX`gzcmapQ cvt r$fpgmS1sgasp\glyf4#thead\6hhea; 4$hmtx2ZlocaD(v"^($$< X<,Kq>Fo99"2  s_L 92<n0 .<2uCPxHXF 2<HxXF PPxHFXXFP P Hx xMF X2   vvvvPPPPPPPbbbbPsPPPPPFFFXXXPPPzzzFFFFFF<<MCMMMxxxuuuHHHHHH22(99d dR ('     !"#$ %!&"'#($)$*%+&,'-(.)/*0+1+2,3-4.5/60718293:3;4<5=6>7?8@9A:B:C;D<E=F>G?H@IAJAKBLCMDNEOFPGQHRHSITJUKVLWMXNYOZO[P\Q]R^S_T`UaVbVcWdXeYfZg[h\i]j^k^l_m`naobpcqdresetfugvhwixjykzl{l|m}n~opqrsstuvwxyzz{|}~& yzx  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~dT@ #jksy~7H~7    " & 0 : D t !""""+"H"`"e $kltz9L7    & 0 9 D t !""""+"H"`"d1[K?FH4 (PTRZ`nz|yzxSTUVy`aqbjgt}zf_nidu~xl\mev]w*)+,./-015246387:9<;@>=?fgABC ED F G I HLJKMONPRQVUT \YW[XZ"^%a'c(dS$`!]#_&b^crdT@ #jksy~7H~7    " & 0 : D t !""""+"H"`"e $kltz9L7    & 0 9 D t !""""+"H"`"d1[K?FH4 (PTRZ`nz|yzxSTUVy`aqbjgt}zf_nidu~xl\mev]w*)+,./-015246387:9<;@>=?fgABC ED F G I HLJKMONPRQVUT \YW[XZ"^%a'c(dS$`!]#_&b^cr,KPXYD_^-, EiD`-,*!-, F%FRX#Y Id F had%F hadRX#eY/ SXi TX!@Yi TX!@eYY:-, F%FRX#Y F jad%F jadRX#Y/-,K &PXQXD@DY!! EPXD!YY-, EiD` E}iD`-,*-,K &SX@Y &SX#!#Y &SX#!#Y &SX#!#Y &SX#!@#Y &SX%EPX#!#!%E#!#!Y!YD- ,KSXED!!Y-+++L@5&+' +" +S@5&+^M5&+M@5&+" ++ E}iD ss*xR'Rw  R\f`2++IC+V+A]Af`v````````` ]A``qA%`5`q`и/2и/)и7и>иSA*V:VqAiVyVVVVVVVVV ]A VVq]EX;/;>YS+A]S S9й#S)и)/;R]й7B;R9FйMA\]Af]01#"&=.'#"&=4632.'.54>35463254632#"'.'>54&'.'5h.%>-1_Z!%%!@g*!**!!*pY6e-"8)6_L!%%!5X#!**!!*" fEkk.'A%]g+&:!'7I0BlN-## 7*8###KV &4D,CgF$##3 -###=E `TA$+ D=!(  2';OYh(+ 2+<+F+Af v ]A  qA% 5 qA*:qAiy ]A qA]Af(v((((((((( ]A((qA%(5(qA*F:FqAF]A FFFFFF]A FFqAiFyFF]AR]AW]EX/>YEX#/# >YK+-+A]7A)797qAh7x777777777 ]A77q#AAgAwAAAAAAAAA ]AAAqA&A6AqAK]AR]AW]014>32#".4>32#".32>54.#"32>54.#"6'&72+Kc99cK++Kc99cK+D+Kc99cK++Kc99cK+>'44''44'D'44''44'0/100/109cK++Kc99cK++Kc9cK++Kc99cK++Kc4''44''474''44''4 -22--22-mJVW//!+A]WA ]*Af*v********* ]A**qA%*5*q.!9RAfRvRRRRRRRRR ]ARRqA%R5RqEX/>YEXF/F >YEX/ >Y4:+A ]Ah]%A)%9%qAh%x%%%%%%%%% ]A%%q.9F?K01%#".54>7.54>32#"&=.#"67>;2+32+"&'%267>[Q~W-3H,,7/W|MZB!**!#]9+B-+(%( ""]+mT""r(x?g+E<0BHP5[yC5\OF3~OCtV2;-'##Z/>#6Y-Xm&&Y012#"&'&3/7#$7/2>2)fd0S+Afv ]AqA%5q01.54>76TUUT)JtGGtJ)s2 ٢2 1 1拋嶊1 1hf0S +A* : qAi y ]A  q01&'.7>54.'&67>)JsHHsJ)TUUs 1 1勋渋1 1 2ء'EX/>YA]01&/'.?%.7>&632%6h&AA&&)!;&$,//,$&;!)$$@58--y*00*y--85@"3/й/й014632!2#!#"&5!"&5463"&&9""&&""9""&&""9&&s& //01#".76;2 #h + (%" +012#!"&5463""""&&&&<?/A] Af ]EX/ >YAg]01%4>32#"..=##=..=##=.#=..=##=..= 7 /EX/>Y01>32#".7s%! V%"   '(/)/(и/) ܸAfv ]AqA%5q A*:qAiy ]A qEX/>YEX/ >YAgw ]AqA&6q#A)#9#qAh#x######### ]A##q014>32#".732>54.#">wppx>>x b/A] EX / >YEX/ >Y A]A] 01%&'&67%632#!"&54639' m ,""^""Z%%* #&&&&&5+# +2*+A]A* : qAi y ]A  qEX/>YEX/ >YA)9qAhx ]AqAh]A]).Ag.]013"&547>54&#"#"&=47>32!54632#",?)tp=g+!**!H]Wf76M0!**!"&%-JDB&\nn##'4YEX=/= >Y Ag w ]A  qA& 6 qA]-A)9qAhx ]Aq-#Ah#]A*]59017.7>32654&+"&546;2654&#"#"&=467>32#". 0@PuI""7suumtQ!**! E]Wd6SFYg7ib2eaZh/## 0:xcii&&`\Ua'C##m *./VzKZz$%iQa6!.'&)p/)й/EX / >YEX / >YйA'])01%5!"&547>3232+32#!"&5463!"" 2'/(""""R""V&!+#&&&&&&X7/0/A*:qAiy ]A qA]A#]'+/EX/>YEX5/5 >Y Ag w ]A  qA& 6 q+&(+9017.7>32>54.#"#"&7>3!2#!>32#"& 0?N>bD$"?Z9Hj1"*#*"". 0k<[d5;naba/## -7%E_;7]C%%" ##&&;kWXm>A :;/YEX&/& >YAgw ]AqA&6qA]5A)9qAhx ]Aq90132>54.#">32#".'.54>76t$B^:9]B$#A];8]C&6͎R 5VSh;;k]5eZL&'!HqЃp5Y@$ YEX/ >Y Ah ]01%'.7!#"&=463!2U 4#" &!**!""'##&& ';O/ ///9#9(Af(v((((((((( ]A((qA%(5(q2<Af<v<<<<<<<<< ]A<<qA%<5<q FA*F:FqAiFyFFFFFFFFF ]A FFq7/EX/>YEX/ >YA7]7A7A9#7A9-Ag-w--------- ]A--qA&-6-qKA)K9KqAhKxKKKKKKKKK ]AKKq014>32#".54>7.32>54.#"32>54.#"8bPOb8-<#,K7>mXXm>6K,#<-y$B[77[B$$B[77[B$!!9O..O9!!9O..O9!oEyY33YyE*K?29JX3Na66aN3XJ92?K/O9 9O//O88O'B22B'+D00D:;/YEX5/5 >Y+&A)9qAhx ]Aq5Agw ]AqA&6q9014.#"32>>7#".54>32&'&6X$B^:9]B$#A];7^C&ʊ͎Q5VSh;;k]5eZK&'!HqЃ35Y@$ YEX/ >YAg]#Ah#]01%4>32#".4>32#"..=##=..=##=..=##=..=##=.#=..=##=..=#=..=##=..=s#> +Ai]//EX/ >YAh]014>32#".#".76;2.=##=..=##=.7 #h + #=..=##=..= (%}v"'.54676 , , `-#!}  }!#-:"R ++012#!"&54632#!"&5463""""""""R&&&&p&&&&vO .7>&'&67x` , , GB-#!  !#--A2.// /&+A]  A* : qAi y ]A  qA.].8Af8]EX/>YEX=/= >Y#A)#9#qAh#x######### ]A##q*Ah*]=3Ag3]0147>32#"&/&6?>54&#"#"&54>32#".L\SZ0)PwM # # E9R6c^=k/!**!%23%%32%&).-.RtECePB,1:&I\Y##3%%32%%22g6Td// /./ 6A6]@U.`P///#/A]й1;A;]PEX#`014>32#"&'#".54>3276232>54.#"32676#".%32>54&#"2\߄tH)Ih?B\.28"%@0(:FR-0=$M(-&<)7f[hI3b]H3$ 5SxF%'D3)#?5#iQxXh9B?1#:S6-b_VA'7-? AL'GbYEX/ >YEX#/# >Y#*и-и,.101%2#!"&546;#"&5463!232#!"&546;'!!#""""8K""o(1 a=""""RS&&&&&&#&&&&&vPF (10+ ,+0A*,:,qAi,y,,,,,,,,, ]A ,,q, 9A] $ܹи0'&/EX/>YEX/ >YA&]&)&)9 (и001#"&5463!2#!"&546;!2654#!2654&+ z""Z[/F?jq3b\""z}vssv&&.UwHNt$"pO}X/&&jag!`X[_vH5w6/7/6и/7ܹи(Af(v((((((((( ]A((qA%(5(q3и3/EX / >YEX/>YEX/ >Y #A)#9#qAh#x######### ]A##q #9Ah]-Ag-w--------- ]A--qA&-6-qA3]01%#".54>3254632#"&54.#"32676&_svIKra1!**!!**!!EjHQa63]QdH0mBAX㋋XA::####1ZD(AzllyA98%#3Pt'͸)/&+&) A ]и  A* : qAi y ]A  qEX/>YEX/ >Y&и'01#"&5463!2#!"&546;!2>54.+p""vŠLLv)""pPYf88fY&&R܋ܙQ&&;sppt;mPL; =/ /;// ;&A]%и=0(&/EX/>YEX3/3 >YAh]иA&&]&A]&!A!!]3'3,Ag,]':и;01#"&5463!2#"&=!354632#"&=#!54632#!"&546;f""j"!**!!**!!**!+!**!"""f&&&##[####[h##&&&PV6͸6//8/ A6]6&и%&/EX/>YEX./. >YAh]ии&A]&!A!].'5и601#"&5463!2#"&=!354632#"&=#32#!"&546;"""!**!!**!!**!""""&&&##y[####[|&&&&bBVC//)/A] C)/9A9]B/EX/>YEX%/%>YEX/ >YA]Bи4A)494qAh4x444444444 ]A44q!49Ah,]>Ag>w>>>>>>>>> ]A>>qA&>6>q01"&5463!2+#".54>3254632#"&54.#"32675"""" $StvŠLOra0!**!!**!%FhCSd85`SUB&&&&100X㋋X<61####-L7AzllyAP|CָC/"/C?иC3и"2и"&3/EX/>YEX/>YEXYEX*/* >YA3]3!и*1"и<C401#"&5463!2+!#"&5463!2+32#!"&546;!32#!"&546;H"":""\\"":""HH""""\\""""H&&&&s&&&&m&&&&h&&&&k/ /!/! EX/>YEX/ >Yи01!"&5463!2#!!2#!"&5463!""""""B""&&&&m&&&&s%_// $EX/>YEX/ >Y%и!01"&5463!2+#"&'&546323265""""w=!**!Tt&&&&2TC ##KvwPS++ Ai]9H!H9CиOEX/>YEX/>YEX3/3 >YEXK/K >Yик39иии к!393,DиEиRиS01#"&5463!2+#"&5463!2+6;2+"&'.'.#"32#!"&546;p""b""\D""D""9YDv/,$!+""R-X'" #H/)N""X""p&&&&[&&&&k,<%Z\W!!'&&>M(WUN#%&&&&PL$c$/&/$&EX/>YEX/ >Yи$01#"&5463!2+!4632#!"&546;1""*""!**!"""&&&&mI##s&&&??//A]A ]A ]A]&?0EX/>YEX/>YEX/ >YEX7/7 >Y 9A ]ии%и&к'9A']A+]/9A/]0и1и>и?01#"&546;26;2+32#!"&546; #"&' 32#!"&546;1""/ 0""26""""o ,##, o""""6&&!a!&&m&&&&3##:&&&&F33// 3$EX/>YEX/>YEX,/, >YEX/ >YA ] и,3$01#"&546;2#"&5463!2+#"&'32#!"&546;M"")u""D""9$'(""""C&&&&&& !&&&&Xt'(/)/(и/) ܸAfv ]AqA%5q A*:qAiy ]A qEX/>YEX/ >YAgw ]AqA&6q#A)#9#qAh#x######### ]A##q014>32#".732>54.#"XLvvŠLLvvŠL5`SS`55`SS`5QXX㋋XXlyAAyllzAAzPX#,#/./ A#]# ',/EX/>YEX/ >Y#и+и,01#"&5463!2+32#!"&546;2654&+1""#el88le""""l&&7dUTb6&&&&prXtNuO/P/Oи/Afv ]AqA%5qP#ܹ A* : qAi y ]A  q,#9AK]EX/>Y4@+,E+(+A)9qAhx ]Aq(9(+и+/E/AK]0132>54.#".54>32#"&'>3232676#".#"&'.75`SS`55`SS`5LzU.LvvŠLLv .O##>;7%N-+>f0#CGK+-rB+ jhr<YEX$/$ >YEX;/; >YE3+3E9$A(]4и5иBиCиDиN01#"&5463!2;2+"&'.'.+32#!"&546;32>54&# z""`e4'Hg?,-'$2""F+U0&&(7@J.>""n""z>dF&}&&1X}K:bL7 $BCB(0&&=N!FE?!, &&&&p0L5ah)QI/!/0*+AI]IA*:qAiy ]A qA!]!<Af<v<<<<<<<<< ]A<<qA%<5<qQ!<9EX&/&>YEX-/->YEX/ >YEXN/N >Y Ag ]NAgw ]AqA&6q&9A)999qAh9x999999999 ]A99q)&99-4Ah4]AD]AI]QN901%#"&5463232>54&'.'.54>3254632#"'.#"#"&'4!**!!*+)BcB"C8.pwv3%>-:gU[9!**!!*&1npw,%(kv{8-N9!7kgd?+##,#*t|5J,BN.>R5N}W.E9=###]]hT+74KeCM\3HGzR)*/+/)/*A]+A])EX / >YEX"/" >Y и")01!#"&5463!2#"&5!32#!"&546;!**!"Z"!**!""""##y&&##5m&&&&F5+)+4 )%EX!/!>YEX/>YEX/// >Y ии/Agw ]AqA&6qии(и)01"&5463!2+32>5#"&5463!2+#".5""D""p!CeDDeC!p""D"">:labl:&&&&NmEEmN~&&&&nkf22fk 'Ѹ(/)/(и/ Af ] 9)к9Ai]9A ]A&]EX/>YEX/>YEX#/# >Y ик#9A]иии01"&5463!2+ #"&5463!2+#"&'I""v""25d""N""M 4++3 &&&&t&&&&##7Ѹ8/9/8и/ Af ] 99#иAi]#9EX/>YEX/>YEX+/+ >YEX3/3 >Y ик+9+9ии&и'к/+901"&5463!2+>32#"&5463!2+#"&' #"&'5""X""d" !"h|""D""6+&&5 7&&)&&&&L!&&&&%#E#$2CC/#/AC]CйA#]#!й#2C4EX/>YEX/>YEX*/* >YEX;/; >Yик*9ии и!и*#1и2к3*94и5иBиC01 #"&5463!2+#"&5463!2+ 32#!"&546;32#!"&546; E""X""Y<""0""AZ:""""mS"""">k&&&&<&&&&N&&&&m&&&&<2//2/ A ]2#2#9A]EX/>YEX/>YEX*/* >Yик*9ии и!и*#1и201 #"&5463!2+#"&5463!2+32#!"&546;F""N""]A""0""D""""/&&&&g&&&&&&&&#&'/(/ܹ'ܸи/#и#/A#]EX/>YEX / >Y Ag]Ah]01%4632#!"&5467!#"&5463!2!**!"" !**!"" i ##&& ##=&&PJwf ? +EX/>YEX/>Y012#!"&5463!2#!'""b""""&&&!&&&g 7/EX/>Y01#"&'&>32 !%V "%  fw C +EX/>YEX/>Y01!"&5463!2#!"&5463!""""b""G&&&&&&EX / >Y01'.7>32&'f : 4  4 :    O  w EX/>Y01"&5463!2#  w---- A`'%.67>'    m #% 4CD/E/1ܹ 19A ]Dи/A]A&]5и=Af=v========= ]A==qA%=5=q8/EX./. >YEX/ >YEX/ >Y .9889. A) 9 qAh x ]A  qA&]@Ag@w@@@@@@@@@ ]A@@qA&@6@q01%2+".'#".54>3254&#"&'&67>323.#"3267G""@8-!OoK~\3AoRQG]qQ?0 '^ei3BEN6[B%e[kJ&& 0!EQ'KlFTvI"Ua[+- 1+ rO'?-IQYL%M (<X)$+3+Af)])) и)и/ и/A*3:3qAi3y333333333 ]A 33qEX/>YEX/ >YEX/ >YEX / >Y 99 '.8A)898qAh8x888888888 ]A88q01#"&546;2>32#"&'+"&546;32>54.#"f""""""R.RqBDjH&&HjDBqR.&&&1MXB}qq}BYQP&&&FP|W-2Y{JI|Y2-W}5t6/7/0ܹ6 и / Af v ]A  qA% 5 q0и/(EX%/% >YEX,/, >YEX/ >Y%A)9qAhx ]AqAgw ]AqA&6q(%9,3Ah3]014.#"32676#".54>3254632#"&$GhEI{X2.UxI\H.Qsn~DFl[3!**!!**!O-L72Z{II{Z287 #:YEX/ >YEX/ >Y #9A]#.801%2+"&=#".54>32#"&5463!24.#"32>T""">d]sBBs]d<""!".RqBDjH&&HjDBqR.&&&PQY?vllv?QK&&&-JtO*.SrDDrS.*OtC#* ,/+/, 'и (/EX/ >YEX/ >YA]Agw ]AqA&6q$A)$9$qAh$x$$$$$$$$$ ]A$$q'0132676#".54>32#"!.0eE + !'_kr:nt=G~iou@"k}c.( 3  C}qmEEzd"x}oq{`%6λ*+и.и*3EX/>YEX&/& >Y+иA)9qAhx ]Aq&-и.и/0154>32'.#"!2#!!2#!"&546;#"&5463/ZTG< &;vYEX1/1 >YEX?/?>Y*A)9qAhx ]Aq ?Agw ]AqA&6q?*9-?*919014.#"32>32>=#".54>32546;2+#"&'.7>l.RqBDjH&&HjDBqR.EICcA """R7jbWO )JtO*.SrDDrS.*Ot#AZ7KQ?vllv?YQP&&&Za4 ,&&M ?(0;+ +0;и/0 и4 49$EX/>YEX/ >YEX/ >YEX7/7 >Y 9#и$и*A)*9*qAh*x********* ]A**q$0и1и>и?01#"&546;2>3232#!"&546;4.#"32#!"&546;\"""AdEnM)R""""\(=)@tX4\""""R&&&ag.TyK&&&&+G38dR&&&&IS) + A] и "EX/ >YEX/ >Y&+ иA]A&]01#"&5463!2!2#!"&5463!#"&=46323""T"A""""9&99&&99&&&&0&&&&####aS$2ӻ%++%A]%EX/ >YEX / >Y/(+A ]A] Agw ]AqA&6qA(]A/]012#".'.7>32>5!"&5463%#"&=4632H"%O|W+]\X%/BF2D)Y""=&99&&99&&jVY.)-$$+87S7E&&####? ^ + A]EX/>YEX/ >Y и01!"&5463!2!2#!"&5463!)""h"A""""9&&&&&&&VmJ/1//J;F;91&1&9A]A*]A?]EX/ >YEX / >YEXR/R >YEX/ >YEX-/- >YEXB/B >Y99  A) 9 qAh x ]A  q&и'и 5и';и<иIиJи5KиK/LиL/01>32>3232+"&54&#"32+"&54&#"32#!"&546;#"&546;2,xE!;2% -tE+K8!>""",3$?/9""",3$?/4""""RR"""a\-D.\Y BeE&&&PCG2Z}L&&&PCG2Z}L&&&&&&&M?ɻ0;+ +0 и /$0?4EX/ >YEX/ >YEX/ >YEX7/7 >Y 9#и$и*и$0и1и>и?01#"&546;2>3232#!"&546;4.#"32#!"&546;f"""BgEnM)R""""\(=)@tX4\""""R&&&xgk.TyK&&&&+G38dR&&&&xT'(/)/(и/) ܸAfv ]AqA%5q A*:qAiy ]A qEX/ >YEX/ >YAgw ]AqA&6q#A)#9#qAh#x######### ]A##q014>32#".732>54.#"xKjjKKjjK1X|KK|X11X|KK|X1jHHjjHHjI{Z22Z{II{Z22Z{wM,@(+7+ и /-и и /!A*7:7qAi7y777777777 ]A 77q/EX/ >YEX/ >YEX$/$>Y $9A]$+и,и2<01#"&546;2>32#"&'32#!"&546;32>54.#"R""">d]sBBs]d<""""p.RqBDjH&&HjDBqR.&&&PQY?vllv?QKG&&&&JtO*.SrDDrS.*Otw,@7+(+,-ии,и/-и/,,!Af7v777777777 ]A77qA%757q/EX / >YEX/ >YEX$/$>Y$ 9$ 9$+и,и 2<01%#".54>32546;2+32#!"&546;4.#"32>l"""Rp"""".RqBDjH&&HjDBqR.KQ?vllv?YQP&&&&&&&JtO*.SrDDrS.*OtW2~#.+##2EX/ >YEX/ >YEX*/* >Y *9и*#1и201#"&546;2>32'&#"!2#!"&546;o"""%_lt9ND+27-]WK9 Q""|""&&&ClL)(2%$!;Sdr=&&&&RJ/= +/)+A ======]A==qA=]Af=v==]A%=5=q=и/A ] и/AJ]JA*:qAiy ]A qR =9EX%/% >YEX,/, >YEX/ >YEXO/O >Y Ag ]OAgw ]AqA&6q%:A):9:qAh:x::::::::: ]A::q(%:9,3Ah3]AJ]RO901%#"&=463232654&'.'.54>3254632#"'.#"#"&'I!**!!*%xx.',t6"8)6_Ld9!**!!*"AUf:am+&*p|~6%>-3c]m=+###aWUE$+  &4D,CgF$;3-###+:"D?!(  '7I0CnO+<=Hx7/6/+ иEX/ >YEX2/2 >YEX/ >YEX/ >Y 9%и+и,01%2+"&=#".5#"&546;232>5#"&546;29"""BgEnM)R"""(=)@tX4"""&&&ygk.TyK&&&+G38dR&&&02'(/)/(и/ Af ] 9)к9A]Ai]9A ]A#]A&]EX/ >YEX/ >YEX#/# >Y ик#9A]иии01"&5463!2+ #"&5463!2+#"&'q""b""W"":""?6224&&&&t&&&&" !7,8/9/8и/ A ]Af ] 9A]9#иAi]A]#9A]A.]/#9A0]EX/ >YEX/ >YEX+/+ >YEX3/3 >Y ик+9A]A]+9ии&и'к/+9A/]01"&5463!2+>32#"&5463!2+#"&' #"&'5""&""{$!"$e"""" '&+1 3+&& &&&&)F&&&&$"N##FC/$/A]A ]A$]$"A"]A]A/]$35A9]EX / >YEX/ >YEX+/+ >YEXY ииии!и"и$и%и2и3и5и6017 #"&5463!2+7#"&5463!2+ 32#!"&546; 32#!"&5463EG""X""L7""0""AA3""""`O""""U7&&&&&&&&&&&&&&&&%&/'/ܹ&ܸи/A]"и"/A%]EX/ >YEX / >Y Ag]Ah]01%54632#!"&547!#"&=463!2!**!""c9!**!""##&&##&&^w 1 + 9и &и.EX#/#>YEX/>Y+9 Ag w ]A  qA& 6 q#)A))9)qAh)x))))))))) ]A))q0132#"&=4&#"&546326=4632#"IJ3Q8""ho""oh""8Q3J,\C_<&&mo&&pm&&<_C\a6 /+EX/>YEX / >Y014632#"&5!**!!**!####>w - + 9ии $и*EX / >YEX!/!>Y+9 A)9qAhx ]Aq!'Ag'w''''''''' ]A''qA&'6'q01.=4&#"&5463232#"#"&546326=46IJdp""ho""oh""pdJ,\s&&mp&&omտ&&s\3!+ 01&'.7>3232676#".#"'@x:6ged2*T,'Ax96ged2*T +8+  +8+ v(HX(%+<X++Af%v%%%%%%%%% ]A%%qA%%5%q<PEX / >YEX/>YMA+7S+  A) 9 qAh x ]A  q 9Ah]S*01.54>3254632#"&54.#"326766#"&'.7>32654&".5/fs=Kra1!**!!**!!EjHQa63]QdH0Sc4M3>]?C4 'g325LE  cԀXA::####1ZD(AzllyA98%#3:>^.>#*F3(# * (X(%+<X++Af%v%%%%%%%%% ]A%%qA%%5%q<PEX / >YEX/ >YMA+7S+  A) 9 qAh x ]A  q 9Ah]S*01.54>3254632#"&54.#"326766#"&'.7>32654&".5\i8Fl[3!**!!**!$GhEI{X2.UxI\H.Gd4M3>]?C4 'g325LE  R~^hIA<<####-L72Z{II{Z287 #95A].>#*F3(# * "ø /и/ܸA]A0qAqA]A]и/EX/ >YEX/ >YEX / >Yии01"&546;5463232+#"&5a""&&""&&&&""&&D""&'-(/)/(и/) ܸAfv ]AqA%5q A*:qAiy ]A qEX/>Y+#A)#9#qAh#x######### ]A##q014>32#".732>54.#",Lf::fL,,Lf::fL,'55''55':fL,,Lf::fL,,Lf:5''55''5 9Dڻ:++4+A]"и)и,Af:v::::::::: ]A::qA%:5:q?/EX&/&>Y07+0"и"/0*и*/,709014&'>76#"&=.54>75463254632#"&mjH9.D_!%%!`l;Y/'+Agw ]AqA&6q99BAhB]9IA)I9IqAhIxIIIIIIIII ]AIIq/Sи'Z01%>3232676#".#"&'.7>'#"&546;.54>32#"&=.#"!2#!(E";63!I-+>d-!?BH).mB( @S- ""_ 1Y}M^B!**!$c<+D/$6""  3 ."  2:c\\3&&=AE'EwW280'##Z0@%#??B%&&CVQ +C;+$+2+++G+A*:qAiy ]A qAf$v$$$$$$$$$ ]A$$qA%$5$qA*G:GqAiGyGGGGGGGGG ]A GGqAfQvQQQQQQQQQ ]AQQqA%Q5Qq/7+Ah] 7?012654&'%.5467&54>3!2#"&=#"#!"&=4632>54&'%.'uHEC?NYGC#GhEZ"!**!HEC?&NY$3!#GhE"!**!40440&9^756U&0yWCc1074Y?$&##756U&0yW"940165X?$&##G/*:'/*:#^On_ //014>32#".^)H`77`H))H`77`H)W7`H))H`77`H))H`a]"Y+ + /EX/>YEX/>Y!и"01#"&5.54>3!2+#"&5#!**!Wh:=o\""D!**!##T0X}NQY.&&##y(%@I5<+ &+5Ai&] & 9 &и/ ,EX/>YEX8/8 >YEX/ >Y 9Agw ]AqA&6q/A)/9/qAh/x///////// ]A//q?и?/@и@/014>32#"&54632654.#"&5467>54&#"+"&546;2`W^_0_Ok|;k[3 #}$C_:""deso4Q7"""Rc76]H_*)}Zb4"+%"ys>`A"!$$  rX]l"?X7&&&$'DM+E(+1J+ +Afv ]AqA%5qA*:qAiy ]A q4 9E=A*J:JqAiJyJJJJJJJJJ ]A JJqEX/>YEX/ >YFA++E+Agw ]AqA&6q#A)#9#qAh#x######### ]A##q4AF9014>32#".732>54.#"746;2&/##"&532654&#$UԀՙUUԙUzBxffxBBxffxB"7Z?"LEk0Y##|jDB>?R````kKKkkJJ"!;Q1Kgt.##9318$+?S&@,+'+6J+Afv ]AqA%5qAf@v@@@@@@@@@ ]A@@qA%@5@qA*J:JqAiJyJJJJJJJJJ ]A JJqEX1/1>YEX/ >YEX;/; >Y"+ A) 9 qAh x ]A  q;EAgEwEEEEEEEEE ]AEEqA&E6Eq1OA)O9OqAhOxOOOOOOOOO ]AOOq012'.#"32676#".54>4>32#".732>54.#"u-]* %$B&&B11B&&B$% *]-DsT//TsUԀՙUUԙUzBxffxBBxffxB( 7R66R7 (/XQQX/````kKKkkJJ<*%< =/)и)/;A;;;]A ;; ;0;@;P;qA`;]YEX/>YEX,/,>Y 9 9 9&3и401#"&/#"&7>32>32#"&'"&5463!2+#"&5m] '( ^## ## ##""~""##0### + #D##|""""##| `>&'&67E    S %#  .('v(/)/(и/ Af ])ܹAi]EX/>YEX/>YAh]#014>32#".%4>32#". "--""--""--""--"-""--""--""--""-@"L17!+ +и ии!*01!"&5463!7>32+!2#!'.?#"&5463ɜ""}* S""|""=|* S""&& *&&&& *&&r@D,5<++'+Af5]<59' и /и/.и/и.Aи/к1<59D<59/EX*/* >YEX8/8 >YA/++Ah]ии**#Ag#]1и2и?и@иBиC01#"&5463!2#"&=!32+!54632#!"&5#32#!"&546;#c"""!**!""!**!"B"HX""""2&&&##&&c##&&2&&&&vXt%1;YEX/ >Y)9-Ag-w--------- ]A--qA&-6-q497A)797qAh7x777777777 ]A77q014>327>#"&''.?.%4&'32>%&#"XLvR<%- 0BGLvS<$, /BF~&#*d9S`5 HVpS`5QX+(5,EQ݇X*)3+CQ܇\;;Aylw&'&67""""W +  + &&&& *&% ## %&* <T+=H+&+H=9Af] 99H=9Ai]&9+&9=LA4LA9/"/EXD/D >Y5;+ +5и икD9ии)и*и +и2иD=KиLи;M01'#"&546;'#"&5463!2+#"&5463!2+32+!2#!32#!"&546;5!"&5463l""{F""N""]A""0""Dz""l'""""""""&&&&&&g&&&&&&&&&&&&&&,++01!!!!,ttU_Ua)y+EX/>Y&+Agw ]AqA&6q01#"&'.7>32654>32'.#"3^UK= !?tYEX/ >Y< +<и/ <94A)494qAh4x444444444 ]A44q49)A)9qAhx ]Aq012+"&'#".54>3254&#"&'&67>323'.#"326710P N5n<'@/H=N9Z ,/3:8S7@\9 3Y+#A)#9#qAh#x######### ]A##q014>32#".732>54.#":eQQe::eQQe:"?X66X?""?X66X?"EQc88cQQc77cQ5X?$$?X54X@$$@XKAMTE +B+R+B9B%к:B9AfEvEEEEEEEEE ]AEEqA%E5EqQиQ/EX7/7 >YEX=/= >YEX/ >YEX/ >YR+ Ag w ]A  qA& 6 q 9R%и7+A)+9+qAh+x+++++++++ ]A++q:7+9Bи Hи+N01#!32676#"&'#".54>354.#"&'&67>32>32"32>5"!."q,;!0P*58HO{*0Q;`D%Czh 3(.U.2@GQl (qGOpF"<3*I6/?/>и/?ܹ&A*&:&qAi&y&&&&&&&&& ]A &&q2Af2v222222222 ]A22qA%252qEX/ >YEX/ >Y-Ag-w--------- ]A--qA&-6-q9A)999qAh9x999999999 ]A99q014>3276#"&'&'.?.%4&'32>%.#"xKjX>K-I,0KjX>K,I,/>(`9K|X1`(`8K|X1jH2-H.FYEX/ >Y#Ag#w######### ]A##qA&#6#q*Ag*]=3Ah3]01%#".54>?>32326754632#".54>32L\SZ0)PwM # # E9R6c^=k/!**!%32%%23%}).-.RtECePA ,1;%I\Y##32%%23%%3 K +Af ]EX/>YEX/ >YAh]01"7632##".54>32%-160-Y*8 8**8 8*20y25 8**8 8**8>6M +/+01"&5463!2#"&5"","!**!&&&v##F%7EX/>Y, ++иA)9qAhx ]Aq0017>32'.#"32+#"&'.7>3267#"&5463&5l2 *0V0KV ""C5l2 *0V0KV B""L')*Za&&e')*Za&&3!C;0<++ 0A+01&'.7>3232676#".#"&'.7>3232676#".#"'@x:6ged2*T,'Ax96ged2*T,'@x:6ged2*T,'Ax96ged2*T +8+  +8+ P +8+  +8+ +&7>&'&7>&' 4    4  4    4 $F   FF   +%'.7&>76'.7&>76z 4    4  4    4         >r-8.+-3+!+!и/и/-#и!(и(/Af.v......... ]A..qA%.5.q/EX / >Y%++  Ag]Ah]"3и"401%54632#!".54>3!2#"&=!32+!**!" tIIt"!**!""1[NN[1##&Q܋ܙR&##&&cms>=tF/;B0 +6+@+69(69Af0v000000000 ]A00qA%050q?и?/EX%/% >YEX+/+ >YEX/ >YEX/ >Y@+ Ag w ]A  qA& 6 q 9%9A)999qAh9x999999999 ]A99q(%99 3и9<01#!32676#"&'#".54>32>3232654&#"%"!."q,;!0P*58HNy)%sONuN''NuNPr%)yNOpF"hKOOKKOOKsEP ,@"ZzJ%)355DFDFA|ss|AGEFF@tfwgv" +012#!"&5463""""&&&&x"'5D +Af ]и #++(.+014>32#".4>32#".2#!"&5463 ++!!++  ++!!++ """"+!!++  +k+!!++  +&&&&o]Z 7&'&476 ! ! $ 1 $ &7>&' 4    4 $F   %'.7&>76B 4    4     9%D9+#.+иD и#2'4и9@EX/>YEX/ >YEX/ >YEX*/* >YEXYA)9qAhx ]Aq*#1и2и3и4и25и6иCиD01#"&546;54>32'.#"!232#!"&546;!32#!"&546;""/ZTG< &;v&++&и> и *и*/&.и3:EX / >YEX/ >YEX6/6 >Y+и и !&и-и /и0и=и>01#"&546;5463!232#!"&546;!"32+32#!"&546;""c"y""""qje""t""v""&&{&&&&&sgr&&&&&&"12/и/ܸA]A0qAqA]A] ии!!и%и!)и0EX/>Y-+ии и!и"и(01"&546;5#"&546;5463232+32+#"&=a""""&&""""&&&&&&""&&&&""(& //01#"&76;2?4"$e + +% (%& ////01#"&76;2#"&76;2r4"$e + 4"$e + +% (%?+% (%2<3G[oyH +*R+4+\>+f+A*>:>qAi>y>>>>>>>>> ]A >>q>\9>\9Af*v********* ]A**qA%*5*qAf4v444444444 ]A44qA%454qAfHvHHHHHHHHH ]AHHqA%H5HqA*f:fqAifyfffffffff ]A ffqEX%/%>YEX/ >YEX/ >YC+M/+C9 и9Ag9w999999999 ]A99qA&969q99%WA)W9WqAhWxWWWWWWWWW ]AWWq9aиCk01%4>32>32#"&'#".4>32#".32>54.#"32>54.#"32>54.#"6'&7v+Kc9Bk$#lB9cK++Kc9Bl#$kB9cK++Kc99cK++Kc99cK+'44''44''44''44''44''44'0/100/109cK+9009+Kc99cK+8008+Kc9cK++Kc99cK++Kc4''44''44''44''474''44''4 -22--22-IU + EX/ >YEX/ >Y и01#"&5463!2!2#!"&5463!3""T"A""""9&&&0&&&& ` /01&'&47%632'%O !   $$  >!+01232676#".#"&'&67>%DB@"F# 32#".'&>32fg#   ?`NN`?   #7D  4T; ;T4  D77Q +Af ]+014>32#".&44&&44&4&&44&&4s)_' (/)/(и/) ܸAfv ]AqA%5q A*:qAiy ]A q/#+A)9qAhx ]Aq014>32#".732>54.#"s'BZ33ZB''BZ33ZB'x".."".."3ZB''BZ33ZB''BZ3.""..""._(f#$/%/$и/%ܹA*:qAiy ]A q ++01%36#"&'.7>32654&".54M3>]?C4 'g325LE .>#*F3(# * LGg+#+# и01#".54?>32#".54?>32  $   $ *            (,h+Afv ]AqA%5q+01%32676#"&54>75K/+":#R/^j4I-/PF>%&! gX*PMJ$  h/01"'%&47>%6f!   $ $9L6 ++#+и!и 2и 6/EX./. >Y.9 ик.9."5и601&'&6?#"&5463!2+76!4632#!"&546;1*բ""*""*!**!"""\ )&&&& )bI##s&&&? -u +иEX/>YEX%/% >Y%9 %9%,и-01&'&6?!"&5463!276!2#!"&5463!)*""h"*A""""9-w )&&&[r )&&&&)v&3r&R #l&:h&W a6 ?+иEX/>YEX / >Y014632#"&54632#"&5!**!!**!!**!!**! ####S####2t#90+)+0и0 A*):)qAi)y))))))))) ]A ))q408и/9/EX/ >Y+ "$и .и/и0и7и$901#"&546;#"&5463!2#!"&546;!2>54.+32+""p""vŠLLv)""pPYf88fY"" &&s&&R܋ܙQ&&;sppt;&&h@H4HUI/J/I"и"/Jܺ"9"9*"9"5Af5v555555555 ]A55qA%555q?A*?:?qAi?y????????? ]A ??qEX/ >Y'D+*D'9:Ag:w::::::::: ]A::qA&:6:q01.'.7676#".54>32.'&'&6732>54.#"=  ";;n4 % BkL)H~ff~HH~fDv4(i? % :-SuGGuS--SuGGuS-j ,!A@%Y ##' <YEX$/$ >Y-+ии$+и,и501#"&5463!2+32+32#!"&546;2654.+I"" ""ZZ..ZZ""""hor7U;&&&&|3XxFEwW2&&&&cZ*F4wM ,@J(+7+ и! !9-A*7:7qAi7y777777777 ]A 77qEX/>YEX/ >YEX$/$>Y2+ $9$+и,и<A)<9<qAh<x<<<<<<<<< ]A<<q01#"&546;2>32#"&'32#!"&546;32>54.#"R"""=a]sBBs]d<""""p.RqBDjH&&HjDBqR.&&&=JO?vllv?QKG&&&&JtO*.SrDDrS.*Ot0;/ +  + 01'&7%632#!"&546;922'99=[ T"""" 63&+-+ +A*-:-qAi-y--------- ]A --qEX / >Y"+ Ah]" 0A)090qAh0x000000000 ]A00q01#"&=47>32!54632#!"&5467>54&#"&%Y+/'+ '/95A)595qAh5x555555555 ]A55q<Ah<]01>32#"&'.7>32654.+"&546;2654&#"#"&=4L !1r9Zb0D)4'QYYM*I &%#"#?X4?YbL:^B$" + A=#. #%7B<;?n(vc5k5l+5q(!vc5k5l" w5q!r"+5q w5q<HWE0*+*7EX&/&>YEX-/->YEX / >Y+!+&<A)<9<qAh<x<<<<<<<<< ]A<<q)&<9-4Ah4]!?иFиJиQкR &9 UAgUwUUUUUUUUU ]AUUqA&U6Uq01%6#".'#"&546;&67#"&546;>3254632#"&54.#"!2#!!2#!3260_kWnKa""PQ""dNmSW0!**!!**!!AaAh"""":""j\%#3BA7f\&&)_&&&Ze6A99####1ZD(~s&&*Z*&&v9 ////01632+"&7632+"&75"$e + v5"$e + +% B(%+% B(% -//EX/>YEX/>Y01#"&76;2#"&76;2r4"$e + 4"$e + +% (%?+% (% //01632+"&75"$e + +% B(%( /EX/>Y01#"&76;2?4"$e + +% (%2a12/3/A]2и/$Af$]($9)9.Ai.]*.9EX/ >YEX / >YEX / >YA ] Agw ]AqA&6qии'и(к) 9*и+012+&'&67>7#"&5463!2+ #"&5463["">g0\jR'EaPM2?""b"" Y""&&bV)(,&He&&&&2&& +012#!"&5463""v""&&&&uN1w.+A])*/EX$/$ >YA*]*и*и$A]014632!2#!32676#".5#"&5463!**!""e)D2FB/&W\]+W|O%""L,##&&7S78+$$-).YVy&&C ?<+ +!+Ai ] 9Ai!]% 9'и7,EX/>YEX / >YEX/ >YEX/// >Y ии$и%и(и)и6и7и8012#"&5463!2+ 32#!"&546;32#!"&546;#"&5463\"}G""N"";P:""""R?""""o"" &P&&&&w&&&&*&&&&&&P|';YEX#/# >YEX7/7 >YAg]и-01%4>32#".%4>32#".%4>32#".$11$$11$o$11$$11$"$11$$11$o1$$11$$11$$11$$11$$11$$1C(&Ej (&AjxT(&NjHx(&SjXt6&/jF6&5j 6&!j2a(&j<6&9j`&AC`&EHx`&SxT`&NXtn&/Fn&5n&) n&!PL6&%jPLn&%6&)jI(&jI`&`&AiI`&ixT`&NiHx`&Sin&)iFn&5iXtn&/iXtn&/@Fn&5@n&)@PLn&%@  n&!iPLn&%i n&!@C`&EiC`&E@>I`&@`&A@>Hx`&S@ xT`&N@&A &!&AxT&NM&MF&. &!Xt&/" +012#!"&5463""""&&&& 6 ' &'.7 &67>f++++++++2a`&iV +012#!"&5463""""&&&& +Af ]+014>32#"..=##=..=##=.F#=..=##=..=EEX/>YEX/ >Yиик901>3232#!"&546;!  2((1 ZQ""""Px##&&&&vn +01#"&7>;2> #> # \&! '! (FJ= +?+&8+Af] 9A*8:8qAi8y888888888 ]A 88qAi?];?9C?9F 9G 9H?9/EX/ >YEX"/" >YEX;/; >Y)5+HD+ ииииBиCиIиJ01%2#!"&546;#"&5463!232+32676#"&5467#"&546;'!!#""""8K""o(1 a="">YM+":#R/^jYK""RS&&&&&&#&&&S{7%&! gXMB&&vvHn'i#vHv&#vHn'(#vH_'#Ptl&$Pt&$PL\&%PLl&%PL_'%PL'%P(LTB++7I+0(+$и&A*I:IqAiIyIIIIIIIII ]A IIqL09P/EX3/3 >YEXL/L >Y:F+%+Ah]ии%!L'(и3,Ag,](SиT01#"&5463!2#"&=!354632#"&=#!54632+32676#"&5467!"&546;f""j"!**!!**!!**!+!**!"YM+":#R/^jYK8""f&&&##[####[h##&S{7%&! gXMB&&b\&' bn''b&' b_' 'UY+*+и *&/*3и+4и&8и?иCиDиEиFиJи Qи UиVиWиXиY/"/EX/ >YEX/ >YEX+/+ >YEX;/; >YEXM/M >YVD+ ииии)и*и2и3и;4BиCиFиGиTиUи3WиX01#"&546;5#"&5463!2+!5#"&5463!2+32+32#!"&546;!32#!"&546;5!z""zH"":""\\"":""Hz""zH""""\\""""H&&&&&&&&&&&&t&&&&h&&&& llP|n&(\&)_&)&)(8ֻ4+-+Afv ]AqA%5qи/049/EX/ >YEX0/0 >Y*+ии0и7и801!"&5463!2#!!2#!32676#"&5467!"&5463!""""""YM+":#R/^jYK""&&&&m&&S{7%&! gXMB&&')sn'*P&+ PLn'i6,P&,G33PL&,PL&,Fn'i.Fl&.F&.Xt\&/Xtu&/Xt&/Pn'i2Pl&2P&2)n&3i()s(?$+Ws+3-+L+Af?v????????? ]A??qA%?5?q$?9$ и /A*:qAiy ]A q,sW9WkEX)/)>YEX0/0>YEX/ >YEX/ >YEXQ/Q >Yh\+Rn+QAgw ]AqA&6qQ9 Ag ])<A)<9<qAh<x<<<<<<<<< ]A<<q,)<907Ah7]01&'#"&5463232>54&'.'.54>3254632#"'.#"6#"&'.7>32654&".5%`!**!!*+)BcB"C8.pwv3%>-:gU[9!**!!*&1npw,%(kv{8-N9!2`]4M3>]?C4 'g325LE  lN##,#*t|5J,BN.>R5N}W.E9=###]]hT+74KeCI{\7\.>#*F3(# * )n'3)&3zR;ջ +$/++$3ии$ии/(8и8/ /EX+/+ >Y"+и  Ah]иии+$2и3и"401!#"&5463!2#"&5!32+32#!"&546;#"&5463!**!"Z"!**!""""""""J##y&&##5/&&&&&&:&&zRl&4zR&4F\&5Fu&5F'5F(N,+2D+)+M )%Af2v222222222 ]A22qA%252qGD29/!/EXG/G >Y5A+ ииGAgw ]AqA&6qии(и)01"&5463!2+32>5#"&5463!2+32676#"&5467#".5""D""p!CeDDeC!p""D"">f^3I-+":#R/^jKAbl:&&&&NmEEmN~&&&&n-.ND>%&! gXG=2fkF&5F'5n&7in&76&7jn&7@ <n&9 <n&9@#n&:i#_':N&A&A(JYS*+ +G3+A*:qAiy ]A q3G9" 92 93KAfSvSSSSSSSSS ]ASSqA%S5SqEXD/D >YEX/ >YEX%/% >Y +/N+%VAgVwVVVVVVVVV ]AVVqA&V6Vq%V9"%D92N/9D6A)696qAh6x666666666 ]A66q01%2+32676#"&5467.'#".54>3254&#"&'&67>323.#"3267G""YM+":#R/^jgU+OoK~\3AoRQG]qQ?0 '^ei3BEN6[B%e[kJ&&S{7%&! gXSG5(EQ'KlFTvI"Ua[+- 1+ rO'?-IQYL`&Cir&C `& CQ&C N (<I3+' +' и /)и и /)Af3v333333333 ]A33qA%353qEX#/#>YEXE/E>YEX/ >YEX/ >Y.+ #9#8иE?Ah?]01%2+"&=#".54>32#"&5463!24.#"32>#"&76;2"""-aQg::gQ[-"" "$C_;9W;;W9;_C$*R" &&&FGY?vllv?KB&&&-JtO*.SrDDrS.*Ot#j  :NCE*+ + ;ии и и!и!/;"и"/2и;3AfEvEEEEEEEEE ]AEEqA%E5EqEX/>YEX/ >YEX%/% >Y+/@+и"%92%93иJ015#"&5463!232+32+"&=#".54>325!"&54634.#"32>l""!"m""mR""">d]sBBs]d<""/.RqBDjH&&HjDBqR.RF&&&&&&&&PQY?vllv?QK&&cJtO*.SrDDrS.*OtCN&ECr&E CQ&EC&E(C>EF/G/F1и1/Gܹ&A*&:&qAi&y&&&&&&&&& ]A &&qи/)и)/&,и,/&6и6/&?и?/BиB/EX6/6 >YEX)/) >YEX,/, >Y#+B+,Agw ]AqA&6q6?A)?9?qAh?x????????? ]A??q013267632676#"&5467#".54>32#"!.0eE + ! '(-=&+":#R/^jSG'Q*nt=G~iou@"k}c.( 3%*G>8%&! gXK@C}qmEEzd"x}oq{aN&Ga`&Ga&GaQ&G Qb N+*+ Iии Eи/*и/ и:и.# 9и>EX/>YEX/ >YEX&/& >YEXA/A >Y+и&9&-и.и4A)494qAh4x444444444 ]A44q.:и;иHиIиJ015#"&546;2!2#!>3232#!"&546;4.#"32#!"&546;#"&5463\"""""AdEnM)R""""\(=)@tX4\""""R""f2&&&v&&ag.TyK&&&&+G38dR&&&&V&&M'rHIN&I&(IS4B +)+ Afv ]AqA%5q, 9 5и ;EX/ >YEX/ >YEX,/, >Y&+?8+,  и3и401#"&5463!2!2#!32676#"&5467!"&5463!#"&=46323""T"A""YM+":#R/^jYK""9&99&&99&&&&0&&S{7%&! gXMB&&####I&a0`&nhC &?'irK &KGL33? &K[ &Kh M`&MiMr&M M&MxTN&NxTg&NxT&NW`&i2QWr&Q W&Q`&Ri(uA$+Yu+3-+AfAvAAAAAAAAA ]AAAqA%A5AqAи/$ и /Yи/,uY9YNYmEX)/) >YEX0/0 >YEX/ >YEX/ >YEXS/S >Yj^+Tp+SAgw ]AqA&6qS9Ag])>A)>9>qAh>x>>>>>>>>> ]A>>q,)>907Ah7]01.'#"&=463232654&'.'.54>3254632#"'.#"6#"&'.7>32654&".5/Hq-!**!!*%xx.',t6"8)6_Ld9!**!!*"AUf:am+&*p|~6%>-/ZV4M3>]?C4 'g325LE  8.8###aWUE$+  &4D,CgF$;3-###+:"D?!(  '7I0@jN.\.>#*F3(# * `&R&RuNC+ ии"и#и;и@EX / >YEX6/6 >Y!+и  иии6(Ag(w((((((((( ]A((qA&(6(q!<015#"&546;4632!2#!!2#!32676#".=#"&5463""!**!""e"")D2FB/&W\]+W|O%""@&&,##&&&&`7S78+$$-).YVm&&uNx& uN&2HxN&SHxg&SHx&SH(zO570+NG+ +NCA*:qAiy ]A qGN9C"и"/B#и#/7+EX3/3 >YEXJ/J >YEX/ >YEX/ >YEX&/& >Y +#&393,=и,CиD01%2+32676#"&5467.=#".5#"&546;232>5#"&546;29""YM+":#R/^jYLBgEnM)R"""(=)@tX4"""&&S{7%&! gXMB"ygk.TyK&&&+G38dR&&&0Hx&SHx&S`&Ui`&U(&Uj`&U@2a`&2a`&@ `&WiQ&W (V?ͻ+/5+ и"и'и7и 8*/EX/ >Y+8+ иии!и*#*2Ah2]#6и701!2#!32#!"&546;5#"&546;#"&5463!2#"&=!!2#""H"""""""""!**!Y""4&&&&&&&&w&&&##&&H+A9+.#+и/ и /.G*/&/EX/ >YEX4/4 >Yиии/и/ и-и.и4=Ag=]Dи.H01#"&5463!2+32#!"&546;"&5463!2+#"&'&546323265V""B""V`""""`\""j""GBfGEx,!**!3?8&&&&m&&&&&&&&<^B#8-###AH9a1S)P^N +4-+   и " )и4O4Qи4W5^EX/ >YEX0/0 >YEX:/:>YEX/ >Y&+ ии*и:JAgJwJJJJJJJJJ ]AJJqA&J6Jq*PиTи&[01#"&546;232#!"&546;#"&=4632"&5463!2#"&'.54>3232>5#"&=4632{"""""""&99&&99& ""6"%O|WQ::s?2D)&99&&99&&&&0&&&&####&&&jVY.*" !7S7E|####a$ +EX/ >YEX/>YAgw ]AqA&6q01!"&5463!2#".'.7>32>5Y"""%O|W+]\X%/BF2D)&&&jVY.)-$$+87S7;<6 +Af ]EX/ >YAg]01%4>32#"..=##=..=##=.#=..=##=..=*& //01#".76;2 #h + (%;'j +Af ]и EX/ >YEX/ >YAg]#Ah#]01%4>32#".4>32#"..=##=..=##=..=##=..=##=.#=..=##=..=#=..=##=..=;#: +Ai]/EX/ >YAh]014>32#".#".76;2.=##=..=##=.7 #h + #=..=##=..= (%9<';ٸYEX#/# >YEX7/7 >YAg]и-01%4>32#".%4>32#".%4>32#".9.=##=..=##=..=##=..=##=..=##=..=##=.#=..=##=..=##=..=##=..=##=..=##=..= _<';ٸYEX#/# >YEX7/7 >YAg]и-01%4>32#".%4>32#".%4>32#"..=##=..=##=..=##=..=##=..=##=..=##=.#=..=##=..=##=..=##=..=##=..=##=..=\';YEX#/# >YEX7/7 >YAg]и-01%4>32#".%4>32#".%4>32#".5$11$$11$$11$$11$:$11$$11$o1$$11$$11$$11$$11$$11$$1 |';YEX#/# >YEX7/7 >YAg]и-0174>32#".%4>32#".%4>32#".$11$$11$W$11$$11$R$11$$11$o1$$11$$11$$11$$11$$11$$1 <';YEX#/# >YEX7/7 >YAg]и-01%4>32#".%4>32#".%4>32#"..=##=..=##=..=##=..=##=..=##=..=##=.#=..=##=..=##=..=##=..=##=..=##=..=Rz +012#!"&5463;""V""&&&&  +012#!"&5463 i""""&&&&| +012#!"&5463=""""&&&& +012#!"&5463s""""&&&& +012#!"&5463""""!--!!--!6#`+и и /EX/>Y+ +и "01 !#"&=!"&5467>3232+&% {% mm$*  B""(KOm/ /EXF/F >YEX;/; >Y и&и Oи.иLи/иBи701#"&546;7#"&546;>323>3232+32+#".7##".737# ""L""b Wb W""M""d Zd  LL!''!!''!7 7 !''!!''!   P /A ]Af]EX/>YEX/ >YAg]012#"&'&34>32#".-160-Y*8 8**8 8*2y02 8**8 8**8' -//EX/>YEX / >Y012#"&'&3!2#"&'&3/7#$7/ /7#$7/2>22>2XX@$d * &  LxnFN$nZ("!@!"|#"#$%V%&&&T&&&' (N)N*T+*+,-./?B@@BC`CCDFHGHHINIJKLLM NN$NOPQRST0T^TUzUVVXX0XXXYZ Z[[[]^<^f^^__`f`aaBab`blbxbbbcddeffghNhbhvhiijj>jdk>k^klmrm~mmmmmmmmmmnnnn&n2n>nJnVnbnnnznnnnnnnnnnno oo"o.o:oFoRo^ojovoooooooop*p6pVppppqqrr*r6rBrNrZrfrrr~rrsssssuu$u0u:ތbfƏptJ& &3%: _ l y    A 4 LA   J   1 $I "m 6 , " 46sCopyright (c) 2013 Quote-Unquote Apps.Courier PrimeRegularQuoteUnquoteApps: Courier Prime: 2013Courier PrimeVersion 1.203CourierPrimeQuote-Unquote AppsAlan Dague-Greenehttp://quoteunquoteapps.comhttp://basicrecipe.comCopyright (c) 2013, Quote-Unquote Apps (http://quoteunquoteapps.com), with Reserved Font Name Courier Prime. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.http://scripts.sil.org/OFLCourier PrimeCopyright (c) 2013 Quote-Unquote Apps.Courier PrimeRegularQuoteUnquoteApps: Courier Prime: 2013CourierPrimeVersion 1.203CourierPrimeQuote-Unquote AppsAlan Dague-Greenehttp://quoteunquoteapps.comhttp://basicrecipe.comCopyright (c) 2013, Quote-Unquote Apps (http://quoteunquoteapps.com), with Reserved Font Name Courier Prime. This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.http://scripts.sil.org/OFLG{  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMOPQRSTUVXYZ[]^_`ado\WNsl|ghbkr{wvity~epqujzncm}xf      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~NULLEuromacronperiodcentereduni00A0Delta commaaccentAbreveAmacronAogonek Ccircumflex CdotaccentDcaronDcroatEbreveEcaron EdotaccentEmacronEogonek Gcircumflex Gcommaaccent GdotaccentHbar HcircumflexIbreve IdotaccentImacronIogonekItilde Jcircumflex KcommaaccentLacuteLcaron LcommaaccentLdotNacuteNcaron NcommaaccentObreve OhungarumlautOmacronRacuteRcaron RcommaaccentSacute Scircumflex ScommaaccentTbarTcaron TcommaaccentUbreve UhungarumlautUmacronUogonekUringUtildeWacute Wcircumflex WdieresisWgrave YcircumflexYgraveZacute Zdotaccentabreveamacronaogonek ccircumflex cdotaccentdcarondcroatebreveecaron edotaccentemacroneogonek gcircumflex gcommaaccent gdotaccenthbar hcircumflexibreveimacroniogonekitilde jcircumflex kcommaaccentlacutelcaron lcommaaccentldotnacutencaron ncommaaccentobreve ohungarumlautomacronracutercaron rcommaaccentsacute scircumflex scommaaccenttbartcaron tcommaaccentubreve uhungarumlautumacronuogonekuringutildewacute wcircumflex wdieresiswgrave ycircumflexygravezacute zdotaccentIJijdotlessj period.alt comma.alt colon.alt semicolon.alt ellipsis.alt1 ellipsis.alt2 ellipsis.alt3 ellipsis.alt4 ellipsis.alt5 emdash.alt1 emdash.alt2 emdash.alt3 emdash.alt4 hyphen.alt foursuperiorvedo-2023.4.6/vedo/fonts/Theemim.npz000066400000000000000000003304701444463326400171350ustar00rootroot00000000000000PK!鲰VHfont.npyVH|:i@BK BZ-ԓ6m9^^ ((+X" ׊(*Ek&xw^okgΜ)Y,*ISYm1Ln;m#&d6 lɣ$O!C_C؄)'dF)F̨ 6q*VUϔMַfpi< !KP>p{zz<73+.x* OTe65LTHsBTH!͖v6E8VP!^PO`)h(`0`PpP.`8`zumXOl4R)+50Vl4Qj"5L0QjTjLj\j 0hK)hKր-TRT) 0MJt)Cj4CjRGLfjنiZiٶǥ pD~T6œ^_K64N2qHן/袣*{z+Ӕ,+=zz;wQ@YHka >Ӎ{q{ >p;n;Pev;9,qD<ղ6y06z`06u6hrvnx袡@Cƶ=Z4hn̢MMJj9`K`4yfvnfWVx9;\ɢzƻ=o\|9$?g}{חU*G:5Ӳ<*^uEY2fڒUPQķj΀ķ 2=^[eg%4R_H/Yf748&Eh@k,ZMc>QuQá9h GfMh"`8Z4Q4` 4D,6C,6I]6 92J--*P_e&쯘jfxA@<#aCkU[W-d ڧZ=_^?d8Nħ7ő3L>ʗro<_Z&-|bA}s;*{U}ߝ:{>MWu=z^saZŔs|oz Cb~8 N4>K` =ɮIt=Ecݬ]!~0=CXB:eRNOKJQ-ʢ\ħ|֔';;3X4_д-I}TYŗ_/|}W٣R2Xĕt1Fj''iƈPv,5B}X=RV]WK}[y_.Y_㕼 _aW~HgYes#ddN{׎Ielex_o!+ qQi,5ĝ6ħ _eY4?28yS/3EʃThj3>o^oyٴ1fłdwsWW!ž ۲OC Vj&r+ݫUZ1TCk0ѡ;Bѡ1\cjq:8kୖ0Q#GmPKŐnBT k!Nm(a"& m EjB5O<56@Apl 3JQmT6B:fJY΀YR6(eK]@HJ9ݤR] ހ=><>}=~8Gi i@p4-JC!0paR!p(ȑJH@s29hT%``ЖhKh`K"Bi,]-y=+ɀ>ISJ$ JK AD]2@Gr@GJQc 8iF@äi<$%dV8 *(M*̀N:p4 p4p1 J9Ӥsہכ F@GHII K pppp ppt(WX a p%`Հ] p;Jt]MwIwn @z?6Ivnv}p'C@w>w@y@*mR,If$[ht 8 Dc3rvTL?B\~Xߣv^6[KrlZ^T{h#!)2=OKu|I|N?dFO"6!k\1XZ? 3OmR_@ɑ#SE((iMu_/ʭz8=H>l-A~Pz"ܦ#GyxhTSO}|q{!7JUVĹE8L蘛 %FYjqE$]( 4 QՅAa[s֢cѐh}`}BT WE]}hDSx ڄ"̉xwhPģ .^"ZhA&B)mO" Al"$ 񗁂0_&P4vğAv́c;° ŞmW{ݠPnPB00hؗ"?`?=P$@J}@v CQ(Db8n8pba0t0t+*AaB DJ2q0pS* Tftg+%( #>U>^>bQpF5x@1fh2@M6~9i4 16J'JӠ4p4e}n#>Xv1۰i>=FV6dL^S"MoIrOr]NnkǴvz7]ejrV,W$oK^w@CtmvQұfh6Ԟ7kW`eeh29M6e$t'zna^h7+fyc"Gɯ*4_\Sz7ml|NNćU!^*WMƢ^y2=ol8ҏ'MC(}zYiwv]p&:%gYu'Cnf 6nA ),^H2Ξ:;&hE| &y۫y6_P]3QmD 6˳ U[+vWߨjڟڣlV½ƽ[?Zt7†ad_Ēpߒ;=]|:Q}&C`vVqsI0d-|>+x}>V'?ik9GzKq}2joy5'`L[gH>.62fuw?@_.f= Ew:<//q5u'o`^lVmӸʼvn>yлX&toCn0@r`$Q Z+| 1uIA?v$7a8&Z[$6#Dݰ%-5t4; M Vۡ#z3 ,m>ujxqwG_wwzf}4v3=PxN7MPwV Vz,^hoeVz Mya ]MB[SmC^LEڙڙ p&ftm J4 p8iwt-.Z6 uDTaOE3pQڜ t,scA鱠%.723 gd{z'6[m` nk=pPMYPZ FeT_`':_-K. 'Ns==w&gz#/ x-=[ pV( V:,i,@gI;8 NnFfroz7f|nY+\!KpB=,77tx-o,;ˆ#Tkyϣ⬏9=y\ x,=!6H1%5%멇&D~擊TC<-.\xgCqi] w[(O˛3rSR?Uq&1o{;ѳ]"7T~R_v~ߪ}P;_޳g:Va;V:sRxW~h߽ޯ<ŋ: ?改_[Iω>09sAp; R,ʲoVOZ+>FRX ªNBQqFcO4:p{G#RkL{! Uvu4_R̗kxxPhFIsC6XjjZm:0_J;!** `|uնo//fڋ^?a~#~"r5)!_w>"?%*IhQcY?}A I+S\r{'ջ򿔡>M =NZܮjyriC <p>z7e=JT4uZ^"hCD&fҟ&gi*M`h1{K$h.sy2W8 XK)5.2(c72~G ȳ|!!+I3!#lz ?Kփ{{[ 9zHPb? Юl ?\a׵o>o}WwˎصՔ岃JTϪˑZ6Jq-F{UnW:+sޫ4Z>8jeR[uI ?dWϤ)dt}.cA"kG|4xX࿋ 7b4,ű j};77*0C>Fj\gv>③k7nhlyGkcoӱ{zNz79#k1vDm09l$rH䱑Y#F mc;O`8jhɇ#w; E>Վ8OfeU޶;`ħ&gږ}G䧙hw.4 ir,s {?mY{ ~`'#89PꏼT5?mrn|SS{!/|4j8g"D(9ݟ39`N@Acf0Cɍ(6C0smz` n 0  @_E@_E@_  QP}%v҆7R#dKl)6&mC46*z͊QC[$ϓ7B|KÀ٣{x6)(\IUJ'R/k}􏁉"@ imA'/mD\89M{XRH#bme|I&7T^&Bcz Jn.^{Dcjv8]oqؠj}m@:]T㕥zwpJ.U2uP<Õaj;|WIP8ӎ}kK?} 1ɣ F5`fxy$e[)4β >ݸaWgOxx_wׯ]o钊gʝ֮=zyJ?UF'_V^ ,=d44%FW#_'ܟi Kmfw5[]s`-m0d`!n11vFyrE*&k 2d1XcPuA5k TYkf$#cM'Z$#+m 4婨"3MEgi*,Gi*2TtB.0 gPb@[BôF%B' apxfc4Ltf g.\(*MZe9@]Bw!m]T06sd[ #lnpZW*M2EBpfbS&317Sz317CC3Ct:D`xa>L}0 Ps-n\tc4,b\@1۩XZ }1[Kdot/L>pY@H=Ӕ01>}r?mlȓrrE?ԣFnWV %;ǤMu%Ac,f\66vOԈ;qY S;H5AL[0_i7ST>/iP׫[vU/)G4y'ǽ٧a^v.7]^~;j# I7:BwA*wa}u v~H_;~S f/-'ԷI>LWWjcp @9s\n&3e3<5 Qsks/=4Pjk270ǀ-AG43~q{qys*o[μwy40AF5yfjG zLj!XtL׈L5:rGSzY;2ݍFki2B|l>%[o,ϫݕ|O(VCY%gVyV8x;mppR'z yx+ȆJ':TLspO. dv]jHm;f!dE,HB癄 WC-Nu(kӢ1 8Yp4Nl 疐JȂTfv2_'[0) QQYEy$R,Ll>+:]f>s̹)ؐ ,D؈zFV,7c6D{B)P2i8-A39gb!YsOL@{b'Z=8뉎3J@W]i"D"LD0i$D^L J Hvb/LA:`6P"[X怂 Kr`h'{RL~P;Ȃ9`,X^hb25ӏS78SƏiSq4L{a(EjH4L~pmp4 `"(3dt1PZ(Pa8`ċx=Jpĕ#Nfe5N?5 >NYϾe70ހC6R";Չ|AJ{CֿC]+>SѼ>ǺhSi :ܦz.ozYC }|w rL̡gt.iBћ5N}zn4r$(ZL[v0p>Rgcckae~$DVyA^&_P/降Eb^<~D~7?;\{_hg5fe2: /xc|+?'6((kFg눻\fg`>w`k2 i4vT f貙ah4ThCSdC&Xod4Bgig sD &@+`(8+h!h">KB֗i iLޚٞR (ΨvFٞJP$Pb ` ROdkC000 8 ~~Ww-`pҟ`ŀBKhY'*q !pM`{ql({j5bk`χ=ohR|fvLoft 釤 +/W KӟѯW !Uzg}vU\Gq뾗}/صWz}7\^˻Vc%J#zjVs$tͤySߪs\ѓŎA|ŪC<0> ⟳uG}Z?M_d+YhCN֓vW\s#\r+:w+kr< >6+e!8{ Kv|9Y`hiX-mSsz3RMd ߐiJT;}7LecpRBCN}鏤J sdVRMݘ4:?iBvvW:NIB)4:*jsxq޳k/ܠe)mn1 Lk7FQ8-M}cQX{B %ř8 MIm~q开Bqsss/5ǣJ u֓dY^R_Z %'H:JtVz)˔SJ-ך{H֒}i"aO6򁠕~ƃN2C1Gv3RWSGW6} Oz=NOPmS3EΖ}No2^虬QZ*UZCޯ=* *F9I5=^דzP~0Ꞩ.ZVOgKî+_p6S&}e9GMRhrD!=lb dw'; l &~Y-Aᆡ1a(0f𲆃Chh䇣b@pqne|M0_Idi/^6f$yPۍPhGn$@Z*󤭬K@dL`og1 QfXA~(P#@P8(@qPA [`Ls6,s kBڠjϒA޴E%0;1?ZZDV_Y}%2{Bb Π 8YŒ_(Lyddd*PMz*zSUT c~탂 >̿;`@ ݁khkhkhkP  ֔*i{=fXi,gA֗dx{ߔ px =n_'/snlr$3'^x>.&V6Y }`ܫ/u.QT֨O)A[橓*7L~zmA tP ygpd++XϘodF}|{ ojH>JFMdQ^ K>{y|l%?#QeȯF?Cۯz,P]*9\a%vf{n6 _Oa84L[/ ETjQYae_!CFޥvnh .F=ll No춉JCRm & Ǥ֚y5+uD#|%|SoS87o80(:taVtD#ѬH epYپ,Xh?.4+ 45R&0MBL(BcKpZpC#}M%Qm@]©F08QtILIװs&ǐMd':v;-)MI;{p}hZSxc{؟";HWI%yAO&`X?_b#v֔U;i]vI%뛌׌F/ #|$/=x`Y~CP>E`e8s>[ۣTôwM.Vޒx HߞOػ]{]Q^6rZ<\}ZCzLg`hB%pϯ ~:oi4 #tDʈFcsF#.#2~03g9i 6Z9ɏm[)ހ{y!y}MzeSl?eq,$I]Gso&}6bE^Cz_զ+z>y-5τN!S1w]Qz[! H!KFCmHڑwNz8NA_?Xr~jsՍ.^t!qWy~]]˫ϗ|zڹE7`gL);+Tt|(+?|h_Rr9Oޡhc]þa| Ϸqʟ3a73@s~/Ѽ?%9,{F{چ zj٣wkb<]ݱ0ņ:=:,ڨ~<$tr|Ⳳ^ܙsX']+;9Ϲ?x}{ȑPf+>vpw=񿁣t zo{vfCjDPյg[nm/T)^+eQYGaP! HQWG}g-*|I7%4hGƟzۏkl? ~`צ`zm+L m06 nEX!S0Jضk]uDQ?gu C/{6koLm"YX25$<kS!A8`E-XA?Hat-])oI"DF_%k2 +^hJ,:ztkEDqZjyb<$5;OVi7Jq}N\|bmXaVBϒH|:yѧ4SDjFfunWVJ Џ$P]K1K1 Kj*+UVBp5@^AZ\~7.*N+[kJp%m@z)ۥ@wz);q:.%=hGeFI%:JzN ni/[zn)O÷g,࿤}JK/^|!a{~_z~U׀=<0/qupCP:,oKz n7Q%PTCEl-! f4(*ն1Vx擆t+ɔ#Gs33'mɝ{@{Y+{zCuIA$i4?u!chEj8A7ܶ\#AXӖufD<キA3Ce0<hPoOnT`XV7eP@ԥRK8aLqtq'FH_w^6/dOZV ӍjϖFWi3BA} O3I˜H:ݍp|D3I,sy>Kib^%Wh0eOP)WR^L= f':6H~P_I46diA"o++lˁkib7WomMYn֢EVתyir?ԞwZ;E?Vv0uPn"4EsfDL*H5xDj0oҿ1(W & n L5Kx3i6&o\YLYyUYvfUOU]G+!~sV 'e[xP?I17Ƙzv_mi=g[h9hնt| JK0Zm8,".t (n &0@&~ĞSWe8/@E?bb)~\曫yxֺ+8}}y^3?=X7Nn+<-ԞI}"XQ=I4^`&?7룬iFpxtdnv6y"in/ t9snд|PM8kw3  )8SHA?D..h0ą#{C;㨏m vS 4cF0 rpac{!)? پh"EXP0d4qq2 ɘ}ukɐB )h*ɐ4RdHAS_/;p6,c?(Xl=[}o`u-! YfEЁtZđd$ >ߒՇL>5w--u8N_|!I-=F~0Z E]C<5v0v.飫Qmq?˓荋I#v.ޛ>GP3@ q1P?S{bYY*^O{b-{b"5=1q F,5B桄‘7C_G3S07)tzrkKNj6D=olOK_|l-˒b8,ϔN{e<4EKԵ=1bP?+ݍ3NѮLNv}2wlUaZ®3B>u="ψ}b,Fu)X!\%u῅}= JA:?=?Y}!ICK$ɲ2,Ǒ [haAwCr@ZindΕ!d\ȲB<OF (R00 L 0kg ke'}`-yX%_RK=kk~f@A(njr/W/z~gg}&3;Rc_guq ÁwEZ+/ŨZ3"ДB' u1&v.xe>S1$9ڏ9 sbvY jD_.:x2:b!wîށ33YTJ8*[G_׬N|uٷԪ^q/Fuu'+hi'jw%Sc8wWPF"%"&)r&Tu5H  zc}v]͑#De򭒯VQO_?UV1ѽS5,`>&r7X9%/{=ݗ+aMn&~~2cra頣廏T+M-Wo\C?w|U7~I!BzHHP!s˖sD R +PDAFȃΙ=7P|{}g7ɽ{O3sf;8RRnTC(\bErJ#(uJQFctӍ5l C/gFOcȍ m- /l;iKfSϝ㱯ws[0[Yi YyP@[?T!bԳ3gوG,0z\$ADpdk&ǜ cfT1XoN C98lS>Lo6:m `H3b߭%p8TY)'5ul ߻qx9:þ~~+k","`r%aS$'Vhn`\>{7;|ە/.9>vG4ϵO<1q8K.=pGUmX%/H=K(ig >DO~^bF3,N D5^~FcFl>_hE_a_lOKn>nHhf\ڦ?\?q?"PdFHAt]\s .R,]}T 1_ba$2Suk1c9*7fVbfU _s%vs}V>>=&`X.G"#qe B,\q4Rs48=rO8^8x4i]o bqO!(|Z7 gR1.o[?*OqG#Ag~yQ},#8O_KzJON[g9,F+әYC$c KY(߀͍z#Qf ƿk1 _:)}<;9eʷOhܔ;[S$BevoYw>r5 oY]ƍfn0\ &1x  pw?3+xN|z-V'У$SLD%Z^rqcƿ=2q@Y{p>}Թw#̧p7۩nXdO,P3BiS7G`UVFjށPViF(!!FEc#|e?qۋ՗fw+a߈þo>ahs+n1л`G}D㧡Qe N^@Xq=1 GTjq"\ W;`8Y!Q:]{"2G`@njq~!z=MmAt堑FvAS[F3|Zg>Bc]h (E|l,tX^{B/nqa<Ȓc2/+l2+win\ӿ* obM37z=>H/7둷Vl2tc!_7_ޔ;\&s/]G2"zP@h F4S6GU|U;n絚}]p_tdzԫAʴ2"cp8P_l !xfm!~?Λȣțȣm(f(h(f(h(b"\gri8*K:t qƩx_QC= 97pYެ|-vJ~[;RJ=)]j3j#n0g#hw+cwk-^o-c{e 6w]܍a\/!U֩Q-TlZm9+d,s^l3Vnc|#[jMZYUT9ª*U*+m}dDdsW=K*3ȻY4U4W7ܣG~B bsV/}WN=3tikNt:䱊[vn=vW{Hfj B })렮!J $ @+)8JR0܇ cb;r(NKZ8^Ǧ"!ۋBc<&# 4m[7H=chymV'@^ 5]g5S{"வI[^<>o[+y -`ܲ`dJ8#VsJ#D5 Z K}~DGIt^Zi9MҗjXl qzVz^-S eӃdڇ>̔Kd+h{=eR4EG2VzBVW+f$RE#4-d߰Z_ h9mEV\[fDzwh$讳.vh}O3AN˜o4`ff2B'W{%wkw+Eo܊r-hTܪƸvJHrHi ؋U A:cgrEL*L؊+TX\soTD0^͏'ns_[~&HFb.9#jo"k%[4 "JČEhPr7 x-<ɮyORPK$j&]IWhIN.PPwvoBBu\Eɲ5N_𛘋k8xK})!=t;'Q z菳PQ szoѾt`x)+gS7E뭁5W1(cPA"PMƓzhe!nb_$q±EzC`b-_98tJFT~kmX1ȋ<փCdG`u4һׯUOXʓ[;N3}phM}mᇉb'5*unEmG=ݘ2h6Jrl{@7{,e A1ͰKB3 ٲD` }{H=J6¸)_ ZD?L-@CC1Y&$5x@cJ] }9ڈaaa*f;EsF@8IBGWsZ?C7GOUvm w`ۧKGK'_(@g:No W3,w~8~"{ (}s .Ӯ6DvOdt||s>b"Я/3z[w=iT/UVd~w/kaFǡٸ#Cydqթh1atg*=H5Y` bWң(A5Fy@)0{Pz'ww__*O ..(4FA(fQX as|k0h񖻮> "UQ"0jS䜦xd%7;?u@ýlYe$kU"y:/S_FJU)Uo?TC٧uxn>wxn}>bZonMF`ښ#yÐ|F}}01E2E2_f)>iK<ǍnK^PE~h {b{TGw\kOW|tŇl ‰VV0{v2NZd{;$>a-;MQ;x-l1ѓ%҅%.`\ݠ6 B/9:qurP{UNk_j! ISVi4f ҄fy]~N,.JYt Bsd+(G( JJ  ^֍5f%r/YNCORU^TgoRR W(ccX.ŔvvTgH2A7ew55ۙ[^z>oWъM(\z8dpk'CJBiM% 猇k.n.ЅCN oy|E3v4?mB}ʻP%uM٦Mg5cҔfҧ::U'X8lM@L>r:Uj߱E;NlAdzܧd*HEU³ҏ;K|/ϡOY$<%f3۳<1,i4{Igi?N,zQ(GY.'Y2y AZh$]pmeCL<B +aAK 'f3gUt\@n+>Y)sr}5Iї6;vV%]\ݾ=7F. cu,X /{;޺J:7PĕUWs@ j wl(gXc0|r1XH/udM1FRz M:\30ԳJqV OrF?W:M6Vs0#v  ( - >9Cu A(bPo0np-;`a@]7wh9m7 uީj^$jnC]x| (p?RA#P%ӥ,=MKߥX4y$P[ }* 9d74x'ix *\Ii'QE ,Vl:B>zA4$2А胂c2} xOVt۪v+\[;̣HjY0?FV,'6>ELF g;GIozVH e:)b`i9E[/$' I9ўt-W 0駱< >u(w+_Rke`O-c4UC[В ;C-V ,BzBu"t1gtl)Τ9Y꟪S&{ۂ~Cۃ=bIoH iA Ig/ dniJ!yDG9]9SJ5 ^"J0Gʕe*|FQqldAy\'pNXӸ$gj`7kko4f &n(TFBնp"Jw<1 њO@$΢ȪQC$Ziŕ(Tp: (S!!j~W!@WaTj2Һٱ놺s1Z~gACŘm/Q# Zս [N"*Gd`nW*?R љ>p-5#T2(2yɫEU#E}!(7gjcҘ*jq}ZZz8WUhCDzmR@\`&&K U•64yF{%IY"P*rLKvKJYmLty\% `7[Ck^;#&}^76]aw=e2ی]ӇWL}~Ro7&ˌgPGcq >Xl3p.عK1WqsՓs%}@ /qk$v׫FW!pZYZ7X^l r~V^hHBuj||ǹ.Iim&[gyb!!$绎y#nEkg}^z;=Qwk 5PĶ+.æq=|Z6J+5ʮ OT^c=ΩcsʖIS֋T_T 3E: p̖>W ZKȃG+Zk?/M| RGq_sM7?\Sc=㥡|tg؛LgM*ݗ s]qpi}* yzSJyNx2ntF%R,r 9GʦȯKPfW4s}=YN`k)jW2L/{ ݬ/6ubNt#9t$I f%&&mc(]@Oct*iBzc8׾吪mv^S5lUjwW/UUU\}޹#S*:wUǫR3]%ߒOyT9=TIc.8S;OϋV=']*jWʿ))J:4BNbs? l`}\*BQԵuEECT=x6]Cmp~\^Q|E|J.cqp|&"6GDzd3q-D>] Ogoum\. Zn KAk  )L纣2 K`Ki;bRI^̩9y3J1R D $|LxR >3Fqc]r#D@䞃A@FWK3xd?T:e`(hcȨ;tt jϨOsLGTkQa)ptVюp?q -ϪEo/}3N9a7>sbpg/wPy B,x,v \bٛeXQxr,j~_YSֆm;ww:0f^fm&S -=[nu<-/mot<.|0mpx/u>nC;ݬw +о nr7yA C2,}s'Nhy;n.oC+ ;p]%Ю].q./dZ*0U?u!DiXo澗͟6ax&PѪY vlLlboupbWËm#1_ü=X7GhP;^n&0낋zTECBt' 8@\il-pvxy:#Dh;"?EL [A]q=`;ȄD3|a8cnw}.?"Bq à1xP#cj&"  wMMР !@46K_e 8Jq}0ְ<m"\HJ9ns \)++f}QZ8MeԫvQZ*S7>O-/NԤaT&~uzo5pu@2gΣ{Y2w3_B";WqKFf70P0xC1)/'xF^2bđ\@m9C%*NhquZi!vU c*͈KB#. 92 0 92 92 8gp:ݵ5 eIvʒ +8êNYDl-9L؋͞Rb'uԎBo].B;f1I$WyM~H֐IZB7K{\X]fKtgĿ򃚥9ǜ﹯Tx0l@yν^&GiNBe:Ô,nXcƾ{i(-7FkN&Y{RO$uss^-OU$ؼyO,Ԥ8N̚jڨj Qp"anFkkصj(- n΍Rb2?'$TeKsvvr06_ hA4GM܉;K"uBжJMuĐx ϛI}̮i]zV޸-% zn-iNCwvНnEiFSˀͱȀ xHw¾ :8J-3h(d}O. º2l7m:[Z:VnP,kSԦhj] ;{C~C>$G-'N%9 WO[od,rH^߃P+\;jkIγ~8t/?9!7k(uB' L3$1&N&We("j3C$lz<>Pa&@VdgpD w]iU9:ə1?MIa q!AtSvlwBu0V{ LUi'Ζ"E/+2pwh;mjdI '=QfyOzQrθYU놅ڢV, En\z 8Sղ$s: ;+#hc&ƽ6FrV%XWMfc=Vk89|C^SU7`ys&&ViZi]> (L|be)̭~^=c0qaQ ՊLȣ0sYi^>䪍ǼM$l\9vOL\y5,y`ɳnR_ V8L1>5;8| VY0>s) wpzUXu%ZnpcRbًf?EbZ:cVw{7BiQ=qW \}]1{^|/338#1Ԭ ewA,Y d FVQ(Բi>Ξ :Yt򐠓Μ= #Э W=ΤiKf}֛E{4^cGHڒENuB(M90~f'US+銏r+D2}#[sc#3"-aa;|B~'4[LVf.l֚}Bez,Q͇qJ18e5F r'oi y]=ָ,f 0JcG0I05@ΌC45`ܴq *9$n>h!Xq O+sgqi清9nO-16BkXp #"9GqjWRds%R*;g11b3X!'g;Jc\gB`9U' ~kӞ4iWK5tΗ> I IU[byYW[Kuҍ<,)귪H.a9ɧ]H NnEVf(ɤڍL$qr^H3IlJR<]V46 o9Av-.f_hOVF'ݝ\J\+Q;<$6,f]li?3bs;EӋiJ":rL)PRWj2@UQ>U:*Aɂɑ6ISr=eE49&QaK)Uz==+6Z8,j8mfUG*4Bx O Gi:f8h3 ˈѮ&0Qo5ēj >DZtn*d<0_~ -jbw&-,lvzKghFn 6?˕2WKyO]I.%ZM/@v/ci, $ S|{/eR"tϩmY[ts,'In5aɅ' 7po-1Ν8η8r:{Gxwm*HhSAkB!HvP"X5Q8ѷMNZXOoP |^ Y'g2M '^ovOۺ ~!~A?!:`37ڬ5%1/NnZeBk~8\;2#8*:v ; \LƘUFGc,"wQkJsukJ*Y6p]=7ON{>B =֔PO˟'3ѿؿ~60ēb{L\@& +@ o Ec?+#'7U)ozGwXaq@`!r1O8NN NY.VC;gCS?WǸ/ˤj#Yց).eBP9 +Ađu,(;mk;Yp,ZXGfvھ_~~D` .%K`{ptCʶBc3Ͳ0h x9g( +\5I( .(%#_2H8-  A"p+(FFe[z|L>5qϗ߶0#б5< ~!+=O"}ҕ>Ee E,U|uEڬvQ7tHN:Cڝ\n+ϔ#䚺^ejo(XH'Jj\ݩzՁc1HPOFbc` W\# 2N&VwjEpEUWZ[?p>zd~Frsjg߸I哲l/j#irE3ٛfBz:S'Rt-5j(,HL}0N}\Na, pU8Nd ̼$AOBB1v)T p7kH_dU G f+\ זLOFr+,AhJp(#fIVD;k/PZu> [vthJktCqME\So,BGA>IJtEU> `٣;dC=dW*8<* +DaPfaS&Fe!29&H6<!# #߆w/.ۺwICDa1vω4] 2ѴVd6Qd4wxl |l]d an~wny?+!K.ׯJ_XS նne{:z<==oWkIP~U"M y9PPxC*ԁU 2(2W871+:V8*FǽbaB/6A,xI0'WeBOбgtPM?9IƐ$>r4WHcI%Jn!K5_7}R!?U3uñuckũg$>7@0)'[Y8`GYD1Gyta[z|CCo WOBWvK4ڼrXE {D੢.G0׷q2,~)3)"zY덳GZN}E;Uj*w\p\L^/7p);J8P` )Q'mr]ٮq!g3^lW+ -V.tٙgxQz**>f_},Lf>:>P/$7N)Ę☳Ę8 rҧ=(2aHV` Ŵ3{`xQ`=OZI5$Sl 5RijF/@mf6N`m6  01qBsĄ2ND#Ğ沛Ky׳Nɗ>Uj}J6U>Î.TȮ;eY(SQ,'1mVb IsnyٳXZ"g+1 %jEtUy~QV< +`>ZS}O^ Guzv=L+TxzJiP;4tE>IwjA~I9iٵoa\p򲓇sTyNGiv'[^g3uu\]>o]a}`0A3Uhm4M;Y[/,bjⲎDX|\‚%(R? n\'LNugggm9]LSPemQ.=@Oi/jjjQ }Fy^~E?M~nMZ6[_w{C 1FqE?WOHAj#mg!څH~SdJwsct$kEi\LЍFU2cLQd;H2Z}VYۡΰ~JXE%w[J887;{˒Tyj#9|QitV;ϗ /y*(^{\O^(!OJqRrtO,QBںsE&~`2WSߵTO߫= VϺK`4a5Ч25ABbt1N?txV^qqy>l][V484G_?}77~g JyYH`k~\^ȶy z)2'GYcn~QKJ/ia%CFpNc6~RgjyAVοCXn(mQ 'Rh,MO$ XpGofc!GcEY=Un cH&%p%C<,;Dtd''Er:6G otdo²g w.#!fg0 .OA-Wh _ \ \ L*K5eĜ@q) h9LSh)Bkz61 [c &hB&Cnxhhs]sh[8&BMz#HytĢIGLtĤIMÒϹ§ 뾻NgB`^NDlīf Vl>\>|60h(6 kb0İa쇠n1b'Q& p}n8ͣUp] ]wkfo-wc\W8 p]X p} !k]kewQBF0FZcŮ5kڛL׎Z?mVںHӬ3StV$,OV$vU[fĀm=Fs7yCYs,+w6{:cI쐧'zWL fS)[|u\$s6u=2ɥJf9r4Nғ\zmڞN:- m|`_: pmK&~}Hڞ>Mv=\y5+OZfl-5=\#4r%^.+$RoW[q{Hnzj.Nj i=AH>[w1SfvQzGb]0Р61V4o,$RM1DI*Z-s;S1ǿp-Oj=u@|QDR>;/\S;B..-.aZ:eFwxL3:q&SPbJjęgiP,RL$45a0}HmVG@@OΒrK*dzP]9y5V q'xJ>+)X>ӣ?S@}, {vJѣv: KՋ,I9E,=6j ԾN~z"Ĩ3?O:a;*F BH !BZ !=[nw,:"MtAP bCA#%Mޱ̹ }?'Ϟ޽;sڜz7K"TCN= TzZ9¸4( m8.=p 'lOR(-b`pxCMݬJrڢ'8Љ]8ݱݞ帄+,tg%*+:˺uX9:"T Uط9^,pp?gtHQr?RV7a 8T f?/fFG,hf0Ser_0#67nfkkղJQl~-op?E;{TƲ* qKB8Ʀ̆y+ =jCFV@qG&夙6NAу`>NkGI64$1~i} Lƃ>cR^ѿ3,=VCI(]>eY)g4Vyݠ= 2([Ukfjp^i>.'({]49Ƶ^Y'V^2 pz[Ud}:KK ~B!= 5k.TX2}% e ֖״Aw&ktvYaOWN#y216MߤXKcҗ$x}euX.O?'?)7+rYQ6߈IlI<_j=d2ۮaʨƢD(R{*Bp!9Rlpi-If*ŋJcDLp|u)D7Ah B27X:V;MzR[sji(f4 Iêb'wM̾&$G!  ihBJ4qFfNW1ayqoqqbP,o \\p1^oFcr,Mv5TWl)7v̖v dT)f 3nC=lO.r@Z.r@Z.@r Pp@`Cs5yը`Fr5Q\jݷ̳ɭdzmVMۑl$CHWe&)Lwa$+IR1T u"Q']KΞȑ9^Q8YzץJ=qHZ#i~iO\JwRL?I$Q6R'IJ23y2!{IKxg4ę%9:bۘ7Z֛gBV=Q_w=zSxEMѿՂ67vga ]x$b/#t|GF1H4` t+V8N蝍>P{A 1z{URƲv~כ܁۵w.ZHmi 5HJN='6ah(0}SlZigVoh%i7ĉ3 mN(?-e׹Zvz Վ6)j qFIv$C\nrA 4[p6k V-6鍅Mz#(/82d08CYߡ#ۊ"Wt}Q P<ثBۜD(g6nD{,gRVʿO^Xi{Ǵ0ӕ0e:UN>fv>t\%ǽz̥#\C"rALW/>VD;t;gSB=y i6;{ϛJM֣t ŏӞx,|yc{>.{>)a?a0"^%뽞y%]U+xrx{zuλ?8iwhsk*Hu:xmCq;&>Ԛ"_}9)d9~=5 V,uaܘ};I$|uY0s6+3tEݏ}4X ѭ]Ev1̟ԎV,&L-iS-59My4GZk풢ސbUr0)!q[ΧktD7jzrN] bkZ <[ILx9xŁt*7?GblS~L}%k{dMC,M1I3S%p ~hvÌr۩xb'eប1Mk ,xO^KO$GBiYp`Rp,ÞZK`#UEx]^EUـ~] p-mV[ux]۰ŏv#].8ނQnwxf?׭xf׭xDBEZ] X{J޷J|}%|`{CGV'xOJ_XAϗx_Yxo,ه]>ܩQԭWkZ>𬍾Fn.( ԋZ8٩=OStx4ܩOk5tmLw#2uV;HΡR3G˂jg -Nk?.(j8+d4E:߹F@ޡLTvptէD=G6,u18$p#C3;o؃Fi0v3 ;GqS-p 3[`Ql6Lm[ôA:$bv qL[x`xplȀ3M *-UfʾٹuDZ mRe2\yWΔߑR.?&KI {e?j?jwk[L4.gq8fA~J/fȨ ctbxQ\҂!$̆1B-O[ 9^V?9s#UΎz)^Q^VKc_WI^J1)\q=QoیE@%gh$Jk)mmuޥ46Y]׉^S?CoݴZ9E'Y=tUcN: iB;Dzdl-Q.Lc-Y,| O4nK[--h#/Fgk`U+({yA~ nP-:̹ikmM#y9âNb {cjtk-Eڥ9cjBsϤݐby"5YI4%}0@^E4jxnݡbT`v*ic6mjD*QHD" i6 a@^bk84Gmg]: tj#\DN+mG %I"% n01jH@,Fu (Ęf3<^X4A|oWn{p4.+#Vk OO4Q~WqD!GyPDu9˺.KW%Yp3pw -G Ku>JsJo>Еt]L i$&r$#H_:Rmelprtw;z;8:?+)h<%0pQ G'O*?h!Z51ut̗ta4#>/NY DiZ=b+ܚ';\ïe6(mc8`&OfLŪenD<Zy>dҘqy-<s*cy-QOrL+gd0`z+pBbR{ȕHuvREʕ:4vT@ W"N&|P'A v@-Q;㣵:J} !)'ϑB,c_E=QYR&ޮǞl:?uγs={ I\${Q%Q圜ܮ9R~V eyT_:ࢮ\"IS5e l'/ȷ^D橇li%F]SO+GuHSȿKgץRU~獧j֔3g?셳GGM8w(QV|㲡eoŕ*RQY1Y٪"`YNevYKr6;g*=3\{,86eƖZޡbm*Ȋok=v\;uߝb\NX$`ҿ4D ".XA"s[;H,Ψf_Ԗ뵅;M5jFzUٔ"Ȩѱh4E#Bk:wK4 gaHG0<҆,~GmQ-( JS+Jkbt*&1GiC)'!V^v9vHR{ҞV;JU e=,Vj06 6ёDc7SUF?Ƨ,\Y)YZ:?fzؑ1;Ma98z3jun: o)]%0W¬$r֑Wg&ȭM?y?;]4}=z]Ӌa剱`K j1"}0O.LgsٯpbnklYgMytϴ5N1\=,2 eo]`grYKzZ2ۭr~˺vqdhMTlj6c ff6-=\;~[`ޤHÚ=Vn_E6H-dgd^;(L{{'u9xӼ§?SuW uĭeAۃوsh;Wlύ=ym&5)= CK[zCY%s.ssΒnw͑v_J-J{C*]Ǝt盎t|]\;O]W|\V\(~M[_=S~RUjl`mc9affD`9!b+q"Ƞ5vrlFWojf!_]B8o~\¥tzҳ f+:-˺uXLN17_~gRZc)6x,2f7*4z>l {ku?vT^OgX4X";Ğfك jְu+'aFÌQQC!9V<(tu̘s6_i5Z+ϵ +J}I#q4@_i8@IhqXtX[p9׉ϱtҙ5X@W+@Ԅ?f˕DBfSD]!aSr6]1)H34S35i |"Wsf #E`"Ǐ=EnF17H llygnF ]lBl-b#oō*6r,]gFр'@cr>aej%oFĸU"9_wԉ1H7Y{I " b 2Sgv6u b=:}^w#gﱟo7lX$hl )!BZJWk&4#'eeRg [yEaEn!D'B=HvP|I[hO6Z "=L`u\%ѭ2\]\uzQM'$S.zvi9~vyR:(]níJ6muWjg1uǃj}!9Wk)Xb-0,_鷮8g8eQ2c Kjfvgʓ'pU qva-Pb -ͮRfXWQ7::sםMO,hx@[""#)0bBcX4 uۙz; qSw&im@a[ Kk槶h~j槶h~ c@ozc, !0X`'.;_qx1.$MQD<,uiuLi10*r Ycl]wZxS'mIރȺG M'5Sb  G}b[y":=(F Uy?\U/ASIfn:!e y c0Y%q6 ]q'\.|? 7"hV7ɽT MUi9A#0t!|p<0p˃w8< <$s s%L1HLq: &1 w<6䁸Xd*b}aMKNTN3fE[EX`ͳ! _~0V GD8_~\RnJ^Qch;N2gII$o% 4YJ^:jrn?ZH4cfL#&gK+2 ٢Ӆ+P+o+DqW[WW+˵A-?E.t#i]a7}MyKo.#xljK&cor>`G<-`l<3yg bua13[C4F|CElAdvB =@cZFaD#8Ƴgcνu߇ƮZ}S%H;K6| v ʬHUל uo[]EUج %|/|ku? m_6WB_V'xW38jii ikm?ʹശhtֆ׾#_i,3%TZ#j_ Jn}ڝ<;;?t')3Stp{4w{{{wĽϽs2xwOwws_'\ĥڊ2߈e;P{lYkƃDj3y "]$\MUAHA#A!X" B} !.He򦖱nM6Ax S^P BI =B vcē_ Z"@<zPHϬNWfؕy'*PpŴK'zu<-80=gL|W2d0,^b-4VElٿN4zϳz&ΆqiHΫ&ܤF(URxVq+`X=Vweq0B'M&z#xtϯvp>ϭoq_pv'1^?k=?o;4?NĆ`2 X; ܋sSTZK єIKAȇMGwf`Uj^ o!9G]w ZcJ'<)Ġ$#1Z1jZ fnfl)'#L^%R^}>0p<[$D)M D7y8=X衎Ⱥ,P?=,cD%7^?D'Qt}Rړ`/K}nֳ߫f[/ %WBG !} CA!zqbPȟ'xsIw;ܩw.3ȟ pp륇Vzh(.cc2=zX{&MzTǧw[ir+p> әIslw CAPpʨQ-2O7˱tD)eX nfNy"Y$\lpnp3YN : }h;:㏅B $BNs,g{Wg*?RY/}[+vw(ƽ߽ 4\Y;b/0^0:JwQqjl3b}Aq:a!R]ޮNpRr?(/o2&^ORM̦R7[cUCȣC>@ZMWh h?m ҾwW|MyM&tb+mu=8d7 kH\(+ʹK4ڷ@31fv]5MI ǟ&^uYO?R:08)(,mq(w9Λc?ŽHBB90\fa_ ¥EfE+[&De%z6unK &Ɖq=Z$Pj}`I4L\N}Euց,`2B-,ikŞ8V*j#-ny휊 **O/j!T+Zv>DWӽtx>1H{zp@a,"I!Mi;}6Yo?ӷ_|R_kkH~Ehc۵O/uTͭkGOYq}`6;ng vzSkSi8^N#sMN )չTi8Rǒ ʞ ]xw4n uax}?S}K$V:_i!$!7P;9ͱgJso[>\+*{W U+,\춲r *ժ:U]G}PbgeEkUU]ZWUYyXy|yEZgGXgg{z}ZuQuN-ctro2wM-$%2-ꕻ|Eq*WթS:l6ur\S-fhc1(4F{#`b]BegF>A-bc#ˆ/IζB֌j)R=s+(Png[9"ZՃ>l\jBeg=rX0XD`oSr<5`Exoxι[rOLq V_Fs<=<5pίBQ♰Phyv@{PSu@. -&Vϝ5ok5 Bj'ͶfaIq86tLlmX'`67}r w5 0Bh:} x S!؆b|Y{֍1 WeX}n֤m n7/Ƚe{4,ģG[٦c ?8+Қy՞:zf˃YELl~:FPӰH4>llwr=yXgh K,Dz=\o`V]FJ5yS0 [af lX hXGÖ֯հUk5^a! +$"xnX{ d?K^BbqdI҅lSS_ޫlVw++( b5JQ𘩯c1vdlR iR;!F3l7+eŬ-ۯbcY!Kaw"~^{H[eh+5^ bZL7ߗ ҵUï M Mk\'\v?ij\'\DVb?m@%cIbyqyS,ZOUM=h;b+ w_3l-cЛyg3_0|k䠭QkC[c$r'\ Xs8q1W<^9z |3f(DޑI&L”H,R0H!3ZR~PKDŽ eb,:=l~-ԓ4JKibq3iɍЏj2ݭWo{RZBZ%hAbyP -U*?0ZZ4JKbspsfഔ'h6lv*k'jv83uTv;+KZ`B|E|v|}98Lj敞BS7n@*X]WL&P2 QhmBM= mQ0lN-G K#QwD=0q][8:!r@CjB;@No>Jk"'PHOBzj}Da4q'n˂7{$}ي<7q 68IGFd$`VܭR(%P%B P|*z :ߨ+z+=@NÃg=<pu+}2n[l1Y,^j'N(׼Eq~B/-BiH=@%bO/!,PFqk_,,땅ѶY-ѶY7L8/sc2P&ȱLĘLK MOaq4,n-:֮)pqdRki{@.g*$l4xeցYn0Fp`4b3 Qr-AN4ʉ 4h:AisΉ&(}\iO68ZI EyEg9Lfj >?V9/Di=7}OGd)8)M5I)}_u2K] ea\B4!od@i Ѻ=ηqc/_peWz/Z&~U_ jG^k\x_++R*ʮ+c\+uQO\ Jcg--ZY+޺R]nĻ`)Yԗo.(hE;;tlw0E\G]]! )7m*q,%7XJZ 都pW* Ennպ[:݆MSO aqz |L`R~8DHccRuD+HF#ti$(ͮ%_M7Hsƒ1i 7[])Q CIXʬَ˿Â=w .%w%dGݻ6Vl5Uٛ1vOz0 g`6cWGgwAa,5n5;Íyn3gq?;f#/o&}Ll4q  C[ M7]F! F;u+~cW U 03i{^6/r_jQғ yPyHn~W6n'GUn\{ؿG,~ǯ~A$AμjPMeCVbZ0OJ C^j\wv$)L˓-bRE<@:r:hz".x"!&`\ EbCjoIxXMP TQ{v҄1L jiDsŹ5g^Y3yQ`xD g-BxXPNvXf0Vu(sPvD1t~]Ekõ%zj?g#KTh!X2X]~^A6Dڑ3E5^)J׷BN4֑C6V $kma uJթSGpRcbe~"r0 'b <1LdaM.>ESֳݞ+E$CKYMHK҇ %ȋƇq;^Ћ=E]ohFxX[F3}~ ?hD_zKFuAeTDJuPYqxzhoeekS~R'ulep7u~R6Ad=Cpg\ Oz36򐈆0H?՚1]_7uC0P|gX'Cd|, )fyF.D~|,DO3ol<Qj q$}KR">Wih\-LKFi; >@tJX>̒Yj#dYB 1I[s뤸EǴpg:k9V@/ \yׂGZ [D_Z| <)[2Eۚ"Ѿ"VEVhgs&v5$8c*&; @>:Krc+-wDm@ӄޖ&tޖ-|LX$t7;TPdoȀQD-EoAs3T=>rXpc@& c1lLI:5l L5 pmf0 xl݈ õ+-Ĥyw&aR<Fm @x`Vj[W*VX]{n9KyA"16xCUb G$ןg!1zç_UUoW7ܮg|VB67ԦQ4yB6)ӧQ0fnp7a#~R?ߦo|w念WMrq Q#Д)Wx+wrJ>Xm.ǗR!>],J0BIe#ZJ,fJ|STsh&լ*U SKL/4:7z4R!L%x,}t ck~O=u8$bH573:HxY,w1m"#0M8n6^dG)1S u d&i@$;KH=OS2xԯl-Ș c΁us,/ɱFIirI@`2dAK;S^A.2.Ѹd2η7c=z ֙McXe Z}7ʥU'78;9/+1gsw=uxDU"N^ >o[T1ťӶţyFJmٙ#r䵘Fm]i+"zc#1/*i|1H1hQ^1Hݑ#򾟼0H; '`amu,)2vvfH*׏|Lec,dCY?փEJ=R¥m>τCפ$ܺd eIAk~b;vZBBZ rFϑAu7pҭh!))+bp@ʩvD "y!P6{6{5:3fHt_p3{Ec,5G~ :[*cqRF>{'?NM0WUrU#I B *b}X$X$X$XDx FA-h3x3"xɅ]6( YG0>l҄|nR|O?olΟY4 b+fTx?G>ϙԖ[c\y#UG ٦魹7Q&J᢫۴ܘB紆dmhzB?sH 9MOgz/gt_;KhOz)#ȋJ]uڒ&{ɯdNmVSZH;Ӥѩt+aZjEh6OudgyEf+)˱Iv ?1Xmmvw8]y5Npw>I^T*2~NzE*\m G|twOnƝbqY#ccQm)KxxEu2ЇN}Ab@ -!yݩf 6&Kuc-ܝH2>bA%zI!jB^၂y9 CTo% &"Zmu$6IȬf2߮-ݗH*k ^qڣd/UZŢ|C^ChFbUV7i٩ۧ=ʦx0j=bt JAfMdtYe2]@:Ow=Kp׼BÍu\"%fC^]0]J x2 w%w<,N.}aBHc}n r7ŀL wE("0*xI 3/3/<y2.k<ӇNET3_@8tޛg+x#Lw7ĺ՝gMGTtOú_"3? ;Q𯙀Gsna`0zJhY| |x Yb >*UC}^"YBfr<@ |8 8i>Qj/s3r+^qwl^+%>H4,|jk|x [ Bzх会(9W9uY]ƋNL7݀c7 ،EF 籷 {:f@R]KVEX{#bi Z<\ïm6ZkF0#u..^ٱ;'cxBc˸k+EtaEш[;E3r%!q&v6Wq &t h䱜/ [d'cbW2%c*Oˇj\ }m_ @8` 罃1k0&| Y @ %GE=-CFvhW CG x ELqÌ`0-Da!0am=&Xm!Us%}yX+s ѳ6 نv+.Hb$6snSpK~>D'@ȱϠtsO:jGa<_P5CB S BhH @zrܹ <"RQQQ*"+vQW,k~gwntvo}~ܛ;s9/CxOd{^BP|hOx|X~![r*䋲lE\_=^r\jL.ȳL9AH'37 m }& >*-xhy:{2t0aNj< r?Š^JDQ$otG;85pw?__ 5ިC/)qu{ ׉pDqF uwO}㪣r)q-uJ\[DOۨ5:@+Ny%&:APǗj_g. `I~WF%|*&gp _H$G!VGYo`KY'.ԅ2p(,VWK.IV Mz  ULWtLdV/T y"%q"4FHh&0OW&gTdgշm.H +Rޢ·mk>Z%/Qy,+ᱬE4J:SM>!o2bhqa4Q<{f8FyfE4r=fR3Ńz"=J\ hEׂ\K|1x _~99Qf#.w/]kˤ$?cܗNsaw{ɝCGZ&=? ϟEGZ+,8Ke"qN'iz $w=YsKyͻ^]> ~C q#c׽B.IO۳l> 9]yF-,seZѵCV ZkbsY V.[O}nWL!&{y\!Ρ+i$ʗWétA#45'Kxŷxgd$ج{ƺ;hJk%Kv=_cϳpVbg_ Ԗ PtOb!C\ ։DŽFgwc,eIl KM#. J݈CM&NDQ.su]b 4UsͧB_waeZX Vue# Cee+/)/{y[,1ܹ b<hU_V.//>u+([Z.lW|p&@kW74l["T5s+bam3>.MLޖR5Q%8_okY:iPKĭ<%C-oI=hSbrhTޠDD$)~֝Y,э+RT7J"&Vvy*O4@ߥ8^"쉉ȬHKK(>4&Ҩl}`YDcY(?Q.\"5Pq^媸a?xY 4*g,1!Wo}xѱ*hTA ~ pAQD%yzE<.h>Y[[r|Jx*l0}.;L:F2✪6^)5ʝD'Mt /9Ÿٞ}ʴ(;(u>|봭":z.Da ;:AaiT|q1ѳ6hgT4* E^Dg绂Zy ^No#> NQ[Co5ڨEBQxKm4JNNᅵo5ʍQwи&j=wx 7и>j#qc]4u7wEmn/cdM] p6f5þ9 | ˱cYiJ5fk5jLakifi3^ȶi|([Cy{-b,ѺlY&k̖eR6ŞC8nu*\qh,E1A|6o,ưl]G<ۊ%/q21Vd%+%"v| i hVo PvY@Y;kl̎w}\ǚ)a7Vۻ4kdv=Zgn`=O)j֬}[o?NgS{qw^|'{txwgbh>;t1_88'%Ͷ(dPފG77o1۝l#@9AM@5R=9YD]]Շؠ:,V8`7&" - 2# k*A29@gjl ťUulm*Oy:vkT:`.IQymu\1ۂOEZ["N-f[QUZ霍̊v؜}Ч/ ҨlO\s<78O[{6{!;gTe\FW} 1X #P, Ҡ1L2KSx;\ Rqr}ΔwԜq b:[Nͤ54^M\n&4tF ΤU4*Mp&@gl5Z}lq >s#z{ޕ}9*el-Vc}j|o>ncFm.TG6Yb 鄷Y,g [?ݼw2Lcn-yiapi~:춊e{xB]]f1VuXmnbm6EDz X[[]_!;;Jo^%VR;æY/4Q@zҋa> Q0SSD3:$Pŧ/,h|kxxvsYbG>2ŏG~%=Iy{8"\fnɰBk1@lOIb S* S۩T:k{]v*:T`t*tT4u1߃>фAONh+Uu@Tq;Шb&@i yMQ6&@&@&%ؤMo.kBU7Ŷ #QUlm=^{cGQ'OU݉-uX5J4 ]ߟx<]4vK%*H>yd [?|C V2R+H&D$&/l+y~Kg?r"? ͇{\@| W4*(ʁ4~@*ʁ4(Ɯ5SttLT iTK$>ebiI:SִQ3WRޣՙS]|P9^.>F `I^w6E4N)dӘGH*QKZIZuk`k[+Uu;N͗́ƻGCio. .-O}هe66LzbB|:PMDq[NC/bL >Oђ:KW!D3|),}?p?ݣj=,7^6Ln+M *mm_Y{+'^w/?߽k?6s>'<}?q?$>]whm%wTZ%8\A㷇nrqom׆U GcPm#aYY៕FF+S2F-+~,<KE[7cǂ3YGbgVUnVG3ݬ̗Lx< 9ӏ^YOzEu])ƔH)ȴOz*  BiP >Pgy[9C2Z|Lz\,GpXv+(GIkEf:KE)?JuǷ}'u}Uǚifߖ  ? 0/0maR\,oe{e"Zo ݺnOy-/ +݋ 3 7͕732yX-I/񣼷pcQ+J%q- 'S'Z:c[ha`W򔲁ݳsKE)ǧ.*,H$C/%vw?- hX#mՕck"qba+BO;ØEufn}k-:=IU^ fծQpAb5gCv04QAZ$Yb0a:(1k62a CC-tq"5i JM.40F_71fGzʳ|:/fY{v]>AXD^kLf4cό} $U$N"W@$lN7lMDnl}NܴX${݀屍彤TW&_6˟3"Um>e-v ϭyV/s9hն֙I>RL=@I ykhJV$wFuъA:J+eކ=G^J]?&q(?濱 :tv*_AFȃ_~y0cBTd|, 4--Df(,X`1k5kz /[X׆4lŃ |`^T ) b]D.e@p&+Aj5(TJXbт/b=^c b@5_Z,J Ej_w?m/'Xi4hM 2и6|zno\>6.jǃccÆЖ4z^|W2 ^|wcҮoHwr5zkiA_]*p`;UQU{=(yg%դ57}%wAO?E\QRUm"!$}( !?>#V; IA`*>R{8Hy?x;xbEj/j=fww]N 5wz9L27͍f'kUD9쎱/o ʉ*fg9N ,3.gF{U>Ub F u&7|>U:`4o ?]MYyw'b~v|l18ѯ dkW֧tUΞ_=1MTX:b^T|]Y>ib"|>qHV^Ocg9&n2%y͖bF 2Xq2";,/e` v]\~C}Mߊ]]I 8GŸmM=g^{_Emu7Z6t{P_FKşR[cum|ϷO&rm$׸"_;zjk{V{5Hi B5M[uR"m$6VXUT43it@[{ \yHXI6{rmUnXjkW5?MEzû߇FպAͼtnwA,!>9 }O/,za(P9CV3ޕls,sy%)Xz><})W_48N]UӬ)xCs(GM JMJ:k:];O|:şljzB*RΆKq^ ^0."ƺȤuEǛQ,g>2~,r dW,ϗzyNSd&gv~~kF_c^z|砇"4U f@4=g3+6դj}D߉״$6 aN)wwQlGiGkGkG4D1? _04Qj#fM7ۚuzc\eVz1%x1LϾn|c%,2щ%?mx"W3o?mOԎUW'ַ'zKU/V-U}TjO4D?wQd/QvG?;h d $]!((Pm7FWy {#e/bs 2 D^:R*N`.0P х~K ê#֪DqTV6eϫ (U4*8D`љ*D|bbw"jvCMR@RݟcwAX˻1nև{6L|)OX$*3umDq]I~NФzd=4Zj/ޓ^=2C;u:vUd5UpuoMע i+m#)LWW닺n{s\':kUu0Y!{8$b3=y]\(â4sNOg\!hp8]oA۸9n^uIZ{>gyoNYn_7?M[+:fdc++dWvU/p4d\h|։r:XycOE)Z|*oW,OXmҴҤ>ʏ!zE^?hTXXXXc7#Og)J} tT-U UiV.,Zs`dsdś46Qae 4V )5֐Zӷv+ʠQoFݞ lfgD$Us!GsUkh).y"W aMW3U#uDG 2u u Pv t+eXߪHcRR:tYu5N@~I-UZSGK:9Vf~X|gw uN8vVm.ɝu}w}-=p-=xګ&zE9UJ Geha]cP(B,kK bg$1+=7+"9죯/>W_}5LuD.Opq CqiSk;V'zFz3r\i-=;[ʮm_컓k#Cp'Cwu~ux/)u[9:MV8Y! {IB "$A.dgN'r9@fo%NqX.B0Nu Wůw#rn7Y1[[kM?u~Gu&|[^QR^N0 ŭHKȣ(_yI(w"#1g2ZX V*R䪪5w)%h*RT7Y Ɲ2. V4x*n n n n n MBdP:Ѩd]V͕ET'ԻDqJ -I4V>&jis[7nD J$12K1G+# "?)iȷL /jVbs5ˮ`SFgV% A%WXpcv}Ddcʂ}+^)Px.\EVqR' ;"iv96Vc79Y 5(@!FeN>ԢԇRTTBSWgMה˫T >yB@:WӷnE,_74n^CCOϐ>uCz6{lؑ1SxN#שR_\تN:9?她6zuMBxzϔ+ѧ5*@ - %U0|*u׊lVl124ŷ"Sq>' t/GD{=fuqepѽJ umt-!!~L&NpyN<#L=yeMa8nfvOe}ɽ~Mֵ{E,*0;itC|M]!# cصbJqV;ǗLMqۓG"XBWIG$k B8 }X<ƢR]IeZ(@R/FU!c4JcuzX|2DId"$"!K8! s|u}\ y~||M B]9F3xY^&,\'Vm44.N4qUz,O^^d ~b{~ ױL_G+uUVe{u#2])Vnr(|SR5z7b ˷"rJ-zj}-՜]얿Kz "X-4VԆL;OK| -rja~fdZʬ\_Unޠ6Aj2j!UfHHy2:󌓑53VMuF7֨jQW*@zTWXڀ^[=ɲ!֓#*nƚmq ~:XEAbArMa{/_g__9{|DϒG'38uұ=꺇e6u[;qwgn}ptsM:Xp8?&c~>XtOkZM,z^tU )xbSHp) 8( \ruc $:k dȽ-1+sewA}YϚYYYuGCfTH$v_l^:/˼Rg/ 5ۡEN}]Ԛu: W$>XYHQNL 4W d)AŢzxuRmL^zsb<Пe!l3,g!l *yzG+7EvV^n=wa^sg)ZyCUsg)%{ KzɈzRI =)5E5AM@${rZOkg5y_qGu$F\xyVD&&Y(ߐ:2Z@r<&Dpǹ+NrMzbN*??4>W:z֕LތownG0/9su;8Gտ_ uк~!8il\S Z-/>!Z`#x QZkABؔ9\ō8}k- pK%'r 2a\%xN ^Bg"l6wCpqsǹe.Iؗ\z&S^fT[,w>R5=H?)',z(REyr~VqU*!W86 @C*qXQT/J!D^U^ uֆ04K#T]e>(+FG PX3="u]֋;ZEǩj[h}1X}jպ`Jpp^~ΓysB7#ݎn )gɂpqQ_3Wuu"O.!q>T{ qO|+?ןsK%ŝ-|e8 gT=]Ky="Yaq RD m`҉F 480HDRNTHZiL$^H_S5Z @worX3-w{慓'kMl9Ll[D<#Ndf?2mvw{ң~!Kd laA/:|օ=j_i&t:N{*a(̷s.KN+"r9[#ϗYlu o8Y{n;S(]f{xJy|G~/7tu"f9NNb|x3I_tY7h,mg#X~K ZO{"6 U͏MZDq'3G<"EOE~2 BL+[#[ JNDlh"7DՉ2Q zeRZJJF\]}TU9+=ozUHwFgD9u Q3t5'3tnM&2蚆Ҩi OPԨQ5$T11 #)j?Dfj5_YDGDX&{nV3̛쯬C\ E`y3^L,eV\UD>'uM=H 4oS>N4t!M[UOTdԋR*q6D(X| gq )BV|}4i΢c&}w7٨NP;a+YKr>dMfiYUrQN;\'D9*܋Y uI%#$G\@:JWl~ugz ^ T514=?{~ ׃li} iTg"b uK"݊OxbPKHΊTʘdeT lTOPn% EYDc *Ç>#=>蓭I4lN/Pfw\iH--2h9#:b*>b#nMq!*s~}7"׿ruuUTc׆W gt=󭁮["o-aoNt9%KR`O*Q}!2q=sZҧ(<2[umEQA\Y(.rVp*ʝ/oTڕ*;TֶVl/7^Y/wݝFwĝM.{'kd/[o̙fO^N\ F,Sܾ R"w0,w!qk!l{.1,,eLrkX}8P(?eˍE>gW^"HYEՓmE_;ĽML_pw;}[>/k *Zn}G?e#/7:B2f[Is פ88Rjˍljguժ4n:Zj.KɩR > u,8N,XHNcbu%bb!B:t 4 eP{)o"樔i3TIWJ:̈́tNc&*"?jrvr?4*3xSgYdmaGưciT ^ Egwzw)b/Y: IIgqB4*38:W`G"%Fl%ݙKtDTFMF)4J=ԓNgg8-j:gF͠qzLg83"QU{&jH'ШjD힑3U{FjHT=#Q'Ƒ9E(!CMHBk,H+1t,Fb4J+ZLbI+F%t4h,FVQұsR:vѱstuؙf :D"J'E-ʨh\u5WE]C:~!2tl)sqz-[w"EΣL75djE覑.<@4'qAYn777fXPUn'_]ri]g =CÕF+=8DѹЩtq>s;&}u9ZwZ1u_:֘?q_:;o9e'y%У5cͨOQihh83|W#9A;?Ovq4#m*wLvs;TKzvL`yD̔wB6ζK9"N|vb^;\xbxQi6 KD?*/;0d_ՆM$H1ȡďڥz˰zT]Q{ES׆ғm"Bb!i{ܱX`I5̣lM yQ{2--`ɨʹj do do do do'SRiPv4gQvFcw:ky 3ݙLdNe֐ τ!( "3k@v t{CQ~tEwcy^1 > 0Qeұ5++hT( τ^,Lc˄/*3Q2ёѨzChc;Tll؎s]NfO KG]tTd#įW7GE na?MInFKX |~x@l⏉olp9 ${A!H ~b`:Rt?f~598Y!ѻ;X ;KC-AǏ݃2ֿp!_3P6-.-B1/641_ oطׂѡ,z$->Yѻ4ߧӢx# vYآ*._ŋ7 G&Vd-z@c3tKwbo.*/ lB-_: kBp'neR~dldsBFW#5:g8ыsETh+u?! 'i.{@=AωuC S`xRtݠ-vnteFI/Ie#{4蔅4$@F!+3W\ٞӕ%^꿿ij7O[^"j ʽb[# uuOgU8F/A~)V ݦ|8Vh;geQzCC ambȺJ;CϨJڵn!,B^ q u{-Pw(CJiٙ4*44!M:SM-TUm;~Y5ul.C\ngyt< M45ΦIul>l>Ges7E&s'1w"zoޅ_d٤X?e/s_٣lZQ=[cefؿYOF'0ڛm,{(7|nDsCmT }h~;נ_~x?txfUo|{j0W  6[_8ɁDŽ8B?N [t mOL'D|⺲!%x`7w GEη+Q_+z_EE J_ط绌Wbi|%~K+#gVͤ#;NFFڌ^i=+iun2 10Ȑ̎VLt?00SaYKRe<]*'ҦMSP5*[S]ūꕰ[ƽ.Z̀-+bb]uc5uN~1F(0\e2 e2 JUhV)D?Fuv:=kCAڧfpaPhzӪ (ѝ 1x7R]뼌Re)R@#\B|J~]ag>,@|X-ئVN!MAM!BШY,rzwUi#!GCrqE4*{zg3:S=8KiTd|џ~4Чe,]/-|x'S,QHuJ1ѹ*G;e˃ Cyg؎m\ڡ_I`@QAˢ o TC‡3IO_l 71v!.iqU<ɾ+ wSIFwlQ`q8CF8!~;*%?ЄCw諃{d wn`| wߗ;:y9/$NI:*&L< ťD׷4efxmơ>v*~Ln$>)~Wd%[CLXVЌE_Q_Y| Z4 mV}‡RވȮ׶{(7tfh>__73^2;ߏ5I]ZIjхGhݳ)⋪4) ˡwQɡСdW/L@'M:P5Zrq]{hs9>ȩ,QU$֫}Ld̀UIZ*RT{3t\ݗv#5ѐCG(ZCl U*4D(lDdT-rh0!b6MF ɓd"EVҨRM:i 3Li;8RTτy&tD 쭅:REzv6{+{d['ZHdյVBHѨxZkl"U*aiJ!#zsBE~^Z5DIbnkf{=Y:[b4GX_[_[힤_lurͻ,xby9h>, #qy=c$iֳ <"41tak05 𯁽!r*n,U8u̬_XKEX/RŃzPA3&>寰,{!v^iyh`kn 7TLDbZ/2=c S8Pӕf1(5Ru5N, rv2tJPC#U|lgGPz*.NH6"2yNUdv@v@vИAsVeOGEc- z 6.Ni '[G۹V ƒ{n<zba3ц1pv}Ķ:1>*5Fs5<kKvkvWj8I((_@;x ҡDS$t"3H?\FAБ]uo{쁽I<5}GwRoKy u_aHQv4*ZFk@UK/ tLF5!ǫY9 :xwpVXw_ gjm慷F3~列3'>k+˞nfwbgYSjCz-nHs[!B:%?."~ I-د;+bT7[NwF{cOhOpI0+Ō&(0bmR}5`|>s^BO jQu>sR#|'a_ц0Obix;l>i6vckef6WUm gKmrAvs_wϺі4+9oϸG{H֬fɫyoEK K $NC!LwO/U ,"" ((KX"$ "=u& {=̩fUWg?n1[YZPMuԺn5{ڲ=^^;ծobMUm4]WdN=[2ĕ|Q⼢fg;shSZAб4Т>belpΪqN+~M *KIC_?ry]DBē@m\ʃq\TМ9,'{Z~ؿܦ`,׋^*]^/ T.~yA4{Y}uD'Rd`a3Q(D!vFzQ DX!s'22ǃ\$CVG2Ou~cTfu-*w'c)@'FfTzh8teh&Y@l4Fqٮ@t10GQ=;x5߂ 5_-_L2vOt,\4CĜJ#$rK9Nj_ƳJcNHThiu-z co>gj 7OӭJ:Yon0g2(ѾSW~r'줇HSAdH dUxPO/kmIжtv6.#١%KF.YY@I'J^(nUs3NpFXVtyfh4=vmʲu*ӯH+OW'"2DF5ξQ䑟$2#dj'] -]=&KSjuCyjh]FK.7M1moӦq%3*t <"'GJBgTZ$YU@*"%ʌ8g-j+A#8s3q44}wSh!'ꌭg5IxVۡo"e]8: 0dJ h{N=+'@3Z: YĺsY/|e*` (yE DK.rq V,#uz{8v]y>pcy4]<:qt$ @ @oB{'3vw#f{ۋo_p{Aqoim,ͣMBϷ$>/T&H}ggbHOT'Ƚ&gJ5QKDzl1qT45eS{ݯO.hC[lF~02GWVV{NyLNV(Qi,5Z__zZ6AS'9j}jH r kL ՜ΦC1gGD%2&ANZ nlІO]L&!726ӶP=Veat#k'IyFUAO>Gcxd{6WkYcvv#[΃웑;:wRs},ןv[&оްiXb=h-> 7vm(r媲F:m.7L=iAV{zE]P>-wBiv'ـSq9Ɲb?tw Y'ƑԜ@0,&r+`aQ%ˎ:-K{kw";qto #Q܏r?5x"v.R~\'T~SyJL%uZ נJb K;(jGVp:zU2 ӿ,;ȇ#r#f#Z#Z#ZTP"WEte5:\Xtۢ|4mr$JCDJC$JCDqFs"_5Q=` #B F?c㺭  GQ@V,uD_#< ǸeXuvXkT#ˌd<]jumE tx8 r՟tNYt.TKG5R$il j2K]g 6Bw՞jo_#>`"u$E >JTo%'GҝNA*jžU#Zsɗf$u5D|)͗}F庴ByNAIj-EZI_4jz>dljbO/7퉶dg]rno/cE^?Wv!Ůao ? .\*z^9} 0Z[]KRǾ'!綜S8s[[!G7rXK9-e(Zl˳oXg5Zkz~|ssg8eg-擝g~pG:Gulf>+hCzJ&z=F[S*r[s&JۥO/+F.2lo.{[pmgEϳ.m5RFXph)0RaUlXUx)CL4a4FDDGUEFH&w 茎.=F=1*Ri N^pKwDK;h D,CX"Ɩec晣!f[ e4=- )(-e:c|Yg:LmQ2YZ̓oU Kd8vcx?{ď:"F`<ho6nsxwM!@{5IqI@>zP  (Wra\[ݸm@88s:W> W?/~Lx-8sbLKF0&-7A L}&W ECJ"#s]]JiшׁhHAWID縶;~㺥}|]7BI d5%F(6B|nxkbH,К7<1L)m$zvtWJ=ܣNEwєr Pn?j6mJgw<;nݮJ06 8"_Ÿ<3<9h;D ,<` G22G}2j2ji@e\oNC9 Q: #@εtԞQNǸl<ގcu6u6zE+=.p&x`~ s<%ЂoU\'c>N&Q/FOtO>RYURM=| 96QG(u-Bw2Fxy62=zꪋզR-yzMV[#Z+}o֯A#Nb] GO%^&~dqKJC}M|7=|=/ ZvJ>b՟?4Cڙ3qhG l+5y5)Iå?yx*{m -6bq3jf=oiqmC= ,, c;mͲ6Y[VO@UlK`[6G˜W߂w1=KLӟˆ d7x[kveza͐rV1}y:"-.fxÚ;j!Vhnxj2ekѶʉQm+:C~`ܺ[tJצ |S/H:~28 ĭm&rR7 3 5x.O\/R/x. R%O=Fyq2`lǃrAxP>Yp!7Ypm9E8r*A h|##"GF+_ ǒ<3ˮVwV5EgLiY,2W,9c\B@u &yn^)hjULLy%d3L+w)UƋq*\Ud:o\UdFI.e|UȪ/(ヮ`E;Q p+\fcB Y]Smna#Gs|mai( 2lIqQ%VUPUlm ЮkSc=+yW]^W[j6C[-5X;v`?NM}䱛ڿ6/jvFVdo6 ֡9r0FTwi=>=-U]U}}}|.E^=3oFlJd%G%9:n;_g>ʊY*q$xڱ*c?wKZ.7FyI#d5G3l7[XkVB^{r]fY6Nzi-z#zl)a4[u4l.%AfݠHLa]T>tQƜ' K].pr~$&8I(sph(b2b: Gc겿. {_^0.bH`_ej7 23w7̇s@ט>k3#l>t]Y0t$Jezycd~;/3LS>ENwRN](B, f Y?h~AC$Ḳͥw|X7sX>u}밂J73sMeo{nۯfQgp|i.e_@FEѕ3$4+@L@T= )wXơ*]qoUmсk SS6)_}6 5/4O+d Z"H7U]=A[,*3,d@N_/jjCھ.y}#{1;Ϊ3VrdFI%*9V2bvѸ0;'@X/@A3Vp/mor3kޡ˽}3ݣD֔Vtb^v:^(+yR.l;zaݓU{ylvtLWߥ:NNLҍ'zآӪHEr{Po۔<^WpFbIt%I,q: tGR_HNÂ'WA_ի :TA(EˡQ1D9;ƾz0J=akRH ѫC"f(ucZ&a3\hrF[tUm8`:P;=uCu2`(.iA6 S4M'H;||:P* μpccQ@t.H2Ep;D^M^I19P%GG)aᏡaC 0<5Ccה"0T<ģL2EG>Tx}:](%Xnj P.itELWttEL6oƣo<@| d|ן- 6HA6HlΑ1M #%H"=I>'4 JY,g}RpiTi WG Z?U4RCپn)&^Q>_>mZ܈% y\$i+ڜSrXaLtxCU yLcEN G &TҒ 51괈FH4I"M^"}^(앴)1nQa$IU&jeu6 d%ReI 1viG"Am @X]*+׵ YHV#tmz][uU4[fjEz@xFb3S,~U:֣~VZ(]px Nv6Isٯٲ~nh ;NAo#Z Imi:^X{av-,,߶7_왬[^cYϏ,z裢 k yx墧&^?s|qu5vK.IGv&M${?;K[CPyk5v3_|fs.7`I,(؋,sd1I&Kۚb[u/JĖ.`^h1?`ɡtc!#&K5NM-(:Hѻ.W y2X^GuNCp9 FLtKw-Gl>;}~'m=Ь< * [e@q*h5΃X9Ơ%*e삻% ,>G 3c1kPP휜N7DeKl) 3 ]쁎t@9cǎ ^"E=  ZNa(ap<] HВE|[N(C%8tS偼N*. qݒ܇H.D}hp/y 㥊= yda,A0+ Eq8a"Qz12C``嚎f3ca<Y 2 x ,Lrd̅O\q=  A"Ý·+?Z-ww-oߴ构qk ]O8еE@]"2~]zr OJ+\tʵj3@} i-goa ppAvw^{ܽ$ @FPỗO^5gQMek%G&R)s?{ |WlK/1՟$e$^RIBDzW]IJZYgs ۼEco4-ga4d 4mNZRmG/2x(g$Ip nI,]daWs+Z 9i<SY4&| .`D4q JK#Gy_2(Ǖ?.$P#uPQN T+GBOH m S2>]e +2jEYHڢ P uCJcHsKj1Ir ;Q 8^[ q  $]p*P-p.u@80pbۼsbBޱy'WLvNp19wFɄyg5_6Xi'!ټi7_PbCd\e|;~3c.%q9J=L-֔W+-Y[ZYSuIoj~u Kz%vn˨*VQNW^] ڟvB։E1zAJߧjo(b{Q>TQ.lbWA4ӗ`PL_`LLlJOq剐ip/ÀFzZz3@b(l2В .#?KgBD >!êBgu2RtD"I3RFkR*Td<Ԉ!UN=;Q9V)$hn LO5ZA!ϓ/a-$ݨ|BI5ڃ>DkqPM%ɱoV+{]-pjɿ)/d ٥BպCHQxKMP/+JEZ&ˋgI%ZVgþQfQ}fYTѼB#Xy$;H_edClE^ {*ژFQE ig?W³=,ɐy7,q:[N+-2wAzM:AɷCr7 "KZЊ4њrΞ*̒hKt$IajZ7H1.)"Oh:qJGu})>e\<֧(}+TZr#TC7 D{U(B\^SH;5CP딶v l$P5FS\ (_7.$mPӮ$4v6C@Nv tv;Wa/QN."f KAdHAkN ~_L0?,N:19?w׷8=EwPTGwSjv_3 ⹏vg Oq c<2_O/Qх,%|^~, +s;96WVޒ'lmp}UaVAt,ϯfXY\luT}$]ۤUG1n"mFJTvn^ӽ[)J`n.ub 29!b+l[MM%dBsBwBP -%9'y'3‘w‘c2X\18Icc8 GG07:m&+±Q87$w¾We>T|GX873n$<!ۉ{j'2h~1eQP[ohʑ.P V]Z^V>̔Ks'oYF3rы%cK|ڐ\~Lr4Kl9\e s<`15>El2pyll5ol+Ƕљ8UH{!fžƤDtűŰ}pAВJ)~%K"K^|$(zcA%갷JY]GSUIB-Udj~(]G_" AI>f.PJJjgr'xHV5+SAJǰ f׬M5 fA^iJ}A\H4~HJs.O,p_u ԉq)M]pL jV(ؕV|mWٕjЀU[ J phrZuXKpmնbhn+m 4c=:`V UQ 팢ig ,a s"Ep*|>^\ꁂ/7euD1#X: ZhJ-(w'aܴjkI0':N=GParzad: 3snlQ *`aD+fښjk6Nnhb>)rn{Q<Ї{Nyσcm>tЕ/0؇y@}@yՇ$02ؑ@~t\KZO=C 2Y묦X^+b}xk9C2f;G sy-eYQIwhNIUn<IB$eyrs0kUYT)rTn4fRk6U&ѤܓQGk۵$7Q,MSdH`5ܬ ;t?if<^mVM*5|zaƅ.dE^%%3//4Ŝ//P2dw^SPɓ%iɂv%K9.rp AWTV=A>}e=Upfϱel;fkNӍ+|DI̙=ViI%`ok\<բ綝9_;TX-+~ :^X^$zRz^ 8/?G_WCAَa p倖A'|ЁJhQ?l P67=4s^N0Q8NX`ofvhkaPϱ5eDQKD.151v 9Za1i4q k0r" pr348JELELELE nNEԬƾh쫋hfTI7$\Ձ򐧺Vbv]߭„w&սGXe<; {* *E*tR1D*CR1D*CR1U,55hA87 qt0Ν \b8wV\yt}U *Y5nlg[U\+ĒJsβVSyam65agQ>:5b~ Tݦ S+埽7==FއRj0%%/U4$SӴ:KRAiJQvp:.DyN*2yJ?5&Jbe_*٪-E&?z\Ҏj*#rey 2Q=̖tiN?'ȗ-I}vMۨZu:wEy_Z}Q9~qX93dxS •γjlz}tFf73vdn#%TkW.\(()v3{4kўbw:Zլl+x]|tZ%2ԹB+{C{&'EkWFԓ@vS_fđ`,.Fр'-گ#`SHi(Nuؿ֢3(uC_*bKdwtv//$:.L^k^Z#F@q5h!jistv&Eu7A}? ~D \^z6ʗ9XՍ=*=Xs#|֭+=]'yE X$(Wr%(O6Gr8\'􁣎pLDގ@Gb੓{Vx";El@nxmyUd8nF`5^e]t,ȚRI)Vd2Sp4 (韌5h|W_Ls)_F4F jDM!+g1׬io7jV?Kt hgiYz|F7lHY)}%+ݬH5ΰ̷ZXQ | gaݠc.=d+[ Vk^4ǀ2YWOFC1~PK:ohWUUyZF{d88J*HUrL!:k6ͷH.`/S{=<؋s\)n7:ҟ6>lwS}.̳vкa_.?󩔣\zrtT'^>d~(=,_RU#lz=+FloU<~?T? pCq?ޙD‡BWw ջX&f7D()Z6//]bdp\5s";mEN9u-R>\ {wQh?޺#uGxǩ#՞ Y`V/ldjQwrZ:i +@Oi5򞡐F`tode Hݴ];5_KҢ.Z-vMj*UU>ej^"];FI\m=M70LʴXשׁv*[Xm۞djE{=žhϳs A['# bPQW b3vY&2V;V寄Sj"#X*8UqV&Xm Lz1jT ᯛ$T㈑@k w#QV<ˢ^1bT6BAi4~6Srg6͟;lɮXy\+P}˥X:EO{Wh-?ܬ̗}~JgOOQѱ7SWFw:8GRDw|=Ҙn%}M7Ų"+ijehl_[Iezs#vw;F?~tc)V=hUYk)02L#tU{{vק~ C$;Ra ~Oƫ:ϹT_;¹5ĴFjsl3e4^`սjY-w<`-4[B&L\ 2q-8;KRܶ0%PaR Brb"ǫDc/,'u᥵ȼ[R=eP ~U5P kTn>h!qxnʩ@Z@:! J {VWQ5@4TvTS4jpAg \曁hŒ ZBAXZnBBՇg vCߚmWuB x^w3RᬈYd-;2JU}6J S{ﵗ!CR_XsPo?ȲgRWW7Vٟsmhz2q1*:6VAg: StqmAChm,mOM^Yo2w?k}@c:F-iBY绡]b}mvQ')ss)N=}vCu ]VOM.0oKHYZ ;ne?`ߴ4%{J77KjdM1+uzzʪf55ޟnsgur{n-;|[r[ /=|xG + 噹Ks_=;.sV5 4Vc пnY16׳=~t| D jߞtShkYll5˜ru^fKxc)Q2{.]ZQ%5Y}V7ZըN@Γ0tx 6r\%JE3Ő+5K۽ZYI'Ƙ%cy^7,$St`OD~o I"k}v{Vȝt!]P=spi uV*0VpAoeK1qu,;4ȋCw4"a;;Mѥ֣z8Xo%aXbs0֝kƛY 0'q U(2^[!/t'3 &AE {mDbG 1pA#HC-/+芮]Q느O -\ꃭ}fjsry@z>8`ah: [c&e2"8-5،;!\rQŃ F,6ν^6lt^`cˏ!`3c?g_6~Kk>ް'5]jSLl]k=n욁ܙ@g`cؘl3[dXcX{e:^Z:] >ZBbp$]K>z RO] t>4 \+`\Z *Vø]ZzƵƵ޵,u=z\/;nyFxo]\/ %_t / +@}*m׀ WzM0nr[7]; v6]w ׻@w} W}͵\`|އ5~_s/;e}񳮃@?tw= Ax/AQxУ@xu0(uw} c0>zUYs@`< "g]0uxu @Ϻ.Øe>zugρ\A#[P,u1;Y`c݄8p=f/wzՎ{uz]hUOZ="kUgeޱ*XQzsʦҷz-kYQ̏f= )jzVd"FuU \Ȯҁ MzFcB_1nRv.d=͹v&X+c11jNMB}R5{=W2? ~lv}_ *yV\#RWJ`/+vg)-beTx"&)v bJzzRީy ֋5 I9NJtob:p:td-BK {ppV\=8Τ2W.Tm2;jP=&&`ŝ:ӻ3.IL#m;WDS o1!lvYѣ!6`êԉNvI@/cE;f[cE-9mqKۊz,w( 7nIv=(Fɽ!n qlh i[hCJ!nu6t{bF} +dPsEiMB;~qULQK#xǘJ]{MvI}.5-vцV4U?cڍP lY,h*\ƖW?jt ɗ$v!!Kcn1 dXU }.#iZ@VVK6dZiB|4SU?ҞPSdNI_i@}t&wtIQ"X&EzSe֜ =ޞgZ+qra7lp)ּiN[Yqg)naw{7m:/=Rho7dhQESnj~}?=Qw]'#;egCK φm"ơ8`6"L"Dzu(XjaE'8 %qS(C[[ľb3ڼ['O7M<fPOL1qUf7Q ^|V-33W\,(l럇x,W >|O / /7H`oM_NX .Ma:Լ>Zѵ"b'o~;o~Nwݺ)Wb%,_t\_?se\%na5š@wm1OܭX/GiGH/edt1K617fi~\~HUR[ȳ9p={gLxT_uk~ZW|WU=kk"-2dڵGGU &B "5BFJ-LX{gݢ%/b6*! *w !DBVؙΆKnnv̝o6tfZ~O[ɷƳtˊZKYp%'cŬX ;kbB5?s ,BH~cގ{_cbX~,cx>˟ۄG 8Pr}#TUV0lH%╉VJ%`3.txD+ÁGB8Hћ%Zٛ%V4GH@.$;/d6LȦ7xKD-238 x̆_mH!WڞߊV&_kv؍Xڎ i3^ci/v*]yTVA5*Wxh<+pV j{%? ~:D@"y sPY}C7OHYt=*oGy>r[MSZʙKBFeF4lی^2 EF2)"sI#[HE0ӓY3@]ߎqfĮ%ǎ[Vշh{qm:zwigl|tkG ŷ :mY~q3>Śa=Z[[_ߑ3|Hy| ku͓ykjSKZ8$cI@:N{5 9 hG\I %. `[URAAO*+@RIxlU{LJ//B&TA4P@=A4lR9B/^p|yi⺱/K 5/^PŽ@@NJ *yРցd?hA2$x-<\Gm8buw{iuiCSx84^Y[CpGp$|c%\n#~3ZY f (z$sDdl.h֏,/GZ<F-gJi,Sxz \`LoD4H_݈xit.VJZAƐqri"Y;:%KOiwL#~:~ONt5AH1Ao#I~ֿ}>PKzm訹C!:vKUR R)t0+U*.Hi*uA2gC5܋L80$K5lJta*usX|q]$24J u12y찱<3%IwAB倾 ྋnzٛmqom@ّ0䉳q֖uڲƯ%GAa2ԖI%3WӍ6ӥ0ڀLOw~Oo@>rFu;>v (/4$+2W(un '4Hmճ3sXj6<:&|p{?Q7nɭOҸi25ds G/?7920p{q1>1k5 Ej #S[aSP~~?N-7|)[1I~~jxa ԾTc1OQj%{c0Wnab';=~erb(R#Mdf;L[/Ûh6Zm"_[ŏ/Y0&zfYXl(rwx܇CjDvD]FOZ{z16.Ji 5a5'>cѢ'B Ţ7O|Ң5wRqǒzkh=šBPGO=I\>sN1FpN0}šI^JjG6:^|cpjGO[9wϨG}sVnJxMQ)ΩpbWvJs"W  )@P)Mza] H*(]oֻY=8X__ P̣:ɯBU\o1|9NkPלˢSu[N֡. **lDcD[ؚCTTp*VxY|I>H_zN%STeJJ8r^M9r4 hAБ*͎Fv7APK!鲰VHfont.npyPK6vedo-2023.4.6/vedo/fonts/Theemim.ttf000066400000000000000000005133041444463326400171220ustar00rootroot00000000000000PDSIGHFFTMO| GDEFt{i}HGPOSc,yX0GSUBDJ POS/2or`PfEdf(cmap `%cvt wrfpgm_xgasp! Hglyf\"XShead-y\6hhea9P$hmtxP{8 kernBu{locagumaxpW name8post *<prep:(_<O+$O+$0eek [xxdP @ ,,0v t `~p>JPNz~P>fP`rp^zztZfT>TT<8<z zz(z,zz`>z`zffRRzRzXDpDHDx P `*pp~N`t``TNXTDNRNTT`tDt`tTH~8<((L<T  Xp88zfRXpppppp`````XTXTX XT`````<<<<DPDfN@@TpVp>0R``>>>~6`zv 8  |pXTT~>P^>088R.` 0 zz>j`D@nTT`0zzP8z8zzzdRxRRRXXXXTppppp<pp pp<TxxxT hDRz`~N8p8p8p```` z` h`z`z`z`z`z`,zN,`6.XpXLX zXTzzT`D>zNT`zRN`zRN`zN`zN`FTfTfTfT<RfFTR`R`R`ztTztTztTH~H~H~H~88&8X<X<X<X<X<XDpD(DxTxTxTX0pR`R`8p0pRXH~8DDLRLB( b*btJ*B00(X(pZfRphLBRRRBRRR8<zzzx,zRz>z8ffbR$zRz(pbxHLRpb\,zX0`\8"0xj,z|XX0xf> ~p0`T\|xb\\ `V\R6T<\`T\`<\\ \< >T\\(zp` >\<\D8t\8\\\\\\\\VV&,z,z,r,n,z,z@&@X0X0X0X0X0X0X0X0  PP&ppll@@&``T\T\T\T\T\T\@&@````````R <\<\<\<\<\<\<\<\tt&\,zX0 T\`<\\\\\\\\\VV&X0X0X0X0X0X0X0X0  PP&pp<\<\<\<\<\<\<\<\tt&\\\\\\\8848zpNp~X0X0X0X0X0  z$&DPt $D```|x|xT`pbpb Fphr <\<\<\<\<\t  Vt@>  H`  HTT,zT\FR &,b,z,z,zzzT@T\T\T\RR2RXF(ppp,(((((( >PHpppppJ*,4H@0XTpXpfpppDpzpLp"pZphppp``|"TTTP~37 (1EYuz~EMWY[]}  " & 0 : D t !"!&"""""""+"H"`"e#*%%'"19BK\ty0T9 27 #,BYtz~ HPY[]_   & 0 9 D t !"!&"""""""+"H"`"d#)%%'"04@DPrx0T0yaKH|{pm]J0,)$# xvjޖދދtq_/0$ "!L!D!<  ][ZY (|~p*DNp|z0bcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklCVWXYZ[\]^_`abcdefghijklmbcd   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~,K*PXJvY#?+X=YK*PX}Y ԰.-, ڰ +-,KRXE#Y!-,i @PX!@Y-,+X!#!zXYKRXXY#!+XFvYXYYY-, \Z-,"PX \\Y-,$PX@\\Y-, 9/- , }+XY %I# &JPXea PX8!!Ya RX8!!YY- ,+X!!Y- , Ұ +- , /+\X G#Faj X db8!!Y!Y- , 9/ GFa# #JPX#RX@8!Y#PX@e8!YY-,+X=!! ֊KRX #I UX8!!Y!!YY-,# /+\X# XKS!YX&I## I#a8!!!!Y!!!!!Y-KPXYF+X!YKRX!Y+\X E+D E++D E`++D E ++D E ++D E ++D E+D E +Fv+D E4+Fv+D E"+Fv+D E +Fv+D E8+Fv+D E+Fv+D E+Fv+DY,t04@4@lVR2c&_96;=.CL*fFX]|yl8pB F 2 " hdZ4JV6<&,( 8j"$  !$!X" ""#>#$,$%*%%&'*'(4(()8)~))))))))))****&*2*>*J*V*b*n*z***********++,-../(/012b223*345j5v56667L788899:f;R;<<==l>.>>>? ???&?2?>@@@@@A ANAABBB(BZBBCCD8E2ERJRVSSSSSSTTTT*T6TBTNTZTUUUUUUUVDVPV\VhVtVVVVW&W2W>WJWVWbWnWzWXXvXXXXXXXYvZ ZZ$Z0Z\J\V\b\n\z\\\\]D]]^^^ ^,^8^D^P^\^h^^^_v__` `````aaaa*a6aBaNaab*blbvbbbbbbbbbbbbbcc cc c*c4c>cHcRc\ccccccccddde*e6e^eeeeeffff&f2f:fBffffg:gBgJggghFhNhhi&i.ijFjNk,k8kDkPk\khktkllmFmn^oop2pq&qrPrsst\tuHuvvwxRxxyyyy(yz{T||}l}~d~Pv.J΃ڃ ".:FR^jvʄք*6BNZfr~ƅ҅ޅ&2>JVbnz†Άچ ".:FR^jvʇև*6BNZfr~ƈ҈"2BRbr‰҉"2BRbrŠҊ"2BRbr‹ҋދ"2>JVbj֍D$0@L\htԏ, $0LZhvțқܛ"tĜ0PZdnxž2Vԟ@~`ʡBhȢP𣰤Х^Φ `'2+ /++ /+1+ +1 $ + /+$ +@$ +3/ִ++'+'++)+. !+ ++4ֱ$+1$9.9!9$+99013!%3!254#!"4632#467654&#"4632#"`@ NNNNToi{&`!B +333+ 333 +333 ++222 +333 ++ 222 /!ְ6.. . .     @ ........................@0153!5!3!33#!!#!#7!!>S=WXWNWXWS/WXWWXWlNS``RR`h`RR`Jx4HNU\c?+A3QO2D+?Q +@?C +;2!+33X\22+ZZ +@ +2d/ֱJֱ  +  +J+CL222UAV222UW+54&'#5#"'#5.327'5&#">54&'JTG'7SaIiU+<<=1%jQ<8B%02"&2>4."34>2"&2>4."PFFF@ >V> >V>4tb FFF@ >V> >V>#gggg6neh>>heneh>>hgggg6neh>>heneh>>hz.*4@&+"3/ '+&+ 9+ +>& +3A/ֱ+++5 5<+ V+ + +@ + +@ +Bְ621218 8899991289......1289......@5&99< /99 $99& 9/9$+$9> 999014>7&546267#5!!327#"'#"'.7327>54#"z*HoyNRg{ng)4;GOD>tfrx5>Fx}qz~(!$\c9YoGliW.xdYG44xt9&x5ZePEf?)@IcVf "+ + /ֱ 01462#&2X2 888 .<<.RCS  ++ /ֱ 0167&(mm(EE~  ++ /ֱ 016'7~mm(nhi"+F/g3A `/M3 #++2 / 22j/Yֱ22T $;22PTY+]]/3P(2kְ6 K K? K  K 9>>?9 >?K...... >?K......@]YW`99TP"+99AFPR[]d$9`9;99 7899&(/$9"$99014767654&/&'&5463232654'&546232767>32#"&'&'&#""&547654&#"#"&RR RR-%"8!.N -N- N.!8"%-RR RR-%"8!.N -N- N.!8"%-rT .  . T2*,:1 ZP> )66) >PZ 1:,*2T .  . T2*,:1 ZP> )66) >PZ 1:,*2>B N +/3 ++2 +@ + / ְ2 2 +@  + +@ + 015!3!!#>l4l`.`.fX// /ִ4+ + + 901>7654#"&4632fEmT-BD/SMz=>-45/jChKnvZ'/ + +/++015!tZ.+ ++ +/ֱ 016462"JlJJl2lJJlJPG+3+3/ִ+ְ6..@013Pf4^`  C++!/ֱ+ "ֱ99 99014>2".7265#"`*SqqS*CxֺwD7uu7}~`Ĝ__`yӆyށ"vHA + 2+/ ֱ +@ +  +@ +ֱ 901>73!!5!'e448rR$SY00qO:r2+ + &0 +& &0 +&* +3/ְ2## +#- +#+ֱ/4ֱ#999990999&999014632!2767!5674&#"327632#"&r߻pn:Nsff/,0J֨YG2)%&*2V=`DuTXR>9]0;Ah]7/#,2+=WpJG+G + +5+""5 +"- +G5 +K/ִ  + +  +0 +% +%0 +%* + +Cֱ:Lֱ%5?@G$9C999":@9901463232>54&#"'67>54&#"#"&54>32#".pd>1=%+pc+9K>/cT56\t@EpO5_D^# +!2 + +32 +@ +$/ִS+"+222" +@ +@ +%ֱ" 999 99 9015>76>32!733#3!53^k}H5 (N`̨8Wm$+6WQ{ :"0e00z :8+8 + +++28 +2 /+ +;/ֱ +  + +5<ְ6.././..../....@ 099+28$95%&990599901463232654.#"'732>7#"&'632#"&zQ9<5$\b&>gC\7#H|$E19!$#Ugv:8E.%hHWC("-&<;ױI`=~ !-P8.KpAΫz&*<x&+0+ + ++8+=/ֱ+2+3+"ֱ  + +>ֱ+&08$980"$9014632#"&547654&#"632#".732654.#"zB3&8QIXJ#~U\>n҅fL@pQvy8`@N h͉a?L.$*2&$.q~1Rmt=X 4|JPf8n^'(9%++3335 0% + 8+:/(ֱ+Z+;ְ6.999999...9.....@(-3$990%,99 -.3$99901363232767632#"&547'#"&'&#")' Uq;a5%'f'C +A#b+;\F '-3{cP[..Z/H' }q%*&';I6E1w>]n,)4'$O+R5`t/@+# +>A/ִ +02 / ;+&ִ ,+Bְ6**55599++*9,,9--965659779889@ ,-78*+56............@ ,-78*+56............@;  #$9>#$9014675.54>32#".732654./>54&#"txsw9TY9$ŵ!2]XGskm&%G30[`tIwH?r]xI/CE]4zqQmz/O:<+3B&=2#'I9fwZ*< + + ++:%0  +%=/ֱ++ֱ /  + ++"+52 >ֱ" %0:$9:0 "#$9014>32#"&5463232>5'#".73267654.#"Zn҅fLB3&8QIXJ#~U\>8`@N @pQvyX͉a?L.$*2&$.q~1Rmt>X>6B/ ++/ ++/ 015!5!>6``8``T,a+/ְְ6..............@017 7Te,T@X`'//++ ++ +% + / +   +@  + +@ +0/ִV+-+))/-ֱ# + 1ֱ)%/99#9-+$9 99 999014632#"'#3324.#"#"&462"hqU8\e5J0H"-M 1N2C F(,JlJJlZqs`S(&&`8dbF,6GJ+;lJJlJ$32#"&/#"&54>32?33254.#"32>7#".%32>54#"%lEւbLz8+3 222+3  +3  2/ְ6.   ..      .@  ...........@0135333!53!3!8< `^,~4~44444!z&j+2+%2 +'/ֱ2+ ֱ (ֱ  999 99 901353#5!2#'3 4&#!5!2654.+ztߪ&zjk7kK424w ș4`4{=e\463w/+&3/ +@$ ++ 3 +@ +4/ֱ$+%+25ֱ$ '/$9/-9 +9999014>3232673#&'.#"32>7673#.#"#".Lh;#",,$M2QuHHuQ2M$,,  #;uȈA/!$)j 2552 j)/fz=+2+2 /ֱ+ ! 901353#5!2#%!2>4.#!zZ}JJ}Zdb@@bd4249wt74Hxܼ{Jz6(+ 2 +@& ++2 +@ + + +@ + +@ +)/ֱ 2 +@ +2 +2+&+'*ֱ901353#5!#.'&#!327>53#4&'&+!27>73z` 4'JcG 00 FdQb0&4424(2Z(hl"zz"j`AlWAz +2+ 2 +@ + + +@ + +@ +!/ֱ 2 +@ + +@ +2+2+"ֱ901353#5!#&'&#!327>53#4&'&+3z`4"KYj@ 00 @j4248asj%V%j`443(+/++ 3 +@ +"#/ +"%24/ֱ +&& +@&% + & +@ " +& +5ֱ -/$9& +$9"+-99# 9999014>3232673#&'.#"326=!5!##.#"#".Lh;#",,$M2QuHڗ,%)LuȈA/!$)j 25ő44"#Bfz+3222+ 3 222  + /ֱ2 +@ +2 +@ +2+ 2 +@ +2 +@ + 201353#5!#!#5!#3!53!3zP@P4244\4444^4z F+ 2+2 /ֱ   +@ +2 +@ +2 01353#5!#3zP42444`Z"f +  +  ++2#/ֱ  +  + + +@ + +@ +$ֱ  9017463232>5#5!##"&`K706 ! .P2MxLa6T6+&0#$7044=okN/oz&+3222 +3 222/ֱ 2 +@ +2 +@ +2ְ6  .   .  . ..... .......@01353#5!#7#5!# 3!533zPfiWq4244/B44*444~4za+ 2 +@ ++2/ֱ   +@  + +@ +2 +ֱ901353#5!#!267>73zP*f693 <4244>LQkf+3+3 222+3 22/ֱ +@ + +@ +2+   +@  + 2 +@ +ְ6. .!..........@901353#5! !#3!53##&5#3f\m;2 .7  LʮLuuNȈAAff\TUez"d+2+!2 +#/ֱ2 +@ + +@ +2+ $ 901353#5!2#!3!2>54.'&+zr]?<4M1 &K57o42480ڬ4":Xc?5ciXB2<t+6.+$++;=/ֱ338+ >ֱ83)/$9 $99$"9!)*9996/9; 99014>2#"'327#"&'&'.'.7  LʮLu-YQs.%'#1JA=Qmx=l7)9#fTNȈAAf- CD6+0 2*I"/7% w\TUez(5+&2+ +42)% +)6/ֱ&)2& +@&( +& +@ +2& +/ֱ 7ֱ/&999% $9)99 901353#5!2327#".=4&+3!2>54.+z\rd2ER9> dm1ZY5yy6I&7dB424ֱ<9&8;99 #-46$9 9#168$9901332654&'.546323273#&'.#"#"'&#"#,T?iHprK/ZJI* ,,"=%D,>jP>nw:y9-.,ܙsWa}0)BRwI=bZ8Kg3S61Ilf?(2x + 2+2 +@ +2/ֱ+   +@ + +@ +  +ֱ9901!#&'&+3!53#"4XmmXNL442Xm+ +3222/ֱ +@ + +@ + + +@ +  +@  +ֱ 9015!#3265#5!## XP1[lFf44VyAȾ440Dw + 3+3 222/ְ6 . . .   . .......@015!# #5!##DZ2<f44!44~D\+333+ 33 $2/ְ6.  ..  " " ..   ....@ ..............@015!# '#5!# #5!## #DTk+CT\/f<~< f44d4444~_H+3222+ 3 222/ְ6 .. .. ##          ....@  ............@01353 #5!# #5!# 3!5! !HX*+08} 444*4444`4D+ 2+3 222/ֱ   +@  + +@ +ְ6.$. %  ... .....@ 99015!# #5!#3!53DjL̶Sf44g44"44+ +@ ++ +@ +/ֱ + ְ6."......@99 9  901!!267>73!5!"*\.7+4]2.5,VFRpo06BJDq5++/ִ E+ +@ +2 01!!!244PG+3+3/ִ+ְ6..@013#Pff^`$5++/ִ E+ +@ +2 01!!5!!`2<,x4 *V`+3/ְ6..&............@013# *`^]*q/ ++ ++/01!!` !+ + /ִ+ 014632'&% B%j 3t&e>p1<}/+&34 9+#%22+   +  +=/ְ22 22 +2 +27+2 >ֱ72 /$9 +,99 4 +,8$9017467>754.#"#"&54632327#"&'##"&73267pxNl9%J4<\+*0/9+"0%`v1x]i4\"0URixv )%j%DC(4) +3+[m=83A\JSpqP>!N#l+ ++ +" $/ֱ 22 +@ +2+%ֱ 99"$901353#5!632#"'32>4.#"N2jdQYccYQdj`To--oT`0x02772ioo`P+x)+j+) +@" ++ + +,/ֱ+  + + #ֱ""/#-ֱ)9999014>32#"&47654&#"32>73#"&`Ct\HwE$64%- FGv5U4#4-DuL]L0JO$1H(@$#$%>ذ&;NK&0X_F-`0#u+ +  + +! $/ֱ+22  +@  + +@ +%ֱ99!$901676327#5!3!5'#"'&326&#"`cYQdjrjdQYU-oT``To+720X027o^o`f'y+  +@ ++"  +(/ֱ 2 + 2 /)ֱ 999 9 9" 9014>32#!!2673#"&!2654&#"`hǂPR-,l4*OR^*]a0M2"~@dv:+%Pn9k]9(.3]'?WWTB%"+#2+ + ++32&/$ְ2 2$ +@ +@! +$ +@$ ++  + +'ֱ90153547>32#"547654&#"3#3!53TY6T\z9*L !/Uu؎@D0F܎Wm`T=DG&#*Ǭ000XAT\%=+F +3\++% % +@% +P7= +P Pֱ3 X,= +X]/ֱV BV+!+/B!+0V+ 4+ /04+VZ+) ):ִK +K/: +)"+ +^ֱVB. $9Z,37=FPR$9K9)'9:%9"9F:BK$9PR973 9,09%X ).UZ$9014675".54675&54632>32#"&'.#"#"'327632#".732>54.#"26&"jl(=-"^Q}ҔS2+@1323!534#"3N2 0g|E?@@d !0x0puUN00TVABtS0T&~&|NP+3222+ + 2 +/ֱ 2 +@ + +@ +2ְ6 .. ..  . .......@01353#5!3#5!#3!53#3N2Tby~n0x0T0000p0N @+2+ /ֱ  +@ + +@ +2 01353#5!3N20x0X0Tl9++33)-7$2 +31 9+!2+:/ֱ7 27 +@79 +7 +@ +27.+) ). +@)+ +.) +@., +)7.)+  +@ + +@ +;ֱ.7 9)9991$901353#5!63236323!534&#"3!534#"3T2 c:[6 ]El> @VP:`@yC!00+HG'4U`000RSgN=)cHA00BʆAV0TX!+3222 + 9++"/ֱ 2 +@! + +@ +2+  +@ + +@ +#ֱ 99901353#5!>323!534#"3T2 0g|E?@@d !00puUN00TVABtS0`E+ +/ֱ   +ֱ 99 999016  26&"`f=yyytXD%|+ +2 +$ +&/ֱ 22 +@ + +@ +2!+'ֱ! 99!$9013#5!632#"'3!32>4.#"D2jdQYccYQdj2`To--oT`x02772*0oo`0%+ + 2+# + &/ֱ+ 2  +@  + 2 +@ +'ֱ999  9 !$90167632373#3!53'#"'&326&#"`cYQdh PjdQYU-oT``To+7200027o^oT4"+ 2+ + + +#/ֱ 2  +@ " + +@ +2 +  + +$ֱ  99901353#5!>32#"&547654#"3T2 3w\HV60% =5K!<00{j[E5O(!8JCw0~8y2+3+3#9/ְ2&& +/E+:ֱ&68999 #-24$9/999269#/$9901332654&'.546323273#&'.#"#"'&#"~$*>T4gmjAVL%`IR)1#()$cP:D A;5CK1" \D^\.MIHU,*@\?k.S81-I1 1#"7|kx%8!+ 1+ +@ ++ 3 2"/ ְ2 2 +@ +  +@ + ֱ/ +#ֱ9 9901535267>33#32673#".58=0 $8:>E0 8\;+K?$D00zE5|P8cT10U9<@tw+ 9+++3 2/ֱ  +@ ++ 2  +@ + +@ +ֱ999015!3267>5#5!3!5'#"'&5<2@d !2 0g|E?D0|VABtSl00puUN0(tw + 3+3 222/ְ6 .  . .  . .......@015!##5!##(܁f,D00b00V(t+333+ 33 $2/ְ6.''.(.  ' ' ..   ....@ ..............@015!#'#5!##5!###('úf,,D00m00T00XV<(t+3222+ 3 222/ְ6 .. .. ))          ....@  ............@01353#5!##5!#3!53 3&ݜ8g8888788;8t&$+  $ +  ++3222'/ֱ +  +(ְ6. .   99 ......@  ..........@ 990146323267#5!##5!##"&91#)D3Dvʢ{5P (.I,Tp/1>) 1\MW00l00$&1C'UTVt + +@ ++ +@ +/ִ+ + +ְ6 .   .. ....@ 99 9  901!327673!5#"T4G1,09O!,D06|Tz8 *8~)o!+  + ! +*/(ְ2+2(+$+$/3+2+ $9999 99015254'&5467.547654&) nr&)~ee~)&qo )&,KW6JN[OO[NI6WK6 ++/ֱ013l^XV)e)++ ) + */ְ2"+2"+3&+2+ &99 999901>54'&54675.547654&'73"Xnr&)~ee~)&qo )&&)JN[OO[NI6WK,KWpz9/3 &+/ &+ 2/ 9999016323267#"&'&#"p(Q0'$*BEV/$8^:jDEV/?A" :?A8'TD$8'ND$6'M&z6`'R&(f'O|1'T2X'T8p&Dp&CDp&Dp&Dp&Dp&D`P&VF`f&>H`f&C>H`f&>H`f&>HT'fT'Cf 2'>f:'@fTX'Q`&PR`&CPR`&PR`&PR`&PR<@&bX<@&CbX<@&bX<@&bX;-+++35 $255:+3 232#"&'&'#4&'>=#"C0 739^ #.B|B.# ^937 0CC0 730k<($(p($(323#"&47654'32>73#"'&#"`kCt\ >T\64%- #Dg5U4#4-DuL_O~?vP7˄]L<1H(@$#$(9D&;NK&0X_F- kD0KWB+I36 B+O+)UB +U B +.3 02#B +# @+# +# +X/ֱLL+.. /. +@.0 +. +@ +.9+??&+& +& +YֱLIOU$9 GR$9.14999)6;> ִ ,+/ ,+ +  +%!ֱX>+62OJ2, ,+, +2 +O__/gֱ X#9>d9@ )EU[]bc$9_M99%O]d$901463232>54.'.547&54>32#"&547654&#"#"&654&'&'b;/:$mS9\9&(I>2FXb1hQbVX;,3!####.afJXX`n@bN>+&+& +& ++:1+0?/ֱ> > +@ +>+#E+# +# +#)+7ֱ @ֱ#01997&:$90)99199: 90135347>32#"&5463232654.+532>54&#"NY8eϥY}K=&.88&^^3KvH227_S0[Tk{0܎Yks(臨gUBR)$.+@|z[90#L]ky@HEN + + !  +3C33 8FB  +F%$  +M3%O/ֱ"+C F2C" +@CE +"C +@" +$2C=+J20 (20+ PֱC" 99=,+$906899! 69B /5=$9F,+99$)$9016$  $& $6&$ 53#5!2327#".=4&+332654&+@z:zz:p ppȔwqqw)2#"CP!==$IH>EGJK:zzzzKpp pp00] cA>3*@,E^t0[FKl@HG + + D7  +D=2%2  +%+2H/ֱ!+55;++.22<l+,2<+ Iֱ;5 %@D$9<>97DB92@  ! -);<@$9%'9016$  $& $6&$ 4>323273#&'&#"327673#&#"#".@z:zz:p ppMUPX4% $0JJ0$ %4XPUK:zzzzKpp ppԴvB!5gDi`iDg5!BvTJb2)+33/ $2/ +@/ +2 /$33 "&0$23/ִ++  +@ + +@ + +++00 +@02 +0 +@ +20'+" "' +@"$ +2'" +@'% +4ְ6., +.)*)*+,.....)*+,.......@99/(901!#&'&+3!53#"53#5!!#3!53##&5#3TB( 6AiM@MiA7 TA@,jnO`00`Q000000 0Vl !+ + /ִ+ 01632Vj%B %30!e&.>X./3 2 /ֱ + 01462"$462"6T66T^6T66TT66T66T66T6>B+3/3 ++ 2/ 3 ++ 2/ְ6.6  ..@  ............@015!7!5!3!!!!#>QpC}p6``6``60z04+(3 *.222 +@& ++422 +@ +1- +312-1 +@- +1- +@1 +5/+ְ22 2+ +@+) + +2+&+'6ְ6.4..+4+.4-.1-.14......@901353#5!#.'&#!327>53#4&'&+!27>73!53!3!#0 4'JcG 00 FdQb0&4Jnot 424(2Z(hl"zz"j`AlWA4`4^"*+3% + 3 +/ְ2(+2,ְ6 .,  9 999 99##9**9@  #*..........@  #*..........@( 99 %9901?&4>327#"&'&#"!24'Lh~_:u_4tTs6+A`Z2ԩf^YߚH\T`*:/32 $+ (/ $+ 29 ;/ִV+5+V+<ְ6$$ .$!$!$9""9##9+ +. 9,,9--9@ !"+,#$-...........@ !"+,#$-...........@5 $9(25$9014>3232#".'#"&732'.#"32654.#"`{jEx\:Ʃ{jDx\:ũH|0>[I[-`Z1<]H[,`XPv^-ZZB#϶v^-ZZBС:EX0#6:DY0#]F>Bd&`>B] k+ ++ /ְ2 ְ6.6 . 6  ....... .....@017!!5 >*e*``TUUT>B] j+ ++ / ְ ְ6 6 6 ....... .......@017!! 7>e*R`T1`1P#+2+3# 222 +3 2" +3" 2$/ְ2 2 +@ + 2@ + +@ + 2@ +%ְ6##.). .  ##".. "#........@015!# #5!#!!!!3!53!5!5'!5!-/>AL@Nj00E00@@T00@"@R~`'7`#+++3/8/ֱ( ( ++9ֱ (#0$93+ 999 $9014>327>54.#"'>32!".73267654&#"`L\Cx+S;8qG;6RJvK2NG3h\:RJTi(>RJTk&>X{ՒSSH8:Jtd6MP9@X6Vuw?f-WtwhtygZ+  +@ ++   +@  +/ֱ+ְ6 . +  .    .... ......@901 5!#&'.#! !267653!g 4R9w]OR4J@.pM9!47zp+ 3 222+22/ֱ +@ + +@ +2 + +@ +2  +@ +013#5!#3!53!3!z<,:4444:4 >t0|+!3 ++ 22+ +@+/ +1/$ֱ*+*/+ +2ֱ*$"99 $999+(9990146763!!327#".5!"&54>767#"#" 3*HD7Z)NT5M*)\7Oj#^/p,K?V\+3Us/Tc<dZS2I5+N97ϾV28~,%9#/ # + +/  + +&/' 9901463232>32#"'&#"#"&8@8*.V1PXpQni"=KM:ANtT>.-U> HF ):s 76TkW# ' *<06CGTP| O+k+/ k+ /ִ E+  +E+ ֱ 99 99901462" |"$&蘘*9+'3 2 +@ +%2+1:/ֱ+33 +@39 +3.+. +@.( +%+&;ֱ.3 $9)8991.3$901333!5.54> !267653!5>76 4424DbQ;TޖT;QbD4244H9/qq/9H%$ <][nʚ\\n[]< $%i>?Dn D?>pPAM[?+83E 9+/2E? +@E2 ++ 3 V2  +  +N)? +I3N\/ֱB Bֱ /  + +BI+2) N2)R+% 32%22/]ֱI?EL$9);<$9R /8999)E;<$9N9 %9990174676754.#"#"&546323632#!32673#"&'##"&73267%!2654."p~R'K4>V+*0/XiPN*, "7Z=l4*ORw:'ti}HF7z1cN|<)(I`H* xl6$@;#7* +3+[zz?fu:+%PzqJ+n9k]9NV=gr{`EU9 -*+PG+(<[RX#+3+ 3$/ֱ!+ %ְ6 .   99  99 99 9##9@  #..........@  #............@!99 9901?&54327#"'&#"32654'Xphun(phun:wy$:wyyow&yowvRΔ&vRT'/$+$ + +++/ +$+ + +@ + +@ +0/ֱ + V+)+--!ֱ /! 1ֱ)99$/$9 9- +99999014>3273#&'&#"32765432#".462"T8\e5J0H"-M 1N2C F(,hqURJlJJl`S(w&&8dbF,6GJ+&ZqlJJlJ~;++ +/ְ2 + +290147673"&462"~+8+FF JlJJl5ikiHaalJJlJ>B2/ ++ +@ +/ֱ +@ +015!#>p`(x / /+ / ְ6    4.5 .......@  .........@01 !##t@R+VX08^=+0332;/  ; +  ++/+ ++" +>/ֱ +  + )+ 9+) +)% +?ְ6..-49/4/.49034./.....@ 034./.........@) 1;$9014632326767#73>32#"&547654#"3##"&Z@+/=P|78V_J5^B8+1*7-SF5_#I]s@Ld|@_/"93ZJ8\nGP8CU,%. Wr8"P]Ec>B)e /3 ++/ ++"/)3 ++&/ ++*/+ 99 99" 9$99&9901>32267#"'&#">32267#"'&#">>fX_0$>fZGFa-$>fX_0$>fZGFa- YoB:IC$YoB:B>PYoB:IC$YoB:B>.s+3 2+3/ְ6.++..//........@0133%!L8J&('(' '8`'UD$8'OD$'O26G.+%2+:%. +@%+ + ++E +@ +$2 +$ +@$ +$ +@ +H/ֱ77?+%2%+2 +  ++,Iֱ?7299%099  9$%799014>323!#.'&#!327>53#4&'&+!27>73!"#".732>54.#"LhAU5P 4'JaI 00 GcQb0&4P5UAu1= =1ȈA (2Z(hn"zz"l^AlWA f,0'>'0,`%-;+$3 +)) +@) + +37,2. +.z<+  + +/ִj+ + +9014632'>54#"#"zL0+?!HW!EA%d45C#;>!\UJvP%>HB'8&8``  +3+3 /ֱ+ ְ6. . ..  ......@  .........@013 # `2D2gghh&t\D'T<VC+3+3/ְ6..33....@013|T:n*i!+ %+%/3& %+2/3 %+2 / %++/)ִ +,ֱ)$99%99  99017332.#"!!!!327#"#73&47n8|O(gx5h& &5&Wʋ8&p;lLv__p!V!pLX;p&L& / + /ֱ 01467&ncvvcXĂ0'JJ'0  / + /ֱ 0176'7vvcnncJFJ'0Ă0T\&0#+'3$ (.222 + + ++,33*221/%ְ2 2 % +@  +@ " +% +@% + )+2. 2.) +@.0 +). +) +@)' ++22ֱ)  9015354>32#"&547654&#"3#3!5353#5!3T&Pp[zz!) ;2؎@2D0FOoBtX*%7#%)j000000TL'$+3%!222 + 3+32(/&ְ2! 2!& +@! +@!# +&! +@& +!+  +@ + +@ +)ֱ! 9 9 9015354>32733!534.#"3#3!53T+Heo?zGm$@'L7dq؎@D0Fw~T%UUH00d@cT-˴000i]+(++=3! .2+83 32h] +L3h Q2c] +G3c V2j/_ְ%2Z*2BZ_+  /33B=G22kֱ _!]c999ZB(.V999h]Xb99cO999 @D$969!9(#-990146324&'654'>5#"&46323&'&546227>32#"&'&'67>32#"&'&#"&54767"#"C0 730k13ll31k037 0CC0 739^ +s6vZ7f7VF}3@ZZ@3}FV7f7Zv6s>:s6vZ7f7VF}3@ZZ@3}FV00z&z't&&P +;GW*+E3331L2+9$* +?39T2 * +X/ִ + ++!+-+-5+'+'=+I+I-5IQ+C+Yְ6.......@  995-$*99QIF@9991!' <=C$9999014>2"&2>4."34>2"&2>4."4>2"&2>4."PFFF@ >V> >V>4tb FFF@ >V> >V>AFFF@ >V> >V>gggg5ldd<7#"'&#"=md8 ,=md8 41-"1-"n'/ /+ /+/++015!@nXX@r = / ++ +@ +2 /ֱ+ ֱ 90132673"&0uu0rhjjh<:42'/ + +/ֱ 01462"!?x,>!?4i&$Li&$L6+ &+/ֱ 014>7327#"&)T[Efb43S<2E*Fh8bYF-I{C5>n '=D&P${+333 +2/ִ+ְ6........@0133#,d#F#!/ /+#/ /+$/ִZ+!+Z+%ְ6    999   99999@ ................@ ................@01?&547'76327'#"' 6& ySTzDzjmyDySSyDyljx9xmlzE{SS{FyjjyEzTSyD첲60++/ְ22 990173#3lllZ<V0+ / %+  +@  +./# 1+1/ִ l+ &++l+++ ,+ +@ + +l+2ֱ&   (.$9+)999 9. 9#)+$9014632327673!5>7654#"32654'7#"& 2:U)lCS61'& 88CIbaLLSL>$,.'1S1_B07+ "4/LZTn0 + (+ +@ +$+++++./ k+( +k+1/ְ2 4+ ,+E+ +2+ ,+2ְ6%$$.%*%...$%...@ 99 (.$9+9 9901463232654&#"''#"#!27632#"&T0(&R7QOCI7*(4&#iyY)*9!$+{[Uk' 6?wmtXx" E+/k+2/ ִ + +@ +  +@  +ֱ 9016733!53'xFV~~ ?J@$$dKx''ppx''ppT''pph'r+2+"2 +&3 $2(/ְ2#2 +@& + +@ ++ ) 990153#5!2#!53!2>4.#!!!hZ}JJ}Z1db@@bd@\49wt74jHxܼ{J@t  / ְ6            @  ............@  ............@017 7   ICJJCICJJCICCID`'R<z*+2+ 2 + +)3 2+/ְ2 22 +@ + 2 +@ +22"+,9013#53#5!#32#!3!!2>54.'&+zP]?<4M1 &K57o,4b4480ڬv4":Xc?5ciX`!) +%+3+)*/ֱ##'+ +ְ6 .    9   99  9 ....... ........@#9'  $9)%99999016327&''7&'&546;7#"26&"`\= G@a 9N/9nf足=yyy"/N] 6Y/4SX&t\N+++2+2 +(,/ֱ 22 +@ +2 +@ +2#+-ֱ# 99( $9013#5!#632#"'3!267>4&'."N tֳt 2& bjb && bjb &00tnLnt0ޙ2*..*2ޙ2*..*28'WD$p&D8^'KD$pr&D8&)+33!$222+ ++3#' +(3#"2*/ִ 3+  +@  + +@ + +l++ְ6.)$ ) )!!..!$)))!"$)#$')!()).@ !"#$'()...........@ $99990135333#3267#".54>7'!53!3!8< fdJ46B $$0T>$EM4^,~4~4APG;M@!U>6bTD%4444!pHSF+&3K 9+#%22>+8+0 &++   +  +T/ְ2I 2I +I +IN+2 - N+;;/-Uֱ;I FKR$9-NBC99 08>?$9F023;999 K BCO$9017467>754.#"#"&54632327#"327#"&54675.'##"&73267pxNl9%J4<\+*0/9+"0%:2>43S<2E*Fhpm8L1x]i4\"0URixv )%j%DC(4) +3+[m=835-\95>n '=D&PO]K DFJSpqP>!6`'R&`P&RF6`'P&`P&RF6'J&`P2&RF6`'S&`P&RFz`'S'`'HGh`J++$ +++) ) +3 2,/ֱ!!+ &222 2 +@ +@ + +@ +@ +-ֱ!99)$$901676327!5!#5!3#3!5'#"'&326&#"`cYQdj.rjdQYU-oT``To+72~8 08027o^oz6'W&(`f&>Hz6^'K&(`fr&>Hz6'J&(`f2&>Hz6>+(3 2 +@& +4+. ++2 +@ + + +@ + +@ +?/ֱ 2 +@ +2 8++3+++2+1ִ2l+&+'@ֱ1).4=>$929.12899901353#5!#.'&#!327>53#4&'&+!27>73#3267#".54>7'z` 4'JaI 00 GcQb0&4J46B $$0T>$EM4424(2Z(hn"zz"l^AlWAwG;M@!U>6bTD%`f2?0+ '+ &++:3 0 +3@/ֱ 32 *+7+ 2 /Aֱ*:97'-0$9!"99 90!"*$9 999:3 9014>32#!!2673327#"&54675#"&!2654&#"`hǂPR-,k 8"C1-22/43S<2E*Fhns0=^*]a0M2"~@dv:+%Pj8`X2*.4W,5>n '=D&PO]V(.3]'?WWz6`'S&(`f&>H4`'P*X&~J4^'K*Xr&~J4'J*X2&~J4'Qt*X'TJz`'Pr+NR'~K`#' +3!222+ 3 222$  +$  +&33 22(/"ְ2$22" +@ +2" +@" +@" +2+ %222 +@ +@ +2 +@ + 2)0153#5!#!#5!#3#3!53!3!53!5!`P@P@@4444@,44^446T)&+3'#222++ 9+ +3 2*/(ְ2#  22#( +@# +@#% +(# +@( +@( +&2#+  +@ + +@ ++ֱ#9' 990153#5!!!>323!534#"3!5362. 0g|E?@@c!!@P8 08RpuUN00TVABtS00 .&O,<'?fp&W,'BfL^&K, 2k'Afz!+ 3 2+ ++2"/ֱ   +@ +2ִ3+ +@ +2 +l+#ֱ  !999 9999901353#5!#3#3267#".54>7'zPlJ46B $$0T>$EM442444wG;M@!U>6bTD%T'~Iz&J,zl'-,T&LMX``&Pn-H'>|z&'Qn.NP&QlNTVt+3222 +3 22 +/ֱ 2 +@ + +@ +2ְ6 .. ..  . .......@01353#5!3#5!#3!53#3T2Tby~n00|T0000p0z`&RD/N'`Oz'Q/N'Q`Oz'/N'HOz'V/Nv'BOF+ 2 +@ ++2/ְ2 2  +@  + +@ +2 +ְ6     ........ ....@9017#5!#!267>73!53FP&O*f693 <xڱ445b>LQk4 + 2+/ְ2 2  +@ + +@ + 2ְ6!  ............@017#5!73!532@T0b4;00fvf`'R|1TX'Qf'Qh1TX'QQf`'S|1TX'QR'Qf0+.2)++## +# ++ 3- 2221/ֱ.. +@.0 +. +@ +2.+! ! +! +!)+2) +@ +) +@) +2ְ6*))**)*..*..@)!901353#5!#5!##"&5463232>=&5#3fb 6`Ak:0-&`;M# 424443PU8$gd6G4$.06%HH5B 4T1+/2+"" +" + +( 9++2/ֱ/ 2/ +@/1 +/ +@ +2/+  +  + %+ 3ֱ/9%  (999(9901353#5!>32#"&5463232654#"3T2 0g|E?b9*"* gE>@d !00puUNqa=B%%&,NhpVABtS0'W2`&PR^'K2`r&PR`'V2`&PRz`'R5T4&,Uz'Qr5T4'QfUz`'S5T4&,U`'R6~&V`'P6~&V'M6~&V`'S6~&V'Mt78&W`'St78'HW+2+2 +@ +2 + 3 2/ֱ+2 2 +@ +@ + +@ +@ ++ֱ9901!#&'&+!!3!53!5!#"4XmmXNL@j44@\8)#+ 1+# +@ ++32# +32*/(ֱ22 22( +@ +2( +@( +2 ֱ  / ++ֱ  9 #9901535#535267>33#3#32673#".58=0 $8:>E0 8\;+K?$J6006tE5|P8cT10U9X'O8<@&bXX'W8<@&bXX^'K8<@r&bXX'N8<@&bXX`'V8<@&bXX/,+ +"+ ++32220/.ֱ. +@ +. +@. +&+3++2 l+  + +@ +1ֱ "),$9, &)$9015!#3265#5!#3267#".5467'# XP1[lFSJ46B $$0T>fh f44VyAȾ440]ZG;M@!U>]PDHt72+ 9++,3%+ &++3 28/6ֱ 6 +@6 +-+ 2 - +@ +- +@- +-+((/9ֱ(299-/9%+,$92 ($9./99015!3267>5#5!3#"327#"&5467'#5'#"'&5D2@d !2'0BE43S<2E*Fhzr 0g|E?D0|VABtSl009a<5>n '=D&PO^OpuUN0D\`'P:('ZZD`'P<&t\`'R2=TV&]'J2=TV2&]`'S2=TV&]XBf+2+ + +/ֱ  +@ + +@ ++  + +ֱ90135347>32#"547654&#"3XY6T\z9*L !/Uu0܎Wm`T=DG&#*00z'WpP'>(2$+,++ ++13/ֱ)) +3++l+.+ 4ֱ )19#$$9.,9$ $91, 99014>23267#".5467'.7  LʮLXpZJ46B $$0T>kbsNȈAAvXG;M@!U>]Fh\TUe`!)x+%++ &++)*/ֱ##+  '++ֱ )9'%$9 $9)%99014 327#"&54675".26&"`f[43S<2E*FhhiMuGyyyƣ/O5>n '=D&POZL@s;X'Wo`&Pp8",+3 222 / 32/"/-/ֱ +.ְ6.   .      ...@  ...........@  #&,$9)9"999,90135333!5!!3!462"&264&"'76328< `i!q{iii)BBB>+(E4<44444SSST22T2M-#)ypf&D&0z`'RpP'>`'RX&P'Q6~&QV&7Qt8&WQD'W<&t\tX+   +  ++/ֱ +  + +  +@ +ֱ 90146323265#5!#"&r9*"* *,?/2\l=@%%&,+3{0}LR?+/  + +/ִj+ + + 90147327632#"&LIQ(8@.IO AQ 4,1?lRX<+  + +/ ִj+  + +9014632'>54&#"#"&R@.IOIQ(8x1?lE AQ 4LR<+  + +/ִj+ + + 9014632#"'&#"&LOI.@8(QI7El?1,4 QA CB$|,(nh @pr:2Xrb. *$dlllC\T"zr:"b.QtJ*dB|0N` , / %+/ֱ+ 9017267".00 uu 0FxxF]qq]O\\0N` , / %+/ֱ  + 901>2."0FxxF0 uu ^O\\O]qq]tVH(h DBLjOD/+3J )+%2@JD+/3 2M/"3 )+2P/:ֱ K225Z+#2215:+>l+>/ 31l+2>:8@995199JD3<99 99014632254'&5462267632#"'.""&547654"#"&546764'.%&  $  &%*)GG)*%&  $  &%*)GG)*+"#*! !*#"+ +"#*! !*#"+ X|  / + /ֱ 01>32Xt 5) '-?*,7p(L / + /ֱ 0147#"&(*t 5) ',7B-?*Zj " + +/ֱ  014?62"&Z) 0 )5R5FF**F'55fX&R  / + /ִ + 01>32R4*(.<>+ %Kh</3 2/ֱ + ֱ99 9901462">326462"h3H33H׎4*(.3H33H4H00H6<>+ %KTH00H6L&-/ + +/ִ++ 01462"MnMMn)nMMnMR'R'Rz'R'R&R&\'T8$z%za+2+ 2 +@ +/ֱ +@ + +@ +2+ֱ901353#5!#&'&#!3zB4JZ4244z6(=z+)++!( +! (! +@( +%2!( +@! +#2*/ֱ+) 2)&+"2%%%+ +ֱ)9&99%9!( $9014>2 .7  3!53#5!LʮLuuN444ȈAAff\TUe \z,z&.8w+3 222+3/ְ6.   ..    . .......@0135333!53 38< `x4~44!4f0f1 '+  +@ + 2+3+!3& + & +@& +#2 +  +@ +2(/ֱ+2+'2'$+ 2##+2 +)01333!2676533!53#5!3!53#5!4422444*44֞444z%$$%I(ج\2zp+ 3 222+22/ֱ +@ + +@ +2+   +@ +2 +@ +01353#5!#3!53!3zl42444424z3+  +@  ++   +@  +/ֱ+ְ6 . +  .    .... ......@9015!#&'.#! !267653!5 44!bNtH244Z@lV6'$%I#7bP-"+#2+ "+++ .+ +@ +./$ֱ$ +@! +$ +@$" ++/ֱ$99999#-$901>323>32#"'654#"3!534'.#"b:vHfH 9JRk?YSN80!@x`d24.eD=L"?Gvg<^B=M 6/@ھ449g\gLx'/+2+ 2# +(32& +.3 20/ֱ!!+$22 (22 +@ + 2 +@ +2!,+1&#99901>;5#5!#32+3!53#"&;#"326&+xފEPEއފEEY9999R]44]]44]4ZH;LYE+FB2+2)+6 +6) +@6/ ++V ++HE) +3HA2Z/PֱG+2B2BG +@BD +2GB +@GE +2B#+993+,[ֱPN93919,)/99HI96$,:PQY$901>32#5!#>7>32#"'654&#"3!53.'.'.#"L.uV5 1=S1P1S<1  2T;EKO70!+! #:MmDE$/  %%8WXg8(9WAP9<%h44%=7S<\4+StzJ/X<>U 0*GlwXT7%n44DP*o~h+2;/4R&TbP'TD\'z'd0'2'`R&\+;u+ (+0 '+ ++7 32#"&'#"&32>54'#"&54632>54&#" **ZPW2\KazzJ4!,*&.J 'YCrI(`jM,8B)*'_Z`LQY?2-cpnMxBgKH[l6+?AntN}MPZ/.+> =Ckt05P%++32 6/(ֱ""( +@" +7ֱ"( ,$92%  4$999014632>32#"&54767.'.#"&0ZC:dL=.  #))06>U(SXE #0172 CM-[I@0'Gh9j\BVc{RK%ES3Wxz<=ga?MlrB8>)jL&4&+* @++1 @+/ /+ + +5/ִ'6+' +.+#6+6ֱ. &*1$9#91*#999 9 99016327.54632#"'&#" 32>54&#"j)+ :Wp?g@Ca5B>#ABsfVXVfVXV M}FX`&7;&qQ(bVp|_Vp|z2|0+( 5+ + )+ + + 0 + 3/ֱ%%ֱ/ + +4 (%+-$9"$9990174675.54632#"'&#"632#"'3267#"&zB6%-|SL>0DFz@U?:VM7RL"0d[lKp;u)Z0t=3TZ@>(:&*-/1 D%N`-<\nXlK8+# <+ )/3 +3) +3/ +I/ k+L/AֱA +@ ++/5+&5& +5, +Mֱ5@  #2327632#"&546323254&#"#".54>7'#"&XsE5W?)*:QSV/{P|p=*eG*B37U}e0H-#3&OHF6<>32#"&5454&#"#"&54767&'&#"#"&0M4-H0)=Pc8;[2 046:WPTE.[L?(8/?= &L2(3P)32#".32>7!7!654.#"f,QNSe/EpEMQ9"F/7Y:$ s'T3.e%{ Uzm5hjAr熱OiKYE+ ++/ֱ+ ֱ 999 9990146323267#"&54'&D129LN$3 /A\LEQ 5H8,Y{!S: :$Jai]>?"+03 +3> @+@/9ִ l+9 +9 +@93 + ++'+l+Aֱ 9,9+9'(99"+,3$9>  '(6$9901463267632327#".5'#"&5467>74&'&'&>?6(@) aZ'r76p.-wVK!-QI;^9 RQ$&,,B;D$$ 0-'TC$.2#3XIoD5mA2OS"YWlT)9LbNUc~O!(90;,M<9,%  (++ )++# # +#' +)/*ְ6   999  .......  .......@9#99014632#"./#.'&#"#" N2YnY46400ZLN&E52$# JA6W)$2Ef=QXij546323267#"/#"&'#"&~.''-"+uR=^5! ;951*& -*=+D8M 'ZmHW/PB<>5LMVkG>NwTKpU;8T/'*>@cp\nlLܫ\1e0&3++'/ֱ + +( 999014632>7654'&4632'&'.'.0*")I6'* GA&G#O;lpH*:'P<4//!16]e;M]Ot?8&$ZiƨCm)#<`DVUE+( A+, + 2/8 <2S/ + + V/NִZ+2N +@ +/%N+HH/%>+/>/ +>5 +Wֱ%9>@  (,EJKQR$9/9E8/>99,%H99 JK$9SN999 Q9 99990146323632632#"'327632#"&546323254&#"#"&5475.5467'".`^42)A$+4AGZ58T6S30i_>me*B37U}jb+8.")(-KF6<>32#"'#"&327654&#"x .TQV]S'Z7';?B{WlXfVYa %[^~݆2FF.*4NUmVps\51+ 2+  + +#/, +,# +,) +6/ִj+ + +/+ / +/& +7ֱ/1991, 99014>32#"'&#"327632#"&546232654#"'.\bQKi8,,/3c30$:A"/6.(Npzd1G+<60pEJf4oܟcIC10 KJF_6Q+zZm*.!$ &_\t\ + +++ 2 /ִZ++  +  +@  +!ֱ 999 99014>3!!#"&7327654'&#"\XptಎXuVoU_HIOhI+2wԋ_qlxryPQY5 nt"K+ + 2 +@! +#/ֱ +$ֱ9 990146763!!3267#".5#"#" 3*H>oF;/EJ95J%j#^/p,K@U,"-7ZB/V_>V2`R-p#+ ++3./&ְ*2 &+ ++ + +/ֱ&,9 9#99&9990146323267>54'&5432#"&547654'&`1-,2.YQKm648 +8.]x))AR5k$whyBCA8BQ+`JsŤC,>?5D\5A1+#3 @+82*++3> "+B/ֱ  +  + 1+2#68221-+'#;+4+Cֱ1-9'#*9;>99> $99014323&'&54632##"&54765.654&#"\Д - COs0ayUsc^MFH=V1?>1(A!j_/d[`A*"s !jF_3@io`jJ>Vv'+8+*5t S~H-VJpQ6>"++3 "+" + ++ 37 +7 +7< +?/@ְ62 2 )03'3'19 92  2 29)(()93'32@ '()23............@ '()23............@".97090146323632327632#".'##"&54767.#"#"&6Z64ZB=(*;$,GVd4. E *[EMnU!1?';*!QF[+!&.9S>aZT-&2}}Ѯc5b8'Hhod+%/1&.~ɑ&"$2TNF5+! 2B+<++-3G/ֱB+25!255+/92>>/5'+/5+'/ +'+ +Hֱ 9>9B<9599!/99014632&54632>7>54'&5432"&54767.T<7UAtWR@9,9c>:5 /8%Oqc %5^5% {~DQhqM^&UN(^?Ek9K,:b _VQ@0$.9\yL|J-4JJ4-J| \@=+73 .+"2+-3A/ֱ +&+3 ,+&3 +&+ +Bֱ =$99:$9&"799+39:$9014>32327&54>3232>54&'&5432#"'##".\5O^) ;+|\MHC5%+ 3'P.I~GZH&&'l9/3KVj0CaK]|LK #p愸l|.ZH$=A%=?34nbY: $`TE[klH_|6'T`R&\'V`R'V\'B\$4D +( (++@0  +0 '+7  +7E/ֱ%%-+=+ Fֱ%99- 57$9@990(9999@7 99014>32#"&'>32#".3267654&#"3267>54&#"\9rvTp;[j2YtDK\"+}3mY_ɋhg7l~YDc:j~YDc:j>S.|2>F@&9neQ0pYM;f@%q}-;RBgb˔X~@JuX~@J0$.N)#01]a ^GW2+E3 +U )+ +P3* +2;2 +;X/ֱ>> +>B +>+HH +,YֱH;99 28Q$9, *992@99;7>999* #&,$9U 9017463232>54'&#".54>32#"'&'#".'.#"#"&;&'&#" pPhboeEe7;PEtL.LX.o>N*bp /C !7TY9+LF1$7! #%'-?-Ci]~O4*KA[WeS] i D1-&`PҀN=7. "$+$X15U7( `D\$'3?%+- @+++ ++= @++@/ֱ((/+$22422/ +3 248+Aֱ (-9/94 98=9%9=-04$9 90147&'&546232"&54767#"&7327>54.#"\ $5^5%  $5^5% D6gF?Ieqeq6gF@G |J-4JJ4-J~̳}J-4JJ4-J|"B@(+ n nL"B@( R/P+H (+!+3 6++) N22) +@). +) +@ +Q/$ֱ0 0:+BBK+Rֱ0$'(999:!3O999B8E$9KHN$9)H$08=$901467>3!267632##"'##"&5467'#"#"32>7&5463232654&'! 8.1F7C8.1FOKj0C@.7Cv`5,C86+ 2(z4l4E^/l)+'$40./l)+'VhΠDZԡU@ $40v'nCu 5:!69*0ҊFwK>`U8+F3 +3T @+#/0 9+0# +0) +V/Oִ l+O +O +@OI + ++=+l+3+ Wֱ OB9&)A999=>9-.99#09993899980 3995ABI$9T  =>L$99014632676323267#"&5463232654'##".5'#"&5467>74&'&'&>?6(@) aZ'r76p.-wV%=`Ζw03 , KN](d;^9 RQ$&,,B;D$$ 0-'TC$.2#3XIoD5mA2OS"YWl.&jǧyZ'D!'%DEp<*ENUc~O!(90;,M<9,% r+ 2+ + 2/ֱ+   +@  + +@ +  + ֱ9 99 99014> 3!53&$ 6& U&Ut\~JJ~\ 44}`\&z+3 5+++# @+'/ִ6+++  +6+(ֱ9 #99 9#99014 #"&54767&7327654&#"\/?>1(A LfVlXfVlX s'+8+*5tMVpmVp$+2+3 %/ֱ+ +@ + +@ +&ְ6.,  ... ....@ 99 9014327.#";3!53.݂^?ìt3!!"327632#"&546232654#"'.\On(X_50$:A"/6.(Npzd1G+<60pEJf4ݭ\Z[MF_6Q+zZm*.!$ &_z+2+ 2 +@ + + +@ +/ֱ 2 +@ + +@ +2++ֱ9901353#5!#&'&#!!#&'.+3z`4"KY05k?4248as~P/@+4dt]++  + @+/ֱ 2 +@ +@ + +@ +9 90147>543!#!!#!#"E8/vX15 LCU4%;8/>/ppd| + 2+2  + 3 2/ְ6..++ .. + + ........@015!#!3!53!p*-f4444H(#r+/ $/ֱ+%ְ6. 0 ... ....@ 9 999014632%267#"&'&'5'57l++ +< >B20A =\d؝'E9'E4K;2bl `0L+;3 @+ + +,/' 4/C3 M//ִ#!+#/ +#) +#+  + +Nֱ#299>99,8@A999' /9994 2J$9014>32#"&5463232654'#"&5467&#"#"&54767#"&`H~;r~xc%%E*B91/0*~TDQy[[v y?L;&3OGD_g&*=)5&chX8|jvАiN%,CVXY 0+_:6rVd? -$Nt: Y_#"0 ^m+ +/ִZ+ְ6................@01%.'.5432''%&' AtR\67E+; @+#+, $+,# +,( ++C F/ֱ@+  @+/// / +/% +Gֱ/68;C$9, 6999;99C 99901747>32#"&'#"5463232654.'.327>54&"\8>DOFB8TYa 1arP?_S,wgx160(4X:-hpVj2Dvgdtoh4xpLeO$%9V;& "5P4hyL ! '  Uy|:OM]m\ E+ + +!/ֱ + +" $99014>32#"'&#"3267#"&\BmCVL&@MWH~2T#u^H 17#_{'|#T++" +$/ֱ2+2 %ֱ99 99014>2 .72>5%!  LʮLuuBzΣzBu dȈAAffNN45C\ *e%+ *++ '+ + +% + )++/ֱ 2 +@ +, "99999014>32#"'&#">32#"&'3267#".\8Xpl2c-DIBQddTyVn> r4kqV8chGc-4+/AI[iAb 2++!/ֱ" $9014>32.#"32>7#".LhS5)abba)5SğuȈAi"K`99`K"if\',\',\',\',\',\',\L',\L',6&X6&Xf'f'&''L'L'z'z'r'n'zL'zL'*'*'Z'$Z'$&''0'.0'.0'.0'.0'.0'.0L'.0L'.'''$'$&''L'DL'Dl&l&&&&&<L&<L&'''$'$&x'x'L'DL'D\'\'\'\'\>'\>'b'pb'p''&''`R'`R'`R'`R'`R'`R'`RL'`RL'D't'$'L'D\'\'\'\'\'\'\L'\L'''T'T'&''NL'NL'\',z'0'. &\'`R'\'\'&,\'&,\'&,\'&,\'&,\'&,\L'&,\L'&,6&X'6&X'f''f''&''F''FL''L''0&6&.0&6&.0&6&.0&6&.0&6&.0&6&.0L&6&.0L&6&.''f''f'$''$'&'' '' L'D'L'D'\'&\'&\'&\'&\'&\'&\L'&\L'&''''T''T''&''F''FNL''NL''\t'\'\'&,\'\'&\L'\L'&8^&KD8&WD4&8L&zNt F+ 2+2 /ֱ   +@ +2 +@ +2 01353#5!#3zԎ0000)+ / ִm+  + +014632'>54&#"I1NlnvPO79hX)-kSZ5('G54/NB$L'l//(/ִ4+ +" + +4+  +  +)ֱ 99%9"$990146323254'&54632#"&'&#"#"&NO/\<67#'+'/O/\<67#'+'/A^53n%%'=&A^53n%%'=~'/7+32//63+ 22/%328/)ֱ- ִ4+ +" +-1+5 5ִ 4+ /4+  +  +9ְ6.299..........@)/9-+99 1799539"9  $990146323254'&54632#"'.#"#"&462"$462"~_Q^[9=# "$0_Q^[9=# "$03H33Hg3H33H?PO2)!3?PO2)!3H00H66H00H60&6&.0&60&6&0L'0L&6& 'r L'rzz&, ?+ )+ + + +!/ ֱ  + + +"014632'>54'&#"#"&%4632&DE1`f=>.0#.& *3x(,7,7XY"#M4>  +BD\wK&S+ +/3/ ִ5+  + ++ֱ9999014632'>54&#">32&>/Mlc} [C432vO5H</74?XOTx3* &,\w60H :71J&+wDB+.KPL'7 +3%2+"+6/5+1/+ @+/328/ִ4+ +" +)+3+3) +3. +3 +4+  +  +9ְ6.299..........@3)9 5699915(9+)9 9990146323254'&54632#"'.#"#"&4632&$_Q^[9=# "$0_Q^[9=# "$0lK)37/M q?PO2)!3?PO2)!3j+%&! N]#(`Rt&`R&`R&x 'x 'TRL&`R&bP^'KDbP'WD 'r'h</3 2/ֱ + ֱ9 99901462"462&462"h3H33H.D.$&3H33H4H00H6,60D6H00H6 f / + /ִ + 014632& (*4&. +>32#"'&#".!?+0Ld%AE!WH!>;#C5g%PvJU 't@T$ ++3@+ 2 +@" + +@ ++%/#ְ2" +2"#+ 9+/ 9+"+E+&ֱ# 9"9 9 999015>7654>3235733267673##5@-9$#@=c( lb=hDy#+"gvVy('.>B2/ ++ ++/015!>`` `++/ְְ6.2.2.........@01  NV,V2222Hd++/ְְ6............@01 7 H,VN2 `|'/7?GOW_[+>3 +:2/ִ+ +(+-+/N3 +J2/^3 +Z2/V3 +R2'/F3# +B27ִ3 +`/ ְ2 ,+2ִ ,+ + 2 ,+$2)+02- ,+42-)-9+@2= ,+D2=I+P2M ,+T2Yִ] ,+aֱ 9999  99YIOW99MKS_999][9+)8=$99997'% @E$9#!05A$931901462"462"462"462"462"462"462"462"462"462"462"462"`(8((8(8((8((8((8(8((8((8((8(8((8((8((8(8((8((8((8(8((8((8((8(8((88((8(8((8(8((8(8((8(@8((8(8((8(8((8(8((8(@8((8(8((8(8((8(8((8( HTOj&L+(3M&*I222h+]]h +]S + +3?2? +? ++".Ec$3$,Ga$2k/Nְ2I D2IN +@IG +@IK +NI +@N +I++/2& !2&+ +@&( ++& +@+) +-2@+8 +&P+Z #2ZP +ZV +Z`+2e 2`e +` +@`b +lֱ+I 5<999& 23$9`Zh999? 99015354>323>32#"&547654&#"3#3!53#53547'#"&547654&#"3#3!5346323265#5!#"&T1Snw@FDvzz!) 61؎@ '.;61WL-؎@(9*"* *,?/2\D0^pyR$YctX*%7#$*j0000>fh '% .()Vg000(=@%%&,+3{0}T&A#+$ 2?+44? +4* + + + ++:33822B/%ְ2 2 % +@ " +% +@%# +2 '+1 21' +1- +17+2< 27< +7 +@79 +Cֱ71 ?999015354>32#"&547654&#"3#3!5346323265#5!#"&T&Pp[zz!) ;2؎@9*"* *,?/2\D0FOoBtX*%7#%)j000(=@%%&,+3{0}zt&\t&'D't'$&'L'Db8L&zL'zL'z&zL'DzL'Dz6&W&z6^&K&@L&\L'\L'\&L'L'&W^&K2xR222J2J2X2F2L2L2(Jh&|tBJ$\/ / +" + + +%/ִ4+ + + +Z+&ֱ 990146323265432#"&'&#"#"&[@4C<] 'U@(O5U0 $,7`$4P*2X&"Fd$5U":J'/ /+ /+/++015!@JXX&t5 / ++/ִ+++ֱ 9017267".(!ʆ!( 1Kl~lK1diiRN`S$^KvWZJP"MH&L${+3 +222/ִ+ְ6--......@013# dٜ$v FZ/ ++ 2+ ++2/ִl+ + l+ֱ  99 9 901>323267#"&#"V>@: $ $V>@: $ PQYT)+ QYT)+X./3 2 /ֱ + 01462"$462"6T66TB6T66TT66T66T66T6Fk C/ ++ +@ +2 /ִ+++ ֱ9013 73"&,0p0,kŌn'/ /+ /+/++015!nXXJ$\>*Ff?,Xd@4F\kAHnHB0*9+  + +/ֱ + +901654#"#"&546320 (86*AE+^F,0+,9^D.Och3Tt#y+ 32+ &++$/ֱ  +@ ++/ +@ +2%ֱ"#$999901353#5!3#"327#"&5467'T2'0BE43S<2E*Fhzr0009a<5>n '=D&PO^OXZ!/  /ֱ 01462"X6T66TT66T6f$ ^ = / ++ +@ +2 /ֱ+ֱ 90133273#"&f0!vC0 ^koڝX&;+ +/ִ 3+ +l+ֱ 999014>73267#"."2TJ68;>J46B $$0T>1\HO7%&,3FD)G;M@!U&f$/  $ +  +'/ֱ  +  + +V++ E+(ֱ $$999 90146323267654&'&547#"&=+$"a <!-0A <?[2;b\5C$)"8&8U(1%>* _GW9E^A/ / /ֱ   +ֱ 99 99901462"264&"薖VlllppppzMMzMDQ,/ (+2 + (+2 /!ְ678999999@ ..........@ ..........@9 90163232>7#".'.#"DJ&I'"!)H%# .J&I'"!)H%# c!!z4`p/333 +2/ְ6...--........@013#'z)d-DLP? +/  + +/ ִj+  + +9014632'>54&#"#"&L>.IOY]PJ (6032%7>32) F) F/#%*4#%*4'/ /+ /+/++015!\XX` E ++/ֱ+ ֱ 99 999014>2".  `N­NN Nزu??uشuAAu ZA + 2+/ ֱ +@ +  +@ +ֱ 901>73!!5!'e448r0$SY00OO:8+1 -+'+ ' + +9/"ֱ+j++**6+7l+:ֱ01$99 '996*8919067999 "*$90135>7>54.#"32654'7#"&54>32!2767dzF|2^A@c8;%$6 0M;I[*SY;c`yb3-$0*@2Yƃ.PG)-GL%.$/&;O6R^X6i[7Ayc`K' 91b` :7+  7 +  +++# @+#+ +@#( +0+"+.3 -+;/ֱ (2 +  + ) +)/ +3<ְ6"#".,"-1,#1,."#,-....@ *07$93+9 399901463232>54.#"#"&5467!"#!632#".`P72@I9}T}F!# lKYR., .$A tv:B`5)C"*VZLPNtC8</? z>ʨKZܶ@63|;8+8 + +(+28( +2%( /, )+54&#"#"&54773267#"'632#".N8;3!b`=IY2 E"#3U}="Ms^UL_ _uDR?% ,!DFw 9=9(o 'CGO0D(6|%+,+ + ++27/ֱ)2)/+2! 2! /8ֱ/)%$99! 92,!$90147>32#"&547654#"632#"&73254&#"kU_نwA1&:~mj xdR&tӀ^qmhyH4}~lRBT+#)7*$IDtN쑙7,֞n^Ku u++ @+ +@ +!/ֱ "ְ6.9.........@ 901!#"&5467667!"$ #e./%0,02S>S{8d(R.-  l-6TEZZnF@>"(^bwD>=T+9+! +7:/ִ+,ֱ/,4+ $ 4+!+;ְ6''1 '(('921219'(12......'(12......@4, !$97! $9014675&54>32#".732654&/654&#"xmf}kQo]-o|uz}as32#"&3267654&#"|A1&:~mj xdR&tӀ^kU_نwhyHqm~BT+#)7*$I>DtN쑙~l/n^KzTQN+,3O*.K222 +3C"2C +C9 +2+&2G333(0I222R/Pְ2K F2KP +@KI +@KM +PK +@P +K/+32* %2*/ +@*( +@*, +/* +@/1 +@/< +*+  + +Sֱ/K -9@$9*67$99C7999015354>323632#"547654.#"3#3!53#53547'#"&547654&#"3#3!53T-Mdm8?^=$o8*P +nn؎@#1/:ix؎@D0Zj|X)7<(^=AC'($;0000rgT '$%& 9ձ000TOY L+(P33M&*IQW$2 +3?2? +? ++".EU$3$,GS$2Z/Nְ2I D2IN +@IG +@IK +NI +@N +I++/2& !2&+ +@&$ +@&( ++& +@+- +@+8 +&I+&R+2W 2WR +@WY +RW +R +@RP +T2[ֱ+I )5<$9& 23$9R9? 99015354>323>32#"&547654&#"3#3!53#53547'#"&547654&#"3#3!5353#5!3T1Snw@FDvzz!) 61؎@ '.;61WL-؎@2D0^pyR$YctX*%7#$*j0000>fh '% .()Vg000000TNK+(33L&*H$2 +33>2+".D333$,F222O/Mְ2H C2HM +@HF +@HJ +MH +@M +H++/2& !2&+ +@&$ +@&( ++& +@+- +@+7 +&2 E+2/&+  +@ + +@ +Pֱ+H )4;$9&2 9999> 999015354>323632733!534.#"3#3!53#53547#"&547654&#"3#3!53T1Snw@N`zGm$@'L7dq؎@ '.;61WL-؎@D0^pyR$UUH00d@cT-˴0000FkX'% .()Vg000{` $&$*$2$4$7L$8p$9$:$<$F$G$H$R$Y$Z$\$d$g$hp$o$p$q$r$s$y$z${$|$}$$$$$$$$$$p$p$p$$$$$$$$$$$$$$$$ $ $ $$$$<$=$>$?$@$A$PL$RL$Vp$Xp$Zp$\p$^p$`p$b$c$o$p$q$r$}%$%9%:%<%b%c%%%%%%%%%%%b%m%s%u%}&&m&u'$v'9':';p'<|'bv'cv''v'v'|'v'v'|'v'v'v'b'm'sv'u'}|)T)T)$|)-)D)Fx)Gx)Hx)JZ)M)Rx)b|)c|)i)j)k)l)m)n)ox)px)q)r)s)yx)z){)|)})))T)|)|)x)|)|)|))|))|))))))x)x)))) x) )$)%)=)?)A)m)n)px)rx)s|)u)v)-$\-b\-c\-N-\-\-\-\-\-\-\-mN-s\-uN.&.*.-.2|.4|.d.g|.|.|.|.|.|..... ....$.<|.>|.@|.o|.q|/7t/8T/9d/:d/1@1mL1o1q1s1uL2$t292:2;|28@8m8o8q8sh8u999$9&9*9-"92949D`9F@9G@9H@9J`9L9M9Q9R@9X9\9b9c9d9g9i`9jx9kx9lx9mx9nx9o@9p@9qX9rX9sX9t9y@9zX9{X9|X9}X9~9H9`999999@999999999x99x99`99X99X99X99X9@9@9X9X9X9 @9 X9 9999$"9%949<9=X9>9?X9@9AX9mH9n`9o9p@9q9r@9s9uH9v`9:::$:&:*:-":2:4:D`:F@:G@:H@:J`:L:M:Q:R@:X:\:b:c:d:g:i`:jx:kx:lx:mx:nx:o@:p@:qX:rX:sX:t:y@:zX:{X:|X:}X:~:H:`::::::@:::::::::x::x::`::X::X::X::X:@:@:X:X:X: @: X: ::::$":%:4:<:=X:>:?X:@:AX:mH:n`:o:p@:q:r@:s:uH:v`:;&;*;2;4;d;g;;;;;;;;;; ;;;;<;>;@;o;q<4<4<$ <&x<*x<- <2x<4x<DP<F4<G4<H4<J<<L<M<Q<R4<Xl<YV<ZV<\h<b <c <dx<gx<iP<jl<kl<ll<ml<nl<o4<p4<qX<rX<sX<t<y4<zX<{X<|X<}X<~l<<P<4< < <x<x<4< < <x<x<x<<h< <l< <l< <P<x<X<x<X<x<X<x<X<4<4<X<X<X< 4< X< x<x<x<x<$ <%<4<x<?X<@x<AX<cV<m<nP<ox<p4<qx<r4<s <u<vP<DMDYDZD\DD%DcDEMEYEZE[E\EE%EcENDNFNGNHNRNYNZNiNjNkNlNmNnNoNpNqNrNsNyNzN{N|N}NNNNNNNNNNNNNNN N N=N?NANcNnNpNrNvRMRYRZR[R\RR%RcRSMSYSZS[S\SS%ScSUUUYYYDYFYGYHYRYiYjYkYlYmYnYoYpYqYrYsYyYzY{Y|Y}YYYYYYYYYYYYYYYY Y Y=Y?YAYnYpYrYvZZZDZFZGZHZRZiZjZkZlZmZnZoZpZqZrZsZyZzZ{Z|Z}ZZZZZZZZZZZZZZZZ Z Z=Z?ZAZnZpZrZv[F[G[H[R[o[p[q[r[s[y[z[{[|[}[[[[[[[[[[[ [ [=[?[A[p[r\p\p\D\F\G\H\R\i\j\k\l\m\n\o\p\q\r\s\y\z\{\|\}\\p\\\\\\\\\\\\\\ \ \=\?\A\n\p\r\vb&b*b2b4b7Lb8pb9b:b<bFbGbHbRbYbZb\bdbgbhpbobpbqbrbsbybzb{b|b}bbbbbbbbbbpbpbpbbbbbbbbbbbbbbbb b b bbbb<b=b>b?b@bAbPLbRLbVpbXpbZpb\pb^pb`pbbbcbobpbqbrb}c&c*c2c4c7Lc8pc9c:c<cFcGcHcRcYcZc\cdcgchpcocpcqcrcscyczc{c|c}ccccccccccpcpcpcccccccccccccccc c c cccc<c=c>c?c@cAcPLcRLcVpcXpcZpc\pc^pc`pcbcccocpcqcrc}ddmduf$f&f*f-f2f4fbfcfdfgfLfffffffffffffffff ffff$f<f>f@fmLfofqfsfuLg$tg9g:g;|gh@hmhohqhshhuiMiYiZi\ii%icijMjYjZj\jj%jcjkMkYkZk\kk%kcklMlYlZl\ll%lclmMmYmZm\mm%mcmnMnYnZn\nn%ncnyMyYyZy[y\yy%ycyzMzYzZz[z\zz%zcz{M{Y{Z{[{\{{%{c{|M|Y|Z|[|\||%|c|}M}Y}Z}[}\}}%}c}DD2222  &*247L8p9:<FGHRYZ\dghpopqrsyz{|}ppp   <=>?@APLRLVpXpZp\p^p`pbcopqr}&*247L8p9:<FGHRYZ\dghpopqrsyz{|}ppp   <=>?@APLRLVpXpZp\p^p`pbcopqr}$t9:;|x?X@xAXcVmnPoxp4qxr4s uvP&*247L8p9:<FGHRYZ\dghpopqrsyz{|}ppp   <=>?@APLRLVpXpZp\p^p`pbcopqr}&*247L8p9:<FGHRYZ\dghpopqrsyz{|}ppp   <=>?@APLRLVpXpZp\p^p`pbcopqr}$t9:;|@moqshu$h24bhchghhhhhhh<>@moqshu$h24bhchghhhhhhh<>@moqshu$v9:;p<|bvcvvv|vv|vvvbmsvu}|44$ &x*x- 2x4xDPF4G4H4J<LMQR4XlYVZV\hb c dxgxiPjlklllmlnlo4p4qXrXsXty4zX{X|X}X~lP4 xx4 xxxh l l PxXxXxXxX44XXX 4 X xxxx$ %4x?X@xAXcVmnPoxp4qxr4s uvP$@b@c@@@@@@@@s@ppDFGHRijklmnopqrsyz{|}p  =?Anprv&*247L8p9:<FGHRYZ\dghpopqrsyz{|}ppp   <=>?@APLRLVpXpZp\p^p`pbcopqr}MYZ\%c&*247L8p9:<FGHRYZ\dghpopqrsyz{|}ppp   <=>?@APLRLVpXpZp\p^p`pbcopqr}MYZ\%c&*247L8p9:<FGHRYZ\dghpopqrsyz{|}ppp   <=>?@APLRLVpXpZp\p^p`pbcopqr}MYZ\%cmumumumu$v9:;p<|bvcvvv|vv|vvvbmsvu}|$$\$b\$c\$N$\$\$\$\$\$\$\$mN$s\$uN&&&*&-&2|&4|&d&g|&|&|&|&|&|&&&&& &&&&$&<|&>|&@|&o|&q|'D'F'G'H'R'Y'Z'i'j'k'l'm'n'o'p'q'r's'y'z'{'|'}''''''''''''''' ' '='?'A'c'n'p'r'v(D(F(G(H(R(Y(Z(i(j(k(l(m(n(o(p(q(r(s(y(z({(|(}((((((((((((((( ( (=(?(A(c(n(p(r(v)7t)8T)9d):d)3@3mL3o3q3s3uL5$5&5*5-52545b5c5d5g5L55555555555555555 5555$5<5>5@5mL5o5q5s5uL:$:&:*:-:2:4:b:c:d:g:L::::::::::::::::: ::::$:<:>:@:mL:o:q:s:uL<$t<9<:<;|<$t>9>:>;|>bt>ct>>t>t>h>t>t>h>t>t>t>b>m>st>u>}h?M?Y?Z?[?\??%?c?@$t@9@:@;|@V@VmVoVqVshVuX$hX2X4XbhXchXgXXhXhXXXhXhXXXXhXhXhX<X>X@XmXoXqXshXuZ$hZ2Z4ZbhZchZgZZhZhZZZhZhZZZZhZhZhZ<Z>Z@ZmZoZqZshZu\$h\2\4\bh\ch\g\\h\h\\\h\h\\\\h\h\h\<\>\@\m\o\q\sh\u^$h^2^4^bh^ch^g^^h^h^^^h^h^^^^h^h^h^<^>^@^m^o^q^sh^u`$h`2`4`bh`ch`g``h`h```h`h````h`h`h`<`>`@`m`o`q`sh`ubbb$b&b*b-"b2b4bD`bF@bG@bH@bJ`bLbMbQbR@bXb\bbbcbdbgbi`bjxbkxblxbmxbnxbo@bp@bqXbrXbsXbtby@bzXb{Xb|Xb}Xb~bHb`bbbbbb@bbbbbbbbbxbbxbb`bbXbbXbbXbbXb@b@bXbXbXb @b Xb bbbb$"b%b4b<b=Xb>b?Xb@bAXbmHbn`bobp@bqbr@bsbuHbv`bcccDcFcGcHcRcicjckclcmcncocpcqcrcscyczc{c|c}cccccccccccccccc c c=c?cAcncpcrcvo$to9o:o;|os?s@sAsPLsRLsVpsXpsZps\ps^ps`psbscsospsqsrs}tMtYtZt\tt%tcty$y9y:y<ybycyyyyyyyyyyybymysyuy}}4}4}$ }&x}*x}- }2x}4x}DP}F4}G4}H4}J<}L}M}Q}R4}Xl}YV}ZV}\h}b }c }dx}gx}iP}jl}kl}ll}ml}nl}o4}p4}qX}rX}sX}t}y4}zX}{X}|X}}X}~l}}P}4} } }x}x}4} } }x}x}x}}h} }l} }l} }P}x}X}x}X}x}X}x}X}4}4}X}X}X} 4} X} x}x}x}x}$ }%}4}x}?X}@x}AX}cV}m}nP}ox}p4}qx}r4}s }u}vP}~p~p~D~F~G~H~R~i~j~k~l~m~n~o~p~q~r~s~y~z~{~|~}~~p~~~~~~~~~~~~~~ ~ ~=~?~A~n~p~r~vd|ddd | |LLLDpDxDD  ttJl|ltttllTPP|xXx\XppplplXxxPPPll  LLLDpDxDD  XXXLLddddLt^ttt|P | |LLLDpDDD    ttJl|ltttllPPPPPhhhjj~~j~~TPP|xXx\XppplplXxxPPPll  ``p`x\l\\\d  :::dd|||x|xdxxTPP|xXx\XppplplXxxPPPll  t^ttt L L   L D p  D  x                D D       L L   L D p  D  x                D D       L L   L D p  D  x                D D      LLLDpDxDD  LLLDpDxDD  LLLDpDxDD  LLLDpDxDD  LLLDpDxDD  EEtEtEJElE|ElEtEtEtElElFFtFtFJFlF|FlFtFtFtFlFlGGtGtGJGlG|GlGtGtGtGlGlHHtHtHJHlH|HlHtHtHtHlHlIItItIJIlI|IlItItItIlIlJJtJtJJJlJ|JlJtJtJtJlJlSSSTSSPSSPSS|SxSXSxS\SXSpSpSpSSlSpSlSXSSxSxSPSPSPSlSlS S TTTTTTPTTPTT|TxTXTxT\TXTpTpTpTTlTpTlTXTTxTxTPTPTPTlTlT T UUUTUUPUUPUU|UxUXUxU\UXUpUpUpUUlUpUlUXUUxUxUPUPUPUlUlU U VVVTVVPVVPVV|VxVXVxV\VXVpVpVpVVlVpVlVXVVxVxVPVPVPVlVlV V LLLDpDxDD  LLLDpDxDD  LLLDpDxDD  d|ddd | |d|ddd | |d|ddd | |d|ddd | |d|ddd | |d|ddd | |d|ddd | |TPP|xXx\XppplplXxxPPPll  TPP|xXx\XppplplXxxPPPll  TPP|xXx\XppplplXxxPPPll  PPPPPd|ddd | |ttJl|ltttlld|ddd | |PPPPPTPP|xXx\XppplplXxxPPPll  TPP|xXx\XppplplXxxPPPll  TPP|xXx\XppplplXxxPPPll  TPP|xXx\XppplplXxxPPPll  ttJl|ltttll  t t J l | l t t t l l  t t J l | l t t t l l  t t J l | l t t t l lV=| 1]   R   7%6 7.7K z   b (  & 4 <a < "n 46 7 7;Copyright (c) Alexey Kryukov, 2007-2008. All rights reserved.Copyright (c) Alexey Kryukov, 2007-2008. All rights reserved.Theano DidotTheano DidotRegularRegularFontForge 2.0 : Theano Didot Regular : 23-11-2008FontForge 2.0 : Theano Didot Regular : 23-11-2008Theano Didot RegularTheano Didot RegularVersion 1.00 Version 1.00 TheanoDidot-RegularTheanoDidot-RegularAlexey KryukovAlexey Kryukovhttp://www.thessalonica.org.ruhttp://www.thessalonica.org.ruhttp://www.thessalonica.org.ruhttp://www.thessalonica.org.ruCopyright (c) 2007-2008, Alexey Kryukov (alexios@thessalonica.org.ru), with Reserved Font Name "Theano". This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.Copyright (c) 2007-2008, Alexey Kryukov (alexios@thessalonica.org.ru), with Reserved Font Name "Theano". This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL ----------------------------------------------------------- SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ----------------------------------------------------------- PREAMBLE The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. DEFINITIONS "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. "Reserved Font Name" refers to any names specified as such after the copyright statement(s). "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. PERMISSION & CONDITIONS Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. TERMINATION This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.http://scripts.sil.org/oflhttp://scripts.sil.org/oflTheano DidotTheano DidotRegularRegularp`e  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg Omegagreek Deltagreekuni00A0Eurouni00ADAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni01E2uni01E3Oogonekoogonekuni01ECuni01ED Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni021Auni021Buni0232uni0233uni0237uni02BB afii57929 afii64937 gravecomb acutecomb circumflexcmb tildecomb macroncmbbrevecmbuni0307uni0308uni030Auni030Buni030Cuni0312uni0313uni0314uni0316uni0317 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni032Cuni032Duni032Euni032Funi0330uni0331uni0342uni0343uni0344uni0345uni0359uni0374uni0375uni037Auni037Etonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdamugreeknuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosbetasymbolgreekthetasymbolgreekphisymbolgreek pisymbolgreekuni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1kappasymbolgreekrhosymbolgreeksigmalunatesymbolgreekuni03F3uni03F4uni03F5uni03F9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F72uni1F74uni1F76uni1F78uni1F7Auni1F7Cuni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FCAuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FECuni1FEDuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FFAuni1FFCuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200B afii61664afii301 quotereverseduni201F foursuperior angleleft anglerightuni25CCuni27E8uni27E9f_f_jf_jepsilon_brevecmbomicron_brevecmb Rho_uni0313Upsilon_uni0313Upsilon_uni0313_gravecombUpsilon_uni0313_acutecombUpsilon_uni0313_uni0342epsilon_uni0342epsilon_uni0313_uni0342epsilon_uni0314_uni0342epsilon_macroncmbEpsilon_uni0313_uni0342Epsilon_uni0314_uni0342Epsilon_macroncmbEpsilon_brevecmbomicron_uni0342omicron_uni0313_uni0342omicron_uni0314_uni0342omicron_macroncmbOmicron_uni0313_uni0342Omicron_uni0314_uni0342Omicron_macroncmbOmicron_brevecmbacutecomb.grekgravecomb.grek uni0313.grek uni0314.grekuni0313_gravecomb.grekuni0314_gravecomb.grekuni0313_acutecomb.grekuni0314_acutecomb.grekuni0313_uni0342uni0314_uni0342uni0308_gravecomb.grekuni0308_uni0342macroncmb.grek brevecmb.grek uni1FC0.iota macron.grek breve.grek uni0342.iotabrevecmb_acutecomb.grekbrevecmb_gravecomb.grekbrevecmb_uni0313.grekbrevecmb_uni0314.grekbrevecmb_uni0313_gravecomb.grekbrevecmb_uni0314_gravecomb.grekbrevecmb_uni0313_acutecomb.grekbrevecmb_uni0314_acutecomb.grekmacroncmb_acutecomb.grekmacroncmb_gravecomb.grekmacroncmb_uni0342macroncmb_uni0313.grekmacroncmb_uni0314.grekmacroncmb_uni0313_gravecombmacroncmb_uni0314_gravecombmacroncmb_uni0313_acutecombmacroncmb_uni0314_acutecombmacroncmb_uni0313_uni0342macroncmb_uni0314_uni0342 gravecomb.cap acutecomb.capcircumflexcmb.cap tildecomb.cap uni0308.cap uni030B.cap uni030A.cap uni030C.cap brevecmb.cap macroncmb.cap uni0307.cap uni0327.cap uni0328.cap circumflex.itilde.i dieresis.ibreve.imacron.icircumflexcmb.i tildecomb.i uni0308.i brevecmb.i macroncmb.icaroncommaaccentiogonek.dotless DotaccentBreveOgonekCedillaRingTilde Circumflex commaaccentAcuteCaronDieresisGrave HungarumlautMacron zerooldstyle oneoldstyle twooldstyle threeoldstyle fouroldstyle fiveoldstyle sixoldstyle sevenoldstyle eightoldstyle nineoldstyleffffiffl  <2    !%&'(,-./4567CDEFQRST_`abnopqrstu  =>BCGHabd "*2:BJX`hvDLRx\ xxx x x bcd DFLTgrek"latnF   (AZE FCRT FDEU dMOL ROM TRK F        aaltbcalthcasenccmptdligdligfracligaligaloclloclonumsaltss01ss11sups     6>FNV^fnv~D|8<4FJxN>   0 N h |  F8LV`jt~ (2<s &-5oDR`t  '.6pESast$(*,./12578DGHJLNOQRUWXcn.LM LM  $@$=$=`* 135789: 0@LV(4@JQ '.7>EJ&SV,_f0v}8@HPyz{|LMPQ yz{| LMPQ 0 &dIObIOdOIbB 0  cILIMLM cLMIbF 2< H( H(HH$2DRd J (.4:dIOcILIMLbIMOdOcLMIbJ 4 "E*Z^djpvz~ XYZ[\]^_`aIyz{| 1 2C34D:G9F;5E768*LM LMPQ ILM CDGFE 1234:9;5768  v  (08@HNTZ`0/.-,+*)('&"*28>D%$#"! 6  lDFLTgreklatn.(AZE (CRT (DEU (MOL (ROM (TRK ( RQDkern mark&mkmk, 8@JRZbjrd *j J"-....b..,    ",6@ f +X^djpv| $*06<BHNT,D $064`@8*8$. V8,4,.n+,DEFGHIJKNOPQRSTUVWXYZ[\]o 2MapICG BHNTZ`flrx~HHHHHHHHHHHHHHHH2N U $*06<BHNTZ`flrx~ &,28>DJPV\bhntz|B,*N&l B*,@xT:P6$0`@<lB6@B'|*B&l B0Bn$35=DIKLNR!U[&]]-.03451279OPQRST  28>DJPV\bhntHHHHHHHHHHHH> &NTZ`flrx~ &, R$00`@8*8$. V*4.n&DEFGHIJKNPQRSTUVWXYZ[\]o MapIHz. $JPV\bhntz  R$0`@8*8$. V 4.n$DFGHIJOPQRSTUVWXYZ[\]o 2MapIHN (RX^djpv| $*06< j0`@8*8$. Vt4.n(DEFGHIJKNOPQRSTUVWXYZ[\]o 2MapIH  &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv||B,*N&l Bn*,@xT:P6$0`<lBJ6@B'8|*B&l B0\8\d(8<84`bvB\\\\\\\\88888888\8\\\8888844n&$=DIKL NP"RX%Z],023678912;=Tqwz| }&/6?DKRW^gm HH$. 5lrx~ &,28>DJPV\bhntz,L,B,,,,B,*,&,,,,4,B,j,B,,,,,@,8,,<,X,,,,B,,,,@,,,@,B,,L,,,,*,,,4,B,j,,,,<,,B,5$%&'()*+-./0123456789:;<=d 1L`o1; .4:@FLRX^djH,H,H,H,H,H,H,H,H,H,H,v^ "(.4:@FLBD6n  0% &,28>DJPV\bhnHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHlVv  &,28>D@Xp Q  *06<BHNTZ`&&RRvv> &NTZ`flrx~ &,\\\\\\\\\\\\\\&   !"#$%&WXYZ[\]^gimH (.4:@FLRX^djpv|HHHHPHHHrHpHHHHHHHH>HpHHCGCGNTZ`flrx~HHHHHHHHHHHHHHHHHHHLLDpxXLdD2Tt^x|PLLDpttJlx|PPhj~PTP|x\Xpl`px\ld:d|xd|$         EJ SV       0        A   EFGHIJSTUV    2PLpvp|T|xZL\N|tTdLLt|hPxZLx h"H`x@X`4 x xPl4X> ??@@ AABB CCDD EEGGHH JJ LL NN PPRRVVXXZZ\\^^``bbccoo ppqq rrssttyy }}~~k$$&&**--224477889:;; << DD FHJJLLMMQQRRXXYZ[[\\bcddgghhii jn opqsttyyz}~~            $$%%44<<==>>??@@AAPPRRVVXXZZ\\^^``bbccmm nn ooppqqrrssuu vv }} w$%&')-./12356789:;<DENRSUYZ[\bcdfghijklmnyz{|}$&'()135:<=>?@ABCDEGHJLNPRVXZ\^`bcopqrsty}~$XX@@ rrrrrrrr(XX$VV>>$$$$$$$$$$DDDDDDDDC)7]O*colr GSUBGPOS h:LMb  ')039<SV_bkmnqrt~=CGl(r@xW~| 'c '?Xu'Ic|1QA]w:Y'ccmp' Simple Glyph Composition'ccmp' Dotless Variants'ccmp' Capital Accents'ccmp' Subsitution for Greek Accents'locl' Localized Forms for Greek'case' All Caps Forms for Greek Capitals'locl'&'ss01' Romanian Variant Forms'ss11' Greek Contextual Forms'salt' Stylistic Alternatives'calt' Substitution for Initial/Medial/Final forms in Greek'liga' Standard Ligatures for Latin'liga' Standard Ligatures for Latin except Turkish'dlig' Discretionary Ligatures for Latin'dlig' Discretionary Ligatures for German'frac' Diagonal Fractions'onum' Oldstyle Figures'sups' Superscript Forms'aalt' Access All AlternatesDotless VariantsNarrow Accents for iCapital AccentsGreek AccentsGreek Composite AccentsGreek Iota Subscript to AdscriptMedial/Final Forms for GreekInitial Forms for Greek'ccmp' Simple Glyph Composition-1'ccmp' Dotless Variants-1'ccmp' Capital Accents-1'ccmp' Subsitution for Greek Accents-1'locl' Localized Forms for Greek-1'case' All Caps Forms for Greek Capitals-1'ss01' Romanian Variant Forms-1'ss11' Greek Contextual Forms-1'salt' Stylistic Alternatives-1'calt' Substitution for Initial/Medial/Final forms in Greek-1'liga' Standard Ligatures for Latin-1'liga' Standard Ligatures for Latin except Turkish-1'dlig' Discretionary Ligatures for Latin-1'dlig' Discretionary Ligatures for German-1'frac' Diagonal Fractions-1'onum' Oldstyle Figures-1'sups' Superscript Forms-1'aalt' Access All Alternates-1Dotless Variants-1Narrow Accents for i-1Capital Accents-1Greek Accents-1Greek Composite Accents-1Greek Iota Subscript to Adscript-1Medial/Final Forms for Greek-1Initial Forms for Greek-1 ,2\b7lNrex~ )Lr:g $=[ ,'RQD ' Greek Caps after Accents Positioning'mark' Mark Positioning'mkmk' Mark to Mark'kern' Horizontal Kerning lookup 0Greek Caps after TonosGreek Caps after VariaGreek Caps after BreathingsGreek Caps after a Breathing and OxiaGreek Caps after a Breathing and VariaGreek Caps after a Breathing and Perispomeni'RQD ' Greek Caps after Accents Positioning-1'mark' Positioning for Top Accents'mark' Positioning for Bottom Accents'mark' Positioning for Acute'mark' Positioning for Grave'mark' Positioning for Dotaccent'mark' Positioning for Dot Below'mark' Positioning for Capital Accents'mark' Positioning for Greek Accents'mark' Positioning for Greek Capital Accents'mark' Positioning for Iota Subscriptum'mkmk' Mark to Mark-1'kern' Horizontal Kerning lookup 0 kerning class 0'kern' Horizontal Kerning lookup 0 kerning class 1Greek Caps after Tonos-1Greek Caps after Varia-1Greek Caps after Breathings-1Greek Caps after a Breathing and Oxia-1Greek Caps after a Breathing and Varia-1Greek Caps after a Breathing and Perispomeni-1TopBottomAcuteGraveDotaccentDotBelowTopCapGreekTopGreekCapIotaSubscriptTopMarkvedo-2023.4.6/vedo/fonts/VictorMono.npz000066400000000000000000004064351444463326400176510ustar00rootroot00000000000000PK!H  font.npy   tU6\7$!!*CyL!$w霪 (K%,4"`TAQQN " " 8!H+'K۽^o\u~>Ui[['ҲkzC[IoY<.RX"r{8>?joo^jtEdxf?NӴ].=\#?\*~ʦk T{B#TW*\'¡C7?\T;SS .?+k%3.Vc=Jdk.1205[ViiolE-JĔ`W؏ۋ`}Ҋ!%~ę}=熚 ^|"X?SሴvZ/|EIJyF4T7Q~W2?$z#FwqU~)nĨQWh Fk ZjttUH+VJiՄjAZiZ3TtUZ:tt HS&ZcZ#FZCЭ ڕ T- ]):E}9XJDLiujuhЉIjC.7/ gHinZ:?Zj]3?eAqRn'\ ) =vj/3^si?iowUjJEOY>vBԮ:燻]Aޮ<$鲾m6gY:xn!ƊX*Uaש66`MT fCLCА ZStV]@+ظq+aVh!H`!jb! xYoBބ e&4Mhhӱ!pg AiCjйZt2 Dѵj)bky2D3!C  V$DtHmUM!z͠-0WStJkcVc+i`@i?tt?/tR4iT6m1Mn dR9k!Ld= ۡoCAB`>ZoZ/^ZOZ6t }=2W2W]ݠuo3tgt'E\l7W=G =[=K =S + umCmH"e" d!ad!Ad!A=22k5УGkFub̭j_bbbLU-&h,&@-k k5͐5-58miw`=I=Q+.&@Ozw@"RL㡗B -Vw?hˡtx~Lkù%Qa1W`x~@Y} F(ʆ5Xx苂}g? ;<|ʈE&Pݯφɸ|ԭw+^ًU1P˾~ҭg~cL1{~qX0ħ̚ #JF@,@c1eCp>gB]1|v /Rŋmϰ$(l욢+^Ek#yIrsB71 a><}Y3D>*o؍5Lsf;3 sZ: Χ9y#/sbo(&槣ih,{=wr:ns+g~C7S-6x/Nxgzzd_1c7s /sǻߪ!g dS?&8|1 1  oZy)v?u?OKvW1y!K@>wĔgZog 1 gثu.:/@yŠXgifԸ8?׆O)*qYôT`;n#y՜l3vu˜ n,дA%jyaSuupoqWܧ0 ^3 9&YF7K{:{unƛC5o?"P=P_UInI؋Ay#ãTި|3#a:@ցƭ[4hÐh #A.B/B/-ПZ|9ЇC0sN7ГRԍ9,n9 ʋˋˋˋˋˋˋ@zp(_oMqweuNםF;^w4ziui2PiQ&Jy]#+)MzSt2^ʐR%C V!;b0K[ʰRR4KIi, ^ϠzAA\Be y1]sm*QFQF e uU Ԥt}H(K t*+ ~TTDyS]wA/VJM%|SQJO0`*=T@k ЊȊZH9LR4r$B{Q$H&GL"ZP^_[YH/G-!\,![B%Pǁ*2tw8Rq(h Mm#0~+:$H鐀)RhCHF< uPIQ|IH þXa27x[c ZqkLjǔo\X#|s nQVb\~x|E0VVTc]m)Q[MOR[)2YE+wF*<;tyi~xڼ:m [c 'ŇtW}0-Un\a~`nkY@ P>Fi/9vJxQ>1QVfv(_kk_?y`~^eUŝ{Ff˰}=5*P\q]Ff w\U3 p ʹrUwFjh?`fp_L3K³b{ass V{3}=i{]v*ڕ'U_> QPRM3ڛf7ؾayOվeiƘ===...QOOOxZxZxЮӮӢьg..N<]x8tq3ęxLKn~߇5?X>dcFZT~ .w\/ .TbJd94 ōz[:4;T`g[ƶP?o?_ҒjLݰcئ,+Rа$]=nPɛ9+Q+Q+Q+Q+Q^UXhU`````ɈV V V V gdeى 4 4 4 4 1 1 1 1 1M0M0Q 6ۉ\(tdcڑ#kG6֎l#kG6֎lQޑ#jG(+JwGyJ#|OROjj~uܙ;ɞiʹ΀"; ՜*t,P-DG ss;!h7|IxMUG{ ?\ȃ zl'WX X1 q$1đ^j\XGK=MNfP"%7(PI &݀ ިN)Q݀Mdvq*kUW~|./.u ?R~4v^?ZS]B.bl-ʱ!KO`ruLեWgtR~2zmO᭱(W{:?:\7uϪ8{18~ fgk3_дcݏ1Xna)6b[-E4RTS@:@][P}m3~~𷇵OJc9ugPwF ^PVIF7G}Ѿ ]H(+SVR[ J='}dV:lu>0_.sG1ߠ>EEI"E"E",D柨lb&2VH,H&7剴;DZDZDHeiiI$S6Usl:نu evsa}n܆=ZŒK6)Vc_V1+`WsM^{VoĨO]ߊ]m#NW$1暑/eӱ/ +9> jr|t|DE"UN7g=nNiNӜӜ9:{[JZ3"pi؏ՉAz)4-MfFL2j]:[Nul3WSC * }׆Ob9GbuS-{Y>Q4xI-=s~dn}[UX|Zуf2_zJmM~auo_\jlg|J (^ScC=~cyUf}b7D'ZyΧyGs/y?^YI+&G{]-U)W0 }erX*c {I'ٷY_~]o|/#19e7:zJ5ÖF|L򭻭ᴵ%Xc}ʮ#} ckEnk 6c}Fcn&|/4y@>tpGVHo?a ZyG !.gg\&g|ߪV]jzɡFu\|{X+ΗNwwD lvgiN󄔲#O OF-#KO i.u- r\!d6 ?B*9Edl.2^%JBILIX^UgU}P(t|F C lbWzWzWzUjho`6$H R ye0RJ (e4A ]+z3t`5 K3,`4z* lvb`Df"3ѓѮb|t¶iuC. &¤);].dFV#M$[UV7788T1y&S8_C)Yc+/Jcy.ɄdK%3]*dvc$'3HLKy %3̾dQ$k71ȖMneVZoeJϭ쯼 QkRZmdvd6}kِZm.{3U~z37s.{37s.sPˀ\T7s.{32?rhP!LZΰr/gq9C^ru3$J?F}k ~Rm/WBIST~GjE_ A^cgFvq'0̕3d|Zv\+bO,D==Ֆ@׭6qDS[ӡ/B߆Ά~ ev/lsws܉xjw3yO y^Y+ZatN}cMW=@xEYTX}.Vڬ>sju*D4z1֋1^D^\,fd1%ddѐI)t)mp)n))Ѡ /R4~_edѪDqR BQ4@ EDd80Wai( /:D, KCT%rc&N!pJe3mG ؎Ң9e//Ў/nyXu1 b}Q?07͠jhgEpLv7 0Y.Y(wɅV9RW2q* #:{7L:;^5
&yr4۱g#4hSEw ޲﷧c k1hcoA &VU՝o Zɺ=dbw?rd7\ B\Y/W5@,]i]~ ES 8x޾E.cX`}6Ny jLOꅌ >ۿc޿p5*Y`nppZO5zƘO=e~byپM+NyqWH([8-k Gw&8˝gNu7溎v#nm%H` 8te,%\wW߻pn{V~vyS_!<-ľzog\w&Tm5VS9._%-BYO!&b=ɾl|))c>81ߢCAްrUlj\Vseeim"DG5MP_eMx]\&K j*d4f4f4*VC;*l&PekOh3qILA?mެ= Sў´ zZE *!)zm+dVN!3{Xg0_e,b"f,b"f,",RtJ(^:QYIe%]tQV!YCd 5tHЍX5Lm\i)Rw 8=DOtCCh kp} qhXTd ݭ)tL`@@r V8Oǀp#\>'hO!hO!hO{9fWLavS.NѕXJ9C$$$$n)evK) 12PJr"3E ER;H 9H9uyspI rQ9h\N@.' arv3Q`n9# Td= ֳ`= ֳ`=(z8vO |J"4-W]䎑fydڴZ ]E9bc<%~55=[ h꿝nO֭uxxmbǃuku. |pG$$*4@IZE2R5șk0U>E_Tl+Ҏrq}$}!zz:FOoG]ZXvҧ²áꢏgU nc^.{0 x\\Ԙ%ɽCy(&b9xPآ8"|9Х+o9Nmep'!)b1pOZ)0 f[~?Dk=`'ښ}9ԧ?W/S?7yPrJ8݉s%ZUn`U*TM1ӇAe6W?C*ˠf. jorE}>tɼVRJ*e*[V:*tN)Xn]wCTL2W|rn+^B^B^B^B^B^ =v8p:!Ca G@NBw(t"t-b@"t-bk":EdQEdQEIEIEIEIEd3Ed3Ed3Ed0Et|'A+fSH@1.#ٗ eGYG]FҚ9H:#l9H#6ۨ8r'yDqIt'yDqjjjjIt'C|| *bvɨvtQQ٨fG[JO^і]QzBs* l)zQ-+|pHQ]q |=_ɱrLq ls.EyDnIY$#2_^-/Do8}kJ&'}.NzSa%YO2q1+E'r|O6qLgL>SdL>3(7&~9E{!񜨋*p*.ʣ_ nH:A{:jb0F?<禘/D:/ 6PUִΏXO>*M#,7[XYNVwobp1m^o7.N;rm~&yͽN^?,UGMCnpjy_ulWtM.0+=l1}+Ih1 <$@R1v3AtJ٧h8gg{vfdϠAc=z{= hg) R@W2+hjWԮRz 4+P1ZAⷂ}C+7}C+4I®$H B*$B*$%q,cc^pblD.K$ID.K$1-^LbZq$q$=r'ȩDL UU244444444P8qnL9('9('9('9('9('{.8w9؃6cEbqQ1M f*# JD7( RK@._ZcVfT!=BzT Qy(֊Q鄨tBT:!*±Uc p_LOB?mޢ=U@TlQ $10@I $10ā!Ii(ǒBxiYiYiYiYIII"}q\Nr9 -+$tESISISISISISISISISISISISI>I8I8I8I8ҵ  sd!<2FmPڨj |XM,0n3[7lE\T&ȼ¼B˜ Y&jvc^`q,n,n'~3]v OF}T p԰QAy+ӂ蹎FJeO.CB2X|L>{zzTHEeQGUTjTL}TmHT uQUQսN۾+zV:uJ.*^TDyeKK$`X3zcEUúH0%şUd%&F )]o҂w- e"̘ܳR9ͪbw )*^T(7˳2g<G%Ntpj;_7a rs;xA^_`NgsPf(q쩓_|-u9FNb2AWxX$:_j{ vkX^/˻(K1~tʼ׬aMNXWٽɞx0=1مr,e<,!q8lo[qD_BovЏz~>xdiBд=2b?4Roh1lsYJvK1OɲttT_'åTZ6w8W3"5/z7zo=ؾ[݋w;K88SgUb];lgx`aaa3άo:S ·Nu=ĝr<&@`,o%{?Gqu[;ܹ>mVs?t6:d:1Y/ zzgi#ӼL[m;M `'YKB/?-X>BO[w7Kкρ)>ʜfKm6kڍ6/ pR#įbJeTwp*\k3K n& A l"ˆEĈEĈEĈE(_Q!Nד;]Ot=N*3m߮0 ;t =anJ%y:Xơ|<ǘa;eH0TSbydydytMu`+֚G֚GZ(<\1q q| q| q| Q;G#jy<"u:cn1G#^as <FO1^%0^;+ 3 L 1PnvxDYwDLYЊee1l,g1Y)gEEE<,Ye%g/ KN/;DXLly1b事u&Mfv7`[턬Y{ =(_-sE涋Czw1l3vdbĒb-مҜ](*%%;jZ%}ZҟjI%ZOiI?%SZOiI?%SZrbh'?CY;}B 38;)i3vqzRI'W8qݸo@ҵ=t(3WTbCR:$;uHs*HJIJI~ KMMMM?٧ͩWͩ4vc$ x\[|>>>}v1!CGijhB}>{ikнާw i|:4FiG^f7DFLDmMc+njn rU+TΘ-,җMO$Y^)^ur&/R]ToSI~&Xf1[_)8]MwD}? zCa/MX]f? ] {%a!k]agG伥 w/ ]o{!-zm&W?T 7?_X,fUkuҪmIۯۛ{{fL+v-+֊_+w˫!mNv_qn2+gɿ OD ;Y^ ɝw;-t7iEAk8&KK_dgsީ6!ݕn"Swo{M"T]R%~n{7ý92il_ū\lb-f\e3> ńbRbbbbbbb1VTTTTTTUpU U% WD{K(!PJP^Bp*!8h׾%/a} B K@(Q%TLH#ɻ4\Mʻw5)j$n9߹YN]ҭ@ 3 T0P9I9)Бr)'a-UtVdjO'ȯ=I{$-L͞9rep3\-$ /2;%t,[=Dۓ'Cx=^Oz2ד! ӓ$=I@{$I ؓP Q$0RB4wL"O S6j*mԴW~kU??`?Ǚ6 ]st/;c"DJx\-p=~#7=(_,?3&A|*abFG03rL̊f0iZ AhM5afrf)er;f/_LLf5gCVn4lU}٨I+w=!xDTngŕ#tiJ6!q+ P`Πbw3؝P5n-ظUp fD mLLue`qW1w&sxw|%?K7 2H||Hsr94bChӴ).x@;h"X fDW1VwG+dUecVFҪ: :,33X]g{U+O}0$r*b\z 5=>o%-bYS~0zxP_6rzz_ͩS`o5+PFwSS*uW\G͗N{1O!OVO]E ezѾ3:o wd+Q^ʧw'DOxx)zG)8gX˭'#VM=k/auE AtD|,r#˵qU 89o;OŒr;u8e8A̐[k @\Q#{9Zr%>b[<-//"I^3j*[u^s&p-n-sZ^2fq,mo5.w)snas*4fqKN.&%qg,ʮ<$p͎(RTd{}]~Zf V3S?\%毲T-(0U6R5Yѐ>D8Vg"oE<#f1| t0)h T52oG@*2:bW9999}o6j[vqdfd8ȊqES)NxG*uUҴ)SsjqxN-ϩ@>To:G@iS9JRQ[InS$o*IT$yS1RO]=m6A9 JaPbl6A٠͇l78h}TjN0{fȳyjGS;S! Ћ&]XBA{SY,kd+gp -bntj(Rm1t[EvHّ7{*Qv ħ(>Nљb, 0"}x׼!yI )ytK~SE@fh>k^ak54fbIIpöq @LHN+7y 8s+ذXl);T|"g@a}{[b`d}uy63<=u6}~FeD)δL9N6"K~!V=o?mUJs.gBmZLa~SMPp[G"]ӳ~>`l7݅dWlzY:_g7si; wm.ta^%byc{^dOpZٿZ۬ u-̗qҭ1ɸ8c]ߣk qƨm65[oӍ,&ރu.KU&iN}}ƙk{=xbRǫ~k>Nú׸ 4~Yf[V7Juk&un6tov'3cr'\by6֫܏6w]XBUCS2y7jnwn%bOϧS]|>C>!o @/NBhCh_@h_Bh_Ah_ChL5ԦԦԦԦH~iBv3O?iv#9"6>"6>"6>??A~#~*gE>V> ^0O|S`>"l>"l>"l>!c~0>QƌzF'= D/*^o}Pu!Bzv=g_MxWVVVVVVVVVVVVgZ9Ctmo__ _ _ #D)0B}ua* ބ&k5'%kNJe}ǭWLWcUo_2??:}"T|V.k`% c*K,,e"Q&e"Q&e"Q&U*GyLN:eBQ&$eBQRI/PQGw;82C;:RB^FShQNП?LKU&Uej]UUe\UUeYU&UecU?VecU?Ve\Uiq8**x_tU_Ujj1Ъ*~utM_MZZЉD$_]_%C'jC]}/ .zz}S|)Щ>Ki | |iЗT}+|'mkJ+}W@0eށ_E_Ha˜,+BP_bhB= ~!zݐ d0 y(`Oh{B3 f'4D_Z6$oH!j)) ʭH[B"nE S 00Ʌ)L.Lara SR">D{FL?!Qǿ!6A&g3ESwqBl1STKkgOx#hxOczoS&576K_5.Zu5gj/wn E{+%-/J=O2_mVFv]KLE;y+o3YnGqG}J/jN;9:co8[e;yL?8do4W=B'6(+Զ{/SxnW-xo4嘆a@[xUOaҟpr׺7[G{uy_$3p-x. <1!;*Pw`{?;.*7,^_k4]c0&/*|C$gW+kOjsh)UfרY> TW.U[TmRnKS_2qqLnho~$!S&j\UKK_}StvXƻn$irN9Υ3EKx\EuyP'cr,o/"Q;X}Pyn7«!j>4uG+5yce00㰲!e}~4W&jV2kV0ԗ+d1U*L>/wJ7 *!bPWDTQD./k*cE'535235K3scfXcfFt1r.VVw=go>g}罬wu$+&q$w9倣--mrK ڻBp$s5.dq2hu5rqrqrq`q25[EwEwEwAɶR(c]JI%Ac}c':H;H;H;H;; ; ;a A)H% HaoK.AF| p<)mH%"k#ԫp,RB^X*Ið^,erFɍ c!>02+*DcAbBg?x< BB4&zF|sizz>1C6bPbtgȺn'tۑKB#kp*Gk Ci0TB6XͺmR]frkwW8{})ԖˠM?m~~~G,GKit%h={v7 )ym1d7HG]쇮e8n:Mp9h@_W/l|bdEl6Mby0>(kX$19-DΧkb.\T~m3(Jm:OO41 D3ʺ:hu ;)_7$0r˴^fpr]0i@Yq']exe[<{& mQۮ׊Z4ꋼyQlXM<9( #)9b@ A. TMRJ)9^%sz0L0.04L%  '%30>U{6*U3@Sr @$SsIC T+?҆`Y*`W^ %|%)+ds:eh{΃K# %/;9$PC (9[uB0[vCvF8fT2wK ,RUKCUT-hRQh:)v,hV!Z#4LBNHCXD(v%u]+EZ{Mp<[5eLe9;eX,3 r^f8gR ͥthzvJgwKSwC\! d4jlJ58mvwBݭpvҾ .k_]P ۴j=OGϩ/s|eieeux2KWGLZYw;'-d*)b(:Y|טk{̅0q(dUdmt&E.)(bgwoWu6M%꺶SZ]-1bųЛW=նlDe1_͛jiZኬY$ǝUOSohطq|V0rƌ2 j^Egφˆˆه eWTuББՇW> ^C\(\(\(\\\\\*XU '~T~THQ0K.~Q*P6 e~3=PH r<@*EAa9E#`?*Bh9~~c5m]rD᮳ ߉cQJ]km/ Ŀ-״v|btJ)8NPl[ePxZa^s_Νv[K2Z1s0ԩPwRl[/UoZ|UC.㓂w8;ҾU{f[V0wbY2qNmkjggϿ[l&]aݍcɴ4C;[69ٵBM/]U:V?zڊ ГW5qF}ƷF6 jDu &7iGGSY4H4?_{.V=4Jl;{ڻJ\/Ɗ8qǧ~="Ycp6U;Uu/T=UvDЏU6ɳ7S]=6q֗TLF07PXxٗ/wU Vk7{GbgLi(u6}џonulcMߴ\$q 8gX>+zלA68m{jz?wgϳ ^`=Cq 'Z z[  rC6[i "'C쓖դ/ξ|89ݐ52賰ȩ,TdKu(S00 00 P۴?K%Ւ K"L,בI"*6A&lL BKYiHJCVR(W9/ S0/ SP$ P ,ͮ' vO4-h K[6llHsa;ptבB)--C瑔fT8];`K(xacGyEdǤxQ.>8BxefXs#`B26悯 J!.$$@wt%h3$i[ %>cn y$sl0Oߘae } }(Gx1ol#Ң,ow#%xȳ&sbxKlޢE/t柰=doG/6f ][\o[c<,2SDWx-3 #6<{>"[J1K< 6B5fn6ZXY сҀOu{5-Npz־[qkkNlpbc @9̵':=M IOOO:j0 ^%poF1dCrgYPPP&i @T *J] |:ʽ ~ '>IwЦ! LC` SQXeu۳uHC8LgK2Fj q`7 Ǎ 'Ryǣnh) X۝wd?RvڂUHw|hܷT}BkзlC8>Gh>z3p_b3+pranƘ/e< ΒM4婮=9o})>?gYnƧO=>>-2#5]%zgWeʳ[]“H-CO07ٛ,|77'X+={1]XYT$Z%Y)Y"2'j.[Dx gA}Yhg}}fU&vvr֓?{1PduN1QXcO->NGg:ϱ˖3AZ Jx 0+0.pyUB60ѵ$nWl"?ow*m>L ꐭda T0gBCP xJ,K-D{OM |_ yT3K%dx2`udйpW42`iݻԻԻԻԻԻԻe& rúȅɟ ?Aii#$0aPkàֆٮVA5 j4v;1 DO) ٹo#l[(ضPmZB m D[maK--i[S 56V|bw)v(1{<$Ů3QNN-g-ZC?8'! dubSH![p =ACv^1ϳ,2,3Y#=jw'"b7p{4ALw9j-j,5|54|54|5t`ڣE ls 2T t:bbbAX:w5e=d.L 3f/D [+.Jgi+Hk1)R4TQQ9Ǐ*:[ {Y+b歰Zj (SĠ$[Lj&K9><`I UKQG ?1p Z)H   <Y *J$FZ;i{ [ M1,b0z0z0zzp:*ũX2e4PHvkZ!V;bpGL Q jPgK r c c P4XT+G:DBL=7\ Fzzzo@DElm@VH ԒEaԃ׃#Q z\=,zXrrQzd# D/G2a5OVϑ`ROm]:Űao*U KV1\B1 .+Y d1,b4z tU USƨQQIbiSF[2Hh ))%S4uʉ}=~j=BrCQHDj~6/p/[Q 8Fsp9҅q ?Qw }{SIqlruCHM֪W1HcUv$Ow}UP.eg!Hf[ ^v vvhhmԡvO,[+RSDBRfN CÝa$?*ܑgw*+QuDz YF;]ǠkήLJ;(Cݵ"2ΊbS=+zCG&)oZ޴5hjKEy'0)М\Oy*O 78wIk7tٍvseh<9Qaw#v`h`%Nq^>qV˖ԣrP9ӂ.9/ۧ8V]V]b ^]—pUEwZ`MU9/w}8 ]n*v` .6opЃע9q\ 9FFb3/\gmH0ΚnUhbg盃ڗ͚o^Ve2~Kdf#|V`%Ϝnb61M`Z},+6hjf73*q/9"OD<ÞcYKbn*^˷S_xvlLc~Zk/Aҿ߱N~T_$`V{ϩG2dn-}*k$T?T?T?T"©8; o*| @_+gٟlً=dD+mVko-D&z)R|r>ez.>NAJi0Vb[w"Ac;^cԛS^2[IIQ[ϴzCW,Ys1޼| :YiDZj?RWu[Ϛ7yX,JD$bD>;.vST;Oۏq8{!'ϗ {2p'%#SX_ C4<8tЉk08l<<<<q8q8"ʡe $ttdp'k=\ZOۗB@E!} 4Ts@5Ts@5W0Bp)˹EbiHy$jEb2E$&SDb2E$&SDb2E$ ӫ p|8`>p1"1<áááÕ[[A >ۀ=b !,gowgrKTy3ٟ~nG ;xSW^bIOG:Tq?K4'SM@G eguިCdU3չ~5F3Z~@d$:c /y( 4[k8*NK̫6G!.'ʵSWX@;o7؝:fkYg l91nFtyF}1|nF[IV |_Nrw/4+hg HK^}ҿw[=yŐ+}Wkb&8~%Ӌ,UiFoolllPz &Ո(P9]`|a 5\0F΄,j '.Bu.@WC!jt5] @WC!``޲(i2KxgQ;;;cǁ.33mKE匡1 5dŊf1}N{SMHHHHHHHH%*VHvBڟ챽c5{l^!M֟UKc[ }Sw׊8:4dS7{-ZYU:I-l&ZMQN?O6v6WL]Rw/jWb '}^&~wBLjՋĶP5GhbVN-Q;GDsXsQo~.kx*d ouЛڇGVˣ"oÐ,)%(b/HOQ?xzig*ѧ$=7>"=<GVT˺!%E;h%R )v ;Tml"l"l"l" Z dtQ)ئ `m )LJC(H[HԛC:UBI:$P()рv] sss4KMl[. lI BKjjjjihhhhhhM_hh$`l@CNxu1ޱG\ Gl8IoB|"ƙcdJ3PVL\]T{h+6z8:_l"l:zKFM%vŒ2Oav wk{IŞ_*Wl+~h\-_j.=haÙFǯ ^SC*_ _M$N0e/\xgYuzZIjvP۫۬lKQ-xV2k4oheJldx7|Ag7tjeRJ?2!Jj (^8'OՓļ*/KY=Ab|@pՏ>w:Xͱdm#>O<.FQ' F#At$p!? C~4 iJJ%R &P F$Ҽ¼B`7 KPFۅ.waK] rَ.d;`*`*`L !X&,<^ ~UJJ u%Hr2!3 3 3h_OÞÞ2[Dž!87 ]%ɻ(Q(x<EʉrDyEVoE+B_*)5GgC)effCefCdCdCdCdCdCdCdd[(:Q;2)>IyyyZK`tWl)wuf¼,1OâH|wl []W SD9~GI|[BθQ7Nڛ=dJo23o7hj̲At&W'v{ƅ/8n`VrhpTƟ=~#W5}*#A3=З~~Eo4,v @_Ӆb.&*XizOvZ[Iueu{:q`=㰾u.=miO8?sa8U WA#'Wy=yr>]p߅w8KS9~l0ٴ.\d]PKC}g]|eeإ̑ 34)1<1*1 @11 3s39 Fl}0ÃQur "h`DJ-faF`,8+VӟeyUQLESQdKyH϶;'lzN7X0(f2sbjql+ hKtgN^ʻP}c)[Į`+Z=I]Mk19^u[bVn-5ES},{2~!u\79fs(p;1V\Agٷ_qdT s-S;tJTsC5'\Iʻ w.`]DC"I$ ɤ'C^FrxrR  !I[7n mPuAWq¸va\@\Pp @]zӟ= 4EFQ@(%ᖏeDF刎r;Ft[IEIrDwF~=>/u:87л%  A|g$>Җm1}Fx,{JvYW=k^ 4~ V*njaUm˶>@+W QPUVkEږ-%9Z/A,A}o֤ڑ֜QwB'~ eF#H*B;v 0ʄDLtΤƾ%~h,RAL8fx7z]Ui9, $'Ku%ҫxȨԦI*vvTqSZZuZgXܾω]XK Z:8Q^;YUGu mK5kdan12D =|& &+ʬfqkx::cgl+{^c㷒="Do,ycv>@k#DMok`mx8CycKy*=z{yy혰#u|7^a:"8tLvH7]Gw'Hq 4DGCD4T`Q^^^^/INt'< 0awy*a= h4G^d2W$ĬfdA,c!A\c !1WI23A23A23A23A/3A/322d0A2|H~8fu 'w:?lz?}Dk4ѫTOET"蒖@}>r s2GQ3ȱp!JZNWc191]X`PA!} clC| yJ0C,0~Qn+R-m6hLOqEjy- (>hs@[ݎYQn{VTh>TLC M= *RqەӤ09O*8-gv|f*t<d_0v|n!^`Fmoo [ UY /n.??mE(75EGe4?4g&QDN|OvJZyce_,A}iy6vQc}zgz/y4ُM[hd4TcaDt=_OӣsrzZ^~_qlueVXÍ jwY󭙖nM"ku[ڿkf ""Kb@cE9 |?-bN33kuzu5u|Ҽ޼V 3ʔghjmg3Jo%8#iSæc hˉ!-]N*D#'qxa>qQ+G4\p\p\p\pkkexLa`Rf֕b88pp8) E#Ba t0A)X=8#1#B"X@piN&+&ttf v]c٫&ċk~~:a?yRH-$ ZOx7{ ==r֞>oxFݦ^Y BYsl33G3I6/;[J? 3_ x1NN\Do[t?H\&ʟ7:n{tYc񨞢o*hzTglAzHU߯GHK(ʝSHpfsH<;H2Jpm8{5S\bF]홟Ǟ#V|! ͵C?Mr~"HeW/IQ r9H ܑR\M"+( Q0|G>;m|!>}uҟ_jT4@%T=TJLpB8SI43%%kHkUgZ?bhЊm}?a?itS+H TR1#s0R1# ZbAT\K%$[*[*[*NF s3?s A9I:G?pAr`prXaKegv|Jƨ"EkEY,`ĩ$EX"%-"Xb,2A,iMp %e&$Z[RL `*dGFTB_je|(扷EWw=;fc} =fWmb[DRBW5yO ۋB1S,⡖O}O5~/s|Drh Num:Xۢ K&/`ZX[}Q6%vqgb#/?lk4{SUYXҲV,{_Kwzqʆ߳U+&3 O*|2o{{Mcvm3B-M;nPk)H5eIkhQ5~sF;ct|MqM兞#/OF}Qb  _{/91ΙCf^h.3w7hSC|Ogٟ$eD}ԧO_G-\脕[Vv[c#XYdÊ\VECPȴÞ4@dĤvJWe'@`G 0R!ZtV:,p&+{$X,R)d'2逌P M: #qiǭ ) }}}@̜$T9/Ur8 DhD˱LȊhлf@WhpERјKk<\ߒAED"hG4#!C!eh!2Z e$C&HHH|$> ?1111`ISnq+|w>8N{.8\nNI!XnTNhkϵJ^cD dd6<_S$y|l2?1OvE$D8MD~+y>it,M5zmc+I z[֝V"6k5aB Ƭ2?t _mV2}prO+igĭ#Ih;wᖭpg}r崤!UxW(o]1Һ^KyUddddd違^3-QQd@`.Q$Z& IV+b!ױ2b᠉= {*T,X_wiCbEjGl:pРpAJAJI!{(VaqOyJu+!F<ؿ<ɪ>6IOӾ5GcPB+mT-zU*VWwb^a^#;Nz0AHfERK2ԡ u(CJIHʉNg)UbPY *Ae]|(PCB %?77׼R|@kJ< XRtH8ԢR=íJ>*(%χ ͧtnS6J<*zijAyUE&Yg=*^eP1ԋz֢VZ dvY{5*{F~jUVC}2rX5kr?|Gyr%tnD#]aQ@(d`lWYC=v'ټkjjP]r, .UP=TP=TP=GN=vꑶSZzzR%ԒkRBJY θ.Z͵ kiZւMp-ԗ~B)kRvJ]^W)Qsgrt ©S0U)TRJ*E8TGP*A|򑅝,|da#ܹe4A|Ai>*+2 ;_ a}"(EP0Aa._ZnW)urVG1C~qXK8o$^L^T,Wj^IgPg,xe~h۴|ـwCVsO|RFo{AtjާQ}DL:owCeMyDz)g&+u9n~; OڷwnSn9r2 kA̮#8ptcȁ#w].'y_.z]u w9- N08%adx r<>!!4|Ce1t a0@AAQ (W¦V B͇h|C>!ɇCp!8|0|LaG*|( URi^G! &y@Gti L0b/z(l @_C*s/C ^qs܅Gcݶ!yW^}"#f C&'496^:۱ظ*mc|gz7w^hnG>!X_,A 6Z63HIlf1hSmA[GN٫ ֆ:i+ qdնCC7!x -7v|n8:~iżv2f,?m.:V3U-&;lD>们_Igj!۱Gv҇[d;;8Pݺ@[{}h,m~ݛ̾Ӹ[|93vwOMH\={{.^7jO߬2F2c\śOl>glqJUt.כl*h:^5&vq<ƊǏiGpxwNaSj)Yb)Tx%/>Q^禙MO7c^D ܪ/+}}_ a忚 V?z4z4=eπHC,^Jꍈ|s>qw b}b}b}biC(&jYP0##)fY,`0 fY`iY`iYH˂2ʂ2ʂfaDfaDfAeagAl%#<oZG9G9'CH'='=YYv,!(CB ;F" "ZvK0O? T;D_[m>_CCFu3EDf2iwxOo J˶eG'ܼyst'({aS։:.cM(Ҷᆬ@ "dIKBXE"a RU}#0c@ FaDTTDD!Mn?u&43μ7_wI鵺~gjmJYEEG7yx~cyTVwh>\l->-q.Q!dDA" ps$G2@Y.tns>0f?f?f?f?f0I_Q|E9 (1F9NQL90(1҈ #1^e<|T^Qy6)DSzkJtM/iiiiҷG# G߽DziSӠ"Ra*]AFE (E.@tIP&!&|'LQG2&|"I.A&L$'ىL/2׋ԛ%EWݸY7SԏpqK3zWgl\ y<#\~[Ӓ49^fKtNӶpz |},-Q߫e&t=c1ӘL:x3Ʉ{X މT^o`i_h2[H`55I0׻˵Uп׏B?m #Zk3K:OMy }. /]Dgh>$Nۯ߯,Ic3xKs{8]Ruz,;rpY߇l0buy 0AM4~ФexfOk@wʀ0t0t0t0:'Y闞p$c>U:șuooo^cCiB"cq*.Z#vv@Mq.i[Z$9SV0Շ>6o)CՇj:! !`f:FDDDDickD~#e$‰NPiK[D'bD 8,'B%B%B%B%ސt4DDD'&ޘH la&2+^[VÜ@*R./ohRI, (C C M `$\>LN *8YS$UAB ](pK?:n0{($P'k}t2!Dh$Ud 1)$2 ^$]IXMVA1--%2},%ۏ26aJw%e&D-5%lqIN#F @"F5>#rQ]x2K1>c̕xw2lf۩ OVO{TQ[-J{4v@^=TUVScL ?䯡c(^dq<{IDy'?;2ym3sX0ч/WCy9feqX_[1zxucz;=VĊz7$pި8Ve{㐱ƘA oWB~ٔNL;!^[oR+ mV5B/_Í4d6=Ͷ>b@.jZIxsz:g5`ڿr1jdg?;Wj{c}mg]&OVUd!CȻf5r{2FM5Gzi%!穑jTqIUTѼ47NS2ДӔ%rc,X}*uO z A׃У9?‘{NaBNVVVVJJJJJN qnXIqBIkB.d`,L9KkBY*FW1r`Q 3G1|]>^>^>^LTTTT7L*Br!\;A:!VA s+p+n+m+`l+pV ;ZE[ё:v0WfvBhf'fvw"Tå:!L4;>݉wv *z'蝠wvBN$W:A0IReZζ;р\& ]4"\2wyAؤ$ÂtX`r,09 >VXXcyup^ WiYC`:ݑ7Pt(pV>XkJA!+*D]y?3>RbNq0}v{zT?7{ֳs3Λ+uڻ\F8x>Aǝ̺VH1}jV={ywQ.Z{|BZ#XO$c~Z 5׀yJOl4e; [Zo~ih*֏\cηZX qxNV/3꧴)MזhhA9B]3_ū⠨.i}SʷxO=p^x78a^@7AK,)dCYeTz^Oꡲ.%}u!iR)^#yVxVxVo[HB*{KVw8-1B';'8( L S@TpTpTp< 6-ROG/G/G/G/7 kq(,#CW E_Jg88,O^ODbƈ'lC7j6Fmc6lZD.ă#E-IoiIfQe8٭*V$jqjmkz%eh.VxggWԹZ~Ta Ox/̶Tb$t’Nhael]?dk{ZGcuZ-.#jc^JJG,ugY$MyL4kY!!%3_O هft'y/Eh[]E]9f~f dR7ӏHxYk%VeĂYo/ƊU;WUn<]ysE=+?Xq凎9pX.:+ʫec cU/(oTeWܯZ0$nxE#R=k |NQՠie^b2yNf Sf5zR ۰iOhpì!ؗs!5+`ewTk'۝~X=6qqMC"f؎>>ރm5nnXM[nVwŜ`L&5ت&SJ-dO멝fCX}%&Xh\1:}~eIfv~b%Ί8q#cڊK|;\ކG -/f8}&Nb#/AejjjVS[S0`XMה0託h-@HD_U.5OiNd1YAL}Pi* >‹OXJM+vl`vvvvvv_+[ c-Z ւ$SOyJ?e'~T)SޤOyJ?m*@T*ߡK%Sy>*}S[@HOihkozDrx&?P~ 2c+dV⭐[l<,k<4xh8C HNb;H &L4th$܌'#hx2Ɉ& B4m$)iy^-|I//hRET/r Ah93̄3ZLګ *W`_"0~fYofA,h6̢#7TxRZ\Q}4]EڄfU\M7U0ȇ`"sCts-)3,-*SZ~4-O+hyJ9I˓>TҲR9NJ-+c<Ӳ\9JKi94d):\>|hoФeQuc*k2 +@2L,_賒+h,-gL"}r$ Pi"&:"'`2J@yJ@G%00-mPPPR (PPD%s `\hK1Xχaz> aT|ʟT|39B#aZ>CK9 0=azg`!~[,{ppHt\T5Zow_wSS_Wõda P?Oh'cqFg;}>QoӶjuk,b߲H39s=~_DxJyqE\]1ھd_t &iPyۅ$߲?ե7w${ݴ$:z}'LWO18e[.p^Cx%+*Î|-"?1LHiԒ{V2Irbk㆐1mqW[hM2v:zfh99999Z pHr)¶38C ч@B6arpoHސ|2:vR.hҖQr] ]AsxK_.D/>4?,rk\4uΘQweUwW '*{cZ d m*[[D Q VTE֭{ ^4ċ8xCqиLж.~o;Ϟria]ԭj@ko{,`ruz+ =Z6,m-C^O04.-#| ?1KO0!DȻ#ǒw&gMgtdgˎik\ѫS]+hK }VIkl:,k]b-4Vxޚ/$8NMOȴ& 7c&O=fM[q[3"Jl"A$KA.iϊn87Ntqjut{,#ŨgJu 3b[t.yی3U#f X}6Fk}WK @bDXt˜7)t$ۡ2bN:Sĭ ĢtBt̰-}}EJ8KrBΦM;o(WˍF4؝FCʌFBvEflf̾/}_ B{%4K@H:)FЯRjh R5K[C/m 5t֐!ZC.,h Y5F)//2OF892v"xxh9CsGϊw2LƃǃO㉽D{KNc1i8-i|SUA&VM X4*hbUĪYUAPEi1tCV"PͿ V*X `5ՠ>{i)Ӊ4"KFd)ifi< T&/RYTyRq*/+({ @[f*KW,UPY>iWZJ|5*IFKia |XX2_yCy[yRޤ.Zi|̇Ue>)aOK|<^>~V8 g%{osG%5["mZU":K#bb3Md,~/GnfҪfK$b跟} u[o7u8-AXn4Y+֕I|$OOb*[8$>ߊycrI9igI;?Y>~!v3\ObCd zV_Ϥأ7 Q˹,_o9TxGNO񃼖#5ⰸ,X3bh6:YY 71ٮ:f]v}_]ڽ.v[g״/Yg :d}NL=KZcvlo߰wUkF/b;ΦsԱX[US+8FHĊ+X]ҎyQUUUUu <%YPB u)-C2eH ɔ{TC,C|2,C2X!`YFL$ 'Z]aH]aH!CyH ҇=נӿc/Bc x @>•ce'=}^:j^rvH'ZS-E}%p 8뼂lp ~Չ O8QT5囊{)֢ۢ\篮g\܊g|ۜkoǵw8׎ 'I!xXu~Ldǂ;q7ϲ9ߛ8[:ҳyDSp]>X;쾿#yy;tB>V40"n.iu\c4/٢X$ͅi1CjԮ5ޡy3GyF;<;3ryC=k]TCkKt+ϳJqF6]]zmX/8yk./8}T[&M_/w{D>˟@̭CS d\ ^xo. g;m6ma |īx]Z.;l{aK-|K%= VNk1V9]|K,F:l1Ȉw4i}Q~<\Lds$q]f;kՙ6˟&>oE rk++ǺZo[Wv{q.8ZAۛWiV姖И =:~y\ޏl[]]jYmbN擹oi#Vz Z5gaնYZ-e߆PYDk5U]i'OV7yJ$ҕ6]u7zÆ m8HKBX ;LȭL-GlK|3`gAeBeBeBe73,)2K?\\ Z5 k@׀<y\ԀF7&hjai4Ŧ,6 `iV+J`3riMLslb'MOFۧM>4 iL#"Yv0ɳqI+I -[[ml-gI!:êN)/JM@F ) ~R R R R R \pRpR[J%ͥ_)R'& ŸZj!<ĒrBwO)*|֤BpBX /qޗu\HK0)^5kG/CT*[[[/0>d#ð< kð<Uw~湤omg4]"XBM<2t}xPX*IYS*墽yȬKc,[Xv{{=^aon N۷ivZg=GO T:d39&6%b(.Z$[α n4sh{#YIf3ce;ked.n*WW^կOTh]H #gƬ>IH1c&tLgΪ|yG6,iY!dIChkq/OGv`ȃ!i_)Ab5j Z^]]]]] ? d0ڋr}}s#m32C98""BKFZ#5h*rA8| r,lm†K2?~ͅ  g4_\(1x(didkD&[32d$ EP2N433JߗO"i9oZ/l' G{tuHQnt5]JfÑR_FP䈡<"]ϗ=Xׯy.6c"e]骋X{[E|.klPwsZoY1xj6b&5w!|du,ɻf3^fOYHykv(5,g\?я;eVULxQ ? Z#ϰa5OF@ub-+#B׾bϱ6Zm((6 SY=\kUhzZiz܊[wع̰؏OO7q}־bd_a'qK YZw+RYQY3bߘgl1X dc0B FtC(q=ywޑ&<βl{-f  1l U_Y['N:3=ao%\]G( {ll;|B*;:rEe t $^v=ɶlfo}m[߲vYoX/C_+ bͬXBڿfE#"J(%fNNFn4R8~1s;9hC^P&ڐ̝6 BGv{u;/}j糗 3?|ҳ 䥤#KS/Hy14ň=^L:BbDd,:bЋaYטtטl-fn1vٰ[̆b6a l UO@:zOL2-mrmr?|0 ` U'7  '@O4}l#_& }ٰdS]Kr1bŐ!C/_ Rk1$bHŐ\!Cr-Z ɵk1$bH.vbd2|5~DLDKuK8hͤ9ZG#z:AR |lܰ#Γt-Lg^ vus_w缷="]S_Uh65.fhhYD;sF ]fx1ůT1BL 9.}| s$X{քhs^}v@+}]}Yޟ<=+]k=g<=;Ezc;2n!qYqZw5]9H#u]}ɌtM7Tyq^{Hlb-Z@fdlFG)Hb&֤f)Ba pO7S-%اS2B <`S <@ềw((((((( ͂@JqC ڞblRH)t(~x]hwzɊb`1U71}ĴS[>c b_UޏX8#._\#,3}xTƚ"Dʷ9| ʛX fyr7!γن:F6aNi*Jj[#"r-bSkQkyN -bBԧHx@H/d:bK西ʈW/g({`<֙¾# ܊AN$(NjDɯ&"Bq<_ak!֝TOƝsxBeJ^YXrue?Q9~˪Ll\]ώ>>xw+**++Nq$h~>6 v%Nl<'tR9u=b:U:F9#J)`::ι:. K{+.T B3H ΠF s"#{A&zA&Z]&/ e"uu7yGtJˤv/d@@@e`s}*}*}*gbzezbzbz\z\TH@ @2 Wy-_xovtE~/זk1׿ӆhmFۧ35966\s=4B,: Qk|wcݸqν,x5@{C. M946>5huK)"`̛$]$&#{JxL+,NpD$wMNv~ >}{"Z:XO7_.}i[XjM>!N@˻bx["!sU4~߻o<[yVK?5${겇J۟3J­?UA6f[.g;B}RԿjYb]-B}n0猆+|㜘#2qUGc>c~fXZV)_Xvc?e6lmOoڧ}zzҚlXVt^ ?W o7b3xZ|*M\b~d*V= 9ښkd[v#;lߞ-~~E4ceZta^X+#Q4 f4;Mh2:Mfl9ZU3d, q 䠟$I~'L=W}`C@O#> B~ g%$ap}'AN\HF%A n`;ڑ$hT2d&AL%3 Jf$(IP2d&AL%3 Jf$(IP,L&AL2e2 dIRFpnF75x Z ~g8tM;nqC2I"]*b0/ī0pДa= = &04[9yev0EH]W"8.C"8.C"8.ua C]P&01ԅ.L uab B]fG3Efv{pvi ns?MQKGf,csb!͖~ZkqwϹuuEO;(p͐[. |Z <) p\ϸ#Xg|8~^X<#9rww9)w /Q:rW1{鲷zb*'SS2}M7-)JK[u Io| 'w}.rq<3%\!H@nL&іR'j m5ZknBkI7$8cpbsds͕R= oIʩQ;#e7g?Dהa2ݗeJ{|97 #̾8s\Q]l>e>A 3hfI{V$ \xη$w7-"RYV-]qb+#̧fVw+$[.V &:]0q6\ߠMu+}7KOMޢ/w+ıV,3rf߳ٯ:ľcI7mcl.q,bE8@e'xh&ZWD##w$oȏg bY>:r>YuWdecf8UOgN^ʂ+ЬqwR =&Otٹ7>A]BZ.T@BEԣFўrXq!zBgBx 3  p xjE뒯[ \ @™p&$ gB<y6l8ȳqg ƁC>}I҆%"g_ 0Cs 0t JG IIIIm/ )*gNM%>h% k:iw2 < {Jiy<`Z0-LKo|[>-l,p|H[!5wG $gB ywWyw#ۼn6% gWނ]C̣zggg;[[kR\Ѻi>^j\ɥ7i봕m6/jZ tuW2<D{JVhj{՞j=zx{+:J-UϨu۴$/iY&~FC5s*߰3- emYkƝk]}+_ ~6O}uFscf6j#5`%Å6'Qܵqڹ3O;S~6ѧ]يߩ iSܵrιvUZ©9CB h7_ϟ??QDc{o{i7ETfhd%{@Dh:6 M`mx$VoVb0AQ;5sxbHߙ,?Xk`4\H17#'7R4_:NHS)OH{{8"3p*P3?)'U?)BJ!OwoIv~x~3w/ r7z5\(Q3*¢ .DJ4D'ƠƠ(XЯ;w@":v@@m IK6Rk]=td>&y$F݂/p.$u[ dHBHBHB62xn!P ;T9HH61*x*vW)=\<%F&39r8V'ܔֳ1l g7!týTRsD%1g0Ak@8( ZO6l$Ϥ3dhPQQ1`tĄZQ.L4:hd1N#3%&„G"srmZ5UjR+b̈qc*wx.w4Q[|4Exvgb4zXh2~0PD=>$̈剼=»W.cI&{zbîD{M}վ5=02`&' $RrYԋvx0ڿGv}=՞bO'!:^ , LZn Dj{kz,QVN~܀LL6v*\+!< ucE9іXqfNZ54j2rQ7 %shIDڅ9r.?)da $l`H2p# H/w' o24dd{&&&W)>> LH!# Y)E%rrrt,`M& vn``5ͨtn-[: ::::ÖЧ? u0N6FD"5Ea} o"~7gjӲ666[mS\8P.0.Z:ψ5F:D`}4[\3/Ѝ9 Ncmi%œó-v9ϔV5 Ug[њ\g2 ((r8xF5 r`[SwiGsGb}PI u#C[$mH@qjʷ\Il^oU(*DƘӲ.Q+2V` o.[.[벵 m )3uwJn8?NwRsyyY)!>POswy #uwB?%%bKxc {1ƆA6{hou=fb{js"mZ?'-sQnDΰeXYuP,5c? "*kI?}xNi?fw^iuٗ7rLggw̿VѷH']`u%~|1e=#Ky F-SU-*yV~|±zWWZq#1'f8z"dC˝'lrN:QxwO$|E:qZ)劏+WT"cM>XcQǔ%]UgV{) w *7ì g?bo\QkW+W){$]vk;>c^VX{ylwYflM:[_淢DdEHylVИ:|˼])mnsD;w ٺ!\q$,O *la-ISzP/ +X;rرÎvَv,lcaL'a^rXcz!7wODGG$OPMrh -7,IVB4x,$XY#Ȃ >, #ȂT͂\˂T͂T͂T͂T[[[ȢkF#~%l %8CKp $H2)[`RiH! 4'NO`/ll8Q .'{IKy[{|ȷ|ȷ=t8<PzqMP C1&bx 2%ԀB# ҙ/ Xj%%'RJ)QO1-ҞSޙbx4X #i_1N:bLuP1A1:(TŘX@OU6Rl2UyTLx0UySeNČS11TL8OTS1TLu0SLTS7Rv6,oLI2p/)B7o yߔ>}e-(=]Zwݴܭ 69B&WH it}MZjdi`iiFӠ[lni66663 :ft4iu] cA0 atv k+iX7e3ϫKsEE9sۧ%``2TWT4 ݰùn(WҰ^;r q:`V5BLMi׮Dj`q`&ꢯ.94]U]eyC~]8A;u\w0uQ\?U%aHɺu"4_f"vw(hw9{::u2}ăKMcI p/~W<TQ?~t rexuUQ:Ym~/mU>Q[i{_^Em 9 32 $@s@3PU@DDDaq**pQQ]tBsw7ԗ9CZ{׮]vE_ҳIIn`xXa?k ͨoԗIFWe\#Mcy˟ycD8&.*fjTyAN^R1A Ds=?DU1.e9#sWv1ҫ(^UM(*P8Up@(k0) }. Q4DYeM*K*KAi 'J%zK!o2 j6PJ2Mh?R'Y4RK$BK$BK$"#:Y4u9::::dՇ(QV>D!|?!CG]N2`0 /3e$gG2c Ae"'Ce|t!^PνXtq.DXD5k=n,elS:fҷ'];,t&Wjj7Lͤq.S:w*;K#ԏC_*"QHCAÃraXt-˯]ä77`> -8Y{QEi Ig\Es[qܹ{qǽIŒ|܋;bsNwR&{rq .9-vߓ%En&I7tY\sp>J7b߻E{t&]KvكxdaWzU9ȤJk\P\ DXFN ׆u 6:N}k%bm syٌjXZ +ںLk{Oċy&dJM,%$K{"Ib%ɞ.k_~w2ye6{=L{S᷒}iek/Y7YN3\'w0*9!/Z+RwcXJooO]m5ӌzlg:3̺7J⻕|p#n-[n9YE˥ٻb4I*UBO΅I'[ `t0A:X!1H` Dk X-m=Y%#. JM%æaijjjjAhO6/mZkX$66ucmQem Fm'ߡ #0^x"2QW4Y:iIJFKߡ;JHуjCfhI[0?4LKHKT` lP)m?d#H{{;8̷q6t\Vywp;qU8] tQ'=sN\bPAC Vj,ĝxO-zvqr=u5(T_h藳-,GJ,{d***!Yɩ iIuTw+ú,CgeD>+***dR6PeTXq*8V mmm~ohTI$[dOFP287 K&c|#%o(OZ}2Y{jfȊZagdBd)Ga`ɰ\===AL;a%-qP5r>#>YDA XO_`Z_TG%~rrU{ѡqa²}nLtD*z<uemoW-̹2]]T m73ڱQraw9d3ϛ?b#rޙnv0'|,ʟc 8Cv*H+/Azes/j>ol*2\?Ϋ+l5IUԓ]d LmzoTvBO#F}5ͮNb=ܻ?A]mym֒|_.{v~>w ]O+j+۪n2͓bX.&iQMPIޙ64ͥ&Vz;;XgnYE?d}o5,Nl[~+zgV658zSߡ&u[|?{w/[Ʃ.N*8u)"tfBU =!{GRU􁪐Оq{,w^59`H%h"k#k_F8ʮn5 +HODq"Msڶf%MD`S"G5F^[c5F^[g!ȜԚmMAj/D`J"0D")HDT"Dx UdnI4O'ͥ^I/Mǘh:D1&Ё:(yQ:r]dN^Obba@kIHf*cr6`8)ܙqBdP`>sB7R֤pQM̋)WvS5jBoԔuh+-2~i+ǀ1:pΆct61+1+1+1_+cK(r8Əz3da:G\|O(7"sUq7"V@̈Q_GzÍ'.&I7"U'F[!\B@w܈cNwiDD'Gk'syQ3^u#NW]l2 srd.G?!2KL Ud9N% SJ<̍cZIA nDqVپv^l#ʙ|6[9Nz{@y?<`6=ݣ6z1G*j&ff;3Qۭ[yn9.8Hm4.si+NRKiϲRy+i+.܌#g,,%ʓԖ(;1ca3i{ԞRL9c3vvbNى;;Ew."x :{N<.uON')?Jd]9(8+LOօwTj0OH\Q5ʟRl !9sPWV ^ UvJ\ \K)*\\届*b5rЕ5&W` ڏTH ڏTC'YI=IųDΘ|T"`V3;HșO`&e?p `G*HKT`1#aqUq*Zk6kBgmn0oa@gE:ߤj+"kXdcpJVvSǩ'Fo^ ]#T;Yt=09E!"q]})]nz~MGll>h54ϙߙ?BcP۫neUM~o:mZ檆t2k%XyfxX,KDFZEVo ǽ?{ojRadoX{E)]0lG1\ Y8_soym1-4.|w2?eoΣ4O硯!'4^He u*GZmen0 C^0j|aaN^LpUܛnN7,r2z z z { /]f߫ U@GHJ[Ye(TP/FD$k !94كC1#`(f ŌXPߡ2q 2 q p 4h1pc@yԆRԁ&MPJD(:Puwujnv[׃ʩ=`}9Cɵ*ףuO,PA}:lP5 ꠦA4uHAH%E(· tW"PB"Y;#~:;J!̥ m&m61$PDŽ2%6u6}@`Nx'{;x\M/TW{ԳjZL#cX}n#R If1JQ!vSj_ۅ_7vl5~CFQk["Bl$:mf_ZuMWV }z?[_1m˸` `l3m2OՁg}ͼ[F6$U4-˺k[FmmZ8A&qhVvvvvv!R SJA.m riS=`ޠgVCTC 2|-gD->R&&2kj}İ0`X0, FGNn{RV1?U}Wh/8<0Ɇ P- #°RGu# ortftftZtZtZtZt.@.@.@.@.@.@.@.@ kH@S0[fU5즍nҜnՌqr:VwtM'vmMwMr7avsn<^xBmB9y2b!"#r"yC%q<5dT)@Caq sVr $c^2Q ">D4|hy#5&(ϖ#1b>#x<"xE/"{*mJEXI<~$.T#nkb@YKQp)ƸJ<ڏ\k:bVHEe.",2Ɵ>!`2 7`t ͉(w@ G 묹B2'b,& z7ܠcqK8NJ`:QN2qjT^$2]-v]<\Վu``sk-lJ{6fk__yE'ZSYkOlj8m6HN;I3,VZ״Z_ZM{o?/?_S}^?`živZijM&Ypkg$ !E1O A>',5aOC*em{}ތAٓo8|}?zk.@sujKge֞[|?ˏiWnƘff3@1fhu5ޚh=hhƃ+'&k1*^xZ9)=+ dy0vص=`sCzn1pƽ=`|ۣQAfG%OuXqpxlnrfAH*ԺA/XolnVΩ[T˭}憎_wa5.1"FD_zxd5̻~dpvi=O׷jQht&iG}W|/yuVI_AcnVɿ} ٚ0eGXsaղ[-45djf3_#]"I> 6fYQ֖]t]__xqFkc~|SjPR  /kG_jAu7tڧZOonf4>+:*1!+?Ŝ"Ӿw ՋmhWX%ރXV\m"R ̽9"]m#+JZTd[5Ssœ`3뛗ĻEo kUdv]"3֓&k5Ҭtoƚ9xEwN|Z[ B_kEQcއ\?SGWn=zlμddyfĤg2rthSik|6lkbسԻ" @R[}W? 4 _K}}ƻu>[_ځ< ͛s)viɛs x7rs۰ Pk2G b'Y~\1bb e}e}'sͺ_ʙ1wa5ӻ0Q^H!g,_DBti"RU˺Oק_UKK鵮κOwo]*7+'.jMHoKzX +V.]OyjS+@Z Bv!)\ېtrnR*F*F*F*F*V Q Q QL^A|7x;AЁ;wRGňHe Il܏P֣~#Uz=e/@~Y"_E ,#Pm?By^ N}Mp.67sv|7Q~5Qj~itB\,rr~/r~/1~ n|p iw}X;O_)~6ˣšh:ڝ0<1a6d1O*r/rx9k fQT8]!pn/vk kmU!rדNʑ޶jlv){}>n,kۇ#CmTj3B{k)/3od貖7(78N^ռ yy_gSǷv4۔ZB^y] ;fp;]ւ?q llr&&L*GԽbR*WJJ\)w+J=CۘhFyh kquG'TZzwG {_W*EghAۈ N0چ)U~ʯSUާwhWW m(zj۴}[9ES[}K9I[YeuTx{:+YkuzYj'T>vRIgKKwNH#Ԏ('Qޤv>sEgj_]uNJ[9EoQ;[e%R_(sz5T9Ԡ!o)_S;|C߿@t5. |M(/~7_ W} (-Wuﱻ[{um=.8핤}0MUvp#'Z[\gKBr1Ykv Ons'qe {, !bBv8Fuh% Ge=W9gp6:gs}Џo{^D1b$[fA}FqRl#a8Ypl1$q}||m6LL0ExO m-}i|3_ᱢɳb`YO$?зƾĊc=Y ȶٴ$__呢= tfHo(kWtk|%7x3{bәȽ~nڛH81]:hX$&{Z֓8xUGd ZA 0hFGcT !2P[!rC[!A[!25[!;S(33Z \7(8'dvPpPpPpPpaBL2000000B&K0 0C}fKe ab CcÐ(傥sҹ\ڟ PЛЛЛЛЛP2UNIۙn $nHK4i )ٙe}NJZR5@kBDfTPPɥ^[f gL^N&^ޘyЛ$+k!\/K LV&4l&4l&4l&}j:ҶZXSIO9 Rh@2/˜^r=χ|1#0UHE!`1Uwio8+<2 O`oyy$-9r6q9Fw %g_V.rnY%B)]U&>>r]ɽWsOqsW Ϝ+Ioys}K+ߜ_Y<5zW/zu_E#saH#+ H'l@Jv-,2|W59+ܮ/}nyӡk =+GzrE<%*_W@ߖOm$ʛBֿDtЏcW:װ=ڥ j+/]PPLYαm;ύ>cJѧxT+CB]ͮf!hcs_x878K=VƉ56)0CLs*J N¾ot]ɸ) :ǛM.-I5ѹ:Ϭo7N.3P%jr][kl68 RBl7:&t+LhnI|اZViUQXMs;n=^'Vph2ukpױ9R9@yw;@ z7;Ս"bT^$>VXM7 z}}۝> rtS*;']N\So7']u4*[X]+{}-:އ}v<\KxUymྡྷ튄 d5Θs~Euތ0cJ䝝[8̨ouRֶ>bgF{k? 㵆n1^0Ci (i5Z=֠#"HU$(٦ef+>L|7yw^.MjUkA].'c|+| Z^-QO &oWkj/{kx8qWYa-v[Yv#ݕ*;Goz-S>k=mieY/3DgQM kKWv]1 tv'j3?ͩTGf1N uuxjz1rUzv6YS{ j[J:tK;_W"M[qwܣNz]Xtbq_u,FdΣ(c%%,QwPwPwPw(TC[!`]`BBct> a|F06000000ŒIU/e)Uo%Ch}??N?N?N?[)O!*r*r*r*r*C٧"g`*r^ !!rCdP&P+TO'}$I!C$AS'AS'AS'AS'AS'QZ{ԧ~LOXb4֪P+s9P6T !|]RKAKH[TTu_̐1!ƀssƀysO!"7>hTM>՞ޕFkco+Z Ր+Z ՜\j '@UY&I--ɴѱ:“O#<:"#rH:*0\H1: 7RpMIfxT34*ևBg,pfe:P(y_@nT->c6qqukJ5C(x5Z\Iq!V|(~|ugpu_y|8Py;̔FNҭVkUnfeQ1|uǛ8Tkgy3sGBVUW'_?᪥TGh/h z1 ?UȏS%'lNHՔf%Sx/~Mdl1ܨh֏50#>uOb3`67a0*~[œ%*yN嬈-bw J򂎱K,>G71OG nG~ι՟Vwn`?w|/ji`AxC()YɈ$C'ßjo# J\k \k \kI{:^[Kx5-#]]8-8-8-Z @Zxd|cŀ{j@ZNASuǃ}%Nm*{KߚmEXC?'˜gQSW'iadm,>[)"6{?Kv}Za <b V:BuSw`Ͻ|g}9ZG1ayW>kuъYE΢H+g^o^|/l1TWF>㺧{Cs;7\rJ\ BT\!m欓%a,؍zTQsBEͅ 蓡@"=i/C!Djêk}J d d d d -[RRXQSSڥ#0#0#,,"/yM횱x|I :td7nБݠ ɀ:%tNv2qà   $nӷzd<bݐ qnwCў3F<6hhhhhhhhhc#zMɨYJr.n2"Ɉ'# ͚|2"ɤdLӱW\*4_]h|uuAv]D"}UJ+.ՅKjTF*aF?Pzk Pg7J֯0-4b,}g7?0XU%fO~ʅbQ%9U|şe3Y՗i|M}󼕼ss䔶4"U-u6Iol52"=BDG1Oʅ&6BfW+ YR)Y[_N!Vv%lDj` MKԞTtyYkvWsԙf]G?3t-J-W ~zX|+#ge_r-W{UraDQFn[4>3OmIj)tڧ^nM[M_]-j>h^gYD>+;u`kY7<*ֈ+byc5Z&6jZgH4W0OF:ύi-Fƚe5c\i #bB]+2FvNך/Q;*&MCs#J[?P;m{Fˬ͔a/W==1I@;Je9,XҒk'k5Ȳe&my2%Qxxp<70Cj>X}zB 5(H- '3!zb&DOx=1'bo,4l 8\%Q#P#!qqqqqq9pp9!nD[8!{K@ux: @<$bV-- ܖHho 6X Vhm[$HuI+2q7# DHf"Zr "'E#9BWWtU44#ѼR +;&W&W1g%Ws2};^?+-*ks~QoS|Zp ^Tz{έ-VWu>chƘ—>,^5a,a-*r; [<}bchz}}6X>Ԁ]xuL7UIs:|wʹwзhE+`m z18g$Gg"K >yљtw\Bh 5̗芯81|?y7JCQ68>սM}= t3ju-AYۯ7~4$}Cwe.8%~UH3ϙ ˴ {vk5ח[s<+0>:n.7y@M͆ԼB)b+f%jJw% 뵭h{̜LLW7_{4#WNb|1se3?b}Y[A#H0m֒{ g_>8O?PAt^QP⩥% _uolC 3 ]E!X:̨j:&sLc2{$KvXJP@@GMfge;a>͇>R)O!LBooo&D11~ ?h;=c+Aބy؛0{t Pha2c"E,gfܹGQv?U0= 30=욬paz$4lj 3HAY3HO\7%c @jC$KF\/$q; J5jcӱXt,X[bo"6 ։STV2P,(Kjm8bB9߃Q'QBjc3%;`t0b:1NKL+sENG5t+WᯤIG9;fo ~a^::۠0nC92 ji3JCQtU)#91 0ޑ9     F "T X! ) t'9Q1=\ٮUvRL[Y/JP/JPߢ-JPߢ-JPߢ56JPc56JPc56JS y*z+z+z+Z*40~<]5 $7{P\&BqVX!cEК%XT Վ ,u`,ؽ;Pwʒa"!Vp⡙s_&n ,ڊĹ oy}5γ[YhhlW}Z1W;;{^:-0oܻsjBq[չīZ-KS]{yR/l$nTƔtc=f^o~'V"V|Ͽ{{_pSI t0_ù V5)$XE$ ޳̥s3ªnճbҽĥ;*YgXdZ3.-cxܬ_O}JI&t;(vv}N&;.1֌7O_h!~7HHG{''B>GߧХjkbɾc .+ow$J@`l !gaCذʃI m{*͹W]uL7,De+I+I+I+88dsmCǒCG*M̵}.~KGJ3Hf*Gs+ B  o7%C?ݡ;93RzkKf(Yt1tENWꁮ3ƕ+jRRyENkRxy ~dGߌB}fs'ȍsޕEunͧ_g ֱ$Yq^T"w+ l2n]E+\lqIJWiE|+Έgqg_,&im"Ԝ<0m_῔I&$K}qXiIu:Gj媓eU&''ԟfJ(Z6tbG$sT!4 }9r0`s>ҀRYPH OGI92c$.w ov5YJM"I!] ;%S&+L:BzE Hg䃍FH 7%SF‰ '2.YHJlehAq.YK?LpL&8&2ҙLfvpq&řg" $4 T6Ӓ!UGȮ:Bv՝P!CyoSOޚޚp !CvOvOIuO$YMj8TX*ޖHkA[ۉccF@2!XbE +̠Ki i iMlӚ,Y'dStM")HI!旁RK")z vMA/ARKQOByqay8,]㰼krq?!cqnr?8eep8c#f#wsHDFDI9qWtsעayܿ EPx\bQhI '(14ϛ?V$mi۰EA)ޣ6\ u濠1AnJ&'WD#͍%3"tbd+5jN{} dt jژ& PBS`)pSl`Yp*nZ;:Z̹X8Z#z?M2M$&ro0S̳y`cSy._ov`oe׹-{L,]5cQlT2U cvsSe-\nS3/EzScQ's,{%Y0b8F2*-b>Qs [n'u});Nnp__ߠ6V/7 f\1lN_AR+$AxQDQ߭cvoMV6bF-3I '2Eocys1IBT!a-$nWꄲ׫zDKգtnX.}XWVkG#H3k#Fj]mcjT&i<\ϋ8Sf%uU۪Ca1rY[ۭw_*v]݈,{}7djdG{tc[m{o\d}Sfvc:B][['C>hۭk5nљ~E79IX>{Q7j35X}6MfE ~]d1 TX'?jlK[M3$ۋs|%f%l d֐55mZSm{߻- -F<Ɩ8D(vKr8n)$DARAAˊeEDq[PQ| wE bk "+o!~o!2ko["aN8!"p/]_$H15##{mhbC!C -\X ra1u~{Io?NG8BH/10Ȼ#Ȼ#wGGGGG^"HY Y,%fƉ3 30NAArX2ݚ df`D`D`D`D@( e, e>jQEˆu?YdYEd!E?7YiCJ}mxFp~2dɀɛ ) loF[Lny t5RLg@CAl8rd{' 8!p 2:ȀK.zg\JW: bn$reȪBV`<zR@@@jiҔҔ');mw)j])'iZOy~0zu8e?8ԍC8ԍC8jqʋ┗)/SSQSӏmhT NRV*p9,aG+q_q+m0nE110%͎*i+i+i+ioi f|gp&7r4ہd9Lvu6Zn5Zzx?>'uC"z3fUϊ/kO 1sMٞėhIyX-#{H<,&"R:u`cBQS |Fƛ_yI]4Z\.2( X^&&]/g8o<ڋnnuΠҟNyz|=JǎDޛTNV=wϾƾ7byo ZZ哋N7Z6,DPs.p< L uPԁBYLrhn@ p5 =_YYXxO-d8 ׇ? ?k0#A@A*ArD#<H$|Fsͅ NsAJtOP 8 Fh]`va59PP]! a!͡MZ(D<"6#JOḒB,"T ~zVpppz`xr<8΍#*HTѼ|yU924׼(VN5~oϰl6FIRNx}1jUs^1^^-F-臵4:]"uUATUqxON6Kl '' ŃbC,GNUm>8f`&b6#;j-ƺǵs|xWrz߮VD!~+-lGjnٟ?F1&-sFkкx^a5[;묓V=VqޗZ4>|r/=S`Ioi{o{`5̃nz{;Pk:Ġ@@@͉ABD :PT5/hJ*@"6!V/SΒh"Tf&AMN#5~Os4iPcӠƦNHDCD""!ԃf~( RiO~O/'/R~HRF"q\֪բCu%jTUC ^GH&5 CukV*EV'̓zQzHJȀYe*dUHI *#29G":V Jo  )3[a="w"wv*~` IH_ѕhQCC*!Zb*uFյta Àa^^p-c OwO ll*'<}I8܌ &[{(6t`&g77nnCxiKipw΃yf`N#*ӽWk5?22݈'vI{ւ#!nOeJjfx8[h?۩'~"H@:v1KGetAdچ,`xZ|*.fOsYH;Ll&/]VU\ 5ȡxElm%QTY۝4d!$,$BA [ $$rZDA 0NDTĨ """"v%==?{{޳s9KWK>LS/8Ô\<{3nퟝž/6no%/]¸b\S1TWhI E9բfN9eNI=0]0]0]# (5+NGG(㡤XWh8`TC}jrByGy(jʃ&ӳlD65b01$5D$t֘E'\%J#xE&j 5ͿWK||B=Ҩ5ƘGn,cXo{~O];bqxA|CNo)r|KC~桛Gtsy7ѿ\{Y?aD;YQH3R#KD[`G`Y@[ZípktdH D>_>1oѲ1W6o8ud};U5#o:rOzQ/ЗtK:BM!G -jV@R5ap=·Ӟ|ڧϫ6QhIM*aZ(8gC,Jݨ e"(tR[%E-IRՂU1p86^+ ~JCBBC ww+9iYU:ؗtLinhM>>>hezMxt<} 裲O9, ar\̷5]= QMNPf7kKZпKF16gMY(o* Lc*/4{ؽd=YsրkGuBA1Uߣ z6zyy!=zyz5_J\+՟ÍY2c RmʫJ$S0,"ې#TQg9`}ORu0ݹT Lo0֎IwtT7Hw.=jC+YTT)2i _&/— ˤd`&b8v. C. C. C.:! ɅaȅBdsI,s8Z+M [o&7gB VbP uuuuDj&r 82]C})xS|?#T-~suT>%-'׈ԇ4Kw۬)+Ê^;Hw/wX hY9BɅa@轛rcAkě(}o|H~#URnDt(L ^W̷Z1USOfj;|z=Fvu~oO~xY>Ձ>|(͇>{9x:u5ٻ5em|˶=Y~bO>=YmMWMی/bsy`FtYUބISI+%'?}i򬑖fOVI|z&+x [ZZK;dkjf5./A|]n귝rXIZrގf c]X kDF;xw'}kwP3B@|*#P9SGs> ti>ʏg>Jm#5P (F!,6 aQDHD2x$*#Q2,#]~rb.rwU2T8QiTeNקJ[֢e尿Urab9,FUiFq:ZmӶm\h[zeh[rD}ۋ*T >P1x9"(%.zTQ|?w-?9gܵ6N翏kP݅}CAYJlN{t.ؠ3Kޟl{B+N<.K7xߑk@$^oprOʘα&ˉ䧺MM/ _M)A񴿧h,>O<=ndD k~ꊝϵ#cYHiƖ KFXn:bo[C_]ēb/?w{1F;sh%S2sw?@6 f,x9犯.#fa%[VgG3Ns~D_iEOa/z>Y{ܿw;{!68ZXHX:!K]vȏX=8B=}>Y}Tb֦aa.p3ۘFpԮH^uEڪ+N 7Ū*ՓN< 4X4S2 Li(gJC9SʙRKiH.!J>eeE{+ [as9~H.)DDt/GC?O5*YpjP`{0$TiBUDd` ` H'm6L@0IڟdlҰ %Hp#cZDԣs bF8mJCJ#[U2Ą5[V!7-39U> _%G;JжL 4ci~c5b<5'Z5ZWmw;{hFKVX>xyq˾,_9M'vj 4Utָו`_W&!t,qE1R%1$]';9e;'s,\A1f`<##aIPB6 iM3l!dKqo:` ))jBm> >h^@; mhlhlhlh: GᰡᰡᰡᰡᰡᰡᰡᰡgcȆÆÆÆ*)+ siza8g3~0?D&D(Gm۬f:k:Xt t?QMM+?@vn:u:pt:< qwGP[YLXLXLXLXLXLXLXU˙ߞ m[lXlXlXPW/eUaUɢfîSi4-4mDtdتBiGMӷwރb|1n<V^Eײnƚ'Y*m:tOfŦ5([SZ([6\8RoߧcfIIpn_>WFZͬVս~k/Se_b+BIkb٫tL \VO7ߎ ԶkYjq񭡙/0}vE|7o$!{}+M'zqo|͡n?w_?a){;g۞5NL/.fOww/oO?Oծ6kMj=bL01m`Yxќ1}*ֺ_ d=gXˬٖfXpX"s~_>(ȟd7VC$'-f.O%|(ٜp9gDH=}Qߠ[zk}D+6-z=5彝Kw`ڇsw `CUvqǏs>fBl;9Ѽ-] Y.WhF%K&98HHD\q!wPEb^T8Of %>63)&tK Lp@,Ӝ"Q)dUJW)ħDQ"E@%Q0@ [@jS?Em6rsSiA%۲;"U t iu"w' G>ooo eY@,p䭈LUr.]"^)՘"^i52]ՈVN S[[[[[[[[N, )X,X,ءjggggdM [U ErE2\{rK.J7sm,^.s\`z.0=== Q,oBkB,D\qB5gaga{eRV.eUNM)):%6dllllWT̫HHHHIF$-Ԥ4aV`7rw̆@W};Vi[ӤY Cv1B-&6;g`.FV09֚O~_[AqYVȓbh)oO1Kp}гg,+(aW32hK9_ڶY⠰IIX ɗ >NKgJoJzQ!K׶B" 5.:c0JBv*MMn V >5!'Ur_4B+W= (SVl= d^UZz `zBA` s%RA%YdYϨ\KJCV&ٗm!F?BGk(TldxXaq^42[˖J1w\G%x€F&+;6gOMO1bU'{co_?|`!Njߺ"ܺaW3Fia vavP.Aa U%ZYKh@_DԂmQk^#ߜ49vJS@% 0 :s_ Z_; ::J8fПύGuKPLew},'q&x!+G ^o< 귇<x?~}Do+?R^CZk.y[^JmStU#x:+fx mvO==Wq aS*˯4ָp=o#ԤKiY!ZVh/P:afuyMaћ¢7-o [^&X{Xeee,ceUD1Rh"aDNW4 4 TT8"<#C8qp 0bRoe2|dɈ*4iNuOucKuOWNC/ 4=! VB9xXkVaAE'*:XYIUHl\BJ|/bv2 JOwyqcQd|/[Oi#yQ9[wjstbn!>asl;{ͭ~obY<'NvJyat o_7ޜ̚ X+qrY6Gk5ź/KnQ,>!ˆRͻL?:)mݷqD)[o@vh8b*lZ.몛VvgmE`=ЬZov(!UmQ&@;b}LLu:CynfW8 BGi4Mo47 FC~!E:$:ND'_w-F aD4ViI@m;C;C;C;waВ%3Z215dk4*yV c!ԞG.\fʫ+nl&x[lOGBib2VkoY_1}H"~SZ᫈$|Ofb3aXK>?l(h~k2E1x~-GK՚iM8-VSejRVoG 'օb\d/_)y^3Hbwy\"~( 519[0ls]b[mtf#2+n8"$SPѥQ e˧r3#a/GT''-FD5:\E< V< r6}rWLI"8Y"`|>?|<0i|@p%\ISם>>>>AݨzQC(xm3ofČj[CŒ6fҷﯖodJT {rexBF4b IǞaK-l*dKdf(3;e}7bBϖe=_:~])KZ>*ϋ~<9ZKm¿Ϸ~{ݷw֗jCz:;z11n3f$n6瘷BH1</6,yh*ay\[V\-o;O<-nMwq|fփʃbt-?e5Қi-j_c5sqƒ73{bOfwbT/W%$ FXw("[D9 |n"N]l]mqBal tXаX D,"c")G5Cގjr.,WBP>[F55U!IoEVsnE>n>(j&yP*3 O@ޔi(j:fMo5<+P 5_UdE(1Ze9xY,^/%$WYԬjV5+@MV ptR]aOVMb/BE)AK$52Iڙ w@̙̙̙֘MQqK.U-߉|ԝt}yȷka?a?|DaG!|D%G,mj;/F[%*ơm<*ݮPD& 6d"ڐŘ5PQ 5 iE[aR+BjYH0 >0v>`W]Usܮe]v-͍uܮ]vĬ@7f1+ЍYnv͍Ynrcf3ܘv ~.xܳ$xN(l@QWonD3[c\% 0Tꟺn;b8Ak}q ZAPdNjG;ޏBEBh<7hxE^W95+~5׬uŏڌ!1S+jg;5PK|heY:7(߬A| Ooo1 V+y c(saܰInx nx uC >m{کmmQx[=kk[dҶtK<](v-d-o  H[.4M4r|J(K8GbH;<`Z*>\t1~B8}7٢7Y'Bp|AFHR zΉ$g->FDRNW>f2a2^H?  3j'ƪ1<ؓHTO*,b"|`|` Jb@ ``]jTy[tEޢ+w=xݬz_p}s+^'o(}" g3jfFq3#*#*#'# ڨ21ȑȈ6In! %C&# +c^ORU`r=;ЖaE˯T[lQb&N"͢YP LP5툳+[0`***}vZ[4RU?C"D@D`}!Y@(GH(y#VUMr)<0T9sTtBfGEI"X"X"X"tBdi#RcX{5bQ#5 [[L/:VKN|~VW`lkU5R~)hg4@@B/Saw{ {>^R7l<>>b|Q|8ޛ߼4 -omm㝘R7k͝NVKR.-3w̑" mvPK5.}~D7ZF?P Q:씹ͼ,7wݳ&}>JѳtH[U+ޮZ6̟oвdGݷP㏲TLq(Jog{Q܃}z?~XtO?" l2†ȄjUbdHAp+3Y Y-"71 71 71]53NfdY$@-`'Jt4Pj8Sa8Rwg/$0! !sC HpA->lX%R"}\Njoz>.ӞӞ2d]2dސKs(9jl% )V`nPhֹHBpο9wY8s_ڿ#A]Wғw9rr+U&tU+Or\tb_uh=VO|SyyO;u Ż B(eT` B1qw^Ywq.Ʊޏ1K2^,gsgyŔD+*۴:o댣c"Lڑ s$Ɖ"KD>nr_b:ic"-q-_ utdNgh%yd0ҼV&:vuT,p՝<]{˿TGy޼γ;ϼR,"9S/\N" e%Q)6H+u?Ft| *:N vg ˻ۗ1^b,6Nuߛ^7һӳQg';vV -Eg8i|lVg?Xo=~#3GId ]#m^#GJrQZz=;qce)ZW@@RumZk?Z ;he5 :=.pWÁ?;:L#Z`}`!Oikk'{l5^7|#X-rTgtsf46+5A+JFY2CmT VJUNj뒢ɐV*}!|R ݊Fy['g7 *Qi}c ]cToC 0]B)4AA@ZSЂ'$HL{qg̫PR U ZSg3XU֟Ahֻ6! MmoZQ`SbBX+-yh4ϵ+.E(gZN"8 lj6Ͷ ~@q-CӰeh Wa*LN\ɉ0-q&$BtB2]uf ]BrBDY** f@k& f/Fk5+k|JPF#>1L83΄#8L8g3̈́sٕ6.lh͆6.l8h~j6Hφ4lG͆{4Zr3t g.8CwRkѕНA~5˫j0E``cQ ~V vW WKkjjjjjjE8(})G"~|QboD9S-%'H@{"/*ȑ!Up E 1LQEרet<Ӵiy,p cp>~ k߭,.6AL$CD&1C<v4T#Ε*p\Ḍq]}V|r{嫕Wʏ*U`Z1TPTB D(SKQ`؆ QU$ kp#>!YTw0101n̯ %Q8sWʇ;|kƯ)uFW@v aibOz^ Ps_W"v-["jCtl;hO 3h`!$lXqorTR[i4׿ӱi4wͫ{1n%+.WA(bD)cY\#KT,9ֽ߬΁Ko _FwZiY QR1Oc=MDI߇eϗdgv]VИmve,8&Xt7ց>d'87h:pe-|>XXc:̟g8 b;EװEƄȰz!5?9,`!,`!, t ;A\k8p @n;}:PO@:ptl, S˼+kʆ*Tt8}pŧMMMMM* nPuCY_ u=[7ܺ!r"G_:zɥR::)\:z藍1ՌKGvj:t8pWzyȩ!j|y `Hf`8F=|<:rnùٛ5=~ߥje_ѕ/$KD]"*LD]"p$}&yqXen0g#eUX` G%pX1ko+(.ҁ-n w uN\qPEGdK'\9Us}I8nUl]TsmU+m0 F+ #ySp쩎X :w^4|q S1öt6z#d|. "0 {^Χ|$MuְB?<[6Z<+;[Y]_t~`OGrUDʉ+-_YBNƒShW˷|.ͻM.!:+@T=(vr]n'n VuJ t  d $CgvY [KC9FٍtkƄ>Y׶-.Rp=*ZsZңB֎MMMMwqLGKGKGKG`y: ؜M&ka)MgZHab,6AСxSt@Iѳ2Pa(Quf3DY$"QUHطHR~+U Hr]9[68uSnv{oQuYhogL51=۽w>n?,bE RgIl\9N.O7~yL'|_ңEڲ*sjֳ}=!vժ~kG ڿOWz#d6gtew?y{講șN|M> '\ ƛD7q& {#\)ײH)cE-)2ҪvZɁ}S\:GN_ L \D>vXO[[눩a(,0ص302h8aZ7X9rN,+uM3ro#%gힳB:oooBsz;#۰ Z+*dz.Z4߉ lYYdlwڨq*WUn2,dXɰtaTٵdUShThw{W[d͆Ǜ f_KVViZjiJ儁_kB+˦k1kZ;~-_ ? ,,'ID 'Sn&7//IʤeR/)jytbP.JCRW}[)ϩޏ.wXYh@)i|8x$ױy=󭉭[c}G:Yĺlȼ¬4}zҫ_;a(ς> >_16H \NkFjZ6yڼ`X؍-lKXc6q̑3\2H1#]LɞY\҄aV<<9Owww7wf5>5 øW8a}_}y̾/8a.^,T#pkfjrֆa uN΍= 6z1OOOLLLLIIII.騽 g8hd@G@ ʡTѴ?np4hG8cQUzh{bl4]4]4]4폦kTTq > m7}{:"oir"J< "H,YϜcVx͆mȍT>R:w윊6Aoc4'O)]{D-w(ʷZl[ KiJy䮔IOVFd*3h'>xiJ(jO8\moowwA6e#I&_[ўپ3Z6?3)_x#C.J|On^́ҝg*308c[ e|U"l(ѫuFGsهN|9'E{G+zusU[<3FX}^YUȹOѹDp#VoEYP-B+~i&$(})(})(})(})mmmm7=ɸab\yz||"& &. &. &. &. &. &. &. &. &. &. &. &N!2rJ^,T4iiZ-S|M5dP5H".D1zA8r=pztv#p3g͜ 4Fj6}Ov }@!@4hT;l!`R!ERZG,rT? EAAʁ`zEHWٕ[Lt(C::::#!2hWܺ 8S [ك `g5%WҧgcgcaңZ1'hL[#d1ȸXi#%8倚倚倚倚倚倚倚倚倚倚倚市C^p @?;zf/BͶ:#/%FXuTZR7QQWE[ji]YD /ܯ8y}Wq_#u5QvMx]čLQHD6Uơz5>|zwڿM]}z3emeLl[00i~gJEQ. *jEwo;<<{^6pu.`NQGB%u})!#>觮}o"_|Χc, 4{苴7O^&xx2<*6:6 mv/Q|}~Ao32۰+(+ٷ?şW"߱ mG]ROl?σh' A$E%&쬹01fh~ef#|:<"?JG G2/xscܧOb_mn<]YK ,DK5b?% ^2_W  oWtPB7zsk:wοs{ (7bn0.n+xCkG!ҟ9E=TPwu*PPvwWU:A-|=\8N>W8I ]! RB*슰*w*F@Xzyڿ;3I[KVxwW-l0Uag[~p^9?3]?{3 ̾΢h 8O{>3/{#tdcV|DY|=%Ir$Ox+ʲr^[NS$LTx/chB{=z,)B-^0Lv=dNփ^7a3zn\+oȝiJGSG\2-#VF?ɷs̅ G<&/Ί}Bz3chV5YqX01 [[쮿4 .ΊWBU`.!].54A?7A2C[EK溫>pMuw}W6:[ ;CⓀoIA"pzfϽ!*_늳Zjn|˹⮢iF{m!b].'!QLdZu'N8; ͡}\FD06Ni[\CmQh QHEXi[[۲f[N?kO}*_K̯ecX$ { ?UaiaFF_lg0qbdU;>g_oh5`Os4иեhGZԩuINƭNqj]_iݥ]B}#~1:$Coz~6AEq)d=WУҽ.к.к.к.з.з.7}'=+mO'n /NX׍~JNjJF@Gа*WA #t2:i`H1-Z!ZwSZ٢&Α}o̾i%GɅr<$pG=:C6{d|Z|7#2*o^byo+n+Ŧd7[;xO$a{}m#-KNsjY}kֶeu]iң;yЇ2<}(oͻ{4+gkZCzYyЩК9!{R=B2aΎJhֿkbziJ30d0ɩYϲҬf2^UM$s1PԄoMij[K'3i~kv`C;"&_r1w*"ϚCͧn_*=6mViWq NW U"̊O=+}Jh}ݽ<;;/aG>4y.mzQ%,u:o K @19< W2"45pW՚nN$ȶEDJ[ `C^UKg> U&n N W+Gw>uхQH[kI/TZP@b_骢ЛЃ&>(D2Ɉ<$#搌x -ؖlK~nYG*vʻ e3h$S$ڠ j c5/R9O!m,)əF2}=3gBAe/R)xnS0]WuR+Ga(~4QH7E3 ՝QBugLFdW)¼*)P vUriB *_V5UX9 MPY*TUAU *\yO >u`-!}l_Poor'y[` F8a|FVSW3u7YOL76''[o%%YO'>FfY/stYQ"]/?'F-v? Ek=sc{7ӻCSϰT^Lس#|{t}₸4Z|%pS 'pzYZE-X+}vqOYln I-'SPVU>O8'0p,X»WN_hI{-f}@6-߮&b`ڡԩA;Q5VahQ5;     2e8qB^7= ݨ JÁGu0@nbW @)n` @!Q<$,$^U>|`Y>0j{QTuZV e\@PE( ( ( (&AAAA{TT @$&0i;uT;B@@@@t=R+ricT5?0_Y ! Nnz-*:6U2)zJ#Ku"lDΉa;'vNOu*VCwX VHhkJڢF-umkK6YdU:3d3LɘU]Q%hiɮ9%n-]ї8u&yB9` 'կ7V=dz,#_07f^'<*+֕ϭ/o_<״kT9ya,e3ulGQhjOjӴZRKZvVFߢw%o.k5X':JfW`¯>~׋DyG};&i/> |>!C T@@Rଵzze1k5* 9R6{_E݄$,fcDH bd [ KB[UDqĈ % BPD"FPA"" +zQQqGz34*^{RO:LϤy9u43xg#Z.~#G3iѶ{yZ?d`!K"w"DR )Huޕ."1h.˲iMg!׉ao%B&»Lw}29.ՏF$HWJ[sl5gv\X03,aO 4a iMCX ¶kM$7!1tic;W _uBXb&˞J+uO xO c\օ;]qWkɗ!T;_ߨg1NMySވf'ٻ,"4ޒu^WkVרlUjzqc#N!ͯ(:ZcbIpՒl.VAMV Mx ՛Ry/X_ye6wufxSG;et7fǵ2-J{F H| }-|@}VӦihE zqF(L+zU~sBFN53|< d-!aGAR)6dm.$rfu:ZmfG>5b,;~A{KX6VeΩ"q`b{`[-kE[5D$|颓MTx{qtu/wXiR325f? "]ծ'r .?|glѥ=w/Y}@P_o? B֛5kv3[hV9wsRmZ%n~ɓ~B7Dԗ^[<|5$/5[_B%EnE,MbK͔j |5_MUXgC`I_/d\(8t+Rda e>#j>K FMFu&i`Vt&>5CYH2_04O\p0JFƜ6-W2dTRʐ"U2zXD6a# fH06htaӍVH9"{Gdiѵg( LI3P0i &̀f̓fCy$H"I ("L @e@eZ2hjMmQ-,,Ԗ~fK&I;:T*J+7݉< U*HRK IRI~i%~=%>xD$$b%!+ XIn$_L"D $ cPɏ2MQi7Iyg yl<6QH1Y*k#oY& EnB驛@j p5x[ ViwtyEK%c`zaG*끺s]Gz]𺪩E(eyp GypA GQp _jE+>?{ifNxاG:YMwjV?)z~qhoE9v˯{BUiG| >t^y&ys.l3k *~?!P{^Wy/R汑{ۼߜVF~DRӶR{w܁^VB+#ԋڏbqݩݾ -[\`3Z+V?luPO_OPF׿b[ dk`T,} g[? g;R*/N֍m7 3|[L:ƻ]*)6&fwy> Q }56_af WX|#Cm?H#x,]G~`i5FfHRumosg'&LpbD{Ot/ MwmL!L{d/lJd"!ȿoy'N[T>>-r b[@aE i| %C`Ӑ}5?4_aGY?w]yP;d}^$.n1癪9L5;G#L}ϳ/Y^׷:@vkVCX#"}-V%/|c 2Dyx?%f3<Y$yh^jFsHcoo;Kpp-Z_5f{~VNV3ɢbsXq}"x˯!2B.>'9yMsxݬ &:oqNTz~& j'ͭkZG}bTQfi&L#l)us ϴhƵ66sdtOt9)]3]bJg~)Cz&ddddvYau3 Ln7Ӏi4 F/#ȑ!e>e>e>e>e>,|XGhH:y4A~ 'ౕ+VHh"e6#1Ld;1Χ3r LFeAF ,hoc_>/ؗڀܿ})CCB20}Ψ2fȜGo \G L;S3y-`7@*l7l5y:j,qS`g׻׻%1'(Qu<{oqX`Xhis_kRm"mF{[Q@~Eyif#߈2jmN6<>Uӯ3t3fLk-#-p1W]@#MO׊lROM `nwqhLﴕ]6smr"%,J IXXXm,6B FD7f`m l``[mPSn ,16bJ9=xGUS~LA-}{"8HHHH-hbe#pNs\{ K ; laXâ}ðhdad\H# fG̎0a)++4)lRc\B* ɜ= = = =F]L_L* JIB$@$$T `!"22L蒥Q'2B҃Ҍ˂3.PvSyp ΃+'Js1p°yHCR@GpG fffcc`]WЖоg@f@f@=S?RgU΂/ _,Y0 W|JL,YH/̪_xyCs>x\iǣUю-i` yy yy>m¨0klt&S,E[vWyyDO9L`=ƿ9x1A^j+Octw{cqU>TRudAZH8b$fcS:v]Sɯ~>N%!;`nv6GݟY }OQ^rzcOY^71EP3qJD~9xy7'{^[Dg'O_1bN,˳Y<"nDh+;:^Jm/Fut]7o`kĞ'~+G8EKM=Fim-Uՙ}K;=a\ץ".?>(d<`Ral9,23ͮf'/;gVˍFc&#zٔ~IY`ξ`-%|4ȧy4l[ b(=E4Vn1|=:e>k>jk.A}[EbHf2W։ eJFlqxLgM*`𭱞6[/9~< 1᝼&Yyy6rHI%3vp}%  n 5#Q:ɝ$w";];,?}!˄ /]&̶L.092!LZ&Mq|Q:&s9'^/ ^4ެɡ{Ԧtwꍌk/E3vyc `3jhF[?א,j;}{W6ǘaNgϯvҎi+unD>se UxX"ަϷ: tSo93>l*}fN 3~:iWV{zyNwfi뜪)r!HC)@pdx2;%F F F F νf^1/{IILطݍߎ/]C/\C/ GC!R&Iiؑ$$I03| !nXA{7W!MnwyvCILBvvR&a'eJ&ad5$d &!k0R:IpL'UVt*SA荠zo{C}S|>|>|>|@7IkjC~5Z\;'L;1rł:_fȑ9Ŧ8,6a)MqXlbSr7>C $8B|YLF&N tXtthЦ9i'[TR *1mz4NL F?Ƿk_|foV20Ki r}lTO}q/U+ifs|{bw{']\ݤݠ23F7GR~_([Qʔl}WvE_ۙ[OYXYWY.`}'i1biOES!gWG݇{Vzxk^S.Ng6GtpL˜z)s񵏰)R/ziM_gHPgHPgȠ Ƞ HyP3} ׻G~vh>"h%Xi0P4pPR l 1W빂@Rc@c@c@c@c@c@W@W@W@W@W@W@K@K@K@K`Li6ċVH9SW鷵2Pk\\D KHhHl=;;;;;;;;)|L6+0 :mS'w&w[oݧ>U(B_B㲯[뺝6S>^\MМ g8}={<]ծRQhcޟپG|5o-YV߮77&FeƘԧ梛5!59j64GڥNuNʡ9z❾wM8@q`biht`sw|rWkFVcʊ-F"eNmuh{Ct dze|g$3G>Q.Ka`oH)A(Nvpc;O z6. "S-IJ-'Mt_/xT^:TI:TI:TI:TI:̸ttk0aCCCCCCCCCCCCUcJe! DWfdic}"G6ޗĖC>P+U|\ƭ+[j}MWj[ڣd3!v&jhN0&~4l5sn~.:/x:mc2X ri4Oz+ՖڍڧX}g2^귑F-Vu>W=jzΦ-1#{5RTpi^i.1W Kb@$Y2oi rfZrMtUnML2{CMd[CW z{}[ȔZ_ff9q=*֊V!R֊bx\}"أRSՉ^->xR,,E /mNvž3ӵeVW::`O08}Z1o'r`c.rf/׫zvtl t@]^esHpٌ>=(_B^L {!2lù ^0*)) 4E.P &](6HH]ơoL֩ztʌ"nNV+\EFky}.n>#4} ,M+%`EpE`<#sק#fxo ܂qҾyZ?4!4!'9W,,来nm.Y~]T??ƨ-s;19..D^w9k7L)߽g==7gIRNj*22 ۙU tY[#&ko>5#ZPuvX{`gُ=xW`!o9?AnO&KSV5R2j a2:yy>\axv8esiy>n$T;mP)P)P)P)P&2. uqb|?$s*HJ`J{Uh?A>DLDV"$$޿%J= 3844 D( D|_W+ HG$# |D>"a4Ghq 8 @HQBJ_)]X)sJ?hUz)ԋ}[JsJy vgg \: x)V x%v{q/8ǿY)i}6b^` gQcVӋ1b4f ljb8.vV=C-^x'6pGul<Yc&A}vRk&Ys>=h!:n"=Ժ*Oϣ%J`٬+ʫ(}NZq*KdȵN39G}=ݩǝ,4ǜ7s,>$q!5/u?ɝYw/]]J-k?h:=xhkSdo5wm; e_ţzfk7G?r-!釙DL-Ӯ*w2I^xp&MU $aCcj4|=AYr?fmz8-tvσ.CWCn dsJq_ .%3[Nҝ®bX%=Y??љ=4Wu6$%Vl8}8-m:Dx㼳<-=݋ݥn7k\ۢ%Ui}qȸЮո`s͇|'$YyqׄIS;m7ݖ[Bw띍'@\X^/56 򧻘{1J$pCSG/X=p\\qd{}\-ͷߛ;sql\|Zo~f^b mGT-$YSءYͭxC ĵʪafVoeYX6A69NMqҞ*_b|Ȼ:LޥMFx$i$*AL*y"Wl8YN`< xv#;5{@{mڪxT2\M_$2hA6@VW5k ikHY(+Br< HۯA#JM{Wh _-iʶzGs#X*t؀fhX1z]&k*4 Cb D#?+Ea;0+5{DCGůQ,ȿc BMb_1E*_uAL22ϻlaG+ܙ|_D{N774" BKէijW B4zﴪj;z{cqh`Zo7Յ-6<6-cg |VU@Vʟ9-WρN7)NujOΘ"])R.iW[n sn:JnU ޤ(#)!Ő`4k{(8*Q$`R Q(3IG܆]w%^*(((((((:(lB|HKc.\8psN)&.4@L & IĤ\@YIF (APR^ kER] e1yCW9yCЬ Ύ : JXn\l%ؐp \Pr|.Yr\dr|\=-υ[ <re\d}2ݭ;r2l<~r R U&k ӿSmé6m2T8(_o:YVڅMϼӽ]_xvzjBmgOwf_*Փj:sFFw#!F{~7)Z);-D$f pU*1U3fGN<7 /D5**e*k ^^v[VSW g?ֿY^?A??>ȿ[b You8JtMQΎ@Ơ^N۞"}0E:fMj3ӿSmV@mtAL Ld:RWکd}g~gN3rBm 3a(Y|S~.E?cکTLg`i&HW=eB+‘쉲939#0<erm8AsE[96^ʸZe.=|?J}_hɡFާ󗫝|}o+>T|Vd0&@.D)<{Z7zΊXbqp\4#تߡ&~~Zd2vf9l3Dh2-ԦkOd?ok[̀)P(j{sN7|ϛ{+z=ۗ{˻޳=}x5 ̖̝|-XL"{\-8+ bJTz 7&kIH>$ce:+Ɉ%#bLYrR;ң 8LBA҆n;»#[Q), tw͚\km Dj , 5F&M-MH.OtA| 2N;#%;Y#HM Nl4t)rP/%-Z>Z>Z>t4z}]gVkRrUjzZbH?`H}틁/b_ 3@ B X`X`X`T`U(J%ʁrʴ*od5{Dh#݋fo5l Cjҝ:1is9h~ml40m:UM~xNZk/GV:OqVB6Ut[*fU~GVt?sEhs8¶6#@}Z_ҧSCm^LwX57 s*FvqХH!??K$ KtyO! rFNdZדM?yfz]M'G;#Gm+Zl9IK>}b5Ϻl~fb[1ftjFku\w;BESP[MOpQWh|ͽQŵv\m)q⾌077;;LqbSU<ݒWo|:P-f1ECP[i.3皥(e32.7 cц[F9yE$B\7z(5ZtKX?mӖk&]sT9H+t(É???N $E\t슂G2z``lnp?F<`(, GW$$0 hD4"HE$"u-^$H8Np"8Kg#F 810p a0paI[b0-{ཀ l+XwL@Ns#I"ΡL$KD(?[:#.sHO'|" =Nt' KHD"L TC(j_Z@X-CjQԏZU{rdq(ُcQ:U>'tX)GxD|Hrw:]y)xHy*xP9@tne (_yo+OKG\[E\[E[A<[/a/dTH؋THK*7P۫TP۫Hm2^&j{*7fY &r3RޤtG?{GM.:RޠN:T^:P^kv:nW^+t|Ey/+My/)/bdd ` 4f/i:V~J'UY l-k2XZ ւA8DA8h8h5*a(WW ::_fW̮:,nՑ7̹uw0\P*ud=Eg:2ePfc :u٭2j[0UYNP6]P>B9AmV(_P[TQ_+_+K:~IgWʷV(Q[|O (O)'z# t|ڏF?6 :J &`RHm,&j˕-{<W6q3]N+5 wV,4K'ڰ2 Rb;icUzmf ~޼<߼c$W }YL^6y4's6kȯ~bY$9։c1 ~mD^NVgFm&/7z!=f'p1SG{? Y,3lyӕcOJ~;Iޜw *IWPS]țv)R JY1dvx8nȿe㻏?>+}Lq"z/( WڀV /vB}`ᢎNs5@^ dPg;?-M'w~[07y42&*A#JSam,곫5BNM34B`d!&`baf̈EXd8I.zE=baf̈ 3#fF,L [wWʜ.g: >9^\S`S pC]I0Xri}w;tO^oٶUUa{ Wý!X!RvsH5=UErXY~'ҍMVÇCzؾ#JRpjYnlWÎ׍5 /[siq`5sHknעuv1rHOC껎Ͱֱ.wh+{Gu]|jZ]~_z֘oZ+O&rsth]=j뿹`Lz (>`!&$lD:BeE`s·پqS[by !`?4EtdbIou[ɀ\ԓVE!@ :v/m>h/Q< *&&QO$֑M]KH4jW! lǐ_sy};vvڷ@ K7ilS~>@PB/Q*-].`ͻ2s1SSmQ<%DŽu%ng{: -U?3KM?wf){eٍ,-0mz:R Wk}.uWZ,j$>am?'`+3-g:uQjN׳g@>H?ϸ8e0ǚw_[wZVA A3\g0;*VZrD L{k^|ﴷx}w~{Y՟0y ydeML PE(Y؟gZu ՞'QZ]o`4;Mq/yEM>:Ϗg){Μb&[ H?VSգ͞u%ZTj]Ǟrobʽr${mӮa$sκr P1Y!|X(& 0 #d,Rg2bSXM)LRΥq%{ϵ:C4*M0iҽx©4oҫ|^1ˮH̆ 0>`6|l[ϝ&(SO"ZL,U0M#Ϧw#s3,&4bB3,&4bB3,&4SEI-^R{IA%^RWIQn̡TҏAvMwPk<,k#azk&92,ͳyVծ~izMj!tS}s8ֱl;0.X( DSRH@C2?Dp #?oQF>fND 5P* 10̪7w3kH2H"tq>S&z'.2 [9'"-Q6jAMQtV ̞2ܜu|oiEl6KeSz\ۭTgV{# =9tGN2NJ~%&N7.DXϷiz'ruYyV*>w"~oÖOi/*=Tj3m8Yr|$AtPp2#1~JIr\pmuGFFFI n àA{#= ! ROHRIWJHR)ROT)FHa4+v Z Z ZUb:_ @1k1u1 XFV72K=,-dL A \rR; K+^ҫId$F7F7F7F7BXaR1JC90tޏ-~Xa#9Ϗ)=+|BEi4mAs{sps\Ȕ>>)/~O?'J(xo滏ܿƞ9aJ\ks]OJ}Y]abPɽ-BbF2 N՞M/ĭzRf뽍Te^i^g&-l ?lj1bp⟈n=6@5-w L+11'؏y l@k-\ *KS7&\oLޘj1zC$:A$:c BTGSAܾ4%Ⱥ H`t0(]6X1XlYTfm 4]%;4N`q2S<S<;NGk 3@Lh`*KlDS^Nh wRN!Yr鯓#SIVLbT(J`HGu?.#2$0\FjI@ XI@<&i'#=)3lCpGxkJ5&BS@:=;.hpl*J|[z= _pB:ߛ:蜅v?Nq*%N9CZ 񯂊yg(/ t:fH7HЍЀ{NUF1V:{{{0[̊b@3_gVpM(Yj"Q6PLOn9iw;h.zLqp ;e_g3ԾN0{Q @6q ^¹8zE}Ɋ5&{Rr\+[V+͊ҟN@>:QGc\AYJΚ_cۍ0*B09" isH.bt붻GcdzNEjXHkѪ&Z=| B^m>=qƏzAYeha!us}x\'GGWַ|eLؓeu^:M aFˈ6.>34MgEz>F_*qZvRz{|Qޏ=3DNSAT:ҕ~Oj#]ԓ tf#' IB/RЋTE*vFH-lW6S+[ŕ{ŕNhJД:)uBQ: ]5* n# ߅///^=gxV7儊d\|ɬCnJ~pSDF/֞#[Q2?nw7Ft{xj&:mZ= ݴ- 9mNӷx[tvtNZ!ӂNziCzQeuzP+Ԣ1z7ZX|ɬOεc>rc{ ɇ)N\.%C"Aúξ,37ٙl̘hJopOT,H:qIb?Eo8"s9^7x|F3[w4_@UKqp]iLJKZ_8IbR I?iO[U*-QJNK@z%lRJ^AQ[B2 @/N,=`XzEFDFUevF`gJKIpq8-@b2uĺb].$>@ FJnv~7xm#&o1L ,l7TSXKd%dßߞ(M:Ӝa%TVu89laFhw&/EB_3WfDr֟Ht?ZK$Rc1l{ #ޥ|G3- .Y;zUS(G-ٸHhOel2ld.-yyuVK*TGi]ŰbXT1,%Jი$+G[\:΅$ߐ֕ʃ]7&_uKz4/>/ml25H~+V{+6(l3)d̃ɇ)/ab!o|#/B`IR A A A }>B!bf^v?vo;v?ϼJ;K:"E)KۿߺHY-NZ_HK%_IGWQv}̦3̨y)J=a XRb`w/ڟسrş8YrN:_'@TD4V wwp.$=G@+#/(Bl+Lʙ3(gbujg4(yb7aݫLDHDQ:E2E*GʽS5f Ԙ3-@2%@2P2Tf0) Z2J$]]v$P0) da AePj2JE[0^^^d1>gz8dzGa,|g8dofl1{Xh_H^O>i&'W$%k,uJ"H ƗY5JU[Z$1pf8Q \@?.qns|+7˃5ItG^G<(Z(s66zQ&lMot/v\<q@MWi".^Vs_U'Na+E8:麭NO;B,7ɯ<cIԞnR_g{[| 3qM#n=z@Q0YGԞěγXVo`_>ϔ~ Sz3V v=GBRnpp.#3b JsK_ϡ\ֺ40)GmI9 t,s6Ou9[ #d|'7z: (7z: v+Jn%`W mGÄ*BBBBA+>V}LBdl][[*FkքJ&hYM8`.PPϪUA=zVK/4*ҘMi%KE5f-1kQYjZTORYݡ5~VSfjXGZQڝlHi ]%K5e9%z]z]z]U53YdQ!E=L\*IC}" ʕ5 kB\jzUV~d0<y2FoMOÛ0xf_v|`ѐ5t+ԡmv3Q9﾿}/(ȇϰA)scH 62s^ğdATPK!H  font.npyPK6 vedo-2023.4.6/vedo/fonts/VictorMono.ttf000066400000000000000000004541741444463326400176420ustar00rootroot00000000000000 DSIGXtGDEF,GPOSOFRGSUB#"AFOS/2RʬcL`cmap_'c cvt 4Hfpgm6IxgaspHglyfmXLhead<6hhea$hmtxu^~locadiǼmaxp Q H name_Vhbpost,f *prep0W >#%%'TVcmmort}      ""$%'')2446688::<<BBDDHHLWZZ``'(//#'8FFJZ DFLTcyrl"latnP BGR SRB $ .AZE 8CRT BKAZ LMOL VROM `TAT jTRK t   markmarkmarkmarkmarkmarkmarkmarkmarkmarkmark markmkmk"mkmk0mkmk>mkmkLmkmkZmkmkhmkmkvmkmkmkmkmkmkmkmkmkmk $,4<DLTH\ *>. # ntzj#8 ,,h,,#f#O#,#0,-# Bt #ZZZZZZZZZZZZfHNHT`ZZZZZZZZZZZZZZZZZw &,2,28> &DDJPVDJ\\b\ J& J&,h,n,t8\\ zVzz "j#8 ,,#,, ,::#::0]#B@ $ W, ,,,@@@ ,jh,A DjJj 6r4#4A,#,JJAJj,J,j3jjj #"""""""""""".("""""""""""""""""0 $*06j#8 ,,#,, 0::#]#W,,j,j Dj0 ,x]j"jA"A" # z z z z z z z z z z z z h n h t  z z z z z z z z z z z z z z z z z[        "      (  .  4  :  @ "  :  @  F  .  L "     R  X   ^   d j d j d j d p d v | j d 4 d p d j d v d j d j d d 4 j d p d j d j d 4  4 : L  "  R X  d d d j j d d d d j  4      4  :  @ "  :  @  F  .  L "     R      "       R        X d j   d j d j d j d j d j d p d v j d d  d 4 | d : d j d j d j d v | j j       4  :  L  $  *  $  0 "     R  6   6 "  6   6  R 6   6    X   ^   d j  : L  d j  : L "  R  d j d p d v d p d < B d < d < H d < N T < H d < N d <  d < 4 d < Z d < ` d < f T < ` d < f d < l d < r d < x T < B d < d < ~ d < d < B d < d < d B d  d B d d Z | B d ` d d  d  d B d d Z d ` d f T ` d f d l d r d x d T B d d ~ d d B d d  B H ` B d d d d   j p j j j d B d B d d Z B d B d d  B d  d  Z d  ` d  f T  ` d  f d  l d  r d  x T  B d  d  ~ d  B  d   T  B  d   d  ~  d   d   d  d  B d  d B d B d B d B d B d d Z B d B d d Z | B d ` B d B  B  B  B  B B d & B d & d & H d & Z d & ` d & x d & L d & , d & L d & 2 T & B d & d & ~ d & B 8 d & 8 T & B 8 d & 8 d & ~ 8 d & 8 d & B d & d & B d & d & d B d B d d ` d x d d B > B > > ` > x D B > > ~ > d B d d Z d j#8 ,,#,,,,9,g,,,,,,,,,,, ,,,::#:::::9:::::,, W  D ,0]#a,#^,,F,8,j,0,,<,4,7,,,,A,!,Djh,6r4#4j44474A6<4!4#j7yy  ,jhhh , ,<00  <   (""".4:@""FLRj#Aj740!BB   8 ^& ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~j#,^ ..4:@@FLRRX^@@F^j#/'248 FFJZ Z`'(/mmort}"$678;?DEGIJKLMUVhp  u  v  ""$%'')2446688::<< BB!DD"HH#LW$#%% 'T!VOc57'2FF JZ '2FF 4IKZ DFLTcyrl8latn $0<LXdp|BGR 0SRB R  %1=MYeq}&2>HNZfr~'3?IO[gs.AZE NCRT nKAZ MOL ROM TAT TRK  (4@P\ht )5AQ]iu *6BR^jv +7CS_kw ,8DJT`lx !-9EUamy ".:FVbnz #/;GKWco{aaltaaltaaltaaltaaltaaltaaltaaltaaltaalt aaltaaltcalt"caltcaltvcalt caltcalttcaltcaltcalt rcalt calt calt pcase case case &case ,case 2case 8case >case Dcase Jcase Pcase Vcase \ccmp bccmp lccmp vccmp ccmp ccmp ccmp ccmp ccmp ccmp ccmp ccmp dnom dnom dnom dnom dnom dnom dnom dnom dnom dnom dnom dnom frac "frac ,frac 6frac @frac Jfrac Tfrac ^frac hfrac rfrac |frac frac locl locl locl locl numr numr numr numr numr numr numr numr numr numr numr numr ordn ordnordnordn ordnordnordnordn$ordn*ordn0ordn6ordnsubsDsubsJsubsPsubsVsubs\supsbsupshsupsnsupstsupszsupssupssupssupssupssupssupsS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdS !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd                        eeeeeeeeeeeeffffffffffff            gggggggggggg                        V^ft~&6FVfv&6FVfv&6FVfv,:HZhx .<JXft&.6>FNV^fnv~&.6>FNV^fnv~$%,428`j    . B V l    . B V Z l ~    2 F J \ n    " 6 : L ^ r    & * < N b v z  ,>Rfj| .BVZl~ 2FJ\n"6:L^r&*<Nbvz,>Rfj| .BVZl~ 2FJ\n  0@RVfv*.>N`dt&8<L\nr$4FVhhx(8JN^n"&6FX\l|04DTfjz ,>BRbtx*:LP`p$(&$!t!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"" """""" "" """$"&"."2"6">"B"D"L"R"Zh"@"R"Hh"J"Jh"N"8h"&"Rh"@"h"D , P)O*R0Q2 L)K*N0M2!!28!   !  !fgYZ[\]j^_`llmnopqrstu)!fgYZ[\]j^_`llmnopqrstu)!*!!!!!i!!i!|!j!j!j h FHSTUVWXYZ!x!x!~!!!d!j!p!p!p!b!b!b!\k!L!L!F!Fl!6!*!0!0l!!!!l!!!!!    l   m   m  m x x x  f f  f f rm R @ ^m , , Jm    $       mmmnnlloXXv|FdjjFFXo2>Do *0opqqtrrl`rLXLs88D\&2JJ&&8s $sstuuxxfrff~uRLju,8Vu<<<6**$$uuuvvxv||v|jdjjFFXw2>Dw0*0x   yyzzrlzpXvzVVVDDD&&2zz  {|}\}xxfffffT}R@@~J,,~66<<$***~vvvvddddFFR2>>***"" rlvXpbbV\PDJJ&&8$ ~~~~fflRXXDDD66 $$$xlldd||RjjjFFX2DD00  r~jjVV>VD,DD&&2  xxfffxR|d,hPTTT<BB**lXX|FvjjFFX2PD <0  |rLpttDd44*$B00< ,, ^vvXXLH<<,&  n\\LN~*lH88 (^ >zhVVF$bPp@@r0N<<Z,JJvp: (                  r t  t n b b J R : : 0 * 0                          d  p p    ~ ~ ~  n \ \ P P P @ @ @  0            h h  X p p T ` 6 N H H * 8                           v  f f D V b D D D D 4 4 4  $                 x   x x x B h 2 2 4 " F  j j j Z Z Z J 8 8   htbP@@$0``P.rrbX@p.."`  :degYZ[\]^_2`8l    vwxyz{|}~bbb FHSTUVWXYZ#LRX^djpv &,2@Frfdje lvkmwnxoypzq{r|s}t~ubbbbb  bbb)*bb b#!b b"b b v FHSTUVWXYZndedeEfbbbdbbbb`bbFbbNb Lb bADbbb Bb@bP(b.bbbzRt bbbbbbbBbbbbbbbbbzbbbbbbRbbbbbb#bbbbbbbbb !b bbbb bbbbbb|bzbxbvbtbbbrbpbnblbbjbhbbfb'34578//GGKRm3FFHHSZ,.07s~&-4Wabcdefghij  aj   ajv]b a:]&-047Ws~/GKLMNOPQR#abcdefghij   /GKLMNOPQR]       WR2r UKWN LL`j  `/9~+17>HM~7 #(u~#/359:C_ck    " & 0 : < D q y  !"!T!Z!^!_!!!!"""" """""+"H"a"e"# %%%%%&@&B' 0:.49AJP7#&t~$046:;Dbj    & 0 9 < D p t z !"!P!U![!_!!!!"""""""""'"H"`"d"#%%%%%&@&B'1jjx!xc.yPZOGH6hg/ ݻݹݒݝݜ ##j::DLLVV`h &' #'89>AMOQVW]uwx|;&()-49QRWX`9dC<%De  3(*0HBDE$\h^`sfrv3 $#D:=>Y'[!"%&516);:=<@?LJKFNPRTSUX Z Y [ q"p!t%y*{,z+}.10~/765PM;OLNTZacbjF C_<B?@A28@:AEB=)*,01.('2/+-GI*+,-/0O12UVWMRNQSPT3uvq}{mnopstwxyz|rVSU 247+-./,IGgiacdebkmno lCEGIJKH]\^_h*i)fgjlk6024897135& # -.  +,tnrl~oumsqk}pvz{`dyj_xi^cbgfwh]ae|DLKJIHGFMYZ[ED.(@%gW_O+!!!3b.Ml 8  @hGMHN +!#'##338W77WZ-i 8#"*X5+ 8".X5+ 8F"SX5+ 8"'5X.X5+5+ 8F"TX5+ _?"UX5+ I"VX5+ 8"-X5+ 8",X5+ G?"WX5+ 8"'5X,X5+5+ 87"XX5+ _?"YX5+ 5"ZX5+ 8 "'X5+ 8 "5X 5+ 8#")X5+ 8$"2X5+ 8"1X5+ <E 8@5 LKhGMHMaRN&" +#"&5467'##3#32673E<7CK667WZJ;(iҚ.'#A #'  8!>@;LihMMHN! & +!'##&&5463232654&#377W*$?NO@%+#$$i <7H::H9:  !  8"0X5+N D@Agg _ GM_HN +#3#3!5##3NՌ׌?VCgx MNM MqM &C@@ Lg_GM_HN%#&&! +332#26654&&##26654&&##MWe,#,:.,eW<>?;{;?>< (YLEHWXVd-8827B<@A9!.!.@+ LaMMaNN! &'& +&&546632.#"32667#o00ocCV8P$5,CK KC,5$P8VCPO#QG8:>>97GO#9! "*X5+9! "-X5+9!.6@*) LKPX@$reaMMaNN@%eaMMaNNY@65'(%& +$667#"&'732654.546632.#"3g5$P3L9!)C7!:" ')!LW&0ocCV8P$5,CK KC?97BM& ,-8< X XO#QG8:>>9! ",X5+9!"(X5+D. -@*_GM_HN       +2##26654&&##9^i..i^>EE> MM -;}};z1 ?@<g_GM _HN  +2###5326654&&##3#<^i..i^44>EE> MMNR-;}};ND. "#-X5+1 $U /@,g_GM_HN  +!3#!!v6 MNM U#"'*f5+U"'-f5+U"',f5+UU?"'Wf5+U"''5f,f5+5+U=7"'Xf5+Um?"'Yf5+U5"'Zf5+U "''f5+U"'(f5+U "'5f 5+U#"')f5+U$"'2f5+U"'1f5+U<, @@=LKg_GM_HMaRN&" +#"&5467!!!3#!#3267,<7CA0vJ;(.' = MNM#' U"'0f5+V  )@&g_GMHN  +!3## T MN 40.$;@8  LgaMMaNN$#&'& +&&546632.#"32675#5!#s11sgIZ:P'>1@NEL!40"9.X5+40 "9,X5+4 0."96l40"9(X5+C '@$gGMHN  +3#!#3TTTTR D dK2PX@#  g GM _JMHN@!  g  g GMHNY@ +3##!##5353!53!5!//TT//T*T*uM(MZC ">,X5+` )@&_GM_HN  +#3!53#5h MzMMM`#"A*X5+`"A-X5+`"A,X5+` "A'X5+`"A(X5+` "A5X 5+`#"A)X5+`$"A2X5+`"A1X5+`< ;@8 L_GM_HMaRN%$ +#3#3267#"&5467#53#5!rJ;(:<7CA0zM#' 7.' =MM`"A0X5+#  ,@)L_GMaNN' +&&'732665#53#U8O#6.DI 0ob#PG566vgMLG#> "M,5+II '@$LgGMHN +3###33h(aMTT& ? I I "O6lh  @GM`HN +!!3! ]TO -e  "Q*5+h   !@_GM`HN +!!3!#3 ]TOB T -h   "Q6l$) &@# LGM`HN +!!5737O]bbTM(Q(,7Q+- (@% LGMHN +3#33##TPPT }J} ^HRE @LGMHN +%3##3TZTZkk E#"W*X5+E"W-X5+E "W6l 5+EV F LK-PX@GMHMaLN@eGMHNY +3#52654'#3TIH20 TZ  IHMk E"W0X5+2&.#,@)aMMaNN#"' +&&5546632#>554&&#"3l//l__l//l_AGGAAGG@HPHHPHM7sPs77~tPs72&#"]*X5+2&"]-X5+2&"],X5+2G?"]WX5+2&"]'5X,X5+5+2/7"]XX5+2_?"]YX5+25"]ZX5+2& "]'X5+2&."]5X 5+2&#"])X5+2&$"]2X5+215@2LjaMMaNN'&#''# +3#"'#"&&554663232654&&#"32665\TE7 /l__l//l_G_$GAAGG@AG>LH|PHHPH'+ s77~tPs77s2#"j*X5+2"j5X 5+2#"j)X5+2$"j2X5+2"j0X5+2&#"]+X5+2&"]1X5+'1R#-F@C'& LaMMaNN*( (( +#"'#7&&55466327&#"!4'326651</l_V3]</l_V3#BAGL#BAGR+ePHA+ePHAw<7sw<7s2&"]0X5+W.(KPX@  L@   LYKPX@"gaMM aHN@2gaMM_GM_HM  aNNY@(''&" +#3#3!5#"&&5466325!6654&&#"3Wփ&FIS$$SID(*..,(//(NMOO>>?>Y( 2@/g_GMHN      +2###26654&&##@Xd,,cYT<>?; -dWZd* ~A@=BY 9@6gGM_JMHN  +2###326654&&##,Xd,,dXTT;??;l*_SS_* <99<2Xd./A@ ,LK'PX@.iaMMaLN@+ieaMNY@><53/.)1$#5 +766&#"#"&'&&##5327.554663233266554&&#"8$2 --$1)- 'HT%/l__l/'YN .G@AGGAAG[ M O P~PHHPNs77sPs77~tQ@ 4@1i_GMHN! +!##32326654&&#VTXd,&TJe<>?;P -dWSb.A@=BQ@ "x*X5+Q@ "x-X5+Q @ "x6l3.0.@+LaMMaNN0/&.' +&&'7326654&&'.546632.#"#\>@)C;>CCBW^)+bV`e#;'>69===[e,.h[71<-.D?-6'8K:P])1?@(*;6'.!CCBW^)+bV`e#;'>69===[e,c2 ,-8< U9B<-.D?-6'8K:P])1?@(*;6'.!99>T+cW=w^f++f^w=G#"*X5+G".X5+G"-X5+G",X5+G "'X5+Ge"''Xc*Xc5+5+Gh"''Xc-Xc5+5+Ge"''Xc)Xc5+5+GL"''Xc1X:c5+:5+G "5X 5+G#")X5+G$"2X5+G#5@2LjGMaNN"$%# +3#"'#"&&533266533265\TD8+cWWc+T>99>T Ȓ=Lzw==w^f++f^" G#"*X5+G"5X 5+G#")X5+G$"2X5+G"0X5+G#"+X5+G"1X5+G< &/@, LGMbRN$%( +33267#"&5467.5332665T@MD8(:<7C/%IT%T>99> !% 7.'4Bo^f++f^G"FXG"0X5+ 8 @LGMHN +!#33VTZZ {H (@% LGMHN +3#333#SoUOQNQOUoP] WOuH#"*X5+H",X5+H "'X5+H#")X5+"6 @ LGMHN +3##3]]]] pp;H @LGMHN +!#33VT\\*s H#"*X5+H",X5+H "'X5+H "5X 5+H#")X5+H$"2X5+H"0X5+*. )@&L_GM_HN +!!5!5!!,ge=M>k*. "*X5+*. "-X5+*."(X5+1Ax&4KPX@ #L@ #LYKPX@!gaPM aHN@)gaPMaHM aNNY@'''4'3-+&%'$& +&&54663354&&#"'>327&'#>55#"3a+*aV<8+1 P2R@Tb+ !9>NA8<::<8%QFMT#*5:+*>H!-`O'% M#*!MD?E22,/1Aj"*X1A0".X1A0"KX1A0"#5X.X1A0"LX1A1"MX1A"NX1AV"-X1AV",X1A7"OX1AV"#5X,X1A7"PX1A8"QX1A"RX1AP"'X1Ax"5X1Aj")X1Ak"2X1A"1X1=Nx8FKPX@! / 8L@! / 8LYKPX@(gaPMaNMaRN@/gaPMaNMaRNY@ &#&'$&)" +#"&5467&'#"&&54663354&&#"'>327#3267#"32665N<7CQ9&NAUa+*aV<8+1 P2R@Tb+ !J;(u::<88<.'$C '*!%QFMT#*5:+*>H!-`O'% M#' 22,/D?1A"/X1AN"0XTx2;IW@T/)(L  iaPM a NN<<33326632#3267#"&'#.#"6655#"3hE$QG@(&T #:.7@=7>D(%*DJ=1=A9\ %((@++$QFMT$/7:,+=E%--%BXb+&3-B7(//(FP#"OHD@E23,/V =@:LGMaPMaNN" +&'3632#>54&&#"3b,T+cVa**aV7<<79<<6*65?yy>M-i_`j-C?Bx.@+ LaPMaNN&%& +&&546632&&#"3267#m/0oaP^,F"<6CJHB6>$F-`Q>yy>5E*3$-i``i-$4*E6Bj"*XBV"-XBx2@'&LKPX@$reaPMaNN@%eaPMaNNY@21%(%& +$67#"&'732654.546632&&#"3t>$F*XD!)C7!:" ')!HS%0oaP^,F"<6CJHB?$4*@7 ,-8< W Fly>5E*3$-i``i-BV",XB^"(X? l@ LKPX@GMaPMaHN@!GMaPMHMaNNY@& +&&54663253#5#6654&#"3e++eXh-TT-hGNKJ:??:>yy?7*M$%PK-j`_i-:%-B@?LiaGMaNN-,*&& +#"&&546632&''7&5676654&&#"3;>.h\[i..i[L22)AU^s)DD>>DD>F؍ds43rbbr4\4UDF$ME@Cb"PHIO""OIHP"M #|@ LKPX@#aPM_GM aHN@'aPM_GMHM aNNY@#"& +&&54663253#5##3654&#"3^**^PW-TT.VYB UHF>1991?xx?7*$%OL.j_^j-?K '~@  LKPX@& gGMaPM aHN@* gGMaPMHM aNNY@%#&" +##5#"&&5466325#53534&#"3265K;T-hXe++eXh-TTKJ:??:GNMg*>yy?7XM::PK-j`_i-$%6x =@: LgaPMaNN  %# +!3267#"&&54663.#"e+r F=9A'C/cR^l//l^<4:D"xBXb+#4,D4?yy?GP""PG6j"*X6V"-X6V",X67"OX6V"#5X,X67"PX68"QX6"RX6P"'X6^"(X6x"5X6j")X6k"2X6"1X6<x)2Q@N L gaPMaNMaRN***2*2/-)(%*# +!32673267#"&5467.54663.#"e+r F=9A'C:$J;(:<7C-&S_*/l^<4:D"xBXb+#4,+3 #' 7.'3Bry?GP""PG6N"0X3@.4@1LgaMMHN' +.#"3###5354663K,O +(14T||'ZN.1, =9VNRNVS_*;< x-KPX@ L@ LYKPX@ iaPMaRN@$iJMaPMaRNY@-,&$&%% +&'7326655#"&&54663253#6554&#"3J$=,*8=-hYd+,eWh-T+aVCKNG:??:)4GA08@}bq3*_m08KP%$"OHcm.;< 0".X;< V",X;< j"3X;< ^"(XW -@*LGMaPMHN$" +33632#4&&#"WT'dV`*T;79; /={4bi,ABr  ;@8LgGMa PMHN$ +#4&&#"##53533#63`*T;79;TJJTww'dx={4bi,ABrM::MP/",5+m^"(`mj '@$_JM_HN  +3!53#5pN~jMMMmj"*`mV"-`mV",`mP"'`m^"(`m^"5bmj")`mk"2`m"1`m<^ (@ LK PX@- aOM_JM_ HMaRN@+ i_JM_ HMaRNY@ ( ('&%$#"!  $ +&54632#3267#"&5467#53#533 )))mJ;(:<7CA0ͯ~ү&''&)#' 7.' =MMMmN"0`A<^"(A<j/@,L_JMaRN% +&'732665#53#J$=,*8=~+aV)4 NHMbp1A<)V",m2 +@(LgGMJMHN +3#3373##TTf f R$m 2 "6lp /@,L_GMaNN$ +&&5#533267#TG~$ '/);%*aXM:@Hp "*X5+p ?@<L_GM_GMaNN$ +&&5#533267##3TG~$ '/);%,B T*aXM:@Hp  "6p -@*  L_GMaNN(" +%#"&&55575#5373267);%AGtt~tt$ '&*aX/Q/M/Q/:@(0w'V LKPX@aJMHN@JMaPMHNY@''$$$# +3366326632#4&&#"#4&&#"(T&&+4,38T #T #j((,h]zE@:uQxLLKPX@aJMHN@JMaPMHNY@ $# +336632#4&&#"QTL;NW%T2.DDj&-i_}AHBArQj"*XQV"-XQ x"6lQVxLKPX@aJMHMaLNK-PX@ JMaPMHMaLN@eJMaPMHNYY@' +#526654&&#"#3663W% LD''2.DDTTL;x-i_}@I!M''AHBArj&QN"0XDx,@)aPMaNN& +&&546632#>54&&#"3e++eXXe++eX:??::??:?yy??yy?M-i``i--i``i-Dj"*XDV"-XDV",XD7"OXDV"#5X,XD7"PXD8"QXD"RXDP"'XDx"5XDj")XDk"2XD-;@8LjaPMaNN-,)#&' +3#"'#"&&54663232656654&&#"3CTE7 +eXXe++eXN`??::??:ّ>L8Sy??yy?16 -i``i--i``i-Dj"*XD"5XDj")XDk"2XDN"0XDj"+XD"1X0& )F@C#"  LaPMaNN&$'' +#"'#7&&5466327&#"$'32665&=+eXS0_>+eXQ0 7:?( ::?f%uUy?,g&tSy?,N4s-i`_5-i`DN"0XT#3<@   LK"PX@$   gaPM a NN@) i   g Y a QY@44$$4<4<97$3$2,*#"%#$& +&&5466326632#3267#"&'#>54&&#"3.#"nI IA09<5?E(#!D"B25<90!##!!%%!O $'@@&..&C_i,$5/C5&..&N/oggo//pffp/BNV$$UOJJxl@ LKPX@aJMaNMLN@!JMaPMaNMLNY@&" +3632#"'>54&&#"3JT-hXe++eXh-??:GNKJ *>yy?7-j`_i-$%PKJJ B@?LGMaPMaNMLN&" +3632#"'>54&&#"3JT-hXe++eXh-??:GNKJ*>yy?7-j`_i-$%PK=JxwKPX@ L@ LYKPX@aPMaNMLN@ JMaPMaNMLNY@&&! +%#"&&54663253#&654&#"3-hXe++eXh-TTKKNG:??:)7?yy>*KP%$-i_`j-l xK LKPX@aJMHN@JMaPMHNY@ &# +336632.#"lTW5NSK)"TLjT';=O"')Yl j")*Xl V")-Xl  x")6lKx-.@+LaPMaNN-,&-& +&'7326654&&'&&546632.#"#W$B!.%HN@?td-gZQY%=#2)=B<4<>?;05TSR^++^RBGWWVd-MB<@BN778<<86% 6@3LGM_JMaNN$ +&&5#53533#32667#(Q%||T,'$' O+F9/fUGMM;D ,16% #?@<# L  gGM_JM aNN # +%#"&&55#535#53533#3#32667%+F9EQ%||||T,'$' d,1/fUgMMMMg;D 6%@@=LgGM_JMa NN$ +#3&&5#53533#32667#B TfQ%||T,'$' O+F9@/fUGMM;D ,16% .N@K.  LK  ieGM_JMNN+)%& +%#"&'732654&&5#53533#32667%A?!)C7!:" ')!L@||T,'$' d:3 ,-8< W moGMM;D 6 % "46QjLLKPX@JMaHN@JMHMaNNY@ $ +&&53326653#5#W&T2/AFTTK=.g[xAF:6!Qj"9*XQ0"9.XQV"9-XQV"9,XQP"9'XQA"9#'X*Xװ5+Q-"9#'X-Xװ5+QA"9#'X)Xװ5+Q"9#'X1Xװ5+Qj"95XQj"9)XQk"92XQ$@ LKPX@jGMJMaHNK'PX@#jGMJMHMaNN@#jJMHMaNNYY@ "$## +3#"'#5#"&&533266533265\TD8TK=MW&T2/AFT =L!.g[xAF:6" Qj"F*XQ"F5XQj"F)XQk"F2XQN"F0XQ^"9=Q"91XQ< j'3@0 'LJMaNMaRN%$(" +#"&54675#"&&533266533267 <7CM7K=MW&T2/AFTJ;(.'#B.g[xAF:6#' Q"9/XQN"90X-*j@LJMHN +!#33SPVWjEj (@% LJMHN +3#333#MoUMQLPNUpM\j@Ej"R*XEV"R,XEP"R'XEj"R)X8 j @ LJMHN +3#'#3````j55<>j-@* LJMaRN% +&'73266733#d1"(2&WX;S>G 94]NX'<>j"X*X<>V"X,X<>P"X'X>j"X5<>j"X)X<>k"X2X<>N"X0XTj )@&L_JM_HN +!!5!5!!Q<=3M3Tj"`*XTV"`-XT^"`(Xl.#.2KPX@ L@ LYKPX@,ig   i  W _ OK!PX@1igY   i  W _ O@2igi   i  W _ OYY@$$210/$.$-)'#"&#& +&&54663354&#"'>32&'#6655#"3!5!I IBV%1$# R &?2BI., /&1%V2%&1vT=739"2&' 39G@ MM(4%%%Ng.#;@8iiW_O#"! & +&&546632#>54&&#"3!5!N""NFFN""NF&**&&**&vT,e\\e,,e\\e,MD>>EE>>DNx#.K2PX@  L@  LYK2PX@!ga@M a=N@)ga@Ma=M aANY@$$$.$-)'#"&#& +&&54663354&#"'>32"&'#6655#"3J IBV%1$# R &?2BI0+ .)1%V2%&1@>739#1&' 39F@ MM(4%$&|=@:Lga@MaAN&% +$67#"&&546632!33&&#^+CFEIQ##QIDJ.83/&) ).;-*bY_i-0pfL;@0<=/q 8@5gcakN   $ +&54632#3!53#5 3ssT PMM-My,@)Li_O$# +736632#54&&#"yT 0!?ET",0)+d[=C<6v,@)a@MaAN& +&&546632#>54&&#"3N""NFFN""NF&**&&**&@,f\[e,,e[\f,ME>=EE=>Er=@:Lga`MaaN"& +#"&&5!&&#"'66367#3hQ##QIDJ.8%+CFE3/&)*bX_j-0pfL; ).;-s0<=/j @ L7667;5D)&=.#e(TT.A*.  #dQMVp 2H<=J4; "|*X5++# !@_MaN+!###526!#T'Zb9;#SuNi+>+- VC >2&.]< @_MN+3#!#!TT Y( u9!.I -< '@$ LMa#N%#+3#"&'7326737Vj`"1"&0W p]G -<"Jl5+ M '*@'#"LiMN+#5.5466753>54&&'M.j_T_j..j_T_j.>GG>F>>F >ZZ?qp?YY>q1aRRa0a10aR"6 B +@(LiMN$"+#5#"&&5332665T'dV`*T;79; /={4bi,AB)@ )@&TM`N +3#5!3!TT=T -v -#5 @M`N+!!333335TTT -- N -@*TM`N +3#5!3333TTTzTz -l --K  FK PX@qM`N@M`NY@ +3##5#3!TTT vv -Y( 2@/gM`N     +2##326654&&##@Zc++cZT9@@9/mccm/ O!LEEL C 9@6g_M_N +2###5326654&&##[Zc++cZe9@@9/mccm/MO!LEEL 9 =@:gM `N      +2##33%26654&&##PX&&XPTrT/55/e/mccm/  M!LEEL U !?@<i_M aN !!  +2####526326654&&##@FF@}>&Zb9:#)##)/mccm/uNi*?O!LEEL  U >@; iM `N  +2####33326654&&##HO""OHTTTJ'++'J/mccm/P "O!LEEL 3.|2.#A@>ga"Ma#N#"#"'" +$673#"&&5546632#&&#"3#3b?[l__l//l__lY?8AGGA?$+RJHPHJR+$7sNs7J&.#A@>ga"Ma#N#"$#"' +#"&'3326655#5354&&#"#663l//l__l[?6AGGA8?Yl_.HPHJR+$7sNs7$+RJ` A` "A'X5+#  M> 3@0Li_MN$+#54&&#"##5!#63`)T<6::TS&e4zmOX&DEMM0N.+hKPX@ gaMa#N@(gMa"MMa#NY@(&#' +#"&&55##33546634&&#"32665W&&WNNW&RTTR&WNw3..33..3.EPEE Es77sPs77s 4@1i_MN +###.54663#"3TVbJT&,dX;?>< PQ.bSWd-~5B=@AK %KPX@#  L@#  LYKPX@ i_Ma#N@$i_MMa#NY@%$&%& +#"&'5326654&&#"##5!#63a)'\T 48<79<Tg+c0qfep0N"OGHO"C@MM5 5 D@Ag gM `N  +2###53533#26654&&##MZc++cZYYT9@@9/mccm/nMeeMpO!LEEL  N #*8@5  LK_M_N$$$*$*(+$#&&'.'##6676675!632!Z "T" Z 5(B(5Q  V2$62Y_.n._Y26$22-MMK@.G@GLKPX@<  rge a "Ma#N@=  ge a "Ma#NY@A?<;86#%& +#"&'732654.53326654&&'#53>54&&#"#46632$%TI!)C7!:" ')!JT$TA?54&&'M.j_T_j..j_T_j.>GF?F>>FSddSRccREwvE54&&#"3h.7!# 2TT693T)"MXX!Гz 6x6j")X6P"'XUj #@  LMN+3#3#3#ZZTTZZ55jj5Ax2G@D+Lga$Ma#N21#'# +&&53326654&&'#53>54&&#"#46632#e+TA::B93VV39A;;@T+e[[e,#//#,e[IB$(($*0N.'$'&"@GIA:@D=BIEj @ LMN+3##3^T^Tj#j#E0"JXEj")X4;j-@*LgMN!+###33>7667;.=&':,h9TT,,A+(jJ=>D$j&6-*34;j"*X+#j !@_MaN+!###52667!#T'Yb::#STNH+-j (@% LMN+3#33##'TBBT }J}jkCj '@$gMN +53#!#3TTTTs%jDx<j@_MN+3#!#!TTjJJx&BxIj!@_MN+###5ITjMM<>jX<>0"Jv#J5 ' @#"LM!N+$#5.5466753>54&&'5+`TTT`++`TTT`+6;;6;66;}=>}ii}>=}j-ZOOZ-[--[N8 jWBj%@"LiMN$!+%#"&&553326653#&eX_)T:9<8TT03z`_!;A +Aj )@&TM`N +3#5!3!TT>Tjvj#5j @M`N+!!333335TTTj Nj-@*TM`N +3#5!3333TTTzTzjljK j FK PX@qM`N@M`NY@ +3##5#3!TTTjvvjY(j 2@/gM`N     +2##326654&&##@Zc++cZT9@@9%WNNW%j6005Bj9@6g_M_N +2###53#26654&&##ZZc++cZd9@@9%WNNW%MM60059j =@:gM `N      +2##33%26654&&##PX&&XPTrT/55/e%WNNW%jljM6005Uj ?@<i_M aN    +2####5266732654&&##@FF@}@'Ya::").##)%WNNW%TNG6G05 Uj>@; iM `N  +2####335326654&&##HO""OHTTTJ'++'J%WNNW%Fj6005Kx-2x%A@>ga$Ma#N%$#"'# +$673#"&&5546632#&&#"3#3h:[4WGak..kaGW4Y;=@GG@?'9>4zmPmz4>9'&YONOY&J&x%A@>ga$Ma#N%$$#"' +#"&&'3326655#5354&&#"#>3k..kaGW4[:<@GG@=;Y4WGx4zmPmz4>9'&YONOY&'9>m^mP"'`A<^  Nx+hKPX@ gaMa#N@(gMa$MMa#NY@(&#' +#"&&55##33546634&&#"32665W&&WNNW&RTTR&WNw3..33..3x4zmPmz44zmjmz4PX&&XPPPX&&XPj4@1i_MN +#5##7.546635#"3TXjGP#+cZ9@@9j'MAHP#/+*/ V %x# LK-PX@* gM a  $MMa!N@' geM a  $MNY@%$' +#526654&&#"##53533#63`*IH)$;79;TJJTww'dx={IHM &,4bi,ABrM::MP/ ( F@C gM_M `N  +2###53533#26654&&##@Zc++cZLLT9@@9%WNNW%NN6005 Nj!(8@5 LK_M_N"""("((+$#&&'&&'##667667'5!6327"Z /(T(/ Z 4'B'4WM'&+2VIIV2+&'1ZeMMeZAxG@GLKPX@<  rge a $Ma#N@=  ge a $Ma#NY@A?<;86#%& +#"&'732654.53326654&&'#53>54&&#"#46632#$TJ!)C7!:" ')!JS$TA::B93VV39A;;@T+e[[e,#/D="1v<>P"'v<>j"+vBP"'X9P"'X@6>"0kLK"PX@ga"Ma#N@#igYaQY@###0#/+)"!&%+#"&&5546323>54&&#6654&&'#3@-fYor)esR])!(;-085nA!NH OGdber3K{(YO?J%]TS4147@!PKAI#O[)@x+.@+'&La$Ma#N+*-%,+&74667>5&&#"'66323267#v>WF36&M>3AQkWDf59OA7>*K:?QS:fCbR6F% 4@G<Wk1Y;0=!),8J?=^5;< xU  '@$ LMMN+3#3#3#TTZZZZZ 55j5J<x2G@D+Lga$Ma&N21#'# +&&53326654&&'#53>54&&#"#46632#`*T=77=5/VV/5=77<U*`XX`*$//$*`X(^V7>B;=F!N816;:4R['(\TGKYXYc*Qj9Q0"JXQj")Xm2 :j@LMN+3#3#sUXUjQx(0w@<jKPXLLYKPX@SMaNKPX@SMMa#N@cMMa#NYY@ $#+%3#5#5#"&&53326653;T;K=MW&T2/AFTJv!.g[xAF:6(0j'V LKPX@MbN@MMb#NY@''$$$# +#5#"&'#"&&53326653326650T&&+4,38T #T #j((,h]zE@:Mj+^ LKPX@T MbN@T MMb#NY@+*$$$# +%3#5#5#"&'#"&&533266533266536T6&&+4,38T #T #TJv((,h]zE@:Y)j!6@3LiMa#N! #+&&536632#>54&&#"3c+T@9Zc++cZ9@@99@@9&ZP&ZQQZ&M93389329Dj#<@9Li_Ma#N#"&+#"&&5#536636654&&#"3c++cZZc+e@99@@9:?@9&ZQQZ&&ZP[M93389338N +lKPX@$gMa$Ma#N@(gMa$MMa#NY@(&#' +#"&&55##33546634&&#"32665W&&WNNW&RTTR&WNw3..33..3x4zmPmz44zm <mz4PX&&XPPPX&&XPD "2B@?LJiia#N###2#1+)"!%+&+#"&&5467&&5463267#"36654&&#"3c++cZZc+)/#'q\Da 2}a7BF;9@@99@@9/lbbl//lb_lD'K\81)'9 S!KDDK!!KDDK!V j<j<jIj#5j 8 M V  p: 0K'PX@+M`,N@ d+NY+!!3!:Z-F U '*. C >2&.#'8@5ga1Ma,N'&%$#"'+&&5546632#>554&&#"3#53l//l__l//l_AGGAAGG@rHPHHPHM7sPs77~tPs7*N` AII O: 2LK'PX@ +M,N@ +NY+3#3#sUXU +- VE W!7  NK'PX@g_+M_,N@gc_+NY@ +!5!!5!!5!7FvFMINIM2&.]< 6K'PX@_+M,N@_+NY+3#!#!TT Y( u+7 L@ LK'PX@_+M_,N@c_+NY+!!55!!!7 fBNNBMI H 4LK'PX@ +M,N@ +NY+!#33VT\\*s  M 'L@ #"LK'PX@i+M,N@i_+NY@ +#5.5466753>54&&'M.j_T_j..j_T_j.?FF?F>>F#~<dd=~mm}=cc<~m/]OO].]..]N"6 D KLK'PX@+M,N@_+NY@ +3#5.533>5T,g[T[g,TB;T;B l}<<}lM[..[MG.)OK'PX@a1M_,N@ca1NY@))'' +353&&55466323#5>554&&#"Y.h\]i.Y11D>=C22M*pPHHPp)MO,vvPs77sPwu,O8 "H&[ "HH "Hnd "H}&." HH "%H?}G.")H` "'X5+H "%'X5+InI W@ LKK'PX@g+M,N@g_+NY@ +3#7##33h(fafMTT& ? ;-x(@ LKPX@#a4Mb,Ma,NK'PX@%.Ma4Mb,Ma,N@#j.Ma4Ma,NYY@('*%$+$3"&'#"&&5463267367&'.#&3")9X?MW%kn@LT "G ,$BC2-?Z2.:42@ LKPX@#ia1Ma,M0NK"PX@#ia1Ma,N@'iiYaQYY@21'-$%+#"'#466326654&&'#53>54&&#"3@-fYzOY((YO?Je!PKAI#N414774NT#J)j@L.M0N+#536654&'3)ZrTXSE"dlˡjyC1H/*I5D.%9>@;+La1Ma,N&&&9&820%-%+#"&&54667.54632&&#"6654'#6'&&#"3,dXXd,%UH*4!\L1e%V&."+B] ?AI:??:hKi{77{iaw<#3"8AE "A4^&XP  O>&XPPX&Ax2G@DLga4Ma,N21'#, +&&5467&&546632#4&&#"3#326653#e,#//#,e[[e+T@;;A93WW39B::AT+e[IB=D@:AIG@"&'$'.N0*$(($BIMJ5 @ I_+N+6'6654&'.5467#5!=XH>I02(3#43"##mT'0L7$5$" fj/*/7&M-&$+$K N LK'PX@a+Ma,N@ea+NY@ !#!+%#"&&'#&&##5323KCD[5!W@/2CBY6 *?,MMqi[bMonVDJj}LKPX@.Ma,M0NK'PX@.M,Ma,M0N@_.Ma,M0NYY@#$+3326653#5#"'DT3-(N1TTZ3N- U27&B(6!#)j: LK'PX@ .M,N@ .NY@ +#36654&'ZrTXSE"j*I5VʢjyC1H/MJ5#4;@8.L#J I_+N0/-,%$"! +6'6654&&'.5467&&5467#5!7#7#%74PhL'32 3L@EU;SbD:29j~ v97r B,WF,9 A(4#@1F[ ?4.DMP)-P 55"Dx6jEK-PX@_.Ma,N@e_.NY@ +#7&5###5!6g*,_\Td{! LKQMDJx"8@5 La4Ma,M0N"!&+#"&'#546636654&&#"3e++eX(MT+eX:??::??:x?yy?y?-i``i--i``i-!J?x'@'Ia4N#.+6654&&'.546632#4&&#"J ';4AQ96}q`l.TG@PZ&,@8?J4 **.-6)^Rnz4.laCK &YP6?%SH#B6D:x!IK'PX@_.Ma,N@ia,NY@&+##"&&54663&&#"32665:S+eXXe++eX?::??::?xM&wYy??yy?i--i``i--i`9j'@$L_.Ma,N$"+%#"&&5#5!#3267);%AG$ '&*aXHMM:@Aj!@.Mb,N$+&&53326654&&'3#f,TA::A$"_+ ,fYA&ep00peMbL+9|qADJx(.@+!La4M0N('+$#5.54667>32&>54&#&XMTCL")K2%-($;67> -3ÇBBqWUQ _Uc3`>{1eVn5JKj2@/La.Mb0N!$!+#"&'#.##53233KCQc&])=*2CL_%])@,iMe{PMypYJDj/@,L~.M0N+$#5.5533>54&'3D,g[T[g,TB;T;BT}<<}lM[..[MCM""MC 8j.4@1 L.Mb,N..$&$&+#"&'#"&&546733266753326654&'")B<(77(>W-1Sep0/kaak/0peS1j"<GAP"<'!"<IAj"HGAP"H'N*"HIDj"BG 8j"LG;-j"4GAj"8G1Jj":G<=xBMVKPX@PD2# L@PD2# LYKPX@#a.M a,Mb0NKPX@+a4Ma.M a,Mb0NK'PX@2a4Ma.M a,Mb0N@/fa4Ma.M a,NYYY@NNNVNU+2*)%$# +327#"&'732655&&'#"&54767654&#"5632767676632667654#"673IG A6#T'>GVJ7E/3^7,  6S/ @'28L8.   @jqjJ[B2& y1z{+%*2"DFQeOCwJ( L[(5-&"&I'&' :-8 -@*L;Ma@M=N$# +36632#54&&#"T*"EM!T(%&*;X0ncEM">7 +@(Lg;M_=N +#3373#'#TTwee;X/@,L_;MaAN# +&&5#533267#>=L!#0+6@)]U5M~P>HI #V LK2PX@aET!-2;/+d[=C>9|/"l@ LK2PX@aN@!NY@"!&# +36632#"&'>54&&#"3|T+$FN!!NF%+))&8++&f+e\\f,E>>D!+i5<|).@+La@MaAN)(%,% +&'732654&'.546632&&#"#GB*%C1+:@H"NG>F=,$8+&1FN!%UN@)67) !&0$27$1;& '5'4:|6@3L;M_<7=WWTuu! $!=/)]URRP>2&.+=@:iaMMaNN  + *&$& +&&546632#>54&&#"3&54632#rBBrFFrBBrF,L..L,,L..L,%%%%jwwjjwwjMW__WW__W#""#` RLK2PX@GMaPM`HN@iGM`HNY@  +%3!53#52653V?cMTUMMM1NQL3#.#(@%aMM_HN#+ +74667>54&&#"#&6632!!55MBGT;EBDET-k`^k/GcPKL>1UE36Mb969@54&&#"#46632#f+TA?54&&#"3i..i\Yi0TC=?DH;]h..i\?DC@@CD?2ob"iy5%VI/3$VPO0pfbp2M!NHLNNLHM!6 $@!K_GMHN  +367!5!,tux-SMM1'.+;D@ALiaMMaNN,,,;,:42+*$", +&&5467&&546632#6654&&#"36654&&#"3m/*6) +cVVc+ )6*/m_:==99==:BGFDDFGB.fYWWJHP\**\PHJWWYf.::6::6::qD?CDDC?D9.!1E@B LiaMMaNN"""1"0*(! &&# +&&53326655#"&&546632#6654&&#"3i0TC=?DH;]h..i\\i..i\@CD??DC@%VI/3$VPO0pfbp22obiy5NLHM!!NHLN2&.#:@7 La"Ma#N#"&+#"&&54663&&#6654'3rrBBrFFrBBrF,L. A$,L. A$.jwwjjwwjMW_BAd5;^W_CA5;v{wxy{z{{|{}~+A@>iiYaQ  + *&$& +&&546632#>54&&#"3&&54632#@$$@((A$%@(  9:e??e9:e>?e:D*G))G**G))G*l{1@.LiW`P1+%3#535'732'3QGG#/ HJDDDNTKPX@riW_O@ iW_OY")+4676654&&#"'&6323!6412  I>QL@'6(3 (=(%9# #N@6B*D2&D-'LKPX@/rrigYbR@1igYbRY@-,"&# +&7326654&&'#5>54&#"'&632#;I ::%J;MH>>H9?M!  D " !J<8B )0'F<{ 0@- LWg_O+#5#533#'3I<%%IKK2i3Do{ LKPX@/pgiYbR@0~giYbRY@ "&# +&73326654&&#"#5!#632#=J  :OABN954&&#"3??JK>I  $L>@J  9BOSF8E $$ AQOBD ! " "! { *@'LW_O +667'5!H7>K2[bC9l^%5H@ELiiYaQ&&&5&4.,%$* +&5467&&54632#6654&#"36654&&#"3A ;FF< AM##  9=I(/' A88A (/'I= !!   +} LKPX@)riiYbR@*iiYbRY@+*$"$%# +&'3326655#"&54632#>54&&#"3=J  'L>@JJ??J  98F$$ AQNBBNTF # ! " Yv װ5+Rw װ5+Yx װ5+Yy װ5+Rz װ5+R{ װ5+Y| װ5+R} װ5+Y~ װ5+Y װ5+YRYYRRYRYY% @GMHN +##3LjL R#W,VR#Z#,xTY#q#,yTR#Z#,yTY%Sf@ %S LK PX@Ir r rg  j  g  fGMaOMHNKPX@Gr r rig  j  g  fGMHNKPX@H r rig  j  g  fGMHN@J   ig  j  g  fGMHNYYY@NLJIFD>=<;42&$* +3#!54676654&&#"'&546323#"&7326654&&'#5>54&#"'&632LL6412  I@KL?'5)1/>HM;I ::%J;MH> .(=(%9# "A66B*D2%60'F<:42&$* +3#!54676654&&#"'&546323#"&73326654&&#"#5!#63LL6412  I@KL?'5)1@ANO=I  :! .(=(%9# "A66B*D2%6BQPCLKG8LjLDND*9l^Ze; UR#Z#,~UY#_#,~UR#a#,~HUR"#,~SR#Z#,XR2BNbKPX@' LK&PX@' L@' LYYKPX@B i  h  ii f G NK&PX@H ~i  h  ii f G N@U  ~i hii he G NYY@(33LJFD3B3A;921,+*)&%#"! 1& +#"&'#535'7#7#535'532'333'33&546636654&&#"3&632#"&5A$$A(4G#/3QG"/ HJG%Q2V J@!$@(  0:e>?e:!8DA7DDN<U=V?e9*G))G**G))G*x @aNN $ +&54632#!!++!!+))))<x;K'PX@aNMLN@aNNY@ $ +665"&546322'!!++!0?MO)))BmNxw' 5+<xw" 5+?#9#x %@"_GMaNN% +%#3&54632#VT h_!!++!!+)))))Jxw '@$aPM_LN $ +&54632##3! ,, !+4h T))))b3#.!-=@:~aMMaNN"""-",(&!!#+ +%4667>54&&#"#&6632&54632#("#)EBDET-k`^k/$2(T!!++!!+6C$&H:69@533266'3#! ,, !+]k/$2(T("#)EBDET-k`))))T([QM`2*6C%&H:69@: OY`p <6T?}208&paN<< PYz OM zC;J'4*3U--Y3*,(KM<xD<"J.MK'PX@GMaPN@aPNY@$ +2#"&5467!2#"&54672'!!++!0?[2'!!++!0?.MO)))BmNMO)))BmND '5+5+.;K'PX@GMaPN@aPNY@ $ +2#"&54672'!!++!0?.MO)))BmNx  5+(<} ?@ LKPX@ _JN@W_OY +%#'73#'73Mgggg0} ?@ LKPX@ _JN@W_OY +7#7'3#7'3gg1gg}5LKPX@ _JN@W_OY +%#'73gg}5LKPX@ _JN@W_OY +%#7'3gg~ @_GN +#3#3R jR jSSa @_GN +#3UR jS'@$LJIW_O+7'!5!=8X8;?99NVGKPX@gMN@Wg_OY@ +3#!5TT PPN'@$LJIW_O+7'!5!=8X8;i99N,@) L J IW_O+7'!5!7'8X8:8X8g99N99;'@$LJIW_O+!5!8g8X99MN,@) L J IW_O+!5!8g8p8g8X99KNM99t-?";@8iYgaQ""$$!$$#+#"&'&&#"#!5!2676632326'>UH!O#1 0cLv@M*,!O#1&'AO' N '-%I *@'YgaQ $+&54632#%!5!!!++!!+DI)))) ND/4@1giW_O%+!5!&54632#!5!Doe!!++!!+poN))))XN(w#Dc nKPX@"WW eaN@$gg eaNY@ $ +&54632#%!5!&54632#%!5!!!++!!+poe!!++!!+po)))) N))))4N'dd5+B@?LJIiYaQ*+%$&54632#&54632#8X8!!++!!++!!++!!+U9tt9ż)))) ))))<(w#LD=@: hW_O +!!!#7!5!7!5!73D C9DYD*CYEYE/NNNNdDK PX@4 pq   h gW_O@2    h gW_OY@+!!!!!#7!5!7!5!7!5!73D636W3Y3"6T6v3Y3NNN||NNN||D.!%)5O@Lg ga"M a  # N***5*40.)('&%$#"!!#+ +%4667>54&&#"#&6632%!5!!5!&54632#(!#*EBDET-k`^k/%3(G_e!!++!!+4A#&H:69@=;:9876543210/.-,+*)('&%$#"! -+!#7#537#5373373!73373!733733#3##7##7!#7##7!#7#373!73373!7337S`jmwTSTSTS`jmwTSTST"STSTMMMMJ KOSW[_cg@ :3918/7-6+5)4'h20.,*(&%#!g M$" Ndd``\\XXTTPPLLdgdgfe`c`cba\_\_^]X[X[ZYTWTWVUPSPSRQLOLONMKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"! ;+!#7#537#5373373!73373!73373!733733#3##7##7!#7##7!#7##7!#7#373!73373!73373!7337S`jmwTSTSTSTS`jmwTSTSTST"STSTSTMMMMJD '@$gh!N+#3!7!!7!-WWrW6j-NN~JD 6@3gh!N +3!7!!~W[o4W޶jNNNJ#@ L!N+' #7TX8gW9:Q*J!@L!N+##1WWj*J@!N+3#3W[b[WNjJK@_!N+!5!KjMRJ2+?u?0550RJ2+'7?V?00Ix<xwB%*@'!   LKcPN +%667#5.5466753&&'`%3F(T@TLX&&XLTAS(F3&3--3A'+*>7IJEnmEIG6?*,&d4 5cQ*.N'@@= LJ IiYaQ$(,% +$'#"''7&547'7632732654&#"0W;\.==.\;W00W;\.==.\;W0J==JJ==J8Y5]]5Y8TT8Y5]]5Y8T=II==II=3%,38@53-)(!  LMMNN +$#5&&'7.5466753&&'56654&'%WLTRZ"@@9FP""PFTKT ;;3LW%,88,A34@b0QQ9B<62K8G3LY+VV29@1,ml_hmbbmh_{qMMq{MIaM,,MaIC.'?@<LgaMMaNN'&%$% +&'7326655#53546632&&#"3##mBN!!#||!H>BBN!!#!H>1A(95NJY(1A(95NJY(!> 7@4gg_ GMHN +!3#3##5#53>TSS MNdMM2<#--Q@N Lg   gaMM  _HN--('&%%# +%!'>54'#53&'#53>32&&#"3#3##& 6:qS @=5wh5?0"&MR"MMG#.$6M*'Mo~7? %[WM'*M0!+;<#-,A@>LgaMM_HN,,%% +%!'>54&'&'#53&546632&&#"3##& 79  VB4xj5?0"&MR#̳MMG$1'$1 !N/s7? &]Y0N540=H 9@6L hg GMHN! +33#3##5#535'#533\uTu\ YM;MM;MsGj7@4ggW_O +"!!33#"&&546633dQk  vY[LGUiXNXiMM\\MM)"@gW_O +%!5!!5!NNMM װ5+F ,@)ggW_O+!5!!5!!5!4449NNN9 2@/ggW_O +5!!5!#5396vMM3N: +@(LW_O+!!!v }@W_O +%!5!N}MT װ5+G"&@ & LKPX@0p j  gW_O@/ j  gW_OY@$#"" '!" +#3#33#"'#7&&5466337337#"#WMF-6G9*X:27GU) Y 8M Qk ee *NMi*}M\MPPiXNI1G!p@ ! LKPX@%pjW_O@$jW_OY@ !'!"+#33#"'#7&&546633733#"W-6G9*X:27GU) Y 8 ;\2DMi*}M\MPPM:iE0S:q@ LKPX@&qgYaQ@%gYaQY@ !"&+###7#53&##53273>54'26L[ X 8W#-94(Y?`55-)P\MQQMMc;hCe@xD &@#Wg_O +3##5#5353SNNNNiD@W_O+!5!D0iNK q 2+''7'76666q6666D ;@8igYaQ $ +&54632#!5!&54632# %% %0 %% %####N####D/"@gW_O +!5!!5!D00NN^DrK PX@*pq hW_O@( hW_OY@ +#!!#7#537!5!73DB =XF@vO@vOoF`!]7@Jv+##, [[I)!]7@Iv+33[[IWx @YaQ#$+3#46632#4&#"T5a??a5TG::G<\22\32&&#"#M24% ]*@1.24% ] )C3#<?RCPY(#<?RN[(J; $@!W_O+!#####dTTd MwwJ7 )@&LgW_O+!!!!7(\MacJM ,@)LW_O+#33#RXbꣶ)MJJjXLKPX@JMaHMLN@JMHMaNMLNY@#$ +3326653#5#"'JT3-(N1TTZ3N- U27&B(6!#?#%%9@6LiiYaQ%$'&&+6#"&&546632&&6654&&#"3c.i[\h..h\L-'hDD>>DD> yiw55xjjx5oj]#VPPV##VPPV#X(/;b@_   iiaMM  b NN00 0;0:64 / .(&& +&&546632#6654&#"3#3&&546632#6654&#"3`CC=>DD>+ +) )0mmCC=>DD>+ +) )E>>EE>>EN$//$$//$(E>>EE>>EN$//$$//$*y3?K@ 0 $ LK2PX@7  ii    i   fGN@B  ii    i   Y  b RY@6@@44@K@JFD4?4>:832.,(&"   +'3&&54632#&32654&##"&'#"&54632663654&#"32654&#"3q766CD77D77D26 73C66C37 62;HH;;HH;!!!!;HH; $$ %% @v+!!  %,%X@v+!!X,% %X@v+#3XKK%%,@v+!!,,%k,%X@v+!!X,%k,@v+!!,,k%X@v+!!!X,,%%X@v+!!!!,,,,k*k%X@v+!!!,X%%X@v+!!!XX%kk,X@v+!!X,k%X@v+!!!!X,,k*k%X@v+!!!X,,%kk6  #/;GS_kw+7CO[gs'3?KWco{&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#U                                                      X      pX      pX      pX      pX      pX      pX      pX      pX      6* #/;GS_kw+7CO[gs'3?KWco{&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#N                               Rv    Rv    Rv    Rv    Rv    Rv    Rv   Rv   R6E #/;GS_kw+7CO[gs'3?KWco{&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#&54632#2&54632#2&54632#B//""//"//""//"//""//"  //""//"//""//"//""//"  //""//"//""//"//""//"  //""//"//""//"//""//"  //""//"//""//"//""//"  //""//"//""//"//""//"  //""//"//""//"//""//"  //""//"//""//"//""//"  //""//"//""//"//""//"  x/""//""//""//""//""//""/I    /""//""//""//""//""//""/I    /""//""//""//""//""//""/I    /""//""//""//""//""//""/I    /""//""//""//""//""//""/I    /""//""//""//""//""//""/I    /""//""//""//""//""//""/I   /""//""//""//""//""//""/I   /""//""//""//""//""//""/I   < 2+7'𓓓ot% /@,gW_O+!5!##5!#!#TT,T,TTAT% *@'gW_O+#!5!##5!TԨT,%TT% *@'gW_O+#!!#!#TT,%TkAT"@gW_O+!5!!5!TTTT .@+gW_O+!533!33!5!TTTTAT *@'gW_O+!5!3!533,TTTT *@'gW_O+!3!5!33,TTkTA%@v+#3#3TTTT%*% >@; g W _ O +!533!33##5!#!#TTT,T,TATAT% 2@/gW_O+!533#3##5!TTTT,T**T% 2@/gW_O+#3!33#!#TTTT,%AAT% $@!W_O+##5!###TTT%ATTA% "@W_O+##5!##TTT%ATkA% "@W_O+#!###TTT%TA% @W_O+#!5!!%ATT%@W_O+#!5!%AT% '@$W_O+#!5!33,T*%ATA%@W_O+#!!%T% '@$W_O+#33!!*T,%AT% )@&W_O+#!5!3!!,T,%ATAT% @W_O+#!5!!VT%%V@W_O+#!5!VT%% &@#W_O+#!5!3#VT*%A%@W_O+#!!VT%% &@#W_O+##3!!VT*%% )@&W_O+#!5!3!!VT%% *@'gW_O+!5!#!5!!TTTTT%V (@%gW_O+#!5!5!5!VT,%TTT% (@%gW_O+#!!!!VT,%TTTK< @W_O+#53#53ᖖ,<8@v+#3#3XP%@v+#3%% @W_O+#!5!!%%@W_O+#!5!%%@W_O+#!!%<@W_O+!5!T<<V@W_O+!5!V<<"@Wg_O+!5!!!V,<*T<E '@$W_O+#53#53#53#53qqqqqqqq<~ 5@2v+#3#3#3#3R,D,D,D,<@W_O+!5!<!<7 "@W_O+#53#53#53ȆȆ<V )@&v+#3#3#3dddf@v+#3f<!@W_O+!5!3!T<<@W_O+!5!3V<%@v+##3#VT**%Ak<@W_O+!3!V<%@v+#3%% )@&W_O+#!5!3!!%%$@!W_O+#!5!3%%$@!W_O+#3!!%% 1@.Wg_O+#!5!33!!,T*%*T% (@%Wg_O+#!5!!!VT,%*T< (@%Wg_O+!5!3!!V,T,<T% .@+Wg_O+#!5!3!!VT,T,%T% (@%Wg_O+#!5!5!!%AT*< (@%Wg_O+!5!5!3!V<*TA% .@+Wg_O+#!5!3!!%ATA% 0@-Wg_O+#!5!3!!#VT*%T*%V @YaQ!#+%4&&##532#FvF**]\TdFvFT\]% @YaQ!#+%46633#"#\]**FvFTd]\TFvFfV $@!YaQ !+5326653#**FvFT\]fTFvF?]\f &@#YaQ   +"&&5333X]\TFvF*f\]?FvFTpX"@ Lv+#5533#-----pwwXwWWwpX@Lv+#53X--+pw7pX@Lv+#53--+-pwwKf @W_O+#53#53ᖖ,fTTT8V@v+#3#3VTTTTXP%V@v+#3VTT%% @W_O+#!5!!VT%ATT%V@W_O+#!5!VT%AT%@W_O+#!!VT%Tf@W_O+!5!TfTfV@W_O+!5!VfT<"@Wg_O+!5!5!5!,<*T*fE '@$W_O+#53#53#53#53qqqqqqqqfTTTTTTTV~ 5@2v+#3#3#3#3VTTTTTTTTR,D,D,D,f@W_O+!5!fT!f7 "@W_O+#53#53#53ȆȆfTTTTTVV )@&v+#3#3#3VTTTTTTdddfV@v+#3VTTf%@v+#333*T*%Af!@W_O+!5!3!T,T,fTAfV@W_O+!5!3V,TfTAf@W_O+!3!T,f%V@v+#3VTT%% )@&W_O+#!5!3!!VT,T,%ATAT%V$@!W_O+#!5!3VT,T%ATA%$@!W_O+#3!!VTT,%T% 1@.Wg_O+#!5!533!!*T,%AT*% (@%Wg_O+#!5!5!!VT,%AT*< (@%Wg_O+!5!5!3!,T,<*TA% .@+Wg_O+#!5!3!!VT,T,%ATA% (@%Wg_O+#!5!!!%*T< (@%Wg_O+!5!3!!V<T% .@+Wg_O+#!5!3!!%T% 0@-Wg_O+##5!5!3!!VT*%*TAf &@#W_O+!533333TTTTfTAAf #@ W_O+!53333,TTTfTAAf #@ W_O+!3333,TTTfA% )@&W_O+#!5!3!!VT%ATATf!@W_O+!5!3!TfTA% &@#W_O+#!5!3#VT*%ATAkf@W_O+!5!3VfTA% &@#W_O+##3!!VT*%ATf@W_O+!3!Vf% )@&W_O+#!5!3!!,T,%<!@W_O+!5!3!T,T,<% '@$W_O+#!5!33,T*%<V@W_O+!5!3V,T<% '@$W_O+#33!!*T,%<@W_O+!3!T,< *@'gW_O+!5!3!!5!T,T,TTTV (@%gW_O+!5!5!5!3V,,TTTT (@%gW_O+!3!!!T,,TT%3@0W_ O +##533333###TTTTTT%ATAATA% (@%W_O+##533#3TTTT%ATA*% (@%W_O+#3#33#TTTT%*T% )@&W_O+#!5!3!!%ATAT%$@!W_O+#!5!3%ATA%$@!W_O+#3!!%T% )@&W_O+#!5!3!!VT,T,%%V$@!W_O+#!5!3VT,T%%$@!W_O+#3!!VTT,%%8@5gW_ O +#!5!5!5!3!!!!VT,,T,,%TTTTTT%V .@+gW_O+#!5!5!5!3VT,,T%TTT% .@+gW_O+#3!!!!VTT,,%TTT3%$p LK PX@'riW`P@(iW`PY@ $('+%3##5#535&&546632&32654&#"TP_r>qJJq>r_[JJ[[JJ[NNL bGn==nGb ZZJJZZJPU%J@GLgiYaQ%$&&&+!#5#"&&5466327#654&&#"3T`6}nCj==jCA7eeN(E**E''E*}YA_n=nGGn=^*XL0K))K00K)V+;LKPX@78L@ 78LYKPX@)i iaMMa NN@/ii   iaMMa NNY@<<554&&#"399pp940! 2#SEB89D ([SS[((\R%!(), _`BWNN~Y>I;0Fg'b+-7^@cf*R#0:- %@"_GMHN &! +!#"&&5466333#3&MBI!!JATT%WNLW' K< .7GG@D%$7 LiiaMMaRN56E&)E&$ +$#"&'7326654&'#1&5467&546632.#"31$33>54&## +`VT[#B#1*:;:IC+`VT[#B#1*:;:I;A -1;A -1jpJR"4D5'(/0=1 =S,pJR"4D5'(/0=1 =S\9939993Z>ddD@Y*:+;Lii i Y aQ  > =860.(&& +D6&&546632#>54&&#"3.546632.#"3267#ӊKKYYKKYAc66cAAc66cA7@@7=<H  D:8UddUUddUNAvNNvAAvNNvAD$THHS$)/1./1 4#F.-6hdD@]"L i   ig Y aQ...6.51/+)('&%$#& +D#"&&546636654&&#"36#'##32'32654&#~HHRRHHR:Z22Z::Z22Z:}>e4 ToAC.IRRIIRRI5_<<_55_<<_52m[[>;7%IP :@7 LW_O +!###%3#'#'#3bTbOT )) TO6 M4M;;xh.8dD@-iYaQ& +D&&546632#6654&#"3Y11Y::Y11Y:2>>22>>2/T67T//T76T/M;11<<11;JV@LN +#3VTTjJV@g_LN +#3#3VTTTTf #@ _JM_GN +3###5353UTTjMMf 5@2 gg_GN +#3##5#535#5353񜜜TTM]MM]MK.HS^hr@XM @-!ljb`B/ LKPX@,  g  a"MaN@0  g  a"MMa#NY@.ii__TTIIiriq_h_gT^T]ISIRHHGFED$)$$+#&'#"&5467##&'#"&5467&5463267#5!&5463267#5!6654&# 6654&#7&'3 7&'32?X{$)'gYIGWD8AZP)8,5,#7)8,5,#;aF"&4+;aF"&4+^~Y>I')+dR(_/~Y>I')+dR3z9`UfaP>, _`BWNtSUfaP>, _`BWNN;0Fg'b+-7;0Fg'b+-7^@cf*R#0:@cf*R#0:?KPX@gMN@Wg_OY+!!#3 TTNR P@LKPX@gMN@Wg_OY+7'!#3!=8X8;.TT99R P@LKPX@gMN@Wg_OY+!#3!8g8?TT99MD YKPX@ggMN@!Wgg_OY@ +!!!#3DFTT/NNR k@LKPX@ggMN@!Wgg_OY@  +7'7!#3!!7'=8X8TTI\\99NQQ6LKPX@ MN@W_OY+3#TTw)07A@>'-43,  La"M#N)(+'.'#5&&'7.54667535&'665X8gvLW%%WLTRZ"@@9FP""PFT,88,,4@A3-P9;{C8g8|PP99;9 ,@) L JIW_O+7'!'7!=8X8:8g8|79999;9x#dd5+\@  2+'%%7'w--JJI$ 7@4 L JIgW_O+7'7!'7!!7'!=8X88g87~]7]\9999;9՟QQQ-@* L J IW_O+7'%!!'78X8gq8g899;'N9;99D8@5 LJIgW_O+7'%!!!!'78X8gM ]\8g899;NQQN9;99(@%LJIW_O+!!i:8X8N9rt9(@%LJIW_O+!!0@:8X8N9rt9V Y@  LKPX@gMN@Wg_OY@ +3#!TT/:8X8PP9rt9 ,@) L JIW_O+7'!!=8X8::8X8H999rt9 ,@) L JIW_O+!!8g8:8X8799K9rt93 B@? LhMa#N   +!!!#"&5463G:8X8vb&&..&&. N9rt9io$*+$$+*$V6LKPX@ MN@W_OY+3#TTbw ;@ LKPX@ MN@W_OY+3# TTbw)07@@=7-,%$!  1L"Ma#N+$#5&&$'.5466753&&'56654&'%WLT8vFP""PFTKT ;;3LW%,88,A34@b0QQQt9{BL8G3LY+VV29@1,;W@T" L! JI   iYaQ;;$#$+$%$" +#"&'&&#"#"&'&&#"66766323276632325>SI"A)! $-#>+! ,-:8X8#!"A)!.>("A("GHX"$"!!% 9tt9 "$2'"$R_X@U^41.L_32J0/I i Y aQYWSQLJFDA?;9$%$#$) +'#"&'&&#"#"&'&&#"#"&'&&#"667663232766323267>323267667uX88"!"A)!->(#B'! $-$=*" )*;8X8"!"A)!->("A)! $-$=*" )*9 "$1("$"!!% 9tt9 "$1("$"!!% [b@_74 1L65J32I  i   Yi  a Q[ZVTOMIGDB><$%$#$$+67>&#"&'&&#"#"&'&&#"#"&'&&#"667663232766323267>323 =1/,"!"A)!->(#B'! $-$=*" )*;8X8"!"A)!->("A)! $-$=*"{  N"$1("$"!!% 9tt9 "$1("$"!!%~*@Lv+3#_tWoX82t9~ &@#  Lv +' # 7TX8gX8k9:3t9>-";@8iYgaQ"!$#$$!+!"#"&'&&#"#'46323267663v@M*,!O#1&'TUH!O#1 0cLN '-%AO' +ARKPX> L> LYKPX@6  iii    ea"N@<  iii  i  ea"NY@BBBRBQKIA@<:%"""%%&&+6&554663232654&&#"#"'&#"#4632326546632#"&'#>554&&#"3FB89D ([SN]+SICO7#&!USIDO7"&"=lp95/" 3"(N_HU%%UH*Wm{82viHXF2))HXF2))CIhu4M83|/23.8(;Q@NL;JI  iYaQ:9$%$"$#$) +'#"&'&&#"#"&'&&#"#46323267>323267667uX8:#!"A)!.>("A("GUSI"A)! $-#>+! ,-9 "$2'"$RHX"$"!!% -D1C@@ iYaQ10$"$$$"$ +326'3#"&'&&#"#"&'&&#"#&6323267663M&<.3TaU)\"-$(*C,4M&<.3TaU)\"-$(*C,##-%HX'"%##-%HX'"%[[@XZ LK[JI  i   Yi  a QUSOMHFB@=;$$%$#$)+'#"&'&&#"#"&'&&#"#"&'&&#"'567663232766323267>323267667.X88"!"A)!->("A)! $-$=*" =1/,"!"A)!->(#B'! $-$=*" )*9 "$1("$"!!%  N"$1("$"!!% a @_+N+#3UR jS6a-KPX@ _0N@W_OY+#3aj RSx  P9^:?j2+'788;;ij2+'78/;j2+'7'7Ҡ87/;;;9oV>:oV? 5+De0QdDKPX@pYbR@YbRY@ # +D&73326653#?TS?8BQ 7?GcA 5+/yNB:nCm;k+dD@ L IYaQ%% +D6654&#"56632 $ 342>G< [5+-C !j ,dD@!LWaQ  +D&5473#M92 4w}t6dD@+LYbR% +D&'5326553#.)TE7tM >L:A A5+}  dD@Y_O$ +D&54632#M9y $2xeHDZ<@ ExP 2dD@'YaQ   $ +D&54632#2&54632#!!''!!'!!''!!'%##%%##%t^ &dD@YaQ $ +D&54632#)))&''&c_2+'7;:>>c_2+'7;!>R^2+'7'7*87$:::V2+''7AZ[@2RP2Y2+'77Ǜ?[Z&3QSDQdDKPX@pYbR@YbRY@ # +D&73326653#?TS?8BQ 7? 8dD@-iYaQ   $ +D&54632#6654&#"3??NNA@O$$##:HH;;HH:M ! NdDLKPX@'rriYbRKPX@(riYbR@)iYbRYY@#$$ +D&'&&#"#&546323254'3#\1V6,* V7+  2> 0= dD@W_O +D!5!4N>dD@3LiYaQ% +D&'7326545# :" ')!T!)C7< g2,-8< 2dD@'LJYaQ* +D&54673267#CZ=AJ;(:<.''F #' 7Gc *@'ia"N   $+&54632#6654&#"3??NO@@O$$##;HH::HI:M  !j*XZ *I 5+$4=dD@2LJYaQ(+D'7&54632# &54632#8!!''!!'Y!!''!!'a;%##%%##%Cd0@K"PX@fN@YbRY@ $+&7332654'3#>^  " ]?8BQ  7?Di0".*ư5+?e0".)ư5+De1".2ư5+/y".0ư5+9o7",*Ͱ5+9o7",)Ͱ5+9o8",2Ͱ5+/y",0Ͱ5+D{d1@.LJYaQ"+'7&&733266'3#8~=T%S=:Ro:p63 36D{d1@.LJYaQ"+'7&&733266'3#88 =T%S=::o;63 36D{$A@>  LiYaQ$#"%%+6654&#"56632&&733266'3# % 342>H<=T%S=; [4+-D 163 56D{V-KPX@2rr~i   e a"NKPX@8rr~i j Y a   QKPX@9r~i j Y a   Q@:~i j Y a   QYYY@-,)(%#! #"$ +&'&&#"#&6323254'3#&&733266'3#1V70* U6+=T%S=: 8H  /<{63 369  2+'7''78HAZ[@Kn:o2RP29~  2+'7''7j~55#7#3D0 oo4)wwLgj2UU[ICntp77@4 LW_O+!33#3'53#'l]mlTnmShm]1[VR!*D@A!LiiW_O(&#"  +%!"5435476322'35654&#"'354&#"J@,*@@*,@<#&�*##+R8={5%##%5{=8_{!))!XV2+X*XV2+'7X3 3+11YV2+YVVXV2+X3%3 11\h84_<L>dLX%\XDXXX X X X X X X X X X X X X X X X X X X X X X X XXMX9X9X9X9X9X9XDXXDXXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXVX4X4X4X4X4XCXXCX`X`X`X`X`X`X`X`X`X`X`X`X#X#XIXIXhXeXhXhX$X+XEXEXEXEXEXEX2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X2X'X2XXYXYX2XQXQXQXQX3X3X3X3X3X3X XXXXXXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGXGX XXXXXX"XXXXXXXXX*X*X*X*X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1X1XXVXBXBXBXBXBXBX?X:XX?X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X6X3X;X;X;X;X;XWX XXmXmXmXmXmXmXmXmXmXmXmXmXmXAXAXAXmXmXpXpXpXpXpX(XQXQXQXQXQXQXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDX0XDXXJXJX=XlXlXlXlXKXKXKXKXKXKXHX6X6X6X6X6XQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQXQX-XXXXXX8XXXXXXXXXTXTXTXTXlXgXxX|XXyXvXrXjX XMXMXVXVXVXXUXUXUXX@XEXEXEX4X4X+X+XCX2X<XYX9XX-X-X X"XBX)X#X XKXYXXXX X3X2XJX`X`X#XXXXX X X@X`XX X XXUXX@XEXEX2XJX-X-X-XBXXXX X1X9XTXVXVXVXX6X6X6XXAXEXEXEX4X4X+X+XCXDX<XJXBXXXX#X8XBX+X#X XKXYXXXX XKX2XJXmXmXAX XXX X X XAXWXX1X1XX6XXAXEXEXDXJXXXXBXX@X@X;XXJXQXQXQXmXXQX(X@X(XXYXXXDXVXX<XX#X XMXVXXUX*XCX2X`XIXX+XEX!X2X<XYX+XXX X"XXXX[XHXdX}XX}X`XXIX;X@XXDXAXMX1X2XXmXXDXXMXDXXDX!XDX9XAXDX5XX XXAXXAXAXXDX X;XAX1XXXXXIXxX|X|X|X2X`X3X@X/X9X9X6X1X9X2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%X XXXXXXXXXXXXXXXXXHXXXXXXXXXX3X5XXX)XTXX.X.XXXXXiXiXXXXX]X]XXXgXgXIXXX XXDXJXDXXX(XXXX~XXXXXXXXXXXXXXXXXdXXX^XXX~XX*X*XXRXRXXXXBX*X3X+XX!X<X<XXGXXXFX9XXXXGXGX:XXXKXXXX=X;XDX8XXXXEX-XXX!X!XWXWXXXXXJX?XXXXXGX:XGX:X XXXXXXXXXXBX.XXXXXXXXXXXXXXXXXXX,X XX,XXXXXX,XXXXXX<XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXKXXXXXXXXXXXX!XXXXXXXXXXXXXXXXXXXXXXXXXXKXXXXXXXXXXXX!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX3XXXX-XKXXXXhXXXfXfXXXRXRXXRXXXXdXXdXdXXdXdXXdXdXdXXXXX\XXXXXXXXX3XXXXXXXAXXXXXXXXXXXXXXXXXXX ?9:DG/:m}eZXxXXXXRXXXXXXXXGXXX$CD?D/999/DDDD9999XDtV((((Pbt &8J\nXjZl~ 2n,>Pj| \n.Z(:L^p , > n z : ` r : L ^ p   | f xB*r$Ln6HZl~ .~NZl0Tfx"4 ,8DT`lxfr~dLXd2"v "x,>Jr~ b n z !6!H!!!"D""""#$#0#x##########$$ $n$z$$$$$$%*%6%&:&&'>'J'V'b'''(p(|(()()x)*4*@********+ + +,+8+D+++++,,,,n,z,,,,,,--0-l-x--------.../&/00@0z011:1B11111222:2L2^222223(3:3f3n3v3~3333344T4\44455V556.66676777778d89*9|9:::::::;;;(;:;L;^;p;;;;;;f>>>>>??J?v?~??????@2@:@p@@@A0ApABBXBBCC`ChCtC|CCD>DEEbFF$F0F\\](]]^^^_V_^_f_n_v_~_____``:`aaLab>bjbcZcjczccccccccdd ddd"d*d2d:dBdJd`dndddeeefgg0gBgTgfgggghhi8i\iiiiij,jjkk(k^klkkkl lPllmmRmxmmmnn&n6nFn`nhnnnnnno@oXooopp>phpppqq.qjqqr&rZrrss$szsst>tuDvww4wlwwwwx x$x,x4x4xxyRyzzPz{{^{{{||4|^|x|} }x}~ ~$~B~~(@j*J`ʁ0LhȂ>l>Ȅ„҅Zʆ"PzƆJ~Ԉ0H`x؈ 6Ld|ĉډ "@f@ĔFtҖ.LЗ 4Zė8fҘHx̙&JjLfқ6VlDnȝ"T|О2PlƟ *D^.\r֡ :`>h£Dl.N|ʥ4bHv§ĭNd^Bv(n*Ʋ0h:f hDʷVȸBʹRtXܿH:BLVhzRBl~ª¾\@zĶ\nŀŒŤŶ,lǖDz4r&&c6hD8 8CIe w   p $. R 8` $  "  6 J  `Copyright 2019 by Rune Bjrners. All rights reserved.Victor MonoMedium1.410;UKWN;VictorMono-MediumVictor Mono MediumVersion 1.410VictorMono-MediumRune Bjrnersrubjo.github.io/victor-monoCopyright 2019 by Rune Bjrners. All rights reserved.Victor Mono MediumRegular1.410;UKWN;VictorMono-MediumVictor Mono MediumVersion 1.410VictorMono-MediumRune Bjrnersrubjo.github.io/victor-monoVictor MonoMedium2c$     bc%&d'(e !)*"#$+%&,'()*+,--..//01012345f26789:;g<=>?@ABCDE345FGH6IJKL7MNOP8QRhSTUVWXYZ[\]^_`abc9:defg;<hijkl=mnDiopqrstukvwxyzl{j|}~nmEFoGHprsqIJKLtvwuMNOPQxRy{|z}STUVWX~YZ[\]      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     " ? ^`>@B  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEF !aAGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~# _      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOCPQRSTUVWXYZ[\]^_`abcdefghijklAbreveuni1EAEuni1EB6uni1EB0uni1EB2uni1EB4uni01CDuni1EA4uni1EACuni1EA6uni1EA8uni1EAAuni1EA0uni1EA2AmacronAogonek Ccircumflex CdotaccentDcaronDcroatEcaronuni1EBEuni1EC6uni1EC0uni1EC2uni1EC4 Edotaccentuni1EB8uni1EBAEmacronEogonekuni1EBC Gcircumflexuni0122 GdotaccentHbar Hcircumflexuni01CFuni1ECAuni1EC8ImacronIogonekItilde Jcircumflexuni0136LacuteLcaronuni013BNacuteNcaronuni0145Enguni01D1uni1ED0uni1ED8uni1ED2uni1ED4uni1ED6uni1ECCuni1ECEOhornuni1EDAuni1EE2uni1EDCuni1EDEuni1EE0 OhungarumlautOmacronRacuteRcaronuni0156Sacute Scircumflexuni0218uni1E9ETbarTcaronuni0162uni021AUbreveuni01D3uni01D7uni01D9uni01DBuni01D5uni1EE4uni1EE6Uhornuni1EE8uni1EF0uni1EEAuni1EECuni1EEE UhungarumlautUmacronUogonekUringUtildeWacute Wcircumflex WdieresisWgrave Ycircumflexuni1EF4Ygraveuni1EF6uni1EF8Zacute Zdotaccentabreveuni1EAFuni1EB7uni1EB1uni1EB3uni1EB5uni01CEuni1EA5uni1EADuni1EA7uni1EA9uni1EABuni1EA1uni1EA3amacronaogonek ccircumflex cdotaccentdcaronecaronuni1EBFuni1EC7uni1EC1uni1EC3uni1EC5 edotaccentuni1EB9uni1EBBemacroneogonekuni1EBD gcircumflexuni0123 gdotaccenthbar hcircumflexuni01D0 i.loclTRKuni1ECBuni1EC9imacroniogonekitildeuni0237 jcircumflexuni0137lacutelcaronuni013Cnacutencaronuni0146enguni01D2uni1ED1uni1ED9uni1ED3uni1ED5uni1ED7uni1ECDuni1ECFohornuni1EDBuni1EE3uni1EDDuni1EDFuni1EE1 ohungarumlautomacronracutercaronuni0157sacute scircumflexuni0219tbartcaronuni0163uni021Bubreveuni01D4uni01D8uni01DAuni01DCuni01D6uni1EE5uni1EE7uhornuni1EE9uni1EF1uni1EEBuni1EEDuni1EEF uhungarumlautumacronuogonekuringutildewacute wcircumflex wdieresiswgrave ycircumflexuni1EF5ygraveuni1EF7uni1EF9zacute zdotaccentuni2090uni2091uni2071uni207Funi2092uni2094uni2093uni0410uni0411uni0412uni0413uni0403uni0490uni0414uni0415uni0400uni0401uni0416uni0417uni0418uni0419uni040Duni041Auni040Cuni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni040Euni0424uni0425uni0427uni0426uni0428uni0429uni040Funi042Cuni042Auni042Buni0409uni040Auni0405uni0404uni042Duni0406uni0407uni0408uni040Buni042Euni042Funi0402uni0462uni046Auni0498uni04C0uni04C1uni04D0uni04D2uni04D4uni04D6uni04DCuni04DEuni04E2uni04E4uni04E6uni04ECuni04EEuni04F0uni04F2uni04F4uni04F8uni0414.loclBGRuni041B.loclBGRuni0424.loclBGRuni0430uni0431uni0432uni0433uni0453uni0491uni0434uni0435uni0450uni0451uni0436uni0437uni0438uni0439uni045Duni043Auni045Cuni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni045Euni0444uni0445uni0447uni0446uni0448uni0449uni045Funi044Cuni044Auni044Buni0459uni045Auni0455uni0454uni044Duni0456uni0457uni0458uni045Buni044Euni044Funi0452uni0463uni046Buni0499uni04BBuni04C2uni04D1uni04D3uni04D5uni04D7uni04DDuni04DFuni04E3uni04E5uni04E7uni04EDuni04EFuni04F1uni04F3uni04F5uni04F9uni0432.loclBGRuni0433.loclBGRuni0434.loclBGRuni0436.loclBGRuni0437.loclBGRuni0438.loclBGRuni0439.loclBGRuni045D.loclBGRuni043A.loclBGRuni043B.loclBGRuni043F.loclBGRuni0442.loclBGRuni0446.loclBGRuni0448.loclBGRuni0449.loclBGRuni044C.loclBGRuni044A.loclBGRuni044E.loclBGRuni0431.loclSRBuni0433.loclSRBuni0434.loclSRBuni043F.loclSRBuni0442.loclSRBuni0448.loclSRBAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9 Alphatonos EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos Omegatonos IotadieresisUpsilondieresisuni03CFalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhouni03C2sigmatauupsilonphichipsiomega iotatonos iotadieresisiotadieresistonos upsilontonosupsilondieresisupsilondieresistonos omicrontonos omegatonos alphatonos epsilontonosetatonosuni03D7uni2095uni2096uni2097uni2098uni2099uni209Auni209Buni209C zero.ss01uni2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089 zero.dnomone.dnomtwo.dnom three.dnom four.dnom five.dnomsix.dnom seven.dnom eight.dnom nine.dnom zero.numrone.numrtwo.numr three.numr four.numr five.numrsix.numr seven.numr eight.numr nine.numruni2070uni00B9uni00B2uni00B3uni2074uni2075uni2076uni2077uni2078uni2079uni215Funi2189uni2153uni2154uni2155uni2156uni2157uni2158uni2159uni215Auni2150 oneeighth threeeighths fiveeighths seveneighthsuni2151uni2152 exclamdbluni208Duni208Euni2308uni230Auni2309uni230Buni207Duni207Euni00ADuni2015hyphen_hyphen_greater.ligahyphen_bar.ligahyphen_greater.ligahyphen_greater_greater.ligahyphen_less.ligahyphen_less_less.ligahyphen_asciitilde.ligaperiod_hyphen.ligaperiod_equal.ligacolon_colon.ligacolon_equal.ligacolon_greater.ligacolon_less.ligasemicolon_semicolon.ligaexclam_equal.ligaexclam_equal_equal.ligaquestion_equal.liganumbersign_numbersign.liga%numbersign_numbersign_numbersign.liga0numbersign_numbersign_numbersign_numbersign.ligaslash_equal.ligaslash_equal_equal.ligaslash_greater.ligaslash_backslash.ligabackslash_slash.ligaunderscore_underscore.ligauni27E8uni27E9 anoteleiauni037Euni00A0Euroliraelementuni208Cuni207C equivalence existentialgradientuni208Buni207B notelement notsubsetuni2285emptyset logicaland logicalor intersectionunionuni00B5uni208Auni207A reflexsubsetreflexsuperset propersubsetpropersuperset universalarrowupuni2197 arrowrightuni2198 arrowdownuni2199 arrowleftuni2196 arrowboth arrowupdn arrowdblright arrowdblbothuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockupblockuni2594uni258Funi258Euni258Dlfblockuni258Buni258Auni2589rtblockuni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259Fltshadeshadedkshadeuni2566uni2557uni2554uni2550uni2569uni255Duni255Auni2551uni256Cuni2563uni2560uni2565uni2556uni2553uni2530uni2512uni2527uni250Euni251Funi2541uni252Funi2511uni2529uni250Duni2521uni2547uni2564uni2555uni2552uni254Duni254Funi257Buni2533uni2513uni250Funi2501uni2578uni257Euni2509uni250Buni257Auni2505uni2507uni2579uni253Buni251Buni257Funi2517uni2503uni254Buni252Buni2523uni2545uni252Duni2535uni253Duni2532uni253Auni254Auni2543uni256Euni256Duni256Funi2570uni2573uni2572uni2571uni254Cuni254Euni2577uni252Cuni2510uni250Cuni2500uni2574uni257Cuni2508uni250Auni2576uni2504uni2506uni2575uni257Duni2534uni2518uni2514uni2502uni253Cuni2524uni251Cuni2546uni252Euni2536uni253Euni2531uni2539uni2549uni2544uni2568uni255Cuni2559uni2540uni2538uni2526uni251Auni251Euni2516uni2548uni2537uni252Auni2519uni2522uni2515uni2567uni255Buni2558uni256Buni2562uni255Funi2542uni2528uni2520uni253Funi2525uni251Duni256Auni2561uni255Efemalemaleampersand_ampersand.ligabar_hyphen.ligabar_hyphen_greater.ligabar_hyphen_less.ligabar_equal.ligabar_equal_greater.ligabar_greater.ligadollar_greater.ligaplus_plus.ligaplus_plus_plus.ligaplus_greater.ligaequal_colon_equal.ligaequal_exclam_equal.ligaequal_equal.ligaequal_equal_equal.ligaequal_equal_greater.ligaequal_greater.ligaequal_greater_greater.ligaequal_less_less.ligaequal_slash_equal.ligagreater_hyphen.ligagreater_hyphen_bar.ligagreater_hyphen_greater.ligagreater_colon.ligagreater_equal.ligagreater_equal_greater.ligagreater_greater_hyphen.ligagreater_greater_equal.ligaless_hyphen.ligaless_hyphen_hyphen.ligaless_hyphen_bar.ligaless_hyphen_greater.ligaless_hyphen_less.ligaless_exclam_hyphen_hyphen.liga less_bar.ligaless_bar_greater.ligaless_dollar.ligaless_dollar_greater.ligaless_plus.ligaless_plus_greater.ligaless_equal.ligaless_equal_equal.ligaless_equal_greater.ligaless_equal_less.ligaless_greater.ligaless_less_hyphen.ligaless_less_equal.ligaless_asciitilde.ligaless_asciitilde_greater.ligaless_asciitilde_asciitilde.ligaless_slash.ligaless_slash_greater.ligaasciitilde_hyphen.ligaasciitilde_at.ligaasciitilde_greater.ligaasciitilde_asciitilde.liga"asciitilde_asciitilde_greater.ligauni0374uni0375uni02BCuni0308uni0307 gravecomb acutecombuni030Buni0302uni030Cuni0306uni030A tildecombuni0304 hookabovecombuni0312uni031B dotbelowcombuni0326uni0327uni0328 uni030A.casetonos tonos.case dieresistonos brevecombcy uni03060301 uni03060300 uni03060309 uni03060303 uni03020301 uni03020300 uni03020309 uni03020303uni03060301.caseuni03060300.caseuni03060309.caseuni03060303.caseuni03020301.caseuni03020300.caseuni03020309.caseuni03020303.caseuniE0A0uniE0A1uniE0A2uniE0B0uniE0B1uniE0B2uniE0B3LIGTTMM jJ.x<TTMM #jJ..xJTTMM//TTMM  jJ.^x<TTMM{//IIcCC[RqYq, UXEY KQKSZX4(Y`f UX%acc#b!!YC#DC`B-, `f-,#!#!-, dBCC ``BCB%CCTx #CCadPxC`B!e!CCB C#BC`B#PXeYC`B-,+CX#!#!CC#PXeY d P&Z( CEcEEX!%YR[X!#!X PPX!@Y 8PX!8YY  CEcEad(PX! CEcE 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY% CcRXK PX! CKPX!Kac CcbYYdaY+YY#PXeYY dC#BY-, E %ad CPX#B#B!!Y`-,#!#!+ dbB #BEX CEc C`Ec*! C +0%&QX`PaRYX#Y!Y @SX+!@Y#PXeY-, C+C`B-, #B# #Babfc`*- , E Ccb PX@`Yfc`D`- , CEB*!C`B- ,C#DC`B- , E +#C%` E#a d PX!0PX @YY#PXeY%#aDD`- , E +#C%` E#a d$PX@Y#PXeY%#aDD`-, #B EPX!#!Y*!-,EdaD-,` CJPX #BYCJRX #BY-, bfc c#aC` ` #B#-,KTXdDY$ e#x-,KQXKSXdDY!Y$e#x-,CUXCaB+YC%B%B%B# %PXC`%B #a*!#a #a*!C`%B%a*!YCGCG`b PX@`Yfc Ccb PX@`Yfc`#DC>C`B-,ETX#B E#B #`B #B `aBBB` C`#B++"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-+,# bfc`KTX# .]!!Y-,,# bfc`KTX# .q!!Y--,# bfc&`KTX# .r!!Y- ,+ETX#B E#B #`B `aBB`++"Y-!, +-", +-#, +-$, +-%, +-&, +-', +-(, +-), +-*, +-., <`-/, `` C#`C%a`.*!-0,/+/*-1, G Ccb PX@`Yfc`#a8# UX G Ccb PX@`Yfc`#a8!Y-2,ETXEB1*EX0Y"Y-3,+ETXEB1*EX0Y"Y-4, 5`-5,EBEcb PX@`Yfc+Ccb PX@`Yfc+D>#84*!-6, < G Ccb PX@`Yfc`Ca8-7,.<-8, < G Ccb PX@`Yfc`CaCc8-9,% . G#B%IG#G#a Xb!Y#B8*-:,#B%%G#G#a B C+e.# <8-;,#B%% .G#G#a #B B C+ `PX @QX  &YBB# C #G#G#a#F`Cb PX@`Yfc` + a C`d#CadPXCaC`Y%b PX@`Yfca# &#Fa8# CF% CG#G#a` Cb PX@`Yfc`# +#C`+%a%b PX@`Yfc&a %`d#%`dPX!#!Y# &#Fa8Y-<,#B & .G#G#a#<8-=,#B #B F#G+#a8->,#B%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%acc# Xb!Ycb PX@`Yfc`#.# <8#!Y-?,#B C .G#G#a ` `fb PX@`Yfc# <8-@,# .F%FCXPRYX +.0+-~,>+@+-,>+A+-,>+B+-,>+@+-,>+A+-,>+B+-,?+.0+-,?+@+-,?+A+-,?+B+-,?+@+-,?+A+-,?+B+-, EPXEX#!!YYB+e$PxEX0Y-KRXYcpB`P@4$*B@fUE9) *B@l]M?1" * B  *B@@@@@ *D$QX@XdD(QXXDY'QX@cTXDYYYYY@iWG;+*DdDDvedo-2023.4.6/vedo/interactor_modes.py000066400000000000000000001327061444463326400176000ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- from dataclasses import dataclass import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk __docformat__ = "google" __doc__ = """Submodule to customize interaction modes.""" class MousePan(vtk.vtkInteractorStyleUser): """ Interaction mode to pan the scene by dragging the mouse. Controls: - Left mouse button will pan the scene. - Mouse middle button up/down is elevation, and left and right is azimuth. - Right mouse button is rotate (left/right movement) and zoom in/out (up/down movement) - Mouse scroll wheel is zoom in/out """ def __init__(self): super().__init__() self.left = False self.middle = False self.right = False self.interactor = None self.renderer = None self.camera = None self.oldpickD = [] self.newpickD = [] self.oldpickW = np.array([0, 0, 0, 0], dtype=float) self.newpickW = np.array([0, 0, 0, 0], dtype=float) self.fpD = np.array([0, 0, 0], dtype=float) self.fpW = np.array([0, 0, 0], dtype=float) self.posW = np.array([0, 0, 0], dtype=float) self.motionD = np.array([0, 0], dtype=float) self.motionW = np.array([0, 0, 0], dtype=float) self.AddObserver("LeftButtonPressEvent", self._left_down) self.AddObserver("LeftButtonReleaseEvent", self._left_up) self.AddObserver("MiddleButtonPressEvent", self._middle_down) self.AddObserver("MiddleButtonReleaseEvent", self._middle_up) self.AddObserver("RightButtonPressEvent", self._right_down) self.AddObserver("RightButtonReleaseEvent", self._right_up) self.AddObserver("MouseWheelForwardEvent", self._wheel_forward) self.AddObserver("MouseWheelBackwardEvent", self._wheel_backward) self.AddObserver("MouseMoveEvent", self._mouse_move) def _get_motion(self): self.oldpickD = np.array(self.interactor.GetLastEventPosition()) self.newpickD = np.array(self.interactor.GetEventPosition()) self.motionD = (self.newpickD - self.oldpickD) / 4 self.camera = self.renderer.GetActiveCamera() self.fpW = self.camera.GetFocalPoint() self.posW = self.camera.GetPosition() self.ComputeWorldToDisplay(self.renderer, self.fpW[0], self.fpW[1], self.fpW[2], self.fpD) focaldepth = self.fpD[2] self.ComputeDisplayToWorld( self.renderer, self.oldpickD[0], self.oldpickD[1], focaldepth, self.oldpickW ) self.ComputeDisplayToWorld( self.renderer, self.newpickD[0], self.newpickD[1], focaldepth, self.newpickW ) self.motionW[:3] = self.oldpickW[:3] - self.newpickW[:3] def _mouse_left_move(self): self._get_motion() self.camera.SetFocalPoint(self.fpW[:3] + self.motionW[:3]) self.camera.SetPosition(self.posW[:3] + self.motionW[:3]) self.interactor.Render() def _mouse_middle_move(self): self._get_motion() if abs(self.motionD[0]) > abs(self.motionD[1]): self.camera.Azimuth(-2 * self.motionD[0]) else: self.camera.Elevation(-self.motionD[1]) self.interactor.Render() def _mouse_right_move(self): self._get_motion() if abs(self.motionD[0]) > abs(self.motionD[1]): self.camera.Azimuth(-2.0 * self.motionD[0]) else: self.camera.Zoom(1 + self.motionD[1] / 100) self.interactor.Render() def _mouse_wheel_forward(self): self.camera = self.renderer.GetActiveCamera() self.camera.Zoom(1.1) self.interactor.Render() def _mouse_wheel_backward(self): self.camera = self.renderer.GetActiveCamera() self.camera.Zoom(0.9) self.interactor.Render() def _left_down(self, w, e): self.left = True def _left_up(self, w, e): self.left = False def _middle_down(self, w, e): self.middle = True def _middle_up(self, w, e): self.middle = False def _right_down(self, w, e): self.right = True def _right_up(self, w, e): self.right = False def _wheel_forward(self, w, e): self._mouse_wheel_forward() def _wheel_backward(self, w, e): self._mouse_wheel_backward() def _mouse_move(self, w, e): if self.left: self._mouse_left_move() if self.middle: self._mouse_middle_move() if self.right: self._mouse_right_move() ################################################################################### @dataclass class _BlenderStyleDragInfo: """Data structure containing the data required to execute dragging a node""" # Scene related dragged_node = None # Node # VTK related actors_dragging: list dragged_actors_original_positions: list # original VTK positions start_position_3d = np.array((0, 0, 0)) # start position of the cursor delta = np.array((0, 0, 0)) def __init__(self): self.actors_dragging = [] self.dragged_actors_original_positions = [] ############################################### class BlenderStyle(vtk.vtkInteractorStyleUser): """ Create an interaction style using the Blender default key-bindings. Camera action code is largely a translation of [this](https://github.com/Kitware/VTK/blob/master/Interaction/Style/vtkInteractorStyleTrackballCamera.cxx) Rubber band code [here](https://gitlab.kitware.com/updega2/vtk/-/blob/d324b2e898b0da080edee76159c2f92e6f71abe2/Rendering/vtkInteractorStyleRubberBandZoom.cxx) Interaction: Left button: Sections ---------------------- Left button: select Left button drag: rubber band select or line select, depends on the dragged distance Middle button: Navigation -------------------------- Middle button: rotate Middle button + shift : pan Middle button + ctrl : zoom Middle button + alt : center view on picked point OR Middle button + alt : zoom rubber band Mouse wheel : zoom Right button : context ----------------------- Right key click: reserved for context-menu Keys ---- 2 or 3 : toggle perspective view a : zoom all x,y,z : view direction (toggles positive and negative) left/right arrows: rotate 45 deg clockwise/ccw about z-axis, snaps to nearest 45 deg b : box zoom m : mouse middle lock (toggles) space : same as middle mouse button g : grab (move actors) enter : accept drag esc : cancel drag, call callbackEscape LAPTOP MODE ----------- Use space or `m` as replacement for middle button (`m` is sticky, space is not) callbacks / overriding keys: if `callbackAnyKey` is assigned then this function is called on every key press. If this function returns True then further processing of events is stopped. Moving actors -------------- Actors can be moved interactively by the user. To support custom groups of actors to be moved as a whole the following system is implemented: When 'g' is pressed (grab) then a `_BlenderStyleDragInfo` dataclass object is assigned to style to `style.draginfo`. `_BlenderStyleDragInfo` includes a list of all the actors that are being dragged. By default this is the selection, but this may be altered. Drag is accepted using enter, click, or g. Drag is cancelled by esc Events ------ `callbackStartDrag` is called when initializing the drag. This is when to assign actors and other data to draginfo. `callbackEndDrag` is called when the drag is accepted. Responding to other events -------------------------- `callbackCameraDirectionChanged` : executed when camera has rotated but before re-rendering .. note:: This class is based on R. de Bruin's [DAVE](https://github.com/RubendeBruin/DAVE/blob/master/src/DAVE/visual_helpers/vtkBlenderLikeInteractionStyle.py) implementation as discussed in this [issue](https://github.com/marcomusy/vedo/discussions/788). Example: ```python from vedo import * settings.enable_default_keyboard_callbacks = False settings.enable_default_mouse_callbacks = False mesh = Mesh(dataurl+"cow.vtk") mode = interactor_modes.BlenderStyle() plt = Plotter().user_mode(mode) plt.show(mesh, axes=1) ``` """ def __init__(self): super().__init__() self.interactor = None self.renderer = None # callbackSelect is called whenever one or mode props are selected. # callback will be called with a list of props of which the first entry # is prop closest to the camera. self.callbackSelect = None self.callbackStartDrag = None self.callbackEndDrag = None self.callbackEscapeKey = None self.callbackDeleteKey = None self.callbackFocusKey = None self.callbackAnyKey = None self.callbackMeasure = None # callback with argument float (meters) self.callbackCameraDirectionChanged = None # active drag # assigned to a _BlenderStyleDragInfo object when dragging is active self.draginfo: _BlenderStyleDragInfo or None = None # picking self.picked_props = [] # will be filled by latest pick # settings self.mouse_motion_factor = 20 self.mouse_wheel_motion_factor = 0.1 self.zoom_motion_factor = 0.25 # internals self.start_x = 0 # start of a drag self.start_y = 0 self.end_x = 0 self.end_y = 0 self.middle_mouse_lock = False self.middle_mouse_lock_actor = None # will be created when required # Special Modes self._is_box_zooming = False # holds an image of the renderer output at the start of a drawing event self._pixel_array = vtk.vtkUnsignedCharArray() self._upside_down = False self._left_button_down = False self._middle_button_down = False self.AddObserver("RightButtonPressEvent", self.RightButtonPress) self.AddObserver("RightButtonReleaseEvent", self.RightButtonRelease) self.AddObserver("MiddleButtonPressEvent", self.MiddleButtonPress) self.AddObserver("MiddleButtonReleaseEvent", self.MiddleButtonRelease) self.AddObserver("MouseWheelForwardEvent", self.MouseWheelForward) self.AddObserver("MouseWheelBackwardEvent", self.MouseWheelBackward) self.AddObserver("LeftButtonPressEvent", self.LeftButtonPress) self.AddObserver("LeftButtonReleaseEvent", self.LeftButtonRelease) self.AddObserver("MouseMoveEvent", self.MouseMove) self.AddObserver("WindowResizeEvent", self.WindowResized) # ^does not seem to fire! self.AddObserver("KeyPressEvent", self.KeyPress) self.AddObserver("KeyReleaseEvent", self.KeyRelease) def RightButtonPress(self, obj, event): pass def RightButtonRelease(self, obj, event): pass def MiddleButtonPress(self, obj, event): self._middle_button_down = True def MiddleButtonRelease(self, obj, event): self._middle_button_down = False # perform middle button focus event if ALT is down if self.GetInteractor().GetAltKey(): # print("Middle button released while ALT is down") # try to pick an object at the current mouse position rwi = self.GetInteractor() self.start_x, self.start_y = rwi.GetEventPosition() props = self.PerformPickingOnSelection() if props: self.FocusOn(props[0]) def MouseWheelBackward(self, obj, event): self.MoveMouseWheel(-1) def MouseWheelForward(self, obj, event): self.MoveMouseWheel(1) def MouseMove(self, obj, event): interactor = self.GetInteractor() # Find the renderer that is active below the current mouse position x, y = interactor.GetEventPosition() self.FindPokedRenderer(x, y) # sets the current renderer # [this->SetCurrentRenderer(this->Interactor->FindPokedRenderer(x, y));] Shift = interactor.GetShiftKey() Ctrl = interactor.GetControlKey() Alt = interactor.GetAltKey() MiddleButton = self._middle_button_down or self.middle_mouse_lock # start with the special modes if self._is_box_zooming: self.DrawDraggedSelection() elif MiddleButton and not Shift and not Ctrl and not Alt: self.Rotate() elif MiddleButton and Shift and not Ctrl and not Alt: self.Pan() elif MiddleButton and Ctrl and not Shift and not Alt: self.Zoom() # Dolly elif self.draginfo is not None: self.ExecuteDrag() elif self._left_button_down and Ctrl and Shift: self.DrawMeasurement() elif self._left_button_down: self.DrawDraggedSelection() self.InvokeEvent("InteractionEvent", None) def MoveMouseWheel(self, direction): rwi = self.GetInteractor() # Find the renderer that is active below the current mouse position x, y = rwi.GetEventPosition() self.FindPokedRenderer(x, y) # sets the current renderer # [this->SetCurrentRenderer(this->Interactor->FindPokedRenderer(x, y));] # The movement CurrentRenderer = self.GetCurrentRenderer() # // Calculate the focal depth since we'll be using it a lot camera = CurrentRenderer.GetActiveCamera() viewFocus = camera.GetFocalPoint() temp_out = [0, 0, 0] self.ComputeWorldToDisplay( CurrentRenderer, viewFocus[0], viewFocus[1], viewFocus[2], temp_out ) focalDepth = temp_out[2] newPickPoint = [0, 0, 0, 0] x, y = rwi.GetEventPosition() self.ComputeDisplayToWorld(CurrentRenderer, x, y, focalDepth, newPickPoint) # // Has to recalc old mouse point since the viewport has moved, # // so can't move it outside the loop oldPickPoint = [0, 0, 0, 0] # xp, yp = rwi.GetLastEventPosition() # find the center of the window size = rwi.GetRenderWindow().GetSize() xp = size[0] / 2 yp = size[1] / 2 self.ComputeDisplayToWorld(CurrentRenderer, xp, yp, focalDepth, oldPickPoint) # # // Camera motion is reversed # move_factor = -1 * self.zoom_motion_factor * direction motionVector = ( move_factor * (oldPickPoint[0] - newPickPoint[0]), move_factor * (oldPickPoint[1] - newPickPoint[1]), move_factor * (oldPickPoint[2] - newPickPoint[2]), ) viewFocus = camera.GetFocalPoint() # do we need to do this again? Already did this viewPoint = camera.GetPosition() camera.SetFocalPoint( motionVector[0] + viewFocus[0], motionVector[1] + viewFocus[1], motionVector[2] + viewFocus[2], ) camera.SetPosition( motionVector[0] + viewPoint[0], motionVector[1] + viewPoint[1], motionVector[2] + viewPoint[2], ) # the Zooming factor = self.mouse_motion_factor * self.mouse_wheel_motion_factor self.ZoomByStep(direction * factor) def ZoomByStep(self, step): CurrentRenderer = self.GetCurrentRenderer() if CurrentRenderer: self.StartDolly() self.Dolly(pow(1.1, step)) self.EndDolly() def LeftButtonPress(self, obj, event): if self._is_box_zooming: return if self.draginfo: return self._left_button_down = True interactor = self.GetInteractor() Shift = interactor.GetShiftKey() Ctrl = interactor.GetControlKey() if Shift and Ctrl: if not self.GetCurrentRenderer().GetActiveCamera().GetParallelProjection(): self.ToggleParallelProjection() rwi = self.GetInteractor() self.start_x, self.start_y = rwi.GetEventPosition() self.end_x = self.start_x self.end_y = self.start_y self.InitializeScreenDrawing() def LeftButtonRelease(self, obj, event): if self._is_box_zooming: self._is_box_zooming = False self.ZoomBox(self.start_x, self.start_y, self.end_x, self.end_y) return if self.draginfo: self.FinishDrag() return self._left_button_down = False interactor = self.GetInteractor() Shift = interactor.GetShiftKey() Ctrl = interactor.GetControlKey() Alt = interactor.GetAltKey() if Ctrl and Shift: pass # we were drawing the measurement else: if self.callbackSelect: props = self.PerformPickingOnSelection() if props: # only call back if anything was selected self.picked_props = tuple(props) self.callbackSelect(props) # remove the selection rubber band / line self.DoRender() def KeyPress(self, obj, event): key = obj.GetKeySym() KEY = key.upper() # logging.info(f"Key Press: {key}") if self.callbackAnyKey: if self.callbackAnyKey(key): return if KEY == "M": self.middle_mouse_lock = not self.middle_mouse_lock self.UpdateMiddleMouseButtonLockActor() elif KEY == "G": if self.draginfo is not None: self.FinishDrag() else: if self.callbackStartDrag: self.callbackStartDrag() else: self.StartDrag() # internally calls end-drag if drag is already active elif KEY == "ESCAPE": if self.callbackEscapeKey: self.callbackEscapeKey() if self.draginfo is not None: self.CancelDrag() elif KEY == "DELETE": if self.callbackDeleteKey: self.callbackDeleteKey() elif KEY == "RETURN": if self.draginfo: self.FinishDrag() elif KEY == "SPACE": self.middle_mouse_lock = True # self.UpdateMiddleMouseButtonLockActor() # self.GrabFocus("MouseMoveEvent", self) # # TODO: grab and release focus; possible from python? elif KEY == "B": self._is_box_zooming = True rwi = self.GetInteractor() self.start_x, self.start_y = rwi.GetEventPosition() self.end_x = self.start_x self.end_y = self.start_y self.InitializeScreenDrawing() elif KEY in ('2', '3'): self.ToggleParallelProjection() elif KEY == "A": self.ZoomFit() elif KEY == "X": self.SetViewX() elif KEY == "Y": self.SetViewY() elif KEY == "Z": self.SetViewZ() elif KEY == "LEFT": self.RotateDiscreteStep(1) elif KEY == "RIGHT": self.RotateDiscreteStep(-1) elif KEY == "UP": self.RotateTurtableBy(0, 10) elif KEY == "DOWN": self.RotateTurtableBy(0, -10) elif KEY == "PLUS": self.ZoomByStep(2) elif KEY == "MINUS": self.ZoomByStep(-2) elif KEY == "F": if self.callbackFocusKey: self.callbackFocusKey() self.InvokeEvent("InteractionEvent", None) def KeyRelease(self, obj, event): key = obj.GetKeySym() KEY = key.upper() # print(f"Key release: {key}") if KEY == "SPACE": if self.middle_mouse_lock: self.middle_mouse_lock = False self.UpdateMiddleMouseButtonLockActor() def WindowResized(self): # print("window resized") self.InitializeScreenDrawing() def RotateDiscreteStep(self, movement_direction, step=22.5): """Rotates CW or CCW to the nearest 45 deg angle - includes some fuzzyness to determine about which axis""" CurrentRenderer = self.GetCurrentRenderer() camera = CurrentRenderer.GetActiveCamera() step = np.deg2rad(step) direction = -np.array(camera.GetViewPlaneNormal()) # current camera direction if abs(direction[2]) < 0.7: # horizontal view, rotate camera position about Z-axis angle = np.arctan2(direction[1], direction[0]) # find the nearest angle that is an integer number of steps if movement_direction > 0: angle = step * np.floor((angle + 0.1 * step) / step) + step else: angle = -step * np.floor(-(angle - 0.1 * step) / step) - step dist = np.linalg.norm(direction[:2]) direction[0] = np.cos(angle) * dist direction[1] = np.sin(angle) * dist self.SetCameraDirection(direction) else: # Top or bottom like view - rotate camera "up" direction up = np.array(camera.GetViewUp()) angle = np.arctan2(up[1], up[0]) # find the nearest angle that is an integer number of steps if movement_direction > 0: angle = step * np.floor((angle + 0.1 * step) / step) + step else: angle = -step * np.floor(-(angle - 0.1 * step) / step) - step dist = np.linalg.norm(up[:2]) up[0] = np.cos(angle) * dist up[1] = np.sin(angle) * dist camera.SetViewUp(up) camera.OrthogonalizeViewUp() self.DoRender() def ToggleParallelProjection(self): renderer = self.GetCurrentRenderer() camera = renderer.GetActiveCamera() camera.SetParallelProjection(not bool(camera.GetParallelProjection())) self.DoRender() def SetViewX(self): self.SetCameraPlaneDirection((1, 0, 0)) def SetViewY(self): self.SetCameraPlaneDirection((0, 1, 0)) def SetViewZ(self): self.SetCameraPlaneDirection((0, 0, 1)) def ZoomFit(self): self.GetCurrentRenderer().ResetCamera() self.DoRender() def SetCameraPlaneDirection(self, direction): """Sets the camera to display a plane of which direction is the normal - includes logic to reverse the direction if benificial""" CurrentRenderer = self.GetCurrentRenderer() camera = CurrentRenderer.GetActiveCamera() direction = np.array(direction) normal = camera.GetViewPlaneNormal() # can not set the normal, need to change the position to do that current_alignment = np.dot(normal, -direction) # print(f"Current alignment = {current_alignment}") if abs(current_alignment) > 0.9999: # print("toggling") direction = -np.array(normal) elif current_alignment > 0: # find the nearest plane # print("reversing to find nearest") direction = -direction self.SetCameraDirection(-direction) def SetCameraDirection(self, direction): """Sets the camera to this direction, sets view up if horizontal enough""" direction = np.array(direction) CurrentRenderer = self.GetCurrentRenderer() camera = CurrentRenderer.GetActiveCamera() rwi = self.GetInteractor() pos = np.array(camera.GetPosition()) focal = np.array(camera.GetFocalPoint()) dist = np.linalg.norm(pos - focal) pos = focal - dist * direction camera.SetPosition(pos) if abs(direction[2]) < 0.9: camera.SetViewUp(0, 0, 1) elif direction[2] > 0.9: camera.SetViewUp(0, -1, 0) else: camera.SetViewUp(0, 1, 0) camera.OrthogonalizeViewUp() if self.GetAutoAdjustCameraClippingRange(): CurrentRenderer.ResetCameraClippingRange() if rwi.GetLightFollowCamera(): CurrentRenderer.UpdateLightsGeometryToFollowCamera() if self.callbackCameraDirectionChanged: self.callbackCameraDirectionChanged() self.DoRender() def PerformPickingOnSelection(self): """Preforms prop3d picking on the current dragged selection If the distance between the start and endpoints is less than the threshold then a SINGLE prop3d is picked along the line the selection area is drawn by the rubber band and is defined by self.start_x, self.start_y, self.end_x, self.end_y """ renderer = self.GetCurrentRenderer() assemblyPath = renderer.PickProp(self.start_x, self.start_y, self.end_x, self.end_y) # re-pick in larger area if nothing is returned if not assemblyPath: self.start_x -= 2 self.end_x += 2 self.start_y -= 2 self.end_y += 2 assemblyPath = renderer.PickProp(self.start_x, self.start_y, self.end_x, self.end_y) # The nearest prop (by Z-value) if assemblyPath: assert ( assemblyPath.GetNumberOfItems() == 1 ), "Wrong assumption on number of returned nodes when picking" nearest_prop = assemblyPath.GetItemAsObject(0).GetViewProp() # all props collection = renderer.GetPickResultProps() props = [collection.GetItemAsObject(i) for i in range(collection.GetNumberOfItems())] props.remove(nearest_prop) props.insert(0, nearest_prop) return props else: return [] # ----------- actor dragging ------------ def StartDrag(self): if self.callbackStartDrag: # print("Calling callbackStartDrag") self.callbackStartDrag() return else: # grab the current selection if self.picked_props: self.StartDragOnProps(self.picked_props) else: pass # print('Can not start drag, nothing selected and callbackStartDrag not assigned') def FinishDrag(self): # print('Finished drag') if self.callbackEndDrag: # reset actor positions as actors positions will be controlled by called functions for pos0, actor in zip( self.draginfo.dragged_actors_original_positions, self.draginfo.actors_dragging ): actor.SetPosition(pos0) self.callbackEndDrag(self.draginfo) self.draginfo = None def StartDragOnProps(self, props): """Starts drag on the provided props (actors) by filling self.draginfo""" if self.draginfo is not None: self.FinishDrag() return # print('Starting drag') # create and fill drag-info draginfo = _BlenderStyleDragInfo() # # draginfo.dragged_node = node # # # find all actors and outlines corresponding to this node # actors = [*self.actor_from_node(node).actors.values()] # outlines = [ol.outline_actor for ol in self.node_outlines if ol.parent_vp_actor in actors] draginfo.actors_dragging = props # [*actors, *outlines] for a in draginfo.actors_dragging: draginfo.dragged_actors_original_positions.append(a.GetPosition()) # numpy ndarray # Get the start position of the drag in 3d rwi = self.GetInteractor() CurrentRenderer = self.GetCurrentRenderer() camera = CurrentRenderer.GetActiveCamera() viewFocus = camera.GetFocalPoint() temp_out = [0, 0, 0] self.ComputeWorldToDisplay( CurrentRenderer, viewFocus[0], viewFocus[1], viewFocus[2], temp_out ) focalDepth = temp_out[2] newPickPoint = [0, 0, 0, 0] x, y = rwi.GetEventPosition() self.ComputeDisplayToWorld(CurrentRenderer, x, y, focalDepth, newPickPoint) mouse_pos_3d = np.array(newPickPoint[:3]) draginfo.start_position_3d = mouse_pos_3d self.draginfo = draginfo def ExecuteDrag(self): rwi = self.GetInteractor() CurrentRenderer = self.GetCurrentRenderer() camera = CurrentRenderer.GetActiveCamera() viewFocus = camera.GetFocalPoint() # Get the picked point in 3d temp_out = [0, 0, 0] self.ComputeWorldToDisplay( CurrentRenderer, viewFocus[0], viewFocus[1], viewFocus[2], temp_out ) focalDepth = temp_out[2] newPickPoint = [0, 0, 0, 0] x, y = rwi.GetEventPosition() self.ComputeDisplayToWorld(CurrentRenderer, x, y, focalDepth, newPickPoint) mouse_pos_3d = np.array(newPickPoint[:3]) # compute the delta and execute delta = np.array(mouse_pos_3d) - self.draginfo.start_position_3d # print(f'Delta = {delta}') view_normal = np.array(self.GetCurrentRenderer().GetActiveCamera().GetViewPlaneNormal()) delta_inplane = delta - view_normal * np.dot(delta, view_normal) # print(f'delta_inplane = {delta_inplane}') for pos0, actor in zip( self.draginfo.dragged_actors_original_positions, self.draginfo.actors_dragging ): m = actor.GetUserMatrix() if m: print("UserMatrices/transforms not supported") # m.Invert() #inplace # rotated = m.MultiplyFloatPoint([*delta_inplane, 1]) # actor.SetPosition(pos0 + np.array(rotated[:3])) actor.SetPosition(pos0 + delta_inplane) # print(f'Set position to {pos0 + delta_inplane}') self.draginfo.delta = delta_inplane # store the current delta # self.GetInteractor().Render() self.DoRender() def CancelDrag(self): """Cancels the drag and restored the original positions of all dragged actors""" for pos0, actor in zip( self.draginfo.dragged_actors_original_positions, self.draginfo.actors_dragging ): actor.SetPosition(pos0) self.draginfo = None self.DoRender() # ----------- end dragging -------------- def Zoom(self): rwi = self.GetInteractor() x, y = rwi.GetEventPosition() xp, yp = rwi.GetLastEventPosition() direction = y - yp self.MoveMouseWheel(direction / 10) def Pan(self): CurrentRenderer = self.GetCurrentRenderer() if CurrentRenderer: rwi = self.GetInteractor() # // Calculate the focal depth since we'll be using it a lot camera = CurrentRenderer.GetActiveCamera() viewFocus = camera.GetFocalPoint() temp_out = [0, 0, 0] self.ComputeWorldToDisplay( CurrentRenderer, viewFocus[0], viewFocus[1], viewFocus[2], temp_out ) focalDepth = temp_out[2] newPickPoint = [0, 0, 0, 0] x, y = rwi.GetEventPosition() self.ComputeDisplayToWorld(CurrentRenderer, x, y, focalDepth, newPickPoint) # // Has to recalc old mouse point since the viewport has moved, # // so can't move it outside the loop oldPickPoint = [0, 0, 0, 0] xp, yp = rwi.GetLastEventPosition() self.ComputeDisplayToWorld(CurrentRenderer, xp, yp, focalDepth, oldPickPoint) # # // Camera motion is reversed # motionVector = ( oldPickPoint[0] - newPickPoint[0], oldPickPoint[1] - newPickPoint[1], oldPickPoint[2] - newPickPoint[2], ) viewFocus = camera.GetFocalPoint() # do we need to do this again? Already did this viewPoint = camera.GetPosition() camera.SetFocalPoint( motionVector[0] + viewFocus[0], motionVector[1] + viewFocus[1], motionVector[2] + viewFocus[2], ) camera.SetPosition( motionVector[0] + viewPoint[0], motionVector[1] + viewPoint[1], motionVector[2] + viewPoint[2], ) if rwi.GetLightFollowCamera(): CurrentRenderer.UpdateLightsGeometryToFollowCamera() self.DoRender() def Rotate(self): CurrentRenderer = self.GetCurrentRenderer() if CurrentRenderer: rwi = self.GetInteractor() dx = rwi.GetEventPosition()[0] - rwi.GetLastEventPosition()[0] dy = rwi.GetEventPosition()[1] - rwi.GetLastEventPosition()[1] size = CurrentRenderer.GetRenderWindow().GetSize() delta_elevation = -20.0 / size[1] delta_azimuth = -20.0 / size[0] rxf = dx * delta_azimuth * self.mouse_motion_factor ryf = dy * delta_elevation * self.mouse_motion_factor self.RotateTurtableBy(rxf, ryf) def RotateTurtableBy(self, rxf, ryf): CurrentRenderer = self.GetCurrentRenderer() rwi = self.GetInteractor() # rfx is rotation about the global Z vector (turn-table mode) # rfy is rotation about the side vector camera = CurrentRenderer.GetActiveCamera() campos = np.array(camera.GetPosition()) focal = np.array(camera.GetFocalPoint()) up = camera.GetViewUp() upside_down_factor = -1 if up[2] < 0 else 1 # rotate about focal point P = campos - focal # camera position # Rotate left/right about the global Z axis H = np.linalg.norm(P[:2]) # horizontal distance of camera to focal point elev = np.arctan2(P[2], H) # elevation # if the camera is near the poles, then derive the azimuth from the up-vector sin_elev = np.sin(elev) if abs(sin_elev) < 0.8: azi = np.arctan2(P[1], P[0]) # azimuth from camera position else: if sin_elev < -0.8: azi = np.arctan2(upside_down_factor * up[1], upside_down_factor * up[0]) else: azi = np.arctan2(-upside_down_factor * up[1], -upside_down_factor * up[0]) D = np.linalg.norm(P) # distance from focal point to camera # apply the change in azimuth and elevation azi_new = azi + rxf / 60 elev_new = elev + upside_down_factor * ryf / 60 # the changed elevation changes H (D stays the same) Hnew = D * np.cos(elev_new) # calculate new camera position relative to focal point Pnew = np.array((Hnew * np.cos(azi_new), Hnew * np.sin(azi_new), D * np.sin(elev_new))) # calculate the up-direction of the camera up_z = upside_down_factor * np.cos(elev_new) # z follows directly from elevation up_h = upside_down_factor * np.sin(elev_new) # horizontal component # # if upside_down: # up_z = -up_z # up_h = -up_h up = (-up_h * np.cos(azi_new), -up_h * np.sin(azi_new), up_z) new_pos = focal + Pnew camera.SetViewUp(up) camera.SetPosition(new_pos) camera.OrthogonalizeViewUp() # Update if self.GetAutoAdjustCameraClippingRange(): CurrentRenderer.ResetCameraClippingRange() if rwi.GetLightFollowCamera(): CurrentRenderer.UpdateLightsGeometryToFollowCamera() if self.callbackCameraDirectionChanged: self.callbackCameraDirectionChanged() self.DoRender() def ZoomBox(self, x1, y1, x2, y2): """Zooms to a box""" # int width, height; # width = abs(this->EndPosition[0] - this->StartPosition[0]); # height = abs(this->EndPosition[1] - this->StartPosition[1]); if x1 > x2: _ = x1 x1 = x2 x2 = _ if y1 > y2: _ = y1 y1 = y2 y2 = _ width = x2 - x1 height = y2 - y1 # int *size = this->CurrentRenderer->GetSize(); CurrentRenderer = self.GetCurrentRenderer() size = CurrentRenderer.GetSize() origin = CurrentRenderer.GetOrigin() camera = CurrentRenderer.GetActiveCamera() # Assuming we're drawing the band on the view-plane rbcenter = (x1 + width / 2, y1 + height / 2, 0) CurrentRenderer.SetDisplayPoint(rbcenter) CurrentRenderer.DisplayToView() CurrentRenderer.ViewToWorld() worldRBCenter = CurrentRenderer.GetWorldPoint() invw = 1.0 / worldRBCenter[3] worldRBCenter = [c * invw for c in worldRBCenter] winCenter = [origin[0] + 0.5 * size[0], origin[1] + 0.5 * size[1], 0] CurrentRenderer.SetDisplayPoint(winCenter) CurrentRenderer.DisplayToView() CurrentRenderer.ViewToWorld() worldWinCenter = CurrentRenderer.GetWorldPoint() invw = 1.0 / worldWinCenter[3] worldWinCenter = [c * invw for c in worldWinCenter] translation = [ worldRBCenter[0] - worldWinCenter[0], worldRBCenter[1] - worldWinCenter[1], worldRBCenter[2] - worldWinCenter[2], ] pos = camera.GetPosition() fp = camera.GetFocalPoint() # pos = [pos[i] + translation[i] for i in range(3)] fp = [fp[i] + translation[i] for i in range(3)] # camera.SetPosition(pos) camera.SetFocalPoint(fp) if width > height: if width: camera.Zoom(size[0] / width) else: if height: camera.Zoom(size[1] / height) self.DoRender() def FocusOn(self, prop3D): """Move the camera to focus on this particular prop3D""" position = prop3D.GetPosition() # print(f"Focus on {position}") CurrentRenderer = self.GetCurrentRenderer() camera = CurrentRenderer.GetActiveCamera() fp = camera.GetFocalPoint() pos = camera.GetPosition() camera.SetFocalPoint(position) camera.SetPosition( position[0] - fp[0] + pos[0], position[1] - fp[1] + pos[1], position[2] - fp[2] + pos[2], ) if self.GetAutoAdjustCameraClippingRange(): CurrentRenderer.ResetCameraClippingRange() rwi = self.GetInteractor() if rwi.GetLightFollowCamera(): CurrentRenderer.UpdateLightsGeometryToFollowCamera() self.DoRender() def Dolly(self, factor): CurrentRenderer = self.GetCurrentRenderer() if CurrentRenderer: camera = CurrentRenderer.GetActiveCamera() if camera.GetParallelProjection(): camera.SetParallelScale(camera.GetParallelScale() / factor) else: camera.Dolly(factor) if self.GetAutoAdjustCameraClippingRange(): CurrentRenderer.ResetCameraClippingRange() # if not do_not_update: # rwi = self.GetInteractor() # if rwi.GetLightFollowCamera(): # CurrentRenderer.UpdateLightsGeometryToFollowCamera() # # rwi.Render() # self.DoRender() def DrawMeasurement(self): rwi = self.GetInteractor() self.end_x, self.end_y = rwi.GetEventPosition() self.DrawLine(self.start_x, self.end_x, self.start_y, self.end_y) def DrawDraggedSelection(self): rwi = self.GetInteractor() self.end_x, self.end_y = rwi.GetEventPosition() self.DrawRubberBand(self.start_x, self.end_x, self.start_y, self.end_y) def InitializeScreenDrawing(self): # make an image of the currently rendered image rwi = self.GetInteractor() rwin = rwi.GetRenderWindow() size = rwin.GetSize() self._pixel_array.Initialize() self._pixel_array.SetNumberOfComponents(4) self._pixel_array.SetNumberOfTuples(size[0] * size[1]) front = 1 # what does this do? rwin.GetRGBACharPixelData(0, 0, size[0] - 1, size[1] - 1, front, self._pixel_array) def DrawRubberBand(self, x1, x2, y1, y2): rwi = self.GetInteractor() rwin = rwi.GetRenderWindow() size = rwin.GetSize() tempPA = vtk.vtkUnsignedCharArray() tempPA.DeepCopy(self._pixel_array) # check size, viewport may have been resized in the mean-time if tempPA.GetNumberOfTuples() != size[0] * size[1]: # print( # "Starting new screen-image - viewport has resized without us knowing" # ) self.InitializeScreenDrawing() self.DrawRubberBand(x1, x2, y1, y2) return x2 = min(x2, size[0] - 1) y2 = min(y2, size[1] - 1) x2 = max(x2, 0) y2 = max(y2, 0) # Modify the pixel array width = abs(x2 - x1) height = abs(y2 - y1) minx = min(x2, x1) miny = min(y2, y1) # draw top and bottom for i in range(width): # c = round((10*i % 254)/254) * 254 # find some alternating color c = 0 idx = (miny * size[0]) + minx + i tempPA.SetTuple(idx, (c, c, c, 1)) idx = ((miny + height) * size[0]) + minx + i tempPA.SetTuple(idx, (c, c, c, 1)) # draw left and right for i in range(height): # c = round((10 * i % 254) / 254) * 254 # find some alternating color c = 0 idx = ((miny + i) * size[0]) + minx tempPA.SetTuple(idx, (c, c, c, 1)) idx = idx + width tempPA.SetTuple(idx, (c, c, c, 1)) # and Copy back to the window rwin.SetRGBACharPixelData(0, 0, size[0] - 1, size[1] - 1, tempPA, 0) rwin.Frame() def LineToPixels(self, x1, x2, y1, y2): """Returns the x and y values of the pixels on a line between x1,y1 and x2,y2. If start and end are identical then a single point is returned""" dx = x2 - x1 dy = y2 - y1 if dx == 0 and dy == 0: return [x1], [y1] if abs(dx) > abs(dy): dhdw = dy / dx r = range(0, dx, int(dx / abs(dx))) x = [x1 + i for i in r] y = [round(y1 + dhdw * i) for i in r] else: dwdh = dx / dy r = range(0, dy, int(dy / abs(dy))) y = [y1 + i for i in r] x = [round(x1 + i * dwdh) for i in r] return x, y def DrawLine(self, x1, x2, y1, y2): rwi = self.GetInteractor() rwin = rwi.GetRenderWindow() size = rwin.GetSize() x1 = min(max(x1, 0), size[0]) x2 = min(max(x2, 0), size[0]) y1 = min(max(y1, 0), size[1]) y2 = min(max(y2, 0), size[1]) tempPA = vtk.vtkUnsignedCharArray() tempPA.DeepCopy(self._pixel_array) xs, ys = self.LineToPixels(x1, x2, y1, y2) for x, y in zip(xs, ys): idx = (y * size[0]) + x tempPA.SetTuple(idx, (0, 0, 0, 1)) # and Copy back to the window rwin.SetRGBACharPixelData(0, 0, size[0] - 1, size[1] - 1, tempPA, 0) camera = self.GetCurrentRenderer().GetActiveCamera() scale = camera.GetParallelScale() # Set/Get the scaling used for a parallel projection, i.e. # # the half of the height of the viewport in world-coordinate distances. # The default is 1. Note that the "scale" parameter works as an "inverse scale" # larger numbers produce smaller images. # This method has no effect in perspective projection mode half_height = size[1] / 2 # half_height [px] = scale [world-coordinates] length = ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5 meters_per_pixel = scale / half_height meters = length * meters_per_pixel if camera.GetParallelProjection(): print(f"Line length = {length} px = {meters} m") else: print("Need to be in non-perspective mode to measure. Press 2 or 3 to get there") if self.callbackMeasure: self.callbackMeasure(meters) # # # can we add something to the window here? # freeType = vtk.vtkFreeTypeTools.GetInstance() # textProperty = vtk.vtkTextProperty() # textProperty.SetJustificationToLeft() # textProperty.SetFontSize(24) # textProperty.SetOrientation(25) # # textImage = vtk.vtkImageData() # freeType.RenderString(textProperty, "a somewhat longer text", 72, textImage) # # this does not give an error, assume it works # # # textImage.GetDimensions() # textImage.GetExtent() # # # # Now put the textImage in the RenderWindow # rwin.SetRGBACharPixelData(0, 0, size[0] - 1, size[1] - 1, textImage, 0) rwin.Frame() def UpdateMiddleMouseButtonLockActor(self): if self.middle_mouse_lock_actor is None: # create the actor # Create a text on the top-rightcenter textMapper = vtk.vtkTextMapper() textMapper.SetInput("Middle mouse lock [m or space] active") textProp = textMapper.GetTextProperty() textProp.SetFontSize(12) textProp.SetFontFamilyToTimes() textProp.BoldOff() textProp.ItalicOff() textProp.ShadowOff() textProp.SetVerticalJustificationToTop() textProp.SetJustificationToCentered() textProp.SetColor((0, 0, 0)) self.middle_mouse_lock_actor = vtk.vtkActor2D() self.middle_mouse_lock_actor.SetMapper(textMapper) self.middle_mouse_lock_actor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() self.middle_mouse_lock_actor.GetPositionCoordinate().SetValue(0.5, 0.98) self.GetCurrentRenderer().AddActor(self.middle_mouse_lock_actor) self.middle_mouse_lock_actor.SetVisibility(self.middle_mouse_lock) self.DoRender() def DoRender(self): self.GetInteractor().Render() vedo-2023.4.6/vedo/mesh.py000066400000000000000000003131151444463326400151660ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import numpy as np from deprecated import deprecated try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo from vedo.colors import color_map from vedo.colors import get_color from vedo.pointcloud import Points from vedo.utils import buildPolyData, is_sequence, mag, mag2, precision from vedo.utils import numpy2vtk, vtk2numpy, OperationNode __docformat__ = "google" __doc__ = """ Submodule to work with polygonal meshes ![](https://vedo.embl.es/images/advanced/mesh_smoother2.png) """ __all__ = ["Mesh"] #################################################### class Mesh(Points): """ Build an instance of object `Mesh` derived from `vedo.PointCloud`. """ def __init__(self, inputobj=None, c=None, alpha=1): """ Input can be a list of vertices and their connectivity (faces of the polygonal mesh), or directly a `vtkPolydata` object. For point clouds - e.i. no faces - just substitute the `faces` list with `None`. Example: `Mesh( [ [[x1,y1,z1],[x2,y2,z2], ...], [[0,1,2], [1,2,3], ...] ] )` Arguments: c : (color) color in RGB format, hex, symbol or name alpha : (float) mesh opacity [0,1] Examples: - [buildmesh.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/buildmesh.py) (and many others!) ![](https://vedo.embl.es/images/basic/buildmesh.png) """ Points.__init__(self) self.line_locator = None self._mapper.SetInterpolateScalarsBeforeMapping( vedo.settings.interpolate_scalars_before_mapping ) if vedo.settings.use_polygon_offset: self._mapper.SetResolveCoincidentTopologyToPolygonOffset() pof, pou = (vedo.settings.polygon_offset_factor, vedo.settings.polygon_offset_units) self._mapper.SetResolveCoincidentTopologyPolygonOffsetParameters(pof, pou) inputtype = str(type(inputobj)) if inputobj is None: pass elif isinstance(inputobj, (Mesh, vtk.vtkActor)): polyCopy = vtk.vtkPolyData() polyCopy.DeepCopy(inputobj.GetMapper().GetInput()) self._data = polyCopy self._mapper.SetInputData(polyCopy) self._mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) pr = vtk.vtkProperty() pr.DeepCopy(inputobj.GetProperty()) self.SetProperty(pr) self.property = pr elif isinstance(inputobj, vtk.vtkPolyData): if inputobj.GetNumberOfCells() == 0: carr = vtk.vtkCellArray() for i in range(inputobj.GetNumberOfPoints()): carr.InsertNextCell(1) carr.InsertCellPoint(i) inputobj.SetVerts(carr) self._data = inputobj # cache vtkPolyData and mapper for speed elif isinstance(inputobj, (vtk.vtkStructuredGrid, vtk.vtkRectilinearGrid)): gf = vtk.vtkGeometryFilter() gf.SetInputData(inputobj) gf.Update() self._data = gf.GetOutput() elif "trimesh" in inputtype: tact = vedo.utils.trimesh2vedo(inputobj) self._data = tact.polydata() elif "meshio" in inputtype: if len(inputobj.cells) > 0: mcells = [] for cellblock in inputobj.cells: if cellblock.type in ("triangle", "quad"): mcells += cellblock.data.tolist() self._data = buildPolyData(inputobj.points, mcells) else: self._data = buildPolyData(inputobj.points, None) # add arrays: try: if len(inputobj.point_data) > 0: for k in inputobj.point_data.keys(): vdata = numpy2vtk(inputobj.point_data[k]) vdata.SetName(str(k)) self._data.GetPointData().AddArray(vdata) except AssertionError: print("Could not add meshio point data, skip.") # try: # if len(inputobj.cell_data): # for k in inputobj.cell_data.keys(): # #print(inputobj.cell_data) # exit() # vdata = numpy2vtk(inputobj.cell_data[k]) # vdata.SetName(str(k)) # self._data.GetCellData().AddArray(vdata) # except AssertionError: # print("Could not add meshio cell data, skip.") elif "meshlab" in inputtype: self._data = vedo.utils.meshlab2vedo(inputobj) elif is_sequence(inputobj): ninp = len(inputobj) if ninp == 0: self._data = vtk.vtkPolyData() elif ninp == 2: # assume [vertices, faces] self._data = buildPolyData(inputobj[0], inputobj[1]) else: # assume [vertices] or vertices self._data = buildPolyData(inputobj, None) elif hasattr(inputobj, "GetOutput"): # passing vtk object if hasattr(inputobj, "Update"): inputobj.Update() if isinstance(inputobj.GetOutput(), vtk.vtkPolyData): self._data = inputobj.GetOutput() else: gf = vtk.vtkGeometryFilter() gf.SetInputData(inputobj.GetOutput()) gf.Update() self._data = gf.GetOutput() elif isinstance(inputobj, str): dataset = vedo.file_io.load(inputobj) self.filename = inputobj if "TetMesh" in str(type(dataset)): self._data = dataset.tomesh().polydata(False) else: self._data = dataset.polydata(False) else: try: gf = vtk.vtkGeometryFilter() gf.SetInputData(inputobj) gf.Update() self._data = gf.GetOutput() except: vedo.logger.error(f"cannot build mesh from type {inputtype}") raise RuntimeError() self._mapper.SetInputData(self._data) self.property = self.GetProperty() self.property.SetInterpolationToPhong() # set the color by c or by scalar if self._data: arrexists = False if c is None: ptdata = self._data.GetPointData() cldata = self._data.GetCellData() exclude = ["normals", "tcoord"] if cldata.GetNumberOfArrays(): for i in range(cldata.GetNumberOfArrays()): iarr = cldata.GetArray(i) if iarr: icname = iarr.GetName() if icname and all(s not in icname.lower() for s in exclude): cldata.SetActiveScalars(icname) self._mapper.ScalarVisibilityOn() self._mapper.SetScalarModeToUseCellData() self._mapper.SetScalarRange(iarr.GetRange()) arrexists = True break # stop at first good one # point come after so it has priority if ptdata.GetNumberOfArrays(): for i in range(ptdata.GetNumberOfArrays()): iarr = ptdata.GetArray(i) if iarr: ipname = iarr.GetName() if ipname and all(s not in ipname.lower() for s in exclude): ptdata.SetActiveScalars(ipname) self._mapper.ScalarVisibilityOn() self._mapper.SetScalarModeToUsePointData() self._mapper.SetScalarRange(iarr.GetRange()) arrexists = True break # stop at first good one if not arrexists: if c is None: c = "gold" c = get_color(c) elif isinstance(c, float) and c <= 1: c = color_map(c, "rainbow", 0, 1) else: c = get_color(c) self.property.SetColor(c) self.property.SetAmbient(0.1) self.property.SetDiffuse(1) self.property.SetSpecular(0.05) self.property.SetSpecularPower(5) self._mapper.ScalarVisibilityOff() if alpha is not None: self.property.SetOpacity(alpha) n = self._data.GetNumberOfPoints() self.pipeline = OperationNode(self, comment=f"#pts {n}") def _repr_html_(self): """ HTML representation of the Mesh object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.mesh.Mesh" help_url = "https://vedo.embl.es/docs/vedo/mesh.html" arr = self.thumbnail() im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" bounds = "
".join( [ precision(min_x, 4) + " ... " + precision(max_x, 4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) average_size = "{size:.3f}".format(size=self.average_size()) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '
' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" pdata = "" if self._data.GetPointData().GetScalars(): if self._data.GetPointData().GetScalars().GetName(): name = self._data.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" if self._data.GetCellData().GetScalars(): if self._data.GetCellData().GetScalars().GetName(): name = self._data.GetCellData().GetScalars().GetName() cdata = " cell data array " + name + "" allt = [ "", "", "", "
", image, "
", help_text, "", "", "", "", "", pdata, cdata, "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + precision(self.center_of_mass(), 3) + "
average size " + str(average_size) + "
nr. points / faces " + str(self.npoints) + " / " + str(self.ncells) + "
", "
", ] return "\n".join(allt) def faces(self): """ Get cell polygonal connectivity ids as a python `list`. The output format is: `[[id0 ... idn], [id0 ... idm], etc]`. """ arr1d = vtk2numpy(self._data.GetPolys().GetData()) if arr1d is None: return [] # Get cell connettivity ids as a 1D array. vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. if len(arr1d) == 0: arr1d = vtk2numpy(self._data.GetStrips().GetData()) if arr1d is None: return [] i = 0 conn = [] n = len(arr1d) if n: while True: cell = [arr1d[i + k] for k in range(1, arr1d[i] + 1)] conn.append(cell) i += arr1d[i] + 1 if i >= n: break return conn # cannot always make a numpy array of it! def cells(self): """Alias for `faces()`.""" return self.faces() def lines(self, flat=False): """ Get lines connectivity ids as a numpy array. Default format is `[[id0,id1], [id3,id4], ...]` Arguments: flat : (bool) return a 1D numpy array as e.g. [2, 10,20, 3, 10,11,12, 2, 70,80, ...] """ # Get cell connettivity ids as a 1D array. The vtk format is: # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. arr1d = vtk2numpy(self.polydata(False).GetLines().GetData()) if arr1d is None: return [] if flat: return arr1d i = 0 conn = [] n = len(arr1d) for _ in range(n): cell = [arr1d[i + k + 1] for k in range(arr1d[i])] conn.append(cell) i += arr1d[i] + 1 if i >= n: break return conn # cannot always make a numpy array of it! def edges(self): """Return an array containing the edges connectivity.""" extractEdges = vtk.vtkExtractEdges() extractEdges.SetInputData(self._data) # eed.UseAllPointsOn() extractEdges.Update() lpoly = extractEdges.GetOutput() arr1d = vtk2numpy(lpoly.GetLines().GetData()) # [nids1, id0 ... idn, niids2, id0 ... idm, etc]. i = 0 conn = [] n = len(arr1d) for _ in range(n): cell = [arr1d[i + k + 1] for k in range(arr1d[i])] conn.append(cell) i += arr1d[i] + 1 if i >= n: break return conn # cannot always make a numpy array of it! def texture( self, tname, tcoords=None, interpolate=True, repeat=True, edge_clamp=False, scale=None, ushift=None, vshift=None, seam_threshold=None, ): """ Assign a texture to mesh from image file or predefined texture `tname`. If tname is set to `None` texture is disabled. Input tname can also be an array or a `vtkTexture`. Arguments: tname : (numpy.array, str, Picture, vtkTexture, None) the input texture to be applied. Can be a numpy array, a path to an image file, a vedo Picture. The None value disables texture. tcoords : (numpy.array, str) this is the (u,v) texture coordinate array. Can also be a string of an existing array in the mesh. interpolate : (bool) turn on/off linear interpolation of the texture map when rendering. repeat : (bool) repeat of the texture when tcoords extend beyond the [0,1] range. edge_clamp : (bool) turn on/off the clamping of the texture map when the texture coords extend beyond the [0,1] range. Only used when repeat is False, and edge clamping is supported by the graphics card. scale : (bool) scale the texture image by this factor ushift : (bool) shift u-coordinates of texture by this amount vshift : (bool) shift v-coordinates of texture by this amount seam_threshold : (float) try to seal seams in texture by collapsing triangles (test values around 1.0, lower values = stronger collapse) Examples: - [texturecubes.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/texturecubes.py) ![](https://vedo.embl.es/images/basic/texturecubes.png) """ pd = self.polydata(False) outimg = None if tname is None: # disable texture pd.GetPointData().SetTCoords(None) pd.GetPointData().Modified() return self ###################################### if isinstance(tname, vtk.vtkTexture): tu = tname elif isinstance(tname, vedo.Picture): tu = vtk.vtkTexture() outimg = tname.inputdata() elif is_sequence(tname): tu = vtk.vtkTexture() outimg = vedo.picture._get_img(tname) elif isinstance(tname, str): tu = vtk.vtkTexture() if "https://" in tname: try: tname = vedo.file_io.download(tname, verbose=False) except: vedo.logger.error(f"texture {tname} could not be downloaded") return self fn = tname + ".jpg" if os.path.exists(tname): fn = tname else: vedo.logger.error(f"texture file {tname} does not exist") return self fnl = fn.lower() if ".jpg" in fnl or ".jpeg" in fnl: reader = vtk.vtkJPEGReader() elif ".png" in fnl: reader = vtk.vtkPNGReader() elif ".bmp" in fnl: reader = vtk.vtkBMPReader() else: vedo.logger.error("in texture() supported files are only PNG, BMP or JPG") return self reader.SetFileName(fn) reader.Update() outimg = reader.GetOutput() else: vedo.logger.error(f"in texture() cannot understand input {type(tname)}") return self if tcoords is not None: if isinstance(tcoords, str): vtarr = pd.GetPointData().GetArray(tcoords) else: tcoords = np.asarray(tcoords) if tcoords.ndim != 2: vedo.logger.error("tcoords must be a 2-dimensional array") return self if tcoords.shape[0] != pd.GetNumberOfPoints(): vedo.logger.error("nr of texture coords must match nr of points") return self if tcoords.shape[1] != 2: vedo.logger.error("tcoords texture vector must have 2 components") vtarr = numpy2vtk(tcoords) vtarr.SetName("TCoordinates") pd.GetPointData().SetTCoords(vtarr) pd.GetPointData().Modified() elif not pd.GetPointData().GetTCoords(): # TCoords still void.. # check that there are no texture-like arrays: names = self.pointdata.keys() candidate_arr = "" for name in names: vtarr = pd.GetPointData().GetArray(name) if vtarr.GetNumberOfComponents() != 2: continue t0, t1 = vtarr.GetRange() if t0 >= 0 and t1 <= 1: candidate_arr = name if candidate_arr: vtarr = pd.GetPointData().GetArray(candidate_arr) pd.GetPointData().SetTCoords(vtarr) pd.GetPointData().Modified() else: # last resource is automatic mapping tmapper = vtk.vtkTextureMapToPlane() tmapper.AutomaticPlaneGenerationOn() tmapper.SetInputData(pd) tmapper.Update() tc = tmapper.GetOutput().GetPointData().GetTCoords() if scale or ushift or vshift: ntc = vtk2numpy(tc) if scale: ntc *= scale if ushift: ntc[:, 0] += ushift if vshift: ntc[:, 1] += vshift tc = numpy2vtk(tc) pd.GetPointData().SetTCoords(tc) pd.GetPointData().Modified() if outimg: tu.SetInputData(outimg) tu.SetInterpolate(interpolate) tu.SetRepeat(repeat) tu.SetEdgeClamp(edge_clamp) self.property.SetColor(1, 1, 1) self._mapper.ScalarVisibilityOff() self.SetTexture(tu) if seam_threshold is not None: tname = self._data.GetPointData().GetTCoords().GetName() grad = self.gradient(tname) ugrad, vgrad = np.split(grad, 2, axis=1) ugradm, vgradm = vedo.utils.mag2(ugrad), vedo.utils.mag2(vgrad) gradm = np.log(ugradm + vgradm) largegrad_ids = np.arange(len(grad))[gradm > seam_threshold * 4] uvmap = self.pointdata[tname] # collapse triangles that have large gradient new_points = self.points(transformed=False) for f in self.faces(): if np.isin(f, largegrad_ids).all(): id1, id2, id3 = f uv1, uv2, uv3 = uvmap[f] d12 = vedo.mag2(uv1 - uv2) d23 = vedo.mag2(uv2 - uv3) d31 = vedo.mag2(uv3 - uv1) idm = np.argmin([d12, d23, d31]) if idm == 0: new_points[id1] = new_points[id3] new_points[id2] = new_points[id3] elif idm == 1: new_points[id2] = new_points[id1] new_points[id3] = new_points[id1] self.points(new_points) self.Modified() return self @deprecated(reason=vedo.colors.red + "Please use compute_normals()" + vedo.colors.reset) def computeNormals(self, points=True, cells=True, featureAngle=None, consistency=True): "Deprecated. Please use compute_normals()" return self.compute_normals(points, cells, featureAngle, consistency) def compute_normals(self, points=True, cells=True, feature_angle=None, consistency=True): """ Compute cell and vertex normals for the mesh. Arguments: points : (bool) do the computation for the vertices too cells : (bool) do the computation for the cells too feature_angle : (float) specify the angle that defines a sharp edge. If the difference in angle across neighboring polygons is greater than this value, the shared edge is considered "sharp" and it is split. consistency : (bool) turn on/off the enforcement of consistent polygon ordering. .. warning:: If feature_angle is set to a float the Mesh can be modified, and it can have a different nr. of vertices from the original. """ poly = self.polydata(False) pdnorm = vtk.vtkPolyDataNormals() pdnorm.SetInputData(poly) pdnorm.SetComputePointNormals(points) pdnorm.SetComputeCellNormals(cells) pdnorm.SetConsistency(consistency) pdnorm.FlipNormalsOff() if feature_angle: pdnorm.SetSplitting(True) pdnorm.SetFeatureAngle(feature_angle) else: pdnorm.SetSplitting(False) # print(pdnorm.GetNonManifoldTraversal()) pdnorm.Update() return self._update(pdnorm.GetOutput()) def reverse(self, cells=True, normals=False): """ Reverse the order of polygonal cells and/or reverse the direction of point and cell normals. Two flags are used to control these operations: - `cells=True` reverses the order of the indices in the cell connectivity list. If cell is a list of IDs only those cells will be reversed. - `normals=True` reverses the normals by multiplying the normal vector by -1 (both point and cell normals, if present). """ poly = self.polydata(False) if is_sequence(cells): for cell in cells: poly.ReverseCell(cell) poly.GetCellData().Modified() return self ############## rev = vtk.vtkReverseSense() if cells: rev.ReverseCellsOn() else: rev.ReverseCellsOff() if normals: rev.ReverseNormalsOn() else: rev.ReverseNormalsOff() rev.SetInputData(poly) rev.Update() out = self._update(rev.GetOutput()) out.pipeline = OperationNode("reverse", parents=[self]) return out def wireframe(self, value=True): """Set mesh's representation as wireframe or solid surface.""" if value: self.property.SetRepresentationToWireframe() else: self.property.SetRepresentationToSurface() return self def flat(self): """Set surface interpolation to flat. """ self.property.SetInterpolationToFlat() return self def phong(self): """Set surface interpolation to "phong".""" self.property.SetInterpolationToPhong() return self def backface_culling(self, value=True): """Set culling of polygons based on orientation of normal with respect to camera.""" self.property.SetBackfaceCulling(value) return self def render_lines_as_tubes(self, value=True): """Wrap a fake tube around a simple line for visualization""" self.property.SetRenderLinesAsTubes(value) return self def frontface_culling(self, value=True): """Set culling of polygons based on orientation of normal with respect to camera.""" self.property.SetFrontfaceCulling(value) return self @deprecated(reason=vedo.colors.red + "Please use backcolor()" + vedo.colors.reset) def backColor(self, bc=None): "Deprecated. Please use `backcolor()`" return self.backcolor(bc) def backcolor(self, bc=None): """ Set/get mesh's backface color. """ backProp = self.GetBackfaceProperty() if bc is None: if backProp: return backProp.GetDiffuseColor() return self if self.property.GetOpacity() < 1: return self if not backProp: backProp = vtk.vtkProperty() backProp.SetDiffuseColor(get_color(bc)) backProp.SetOpacity(self.property.GetOpacity()) self.SetBackfaceProperty(backProp) self._mapper.ScalarVisibilityOff() return self def bc(self, backcolor=False): """Shortcut for `mesh.backcolor()`.""" return self.backcolor(backcolor) @deprecated(reason=vedo.colors.red + "Please use linewidth()" + vedo.colors.reset) def lineWidth(self, lw): "Deprecated: please use `linewidth()`" return self.linewidth(lw) def linewidth(self, lw=None): """Set/get width of mesh edges. Same as `lw()`.""" if lw is not None: if lw == 0: self.property.EdgeVisibilityOff() self.property.SetRepresentationToSurface() return self self.property.EdgeVisibilityOn() self.property.SetLineWidth(lw) else: return self.property.GetLineWidth() return self def lw(self, linewidth=None): """Set/get width of mesh edges. Same as `linewidth()`.""" return self.linewidth(linewidth) def linecolor(self, lc=None): """Set/get color of mesh edges. Same as `lc()`.""" if lc is None: return self.property.GetEdgeColor() self.property.EdgeVisibilityOn() self.property.SetEdgeColor(get_color(lc)) return self def lc(self, linecolor=None): """Set/get color of mesh edges. Same as `linecolor()`.""" return self.linecolor(linecolor) def volume(self): """Get/set the volume occupied by mesh.""" mass = vtk.vtkMassProperties() mass.SetGlobalWarningDisplay(0) mass.SetInputData(self.polydata()) mass.Update() return mass.GetVolume() def area(self): """ Compute the surface area of mesh. The mesh must be triangular for this to work. See also `mesh.triangulate()`. """ mass = vtk.vtkMassProperties() mass.SetGlobalWarningDisplay(0) mass.SetInputData(self.polydata()) mass.Update() return mass.GetSurfaceArea() def is_closed(self): """Return `True` if the mesh is watertight.""" fe = vtk.vtkFeatureEdges() fe.BoundaryEdgesOn() fe.FeatureEdgesOff() fe.NonManifoldEdgesOn() fe.SetInputData(self.polydata(False)) fe.Update() ne = fe.GetOutput().GetNumberOfCells() return not bool(ne) def is_manifold(self): """Return `True` if the mesh is manifold.""" fe = vtk.vtkFeatureEdges() fe.BoundaryEdgesOff() fe.FeatureEdgesOff() fe.NonManifoldEdgesOn() fe.SetInputData(self.polydata(False)) fe.Update() ne = fe.GetOutput().GetNumberOfCells() return not bool(ne) def non_manifold_faces(self, remove=True, tol="auto"): """ Detect and (try to) remove non-manifold faces of a triangular mesh. Set `remove` to `False` to mark cells without removing them. Set `tol=0` for zero-tolerance, the result will be manifold but with holes. Set `tol>0` to cut off non-manifold faces, and try to recover the good ones. Set `tol="auto"` to make an automatic choice of the tolerance. """ # mark original point and cell ids self.add_ids() toremove = self.boundaries( boundary_edges=False, non_manifold_edges=True, cell_edge=True, return_cell_ids=True ) if len(toremove) == 0: return self points = self.points() faces = self.faces() centers = self.cell_centers() copy = self.clone() copy.delete_cells(toremove).clean() copy.compute_normals(cells=False) normals = copy.normals() deltas, deltas_i = [], [] for i in vedo.utils.progressbar(toremove, delay=3, title="recover faces"): pids = copy.closest_point(centers[i], n=3, return_point_id=True) norms = normals[pids] n = np.mean(norms, axis=0) dn = np.linalg.norm(n) if not dn: continue n = n / dn p0, p1, p2 = points[faces[i]][:3] v = np.cross(p1 - p0, p2 - p0) lv = np.linalg.norm(v) if not lv: continue v = v / lv cosa = 1 - np.dot(n, v) deltas.append(cosa) deltas_i.append(i) recover = [] if len(deltas) > 0: mean_delta = np.mean(deltas) err_delta = np.std(deltas) txt = "" if tol == "auto": # automatic choice tol = mean_delta / 5 txt = f"\n Automatic tol. : {tol: .4f}" for i, cosa in zip(deltas_i, deltas): if cosa < tol: recover.append(i) vedo.logger.info( f"\n --------- Non manifold faces ---------" f"\n Average tol. : {mean_delta: .4f} +- {err_delta: .4f}{txt}" f"\n Removed faces : {len(toremove)}" f"\n Recovered faces: {len(recover)}" ) toremove = list(set(toremove) - set(recover)) if not remove: mark = np.zeros(self.ncells, dtype=np.uint8) mark[recover] = 1 mark[toremove] = 2 self.celldata["NonManifoldCell"] = mark else: self.delete_cells(toremove) self.pipeline = OperationNode( "non_manifold_faces", parents=[self], comment=f"#cells {self._data.GetNumberOfCells()}" ) return self def shrink(self, fraction=0.85): """Shrink the triangle polydata in the representation of the input mesh. Examples: - [shrink.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/shrink.py) ![](https://vedo.embl.es/images/basic/shrink.png) """ shrink = vtk.vtkShrinkPolyData() shrink.SetInputData(self._data) shrink.SetShrinkFactor(fraction) shrink.Update() self.point_locator = None self.cell_locator = None out = self._update(shrink.GetOutput()) out.pipeline = OperationNode("shrink", parents=[self]) return out def stretch(self, q1, q2): """ Stretch mesh between points `q1` and `q2`. Examples: - [aspring1.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/aspring1.py) ![](https://vedo.embl.es/images/simulations/50738955-7e891800-11d9-11e9-85cd-02bd4f3f13ea.gif) .. note:: for `Mesh` objects, two vectors `mesh.base`, and `mesh.top` must be defined. """ if self.base is None: vedo.logger.error("in stretch() must define vectors mesh.base and mesh.top at creation") raise RuntimeError() p1, p2 = self.base, self.top q1, q2, z = np.asarray(q1), np.asarray(q2), np.array([0, 0, 1]) a = p2 - p1 b = q2 - q1 plength = np.linalg.norm(a) qlength = np.linalg.norm(b) T = vtk.vtkTransform() T.PostMultiply() T.Translate(-p1) cosa = np.dot(a, z) / plength n = np.cross(a, z) if np.linalg.norm(n): T.RotateWXYZ(np.rad2deg(np.arccos(cosa)), n) T.Scale(1, 1, qlength / plength) cosa = np.dot(b, z) / qlength n = np.cross(b, z) if np.linalg.norm(n): T.RotateWXYZ(-np.rad2deg(np.arccos(cosa)), n) else: if np.dot(b, z) < 0: T.RotateWXYZ(180, [1, 0, 0]) T.Translate(q1) self.SetUserMatrix(T.GetMatrix()) return self def crop(self, top=None, bottom=None, right=None, left=None, front=None, back=None): """ Crop an `Mesh` object. Use this method at creation (before moving the object). Arguments: top : (float) fraction to crop from the top plane (positive z) bottom : (float) fraction to crop from the bottom plane (negative z) front : (float) fraction to crop from the front plane (positive y) back : (float) fraction to crop from the back plane (negative y) right : (float) fraction to crop from the right plane (positive x) left : (float) fraction to crop from the left plane (negative x) Example: ```python from vedo import Sphere Sphere().crop(right=0.3, left=0.1).show() ``` ![](https://user-images.githubusercontent.com/32848391/57081955-0ef1e800-6cf6-11e9-99de-b45220939bc9.png) """ cu = vtk.vtkBox() pos = np.array(self.GetPosition()) x0, x1, y0, y1, z0, z1 = self.bounds() x0, y0, z0 = [x0, y0, z0] - pos x1, y1, z1 = [x1, y1, z1] - pos dx, dy, dz = x1 - x0, y1 - y0, z1 - z0 if top: z1 = z1 - top * dz if bottom: z0 = z0 + bottom * dz if front: y1 = y1 - front * dy if back: y0 = y0 + back * dy if right: x1 = x1 - right * dx if left: x0 = x0 + left * dx bounds = (x0, x1, y0, y1, z0, z1) cu.SetBounds(bounds) clipper = vtk.vtkClipPolyData() clipper.SetInputData(self._data) clipper.SetClipFunction(cu) clipper.InsideOutOn() clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() self._update(clipper.GetOutput()) self.point_locator = None self.pipeline = OperationNode( "crop", parents=[self], comment=f"#pts {self._data.GetNumberOfPoints()}" ) return self def cap(self, return_cap=False): """ Generate a "cap" on a clipped mesh, or caps sharp edges. Examples: - [cut_and_cap.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/cut_and_cap.py) ![](https://vedo.embl.es/images/advanced/cutAndCap.png) See also: `join()`, `join_segments()`, `slice()`. """ poly = self._data fe = vtk.vtkFeatureEdges() fe.SetInputData(poly) fe.BoundaryEdgesOn() fe.FeatureEdgesOff() fe.NonManifoldEdgesOff() fe.ManifoldEdgesOff() fe.Update() stripper = vtk.vtkStripper() stripper.SetInputData(fe.GetOutput()) stripper.JoinContiguousSegmentsOn() stripper.Update() boundaryPoly = vtk.vtkPolyData() boundaryPoly.SetPoints(stripper.GetOutput().GetPoints()) boundaryPoly.SetPolys(stripper.GetOutput().GetLines()) rev = vtk.vtkReverseSense() rev.ReverseCellsOn() rev.SetInputData(boundaryPoly) rev.Update() tf = vtk.vtkTriangleFilter() tf.SetInputData(rev.GetOutput()) tf.Update() if return_cap: m = Mesh(tf.GetOutput()) # assign the same transformation to the copy m.SetOrigin(self.GetOrigin()) m.SetScale(self.GetScale()) m.SetOrientation(self.GetOrientation()) m.SetPosition(self.GetPosition()) m.pipeline = OperationNode( "cap", parents=[self], comment=f"#pts {m._data.GetNumberOfPoints()}" ) return m polyapp = vtk.vtkAppendPolyData() polyapp.AddInputData(poly) polyapp.AddInputData(tf.GetOutput()) polyapp.Update() out = self._update(polyapp.GetOutput()).clean() out.pipeline = OperationNode( "capped", parents=[self], comment=f"#pts {out.inputdata().GetNumberOfPoints()}" ) return out def join(self, polys=True, reset=False): """ Generate triangle strips and/or polylines from input polygons, triangle strips, and lines. Input polygons are assembled into triangle strips only if they are triangles; other types of polygons are passed through to the output and not stripped. Use mesh.triangulate() to triangulate non-triangular polygons prior to running this filter if you need to strip all the data. Also note that if triangle strips or polylines are present in the input they are passed through and not joined nor extended. If you wish to strip these use mesh.triangulate() to fragment the input into triangles and lines prior to applying join(). Arguments: polys : (bool) polygonal segments will be joined if they are contiguous reset : (bool) reset points ordering Warning: If triangle strips or polylines exist in the input data they will be passed through to the output data. This filter will only construct triangle strips if triangle polygons are available; and will only construct polylines if lines are available. Example: ```python from vedo import * c1 = Cylinder(pos=(0,0,0), r=2, height=3, axis=(1,.0,0), alpha=.1).triangulate() c2 = Cylinder(pos=(0,0,2), r=1, height=2, axis=(0,.3,1), alpha=.1).triangulate() intersect = c1.intersect_with(c2).join(reset=True) spline = Spline(intersect).c('blue').lw(5) show(c1, c2, spline, intersect.labels('id'), axes=1).close() ``` ![](https://vedo.embl.es/images/feats/line_join.png) """ sf = vtk.vtkStripper() sf.SetPassThroughCellIds(True) sf.SetPassThroughPointIds(True) sf.SetJoinContiguousSegments(polys) sf.SetInputData(self.polydata(False)) sf.Update() if reset: poly = sf.GetOutput() cpd = vtk.vtkCleanPolyData() cpd.PointMergingOn() cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() cpd.ConvertStripsToPolysOn() cpd.SetInputData(poly) cpd.Update() poly = cpd.GetOutput() vpts = poly.GetCell(0).GetPoints().GetData() poly.GetPoints().SetData(vpts) return self._update(poly) out = self._update(sf.GetOutput()) out.pipeline = OperationNode( "join", parents=[self], comment=f"#pts {out.inputdata().GetNumberOfPoints()}" ) return out def join_segments(self, closed=True, tol=1e-03): """ Join line segments into contiguous lines. Useful to call with `triangulate()` method. Returns: list of `shapes.Lines` Example: ```python from vedo import * msh = Torus().alpha(0.1).wireframe() intersection = msh.intersect_with_plane(normal=[1,1,1]).c('purple5') slices = [s.triangulate() for s in intersection.join_segments()] show(msh, intersection, merge(slices), axes=1, viewup='z') ``` ![](https://vedo.embl.es/images/feats/join_segments.jpg) """ vlines = [] for ipiece, outline in enumerate(self.split(must_share_edge=False)): outline.clean() pts = outline.points() if len(pts) < 3: continue avesize = outline.average_size() lines = outline.lines() # print("---lines", lines, "in piece", ipiece) tol = avesize / pts.shape[0] * tol k = 0 joinedpts = [pts[k]] for _ in range(len(pts)): pk = pts[k] for j, line in enumerate(lines): id0, id1 = line[0], line[-1] p0, p1 = pts[id0], pts[id1] if np.linalg.norm(p0 - pk) < tol: n = len(line) for m in range(1, n): joinedpts.append(pts[line[m]]) # joinedpts.append(p1) k = id1 lines.pop(j) break elif np.linalg.norm(p1 - pk) < tol: n = len(line) for m in reversed(range(0, n - 1)): joinedpts.append(pts[line[m]]) # joinedpts.append(p0) k = id0 lines.pop(j) break if len(joinedpts) > 1: newline = vedo.shapes.Line(joinedpts, closed=closed) newline.clean() newline.SetProperty(self.GetProperty()) newline.property = self.GetProperty() newline.pipeline = OperationNode( "join_segments", parents=[self], comment=f"#pts {newline._data.GetNumberOfPoints()}", ) vlines.append(newline) return vlines def slice(self, origin=(0, 0, 0), normal=(1, 0, 0)): """ Slice a mesh with a plane and fill the contour. Example: ```python from vedo import * msh = Mesh(dataurl+"bunny.obj").alpha(0.1).wireframe() mslice = msh.slice(normal=[0,1,0.3], origin=[0,0.16,0]) mslice.c('purple5') show(msh, mslice, axes=1) ``` ![](https://vedo.embl.es/images/feats/mesh_slice.jpg) See also: `join()`, `join_segments()`, `cap()`, `cut_with_plane()`. """ intersection = self.intersect_with_plane(origin=origin, normal=normal) slices = [s.triangulate() for s in intersection.join_segments()] mslices = vedo.pointcloud.merge(slices) if mslices: mslices.name = "MeshSlice" mslices.pipeline = OperationNode("slice", parents=[self], comment=f"normal = {normal}") return mslices def triangulate(self, verts=True, lines=True): """ Converts mesh polygons into triangles. If the input mesh is only made of 2D lines (no faces) the output will be a triangulation that fills the internal area. The contours may be concave, and may even contain holes, i.e. a contour may contain an internal contour winding in the opposite direction to indicate that it is a hole. Arguments: verts : (bool) if True, break input vertex cells into individual vertex cells (one point per cell). If False, the input vertex cells will be ignored. lines : (bool) if True, break input polylines into line segments. If False, input lines will be ignored and the output will have no lines. """ if self._data.GetNumberOfPolys() or self._data.GetNumberOfStrips(): # print("vtkTriangleFilter") tf = vtk.vtkTriangleFilter() tf.SetPassLines(lines) tf.SetPassVerts(verts) elif self._data.GetNumberOfLines(): # print("vtkContourTriangulator") tf = vtk.vtkContourTriangulator() tf.TriangulationErrorDisplayOn() else: vedo.logger.debug("input in triangulate() seems to be void! Skip.") return self tf.SetInputData(self._data) tf.Update() out = self._update(tf.GetOutput()).lw(0).lighting("default") out.PickableOn() out.pipeline = OperationNode( "triangulate", parents=[self], comment=f"#cells {out.inputdata().GetNumberOfCells()}" ) return out def compute_cell_area(self, name="Area"): """Add to this mesh a cell data array containing the areas of the polygonal faces""" csf = vtk.vtkCellSizeFilter() csf.SetInputData(self.polydata(False)) csf.SetComputeArea(True) csf.SetComputeVolume(False) csf.SetComputeLength(False) csf.SetComputeVertexCount(False) csf.SetAreaArrayName(name) csf.Update() return self._update(csf.GetOutput()) def compute_cell_vertex_count(self, name="VertexCount"): """Add to this mesh a cell data array containing the nr of vertices that a polygonal face has.""" csf = vtk.vtkCellSizeFilter() csf.SetInputData(self.polydata(False)) csf.SetComputeArea(False) csf.SetComputeVolume(False) csf.SetComputeLength(False) csf.SetComputeVertexCount(True) csf.SetVertexCountArrayName(name) csf.Update() return self._update(csf.GetOutput()) def compute_quality(self, metric=6): """ Calculate metrics of quality for the elements of a triangular mesh. This method adds to the mesh a cell array named "Quality". See class [vtkMeshQuality](https://vtk.org/doc/nightly/html/classvtkMeshQuality.html) for explanation. Arguments: metric : (int) type of available estimators are: - EDGE RATIO, 0 - ASPECT RATIO, 1 - RADIUS RATIO, 2 - ASPECT FROBENIUS, 3 - MED ASPECT FROBENIUS, 4 - MAX ASPECT FROBENIUS, 5 - MIN_ANGLE, 6 - COLLAPSE RATIO, 7 - MAX ANGLE, 8 - CONDITION, 9 - SCALED JACOBIAN, 10 - SHEAR, 11 - RELATIVE SIZE SQUARED, 12 - SHAPE, 13 - SHAPE AND SIZE, 14 - DISTORTION, 15 - MAX EDGE RATIO, 16 - SKEW, 17 - TAPER, 18 - VOLUME, 19 - STRETCH, 20 - DIAGONAL, 21 - DIMENSION, 22 - ODDY, 23 - SHEAR AND SIZE, 24 - JACOBIAN, 25 - WARPAGE, 26 - ASPECT GAMMA, 27 - AREA, 28 - ASPECT BETA, 29 Examples: - [meshquality.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/meshquality.py) ![](https://vedo.embl.es/images/advanced/meshquality.png) """ qf = vtk.vtkMeshQuality() qf.SetInputData(self.polydata(False)) qf.SetTriangleQualityMeasure(metric) qf.SaveCellQualityOn() qf.Update() pd = qf.GetOutput() self._update(pd) self.pipeline = OperationNode("compute_quality", parents=[self]) return self def check_validity(self, tol=0): """ Return an array of possible problematic faces following this convention: - Valid = 0 - WrongNumberOfPoints = 1 - IntersectingEdges = 2 - IntersectingFaces = 4 - NoncontiguousEdges = 8 - Nonconvex = 10 - OrientedIncorrectly = 20 Arguments: tol : (float) value is used as an epsilon for floating point equality checks throughout the cell checking process. """ vald = vtk.vtkCellValidator() if tol: vald.SetTolerance(tol) vald.SetInputData(self._data) vald.Update() varr = vald.GetOutput().GetCellData().GetArray("ValidityState") return vtk2numpy(varr) def compute_curvature(self, method=0): """ Add scalars to `Mesh` that contains the curvature calculated in three different ways. Variable `method` can be: - 0 = gaussian - 1 = mean curvature - 2 = max curvature - 3 = min curvature Example: ```python from vedo import Torus Torus().compute_curvature().add_scalarbar().show(axes=1).close() ``` ![](https://user-images.githubusercontent.com/32848391/51934810-c2e88c00-2404-11e9-8e7e-ca0b7984bbb7.png) """ curve = vtk.vtkCurvatures() curve.SetInputData(self._data) curve.SetCurvatureType(method) curve.Update() self._update(curve.GetOutput()) self._mapper.ScalarVisibilityOn() return self def compute_elevation(self, low=(0, 0, 0), high=(0, 0, 1), vrange=(0, 1)): """ Add to `Mesh` a scalar array that contains distance along a specified direction. Arguments: low : (list) one end of the line (small scalar values) high : (list) other end of the line (large scalar values) vrange : (list) set the range of the scalar Example: ```python from vedo import Sphere s = Sphere().compute_elevation(low=(0,0,0), high=(1,1,1)) s.add_scalarbar().show(axes=1).close() ``` ![](https://user-images.githubusercontent.com/32848391/68478872-3986a580-0231-11ea-8245-b68a683aa295.png) """ ef = vtk.vtkElevationFilter() ef.SetInputData(self.polydata()) ef.SetLowPoint(low) ef.SetHighPoint(high) ef.SetScalarRange(vrange) ef.Update() self._update(ef.GetOutput()) self._mapper.ScalarVisibilityOn() return self def subdivide(self, n=1, method=0, mel=None): """ Increase the number of vertices of a surface mesh. Arguments: n : (int) number of subdivisions. method : (int) Loop(0), Linear(1), Adaptive(2), Butterfly(3), Centroid(4) mel : (float) Maximum Edge Length (applicable to Adaptive method only). """ triangles = vtk.vtkTriangleFilter() triangles.SetInputData(self._data) triangles.Update() originalMesh = triangles.GetOutput() if method == 0: sdf = vtk.vtkLoopSubdivisionFilter() elif method == 1: sdf = vtk.vtkLinearSubdivisionFilter() elif method == 2: sdf = vtk.vtkAdaptiveSubdivisionFilter() if mel is None: mel = self.diagonal_size() / np.sqrt(self._data.GetNumberOfPoints()) / n sdf.SetMaximumEdgeLength(mel) elif method == 3: sdf = vtk.vtkButterflySubdivisionFilter() elif method == 4: sdf = vtk.vtkDensifyPolyData() else: vedo.logger.error(f"in subdivide() unknown method {method}") raise RuntimeError() if method != 2: sdf.SetNumberOfSubdivisions(n) sdf.SetInputData(originalMesh) sdf.Update() out = sdf.GetOutput() self.pipeline = OperationNode( "subdivide", parents=[self], comment=f"#pts {out.GetNumberOfPoints()}" ) return self._update(out) def decimate(self, fraction=0.5, n=None, method="quadric", boundaries=False): """ Downsample the number of vertices in a mesh to `fraction`. Arguments: fraction : (float) the desired target of reduction. n : (int) the desired number of final points (`fraction` is recalculated based on it). method : (str) can be either 'quadric' or 'pro'. In the first case triagulation will look like more regular, irrespective of the mesh original curvature. In the second case triangles are more irregular but mesh is more precise on more curved regions. boundaries : (bool) in "pro" mode decide whether to leave boundaries untouched or not .. note:: Setting `fraction=0.1` leaves 10% of the original number of vertices """ poly = self._data if n: # N = desired number of points npt = poly.GetNumberOfPoints() fraction = n / npt if fraction >= 1: return self if "quad" in method: decimate = vtk.vtkQuadricDecimation() # decimate.SetVolumePreservation(True) else: decimate = vtk.vtkDecimatePro() decimate.PreserveTopologyOn() if boundaries: decimate.BoundaryVertexDeletionOff() else: decimate.BoundaryVertexDeletionOn() decimate.SetInputData(poly) decimate.SetTargetReduction(1 - fraction) decimate.Update() out = decimate.GetOutput() self.pipeline = OperationNode( "decimate", parents=[self], comment=f"#pts {out.GetNumberOfPoints()}" ) return self._update(out) def collapse_edges(self, distance, iterations=1): """Collapse mesh edges so that are all above distance.""" self.clean() x0, x1, y0, y1, z0, z1 = self.bounds() fs = min(x1 - x0, y1 - y0, z1 - z0) / 10 d2 = distance * distance if distance > fs: vedo.logger.error(f"distance parameter is too large, should be < {fs}, skip!") return self for _ in range(iterations): medges = self.edges() pts = self.points() newpts = np.array(pts) moved = [] for e in medges: if len(e) == 2: id0, id1 = e p0, p1 = pts[id0], pts[id1] d = mag2(p1 - p0) if d < d2 and id0 not in moved and id1 not in moved: p = (p0 + p1) / 2 newpts[id0] = p newpts[id1] = p moved += [id0, id1] self.points(newpts) self.clean() self.compute_normals() self.pipeline = OperationNode( "collapse_edges", parents=[self], comment=f"#pts {self._data.GetNumberOfPoints()}" ) return self def smooth(self, niter=15, pass_band=0.1, edge_angle=15, feature_angle=60, boundary=False): """ Adjust mesh point positions using the `Windowed Sinc` function interpolation kernel. Arguments: niter : (int) number of iterations. pass_band : (float) set the pass_band value for the windowed sinc filter. edge_angle : (float) edge angle to control smoothing along edges (either interior or boundary). feature_angle : (float) specifies the feature angle for sharp edge identification. boundary : (bool) specify if boundary should also be smoothed or kept unmodified Examples: - [mesh_smoother1.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/mesh_smoother1.py) ![](https://vedo.embl.es/images/advanced/mesh_smoother2.png) """ poly = self._data cl = vtk.vtkCleanPolyData() cl.SetInputData(poly) cl.Update() smf = vtk.vtkWindowedSincPolyDataFilter() smf.SetInputData(cl.GetOutput()) smf.SetNumberOfIterations(niter) smf.SetEdgeAngle(edge_angle) smf.SetFeatureAngle(feature_angle) smf.SetPassBand(pass_band) smf.NormalizeCoordinatesOn() smf.NonManifoldSmoothingOn() smf.FeatureEdgeSmoothingOn() smf.SetBoundarySmoothing(boundary) smf.Update() out = self._update(smf.GetOutput()) out.pipeline = OperationNode( "smooth", parents=[self], comment=f"#pts {out.inputdata().GetNumberOfPoints()}" ) return out @deprecated(reason=vedo.colors.red + "Please use fill_holes()" + vedo.colors.reset) def fillHoles(self, size=None): """Deprecated. Please use `fill_holes()`""" return self.fill_holes(size) def fill_holes(self, size=None): """ Identifies and fills holes in input mesh. Holes are identified by locating boundary edges, linking them together into loops, and then triangulating the resulting loops. Arguments: size : (float) Approximate limit to the size of the hole that can be filled. The default is None. Examples: - [fillholes.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/fillholes.py) """ fh = vtk.vtkFillHolesFilter() if not size: mb = self.diagonal_size() size = mb / 10 fh.SetHoleSize(size) fh.SetInputData(self._data) fh.Update() out = self._update(fh.GetOutput()) out.pipeline = OperationNode( "fill_holes", parents=[self], comment=f"#pts {out.inputdata().GetNumberOfPoints()}" ) return out def is_inside(self, point, tol=1e-05): """Return True if point is inside a polydata closed surface.""" poly = self.polydata() points = vtk.vtkPoints() points.InsertNextPoint(point) pointsPolydata = vtk.vtkPolyData() pointsPolydata.SetPoints(points) sep = vtk.vtkSelectEnclosedPoints() sep.SetTolerance(tol) sep.CheckSurfaceOff() sep.SetInputData(pointsPolydata) sep.SetSurfaceData(poly) sep.Update() return sep.IsInside(0) def inside_points(self, pts, invert=False, tol=1e-05, return_ids=False): """ Return the point cloud that is inside mesh surface as a new Points object. If return_ids is True a list of IDs is returned and in addition input points are marked by a pointdata array named "IsInside". Example: `print(pts.pointdata["IsInside"])` Examples: - [pca_ellipsoid.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/pca_ellipsoid.py) ![](https://vedo.embl.es/images/basic/pca.png) """ if isinstance(pts, Points): pointsPolydata = pts.polydata() ptsa = pts.points() else: ptsa = np.asarray(pts) vpoints = vtk.vtkPoints() vpoints.SetData(numpy2vtk(ptsa, dtype=np.float32)) pointsPolydata = vtk.vtkPolyData() pointsPolydata.SetPoints(vpoints) sep = vtk.vtkSelectEnclosedPoints() # sep = vtk.vtkExtractEnclosedPoints() sep.SetTolerance(tol) sep.SetInputData(pointsPolydata) sep.SetSurfaceData(self.polydata()) sep.SetInsideOut(invert) sep.Update() varr = sep.GetOutput().GetPointData().GetArray("SelectedPoints") mask = vtk2numpy(varr).astype(bool) ids = np.array(range(len(ptsa)), dtype=int)[mask] if isinstance(pts, Points): varr.SetName("IsInside") pts.inputdata().GetPointData().AddArray(varr) if return_ids: return ids pcl = Points(ptsa[ids]) pcl.name = "InsidePoints" pcl.pipeline = OperationNode( "inside_points", parents=[self, ptsa], comment=f"#pts {pcl.inputdata().GetNumberOfPoints()}" ) return pcl def boundaries( self, boundary_edges=True, manifold_edges=False, non_manifold_edges=False, feature_angle=None, return_point_ids=False, return_cell_ids=False, cell_edge=False, ): """ Return the boundary lines of an input mesh. Check also `vedo.base.BaseActor.mark_boundaries()` method. Arguments: boundary_edges : (bool) Turn on/off the extraction of boundary edges. manifold_edges : (bool) Turn on/off the extraction of manifold edges. non_manifold_edges : (bool) Turn on/off the extraction of non-manifold edges. feature_angle : (bool) Specify the min angle btw 2 faces for extracting edges. return_point_ids : (bool) return a numpy array of point indices return_cell_ids : (bool) return a numpy array of cell indices cell_edge : (bool) set to `True` if a cell need to share an edge with the boundary line, or `False` if a single vertex is enough Examples: - [boundaries.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/boundaries.py) ![](https://vedo.embl.es/images/basic/boundaries.png) """ fe = vtk.vtkFeatureEdges() fe.SetBoundaryEdges(boundary_edges) fe.SetNonManifoldEdges(non_manifold_edges) fe.SetManifoldEdges(manifold_edges) # fe.SetPassLines(True) # vtk9.2 fe.ColoringOff() fe.SetFeatureEdges(False) if feature_angle is not None: fe.SetFeatureEdges(True) fe.SetFeatureAngle(feature_angle) if return_point_ids or return_cell_ids: idf = vtk.vtkIdFilter() idf.SetInputData(self.polydata()) idf.SetPointIdsArrayName("BoundaryIds") idf.SetPointIds(True) idf.Update() fe.SetInputData(idf.GetOutput()) fe.Update() vid = fe.GetOutput().GetPointData().GetArray("BoundaryIds") npid = vtk2numpy(vid).astype(int) if return_point_ids: return npid if return_cell_ids: n = 1 if cell_edge else 0 inface = [] for i, face in enumerate(self.faces()): # isin = np.any([vtx in npid for vtx in face]) isin = 0 for vtx in face: isin += int(vtx in npid) if isin > n: break if isin > n: inface.append(i) return np.array(inface).astype(int) return self else: fe.SetInputData(self.polydata()) fe.Update() msh = Mesh(fe.GetOutput(), c="p").lw(5).lighting("off") msh.pipeline = OperationNode( "boundaries", parents=[self], shape="octagon", comment=f"#pts {msh.inputdata().GetNumberOfPoints()}", ) return msh def imprint(self, loopline, tol=0.01): """ Imprint the contact surface of one object onto another surface. Arguments: loopline : vedo.shapes.Line a Line object to be imprinted onto the mesh. tol : (float), optional projection tolerance which controls how close the imprint surface must be to the target. Example: ```python from vedo import * grid = Grid()#.triangulate() circle = Circle(r=0.3, res=24).pos(0.11,0.12) line = Line(circle, closed=True, lw=4, c='r4') grid.imprint(line) show(grid, line, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/imprint.png) """ loop = vtk.vtkContourLoopExtraction() loop.SetInputData(loopline.polydata()) loop.Update() clean_loop = vtk.vtkCleanPolyData() clean_loop.SetInputData(loop.GetOutput()) clean_loop.Update() imp = vtk.vtkImprintFilter() imp.SetTargetData(self.polydata()) imp.SetImprintData(clean_loop.GetOutput()) imp.SetTolerance(tol) imp.BoundaryEdgeInsertionOn() imp.TriangulateOutputOn() imp.Update() out = self._update(imp.GetOutput()) out.pipeline = OperationNode( "imprint", parents=[self], comment=f"#pts {out.inputdata().GetNumberOfPoints()}" ) return out def connected_vertices(self, index): """Find all vertices connected to an input vertex specified by its index. Examples: - [connected_vtx.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/connected_vtx.py) ![](https://vedo.embl.es/images/basic/connVtx.png) """ poly = self._data cell_idlist = vtk.vtkIdList() poly.GetPointCells(index, cell_idlist) idxs = [] for i in range(cell_idlist.GetNumberOfIds()): point_idlist = vtk.vtkIdList() poly.GetCellPoints(cell_idlist.GetId(i), point_idlist) for j in range(point_idlist.GetNumberOfIds()): idj = point_idlist.GetId(j) if idj == index: continue if idj in idxs: continue idxs.append(idj) return idxs def connected_cells(self, index, return_ids=False): """Find all cellls connected to an input vertex specified by its index.""" # Find all cells connected to point index dpoly = self._data idlist = vtk.vtkIdList() dpoly.GetPointCells(index, idlist) ids = vtk.vtkIdTypeArray() ids.SetNumberOfComponents(1) rids = [] for k in range(idlist.GetNumberOfIds()): cid = idlist.GetId(k) ids.InsertNextValue(cid) rids.append(int(cid)) if return_ids: return rids selection_node = vtk.vtkSelectionNode() selection_node.SetFieldType(vtk.vtkSelectionNode.CELL) selection_node.SetContentType(vtk.vtkSelectionNode.INDICES) selection_node.SetSelectionList(ids) selection = vtk.vtkSelection() selection.AddNode(selection_node) extractSelection = vtk.vtkExtractSelection() extractSelection.SetInputData(0, dpoly) extractSelection.SetInputData(1, selection) extractSelection.Update() gf = vtk.vtkGeometryFilter() gf.SetInputData(extractSelection.GetOutput()) gf.Update() return Mesh(gf.GetOutput()).lw(1) def silhouette(self, direction=None, border_edges=True, feature_angle=False): """ Return a new line `Mesh` which corresponds to the outer `silhouette` of the input as seen along a specified `direction`, this can also be a `vtkCamera` object. Arguments: direction : (list) viewpoint direction vector. If *None* this is guessed by looking at the minimum of the sides of the bounding box. border_edges : (bool) enable or disable generation of border edges feature_angle : (float) minimal angle for sharp edges detection. If set to `False` the functionality is disabled. Examples: - [silhouette1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/silhouette1.py) ![](https://vedo.embl.es/images/basic/silhouette1.png) """ sil = vtk.vtkPolyDataSilhouette() sil.SetInputData(self.polydata()) sil.SetBorderEdges(border_edges) if feature_angle is False: sil.SetEnableFeatureAngle(0) else: sil.SetEnableFeatureAngle(1) sil.SetFeatureAngle(feature_angle) if direction is None and vedo.plotter_instance and vedo.plotter_instance.camera: sil.SetCamera(vedo.plotter_instance.camera) m = Mesh() m.mapper().SetInputConnection(sil.GetOutputPort()) elif isinstance(direction, vtk.vtkCamera): sil.SetCamera(direction) m = Mesh() m.mapper().SetInputConnection(sil.GetOutputPort()) elif direction == "2d": sil.SetVector(3.4, 4.5, 5.6) # random sil.SetDirectionToSpecifiedVector() sil.Update() m = Mesh(sil.GetOutput()) elif is_sequence(direction): sil.SetVector(direction) sil.SetDirectionToSpecifiedVector() sil.Update() m = Mesh(sil.GetOutput()) else: vedo.logger.error(f"in silhouette() unknown direction type {type(direction)}") vedo.logger.error("first render the scene with show() or specify camera/direction") return self m.lw(2).c((0, 0, 0)).lighting("off") m.mapper().SetResolveCoincidentTopologyToPolygonOffset() m.pipeline = OperationNode("silhouette", parents=[self]) return m @deprecated(reason=vedo.colors.red + "Please use follow_camera()" + vedo.colors.reset) def followCamera(self, cam=None): "Deprecated. Please use `follow_camera()`" return self.follow_camera(cam) def follow_camera(self, camera=None): """ Return an object that will follow camera movements and stay locked to it. Use `mesh.follow_camera(False)` to disable it. A `vtkCamera` object can also be passed. """ if camera is False: try: self.SetCamera(None) return self except AttributeError: return self factor = Follower(self, camera) if isinstance(camera, vtk.vtkCamera): factor.SetCamera(camera) else: plt = vedo.plotter_instance if plt and plt.renderer and plt.renderer.GetActiveCamera(): factor.SetCamera(plt.renderer.GetActiveCamera()) else: factor._isfollower = True # postpone to show() call return factor def isobands(self, n=10, vmin=None, vmax=None): """ Return a new `Mesh` representing the isobands of the active scalars. This is a new mesh where the scalar is now associated to cell faces and used to colorize the mesh. Arguments: n : (int) number of isobands in the range vmin : (float) minimum of the range vmax : (float) maximum of the range Examples: - [isolines.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/isolines.py) """ r0, r1 = self._data.GetScalarRange() if vmin is None: vmin = r0 if vmax is None: vmax = r1 # -------------------------------- bands = [] dx = (vmax - vmin) / float(n) b = [vmin, vmin + dx / 2.0, vmin + dx] i = 0 while i < n: bands.append(b) b = [b[0] + dx, b[1] + dx, b[2] + dx] i += 1 # annotate, use the midpoint of the band as the label lut = self.mapper().GetLookupTable() labels = [] for b in bands: labels.append("{:4.2f}".format(b[1])) values = vtk.vtkVariantArray() for la in labels: values.InsertNextValue(vtk.vtkVariant(la)) for i in range(values.GetNumberOfTuples()): lut.SetAnnotation(i, values.GetValue(i).ToString()) bcf = vtk.vtkBandedPolyDataContourFilter() bcf.SetInputData(self.polydata()) # Use either the minimum or maximum value for each band. for i, band in enumerate(bands): bcf.SetValue(i, band[2]) # We will use an indexed lookup table. bcf.SetScalarModeToIndex() bcf.GenerateContourEdgesOff() bcf.Update() bcf.GetOutput().GetCellData().GetScalars().SetName("IsoBands") m1 = Mesh(bcf.GetOutput()).compute_normals(cells=True) m1.mapper().SetLookupTable(lut) m1.pipeline = OperationNode("isobands", parents=[self]) return m1 def isolines(self, n=10, vmin=None, vmax=None): """ Return a new `Mesh` representing the isolines of the active scalars. Arguments: n : (int) number of isolines in the range vmin : (float) minimum of the range vmax : (float) maximum of the range Examples: - [isolines.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/isolines.py) ![](https://vedo.embl.es/images/pyplot/isolines.png) """ bcf = vtk.vtkContourFilter() bcf.SetInputData(self.polydata()) r0, r1 = self._data.GetScalarRange() if vmin is None: vmin = r0 if vmax is None: vmax = r1 bcf.GenerateValues(n, vmin, vmax) bcf.Update() sf = vtk.vtkStripper() sf.SetJoinContiguousSegments(True) sf.SetInputData(bcf.GetOutput()) sf.Update() cl = vtk.vtkCleanPolyData() cl.SetInputData(sf.GetOutput()) cl.Update() msh = Mesh(cl.GetOutput(), c="k").lighting("off") msh.mapper().SetResolveCoincidentTopologyToPolygonOffset() msh.pipeline = OperationNode("isolines", parents=[self]) return msh def extrude(self, zshift=1, rotation=0, dR=0, cap=True, res=1): """ Sweep a polygonal data creating a "skirt" from free edges and lines, and lines from vertices. The input dataset is swept around the z-axis to create new polygonal primitives. For example, sweeping a line results in a cylindrical shell, and sweeping a circle creates a torus. You can control whether the sweep of a 2D object (i.e., polygon or triangle strip) is capped with the generating geometry. Also, you can control the angle of rotation, and whether translation along the z-axis is performed along with the rotation. (Translation is useful for creating "springs"). You also can adjust the radius of the generating geometry using the "dR" keyword. The skirt is generated by locating certain topological features. Free edges (edges of polygons or triangle strips only used by one polygon or triangle strips) generate surfaces. This is true also of lines or polylines. Vertices generate lines. This filter can be used to model axisymmetric objects like cylinders, bottles, and wine glasses; or translational/rotational symmetric objects like springs or corkscrews. Warning: Some polygonal objects have no free edges (e.g., sphere). When swept, this will result in two separate surfaces if capping is on, or no surface if capping is off. Examples: - [extrude.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/extrude.py) ![](https://vedo.embl.es/images/basic/extrude.png) """ if is_sequence(zshift): # ms = [] # todo # poly0 = self.clone().polydata() # for i in range(len(zshift)-1): # rf = vtk.vtkRotationalExtrusionFilter() # rf.SetInputData(poly0) # rf.SetResolution(res) # rf.SetCapping(0) # rf.SetAngle(rotation) # rf.SetTranslation(zshift) # rf.SetDeltaRadius(dR) # rf.Update() # poly1 = rf.GetOutput() return self rf = vtk.vtkRotationalExtrusionFilter() # rf = vtk.vtkLinearExtrusionFilter() rf.SetInputData(self.polydata(False)) # must not be transformed rf.SetResolution(res) rf.SetCapping(cap) rf.SetAngle(rotation) rf.SetTranslation(zshift) rf.SetDeltaRadius(dR) rf.Update() m = Mesh(rf.GetOutput(), c=self.c(), alpha=self.alpha()) prop = vtk.vtkProperty() prop.DeepCopy(self.property) m.SetProperty(prop) m.property = prop # assign the same transformation m.SetOrigin(self.GetOrigin()) m.SetScale(self.GetScale()) m.SetOrientation(self.GetOrientation()) m.SetPosition(self.GetPosition()) m.compute_normals(cells=False).flat().lighting("default") m.pipeline = OperationNode( "extrude", parents=[self], comment=f"#pts {m.inputdata().GetNumberOfPoints()}" ) return m def split(self, maxdepth=1000, flag=False, must_share_edge=False, sort_by_area=True): """ Split a mesh by connectivity and order the pieces by increasing area. Arguments: maxdepth : (int) only consider this maximum number of mesh parts. flag : (bool) if set to True return the same single object, but add a "RegionId" array to flag the mesh subparts must_share_edge : (bool) if True, mesh regions that only share single points will be split. sort_by_area : (bool) if True, sort the mesh parts by decreasing area. Examples: - [splitmesh.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/splitmesh.py) ![](https://vedo.embl.es/images/advanced/splitmesh.png) """ pd = self.polydata(False) if must_share_edge: if pd.GetNumberOfPolys() == 0: vedo.logger.warning("in split(): no polygons found. Skip.") return [self] cf = vtk.vtkPolyDataEdgeConnectivityFilter() cf.BarrierEdgesOff() else: cf = vtk.vtkPolyDataConnectivityFilter() cf.SetInputData(pd) cf.SetExtractionModeToAllRegions() cf.SetColorRegions(True) cf.Update() out = cf.GetOutput() if not out.GetNumberOfPoints(): return [self] if flag: self.pipeline = OperationNode("split mesh", parents=[self]) return self._update(out) a = Mesh(out) if must_share_edge: arr = a.celldata["RegionId"] on = "cells" else: arr = a.pointdata["RegionId"] on = "points" alist = [] for t in range(max(arr) + 1): if t == maxdepth: break suba = a.clone().threshold("RegionId", t, t, on=on) if sort_by_area: area = suba.area() else: area = 0 # dummy alist.append([suba, area]) if sort_by_area: alist.sort(key=lambda x: x[1]) alist.reverse() blist = [] for i, l in enumerate(alist): l[0].color(i + 1).phong() l[0].mapper().ScalarVisibilityOff() blist.append(l[0]) if i < 10: l[0].pipeline = OperationNode( f"split mesh {i}", parents=[self], comment=f"#pts {l[0].inputdata().GetNumberOfPoints()}", ) return blist @deprecated(reason=vedo.colors.red + "Please use extract_largest_region()" + vedo.colors.reset) def extractLargestRegion(self): "Deprecated. Please use `extract_largest_region()`" return self.extract_largest_region() def extract_largest_region(self): """ Extract the largest connected part of a mesh and discard all the smaller pieces. Examples: - [largestregion.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/largestregion.py) """ conn = vtk.vtkPolyDataConnectivityFilter() conn.SetExtractionModeToLargestRegion() conn.ScalarConnectivityOff() conn.SetInputData(self._data) conn.Update() m = Mesh(conn.GetOutput()) pr = vtk.vtkProperty() pr.DeepCopy(self.property) m.SetProperty(pr) m.property = pr # assign the same transformation m.SetOrigin(self.GetOrigin()) m.SetScale(self.GetScale()) m.SetOrientation(self.GetOrientation()) m.SetPosition(self.GetPosition()) vis = self._mapper.GetScalarVisibility() m.mapper().SetScalarVisibility(vis) m.pipeline = OperationNode( "extract_largest_region", parents=[self], comment=f"#pts {m.inputdata().GetNumberOfPoints()}" ) return m def boolean(self, operation, mesh2, method=0, tol=None): """Volumetric union, intersection and subtraction of surfaces. Use `operation` for the allowed operations `['plus', 'intersect', 'minus']`. Two possible algorithms are available by changing `method`. Example: - [boolean.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/boolean.py) ![](https://vedo.embl.es/images/basic/boolean.png) """ if method == 0: bf = vtk.vtkBooleanOperationPolyDataFilter() elif method == 1: bf = vtk.vtkLoopBooleanPolyDataFilter() else: raise ValueError(f"Unknown method={method}") poly1 = self.compute_normals().polydata() poly2 = mesh2.compute_normals().polydata() if operation.lower() in ("plus", "+"): bf.SetOperationToUnion() elif operation.lower() == "intersect": bf.SetOperationToIntersection() elif operation.lower() in ("minus", "-"): bf.SetOperationToDifference() if tol: bf.SetTolerance(tol) bf.SetInputData(0, poly1) bf.SetInputData(1, poly2) bf.Update() msh = Mesh(bf.GetOutput(), c=None) msh.flat() msh.name = self.name + operation + mesh2.name msh.pipeline = OperationNode( "boolean " + operation, parents=[self, mesh2], shape="cylinder", comment=f"#pts {msh.inputdata().GetNumberOfPoints()}", ) return msh @deprecated(reason=vedo.colors.red + "Please use intersect_with()" + vedo.colors.reset) def intersectWith(self, mesh2, tol=1e-06): "Deprecated. Please use `intersect_with()`" return self.intersect_with(mesh2, tol) @deprecated(reason=vedo.colors.red + "Please use intersect_with_line()" + vedo.colors.reset) def intersectWithLine(self, p0, p1=None, returnIds=False, tol=0): "Deprecated. Please use `intersect_with_line()`" return self.intersect_with_line(p0, p1, returnIds, tol) def intersect_with(self, mesh2, tol=1e-06): """ Intersect this Mesh with the input surface to return a set of lines. Examples: - [surf_intersect.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/surf_intersect.py) ![](https://vedo.embl.es/images/basic/surfIntersect.png) """ bf = vtk.vtkIntersectionPolyDataFilter() bf.SetGlobalWarningDisplay(0) poly1 = self.polydata() poly2 = mesh2.polydata() bf.SetTolerance(tol) bf.SetInputData(0, poly1) bf.SetInputData(1, poly2) bf.Update() msh = Mesh(bf.GetOutput(), "k", 1).lighting("off") msh.GetProperty().SetLineWidth(3) msh.name = "SurfaceIntersection" msh.pipeline = OperationNode( "intersect_with", parents=[self, mesh2], comment=f"#pts {msh.npoints}" ) return msh def intersect_with_line(self, p0, p1=None, return_ids=False, tol=0): """ Return the list of points intersecting the mesh along the segment defined by two points `p0` and `p1`. Use `return_ids` to return the cell ids along with point coords Example: ```python from vedo import * s = Spring() pts = s.intersect_with_line([0,0,0], [1,0.1,0]) ln = Line([0,0,0], [1,0.1,0], c='blue') ps = Points(pts, r=10, c='r') show(s, ln, ps, bg='white').close() ``` ![](https://user-images.githubusercontent.com/32848391/55967065-eee08300-5c79-11e9-8933-265e1bab9f7e.png) """ if isinstance(p0, Points): p0, p1 = p0.points() if not self.line_locator: self.line_locator = vtk.vtkOBBTree() self.line_locator.SetDataSet(self.polydata()) if not tol: tol = mag(np.asarray(p1) - np.asarray(p0)) / 10000 self.line_locator.SetTolerance(tol) self.line_locator.BuildLocator() vpts = vtk.vtkPoints() idlist = vtk.vtkIdList() self.line_locator.IntersectWithLine(p0, p1, vpts, idlist) pts = [] for i in range(vpts.GetNumberOfPoints()): intersection = [0, 0, 0] vpts.GetPoint(i, intersection) pts.append(intersection) pts = np.array(pts) if return_ids: pts_ids = [] for i in range(idlist.GetNumberOfIds()): cid = idlist.GetId(i) pts_ids.append(cid) return (pts, np.array(pts_ids).astype(np.uint32)) return pts def intersect_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0)): """ Intersect this Mesh with a plane to return a set of lines. Example: ```python from vedo import * sph = Sphere() mi = sph.clone().intersect_with_plane().join() print(mi.lines()) show(sph, mi, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/intersect_plane.png) """ plane = vtk.vtkPlane() plane.SetOrigin(origin) plane.SetNormal(normal) cutter = vtk.vtkPolyDataPlaneCutter() cutter.SetInputData(self.polydata()) cutter.SetPlane(plane) cutter.InterpolateAttributesOn() cutter.ComputeNormalsOff() cutter.Update() msh = Mesh(cutter.GetOutput(), "k", 1).lighting("off") msh.GetProperty().SetLineWidth(3) msh.name = "PlaneIntersection" msh.pipeline = OperationNode( "intersect_with_plan", parents=[self], comment=f"#pts {msh.inputdata().GetNumberOfPoints()}" ) return msh # def intersect_with_multiplanes(self, origins, normals): ## WRONG # """ # Generate a set of lines from cutting a mesh in n intervals # between a minimum and maximum distance from a plane of given origin and normal. # Arguments: # origin : (list) # the point of the cutting plane # normal : (list) # normal vector to the cutting plane # n : (int) # number of cuts # """ # poly = self.polydata() # planes = vtk.vtkPlanes() # planes.SetOrigin(numpy2vtk(origins)) # planes.SetNormals(numpy2vtk(normals)) # cutter = vtk.vtkCutter() # cutter.SetCutFunction(planes) # cutter.SetInputData(poly) # cutter.SetValue(0, 0.0) # cutter.Update() # msh = Mesh(cutter.GetOutput()) # msh.property.LightingOff() # msh.property.SetColor(get_color("k2")) # msh.pipeline = OperationNode( # "intersect_with_multiplanes", # parents=[self], # comment=f"#pts {msh.inputdata().GetNumberOfPoints()}", # ) # return msh def collide_with(self, mesh2, tol=0, return_bool=False): """ Collide this Mesh with the input surface. Information is stored in `ContactCells1` and `ContactCells2`. """ ipdf = vtk.vtkCollisionDetectionFilter() # ipdf.SetGlobalWarningDisplay(0) transform0 = vtk.vtkTransform() transform1 = vtk.vtkTransform() # ipdf.SetBoxTolerance(tol) ipdf.SetCellTolerance(tol) ipdf.SetInputData(0, self.polydata()) ipdf.SetInputData(1, mesh2.polydata()) ipdf.SetTransform(0, transform0) ipdf.SetTransform(1, transform1) if return_bool: ipdf.SetCollisionModeToFirstContact() else: ipdf.SetCollisionModeToAllContacts() ipdf.Update() if return_bool: return bool(ipdf.GetNumberOfContacts()) msh = Mesh(ipdf.GetContactsOutput(), "k", 1).lighting("off") msh.metadata["ContactCells1"] = vtk2numpy( ipdf.GetOutput(0).GetFieldData().GetArray("ContactCells") ) msh.metadata["ContactCells2"] = vtk2numpy( ipdf.GetOutput(1).GetFieldData().GetArray("ContactCells") ) msh.GetProperty().SetLineWidth(3) msh.name = "SurfaceCollision" msh.pipeline = OperationNode( "collide_with", parents=[self, mesh2], comment=f"#pts {msh.inputdata().GetNumberOfPoints()}" ) return msh def geodesic(self, start, end): """ Dijkstra algorithm to compute the geodesic line. Takes as input a polygonal mesh and performs a single source shortest path calculation. Arguments: start : (int, list) start vertex index or close point `[x,y,z]` end : (int, list) end vertex index or close point `[x,y,z]` Examples: - [geodesic.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/geodesic.py) ![](https://vedo.embl.es/images/advanced/geodesic.png) """ if is_sequence(start): cc = self.points() pa = Points(cc) start = pa.closest_point(start, return_point_id=True) end = pa.closest_point(end, return_point_id=True) dijkstra = vtk.vtkDijkstraGraphGeodesicPath() dijkstra.SetInputData(self.polydata()) dijkstra.SetStartVertex(end) # inverted in vtk dijkstra.SetEndVertex(start) dijkstra.Update() weights = vtk.vtkDoubleArray() dijkstra.GetCumulativeWeights(weights) idlist = dijkstra.GetIdList() ids = [idlist.GetId(i) for i in range(idlist.GetNumberOfIds())] length = weights.GetMaxId() + 1 arr = np.zeros(length) for i in range(length): arr[i] = weights.GetTuple(i)[0] poly = dijkstra.GetOutput() vdata = numpy2vtk(arr) vdata.SetName("CumulativeWeights") poly.GetPointData().AddArray(vdata) vdata2 = numpy2vtk(ids, dtype=np.uint) vdata2.SetName("VertexIDs") poly.GetPointData().AddArray(vdata2) poly.GetPointData().Modified() dmesh = Mesh(poly, c="k") prop = vtk.vtkProperty() prop.DeepCopy(self.property) prop.SetLineWidth(3) prop.SetOpacity(1) dmesh.SetProperty(prop) dmesh.property = prop dmesh.name = "GeodesicLine" dmesh.pipeline = OperationNode( "GeodesicLine", parents=[self], comment=f"#pts {dmesh._data.GetNumberOfPoints()}" ) return dmesh ##################################################################### ### Stuff returning a Volume ### def binarize( self, spacing=(1, 1, 1), invert=False, direction_matrix=None, image_size=None, origin=None, fg_val=255, bg_val=0, ): """ Convert a `Mesh` into a `Volume` where the foreground (exterior) voxels value is fg_val (255 by default) and the background (interior) voxels value is bg_val (0 by default). Examples: - [mesh2volume.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/mesh2volume.py) ![](https://vedo.embl.es/images/volumetric/mesh2volume.png) """ # https://vtk.org/Wiki/VTK/Examples/Cxx/PolyData/PolyDataToImageData pd = self.polydata() whiteImage = vtk.vtkImageData() if direction_matrix: whiteImage.SetDirectionMatrix(direction_matrix) dim = [0, 0, 0] if not image_size else image_size bounds = self.bounds() if not image_size: # compute dimensions dim = [0, 0, 0] for i in [0, 1, 2]: dim[i] = int(np.ceil((bounds[i * 2 + 1] - bounds[i * 2]) / spacing[i])) whiteImage.SetDimensions(dim) whiteImage.SetSpacing(spacing) whiteImage.SetExtent(0, dim[0] - 1, 0, dim[1] - 1, 0, dim[2] - 1) if not origin: origin = [0, 0, 0] origin[0] = bounds[0] + spacing[0] / 2 origin[1] = bounds[2] + spacing[1] / 2 origin[2] = bounds[4] + spacing[2] / 2 whiteImage.SetOrigin(origin) whiteImage.AllocateScalars(vtk.VTK_UNSIGNED_CHAR, 1) # fill the image with foreground voxels: inval = bg_val if invert else fg_val whiteImage.GetPointData().GetScalars().Fill(inval) # polygonal data --> image stencil: pol2stenc = vtk.vtkPolyDataToImageStencil() pol2stenc.SetInputData(pd) pol2stenc.SetOutputOrigin(whiteImage.GetOrigin()) pol2stenc.SetOutputSpacing(whiteImage.GetSpacing()) pol2stenc.SetOutputWholeExtent(whiteImage.GetExtent()) pol2stenc.Update() # cut the corresponding white image and set the background: outval = fg_val if invert else bg_val imgstenc = vtk.vtkImageStencil() imgstenc.SetInputData(whiteImage) imgstenc.SetStencilConnection(pol2stenc.GetOutputPort()) imgstenc.SetReverseStencil(invert) imgstenc.SetBackgroundValue(outval) imgstenc.Update() vol = vedo.Volume(imgstenc.GetOutput()) vol.pipeline = OperationNode( "binarize", parents=[self], comment=f"dim = {tuple(vol.dimensions())}", c="#e9c46a:#0096c7", ) return vol @deprecated(reason=vedo.colors.red + "Please use signed_distance()" + vedo.colors.reset) def signedDistance(self, **k): "Deprecated. Please use `signed_distance()`" return self.signed_distance(**k) def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradius=None): """ Compute the `Volume` object whose voxels contains the signed distance from the mesh. Arguments: bounds : (list) bounds of the output volume dims : (list) dimensions (nr. of voxels) of the output volume invert : (bool) flip the sign Examples: - [volumeFromMesh.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/volumeFromMesh.py) """ if maxradius is not None: vedo.logger.warning( "in signedDistance(maxradius=...) is ignored. (Only valid for pointclouds)." ) if bounds is None: bounds = self.bounds() sx = (bounds[1] - bounds[0]) / dims[0] sy = (bounds[3] - bounds[2]) / dims[1] sz = (bounds[5] - bounds[4]) / dims[2] img = vtk.vtkImageData() img.SetDimensions(dims) img.SetSpacing(sx, sy, sz) img.SetOrigin(bounds[0], bounds[2], bounds[4]) img.AllocateScalars(vtk.VTK_FLOAT, 1) imp = vtk.vtkImplicitPolyDataDistance() imp.SetInput(self.polydata()) b2 = bounds[2] b4 = bounds[4] d0, d1, d2 = dims for i in range(d0): x = i * sx + bounds[0] for j in range(d1): y = j * sy + b2 for k in range(d2): v = imp.EvaluateFunction((x, y, k * sz + b4)) if invert: v = -v img.SetScalarComponentFromFloat(i, j, k, 0, v) vol = vedo.Volume(img) vol.name = "SignedVolume" vol.pipeline = OperationNode( "signed_distance", parents=[self], comment=f"dim = {tuple(vol.dimensions())}", c="#e9c46a:#0096c7", ) return vol def tetralize( self, side=0.02, nmax=300_000, gap=None, subsample=False, uniform=True, seed=0, debug=False ): """ Tetralize a closed polygonal mesh. Return a `TetMesh`. Arguments: side : (float) desired side of the single tetras as fraction of the bounding box diagonal. Typical values are in the range (0.01 - 0.03) nmax : (int) maximum random numbers to be sampled in the bounding box gap : (float) keep this minimum distance from the surface, if None an automatic choice is made. subsample : (bool) subsample input surface, the geometry might be affected (the number of original faces reduceed), but higher tet quality might be obtained. uniform : (bool) generate tets more uniformly packed in the interior of the mesh seed : (int) random number generator seed debug : (bool) show an intermediate plot with sampled points Examples: - [tetralize_surface.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/tetralize_surface.py) ![](https://vedo.embl.es/images/volumetric/tetralize_surface.jpg) """ surf = self.clone().clean().compute_normals() d = surf.diagonal_size() if gap is None: gap = side * d * np.sqrt(2 / 3) n = int(min((1 / side) ** 3, nmax)) # fill the space w/ points x0, x1, y0, y1, z0, z1 = surf.bounds() if uniform: pts = vedo.utils.pack_spheres([x0, x1, y0, y1, z0, z1], side * d * 1.42) pts += np.random.randn(len(pts), 3) * side * d * 1.42 / 100 # some small jitter else: disp = np.array([x0 + x1, y0 + y1, z0 + z1]) / 2 np.random.seed(seed) pts = (np.random.rand(n, 3) - 0.5) * np.array([x1 - x0, y1 - y0, z1 - z0]) + disp normals = surf.celldata["Normals"] cc = surf.cell_centers() subpts = cc - normals * gap * 1.05 pts = pts.tolist() + subpts.tolist() if debug: print(".. tetralize(): subsampling and cleaning") fillpts = surf.inside_points(pts) fillpts.subsample(side) if gap: fillpts.distance_to(surf) fillpts.threshold("Distance", above=gap) if subsample: surf.subsample(side) tmesh = vedo.tetmesh.delaunay3d(vedo.merge(fillpts, surf)) tcenters = tmesh.cell_centers() ids = surf.inside_points(tcenters, return_ids=True) ins = np.zeros(tmesh.ncells) ins[ids] = 1 if debug: # vedo.pyplot.histogram(fillpts.pointdata["Distance"], xtitle=f"gap={gap}").show().close() edges = self.edges() points = self.points() elen = mag(points[edges][:, 0, :] - points[edges][:, 1, :]) histo = vedo.pyplot.histogram(elen, xtitle="edge length", xlim=(0, 3 * side * d)) print(".. edges min, max", elen.min(), elen.max()) fillpts.cmap("bone") vedo.show( [ [ f"This is a debug plot.\n\nGenerated points: {n}\ngap: {gap}", surf.wireframe().alpha(0.2), vedo.addons.Axes(surf), fillpts, Points(subpts).c("r4").ps(3), ], [f"Edges mean length: {np.mean(elen)}\n\nPress q to continue", histo], ], N=2, sharecam=False, new=True, ).close() print(".. thresholding") tmesh.celldata["inside"] = ins.astype(np.uint8) tmesh.threshold("inside", above=0.9) tmesh.celldata.remove("inside") if debug: print(f".. tetralize() completed, ntets = {tmesh.ncells}") tmesh.pipeline = OperationNode( "tetralize", parents=[self], comment=f"#tets = {tmesh.ncells}", c="#e9c46a:#9e2a2b" ) return tmesh #################################################### class Follower(vedo.base.BaseActor, vtk.vtkFollower): def __init__(self, actor, camera=None): vtk.vtkFollower.__init__(self) vedo.base.BaseActor.__init__(self) self.name = actor.name self._isfollower = False self.SetMapper(actor.GetMapper()) self.SetProperty(actor.GetProperty()) self.SetBackfaceProperty(actor.GetBackfaceProperty()) self.SetTexture(actor.GetTexture()) self.SetCamera(camera) self.SetOrigin(actor.GetOrigin()) self.SetScale(actor.GetScale()) self.SetOrientation(actor.GetOrientation()) self.SetPosition(actor.GetPosition()) self.SetUseBounds(actor.GetUseBounds()) self.PickableOff() self.pipeline = OperationNode("Follower", parents=[actor], shape="component", c="#d9ed92") vedo-2023.4.6/vedo/picture.py000066400000000000000000001437621444463326400157160ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo from vedo import colors from vedo import utils __docformat__ = "google" __doc__ = """ Submodule to work with common format images. ![](https://vedo.embl.es/images/basic/rotateImage.png) """ __all__ = ["Picture", "Picture2D"] ################################################# def _get_img(obj, flip=False, translate=()): # get vtkImageData from numpy array or filename if isinstance(obj, str): if "https://" in obj: obj = vedo.file_io.download(obj, verbose=False) fname = obj.lower() if fname.endswith(".png"): picr = vtk.vtkPNGReader() elif fname.endswith(".jpg") or fname.endswith(".jpeg"): picr = vtk.vtkJPEGReader() elif fname.endswith(".bmp"): picr = vtk.vtkBMPReader() elif fname.endswith(".tif") or fname.endswith(".tiff"): picr = vtk.vtkTIFFReader() picr.SetOrientationType(vedo.settings.tiff_orientation_type) else: colors.printc("Cannot understand picture format", obj, c="r") return picr.SetFileName(obj) picr.Update() img = picr.GetOutput() else: obj = np.asarray(obj) if obj.ndim == 3: # has shape (nx,ny, ncolor_alpha_chan) iac = vtk.vtkImageAppendComponents() nchan = obj.shape[2] # get number of channels in inputimage (L/LA/RGB/RGBA) for i in range(nchan): if flip: arr = np.flip(np.flip(obj[:, :, i], 0), 0).ravel() else: arr = np.flip(obj[:, :, i], 0).ravel() arr = np.clip(arr, 0, 255) varb = utils.numpy2vtk(arr, dtype=np.uint8, name="RGBA") imgb = vtk.vtkImageData() imgb.SetDimensions(obj.shape[1], obj.shape[0], 1) imgb.GetPointData().AddArray(varb) imgb.GetPointData().SetActiveScalars("RGBA") iac.AddInputData(imgb) iac.Update() img = iac.GetOutput() elif obj.ndim == 2: # black and white if flip: arr = np.flip(obj[:, :], 0).ravel() else: arr = obj.ravel() arr = np.clip(arr, 0, 255) varb = utils.numpy2vtk(arr, dtype=np.uint8, name="RGBA") img = vtk.vtkImageData() img.SetDimensions(obj.shape[1], obj.shape[0], 1) img.GetPointData().AddArray(varb) img.GetPointData().SetActiveScalars("RGBA") if len(translate) > 0: translate_extent = vtk.vtkImageTranslateExtent() translate_extent.SetTranslation(-translate[0], -translate[1], 0) translate_extent.SetInputData(img) translate_extent.Update() img.DeepCopy(translate_extent.GetOutput()) return img def _set_justification(img, pos): if not isinstance(pos, str): return img, pos sx, sy = img.GetDimensions()[:2] translate = () if "top" in pos: if "left" in pos: pos = (0, 1) translate = (0, sy) elif "right" in pos: pos = (1, 1) translate = (sx, sy) elif "mid" in pos or "cent" in pos: pos = (0.5, 1) translate = (sx / 2, sy) elif "bottom" in pos: if "left" in pos: pos = (0, 0) elif "right" in pos: pos = (1, 0) translate = (sx, 0) elif "mid" in pos or "cent" in pos: pos = (0.5, 0) translate = (sx / 2, 0) elif "mid" in pos or "cent" in pos: if "left" in pos: pos = (0, 0.5) translate = (0, sy / 2) elif "right" in pos: pos = (1, 0.5) translate = (sx, sy / 2) else: pos = (0.5, 0.5) translate = (sx / 2, sy / 2) if len(translate) > 0: translate = np.array(translate).astype(int) translate_extent = vtk.vtkImageTranslateExtent() translate_extent.SetTranslation(-translate[0], -translate[1], 0) translate_extent.SetInputData(img) translate_extent.Update() img = translate_extent.GetOutput() return img, pos ################################################# class Picture2D(vedo.BaseActor2D): """ Embed an image as a static 2D image in the canvas. """ def __init__(self, fig, pos=(0, 0), scale=1, ontop=False, padding=1, justify=""): """ Embed an image as a static 2D image in the canvas. Arguments: fig : Picture, matplotlib.Figure, matplotlib.pyplot, vtkImageData the input image pos : (list) 2D (x,y) position in range [0,1], [0,0] being the bottom-left corner scale : (float) apply a scaling factor to the image ontop : (bool) keep image on top or not padding : (int) an internal padding space as a fraction of size (matplotlib only) justify : (str) define the anchor point ("top-left", "top-center", ...) """ vedo.BaseActor2D.__init__(self) # print("input type:", fig.__class__) self.array = None if utils.is_sequence(fig): self.array = fig self._data = _get_img(self.array) elif isinstance(fig, Picture): self._data = fig.inputdata() elif isinstance(fig, vtk.vtkImageData): assert fig.GetDimensions()[2] == 1, "Cannot create an Picture2D from Volume" self._data = fig elif isinstance(fig, str): self._data = _get_img(fig) self.filename = fig elif "matplotlib" in str(fig.__class__): if hasattr(fig, "gcf"): fig = fig.gcf() fig.tight_layout(pad=padding) fig.canvas.draw() # self.array = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8) # self.array = self.array.reshape(fig.canvas.get_width_height()[::-1] + (3,)) width, height = fig.get_size_inches() * fig.get_dpi() self.array = np.frombuffer(fig.canvas.buffer_rgba(), dtype=np.uint8).reshape( (int(height), int(width), 4) ) self.array = self.array[:, :, :3] self._data = _get_img(self.array) ############# if scale != 1: newsize = np.array(self._data.GetDimensions()[:2]) * scale newsize = newsize.astype(int) rsz = vtk.vtkImageResize() rsz.SetInputData(self._data) rsz.SetResizeMethodToOutputDimensions() rsz.SetOutputDimensions(newsize[0], newsize[1], 1) rsz.Update() self._data = rsz.GetOutput() if padding: pass # TODO if justify: self._data, pos = _set_justification(self._data, justify) else: self._data, pos = _set_justification(self._data, pos) self._mapper = vtk.vtkImageMapper() # self._mapper.RenderToRectangleOn() # NOT good because of aliasing self._mapper.SetInputData(self._data) self._mapper.SetColorWindow(255) self._mapper.SetColorLevel(127.5) self.SetMapper(self._mapper) self.GetPositionCoordinate().SetCoordinateSystem(3) self.SetPosition(pos) if ontop: self.GetProperty().SetDisplayLocationToForeground() else: self.GetProperty().SetDisplayLocationToBackground() @property def shape(self): return np.array(self._data.GetDimensions()[:2]).astype(int) ################################################# class Picture(vedo.base.Base3DProp, vtk.vtkImageActor): """ Derived class of `vtkImageActor`. Used to represent 2D pictures in a 3D world. """ def __init__(self, obj=None, channels=3, flip=False): """ Can be instantiated with a path file name or with a numpy array. By default the transparency channel is disabled. To enable it set channels=4. Use `Picture.dimensions()` to access the number of pixels in x and y. Arguments: channels : (int, list) only select these specific rgba channels (useful to remove alpha) flip : (bool) flip xy axis convention (when input is a numpy array) """ vtk.vtkImageActor.__init__(self) vedo.base.Base3DProp.__init__(self) if utils.is_sequence(obj) and len(obj) > 0: # passing array img = _get_img(obj, flip) elif isinstance(obj, vtk.vtkImageData): img = obj elif isinstance(obj, str): img = _get_img(obj) self.filename = obj else: img = vtk.vtkImageData() # select channels if isinstance(channels, int): channels = list(range(channels)) nchans = len(channels) n = img.GetPointData().GetScalars().GetNumberOfComponents() if nchans and n > nchans: pec = vtk.vtkImageExtractComponents() pec.SetInputData(img) if nchans == 4: pec.SetComponents(channels[0], channels[1], channels[2], channels[3]) elif nchans == 3: pec.SetComponents(channels[0], channels[1], channels[2]) elif nchans == 2: pec.SetComponents(channels[0], channels[1]) elif nchans == 1: pec.SetComponents(channels[0]) pec.Update() img = pec.GetOutput() self._data = img self.SetInputData(img) sx, sy, _ = img.GetDimensions() self.shape = np.array([sx, sy]) self._mapper = self.GetMapper() self.pipeline = utils.OperationNode("Picture", comment=f"#shape {self.shape}", c="#f28482") ###################################################################### def _repr_html_(self): """ HTML representation of the Picture object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.picture.Picture" help_url = "https://vedo.embl.es/docs/vedo/picture.html" arr = self.thumbnail(zoom=1.1) im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" pdata = "" if self._data.GetPointData().GetScalars(): if self._data.GetPointData().GetScalars().GetName(): name = self._data.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" if self._data.GetCellData().GetScalars(): if self._data.GetCellData().GetScalars().GetName(): name = self._data.GetCellData().GetScalars().GetName() cdata = " voxel data array " + name + "" img = self.GetMapper().GetInput() allt = [ "", "", "", "
", image, "
", help_text, "", "", "", pdata, cdata, "", "", "
shape " + str(img.GetDimensions()[:2]) + "
in memory size " + str(int(img.GetActualMemorySize())) + " KB
intensity range " + str(img.GetScalarRange()) + "
level / window " + str(self.level()) + " / " + str(self.window()) + "
", "
", ] return "\n".join(allt) def inputdata(self): """Return the underlying ``vtkImagaData`` object.""" return self._data def dimensions(self): """Return the picture dimension as number of pixels in x and y""" nx, ny, _ = self._data.GetDimensions() return np.array([nx, ny]) def channels(self): """Return the number of channels in picture""" return self._data.GetPointData().GetScalars().GetNumberOfComponents() def _update(self, data): """Overwrite the Picture data mesh with a new data.""" self._data = data self._mapper.SetInputData(data) self._mapper.Modified() nx, ny, _ = self._data.GetDimensions() self.shape = np.array([nx, ny]) return self def clone(self, transformed=False): """Return an exact copy of the input Picture. If transform is True, it is given the same scaling and position.""" img = vtk.vtkImageData() img.DeepCopy(self._data) pic = Picture(img) if transformed: # assign the same transformation to the copy pic.SetOrigin(self.GetOrigin()) pic.SetScale(self.GetScale()) pic.SetOrientation(self.GetOrientation()) pic.SetPosition(self.GetPosition()) pic.pipeline = utils.OperationNode("clone", parents=[self], c="#f7dada", shape="diamond") return pic def cmap(self, name, vmin=None, vmax=None): """Colorize a picture with a colormap representing pixel intensity""" n = self._data.GetPointData().GetNumberOfComponents() if n > 1: ecr = vtk.vtkImageExtractComponents() ecr.SetInputData(self._data) ecr.SetComponents(0, 1, 2) ecr.Update() ilum = vtk.vtkImageMagnitude() ilum.SetInputData(self._data) ilum.Update() img = ilum.GetOutput() else: img = self._data lut = vtk.vtkLookupTable() _vmin, _vmax = img.GetScalarRange() if vmin is not None: _vmin = vmin if vmax is not None: _vmax = vmax lut.SetRange(_vmin, _vmax) ncols = 256 lut.SetNumberOfTableValues(ncols) cols = colors.color_map(range(ncols), name, 0, ncols) for i, c in enumerate(cols): lut.SetTableValue(i, *c) lut.Build() imap = vtk.vtkImageMapToColors() imap.SetLookupTable(lut) imap.SetInputData(img) imap.Update() self._update(imap.GetOutput()) self.pipeline = utils.OperationNode( f"cmap", comment=f'"{name}"', parents=[self], c="#f28482" ) return self def extent(self, ext=None): """ Get or set the physical extent that the picture spans. Format is `ext=[minx, maxx, miny, maxy]`. """ if ext is None: return self._data.GetExtent() self._data.SetExtent(ext[0], ext[1], ext[2], ext[3], 0, 0) self._mapper.Modified() return self def alpha(self, a=None): """Set/get picture's transparency in the rendering scene.""" if a is not None: self.GetProperty().SetOpacity(a) return self return self.GetProperty().GetOpacity() def level(self, value=None): """Get/Set the image color level (brightness) in the rendering scene.""" if value is None: return self.GetProperty().GetColorLevel() self.GetProperty().SetColorLevel(value) return self def window(self, value=None): """Get/Set the image color window (contrast) in the rendering scene.""" if value is None: return self.GetProperty().GetColorWindow() self.GetProperty().SetColorWindow(value) return self def crop(self, top=None, bottom=None, right=None, left=None, pixels=False): """Crop picture. Arguments: top : (float) fraction to crop from the top margin bottom : (float) fraction to crop from the bottom margin left : (float) fraction to crop from the left margin right : (float) fraction to crop from the right margin pixels : (bool) units are pixels """ extractVOI = vtk.vtkExtractVOI() extractVOI.SetInputData(self._data) extractVOI.IncludeBoundaryOn() d = self.GetInput().GetDimensions() if pixels: extractVOI.SetVOI(left, d[0] - right - 1, bottom, d[1] - top - 1, 0, 0) else: bx0, bx1, by0, by1 = 0, d[0]-1, 0, d[1]-1 if left is not None: bx0 = int((d[0]-1)*left) if right is not None: bx1 = int((d[0]-1)*(1-right)) if bottom is not None: by0 = int((d[1]-1)*bottom) if top is not None: by1 = int((d[1]-1)*(1-top)) extractVOI.SetVOI(bx0, bx1, by0, by1, 0, 0) extractVOI.Update() self.shape = extractVOI.GetOutput().GetDimensions()[:2] self._update(extractVOI.GetOutput()) self.pipeline = utils.OperationNode( "crop", comment=f"shape={tuple(self.shape)}", parents=[self], c="#f28482" ) return self def pad(self, pixels=10, value=255): """ Add the specified number of pixels at the picture borders. Pixels can be a list formatted as [left,right,bottom,top]. Arguments: pixels : (int, list) number of pixels to be added (or a list of length 4) value : (int) intensity value (gray-scale color) of the padding """ x0, x1, y0, y1, _z0, _z1 = self._data.GetExtent() pf = vtk.vtkImageConstantPad() pf.SetInputData(self._data) pf.SetConstant(value) if utils.is_sequence(pixels): pf.SetOutputWholeExtent( x0 - pixels[0], x1 + pixels[1], y0 - pixels[2], y1 + pixels[3], 0, 0 ) else: pf.SetOutputWholeExtent( x0 - pixels, x1 + pixels, y0 - pixels, y1 + pixels, 0, 0 ) pf.Update() self._update(pf.GetOutput()) self.pipeline = utils.OperationNode( "pad", comment=f"{pixels} pixels", parents=[self], c="#f28482" ) return self def tile(self, nx=4, ny=4, shift=(0, 0)): """ Generate a tiling from the current picture by mirroring and repeating it. Arguments: nx : (float) number of repeats along x ny : (float) number of repeats along x shift : (list) shift in x and y in pixels """ x0, x1, y0, y1, z0, z1 = self._data.GetExtent() constant_pad = vtk.vtkImageMirrorPad() constant_pad.SetInputData(self._data) constant_pad.SetOutputWholeExtent( int(x0 + shift[0] + 0.5), int(x1 * nx + shift[0] + 0.5), int(y0 + shift[1] + 0.5), int(y1 * ny + shift[1] + 0.5), z0, z1, ) constant_pad.Update() pic = Picture(constant_pad.GetOutput()) pic.pipeline = utils.OperationNode( "tile", comment=f"by {nx}x{ny}", parents=[self], c="#f28482" ) return pic def append(self, pictures, axis="z", preserve_extents=False): """ Append the input images to the current one along the specified axis. Except for the append axis, all inputs must have the same extent. All inputs must have the same number of scalar components. The output has the same origin and spacing as the first input. The origin and spacing of all other inputs are ignored. All inputs must have the same scalar type. Arguments: axis : (int, str) axis expanded to hold the multiple images preserve_extents : (bool) if True, the extent of the inputs is used to place the image in the output. The whole extent of the output is the union of the input whole extents. Any portion of the output not covered by the inputs is set to zero. The origin and spacing is taken from the first input. Example: ```python from vedo import Picture, dataurl pic = Picture(dataurl+'dog.jpg').pad() pic.append([pic,pic], axis='y') pic.append([pic,pic,pic], axis='x') pic.show(axes=1).close() ``` ![](https://vedo.embl.es/images/feats/pict_append.png) """ ima = vtk.vtkImageAppend() ima.SetInputData(self._data) if not utils.is_sequence(pictures): pictures = [pictures] for p in pictures: if isinstance(p, vtk.vtkImageData): ima.AddInputData(p) else: ima.AddInputData(p.inputdata()) ima.SetPreserveExtents(preserve_extents) if axis == "x": axis = 0 elif axis == "y": axis = 1 ima.SetAppendAxis(axis) ima.Update() self._update(ima.GetOutput()) self.pipeline = utils.OperationNode( "append", comment=f"axis={axis}", parents=[self, *pictures], c="#f28482" ) return self def resize(self, newsize): """Resize the image resolution by specifying the number of pixels in width and height. If left to zero, it will be automatically calculated to keep the original aspect ratio. newsize is the shape of picture as [npx, npy], or it can be also expressed as a fraction. """ old_dims = np.array(self._data.GetDimensions()) if not utils.is_sequence(newsize): newsize = (old_dims * newsize + 0.5).astype(int) if not newsize[1]: ar = old_dims[1] / old_dims[0] newsize = [newsize[0], int(newsize[0] * ar + 0.5)] if not newsize[0]: ar = old_dims[0] / old_dims[1] newsize = [int(newsize[1] * ar + 0.5), newsize[1]] newsize = [newsize[0], newsize[1], old_dims[2]] rsz = vtk.vtkImageResize() rsz.SetInputData(self._data) rsz.SetResizeMethodToOutputDimensions() rsz.SetOutputDimensions(newsize) rsz.Update() out = rsz.GetOutput() out.SetSpacing(1, 1, 1) self._update(out) self.pipeline = utils.OperationNode( "resize", comment=f"shape={tuple(self.shape)}", parents=[self], c="#f28482" ) return self def mirror(self, axis="x"): """Mirror picture along x or y axis. Same as `flip()`.""" ff = vtk.vtkImageFlip() ff.SetInputData(self.inputdata()) if axis.lower() == "x": ff.SetFilteredAxis(0) elif axis.lower() == "y": ff.SetFilteredAxis(1) else: colors.printc("Error in mirror(): mirror must be set to x or y.", c="r") raise RuntimeError() ff.Update() self._update(ff.GetOutput()) self.pipeline = utils.OperationNode(f"mirror {axis}", parents=[self], c="#f28482") return self def flip(self, axis="y"): """Mirror picture along x or y axis. Same as `mirror()`.""" return self.mirror(axis=axis) def rotate(self, angle, center=(), scale=1, mirroring=False, bc="w", alpha=1): """ Rotate by the specified angle (anticlockwise). Arguments: angle : (float) rotation angle in degrees center : (list) center of rotation (x,y) in pixels """ bounds = self.bounds() pc = [0, 0, 0] if center: pc[0] = center[0] pc[1] = center[1] else: pc[0] = (bounds[1] + bounds[0]) / 2.0 pc[1] = (bounds[3] + bounds[2]) / 2.0 pc[2] = (bounds[5] + bounds[4]) / 2.0 transform = vtk.vtkTransform() transform.Translate(pc) transform.RotateWXYZ(-angle, 0, 0, 1) transform.Scale(1 / scale, 1 / scale, 1) transform.Translate(-pc[0], -pc[1], -pc[2]) reslice = vtk.vtkImageReslice() reslice.SetMirror(mirroring) c = np.array(colors.get_color(bc)) * 255 reslice.SetBackgroundColor([c[0], c[1], c[2], alpha * 255]) reslice.SetInputData(self._data) reslice.SetResliceTransform(transform) reslice.SetOutputDimensionality(2) reslice.SetInterpolationModeToCubic() reslice.SetOutputSpacing(self._data.GetSpacing()) reslice.SetOutputOrigin(self._data.GetOrigin()) reslice.SetOutputExtent(self._data.GetExtent()) reslice.Update() self._update(reslice.GetOutput()) self.pipeline = utils.OperationNode( "rotate", comment=f"angle={angle}", parents=[self], c="#f28482" ) return self def select(self, component): """Select one single component of the rgb image.""" ec = vtk.vtkImageExtractComponents() ec.SetInputData(self._data) ec.SetComponents(component) ec.Update() pic = Picture(ec.GetOutput()) pic.pipeline = utils.OperationNode( "select", comment=f"component {component}", parents=[self], c="#f28482" ) return pic def bw(self): """Make it black and white using luminance calibration.""" n = self._data.GetPointData().GetNumberOfComponents() if n == 4: ecr = vtk.vtkImageExtractComponents() ecr.SetInputData(self._data) ecr.SetComponents(0, 1, 2) ecr.Update() img = ecr.GetOutput() else: img = self._data ecr = vtk.vtkImageLuminance() ecr.SetInputData(img) ecr.Update() self._update(ecr.GetOutput()) self.pipeline = utils.OperationNode("black&white", parents=[self], c="#f28482") return self def smooth(self, sigma=3, radius=None): """ Smooth a Picture with Gaussian kernel. Arguments: sigma : (int) number of sigmas in pixel units radius : (float) how far out the gaussian kernel will go before being clamped to zero """ gsf = vtk.vtkImageGaussianSmooth() gsf.SetDimensionality(2) gsf.SetInputData(self._data) if radius is not None: if utils.is_sequence(radius): gsf.SetRadiusFactors(radius[0], radius[1]) else: gsf.SetRadiusFactor(radius) if utils.is_sequence(sigma): gsf.SetStandardDeviations(sigma[0], sigma[1]) else: gsf.SetStandardDeviation(sigma) gsf.Update() self._update(gsf.GetOutput()) self.pipeline = utils.OperationNode( "smooth", comment=f"sigma={sigma}", parents=[self], c="#f28482" ) return self def median(self): """ Median filter that preserves thin lines and corners. It operates on a 5x5 pixel neighborhood. It computes two values initially: the median of the + neighbors and the median of the x neighbors. It then computes the median of these two values plus the center pixel. This result of this second median is the output pixel value. """ medf = vtk.vtkImageHybridMedian2D() medf.SetInputData(self._data) medf.Update() self._update(medf.GetOutput()) self.pipeline = utils.OperationNode("median", parents=[self], c="#f28482") return self def enhance(self): """ Enhance a b&w picture using the laplacian, enhancing high-freq edges. Example: ```python from vedo import * pic = Picture(vedo.dataurl+'images/dog.jpg').bw() show(pic, pic.clone().enhance(), N=2, mode='image', zoom='tight') ``` ![](https://vedo.embl.es/images/feats/pict_enhance.png) """ img = self._data scalarRange = img.GetPointData().GetScalars().GetRange() cast = vtk.vtkImageCast() cast.SetInputData(img) cast.SetOutputScalarTypeToDouble() cast.Update() laplacian = vtk.vtkImageLaplacian() laplacian.SetInputData(cast.GetOutput()) laplacian.SetDimensionality(2) laplacian.Update() subtr = vtk.vtkImageMathematics() subtr.SetInputData(0, cast.GetOutput()) subtr.SetInputData(1, laplacian.GetOutput()) subtr.SetOperationToSubtract() subtr.Update() color_window = scalarRange[1] - scalarRange[0] color_level = color_window / 2 original_color = vtk.vtkImageMapToWindowLevelColors() original_color.SetWindow(color_window) original_color.SetLevel(color_level) original_color.SetInputData(subtr.GetOutput()) original_color.Update() self._update(original_color.GetOutput()) self.pipeline = utils.OperationNode("enhance", parents=[self], c="#f28482") return self def fft(self, mode="magnitude", logscale=12, center=True): """ Fast Fourier transform of a picture. Arguments: logscale : (float) if non-zero, take the logarithm of the intensity and scale it by this factor. mode : (str) either [magnitude, real, imaginary, complex], compute the point array data accordingly. center : (bool) shift constant zero-frequency to the center of the image for display. (FFT converts spatial images into frequency space, but puts the zero frequency at the origin) """ ffti = vtk.vtkImageFFT() ffti.SetInputData(self._data) ffti.Update() if "mag" in mode: mag = vtk.vtkImageMagnitude() mag.SetInputData(ffti.GetOutput()) mag.Update() out = mag.GetOutput() elif "real" in mode: erf = vtk.vtkImageExtractComponents() erf.SetInputData(ffti.GetOutput()) erf.SetComponents(0) erf.Update() out = erf.GetOutput() elif "imaginary" in mode: eimf = vtk.vtkImageExtractComponents() eimf.SetInputData(ffti.GetOutput()) eimf.SetComponents(1) eimf.Update() out = eimf.GetOutput() elif "complex" in mode: out = ffti.GetOutput() else: colors.printc("Error in fft(): unknown mode", mode) raise RuntimeError() if center: center = vtk.vtkImageFourierCenter() center.SetInputData(out) center.Update() out = center.GetOutput() if "complex" not in mode: if logscale: ils = vtk.vtkImageLogarithmicScale() ils.SetInputData(out) ils.SetConstant(logscale) ils.Update() out = ils.GetOutput() pic = Picture(out) pic.pipeline = utils.OperationNode("FFT", parents=[self], c="#f28482") return pic def rfft(self, mode="magnitude"): """Reverse Fast Fourier transform of a picture.""" ffti = vtk.vtkImageRFFT() ffti.SetInputData(self._data) ffti.Update() if "mag" in mode: mag = vtk.vtkImageMagnitude() mag.SetInputData(ffti.GetOutput()) mag.Update() out = mag.GetOutput() elif "real" in mode: erf = vtk.vtkImageExtractComponents() erf.SetInputData(ffti.GetOutput()) erf.SetComponents(0) erf.Update() out = erf.GetOutput() elif "imaginary" in mode: eimf = vtk.vtkImageExtractComponents() eimf.SetInputData(ffti.GetOutput()) eimf.SetComponents(1) eimf.Update() out = eimf.GetOutput() elif "complex" in mode: out = ffti.GetOutput() else: colors.printc("Error in rfft(): unknown mode", mode) raise RuntimeError() pic = Picture(out) pic.pipeline = utils.OperationNode("rFFT", parents=[self], c="#f28482") return pic def filterpass(self, lowcutoff=None, highcutoff=None, order=3): """ Low-pass and high-pass filtering become trivial in the frequency domain. A portion of the pixels/voxels are simply masked or attenuated. This function applies a high pass Butterworth filter that attenuates the frequency domain image with the function The gradual attenuation of the filter is important. A simple high-pass filter would simply mask a set of pixels in the frequency domain, but the abrupt transition would cause a ringing effect in the spatial domain. Arguments: lowcutoff : (list) the cutoff frequencies highcutoff : (list) the cutoff frequencies order : (int) order determines sharpness of the cutoff curve """ # https://lorensen.github.io/VTKExamples/site/Cxx/ImageProcessing/IdealHighPass fft = vtk.vtkImageFFT() fft.SetInputData(self._data) fft.Update() out = fft.GetOutput() if highcutoff: blp = vtk.vtkImageButterworthLowPass() blp.SetInputData(out) blp.SetCutOff(highcutoff) blp.SetOrder(order) blp.Update() out = blp.GetOutput() if lowcutoff: bhp = vtk.vtkImageButterworthHighPass() bhp.SetInputData(out) bhp.SetCutOff(lowcutoff) bhp.SetOrder(order) bhp.Update() out = bhp.GetOutput() rfft = vtk.vtkImageRFFT() rfft.SetInputData(out) rfft.Update() ecomp = vtk.vtkImageExtractComponents() ecomp.SetInputData(rfft.GetOutput()) ecomp.SetComponents(0) ecomp.Update() caster = vtk.vtkImageCast() caster.SetOutputScalarTypeToUnsignedChar() caster.SetInputData(ecomp.GetOutput()) caster.Update() self._update(caster.GetOutput()) self.pipeline = utils.OperationNode("filterpass", parents=[self], c="#f28482") return self def blend(self, pic, alpha1=0.5, alpha2=0.5): """ Take L, LA, RGB, or RGBA images as input and blends them according to the alpha values and/or the opacity setting for each input. """ blf = vtk.vtkImageBlend() blf.AddInputData(self._data) blf.AddInputData(pic.inputdata()) blf.SetOpacity(0, alpha1) blf.SetOpacity(1, alpha2) blf.SetBlendModeToNormal() blf.Update() self._update(blf.GetOutput()) self.pipeline = utils.OperationNode("blend", parents=[self, pic], c="#f28482") return self def warp( self, source_pts=(), target_pts=(), transform=None, sigma=1, mirroring=False, bc="w", alpha=1, ): """ Warp an image using thin-plate splines. Arguments: source_pts : (list) source points target_pts : (list) target points transform : (vtkTransform) a vtkTransform object can be supplied sigma : (float), optional stiffness of the interpolation mirroring : (bool) fill the margins with a reflection of the original image bc : (color) fill the margins with a solid color alpha : (float) opacity of the filled margins """ if transform is None: # source and target must be filled transform = vtk.vtkThinPlateSplineTransform() transform.SetBasisToR2LogR() parents = [self] if isinstance(source_pts, vedo.Points): parents.append(source_pts) source_pts = source_pts.points() if isinstance(target_pts, vedo.Points): parents.append(target_pts) target_pts = target_pts.points() ns = len(source_pts) nt = len(target_pts) if ns != nt: colors.printc("Error in picture.warp(): #source != #target points", ns, nt, c="r") raise RuntimeError() ptsou = vtk.vtkPoints() ptsou.SetNumberOfPoints(ns) pttar = vtk.vtkPoints() pttar.SetNumberOfPoints(nt) for i in range(ns): p = source_pts[i] ptsou.SetPoint(i, [p[0], p[1], 0]) p = target_pts[i] pttar.SetPoint(i, [p[0], p[1], 0]) transform.SetSigma(sigma) transform.SetSourceLandmarks(pttar) transform.SetTargetLandmarks(ptsou) else: # ignore source and target pass reslice = vtk.vtkImageReslice() reslice.SetInputData(self._data) reslice.SetOutputDimensionality(2) reslice.SetResliceTransform(transform) reslice.SetInterpolationModeToCubic() reslice.SetMirror(mirroring) c = np.array(colors.get_color(bc)) * 255 reslice.SetBackgroundColor([c[0], c[1], c[2], alpha * 255]) reslice.Update() self.transform = transform self._update(reslice.GetOutput()) self.pipeline = utils.OperationNode("warp", parents=parents, c="#f28482") return self def invert(self): """ Return an inverted picture (inverted in each color channel). """ rgb = self.tonumpy() data = 255 - np.array(rgb) self._update(_get_img(data)) self.pipeline = utils.OperationNode("invert", parents=[self], c="#f28482") return self def binarize(self, threshold=None, invert=False): """ Return a new Picture where pixel above threshold are set to 255 and pixels below are set to 0. Arguments: threshold : (float) input threshold value invert : (bool) invert threshold direction Example: ```python from vedo import Picture, show pic1 = Picture("https://aws.glamour.es/prod/designs/v1/assets/620x459/547577.jpg") pic2 = pic1.clone().invert() pic3 = pic1.clone().binarize() show(pic1, pic2, pic3, N=3, bg="blue9").close() ``` ![](https://vedo.embl.es/images/feats/pict_binarize.png) """ rgb = self.tonumpy() if rgb.ndim == 3: intensity = np.sum(rgb, axis=2) / 3 else: intensity = rgb if threshold is None: vmin, vmax = np.min(intensity), np.max(intensity) threshold = (vmax + vmin) / 2 data = np.zeros_like(intensity).astype(np.uint8) mask = np.where(intensity > threshold) if invert: data += 255 data[mask] = 0 else: data[mask] = 255 self._update(_get_img(data, flip=True)) self.pipeline = utils.OperationNode( "binarize", comment=f"threshold={threshold}", parents=[self], c="#f28482" ) return self def threshold(self, value=None, flip=False): """ Create a polygonal Mesh from a Picture by filling regions with pixels luminosity above a specified value. Arguments: value : (float) The default is None, e.i. 1/3 of the scalar range. flip: (bool) Flip polygon orientations Returns: A polygonal mesh. """ mgf = vtk.vtkImageMagnitude() mgf.SetInputData(self._data) mgf.Update() msq = vtk.vtkMarchingSquares() msq.SetInputData(mgf.GetOutput()) if value is None: r0, r1 = self._data.GetScalarRange() value = r0 + (r1 - r0) / 3 msq.SetValue(0, value) msq.Update() if flip: rs = vtk.vtkReverseSense() rs.SetInputData(msq.GetOutput()) rs.ReverseCellsOn() rs.ReverseNormalsOff() rs.Update() output = rs.GetOutput() else: output = msq.GetOutput() ctr = vtk.vtkContourTriangulator() ctr.SetInputData(output) ctr.Update() out = vedo.Mesh(ctr.GetOutput(), c="k").bc("t").lighting("off") out.pipeline = utils.OperationNode( "threshold", comment=f"{value: .2f}", parents=[self], c="#f28482:#e9c46a" ) return out def tomesh(self): """ Convert an image to polygonal data (quads), with each polygon vertex assigned a RGBA value. """ dims = self._data.GetDimensions() gr = vedo.shapes.Grid(s=dims[:2], res=(dims[0] - 1, dims[1] - 1)) gr.pos(int(dims[0] / 2), int(dims[1] / 2)).pickable(True).wireframe(False).lw(0) self._data.GetPointData().GetScalars().SetName("RGBA") gr.inputdata().GetPointData().AddArray(self._data.GetPointData().GetScalars()) gr.inputdata().GetPointData().SetActiveScalars("RGBA") gr.mapper().SetArrayName("RGBA") gr.mapper().SetScalarModeToUsePointData() gr.mapper().ScalarVisibilityOn() gr.name = self.name gr.filename = self.filename gr.pipeline = utils.OperationNode("tomesh", parents=[self], c="#f28482:#e9c46a") return gr def tonumpy(self): """ Get read-write access to pixels of a Picture object as a numpy array. Note that the shape is (nrofchannels, nx, ny). When you set values in the output image, you don't want numpy to reallocate the array but instead set values in the existing array, so use the [:] operator. Example: arr[:] = arr - 15 If the array is modified call: ``picture.modified()`` when all your modifications are completed. """ nx, ny, _ = self._data.GetDimensions() nchan = self._data.GetPointData().GetScalars().GetNumberOfComponents() narray = utils.vtk2numpy(self._data.GetPointData().GetScalars()).reshape(ny, nx, nchan) narray = np.flip(narray, axis=0).astype(np.uint8) return narray.squeeze() def rectangle(self, xspan, yspan, c="green5", alpha=1): """Draw a rectangle box on top of current image. Units are pixels. Example: ```python import vedo pic = vedo.Picture(vedo.dataurl+"images/dog.jpg") pic.rectangle([100,300], [100,200], c='green4', alpha=0.7) pic.line([100,100],[400,500], lw=2, alpha=1) pic.triangle([250,300], [100,300], [200,400], c='blue5') vedo.show(pic, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/pict_drawon.png) """ x1, x2 = xspan y1, y2 = yspan r, g, b = vedo.colors.get_color(c) c = np.array([r, g, b]) * 255 c = c.astype(np.uint8) alpha = min(alpha, 1) if alpha <= 0: return self alpha2 = alpha alpha1 = 1 - alpha nx, ny = self.dimensions() if x2 > nx: x2 = nx - 1 if y2 > ny: y2 = ny - 1 nchan = self.channels() narrayA = self.tonumpy() canvas_source = vtk.vtkImageCanvasSource2D() canvas_source.SetExtent(0, nx - 1, 0, ny - 1, 0, 0) canvas_source.SetScalarTypeToUnsignedChar() canvas_source.SetNumberOfScalarComponents(nchan) canvas_source.SetDrawColor(255, 255, 255) canvas_source.FillBox(x1, x2, y1, y2) canvas_source.Update() image_data = canvas_source.GetOutput() vscals = image_data.GetPointData().GetScalars() narrayB = vedo.utils.vtk2numpy(vscals).reshape(ny, nx, nchan) narrayB = np.flip(narrayB, axis=0) narrayC = np.where(narrayB < 255, narrayA, alpha1 * narrayA + alpha2 * c) self._update(_get_img(narrayC)) self.pipeline = utils.OperationNode("rectangle", parents=[self], c="#f28482") return self def line(self, p1, p2, lw=2, c="k2", alpha=1): """Draw a line on top of current image. Units are pixels.""" x1, x2 = p1 y1, y2 = p2 r, g, b = vedo.colors.get_color(c) c = np.array([r, g, b]) * 255 c = c.astype(np.uint8) alpha = min(alpha, 1) if alpha <= 0: return self alpha2 = alpha alpha1 = 1 - alpha nx, ny = self.dimensions() if x2 > nx: x2 = nx - 1 if y2 > ny: y2 = ny - 1 nchan = self.channels() narrayA = self.tonumpy() canvas_source = vtk.vtkImageCanvasSource2D() canvas_source.SetExtent(0, nx - 1, 0, ny - 1, 0, 0) canvas_source.SetScalarTypeToUnsignedChar() canvas_source.SetNumberOfScalarComponents(nchan) canvas_source.SetDrawColor(255, 255, 255) canvas_source.FillTube(x1, x2, y1, y2, lw) canvas_source.Update() image_data = canvas_source.GetOutput() vscals = image_data.GetPointData().GetScalars() narrayB = vedo.utils.vtk2numpy(vscals).reshape(ny, nx, nchan) narrayB = np.flip(narrayB, axis=0) narrayC = np.where(narrayB < 255, narrayA, alpha1 * narrayA + alpha2 * c) self._update(_get_img(narrayC)) self.pipeline = utils.OperationNode("line", parents=[self], c="#f28482") return self def triangle(self, p1, p2, p3, c="red3", alpha=1): """Draw a triangle on top of current image. Units are pixels.""" x1, y1 = p1 x2, y2 = p2 x3, y3 = p3 r, g, b = vedo.colors.get_color(c) c = np.array([r, g, b]) * 255 c = c.astype(np.uint8) alpha = min(alpha, 1) if alpha <= 0: return self alpha2 = alpha alpha1 = 1 - alpha nx, ny = self.dimensions() x1 = min(x1, nx) x2 = min(x2, nx) x3 = min(x3, nx) y1 = min(y1, ny) y2 = min(y2, ny) y3 = min(y3, ny) nchan = self.channels() narrayA = self.tonumpy() canvas_source = vtk.vtkImageCanvasSource2D() canvas_source.SetExtent(0, nx - 1, 0, ny - 1, 0, 0) canvas_source.SetScalarTypeToUnsignedChar() canvas_source.SetNumberOfScalarComponents(nchan) canvas_source.SetDrawColor(255, 255, 255) canvas_source.FillTriangle(x1, y1, x2, y2, x3, y3) canvas_source.Update() image_data = canvas_source.GetOutput() vscals = image_data.GetPointData().GetScalars() narrayB = vedo.utils.vtk2numpy(vscals).reshape(ny, nx, nchan) narrayB = np.flip(narrayB, axis=0) narrayC = np.where(narrayB < 255, narrayA, alpha1 * narrayA + alpha2 * c) self._update(_get_img(narrayC)) self.pipeline = utils.OperationNode("triangle", parents=[self], c="#f28482") return self def add_text( self, txt, # pos=(0, 0), # TODO width=400, height=200, alpha=1, c="black", bg=None, alpha_bg=1, font="Theemim", dpi=200, justify="bottom-left", ): """Add text to an image.""" tp = vtk.vtkTextProperty() tp.BoldOff() tp.FrameOff() tp.SetColor(colors.get_color(c)) tp.SetJustificationToLeft() if "top" in justify: tp.SetVerticalJustificationToTop() if "bottom" in justify: tp.SetVerticalJustificationToBottom() if "cent" in justify: tp.SetVerticalJustificationToCentered() tp.SetJustificationToCentered() if "left" in justify: tp.SetJustificationToLeft() if "right" in justify: tp.SetJustificationToRight() if font.lower() == "courier": tp.SetFontFamilyToCourier() elif font.lower() == "times": tp.SetFontFamilyToTimes() elif font.lower() == "arial": tp.SetFontFamilyToArial() else: tp.SetFontFamily(vtk.VTK_FONT_FILE) tp.SetFontFile(utils.get_font_path(font)) if bg: bgcol = colors.get_color(bg) tp.SetBackgroundColor(bgcol) tp.SetBackgroundOpacity(alpha_bg) tp.SetFrameColor(bgcol) tp.FrameOn() tr = vtk.vtkTextRenderer() # GetConstrainedFontSize (const vtkUnicodeString &str, # vtkTextProperty(*tprop, int targetWidth, int targetHeight, int dpi) fs = tr.GetConstrainedFontSize(txt, tp, width, height, dpi) tp.SetFontSize(fs) img = vtk.vtkImageData() # img.SetOrigin(*pos,1) tr.RenderString(tp, txt, img, [width, height], dpi) # RenderString (vtkTextProperty *tprop, const vtkStdString &str, # vtkImageData *data, int textDims[2], int dpi, int backend=Default) blf = vtk.vtkImageBlend() blf.AddInputData(self._data) blf.AddInputData(img) blf.SetOpacity(0, 1) blf.SetOpacity(1, alpha) blf.SetBlendModeToNormal() blf.Update() self._update(blf.GetOutput()) self.pipeline = utils.OperationNode( "add_text", comment=f"{txt}", parents=[self], c="#f28482" ) return self def modified(self): """Use in conjunction with ``tonumpy()`` to update any modifications to the picture array""" self._data.GetPointData().GetScalars().Modified() return self def write(self, filename): """Write picture to file as png or jpg.""" vedo.file_io.write(self._data, filename) self.pipeline = utils.OperationNode( "write", comment=filename[:15], parents=[self], c="#8a817c", shape="cylinder" ) return self vedo-2023.4.6/vedo/plotter.py000066400000000000000000004510411444463326400157240ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os.path import sys import time from typing import Callable import numpy as np from deprecated import deprecated try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo from vedo import settings from vedo import utils from vedo import backends from vedo import addons __docformat__ = "google" __doc__ = """ This module defines the main class Plotter to manage actors and 3D rendering. ![](https://vedo.embl.es/images/basic/multirenderers.png) """ __all__ = ["Plotter", "show", "close"] ######################################################################################## class Event: """ This class holds the info from an event in the window, works as dictionary too """ __slots__ = [ "name", "title", "id", "timerid", "time", "priority", "at", "actor", "picked3d", "keyPressed", # obsolete, will disappear. Use "keypress" "keypress", "picked2d", "delta2d", "angle2d", "speed2d", "delta3d", "speed3d", "isPoints", "isMesh", "isAssembly", "isVolume", "isPicture", "isActor2D", ] def __init__(self): return def __getitem__(self, key): """Make the class work like a dictionary too""" return getattr(self, key) def __setitem__(self, key, value): """Make the class work like a dictionary too""" setattr(self, key, value) def __repr__(self): f = "---------- ----------\n" for n in self.__slots__: if n == "actor" and self.actor and self.actor.name: try: f += f"event.{n} = {self.actor.name} ({self.actor.npoints} points)\n" except AttributeError: f += f"event.{n} = {self.actor.name}\n" else: f += f"event.{n} = " + str(self[n]).replace("\n", "")[:60] + "\n" return f def keys(self): return self.__slots__ ############################################################################################## def show( *actors, at=None, shape=(1, 1), N=None, pos=(0, 0), size="auto", screensize="auto", title="vedo", bg="white", bg2=None, axes=None, interactive=None, offscreen=False, sharecam=True, resetcam=True, zoom=None, viewup="", azimuth=0.0, elevation=0.0, roll=0.0, camera=None, mode=0, new=False, ): """ Create on the fly an instance of class Plotter and show the object(s) provided. Allowed input objects types are: ``str, Mesh, Volume, Picture, Assembly vtkPolyData, vtkActor, vtkActor2D, vtkImageActor, vtkAssembly or vtkVolume`` Arguments: at : (int) number of the renderer to plot to, in case of more than one exists shape : (list, str) Number of sub-render windows inside of the main window. E.g.: specify two across with shape=(2,1) and a two by two grid with shape=(2, 2). By default there is only one renderer. Can also accept a shape as string descriptor. E.g.: - shape="3|1" means 3 plots on the left and 1 on the right, - shape="4/2" means 4 plots on top of 2 at bottom. axes : (int) set the type of axes to be shown: - 0, no axes - 1, draw three gray grid walls - 2, show cartesian axes from (0,0,0) - 3, show positive range of cartesian axes from (0,0,0) - 4, show a triad at bottom left - 5, show a cube at bottom left - 6, mark the corners of the bounding box - 7, draw a 3D ruler at each side of the cartesian axes - 8, show the `vtkCubeAxesActor` object - 9, show the bounding box outLine - 10, show three circles representing the maximum bounding box - 11, show a large grid on the x-y plane - 12, show polar axes - 13, draw a simple ruler at the bottom of the window Axis type-1 can be fully customized by passing a dictionary. Check `vedo.addons.Axes()` for the full list of options. azimuth/elevation/roll : (float) move camera accordingly the specified value viewup : (str, list) either `['x', 'y', 'z']` or a vector to set vertical direction resetcam : (bool) re-adjust camera position to fit objects camera : (dict, vtkCamera) camera parameters can further be specified with a dictionary assigned to the `camera` keyword (E.g. `show(camera={'pos':(1,2,3), 'thickness':1000,})`): - **pos** (list), the position of the camera in world coordinates - **focal_point** (list), the focal point of the camera in world coordinates - **viewup** (list), the view up direction for the camera - **distance** (float), set the focal point to the specified distance from the camera position. - **clipping_range** (float), distance of the near and far clipping planes along the direction of projection. - **parallel_scale** (float), scaling used for a parallel projection, i.e. the height of the viewport in world-coordinate distances. The default is 1. Note that the "scale" parameter works as an "inverse scale", larger numbers produce smaller images. This method has no effect in perspective projection mode. - **thickness** (float), set the distance between clipping planes. This method adjusts the far clipping plane to be set a distance 'thickness' beyond the near clipping plane. - **view_angle** (float), the camera view angle, which is the angular height of the camera view measured in degrees. The default angle is 30 degrees. This method has no effect in parallel projection mode. The formula for setting the angle up for perfect perspective viewing is: angle = 2*atan((h/2)/d) where h is the height of the RenderWindow (measured by holding a ruler up to your screen) and d is the distance from your eyes to the screen. interactive : (bool) pause and interact with window (True) or continue execution (False) rate : (float) maximum rate of `show()` in Hertz mode : (int, str) set the type of interaction: - 0 = TrackballCamera [default] - 1 = TrackballActor - 2 = JoystickCamera - 3 = JoystickActor - 4 = Flight - 5 = RubberBand2D - 6 = RubberBand3D - 7 = RubberBandZoom - 8 = Terrain - 9 = Unicam - 10 = Image new : (bool) if set to `True`, a call to show will instantiate a new Plotter object (a new window) instead of reusing the first created. """ if len(actors) == 0: actors = None elif len(actors) == 1: actors = actors[0] else: actors = utils.flatten(actors) if vedo.plotter_instance and not new: # Plotter exists plt = vedo.plotter_instance else: # Plotter must be created if utils.is_sequence(at): # user passed a sequence for "at" if not utils.is_sequence(actors): vedo.logger.error("in show() input must be a list.") raise RuntimeError() if len(at) != len(actors): vedo.logger.error("in show() lists 'input' and 'at' must have equal lengths") raise RuntimeError() if shape == (1, 1) and N is None: N = max(at) + 1 elif at is None and (N or shape != (1, 1)): if not utils.is_sequence(actors): e = "in show(), N or shape is set, but input is not a sequence\n" e += " you may need to specify e.g. at=0" vedo.logger.error(e) raise RuntimeError() at = list(range(len(actors))) plt = Plotter( shape=shape, N=N, pos=pos, size=size, screensize=screensize, title=title, axes=axes, sharecam=sharecam, resetcam=resetcam, interactive=interactive, offscreen=offscreen, bg=bg, bg2=bg2, ) # use _plt_to_return because plt.show() can return a k3d plot _plt_to_return = None if utils.is_sequence(at): for i, act in enumerate(actors): _plt_to_return = plt.show( act, at=i, zoom=zoom, resetcam=resetcam, viewup=viewup, azimuth=azimuth, elevation=elevation, roll=roll, camera=camera, interactive=False, mode=mode, bg=bg, bg2=bg2, axes=axes, ) if ( interactive or len(at) == N or (isinstance(shape[0], int) and len(at) == shape[0] * shape[1]) ): # note that shape can be a string if plt.interactor and not offscreen and (interactive is None or interactive): plt.interactor.Start() else: _plt_to_return = plt.show( actors, at=at, zoom=zoom, resetcam=resetcam, viewup=viewup, azimuth=azimuth, elevation=elevation, roll=roll, camera=camera, interactive=interactive, mode=mode, bg=bg, bg2=bg2, axes=axes, ) return _plt_to_return def close(): """Close the last created Plotter instance if it exists.""" if not vedo.plotter_instance: return vedo.plotter_instance.close() return ######################################################################## class Plotter: """Main class to manage actors.""" def __init__( self, shape=(1, 1), N=None, pos=(0, 0), size="auto", screensize="auto", title="vedo", bg="white", bg2=None, axes=None, sharecam=True, resetcam=True, interactive=None, offscreen=False, qt_widget=None, wx_widget=None, ): """ Arguments: shape : (str, list) shape of the grid of renderers in format (rows, columns). Ignored if N is specified. N : (int) number of desired renderers arranged in a grid automatically. pos : (list) (x,y) position in pixels of top-left corner of the rendering window on the screen size : (str, list) size of the rendering window. If 'auto', guess it based on screensize. screensize : (list) physical size of the monitor screen in pixels bg : (color, str) background color or specify jpg image file name with path bg2 : (color) background color of a gradient towards the top axes : (int) Note that Axes type-1 can be fully customized by passing a dictionary `axes=dict()`. Check out `vedo.addons.Axes()` for the available options. - 0, no axes - 1, draw three gray grid walls - 2, show cartesian axes from (0,0,0) - 3, show positive range of cartesian axes from (0,0,0) - 4, show a triad at bottom left - 5, show a cube at bottom left - 6, mark the corners of the bounding box - 7, draw a 3D ruler at each side of the cartesian axes - 8, show the VTK CubeAxesActor object - 9, show the bounding box outLine, - 10, show three circles representing the maximum bounding box, - 11, show a large grid on the x-y plane (use with zoom=8) - 12, show polar axes. - 13, draw a simple ruler at the bottom of the window sharecam : (bool) if False each renderer will have an independent vtkCamera interactive : (bool) if True will stop after show() to allow interaction w/ window offscreen : (bool) if True will not show the rendering window qt_widget : (QVTKRenderWindowInteractor) render in a Qt-Widget using an QVTKRenderWindowInteractor. Overrides offscreen to True. Overrides interactive to False. See examples `qt_windows1.py` and `qt_windows2.py` """ vedo.plotter_instance = self if qt_widget is not None: # overrides the interactive and offscreen properties interactive = False offscreen = True if wx_widget is not None: # overrides the interactive property interactive = False if interactive is None: if N == 1: interactive = True elif N or shape != (1, 1): interactive = False else: interactive = True self.actors = [] # list of actors to be shown self.clicked_actor = None # holds the actor that has been clicked self.renderer = None # current renderer self.renderers = [] # list of renderers self.shape = shape # don't remove this line self._interactive = interactive # allows to interact with renderer self.axes = axes # show axes type nr. self.title = title # window title self.sharecam = sharecam # share the same camera if multiple renderers self.picker = None # the vtkPicker object self.picked2d = None # 2d coords of a clicked point on the rendering window self.picked3d = None # 3d coords of a clicked point on an actor self.offscreen = offscreen self.resetcam = resetcam self.last_event = None self.qt_widget = qt_widget # QVTKRenderWindowInteractor self.wx_widget = wx_widget # wxVTKRenderWindowInteractor self.skybox = None # mostly internal stuff: self.hover_legends = [] self.backgrcol = bg self.pos = pos # used by vedo.file_io self.justremoved = None self.axes_instances = [] self.clock = 0 self.sliders = [] self.buttons = [] self.widgets = [] self.cutter_widget = None self.hint_widget = None self.background_renderer = None self.size = size self.interactor = None self.camera = None self._icol = 0 self._clockt0 = time.time() self._extralight = None self._cocoa_initialized = False self._bg = bg # used by backend notebooks ##################################################################### if settings.default_backend != "vtk": if settings.default_backend == "2d": self.offscreen = True if self.size == "auto": self.size = (800, 600) elif settings.default_backend == "k3d": self._interactive = False self.interactor = None self.window = None self.camera = None # let the backend choose if self.size == "auto": self.size = (1000, 1000) ############################################################# return ###################################################### ############################################################# ##################################################################### # build the rendering window: self.window = vtk.vtkRenderWindow() self.window.GlobalWarningDisplayOff() self.window.SetWindowName(self.title) # more settings if settings.use_depth_peeling: self.window.SetAlphaBitPlanes(settings.alpha_bit_planes) self.window.SetMultiSamples(settings.multi_samples) self.window.SetPolygonSmoothing(settings.polygon_smoothing) self.window.SetLineSmoothing(settings.line_smoothing) self.window.SetPointSmoothing(settings.point_smoothing) # sort out screen size if screensize == "auto": screensize = (2160, 1440) # might go wrong, use a default 1.5 ratio ### BUG in GetScreenSize in VTK 9.1.0 ### https://discourse.vtk.org/t/vtk9-1-0-problems/7094/3 if settings.hack_call_screen_size: # True vtkvers = vedo.vtk_version if not self.offscreen and (vtkvers[0] < 9 or vtkvers[0] == 9 and vtkvers[1] == 0): aus = self.window.GetScreenSize() if aus and len(aus) == 2 and aus[0] > 100 and aus[1] > 100: # seems ok if aus[0] / aus[1] > 2: # looks like there are 2 or more screens screensize = (int(aus[0] / 2), aus[1]) else: screensize = aus x, y = screensize if N: # N = number of renderers. Find out the best if shape != (1, 1): # arrangement based on minimum nr. of empty renderers vedo.logger.warning("having set N, shape is ignored.") nx = int(np.sqrt(int(N * y / x) + 1)) ny = int(np.sqrt(int(N * x / y) + 1)) lm = [ (nx, ny), (nx, ny + 1), (nx - 1, ny), (nx + 1, ny), (nx, ny - 1), (nx - 1, ny + 1), (nx + 1, ny - 1), (nx + 1, ny + 1), (nx - 1, ny - 1), ] ind, minl = 0, 1000 for i, m in enumerate(lm): l = m[0] * m[1] if N <= l < minl: ind = i minl = l shape = lm[ind] ################################################## if isinstance(shape, str): if "|" in shape: if self.size == "auto": self.size = (800, 1200) n = int(shape.split("|")[0]) m = int(shape.split("|")[1]) rangen = reversed(range(n)) rangem = reversed(range(m)) else: if self.size == "auto": self.size = (1200, 800) m = int(shape.split("/")[0]) n = int(shape.split("/")[1]) rangen = range(n) rangem = range(m) if n >= m: xsplit = m / (n + m) else: xsplit = 1 - n / (n + m) if settings.window_splitting_position: xsplit = settings.window_splitting_position for i in rangen: arenderer = vtk.vtkRenderer() if "|" in shape: arenderer.SetViewport(0, i / n, xsplit, (i + 1) / n) else: arenderer.SetViewport(i / n, 0, (i + 1) / n, xsplit) self.renderers.append(arenderer) for i in rangem: arenderer = vtk.vtkRenderer() if "|" in shape: arenderer.SetViewport(xsplit, i / m, 1, (i + 1) / m) else: arenderer.SetViewport(i / m, xsplit, (i + 1) / m, 1) self.renderers.append(arenderer) for r in self.renderers: r.SetUseHiddenLineRemoval(settings.hidden_line_removal) r.SetLightFollowCamera(settings.light_follows_camera) r.SetUseDepthPeeling(settings.use_depth_peeling) # r.SetUseDepthPeelingForVolumes(settings.use_depth_peeling) if settings.use_depth_peeling: r.SetMaximumNumberOfPeels(settings.max_number_of_peels) r.SetOcclusionRatio(settings.occlusion_ratio) r.SetUseFXAA(settings.use_fxaa) r.SetPreserveDepthBuffer(settings.preserve_depth_buffer) r.SetBackground(vedo.get_color(self.backgrcol)) self.axes_instances.append(None) self.shape = (n + m,) elif utils.is_sequence(shape) and isinstance(shape[0], dict): # passing a sequence of dicts for renderers specifications if self.size == "auto": self.size = (1200, 900) for rd in shape: x0, y0 = rd["bottomleft"] x1, y1 = rd["topright"] bg_ = rd.pop("bg", "white") bg2_ = rd.pop("bg2", None) arenderer = vtk.vtkRenderer() arenderer.SetUseHiddenLineRemoval(settings.hidden_line_removal) arenderer.SetLightFollowCamera(settings.light_follows_camera) arenderer.SetUseDepthPeeling(settings.use_depth_peeling) # arenderer.SetUseDepthPeelingForVolumes(settings.use_depth_peeling) if settings.use_depth_peeling: arenderer.SetMaximumNumberOfPeels(settings.max_number_of_peels) arenderer.SetOcclusionRatio(settings.occlusion_ratio) arenderer.SetUseFXAA(settings.use_fxaa) arenderer.SetPreserveDepthBuffer(settings.preserve_depth_buffer) arenderer.SetViewport(x0, y0, x1, y1) arenderer.SetBackground(vedo.get_color(bg_)) if bg2_: arenderer.GradientBackgroundOn() arenderer.SetBackground2(vedo.get_color(bg2_)) self.renderers.append(arenderer) self.axes_instances.append(None) self.shape = (len(shape),) else: if isinstance(self.size, str) and self.size == "auto": # figure out a reasonable window size f = 1.5 xs = y / f * shape[1] # because y x / f: # shrink xs = x / f ys = xs / shape[1] * shape[0] if ys > y / f: ys = y / f xs = ys / shape[0] * shape[1] self.size = (int(xs), int(ys)) if shape == (1, 1): self.size = (int(y / f), int(y / f)) # because y len(self.renderers): vedo.logger.error(f"at({nren, yren}) is malformed!") raise RuntimeError self.renderer = self.renderers[nren] self.camera = self.renderer.GetActiveCamera() return self def add(self, *actors, at=None): """ Append the input objects to the internal list of actors to be shown. This method is typically used in loops or callback functions. Arguments: at : (int) add the object at the specified renderer """ if at is not None: ren = self.renderers[at] else: ren = self.renderer actors = utils.flatten(actors) actors = self._scan_input(actors) for a in actors: if isinstance(a, vtk.vtkInteractorObserver): a.add_to(self) continue if a not in self.actors: self.actors.append(a) if ren: ren.AddActor(a) if hasattr(a, "rendered_at"): ir = self.renderers.index(ren) a.rendered_at.add(ir) if hasattr(a, "scalarbar") and a.scalarbar: ren.AddActor(a.scalarbar) return self def remove(self, *actors, at=None): """ Remove input object to the internal list of actors to be shown. This method is typically used in loops or callback functions. Objects to be removed can be referenced by their assigned name. Arguments: at : (int) remove the object at the specified renderer """ if at is not None: ren = self.renderers[at] else: ren = self.renderer actors = utils.flatten(actors) actors_in_ren = None actors_r = [] for i, a in enumerate(actors): if isinstance(a, vtk.vtkInteractorObserver): a.remove_from(self) continue ### if isinstance(a, str): if actors_in_ren is None: actors_in_ren = self.get_meshes( include_non_pickables=True, unpack_assemblies=False, ) for b in set(self.actors + actors_in_ren): if hasattr(b, "name") and a in b.name: actors_r.append(b) else: actors_r.append(a) for a in set(actors_r): if ren: ren.RemoveActor(a) if hasattr(a, "rendered_at"): ir = self.renderers.index(ren) a.rendered_at.discard(ir) if hasattr(a, "scalarbar") and a.scalarbar: ren.RemoveActor(a.scalarbar) if hasattr(a, "_caption") and a._caption: ren.RemoveActor(a._caption) if hasattr(a, "shadows") and a.shadows: for sha in a.shadows: ren.RemoveActor(sha) if hasattr(a, "trail") and a.trail: ren.RemoveActor(a.trail) a.trail_points = [] if hasattr(a.trail, "shadows") and a.trail.shadows: for sha in a.trail.shadows: ren.RemoveActor(sha) if a in self.actors: i = self.actors.index(a) del self.actors[i] return self def remove_lights(self): """Remove all the present lights in the current renderer.""" if self.renderer: self.renderer.RemoveAllLights() return self def pop(self, at=None): """ Remove the last added object from the rendering window. This method is typically used in loops or callback functions. """ if at is not None and not isinstance(at, int): # wrong usage pitfall vedo.logger.error("argument of pop() must be an integer") raise RuntimeError() if self.actors: self.remove(self.actors[-1], at) return self def render(self, resetcam=False): """Render the scene. This method is typically used in loops or callback functions.""" if not self.window: return self if self.wx_widget: if resetcam: self.renderer.ResetCamera() self.wx_widget.Render() return self if self.qt_widget: if resetcam: self.renderer.ResetCamera() self.qt_widget.Render() return self if self.interactor: if not self.interactor.GetInitialized(): self.interactor.Initialize() self.camera = self.renderer.GetActiveCamera() if resetcam: self.renderer.ResetCamera() self.window.Render() return self def interactive(self): """ Start window interaction. Analogous to `show(..., interactive=True)`. """ if self.interactor: self.interactor.Start() return self def use_depth_peeling(self, at=None, value=True): """ Specify whether use depth peeling algorithm at this specific renderer Call this method before the first rendering. """ if at is None: ren = self.renderer else: ren = self.renderers[at] ren.SetUseDepthPeeling(value) return self def background(self, c1=None, c2=None, at=None): """Set the color of the background for the current renderer. A different renderer index can be specified by keyword ``at``. Arguments: c1 : (list) background main color. c2 : (list) background color for the upper part of the window. at : (int) renderer index. """ if not self.renderers: return self if at is None: r = self.renderer else: r = self.renderers[at] if r: if c1 is not None: r.SetBackground(vedo.get_color(c1)) self._bg = r.GetBackground() # notebooks if c2 is not None: r.GradientBackgroundOn() r.SetBackground2(vedo.get_color(c2)) else: r.GradientBackgroundOff() return self #################################################### @deprecated(reason=vedo.colors.red + "Please use get_meshes()" + vedo.colors.reset) def getMeshes(self, *a, **b): """Deprecated, use get_meshes()""" return self.get_meshes(*a, **b) def get_meshes(self, at=None, include_non_pickables=False, unpack_assemblies=True): """ Return a list of Meshes from the specified renderer. Arguments: at : (int) specify which renderer to look at. include_non_pickables : (bool) include non-pickable objects unpack_assemblies : (bool) unpack assemblies into their components """ if at is None: renderer = self.renderer at = self.renderers.index(renderer) elif isinstance(at, int): renderer = self.renderers[at] has_global_axes = False if isinstance(self.axes_instances[at], vedo.Assembly): has_global_axes = True if unpack_assemblies: acs = renderer.GetActors() else: acs = renderer.GetViewProps() actors = [] acs.InitTraversal() for _ in range(acs.GetNumberOfItems()): if unpack_assemblies: a = acs.GetNextItem() else: a = acs.GetNextProp() if isinstance(a, vtk.vtkVolume): continue if include_non_pickables or a.GetPickable(): if a == self.axes_instances[at]: continue if has_global_axes and a in self.axes_instances[at].actors: continue actors.append(a) return actors def get_volumes(self, at=None, include_non_pickables=False): """ Return a list of Volumes from the specified renderer. Arguments: at : (int) specify which renderer to look at include_non_pickables : (bool) include non-pickable objects """ if at is None: renderer = self.renderer at = self.renderers.index(renderer) elif isinstance(at, int): renderer = self.renderers[at] vols = [] acs = renderer.GetVolumes() acs.InitTraversal() for _ in range(acs.GetNumberOfItems()): a = acs.GetNextItem() if include_non_pickables or a.GetPickable(): vols.append(a) return vols @deprecated(reason=vedo.colors.red + "Please use reset_camera()" + vedo.colors.reset) def resetCamera(self, tight=None): "Deprecated, please use reset_camera()" return self.reset_camera(tight) def reset_camera(self, tight=None): """ Reset the camera position and zooming. If tight (float) is specified the zooming reserves a padding space in the xy-plane expressed in percent of the average size. """ if tight is None: self.renderer.ResetCamera() else: x0, x1, y0, y1, z0, z1 = self.renderer.ComputeVisiblePropBounds() cam = self.renderer.GetActiveCamera() self.renderer.ComputeAspect() aspect = self.renderer.GetAspect() angle = np.pi * cam.GetViewAngle() / 180.0 dx, dy = (x1 - x0) * 0.999, (y1 - y0) * 0.999 dist = max(dx / aspect[0], dy) / np.sin(angle / 2) / 2 cam.SetViewUp(0, 1, 0) cam.SetPosition(x0 + dx / 2, y0 + dy / 2, dist * (1 + tight)) cam.SetFocalPoint(x0 + dx / 2, y0 + dy / 2, 0) if cam.GetParallelProjection(): ps = max(dx / aspect[0], dy) / 2 cam.SetParallelScale(ps * (1 + tight)) self.renderer.ResetCameraClippingRange(x0, x1, y0, y1, z0, z1) return self def reset_viewup(self, smooth=True): """ Reset the orientation of the camera to the closest orthogonal direction and view-up. """ vbb = addons.compute_visible_bounds()[0] x0, x1, y0, y1, z0, z1 = vbb mx, my, mz = (x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2 d = self.camera.GetDistance() viewups = np.array([ (0, 1, 0), ( 0, -1, 0), (0, 0, 1), ( 0, 0, -1), (1, 0, 0), (-1, 0, 0), ]) positions = np.array([ (mx, my, mz+d), (mx, my, mz-d), (mx, my+d, mz), (mx, my-d, mz), (mx+d, my, mz), (mx-d, my, mz), ]) vu = np.array(self.camera.GetViewUp()) vui = np.argmin(np.linalg.norm(viewups - vu, axis=1)) poc = np.array(self.camera.GetPosition()) foc = np.array(self.camera.GetFocalPoint()) a = poc - foc b = positions - foc a = a / np.linalg.norm(a) b = b.T * (1 / np.linalg.norm(b, axis=1)) pui = np.argmin(np.linalg.norm(b.T - a, axis=1)) if smooth: outtimes = np.linspace(0, 1, num=11, endpoint=True) for t in outtimes: vv = vu * (1 - t) + viewups[vui] * t pp = poc * (1 - t) + positions[pui] * t ff = foc * (1 - t) + np.array([mx, my, mz]) * t self.camera.SetViewUp(vv) self.camera.SetPosition(pp) self.camera.SetFocalPoint(ff) self.render() # interpolator does not respect parallel view...: # cam1 = dict( # pos=poc, # viewup=vu, # focal_point=(mx,my,mz), # clipping_range=self.camera.GetClippingRange() # ) # # cam1 = self.camera # cam2 = dict( # pos=positions[pui], # viewup=viewups[vui], # focal_point=(mx,my,mz), # clipping_range=self.camera.GetClippingRange() # ) # vcams = self.move_camera([cam1, cam2], output_times=outtimes, smooth=0) # for c in vcams: # self.renderer.SetActiveCamera(c) # self.render() else: self.camera.SetViewUp(viewups[vui]) self.camera.SetPosition(positions[pui]) self.camera.SetFocalPoint(mx, my, mz) self.renderer.ResetCameraClippingRange() # vbb, _, _, _ = addons.compute_visible_bounds() # x0,x1, y0,y1, z0,z1 = vbb # self.renderer.ResetCameraClippingRange(x0, x1, y0, y1, z0, z1) self.render() return self def move_camera(self, cameras, t=0, times=(), smooth=True, output_times=()): """ Takes as input two cameras set camera at an interpolated position: Cameras can be vtkCamera or dictionaries in format: `dict(pos=..., focal_point=..., viewup=..., distance=..., clipping_range=...)` Press `shift-C` key in interactive mode to dump a python snipplet of parameters for the current camera view. """ nc = len(cameras) if len(times) == 0: times = np.linspace(0, 1, num=nc, endpoint=True) assert len(times) == nc cin = vtk.vtkCameraInterpolator() # cin.SetInterpolationTypeToLinear() # bugged? if nc > 2 and smooth: cin.SetInterpolationTypeToSpline() for i, cam in enumerate(cameras): vcam = cam if isinstance(cam, dict): vcam = utils.camera_from_dict(cam) cin.AddCamera(times[i], vcam) mint, maxt = cin.GetMinimumT(), cin.GetMaximumT() rng = maxt - mint if len(output_times) == 0: cin.InterpolateCamera(t * rng, self.camera) self.renderer.SetActiveCamera(self.camera) return [self.camera] else: vcams = [] for tt in output_times: c = vtk.vtkCamera() cin.InterpolateCamera(tt * rng, c) vcams.append(c) return vcams def fly_to(self, point): """ Fly camera to the specified point. Arguments: point : (list) point in space to place camera. Example: ```python from vedo import * cone = Cone() plt = Plotter(axes=1) plt.show(cone) plt.fly_to([1,0,0]) plt.interactive().close() ``` """ if self.interactor: self.resetcam = False self.interactor.FlyTo(self.renderer, point) self.camera = self.renderer.GetActiveCamera() return self def look_at(self, plane="xy"): """Move the camera so that it looks at the specified cartesian plane""" cam = self.renderer.GetActiveCamera() fp = np.array(cam.GetFocalPoint()) p = np.array(cam.GetPosition()) dist = np.linalg.norm(fp - p) plane = plane.lower() if "x" in plane and "y" in plane: cam.SetPosition(fp[0], fp[1], fp[2] + dist) cam.SetViewUp(0.0, 1.0, 0.0) elif "x" in plane and "z" in plane: cam.SetPosition(fp[0], fp[1] - dist, fp[2]) cam.SetViewUp(0.0, 0.0, 1.0) elif "y" in plane and "z" in plane: cam.SetPosition(fp[0] + dist, fp[1], fp[2]) cam.SetViewUp(0.0, 0.0, 1.0) else: vedo.logger.error(f"in plotter.look() cannot understand argument {plane}") return self def record(self, filename=".vedo_recorded_events.log"): """ Record camera, mouse, keystrokes and all other events. Recording can be toggled on/off by pressing key "R". Arguments: filename : (str) ascii file to store events. The default is '.vedo_recorded_events.log'. Returns: a string descriptor of events. Examples: - [record_play.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/record_play.py) """ erec = vtk.vtkInteractorEventRecorder() erec.SetInteractor(self.interactor) erec.SetFileName(filename) erec.SetKeyPressActivationValue("R") erec.EnabledOn() erec.Record() self.interactor.Start() erec.Stop() erec.EnabledOff() with open(filename, "r", encoding="UTF-8") as fl: events = fl.read() erec = None return events def play(self, events=".vedo_recorded_events.log", repeats=0): """ Play camera, mouse, keystrokes and all other events. Arguments: events : (str) file o string of events. The default is '.vedo_recorded_events.log'. repeats : (int) number of extra repeats of the same events. The default is 0. Examples: - [record_play.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/record_play.py) """ erec = vtk.vtkInteractorEventRecorder() erec.SetInteractor(self.interactor) if events.endswith(".log"): erec.ReadFromInputStringOff() erec.SetFileName(events) else: erec.ReadFromInputStringOn() erec.SetInputString(events) erec.Play() for _i in range(repeats): erec.Rewind() erec.Play() erec.EnabledOff() erec = None return self def parallel_projection(self, value=True, at=None): """ Use parallel projection `at` a specified renderer. Object is seen from "infinite" distance, e.i. remove any perspective effects. An input value equal to -1 will toggle it on/off. """ if at is not None: r = self.renderers[at] else: r = self.renderer if value == -1: val = r.GetActiveCamera().GetParallelProjection() value = not val r.GetActiveCamera().SetParallelProjection(value) r.Modified() return self def fov(self, angle): """ Set the field of view angle for the camera. This is the angle of the camera frustum in the horizontal direction. High values will result in a wide-angle lens (fish-eye effect), and low values will result in a telephoto lens. Default value is 30 degrees. """ self.renderer.GetActiveCamera().UseHorizontalViewAngleOn() self.renderer.GetActiveCamera().SetViewAngle(angle) return self def zoom(self, zoom): """Apply a zooming factor for the current camera view""" self.renderer.GetActiveCamera().Zoom(zoom) return self def azimuth(self, angle): """Rotate camera around the view up vector.""" self.renderer.GetActiveCamera().Azimuth(angle) return self def elevation(self, angle): """Rotate the camera around the cross product of the negative of the direction of projection and the view up vector.""" self.renderer.GetActiveCamera().Elevation(angle) return self def roll(self, angle): """Roll the camera about the direction of projection.""" self.renderer.GetActiveCamera().Roll(angle) return self def dolly(self, value): """Move the camera towards (value>0) or away from (value<0) the focal point.""" self.renderer.GetActiveCamera().Dolly(value) return self ################################################################## @deprecated(reason=vedo.colors.red + "Please use add_slider()" + vedo.colors.reset) def addSlider2D(self, *a, **b): return self.add_slider(*a, **b) def add_slider( self, sliderfunc: Callable, xmin, xmax, value=None, pos=4, title="", font="", title_size=1, c=None, alpha=1, show_value=True, delayed=False, **options, ): """ Add a `vedo.addons.Slider2D` which can call an external custom function. Arguments: sliderfunc : (Callable) external function to be called by the widget xmin : (float) lower value of the slider xmax : (float) upper value value : (float) current value pos : (list, str) position corner number: horizontal [1-5] or vertical [11-15] it can also be specified by corners coordinates [(x1,y1), (x2,y2)] and also by a string descriptor (eg. "bottom-left") title : (str) title text font : (str) title font face. Check [available fonts here](https://vedo.embl.es/fonts). title_size : (float) title text scale [1.0] show_value : (bool) if True current value is shown delayed : (bool) if True the callback is delayed until when the mouse button is released alpha : (float) opacity of the scalar bar texts slider_length : (float) slider length slider_width : (float) slider width end_cap_length : (float) length of the end cap end_cap_width : (float) width of the end cap tube_width : (float) width of the tube title_height : (float) width of the title tformat : (str) format of the title Examples: - [sliders1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/sliders1.py) - [sliders2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/sliders2.py) ![](https://user-images.githubusercontent.com/32848391/50738848-be033480-11d8-11e9-9b1a-c13105423a79.jpg) """ if c is None: # automatic black or white c = (0.8, 0.8, 0.8) if np.sum(vedo.get_color(self.backgrcol)) > 1.5: c = (0.2, 0.2, 0.2) else: c = vedo.get_color(c) slider2d = addons.Slider2D( sliderfunc, xmin, xmax, value, pos, title, font, title_size, c, alpha, show_value, delayed, **options, ) if self.renderer: slider2d.renderer = self.renderer if self.interactor: slider2d.interactor = self.interactor slider2d.on() self.sliders.append([slider2d, sliderfunc]) return slider2d def add_slider3d( self, sliderfunc, pos1, pos2, xmin, xmax, value=None, s=0.03, t=1, title="", rotation=0.0, c=None, show_value=True, ): """ Add a 3D slider widget which can call an external custom function. Arguments: sliderfunc : (function) external function to be called by the widget pos1 : (list) first position 3D coordinates pos2 : (list) second position coordinates xmin : (float) lower value xmax : (float) upper value value : (float) initial value s : (float) label scaling factor t : (float) tube scaling factor title : (str) title text c : (color) slider color rotation : (float) title rotation around slider axis show_value : (bool) if True current value is shown Examples: - [sliders3d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/sliders3d.py) ![](https://user-images.githubusercontent.com/32848391/52859555-4efcf200-312d-11e9-9290-6988c8295163.png) """ if c is None: # automatic black or white c = (0.8, 0.8, 0.8) if np.sum(vedo.get_color(self.backgrcol)) > 1.5: c = (0.2, 0.2, 0.2) else: c = vedo.get_color(c) slider3d = addons.Slider3D( sliderfunc, pos1, pos2, xmin, xmax, value, s, t, title, rotation, c, show_value ) slider3d.renderer = self.renderer slider3d.interactor = self.interactor slider3d.on() self.sliders.append([slider3d, sliderfunc]) return slider3d @deprecated(reason=vedo.colors.red + "Please use add_button()" + vedo.colors.reset) def addButton(self, *a, **b): return self.add_button(*a, **b) def add_button( self, fnc, states=("On", "Off"), c=("w", "w"), bc=("dg", "dr"), pos=(0.7, 0.05), size=24, font=None, bold=False, italic=False, alpha=1, angle=0, ): """ Add a button to the renderer window. Arguments: states : (list) a list of possible states, e.g. ['On', 'Off'] c : (list) a list of colors for each state bc : (list) a list of background colors for each state pos : (list) 2D position in pixels from left-bottom corner size : (float) size of button font font : (str) font type. Check [available fonts here](https://vedo.embl.es/fonts). bold : (bool) bold font face (False) italic : (bool) italic font face (False) alpha : (float) opacity level angle : (float) anticlockwise rotation in degrees Returns: `vedo.addons.Button` object. Examples: - [buttons.py](https://github.com/marcomusy/vedo/blob/master/examples/basic/buttons.py) ![](https://user-images.githubusercontent.com/32848391/50738870-c0fe2500-11d8-11e9-9b78-92754f5c5968.jpg) """ bu = addons.Button(fnc, states, c, bc, pos, size, font, bold, italic, alpha, angle) self.renderer.AddActor2D(bu.actor) self.buttons.append(bu) return bu def add_spline_tool( self, points, pc="k", ps=8, lc="r4", ac="g5", lw=2, closed=False, interactive=False ): """ Add a spline tool to the current plotter. Nodes of the spline can be dragged in space with the mouse. Clicking on the line itself adds an extra point. Selecting a point and pressing del removes it. Arguments: points : (Mesh, Points, array) the set of vertices forming the spline nodes. pc : (str) point color. The default is 'k'. ps : (str) point size. The default is 8. lc : (str) line color. The default is 'r4'. ac : (str) active point marker color. The default is 'g5'. lw : (int) line width. The default is 2. closed : (bool) spline is meant to be closed. The default is False. Returns: a `SplineTool` object. Examples: - [spline_tool.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/spline_tool.py) ![](https://vedo.embl.es/images/basic/spline_tool.png) """ sw = addons.SplineTool(points, pc, ps, lc, ac, lw, closed) if self.interactor: sw.SetInteractor(self.interactor) else: vedo.logger.error("in add_spline_tool(), No interactor found.") raise RuntimeError sw.On() sw.Initialize(sw.points.polydata()) if sw.closed: sw.representation.ClosedLoopOn() sw.representation.SetRenderer(self.renderer) sw.representation.BuildRepresentation() sw.Render() if interactive: self.interactor.Start() else: self.interactor.Render() return sw def add_icon(self, icon, pos=3, size=0.08): """Add an inset icon mesh into the same renderer. Arguments: pos : (int, list) icon position in the range [1-4] indicating one of the 4 corners, or it can be a tuple (x,y) as a fraction of the renderer size. size : (float) size of the square inset. Examples: - [icon.py](https://github.com/marcomusy/vedo/tree/master/examples/other/icon.py) """ iconw = addons.Icon(icon, pos, size) iconw.SetInteractor(self.interactor) iconw.EnabledOn() iconw.InteractiveOff() self.widgets.append(iconw) return iconw def add_global_axes(self, axtype=None, c=None): """Draw axes on scene. Available axes types: Arguments: axtype : (int) - 0, no axes, - 1, draw three gray grid walls - 2, show cartesian axes from (0,0,0) - 3, show positive range of cartesian axes from (0,0,0) - 4, show a triad at bottom left - 5, show a cube at bottom left - 6, mark the corners of the bounding box - 7, draw a 3D ruler at each side of the cartesian axes - 8, show the vtkCubeAxesActor object - 9, show the bounding box outLine - 10, show three circles representing the maximum bounding box - 11, show a large grid on the x-y plane - 12, show polar axes - 13, draw a simple ruler at the bottom of the window Axis type-1 can be fully customized by passing a dictionary axes=dict(). Example: ```python from vedo import Box, show b = Box(pos=(0, 0, 0), length=80, width=90, height=70).alpha(0.1) show( b, axes={ "xtitle": "Some long variable [a.u.]", "number_of_divisions": 4, # ... }, ) ``` Examples: - [custom_axes1.py](https://github.com/marcomusy/vedo/blob/master/examples/pyplot/custom_axes1.py) - [custom_axes2.py](https://github.com/marcomusy/vedo/blob/master/examples/pyplot/custom_axes2.py) - [custom_axes3.py](https://github.com/marcomusy/vedo/blob/master/examples/pyplot/custom_axes3.py) - [custom_axes4.py](https://github.com/marcomusy/vedo/blob/master/examples/pyplot/custom_axes4.py) """ addons.add_global_axes(axtype, c) return self def add_legend_box(self, **kwargs): """Add a legend to the top right. Examples: - [legendbox.py](https://github.com/marcomusy/vedo/blob/master/examples/examples/basic/legendbox.py), - [flag_labels1.py](https://github.com/marcomusy/vedo/blob/master/examples/examples/other/flag_labels1.py) - [flag_labels2.py](https://github.com/marcomusy/vedo/blob/master/examples/examples/other/flag_labels2.py) """ acts = self.get_meshes() lb = addons.LegendBox(acts, **kwargs) self.add(lb) return self def add_hint( self, obj, text="", c="k", bc="yellow8", font="Calco", size=18, justify=0, angle=0, delay=100, ): """ Create a pop-up hint style message when hovering an object. Use add_hint(False) to disable all hints. Arguments: obj : (Mesh, Points) the object to associate the pop-up to text : (str) string description of the pop-up delay : (int) milliseconds to wait before pop-up occurs """ if self.offscreen: return self if vedo.vtk_version[0] == 9 and "Linux" in vedo.sys_platform: # Linux vtk9 is bugged vedo.logger.warning("add_hint() is not available on Linux platforms.") return self if obj is False: self.hint_widget.EnabledOff() self.hint_widget = None return self if text is False and self.hint_widget: self.hint_widget.RemoveBalloon(obj) return self if text == "": if obj.name: text = obj.name elif obj.filename: text = obj.filename else: return self if not self.hint_widget: self.hint_widget = vtk.vtkBalloonWidget() rep = vtk.vtkBalloonRepresentation() rep.SetBalloonLayoutToImageRight() trep = rep.GetTextProperty() trep.SetFontFamily(vtk.VTK_FONT_FILE) trep.SetFontFile(utils.get_font_path(font)) trep.SetFontSize(size) trep.SetColor(vedo.get_color(c)) trep.SetBackgroundColor(vedo.get_color(bc)) trep.SetShadow(False) trep.SetJustification(justify) trep.UseTightBoundingBoxOn() self.hint_widget.ManagesCursorOff() self.hint_widget.SetTimerDuration(delay) self.hint_widget.SetInteractor(self.interactor) if angle: rep.SetOrientation(angle) rep.SetBackgroundOpacity(0) self.hint_widget.SetRepresentation(rep) self.widgets.append(self.hint_widget) if self.interactor.GetInitialized(): self.hint_widget.EnabledOn() else: vedo.logger.warning("add_hint() must be called after show(). Skip.") return self bst = self.hint_widget.GetBalloonString(obj) if bst: self.hint_widget.UpdateBalloonString(obj, text) else: self.hint_widget.AddBalloon(obj, text) return self def add_shadows(self): """Add shadows at the current renderer.""" shadows = vtk.vtkShadowMapPass() seq = vtk.vtkSequencePass() passes = vtk.vtkRenderPassCollection() passes.AddItem(shadows.GetShadowMapBakerPass()) passes.AddItem(shadows) seq.SetPasses(passes) camerapass = vtk.vtkCameraPass() camerapass.SetDelegatePass(seq) self.renderer.SetPass(camerapass) return self def add_ambient_occlusion(self, radius, bias=0.01, blur=True, samples=100): """ Screen Space Ambient Occlusion. For every pixel on the screen, the pixel shader samples the depth values around the current pixel and tries to compute the amount of occlusion from each of the sampled points. Arguments: radius : (float) radius of influence in absolute units bias : (float) bias of the normals blur : (bool) add a blurring to the sampled positions samples : (int) number of samples to probe Examples: - [ssao.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/ssao.py) ![](https://vedo.embl.es/images/basic/ssao.jpg) """ lights = vtk.vtkLightsPass() opaque = vtk.vtkOpaquePass() ssaoCam = vtk.vtkCameraPass() ssaoCam.SetDelegatePass(opaque) ssao = vtk.vtkSSAOPass() ssao.SetRadius(radius) ssao.SetBias(bias) ssao.SetBlur(blur) ssao.SetKernelSize(samples) ssao.SetDelegatePass(ssaoCam) translucent = vtk.vtkTranslucentPass() volpass = vtk.vtkVolumetricPass() ddp = vtk.vtkDualDepthPeelingPass() ddp.SetTranslucentPass(translucent) ddp.SetVolumetricPass(volpass) over = vtk.vtkOverlayPass() collection = vtk.vtkRenderPassCollection() collection.AddItem(lights) collection.AddItem(ssao) collection.AddItem(ddp) collection.AddItem(over) sequence = vtk.vtkSequencePass() sequence.SetPasses(collection) cam = vtk.vtkCameraPass() cam.SetDelegatePass(sequence) self.renderer.SetPass(cam) return self def add_depth_of_field(self, autofocus=True): """Add a depth of field effect in the scene.""" lights = vtk.vtkLightsPass() opaque = vtk.vtkOpaquePass() dofCam = vtk.vtkCameraPass() dofCam.SetDelegatePass(opaque) dof = vtk.vtkDepthOfFieldPass() dof.SetAutomaticFocalDistance(autofocus) dof.SetDelegatePass(dofCam) collection = vtk.vtkRenderPassCollection() collection.AddItem(lights) collection.AddItem(dof) sequence = vtk.vtkSequencePass() sequence.SetPasses(collection) cam = vtk.vtkCameraPass() cam.SetDelegatePass(sequence) self.renderer.SetPass(cam) return self def _add_skybox(self, hdrfile): # many hdr files are at https://polyhaven.com/all if utils.vtk_version_at_least(9): reader = vtk.vtkHDRReader() # Check the image can be read. if not reader.CanReadFile(hdrfile): vedo.logger.error(f"Cannot read HDR file {hdrfile}") return self reader.SetFileName(hdrfile) reader.Update() texture = vtk.vtkTexture() texture.SetColorModeToDirectScalars() texture.SetInputData(reader.GetOutput()) # Convert to a cube map tcm = vtk.vtkEquirectangularToCubeMapTexture() tcm.SetInputTexture(texture) # Enable mipmapping to handle HDR image tcm.MipmapOn() tcm.InterpolateOn() self.renderer.SetEnvironmentTexture(tcm) self.renderer.UseImageBasedLightingOn() self.skybox = vtk.vtkSkybox() self.skybox.SetTexture(tcm) self.renderer.AddActor(self.skybox) else: vedo.logger.error("add_skybox not supported in this VTK version. Skip.") return self def add_renderer_frame(self, c=None, alpha=None, lw=None, padding=None): """ Add a frame to the renderer subwindow. Arguments: c : (color) color name or index alpha : (float) opacity level lw : (int) line width in pixels. padding : (float) padding space in pixels. """ if c is None: # automatic black or white c = (0.9, 0.9, 0.9) if np.sum(vedo.plotter_instance.renderer.GetBackground()) > 1.5: c = (0.1, 0.1, 0.1) renf = addons.RendererFrame(c, alpha, lw, padding) self.renderer.AddActor(renf) return self def add_hover_legend( self, at=None, c=None, pos="bottom-left", font="Calco", s=0.75, bg="auto", alpha=0.1, maxlength=24, use_info=False, ): """ Add a legend with 2D text which is triggered by hovering the mouse on an object. The created text object are stored in plotter.hover_legends Arguments: c : (color) Text color. If None then black or white is chosen automatically pos : (str) text positioning font : (str) text font type. Check [available fonts here](https://vedo.embl.es/fonts). s : (float) text size scale bg : (color) background color of the 2D box containing the text alpha : (float) box transparency maxlength : (int) maximum number of characters per line use_info : (bool) visualize the content of the `obj.info` attribute Examples: - [hover_legend.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/hover_legend.py) - [earthquake_browser.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/earthquake_browser.py) ![](https://vedo.embl.es/images/pyplot/earthquake_browser.jpg) """ hoverlegend = vedo.shapes.Text2D(pos=pos, font=font, c=c, s=s, alpha=alpha, bg=bg) if at is None: at = self.renderers.index(self.renderer) def _legfunc(evt): if not evt.actor or not self.renderer or at != evt.at: if hoverlegend._mapper.GetInput(): # clear and return hoverlegend._mapper.SetInput("") self.interactor.Render() return if use_info: if hasattr(evt.actor, "info"): t = str(evt.actor.info) else: return else: t, tp = "", "" if evt.isMesh: tp = "Mesh " elif evt.isPoints: tp = "Points " # elif evt.isVolume: # tp = "Volume " elif evt.isPicture: tp = "Pict " elif evt.isAssembly: tp = "Assembly " else: return if evt.isAssembly: if not evt.actor.name: t += f"Assembly object of {len(evt.actor.unpack())} parts\n" else: t += f"Assembly name: {evt.actor.name} ({len(evt.actor.unpack())} parts)\n" else: if evt.actor.name: t += f"{tp}name" if evt.isPoints: t += " " if evt.isMesh: t += " " t += f": {evt.actor.name[:maxlength]}".ljust(maxlength) + "\n" if evt.actor.filename: t += f"{tp}filename: " t += f"{os.path.basename(evt.actor.filename[-maxlength:])}".ljust(maxlength) t += "\n" if not evt.actor.file_size: evt.actor.file_size, evt.actor.created = vedo.file_io.file_info(evt.actor.filename) if evt.actor.file_size: t += " : " sz, created = evt.actor.file_size, evt.actor.created t += f"{created[4:-5]} ({sz})" + "\n" if evt.isPoints: indata = evt.actor.polydata(False) if indata.GetNumberOfPoints(): t += ( f"#points/cells: {indata.GetNumberOfPoints()}" f" / {indata.GetNumberOfCells()}" ) pdata = indata.GetPointData() cdata = indata.GetCellData() if pdata.GetScalars() and pdata.GetScalars().GetName(): t += f"\nPoint array : {pdata.GetScalars().GetName()}" if pdata.GetScalars().GetName() == evt.actor.mapper().GetArrayName(): t += " *" if cdata.GetScalars() and cdata.GetScalars().GetName(): t += f"\nCell array : {cdata.GetScalars().GetName()}" if cdata.GetScalars().GetName() == evt.actor.mapper().GetArrayName(): t += " *" if evt.isPicture: t = f"{os.path.basename(evt.actor.filename[:maxlength+10])}".ljust(maxlength+10) t += f"\nImage shape: {evt.actor.shape}" pcol = self.color_picker(evt.picked2d) t += f"\nPixel color: {vedo.colors.rgb2hex(pcol/255)} {pcol}" # change box color if needed in 'auto' mode if evt.isPoints and "auto" in str(bg): actcol = evt.actor.GetProperty().GetColor() if hoverlegend._mapper.GetTextProperty().GetBackgroundColor() != actcol: hoverlegend._mapper.GetTextProperty().SetBackgroundColor(actcol) # adapt to changes in bg color bgcol = self.renderers[at].GetBackground() _bgcol = c if _bgcol is None: # automatic black or white _bgcol = (0.9, 0.9, 0.9) if sum(bgcol) > 1.5: _bgcol = (0.1, 0.1, 0.1) if len(set(_bgcol).intersection(bgcol)) < 3: hoverlegend.color(_bgcol) if hoverlegend._mapper.GetInput() != t: hoverlegend._mapper.SetInput(t) self.interactor.Render() self.add(hoverlegend, at=at) self.hover_legends.append(hoverlegend) self.add_callback("MouseMove", _legfunc) return self ##################################################################### def add_scale_indicator( self, pos=(0.7, 0.05), s=0.02, length=2, lw=4, c="k1", alpha=1, units="", gap=0.05 ): """ Add a Scale Indicator. Only works in parallel mode (no perspective). Arguments: pos : (list) fractional (x,y) position on the screen. s : (float) size of the text. length : (float) length of the line. units : (str) string to show units. gap : (float) separation of line and text. Example: ```python from vedo import settings, Cube, Plotter settings.use_parallel_projection = True # or else it does not make sense! cube = Cube().alpha(0.2) plt = Plotter(size=(900,600), axes=dict(xtitle='x (um)')) plt.add_scale_indicator(units='um', c='blue4') plt.show(cube, "Scale indicator with units").close() ``` ![](https://vedo.embl.es/images/feats/scale_indicator.png) """ ppoints = vtk.vtkPoints() # Generate the polyline psqr = [[0.0, gap], [length / 10, gap]] dd = psqr[1][0] - psqr[0][0] for i, pt in enumerate(psqr): ppoints.InsertPoint(i, pt[0], pt[1], 0) lines = vtk.vtkCellArray() lines.InsertNextCell(len(psqr)) for i in range(len(psqr)): lines.InsertCellPoint(i) pd = vtk.vtkPolyData() pd.SetPoints(ppoints) pd.SetLines(lines) wsx, wsy = self.window.GetSize() if not settings.use_parallel_projection: vedo.logger.warning("add_scale_indicator called with use_parallel_projection OFF. Skip.") return None rlabel = vtk.vtkVectorText() rlabel.SetText("scale") tf = vtk.vtkTransformPolyDataFilter() tf.SetInputConnection(rlabel.GetOutputPort()) t = vtk.vtkTransform() t.Scale(s * wsy / wsx, s, 1) tf.SetTransform(t) app = vtk.vtkAppendPolyData() app.AddInputConnection(tf.GetOutputPort()) app.AddInputData(pd) mapper = vtk.vtkPolyDataMapper2D() mapper.SetInputConnection(app.GetOutputPort()) cs = vtk.vtkCoordinate() cs.SetCoordinateSystem(1) mapper.SetTransformCoordinate(cs) fractor = vtk.vtkActor2D() csys = fractor.GetPositionCoordinate() csys.SetCoordinateSystem(3) fractor.SetPosition(pos) fractor.SetMapper(mapper) fractor.GetProperty().SetColor(vedo.get_color(c)) fractor.GetProperty().SetOpacity(alpha) fractor.GetProperty().SetLineWidth(lw) fractor.GetProperty().SetDisplayLocationToForeground() def sifunc(iren, ev): wsx, wsy = self.window.GetSize() ps = self.camera.GetParallelScale() newtxt = utils.precision(ps / wsy * wsx * length * dd, 3) if units: newtxt += " " + units if rlabel.GetText() != newtxt: rlabel.SetText(newtxt) self.renderer.AddActor(fractor) self.interactor.AddObserver("MouseWheelBackwardEvent", sifunc) self.interactor.AddObserver("MouseWheelForwardEvent", sifunc) self.interactor.AddObserver("InteractionEvent", sifunc) sifunc(0, 0) return fractor def fill_event(self, ename="", pos=()): """ Create an Event object. A 2D screen-position can be provided to be picked. """ if not self.interactor: return Event() if len(pos): x, y = pos self.interactor.SetEventPosition(pos) else: x, y = self.interactor.GetEventPosition() self.renderer = self.interactor.FindPokedRenderer(x, y) if not self.picker: self.picker = vtk.vtkPropPicker() self.picked2d = (x, y) self.picker.PickProp(x, y, self.renderer) xp, yp = self.interactor.GetLastEventPosition() actor = self.picker.GetProp3D() delta3d = np.array([0, 0, 0]) if actor: picked3d = np.array(self.picker.GetPickPosition()) if isinstance(actor, vedo.base.Base3DProp): # needed! if actor.picked3d is not None: delta3d = picked3d - actor.picked3d actor.picked3d = picked3d else: picked3d = None if not actor: # try 2D actor = self.picker.GetActor2D() dx, dy = x - xp, y - yp key = self.interactor.GetKeySym() if key: if "_L" in key or "_R" in key: # skip things like Shift_R key = "" # better than None else: if self.interactor.GetShiftKey(): key = key.upper() if key == "MINUS": # fix: vtk9 is ignoring shift chars.. key = "underscore" elif key == "EQUAL": # fix: vtk9 is ignoring shift chars.. key = "plus" elif key == "SLASH": # fix: vtk9 is ignoring shift chars.. key = "?" if self.interactor.GetControlKey(): key = "Ctrl+" + key if self.interactor.GetAltKey(): key = "Alt+" + key event = Event() event.name = ename event.title = self.title event.id = -1 # will be set by the timer wrapper function event.timerid = -1 # will be set by the timer wrapper function event.priority = -1 # will be set by the timer wrapper function event.time = time.time() event.at = self.renderers.index(self.renderer) event.actor = actor event.picked3d = picked3d event.keyPressed = key # obsolete, will disappear. Use "keypress" event.keypress = key event.picked2d = (x, y) event.delta2d = (dx, dy) event.angle2d = np.arctan2(dy, dx) event.speed2d = np.sqrt(dx * dx + dy * dy) event.delta3d = delta3d event.speed3d = np.sqrt(np.dot(delta3d, delta3d)) event.isPoints = isinstance(actor, vedo.Points) event.isMesh = isinstance(actor, vedo.Mesh) event.isAssembly = isinstance(actor, vedo.Assembly) event.isVolume = isinstance(actor, vedo.Volume) event.isPicture = isinstance(actor, vedo.Picture) event.isActor2D = isinstance(actor, vtk.vtkActor2D) return event @deprecated(reason=vedo.colors.red + "Please use add_callback()" + vedo.colors.reset) def addCallback(self, *a, **b): """Deprecated, use `add_callback()`""" return self.add_callback(*a, **b) def add_callback(self, event_name, func, priority=0.0): """ Add a function to be executed while show() is active. Information about the event can be acquired with method getEvent(). Return a unique id for the callback. The callback function (see example below) exposes a dictionary with the following information: - `name`: event name, - `id`: event unique identifier, - `priority`: event priority (float), - `interactor`: the interactor object, - `at`: renderer nr. where the event occurred - `actor`: object picked by the mouse - `picked3d`: point picked in world coordinates - `keypress`: key pressed as string - `picked2d`: screen coords of the mouse pointer - `delta2d`: shift wrt previous position (to calculate speed, direction) - `delta3d`: ...same but in 3D world coords - `angle2d`: angle of mouse movement on screen - `speed2d`: speed of mouse movement on screen - `speed3d`: speed of picked point in world coordinates - `isPoints`: True if of class - `isMesh`: True if of class - `isAssembly`: True if of class - `isVolume`: True if of class Volume - `isPicture`: True if of class Frequently used events are: - `KeyPress`, `KeyRelease`: listen to keyboard events - `LeftButtonPress`, `LeftButtonRelease`: listen to mouse clicks - `MiddleButtonPress`, `MiddleButtonRelease` - `RightButtonPress`, `RightButtonRelease` - `MouseMove`: listen to mouse pointer changing position - `MouseWheelForward`, `MouseWheelBackward` - `Enter`, `Leave`: listen to mouse entering or leaving the window - `Pick`, `StartPick`, `EndPick`: listen to object picking - `ResetCamera`, `ResetCameraClippingRange` - `Error`, `Warning` - `Char` - `Timer` Check the complete list of events [here](https://vtk.org/doc/nightly/html/classvtkCommand.html). Example: ```python from vedo import * def func(evt): # this function is called every time the mouse moves # (evt is a dotted dictionary) if not evt.actor: return # no hit, return print("point coords =", evt.picked3d) # print("full event dump:", evt) elli = Ellipsoid() plt = Plotter(axes=1) plt.add_callback('mouse hovering', func) plt.show(elli).close() ``` Examples: - [spline_draw.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/spline_draw.py) - [colorlines.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/colorlines.py) ![](https://vedo.embl.es/images/advanced/spline_draw.png) - ..and many others! """ from vtkmodules.util.misc import calldata_type if not self.interactor: return None # as vtk names are ugly and difficult to remember: ln = event_name.lower() if "click" in ln or "button" in ln: event_name = "LeftButtonPress" if "right" in ln: event_name = "RightButtonPress" elif "mid" in ln: event_name = "MiddleButtonPress" if "release" in ln: # event_name = event_name.replace("Press","Release") # vtk bug event_name = "EndInteraction" else: if "key" in ln: if "release" in ln: event_name = "KeyRelease" else: event_name = "KeyPress" if ("mouse" in ln and "mov" in ln) or "over" in ln: event_name = "MouseMove" if "timer" in ln: event_name = "Timer" if not event_name.endswith("Event"): event_name += "Event" @calldata_type(vtk.VTK_INT) def _func_wrap(iren, ename, timerid=None): event = self.fill_event(ename=ename) event.timerid = timerid event.id = cid event.priority = priority self.last_event = event func(event) return ## _func_wrap # Not compatible with ProcessEvents() if "MouseMove" in event_name or "Timer" in event_name: settings.allow_interaction = False cid = self.interactor.AddObserver(event_name, _func_wrap, priority) vedo.logger.debug(f"registering event: {event_name} with id={cid}") return cid def remove_callback(self, cid): """ Remove a callback function by its id or a whole category of callbacks by their name. Arguments: cid : (int, str) Unique id of the callback. If an event name is passed all callbacks of that type are removed. """ if self.interactor: if isinstance(cid, str): # as vtk names are ugly and difficult to remember: ln = cid.lower() if "click" in ln or "button" in ln: cid = "LeftButtonPress" if "right" in ln: cid = "RightButtonPress" elif "mid" in ln: cid = "MiddleButtonPress" if "release" in ln: cid.replace("Press", "Release") else: if "key" in ln: if "release" in ln: cid = "KeyRelease" else: cid = "KeyPress" if ("mouse" in ln and "mov" in ln) or "over" in ln: cid = "MouseMove" if "timer" in ln: cid = "Timer" if not cid.endswith("Event"): cid += "Event" self.interactor.RemoveObservers(cid) else: self.interactor.RemoveObserver(cid) return self def timer_callback(self, action, timer_id=None, dt=1, one_shot=False): """ Start or stop an existing timer. Arguments: action : (str) Either "create"/"start" or "destroy"/"stop" timer_id : (int) When stopping the timer, the ID of the timer as returned when created dt : (int) time in milliseconds between each repeated call one_shot : (bool) create a one shot timer of prescribed duration instead of a repeating one Examples: - [timer_callback1.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/timer_callback1.py) - [timer_callback2.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/timer_callback2.py) ![](https://vedo.embl.es/images/advanced/timer_callback1.jpg) """ if action in ("create", "start"): if timer_id is not None: vedo.logger.warning("you set a timer_id but it will be ignored.") if one_shot: timer_id = self.interactor.CreateOneShotTimer(dt) else: timer_id = self.interactor.CreateRepeatingTimer(dt) return timer_id elif action in ("destroy", "stop"): if timer_id is not None: self.interactor.DestroyTimer(timer_id) else: vedo.logger.warning("please set a timer_id. Cannot stop timer.") else: e = f"in timer_callback(). Cannot understand action: {action}\n" e += " allowed actions are: ['start', 'stop']. Skipped." vedo.logger.error(e) return timer_id def compute_world_coordinate( self, pos2d, at=None, objs=(), bounds=(), offset=None, pixeltol=None, worldtol=None ): """ Transform a 2D point on the screen into a 3D point inside the rendering scene. If a set of meshes is passed then points are placed onto these. Arguments: pos2d : (list) 2D screen coordinates point. at : (int) renderer number. objs : (list) list of Mesh objects to project the point onto. bounds : (list) specify a bounding box as [xmin,xmax, ymin,ymax, zmin,zmax]. offset : (float) specify an offset value. pixeltol : (int) screen tolerance in pixels. worldtol : (float) world coordinates tolerance. Returns: numpy array, the point in 3D world coordinates. Examples: - [cut_freehand.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/cut_freehand.py) - [mousehover3.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mousehover3.py) ![](https://vedo.embl.es/images/basic/mousehover3.jpg) """ if at is not None: renderer = self.renderers[at] else: renderer = self.renderer if not objs: pp = vtk.vtkFocalPlanePointPlacer() else: pp = vtk.vtkPolygonalSurfacePointPlacer() for ob in objs: pp.AddProp(ob) if len(bounds) == 6: pp.SetPointBounds(bounds) if pixeltol: pp.SetPixelTolerance(pixeltol) if worldtol: pp.SetWorldTolerance(worldtol) if offset: pp.SetOffset(offset) worldPos = [0, 0, 0] worldOrient = [0, 0, 0, 0, 0, 0, 0, 0, 0] pp.ComputeWorldPosition(renderer, pos2d, worldPos, worldOrient) # validw = pp.ValidateWorldPosition(worldPos, worldOrient) # validd = pp.ValidateDisplayPosition(renderer, pos2d) return np.array(worldPos) def compute_screen_coordinates(self, obj, full_window=False): """ Given a 3D points in the current renderer (or full window), find the screen pixel coordinates. Example: ```python from vedo import * elli = Ellipsoid().rotate_y(30) plt = Plotter() plt.show(elli) xyscreen = plt.compute_screen_positions(elli) print('xyscreen coords:', xyscreen) # simulate an event happening at one point event = plt.fill_event(pos=xyscreen[123]) print(event) ``` """ if isinstance(obj, vedo.base.Base3DProp): pts = obj.points() elif utils.is_sequence(obj): pts = obj p2d = [] cs = vtk.vtkCoordinate() cs.SetCoordinateSystemToWorld() cs.SetViewport(self.renderer) for p in pts: cs.SetValue(p) if full_window: p2d.append(cs.GetComputedDisplayValue(self.renderer)) else: p2d.append(cs.GetComputedViewportValue(self.renderer)) return np.array(p2d, dtype=int) def _scan_input(self, wannabeacts): # scan the input of show if not utils.is_sequence(wannabeacts): wannabeacts = [wannabeacts] scannedacts = [] for a in wannabeacts: # scan content of list if a is None: pass elif isinstance(a, vtk.vtkActor): scannedacts.append(a) if isinstance(a, vedo.base.BaseActor): if a.shadows: # a.update_shadows() scannedacts.extend(a.shadows) if a.trail and a.trail not in self.actors: # a.update_trail() scannedacts.append(a.trail) # trails may also have shadows: if a.trail.shadows: # a.trail.update_shadows() scannedacts.extend(a.trail.shadows) if a._caption and a._caption not in self.actors: scannedacts.append(a._caption) elif isinstance(a, vtk.vtkActor2D): scannedacts.append(a) elif isinstance(a, vtk.vtkAssembly): scannedacts.append(a) if a.trail and a.trail not in self.actors: scannedacts.append(a.trail) elif isinstance(a, (vedo.Volume, vedo.VolumeSlice)): scannedacts.append(a) elif isinstance(a, vtk.vtkImageData): scannedacts.append(vedo.Volume(a)) elif isinstance(a, vedo.TetMesh): # check ugrid is all made of tets ugrid = a.inputdata() uarr = ugrid.GetCellTypesArray() celltypes = np.unique(utils.vtk2numpy(uarr)) ncelltypes = len(celltypes) if ncelltypes > 1 or (ncelltypes == 1 and celltypes[0] != 10): scannedacts.append(a.tomesh()) else: if not ugrid.GetPointData().GetScalars(): if not ugrid.GetCellData().GetScalars(): # add dummy array for vtkProjectedTetrahedraMapper to work: a.celldata["DummyOneArray"] = np.ones(a.ncells) scannedacts.append(a) elif isinstance(a, vedo.UGrid): scannedacts.append(a.tomesh()) elif isinstance(a, vtk.vtkVolume): # order matters! dont move above TetMesh vvol = vedo.Volume(a.GetMapper().GetInput()) vprop = vtk.vtkVolumeProperty() vprop.DeepCopy(a.GetProperty()) vvol.SetProperty(vprop) scannedacts.append(vvol) elif isinstance(a, str): # assume a 2D comment was given changed = False # check if one already exists so to just update text if self.renderer: # might be jupyter acs = self.renderer.GetActors2D() acs.InitTraversal() for i in range(acs.GetNumberOfItems()): act = acs.GetNextItem() if isinstance(act, vedo.shapes.Text2D): aposx, aposy = act.GetPosition() if aposx < 0.01 and aposy > 0.99: # "top-left" act.text(a) # update content! no appending nada changed = True break if not changed: out = vedo.shapes.Text2D(a) # append a new one scannedacts.append(out) elif isinstance(a, vtk.vtkImageActor): scannedacts.append(a) elif isinstance(a, vtk.vtkBillboardTextActor3D): scannedacts.append(a) elif isinstance(a, vtk.vtkLight): self.renderer.AddLight(a) elif isinstance(a, vtk.vtkMultiBlockDataSet): for i in range(a.GetNumberOfBlocks()): b = a.GetBlock(i) if isinstance(b, vtk.vtkPolyData): scannedacts.append(vedo.Mesh(b)) elif isinstance(b, vtk.vtkImageData): scannedacts.append(vedo.Volume(b)) elif "PolyData" in str(type(a)): # assume pyvista or vtkPolydata scannedacts.append(vedo.Mesh(a)) elif "dolfin" in str(type(a)): # assume a dolfin.Mesh object import vedo.dolfin as dlf scannedacts.append(dlf.MeshActor(a)) elif "trimesh" in str(type(a)): scannedacts.append(utils.trimesh2vedo(a)) elif "meshlab" in str(type(a)): if "MeshSet" in str(type(a)): for i in range(a.number_meshes()): if a.mesh_id_exists(i): scannedacts.append(vedo.Mesh(utils.meshlab2vedo(a.mesh(i)))) else: scannedacts.append(vedo.Mesh(utils.meshlab2vedo(a))) elif isinstance(a, (vtk.vtkProp, vtk.vtkInteractorObserver)): scannedacts.append(a) else: vedo.logger.error(f"cannot understand input in show(): {type(a)}") return scannedacts def show( self, *actors, at=None, axes=None, resetcam=None, zoom=False, interactive=None, viewup="", azimuth=0.0, elevation=0.0, roll=0.0, camera=None, mode=0, rate=None, bg=None, bg2=None, size=None, title=None, ): """ Render a list of objects. Arguments: at : (int) number of the renderer to plot to, in case of more than one exists axes : (int) axis type-1 can be fully customized by passing a dictionary. Check `addons.Axes()` for the full list of options. set the type of axes to be shown: - 0, no axes - 1, draw three gray grid walls - 2, show cartesian axes from (0,0,0) - 3, show positive range of cartesian axes from (0,0,0) - 4, show a triad at bottom left - 5, show a cube at bottom left - 6, mark the corners of the bounding box - 7, draw a 3D ruler at each side of the cartesian axes - 8, show the `vtkCubeAxesActor` object - 9, show the bounding box outLine - 10, show three circles representing the maximum bounding box - 11, show a large grid on the x-y plane - 12, show polar axes - 13, draw a simple ruler at the bottom of the window azimuth/elevation/roll : (float) move camera accordingly the specified value viewup: str, list either `['x', 'y', 'z']` or a vector to set vertical direction resetcam : (bool) re-adjust camera position to fit objects camera : (dict, vtkCamera) camera parameters can further be specified with a dictionary assigned to the ``camera`` keyword (E.g. `show(camera={'pos':(1,2,3), 'thickness':1000,})`): - pos, `(list)`, the position of the camera in world coordinates - focal_point `(list)`, the focal point of the camera in world coordinates - viewup `(list)`, the view up direction for the camera - distance `(float)`, set the focal point to the specified distance from the camera position. - clipping_range `(float)`, distance of the near and far clipping planes along the direction of projection. - parallel_scale `(float)`, scaling used for a parallel projection, i.e. the height of the viewport in world-coordinate distances. The default is 1. Note that the "scale" parameter works as an "inverse scale", larger numbers produce smaller images. This method has no effect in perspective projection mode. - thickness `(float)`, set the distance between clipping planes. This method adjusts the far clipping plane to be set a distance 'thickness' beyond the near clipping plane. - view_angle `(float)`, the camera view angle, which is the angular height of the camera view measured in degrees. The default angle is 30 degrees. This method has no effect in parallel projection mode. The formula for setting the angle up for perfect perspective viewing is: angle = 2*atan((h/2)/d) where h is the height of the RenderWindow (measured by holding a ruler up to your screen) and d is the distance from your eyes to the screen. interactive : (bool) pause and interact with window (True) or continue execution (False) rate : (float) maximum rate of `show()` in Hertz mode : (int, str) set the type of interaction: - 0 = TrackballCamera [default] - 1 = TrackballActor - 2 = JoystickCamera - 3 = JoystickActor - 4 = Flight - 5 = RubberBand2D - 6 = RubberBand3D - 7 = RubberBandZoom - 8 = Terrain - 9 = Unicam - 10 = Image - Check out `vedo.interaction_modes` for more options. """ if self.wx_widget: return self if self.renderers: # in case of notebooks if at is None: at = self.renderers.index(self.renderer) else: if at >= len(self.renderers): t = f"trying to show(at={at}) but only {len(self.renderers)} renderers exist" vedo.logger.error(t) return self self.renderer = self.renderers[at] if title is not None: self.title = title if size is not None: self.size = size if self.size[0] == "f": # full screen self.size = "fullscreen" self.window.SetFullScreen(True) self.window.BordersOn() else: self.window.SetSize(int(self.size[0]), int(self.size[1])) if settings.default_backend == "vtk": if str(bg).endswith(".hdr"): self._add_skybox(bg) else: if bg is not None: self.backgrcol = vedo.get_color(bg) self.renderer.SetBackground(self.backgrcol) if bg2 is not None: self.renderer.GradientBackgroundOn() self.renderer.SetBackground2(vedo.get_color(bg2)) if axes is not None: if isinstance(axes, vedo.Assembly): # user passing show(..., axes=myaxes) actors = list(actors) actors.append(axes) # move it into the list of normal things to show axes = 0 self.axes = axes if self.offscreen: interactive = False self._interactive = False # camera stuff if resetcam is not None: self.resetcam = resetcam if camera is not None: self.resetcam = False if isinstance(camera, vtk.vtkCamera): self.camera = camera else: self.camera = utils.camera_from_dict(camera) if self.renderer: self.renderer.SetActiveCamera(self.camera) if self.renderer: self.camera = self.renderer.GetActiveCamera() self.add(actors) # Backend ############################################################### if settings.default_backend != "vtk": if settings.default_backend in ["k3d"]: return backends.get_notebook_backend(self.actors) ######################################################################### for ia in utils.flatten(actors): if isinstance(ia, vedo.base.Base3DProp): if ia._isfollower: # set by mesh.follow_camera() ia.SetCamera(self.camera) try: # fix gray color labels and title to white or black ltc = np.array(ia.scalarbar.GetLabelTextProperty().GetColor()) if np.linalg.norm(ltc - (0.5, 0.5, 0.5)) / 3 < 0.05: c = (0.9, 0.9, 0.9) if np.sum(self.renderer.GetBackground()) > 1.5: c = (0.1, 0.1, 0.1) ia.scalarbar.GetLabelTextProperty().SetColor(c) ia.scalarbar.GetTitleTextProperty().SetColor(c) except AttributeError: pass if self.sharecam: for r in self.renderers: r.SetActiveCamera(self.camera) if self.qt_widget is not None: self.qt_widget.GetRenderWindow().AddRenderer(self.renderer) if self.axes is not None: if viewup != "2d" or self.axes in [1, 8] or isinstance(self.axes, dict): bns = self.renderer.ComputeVisiblePropBounds() addons.add_global_axes(self.axes, bounds=bns) ######################################################################### if settings.default_backend in ["ipyvtk", "trame"]: return backends.get_notebook_backend() ######################################################################### if self.resetcam: self.renderer.ResetCamera() if len(self.renderers) > 1: self.add_renderer_frame() if settings.default_backend == "2d" and not zoom: zoom = "tightest" if zoom: if zoom == "tight": self.reset_camera(tight=0.04) elif zoom == "tightest": self.reset_camera(tight=0.0001) else: self.camera.Zoom(zoom) if elevation: self.camera.Elevation(elevation) if azimuth: self.camera.Azimuth(azimuth) if roll: self.camera.Roll(roll) if len(viewup) > 0: b = self.renderer.ComputeVisiblePropBounds() cm = np.array([(b[1] + b[0]) / 2, (b[3] + b[2]) / 2, (b[5] + b[4]) / 2]) sz = np.array([(b[1] - b[0]), (b[3] - b[2]), (b[5] - b[4])]) if viewup == "x": sz = np.linalg.norm(sz) self.camera.SetViewUp([1, 0, 0]) self.camera.SetPosition(cm + sz) elif viewup == "y": sz = np.linalg.norm(sz) self.camera.SetViewUp([0, 1, 0]) self.camera.SetPosition(cm + sz) elif viewup == "z": sz = np.array([(b[1] - b[0]) * 0.7, -(b[3] - b[2]) * 1.0, (b[5] - b[4]) * 1.2]) self.camera.SetViewUp([0, 0, 1]) self.camera.SetPosition(cm + 2 * sz) elif utils.is_sequence(viewup): sz = np.linalg.norm(sz) self.camera.SetViewUp(viewup) cpos = np.cross([0, 1, 0], viewup) self.camera.SetPosition(cm - 2 * sz * cpos) self.renderer.ResetCameraClippingRange() if self.interactor and not self.interactor.GetInitialized(): self.interactor.Initialize() self.interactor.RemoveObservers("CharEvent") if settings.immediate_rendering: self.window.Render() ##################### <-------------- Render # 2d #################################################################### if settings.default_backend == "2d": return backends.get_notebook_backend() ######################################################################### self.window.SetWindowName(self.title) try: # Needs "pip install pyobjc" on Mac OSX if ( self._cocoa_initialized is False and "Darwin" in vedo.sys_platform and not self.offscreen ): self._cocoa_initialized = True from Cocoa import NSRunningApplication, NSApplicationActivateIgnoringOtherApps pid = os.getpid() x = NSRunningApplication.runningApplicationWithProcessIdentifier_(int(pid)) x.activateWithOptions_(NSApplicationActivateIgnoringOtherApps) except: pass # vedo.logger.debug("On Mac OSX try: pip install pyobjc") if self.interactor: # can be offscreen.. if interactive is not None: self._interactive = interactive self.user_mode(mode) if self._interactive: self.interactor.Start() if rate: if self.clock is None: # set clock and limit rate self._clockt0 = time.time() self.clock = 0.0 else: t = time.time() - self._clockt0 elapsed = t - self.clock mint = 1.0 / rate if elapsed < mint: time.sleep(mint - elapsed) self.clock = time.time() - self._clockt0 return self def add_inset(self, *actors, **options): """Add a draggable inset space into a renderer. Arguments: at : (int) specify the renderer number pos : (list) icon position in the range [1-4] indicating one of the 4 corners, or it can be a tuple (x,y) as a fraction of the renderer size. size : (float) size of the square inset draggable : (bool) if True the subrenderer space can be dragged around c : (color) color of the inset frame when dragged Examples: - [inset.py](https://github.com/marcomusy/vedo/tree/master/examples/other/inset.py) ![](https://user-images.githubusercontent.com/32848391/56758560-3c3f1300-6797-11e9-9b33-49f5a4876039.jpg) """ if not self.interactor: return None pos = options.pop("pos", 0) size = options.pop("size", 0.1) c = options.pop("c", "lb") at = options.pop("at", None) draggable = options.pop("draggable", True) if not self.renderer: vedo.logger.warning("call add_inset() only after first rendering of the scene.") save_int = self._interactive self.show(interactive=0) self._interactive = save_int widget = vtk.vtkOrientationMarkerWidget() r, g, b = vedo.get_color(c) widget.SetOutlineColor(r, g, b) if len(actors) == 1: widget.SetOrientationMarker(actors[0]) else: widget.SetOrientationMarker(vedo.Assembly(actors)) widget.SetInteractor(self.interactor) if utils.is_sequence(pos): widget.SetViewport(pos[0] - size, pos[1] - size, pos[0] + size, pos[1] + size) else: if pos < 2: widget.SetViewport(0, 1 - 2 * size, size * 2, 1) elif pos == 2: widget.SetViewport(1 - 2 * size, 1 - 2 * size, 1, 1) elif pos == 3: widget.SetViewport(0, 0, size * 2, size * 2) elif pos == 4: widget.SetViewport(1 - 2 * size, 0, 1, size * 2) widget.EnabledOn() widget.SetInteractive(draggable) if at is not None and at < len(self.renderers): widget.SetCurrentRenderer(self.renderers[at]) self.widgets.append(widget) return widget def clear(self, at=None, deep=False): """Clear the scene from all meshes and volumes.""" if at is not None: renderer = self.renderers[at] else: renderer = self.renderer if not renderer: return self if deep: renderer.RemoveAllViewProps() else: for a in set(self.get_meshes() + self.get_volumes() + self.actors + self.axes_instances): if isinstance(a, vedo.shapes.Text2D): continue self.remove(a) try: if a.scalarbar: self.remove(a.scalarbar) except AttributeError: pass self.actors = [] return self def break_interaction(self): """Break window interaction and return to the python execution flow""" if self.interactor: self.interactor.ExitCallback() return self def user_mode(self, mode): """ Modify the user interaction mode. Examples: ```python from vedo import * mode = interactor_modes.MousePan() mesh = Mesh(dataurl+"cow.vtk") plt = Plotter().user_mode(mode) plt.show(mesh, axes=1) ``` See also: [interactors](https://vtk.org/doc/nightly/html/classvtkInteractorStyle.html) """ if not self.interactor: return None if isinstance(mode, (str, int)): # Set the style of interaction # see https://vtk.org/doc/nightly/html/classvtkInteractorStyle.html if mode in (0, "TrackballCamera"): if self.qt_widget: self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera()) elif mode in (1, "TrackballActor"): self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleTrackballActor()) elif mode in (2, "JoystickCamera"): self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleJoystickCamera()) elif mode in (3, "JoystickActor"): self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleJoystickActor()) elif mode in (4, "Flight"): self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleFlight()) elif mode in (5, "RubberBand2D"): self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleRubberBand2D()) elif mode in (6, "RubberBand3D"): self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleRubberBand3D()) elif mode in (7, "RubberBandZoom"): self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleRubberBandZoom()) elif mode in (8, "Terrain"): self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleTerrain()) elif mode in (9, "Unicam"): self.interactor.SetInteractorStyle(vtk.vtkInteractorStyleUnicam()) elif mode in (10, "Image", "image", "2d"): astyle = vtk.vtkInteractorStyleImage() astyle.SetInteractionModeToImage3D() self.interactor.SetInteractorStyle(astyle) else: vedo.logger.warning(f"Unknown interaction mode: {mode}") elif isinstance(mode, vtk.vtkInteractorStyleUser): # set a custom interactor style mode.interactor = self.interactor mode.renderer = self.renderer mode.SetInteractor(self.interactor) mode.SetDefaultRenderer(self.renderer) self.interactor.SetInteractorStyle(mode) return self def close_window(self): """Close the current or the input rendering window. Examples: - [closewindow.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/closewindow.py) """ vedo.last_figure = None self.sliders = [] self.buttons = [] self.widgets = [] self.hover_legends = [] self.background_renderer = None self._extralight = None self.hint_widget = None self.cutter_widget = None for r in self.renderers: r.RemoveAllObservers() if hasattr(self, "window") and self.window: if hasattr(self, "interactor") and self.interactor: self.interactor.ExitCallback() try: self.interactor.SetDone(True) except AttributeError: pass self.interactor.TerminateApp() # self.interactor = None self.window.Finalize() # this must be done here if hasattr(self, "interactor") and self.interactor: if "Darwin" in vedo.sys_platform: try: self.interactor.ProcessEvents() except: pass self.interactor = None self.window = None self.renderer = None # current renderer self.renderers = [] self.camera = None self.skybox = None return self def close(self): """Close the Plotter instance and release resources.""" self.close_window() self.actors = [] if vedo.plotter_instance == self: vedo.plotter_instance = None def screenshot(self, filename="screenshot.png", scale=1, asarray=False): """ Take a screenshot of the Plotter window. Arguments: scale : (int) set image magnification as an integer multiplicating factor asarray : (bool) return a numpy array of the image instead of writing a file """ return vedo.file_io.screenshot(filename, scale, asarray) def topicture(self, scale=1): """ Generate a Picture object from the current rendering window. Arguments: scale : (int) set image magnification as an integer multiplicating factor """ if settings.screeshot_large_image: w2if = vtk.vtkRenderLargeImage() w2if.SetInput(self.renderer) w2if.SetMagnification(scale) else: w2if = vtk.vtkWindowToImageFilter() w2if.SetInput(self.window) if hasattr(w2if, "SetScale"): w2if.SetScale(scale, scale) if settings.screenshot_transparent_background: w2if.SetInputBufferTypeToRGBA() w2if.ReadFrontBufferOff() # read from the back buffer w2if.Update() return vedo.picture.Picture(w2if.GetOutput()) def export(self, filename="scene.npz", binary=False): """ Export scene to file to HTML, X3D or Numpy file. Examples: - [export_x3d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/export_x3d.py) - [export_numpy.py](https://github.com/marcomusy/vedo/tree/master/examples/other/export_numpy.py) """ vedo.file_io.export_window(filename, binary=binary) return self def color_picker(self, xy, verbose=False): """Pick color of specific (x,y) pixel on the screen.""" w2if = vtk.vtkWindowToImageFilter() w2if.SetInput(self.window) w2if.ReadFrontBufferOff() w2if.Update() nx, ny = self.window.GetSize() varr = w2if.GetOutput().GetPointData().GetScalars() arr = utils.vtk2numpy(varr).reshape(ny, nx, 3) x, y = int(xy[0]), int(xy[1]) if y < ny and x < nx: rgb = arr[y, x] if verbose: vedo.printc(":rainbow:Pixel", [x, y], "has RGB[", end="") vedo.printc("█", c=[rgb[0], 0, 0], end="") vedo.printc("█", c=[0, rgb[1], 0], end="") vedo.printc("█", c=[0, 0, rgb[2]], end="") vedo.printc("] = ", end="") cnm = vedo.get_color_name(rgb) if np.sum(rgb) < 150: vedo.printc( rgb.tolist(), vedo.colors.rgb2hex(np.array(rgb) / 255), c="w", bc=rgb, invert=1, end="", ) vedo.printc(" -> " + cnm, invert=1, c="w") else: vedo.printc( rgb.tolist(), vedo.colors.rgb2hex(np.array(rgb) / 255), c=rgb, end="" ) vedo.printc(" -> " + cnm, c=cnm) return rgb return None ####################################################################### def _mouseleftclick(self, iren, event): x, y = iren.GetEventPosition() renderer = iren.FindPokedRenderer(x, y) picker = vtk.vtkPropPicker() picker.PickProp(x, y, renderer) self.renderer = renderer clicked_actor = picker.GetActor() # print('_mouseleftclick mouse at', x, y) # print("picked Volume:", [picker.GetVolume()]) # print("picked Actor2D:", [picker.GetActor2D()]) # print("picked Assembly:", [picker.GetAssembly()]) # print("picked Prop3D:", [picker.GetProp3D()]) # check if any button objects are clicked clicked_actor2D = picker.GetActor2D() if clicked_actor2D: for bt in self.buttons: if clicked_actor2D == bt.actor: bt.function() break if not clicked_actor: clicked_actor = picker.GetAssembly() if not clicked_actor: clicked_actor = picker.GetProp3D() if not hasattr(clicked_actor, "GetPickable") or not clicked_actor.GetPickable(): return self.picked3d = picker.GetPickPosition() self.picked2d = np.array([x, y]) if not clicked_actor: return self.justremoved = None self.clicked_actor = clicked_actor if hasattr(clicked_actor, "picked3d"): # might be not a vedo obj clicked_actor.picked3d = picker.GetPickPosition() x, y = iren.GetEventPosition() # ----------- if "Histogram1D" in picker.GetAssembly().__class__.__name__: histo = picker.GetAssembly() if histo.verbose: x = self.picked3d[0] idx = np.digitize(x, histo.edges) - 1 f = histo.frequencies[idx] cn = histo.centers[idx] vedo.colors.printc(f"{histo.name}, bin={idx}, center={cn}, value={f}") ####################################################################### def _keypress(self, iren, event): # NB: qt creates and passes a vtkGenericRenderWindowInteractor key = iren.GetKeySym() if "_L" in key or "_R" in key: return if iren.GetShiftKey(): key = key.upper() if iren.GetControlKey(): key = "Ctrl+" + key if iren.GetAltKey(): key = "Alt+" + key # utils.vedo.printc('Pressed key:', key, c='y', box='-') # print(key, iren.GetShiftKey(), iren.GetAltKey(), iren.GetControlKey(), # iren.GetKeyCode(), iren.GetRepeatCount()) # iren.ExitCallback() # return x, y = iren.GetEventPosition() renderer = iren.FindPokedRenderer(x, y) if key in ["q", "Ctrl+q", "Ctrl+w", "Escape"]: iren.ExitCallback() return elif key == "F1": vedo.logger.info("Execution aborted. Exiting python kernel now.") iren.ExitCallback() sys.exit(0) elif key == "Down": if self.clicked_actor in self.get_meshes(): self.clicked_actor.GetProperty().SetOpacity(0.02) bfp = self.clicked_actor.GetBackfaceProperty() if bfp and hasattr(self.clicked_actor, "_bfprop"): self.clicked_actor._bfprop = bfp # save it self.clicked_actor.SetBackfaceProperty(None) else: for a in self.get_meshes(): a.GetProperty().SetOpacity(0.02) bfp = a.GetBackfaceProperty() if bfp and hasattr(a, "_bfprop"): a._bfprop = bfp a.SetBackfaceProperty(None) elif key == "Left": if self.clicked_actor in self.get_meshes(): ap = self.clicked_actor.GetProperty() aal = max([ap.GetOpacity() * 0.75, 0.01]) ap.SetOpacity(aal) bfp = self.clicked_actor.GetBackfaceProperty() if bfp and hasattr(self.clicked_actor, "_bfprop"): self.clicked_actor._bfprop = bfp self.clicked_actor.SetBackfaceProperty(None) else: for a in self.get_meshes(): ap = a.GetProperty() aal = max([ap.GetOpacity() * 0.75, 0.01]) ap.SetOpacity(aal) bfp = a.GetBackfaceProperty() if bfp and hasattr(a, "_bfprop"): a._bfprop = bfp a.SetBackfaceProperty(None) elif key == "Right": if self.clicked_actor in self.get_meshes(): ap = self.clicked_actor.GetProperty() aal = min([ap.GetOpacity() * 1.25, 1.0]) ap.SetOpacity(aal) if ( aal == 1 and hasattr(self.clicked_actor, "_bfprop") and self.clicked_actor._bfprop ): # put back self.clicked_actor.SetBackfaceProperty(self.clicked_actor._bfprop) else: for a in self.get_meshes(): ap = a.GetProperty() aal = min([ap.GetOpacity() * 1.25, 1.0]) ap.SetOpacity(aal) if aal == 1 and hasattr(a, "_bfprop") and a._bfprop: a.SetBackfaceProperty(a._bfprop) elif key in ("slash", "Up"): if self.clicked_actor in self.get_meshes(): self.clicked_actor.GetProperty().SetOpacity(1) if hasattr(self.clicked_actor, "_bfprop") and self.clicked_actor._bfprop: self.clicked_actor.SetBackfaceProperty(self.clicked_actor._bfprop) else: for a in self.get_meshes(): a.GetProperty().SetOpacity(1) if hasattr(a, "_bfprop") and a._bfprop: a.SetBackfaceProperty(a._bfprop) elif key == "P": if self.clicked_actor in self.get_meshes(): acts = [self.clicked_actor] else: acts = self.get_meshes() for ia in acts: try: ps = ia.GetProperty().GetPointSize() if ps > 1: ia.GetProperty().SetPointSize(ps - 1) ia.GetProperty().SetRepresentationToPoints() except AttributeError: pass elif key == "U": pval = renderer.GetActiveCamera().GetParallelProjection() renderer.GetActiveCamera().SetParallelProjection(not pval) if pval: renderer.ResetCamera() elif key == "p": if self.clicked_actor in self.get_meshes(): acts = [self.clicked_actor] else: acts = self.get_meshes() for ia in acts: try: ps = ia.GetProperty().GetPointSize() ia.GetProperty().SetPointSize(ps + 2) ia.GetProperty().SetRepresentationToPoints() except AttributeError: pass elif key == "w": if self.clicked_actor and self.clicked_actor in self.get_meshes(): self.clicked_actor.GetProperty().SetRepresentationToWireframe() else: for a in self.get_meshes(): if a.GetProperty().GetRepresentation() == 1: # toggle a.GetProperty().SetRepresentationToSurface() else: a.GetProperty().SetRepresentationToWireframe() elif key == "r": renderer.ResetCamera() elif key == "h": msg = ( " ============================================================\n" " | Press: i print info about selected object |\n" " | I print the RGB color under the mouse |\n" " | y show the pipeline for this object as a graph |\n" " | <--> use arrows to reduce/increase opacity |\n" " | w/s toggle wireframe/surface style |\n" " | p/P change point size of vertices |\n" " | l toggle edges visibility |\n" " | x toggle mesh visibility |\n" " | X invoke a cutter widget tool |\n" " | 1-3 change mesh color |\n" " | 4 use data array as colors, if present |\n" " | 5-6 change background color(s) |\n" " | 09+- (on keypad) or +/- to cycle axes style |\n" " | k cycle available lighting styles |\n" " | K cycle available shading styles |\n" " | A toggle anti-aliasing |\n" " | D toggle depth-peeling (for transparencies) |\n" " | o/O add/remove light to scene and rotate it |\n" " | n show surface mesh normals |\n" " | a toggle interaction to Actor Mode |\n" " | j toggle interaction to Joystick Mode |\n" " | U toggle perspective/parallel projection |\n" " | r reset camera position |\n" " | R reset camera orientation to orthogonal view |\n" " | . fly camera towards last clicked point |\n" " | C print current camera settings |\n" " | S save a screenshot |\n" " | E/F export 3D scene to numpy file or X3D |\n" " | q return control to python script |\n" " | Esc abort execution and exit python kernel |\n" " |------------------------------------------------------------|\n" " | Mouse: Left-click rotate scene / pick actors |\n" " | Middle-click pan scene |\n" " | Right-click zoom scene in or out |\n" " | Cntrl-click rotate scene |\n" " |------------------------------------------------------------|\n" " | Check out the documentation at: https://vedo.embl.es |\n" " ============================================================" ) vedo.printc(msg, dim=True) msg = " vedo " + vedo.__version__ + " " vedo.printc(msg, invert=True, dim=True, end="") vtkVers = vtk.vtkVersion().GetVTKVersion() msg = "| vtk " + str(vtkVers) msg += " | numpy " + str(np.__version__) msg += " | python " + str(sys.version_info[0]) + "." + str(sys.version_info[1]) vedo.printc(msg, invert=False, dim=True) return elif key == "a": iren.ExitCallback() cur = iren.GetInteractorStyle() if isinstance(cur, vtk.vtkInteractorStyleTrackballCamera): msg = "\nInteractor style changed to TrackballActor\n" msg += " you can now move and rotate individual meshes:\n" msg += " press X twice to save the repositioned mesh\n" msg += " press 'a' to go back to normal style" vedo.printc(msg) iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballActor()) else: iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera()) iren.Start() return elif key == "A": # toggle antialiasing msam = self.window.GetMultiSamples() if not msam: self.window.SetMultiSamples(8) else: self.window.SetMultiSamples(0) msam = self.window.GetMultiSamples() if msam: vedo.printc(f"Antialiasing is now set to {msam} samples", c=bool(msam)) else: vedo.printc("Antialiasing is now disabled", c=bool(msam)) elif key == "D": # toggle depthpeeling udp = not renderer.GetUseDepthPeeling() renderer.SetUseDepthPeeling(udp) # self.renderer.SetUseDepthPeelingForVolumes(udp) # print(self.window.GetAlphaBitPlanes()) if udp: self.window.SetAlphaBitPlanes(1) renderer.SetMaximumNumberOfPeels(settings.max_number_of_peels) renderer.SetOcclusionRatio(settings.occlusion_ratio) self.interactor.Render() wasUsed = renderer.GetLastRenderingUsedDepthPeeling() rnr = self.renderers.index(renderer) vedo.printc(f"Depth peeling is now set to {udp} for renderer nr.{rnr}", c=udp) if not wasUsed and udp: vedo.printc("\t...but last rendering did not actually used it!", c=udp, invert=True) return elif key == "j": iren.ExitCallback() cur = iren.GetInteractorStyle() if isinstance(cur, vtk.vtkInteractorStyleJoystickCamera): iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera()) else: vedo.printc("\nInteractor style changed to Joystick,", end="") vedo.printc(" press j to go back to normal.") iren.SetInteractorStyle(vtk.vtkInteractorStyleJoystickCamera()) iren.Start() return elif key == "period": if self.picked3d: self.fly_to(self.picked3d) return elif key == "S": vedo.file_io.screenshot("screenshot.png") vedo.printc(r":camera: Saved rendering window to 'screenshot.png'", c="b") return elif key == "C": # Precision needs to be 7 (or even larger) to guarantee a consistent camera when # the model coordinates are not centered at (0, 0, 0) and the mode is large. # This could happen for plotting geological models with UTM coordinate systems cam = renderer.GetActiveCamera() vedo.printc("\n###################################################", c="y") vedo.printc("## Template python code to position this camera: ##", c="y") vedo.printc("cam = dict(", c="y") vedo.printc(" position=" + utils.precision(cam.GetPosition(), 6) + ",", c="y") vedo.printc(" focal_point=" + utils.precision(cam.GetFocalPoint(), 6) + ",", c="y") vedo.printc(" viewup=" + utils.precision(cam.GetViewUp(), 6) + ",", c="y") if settings.use_parallel_projection: vedo.printc(' parallel_scale='+utils.precision(cam.GetParallelScale(),6)+',', c='y') else: vedo.printc(' distance=' +utils.precision(cam.GetDistance(),6)+',', c='y') vedo.printc(' clipping_range='+utils.precision(cam.GetClippingRange(),6)+',', c='y') vedo.printc(')', c='y') vedo.printc('show(mymeshes, camera=cam)', c='y') vedo.printc('###################################################', c='y') return elif key == "R": self.reset_viewup() elif key == "s": if self.clicked_actor and self.clicked_actor in self.get_meshes(): self.clicked_actor.GetProperty().SetRepresentationToSurface() else: for a in self.get_meshes(): a.GetProperty().SetRepresentationToSurface() elif key == "1": self._icol += 1 if isinstance(self.clicked_actor, vedo.Points): self.clicked_actor.GetMapper().ScalarVisibilityOff() pal = vedo.colors.palettes[settings.palette % len(vedo.colors.palettes)] self.clicked_actor.GetProperty().SetColor(pal[(self._icol) % 10]) elif key == "2": self._icol += 1 settings.palette += 1 settings.palette = settings.palette % len(vedo.colors.palettes) if isinstance(self.clicked_actor, vedo.Points): self.clicked_actor.GetMapper().ScalarVisibilityOff() pal = vedo.colors.palettes[settings.palette % len(vedo.colors.palettes)] self.clicked_actor.GetProperty().SetColor(pal[(self._icol) % 10]) elif key == "3": bsc = ["b5", "cyan5", "g4", "o5", "p5", "r4", "teal4", "yellow4"] self._icol += 1 if isinstance(self.clicked_actor, vedo.Points): self.clicked_actor.GetMapper().ScalarVisibilityOff() self.clicked_actor.GetProperty().SetColor(vedo.get_color(bsc[(self._icol) % len(bsc)])) elif key == "4": if self.clicked_actor: acts = [self.clicked_actor] else: acts = self.get_meshes() for ia in acts: if not hasattr(ia, "_cmap_name"): continue cmap_name = ia._cmap_name if not cmap_name: cmap_name = "rainbow" if isinstance(ia, vedo.pointcloud.Points): arnames = ia.pointdata.keys() if len(arnames) > 0: arnam = arnames[ia._scals_idx] if arnam and ("normals" not in arnam.lower()): # exclude normals ia.cmap(cmap_name, arnam, on="points") vedo.printc("..active point data set to:", arnam, c="g", bold=0) ia._scals_idx += 1 if ia._scals_idx >= len(arnames): ia._scals_idx = 0 else: arnames = ia.celldata.keys() if len(arnames) > 0: arnam = arnames[ia._scals_idx] if arnam and ("normals" not in arnam.lower()): # exclude normals ia.cmap(cmap_name, arnam, on="cells") vedo.printc("..active cell array set to:", arnam, c="g", bold=0) ia._scals_idx += 1 if ia._scals_idx >= len(arnames): ia._scals_idx = 0 elif key == "5": bgc = np.array(renderer.GetBackground()).sum() / 3 if bgc <= 0: bgc = 0.223 elif 0 < bgc < 1: bgc = 1 else: bgc = 0 renderer.SetBackground(bgc, bgc, bgc) elif key == "6": bg2cols = [ "lightyellow", "darkseagreen", "palegreen", "steelblue", "lightblue", "cadetblue", "lavender", "white", "blackboard", "black", ] bg2name = vedo.get_color_name(renderer.GetBackground2()) if bg2name in bg2cols: idx = bg2cols.index(bg2name) else: idx = 4 if idx is not None: bg2name_next = bg2cols[(idx + 1) % (len(bg2cols) - 1)] if not bg2name_next: renderer.GradientBackgroundOff() else: renderer.GradientBackgroundOn() renderer.SetBackground2(vedo.get_color(bg2name_next)) elif key in ["plus", "equal", "KP_Add", "minus", "KP_Subtract"]: # cycle axes style clickedr = self.renderers.index(renderer) if self.axes_instances[clickedr]: if hasattr(self.axes_instances[clickedr], "EnabledOff"): # widget self.axes_instances[clickedr].EnabledOff() else: try: renderer.RemoveActor(self.axes_instances[clickedr]) except: pass self.axes_instances[clickedr] = None if not self.axes: self.axes = 0 if isinstance(self.axes, dict): self.axes = 1 if key in ["minus", "KP_Subtract"]: if not settings.use_parallel_projection and self.axes == 0: self.axes -= 1 # jump ruler doesnt make sense in perspective mode bns = self.renderer.ComputeVisiblePropBounds() addons.add_global_axes(axtype=(self.axes - 1) % 15, c=None, bounds=bns) else: if not settings.use_parallel_projection and self.axes == 12: self.axes += 1 # jump ruler doesnt make sense in perspective mode bns = self.renderer.ComputeVisiblePropBounds() addons.add_global_axes(axtype=(self.axes + 1) % 15, c=None, bounds=bns) self.interactor.Render() elif "KP_" in key or key in [ "Insert", "End", "Down", "Next", "Left", "Begin", "Right", "Home", "Up", "Prior", ]: # change axes style asso = { "KP_Insert": 0, "KP_0": 0, "KP_End": 1, "KP_1": 1, "KP_Down": 2, "KP_2": 2, "KP_Next": 3, "KP_3": 3, "KP_Left": 4, "KP_4": 4, "KP_Begin": 5, "KP_5": 5, "KP_Right": 6, "KP_6": 6, "KP_Home": 7, "KP_7": 7, "KP_Up": 8, "KP_8": 8, "Prior": 9, # on windows OS "Insert": 0, "End": 1, "Down": 2, "Next": 3, "Left": 4, "Begin": 5, "Right": 6, "Home": 7, "Up": 8, "Prior": 9, } clickedr = self.renderers.index(renderer) if key in asso: if self.axes_instances[clickedr]: if hasattr(self.axes_instances[clickedr], "EnabledOff"): # widget self.axes_instances[clickedr].EnabledOff() else: try: renderer.RemoveActor(self.axes_instances[clickedr]) except: pass self.axes_instances[clickedr] = None bounds = renderer.ComputeVisiblePropBounds() addons.add_global_axes(axtype=asso[key], c=None, bounds=bounds) self.interactor.Render() if key == "O": renderer.RemoveLight(self._extralight) self._extralight = None elif key == "o": vbb, sizes, _, _ = addons.compute_visible_bounds() cm = utils.vector((vbb[0] + vbb[1]) / 2, (vbb[2] + vbb[3]) / 2, (vbb[4] + vbb[5]) / 2) if not self._extralight: vup = renderer.GetActiveCamera().GetViewUp() pos = cm + utils.vector(vup) * utils.mag(sizes) self._extralight = addons.Light(pos, focal_point=cm) renderer.AddLight(self._extralight) print("Press again o to rotate light source, or O to remove it.") else: cpos = utils.vector(self._extralight.GetPosition()) x, y, z = self._extralight.GetPosition() - cm r, th, ph = utils.cart2spher(x, y, z) th += 0.2 if th > np.pi: th = np.random.random() * np.pi / 2 ph += 0.3 cpos = utils.spher2cart(r, th, ph) + cm self._extralight.SetPosition(cpos) self.window.Render() elif key == "l": if self.clicked_actor in self.get_meshes(): acts = [self.clicked_actor] else: acts = self.get_meshes() for ia in acts: try: ev = ia.GetProperty().GetEdgeVisibility() ia.GetProperty().SetEdgeVisibility(not ev) ia.GetProperty().SetRepresentationToSurface() ia.GetProperty().SetLineWidth(0.1) except AttributeError: pass elif key == "k": # lightings if self.clicked_actor in self.get_meshes(): acts = [self.clicked_actor] else: acts = self.get_meshes() shds = ("default", "metallic", "plastic", "shiny", "glossy", "off") for ia in acts: try: lnr = (ia._ligthingnr + 1) % 6 ia.lighting(shds[lnr]) ia._ligthingnr = lnr except AttributeError: pass elif key == "K": # shading if self.clicked_actor in self.get_meshes(): acts = [self.clicked_actor] else: acts = self.get_meshes() for ia in acts: if isinstance(ia, vedo.Mesh): ia.compute_normals(cells=False) intrp = ia.GetProperty().GetInterpolation() # print(intrp, ia.GetProperty().GetInterpolationAsString()) if intrp > 0: ia.GetProperty().SetInterpolation(0) # flat else: ia.GetProperty().SetInterpolation(2) # phong elif key == "n": # show normals to an actor if self.clicked_actor in self.get_meshes(): if self.clicked_actor.GetPickable(): self.renderer.AddActor(vedo.shapes.NormalLines(self.clicked_actor)) iren.Render() else: print("Click an actor and press n to add normals.") elif key == "x": if self.justremoved is None: if self.clicked_actor in self.get_meshes() or isinstance( self.clicked_actor, vtk.vtkAssembly ): self.justremoved = self.clicked_actor self.renderer.RemoveActor(self.clicked_actor) else: self.renderer.AddActor(self.justremoved) self.renderer.Render() self.justremoved = None elif key == "X": if self.clicked_actor: if not self.cutter_widget: self.cutter_widget = addons.BoxCutter(self.clicked_actor) self.add(self.cutter_widget) print("Press Shift+X to close the cutter box widget, Ctrl+s to save the cut section.") else: self.remove(self.cutter_widget) self.cutter_widget = None else: for a in self.actors: if isinstance(a, vtk.vtkVolume): addons.add_cutter_tool(a) return vedo.printc("Click object and press X to open the cutter box widget.", c=4) elif key == "E": vedo.printc(r":camera: Exporting 3D window to file", c="blue", end="") vedo.file_io.export_window("scene.npz") vedo.printc(". Try:\n> vedo scene.npz", c="blue") elif key == "F": vedo.file_io.export_window("scene.x3d") vedo.printc(":idea: Try: firefox scene.html", c="blue") elif key == "i": # print info if self.clicked_actor: utils.print_info(self.clicked_actor) else: utils.print_info(self) elif key == "I": # print color under the mouse x, y = iren.GetEventPosition() self.color_picker([x, y], verbose=True) elif key == "y": if self.clicked_actor and self.clicked_actor.pipeline: # self.clicked_actor.pipeline = utils.OperationNode( # "show", parents=[self.clicked_actor], # shape="circle", # ) self.clicked_actor.pipeline.show() if iren: iren.Render() vedo-2023.4.6/vedo/pointcloud.py000066400000000000000000005500251444463326400164150ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- from deprecated import deprecated import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo from vedo import colors from vedo import utils from vedo.base import BaseActor __docformat__ = "google" __doc__ = """ Submodule to work with point clouds
![](https://vedo.embl.es/images/basic/pca.png) """ __all__ = [ "Points", "Point", "merge", "visible_points", "delaunay2d", "voronoi", "fit_line", "fit_circle", "fit_plane", "fit_sphere", "pca_ellipse", "pca_ellipsoid", "pcaEllipsoid", # deprecated ] #################################################### def merge(*meshs, flag=False): """ Build a new Mesh (or Points) formed by the fusion of the inputs. Similar to Assembly, but in this case the input objects become a single entity. To keep track of the original identities of the inputs you can use `flag`. In this case a point array of IDs is added to the output. Examples: - [warp1.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/warp1.py) ![](https://vedo.embl.es/images/advanced/warp1.png) - [value_iteration.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/value_iteration.py) """ acts = [a for a in utils.flatten(meshs) if a] if not acts: return None idarr = [] polyapp = vtk.vtkAppendPolyData() for i, a in enumerate(acts): try: poly = a.polydata() except AttributeError: # so a vtkPolydata can also be passed poly = a polyapp.AddInputData(poly) if flag: idarr += [i] * poly.GetNumberOfPoints() polyapp.Update() mpoly = polyapp.GetOutput() if flag: varr = utils.numpy2vtk(idarr, dtype=np.uint16, name="OriginalMeshID") mpoly.GetPointData().AddArray(varr) if isinstance(acts[0], vedo.Mesh): msh = vedo.Mesh(mpoly) else: msh = Points(mpoly) if isinstance(acts[0], vtk.vtkActor): cprp = vtk.vtkProperty() cprp.DeepCopy(acts[0].GetProperty()) msh.SetProperty(cprp) msh.property = cprp msh.pipeline = utils.OperationNode( "merge", parents=acts, comment=f"#pts {msh.inputdata().GetNumberOfPoints()}", ) return msh #################################################### def visible_points(mesh, area=(), tol=None, invert=False): """ Extract points based on whether they are visible or not. Visibility is determined by accessing the z-buffer of a rendering window. The position of each input point is converted into display coordinates, and then the z-value at that point is obtained. If within the user-specified tolerance, the point is considered visible. Associated data attributes are passed to the output as well. This filter also allows you to specify a rectangular window in display (pixel) coordinates in which the visible points must lie. Arguments: area : (list) specify a rectangular region as (xmin,xmax,ymin,ymax) tol : (float) a tolerance in normalized display coordinate system invert : (bool) select invisible points instead. Example: ```python from vedo import Ellipsoid, show, visible_points s = Ellipsoid().rotate_y(30) #Camera options: pos, focal_point, viewup, distance, camopts = dict(pos=(0,0,25), focal_point=(0,0,0)) show(s, camera=camopts, offscreen=True) m = visible_points(s) #print('visible pts:', m.points()) # numpy array show(m, new=True, axes=1) # optionally draw result on a new window ``` ![](https://vedo.embl.es/images/feats/visible_points.png) """ # specify a rectangular region svp = vtk.vtkSelectVisiblePoints() svp.SetInputData(mesh.polydata()) svp.SetRenderer(vedo.plotter_instance.renderer) if len(area) == 4: svp.SetSelection(area[0], area[1], area[2], area[3]) if tol is not None: svp.SetTolerance(tol) if invert: svp.SelectInvisibleOn() svp.Update() m = Points(svp.GetOutput()).pointSize(5) m.name = "VisiblePoints" return m def delaunay2d(plist, mode="scipy", boundaries=(), tol=None, alpha=0.0, offset=0.0, transform=None): """ Create a mesh from points in the XY plane. If `mode='fit'` then the filter computes a best fitting plane and projects the points onto it. Arguments: tol : (float) specify a tolerance to control discarding of closely spaced points. This tolerance is specified as a fraction of the diagonal length of the bounding box of the points. alpha : (float) for a non-zero alpha value, only edges or triangles contained within a sphere centered at mesh vertices will be output. Otherwise, only triangles will be output. offset : (float) multiplier to control the size of the initial, bounding Delaunay triangulation. transform: vtkTransform a VTK transformation (eg. a thinplate spline) which is applied to points to generate a 2D problem. This maps a 3D dataset into a 2D dataset where triangulation can be done on the XY plane. The points are transformed and triangulated. The topology of triangulated points is used as the output topology. Examples: - [delaunay2d.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/delaunay2d.py) ![](https://vedo.embl.es/images/basic/delaunay2d.png) """ if isinstance(plist, Points): parents = [plist] plist = plist.points() else: parents = [] plist = np.ascontiguousarray(plist) plist = utils.make3d(plist) ############################################# if mode == "scipy": from scipy.spatial import Delaunay as scipy_delaunay tri = scipy_delaunay(plist[:, 0:2]) return vedo.mesh.Mesh([plist, tri.simplices]) ############################################# pd = vtk.vtkPolyData() vpts = vtk.vtkPoints() vpts.SetData(utils.numpy2vtk(plist, dtype=np.float32)) pd.SetPoints(vpts) delny = vtk.vtkDelaunay2D() delny.SetInputData(pd) if tol: delny.SetTolerance(tol) delny.SetAlpha(alpha) delny.SetOffset(offset) if transform: if hasattr(transform, "transform"): transform = transform.transform delny.SetTransform(transform) if mode == "xy" and boundaries: boundary = vtk.vtkPolyData() boundary.SetPoints(vpts) cell_array = vtk.vtkCellArray() for b in boundaries: cpolygon = vtk.vtkPolygon() for idd in b: cpolygon.GetPointIds().InsertNextId(idd) cell_array.InsertNextCell(cpolygon) boundary.SetPolys(cell_array) delny.SetSourceData(boundary) if mode == "fit": delny.SetProjectionPlaneMode(vtk.VTK_BEST_FITTING_PLANE) delny.Update() msh = vedo.mesh.Mesh(delny.GetOutput()).clean().lighting("off") msh.pipeline = utils.OperationNode( "delaunay2d", parents=parents, comment=f"#cells {msh.inputdata().GetNumberOfCells()}" ) return msh def voronoi(pts, padding=0.0, fit=False, method="vtk"): """ Generate the 2D Voronoi convex tiling of the input points (z is ignored). The points are assumed to lie in a plane. The output is a Mesh. Each output cell is a convex polygon. The 2D Voronoi tessellation is a tiling of space, where each Voronoi tile represents the region nearest to one of the input points. Voronoi tessellations are important in computational geometry (and many other fields), and are the dual of Delaunay triangulations. Thus the triangulation is constructed in the x-y plane, and the z coordinate is ignored (although carried through to the output). If you desire to triangulate in a different plane, you can use fit=True. A brief summary is as follows. Each (generating) input point is associated with an initial Voronoi tile, which is simply the bounding box of the point set. A locator is then used to identify nearby points: each neighbor in turn generates a clipping line positioned halfway between the generating point and the neighboring point, and orthogonal to the line connecting them. Clips are readily performed by evaluationg the vertices of the convex Voronoi tile as being on either side (inside,outside) of the clip line. If two intersections of the Voronoi tile are found, the portion of the tile "outside" the clip line is discarded, resulting in a new convex, Voronoi tile. As each clip occurs, the Voronoi "Flower" error metric (the union of error spheres) is compared to the extent of the region containing the neighboring clip points. The clip region (along with the points contained in it) is grown by careful expansion (e.g., outward spiraling iterator over all candidate clip points). When the Voronoi Flower is contained within the clip region, the algorithm terminates and the Voronoi tile is output. Once complete, it is possible to construct the Delaunay triangulation from the Voronoi tessellation. Note that topological and geometric information is used to generate a valid triangulation (e.g., merging points and validating topology). Arguments: pts : (list) list of input points. padding : (float) padding distance. The default is 0. fit : (bool) detect automatically the best fitting plane. The default is False. Examples: - [voronoi1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/voronoi1.py) ![](https://vedo.embl.es/images/basic/voronoi1.png) - [voronoi2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/voronoi2.py) ![](https://vedo.embl.es/images/advanced/voronoi2.png) """ if method == "scipy": from scipy.spatial import Voronoi as scipy_voronoi pts = np.asarray(pts)[:, (0, 1)] vor = scipy_voronoi(pts) regs = [] # filter out invalid indices for r in vor.regions: flag = True for x in r: if x < 0: flag = False break if flag and len(r) > 0: regs.append(r) m = vedo.Mesh([vor.vertices, regs], c="orange5") m.celldata["VoronoiID"] = np.array(list(range(len(regs)))).astype(int) m.locator = None elif method == "vtk": vor = vtk.vtkVoronoi2D() if isinstance(pts, Points): vor.SetInputData(pts.polydata()) else: pts = np.asarray(pts) if pts.shape[1] == 2: pts = np.c_[pts, np.zeros(len(pts))] pd = vtk.vtkPolyData() vpts = vtk.vtkPoints() vpts.SetData(utils.numpy2vtk(pts, dtype=np.float32)) pd.SetPoints(vpts) vor.SetInputData(pd) vor.SetPadding(padding) vor.SetGenerateScalarsToPointIds() if fit: vor.SetProjectionPlaneModeToBestFittingPlane() else: vor.SetProjectionPlaneModeToXYPlane() vor.Update() poly = vor.GetOutput() arr = poly.GetCellData().GetArray(0) if arr: arr.SetName("VoronoiID") m = vedo.Mesh(poly, c="orange5") m.locator = vor.GetLocator() else: vedo.logger.error(f"Unknown method {method} in voronoi()") raise RuntimeError m.lw(2).lighting("off").wireframe() m.name = "Voronoi" return m def _rotate_points(points, n0=None, n1=(0, 0, 1)): # Rotate a set of 3D points from direction n0 to direction n1. # Return the rotated points and the normal to the fitting plane (if n0 is None). # The pointing direction of the normal in this case is arbitrary. points = np.asarray(points) if points.ndim == 1: points = points[np.newaxis, :] if len(points[0]) == 2: return points, (0, 0, 1) if n0 is None: # fit plane datamean = points.mean(axis=0) vv = np.linalg.svd(points - datamean)[2] n0 = np.cross(vv[0], vv[1]) n0 = n0 / np.linalg.norm(n0) n1 = n1 / np.linalg.norm(n1) k = np.cross(n0, n1) l = np.linalg.norm(k) if not l: k = n0 k /= np.linalg.norm(k) ct = np.dot(n0, n1) theta = np.arccos(ct) st = np.sin(theta) v = k * (1 - ct) rpoints = [] for p in points: a = p * ct b = np.cross(k, p) * st c = v * np.dot(k, p) rpoints.append(a + b + c) return np.array(rpoints), n0 def fit_line(points): """ Fits a line through points. Extra info is stored in `Line.slope`, `Line.center`, `Line.variances`. Examples: - [fitline.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/fitline.py) ![](https://vedo.embl.es/images/advanced/fitline.png) """ if isinstance(points, Points): points = points.points() data = np.array(points) datamean = data.mean(axis=0) _, dd, vv = np.linalg.svd(data - datamean) vv = vv[0] / np.linalg.norm(vv[0]) # vv contains the first principal component, i.e. the direction # vector of the best fit line in the least squares sense. xyz_min = points.min(axis=0) xyz_max = points.max(axis=0) a = np.linalg.norm(xyz_min - datamean) b = np.linalg.norm(xyz_max - datamean) p1 = datamean - a * vv p2 = datamean + b * vv line = vedo.shapes.Line(p1, p2, lw=1) line.slope = vv line.center = datamean line.variances = dd return line def fit_circle(points): """ Fits a circle through a set of 3D points, with a very fast non-iterative method. Returns the tuple `(center, radius, normal_to_circle)`. .. warning:: trying to fit s-shaped points will inevitably lead to instabilities and circles of small radius. References: *J.F. Crawford, Nucl. Instr. Meth. 211, 1983, 223-225.* """ data = np.asarray(points) offs = data.mean(axis=0) data, n0 = _rotate_points(data - offs) xi = data[:, 0] yi = data[:, 1] x = sum(xi) xi2 = xi * xi xx = sum(xi2) xxx = sum(xi2 * xi) y = sum(yi) yi2 = yi * yi yy = sum(yi2) yyy = sum(yi2 * yi) xiyi = xi * yi xy = sum(xiyi) xyy = sum(xiyi * yi) xxy = sum(xi * xiyi) N = len(xi) k = (xx + yy) / N a1 = xx - x * x / N b1 = xy - x * y / N c1 = 0.5 * (xxx + xyy - x * k) a2 = xy - x * y / N b2 = yy - y * y / N c2 = 0.5 * (xxy + yyy - y * k) d = a2 * b1 - a1 * b2 if not d: return offs, 0, n0 x0 = (b1 * c2 - b2 * c1) / d y0 = (c1 - a1 * x0) / b1 R = np.sqrt(x0 * x0 + y0 * y0 - 1 / N * (2 * x0 * x + 2 * y0 * y - xx - yy)) c, _ = _rotate_points([x0, y0, 0], (0, 0, 1), n0) return c[0] + offs, R, n0 def fit_plane(points, signed=False): """ Fits a plane to a set of points. Extra info is stored in `Plane.normal`, `Plane.center`, `Plane.variance`. Arguments: signed : (bool) if True flip sign of the normal based on the ordering of the points Examples: - [fitline.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/fitline.py) ![](https://vedo.embl.es/images/advanced/fitline.png) """ if isinstance(points, Points): points = points.points() data = np.asarray(points) datamean = data.mean(axis=0) pts = data - datamean res = np.linalg.svd(pts) dd, vv = res[1], res[2] n = np.cross(vv[0], vv[1]) if signed: v = np.zeros_like(pts) for i in range(len(pts) - 1): vi = np.cross(pts[i], pts[i + 1]) v[i] = vi / np.linalg.norm(vi) ns = np.mean(v, axis=0) # normal to the points plane if np.dot(n, ns) < 0: n = -n xyz_min = data.min(axis=0) xyz_max = data.max(axis=0) s = np.linalg.norm(xyz_max - xyz_min) pla = vedo.shapes.Plane(datamean, n, s=[s, s]) pla.normal = n pla.center = datamean pla.variance = dd[2] pla.name = "FitPlane" pla.top = n return pla def fit_sphere(coords): """ Fits a sphere to a set of points. Extra info is stored in `Sphere.radius`, `Sphere.center`, `Sphere.residue`. Examples: - [fitspheres1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/fitspheres1.py) ![](https://vedo.embl.es/images/advanced/fitspheres1.jpg) """ if isinstance(coords, Points): coords = coords.points() coords = np.array(coords) n = len(coords) A = np.zeros((n, 4)) A[:, :-1] = coords * 2 A[:, 3] = 1 f = np.zeros((n, 1)) x = coords[:, 0] y = coords[:, 1] z = coords[:, 2] f[:, 0] = x * x + y * y + z * z try: C, residue, rank, _ = np.linalg.lstsq(A, f, rcond=-1) # solve AC=f except: C, residue, rank, _ = np.linalg.lstsq(A, f) # solve AC=f if rank < 4: return None t = (C[0] * C[0]) + (C[1] * C[1]) + (C[2] * C[2]) + C[3] radius = np.sqrt(t)[0] center = np.array([C[0][0], C[1][0], C[2][0]]) if len(residue) > 0: residue = np.sqrt(residue[0]) / n else: residue = 0 sph = vedo.shapes.Sphere(center, radius, c=(1, 0, 0)).wireframe(1) sph.radius = radius sph.center = center sph.residue = residue sph.name = "FitSphere" return sph def pca_ellipse(points, pvalue=0.673, res=60): """ Show the oriented PCA 2D ellipse that contains the fraction `pvalue` of points. Parameter `pvalue` sets the specified fraction of points inside the ellipse. Normalized directions are stored in `ellipse.axis1`, `ellipse.axis12` axes sizes are stored in `ellipse.va`, `ellipse.vb` Arguments: pvalue : (float) ellipse will include this fraction of points res : (int) resolution of the ellipse Examples: - [histo_pca.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_pca.py) ![](https://vedo.embl.es/images/pyplot/histo_pca.png) """ from scipy.stats import f if isinstance(points, Points): coords = points.points() else: coords = points if len(coords) < 4: vedo.logger.warning("in pca_ellipse(), there are not enough points!") return None P = np.array(coords, dtype=float)[:,(0,1)] cov = np.cov(P, rowvar=0) # covariance matrix _, s, R = np.linalg.svd(cov) # singular value decomposition p, n = s.size, P.shape[0] fppf = f.ppf(pvalue, p, n-p) # f % point function ua, ub = np.sqrt(s*fppf/2)*2 # semi-axes (largest first) center = np.mean(P, axis=0) # centroid of the ellipse matri = vtk.vtkMatrix4x4() matri.DeepCopy(( R[0][0] * ua, R[1][0] * ub, 0, center[0], R[0][1] * ua, R[1][1] * ub, 0, center[1], 0, 0, 1, 0, 0, 0, 0, 1) ) vtra = vtk.vtkTransform() vtra.SetMatrix(matri) elli = vedo.shapes.Circle(alpha=0.75, res=res) # assign the transformation elli.SetScale(vtra.GetScale()) elli.SetOrientation(vtra.GetOrientation()) elli.SetPosition(vtra.GetPosition()) elli.center = np.array(vtra.GetPosition()) elli.nr_of_points = n elli.va = ua elli.vb = ub elli.axis1 = np.array(vtra.TransformPoint([1, 0, 0])) - elli.center elli.axis2 = np.array(vtra.TransformPoint([0, 1, 0])) - elli.center elli.axis1 /= np.linalg.norm(elli.axis1) elli.axis2 /= np.linalg.norm(elli.axis2) elli.transformation = vtra elli.name = "PCAEllipse" return elli @deprecated(reason=vedo.colors.red + "Please use pca_ellipsoid()" + vedo.colors.reset) def pcaEllipsoid(points, pvalue=0.673): "Deprecated. Please use `pca_ellipsoid()`." return pca_ellipsoid(points, pvalue) def pca_ellipsoid(points, pvalue=0.673): """ Show the oriented PCA ellipsoid that contains fraction `pvalue` of points. Parameter `pvalue` sets the specified fraction of points inside the ellipsoid. Extra can be calculated with `mesh.asphericity()`, `mesh.asphericity_error()` (asphericity is equal to 0 for a perfect sphere). Axes sizes can be accessed in `ellips.va`, `ellips.vb`, `ellips.vc`, normalized directions are stored in `ellips.axis1`, `ellips.axis12` and `ellips.axis3`. .. warning:: the meaning of `ellips.axis1`, has changed wrt `vedo==2022.1.0` in that it's now the direction wrt the origin (e.i. the center is subtracted) Examples: - [pca_ellipsoid.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/pca_ellipsoid.py) ![](https://vedo.embl.es/images/basic/pca.png) """ from scipy.stats import f if isinstance(points, Points): coords = points.points() else: coords = points if len(coords) < 4: vedo.logger.warning("in pcaEllipsoid(), there are not enough points!") return None P = np.array(coords, ndmin=2, dtype=float) cov = np.cov(P, rowvar=0) # covariance matrix _, s, R = np.linalg.svd(cov) # singular value decomposition p, n = s.size, P.shape[0] fppf = f.ppf(pvalue, p, n-p)*(n-1)*p*(n+1)/n/(n-p) # f % point function cfac = 1 + 6/(n-1) # correction factor for low statistics ua, ub, uc = np.sqrt(s*fppf)/cfac # semi-axes (largest first) center = np.mean(P, axis=0) # centroid of the hyperellipsoid elli = vedo.shapes.Ellipsoid((0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1), alpha=0.25) matri = vtk.vtkMatrix4x4() matri.DeepCopy(( R[0][0] * ua*2, R[1][0] * ub*2, R[2][0] * uc*2, center[0], R[0][1] * ua*2, R[1][1] * ub*2, R[2][1] * uc*2, center[1], R[0][2] * ua*2, R[1][2] * ub*2, R[2][2] * uc*2, center[2], 0, 0, 0, 1) ) vtra = vtk.vtkTransform() vtra.SetMatrix(matri) # assign the transformation elli.SetScale(vtra.GetScale()) elli.SetOrientation(vtra.GetOrientation()) elli.SetPosition(vtra.GetPosition()) elli.center = np.array(vtra.GetPosition()) elli.nr_of_points = n elli.va = ua elli.vb = ub elli.vc = uc elli.axis1 = np.array(vtra.TransformPoint([1, 0, 0])) - elli.center elli.axis2 = np.array(vtra.TransformPoint([0, 1, 0])) - elli.center elli.axis3 = np.array(vtra.TransformPoint([0, 0, 1])) - elli.center elli.axis1 /= np.linalg.norm(elli.axis1) elli.axis2 /= np.linalg.norm(elli.axis2) elli.axis3 /= np.linalg.norm(elli.axis3) elli.transformation = vtra elli.name = "PCAEllipsoid" return elli ################################################### def Point(pos=(0, 0, 0), r=12, c="red", alpha=1.0): """ Create a simple point in space. .. note:: if you are creating many points you should definitely use class `Points` instead! """ if isinstance(pos, vtk.vtkActor): pos = pos.GetPosition() pd = utils.buildPolyData([[0, 0, 0]]) if len(pos) == 2: pos = (pos[0], pos[1], 0.0) pt = Points(pd, r, c, alpha) pt.SetPosition(pos) pt.name = "Point" return pt ################################################### class Points(BaseActor, vtk.vtkActor): """Work with pointclouds.""" def __init__(self, inputobj=None, r=4, c=(0.2, 0.2, 0.2), alpha=1, blur=False, emissive=True): """ Build an object made of only vertex points for a list of 2D/3D points. Both shapes (N, 3) or (3, N) are accepted as input, if N>3. For very large point clouds a list of colors and alpha can be assigned to each point in the form c=[(R,G,B,A), ... ] where 0<=R<256, ... 0<=A<256. Arguments: inputobj : (list, tuple) r : (int) Point radius in units of pixels. c : (str, list) Color name or rgb tuple. alpha : (float) Transparency in range [0,1]. blur : (bool) Apply a gaussian convolution filter to the points. In this case the radius `r` is in absolute units of the mesh coordinates. emissive : (bool) Halo of point becomes emissive. Example: ```python from vedo import * def fibonacci_sphere(n): s = np.linspace(0, n, num=n, endpoint=False) theta = s * 2.399963229728653 y = 1 - s * (2/(n-1)) r = np.sqrt(1 - y * y) x = np.cos(theta) * r z = np.sin(theta) * r return [x,y,z] Points(fibonacci_sphere(1000)).show(axes=1).close() ``` ![](https://vedo.embl.es/images/feats/fibonacci.png) """ vtk.vtkActor.__init__(self) BaseActor.__init__(self) self._data = None if blur: self._mapper = vtk.vtkPointGaussianMapper() if emissive: self._mapper.SetEmissive(bool(emissive)) self._mapper.SetScaleFactor(r * 1.4142) # https://kitware.github.io/vtk-examples/site/Python/Meshes/PointInterpolator/ if alpha < 1: self._mapper.SetSplatShaderCode( "//VTK::Color::Impl\n" "float dist = dot(offsetVCVSOutput.xy,offsetVCVSOutput.xy);\n" "if (dist > 1.0) {\n" " discard;\n" "} else {\n" f" float scale = ({alpha} - dist);\n" " ambientColor *= scale;\n" " diffuseColor *= scale;\n" "}\n" ) alpha = 1 else: self._mapper = vtk.vtkPolyDataMapper() self.SetMapper(self._mapper) self._bfprop = None # backface property holder self._scals_idx = 0 # index of the active scalar changed from CLI self._ligthingnr = 0 # index of the lighting mode changed from CLI self._cmap_name = "" # remember the name for self._keypress # self.name = "Points" # better not to give it a name here self.property = self.GetProperty() try: if not blur: self.property.RenderPointsAsSpheresOn() except AttributeError: pass if inputobj is None: #################### self._data = vtk.vtkPolyData() return ######################################## self.property.SetRepresentationToPoints() self.property.SetPointSize(r) self.property.LightingOff() if isinstance(inputobj, vedo.BaseActor): inputobj = inputobj.points() # numpy ###### if isinstance(inputobj, vtk.vtkActor): poly_copy = vtk.vtkPolyData() pr = vtk.vtkProperty() pr.DeepCopy(inputobj.GetProperty()) poly_copy.DeepCopy(inputobj.GetMapper().GetInput()) pr.SetRepresentationToPoints() pr.SetPointSize(r) self._data = poly_copy self._mapper.SetInputData(poly_copy) self._mapper.SetScalarVisibility(inputobj.GetMapper().GetScalarVisibility()) self.SetProperty(pr) self.property = pr elif isinstance(inputobj, vtk.vtkPolyData): if inputobj.GetNumberOfCells() == 0: carr = vtk.vtkCellArray() for i in range(inputobj.GetNumberOfPoints()): carr.InsertNextCell(1) carr.InsertCellPoint(i) inputobj.SetVerts(carr) self._data = inputobj # cache vtkPolyData and mapper for speed elif utils.is_sequence(inputobj): # passing point coords plist = inputobj n = len(plist) if n == 3: # assume plist is in the format [all_x, all_y, all_z] if utils.is_sequence(plist[0]) and len(plist[0]) > 3: plist = np.stack((plist[0], plist[1], plist[2]), axis=1) elif n == 2: # assume plist is in the format [all_x, all_y, 0] if utils.is_sequence(plist[0]) and len(plist[0]) > 3: plist = np.stack((plist[0], plist[1], np.zeros(len(plist[0]))), axis=1) # if n and len(plist[0]) == 2: # make it 3d # plist = np.c_[np.array(plist), np.zeros(len(plist))] plist = utils.make3d(plist) if ( utils.is_sequence(c) and (len(c) > 3 or (utils.is_sequence(c[0]) and len(c[0]) == 4)) ) or utils.is_sequence(alpha): cols = c n = len(plist) if n != len(cols): vedo.logger.error(f"mismatch in Points() colors array lengths {n} and {len(cols)}") raise RuntimeError() src = vtk.vtkPointSource() src.SetNumberOfPoints(n) src.Update() vgf = vtk.vtkVertexGlyphFilter() vgf.SetInputData(src.GetOutput()) vgf.Update() pd = vgf.GetOutput() pd.GetPoints().SetData(utils.numpy2vtk(plist, dtype=np.float32)) ucols = vtk.vtkUnsignedCharArray() ucols.SetNumberOfComponents(4) ucols.SetName("Points_RGBA") if utils.is_sequence(alpha): if len(alpha) != n: vedo.logger.error(f"mismatch in Points() alpha array lengths {n} and {len(cols)}") raise RuntimeError() alphas = alpha alpha = 1 else: alphas = (alpha,) * n if utils.is_sequence(cols): c = None if len(cols[0]) == 4: for i in range(n): # FAST rc, gc, bc, ac = cols[i] ucols.InsertNextTuple4(rc, gc, bc, ac) else: for i in range(n): # SLOW rc, gc, bc = colors.get_color(cols[i]) ucols.InsertNextTuple4(rc * 255, gc * 255, bc * 255, alphas[i] * 255) else: c = cols pd.GetPointData().AddArray(ucols) pd.GetPointData().SetActiveScalars("Points_RGBA") self._mapper.SetInputData(pd) self._mapper.ScalarVisibilityOn() self._data = pd else: pd = utils.buildPolyData(plist) self._mapper.SetInputData(pd) c = colors.get_color(c) self.property.SetColor(c) self.property.SetOpacity(alpha) self._data = pd ########## self.pipeline = utils.OperationNode( self, parents=[], comment=f"#pts {self._data.GetNumberOfPoints()}" ) return ########## elif isinstance(inputobj, str): verts = vedo.file_io.load(inputobj) self.filename = inputobj self._data = verts.polydata() else: # try to extract the points from the VTK input data object try: vvpts = inputobj.GetPoints() pd = vtk.vtkPolyData() pd.SetPoints(vvpts) for i in range(inputobj.GetPointData().GetNumberOfArrays()): arr = inputobj.GetPointData().GetArray(i) pd.GetPointData().AddArray(arr) self._mapper.SetInputData(pd) c = colors.get_color(c) self.property.SetColor(c) self.property.SetOpacity(alpha) self._data = pd except: vedo.logger.error(f"cannot build Points from type {type(inputobj)}") raise RuntimeError() c = colors.get_color(c) self.property.SetColor(c) self.property.SetOpacity(alpha) self._mapper.SetInputData(self._data) self.pipeline = utils.OperationNode( self, parents=[], comment=f"#pts {self._data.GetNumberOfPoints()}" ) return def _repr_html_(self): """ HTML representation of the Point cloud object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.pointcloud.Points" help_url = "https://vedo.embl.es/docs/vedo/pointcloud.html" arr = self.thumbnail() im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" bounds = "
".join( [ utils.precision(min_x, 4) + " ... " + utils.precision(max_x, 4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) average_size = "{size:.3f}".format(size=self.average_size()) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" pdata = "" if self._data.GetPointData().GetScalars(): if self._data.GetPointData().GetScalars().GetName(): name = self._data.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" if self._data.GetCellData().GetScalars(): if self._data.GetCellData().GetScalars().GetName(): name = self._data.GetCellData().GetScalars().GetName() cdata = " cell data array " + name + "" allt = [ "", "", "", "
", image, "
", help_text, "", "", "", "", "", pdata, cdata, "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + utils.precision(self.center_of_mass(), 3) + "
average size " + str(average_size) + "
nr. points " + str(self.npoints) + "
", "
", ] return "\n".join(allt) ################################################################################## def _update(self, polydata): # Overwrite the polygonal mesh with a new vtkPolyData self._data = polydata self.mapper().SetInputData(polydata) self.mapper().Modified() return self def __add__(self, meshs): if isinstance(meshs, list): alist = [self] for l in meshs: if isinstance(l, vedo.Assembly): alist += l.unpack() else: alist += l return vedo.assembly.Assembly(alist) if isinstance(meshs, vedo.Assembly): return meshs + self # use Assembly.__add__ return vedo.assembly.Assembly([self, meshs]) def polydata(self, transformed=True): """ Returns the `vtkPolyData` object associated to a `Mesh`. .. note:: If `transformed=True` return a copy of polydata that corresponds to the current mesh position in space. """ if not self._data: self._data = self.mapper().GetInput() return self._data if transformed: # if self.GetIsIdentity() or self._data.GetNumberOfPoints()==0: # commmentd out on 15th feb 2020 if self._data.GetNumberOfPoints() == 0: # no need to do much return self._data # otherwise make a copy that corresponds to # the actual position in space of the mesh M = self.GetMatrix() transform = vtk.vtkTransform() transform.SetMatrix(M) tp = vtk.vtkTransformPolyDataFilter() tp.SetTransform(transform) tp.SetInputData(self._data) tp.Update() return tp.GetOutput() return self._data def clone(self, deep=True, transformed=False): """ Clone a `PointCloud` or `Mesh` object to make an exact copy of it. Arguments: deep : (bool) if False only build a shallow copy of the object (faster copy). transformed : (bool) if True reset the current transformation of the copy to unit. Examples: - [mirror.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mirror.py) ![](https://vedo.embl.es/images/basic/mirror.png) """ poly = self.polydata(transformed) poly_copy = vtk.vtkPolyData() if deep: poly_copy.DeepCopy(poly) else: poly_copy.ShallowCopy(poly) if isinstance(self, vedo.Mesh): cloned = vedo.Mesh(poly_copy) else: cloned = Points(poly_copy) pr = vtk.vtkProperty() pr.DeepCopy(self.GetProperty()) cloned.SetProperty(pr) cloned.property = pr if self.GetBackfaceProperty(): bfpr = vtk.vtkProperty() bfpr.DeepCopy(self.GetBackfaceProperty()) cloned.SetBackfaceProperty(bfpr) if not transformed: if self.transform: # already has a transform which can be non linear, so use that cloned.SetUserTransform(self.transform) else: # assign the same transformation to the copy cloned.SetOrigin(self.GetOrigin()) cloned.SetScale(self.GetScale()) cloned.SetOrientation(self.GetOrientation()) cloned.SetPosition(self.GetPosition()) mp = cloned.mapper() sm = self.mapper() mp.SetScalarVisibility(sm.GetScalarVisibility()) mp.SetScalarRange(sm.GetScalarRange()) mp.SetColorMode(sm.GetColorMode()) lsr = sm.GetUseLookupTableScalarRange() mp.SetUseLookupTableScalarRange(lsr) mp.SetScalarMode(sm.GetScalarMode()) lut = sm.GetLookupTable() if lut: mp.SetLookupTable(lut) if self.GetTexture(): cloned.texture(self.GetTexture()) cloned.SetPickable(self.GetPickable()) cloned.base = np.array(self.base) cloned.top = np.array(self.top) cloned.name = str(self.name) cloned.filename = str(self.filename) cloned.info = dict(self.info) # better not to share the same locators with original obj cloned.point_locator = None cloned.cell_locator = None cloned.pipeline = utils.OperationNode("clone", parents=[self], shape="diamond", c="#edede9") return cloned def clone2d( self, pos=(0, 0), coordsys=4, scale=None, c=None, alpha=None, ps=2, lw=1, sendback=False, layer=0, ): """ Copy a 3D Mesh into a static 2D image. Returns a `vtkActor2D`. Arguments: coordsys : (int) the coordinate system, options are - 0 = Displays - 1 = Normalized Display - 2 = Viewport (origin is the bottom-left corner of the window) - 3 = Normalized Viewport - 4 = View (origin is the center of the window) - 5 = World (anchor the 2d image to mesh) ps : (int) point size in pixel units lw : (int) line width in pixel units sendback : (bool) put it behind any other 3D object Examples: - [clone2d.py](https://github.com/marcomusy/vedo/tree/master/examples/other/clone2d.py) ![](https://vedo.embl.es/images/other/clone2d.png) """ if scale is None: msiz = self.diagonal_size() if vedo.plotter_instance and vedo.plotter_instance.window: sz = vedo.plotter_instance.window.GetSize() dsiz = utils.mag(sz) scale = dsiz / msiz / 10 else: scale = 350 / msiz cmsh = self.clone() poly = cmsh.pos(0, 0, 0).scale(scale).polydata() mapper3d = self.mapper() cm = mapper3d.GetColorMode() lut = mapper3d.GetLookupTable() sv = mapper3d.GetScalarVisibility() use_lut = mapper3d.GetUseLookupTableScalarRange() vrange = mapper3d.GetScalarRange() sm = mapper3d.GetScalarMode() mapper2d = vtk.vtkPolyDataMapper2D() mapper2d.ShallowCopy(mapper3d) mapper2d.SetInputData(poly) mapper2d.SetColorMode(cm) mapper2d.SetLookupTable(lut) mapper2d.SetScalarVisibility(sv) mapper2d.SetUseLookupTableScalarRange(use_lut) mapper2d.SetScalarRange(vrange) mapper2d.SetScalarMode(sm) act2d = vtk.vtkActor2D() act2d.SetMapper(mapper2d) act2d.SetLayerNumber(layer) csys = act2d.GetPositionCoordinate() csys.SetCoordinateSystem(coordsys) act2d.SetPosition(pos) if c is not None: c = colors.get_color(c) act2d.GetProperty().SetColor(c) mapper2d.SetScalarVisibility(False) else: act2d.GetProperty().SetColor(cmsh.color()) if alpha is not None: act2d.GetProperty().SetOpacity(alpha) else: act2d.GetProperty().SetOpacity(cmsh.alpha()) act2d.GetProperty().SetPointSize(ps) act2d.GetProperty().SetLineWidth(lw) act2d.GetProperty().SetDisplayLocationToForeground() if sendback: act2d.GetProperty().SetDisplayLocationToBackground() # print(csys.GetCoordinateSystemAsString()) # print(act2d.GetHeight(), act2d.GetWidth(), act2d.GetLayerNumber()) return act2d def add_trail(self, offset=(0, 0, 0), n=50, c=None, alpha=1.0, lw=2): """ Add a trailing line to mesh. This new mesh is accessible through `mesh.trail`. Arguments: offset : (float) set an offset vector from the object center. n : (int) number of segments lw : (float) line width of the trail Examples: - [trail.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/trail.py) ![](https://vedo.embl.es/images/simulations/trail.gif) - [airplane1.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane1.py) - [airplane2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane2.py) """ if self.trail is None: pos = self.GetPosition() self.trail_offset = np.asarray(offset) self.trail_points = [pos] * n if c is None: col = self.GetProperty().GetColor() else: col = colors.get_color(c) tline = vedo.shapes.Line(pos, pos, res=n, c=col, alpha=alpha, lw=lw) self.trail = tline # holds the Line return self def update_trail(self): """ Update the trailing line of a moving object. """ if isinstance(self, vedo.shapes.Arrow): currentpos = self.tipPoint() # the tip of Arrow else: currentpos = np.array(self.GetPosition()) self.trail_points.append(currentpos) # cycle self.trail_points.pop(0) data = np.array(self.trail_points) - currentpos + self.trail_offset tpoly = self.trail.polydata(False) tpoly.GetPoints().SetData(utils.numpy2vtk(data, dtype=np.float32)) self.trail.SetPosition(currentpos) return self def _compute_shadow(self, plane, point, direction): shad = self.clone() shad._data.GetPointData().SetTCoords(None) # remove any texture coords shad.name = "Shadow" pts = shad.points() if plane == 'x': # shad = shad.project_on_plane('x') # instead do it manually so in case of alpha<1 # we dont see glitches due to coplanar points # we leave a small tolerance of 0.1% in thickness x0, x1 = self.xbounds() pts[:, 0] = (pts[:, 0] - (x0 + x1) / 2) / 1000 + self.GetOrigin()[0] shad.points(pts) shad.x(point) elif plane == 'y': x0, x1 = self.ybounds() pts[:, 1] = (pts[:, 1] - (x0 + x1) / 2) / 1000 + self.GetOrigin()[1] shad.points(pts) shad.y(point) elif plane == "z": x0, x1 = self.zbounds() pts[:, 2] = (pts[:, 2] - (x0 + x1) / 2) / 1000 + self.GetOrigin()[2] shad.points(pts) shad.z(point) else: shad = shad.project_on_plane(plane, point, direction) return shad def add_shadow(self, plane, point, direction=None, c=(0.6, 0.6, 0.6), alpha=1, culling=0): """ Generate a shadow out of an `Mesh` on one of the three Cartesian planes. The output is a new `Mesh` representing the shadow. This new mesh is accessible through `mesh.shadow`. By default the shadow mesh is placed on the bottom wall of the bounding box. See also `pointcloud.project_on_plane()`. Arguments: plane : (str, Plane) if plane is `str`, plane can be one of `['x', 'y', 'z']`, represents x-plane, y-plane and z-plane, respectively. Otherwise, plane should be an instance of `vedo.shapes.Plane` point : (float, array) if plane is `str`, point should be a float represents the intercept. Otherwise, point is the camera point of perspective projection direction : (list) direction of oblique projection culling : (int) choose between front [1] or backface [-1] culling or None. Examples: - [shadow1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/shadow1.py) - [airplane1.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane1.py) - [airplane2.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/airplane2.py) ![](https://vedo.embl.es/images/simulations/57341963-b8910900-713c-11e9-898a-84b6d3712bce.gif) """ shad = self._compute_shadow(plane, point, direction) shad.c(c).alpha(alpha) try: # Points dont have these methods shad.flat() if culling in (1, True): shad.frontface_culling() elif culling == -1: shad.backface_culling() except AttributeError: pass shad.GetProperty().LightingOff() shad.SetPickable(False) shad.SetUseBounds(True) if shad not in self.shadows: self.shadows.append(shad) shad.info = dict(plane=plane, point=point, direction=direction) return self def update_shadows(self): """ Update the shadows of a moving object. """ for sha in self.shadows: plane = sha.info['plane'] point = sha.info['point'] direction = sha.info['direction'] new_sha = self._compute_shadow(plane, point, direction) sha._update(new_sha._data) return self def delete_cells_by_point_index(self, indices): """ Delete a list of vertices identified by any of their vertex index. See also `delete_cells()`. Examples: - [elete_mesh_pts.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/elete_mesh_pts.py) ![](https://vedo.embl.es/images/basic/deleteMeshPoints.png) """ cell_ids = vtk.vtkIdList() data = self.inputdata() data.BuildLinks() n = 0 for i in np.unique(indices): data.GetPointCells(i, cell_ids) for j in range(cell_ids.GetNumberOfIds()): data.DeleteCell(cell_ids.GetId(j)) # flag cell n += 1 data.RemoveDeletedCells() self.mapper().Modified() self.pipeline = utils.OperationNode(f"delete {n} cells\nby point index", parents=[self]) return self def compute_normals_with_pca(self, n=20, orientation_point=None, invert=False): """ Generate point normals using PCA (principal component analysis). Basically this estimates a local tangent plane around each sample point p by considering a small neighborhood of points around p, and fitting a plane to the neighborhood (via PCA). Arguments: n : (int) neighborhood size to calculate the normal orientation_point : (list) adjust the +/- sign of the normals so that the normals all point towards a specified point. If None, perform a traversal of the point cloud and flip neighboring normals so that they are mutually consistent. invert : (bool) flip all normals """ poly = self.polydata() pcan = vtk.vtkPCANormalEstimation() pcan.SetInputData(poly) pcan.SetSampleSize(n) if orientation_point is not None: pcan.SetNormalOrientationToPoint() pcan.SetOrientationPoint(orientation_point) else: pcan.SetNormalOrientationToGraphTraversal() if invert: pcan.FlipNormalsOn() pcan.Update() varr = pcan.GetOutput().GetPointData().GetNormals() varr.SetName("Normals") self.inputdata().GetPointData().SetNormals(varr) self.inputdata().GetPointData().Modified() return self def compute_acoplanarity(self, n=25, radius=None, on="points"): """ Compute acoplanarity which is a measure of how much a local region of the mesh differs from a plane. The information is stored in a `pointdata` or `celldata` array with name 'Acoplanarity'. Either `n` (number of neighbour points) or `radius` (radius of local search) can be specified. If a radius value is given and not enough points fall inside it, then a -1 is stored. Example: ```python from vedo import * msh = ParametricShape('RandomHills') msh.compute_acoplanarity(radius=0.1, on='cells') msh.cmap("coolwarm", on='cells').add_scalarbar() msh.show(axes=1).close() ``` ![](https://vedo.embl.es/images/feats/acoplanarity.jpg) """ acoplanarities = [] if "point" in on: pts = self.points() elif "cell" in on: pts = self.cell_centers() else: raise ValueError(f"In compute_acoplanarity() set on to either 'cells' or 'points', not {on}") for p in utils.progressbar(pts, delay=5, width=15, title=f"{on} acoplanarity"): if n: data = self.closest_point(p, n=n) npts = n elif radius: data = self.closest_point(p, radius=radius) npts = len(data) try: center = data.mean(axis=0) res = np.linalg.svd(data - center) acoplanarities.append(res[1][2] / npts) except: acoplanarities.append(-1.0) if "point" in on: self.pointdata["Acoplanarity"] = np.array(acoplanarities, dtype=float) else: self.celldata["Acoplanarity"] = np.array(acoplanarities, dtype=float) return self def distance_to(self, pcloud, signed=False, invert=False, name="Distance"): """ Computes the distance from one point cloud or mesh to another point cloud or mesh. This new `pointdata` array is saved with default name "Distance". Keywords `signed` and `invert` are used to compute signed distance, but the mesh in that case must have polygonal faces (not a simple point cloud), and normals must also be computed. Examples: - [distance2mesh.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/distance2mesh.py) ![](https://vedo.embl.es/images/basic/distance2mesh.png) """ if pcloud.inputdata().GetNumberOfPolys(): poly1 = self.polydata() poly2 = pcloud.polydata() df = vtk.vtkDistancePolyDataFilter() df.ComputeSecondDistanceOff() df.SetInputData(0, poly1) df.SetInputData(1, poly2) df.SetSignedDistance(signed) df.SetNegateDistance(invert) df.Update() scals = df.GetOutput().GetPointData().GetScalars() dists = utils.vtk2numpy(scals) else: # has no polygons and vtkDistancePolyDataFilter wants them (dont know why) if signed: vedo.logger.warning("distanceTo() called with signed=True but input object has no polygons") if not pcloud.point_locator: pcloud.point_locator = vtk.vtkPointLocator() pcloud.point_locator.SetDataSet(pcloud.polydata()) pcloud.point_locator.BuildLocator() ids = [] ps1 = self.points() ps2 = pcloud.points() for p in ps1: pid = pcloud.point_locator.FindClosestPoint(p) ids.append(pid) deltas = ps2[ids] - ps1 dists = np.linalg.norm(deltas, axis=1).astype(np.float32) scals = utils.numpy2vtk(dists) scals.SetName(name) self.inputdata().GetPointData().AddArray(scals) # must be self.inputdata() ! self.inputdata().GetPointData().SetActiveScalars(scals.GetName()) rng = scals.GetRange() self.mapper().SetScalarRange(rng[0], rng[1]) self.mapper().ScalarVisibilityOn() self.pipeline = utils.OperationNode( "distance_to", parents=[self, pcloud], shape="cylinder", comment=f"#pts {self._data.GetNumberOfPoints()}", ) return dists def alpha(self, opacity=None): """Set/get mesh's transparency. Same as `mesh.opacity()`.""" if opacity is None: return self.GetProperty().GetOpacity() self.GetProperty().SetOpacity(opacity) bfp = self.GetBackfaceProperty() if bfp: if opacity < 1: self._bfprop = bfp self.SetBackfaceProperty(None) else: self.SetBackfaceProperty(self._bfprop) return self def opacity(self, alpha=None): """Set/get mesh's transparency. Same as `mesh.alpha()`.""" return self.alpha(alpha) def force_opaque(self, value=True): """ Force the Mesh, Line or point cloud to be treated as opaque""" ## force the opaque pass, fixes picking in vtk9 # but causes other bad troubles with lines.. self.SetForceOpaque(value) return self def force_translucent(self, value=True): """ Force the Mesh, Line or point cloud to be treated as translucent""" self.SetForceTranslucent(value) return self def point_size(self, value=None): """Set/get mesh's point size of vertices. Same as `mesh.ps()`""" if value is None: return self.GetProperty().GetPointSize() #self.GetProperty().SetRepresentationToSurface() else: self.GetProperty().SetRepresentationToPoints() self.GetProperty().SetPointSize(value) return self def ps(self, pointsize=None): """Set/get mesh's point size of vertices. Same as `mesh.point_size()`""" return self.point_size(pointsize) def render_points_as_spheres(self, value=True): """Make points look spheric or make them look as squares.""" self.GetProperty().SetRenderPointsAsSpheres(value) return self def color(self, c=False, alpha=None): """ Set/get mesh's color. If None is passed as input, will use colors from active scalars. Same as `mesh.c()`. """ # overrides base.color() if c is False: return np.array(self.GetProperty().GetColor()) if c is None: self.mapper().ScalarVisibilityOn() return self self.mapper().ScalarVisibilityOff() cc = colors.get_color(c) self.GetProperty().SetColor(cc) if self.trail: self.trail.GetProperty().SetColor(cc) if alpha is not None: self.alpha(alpha) return self def clean(self): """ Clean pointcloud or mesh by removing coincident points. """ cpd = vtk.vtkCleanPolyData() cpd.PointMergingOn() cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() cpd.ConvertStripsToPolysOn() cpd.SetInputData(self.inputdata()) cpd.Update() out = self._update(cpd.GetOutput()) out.pipeline = utils.OperationNode( "clean", parents=[self], comment=f"#pts {out.inputdata().GetNumberOfPoints()}" ) return out def subsample(self, fraction, absolute=False): """ Subsample a point cloud by requiring that the points or vertices are far apart at least by the specified fraction of the object size. If a Mesh is passed the polygonal faces are not removed but holes can appear as vertices are removed. Examples: - [moving_least_squares1D.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/moving_least_squares1D.py) ![](https://vedo.embl.es/images/advanced/moving_least_squares1D.png) - [recosurface.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/recosurface.py) ![](https://vedo.embl.es/images/advanced/recosurface.png) """ if not absolute: if fraction > 1: vedo.logger.warning( f"subsample(fraction=...), fraction must be < 1, but is {fraction}" ) if fraction <= 0: return self cpd = vtk.vtkCleanPolyData() cpd.PointMergingOn() cpd.ConvertLinesToPointsOn() cpd.ConvertPolysToLinesOn() cpd.ConvertStripsToPolysOn() cpd.SetInputData(self.inputdata()) if absolute: cpd.SetTolerance(fraction / self.diagonal_size()) # cpd.SetToleranceIsAbsolute(absolute) else: cpd.SetTolerance(fraction) cpd.Update() ps = 2 if self.GetProperty().GetRepresentation() == 0: ps = self.GetProperty().GetPointSize() out = self._update(cpd.GetOutput()).ps(ps) out.pipeline = utils.OperationNode( "subsample", parents=[self], comment=f"#pts {out.inputdata().GetNumberOfPoints()}" ) return out def threshold(self, scalars, above=None, below=None, on="points"): """ Extracts cells where scalar value satisfies threshold criterion. Arguments: scalars : (str) name of the scalars array. above : (float) minimum value of the scalar below : (float) maximum value of the scalar on : (str) if 'cells' assume array of scalars refers to cell data. Examples: - [mesh_threshold.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_threshold.py) """ thres = vtk.vtkThreshold() thres.SetInputData(self.inputdata()) if on.startswith("c"): asso = vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS else: asso = vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS thres.SetInputArrayToProcess(0, 0, 0, asso, scalars) if above is None and below is not None: thres.ThresholdByLower(below) elif below is None and above is not None: thres.ThresholdByUpper(above) else: thres.ThresholdBetween(above, below) thres.Update() gf = vtk.vtkGeometryFilter() gf.SetInputData(thres.GetOutput()) gf.Update() return self._update(gf.GetOutput()) def quantize(self, value): """ The user should input a value and all {x,y,z} coordinates will be quantized to that absolute grain size. """ poly = self.inputdata() qp = vtk.vtkQuantizePolyDataPoints() qp.SetInputData(poly) qp.SetQFactor(value) qp.Update() out = self._update(qp.GetOutput()).flat() out.pipeline = utils.OperationNode("quantize", parents=[self]) return out def average_size(self): """ Calculate the average size of a mesh. This is the mean of the vertex distances from the center of mass. """ coords = self.points() cm = np.mean(coords, axis=0) if coords.shape[0] == 0: return 0.0 cc = coords - cm return np.mean(np.linalg.norm(cc, axis=1)) def center_of_mass(self): """Get the center of mass of mesh.""" cmf = vtk.vtkCenterOfMass() cmf.SetInputData(self.polydata()) cmf.Update() c = cmf.GetCenter() return np.array(c) def normal_at(self, i): """Return the normal vector at vertex point `i`.""" normals = self.polydata().GetPointData().GetNormals() return np.array(normals.GetTuple(i)) def normals(self, cells=False, recompute=True): """Retrieve vertex normals as a numpy array. Arguments: cells : (bool) if `True` return cell normals. recompute : (bool) if `True` normals are recalculated if not already present. Note that this might modify the number of mesh points. """ if cells: vtknormals = self.polydata().GetCellData().GetNormals() else: vtknormals = self.polydata().GetPointData().GetNormals() if not vtknormals and recompute: try: self.compute_normals(cells=cells) if cells: vtknormals = self.polydata().GetCellData().GetNormals() else: vtknormals = self.polydata().GetPointData().GetNormals() except AttributeError: # can be that 'Points' object has no attribute 'compute_normals' pass if not vtknormals: return np.array([]) return utils.vtk2numpy(vtknormals) def labels( self, content=None, on="points", scale=None, xrot=0.0, yrot=0.0, zrot=0.0, ratio=1, precision=None, italic=False, font="", justify="bottom-left", c="black", alpha=1.0, cells=None, ): """ Generate value or ID labels for mesh cells or points. For large nr. of labels use `font="VTK"` which is much faster. See also: `labels2d()`, `flagpole()`, `caption()` and `legend()`. Arguments: content : (list,int,str) either 'id', 'cellid', array name or array number. A array can also be passed (must match the nr. of points or cells). on : (str) generate labels for "cells" instead of "points" scale : (float) absolute size of labels, if left as None it is automatic zrot : (float) local rotation angle of label in degrees ratio : (int) skipping ratio, to reduce nr of labels for large meshes precision : (int) numeric precision of labels ```python from vedo import * s = Sphere(res=10).linewidth(1).c("orange").compute_normals() point_ids = s.labels('id', on="points").c('green') cell_ids = s.labels('id', on="cells" ).c('black') show(s, point_ids, cell_ids) ``` ![](https://vedo.embl.es/images/feats/labels.png) Examples: - [boundaries.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/boundaries.py) ![](https://vedo.embl.es/images/basic/boundaries.png) """ if cells is not None: # deprecation message vedo.logger.warning("In labels(cells=...) please use labels(on='cells') instead") if "cell" in on or "face" in on: cells = True if isinstance(content, str): if content in ("cellid", "cellsid"): cells = True content = "id" if cells: elems = self.cell_centers() norms = self.normals(cells=True, recompute=False) ns = np.sqrt(self.ncells) else: elems = self.points() norms = self.normals(cells=False, recompute=False) ns = np.sqrt(self.npoints) hasnorms = False if len(norms) > 0: hasnorms = True if scale is None: if not ns: ns = 100 scale = self.diagonal_size() / ns / 10 arr = None mode = 0 if content is None: mode = 0 if cells: if self.inputdata().GetCellData().GetScalars(): name = self.inputdata().GetCellData().GetScalars().GetName() arr = self.celldata[name] else: if self.inputdata().GetPointData().GetScalars(): name = self.inputdata().GetPointData().GetScalars().GetName() arr = self.pointdata[name] elif isinstance(content, (str, int)): if content == "id": mode = 1 elif cells: mode = 0 arr = self.celldata[content] else: mode = 0 arr = self.pointdata[content] elif utils.is_sequence(content): mode = 0 arr = content # print('WEIRD labels() test', content) # exit() if arr is None and mode == 0: vedo.logger.error("in labels(), array not found for points or cells") return None tapp = vtk.vtkAppendPolyData() ninputs = 0 for i, e in enumerate(elems): if i % ratio: continue if mode == 1: txt_lab = str(i) else: if precision: txt_lab = utils.precision(arr[i], precision) else: txt_lab = str(arr[i]) if not txt_lab: continue if font == "VTK": tx = vtk.vtkVectorText() tx.SetText(txt_lab) tx.Update() tx_poly = tx.GetOutput() else: tx_poly = vedo.shapes.Text3D(txt_lab, font=font, justify=justify) tx_poly = tx_poly.inputdata() if tx_poly.GetNumberOfPoints() == 0: continue ####################### ninputs += 1 T = vtk.vtkTransform() T.PostMultiply() if italic: T.Concatenate([1,0.2,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]) if hasnorms: ni = norms[i] if cells: # center-justify bb = tx_poly.GetBounds() dx, dy = (bb[1] - bb[0]) / 2, (bb[3] - bb[2]) / 2 T.Translate(-dx, -dy, 0) if xrot: T.RotateX(xrot) if yrot: T.RotateY(yrot) if zrot: T.RotateZ(zrot) crossvec = np.cross([0, 0, 1], ni) angle = np.arccos(np.dot([0, 0, 1], ni)) * 57.3 T.RotateWXYZ(angle, crossvec) if cells: # small offset along normal only for cells T.Translate(ni * scale / 2) else: if xrot: T.RotateX(xrot) if yrot: T.RotateY(yrot) if zrot: T.RotateZ(zrot) T.Scale(scale, scale, scale) T.Translate(e) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputData(tx_poly) tf.SetTransform(T) tf.Update() tapp.AddInputData(tf.GetOutput()) if ninputs: tapp.Update() lpoly = tapp.GetOutput() else: # return an empty obj lpoly = vtk.vtkPolyData() ids = vedo.mesh.Mesh(lpoly, c=c, alpha=alpha) ids.GetProperty().LightingOff() ids.PickableOff() ids.SetUseBounds(False) return ids def labels2d( self, content="id", on="points", scale=1.0, precision=4, font="Calco", justify="bottom-left", angle=0.0, frame=False, c="black", bc=None, alpha=1.0, ): """ Generate value or ID bi-dimensional labels for mesh cells or points. See also: `labels()`, `flagpole()`, `caption()` and `legend()`. Arguments: content : (str) either 'id', 'cellid', or array name on : (str) generate labels for "cells" instead of "points" (the default) scale : (float) size scaling of labels precision : (int) precision of numeric labels angle : (float) local rotation angle of label in degrees frame : (bool) draw a frame around the label bc : (str) background color of the label ```python from vedo import Sphere, show sph = Sphere(quads=True, res=4).compute_normals().wireframe() sph.celldata["zvals"] = sph.cell_centers()[:,2] l2d = sph.labels("zvals", on="cells", precision=2).backcolor('orange9') show(sph, l2d, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/labels2d.png) """ cells = False if isinstance(content, str): if content in ("cellid", "cellsid"): cells = True content = "id" if "cell" in on: cells = True elif "point" in on: cells = False if cells: if content != "id" and content not in self.celldata.keys(): vedo.logger.error(f"In labels2d: cell array {content} does not exist.") return None cellcloud = Points(self.cell_centers()) arr = self.inputdata().GetCellData().GetScalars() poly = cellcloud.polydata(False) poly.GetPointData().SetScalars(arr) else: poly = self.polydata() if content != "id" and content not in self.pointdata.keys(): vedo.logger.error(f"In labels2d: point array {content} does not exist.") return None self.pointdata.select(content) mp = vtk.vtkLabeledDataMapper() if content == "id": mp.SetLabelModeToLabelIds() else: mp.SetLabelModeToLabelScalars() if precision is not None: mp.SetLabelFormat(f"%-#.{precision}g") pr = mp.GetLabelTextProperty() c = colors.get_color(c) pr.SetColor(c) pr.SetOpacity(alpha) pr.SetFrame(frame) pr.SetFrameColor(c) pr.SetItalic(False) pr.BoldOff() pr.ShadowOff() pr.UseTightBoundingBoxOn() pr.SetOrientation(angle) pr.SetFontFamily(vtk.VTK_FONT_FILE) fl = utils.get_font_path(font) pr.SetFontFile(fl) pr.SetFontSize(int(20 * scale)) if "cent" in justify or "mid" in justify: pr.SetJustificationToCentered() elif "rig" in justify: pr.SetJustificationToRight() elif "left" in justify: pr.SetJustificationToLeft() # ------ if "top" in justify: pr.SetVerticalJustificationToTop() else: pr.SetVerticalJustificationToBottom() if bc is not None: bc = colors.get_color(bc) pr.SetBackgroundColor(bc) pr.SetBackgroundOpacity(alpha) mp.SetInputData(poly) a2d = vtk.vtkActor2D() a2d.PickableOff() a2d.SetMapper(mp) return a2d def legend(self, txt): """Book a legend text.""" self.info["legend"] = txt return self def flagpole( self, txt=None, point=None, offset=None, s=None, font="", rounded=True, c=None, alpha=1.0, lw=2, italic=0.0, padding=0.1, ): """ Generate a flag pole style element to describe an object. Returns a `Mesh` object. Use flagpole.follow_camera() to make it face the camera in the scene. See also `flagpost()`. Arguments: txt : (str) Text to display. The default is the filename or the object name. point : (list) position of the flagpole pointer. offset : (list) text offset wrt the application point. s : (float) size of the flagpole. font : (str) font face. Check [available fonts here](https://vedo.embl.es/fonts). rounded : (bool) draw a rounded or squared box around the text. c : (list) text and box color. alpha : (float) opacity of text and box. lw : (float) line with of box frame. italic : (float) italicness of text. Examples: - [intersect2d.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/intersect2d.py) ![](https://vedo.embl.es/images/pyplot/intersect2d.png) - [goniometer.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/goniometer.py) - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) """ acts = [] if txt is None: if self.filename: txt = self.filename.split("/")[-1] elif self.name: txt = self.name else: return None x0, x1, y0, y1, z0, z1 = self.bounds() d = self.diagonal_size() if point is None: if d: point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) else: # it's a Point point = self.GetPosition() pt = utils.make3d(point) if offset is None: offset = [(x1 - x0) / 2, (y1 - y0) / 6, 0] offset = utils.make3d(offset) if s is None: s = d / 20 sph = None if d and (z1 - z0) / d > 0.1: sph = vedo.shapes.Sphere(pt, r=s * 0.4, res=6) if c is None: c = np.array(self.color()) / 1.4 lb = vedo.shapes.Text3D( txt, pos=pt + offset, s=s, font=font, italic=italic, justify="center-left" ) acts.append(lb) if d and not sph: sph = vedo.shapes.Circle(pt, r=s / 3, res=15) acts.append(sph) x0, x1, y0, y1, z0, z1 = lb.GetBounds() if rounded: box = vedo.shapes.KSpline( [(x0, y0, z0), (x1, y0, z0), (x1, y1, z0), (x0, y1, z0)], closed=True ) else: box = vedo.shapes.Line( [(x0, y0, z0), (x1, y0, z0), (x1, y1, z0), (x0, y1, z0), (x0, y0, z0)] ) cnt = [(x0 + x1) / 2, (y0 + y1) / 2, (z0 + z1) / 2] box.SetOrigin(cnt) box.scale([1 + padding, 1 + 2 * padding, 1]) acts.append(box) # pts = box.points() # bfaces = [] # for i, pt in enumerate(pts): # if i: # face = [i-1, i, 0] # bfaces.append(face) # bpts = [cnt] + pts.tolist() # box2 = vedo.Mesh([bpts, bfaces]).z(-cnt[0]/10)#.c('w').alpha(0.1) # #should be made assembly otherwise later merge() nullifies it # box2.SetOrigin(cnt) # acts.append(box2) x0, x1, y0, y1, z0, z1 = box.bounds() if x0 < pt[0] < x1: c0 = box.closest_point(pt) c1 = [c0[0], c0[1] + (pt[1] - y0) / 4, pt[2]] elif (pt[0] - x0) < (x1 - pt[0]): c0 = [x0, (y0 + y1) / 2, pt[2]] c1 = [x0 + (pt[0] - x0) / 4, (y0 + y1) / 2, pt[2]] else: c0 = [x1, (y0 + y1) / 2, pt[2]] c1 = [x1 + (pt[0] - x1) / 4, (y0 + y1) / 2, pt[2]] con = vedo.shapes.Line([c0, c1, pt]) acts.append(con) macts = vedo.merge(acts).c(c).alpha(alpha) macts.SetOrigin(pt) macts.bc("tomato").pickable(False) macts.GetProperty().LightingOff() macts.GetProperty().SetLineWidth(lw) macts.UseBoundsOff() macts.name = "FlagPole" return macts def flagpost( self, txt=None, point=None, offset=None, s=1.0, c="k9", bc="k1", alpha=1, lw=0, font="Calco", justify="center-left", vspacing=1.0, ): """ Generate a flag post style element to describe an object. Arguments: txt : (str) Text to display. The default is the filename or the object name. point : (list) position of the flag anchor point. The default is None. offset : (list) a 3D displacement or offset. The default is None. s : (float) size of the text to be shown c : (list) color of text and line bc : (list) color of the flag background alpha : (float) opacity of text and box. lw : (int) line with of box frame. The default is 0. font : (str) font name. Use a monospace font for better rendering. The default is "Calco". Type `vedo -r fonts` for a font demo. Check [available fonts here](https://vedo.embl.es/fonts). justify : (str) internal text justification. The default is "center-left". vspacing : (float) vertical spacing between lines. Examples: - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/other/flag_labels2.py) ![](https://vedo.embl.es/images/other/flag_labels2.png) """ if txt is None: if self.filename: txt = self.filename.split("/")[-1] elif self.name: txt = self.name else: return None x0, x1, y0, y1, z0, z1 = self.bounds() d = self.diagonal_size() if point is None: if d: point = self.closest_point([(x0 + x1) / 2, (y0 + y1) / 2, z1]) else: # it's a Point point = self.GetPosition() point = utils.make3d(point) if offset is None: offset = [0, 0, (z1 - z0) / 2] offset = utils.make3d(offset) fpost = vedo.addons.Flagpost( txt, point, point + offset, s, c, bc, alpha, lw, font, justify, vspacing ) self._caption = fpost return fpost def caption( self, txt=None, point=None, size=(0.30, 0.15), padding=5, font="Calco", justify="center-right", vspacing=1.0, c=None, alpha=1.0, lw=1, ontop=True, ): """ Add a 2D caption to an object which follows the camera movements. Latex is not supported. Returns the same input object for concatenation. See also `flagpole()`, `flagpost()`, `labels()` and `legend()` with similar functionality. Arguments: txt : (str) text to be rendered. The default is the file name. point : (list) anchoring point. The default is None. size : (list) (width, height) of the caption box. The default is (0.30, 0.15). padding : (float) padding space of the caption box in pixels. The default is 5. font : (str) font name. Use a monospace font for better rendering. The default is "VictorMono". Type `vedo -r fonts` for a font demo. Check [available fonts here](https://vedo.embl.es/fonts). justify : (str) internal text justification. The default is "center-right". vspacing : (float) vertical spacing between lines. The default is 1. c : (str) text and box color. The default is 'lb'. alpha : (float) text and box transparency. The default is 1. lw : (int) line width in pixels. The default is 1. ontop : (bool) keep the 2d caption always on top. The default is True. Examples: - [caption.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/caption.py) ![](https://vedo.embl.es/images/pyplot/caption.png) - [flag_labels1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels1.py) - [flag_labels2.py](https://github.com/marcomusy/vedo/tree/master/examples/other/flag_labels2.py) """ if txt is None: if self.filename: txt = self.filename.split("/")[-1] elif self.name: txt = self.name if not txt: # disable it self._caption = None return self for r in vedo.shapes._reps: txt = txt.replace(r[0], r[1]) if c is None: c = np.array(self.GetProperty().GetColor()) / 2 else: c = colors.get_color(c) if point is None: x0, x1, y0, y1, _, z1 = self.GetBounds() pt = [(x0 + x1) / 2, (y0 + y1) / 2, z1] point = self.closest_point(pt) capt = vtk.vtkCaptionActor2D() capt.SetAttachmentPoint(point) capt.SetBorder(True) capt.SetLeader(True) sph = vtk.vtkSphereSource() sph.Update() capt.SetLeaderGlyphData(sph.GetOutput()) capt.SetMaximumLeaderGlyphSize(5) capt.SetPadding(int(padding)) capt.SetCaption(txt) capt.SetWidth(size[0]) capt.SetHeight(size[1]) capt.SetThreeDimensionalLeader(not ontop) pra = capt.GetProperty() pra.SetColor(c) pra.SetOpacity(alpha) pra.SetLineWidth(lw) pr = capt.GetCaptionTextProperty() pr.SetFontFamily(vtk.VTK_FONT_FILE) fl = utils.get_font_path(font) pr.SetFontFile(fl) pr.ShadowOff() pr.BoldOff() pr.FrameOff() pr.SetColor(c) pr.SetOpacity(alpha) pr.SetJustificationToLeft() if "top" in justify: pr.SetVerticalJustificationToTop() if "bottom" in justify: pr.SetVerticalJustificationToBottom() if "cent" in justify: pr.SetVerticalJustificationToCentered() pr.SetJustificationToCentered() if "left" in justify: pr.SetJustificationToLeft() if "right" in justify: pr.SetJustificationToRight() pr.SetLineSpacing(vspacing) self._caption = capt return self @deprecated(reason=vedo.colors.red + "Please use align_to()" + vedo.colors.reset) def alignTo(self, *a, **b): "Deprecated, Please use `align_to()`." return self.align_to(*a, **b) def align_to(self, target, iters=100, rigid=False, invert=False, use_centroids=False): """ Aligned to target mesh through the `Iterative Closest Point` algorithm. The core of the algorithm is to match each vertex in one surface with the closest surface point on the other, then apply the transformation that modify one surface to best match the other (in the least-square sense). Arguments: rigid : (bool) if True do not allow scaling invert : (bool) if True start by aligning the target to the source but invert the transformation finally. Useful when the target is smaller than the source. use_centroids : (bool) start by matching the centroids of the two objects. Examples: - [align1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align1.py) ![](https://vedo.embl.es/images/basic/align1.png) - [align2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align2.py) ![](https://vedo.embl.es/images/basic/align2.png) """ icp = vtk.vtkIterativeClosestPointTransform() icp.SetSource(self.polydata()) icp.SetTarget(target.polydata()) if invert: icp.Inverse() icp.SetMaximumNumberOfIterations(iters) if rigid: icp.GetLandmarkTransform().SetModeToRigidBody() icp.SetStartByMatchingCentroids(use_centroids) icp.Update() M = icp.GetMatrix() if invert: M.Invert() # icp.GetInverse() doesnt work! # self.apply_transform(M) self.SetUserMatrix(M) self.transform = self.GetUserTransform() self.point_locator = None self.cell_locator = None self.pipeline = utils.OperationNode( "align_to", parents=[self, target], comment=f"rigid = {rigid}" ) return self def transform_with_landmarks( self, source_landmarks, target_landmarks, rigid=False, affine=False, least_squares=False ): """ Transform mesh orientation and position based on a set of landmarks points. The algorithm finds the best matching of source points to target points in the mean least square sense, in one single step. If affine is True the x, y and z axes can scale independently but stay collinear. With least_squares they can vary orientation. Examples: - [align5.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align5.py) ![](https://vedo.embl.es/images/basic/align5.png) """ if utils.is_sequence(source_landmarks): ss = vtk.vtkPoints() for p in source_landmarks: ss.InsertNextPoint(p) else: ss = source_landmarks.polydata().GetPoints() if least_squares: source_landmarks = source_landmarks.points() if utils.is_sequence(target_landmarks): st = vtk.vtkPoints() for p in target_landmarks: st.InsertNextPoint(p) else: st = target_landmarks.polydata().GetPoints() if least_squares: target_landmarks = target_landmarks.points() if ss.GetNumberOfPoints() != st.GetNumberOfPoints(): n1 = ss.GetNumberOfPoints() n2 = st.GetNumberOfPoints() vedo.logger.error(f"source and target have different nr of points {n1} vs {n2}") raise RuntimeError() lmt = vtk.vtkLandmarkTransform() lmt.SetSourceLandmarks(ss) lmt.SetTargetLandmarks(st) lmt.SetModeToSimilarity() if rigid: lmt.SetModeToRigidBody() lmt.Update() self.SetUserTransform(lmt) elif affine: lmt.SetModeToAffine() lmt.Update() self.SetUserTransform(lmt) elif least_squares: cms = source_landmarks.mean(axis=0) cmt = target_landmarks.mean(axis=0) m = np.linalg.lstsq(source_landmarks - cms, target_landmarks - cmt, rcond=None)[0] M = vtk.vtkMatrix4x4() for i in range(3): for j in range(3): M.SetElement(j, i, m[i][j]) lmt = vtk.vtkTransform() lmt.Translate(cmt) lmt.Concatenate(M) lmt.Translate(-cms) self.apply_transform(lmt, concatenate=True) else: self.SetUserTransform(lmt) self.transform = lmt self.point_locator = None self.cell_locator = None self.pipeline = utils.OperationNode("transform_with_landmarks", parents=[self]) return self @deprecated(reason=vedo.colors.red + "Please use apply_transform()" + vedo.colors.reset) def applyTransform(self, *a, **b): "Deprecated. Please use `apply_transform()`." return self.apply_transform(*a, **b) def apply_transform(self, T, reset=False, concatenate=False): """ Apply a linear or non-linear transformation to the mesh polygonal data. Arguments: T : (matrix) `vtkTransform`, `vtkMatrix4x4` or a 4x4 or 3x3 python or numpy matrix. reset : (bool) if True reset the current transformation matrix to identity after having moved the object, otherwise the internal matrix will stay the same (to only affect visualization). It the input transformation has no internal defined matrix (ie. non linear) then reset will be assumed as True. concatenate : (bool) concatenate the transformation with the current existing one Example: ```python from vedo import Cube, show c1 = Cube().rotate_z(5).x(2).y(1) print("cube1 position", c1.pos()) T = c1.get_transform() # rotate by 5 degrees, sum 2 to x and 1 to y c2 = Cube().c('r4') c2.apply_transform(T) # ignore previous movements c2.apply_transform(T, concatenate=True) c2.apply_transform(T, concatenate=True) print("cube2 position", c2.pos()) show(c1, c2, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/apply_transform.png) """ self.point_locator = None self.cell_locator = None if isinstance(T, vtk.vtkMatrix4x4): tr = vtk.vtkTransform() tr.SetMatrix(T) T = tr elif utils.is_sequence(T): M = vtk.vtkMatrix4x4() n = len(T[0]) for i in range(n): for j in range(n): M.SetElement(i, j, T[i][j]) tr = vtk.vtkTransform() tr.SetMatrix(M) T = tr if reset or not hasattr(T, "GetScale"): # might be non-linear tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(T) tf.SetInputData(self.polydata()) tf.Update() I = vtk.vtkMatrix4x4() self.PokeMatrix(I) # reset to identity self.SetUserTransform(None) self._update(tf.GetOutput()) ### UPDATE self.transform = T else: if concatenate: M = vtk.vtkTransform() M.PostMultiply() M.SetMatrix(self.GetMatrix()) M.Concatenate(T) self.SetScale(M.GetScale()) self.SetOrientation(M.GetOrientation()) self.SetPosition(M.GetPosition()) self.transform = M self.SetUserTransform(None) else: self.SetScale(T.GetScale()) self.SetOrientation(T.GetOrientation()) self.SetPosition(T.GetPosition()) self.SetUserTransform(None) self.transform = T return self def normalize(self): """Scale Mesh average size to unit.""" coords = self.points() if not coords.shape[0]: return self cm = np.mean(coords, axis=0) pts = coords - cm xyz2 = np.sum(pts * pts, axis=0) scale = 1 / np.sqrt(np.sum(xyz2) / len(pts)) t = vtk.vtkTransform() t.PostMultiply() # t.Translate(-cm) t.Scale(scale, scale, scale) # t.Translate(cm) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputData(self.inputdata()) tf.SetTransform(t) tf.Update() self.point_locator = None self.cell_locator = None return self._update(tf.GetOutput()) def mirror(self, axis="x", origin=(0, 0, 0), reset=False): """ Mirror the mesh along one of the cartesian axes Arguments: axis : (str) axis to use for mirroring, must be set to x, y, z or n. Or any combination of those. Adding 'n' reverses mesh faces (hence normals). origin : (list) use this point as the origin of the mirroring transformation. reset : (bool) if True keep into account the current position of the object, and then reset its internal transformation matrix to Identity. Examples: - [mirror.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mirror.py) ![](https://vedo.embl.es/images/basic/mirror.png) """ sx, sy, sz = 1, 1, 1 if "x" in axis.lower(): sx = -1 if "y" in axis.lower(): sy = -1 if "z" in axis.lower(): sz = -1 origin = np.array(origin) tr = vtk.vtkTransform() tr.PostMultiply() tr.Translate(-origin) tr.Scale(sx, sy, sz) tr.Translate(origin) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputData(self.polydata(reset)) tf.SetTransform(tr) tf.Update() outpoly = tf.GetOutput() if reset: self.PokeMatrix(vtk.vtkMatrix4x4()) # reset to identity if sx * sy * sz < 0 or "n" in axis: rs = vtk.vtkReverseSense() rs.SetInputData(outpoly) rs.ReverseNormalsOff() rs.Update() outpoly = rs.GetOutput() self.point_locator = None self.cell_locator = None out = self._update(outpoly) out.pipeline = utils.OperationNode(f"mirror\naxis = {axis}", parents=[self]) return out def shear(self, x=0, y=0, z=0): """Apply a shear deformation along one of the main axes""" t = vtk.vtkTransform() sx, sy, sz = self.GetScale() t.SetMatrix([sx, x, 0, 0, y,sy, z, 0, 0, 0,sz, 0, 0, 0, 0, 1]) self.apply_transform(t, reset=True) return self def flip_normals(self): """Flip all mesh normals. Same as `mesh.mirror('n')`.""" rs = vtk.vtkReverseSense() rs.SetInputData(self.inputdata()) rs.ReverseCellsOff() rs.ReverseNormalsOn() rs.Update() out = self._update(rs.GetOutput()) self.pipeline = utils.OperationNode("flip_normals", parents=[self]) return out ##################################################################################### def cmap( self, input_cmap, input_array=None, on="points", name="Scalars", vmin=None, vmax=None, n_colors=256, alpha=1.0, logscale=False, ): """ Set individual point/cell colors by providing a list of scalar values and a color map. Arguments: input_cmap : (str, list, vtkLookupTable, matplotlib.colors.LinearSegmentedColormap) color map scheme to transform a real number into a color. input_array : (str, list, vtkArray) can be the string name of an existing array, a numpy array or a `vtkArray`. on : (str) either 'points' or 'cells'. Apply the color map to data which is defined on either points or cells. name : (str) give a name to the provided numpy array (if input_array is a numpy array) vmin : (float) clip scalars to this minimum value vmax : (float) clip scalars to this maximum value n_colors : (int) number of distinct colors to be used in colormap table. alpha : (float, list) Mesh transparency. Can be a `list` of values one for each vertex. logscale : (bool) Use logscale Examples: - [mesh_coloring.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_coloring.py) - [mesh_alphas.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_alphas.py) - [mesh_custom.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/mesh_custom.py) (and many others) ![](https://vedo.embl.es/images/basic/mesh_custom.png) """ self._cmap_name = input_cmap poly = self.inputdata() if input_array is None: if not self.pointdata.keys() and self.celldata.keys(): on = "cells" if not poly.GetCellData().GetScalars(): input_array = 0 # pick the first at hand if on.startswith("point"): data = poly.GetPointData() n = poly.GetNumberOfPoints() elif on.startswith("cell"): data = poly.GetCellData() n = poly.GetNumberOfCells() else: vedo.logger.error("Must specify in cmap(on=...) to either 'cells' or 'points'") raise RuntimeError() if input_array is None: # if None try to fetch the active scalars arr = data.GetScalars() if not arr: vedo.logger.error(f"in cmap(), cannot find any {on} active array ...skip coloring.") return self if not arr.GetName(): # sometimes arrays dont have a name.. arr.SetName(name) elif isinstance(input_array, str): # if a string is passed arr = data.GetArray(input_array) if not arr: vedo.logger.error(f"in cmap(), cannot find {on} array {input_array} ...skip coloring.") return self elif isinstance(input_array, int): # if an int is passed if input_array < data.GetNumberOfArrays(): arr = data.GetArray(input_array) else: vedo.logger.error(f"in cmap(), cannot find {on} array at {input_array} ...skip coloring.") return self elif utils.is_sequence(input_array): # if a numpy array is passed npts = len(input_array) if npts != n: vedo.logger.error(f"in cmap(), nr. of input {on} scalars {npts} != {n} ...skip coloring.") return self arr = utils.numpy2vtk(input_array, name=name, dtype=float) data.AddArray(arr) data.Modified() elif isinstance(input_array, vtk.vtkArray): # if a vtkArray is passed arr = input_array data.AddArray(arr) data.Modified() else: vedo.logger.error(f"in cmap(), cannot understand input type {type(input_array)}") raise RuntimeError() # Now we have array "arr" array_name = arr.GetName() if arr.GetNumberOfComponents() == 1: if vmin is None: vmin = arr.GetRange()[0] if vmax is None: vmax = arr.GetRange()[1] else: if vmin is None or vmax is None: vn = utils.mag(utils.vtk2numpy(arr)) if vmin is None: vmin = vn.min() if vmax is None: vmax = vn.max() # interpolate alphas if they are not constant if not utils.is_sequence(alpha): alpha = [alpha] * n_colors else: v = np.linspace(0, 1, n_colors, endpoint=True) xp = np.linspace(0, 1, len(alpha), endpoint=True) alpha = np.interp(v, xp, alpha) ########################### build the look-up table if isinstance(input_cmap, vtk.vtkLookupTable): # vtkLookupTable lut = input_cmap elif utils.is_sequence(input_cmap): # manual sequence of colors lut = vtk.vtkLookupTable() if logscale: lut.SetScaleToLog10() lut.SetRange(vmin, vmax) ncols = len(input_cmap) lut.SetNumberOfTableValues(ncols) for i, c in enumerate(input_cmap): r, g, b = colors.get_color(c) lut.SetTableValue(i, r, g, b, alpha[i]) lut.Build() else: # assume string cmap name OR matplotlib.colors.LinearSegmentedColormap lut = vtk.vtkLookupTable() if logscale: lut.SetScaleToLog10() lut.SetVectorModeToMagnitude() lut.SetRange(vmin, vmax) lut.SetNumberOfTableValues(n_colors) mycols = colors.color_map(range(n_colors), input_cmap, 0, n_colors) for i, c in enumerate(mycols): r, g, b = c lut.SetTableValue(i, r, g, b, alpha[i]) lut.Build() arr.SetLookupTable(lut) data.SetActiveScalars(array_name) # data.SetScalars(arr) # wrong! it deletes array in position 0, never use SetScalars # data.SetActiveAttribute(array_name, 0) # boh! if data.GetScalars(): data.GetScalars().SetLookupTable(lut) data.GetScalars().Modified() self._mapper.SetLookupTable(lut) self._mapper.SetColorModeToMapScalars() # so we dont need to convert uint8 scalars self._mapper.ScalarVisibilityOn() self._mapper.SetScalarRange(lut.GetRange()) if on.startswith("point"): self._mapper.SetScalarModeToUsePointData() else: self._mapper.SetScalarModeToUseCellData() if hasattr(self._mapper, "SetArrayName"): self._mapper.SetArrayName(array_name) return self @deprecated(reason=vedo.colors.red + "Please use property mesh.cellcolors" + vedo.colors.reset) def cell_individual_colors(self, colorlist): self.cellcolors = colorlist return self @property def cellcolors(self): """ Colorize each cell (face) of a mesh by passing a 1-to-1 list of colors in format [R,G,B] or [R,G,B,A]. Colors levels and opacities must be in the range [0,255]. A single constant color can also be passed as string or RGBA. A cell array named "CellsRGBA" is automatically created. Examples: - [color_mesh_cells1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/color_mesh_cells1.py) - [color_mesh_cells2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/color_mesh_cells2.py) ![](https://vedo.embl.es/images/basic/colorMeshCells.png) """ if "CellsRGBA" not in self.celldata.keys(): lut = self.mapper().GetLookupTable() vscalars = self._data.GetCellData().GetScalars() if vscalars is None or lut is None: arr = np.zeros([self.ncells, 4], dtype=np.uint8) col = np.array(self.property.GetColor()) col = np.round(col * 255).astype(np.uint8) alf = self.property.GetOpacity() alf = np.round(alf * 255).astype(np.uint8) arr[:, (0, 1, 2)] = col arr[:, 3] = alf else: cols = lut.MapScalars(vscalars, 0, 0) arr = utils.vtk2numpy(cols) self.celldata["CellsRGBA"] = arr self.celldata.select("CellsRGBA") return self.celldata["CellsRGBA"] @cellcolors.setter def cellcolors(self, value): if isinstance(value, str): c = colors.get_color(value) value = np.array([*c, 1]) * 255 value = np.round(value) value = np.asarray(value) n = self.ncells if value.ndim == 1: value = np.repeat([value], n, axis=0) if value.shape[1] == 3: z = np.zeros((n, 1), dtype=np.uint8) value = np.append(value, z + 255, axis=1) assert n == value.shape[0] self.celldata["CellsRGBA"] = value.astype(np.uint8) self.celldata.select("CellsRGBA") @property def pointcolors(self): """ Colorize each point (or vertex of a mesh) by passing a 1-to-1 list of colors in format [R,G,B] or [R,G,B,A]. Colors levels and opacities must be in the range [0,255]. A single constant color can also be passed as string or RGBA. A point array named "PointsRGBA" is automatically created. """ if "PointsRGBA" not in self.pointdata.keys(): lut = self.mapper().GetLookupTable() vscalars = self._data.GetPointData().GetScalars() if vscalars is None or lut is None: arr = np.zeros([self.npoints, 4], dtype=np.uint8) col = np.array(self.property.GetColor()) col = np.round(col * 255).astype(np.uint8) alf = self.property.GetOpacity() alf = np.round(alf * 255).astype(np.uint8) arr[:, (0, 1, 2)] = col arr[:, 3] = alf else: cols = lut.MapScalars(vscalars, 0, 0) arr = utils.vtk2numpy(cols) self.pointdata["PointsRGBA"] = arr self.pointdata.select("PointsRGBA") return self.pointdata["PointsRGBA"] @pointcolors.setter def pointcolors(self, value): if isinstance(value, str): c = colors.get_color(value) value = np.array([*c, 1]) * 255 value = np.round(value) value = np.asarray(value) n = self.npoints if value.ndim == 1: value = np.repeat([value], n, axis=0) if value.shape[1] == 3: z = np.zeros((n, 1), dtype=np.uint8) value = np.append(value, z + 255, axis=1) assert n == value.shape[0] self.pointdata["PointsRGBA"] = value.astype(np.uint8) self.pointdata.select("PointsRGBA") def interpolate_data_from( self, source, radius=None, n=None, kernel="shepard", exclude=("Normals",), on="points", null_strategy=1, null_value=0, ): """ Interpolate over source to port its data onto the current object using various kernels. If n (number of closest points to use) is set then radius value is ignored. Arguments: kernel : (str) available kernels are [shepard, gaussian, linear] null_strategy : (int) specify a strategy to use when encountering a "null" point during the interpolation process. Null points occur when the local neighborhood (of nearby points to interpolate from) is empty. - Case 0: an output array is created that marks points as being valid (=1) or null (invalid =0), and the null_value is set as well - Case 1: the output data value(s) are set to the provided null_value - Case 2: simply use the closest point to perform the interpolation. null_value : (float) see above. Examples: - [interpolateMeshArray.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/interpolateMeshArray.py) ![](https://vedo.embl.es/images/advanced/interpolateMeshArray.png) """ if radius is None and not n: vedo.logger.error("in interpolate_data_from(): please set either radius or n") raise RuntimeError if on == "points": points = source.polydata() elif on == "cells": poly2 = vtk.vtkPolyData() poly2.ShallowCopy(source.polydata()) c2p = vtk.vtkCellDataToPointData() c2p.SetInputData(poly2) c2p.Update() points = c2p.GetOutput() else: vedo.logger.error("in interpolate_data_from(), on must be on points or cells") raise RuntimeError() locator = vtk.vtkPointLocator() locator.SetDataSet(points) locator.BuildLocator() if kernel.lower() == "shepard": kern = vtk.vtkShepardKernel() kern.SetPowerParameter(2) elif kernel.lower() == "gaussian": kern = vtk.vtkGaussianKernel() kern.SetSharpness(2) elif kernel.lower() == "linear": kern = vtk.vtkLinearKernel() else: vedo.logger.error("available kernels are: [shepard, gaussian, linear]") raise RuntimeError() if n: kern.SetNumberOfPoints(n) kern.SetKernelFootprintToNClosest() else: kern.SetRadius(radius) interpolator = vtk.vtkPointInterpolator() interpolator.SetInputData(self.polydata()) interpolator.SetSourceData(points) interpolator.SetKernel(kern) interpolator.SetLocator(locator) interpolator.PassFieldArraysOff() interpolator.SetNullPointsStrategy(null_strategy) interpolator.SetNullValue(null_value) interpolator.SetValidPointsMaskArrayName("ValidPointMask") for ex in exclude: interpolator.AddExcludedArray(ex) interpolator.Update() if on == "cells": p2c = vtk.vtkPointDataToCellData() p2c.SetInputData(interpolator.GetOutput()) p2c.Update() cpoly = p2c.GetOutput() else: cpoly = interpolator.GetOutput() if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: self._update(cpoly) else: # bring the underlying polydata to where _data is M = vtk.vtkMatrix4x4() M.DeepCopy(self.GetMatrix()) M.Invert() tr = vtk.vtkTransform() tr.SetMatrix(M) tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(tr) tf.SetInputData(cpoly) tf.Update() self._update(tf.GetOutput()) self.pipeline = utils.OperationNode("interpolate_data_from", parents=[self, source]) return self def add_gaussian_noise(self, sigma=1.0): """ Add gaussian noise to point positions. An extra array is added named "GaussianNoise" with the shifts. Arguments: sigma : (float) nr. of standard deviations, expressed in percent of the diagonal size of mesh. Can also be a list [sigma_x, sigma_y, sigma_z]. Examples: ```python from vedo import Sphere Sphere().add_gaussian_noise(1.0).point_size(8).show().close() ``` """ sz = self.diagonal_size() pts = self.points() n = len(pts) ns = (np.random.randn(n, 3) * sigma) * (sz / 100) vpts = vtk.vtkPoints() vpts.SetNumberOfPoints(n) vpts.SetData(utils.numpy2vtk(pts + ns, dtype=np.float32)) self.inputdata().SetPoints(vpts) self.inputdata().GetPoints().Modified() self.pointdata["GaussianNoise"] = -ns self.pipeline = utils.OperationNode( "gaussian_noise", parents=[self], shape="egg", comment=f"sigma = {sigma}" ) return self @deprecated(reason=vedo.colors.red + "Please use closest_point()" + vedo.colors.reset) def closestPoint(self, pt, N=1, radius=None, returnPointId=False, returnCellId=False): "Deprecated. Please use `closest_point()`." return self.closest_point(pt, N, radius, returnPointId, returnCellId) def closest_point(self, pt, n=1, radius=None, return_point_id=False, return_cell_id=False): """ Find the closest point(s) on a mesh given from the input point `pt`. Arguments: n : (int) if greater than 1, return a list of n ordered closest points radius : (float) if given, get all points within that radius. Then n is ignored. return_point_id : (bool) return point ID instead of coordinates return_cell_id : (bool) return cell ID in which the closest point sits Examples: - [align1.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/align1.py) - [fitplanes.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/fitplanes.py) - [quadratic_morphing.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/quadratic_morphing.py) .. note:: The appropriate tree search locator is built on the fly and cached for speed. If you want to reset it use `mymesh.point_locator=None` """ # NB: every time the mesh moves or is warped the locators are set to None if (n > 1 or radius) or (n == 1 and return_point_id): poly = None if not self.point_locator: poly = self.polydata() self.point_locator = vtk.vtkStaticPointLocator() self.point_locator.SetDataSet(poly) self.point_locator.BuildLocator() ########## if radius: vtklist = vtk.vtkIdList() self.point_locator.FindPointsWithinRadius(radius, pt, vtklist) elif n > 1: vtklist = vtk.vtkIdList() self.point_locator.FindClosestNPoints(n, pt, vtklist) else: # n==1 hence return_point_id==True ######## return self.point_locator.FindClosestPoint(pt) ######## if return_point_id: ######## return utils.vtk2numpy(vtklist) ######## if not poly: poly = self.polydata() trgp = [] for i in range(vtklist.GetNumberOfIds()): trgp_ = [0, 0, 0] vi = vtklist.GetId(i) poly.GetPoints().GetPoint(vi, trgp_) trgp.append(trgp_) ######## return np.array(trgp) ######## else: if not self.cell_locator: poly = self.polydata() # As per Miquel example with limbs the vtkStaticCellLocator doesnt work !! # https://discourse.vtk.org/t/vtkstaticcelllocator-problem-vtk9-0-3/7854/4 if vedo.vtk_version[0] >= 9 and vedo.vtk_version[0] > 0: self.cell_locator = vtk.vtkStaticCellLocator() else: self.cell_locator = vtk.vtkCellLocator() self.cell_locator.SetDataSet(poly) self.cell_locator.BuildLocator() trgp = [0, 0, 0] cid = vtk.mutable(0) dist2 = vtk.mutable(0) subid = vtk.mutable(0) self.cell_locator.FindClosestPoint(pt, trgp, cid, subid, dist2) if return_cell_id: return int(cid) return np.array(trgp) def hausdorff_distance(self, points): """ Compute the Hausdorff distance to the input point set. Returns a single `float`. Example: ```python from vedo import * t = np.linspace(0, 2*np.pi, 100) x = 4/3 * sin(t)**3 y = cos(t) - cos(2*t)/3 - cos(3*t)/6 - cos(4*t)/12 pol1 = Line(np.c_[x,y], closed=True).triangulate() pol2 = Polygon(nsides=5).pos(2,2) d12 = pol1.distance_to(pol2) d21 = pol2.distance_to(pol1) pol1.lw(0).cmap("viridis") pol2.lw(0).cmap("viridis") print("distance d12, d21 :", min(d12), min(d21)) print("hausdorff distance:", pol1.hausdorff_distance(pol2)) print("chamfer distance :", pol1.chamfer_distance(pol2)) show(pol1, pol2, axes=1) ``` ![](https://vedo.embl.es/images/feats/heart.png) """ hp = vtk.vtkHausdorffDistancePointSetFilter() hp.SetInputData(0, self.polydata()) hp.SetInputData(1, points.polydata()) hp.SetTargetDistanceMethodToPointToCell() hp.Update() return hp.GetHausdorffDistance() def chamfer_distance(self, pcloud): """ Compute the Chamfer distance to the input point set. Returns a single `float`. """ if not pcloud.point_locator: pcloud.point_locator = vtk.vtkPointLocator() pcloud.point_locator.SetDataSet(pcloud.polydata()) pcloud.point_locator.BuildLocator() if not self.point_locator: self.point_locator = vtk.vtkPointLocator() self.point_locator.SetDataSet(self.polydata()) self.point_locator.BuildLocator() ps1 = self.points() ps2 = pcloud.points() ids12 = [] for p in ps1: pid12 = pcloud.point_locator.FindClosestPoint(p) ids12.append(pid12) deltav = ps2[ids12] - ps1 da = np.mean(np.linalg.norm(deltav, axis=1)) ids21 = [] for p in ps2: pid21 = self.point_locator.FindClosestPoint(p) ids21.append(pid21) deltav = ps1[ids21] - ps2 db = np.mean(np.linalg.norm(deltav, axis=1)) return (da + db) / 2 def remove_outliers(self, radius, neighbors=5): """ Remove outliers from a cloud of points within the specified `radius` search. Arguments: radius : (float) Specify the local search radius. neighbors : (int) Specify the number of neighbors that a point must have, within the specified radius, for the point to not be considered isolated. Examples: - [clustering.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/clustering.py) ![](https://vedo.embl.es/images/basic/clustering.png) """ removal = vtk.vtkRadiusOutlierRemoval() removal.SetInputData(self.polydata()) removal.SetRadius(radius) removal.SetNumberOfNeighbors(neighbors) removal.GenerateOutliersOff() removal.Update() inputobj = removal.GetOutput() if inputobj.GetNumberOfCells() == 0: carr = vtk.vtkCellArray() for i in range(inputobj.GetNumberOfPoints()): carr.InsertNextCell(1) carr.InsertCellPoint(i) inputobj.SetVerts(carr) self._update(inputobj) self.mapper().ScalarVisibilityOff() self.pipeline = utils.OperationNode("remove_outliers", parents=[self]) return self def smooth_mls_1d(self, f=0.2, radius=None): """ Smooth mesh or points with a `Moving Least Squares` variant. The point data array "Variances" will contain the residue calculated for each point. Input mesh's polydata is modified. Arguments: f : (float) smoothing factor - typical range is [0,2]. radius : (float) radius search in absolute units. If set then `f` is ignored. Examples: - [moving_least_squares1D.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/moving_least_squares1D.py) - [skeletonize.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/skeletonize.py) ![](https://vedo.embl.es/images/advanced/moving_least_squares1D.png) """ coords = self.points() ncoords = len(coords) if radius: Ncp = 0 else: Ncp = int(ncoords * f / 10) if Ncp < 5: vedo.logger.warning(f"Please choose a fraction higher than {f}") Ncp = 5 variances, newline = [], [] for p in coords: points = self.closest_point(p, n=Ncp, radius=radius) if len(points) < 4: continue points = np.array(points) pointsmean = points.mean(axis=0) # plane center _, dd, vv = np.linalg.svd(points - pointsmean) newp = np.dot(p - pointsmean, vv[0]) * vv[0] + pointsmean variances.append(dd[1] + dd[2]) newline.append(newp) vdata = utils.numpy2vtk(np.array(variances)) vdata.SetName("Variances") self.inputdata().GetPointData().AddArray(vdata) self.inputdata().GetPointData().Modified() self.points(newline) self.pipeline = utils.OperationNode("smooth_mls_1d", parents=[self]) return self def smooth_mls_2d(self, f=0.2, radius=None): """ Smooth mesh or points with a `Moving Least Squares` algorithm variant. The list `mesh.info['variances']` contains the residue calculated for each point. When a radius is specified points that are isolated will not be moved and will get a False entry in array `mesh.info['is_valid']`. Arguments: f : (float) smoothing factor - typical range is [0,2]. radius : (float) radius search in absolute units. If set then `f` is ignored. Examples: - [moving_least_squares2D.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/moving_least_squares2D.py) - [recosurface.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/recosurface.py) ![](https://vedo.embl.es/images/advanced/recosurface.png) """ coords = self.points() ncoords = len(coords) if radius: Ncp = 1 else: Ncp = int(ncoords * f / 100) if Ncp < 4: vedo.logger.error(f"MLS2D: Please choose a fraction higher than {f}") Ncp = 4 variances, newpts, valid = [], [], [] pb = None if ncoords > 10000: pb = utils.ProgressBar(0, ncoords) for p in coords: if pb: pb.print("smoothMLS2D working ...") pts = self.closest_point(p, n=Ncp, radius=radius) if len(pts) > 3: ptsmean = pts.mean(axis=0) # plane center _, dd, vv = np.linalg.svd(pts - ptsmean) cv = np.cross(vv[0], vv[1]) t = (np.dot(cv, ptsmean) - np.dot(cv, p)) / np.dot(cv, cv) newp = p + cv * t newpts.append(newp) variances.append(dd[2]) if radius: valid.append(True) else: newpts.append(p) variances.append(0) if radius: valid.append(False) self.info["variances"] = np.array(variances) self.info["is_valid"] = np.array(valid) self.points(newpts) self.pipeline = utils.OperationNode("smooth_mls_2d", parents=[self]) return self def smooth_lloyd_2d(self, iterations=2, bounds=None, options="Qbb Qc Qx"): """Lloyd relaxation of a 2D pointcloud.""" # Credits: https://hatarilabs.com/ih-en/ # tutorial-to-create-a-geospatial-voronoi-sh-mesh-with-python-scipy-and-geopandas from scipy.spatial import Voronoi as scipy_voronoi def _constrain_points(points): # Update any points that have drifted beyond the boundaries of this space if bounds is not None: for point in points: if point[0] < bounds[0]: point[0] = bounds[0] if point[0] > bounds[1]: point[0] = bounds[1] if point[1] < bounds[2]: point[1] = bounds[2] if point[1] > bounds[3]: point[1] = bounds[3] return points def _find_centroid(vertices): # The equation for the method used here to find the centroid of a # 2D polygon is given here: https://en.wikipedia.org/wiki/Centroid#Of_a_polygon area = 0 centroid_x = 0 centroid_y = 0 for i in range(len(vertices) - 1): step = (vertices[i, 0] * vertices[i + 1, 1]) - (vertices[i + 1, 0] * vertices[i, 1]) centroid_x += (vertices[i, 0] + vertices[i + 1, 0]) * step centroid_y += (vertices[i, 1] + vertices[i + 1, 1]) * step area += step if area: centroid_x = (1.0 / (3.0 * area)) * centroid_x centroid_y = (1.0 / (3.0 * area)) * centroid_y # prevent centroids from escaping bounding box return _constrain_points([[centroid_x, centroid_y]])[0] def _relax(voron): # Moves each point to the centroid of its cell in the voronoi # map to "relax" the points (i.e. jitter the points so as # to spread them out within the space). centroids = [] for idx in voron.point_region: # the region is a series of indices into voronoi.vertices # remove point at infinity, designated by index -1 region = [i for i in voron.regions[idx] if i != -1] # enclose the polygon region = region + [region[0]] verts = voron.vertices[region] # find the centroid of those vertices centroids.append(_find_centroid(verts)) return _constrain_points(centroids) if bounds is None: bounds = self.bounds() pts = self.points()[:, (0, 1)] for i in range(iterations): vor = scipy_voronoi(pts, qhull_options=options) _constrain_points(vor.vertices) pts = _relax(vor) # m = vedo.Mesh([pts, self.faces()]) # not yet working properly out = Points(pts, c="k") out.pipeline = utils.OperationNode("smooth_lloyd", parents=[self]) return out def project_on_plane(self, plane="z", point=None, direction=None): """ Project the mesh on one of the Cartesian planes. Arguments: plane : (str, Plane) if plane is `str`, plane can be one of ['x', 'y', 'z'], represents x-plane, y-plane and z-plane, respectively. Otherwise, plane should be an instance of `vedo.shapes.Plane`. point : (float, array) if plane is `str`, point should be a float represents the intercept. Otherwise, point is the camera point of perspective projection direction : (array) direction of oblique projection Note: Parameters `point` and `direction` are only used if the given plane is an instance of `vedo.shapes.Plane`. And one of these two params should be left as `None` to specify the projection type. Example: ```python s.project_on_plane(plane='z') # project to z-plane plane = Plane(pos=(4, 8, -4), normal=(-1, 0, 1), s=(5,5)) s.project_on_plane(plane=plane) # orthogonal projection s.project_on_plane(plane=plane, point=(6, 6, 6)) # perspective projection s.project_on_plane(plane=plane, direction=(1, 2, -1)) # oblique projection ``` Examples: - [silhouette2.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/silhouette2.py) ![](https://vedo.embl.es/images/basic/silhouette2.png) """ coords = self.points() if plane == "x": coords[:, 0] = self.GetOrigin()[0] intercept = self.xbounds()[0] if point is None else point self.x(intercept) elif plane == "y": coords[:, 1] = self.GetOrigin()[1] intercept = self.ybounds()[0] if point is None else point self.y(intercept) elif plane == "z": coords[:, 2] = self.GetOrigin()[2] intercept = self.zbounds()[0] if point is None else point self.z(intercept) elif isinstance(plane, vedo.shapes.Plane): normal = plane.normal / np.linalg.norm(plane.normal) pl = np.hstack((normal, -np.dot(plane.pos(), normal))).reshape(4, 1) if direction is None and point is None: # orthogonal projection pt = np.hstack((normal, [0])).reshape(4, 1) # proj_mat = pt.T @ pl * np.eye(4) - pt @ pl.T # python3 only proj_mat = np.matmul(pt.T, pl) * np.eye(4) - np.matmul(pt, pl.T) elif direction is None: # perspective projection pt = np.hstack((np.array(point), [1])).reshape(4, 1) # proj_mat = pt.T @ pl * np.eye(4) - pt @ pl.T proj_mat = np.matmul(pt.T, pl) * np.eye(4) - np.matmul(pt, pl.T) elif point is None: # oblique projection pt = np.hstack((np.array(direction), [0])).reshape(4, 1) # proj_mat = pt.T @ pl * np.eye(4) - pt @ pl.T proj_mat = np.matmul(pt.T, pl) * np.eye(4) - np.matmul(pt, pl.T) coords = np.concatenate([coords, np.ones((coords.shape[:-1] + (1,)))], axis=-1) # coords = coords @ proj_mat.T coords = np.matmul(coords, proj_mat.T) coords = coords[:, :3] / coords[:, 3:] else: vedo.logger.error(f"unknown plane {plane}") raise RuntimeError() self.alpha(0.1) self.points(coords) return self def warp(self, source, target, sigma=1.0, mode="3d"): """ `Thin Plate Spline` transformations describe a nonlinear warp transform defined by a set of source and target landmarks. Any point on the mesh close to a source landmark will be moved to a place close to the corresponding target landmark. The points in between are interpolated smoothly using Bookstein's Thin Plate Spline algorithm. Transformation object can be accessed with `mesh.transform`. Arguments: sigma : (float) specify the 'stiffness' of the spline. mode : (str) set the basis function to either abs(R) (for 3d) or R2LogR (for 2d meshes) Examples: - [interpolate_field.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/interpolate_field.py) - [warp1.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/warp1.py) - [warp2.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/warp2.py) ![](https://vedo.embl.es/images/advanced/warp2.png) """ parents = [self] if isinstance(source, Points): parents.append(source) source = source.points() else: source = utils.make3d(source) if isinstance(target, Points): parents.append(target) target = target.points() else: target = utils.make3d(target) ns = len(source) ptsou = vtk.vtkPoints() ptsou.SetNumberOfPoints(ns) for i in range(ns): ptsou.SetPoint(i, source[i]) nt = len(target) if ns != nt: vedo.logger.error(f"#source {ns} != {nt} #target points") raise RuntimeError() pttar = vtk.vtkPoints() pttar.SetNumberOfPoints(nt) for i in range(ns): pttar.SetPoint(i, target[i]) T = vtk.vtkThinPlateSplineTransform() if mode.lower() == "3d": T.SetBasisToR() elif mode.lower() == "2d": T.SetBasisToR2LogR() else: vedo.logger.error(f"unknown mode {mode}") raise RuntimeError() T.SetSigma(sigma) T.SetSourceLandmarks(ptsou) T.SetTargetLandmarks(pttar) self.transform = T self.apply_transform(T, reset=True) self.pipeline = utils.OperationNode("warp", parents=parents) return self def cut_with_plane(self, origin=(0, 0, 0), normal=(1, 0, 0), invert=False): """ Cut the mesh with the plane defined by a point and a normal. Arguments: origin : (array) the cutting plane goes through this point normal : (array) normal of the cutting plane Example: ```python from vedo import Cube cube = Cube().cut_with_plane(normal=(1,1,1)) cube.back_color('pink').show() ``` ![](https://vedo.embl.es/images/feats/cut_with_plane_cube.png) Examples: - [trail.py](https://github.com/marcomusy/vedo/blob/master/examples/simulations/trail.py) ![](https://vedo.embl.es/images/simulations/trail.gif) Check out also: `cut_with_box()`, `cut_with_cylinder()`, `cut_with_sphere()`. """ s = str(normal) if "x" in s: normal = (1, 0, 0) if "-" in s: normal = -np.array(normal) elif "y" in s: normal = (0, 1, 0) if "-" in s: normal = -np.array(normal) elif "z" in s: normal = (0, 0, 1) if "-" in s: normal = -np.array(normal) plane = vtk.vtkPlane() plane.SetOrigin(origin) plane.SetNormal(normal) clipper = vtk.vtkClipPolyData() clipper.SetInputData(self.polydata(True)) # must be True clipper.SetClipFunction(plane) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetInsideOut(invert) clipper.SetValue(0) clipper.Update() cpoly = clipper.GetOutput() if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: self._update(cpoly) else: # bring the underlying polydata to where _data is M = vtk.vtkMatrix4x4() M.DeepCopy(self.GetMatrix()) M.Invert() tr = vtk.vtkTransform() tr.SetMatrix(M) tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(tr) tf.SetInputData(cpoly) tf.Update() self._update(tf.GetOutput()) self.pipeline = utils.OperationNode("cut_with_plane", parents=[self]) return self def cut_with_planes(self, origins, normals, invert=False): """ Cut the mesh with a convex set of planes defined by points and normals. Arguments: origins : (array) each cutting plane goes through this point normals : (array) normal of each of the cutting planes Check out also: `cut_with_box()`, `cut_with_cylinder()`, `cut_with_sphere()` """ vpoints = vtk.vtkPoints() for p in utils.make3d(origins): vpoints.InsertNextPoint(p) normals = utils.make3d(normals) planes = vtk.vtkPlanes() planes.SetPoints(vpoints) planes.SetNormals(utils.numpy2vtk(normals, dtype=float)) clipper = vtk.vtkClipPolyData() clipper.SetInputData(self.polydata(True)) # must be True clipper.SetInsideOut(invert) clipper.SetClipFunction(planes) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() cpoly = clipper.GetOutput() if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: self._update(cpoly) else: # bring the underlying polydata to where _data is M = vtk.vtkMatrix4x4() M.DeepCopy(self.GetMatrix()) M.Invert() tr = vtk.vtkTransform() tr.SetMatrix(M) tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(tr) tf.SetInputData(cpoly) tf.Update() self._update(tf.GetOutput()) self.pipeline = utils.OperationNode("cut_with_planes", parents=[self]) return self def cut_with_box(self, bounds, invert=False): """ Cut the current mesh with a box or a set of boxes. This is much faster than `cut_with_mesh()`. Input `bounds` can be either: - a Mesh or Points object - a list of 6 number representing a bounding box `[xmin,xmax, ymin,ymax, zmin,zmax]` - a list of bounding boxes like the above: `[[xmin1,...], [xmin2,...], ...]` Example: ```python from vedo import Sphere, Cube, show mesh = Sphere(r=1, res=50) box = Cube(side=1.5).wireframe() mesh.cut_with_box(box) show(mesh, box, axes=1) ``` ![](https://vedo.embl.es/images/feats/cut_with_box_cube.png) Check out also: `cut_with_line()`, `cut_with_plane()`, `cut_with_cylinder()` """ if isinstance(bounds, Points): bounds = bounds.bounds() box = vtk.vtkBox() if utils.is_sequence(bounds[0]): for bs in bounds: box.AddBounds(bs) else: box.SetBounds(bounds) clipper = vtk.vtkClipPolyData() clipper.SetInputData(self.polydata(True)) # must be True clipper.SetClipFunction(box) clipper.SetInsideOut(not invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() cpoly = clipper.GetOutput() if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: self._update(cpoly) else: # bring the underlying polydata to where _data is M = vtk.vtkMatrix4x4() M.DeepCopy(self.GetMatrix()) M.Invert() tr = vtk.vtkTransform() tr.SetMatrix(M) tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(tr) tf.SetInputData(cpoly) tf.Update() self._update(tf.GetOutput()) self.pipeline = utils.OperationNode("cut_with_box", parents=[self]) return self def cut_with_line(self, points, invert=False, closed=True): """ Cut the current mesh with a line vertically in the z-axis direction like a cookie cutter. The polyline is defined by a set of points (z-coordinates are ignored). This is much faster than `cut_with_mesh()`. Check out also: `cut_with_box()`, `cut_with_plane()`, `cut_with_sphere()` """ pplane = vtk.vtkPolyPlane() if isinstance(points, Points): points = points.points().tolist() if closed: if isinstance(points, np.ndarray): points = points.tolist() points.append(points[0]) vpoints = vtk.vtkPoints() for p in points: if len(p) == 2: p = [p[0], p[1], 0.0] vpoints.InsertNextPoint(p) n = len(points) polyline = vtk.vtkPolyLine() polyline.Initialize(n, vpoints) polyline.GetPointIds().SetNumberOfIds(n) for i in range(n): polyline.GetPointIds().SetId(i, i) pplane.SetPolyLine(polyline) clipper = vtk.vtkClipPolyData() clipper.SetInputData(self.polydata(True)) # must be True clipper.SetClipFunction(pplane) clipper.SetInsideOut(invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() cpoly = clipper.GetOutput() if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: self._update(cpoly) else: # bring the underlying polydata to where _data is M = vtk.vtkMatrix4x4() M.DeepCopy(self.GetMatrix()) M.Invert() tr = vtk.vtkTransform() tr.SetMatrix(M) tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(tr) tf.SetInputData(cpoly) tf.Update() self._update(tf.GetOutput()) self.pipeline = utils.OperationNode("cut_with_line", parents=[self]) return self def cut_with_cookiecutter(self, lines): """ Cut the current mesh with a single line or a set of lines. Input `lines` can be either: - a `Mesh` or `Points` object - a list of 3D points: `[(x1,y1,z1), (x2,y2,z2), ...]` - a list of 2D points: `[(x1,y1), (x2,y2), ...]` Example: ```python from vedo import * grid = Mesh(dataurl + "dolfin_fine.vtk") grid.compute_quality().cmap("Greens") pols = merge( Polygon(nsides=10, r=0.3).pos(0.7, 0.3), Polygon(nsides=10, r=0.2).pos(0.3, 0.7), ) lines = pols.boundaries() grid.cut_with_cookiecutter(lines) show(grid, lines, axes=8, bg='blackboard').close() ``` ![](https://vedo.embl.es/images/feats/cookiecutter.png) Check out also: `cut_with_line()` and `cut_with_point_loop()` Note: In case of a warning message like: "Mesh and trim loop point data attributes are different" consider interpolating the mesh point data to the loop points, Eg. (in the above example): ```python lines = pols.boundaries().interpolate_data_from(grid, n=2) ``` Note: trying to invert the selection by reversing the loop order will have no effect in this method, hence it does not have the `invert` option. """ if utils.is_sequence(lines): lines = utils.make3d(lines) iline = list(range(len(lines))) + [0] poly = utils.buildPolyData(lines, lines=[iline]) else: poly = lines.polydata() # if invert: # not working # rev = vtk.vtkReverseSense() # rev.ReverseCellsOn() # rev.SetInputData(poly) # rev.Update() # poly = rev.GetOutput() # Build loops from the polyline build_loops = vtk.vtkContourLoopExtraction() build_loops.SetInputData(poly) build_loops.Update() boundaryPoly = build_loops.GetOutput() ccut = vtk.vtkCookieCutter() ccut.SetInputData(self.polydata()) ccut.SetLoopsData(boundaryPoly) ccut.SetPointInterpolationToMeshEdges() # ccut.SetPointInterpolationToLoopEdges() ccut.PassCellDataOn() # ccut.PassPointDataOn() ccut.Update() cpoly = ccut.GetOutput() if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: self._update(cpoly) else: # bring the underlying polydata to where _data is M = vtk.vtkMatrix4x4() M.DeepCopy(self.GetMatrix()) M.Invert() tr = vtk.vtkTransform() tr.SetMatrix(M) tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(tr) tf.SetInputData(cpoly) tf.Update() self._update(tf.GetOutput()) self.pipeline = utils.OperationNode("cut_with_cookiecutter", parents=[self]) return self def cut_with_cylinder(self, center=(0, 0, 0), axis=(0, 0, 1), r=1, invert=False): """ Cut the current mesh with an infinite cylinder. This is much faster than `cut_with_mesh()`. Arguments: center : (array) the center of the cylinder normal : (array) direction of the cylinder axis r : (float) radius of the cylinder Example: ```python from vedo import Disc, show disc = Disc(r1=1, r2=1.2) mesh = disc.extrude(3, res=50).linewidth(1) mesh.cut_with_cylinder([0,0,2], r=0.4, axis='y', invert=True) show(mesh, axes=1) ``` ![](https://vedo.embl.es/images/feats/cut_with_cylinder.png) Examples: - [optics_main1.py](https://github.com/marcomusy/vedo/blob/master/examples/simulations/optics_main1.py) Check out also: `cut_with_box()`, `cut_with_plane()`, `cut_with_sphere()` """ s = str(axis) if "x" in s: axis = (1, 0, 0) elif "y" in s: axis = (0, 1, 0) elif "z" in s: axis = (0, 0, 1) cyl = vtk.vtkCylinder() cyl.SetCenter(center) cyl.SetAxis(axis[0], axis[1], axis[2]) cyl.SetRadius(r) clipper = vtk.vtkClipPolyData() clipper.SetInputData(self.polydata(True)) # must be True clipper.SetClipFunction(cyl) clipper.SetInsideOut(not invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() cpoly = clipper.GetOutput() if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: self._update(cpoly) else: # bring the underlying polydata to where _data is M = vtk.vtkMatrix4x4() M.DeepCopy(self.GetMatrix()) M.Invert() tr = vtk.vtkTransform() tr.SetMatrix(M) tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(tr) tf.SetInputData(cpoly) tf.Update() self._update(tf.GetOutput()) self.pipeline = utils.OperationNode("cut_with_cylinder", parents=[self]) return self def cut_with_sphere(self, center=(0, 0, 0), r=1.0, invert=False): """ Cut the current mesh with an sphere. This is much faster than `cut_with_mesh()`. Arguments: center : (array) the center of the sphere r : (float) radius of the sphere Example: ```python from vedo import Disc, show disc = Disc(r1=1, r2=1.2) mesh = disc.extrude(3, res=50).linewidth(1) mesh.cut_with_sphere([1,-0.7,2], r=1.5, invert=True) show(mesh, axes=1) ``` ![](https://vedo.embl.es/images/feats/cut_with_sphere.png) Check out also: `cut_with_box()`, `cut_with_plane()`, `cut_with_cylinder()` """ sph = vtk.vtkSphere() sph.SetCenter(center) sph.SetRadius(r) clipper = vtk.vtkClipPolyData() clipper.SetInputData(self.polydata(True)) # must be True clipper.SetClipFunction(sph) clipper.SetInsideOut(not invert) clipper.GenerateClippedOutputOff() clipper.GenerateClipScalarsOff() clipper.SetValue(0) clipper.Update() cpoly = clipper.GetOutput() if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: self._update(cpoly) else: # bring the underlying polydata to where _data is M = vtk.vtkMatrix4x4() M.DeepCopy(self.GetMatrix()) M.Invert() tr = vtk.vtkTransform() tr.SetMatrix(M) tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(tr) tf.SetInputData(cpoly) tf.Update() self._update(tf.GetOutput()) self.pipeline = utils.OperationNode("cut_with_sphere", parents=[self]) return self def cut_with_mesh(self, mesh, invert=False, keep=False): """ Cut an `Mesh` mesh with another `Mesh`. Use `invert` to invert the selection. Use `keep` to keep the cutoff part, in this case an `Assembly` is returned: the "cut" object and the "discarded" part of the original object. You can access both via `assembly.unpack()` method. Example: ```python from vedo import * arr = np.random.randn(100000, 3)/2 pts = Points(arr).c('red3').pos(5,0,0) cube = Cube().pos(4,0.5,0) assem = pts.cut_with_mesh(cube, keep=True) show(assem.unpack(), axes=1).close() ``` ![](https://vedo.embl.es/images/feats/cut_with_mesh.png) Check out also: `cut_with_box()`, `cut_with_plane()`, `cut_with_cylinder()` """ polymesh = mesh.polydata() poly = self.polydata() # Create an array to hold distance information signed_distances = vtk.vtkFloatArray() signed_distances.SetNumberOfComponents(1) signed_distances.SetName("SignedDistances") # implicit function that will be used to slice the mesh ippd = vtk.vtkImplicitPolyDataDistance() ippd.SetInput(polymesh) # Evaluate the signed distance function at all of the grid points for pointId in range(poly.GetNumberOfPoints()): p = poly.GetPoint(pointId) signed_distance = ippd.EvaluateFunction(p) signed_distances.InsertNextValue(signed_distance) currentscals = poly.GetPointData().GetScalars() if currentscals: currentscals = currentscals.GetName() poly.GetPointData().AddArray(signed_distances) poly.GetPointData().SetActiveScalars("SignedDistances") clipper = vtk.vtkClipPolyData() clipper.SetInputData(poly) clipper.SetInsideOut(not invert) clipper.SetGenerateClippedOutput(keep) clipper.SetValue(0.0) clipper.Update() cpoly = clipper.GetOutput() if keep: kpoly = clipper.GetOutput(1) vis = False if currentscals: cpoly.GetPointData().SetActiveScalars(currentscals) vis = self.mapper().GetScalarVisibility() if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: self._update(cpoly) else: # bring the underlying polydata to where _data is M = vtk.vtkMatrix4x4() M.DeepCopy(self.GetMatrix()) M.Invert() tr = vtk.vtkTransform() tr.SetMatrix(M) tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(tr) tf.SetInputData(cpoly) tf.Update() self._update(tf.GetOutput()) self.pointdata.remove("SignedDistances") self.mapper().SetScalarVisibility(vis) if keep: if isinstance(self, vedo.Mesh): cutoff = vedo.Mesh(kpoly) else: cutoff = vedo.Points(kpoly) cutoff.property = vtk.vtkProperty() cutoff.property.DeepCopy(self.property) cutoff.SetProperty(cutoff.property) cutoff.c("k5").alpha(0.2) return vedo.Assembly([self, cutoff]) self.pipeline = utils.OperationNode("cut_with_mesh", parents=[self, mesh]) return self def cut_with_point_loop(self, points, invert=False, on="points", include_boundary=False): """ Cut an `Mesh` object with a set of points forming a closed loop. Arguments: invert : (bool) invert selection (inside-out) on : (str) if 'cells' will extract the whole cells lying inside (or outside) the point loop include_boundary : (bool) include cells lying exactly on the boundary line. Only relevant on 'cells' mode Examples: - [cut_with_points1.py](https://github.com/marcomusy/vedo/blob/master/examples/advanced/cut_with_points1.py) ![](https://vedo.embl.es/images/advanced/cutWithPoints1.png) - [cut_with_points2.py](https://github.com/marcomusy/vedo/blob/master/examples/advanced/cut_with_points2.py) ![](https://vedo.embl.es/images/advanced/cutWithPoints2.png) """ if isinstance(points, Points): parents = [points] vpts = points.polydata().GetPoints() points = points.points() else: parents = [self] vpts = vtk.vtkPoints() points = utils.make3d(points) for p in points: vpts.InsertNextPoint(p) if "cell" in on: ippd = vtk.vtkImplicitSelectionLoop() ippd.SetLoop(vpts) ippd.AutomaticNormalGenerationOn() clipper = vtk.vtkExtractPolyDataGeometry() clipper.SetInputData(self.polydata()) clipper.SetImplicitFunction(ippd) clipper.SetExtractInside(not invert) clipper.SetExtractBoundaryCells(include_boundary) else: spol = vtk.vtkSelectPolyData() spol.SetLoop(vpts) spol.GenerateSelectionScalarsOn() spol.GenerateUnselectedOutputOff() spol.SetInputData(self.polydata()) spol.Update() clipper = vtk.vtkClipPolyData() clipper.SetInputData(spol.GetOutput()) clipper.SetInsideOut(not invert) clipper.SetValue(0.0) clipper.Update() cpoly = clipper.GetOutput() if self.GetIsIdentity() or cpoly.GetNumberOfPoints() == 0: self._update(cpoly) else: # bring the underlying polydata to where _data is M = vtk.vtkMatrix4x4() M.DeepCopy(self.GetMatrix()) M.Invert() tr = vtk.vtkTransform() tr.SetMatrix(M) tf = vtk.vtkTransformPolyDataFilter() tf.SetTransform(tr) tf.SetInputData(clipper.GetOutput()) tf.Update() self._update(tf.GetOutput()) self.pipeline = utils.OperationNode("cut_with_pointloop", parents=parents) return self def cut_with_scalar(self, value, name="", invert=False): """ Cut a mesh or point cloud with some input scalar point-data. Arguments: value : (float) cutting value name : (str) array name of the scalars to be used invert : (bool) flip selection Example: ```python from vedo import * s = Sphere().lw(1) pts = s.points() scalars = np.sin(3*pts[:,2]) + pts[:,0] s.pointdata["somevalues"] = scalars s.cut_with_scalar(0.3) s.cmap("Spectral", "somevalues").add_scalarbar() s.show(axes=1).close() ``` ![](https://vedo.embl.es/images/feats/cut_with_scalars.png) """ if name: self.pointdata.select(name) clipper = vtk.vtkClipPolyData() clipper.SetInputData(self._data) clipper.SetValue(value) clipper.GenerateClippedOutputOff() clipper.SetInsideOut(not invert) clipper.Update() self._update(clipper.GetOutput()) self.pipeline = utils.OperationNode("cut_with_scalars", parents=[self]) return self def implicit_modeller(self, distance=0.05, res=(50, 50, 50), bounds=(), maxdist=None): """Find the surface which sits at the specified distance from the input one.""" if not bounds: bounds = self.bounds() if not maxdist: maxdist = self.diagonal_size() / 2 imp = vtk.vtkImplicitModeller() imp.SetInputData(self.polydata()) imp.SetSampleDimensions(res) imp.SetMaximumDistance(maxdist) imp.SetModelBounds(bounds) contour = vtk.vtkContourFilter() contour.SetInputConnection(imp.GetOutputPort()) contour.SetValue(0, distance) contour.Update() poly = contour.GetOutput() out = vedo.Mesh(poly, c="lb") out.pipeline = utils.OperationNode("implicit_modeller", parents=[self]) return out def generate_mesh( self, line_resolution=None, mesh_resolution=None, smooth=0.0, jitter=0.001, grid=None, quads=False, invert=False, ): """ Generate a polygonal Mesh from a closed contour line. If line is not closed it will be closed with a straight segment. Arguments: line_resolution : (int) resolution of the contour line. The default is None, in this case the contour is not resampled. mesh_resolution : (int) resolution of the internal triangles not touching the boundary. smooth : (float) smoothing of the contour before meshing. jitter : (float) add a small noise to the internal points. grid : (Grid) manually pass a Grid object. The default is True. quads : (bool) generate a mesh of quads instead of triangles. invert : (bool) flip the line orientation. The default is False. Examples: - [line2mesh_tri.py](https://github.com/marcomusy/vedo/blob/master/examples/advanced/line2mesh_tri.py) ![](https://vedo.embl.es/images/advanced/line2mesh_tri.jpg) - [line2mesh_quads.py](https://github.com/marcomusy/vedo/blob/master/examples/advanced/line2mesh_quads.py) ![](https://vedo.embl.es/images/advanced/line2mesh_quads.png) """ if line_resolution is None: contour = vedo.shapes.Line(self.points()) else: contour = vedo.shapes.Spline(self.points(), smooth=smooth, res=line_resolution) contour.clean() length = contour.length() density = length / contour.npoints vedo.logger.debug(f"tomesh():\n\tline length = {length}") vedo.logger.debug(f"\tdensity = {density} length/pt_separation") x0, x1 = contour.xbounds() y0, y1 = contour.ybounds() if grid is None: if mesh_resolution is None: resx = int((x1 - x0) / density + 0.5) resy = int((y1 - y0) / density + 0.5) vedo.logger.debug(f"tmesh_resolution = {[resx, resy]}") else: if utils.is_sequence(mesh_resolution): resx, resy = mesh_resolution else: resx, resy = mesh_resolution, mesh_resolution grid = vedo.shapes.Grid( [(x0 + x1) / 2, (y0 + y1) / 2, 0], s=((x1 - x0) * 1.025, (y1 - y0) * 1.025), res=(resx, resy), ) else: grid = grid.clone() cpts = contour.points() # make sure it's closed p0, p1 = cpts[0], cpts[-1] nj = max(2, int(utils.mag(p1 - p0) / density + 0.5)) joinline = vedo.shapes.Line(p1, p0, res=nj) contour = vedo.merge(contour, joinline).subsample(0.0001) ####################################### quads if quads: cmesh = grid.clone().cut_with_point_loop(contour, on="cells", invert=invert) cmesh.wireframe(False).lw(0.5) cmesh.pipeline = utils.OperationNode( "generate_mesh", parents=[self, contour], comment=f"#quads {cmesh.inputdata().GetNumberOfCells()}", ) return cmesh ############################################# grid_tmp = grid.points() if jitter: np.random.seed(0) sigma = 1.0 / np.sqrt(grid.npoints) * grid.diagonal_size() * jitter vedo.logger.debug(f"\tsigma jittering = {sigma}") grid_tmp += np.random.rand(grid.npoints, 3) * sigma grid_tmp[:, 2] = 0.0 todel = [] density /= np.sqrt(3) vgrid_tmp = Points(grid_tmp) for p in contour.points(): out = vgrid_tmp.closest_point(p, radius=density, return_point_id=True) todel += out.tolist() # cpoints = contour.points() # for i, p in enumerate(cpoints): # if i: # den = utils.mag(p-cpoints[i-1])/1.732 # else: # den = density # todel += vgrid_tmp.closest_point(p, radius=den, return_point_id=True) grid_tmp = grid_tmp.tolist() for index in sorted(list(set(todel)), reverse=True): del grid_tmp[index] points = contour.points().tolist() + grid_tmp if invert: boundary = reversed(range(contour.npoints)) else: boundary = range(contour.npoints) dln = delaunay2d(points, mode="xy", boundaries=[boundary]) dln.compute_normals(points=False) # fixes reversd faces dln.lw(0.5) dln.pipeline = utils.OperationNode( "generate_mesh", parents=[self, contour], comment=f"#cells {dln.inputdata().GetNumberOfCells()}", ) return dln def reconstruct_surface( self, dims=(100, 100, 100), radius=None, sample_size=None, hole_filling=True, bounds=(), padding=0.05, ): """ Surface reconstruction from a scattered cloud of points. Arguments: dims : (int) number of voxels in x, y and z to control precision. radius : (float) radius of influence of each point. Smaller values generally improve performance markedly. Note that after the signed distance function is computed, any voxel taking on the value >= radius is presumed to be "unseen" or uninitialized. sample_size : (int) if normals are not present they will be calculated using this sample size per point. hole_filling : (bool) enables hole filling, this generates separating surfaces between the empty and unseen portions of the volume. bounds : (list) region in space in which to perform the sampling in format (xmin,xmax, ymin,ymax, zim, zmax) padding : (float) increase by this fraction the bounding box Examples: - [recosurface.py](https://github.com/marcomusy/vedo/blob/master/examples/advanced/recosurface.py) ![](https://vedo.embl.es/images/advanced/recosurface.png) """ if not utils.is_sequence(dims): dims = (dims, dims, dims) sdf = vtk.vtkSignedDistance() if len(bounds) == 6: sdf.SetBounds(bounds) else: x0, x1, y0, y1, z0, z1 = self.bounds() sdf.SetBounds( x0 - (x1 - x0) * padding, x1 + (x1 - x0) * padding, y0 - (y1 - y0) * padding, y1 + (y1 - y0) * padding, z0 - (z1 - z0) * padding, z1 + (z1 - z0) * padding, ) pd = self.polydata() if pd.GetPointData().GetNormals(): sdf.SetInputData(pd) else: normals = vtk.vtkPCANormalEstimation() normals.SetInputData(pd) if not sample_size: sample_size = int(pd.GetNumberOfPoints() / 50) normals.SetSampleSize(sample_size) normals.SetNormalOrientationToGraphTraversal() sdf.SetInputConnection(normals.GetOutputPort()) # print("Recalculating normals with sample size =", sample_size) if radius is None: radius = self.diagonal_size() / (sum(dims) / 3) * 5 # print("Calculating mesh from points with radius =", radius) sdf.SetRadius(radius) sdf.SetDimensions(dims) sdf.Update() surface = vtk.vtkExtractSurface() surface.SetRadius(radius * 0.99) surface.SetHoleFilling(hole_filling) surface.ComputeNormalsOff() surface.ComputeGradientsOff() surface.SetInputConnection(sdf.GetOutputPort()) surface.Update() m = vedo.mesh.Mesh(surface.GetOutput(), c=self.color()) m.pipeline = utils.OperationNode( "reconstruct_surface", parents=[self], comment=f"#pts {m.inputdata().GetNumberOfPoints()}" ) return m def compute_clustering(self, radius): """ Cluster points in space. The `radius` is the radius of local search. An array named "ClusterId" is added to the vertex points. Examples: - [clustering.py](https://github.com/marcomusy/vedo/blob/master/examples/basic/clustering.py) ![](https://vedo.embl.es/images/basic/clustering.png) """ cluster = vtk.vtkEuclideanClusterExtraction() cluster.SetInputData(self.inputdata()) cluster.SetExtractionModeToAllClusters() cluster.SetRadius(radius) cluster.ColorClustersOn() cluster.Update() idsarr = cluster.GetOutput().GetPointData().GetArray("ClusterId") self.inputdata().GetPointData().AddArray(idsarr) self.pipeline = utils.OperationNode( "compute_clustering", parents=[self], comment=f"radius = {radius}" ) return self def compute_connections(self, radius, mode=0, regions=(), vrange=(0, 1), seeds=(), angle=0): """ Extracts and/or segments points from a point cloud based on geometric distance measures (e.g., proximity, normal alignments, etc.) and optional measures such as scalar range. The default operation is to segment the points into "connected" regions where the connection is determined by an appropriate distance measure. Each region is given a region id. Optionally, the filter can output the largest connected region of points; a particular region (via id specification); those regions that are seeded using a list of input point ids; or the region of points closest to a specified position. The key parameter of this filter is the radius defining a sphere around each point which defines a local neighborhood: any other points in the local neighborhood are assumed connected to the point. Note that the radius is defined in absolute terms. Other parameters are used to further qualify what it means to be a neighboring point. For example, scalar range and/or point normals can be used to further constrain the neighborhood. Also the extraction mode defines how the filter operates. By default, all regions are extracted but it is possible to extract particular regions; the region closest to a seed point; seeded regions; or the largest region found while processing. By default, all regions are extracted. On output, all points are labeled with a region number. However note that the number of input and output points may not be the same: if not extracting all regions then the output size may be less than the input size. Arguments: radius : (float) variable specifying a local sphere used to define local point neighborhood mode : (int) - 0, Extract all regions - 1, Extract point seeded regions - 2, Extract largest region - 3, Test specified regions - 4, Extract all regions with scalar connectivity - 5, Extract point seeded regions regions : (list) a list of non-negative regions id to extract vrange : (list) scalar range to use to extract points based on scalar connectivity seeds : (list) a list of non-negative point seed ids angle : (list) points are connected if the angle between their normals is within this angle threshold (expressed in degrees). """ # https://vtk.org/doc/nightly/html/classvtkConnectedPointsFilter.html cpf = vtk.vtkConnectedPointsFilter() cpf.SetInputData(self.polydata()) cpf.SetRadius(radius) if mode == 0: # Extract all regions pass elif mode == 1: # Extract point seeded regions cpf.SetExtractionModeToPointSeededRegions() for s in seeds: cpf.AddSeed(s) elif mode == 2: # Test largest region cpf.SetExtractionModeToLargestRegion() elif mode == 3: # Test specified regions cpf.SetExtractionModeToSpecifiedRegions() for r in regions: cpf.AddSpecifiedRegion(r) elif mode == 4: # Extract all regions with scalar connectivity cpf.SetExtractionModeToLargestRegion() cpf.ScalarConnectivityOn() cpf.SetScalarRange(vrange[0], vrange[1]) elif mode == 5: # Extract point seeded regions cpf.SetExtractionModeToLargestRegion() cpf.ScalarConnectivityOn() cpf.SetScalarRange(vrange[0], vrange[1]) cpf.AlignedNormalsOn() cpf.SetNormalAngle(angle) cpf.Update() return self._update(cpf.GetOutput()) def compute_camera_distance(self): """ Calculate the distance from points to the camera. A pointdata array is created with name 'DistanceToCamera'. """ if vedo.plotter_instance.renderer: poly = self.polydata() dc = vtk.vtkDistanceToCamera() dc.SetInputData(poly) dc.SetRenderer(vedo.plotter_instance.renderer) dc.Update() return self._update(dc.GetOutput()) return self def density( self, dims=(40, 40, 40), bounds=None, radius=None, compute_gradient=False, locator=None ): """ Generate a density field from a point cloud. Input can also be a set of 3D coordinates. Output is a `Volume`. The local neighborhood is specified as the `radius` around each sample position (each voxel). The density is expressed as the number of counts in the radius search. Arguments: dims : (int,list) number of voxels in x, y and z of the output Volume. compute_gradient : (bool) Turn on/off the generation of the gradient vector, gradient magnitude scalar, and function classification scalar. By default this is off. Note that this will increase execution time and the size of the output. (The names of these point data arrays are: "Gradient", "Gradient Magnitude", and "Classification") locator : (vtkPointLocator) can be assigned from a previous call for speed (access it via `object.point_locator`). Examples: - [plot_density3d.py](https://github.com/marcomusy/vedo/blob/master/examples/pyplot/plot_density3d.py) ![](https://vedo.embl.es/images/pyplot/plot_density3d.png) """ pdf = vtk.vtkPointDensityFilter() pdf.SetInputData(self.polydata()) if not utils.is_sequence(dims): dims = [dims, dims, dims] if bounds is None: bounds = list(self.bounds()) elif len(bounds) == 4: bounds = [*bounds, 0, 0] if bounds[5] - bounds[4] == 0 or len(dims) == 2: # its 2D dims = list(dims) dims = [dims[0], dims[1], 2] diag = self.diagonal_size() bounds[5] = bounds[4] + diag / 1000 pdf.SetModelBounds(bounds) pdf.SetSampleDimensions(dims) if locator: pdf.SetLocator(locator) pdf.SetDensityEstimateToFixedRadius() if radius is None: radius = self.diagonal_size() / 20 pdf.SetRadius(radius) pdf.SetComputeGradient(compute_gradient) pdf.Update() img = pdf.GetOutput() vol = vedo.volume.Volume(img).mode(1) vol.name = "PointDensity" vol.info["radius"] = radius vol.locator = pdf.GetLocator() vol.pipeline = utils.OperationNode( "density", parents=[self], comment=f"dims = {tuple(vol.dimensions())}" ) return vol def densify(self, target_distance=0.1, nclosest=6, radius=None, niter=1, nmax=None): """ Return a copy of the cloud with new added points. The new points are created in such a way that all points in any local neighborhood are within a target distance of one another. For each input point, the distance to all points in its neighborhood is computed. If any of its neighbors is further than the target distance, the edge connecting the point and its neighbor is bisected and a new point is inserted at the bisection point. A single pass is completed once all the input points are visited. Then the process repeats to the number of iterations. Examples: - [densifycloud.py](https://github.com/marcomusy/vedo/blob/master/examples/volumetric/densifycloud.py) ![](https://vedo.embl.es/images/volumetric/densifycloud.png) .. note:: Points will be created in an iterative fashion until all points in their local neighborhood are the target distance apart or less. Note that the process may terminate early due to the number of iterations. By default the target distance is set to 0.5. Note that the target_distance should be less than the radius or nothing will change on output. .. warning:: This class can generate a lot of points very quickly. The maximum number of iterations is by default set to =1.0 for this reason. Increase the number of iterations very carefully. Also, `nmax` can be set to limit the explosion of points. It is also recommended that a N closest neighborhood is used. """ src = vtk.vtkProgrammableSource() opts = self.points() def _readPoints(): output = src.GetPolyDataOutput() points = vtk.vtkPoints() for p in opts: points.InsertNextPoint(p) output.SetPoints(points) src.SetExecuteMethod(_readPoints) dens = vtk.vtkDensifyPointCloudFilter() dens.SetInputConnection(src.GetOutputPort()) dens.InterpolateAttributeDataOn() dens.SetTargetDistance(target_distance) dens.SetMaximumNumberOfIterations(niter) if nmax: dens.SetMaximumNumberOfPoints(nmax) if radius: dens.SetNeighborhoodTypeToRadius() dens.SetRadius(radius) elif nclosest: dens.SetNeighborhoodTypeToNClosest() dens.SetNumberOfClosestPoints(nclosest) else: vedo.logger.error("set either radius or nclosest") raise RuntimeError() dens.Update() pts = utils.vtk2numpy(dens.GetOutput().GetPoints().GetData()) cld = Points(pts, c=None).point_size(self.GetProperty().GetPointSize()) cld.interpolate_data_from(self, n=nclosest, radius=radius) cld.name = "densifiedCloud" cld.pipeline = utils.OperationNode( "densify", parents=[self], c="#e9c46a:", comment=f"#pts {cld.inputdata().GetNumberOfPoints()}" ) return cld ############################################################################### ## stuff returning Volume def signed_distance(self, bounds=None, dims=(20, 20, 20), invert=False, maxradius=None): """ Compute the `Volume` object whose voxels contains the signed distance from the point cloud. The point cloud must have Normals. Arguments: bounds : (list, actor) bounding box sizes dims : (list) dimensions (nr. of voxels) of the output volume. invert : (bool) flip the sign maxradius : (float) specify how far out to propagate distance calculation Examples: - [distance2mesh.py](https://github.com/marcomusy/vedo/blob/master/examples/basic/distance2mesh.py) ![](https://vedo.embl.es/images/basic/distance2mesh.png) """ if bounds is None: bounds = self.bounds() if maxradius is None: maxradius = self.diagonal_size() / 2 dist = vtk.vtkSignedDistance() dist.SetInputData(self.polydata()) dist.SetRadius(maxradius) dist.SetBounds(bounds) dist.SetDimensions(dims) dist.Update() img = dist.GetOutput() if invert: mat = vtk.vtkImageMathematics() mat.SetInput1Data(img) mat.SetOperationToMultiplyByK() mat.SetConstantK(-1) mat.Update() img = mat.GetOutput() vol = vedo.Volume(img) vol.name = "SignedDistanceVolume" vol.pipeline = utils.OperationNode( "signed_distance", parents=[self], comment=f"dim = {tuple(vol.dimensions())}", c="#e9c46a:#0096c7", ) return vol def tovolume( self, kernel="shepard", radius=None, n=None, bounds=None, null_value=None, dims=(25, 25, 25) ): """ Generate a `Volume` by interpolating a scalar or vector field which is only known on a scattered set of points or mesh. Available interpolation kernels are: shepard, gaussian, or linear. Arguments: kernel : (str) interpolation kernel type [shepard] radius : (float) radius of the local search n : (int) number of point to use for interpolation bounds : (list) bounding box of the output Volume object dims : (list) dimensions of the output Volume object null_value : (float) value to be assigned to invalid points Examples: - [interpolate_volume.py](https://github.com/marcomusy/vedo/blob/master/examples/volumetric/interpolate_volume.py) ![](https://vedo.embl.es/images/volumetric/59095175-1ec5a300-8918-11e9-8bc0-fd35c8981e2b.jpg) """ if radius is None and not n: vedo.logger.error("please set either radius or n") raise RuntimeError poly = self.polydata() # Create a probe volume probe = vtk.vtkImageData() probe.SetDimensions(dims) if bounds is None: bounds = self.bounds() probe.SetOrigin(bounds[0], bounds[2], bounds[4]) probe.SetSpacing( (bounds[1] - bounds[0]) / dims[0], (bounds[3] - bounds[2]) / dims[1], (bounds[5] - bounds[4]) / dims[2], ) if not self.point_locator: self.point_locator = vtk.vtkPointLocator() self.point_locator.SetDataSet(poly) self.point_locator.BuildLocator() if kernel == "shepard": kern = vtk.vtkShepardKernel() kern.SetPowerParameter(2) elif kernel == "gaussian": kern = vtk.vtkGaussianKernel() elif kernel == "linear": kern = vtk.vtkLinearKernel() else: vedo.logger.error("Error in tovolume(), available kernels are:") vedo.logger.error(" [shepard, gaussian, linear]") raise RuntimeError() if radius: kern.SetRadius(radius) interpolator = vtk.vtkPointInterpolator() interpolator.SetInputData(probe) interpolator.SetSourceData(poly) interpolator.SetKernel(kern) interpolator.SetLocator(self.point_locator) if n: kern.SetNumberOfPoints(n) kern.SetKernelFootprintToNClosest() else: kern.SetRadius(radius) if null_value is not None: interpolator.SetNullValue(null_value) else: interpolator.SetNullPointsStrategyToClosestPoint() interpolator.Update() vol = vedo.Volume(interpolator.GetOutput()) vol.pipeline = utils.OperationNode( "signed_distance", parents=[self], comment=f"dim = {tuple(vol.dimensions())}", c="#e9c46a:#0096c7", ) return vol def generate_random_data(self): """Fill a dataset with random attributes""" gen = vtk.vtkRandomAttributeGenerator() gen.SetInputData(self._data) gen.GenerateAllDataOn() gen.SetDataTypeToFloat() gen.GeneratePointNormalsOff() gen.GeneratePointTensorsOn() gen.GenerateCellScalarsOn() gen.Update() m = self._update(gen.GetOutput()) m.pipeline = utils.OperationNode("generate\nrandom data", parents=[self]) return m vedo-2023.4.6/vedo/pyplot.py000066400000000000000000004337451444463326400155750ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import warnings import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo from vedo import settings from vedo import addons from vedo import colors from vedo import utils from vedo.pointcloud import merge from vedo.mesh import Mesh from vedo.assembly import Assembly, Group from vedo import shapes __docformat__ = "google" __doc__ = """ Advanced plotting functionalities. ![](https://vedo.embl.es/images/pyplot/fitPolynomial2.png) """ __all__ = [ "Figure", "Histogram1D", # uncomment to generate docs "Histogram2D", "PlotXY", "PlotBars", "plot", "histogram", "fit", "donut", "violin", "whisker", "streamplot", "matrix", "DirectedGraph", ] ########################################################################## def _to2d(actor, offset, scale): poly = actor.polydata() tp = vtk.vtkTransformPolyDataFilter() transform = vtk.vtkTransform() transform.Scale(scale, scale, scale) transform.Translate(-offset[0], -offset[1], 0) tp.SetTransform(transform) tp.SetInputData(poly) tp.Update() poly = tp.GetOutput() mapper2d = vtk.vtkPolyDataMapper2D() mapper2d.SetInputData(poly) act2d = vtk.vtkActor2D() act2d.SetMapper(mapper2d) act2d.GetProperty().SetColor(actor.color()) act2d.GetProperty().SetOpacity(actor.alpha()) act2d.GetProperty().SetLineWidth(actor.GetProperty().GetLineWidth()) act2d.GetProperty().SetPointSize(actor.GetProperty().GetPointSize()) act2d.PickableOff() csys = act2d.GetPositionCoordinate() csys.SetCoordinateSystem(4) act2d.GetProperty().SetDisplayLocationToBackground() return act2d ########################################################################## class LabelData: """Helper internal class to hold label information.""" def __init__(self): """Helper internal class to hold label information.""" self.text = "dataset" self.tcolor = "black" self.marker = "s" self.mcolor = "black" ########################################################################## class Figure(Assembly): """Format class for figures.""" def __init__(self, xlim, ylim, aspect=4 / 3, padding=(0.05, 0.05, 0.05, 0.05), **kwargs): """ Create an empty formatted figure for plotting. Arguments: xlim : (list) range of the x-axis as [x0, x1] ylim : (list) range of the y-axis as [y0, y1] aspect : (float, str) the desired aspect ratio of the histogram. Default is 4/3. Use `aspect="equal"` to force the same units in x and y. padding : (float, list) keep a padding space from the axes (as a fraction of the axis size). This can be a list of four numbers. xtitle : (str) title for the x-axis, can also be set using `axes=dict(xtitle="my x axis")` ytitle : (str) title for the y-axis, can also be set using `axes=dict(ytitle="my y axis")` grid : (bool) show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` axes : (dict) an extra dictionary of options for the `vedo.addons.Axes` object """ self.verbose = True # printing to stdout on every mouse click self.xlim = np.asarray(xlim) self.ylim = np.asarray(ylim) self.aspect = aspect self.padding = padding if not utils.is_sequence(self.padding): self.padding = [self.padding, self.padding, self.padding, self.padding] self.force_scaling_types = ( shapes.Glyph, shapes.Line, shapes.Rectangle, shapes.DashedLine, shapes.Tube, shapes.Ribbon, shapes.GeoCircle, shapes.Arc, shapes.Grid, # shapes.Arrows, # todo # shapes.Arrows2D, # todo shapes.Brace, # todo ) options = dict(kwargs) self.title = options.pop("title", "") self.xtitle = options.pop("xtitle", " ") self.ytitle = options.pop("ytitle", " ") number_of_divisions = 6 self.legend = None self.labels = [] self.label = options.pop("label", None) if self.label: self.labels = [self.label] self.axopts = options.pop("axes", {}) if isinstance(self.axopts, (bool, int, float)): if self.axopts: self.axopts = {} if self.axopts or isinstance(self.axopts, dict): number_of_divisions = self.axopts.pop("number_of_divisions", number_of_divisions) self.axopts["xtitle"] = self.xtitle self.axopts["ytitle"] = self.ytitle if "xygrid" not in self.axopts: ## modify the default self.axopts["xygrid"] = options.pop("grid", False) if "xygrid_transparent" not in self.axopts: ## modify the default self.axopts["xygrid_transparent"] = True if "xtitle_position" not in self.axopts: ## modify the default self.axopts["xtitle_position"] = 0.5 self.axopts["xtitle_justify"] = "top-center" if "ytitle_position" not in self.axopts: ## modify the default self.axopts["ytitle_position"] = 0.5 self.axopts["ytitle_justify"] = "bottom-center" if self.label: if "c" in self.axopts: self.label.tcolor = self.axopts["c"] x0, x1 = self.xlim y0, y1 = self.ylim dx = x1 - x0 dy = y1 - y0 x0lim, x1lim = (x0 - self.padding[0] * dx, x1 + self.padding[1] * dx) y0lim, y1lim = (y0 - self.padding[2] * dy, y1 + self.padding[3] * dy) dy = y1lim - y0lim self.axes = None if xlim[0] >= xlim[1] or ylim[0] >= ylim[1]: vedo.logger.warning(f"Null range for Figure {self.title}... returning an empty Assembly.") Assembly.__init__(self) self.yscale = 0 return if aspect == "equal": self.aspect = dx / dy # so that yscale becomes 1 self.yscale = dx / dy / self.aspect y0lim *= self.yscale y1lim *= self.yscale self.x0lim = x0lim self.x1lim = x1lim self.y0lim = y0lim self.y1lim = y1lim self.ztolerance = options.pop("ztolerance", None) if self.ztolerance is None: self.ztolerance = dx / 5000 ############## create axes if self.axopts: axes_opts = self.axopts if self.axopts is True or self.axopts == 1: axes_opts = {} tp, ts = utils.make_ticks(y0lim / self.yscale, y1lim / self.yscale, number_of_divisions) labs = [] for i in range(1, len(tp) - 1): ynew = utils.lin_interpolate(tp[i], [0, 1], [y0lim, y1lim]) labs.append([ynew, ts[i]]) if self.title: axes_opts["htitle"] = self.title axes_opts["y_values_and_labels"] = labs axes_opts["xrange"] = (x0lim, x1lim) axes_opts["yrange"] = (y0lim, y1lim) axes_opts["zrange"] = (0, 0) axes_opts["y_use_bounds"] = True if "c" not in axes_opts and "ac" in options: axes_opts["c"] = options["ac"] self.axes = addons.Axes(**axes_opts) Assembly.__init__(self, [self.axes]) self.name = "Figure" vedo.last_figure = self if settings.remember_last_figure_format else None return def _repr_html_(self): """ HTML representation of the Figure object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.pyplot.Figure" help_url = "https://vedo.embl.es/docs/vedo/pyplot.html#Figure" arr = self.thumbnail(zoom=1.1) im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" bounds = "
".join( [ vedo.utils.precision(min_x, 4) + " ... " + vedo.utils.precision(max_x, 4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" all = [ "", "", "", "
", image, "
", help_text, "", "", "", "", "", "", "
nr. of parts " + str(self.GetNumberOfPaths()) + "
position " + str(self.GetPosition()) + "
x-limits " + utils.precision(self.xlim, 4) + "
y-limits " + utils.precision(self.ylim, 4) + "
world bounds
(x/y/z)
" + str(bounds) + "
", "
", ] return "\n".join(all) def __add__(self, *obj): # just to avoid confusion, supersede Assembly.__add__ return self.__iadd__(*obj) def __iadd__(self, *obj): if len(obj) == 1 and isinstance(obj[0], Figure): return self._check_unpack_and_insert(obj[0]) obj = utils.flatten(obj) return self.insert(*obj) def _check_unpack_and_insert(self, fig): if fig.label: self.labels.append(fig.label) if abs(self.yscale - fig.yscale) > 0.0001: colors.printc(":bomb:ERROR: adding incompatible Figure. Y-scales are different:", c='r', invert=True) colors.printc(" first figure:", self.yscale, c='r') colors.printc(" second figure:", fig.yscale, c='r') colors.printc("One or more of these parameters can be the cause:", c="r") if list(self.xlim) != list(fig.xlim): colors.printc("xlim --------------------------------------------\n", " first figure:", self.xlim, "\n", " second figure:", fig.xlim, c='r') if list(self.ylim) != list(fig.ylim): colors.printc("ylim --------------------------------------------\n", " first figure:", self.ylim, "\n", " second figure:", fig.ylim, c='r') if list(self.padding) != list(fig.padding): colors.printc("padding -----------------------------------------\n", " first figure:", self.padding, " second figure:", fig.padding, c='r') if self.aspect != fig.aspect: colors.printc("aspect ------------------------------------------\n", " first figure:", self.aspect, "\n", " second figure:", fig.aspect, c='r') colors.printc("\n:idea: Consider using fig2 = histogram(..., like=fig1)", c="r") colors.printc(" Or fig += histogram(..., like=fig)\n", c="r") return self offset = self.zbounds()[1] + self.ztolerance for ele in fig.unpack(): if "Axes" in ele.name: continue ele.z(offset) self.insert(ele, rescale=False) return self def insert(self, *objs, rescale=True, as3d=True, adjusted=False, cut=True): """ Insert objects into a Figure. The recommended syntax is to use "+=", which calls `insert()` under the hood. If a whole Figure is added with "+=", it is unpacked and its objects are added one by one. Arguments: rescale : (bool) rescale the y axis position while inserting the object. as3d : (bool) if True keep the aspect ratio of the 3d object, otherwise stretch it in y. adjusted : (bool) adjust the scaling according to the shortest axis cut : (bool) cut off the parts of the object which go beyond the axes frame. """ for a in objs: if a in self.actors: # should not add twice the same object in plot continue if isinstance(a, vedo.Points): # hacky way to identify Points if a.ncells == a.npoints: poly = a.polydata(False) if poly.GetNumberOfPolys() == 0 and poly.GetNumberOfLines() == 0: as3d = False rescale = True if isinstance(a, (shapes.Arrow, shapes.Arrow2D)): # discard input Arrow and substitute it with a brand new one # (because scaling would fatally distort the shape) prop = a.GetProperty() prop.LightingOff() py = a.base[1] a.top[1] = (a.top[1] - py) * self.yscale + py b = shapes.Arrow2D(a.base, a.top, s=a.s, fill=a.fill).z(a.z()) b.SetProperty(prop) b.y(py * self.yscale) a = b # elif isinstance(a, shapes.Rectangle) and a.radius is not None: # # discard input Rectangle and substitute it with a brand new one # # (because scaling would fatally distort the shape of the corners) # py = a.corner1[1] # rx1,ry1,rz1 = a.corner1 # rx2,ry2,rz2 = a.corner2 # ry2 = (ry2-py) * self.yscale + py # b = shapes.Rectangle([rx1,0,rz1], [rx2,ry2,rz2], radius=a.radius).z(a.z()) # b.SetProperty(a.GetProperty()) # b.y(py / self.yscale) # a = b else: if rescale: if not isinstance(a, Figure): if as3d and not isinstance(a, self.force_scaling_types): if adjusted: scl = np.min([1, self.yscale]) else: scl = self.yscale a.scale(scl) else: a.scale([1, self.yscale, 1]) # shift it in y a.y(a.y() * self.yscale) if cut: try: bx0, bx1, by0, by1, _, _ = a.bounds() if self.y0lim > by0: a.cut_with_plane([0, self.y0lim, 0], [0, 1, 0]) if self.y1lim < by1: a.cut_with_plane([0, self.y1lim, 0], [0, -1, 0]) if self.x0lim > bx0: a.cut_with_plane([self.x0lim, 0, 0], [1, 0, 0]) if self.x1lim < bx1: a.cut_with_plane([self.x1lim, 0, 0], [-1, 0, 0]) except: # print("insert(): cannot cut", [a]) pass self.AddPart(a) self.actors.append(a) return self def add_label(self, text, c=None, marker="", mc="black"): """ Manually add en entry label to the legend. Arguments: text : (str) text string for the label. c : (str) color of the text marker : (str), Mesh a marker char or a Mesh object to be used as marker mc : (str) color for the marker """ newlabel = LabelData() newlabel.text = text.replace("\n", " ") newlabel.tcolor = c newlabel.marker = marker newlabel.mcolor = mc self.labels.append(newlabel) return self def add_legend( self, pos="top-right", relative=True, font=None, s=1, c=None, vspace=1.75, padding=0.1, radius=0, alpha=1, bc="k7", lw=1, lc="k4", z=0, ): """ Add existing labels to form a legend box. Labels have been previously filled with eg: `plot(..., label="text")` Arguments: pos : (str, list) A string or 2D coordinates. The default is "top-right". relative : (bool) control whether `pos` is absolute or relative, e.i. normalized to the x and y ranges so that x and y in `pos=[x,y]` should be both in the range [0,1]. This flag is ignored if a string despcriptor is passed. Default is True. font : (str, int) font name or number. Check [available fonts here](https://vedo.embl.es/fonts). s : (float) global size of the legend c : (str) color of the text vspace : (float) vertical spacing of lines padding : (float) padding of the box as a fraction of the text size radius : (float) border radius of the box alpha : (float) opacity of the box. Values below 1 may cause poor rendering because of antialiasing. Use alpha = 0 to remove the box. bc : (str) box color lw : (int) border line width of the box in pixel units lc : (int) border line color of the box z : (float) set the zorder as z position (useful to avoid overlap) """ sx = self.x1lim - self.x0lim s = s * sx / 55 # so that input can be about 1 ds = 0 texts = [] mks = [] for i, t in enumerate(self.labels): label = self.labels[i] t = label.text if label.tcolor is not None: c = label.tcolor tx = vedo.shapes.Text3D(t, s=s, c=c, justify="center-left", font=font) y0, y1 = tx.ybounds() ds = max(y1 - y0, ds) texts.append(tx) mk = label.marker if isinstance(mk, vedo.Points): mk = mk.clone(deep=False).lighting("off") cm = mk.center_of_mass() ty0, ty1 = tx.ybounds() oby0, oby1 = mk.ybounds() mk.shift(-cm) mk.SetOrigin(cm) mk.scale((ty1 - ty0) / (oby1 - oby0)) mk.scale([1.1, 1.1, 0.01]) elif mk == "-": mk = vedo.shapes.Marker(mk, s=s * 2) mk.color(label.mcolor) else: mk = vedo.shapes.Marker(mk, s=s) mk.color(label.mcolor) mks.append(mk) for i, tx in enumerate(texts): tx.shift(0, -(i + 0) * ds * vspace) for i, mk in enumerate(mks): mk.shift(-ds * 1.75, -(i + 0) * ds * vspace, 0) acts = texts + mks aleg = Assembly(acts) # .show(axes=1).close() x0, x1, y0, y1, _, _ = aleg.GetBounds() if alpha: dx = x1 - x0 dy = y1 - y0 if not utils.is_sequence(padding): padding = [padding] * 4 padding = min(padding) padding = min(padding * dx, padding * dy) if len(self.labels) == 1: padding *= 4 x0 -= padding x1 += padding y0 -= padding y1 += padding box = shapes.Rectangle([x0, y0], [x1, y1], radius=radius, c=bc, alpha=alpha) box.shift(0, 0, -dy / 100).pickable(False) if lc: box.lc(lc).lw(lw) aleg.AddPart(box) xlim = self.xlim ylim = self.ylim if isinstance(pos, str): px, py = 0, 0 rx, ry = (xlim[1] + xlim[0]) / 2, (ylim[1] + ylim[0]) / 2 shx, shy = 0, 0 if "top" in pos: if "cent" in pos: px, py = rx, ylim[1] shx, shy = (x0 + x1) / 2, y1 elif "left" in pos: px, py = xlim[0], ylim[1] shx, shy = x0, y1 else: # "right" px, py = xlim[1], ylim[1] shx, shy = x1, y1 elif "bot" in pos: if "left" in pos: px, py = xlim[0], ylim[0] shx, shy = x0, y0 elif "right" in pos: px, py = xlim[1], ylim[0] shx, shy = x1, y0 else: # "cent" px, py = rx, ylim[0] shx, shy = (x0 + x1) / 2, y0 elif "cent" in pos: if "left" in pos: px, py = xlim[0], ry shx, shy = x0, (y0 + y1) / 2 elif "right" in pos: px, py = xlim[1], ry shx, shy = x1, (y0 + y1) / 2 else: vedo.logger.error(f"in add_legend(), cannot understand {pos}") raise RuntimeError else: if relative: rx, ry = pos[0], pos[1] px = (xlim[1] - xlim[0]) * rx + xlim[0] py = (ylim[1] - ylim[0]) * ry + ylim[0] z *= xlim[1] - xlim[0] else: px, py = pos[0], pos[1] shx, shy = x0, y1 aleg.pos(px - shx, py * self.yscale - shy, self.z() + sx / 50 + z) self.insert(aleg, rescale=False, cut=False) self.legend = aleg aleg.name = "Legend" return self def as2d(self, pos="bottom-left", scale=1, padding=0.05): """ Convert the Figure into a 2D static object (a 2D Assembly). Arguments: pos : (str, list) position in 2D, as atring or list (x,y). Any combination of "center", "top", "bottom", "left" and "right" will work. The center of the renderer is [0,0] while top-right is [1,1]. scale : (float) scaling factor padding : (float, list) a single value or a list (xpad, ypad) Returns: `Group` object. """ x0, x1 = self.xbounds() y0, y1 = self.ybounds() pp = self.pos() x0 -= pp[0] x1 -= pp[0] y0 -= pp[1] y1 -= pp[1] if not utils.is_sequence(padding): padding = (padding, padding) padding = np.array(padding) if "cent" in pos: offset = [(x0 + x1) / 2, (y0 + y1) / 2] position = [0, 0] if "right" in pos: offset[0] = x1 position = [1 - padding[0], 0] if "left" in pos: offset[0] = x0 position = [-1 + padding[0], 0] if "top" in pos: offset[1] = y1 position = [0, 1 - padding[1]] if "bottom" in pos: offset[1] = y0 position = [0, -1 + padding[1]] elif "top" in pos: if "right" in pos: offset = [x1, y1] position = [1, 1] - padding elif "left" in pos: offset = [x0, y1] position = [-1 + padding[0], 1 - padding[1]] else: raise ValueError(f"incomplete position pos='{pos}'") elif "bottom" in pos: if "right" in pos: offset = [x1, y0] position = [1 - padding[0], -1 + padding[1]] elif "left" in pos: offset = [x0, y0] position = [-1, -1] + padding else: raise ValueError(f"incomplete position pos='{pos}'") else: offset = [0, 0] position = pos scanned = [] group = Group() for a in self.recursive_unpack(): if a in scanned: continue if not isinstance(a, vedo.Points): continue if a.npoints == 0: continue if a.GetProperty().GetRepresentation() == 1: # wireframe is not rendered correctly in 2d continue a2d = _to2d(a, offset, scale * 550 / (x1 - x0)) a2d.SetPosition(position) group += a2d return group ######################################################################################### class Histogram1D(Figure): "1D histogramming." def __init__( self, data, weights=None, bins=None, errors=False, density=False, logscale=False, fill=True, radius=0.075, c="olivedrab", gap=0.02, alpha=1, outline=False, lw=2, lc="k", texture="", marker="", ms=None, mc=None, ma=None, # Figure and axes options: like=None, xlim=None, ylim=(0, None), aspect=4 / 3, padding=(0.0, 0.0, 0.0, 0.05), title="", xtitle=" ", ytitle=" ", ac="k", grid=False, ztolerance=None, label="", **fig_kwargs, ): """ Creates a `Histogram1D(Figure)` object. Arguments: weights : (list) An array of weights, of the same shape as `data`. Each value in `data` only contributes its associated weight towards the bin count (instead of 1). bins : (int) number of bins density : (bool) normalize the area to 1 by dividing by the nr of entries and bin size logscale : (bool) use logscale on y-axis fill : (bool) fill bars with solid color `c` gap : (float) leave a small space btw bars radius : (float) border radius of the top of the histogram bar. Default value is 0.1. texture : (str) url or path to an image to be used as texture for the bin outline : (bool) show outline of the bins errors : (bool) show error bars xtitle : (str) title for the x-axis, can also be set using `axes=dict(xtitle="my x axis")` ytitle : (str) title for the y-axis, can also be set using `axes=dict(ytitle="my y axis")` padding : (float), list keep a padding space from the axes (as a fraction of the axis size). This can be a list of four numbers. aspect : (float) the desired aspect ratio of the histogram. Default is 4/3. grid : (bool) show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` ztolerance : (float) a tolerance factor to superimpose objects (along the z-axis). Examples: - [histo_1d_a.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_a.py) - [histo_1d_b.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_b.py) - [histo_1d_c.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_c.py) - [histo_1d_d.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_d.py) ![](https://vedo.embl.es/images/pyplot/histo_1D.png) """ # purge NaN from data valid_ids = np.all(np.logical_not(np.isnan(data))) data = np.asarray(data[valid_ids]).ravel() # if data.dtype is integer try to center bins by default if like is None and bins is None and np.issubdtype(data.dtype, np.integer): if xlim is None and ylim == (0, None): x1, x0 = data.max(), data.min() if 0 < x1 - x0 <= 100: bins = x1 - x0 + 1 xlim = (x0 - 0.5, x1 + 0.5) if like is None and vedo.last_figure is not None: if xlim is None and ylim == (0, None): like = vedo.last_figure if like is not None: xlim = like.xlim ylim = like.ylim aspect = like.aspect padding = like.padding if bins is None: bins = like.bins if bins is None: bins = 20 if utils.is_sequence(xlim): # deal with user passing eg [x0, None] _x0, _x1 = xlim if _x0 is None: _x0 = data.min() if _x1 is None: _x1 = data.max() xlim = [_x0, _x1] fs, edges = np.histogram(data, bins=bins, weights=weights, range=xlim) binsize = edges[1] - edges[0] ntot = data.shape[0] fig_kwargs["title"] = title fig_kwargs["xtitle"] = xtitle fig_kwargs["ytitle"] = ytitle fig_kwargs["ac"] = ac fig_kwargs["ztolerance"] = ztolerance fig_kwargs["grid"] = grid unscaled_errors = np.sqrt(fs) if density: scaled_errors = unscaled_errors / (ntot * binsize) fs = fs / (ntot * binsize) if ytitle == " ": ytitle = f"counts / ({ntot} x {utils.precision(binsize,3)})" fig_kwargs["ytitle"] = ytitle elif logscale: se_up = np.log10(fs + unscaled_errors / 2 + 1) se_dw = np.log10(fs - unscaled_errors / 2 + 1) scaled_errors = np.c_[se_up, se_dw] fs = np.log10(fs + 1) if ytitle == " ": ytitle = "log_10 (counts+1)" fig_kwargs["ytitle"] = ytitle x0, x1 = np.min(edges), np.max(edges) y0, y1 = ylim[0], np.max(fs) _errors = [] if errors: if density: y1 += max(scaled_errors) / 2 _errors = scaled_errors elif logscale: y1 = max(scaled_errors[:, 0]) _errors = scaled_errors else: y1 += max(unscaled_errors) / 2 _errors = unscaled_errors if like is None: ylim = list(ylim) if xlim is None: xlim = [x0, x1] if ylim[1] is None: ylim[1] = y1 if ylim[0] != 0: ylim[0] = y0 self.title = title self.xtitle = xtitle self.ytitle = ytitle self.entries = ntot self.frequencies = fs self.errors = _errors self.edges = edges self.centers = (edges[0:-1] + edges[1:]) / 2 self.mean = data.mean() self.std = data.std() self.bins = edges # internally used by "like" ############################### stats legend as htitle addstats = False if not title: if "axes" not in fig_kwargs: addstats = True axes_opts = {} fig_kwargs["axes"] = axes_opts elif fig_kwargs["axes"] is False: pass else: axes_opts = fig_kwargs["axes"] if "htitle" not in axes_opts: addstats = True if addstats: htitle = f"Entries:~~{int(self.entries)} " htitle += f"Mean:~~{utils.precision(self.mean, 4)} " htitle += f"STD:~~{utils.precision(self.std, 4)} " axes_opts["htitle"] = htitle axes_opts["htitle_justify"] = "bottom-left" axes_opts["htitle_size"] = 0.016 axes_opts["htitle_offset"] = [-0.49, 0.01, 0] if mc is None: mc = lc if ma is None: ma = alpha if label: nlab = LabelData() nlab.text = label nlab.tcolor = ac nlab.marker = marker nlab.mcolor = mc if not marker: nlab.marker = "s" nlab.mcolor = c fig_kwargs["label"] = nlab ############################################### Figure init Figure.__init__(self, xlim, ylim, aspect, padding, **fig_kwargs) if not self.yscale: return if utils.is_sequence(bins): myedges = np.array(bins) bins = len(bins) - 1 else: myedges = edges bin_centers = [] for i in range(bins): x = (myedges[i] + myedges[i + 1]) / 2 bin_centers.append([x, fs[i], 0]) rs = [] maxheigth = 0 if not fill and not outline and not errors and not marker: outline = True # otherwise it's empty.. if fill: ##################### if outline: gap = 0 for i in range(bins): F = fs[i] if not F: continue p0 = (myedges[i] + gap * binsize, 0, 0) p1 = (myedges[i + 1] - gap * binsize, F, 0) if radius: if gap: rds = np.array([0, 0, radius, radius]) else: rd1 = 0 if i < bins - 1 and fs[i + 1] >= F else radius / 2 rd2 = 0 if i > 0 and fs[i - 1] >= F else radius / 2 rds = np.array([0, 0, rd1, rd2]) p1_yscaled = [p1[0], p1[1] * self.yscale, 0] r = shapes.Rectangle(p0, p1_yscaled, radius=rds * binsize, res=6) r.scale([1, 1 / self.yscale, 1]) r.radius = None # so it doesnt get recreated and rescaled by insert() else: r = shapes.Rectangle(p0, p1) if texture: r.texture(texture) c = "w" # if texture: # causes Segmentation fault vtk9.0.3 # if i>0 and rs[i-1].GetTexture(): # reuse the same texture obj # r.texture(rs[i-1].GetTexture()) # else: # r.texture(texture) # c = 'w' r.PickableOff() maxheigth = max(maxheigth, p1[1]) if c in colors.cmaps_names: col = colors.color_map((p0[0] + p1[0]) / 2, c, myedges[0], myedges[-1]) else: col = c r.color(col).alpha(alpha).lighting("off") r.z(self.ztolerance) rs.append(r) if outline: ##################### lns = [[myedges[0], 0, 0]] for i in range(bins): lns.append([myedges[i], fs[i], 0]) lns.append([myedges[i + 1], fs[i], 0]) maxheigth = max(maxheigth, fs[i]) lns.append([myedges[-1], 0, 0]) outl = shapes.Line(lns, c=lc, alpha=alpha, lw=lw) outl.z(self.ztolerance * 2) rs.append(outl) if errors: ##################### for i in range(bins): x = self.centers[i] f = fs[i] if not f: continue err = _errors[i] if utils.is_sequence(err): el = shapes.Line([x, err[0], 0], [x, err[1], 0], c=lc, alpha=alpha, lw=lw) else: el = shapes.Line( [x, f - err / 2, 0], [x, f + err / 2, 0], c=lc, alpha=alpha, lw=lw ) el.z(self.ztolerance * 3) rs.append(el) if marker: ##################### # remove empty bins (we dont want a marker there) bin_centers = np.array(bin_centers) bin_centers = bin_centers[bin_centers[:, 1] > 0] if utils.is_sequence(ms): ### variable point size mk = shapes.Marker(marker, s=1) mk.scale([1, 1 / self.yscale, 1]) msv = np.zeros_like(bin_centers) msv[:, 0] = ms marked = shapes.Glyph( bin_centers, mk, c=mc, orientation_array=msv, scale_by_vector_size=True ) else: ### fixed point size if ms is None: ms = (xlim[1] - xlim[0]) / 100.0 else: ms = (xlim[1] - xlim[0]) / 100.0 * ms if utils.is_sequence(mc): mk = shapes.Marker(marker, s=ms) mk.scale([1, 1 / self.yscale, 1]) msv = np.zeros_like(bin_centers) msv[:, 0] = 1 marked = shapes.Glyph( bin_centers, mk, c=mc, orientation_array=msv, scale_by_vector_size=True ) else: mk = shapes.Marker(marker, s=ms) mk.scale([1, 1 / self.yscale, 1]) marked = shapes.Glyph(bin_centers, mk, c=mc) marked.alpha(ma) marked.z(self.ztolerance * 4) rs.append(marked) self.insert(*rs, as3d=False) self.name = "Histogram1D" def print(self, **kwargs): """Print infos about this histogram""" txt = ( f"{self.name} {self.title}\n" f" xtitle = '{self.xtitle}'\n" f" ytitle = '{self.ytitle}'\n" f" entries = {self.entries}\n" f" mean = {self.mean}\n" f" std = {self.std}" ) colors.printc(txt, **kwargs) ######################################################################################### class Histogram2D(Figure): """2D histogramming.""" def __init__( self, xvalues, yvalues=None, bins=25, weights=None, cmap="cividis", alpha=1, gap=0, scalarbar=True, # Figure and axes options: like=None, xlim=None, ylim=(None, None), zlim=(None, None), aspect=1, title="", xtitle=" ", ytitle=" ", ztitle="", ac="k", **fig_kwargs, ): """ Input data formats `[(x1,x2,..), (y1,y2,..)] or [(x1,y1), (x2,y2),..]` are both valid. Use keyword `like=...` if you want to use the same format of a previously created Figure (useful when superimposing Figures) to make sure they are compatible and comparable. If they are not compatible you will receive an error message. Arguments: bins : (list) binning as (nx, ny) weights : (list) array of weights to assign to each entry cmap : (str, lookuptable) color map name or look up table alpha : (float) opacity of the histogram gap : (float) separation between adjacent bins as a fraction for their size scalarbar : (bool) add a scalarbar to right of the histogram like : (Figure) grab and use the same format of the given Figure (for superimposing) xlim : (list) [x0, x1] range of interest. If left to None will automatically choose the minimum or the maximum of the data range. Data outside the range are completely ignored. ylim : (list) [y0, y1] range of interest. If left to None will automatically choose the minimum or the maximum of the data range. Data outside the range are completely ignored. aspect : (float) the desired aspect ratio of the figure. title : (str) title of the plot to appear on top. If left blank some statistics will be shown. xtitle : (str) x axis title ytitle : (str) y axis title ztitle : (str) title for the scalar bar ac : (str) axes color, additional keyword for Axes can also be added using e.g. `axes=dict(xygrid=True)` Examples: - [histo_2d_a.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_2d_a.py) - [histo_2d_b.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_2d_b.py) ![](https://vedo.embl.es/images/pyplot/histo_2D.png) """ xvalues = np.asarray(xvalues) if yvalues is None: # assume [(x1,y1), (x2,y2) ...] format yvalues = xvalues[:, 1] xvalues = xvalues[:, 0] else: yvalues = np.asarray(yvalues) padding = [0, 0, 0, 0] if like is None and vedo.last_figure is not None: if xlim is None and ylim == (None, None) and zlim == (None, None): like = vedo.last_figure if like is not None: xlim = like.xlim ylim = like.ylim aspect = like.aspect padding = like.padding if bins is None: bins = like.bins if bins is None: bins = 20 if isinstance(bins, int): bins = (bins, bins) if utils.is_sequence(xlim): # deal with user passing eg [x0, None] _x0, _x1 = xlim if _x0 is None: _x0 = xvalues.min() if _x1 is None: _x1 = xvalues.max() xlim = [_x0, _x1] if utils.is_sequence(ylim): # deal with user passing eg [x0, None] _y0, _y1 = ylim if _y0 is None: _y0 = yvalues.min() if _y1 is None: _y1 = yvalues.max() ylim = [_y0, _y1] H, xedges, yedges = np.histogram2d( xvalues, yvalues, weights=weights, bins=bins, range=(xlim, ylim) ) xlim = np.min(xedges), np.max(xedges) ylim = np.min(yedges), np.max(yedges) dx, dy = xlim[1] - xlim[0], ylim[1] - ylim[0] fig_kwargs["title"] = title fig_kwargs["xtitle"] = xtitle fig_kwargs["ytitle"] = ytitle fig_kwargs["ac"] = ac self.entries = len(xvalues) self.frequencies = H self.edges = (xedges, yedges) self.mean = (xvalues.mean(), yvalues.mean()) self.std = (xvalues.std(), yvalues.std()) self.bins = bins # internally used by "like" ############################### stats legend as htitle addstats = False if not title: if "axes" not in fig_kwargs: addstats = True axes_opts = {} fig_kwargs["axes"] = axes_opts elif fig_kwargs["axes"] is False: pass else: axes_opts = fig_kwargs["axes"] if "htitle" not in fig_kwargs["axes"]: addstats = True if addstats: htitle = f"Entries:~~{int(self.entries)} " htitle += f"Mean:~~{utils.precision(self.mean, 3)} " htitle += f"STD:~~{utils.precision(self.std, 3)} " axes_opts["htitle"] = htitle axes_opts["htitle_justify"] = "bottom-left" axes_opts["htitle_size"] = 0.0175 axes_opts["htitle_offset"] = [-0.49, 0.01, 0] ############################################### Figure init Figure.__init__(self, xlim, ylim, aspect, padding, **fig_kwargs) if self.yscale: ##################### the grid acts = [] g = shapes.Grid( pos=[(xlim[0] + xlim[1]) / 2, (ylim[0] + ylim[1]) / 2, 0], s=(dx, dy), res=bins[:2] ) g.alpha(alpha).lw(0).wireframe(False).flat().lighting("off") g.cmap(cmap, np.ravel(H.T), on="cells", vmin=zlim[0], vmax=zlim[1]) if gap: g.shrink(abs(1 - gap)) if scalarbar: sc = g.add_scalarbar3d(ztitle, c=ac).scalarbar sc.scale([self.yscale, 1, 1]) ## prescale trick sbnds = sc.xbounds() sc.x(self.x1lim + (sbnds[1] - sbnds[0]) * 0.75) acts.append(sc) acts.append(g) self.insert(*acts, as3d=False) self.name = "Histogram2D" ######################################################################################### class PlotBars(Figure): """Creates a `PlotBars(Figure)` object.""" def __init__( self, data, errors=False, logscale=False, fill=True, gap=0.02, radius=0.05, c="olivedrab", alpha=1, texture="", outline=False, lw=2, lc="k", # Figure and axes options: like=None, xlim=(None, None), ylim=(0, None), aspect=4 / 3, padding=(0.025, 0.025, 0, 0.05), # title="", xtitle=" ", ytitle=" ", ac="k", grid=False, ztolerance=None, **fig_kwargs, ): """ Input must be in format `[counts, labels, colors, edges]`. Either or both `edges` and `colors` are optional and can be omitted. Use keyword `like=...` if you want to use the same format of a previously created Figure (useful when superimposing Figures) to make sure they are compatible and comparable. If they are not compatible you will receive an error message. Arguments: errors : (bool) show error bars logscale : (bool) use logscale on y-axis fill : (bool) fill bars with solid color `c` gap : (float) leave a small space btw bars radius : (float) border radius of the top of the histogram bar. Default value is 0.1. texture : (str) url or path to an image to be used as texture for the bin outline : (bool) show outline of the bins xtitle : (str) title for the x-axis, can also be set using `axes=dict(xtitle="my x axis")` ytitle : (str) title for the y-axis, can also be set using `axes=dict(ytitle="my y axis")` ac : (str) axes color padding : (float, list) keep a padding space from the axes (as a fraction of the axis size). This can be a list of four numbers. aspect : (float) the desired aspect ratio of the figure. Default is 4/3. grid : (bool) show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` Examples: - [plot_bars.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_bars.py) ![](https://vedo.embl.es/images/pyplot/plot_bars.png) """ ndata = len(data) if ndata == 4: counts, xlabs, cols, edges = data elif ndata == 3: counts, xlabs, cols = data edges = np.array(range(len(counts) + 1)) + 0.5 elif ndata == 2: counts, xlabs = data edges = np.array(range(len(counts) + 1)) + 0.5 cols = [c] * len(counts) else: m = "barplot error: data must be given as [counts, labels, colors, edges] not\n" vedo.logger.error(m + f" {data}\n bin edges and colors are optional.") raise RuntimeError() # sanity checks assert len(counts) == len(xlabs) assert len(counts) == len(cols) assert len(counts) == len(edges) - 1 counts = np.asarray(counts) edges = np.asarray(edges) if logscale: counts = np.log10(counts + 1) if ytitle == " ": ytitle = "log_10 (counts+1)" if like is None and vedo.last_figure is not None: if xlim == (None, None) and ylim == (0, None): like = vedo.last_figure if like is not None: xlim = like.xlim ylim = like.ylim aspect = like.aspect padding = like.padding if utils.is_sequence(xlim): # deal with user passing eg [x0, None] _x0, _x1 = xlim if _x0 is None: _x0 = np.min(edges) if _x1 is None: _x1 = np.max(edges) xlim = [_x0, _x1] x0, x1 = np.min(edges), np.max(edges) y0, y1 = ylim[0], np.max(counts) if like is None: ylim = list(ylim) if xlim is None: xlim = [x0, x1] if ylim[1] is None: ylim[1] = y1 if ylim[0] != 0: ylim[0] = y0 fig_kwargs["title"] = title fig_kwargs["xtitle"] = xtitle fig_kwargs["ytitle"] = ytitle fig_kwargs["ac"] = ac fig_kwargs["ztolerance"] = ztolerance fig_kwargs["grid"] = grid centers = (edges[0:-1] + edges[1:]) / 2 binsizes = (centers - edges[0:-1]) * 2 if "axes" not in fig_kwargs: fig_kwargs["axes"] = {} _xlabs = [] for center, xlb in zip(centers, xlabs): _xlabs.append([center, str(xlb)]) fig_kwargs["axes"]["x_values_and_labels"] = _xlabs ############################################### Figure self.statslegend = "" self.edges = edges self.centers = centers self.bins = edges # internal used by "like" Figure.__init__(self, xlim, ylim, aspect, padding, **fig_kwargs) if not self.yscale: return rs = [] maxheigth = 0 if fill: ##################### if outline: gap = 0 for i in range(len(centers)): binsize = binsizes[i] p0 = (edges[i] + gap * binsize, 0, 0) p1 = (edges[i + 1] - gap * binsize, counts[i], 0) if radius: rds = np.array([0, 0, radius, radius]) p1_yscaled = [p1[0], p1[1] * self.yscale, 0] r = shapes.Rectangle(p0, p1_yscaled, radius=rds * binsize, res=6) r.scale([1, 1 / self.yscale, 1]) r.radius = None # so it doesnt get recreated and rescaled by insert() else: r = shapes.Rectangle(p0, p1) if texture: r.texture(texture) c = "w" r.PickableOff() maxheigth = max(maxheigth, p1[1]) if c in colors.cmaps_names: col = colors.color_map((p0[0] + p1[0]) / 2, c, edges[0], edges[-1]) else: col = cols[i] r.color(col).alpha(alpha).lighting("off") r.name = f"bar_{i}" r.z(self.ztolerance) rs.append(r) elif outline: ##################### lns = [[edges[0], 0, 0]] for i in range(len(centers)): lns.append([edges[i], counts[i], 0]) lns.append([edges[i + 1], counts[i], 0]) maxheigth = max(maxheigth, counts[i]) lns.append([edges[-1], 0, 0]) outl = shapes.Line(lns, c=lc, alpha=alpha, lw=lw).z(self.ztolerance) outl.name = f"bar_outline_{i}" rs.append(outl) if errors: ##################### for x, f in centers: err = np.sqrt(f) el = shapes.Line([x, f - err / 2, 0], [x, f + err / 2, 0], c=lc, alpha=alpha, lw=lw) el.z(self.ztolerance * 2) rs.append(el) self.insert(*rs, as3d=False) self.name = "PlotBars" ######################################################################################### class PlotXY(Figure): """Creates a `PlotXY(Figure)` object.""" def __init__( self, # data, xerrors=None, yerrors=None, # lw=2, lc=None, la=1, dashed=False, splined=False, # elw=2, # error line width ec=None, # error line or band color error_band=False, # errors in x are ignored # marker="", ms=None, mc=None, ma=None, # Figure and axes options: like=None, xlim=None, ylim=(None, None), aspect=4 / 3, padding=0.05, # title="", xtitle=" ", ytitle=" ", ac="k", grid=True, ztolerance=None, label="", **fig_kwargs, ): """ Arguments: xerrors : (bool) show error bars associated to each point in x yerrors : (bool) show error bars associated to each point in y lw : (int) width of the line connecting points in pixel units. Set it to 0 to remove the line. lc : (str) line color la : (float) line "alpha", opacity of the line dashed : (bool) draw a dashed line instead of a continuous line splined : (bool) spline the line joining the point as a countinous curve elw : (int) width of error bar lines in units of pixels ec : (color) color of error bar, by default the same as marker color error_band : (bool) represent errors on y as a filled error band. Use `ec` keyword to modify its color. marker : (str, int) use a marker for the data points ms : (float) marker size mc : (color) color of the marker ma : (float) opacity of the marker xlim : (list) set limits to the range for the x variable ylim : (list) set limits to the range for the y variable aspect : (float, str) Desired aspect ratio. Use `aspect="equal"` to force the same units in x and y. Scaling factor is saved in Figure.yscale. padding : (float, list) keep a padding space from the axes (as a fraction of the axis size). This can be a list of four numbers. title : (str) title to appear on the top of the frame, like a header. xtitle : (str) title for the x-axis, can also be set using `axes=dict(xtitle="my x axis")` ytitle : (str) title for the y-axis, can also be set using `axes=dict(ytitle="my y axis")` ac : (str) axes color grid : (bool) show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` ztolerance : (float) a tolerance factor to superimpose objects (along the z-axis). Example: ```python import numpy as np from vedo.pyplot import plot x = np.arange(0, np.pi, 0.1) fig = plot(x, np.sin(2*x), 'r0-', aspect='equal') fig+= plot(x, np.cos(2*x), 'blue4 o-', like=fig) fig.show().close() ``` ![](https://vedo.embl.es/images/feats/plotxy.png) Examples: - [plot_errbars.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_errbars.py) - [plot_errband.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_errband.py) - [plot_pip.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_pip.py) ![](https://vedo.embl.es/images/pyplot/plot_pip.png) - [scatter1.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/scatter1.py) - [scatter2.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/scatter2.py) ![](https://vedo.embl.es/images/pyplot/scatter2.png) """ line = False if lw > 0: line = True if marker == "" and not line and not splined: marker = "o" if like is None and vedo.last_figure is not None: if xlim is None and ylim == (None, None): like = vedo.last_figure if like is not None: xlim = like.xlim ylim = like.ylim aspect = like.aspect padding = like.padding if utils.is_sequence(xlim): # deal with user passing eg [x0, None] _x0, _x1 = xlim if _x0 is None: _x0 = data.min() if _x1 is None: _x1 = data.max() xlim = [_x0, _x1] # purge NaN from data validIds = np.all(np.logical_not(np.isnan(data))) data = np.array(data[validIds])[0] fig_kwargs["title"] = title fig_kwargs["xtitle"] = xtitle fig_kwargs["ytitle"] = ytitle fig_kwargs["ac"] = ac fig_kwargs["ztolerance"] = ztolerance fig_kwargs["grid"] = grid x0, y0 = np.min(data, axis=0) x1, y1 = np.max(data, axis=0) if xerrors is not None and not error_band: x0 = min(data[:, 0] - xerrors) x1 = max(data[:, 0] + xerrors) if yerrors is not None: y0 = min(data[:, 1] - yerrors) y1 = max(data[:, 1] + yerrors) if like is None: if xlim is None: xlim = (None, None) xlim = list(xlim) if xlim[0] is None: xlim[0] = x0 if xlim[1] is None: xlim[1] = x1 ylim = list(ylim) if ylim[0] is None: ylim[0] = y0 if ylim[1] is None: ylim[1] = y1 self.entries = len(data) self.mean = data.mean() self.std = data.std() ######### the PlotXY marker # fall back solutions logic for colors if "c" in fig_kwargs: if mc is None: mc = fig_kwargs["c"] if lc is None: lc = fig_kwargs["c"] if ec is None: ec = fig_kwargs["c"] if lc is None: lc = "k" if mc is None: mc = lc if ma is None: ma = la if ec is None: if mc is None: ec = lc else: ec = mc if label: nlab = LabelData() nlab.text = label nlab.tcolor = ac nlab.marker = marker if line and marker == "": nlab.marker = "-" nlab.mcolor = mc fig_kwargs["label"] = nlab ############################################### Figure init Figure.__init__(self, xlim, ylim, aspect, padding, **fig_kwargs) if not self.yscale: return acts = [] ######### the PlotXY Line or Spline if dashed: l = shapes.DashedLine(data, c=lc, alpha=la, lw=lw) acts.append(l) elif splined: l = shapes.KSpline(data).lw(lw).c(lc).alpha(la) acts.append(l) elif line: l = shapes.Line(data, c=lc, alpha=la).lw(lw) acts.append(l) if marker: pts = np.c_[data, np.zeros(len(data))] if utils.is_sequence(ms): ### variable point size mk = shapes.Marker(marker, s=1) mk.scale([1, 1 / self.yscale, 1]) msv = np.zeros_like(pts) msv[:, 0] = ms marked = shapes.Glyph( pts, mk, c=mc, orientation_array=msv, scale_by_vector_size=True ) else: ### fixed point size if ms is None: ms = (xlim[1] - xlim[0]) / 100.0 if utils.is_sequence(mc): fig_kwargs["marker_color"] = None # for labels mk = shapes.Marker(marker, s=ms) mk.scale([1, 1 / self.yscale, 1]) msv = np.zeros_like(pts) msv[:, 0] = 1 marked = shapes.Glyph( pts, mk, c=mc, orientation_array=msv, scale_by_vector_size=True ) else: mk = shapes.Marker(marker, s=ms) mk.scale([1, 1 / self.yscale, 1]) marked = shapes.Glyph(pts, mk, c=mc) marked.name = "Marker" marked.alpha(ma) marked.z(3 * self.ztolerance) acts.append(marked) ######### the PlotXY marker errors ztol = self.ztolerance if error_band: yerrors = np.abs(yerrors) du = np.array(data) dd = np.array(data) du[:, 1] += yerrors dd[:, 1] -= yerrors if splined: res = len(data) * 20 band1 = shapes.KSpline(du, res=res) band2 = shapes.KSpline(dd, res=res) band = shapes.Ribbon(band1, band2, res=(res, 2)) else: dd = list(reversed(dd.tolist())) band = shapes.Line(du.tolist() + dd, closed=True) band.triangulate().lw(0) if ec is None: band.c(lc) else: band.c(ec) band.lighting("off").alpha(la).z(ztol / 20) acts.append(band) else: ## xerrors if xerrors is not None: if len(xerrors) == len(data): errs = [] for i, val in enumerate(data): xval, yval = val xerr = xerrors[i] / 2 el = shapes.Line((xval - xerr, yval, ztol), (xval + xerr, yval, ztol)) el.lw(elw) errs.append(el) mxerrs = merge(errs).c(ec).lw(lw).alpha(ma).z(2 * ztol) acts.append(mxerrs) else: vedo.logger.error("in PlotXY(xerrors=...): mismatch in array length") ## yerrors if yerrors is not None: if len(yerrors) == len(data): errs = [] for i, val in enumerate(data): xval, yval = val yerr = yerrors[i] el = shapes.Line((xval, yval - yerr, ztol), (xval, yval + yerr, ztol)) el.lw(elw) errs.append(el) myerrs = merge(errs).c(ec).lw(lw).alpha(ma).z(2 * ztol) acts.append(myerrs) else: vedo.logger.error("in PlotXY(yerrors=...): mismatch in array length") self.insert(*acts, as3d=False) self.name = "PlotXY" def plot(*args, **kwargs): """ Draw a 2D line plot, or scatter plot, of variable x vs variable y. Input format can be either `[allx], [allx, ally] or [(x1,y1), (x2,y2), ...]` Use `like=...` if you want to use the same format of a previously created Figure (useful when superimposing Figures) to make sure they are compatible and comparable. If they are not compatible you will receive an error message. Arguments: xerrors : (bool) show error bars associated to each point in x yerrors : (bool) show error bars associated to each point in y lw : (int) width of the line connecting points in pixel units. Set it to 0 to remove the line. lc : (str) line color la : (float) line "alpha", opacity of the line dashed : (bool) draw a dashed line instead of a continuous line splined : (bool) spline the line joining the point as a countinous curve elw : (int) width of error bar lines in units of pixels ec : (color) color of error bar, by default the same as marker color error_band : (bool) represent errors on y as a filled error band. Use `ec` keyword to modify its color. marker : (str, int) use a marker for the data points ms : (float) marker size mc : (color) color of the marker ma : (float) opacity of the marker xlim : (list) set limits to the range for the x variable ylim : (list) set limits to the range for the y variable aspect : (float) Desired aspect ratio. If None, it is automatically calculated to get a reasonable aspect ratio. Scaling factor is saved in Figure.yscale padding : (float, list) keep a padding space from the axes (as a fraction of the axis size). This can be a list of four numbers. title : (str) title to appear on the top of the frame, like a header. xtitle : (str) title for the x-axis, can also be set using `axes=dict(xtitle="my x axis")` ytitle : (str) title for the y-axis, can also be set using `axes=dict(ytitle="my y axis")` ac : (str) axes color grid : (bool) show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` ztolerance : (float) a tolerance factor to superimpose objects (along the z-axis). Example: ```python from vedo.pyplot import plot import numpy as np x = np.linspace(0, 6.28, num=50) plot(np.sin(x), 'r').plot(np.cos(x), 'bo-').show().close() ``` Examples: - [plot_errbars.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_errbars.py) - [plot_errband.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_errband.py) - [plot_pip.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_pip.py) ![](https://vedo.embl.es/images/pyplot/plot_pip.png) - [scatter1.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/scatter1.py) - [scatter2.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/scatter2.py) ------------------------------------------------------------------------- .. note:: mode="bar" Creates a `PlotBars(Figure)` object. Input must be in format `[counts, labels, colors, edges]`. Either or both `edges` and `colors` are optional and can be omitted. Arguments: errors : (bool) show error bars logscale : (bool) use logscale on y-axis fill : (bool) fill bars with solid color `c` gap : (float) leave a small space btw bars radius : (float) border radius of the top of the histogram bar. Default value is 0.1. texture : (str) url or path to an image to be used as texture for the bin outline : (bool) show outline of the bins xtitle : (str) title for the x-axis, can also be set using `axes=dict(xtitle="my x axis")` ytitle : (str) title for the y-axis, can also be set using `axes=dict(ytitle="my y axis")` ac : (str) axes color padding : (float, list) keep a padding space from the axes (as a fraction of the axis size). This can be a list of four numbers. aspect : (float) the desired aspect ratio of the figure. Default is 4/3. grid : (bool) show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` Examples: - [histo_1d_a.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_a.py) - [histo_1d_b.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_b.py) - [histo_1d_c.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_c.py) - [histo_1d_d.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_d.py) ![](https://vedo.embl.es/images/pyplot/histo_1D.png) ---------------------------------------------------------------------- .. note:: 2D functions If input is an external function or a formula, draw the surface representing the function `f(x,y)`. Arguments: x : (float) x range of values y : (float) y range of values zlimits : (float) limit the z range of the independent variable zlevels : (int) will draw the specified number of z-levels contour lines show_nan : (bool) show where the function does not exist as red points bins : (list) number of bins in x and y Examples: - [plot_fxy.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_fxy.py) ![](https://vedo.embl.es/images/pyplot/plot_fxy.png) -------------------------------------------------------------------- .. note:: mode="complex" If `mode='complex'` draw the real value of the function and color map the imaginary part. Arguments: cmap : (str) diverging color map (white means `imag(z)=0`) lw : (float) line with of the binning bins : (list) binning in x and y Examples: - [plot_fxy.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_fxy.py) ![](https://user-images.githubusercontent.com/32848391/73392962-1709a300-42db-11ea-9278-30c9d6e5eeaa.png) -------------------------------------------------------------------- .. note:: mode="polar" If `mode='polar'` input arrays are interpreted as a list of polar angles and radii. Build a polar (radar) plot by joining the set of points in polar coordinates. Arguments: title : (str) plot title tsize : (float) title size bins : (int) number of bins in phi r1 : (float) inner radius r2 : (float) outer radius lsize : (float) label size c : (color) color of the line ac : (color) color of the frame and labels alpha : (float) opacity of the frame ps : (int) point size in pixels, if ps=0 no point is drawn lw : (int) line width in pixels, if lw=0 no line is drawn deg : (bool) input array is in degrees vmax : (float) normalize radius to this maximum value fill : (bool) fill convex area with solid color splined : (bool) interpolate the set of input points show_disc : (bool) draw the outer ring axis nrays : (int) draw this number of axis rays (continuous and dashed) show_lines : (bool) draw lines to the origin show_angles : (bool) draw angle values Examples: - [histo_polar.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_polar.py) ![](https://user-images.githubusercontent.com/32848391/64992590-7fc82400-d8d4-11e9-9c10-795f4756a73f.png) -------------------------------------------------------------------- .. note:: mode="spheric" If `mode='spheric'` input must be an external function rho(theta, phi). A surface is created in spherical coordinates. Return an `Figure(Assembly)` of 2 objects: the unit sphere (in wireframe representation) and the surface `rho(theta, phi)`. Arguments: rfunc : function handle to a user defined function `rho(theta, phi)`. normalize : (bool) scale surface to fit inside the unit sphere res : (int) grid resolution of the unit sphere scalarbar : (bool) add a 3D scalarbar to the plot for radius c : (color) color of the unit sphere alpha : (float) opacity of the unit sphere cmap : (str) color map for the surface Examples: - [plot_spheric.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/plot_spheric.py) ![](https://vedo.embl.es/images/pyplot/plot_spheric.png) """ mode = kwargs.pop("mode", "") if "spher" in mode: return _plot_spheric(args[0], **kwargs) if "bar" in mode: return PlotBars(args[0], **kwargs) if isinstance(args[0], str) or "function" in str(type(args[0])): if "complex" in mode: return _plot_fz(args[0], **kwargs) return _plot_fxy(args[0], **kwargs) # grab the matplotlib-like options optidx = None for i, a in enumerate(args): if i > 0 and isinstance(a, str): optidx = i break if optidx: opts = args[optidx].replace(" ", "") if "--" in opts: opts = opts.replace("--", "") kwargs["dashed"] = True elif "-" in opts: opts = opts.replace("-", "") else: kwargs["lw"] = 0 symbs = [".", "o", "O", "0", "p", "*", "h", "D", "d", "v", "^", ">", "<", "s", "x", "a"] allcols = list(colors.colors.keys()) + list(colors.color_nicks.keys()) for cc in allcols: if cc == "o": continue if cc in opts: opts = opts.replace(cc, "") kwargs["lc"] = cc kwargs["mc"] = cc break for ss in symbs: if ss in opts: opts = opts.replace(ss, "", 1) kwargs["marker"] = ss break opts.replace(" ", "") if opts: vedo.logger.error(f"in plot(), could not understand option(s): {opts}") if optidx == 1 or optidx is None: if utils.is_sequence(args[0][0]) and len(args[0][0]) > 1: # print('------------- case 1', 'plot([(x,y),..])') data = np.asarray(args[0]) # (x,y) x = np.asarray(data[:, 0]) y = np.asarray(data[:, 1]) elif len(args) == 1 or optidx == 1: # print('------------- case 2', 'plot(x)') if "pandas" in str(type(args[0])): if "ytitle" not in kwargs: kwargs.update({"ytitle": args[0].name.replace("_", "_ ")}) x = np.linspace(0, len(args[0]), num=len(args[0])) y = np.asarray(args[0]).ravel() elif utils.is_sequence(args[1]): # print('------------- case 3', 'plot(allx,ally)',str(type(args[0]))) if "pandas" in str(type(args[0])): if "xtitle" not in kwargs: kwargs.update({"xtitle": args[0].name.replace("_", "_ ")}) if "pandas" in str(type(args[1])): if "ytitle" not in kwargs: kwargs.update({"ytitle": args[1].name.replace("_", "_ ")}) x = np.asarray(args[0]).ravel() y = np.asarray(args[1]).ravel() elif utils.is_sequence(args[0]) and utils.is_sequence(args[0][0]): # print('------------- case 4', 'plot([allx,ally])') x = np.asarray(args[0][0]).ravel() y = np.asarray(args[0][1]).ravel() elif optidx == 2: # print('------------- case 5', 'plot(x,y)') x = np.asarray(args[0]).ravel() y = np.asarray(args[1]).ravel() else: vedo.logger.error(f"plot(): Could not understand input arguments {args}") return None if "polar" in mode: return _plot_polar(np.c_[x, y], **kwargs) return PlotXY(np.c_[x, y], **kwargs) def histogram(*args, **kwargs): """ Histogramming for 1D and 2D data arrays. This is meant as a convenience function that creates the appropriate object based on the shape of the provided input data. Use keyword `like=...` if you want to use the same format of a previously created Figure (useful when superimposing Figures) to make sure they are compatible and comparable. If they are not compatible you will receive an error message. ------------------------------------------------------------------------- .. note:: default mode, for 1D arrays Creates a `Histogram1D(Figure)` object. Arguments: weights : (list) An array of weights, of the same shape as `data`. Each value in `data` only contributes its associated weight towards the bin count (instead of 1). bins : (int) number of bins vrange : (list) restrict the range of the histogram density : (bool) normalize the area to 1 by dividing by the nr of entries and bin size logscale : (bool) use logscale on y-axis fill : (bool) fill bars with solid color `c` gap : (float) leave a small space btw bars radius : (float) border radius of the top of the histogram bar. Default value is 0.1. texture : (str) url or path to an image to be used as texture for the bin outline : (bool) show outline of the bins errors : (bool) show error bars xtitle : (str) title for the x-axis, can also be set using `axes=dict(xtitle="my x axis")` ytitle : (str) title for the y-axis, can also be set using `axes=dict(ytitle="my y axis")` padding : (float, list) keep a padding space from the axes (as a fraction of the axis size). This can be a list of four numbers. aspect : (float) the desired aspect ratio of the histogram. Default is 4/3. grid : (bool) show the background grid for the axes, can also be set using `axes=dict(xygrid=True)` ztolerance : (float) a tolerance factor to superimpose objects (along the z-axis). Examples: - [histo_1d_a.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_a.py) - [histo_1d_b.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_b.py) - [histo_1d_c.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_c.py) - [histo_1d_d.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_1d_d.py) ![](https://vedo.embl.es/images/pyplot/histo_1D.png) ------------------------------------------------------------------------- .. note:: default mode, for 2D arrays Input data formats `[(x1,x2,..), (y1,y2,..)] or [(x1,y1), (x2,y2),..]` are both valid. Arguments: bins : (list) binning as (nx, ny) weights : (list) array of weights to assign to each entry cmap : (str, lookuptable) color map name or look up table alpha : (float) opacity of the histogram gap : (float) separation between adjacent bins as a fraction for their size. Set gap=-1 to generate a quad surface. scalarbar : (bool) add a scalarbar to right of the histogram like : (Figure) grab and use the same format of the given Figure (for superimposing) xlim : (list) [x0, x1] range of interest. If left to None will automatically choose the minimum or the maximum of the data range. Data outside the range are completely ignored. ylim : (list) [y0, y1] range of interest. If left to None will automatically choose the minimum or the maximum of the data range. Data outside the range are completely ignored. aspect : (float) the desired aspect ratio of the figure. title : (str) title of the plot to appear on top. If left blank some statistics will be shown. xtitle : (str) x axis title ytitle : (str) y axis title ztitle : (str) title for the scalar bar ac : (str) axes color, additional keyword for Axes can also be added using e.g. `axes=dict(xygrid=True)` Examples: - [histo_2d_a.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_2d_a.py) - [histo_2d_b.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_2d_b.py) ![](https://vedo.embl.es/images/pyplot/histo_2D.png) ------------------------------------------------------------------------- .. note:: mode="3d" If `mode='3d'`, build a 2D histogram as 3D bars from a list of x and y values. Arguments: xtitle : (str) x axis title bins : (int) nr of bins for the smaller range in x or y vrange : (list) range in x and y in format `[(xmin,xmax), (ymin,ymax)]` norm : (float) sets a scaling factor for the z axis (frequency axis) fill : (bool) draw solid hexagons cmap : (str) color map name for elevation gap : (float) keep a internal empty gap between bins [0,1] zscale : (float) rescale the (already normalized) zaxis for visual convenience Examples: - [histo_2d_b.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/pyplot/histo_2d_b.py) ------------------------------------------------------------------------- .. note:: mode="hexbin" If `mode='hexbin'`, build a hexagonal histogram from a list of x and y values. Arguments: xtitle : (str) x axis title bins : (int) nr of bins for the smaller range in x or y vrange : (list) range in x and y in format `[(xmin,xmax), (ymin,ymax)]` norm : (float) sets a scaling factor for the z axis (frequency axis) fill : (bool) draw solid hexagons cmap : (str) color map name for elevation Examples: - [histo_hexagonal.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_hexagonal.py) ![](https://vedo.embl.es/images/pyplot/histo_hexagonal.png) ------------------------------------------------------------------------- .. note:: mode="polar" If `mode='polar'` assume input is polar coordinate system (rho, theta): Arguments: weights : (list) Array of weights, of the same shape as the input. Each value only contributes its associated weight towards the bin count (instead of 1). title : (str) histogram title tsize : (float) title size bins : (int) number of bins in phi r1 : (float) inner radius r2 : (float) outer radius phigap : (float) gap angle btw 2 radial bars, in degrees rgap : (float) gap factor along radius of numeric angle labels lpos : (float) label gap factor along radius lsize : (float) label size c : (color) color of the histogram bars, can be a list of length `bins` bc : (color) color of the frame and labels alpha : (float) opacity of the frame cmap : (str) color map name deg : (bool) input array is in degrees vmin : (float) minimum value of the radial axis vmax : (float) maximum value of the radial axis labels : (list) list of labels, must be of length `bins` show_disc : (bool) show the outer ring axis nrays : (int) draw this number of axis rays (continuous and dashed) show_lines : (bool) show lines to the origin show_angles : (bool) show angular values show_errors : (bool) show error bars Examples: - [histo_polar.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_polar.py) ![](https://vedo.embl.es/images/pyplot/histo_polar.png) ------------------------------------------------------------------------- .. note:: mode="spheric" If `mode='spheric'`, build a histogram from list of theta and phi values. Arguments: rmax : (float) maximum radial elevation of bin res : (int) sphere resolution cmap : (str) color map name lw : (int) line width of the bin edges Examples: - [histo_spheric.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/histo_spheric.py) ![](https://vedo.embl.es/images/pyplot/histo_spheric.png) """ mode = kwargs.pop("mode", "") if len(args) == 2: # x, y if "spher" in mode: return _histogram_spheric(args[0], args[1], **kwargs) if "hex" in mode: return _histogram_hex_bin(args[0], args[1], **kwargs) if "3d" in mode.lower(): return _histogram_quad_bin(args[0], args[1], **kwargs) return Histogram2D(args[0], args[1], **kwargs) elif len(args) == 1: if isinstance(args[0], vedo.Volume): data = args[0].pointdata[0] elif isinstance(args[0], vedo.Points): pd0 = args[0].pointdata[0] if pd0: data = pd0.ravel() else: data = args[0].celldata[0].ravel() else: try: if "pandas" in str(type(args[0])): if "xtitle" not in kwargs: kwargs.update({"xtitle": args[0].name.replace("_", "_ ")}) except: pass data = np.asarray(args[0]) if "spher" in mode: return _histogram_spheric(args[0][:, 0], args[0][:, 1], **kwargs) if data.ndim == 1: if "polar" in mode: return _histogram_polar(data, **kwargs) return Histogram1D(data, **kwargs) if "hex" in mode: return _histogram_hex_bin(args[0][:, 0], args[0][:, 1], **kwargs) if "3d" in mode.lower(): return _histogram_quad_bin(args[0][:, 0], args[0][:, 1], **kwargs) return Histogram2D(args[0], **kwargs) vedo.logger.error(f"in histogram(): could not understand input {args[0]}") return None def fit( points, deg=1, niter=0, nstd=3, xerrors=None, yerrors=None, vrange=None, res=250, lw=3, c="red4" ): """ Polynomial fitting with parameter error and error bands calculation. Errors bars in both x and y are supported. Returns a `vedo.shapes.Line` object. Additional information about the fitting output can be accessed with: `fitd = fit(pts)` - `fitd.coefficients` will contain the coefficients of the polynomial fit - `fitd.coefficient_errors`, errors on the fitting coefficients - `fitd.monte_carlo_coefficients`, fitting coefficient set from MC generation - `fitd.covariance_matrix`, covariance matrix as a numpy array - `fitd.reduced_chi2`, reduced chi-square of the fitting - `fitd.ndof`, number of degrees of freedom - `fitd.data_sigma`, mean data dispersion from the central fit assuming `Chi2=1` - `fitd.error_lines`, a `vedo.shapes.Line` object for the upper and lower error band - `fitd.error_band`, the `vedo.mesh.Mesh` object representing the error band Errors on x and y can be specified. If left to `None` an estimate is made from the statistical spread of the dataset itself. Errors are always assumed gaussian. Arguments: deg : (int) degree of the polynomial to be fitted niter : (int) number of monte-carlo iterations to compute error bands. If set to 0, return the simple least-squares fit with naive error estimation on coefficients only. A reasonable non-zero value to set is about 500, in this case *error_lines*, *error_band* and the other class attributes are filled nstd : (float) nr. of standard deviation to use for error calculation xerrors : (list) array of the same length of points with the errors on x yerrors : (list) array of the same length of points with the errors on y vrange : (list) specify the domain range of the fitting line (only affects visualization, but can be used to extrapolate the fit outside the data range) res : (int) resolution of the output fitted line and error lines Examples: - [fit_polynomial1.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/fit_polynomial1.py) ![](https://vedo.embl.es/images/pyplot/fitPolynomial1.png) """ if isinstance(points, vedo.pointcloud.Points): points = points.points() points = np.asarray(points) if len(points) == 2: # assume user is passing [x,y] points = np.c_[points[0], points[1]] x = points[:, 0] y = points[:, 1] # ignore z n = len(x) ndof = n - deg - 1 if vrange is not None: x0, x1 = vrange else: x0, x1 = np.min(x), np.max(x) if xerrors is not None: x0 -= xerrors[0] / 2 x1 += xerrors[-1] / 2 tol = (x1 - x0) / 10000 xr = np.linspace(x0, x1, res) # project x errs on y if xerrors is not None: xerrors = np.asarray(xerrors) if yerrors is not None: yerrors = np.asarray(yerrors) w = 1.0 / yerrors coeffs = np.polyfit(x, y, deg, w=w, rcond=None) else: coeffs = np.polyfit(x, y, deg, rcond=None) # update yerrors, 1 bootstrap iteration is enough p1d = np.poly1d(coeffs) der = (p1d(x + tol) - p1d(x)) / tol yerrors = np.sqrt(yerrors * yerrors + np.power(der * xerrors, 2)) if yerrors is not None: yerrors = np.asarray(yerrors) w = 1.0 / yerrors coeffs, V = np.polyfit(x, y, deg, w=w, rcond=None, cov=True) else: w = 1 coeffs, V = np.polyfit(x, y, deg, rcond=None, cov=True) p1d = np.poly1d(coeffs) theor = p1d(xr) fitl = shapes.Line(xr, theor, lw=lw, c=c).z(tol * 2) fitl.coefficients = coeffs fitl.covariance_matrix = V residuals2_sum = np.sum(np.power(p1d(x) - y, 2)) / ndof sigma = np.sqrt(residuals2_sum) fitl.reduced_chi2 = np.sum(np.power((p1d(x) - y) * w, 2)) / ndof fitl.ndof = ndof fitl.data_sigma = sigma # worked out from data using chi2=1 hypo fitl.name = "LinearPolynomialFit" if not niter: fitl.coefficient_errors = np.sqrt(np.diag(V)) return fitl ################################ if yerrors is not None: sigma = yerrors else: w = None fitl.reduced_chi2 = 1 Theors, all_coeffs = [], [] for i in range(niter): noise = np.random.randn(n) * sigma coeffs = np.polyfit(x, y + noise, deg, w=w, rcond=None) all_coeffs.append(coeffs) P1d = np.poly1d(coeffs) Theor = P1d(xr) Theors.append(Theor) all_coeffs = np.array(all_coeffs) fitl.monte_carlo_coefficients = all_coeffs stds = np.std(Theors, axis=0) fitl.coefficient_errors = np.std(all_coeffs, axis=0) # check distributions on the fly # for i in range(deg+1): # histogram(all_coeffs[:,i],title='par'+str(i)).show(new=1) # histogram(all_coeffs[:,0], all_coeffs[:,1], # xtitle='param0', ytitle='param1',scalarbar=1).show(new=1) # histogram(all_coeffs[:,1], all_coeffs[:,2], # xtitle='param1', ytitle='param2').show(new=1) # histogram(all_coeffs[:,0], all_coeffs[:,2], # xtitle='param0', ytitle='param2').show(new=1) error_lines = [] for i in [nstd, -nstd]: el = shapes.Line(xr, theor + stds * i, lw=1, alpha=0.2, c="k").z(tol) error_lines.append(el) el.name = "ErrorLine for sigma=" + str(i) fitl.error_lines = error_lines l1 = error_lines[0].points().tolist() cband = l1 + list(reversed(error_lines[1].points().tolist())) + [l1[0]] fitl.error_band = shapes.Line(cband).triangulate().lw(0).c("k", 0.15) fitl.error_band.name = "PolynomialFitErrorBand" return fitl def _plot_fxy( z, xlim=(0, 3), ylim=(0, 3), zlim=(None, None), show_nan=True, zlevels=10, c=None, bc="aqua", alpha=1, texture="", bins=(100, 100), axes=True, ): if c is not None: texture = None # disable ps = vtk.vtkPlaneSource() ps.SetResolution(bins[0], bins[1]) ps.SetNormal([0, 0, 1]) ps.Update() poly = ps.GetOutput() dx = xlim[1] - xlim[0] dy = ylim[1] - ylim[0] todel, nans = [], [] for i in range(poly.GetNumberOfPoints()): px, py, _ = poly.GetPoint(i) xv = (px + 0.5) * dx + xlim[0] yv = (py + 0.5) * dy + ylim[0] try: with warnings.catch_warnings(): warnings.simplefilter("ignore") zv = z(xv, yv) if np.isnan(zv) or np.isinf(zv) or np.iscomplex(zv): zv = 0 todel.append(i) nans.append([xv, yv, 0]) except: zv = 0 todel.append(i) nans.append([xv, yv, 0]) poly.GetPoints().SetPoint(i, [xv, yv, zv]) if todel: cellIds = vtk.vtkIdList() poly.BuildLinks() for i in todel: poly.GetPointCells(i, cellIds) for j in range(cellIds.GetNumberOfIds()): poly.DeleteCell(cellIds.GetId(j)) # flag cell poly.RemoveDeletedCells() cl = vtk.vtkCleanPolyData() cl.SetInputData(poly) cl.Update() poly = cl.GetOutput() if not poly.GetNumberOfPoints(): vedo.logger.error("function is not real in the domain") return None if zlim[0]: tmpact1 = Mesh(poly) a = tmpact1.cut_with_plane((0, 0, zlim[0]), (0, 0, 1)) poly = a.polydata() if zlim[1]: tmpact2 = Mesh(poly) a = tmpact2.cut_with_plane((0, 0, zlim[1]), (0, 0, -1)) poly = a.polydata() cmap = "" if c in colors.cmaps_names: cmap = c c = None bc = None mesh = Mesh(poly, c, alpha).compute_normals().lighting("plastic") if cmap: mesh.compute_elevation().cmap(cmap) if bc: mesh.bc(bc) if texture: mesh.texture(texture) acts = [mesh] if zlevels: elevation = vtk.vtkElevationFilter() elevation.SetInputData(poly) bounds = poly.GetBounds() elevation.SetLowPoint(0, 0, bounds[4]) elevation.SetHighPoint(0, 0, bounds[5]) elevation.Update() bcf = vtk.vtkBandedPolyDataContourFilter() bcf.SetInputData(elevation.GetOutput()) bcf.SetScalarModeToValue() bcf.GenerateContourEdgesOn() bcf.GenerateValues(zlevels, elevation.GetScalarRange()) bcf.Update() zpoly = bcf.GetContourEdgesOutput() zbandsact = Mesh(zpoly, "k", alpha).lw(1).lighting("off") zbandsact.mapper().SetResolveCoincidentTopologyToPolygonOffset() acts.append(zbandsact) if show_nan and todel: bb = mesh.GetBounds() if bb[4] <= 0 and bb[5] >= 0: zm = 0.0 else: zm = (bb[4] + bb[5]) / 2 nans = np.array(nans) + [0, 0, zm] nansact = shapes.Points(nans, r=2, c="red5", alpha=alpha) nansact.GetProperty().RenderPointsAsSpheresOff() acts.append(nansact) if isinstance(axes, dict): axs = addons.Axes(mesh, **axes) acts.append(axs) elif axes: axs = addons.Axes(mesh) acts.append(axs) assem = Assembly(acts) assem.name = "PlotFxy" return assem def _plot_fz( z, x=(-1, 1), y=(-1, 1), zlimits=(None, None), cmap="PiYG", alpha=1, lw=0.1, bins=(75, 75), axes=True, ): ps = vtk.vtkPlaneSource() ps.SetResolution(bins[0], bins[1]) ps.SetNormal([0, 0, 1]) ps.Update() poly = ps.GetOutput() dx = x[1] - x[0] dy = y[1] - y[0] arrImg = [] for i in range(poly.GetNumberOfPoints()): px, py, _ = poly.GetPoint(i) xv = (px + 0.5) * dx + x[0] yv = (py + 0.5) * dy + y[0] try: zv = z(complex(xv), complex(yv)) except: zv = 0 poly.GetPoints().SetPoint(i, [xv, yv, np.real(zv)]) arrImg.append(np.imag(zv)) mesh = Mesh(poly, alpha).lighting("plastic") v = max(abs(np.min(arrImg)), abs(np.max(arrImg))) mesh.cmap(cmap, arrImg, vmin=-v, vmax=v) mesh.compute_normals().lw(lw) if zlimits[0]: mesh.cut_with_plane((0, 0, zlimits[0]), (0, 0, 1)) if zlimits[1]: mesh.cut_with_plane((0, 0, zlimits[1]), (0, 0, -1)) acts = [mesh] if axes: axs = addons.Axes(mesh, ztitle="Real part") acts.append(axs) asse = Assembly(acts) asse.name = "PlotFz" if isinstance(z, str): asse.name += " " + z return asse def _plot_polar( rphi, title="", tsize=0.1, lsize=0.05, r1=0, r2=1, c="blue", bc="k", alpha=1, ps=5, lw=3, deg=False, vmax=None, fill=False, splined=False, nrays=8, show_disc=True, show_lines=True, show_angles=True, ): if len(rphi) == 2: rphi = np.stack((rphi[0], rphi[1]), axis=1) rphi = np.array(rphi, dtype=float) thetas = rphi[:, 0] radii = rphi[:, 1] k = 180 / np.pi if deg: thetas = np.array(thetas, dtype=float) / k vals = [] for v in thetas: # normalize range t = np.arctan2(np.sin(v), np.cos(v)) if t < 0: t += 2 * np.pi vals.append(t) thetas = np.array(vals, dtype=float) if vmax is None: vmax = np.max(radii) angles = [] points = [] for t, r in zip(thetas, radii): r = r / vmax * r2 + r1 ct, st = np.cos(t), np.sin(t) points.append([r * ct, r * st, 0]) p0 = points[0] points.append(p0) r2e = r1 + r2 lines = None if splined: lines = shapes.KSpline(points, closed=True) lines.c(c).lw(lw).alpha(alpha) elif lw: lines = shapes.Line(points) lines.c(c).lw(lw).alpha(alpha) points.pop() ptsact = None if ps: ptsact = shapes.Points(points, r=ps, c=c, alpha=alpha) filling = None if fill and lw: faces = [] coords = [[0, 0, 0]] + lines.points().tolist() for i in range(1, lines.npoints): faces.append([0, i, i + 1]) filling = Mesh([coords, faces]).c(c).alpha(alpha) back = None back2 = None if show_disc: back = shapes.Disc(r1=r2e, r2=r2e * 1.01, c=bc, res=(1, 360)) back.z(-0.01).lighting("off").alpha(alpha) back2 = shapes.Disc(r1=r2e / 2, r2=r2e / 2 * 1.005, c=bc, res=(1, 360)) back2.z(-0.01).lighting("off").alpha(alpha) ti = None if title: ti = shapes.Text3D(title, (0, 0, 0), s=tsize, depth=0, justify="top-center") ti.pos(0, -r2e * 1.15, 0.01) rays = [] if show_disc: rgap = 0.05 for t in np.linspace(0, 2 * np.pi, num=nrays, endpoint=False): ct, st = np.cos(t), np.sin(t) if show_lines: l = shapes.Line((0, 0, -0.01), (r2e * ct * 1.03, r2e * st * 1.03, -0.01)) rays.append(l) ct2, st2 = np.cos(t + np.pi / nrays), np.sin(t + np.pi / nrays) lm = shapes.DashedLine((0, 0, -0.01), (r2e * ct2, r2e * st2, -0.01), spacing=0.25) rays.append(lm) elif show_angles: # just the ticks l = shapes.Line( (r2e * ct * 0.98, r2e * st * 0.98, -0.01), (r2e * ct * 1.03, r2e * st * 1.03, -0.01), ) if show_angles: if 0 <= t < np.pi / 2: ju = "bottom-left" elif t == np.pi / 2: ju = "bottom-center" elif np.pi / 2 < t <= np.pi: ju = "bottom-right" elif np.pi < t < np.pi * 3 / 2: ju = "top-right" elif t == np.pi * 3 / 2: ju = "top-center" else: ju = "top-left" a = shapes.Text3D(int(t * k), pos=(0, 0, 0), s=lsize, depth=0, justify=ju) a.pos(r2e * ct * (1 + rgap), r2e * st * (1 + rgap), -0.01) angles.append(a) mrg = merge(back, back2, angles, rays, ti) if mrg: mrg.color(bc).alpha(alpha).lighting("off") rh = Assembly([lines, ptsact, filling] + [mrg]) rh.base = np.array([0, 0, 0], dtype=float) rh.top = np.array([0, 0, 1], dtype=float) rh.name = "PlotPolar" return rh def _plot_spheric(rfunc, normalize=True, res=33, scalarbar=True, c="grey", alpha=0.05, cmap="jet"): sg = shapes.Sphere(res=res, quads=True) sg.alpha(alpha).c(c).wireframe() cgpts = sg.points() r, theta, phi = utils.cart2spher(*cgpts.T) newr, inans = [], [] for i in range(len(r)): try: ri = rfunc(theta[i], phi[i]) if np.isnan(ri): inans.append(i) newr.append(1) else: newr.append(ri) except: inans.append(i) newr.append(1) newr = np.array(newr, dtype=float) if normalize: newr = newr / np.max(newr) newr[inans] = 1 nanpts = [] if inans: redpts = utils.spher2cart(newr[inans], theta[inans], phi[inans]) nanpts.append(shapes.Points(redpts, r=4, c="r")) pts = utils.spher2cart(newr, theta, phi) ssurf = sg.clone().points(pts) if inans: ssurf.delete_cells_by_point_index(inans) ssurf.alpha(1).wireframe(0).lw(0.1) ssurf.cmap(cmap, newr) ssurf.compute_normals() if scalarbar: xm = np.max([np.max(pts[0]), 1]) ym = np.max([np.abs(np.max(pts[1])), 1]) ssurf.mapper().SetScalarRange(np.min(newr), np.max(newr)) sb3d = ssurf.add_scalarbar3d(size=(xm * 0.07, ym), c="k").scalarbar sb3d.rotate_x(90).pos(xm * 1.1, 0, -0.5) else: sb3d = None sg.pickable(False) asse = Assembly([ssurf, sg] + nanpts + [sb3d]) asse.name = "PlotSpheric" return asse def _histogram_quad_bin(x, y, **kwargs): # generate a histogram with 3D bars # histo = Histogram2D(x, y, **kwargs) gap = kwargs.pop("gap", 0) zscale = kwargs.pop("zscale", 1) cmap = kwargs.pop("cmap", "Blues_r") gr = histo.actors[2] d = gr.diagonal_size() tol = d / 1_000_000 # tolerance if gap >= 0: gr.shrink(1 - gap - tol) gr.map_cells_to_points() faces = np.array(gr.faces()) s = 1 / histo.entries * len(faces) * zscale zvals = gr.pointdata["Scalars"] * s pts1 = gr.points() pts2 = np.copy(pts1) pts2[:, 2] = zvals + tol newpts = np.vstack([pts1, pts2]) newzvals = np.hstack([zvals, zvals]) / s n = pts1.shape[0] newfaces = [] for f in faces: f0, f1, f2, f3 = f f0n, f1n, f2n, f3n = f + n newfaces.extend( [ [f0, f1, f2, f3], [f0n, f1n, f2n, f3n], [f0, f1, f1n, f0n], [f1, f2, f2n, f1n], [f2, f3, f3n, f2n], [f3, f0, f0n, f3n], ] ) msh = Mesh([newpts, newfaces]).pickable(False) msh.cmap(cmap, newzvals, name="Frequency") msh.lw(1).lighting("ambient") histo.actors[2] = msh histo.RemovePart(gr) histo.AddPart(msh) return histo def _histogram_hex_bin( xvalues, yvalues, bins=12, norm=1, fill=True, c=None, cmap="terrain_r", alpha=1 ): xmin, xmax = np.min(xvalues), np.max(xvalues) ymin, ymax = np.min(yvalues), np.max(yvalues) dx, dy = xmax - xmin, ymax - ymin if utils.is_sequence(bins): n, m = bins else: if xmax - xmin < ymax - ymin: n = bins m = np.rint(dy / dx * n / 1.2 + 0.5).astype(int) else: m = bins n = np.rint(dx / dy * m * 1.2 + 0.5).astype(int) src = vtk.vtkPointSource() src.SetNumberOfPoints(len(xvalues)) src.Update() poly = src.GetOutput() values = np.stack((xvalues, yvalues), axis=1) zs = [[0.0]] * len(values) values = np.append(values, zs, axis=1) poly.GetPoints().SetData(utils.numpy2vtk(values, dtype=np.float32)) cloud = Mesh(poly) col = None if c is not None: col = colors.get_color(c) hexs, binmax = [], 0 ki, kj = 1.33, 1.12 r = 0.47 / n * 1.2 * dx for i in range(n + 3): for j in range(m + 2): cyl = vtk.vtkCylinderSource() cyl.SetResolution(6) cyl.CappingOn() cyl.SetRadius(0.5) cyl.SetHeight(0.1) cyl.Update() t = vtk.vtkTransform() if not i % 2: p = (i / ki, j / kj, 0) else: p = (i / ki, j / kj + 0.45, 0) q = (p[0] / n * 1.2 * dx + xmin, p[1] / m * dy + ymin, 0) ids = cloud.closest_point(q, radius=r, return_cell_id=True) ne = len(ids) if fill: t.Translate(p[0], p[1], ne / 2) t.Scale(1, 1, ne * 10) else: t.Translate(p[0], p[1], ne) t.RotateX(90) # put it along Z tf = vtk.vtkTransformPolyDataFilter() tf.SetInputData(cyl.GetOutput()) tf.SetTransform(t) tf.Update() if c is None: col = i h = Mesh(tf.GetOutput(), c=col, alpha=alpha).flat() h.lighting("plastic") h.PickableOff() hexs.append(h) if ne > binmax: binmax = ne if cmap is not None: for h in hexs: z = h.GetBounds()[5] col = colors.color_map(z, cmap, 0, binmax) h.color(col) asse = Assembly(hexs) asse.SetScale(1.2 / n * dx, 1 / m * dy, norm / binmax * (dx + dy) / 4) asse.SetPosition(xmin, ymin, 0) asse.base = np.array([0, 0, 0], dtype=float) asse.top = np.array([0, 0, 1], dtype=float) asse.name = "HistogramHexBin" return asse def _histogram_polar( values, weights=None, title="", tsize=0.1, bins=16, r1=0.25, r2=1, phigap=0.5, rgap=0.05, lpos=1, lsize=0.04, c="grey", bc="k", alpha=1, cmap=None, deg=False, vmin=None, vmax=None, labels=(), show_disc=True, nrays=8, show_lines=True, show_angles=True, show_errors=False, ): k = 180 / np.pi if deg: values = np.array(values, dtype=float) / k else: values = np.array(values, dtype=float) vals = [] for v in values: # normalize range t = np.arctan2(np.sin(v), np.cos(v)) if t < 0: t += 2 * np.pi vals.append(t + 0.00001) histodata, edges = np.histogram(vals, weights=weights, bins=bins, range=(0, 2 * np.pi)) thetas = [] for i in range(bins): thetas.append((edges[i] + edges[i + 1]) / 2) if vmin is None: vmin = np.min(histodata) if vmax is None: vmax = np.max(histodata) errors = np.sqrt(histodata) r2e = r1 + r2 if show_errors: r2e += np.max(errors) / vmax * 1.5 back = None if show_disc: back = shapes.Disc(r1=r2e, r2=r2e * 1.01, c=bc, res=(1, 360)) back.z(-0.01) slices = [] lines = [] angles = [] errbars = [] for i, t in enumerate(thetas): r = histodata[i] / vmax * r2 d = shapes.Disc((0, 0, 0), r1, r1 + r, res=(1, 360)) delta = np.pi / bins - np.pi / 2 - phigap / k d.cut_with_plane(normal=(np.cos(t + delta), np.sin(t + delta), 0)) d.cut_with_plane(normal=(np.cos(t - delta), np.sin(t - delta), 0)) if cmap is not None: cslice = colors.color_map(histodata[i], cmap, vmin, vmax) d.color(cslice) else: if c is None: d.color(i) elif utils.is_sequence(c) and len(c) == bins: d.color(c[i]) else: d.color(c) d.alpha(alpha).lighting("off") slices.append(d) ct, st = np.cos(t), np.sin(t) if show_errors: show_lines = False err = np.sqrt(histodata[i]) / vmax * r2 errl = shapes.Line( ((r1 + r - err) * ct, (r1 + r - err) * st, 0.01), ((r1 + r + err) * ct, (r1 + r + err) * st, 0.01), ) errl.alpha(alpha).lw(3).color(bc) errbars.append(errl) labs = [] rays = [] if show_disc: outerdisc = shapes.Disc(r1=r2e, r2=r2e * 1.01, c=bc, res=(1, 360)) outerdisc.z(-0.01) innerdisc = shapes.Disc(r1=r2e / 2, r2=r2e / 2 * 1.005, c=bc, res=(1, 360)) innerdisc.z(-0.01) rays.append(outerdisc) rays.append(innerdisc) rgap = 0.05 for t in np.linspace(0, 2 * np.pi, num=nrays, endpoint=False): ct, st = np.cos(t), np.sin(t) if show_lines: l = shapes.Line((0, 0, -0.01), (r2e * ct * 1.03, r2e * st * 1.03, -0.01)) rays.append(l) ct2, st2 = np.cos(t + np.pi / nrays), np.sin(t + np.pi / nrays) lm = shapes.DashedLine((0, 0, -0.01), (r2e * ct2, r2e * st2, -0.01), spacing=0.25) rays.append(lm) elif show_angles: # just the ticks l = shapes.Line( (r2e * ct * 0.98, r2e * st * 0.98, -0.01), (r2e * ct * 1.03, r2e * st * 1.03, -0.01), ) if show_angles: if 0 <= t < np.pi / 2: ju = "bottom-left" elif t == np.pi / 2: ju = "bottom-center" elif np.pi / 2 < t <= np.pi: ju = "bottom-right" elif np.pi < t < np.pi * 3 / 2: ju = "top-right" elif t == np.pi * 3 / 2: ju = "top-center" else: ju = "top-left" a = shapes.Text3D(int(t * k), pos=(0, 0, 0), s=lsize, depth=0, justify=ju) a.pos(r2e * ct * (1 + rgap), r2e * st * (1 + rgap), -0.01) angles.append(a) ti = None if title: ti = shapes.Text3D(title, (0, 0, 0), s=tsize, depth=0, justify="top-center") ti.pos(0, -r2e * 1.15, 0.01) for i, t in enumerate(thetas): if i < len(labels): lab = shapes.Text3D( labels[i], (0, 0, 0), s=lsize, depth=0, justify="center" # font="VTK", ) lab.pos( r2e * np.cos(t) * (1 + rgap) * lpos / 2, r2e * np.sin(t) * (1 + rgap) * lpos / 2, 0.01, ) labs.append(lab) mrg = merge(lines, angles, rays, ti, labs) if mrg: mrg.color(bc).lighting("off") acts = slices + errbars + [mrg] asse = Assembly(acts) asse.frequencies = histodata asse.bins = edges asse.name = "HistogramPolar" return asse def _histogram_spheric(thetavalues, phivalues, rmax=1.2, res=8, cmap="rainbow", gap=0.1): x, y, z = utils.spher2cart(np.ones_like(thetavalues) * 1.1, thetavalues, phivalues) ptsvals = np.c_[x, y, z] sg = shapes.Sphere(res=res, quads=True).shrink(1 - gap) sgfaces = sg.faces() sgpts = sg.points() cntrs = sg.cell_centers() counts = np.zeros(len(cntrs)) for p in ptsvals: cell = sg.closest_point(p, return_cell_id=True) counts[cell] += 1 acounts = np.array(counts, dtype=float) counts *= (rmax - 1) / np.max(counts) for cell, cn in enumerate(counts): if not cn: continue fs = sgfaces[cell] pts = sgpts[fs] _, t1, p1 = utils.cart2spher(pts[:, 0], pts[:, 1], pts[:, 2]) x, y, z = utils.spher2cart(1 + cn, t1, p1) sgpts[fs] = np.c_[x, y, z] sg.points(sgpts) sg.cmap(cmap, acounts, on="cells") vals = sg.celldata["Scalars"] faces = sg.faces() points = sg.points().tolist() + [[0.0, 0.0, 0.0]] lp = len(points) - 1 newfaces = [] newvals = [] for i, f in enumerate(faces): p0, p1, p2, p3 = f newfaces.append(f) newfaces.append([p0, lp, p1]) newfaces.append([p1, lp, p2]) newfaces.append([p2, lp, p3]) newfaces.append([p3, lp, p0]) for _ in range(5): newvals.append(vals[i]) newsg = Mesh([points, newfaces]).cmap(cmap, newvals, on="cells") newsg.compute_normals().flat() newsg.name = "HistogramSpheric" return newsg def donut( fractions, title="", tsize=0.3, r1=1.7, r2=1, phigap=0, lpos=0.8, lsize=0.15, c=None, bc="k", alpha=1, labels=(), show_disc=False, ): """ Donut plot or pie chart. Arguments: title : (str) plot title tsize : (float) title size r1 : (float) inner radius r2 : (float) outer radius, starting from r1 phigap : (float) gap angle btw 2 radial bars, in degrees lpos : (float) label gap factor along radius lsize : (float) label size c : (color) color of the plot slices bc : (color) color of the disc frame alpha : (float) opacity of the disc frame labels : (list) list of labels show_disc : (bool) show the outer ring axis Examples: - [donut.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/donut.py) ![](https://vedo.embl.es/images/pyplot/donut.png) """ fractions = np.array(fractions, dtype=float) angles = np.add.accumulate(2 * np.pi * fractions) angles[-1] = 2 * np.pi if angles[-2] > 2 * np.pi: print("Error in donut(): fractions must sum to 1.") raise RuntimeError cols = [] for i, th in enumerate(np.linspace(0, 2 * np.pi, 360, endpoint=False)): for ia, a in enumerate(angles): if th < a: cols.append(c[ia]) break labs = () if labels: angles = np.concatenate([[0], angles]) labs = [""] * 360 for i in range(len(labels)): a = (angles[i + 1] + angles[i]) / 2 j = int(a / np.pi * 180) labs[j] = labels[i] data = np.linspace(0, 2 * np.pi, 360, endpoint=False) + 0.005 dn = _histogram_polar( data, title=title, bins=360, r1=r1, r2=r2, phigap=phigap, lpos=lpos, lsize=lsize, tsize=tsize, c=cols, bc=bc, alpha=alpha, vmin=0, vmax=1, labels=labs, show_disc=show_disc, show_lines=0, show_angles=0, show_errors=0, ) dn.name = "Donut" return dn def violin( values, bins=10, vlim=None, x=0, width=3, splined=True, fill=True, c="violet", alpha=1, outline=True, centerline=True, lc="darkorchid", lw=3, ): """ Violin style histogram. Arguments: bins : (int) number of bins vlim : (list) input value limits. Crop values outside range x : (float) x-position of the violin axis width : (float) width factor of the normalized distribution splined : (bool) spline the outline fill : (bool) fill violin with solid color outline : (bool) add the distribution outline centerline : (bool) add the vertical centerline at x lc : (color) line color Examples: - [histo_violin.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/pyplot/histo_violin.py) ![](https://vedo.embl.es/images/pyplot/histo_violin.png) """ fs, edges = np.histogram(values, bins=bins, range=vlim) mine, maxe = np.min(edges), np.max(edges) fs = fs.astype(float) / len(values) * width rs = [] if splined: lnl, lnr = [(0, edges[0], 0)], [(0, edges[0], 0)] for i in range(bins): xc = (edges[i] + edges[i + 1]) / 2 yc = fs[i] lnl.append([-yc, xc, 0]) lnr.append([yc, xc, 0]) lnl.append((0, edges[-1], 0)) lnr.append((0, edges[-1], 0)) spl = shapes.KSpline(lnl).x(x) spr = shapes.KSpline(lnr).x(x) spl.color(lc).alpha(alpha).lw(lw) spr.color(lc).alpha(alpha).lw(lw) if outline: rs.append(spl) rs.append(spr) if fill: rb = shapes.Ribbon(spl, spr, c=c, alpha=alpha).lighting("off") rs.append(rb) else: lns1 = [[0, mine, 0]] for i in range(bins): lns1.append([fs[i], edges[i], 0]) lns1.append([fs[i], edges[i + 1], 0]) lns1.append([0, maxe, 0]) lns2 = [[0, mine, 0]] for i in range(bins): lns2.append([-fs[i], edges[i], 0]) lns2.append([-fs[i], edges[i + 1], 0]) lns2.append([0, maxe, 0]) if outline: rs.append(shapes.Line(lns1, c=lc, alpha=alpha, lw=lw).x(x)) rs.append(shapes.Line(lns2, c=lc, alpha=alpha, lw=lw).x(x)) if fill: for i in range(bins): p0 = (-fs[i], edges[i], 0) p1 = (fs[i], edges[i + 1], 0) r = shapes.Rectangle(p0, p1).x(p0[0] + x) r.color(c).alpha(alpha).lighting("off") rs.append(r) if centerline: cl = shapes.Line([0, mine, 0.01], [0, maxe, 0.01], c=lc, alpha=alpha, lw=2).x(x) rs.append(cl) asse = Assembly(rs) asse.name = "Violin" return asse def whisker(data, s=0.25, c="k", lw=2, bc="blue", alpha=0.25, r=5, jitter=True, horizontal=False): """ Generate a "whisker" bar from a 1-dimensional dataset. Arguments: s : (float) size of the box c : (color) color of the lines lw : (float) line width bc : (color) color of the box alpha : (float) transparency of the box r : (float) point radius in pixels (use value 0 to disable) jitter : (bool) add some randomness to points to avoid overlap horizontal : (bool) set horizontal layout Examples: - [whiskers.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/pyplot/whiskers.py) ![](https://vedo.embl.es/images/pyplot/whiskers.png) """ xvals = np.zeros_like(np.asarray(data)) if jitter: xjit = np.random.randn(len(xvals)) * s / 9 xjit = np.clip(xjit, -s / 2.1, s / 2.1) xvals += xjit dmean = np.mean(data) dq05 = np.quantile(data, 0.05) dq25 = np.quantile(data, 0.25) dq75 = np.quantile(data, 0.75) dq95 = np.quantile(data, 0.95) pts = None if r: pts = shapes.Points([xvals, data], c=c, r=r) rec = shapes.Rectangle([-s / 2, dq25], [s / 2, dq75], c=bc, alpha=alpha) rec.GetProperty().LightingOff() rl = shapes.Line([[-s / 2, dq25], [s / 2, dq25], [s / 2, dq75], [-s / 2, dq75]], closed=True) l1 = shapes.Line([0, dq05, 0], [0, dq25, 0], c=c, lw=lw) l2 = shapes.Line([0, dq75, 0], [0, dq95, 0], c=c, lw=lw) lm = shapes.Line([-s / 2, dmean], [s / 2, dmean]) lns = merge(l1, l2, lm, rl) asse = Assembly([lns, rec, pts]) if horizontal: asse.rotate_z(-90) asse.name = "Whisker" asse.info["mean"] = dmean asse.info["quantile_05"] = dq05 asse.info["quantile_25"] = dq25 asse.info["quantile_75"] = dq75 asse.info["quantile_95"] = dq95 return asse def streamplot( X, Y, U, V, direction="both", max_propagation=None, mode=1, lw=0.001, c=None, probes=() ): """ Generate a streamline plot of a vectorial field (U,V) defined at positions (X,Y). Returns a `Mesh` object. Arguments: direction : (str) either "forward", "backward" or "both" max_propagation : (float) maximum physical length of the streamline lw : (float) line width in absolute units mode : (int) mode of varying the line width: - 0 - do not vary line width - 1 - vary line width by first vector component - 2 - vary line width vector magnitude - 3 - vary line width by absolute value of first vector component Examples: - [plot_stream.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/pyplot/plot_stream.py) ![](https://vedo.embl.es/images/pyplot/plot_stream.png) """ n = len(X) m = len(Y[0]) if n != m: print("Limitation in streamplot(): only square grids are allowed.", n, m) raise RuntimeError() xmin, xmax = X[0][0], X[-1][-1] ymin, ymax = Y[0][0], Y[-1][-1] field = np.sqrt(U * U + V * V) vol = vedo.Volume(field, dims=(n, n, 1)) uf = np.ravel(U, order="F") vf = np.ravel(V, order="F") vects = np.c_[uf, vf, np.zeros_like(uf)] vol.pointdata["StreamPlotField"] = vects if len(probes) == 0: probe = shapes.Grid(pos=((n - 1) / 2, (n - 1) / 2, 0), s=(n - 1, n - 1), res=(n - 1, n - 1)) else: if isinstance(probes, vedo.Points): probes = probes.points() else: probes = np.array(probes, dtype=float) if len(probes[0]) == 2: probes = np.c_[probes[:, 0], probes[:, 1], np.zeros(len(probes))] sv = [(n - 1) / (xmax - xmin), (n - 1) / (ymax - ymin), 1] probes = probes - [xmin, ymin, 0] probes = np.multiply(probes, sv) probe = vedo.Points(probes) stream = vedo.shapes.StreamLines( vol, probe, tubes={"radius": lw, "mode": mode}, lw=lw, max_propagation=max_propagation, direction=direction, ) if c is not None: stream.color(c) else: stream.add_scalarbar() stream.lighting("off") stream.scale([1 / (n - 1) * (xmax - xmin), 1 / (n - 1) * (ymax - ymin), 1]) stream.shift(xmin, ymin) return stream def matrix( M, title="Matrix", xtitle="", ytitle="", xlabels=(), ylabels=(), xrotation=0, cmap="Reds", vmin=None, vmax=None, precision=2, font="Theemim", scale=0, scalarbar=True, lc="white", lw=0, c="black", alpha=1, ): """ Generate a matrix, or a 2D color-coded plot with bin labels. Returns an `Assembly` object. Arguments: M : (list, numpy array) the input array to visualize title : (str) title of the plot xtitle : (str) title of the horizontal colmuns ytitle : (str) title of the vertical rows xlabels : (list) individual string labels for each column. Must be of length m ylabels : (list) individual string labels for each row. Must be of length n xrotation : (float) rotation of the horizontal labels cmap : (str) color map name vmin : (float) minimum value of the colormap range vmax : (float) maximum value of the colormap range precision : (int) number of digits for the matrix entries or bins font : (str) font name. Check [available fonts here](https://vedo.embl.es/fonts). scale : (float) size of the numeric entries or bin values scalarbar : (bool) add a scalar bar to the right of the plot lc : (str) color of the line separating the bins lw : (float) Width of the line separating the bins c : (str) text color alpha : (float) plot transparency Examples: - [np_matrix.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/pyplot/np_matrix.py) ![](https://vedo.embl.es/images/pyplot/np_matrix.png) """ M = np.asarray(M) n, m = M.shape gr = shapes.Grid(res=(m, n), s=(m / (m + n) * 2, n / (m + n) * 2), c=c, alpha=alpha) gr.wireframe(False).lc(lc).lw(lw) matr = np.flip(np.flip(M), axis=1).ravel(order="C") gr.cmap(cmap, matr, on="cells", vmin=vmin, vmax=vmax) sbar = None if scalarbar: gr.add_scalarbar3d(title_font=font, label_font=font) sbar = gr.scalarbar labs = None if scale != 0: labs = gr.labels( on="cells", scale=scale / max(m, n), precision=precision, font=font, justify="center", c=c, ) labs.z(0.001) t = None if title: if title == "Matrix": title += " " + str(n) + "x" + str(m) t = shapes.Text3D(title, font=font, s=0.04, justify="bottom-center", c=c) t.shift(0, n / (m + n) * 1.05) xlabs = None if len(xlabels) == m: xlabs = [] jus = "top-center" if xrotation > 44: jus = "right-center" for i in range(m): xl = shapes.Text3D(xlabels[i], font=font, s=0.02, justify=jus, c=c).rotate_z(xrotation) xl.shift((2 * i - m + 1) / (m + n), -n / (m + n) * 1.05) xlabs.append(xl) ylabs = None if len(ylabels) == n: ylabels = list(reversed(ylabels)) ylabs = [] for i in range(n): yl = shapes.Text3D(ylabels[i], font=font, s=0.02, justify="right-center", c=c) yl.shift(-m / (m + n) * 1.05, (2 * i - n + 1) / (m + n)) ylabs.append(yl) xt = None if xtitle: xt = shapes.Text3D(xtitle, font=font, s=0.035, justify="top-center", c=c) xt.shift(0, -n / (m + n) * 1.05) if xlabs is not None: y0, y1 = xlabs[0].ybounds() xt.shift(0, -(y1 - y0) - 0.55 / (m + n)) yt = None if ytitle: yt = shapes.Text3D(ytitle, font=font, s=0.035, justify="bottom-center", c=c).rotate_z(90) yt.shift(-m / (m + n) * 1.05, 0) if ylabs is not None: x0, x1 = ylabs[0].xbounds() yt.shift(-(x1 - x0) - 0.55 / (m + n), 0) asse = Assembly(gr, sbar, labs, t, xt, yt, xlabs, ylabs) asse.name = "Matrix" return asse def CornerPlot(points, pos=1, s=0.2, title="", c="b", bg="k", lines=True, dots=True): """ Return a `vtkXYPlotActor` that is a plot of `x` versus `y`, where `points` is a list of `(x,y)` points. Assign position following this convention: - 1, topleft, - 2, topright, - 3, bottomleft, - 4, bottomright. """ if len(points) == 2: # passing [allx, ally] points = np.stack((points[0], points[1]), axis=1) c = colors.get_color(c) # allow different codings array_x = vtk.vtkFloatArray() array_y = vtk.vtkFloatArray() array_x.SetNumberOfTuples(len(points)) array_y.SetNumberOfTuples(len(points)) for i, p in enumerate(points): array_x.InsertValue(i, p[0]) array_y.InsertValue(i, p[1]) field = vtk.vtkFieldData() field.AddArray(array_x) field.AddArray(array_y) data = vtk.vtkDataObject() data.SetFieldData(field) xyplot = vtk.vtkXYPlotActor() xyplot.AddDataObjectInput(data) xyplot.SetDataObjectXComponent(0, 0) xyplot.SetDataObjectYComponent(0, 1) xyplot.SetXValuesToValue() xyplot.SetAdjustXLabels(0) xyplot.SetAdjustYLabels(0) xyplot.SetNumberOfXLabels(3) xyplot.GetProperty().SetPointSize(5) xyplot.GetProperty().SetLineWidth(2) xyplot.GetProperty().SetColor(colors.get_color(bg)) xyplot.SetPlotColor(0, c[0], c[1], c[2]) xyplot.SetXTitle(title) xyplot.SetYTitle("") xyplot.ExchangeAxesOff() xyplot.SetPlotPoints(dots) if not lines: xyplot.PlotLinesOff() if isinstance(pos, str): spos = 2 if "top" in pos: if "left" in pos: spos = 1 elif "right" in pos: spos = 2 elif "bottom" in pos: if "left" in pos: spos = 3 elif "right" in pos: spos = 4 pos = spos if pos == 1: xyplot.GetPositionCoordinate().SetValue(0.0, 0.8, 0) elif pos == 2: xyplot.GetPositionCoordinate().SetValue(0.76, 0.8, 0) elif pos == 3: xyplot.GetPositionCoordinate().SetValue(0.0, 0.0, 0) elif pos == 4: xyplot.GetPositionCoordinate().SetValue(0.76, 0.0, 0) else: xyplot.GetPositionCoordinate().SetValue(pos[0], pos[1], 0) xyplot.GetPosition2Coordinate().SetValue(s, s, 0) return xyplot def CornerHistogram( values, bins=20, vrange=None, minbin=0, logscale=False, title="", c="g", bg="k", alpha=1, pos="bottom-left", s=0.175, lines=True, dots=False, nmax=None, ): """ Build a histogram from a list of values in n bins. The resulting object is a 2D actor. Use `vrange` to restrict the range of the histogram. Use `nmax` to limit the sampling to this max nr of entries Use `pos` to assign its position: - 1, topleft, - 2, topright, - 3, bottomleft, - 4, bottomright, - (x, y), as fraction of the rendering window """ if hasattr(values, "inputdata"): values = utils.vtk2numpy(values.inputdata().GetPointData().GetScalars()) n = values.shape[0] if nmax and nmax < n: # subsample: idxs = np.linspace(0, n, num=int(nmax), endpoint=False).astype(int) values = values[idxs] fs, edges = np.histogram(values, bins=bins, range=vrange) if minbin: fs = fs[minbin:-1] if logscale: fs = np.log10(fs + 1) pts = [] for i in range(len(fs)): pts.append([(edges[i] + edges[i + 1]) / 2, fs[i]]) cplot = CornerPlot(pts, pos, s, title, c, bg, lines, dots) cplot.SetNumberOfYLabels(2) cplot.SetNumberOfXLabels(3) tprop = vtk.vtkTextProperty() tprop.SetColor(colors.get_color(bg)) tprop.SetFontFamily(vtk.VTK_FONT_FILE) tprop.SetFontFile(utils.get_font_path(vedo.settings.default_font)) tprop.SetOpacity(alpha) cplot.SetAxisTitleTextProperty(tprop) cplot.GetProperty().SetOpacity(alpha) cplot.GetXAxisActor2D().SetLabelTextProperty(tprop) cplot.GetXAxisActor2D().SetTitleTextProperty(tprop) cplot.GetXAxisActor2D().SetFontFactor(0.55) cplot.GetYAxisActor2D().SetLabelFactor(0.0) cplot.GetYAxisActor2D().LabelVisibilityOff() return cplot class DirectedGraph(Assembly): """ Support for Directed Graphs. """ def __init__(self, **kargs): """ A graph consists of a collection of nodes (without postional information) and a collection of edges connecting pairs of nodes. The task is to determine the node positions only based on their connections. This class is derived from class `Assembly`, and it assembles 4 Mesh objects representing the graph, the node labels, edge labels and edge arrows. Arguments: c : (color) Color of the Graph n : (int) number of the initial set of nodes layout : (int, str) layout in `['2d', 'fast2d', 'clustering2d', 'circular', 'circular3d', 'cone', 'force', 'tree']`. Each of these layouts has different available options. --------------------------------------------------------------- .. note:: Options for layouts '2d', 'fast2d' and 'clustering2d' Arguments: seed : (int) seed of the random number generator used to jitter point positions rest_distance : (float) manually set the resting distance nmax : (int) the maximum number of iterations to be used zrange : (list) expand 2d graph along z axis. --------------------------------------------------------------- .. note:: Options for layouts 'circular', and 'circular3d': Arguments: radius : (float) set the radius of the circles height : (float) set the vertical (local z) distance between the circles zrange : (float) expand 2d graph along z axis --------------------------------------------------------------- .. note:: Options for layout 'cone' Arguments: compactness : (float) ratio between the average width of a cone in the tree, and the height of the cone. compression : (bool) put children closer together, possibly allowing sub-trees to overlap. This is useful if the tree is actually the spanning tree of a graph. spacing : (float) space between layers of the tree --------------------------------------------------------------- .. note:: Options for layout 'force' Arguments: seed : (int) seed the random number generator used to jitter point positions bounds : (list) set the region in space in which to place the final graph nmax : (int) the maximum number of iterations to be used three_dimensional : (bool) allow optimization in the 3rd dimension too random_initial_points : (bool) use random positions within the graph bounds as initial points Examples: - [lineage_graph.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/pyplot/lineage_graph.py) ![](https://vedo.embl.es/images/pyplot/graph_lineage.png) - [graph_network.py](https://github.com/marcomusy/vedo/tree/master/examples/examples/pyplot/graph_network.py) ![](https://vedo.embl.es/images/pyplot/graph_network.png) """ vedo.Assembly.__init__(self) self.nodes = [] self.edges = [] self._node_labels = [] # holds strings self._edge_labels = [] self.edge_orientations = [] self.edge_glyph_position = 0.6 self.zrange = 0.0 self.rotX = 0 self.rotY = 0 self.rotZ = 0 self.arrow_scale = 0.15 self.node_label_scale = None self.node_label_justify = "bottom-left" self.edge_label_scale = None self.mdg = vtk.vtkMutableDirectedGraph() n = kargs.pop("n", 0) for _ in range(n): self.add_node() self._c = kargs.pop("c", (0.3, 0.3, 0.3)) self.gl = vtk.vtkGraphLayout() self.font = kargs.pop("font", "") s = kargs.pop("layout", "2d") if isinstance(s, int): ss = ["2d", "fast2d", "clustering2d", "circular", "circular3d", "cone", "force", "tree"] s = ss[s] self.layout = s if "2d" in s: if "clustering" in s: self.strategy = vtk.vtkClustering2DLayoutStrategy() elif "fast" in s: self.strategy = vtk.vtkFast2DLayoutStrategy() else: self.strategy = vtk.vtkSimple2DLayoutStrategy() self.rotX = 180 opt = kargs.pop("rest_distance", None) if opt is not None: self.strategy.SetRestDistance(opt) opt = kargs.pop("seed", None) if opt is not None: self.strategy.SetRandomSeed(opt) opt = kargs.pop("nmax", None) if opt is not None: self.strategy.SetMaxNumberOfIterations(opt) self.zrange = kargs.pop("zrange", 0) elif "circ" in s: if "3d" in s: self.strategy = vtk.vtkSimple3DCirclesStrategy() self.strategy.SetDirection(0, 0, -1) self.strategy.SetAutoHeight(True) self.strategy.SetMethod(1) self.rotX = -90 opt = kargs.pop("radius", None) # float if opt is not None: self.strategy.SetMethod(0) self.strategy.SetRadius(opt) # float opt = kargs.pop("height", None) if opt is not None: self.strategy.SetAutoHeight(False) self.strategy.SetHeight(opt) # float else: self.strategy = vtk.vtkCircularLayoutStrategy() self.zrange = kargs.pop("zrange", 0) elif "cone" in s: self.strategy = vtk.vtkConeLayoutStrategy() self.rotX = 180 opt = kargs.pop("compactness", None) if opt is not None: self.strategy.SetCompactness(opt) opt = kargs.pop("compression", None) if opt is not None: self.strategy.SetCompression(opt) opt = kargs.pop("spacing", None) if opt is not None: self.strategy.SetSpacing(opt) elif "force" in s: self.strategy = vtk.vtkForceDirectedLayoutStrategy() opt = kargs.pop("seed", None) if opt is not None: self.strategy.SetRandomSeed(opt) opt = kargs.pop("bounds", None) if opt is not None: self.strategy.SetAutomaticBoundsComputation(False) self.strategy.SetGraphBounds(opt) # list opt = kargs.pop("nmax", None) if opt is not None: self.strategy.SetMaxNumberOfIterations(opt) # int opt = kargs.pop("three_dimensional", True) if opt is not None: self.strategy.SetThreeDimensionalLayout(opt) # bool opt = kargs.pop("random_initial_points", None) if opt is not None: self.strategy.SetRandomInitialPoints(opt) # bool elif "tree" in s: self.strategy = vtk.vtkSpanTreeLayoutStrategy() self.rotX = 180 else: vedo.logger.error(f"Cannot understand layout {s}. Available layouts:") vedo.logger.error("[2d,fast2d,clustering2d,circular,circular3d,cone,force,tree]") raise RuntimeError() self.gl.SetLayoutStrategy(self.strategy) if len(kargs) > 0: vedo.logger.error(f"Cannot understand options: {kargs}") def add_node(self, label="id"): """Add a new node to the `Graph`.""" v = self.mdg.AddVertex() # vtk calls it vertex.. self.nodes.append(v) if label == "id": label = int(v) self._node_labels.append(str(label)) return v def add_edge(self, v1, v2, label=""): """Add a new edge between to nodes. An extra node is created automatically if needed.""" nv = len(self.nodes) if v1 >= nv: for _ in range(nv, v1 + 1): self.add_node() nv = len(self.nodes) if v2 >= nv: for _ in range(nv, v2 + 1): self.add_node() e = self.mdg.AddEdge(v1, v2) self.edges.append(e) self._edge_labels.append(str(label)) return e def add_child(self, v, node_label="id", edge_label=""): """Add a new edge to a new node as its child. The extra node is created automatically if needed.""" nv = len(self.nodes) if v >= nv: for _ in range(nv, v + 1): self.add_node() child = self.mdg.AddChild(v) self.edges.append((v, child)) self.nodes.append(child) if node_label == "id": node_label = int(child) self._node_labels.append(str(node_label)) self._edge_labels.append(str(edge_label)) return child def build(self): """ Build the `DirectedGraph(Assembly)`. Accessory objects are also created for labels and arrows. """ self.gl.SetZRange(self.zrange) self.gl.SetInputData(self.mdg) self.gl.Update() gr2poly = vtk.vtkGraphToPolyData() gr2poly.EdgeGlyphOutputOn() gr2poly.SetEdgeGlyphPosition(self.edge_glyph_position) gr2poly.SetInputData(self.gl.GetOutput()) gr2poly.Update() dgraph = Mesh(gr2poly.GetOutput(0)) # dgraph.clean() # WRONG!!! dont uncomment dgraph.flat().color(self._c).lw(2) dgraph.name = "DirectedGraph" diagsz = self.diagonal_size() / 1.42 if not diagsz: return None dgraph.SetScale(1 / diagsz) if self.rotX: dgraph.rotate_x(self.rotX) if self.rotY: dgraph.rotate_y(self.rotY) if self.rotZ: dgraph.rotate_z(self.rotZ) vecs = gr2poly.GetOutput(1).GetPointData().GetVectors() self.edge_orientations = utils.vtk2numpy(vecs) # Use Glyph3D to repeat the glyph on all edges. arrows = None if self.arrow_scale: arrow_source = vtk.vtkGlyphSource2D() arrow_source.SetGlyphTypeToEdgeArrow() arrow_source.SetScale(self.arrow_scale) arrow_source.Update() arrow_glyph = vtk.vtkGlyph3D() arrow_glyph.SetInputData(0, gr2poly.GetOutput(1)) arrow_glyph.SetInputData(1, arrow_source.GetOutput()) arrow_glyph.Update() arrows = Mesh(arrow_glyph.GetOutput()) arrows.SetScale(1 / diagsz) arrows.lighting("off").color(self._c) if self.rotX: arrows.rotate_x(self.rotX) if self.rotY: arrows.rotate_y(self.rotY) if self.rotZ: arrows.rotate_z(self.rotZ) arrows.name = "DirectedGraphArrows" node_labels = dgraph.labels( self._node_labels, scale=self.node_label_scale, precision=0, font=self.font, justify=self.node_label_justify, ) node_labels.color(self._c).pickable(True) node_labels.name = "DirectedGraphNodeLabels" edge_labels = dgraph.labels( self._edge_labels, on="cells", scale=self.edge_label_scale, precision=0, font=self.font ) edge_labels.color(self._c).pickable(True) edge_labels.name = "DirectedGraphEdgeLabels" Assembly.__init__(self, [dgraph, node_labels, edge_labels, arrows]) self.name = "DirectedGraphAssembly" return self vedo-2023.4.6/vedo/settings.py000066400000000000000000000561211444463326400160730ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os __docformat__ = "google" class Settings: """ General settings to modify the global behavior Usage Example: ```python from vedo import settings, Cube settings.use_parallel_projection = True Cube().color('g').show().close() ``` List of available properties: ```python # Set a default for the font to be used for axes, comments etc. default_font = 'Normografo' # check font options in shapes.Text # Palette number when using an integer to choose a color palette = 0 screenshot_transparent_background = False screeshot_large_image = False # Sometimes setting this to True gives better results # [DISABLED] Allow to continuously interact with scene during interactive() execution allow_interaction = True # Enable tracking pipeline functionality: # allows to show a graph with the pipeline of action which let to a final object # this is achieved by calling "myobj.pipeline.show()" (a new window will pop up) self.enable_pipeline = True # Set up default mouse and keyboard functionalities enable_default_mouse_callbacks = True enable_default_keyboard_callbacks = True # If False, when multiple renderers are present do not render each one for separate # but do it just once at the end (when interactive() is called) immediate_rendering = True # Show a gray frame margin in multirendering windows renderer_frame_color = None renderer_frame_alpha = 0.5 renderer_frame_width = 0.5 renderer_frame_padding = 0.0001 # In multirendering mode set the position of the horizontal of vertical splitting [0,1] window_splitting_position = None # Enable / disable color printing by printc() enable_print_color = True # Wrap lines in tubes render_lines_as_tubes = False # Smoothing options point_smoothing = False line_smoothing = False polygon_smoothing = False # Remove hidden lines when in wireframe mode hidden_line_removal = False # Turn on/off the automatic repositioning of lights as the camera moves. light_follows_camera = False two_sided_lighting = True # Turn on/off rendering of translucent material with depth peeling technique. use_depth_peeling = False alpha_bit_planes = True # options only active if useDepthPeeling=True multi_samples = 8 # force to not pick a framebuffer with a multisample buffer max_number_of_peels= 4 # maximum number of rendering passes occlusion_ratio = 0.0 # occlusion ratio, 0 = exact image. # Turn on/off nvidia FXAA post-process anti-aliasing, if supported. use_fxaa = False # either True or False # By default, the depth buffer is reset for each renderer. # If True, use the existing depth buffer preserve_depth_buffer = False # Use a polygon/edges offset to possibly resolve conflicts in rendering use_polygon_offset = False polygon_offset_factor = 0.1 polygon_offset_units = 0.1 # Interpolate scalars to render them smoothly interpolate_scalars_before_mapping = True # Set parallel projection On or Off (place camera to infinity, no perspective effects) use_parallel_projection = False # Set orientation type when reading TIFF files (volumes): # TOPLEFT 1 (row 0 top, col 0 lhs) TOPRIGHT 2 (row 0 top, col 0 rhs) # BOTRIGHT 3 (row 0 bottom, col 0 rhs) BOTLEFT 4 (row 0 bottom, col 0 lhs) # LEFTTOP 5 (row 0 lhs, col 0 top) RIGHTTOP 6 (row 0 rhs, col 0 top) # RIGHTBOT 7 (row 0 rhs, col 0 bottom) LEFTBOT 8 (row 0 lhs, col 0 bottom) tiff_orientation_type = 1 # Annotated cube axis type nr. 5 options: annotated_cube_color = (0.75, 0.75, 0.75) annotated_cube_text_color = None # use default, otherwise specify a single color annotated_cube_text_scale = 0.2 annotated_cube_texts = ["right","left ", "front","back ", " top ", "bttom"] # Automatically close the Plotter instance after show() in jupyter sessions # setting it to False will keep the current Plotter instance active backend_autoclose = True # k3d settings for jupyter notebooks k3d_menu_visibility = True k3d_plot_height = 512 k3d_antialias = True k3d_lighting = 1.5 k3d_camera_autofit = True k3d_grid_autofit= True k3d_axes_color = "gray4" k3d_axes_helper = 1.0 # size of the small triad of axes on the bottom right k3d_point_shader= "mesh" # others are '3d', '3dSpecular', 'dot', 'flat' k3d_line_shader = "thick" # others are 'flat', 'mesh' ``` """ # Restrict the attributes so accidental typos will generate an AttributeError exception __slots__ = [ "_level", "default_font", "default_backend", "palette", "remember_last_figure_format", "screenshot_transparent_background", "screeshot_large_image", "allow_interaction", "hack_call_screen_size", "enable_default_mouse_callbacks", "enable_default_keyboard_callbacks", "enable_pipeline", "immediate_rendering", "renderer_frame_color", "renderer_frame_alpha", "renderer_frame_width", "renderer_frame_padding", "render_lines_as_tubes", "hidden_line_removal", "point_smoothing", "line_smoothing", "polygon_smoothing", "visible_grid_edges", "light_follows_camera", "two_sided_lighting", "use_depth_peeling", "multi_samples", "alpha_bit_planes", "max_number_of_peels", "occlusion_ratio", "use_fxaa", "preserve_depth_buffer", "use_polygon_offset", "polygon_offset_factor", "polygon_offset_units", "interpolate_scalars_before_mapping", "use_parallel_projection", "window_splitting_position", "tiff_orientation_type", "annotated_cube_color", "annotated_cube_text_color", "annotated_cube_text_scale", "annotated_cube_texts", "enable_print_color", "backend_autoclose", "k3d_menu_visibility", "k3d_plot_height", "k3d_antialias", "k3d_lighting", "k3d_camera_autofit", "k3d_grid_autofit", "k3d_axes_color", "k3d_axes_helper", "k3d_point_shader", "k3d_line_shader", "font_parameters", ] def __init__(self, level=0): self._level = level # Default font self.default_font = "Normografo" # Default backend engine in jupyter notebooks self.default_backend = "vtk" # enable tracking pipeline functionality self.enable_pipeline = True if any(["SPYDER" in name for name in os.environ]): self.default_backend = "vtk" else: try: get_ipython() self.default_backend = "2d" except NameError: pass # Palette number when using an integer to choose a color self.palette = 0 self.remember_last_figure_format = False self.screenshot_transparent_background = False self.screeshot_large_image = False # [DISABLED] Allow to continuously interact with scene during interactor.Start() execution self.allow_interaction = True # BUG in vtk9.0 (if true close works but sometimes vtk crashes, if false doesnt crash but cannot close) # see plotter.py line 555 self.hack_call_screen_size = True # Set up default mouse and keyboard functionalities self.enable_default_mouse_callbacks = True self.enable_default_keyboard_callbacks = True # When multiple renderers are present do not render each one for separate. # but do it just once at the end (when interactive() is called) self.immediate_rendering = True # Show a gray frame margin in multirendering windows self.renderer_frame_color = None self.renderer_frame_alpha = 0.5 self.renderer_frame_width = 0.5 self.renderer_frame_padding = 0.0001 # Wrap lines in tubes self.render_lines_as_tubes = False # Remove hidden lines when in wireframe mode self.hidden_line_removal = False # Smoothing options self.point_smoothing = False self.line_smoothing = False self.polygon_smoothing = False # For Structured and RectilinearGrid: show internal edges not only outline self.visible_grid_edges = False # Turn on/off the automatic repositioning of lights as the camera moves. self.light_follows_camera = False self.two_sided_lighting = True # Turn on/off rendering of translucent material with depth peeling technique. self.use_depth_peeling = False self.multi_samples = 8 self.alpha_bit_planes = 1 self.max_number_of_peels = 4 self.occlusion_ratio = 0.1 # Turn on/off nvidia FXAA anti-aliasing, if supported. self.use_fxaa = False # either True or False # By default, the depth buffer is reset for each renderer. If true, use the existing depth buffer self.preserve_depth_buffer = False # Use a polygon/edges offset to possibly resolve conflicts in rendering self.use_polygon_offset = True self.polygon_offset_factor = 0.1 self.polygon_offset_units = 0.1 # Interpolate scalars to render them smoothly self.interpolate_scalars_before_mapping = True # Set parallel projection On or Off (place camera to infinity, no perspective effects) self.use_parallel_projection = False # In multirendering mode set the position of the horizontal of vertical splitting [0,1] self.window_splitting_position = None # Set orientation type when reading TIFF files (volumes): # TOPLEFT 1 (row 0 top, col 0 lhs) TOPRIGHT 2 (row 0 top, col 0 rhs) # BOTRIGHT 3 (row 0 bottom, col 0 rhs) BOTLEFT 4 (row 0 bottom, col 0 lhs) # LEFTTOP 5 (row 0 lhs, col 0 top) RIGHTTOP 6 (row 0 rhs, col 0 top) # RIGHTBOT 7 (row 0 rhs, col 0 bottom) LEFTBOT 8 (row 0 lhs, col 0 bottom) self.tiff_orientation_type = 1 # AnnotatedCube axis (type 5) customization: self.annotated_cube_color = (0.75, 0.75, 0.75) self.annotated_cube_text_color = None # use default, otherwise specify a single color self.annotated_cube_text_scale = 0.2 self.annotated_cube_texts = ["right", "left ", "front", "back ", " top ", "bttom"] # enable / disable color printing self.enable_print_color = True #################################################################################### # Automatically close the Plotter instance after show() in jupyter sessions, # setting it to False will keep the current Plotter instance active self.backend_autoclose = True # k3d settings for jupyter notebooks self.k3d_menu_visibility = True self.k3d_plot_height = 512 self.k3d_antialias = True self.k3d_lighting = 1.5 self.k3d_camera_autofit = True self.k3d_grid_autofit= True self.k3d_axes_color = "k4" self.k3d_axes_helper = 1.0 # size of the small triad of axes on the bottom right self.k3d_point_shader= "mesh" # others are '3d', '3dSpecular', 'dot', 'flat' self.k3d_line_shader = "thick" # others are 'flat', 'mesh' #################################################################################### #################################################################################### # mono # means that all letters occupy the same space slot horizontally # hspacing # an horizontal stretching factor (affects both letters and words) # lspacing # horizontal spacing inbetween letters (not words) # islocal # is locally stored in /fonts, otherwise it's on vedo.embl.es/fonts # self.font_parameters = dict( Normografo=dict( mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~×", islocal=True, ), Bongas=dict( mono=False, fscale=0.875, hspacing=0.52, lspacing=0.25, dotsep="·", islocal=True, ), Calco=dict( mono=True, fscale=0.8, hspacing=1, lspacing=0.1, dotsep="×", islocal=True, ), Comae=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=1, dotsep="~×", islocal=True, ), ComicMono=dict( mono=True, fscale=0.8, hspacing=1, lspacing=0.1, dotsep="x", islocal=False, ), Edo=dict( mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~x ", islocal=False, ), FiraMonoMedium=dict( mono=True, fscale=0.8, hspacing=1, lspacing=0.1, dotsep="×", islocal=False, ), FiraMonoBold=dict( mono=True, fscale=0.8, hspacing=1, lspacing=0.1, dotsep="×", islocal=False, ), Glasgo=dict( mono=True, fscale=0.75, lspacing=0.1, hspacing=1, dotsep="~×", islocal=True, ), Kanopus=dict( mono=False, fscale=0.75, lspacing=0.15, hspacing=0.75, dotsep="~×", islocal=True, ), LogoType=dict( mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~×", islocal=False, ), Quikhand=dict( mono=False, fscale=0.8, hspacing=0.6, lspacing=0.15, dotsep="~~×~", islocal=True, ), SmartCouric=dict( mono=True, fscale=0.8, hspacing=1.05, lspacing=0.1, dotsep="×", islocal=True, ), Spears=dict( mono=False, fscale=0.8, hspacing=0.5, lspacing=0.2, dotsep="~×", islocal=False, ), Theemim=dict( mono=False, fscale=0.825, hspacing=0.52, lspacing=0.3, dotsep="~~×", islocal=True, ), VictorMono=dict( mono=True, fscale=0.725, hspacing=1, lspacing=0.1, dotsep="×", islocal=True, ), Justino1=dict( mono=True, fscale=0.725, hspacing=1, lspacing=0.1, dotsep="×", islocal=False, ), Justino2=dict( mono=True, fscale=0.725, hspacing=1, lspacing=0.1, dotsep="×", islocal=False, ), Justino3=dict( mono=True, fscale=0.725, hspacing=1, lspacing=0.1, dotsep="×", islocal=False, ), Calibri=dict( mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~×", islocal=False, ), Capsmall=dict( mono=False, fscale=0.8, hspacing=0.75, lspacing=0.15, dotsep="~×", islocal=False, ), Cartoons123=dict( mono=False, fscale=0.8, hspacing=0.75, lspacing=0.15, dotsep="x", islocal=False, ), Vega=dict( mono=False, fscale=0.8, hspacing=0.75, lspacing=0.15, dotsep="×", islocal=False, ), Meson=dict( mono=False, fscale=0.8, hspacing=0.9, lspacing=0.225, dotsep="~×", islocal=False, ), Komika=dict( mono=False, fscale=0.7, hspacing=0.75, lspacing=0.225, dotsep="~×", islocal=False, ), Vogue=dict( mono=False, fscale=0.7, hspacing=0.75, lspacing=0.225, dotsep="~x", islocal=False, ), Brachium=dict( mono=True, fscale=0.8, hspacing=1, lspacing=0.1, dotsep="x", islocal=False, ), Dalim=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=1, dotsep="~×", islocal=False, ), Miro=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=1, dotsep="~×", islocal=False, ), Ubuntu=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=1, dotsep="~×", islocal=False, ), Mizar=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=0.75, dotsep="~×", islocal=False, ), LiberationSans=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=1, dotsep="~×", islocal=False, ), DejavuSansMono=dict( mono=True, fscale=0.725, hspacing=1, lspacing=0.1, dotsep="~×", islocal=False, ), SunflowerHighway=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=1, dotsep="~×", islocal=False, ), Swansea=dict( mono=False, fscale=0.75, lspacing=0.2, hspacing=1, dotsep="~×", islocal=False, ), Housekeeper=dict( # support chinese glyphs mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~×", islocal=False, ), Wananti=dict( # support chinese glyphs mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~x", islocal=False, ), AnimeAce=dict( mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~x", islocal=False, ), AnimeAceBold=dict( mono=False, fscale=0.75, hspacing=1, lspacing=0.2, dotsep="~x", islocal=False, ), ) #################################################################################### def reset(self): """Reset all settings to their default status.""" self.__init__() def print(self): """Print function.""" print(" " + "-" * 80) s = Settings.__doc__.replace(" ", "") s = s.replace(".. code-block:: python\n", "") try: from pygments import highlight from pygments.lexers import Python3Lexer from pygments.formatters import Terminal256Formatter s = highlight(s, Python3Lexer(), Terminal256Formatter(style="zenburn")) print(s, end="") except ModuleNotFoundError: print("\x1b[33;1m" + s + "\x1b[0m") def __getitem__(self, key): """Make the class work like a dictionary too""" return getattr(self, key) def __setitem__(self, key, value): """Make the class work like a dictionary too""" setattr(self, key, value) def init_colab(self, enable_k3d=True): """ Initialize colab environment """ print("setting up colab environment (can take a minute) ...", end='') res = os.system('which Xvfb') if res: os.system('apt-get install xvfb') os.system('pip install pyvirtualdisplay') from pyvirtualdisplay import Display Display(visible=0).start() if enable_k3d: os.system('pip install k3d') from google.colab import output output.enable_custom_widget_manager() if enable_k3d: import k3d try: print("installing k3d...", end='') os.system("jupyter nbextension install --py --user k3d") os.system("jupyter nbextension enable --py --user k3d") k3d.switch_to_text_protocol() self.default_backend = 'k3d' self.backend_autoclose = False except: print("(FAILED) ... ", end='') print(" setup completed.") def start_xvfb(self): """ Start xvfb. Xvfb or X virtual framebuffer is a display server implementing the X11 display server protocol. In contrast to other display servers, Xvfb performs all graphical operations in virtual memory without showing any screen output. """ print("starting xvfb (can take a minute) ...", end='') res = os.system('which Xvfb') if res: os.system('apt-get install xvfb') os.system('set -x') os.system('export DISPLAY=:99.0') os.system('Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &') os.system('sleep 3') os.system('set +x') os.system('exec "$@"') print(" xvfb started.") vedo-2023.4.6/vedo/shapes.py000066400000000000000000004716601444463326400155270ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os from functools import lru_cache import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo from vedo import settings from vedo.colors import cmaps_names, color_map, get_color, printc from vedo import utils from vedo.pointcloud import Points, merge from vedo.mesh import Mesh from vedo.picture import Picture __docformat__ = "google" __doc__ = """ Submodule to generate simple and complex geometric shapes ![](https://vedo.embl.es/images/basic/extrude.png) """ __all__ = [ "Marker", "Line", "DashedLine", "RoundedLine", "Tube", "ThickTube", "Lines", "Spline", "KSpline", "CSpline", "Bezier", "Brace", "NormalLines", "StreamLines", "Ribbon", "Arrow", "Arrows", "Arrow2D", "Arrows2D", "FlatArrow", "Polygon", "Triangle", "Rectangle", "Disc", "Circle", "GeoCircle", "Arc", "Star", "Star3D", "Cross3D", "IcoSphere", "Sphere", "Spheres", "Earth", "Ellipsoid", "Grid", "TessellatedBox", "Plane", "Box", "Cube", "Spring", "Cylinder", "Cone", "Pyramid", "Torus", "Paraboloid", "Hyperboloid", "TextBase", "Text3D", "Text2D", "CornerAnnotation", "Latex", "Glyph", "Tensors", "ParametricShape", "ConvexHull", "VedoLogo", ] ############################################## _reps = ( (":nabla", "∇"), (":inf", "∞"), (":rightarrow", "→"), (":lefttarrow", "←"), (":partial", "∂"), (":sqrt", "√"), (":approx", "≈"), (":neq", "≠"), (":leq", "≤"), (":geq", "≥"), (":foreach", "∀"), (":permille", "‰"), (":euro", "€"), (":dot", "·"), (":int", "∫"), (":pm", "±"), (":times", "×"), (":Gamma", "Γ"), (":Delta", "Δ"), (":Theta", "Θ"), (":Lambda", "Λ"), (":Pi", "Π"), (":Sigma", "Σ"), (":Phi", "Φ"), (":Chi", "X"), (":Xi", "Ξ"), (":Psi", "Ψ"), (":Omega", "Ω"), (":alpha", "α"), (":beta", "β"), (":gamma", "γ"), (":delta", "δ"), (":epsilon", "ε"), (":zeta", "ζ"), (":eta", "η"), (":theta", "θ"), (":kappa", "κ"), (":lambda", "λ"), (":mu", "μ"), (":lowerxi", "ξ"), (":nu", "ν"), (":pi", "π"), (":rho", "ρ"), (":sigma", "σ"), (":tau", "τ"), (":varphi", "φ"), (":phi", "φ"), (":chi", "χ"), (":psi", "ψ"), (":omega", "ω"), (":circ", "°"), (":onehalf", "½"), (":onefourth", "¼"), (":threefourths", "¾"), (":^1", "¹"), (":^2", "²"), (":^3", "³"), (":,", "~"), ) ######################################################################## class Glyph(Mesh): """ At each vertex of a mesh, another mesh, i.e. a "glyph", is shown with various orientation options and coloring. The input can also be a simple list of 2D or 3D coordinates. Color can be specified as a colormap which maps the size of the orientation vectors in `orientation_array`. """ def __init__( self, mesh, glyph, orientation_array=None, scale_by_scalar=False, scale_by_vector_size=False, scale_by_vector_components=False, color_by_scalar=False, color_by_vector_size=False, c="k8", alpha=1.0, **opts, ): """ Arguments: orientation_array: (list, str, vtkArray) list of vectors, `vtkArray` or name of an already existing pointdata array scale_by_scalar : (bool) glyph mesh is scaled by the active scalars scale_by_vector_size : (bool) glyph mesh is scaled by the size of the vectors scale_by_vector_components : (bool) glyph mesh is scaled by the 3 vectors components color_by_scalar : (bool) glyph mesh is colored based on the scalar value color_by_vector_size : (bool) glyph mesh is colored based on the vector size Examples: - [glyphs1.py](]https://github.com/marcomusy/vedo/tree/master/examples/basic/glyphs1.py) - [glyphs_arrows.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/glyphs_arrows.py) ![](https://vedo.embl.es/images/basic/glyphs.png) """ if len(opts) > 0: # Deprecations printc(":noentry: Warning! In Glyph() unrecognized keywords:", opts, c="y") orientation_array = opts.pop("orientationArray", orientation_array) scale_by_scalar = opts.pop("scaleByScalar", scale_by_scalar) scale_by_vector_size = opts.pop("scaleByVectorSize", scale_by_vector_size) scale_by_vector_components = opts.pop( "scaleByVectorComponents", scale_by_vector_components ) color_by_scalar = opts.pop("colorByScalar", color_by_scalar) color_by_vector_size = opts.pop("colorByVectorSize", color_by_vector_size) printc(" Please use 'snake_case' instead of 'camelCase' keywords", c="y") lighting = None if utils.is_sequence(mesh): # create a cloud of points poly = Points(mesh).polydata() elif isinstance(mesh, vtk.vtkPolyData): poly = mesh else: poly = mesh.polydata() if isinstance(glyph, Points): lighting = glyph.property.GetLighting() glyph = glyph.polydata() cmap = "" if isinstance(c, str) and c in cmaps_names: cmap = c c = None elif utils.is_sequence(c): # user passing an array of point colors ucols = vtk.vtkUnsignedCharArray() ucols.SetNumberOfComponents(3) ucols.SetName("glyph_RGB") for col in c: cl = get_color(col) ucols.InsertNextTuple3(cl[0] * 255, cl[1] * 255, cl[2] * 255) poly.GetPointData().AddArray(ucols) poly.GetPointData().SetActiveScalars("glyph_RGB") c = None gly = vtk.vtkGlyph3D() gly.GeneratePointIdsOn() gly.SetInputData(poly) gly.SetSourceData(glyph) if scale_by_scalar: gly.SetScaleModeToScaleByScalar() elif scale_by_vector_size: gly.SetScaleModeToScaleByVector() elif scale_by_vector_components: gly.SetScaleModeToScaleByVectorComponents() else: gly.SetScaleModeToDataScalingOff() if color_by_vector_size: gly.SetVectorModeToUseVector() gly.SetColorModeToColorByVector() elif color_by_scalar: gly.SetColorModeToColorByScalar() else: gly.SetColorModeToColorByScale() if orientation_array is not None: gly.OrientOn() if isinstance(orientation_array, str): if orientation_array.lower() == "normals": gly.SetVectorModeToUseNormal() else: # passing a name poly.GetPointData().SetActiveVectors(orientation_array) gly.SetInputArrayToProcess(0, 0, 0, 0, orientation_array) gly.SetVectorModeToUseVector() elif utils.is_sequence(orientation_array): # passing a list varr = vtk.vtkFloatArray() varr.SetNumberOfComponents(3) varr.SetName("glyph_vectors") for v in orientation_array: varr.InsertNextTuple(v) poly.GetPointData().AddArray(varr) poly.GetPointData().SetActiveVectors("glyph_vectors") gly.SetInputArrayToProcess(0, 0, 0, 0, "glyph_vectors") gly.SetVectorModeToUseVector() gly.Update() Mesh.__init__(self, gly.GetOutput(), c, alpha) self.flat() if lighting is not None: self.property.SetLighting(lighting) if cmap: lut = vtk.vtkLookupTable() lut.SetNumberOfTableValues(512) lut.Build() for i in range(512): r, g, b = color_map(i, cmap, 0, 512) lut.SetTableValue(i, r, g, b, 1) self.mapper().SetLookupTable(lut) self.mapper().ScalarVisibilityOn() self.mapper().SetScalarModeToUsePointData() if gly.GetOutput().GetPointData().GetScalars(): rng = gly.GetOutput().GetPointData().GetScalars().GetRange() self.mapper().SetScalarRange(rng[0], rng[1]) self.name = "Glyph" class Tensors(Mesh): """ Geometric representation of tensors defined on a domain or set of points. Tensors can be scaled and/or rotated according to the source at eache input point. Scaling and rotation is controlled by the eigenvalues/eigenvectors of the symmetrical part of the tensor as follows: For each tensor, the eigenvalues (and associated eigenvectors) are sorted to determine the major, medium, and minor eigenvalues/eigenvectors. The eigenvalue decomposition only makes sense for symmetric tensors, hence the need to only consider the symmetric part of the tensor, which is `1/2*(T+T.transposed())`. """ def __init__( self, domain, source="ellipsoid", use_eigenvalues=True, is_symmetric=True, three_axes=False, scale=1.0, max_scale=None, length=None, c=None, alpha=1.0, ): """ Arguments: source : (str, Mesh) preset type of source shape `['ellipsoid', 'cylinder', 'cube' or any specified `Mesh`]` use_eigenvalues : (bool) color source glyph using the eigenvalues or by scalars three_axes : (bool) if `False` scale the source in the x-direction, the medium in the y-direction, and the minor in the z-direction. Then, the source is rotated so that the glyph's local x-axis lies along the major eigenvector, y-axis along the medium eigenvector, and z-axis along the minor. If `True` three sources are produced, each of them oriented along an eigenvector and scaled according to the corresponding eigenvector. is_symmetric : (bool) If `True` each source glyph is mirrored (2 or 6 glyphs will be produced). The x-axis of the source glyph will correspond to the eigenvector on output. length : (float) distance from the origin to the tip of the source glyph along the x-axis scale : (float) scaling factor of the source glyph. max_scale : (float) clamp scaling at this factor. Examples: - [tensors.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/tensors.py) - [tensor_grid1.py](https://github.com/marcomusy/vedo/tree/master/examples/other/tensor_grid1.py) ![](https://vedo.embl.es/images/volumetric/tensor_grid.png) """ if isinstance(source, Points): src = source.normalize().polydata(False) else: if "ellip" in source: src = vtk.vtkSphereSource() src.SetPhiResolution(24) src.SetThetaResolution(12) elif "cyl" in source: src = vtk.vtkCylinderSource() src.SetResolution(48) src.CappingOn() elif source == "cube": src = vtk.vtkCubeSource() src.Update() tg = vtk.vtkTensorGlyph() if isinstance(domain, vtk.vtkPolyData): tg.SetInputData(domain) else: tg.SetInputData(domain.GetMapper().GetInput()) tg.SetSourceData(src.GetOutput()) if c is None: tg.ColorGlyphsOn() else: tg.ColorGlyphsOff() tg.SetSymmetric(int(is_symmetric)) if length is not None: tg.SetLength(length) if use_eigenvalues: tg.ExtractEigenvaluesOn() tg.SetColorModeToEigenvalues() else: tg.SetColorModeToScalars() tg.SetThreeGlyphs(three_axes) tg.ScalingOn() tg.SetScaleFactor(scale) if max_scale is None: tg.ClampScalingOn() max_scale = scale * 10 tg.SetMaxScaleFactor(max_scale) tg.Update() tgn = vtk.vtkPolyDataNormals() tgn.SetInputData(tg.GetOutput()) tgn.Update() Mesh.__init__(self, tgn.GetOutput(), c, alpha) self.name = "Tensors" class Line(Mesh): """ Build the line segment between points `p0` and `p1`. If `p0` is already a list of points, return the line connecting them. A 2D set of coords can also be passed as `p0=[x..], p1=[y..]`. """ def __init__(self, p0, p1=None, closed=False, res=2, lw=1, c="k1", alpha=1.0): """ Arguments: closed : (bool) join last to first point res : (int) resolution, number of points along the line (only relevant if only 2 points are specified) lw : (int) line width in pixel units c : (color), int, str, list color name, number, or list of [R,G,B] colors alpha : (float) opacity in range [0,1] """ self.slope = [] # populated by analysis.fitLine self.center = [] self.variances = [] self.coefficients = [] # populated by pyplot.fit() self.covariance_matrix = [] self.coefficients = [] self.coefficient_errors = [] self.monte_carlo_coefficients = [] self.reduced_chi2 = -1 self.ndof = 0 self.data_sigma = 0 self.error_lines = [] self.error_band = None self.res = res if isinstance(p1, Points): p1 = p1.GetPosition() if isinstance(p0, Points): p0 = p0.GetPosition() if isinstance(p0, Points): p0 = p0.points() # detect if user is passing a 2D list of points as p0=xlist, p1=ylist: if len(p0) > 3: if not utils.is_sequence(p0[0]) and not utils.is_sequence(p1[0]) and len(p0) == len(p1): # assume input is 2D xlist, ylist p0 = np.stack((p0, p1), axis=1) p1 = None p0 = utils.make3d(p0) # detect if user is passing a list of points: if utils.is_sequence(p0[0]): p0 = utils.make3d(p0) ppoints = vtk.vtkPoints() # Generate the polyline ppoints.SetData(utils.numpy2vtk(np.asarray(p0), dtype=np.float32)) lines = vtk.vtkCellArray() npt = len(p0) if closed: lines.InsertNextCell(npt + 1) else: lines.InsertNextCell(npt) for i in range(npt): lines.InsertCellPoint(i) if closed: lines.InsertCellPoint(0) poly = vtk.vtkPolyData() poly.SetPoints(ppoints) poly.SetLines(lines) top = p0[-1] base = p0[0] self.res = 2 else: # or just 2 points to link line_source = vtk.vtkLineSource() p0 = utils.make3d(p0) p1 = utils.make3d(p1) line_source.SetPoint1(p0) line_source.SetPoint2(p1) line_source.SetResolution(res - 1) line_source.Update() poly = line_source.GetOutput() top = np.asarray(p1, dtype=float) base = np.asarray(p0, dtype=float) Mesh.__init__(self, poly, c, alpha) self.lw(lw) self.property.LightingOff() self.PickableOff() self.DragableOff() self.base = base self.top = top self.name = "Line" def linecolor(self, lc=None): """Assign a color to the line""" # overrides mesh.linecolor which would have no effect here return self.color(lc) def eval(self, x): """ Calculate the position of an intermediate point as a fraction of the length of the line, being x=0 the first point and x=1 the last point. This corresponds to an imaginary point that travels along the line at constant speed. Can be used in conjunction with `lin_interpolate()` to map any range to the [0,1] range. """ distance1 = 0.0 length = self.length() pts = self.points() for i in range(1, len(pts)): p0 = pts[i - 1] p1 = pts[i] seg = p1 - p0 distance0 = distance1 distance1 += np.linalg.norm(seg) w1 = distance1 / length if w1 >= x: break w0 = distance0 / length v = p0 + seg * (x - w0) / (w1 - w0) return v def pattern(self, stipple, repeats=10): """ Define a stipple pattern for dashing the line. Pass the stipple pattern as a string like `'- - -'`. Repeats controls the number of times the pattern repeats in a single segment. Examples are: `'- -', '-- - --'`, etc. The resolution of the line (nr of points) can affect how pattern will show up. Example: ```python from vedo import Line pts = [[1, 0, 0], [5, 2, 0], [3, 3, 1]] ln = Line(pts, c='r', lw=5).pattern('- -', repeats=10) ln.show(axes=1).close() ``` ![](https://vedo.embl.es/images/feats/line_pattern.png) """ stipple = str(stipple) * int(2 * repeats) dimension = len(stipple) image = vtk.vtkImageData() image.SetDimensions(dimension, 1, 1) image.AllocateScalars(vtk.VTK_UNSIGNED_CHAR, 4) image.SetExtent(0, dimension - 1, 0, 0, 0, 0) i_dim = 0 while i_dim < dimension: for i in range(dimension): image.SetScalarComponentFromFloat(i_dim, 0, 0, 0, 255) image.SetScalarComponentFromFloat(i_dim, 0, 0, 1, 255) image.SetScalarComponentFromFloat(i_dim, 0, 0, 2, 255) if stipple[i] == " ": image.SetScalarComponentFromFloat(i_dim, 0, 0, 3, 0) else: image.SetScalarComponentFromFloat(i_dim, 0, 0, 3, 255) i_dim += 1 polyData = self.polydata(False) # Create texture coordinates tcoords = vtk.vtkDoubleArray() tcoords.SetName("TCoordsStippledLine") tcoords.SetNumberOfComponents(1) tcoords.SetNumberOfTuples(polyData.GetNumberOfPoints()) for i in range(polyData.GetNumberOfPoints()): tcoords.SetTypedTuple(i, [i / 2]) polyData.GetPointData().SetTCoords(tcoords) polyData.GetPointData().Modified() texture = vtk.vtkTexture() texture.SetInputData(image) texture.InterpolateOff() texture.RepeatOn() self.SetTexture(texture) return self def length(self): """Calculate length of the line.""" distance = 0.0 pts = self.points() for i in range(1, len(pts)): distance += np.linalg.norm(pts[i] - pts[i - 1]) return distance def tangents(self): """ Compute the tangents of a line in space. Example: ```python from vedo import * shape = load(dataurl+"timecourse1d.npy")[58] pts = shape.rotate_x(30).points() tangents = Line(pts).tangents() arrs = Arrows(pts, pts+tangents, c='blue9') show(shape.c('red5').lw(5), arrs, bg='bb', axes=1).close() ``` ![](https://vedo.embl.es/images/feats/line_tangents.png) """ v = np.gradient(self.points())[0] ds_dt = np.linalg.norm(v, axis=1) tangent = np.array([1 / ds_dt] * 3).transpose() * v return tangent def curvature(self): """ Compute the signed curvature of a line in space. The signed is computed assuming the line is about coplanar to the xy plane. Example: ```python from vedo import * from vedo.pyplot import plot shape = load(dataurl+"timecourse1d.npy")[55] curvs = Line(shape.points()).curvature() shape.cmap('coolwarm', curvs, vmin=-2,vmax=2).add_scalarbar3d(c='w') shape.render_lines_as_tubes().lw(12) pp = plot(curvs, ac='white', lc='yellow5') show(shape, pp, N=2, bg='bb', sharecam=False).close() ``` ![](https://vedo.embl.es/images/feats/line_curvature.png) """ v = np.gradient(self.points())[0] a = np.gradient(v)[0] av = np.cross(a, v) mav = np.linalg.norm(av, axis=1) mv = utils.mag2(v) val = mav * np.sign(av[:, 2]) / np.power(mv, 1.5) val[0] = val[1] val[-1] = val[-2] return val def compute_curvature(self, method=0): """ Add a pointdata array named 'Curvatures' which contains the curvature value at each point. Keyword method is overridden in Mesh and has no effect here. """ # overrides mesh.compute_curvature curvs = self.curvature() vmin, vmax = np.min(curvs), np.max(curvs) if vmin < 0 and vmax > 0: v = max(-vmin, vmax) self.cmap("coolwarm", curvs, vmin=-v, vmax=v, name="Curvature") else: self.cmap("coolwarm", curvs, vmin=vmin, vmax=vmax, name="Curvature") return self def sweep(self, direction=(1, 0, 0), res=1): """ Sweep the `Line` along the specified vector direction. Returns a `Mesh` surface. Line position is updated to allow for additional sweepings. Example: ```python from vedo import Line, show aline = Line([(0,0,0),(1,3,0),(2,4,0)]) surf1 = aline.sweep((1,0.2,0), res=3) surf2 = aline.sweep((0.2,0,1)) aline.color('r').linewidth(4) show(surf1, surf2, aline, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/sweepline.png) """ line = self.polydata() rows = line.GetNumberOfPoints() spacing = 1 / res surface = vtk.vtkPolyData() res += 1 npts = rows * res npolys = (rows - 1) * (res - 1) points = vtk.vtkPoints() points.Allocate(npts) cnt = 0 x = [0.0, 0.0, 0.0] for row in range(rows): for col in range(res): p = [0.0, 0.0, 0.0] line.GetPoint(row, p) x[0] = p[0] + direction[0] * col * spacing x[1] = p[1] + direction[1] * col * spacing x[2] = p[2] + direction[2] * col * spacing points.InsertPoint(cnt, x) cnt += 1 # Generate the quads polys = vtk.vtkCellArray() polys.Allocate(npolys * 4) pts = [0, 0, 0, 0] for row in range(rows - 1): for col in range(res - 1): pts[0] = col + row * res pts[1] = pts[0] + 1 pts[2] = pts[0] + res + 1 pts[3] = pts[0] + res polys.InsertNextCell(4, pts) surface.SetPoints(points) surface.SetPolys(polys) asurface = vedo.Mesh(surface) prop = vtk.vtkProperty() prop.DeepCopy(self.GetProperty()) asurface.SetProperty(prop) asurface.property = prop asurface.lighting("default") self.points(self.points() + direction) return asurface def reverse(self): """Reverse the points sequence order.""" pts = np.flip(self.points(), axis=0) self.points(pts) return self class DashedLine(Mesh): """ Consider using `Line.pattern()` instead. Build a dashed line segment between points `p0` and `p1`. If `p0` is a list of points returns the line connecting them. A 2D set of coords can also be passed as `p0=[x..], p1=[y..]`. """ def __init__(self, p0, p1=None, spacing=0.1, closed=False, lw=2, c="k5", alpha=1.0): """ Arguments: closed : (bool) join last to first point spacing : (float) relative size of the dash lw : (int) line width in pixels """ if isinstance(p1, vtk.vtkActor): p1 = p1.GetPosition() if isinstance(p0, vtk.vtkActor): p0 = p0.GetPosition() if isinstance(p0, Points): p0 = p0.points() # detect if user is passing a 2D list of points as p0=xlist, p1=ylist: if len(p0) > 3: if not utils.is_sequence(p0[0]) and not utils.is_sequence(p1[0]) and len(p0) == len(p1): # assume input is 2D xlist, ylist p0 = np.stack((p0, p1), axis=1) p1 = None p0 = utils.make3d(p0) if closed: p0 = np.append(p0, [p0[0]], axis=0) if p1 is not None: # assume passing p0=[x,y] if len(p0) == 2 and not utils.is_sequence(p0[0]): p0 = (p0[0], p0[1], 0) if len(p1) == 2 and not utils.is_sequence(p1[0]): p1 = (p1[0], p1[1], 0) # detect if user is passing a list of points: if utils.is_sequence(p0[0]): listp = p0 else: # or just 2 points to link listp = [p0, p1] listp = np.array(listp) if listp.shape[1] == 2: listp = np.c_[listp, np.zeros(listp.shape[0])] xmn = np.min(listp, axis=0) xmx = np.max(listp, axis=0) dlen = np.linalg.norm(xmx - xmn) * np.clip(spacing, 0.01, 1.0) / 10 if not dlen: Mesh.__init__(self, vtk.vtkPolyData(), c, alpha) self.name = "DashedLine (void)" return qs = [] for ipt in range(len(listp) - 1): p0 = listp[ipt] p1 = listp[ipt + 1] v = p1 - p0 vdist = np.linalg.norm(v) n1 = int(vdist / dlen) if not n1: continue res = 0 for i in range(n1 + 2): ist = (i - 0.5) / n1 ist = max(ist, 0) qi = p0 + v * (ist - res / vdist) if ist > 1: qi = p1 res = np.linalg.norm(qi - p1) qs.append(qi) break qs.append(qi) polylns = vtk.vtkAppendPolyData() for i, q1 in enumerate(qs): if not i % 2: continue q0 = qs[i - 1] line_source = vtk.vtkLineSource() line_source.SetPoint1(q0) line_source.SetPoint2(q1) line_source.Update() polylns.AddInputData(line_source.GetOutput()) polylns.Update() Mesh.__init__(self, polylns.GetOutput(), c, alpha) self.lw(lw).lighting("off") self.base = listp[0] if closed: self.top = listp[-2] else: self.top = listp[-1] self.name = "DashedLine" class RoundedLine(Mesh): """ Create a 2D line of specified thickness (in absolute units) passing through a list of input points. Borders of the line are rounded. """ def __init__(self, pts, lw, res=10, c="gray4", alpha=1.0): """ Arguments: pts : (list) a list of points in 2D or 3D (z will be ignored). lw : (float) thickness of the line. res : (int) resolution of the rounded regions Example: ```python from vedo import * pts = [(-4,-3),(1,1),(2,4),(4,1),(3,-1),(2,-5),(9,-3)] ln = Line(pts, c='r', lw=2).z(0.01) rl = RoundedLine(pts, 0.6) show(Points(pts), ln, rl, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/rounded_line.png) """ pts = utils.make3d(pts) def _getpts(pts, revd=False): if revd: pts = list(reversed(pts)) if len(pts) == 2: p0, p1 = pts v = p1 - p0 dv = np.linalg.norm(v) nv = np.cross(v, (0, 0, -1)) nv = nv / np.linalg.norm(nv) * lw return [p0 + nv, p1 + nv] ptsnew = [] for k in range(len(pts) - 2): p0 = pts[k] p1 = pts[k + 1] p2 = pts[k + 2] v = p1 - p0 u = p2 - p1 du = np.linalg.norm(u) dv = np.linalg.norm(v) nv = np.cross(v, (0, 0, -1)) nv = nv / np.linalg.norm(nv) * lw nu = np.cross(u, (0, 0, -1)) nu = nu / np.linalg.norm(nu) * lw uv = np.cross(u, v) if k == 0: ptsnew.append(p0 + nv) if uv[2] <= 0: alpha = np.arccos(np.dot(u, v) / du / dv) db = lw * np.tan(alpha / 2) p1new = p1 + nv - v / dv * db ptsnew.append(p1new) else: p1a = p1 + nv p1b = p1 + nu for i in range(0, res + 1): pab = p1a * (res - i) / res + p1b * i / res vpab = pab - p1 vpab = vpab / np.linalg.norm(vpab) * lw ptsnew.append(p1 + vpab) if k == len(pts) - 3: ptsnew.append(p2 + nu) if revd: ptsnew.append(p2 - nu) return ptsnew ptsnew = _getpts(pts) + _getpts(pts, revd=True) ppoints = vtk.vtkPoints() # Generate the polyline ppoints.SetData(utils.numpy2vtk(np.asarray(ptsnew), dtype=np.float32)) lines = vtk.vtkCellArray() npt = len(ptsnew) lines.InsertNextCell(npt) for i in range(npt): lines.InsertCellPoint(i) poly = vtk.vtkPolyData() poly.SetPoints(ppoints) poly.SetLines(lines) vct = vtk.vtkContourTriangulator() vct.SetInputData(poly) vct.Update() Mesh.__init__(self, vct.GetOutput(), c, alpha) self.flat() self.property.LightingOff() self.name = "RoundedLine" self.base = ptsnew[0] self.top = ptsnew[-1] class Lines(Mesh): """ Build the line segments between two lists of points `start_pts` and `end_pts`. `start_pts` can be also passed in the form `[[point1, point2], ...]`. """ def __init__( self, start_pts, end_pts=None, dotted=False, res=1, scale=1.0, lw=1, c="k4", alpha=1.0 ): """ Arguments: scale : (float) apply a rescaling factor to the lengths. c : (color, int, str, list) color name, number, or list of [R,G,B] colors alpha : (float) opacity in range [0,1] lw : (int) line width in pixel units res : (int) resolution, number of points along the line (only relevant if only 2 points are specified) Examples: - [fitspheres2.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/fitspheres2.py) ![](https://user-images.githubusercontent.com/32848391/52503049-ac9cb600-2be4-11e9-86af-72a538af14ef.png) """ if isinstance(start_pts, Points): start_pts = start_pts.points() if isinstance(end_pts, Points): end_pts = end_pts.points() if end_pts is not None: start_pts = np.stack((start_pts, end_pts), axis=1) polylns = vtk.vtkAppendPolyData() if not utils.is_ragged(start_pts): for twopts in start_pts: line_source = vtk.vtkLineSource() line_source.SetResolution(res) if len(twopts[0]) == 2: line_source.SetPoint1(twopts[0][0], twopts[0][1], 0.0) else: line_source.SetPoint1(twopts[0]) if scale == 1: pt2 = twopts[1] else: vers = (np.array(twopts[1]) - twopts[0]) * scale pt2 = np.array(twopts[0]) + vers if len(pt2) == 2: line_source.SetPoint2(pt2[0], pt2[1], 0.0) else: line_source.SetPoint2(pt2) polylns.AddInputConnection(line_source.GetOutputPort()) else: polylns = vtk.vtkAppendPolyData() for t in start_pts: t = utils.make3d(t) ppoints = vtk.vtkPoints() # Generate the polyline ppoints.SetData(utils.numpy2vtk(t, dtype=np.float32)) lines = vtk.vtkCellArray() npt = len(t) lines.InsertNextCell(npt) for i in range(npt): lines.InsertCellPoint(i) poly = vtk.vtkPolyData() poly.SetPoints(ppoints) poly.SetLines(lines) polylns.AddInputData(poly) polylns.Update() Mesh.__init__(self, polylns.GetOutput(), c, alpha) self.lw(lw).lighting("off") if dotted: self.GetProperty().SetLineStipplePattern(0xF0F0) self.GetProperty().SetLineStippleRepeatFactor(1) self.name = "Lines" class Spline(Line): """ Find the B-Spline curve through a set of points. This curve does not necessarily pass exactly through all the input points. Needs to import `scipy`. """ def __init__(self, points, smooth=0.0, degree=2, closed=False, res=None, easing=""): """ Arguments: smooth : (float) smoothing factor. - 0 = interpolate points exactly [default]. - 1 = average point positions. degree : (int) degree of the spline (between 1 and 5). easing : (str) control sensity of points along the spline. Available options are `[InSine, OutSine, Sine, InQuad, OutQuad, InCubic, OutCubic, InQuart, OutQuart, InCirc, OutCirc].` Can be used to create animations (move objects at varying speed). See e.g.: https://easings.net res : (int) number of points on the spline See also: `CSpline` and `KSpline`. Examples: - [spline_ease.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/spline_ease.py) ![](https://vedo.embl.es/images/simulations/spline_ease.gif) """ from scipy.interpolate import splprep, splev if isinstance(points, Points): points = points.points() points = utils.make3d(points) per = 0 if closed: points = np.append(points, [points[0]], axis=0) per = 1 if res is None: res = len(points) * 10 points = np.array(points, dtype=float) minx, miny, minz = np.min(points, axis=0) maxx, maxy, maxz = np.max(points, axis=0) maxb = max(maxx - minx, maxy - miny, maxz - minz) smooth *= maxb / 2 # must be in absolute units x = np.linspace(0, 1, res) if easing: if easing == "InSine": x = 1 - np.cos((x * np.pi) / 2) elif easing == "OutSine": x = np.sin((x * np.pi) / 2) elif easing == "Sine": x = -(np.cos(np.pi * x) - 1) / 2 elif easing == "InQuad": x = x * x elif easing == "OutQuad": x = 1 - (1 - x) * (1 - x) elif easing == "InCubic": x = x * x elif easing == "OutCubic": x = 1 - np.power(1 - x, 3) elif easing == "InQuart": x = x * x * x * x elif easing == "OutQuart": x = 1 - np.power(1 - x, 4) elif easing == "InCirc": x = 1 - np.sqrt(1 - np.power(x, 2)) elif easing == "OutCirc": x = np.sqrt(1 - np.power(x - 1, 2)) else: vedo.logger.error(f"unknown ease mode {easing}") # find the knots tckp, _ = splprep(points.T, task=0, s=smooth, k=degree, per=per) # evaluate spLine, including interpolated points: xnew, ynew, znew = splev(x, tckp) Line.__init__(self, np.c_[xnew, ynew, znew], lw=2) self.name = "Spline" class KSpline(Line): """ Return a [Kochanek spline](https://en.wikipedia.org/wiki/Kochanek%E2%80%93Bartels_spline) which runs exactly through all the input points. """ def __init__(self, points, continuity=0.0, tension=0.0, bias=0.0, closed=False, res=None): """ Arguments: continuity : (float) changes the sharpness in change between tangents tension : (float) changes the length of the tangent vector bias : (float) changes the direction of the tangent vector closed : (bool) join last to first point to produce a closed curve res : (int) approximate resolution of the output line. Default is 20 times the number of input points. ![](https://user-images.githubusercontent.com/32848391/65975805-73fd6580-e46f-11e9-8957-75eddb28fa72.png) See also: `Spline` and `CSpline`. """ if isinstance(points, Points): points = points.points() if not res: res = len(points) * 20 points = utils.make3d(points).astype(float) xspline = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkKochanekSpline() yspline = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkKochanekSpline() zspline = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkKochanekSpline() for s in [xspline, yspline, zspline]: if bias: s.SetDefaultBias(bias) if tension: s.SetDefaultTension(tension) if continuity: s.SetDefaultContinuity(continuity) s.SetClosed(closed) lenp = len(points[0]) > 2 for i, p in enumerate(points): xspline.AddPoint(i, p[0]) yspline.AddPoint(i, p[1]) if lenp: zspline.AddPoint(i, p[2]) ln = [] for pos in np.linspace(0, len(points), res): x = xspline.Evaluate(pos) y = yspline.Evaluate(pos) z = 0 if lenp: z = zspline.Evaluate(pos) ln.append((x, y, z)) Line.__init__(self, ln, lw=2) self.clean() self.lighting("off") self.name = "KSpline" self.base = np.array(points[0], dtype=float) self.top = np.array(points[-1], dtype=float) class CSpline(Line): """ Return a Cardinal spline which runs exactly through all the input points. """ def __init__(self, points, closed=False, res=None): """ Arguments: closed : (bool) join last to first point to produce a closed curve res : (int) approximate resolution of the output line. Default is 20 times the number of input points. See also: `Spline` and `KSpline`. """ if isinstance(points, Points): points = points.points() if not res: res = len(points) * 20 points = utils.make3d(points).astype(float) xspline = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkCardinalSpline() yspline = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkCardinalSpline() zspline = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkCardinalSpline() for s in [xspline, yspline, zspline]: s.SetClosed(closed) lenp = len(points[0]) > 2 for i, p in enumerate(points): xspline.AddPoint(i, p[0]) yspline.AddPoint(i, p[1]) if lenp: zspline.AddPoint(i, p[2]) ln = [] for pos in np.linspace(0, len(points), res): x = xspline.Evaluate(pos) y = yspline.Evaluate(pos) z = 0 if lenp: z = zspline.Evaluate(pos) ln.append((x, y, z)) Line.__init__(self, ln, lw=2) self.clean() self.lighting("off") self.name = "CSpline" self.base = points[0] self.top = points[-1] class Bezier(Line): """ Generate the Bezier line that links the first to the last point. """ def __init__(self, points, res=None): """ Example: ```python from vedo import * import numpy as np pts = np.random.randn(25,3) for i,p in enumerate(pts): p += [5*i, 15*sin(i/2), i*i*i/200] show(Points(pts), Bezier(pts), axes=1).close() ``` ![](https://user-images.githubusercontent.com/32848391/90437534-dafd2a80-e0d2-11ea-9b93-9ecb3f48a3ff.png) """ N = len(points) if res is None: res = 10 * N t = np.linspace(0, 1, num=res) bcurve = np.zeros((res, len(points[0]))) def binom(n, k): b = 1 for t in range(1, min(k, n - k) + 1): b *= n / t n -= 1 return b def bernstein(n, k): coeff = binom(n, k) def _bpoly(x): return coeff * x ** k * (1 - x) ** (n - k) return _bpoly for ii in range(N): b = bernstein(N - 1, ii)(t) bcurve += np.outer(b, points[ii]) Line.__init__(self, bcurve, lw=2) self.name = "BezierLine" class NormalLines(Mesh): """ Build an `Glyph` to show the normals at cell centers or at mesh vertices. Arguments: ratio : (int) show 1 normal every `ratio` cells. on : (str) either "cells" or "points". scale : (float) scale factor to control size. """ def __init__(self, msh, ratio=1, on="cells", scale=1.0): poly = msh.clone().compute_normals().polydata() if "cell" in on: centers = vtk.vtkCellCenters() centers.SetInputData(poly) centers.Update() poly = centers.GetOutput() mask_pts = vtk.vtkMaskPoints() mask_pts.SetInputData(poly) mask_pts.SetOnRatio(ratio) mask_pts.RandomModeOff() mask_pts.Update() ln = vtk.vtkLineSource() ln.SetPoint1(0, 0, 0) ln.SetPoint2(1, 0, 0) ln.Update() glyph = vtk.vtkGlyph3D() glyph.SetSourceData(ln.GetOutput()) glyph.SetInputData(mask_pts.GetOutput()) glyph.SetVectorModeToUseNormal() b = poly.GetBounds() f = max([b[1] - b[0], b[3] - b[2], b[5] - b[4]]) / 50 * scale glyph.SetScaleFactor(f) glyph.OrientOn() glyph.Update() Mesh.__init__(self, glyph.GetOutput()) self.PickableOff() prop = vtk.vtkProperty() prop.DeepCopy(msh.GetProperty()) self.SetProperty(prop) self.property = prop self.property.LightingOff() self.mapper().ScalarVisibilityOff() self.name = "NormalLines" def _interpolate2vol(mesh, kernel=None, radius=None, bounds=None, null_value=None, dims=None): # Generate a volumetric dataset by interpolating a scalar # or vector field which is only known on a scattered set of points or mesh. # Available interpolation kernels are: shepard, gaussian, voronoi, linear. # # kernel : (str) interpolation kernel type [shepard] # radius : (float) radius of the local search # bounds : (list) bounding box of the output object # dims : (list) dimensions of the output object # null_value : (float) value to be assigned to invalid points if dims is None: dims = (25, 25, 25) if bounds is None: bounds = mesh.bounds() elif isinstance(bounds, vedo.base.Base3DProp): bounds = bounds.bounds() # Create a domain volume domain = vtk.vtkImageData() domain.SetDimensions(dims) domain.SetOrigin(bounds[0], bounds[2], bounds[4]) deltaZ = (bounds[5] - bounds[4]) / (dims[2] - 1) deltaY = (bounds[3] - bounds[2]) / (dims[1] - 1) deltaX = (bounds[1] - bounds[0]) / (dims[0] - 1) domain.SetSpacing(deltaX, deltaY, deltaZ) if radius is None: radius = 2.5 * np.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) locator = vtk.vtkStaticPointLocator() locator.SetDataSet(mesh) locator.BuildLocator() if kernel == "gaussian": kern = vtk.vtkGaussianKernel() kern.SetRadius(radius) elif kernel == "voronoi": kern = vtk.vtkVoronoiKernel() elif kernel == "linear": kern = vtk.vtkLinearKernel() kern.SetRadius(radius) else: kern = vtk.vtkShepardKernel() kern.SetPowerParameter(2) kern.SetRadius(radius) interpolator = vtk.vtkPointInterpolator() interpolator.SetInputData(domain) interpolator.SetSourceData(mesh) interpolator.SetKernel(kern) interpolator.SetLocator(locator) if null_value is not None: interpolator.SetNullValue(null_value) else: interpolator.SetNullPointsStrategyToClosestPoint() interpolator.Update() return interpolator.GetOutput() def StreamLines( domain, probe, active_vectors="", integrator="rk4", direction="forward", initial_step_size=None, max_propagation=None, max_steps=10000, step_length=None, extrapolate_to_box=(), surface_constrained=False, compute_vorticity=False, ribbons=None, tubes=(), scalar_range=None, lw=None, **opts, ): """ Integrate a vector field on a domain (a Points/Mesh or other vtk datasets types) to generate streamlines. The integration is performed using a specified integrator (Runge-Kutta). The length of a streamline is governed by specifying a maximum value either in physical arc length or in (local) cell length. Otherwise, the integration terminates upon exiting the field domain. Arguments: domain : (Points, Volume, vtkDataSet) the object that contains the vector field probe : (Mesh, list) the Mesh that probes the domain. Its coordinates will be the seeds for the streamlines, can also be an array of positions. active_vectors : (str) name of the vector array to be used integrator : (str) Runge-Kutta integrator, either 'rk2', 'rk4' of 'rk45' initial_step_size : (float) initial step size of integration max_propagation : (float) maximum physical length of the streamline max_steps : (int) maximum nr of steps allowed step_length : (float) length of step integration. extrapolate_to_box : (dict) Vectors that are defined on a discrete set of points are extrapolated to a 3D domain defined by its bounding box: - bounds (list), bounding box of the domain - kernel (str), interpolation kernel `["shepard","gaussian","voronoi","linear"]` - radius (float), radius of the local search - dims (list), nr of subdivisions of the domain along x, y, and z - null_value (float), value to be assigned to invalid points surface_constrained : (bool) force streamlines to be computed on a surface compute_vorticity : (bool) Turn on/off vorticity computation at streamline points (necessary for generating proper stream-ribbons) ribbons : (int) render lines as ribbons by joining them. An integer value represent the ratio of joining (e.g.: ribbons=2 groups lines 2 by 2) tubes : (dict) dictionary containing the parameters for the tube representation: - ratio (int), draws tube as longitudinal stripes - res (int), tube resolution (nr. of sides, 12 by default) - max_radius_factor (float), max tube radius as a multiple of the min radius - cap (bool), capping of the tube - mode (int), radius varies based on the scalar or vector magnitude: - 0 do not vary radius - 1 vary radius by scalar - 2 vary radius by vector - 3 vary radius by absolute value of scalar - 4 vary radius by vector norm scalar_range : (list) specify the scalar range for coloring Examples: - [streamlines1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/streamlines1.py) - [streamlines2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/streamlines2.py) ![](https://vedo.embl.es/images/volumetric/81459343-b9210d00-919f-11ea-846c-152d62cba06e.png) - [streamribbons.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/streamribbons.py) - [office.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/office.py) ![](https://vedo.embl.es/images/volumetric/56964003-9145a500-6b5a-11e9-9d9e-9736d90e1900.png) """ if len(opts): # Deprecations printc(" Warning! In StreamLines() unrecognized keywords:", opts, c="y") initial_step_size = opts.pop("initialStepSize", initial_step_size) max_propagation = opts.pop("maxPropagation", max_propagation) max_steps = opts.pop("maxSteps", max_steps) step_length = opts.pop("stepLength", step_length) extrapolate_to_box = opts.pop("extrapolateToBox", extrapolate_to_box) surface_constrained = opts.pop("surfaceConstrained", surface_constrained) compute_vorticity = opts.pop("computeVorticity", compute_vorticity) scalar_range = opts.pop("scalarRange", scalar_range) printc(" Please use 'snake_case' instead of 'camelCase' keywords", c="y") if isinstance(domain, vedo.Points): if extrapolate_to_box: grid = _interpolate2vol(domain.polydata(), **extrapolate_to_box) else: grid = domain.polydata() elif isinstance(domain, vedo.BaseVolume): grid = domain.inputdata() else: grid = domain if active_vectors: grid.GetPointData().SetActiveVectors(active_vectors) b = grid.GetBounds() size = (b[5] - b[4] + b[3] - b[2] + b[1] - b[0]) / 3 if initial_step_size is None: initial_step_size = size / 500.0 if max_propagation is None: max_propagation = size if utils.is_sequence(probe): pts = utils.make3d(probe) else: pts = probe.clean().points() src = vtk.vtkProgrammableSource() def read_points(): output = src.GetPolyDataOutput() points = vtk.vtkPoints() for x, y, z in pts: points.InsertNextPoint(x, y, z) output.SetPoints(points) src.SetExecuteMethod(read_points) src.Update() st = vtk.vtkStreamTracer() st.SetInputDataObject(grid) st.SetSourceConnection(src.GetOutputPort()) st.SetInitialIntegrationStep(initial_step_size) st.SetComputeVorticity(compute_vorticity) st.SetMaximumNumberOfSteps(max_steps) st.SetMaximumPropagation(max_propagation) st.SetSurfaceStreamlines(surface_constrained) if step_length: st.SetMaximumIntegrationStep(step_length) if "f" in direction: st.SetIntegrationDirectionToForward() elif "back" in direction: st.SetIntegrationDirectionToBackward() elif "both" in direction: st.SetIntegrationDirectionToBoth() if integrator == "rk2": st.SetIntegratorTypeToRungeKutta2() elif integrator == "rk4": st.SetIntegratorTypeToRungeKutta4() elif integrator == "rk45": st.SetIntegratorTypeToRungeKutta45() else: vedo.logger.error(f"in streamlines, unknown integrator {integrator}") st.Update() output = st.GetOutput() if ribbons: scalar_surface = vtk.vtkRuledSurfaceFilter() scalar_surface.SetInputConnection(st.GetOutputPort()) scalar_surface.SetOnRatio(int(ribbons)) scalar_surface.SetRuledModeToPointWalk() scalar_surface.Update() output = scalar_surface.GetOutput() if tubes: radius = tubes.pop("radius", domain.GetLength() / 500) res = tubes.pop("res", 24) radfact = tubes.pop("max_radius_factor", 10) ratio = tubes.pop("ratio", 1) mode = tubes.pop("mode", 0) cap = tubes.pop("mode", False) if tubes: vedo.logger.warning(f"in StreamLines unknown 'tubes' parameters: {tubes}") stream_tube = vtk.vtkTubeFilter() stream_tube.SetNumberOfSides(res) stream_tube.SetRadius(radius) stream_tube.SetCapping(cap) # max tube radius as a multiple of the min radius stream_tube.SetRadiusFactor(radfact) stream_tube.SetOnRatio(int(ratio)) stream_tube.SetVaryRadius(int(mode)) stream_tube.SetInputData(output) vname = grid.GetPointData().GetVectors().GetName() stream_tube.SetInputArrayToProcess( 1, 0, 0, vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS, vname ) stream_tube.Update() sta = vedo.mesh.Mesh(stream_tube.GetOutput(), c=None) scals = grid.GetPointData().GetScalars() if scals: sta.mapper().SetScalarRange(scals.GetRange()) if scalar_range is not None: sta.mapper().SetScalarRange(scalar_range) sta.phong() sta.name = "StreamLines" ############# return sta ############# ############# sta = vedo.mesh.Mesh(output, c=None) if lw is not None and len(tubes) == 0 and not ribbons: sta.lw(lw) sta.mapper().SetResolveCoincidentTopologyToPolygonOffset() sta.lighting("off") scals = grid.GetPointData().GetScalars() if scals: sta.mapper().SetScalarRange(scals.GetRange()) if scalar_range is not None: sta.mapper().SetScalarRange(scalar_range) sta.name = "StreamLines" return sta class Tube(Mesh): """ Build a tube along the line defined by a set of points. """ def __init__(self, points, r=1.0, cap=True, res=12, c=None, alpha=1.0): """ Arguments: r : (float, list) constant radius or list of radii. res : (int) resolution, number of the sides of the tube c : (color) constant color or list of colors for each point. Examples: - [ribbon.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/ribbon.py) - [tube_radii.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/tube_radii.py) ![](https://vedo.embl.es/images/basic/tube.png) """ if isinstance(points, vedo.Points): points = points.points() base = np.asarray(points[0], dtype=float) top = np.asarray(points[-1], dtype=float) vpoints = vtk.vtkPoints() idx = len(points) for p in points: vpoints.InsertNextPoint(p) line = vtk.vtkPolyLine() line.GetPointIds().SetNumberOfIds(idx) for i in range(idx): line.GetPointIds().SetId(i, i) lines = vtk.vtkCellArray() lines.InsertNextCell(line) polyln = vtk.vtkPolyData() polyln.SetPoints(vpoints) polyln.SetLines(lines) tuf = vtk.vtkTubeFilter() tuf.SetCapping(cap) tuf.SetNumberOfSides(res) tuf.SetInputData(polyln) if utils.is_sequence(r): arr = utils.numpy2vtk(r, dtype=float) arr.SetName("TubeRadius") polyln.GetPointData().AddArray(arr) polyln.GetPointData().SetActiveScalars("TubeRadius") tuf.SetVaryRadiusToVaryRadiusByAbsoluteScalar() else: tuf.SetRadius(r) usingColScals = False if utils.is_sequence(c): usingColScals = True cc = vtk.vtkUnsignedCharArray() cc.SetName("TubeColors") cc.SetNumberOfComponents(3) cc.SetNumberOfTuples(len(c)) for i, ic in enumerate(c): r, g, b = get_color(ic) cc.InsertTuple3(i, int(255 * r), int(255 * g), int(255 * b)) polyln.GetPointData().AddArray(cc) c = None tuf.Update() Mesh.__init__(self, tuf.GetOutput(), c, alpha) self.phong() if usingColScals: self.mapper().SetScalarModeToUsePointFieldData() self.mapper().ScalarVisibilityOn() self.mapper().SelectColorArray("TubeColors") self.mapper().Modified() self.base = base self.top = top self.name = "Tube" def ThickTube(pts, r1, r2, res=12, c=None, alpha=1.0): """ Create a tube with a thickness along a line of points. Example: ```python from vedo import * pts = [[sin(x), cos(x), x/3] for x in np.arange(0.1, 3, 0.3)] vline = Line(pts, lw=5, c='red5') thick_tube = ThickTube(vline, r1=0.2, r2=0.3).lw(1) show(vline, thick_tube, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/thick_tube.png) """ def make_cap(t1, t2): newpoints = t1.points().tolist() + t2.points().tolist() newfaces = [] for i in range(n - 1): newfaces.append([i, i + 1, i + n]) newfaces.append([i + n, i + 1, i + n + 1]) newfaces.append([2 * n - 1, 0, n]) newfaces.append([2 * n - 1, n - 1, 0]) capm = utils.buildPolyData(newpoints, newfaces) return capm assert r1 < r2 t1 = Tube(pts, r=r1, cap=False, res=res) t2 = Tube(pts, r=r2, cap=False, res=res) tc1a, tc1b = t1.boundaries().split() tc2a, tc2b = t2.boundaries().split() n = tc1b.npoints tc1b.join(reset=True).clean() # needed because indices are flipped tc2b.join(reset=True).clean() capa = make_cap(tc1a, tc2a) capb = make_cap(tc1b, tc2b) thick_tube = merge(t1, t2, capa, capb).c(c).alpha(alpha) thick_tube.base = t1.base thick_tube.top = t1.top thick_tube.name = "ThickTube" return thick_tube class Ribbon(Mesh): """ Connect two lines to generate the surface inbetween. Set the mode by which to create the ruled surface. It also works with a single line in input. In this case the ribbon is formed by following the local plane of the line in space. """ def __init__( self, line1, line2=None, mode=0, closed=False, width=None, res=(200, 5), c="indigo3", alpha=1.0, ): """ Arguments: mode : (int) If mode=0, resample evenly the input lines (based on length) and generates triangle strips. If mode=1, use the existing points and walks around the polyline using existing points. closed : (bool) if True, join the last point with the first to form a closed surface res : (list) ribbon resolutions along the line and perpendicularly to it. Examples: - [ribbon.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/ribbon.py) ![](https://vedo.embl.es/images/basic/ribbon.png) """ if isinstance(line1, Points): line1 = line1.points() if isinstance(line2, Points): line2 = line2.points() elif line2 is None: ############################################# ribbon_filter = vtk.vtkRibbonFilter() aline = Line(line1) ribbon_filter.SetInputData(aline.polydata()) if width is None: width = aline.diagonal_size() / 20.0 ribbon_filter.SetWidth(width) ribbon_filter.Update() Mesh.__init__(self, ribbon_filter.GetOutput(), c, alpha) self.name = "Ribbon" ############################################## return ###################################### ############################################## line1 = np.asarray(line1) line2 = np.asarray(line2) if closed: line1 = line1.tolist() line1 += [line1[0]] line2 = line2.tolist() line2 += [line2[0]] line1 = np.array(line1) line2 = np.array(line2) if len(line1[0]) == 2: line1 = np.c_[line1, np.zeros(len(line1))] if len(line2[0]) == 2: line2 = np.c_[line2, np.zeros(len(line2))] ppoints1 = vtk.vtkPoints() # Generate the polyline1 ppoints1.SetData(utils.numpy2vtk(line1, dtype=np.float32)) lines1 = vtk.vtkCellArray() lines1.InsertNextCell(len(line1)) for i in range(len(line1)): lines1.InsertCellPoint(i) poly1 = vtk.vtkPolyData() poly1.SetPoints(ppoints1) poly1.SetLines(lines1) ppoints2 = vtk.vtkPoints() # Generate the polyline2 ppoints2.SetData(utils.numpy2vtk(line2, dtype=np.float32)) lines2 = vtk.vtkCellArray() lines2.InsertNextCell(len(line2)) for i in range(len(line2)): lines2.InsertCellPoint(i) poly2 = vtk.vtkPolyData() poly2.SetPoints(ppoints2) poly2.SetLines(lines2) # build the lines lines1 = vtk.vtkCellArray() lines1.InsertNextCell(poly1.GetNumberOfPoints()) for i in range(poly1.GetNumberOfPoints()): lines1.InsertCellPoint(i) polygon1 = vtk.vtkPolyData() polygon1.SetPoints(ppoints1) polygon1.SetLines(lines1) lines2 = vtk.vtkCellArray() lines2.InsertNextCell(poly2.GetNumberOfPoints()) for i in range(poly2.GetNumberOfPoints()): lines2.InsertCellPoint(i) polygon2 = vtk.vtkPolyData() polygon2.SetPoints(ppoints2) polygon2.SetLines(lines2) merged_pd = vtk.vtkAppendPolyData() merged_pd.AddInputData(polygon1) merged_pd.AddInputData(polygon2) merged_pd.Update() rsf = vtk.vtkRuledSurfaceFilter() rsf.CloseSurfaceOff() rsf.SetRuledMode(mode) rsf.SetResolution(res[0], res[1]) rsf.SetInputData(merged_pd.GetOutput()) rsf.Update() Mesh.__init__(self, rsf.GetOutput(), c, alpha) self.name = "Ribbon" class Arrow(Mesh): """ Build a 3D arrow from `start_pt` to `end_pt` of section size `s`, expressed as the fraction of the window size. """ def __init__( self, start_pt=(0, 0, 0), end_pt=(1, 0, 0), s=None, shaft_radius=None, head_radius=None, head_length=None, res=12, c="r4", alpha=1.0, ): """ If `c` is a `float` less than 1, the arrow is rendered as a in a color scale from white to red. .. note:: If `s=None` the arrow is scaled proportionally to its length ![](https://raw.githubusercontent.com/lorensen/VTKExamples/master/src/Testing/Baseline/Cxx/GeometricObjects/TestOrientedArrow.png) """ # in case user is passing meshs if isinstance(start_pt, vtk.vtkActor): start_pt = start_pt.GetPosition() if isinstance(end_pt, vtk.vtkActor): end_pt = end_pt.GetPosition() axis = np.asarray(end_pt) - np.asarray(start_pt) length = np.linalg.norm(axis) if length: axis = axis / length if len(axis) < 3: # its 2d theta = np.pi / 2 start_pt = [start_pt[0], start_pt[1], 0.0] end_pt = [end_pt[0], end_pt[1], 0.0] else: theta = np.arccos(axis[2]) phi = np.arctan2(axis[1], axis[0]) self.source = vtk.vtkArrowSource() self.source.SetShaftResolution(res) self.source.SetTipResolution(res) if s: sz = 0.02 self.source.SetTipRadius(sz) self.source.SetShaftRadius(sz / 1.75) self.source.SetTipLength(sz * 15) # if s: # sz = 0.02 * s * length # tl = sz / 20 # print(s, sz) # self.source.SetShaftRadius(sz) # self.source.SetTipRadius(sz*1.75) # self.source.SetTipLength(sz*15) if head_length: self.source.SetTipLength(head_length) if head_radius: self.source.SetTipRadius(head_radius) if shaft_radius: self.source.SetShaftRadius(shaft_radius) self.source.Update() t = vtk.vtkTransform() t.RotateZ(np.rad2deg(phi)) t.RotateY(np.rad2deg(theta)) t.RotateY(-90) # put it along Z if s: sz = 800 * s t.Scale(length, sz, sz) else: t.Scale(length, length, length) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputData(self.source.GetOutput()) tf.SetTransform(t) tf.Update() Mesh.__init__(self, tf.GetOutput(), c, alpha) self.phong().lighting("plastic") self.SetPosition(start_pt) self.PickableOff() self.DragableOff() self.base = np.array(start_pt, dtype=float) self.top = np.array(end_pt, dtype=float) self.tip_index = None self.fill = True # used by pyplot.__iadd__() self.s = s if s is not None else 1 ## used by pyplot.__iadd() self.name = "Arrow" def tip_point(self, return_index=False): """Return the coordinates of the tip of the Arrow, or the point index.""" if self.tip_index is None: arrpts = utils.vtk2numpy(self.source.GetOutput().GetPoints().GetData()) self.tip_index = np.argmax(arrpts[:, 0]) if return_index: return self.tip_index return self.points()[self.tip_index] class Arrows(Glyph): """ Build arrows between two lists of points. """ def __init__( self, start_pts, end_pts=None, s=None, shaft_radius=None, head_radius=None, head_length=None, thickness=1.0, res=12, c=None, alpha=1.0, ): """ Build arrows between two lists of points `start_pts` and `end_pts`. `start_pts` can be also passed in the form `[[point1, point2], ...]`. Color can be specified as a colormap which maps the size of the arrows. Arguments: s : (float) fix aspect-ratio of the arrow and scale its cross section c : (color) color or color map name alpha : (float) set object opacity res : (int) set arrow resolution Examples: - [glyphs_arrows.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/glyphs_arrows.py) ![](https://user-images.githubusercontent.com/32848391/55897850-a1a0da80-5bc1-11e9-81e0-004c8f396b43.jpg) """ if isinstance(start_pts, Points): start_pts = start_pts.points() if isinstance(end_pts, Points): end_pts = end_pts.points() start_pts = np.asarray(start_pts) if end_pts is None: strt = start_pts[:, 0] end_pts = start_pts[:, 1] start_pts = strt else: end_pts = np.asarray(end_pts) start_pts = utils.make3d(start_pts) end_pts = utils.make3d(end_pts) arr = vtk.vtkArrowSource() arr.SetShaftResolution(res) arr.SetTipResolution(res) if s: sz = 0.02 * s arr.SetTipRadius(sz * 2) arr.SetShaftRadius(sz * thickness) arr.SetTipLength(sz * 10) if head_radius: arr.SetTipRadius(head_radius) if shaft_radius: arr.SetShaftRadius(shaft_radius) if head_length: arr.SetTipLength(head_length) arr.Update() out = arr.GetOutput() orients = end_pts - start_pts Glyph.__init__( self, start_pts, out, orientation_array=orients, scale_by_vector_size=True, color_by_vector_size=True, c=c, alpha=alpha, ) self.flat().lighting("plastic") self.name = "Arrows" class Arrow2D(Mesh): """ Build a 2D arrow. """ def __init__( self, start_pt=(0, 0, 0), end_pt=(1, 0, 0), s=1, shaft_length=0.8, shaft_width=0.05, head_length=0.225, head_width=0.175, fill=True, ): """ Build a 2D arrow from `start_pt` to `end_pt`. Arguments: s : (float) a global multiplicative convenience factor controlling the arrow size shaft_length : (float) fractional shaft length shaft_width : (float) fractional shaft width head_length : (float) fractional head length head_width : (float) fractional head width fill : (bool) if False only generate the outline """ self.fill = fill ## needed by pyplot.__iadd() self.s = s # # needed by pyplot.__iadd() if s != 1: shaft_width *= s head_width *= np.sqrt(s) # in case user is passing meshs if isinstance(start_pt, vtk.vtkActor): start_pt = start_pt.GetPosition() if isinstance(end_pt, vtk.vtkActor): end_pt = end_pt.GetPosition() if len(start_pt) == 2: start_pt = [start_pt[0], start_pt[1], 0] if len(end_pt) == 2: end_pt = [end_pt[0], end_pt[1], 0] headBase = 1 - head_length head_width = max(head_width, shaft_width) if head_length is None or headBase > shaft_length: headBase = shaft_length verts = [] verts.append([0, -shaft_width / 2, 0]) verts.append([shaft_length, -shaft_width / 2, 0]) verts.append([headBase, -head_width / 2, 0]) verts.append([1, 0, 0]) verts.append([headBase, head_width / 2, 0]) verts.append([shaft_length, shaft_width / 2, 0]) verts.append([0, shaft_width / 2, 0]) if fill: faces = ((0, 1, 3, 5, 6), (5, 3, 4), (1, 2, 3)) poly = utils.buildPolyData(verts, faces) else: lines = (0, 1, 2, 3, 4, 5, 6, 0) poly = utils.buildPolyData(verts, [], lines=lines) axis = np.array(end_pt) - np.array(start_pt) length = np.linalg.norm(axis) if length: axis = axis / length theta = 0 if len(axis) > 2: theta = np.arccos(axis[2]) phi = np.arctan2(axis[1], axis[0]) t = vtk.vtkTransform() if phi: t.RotateZ(np.rad2deg(phi)) if theta: t.RotateY(np.rad2deg(theta)) t.RotateY(-90) # put it along Z t.Scale(length, length, length) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputData(poly) tf.SetTransform(t) tf.Update() Mesh.__init__(self, tf.GetOutput(), c="k1") self.SetPosition(start_pt) self.lighting("off") self.DragableOff() self.PickableOff() self.base = np.array(start_pt, dtype=float) self.top = np.array(end_pt, dtype=float) self.name = "Arrow2D" class Arrows2D(Glyph): """ Build 2D arrows between two lists of points. """ def __init__( self, start_pts, end_pts=None, s=1.0, shaft_length=0.8, shaft_width=0.05, head_length=0.225, head_width=0.175, fill=True, c=None, alpha=1.0, ): """ Build 2D arrows between two lists of points `start_pts` and `end_pts`. `start_pts` can be also passed in the form `[[point1, point2], ...]`. Color can be specified as a colormap which maps the size of the arrows. Arguments: shaft_length : (float) fractional shaft length shaft_width : (float) fractional shaft width head_length : (float) fractional head length head_width : (float) fractional head width fill : (bool) if False only generate the outline """ if isinstance(start_pts, Points): start_pts = start_pts.points() if isinstance(end_pts, Points): end_pts = end_pts.points() start_pts = np.asarray(start_pts, dtype=float) if end_pts is None: strt = start_pts[:, 0] end_pts = start_pts[:, 1] start_pts = strt else: end_pts = np.asarray(end_pts, dtype=float) if head_length is None: head_length = 1 - shaft_length arr = Arrow2D( (0, 0, 0), (1, 0, 0), s=s, shaft_length=shaft_length, shaft_width=shaft_width, head_length=head_length, head_width=head_width, fill=fill, ) orients = end_pts - start_pts orients = utils.make3d(orients) pts = Points(start_pts) Glyph.__init__( self, pts, arr.polydata(False), orientation_array=orients, scale_by_vector_size=True, c=c, alpha=alpha, ) self.flat().lighting("off") if c is not None: self.color(c) self.name = "Arrows2D" class FlatArrow(Ribbon): """ Build a 2D arrow in 3D space by joining two close lines. """ def __init__(self, line1, line2, tip_size=1.0, tip_width=1.0): """ Build a 2D arrow in 3D space by joining two close lines. Examples: - [flatarrow.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/flatarrow.py) ![](https://vedo.embl.es/images/basic/flatarrow.png) """ if isinstance(line1, Points): line1 = line1.points() if isinstance(line2, Points): line2 = line2.points() sm1, sm2 = np.array(line1[-1], dtype=float), np.array(line2[-1], dtype=float) v = (sm1 - sm2) / 3 * tip_width p1 = sm1 + v p2 = sm2 - v pm1 = (sm1 + sm2) / 2 pm2 = (np.array(line1[-2]) + np.array(line2[-2])) / 2 pm12 = pm1 - pm2 tip = pm12 / np.linalg.norm(pm12) * np.linalg.norm(v) * 3 * tip_size / tip_width + pm1 line1.append(p1) line1.append(tip) line2.append(p2) line2.append(tip) resm = max(100, len(line1)) Ribbon.__init__(self, line1, line2, res=(resm, 1)) self.phong() self.PickableOff() self.DragableOff() self.name = "FlatArrow" class Triangle(Mesh): """Create a triangle from 3 points in space.""" def __init__(self, p1, p2, p3, c="green7", alpha=1.0): """Create a triangle from 3 points in space.""" Mesh.__init__(self, [[p1, p2, p3], [[0, 1, 2]]], c, alpha) self.GetProperty().LightingOff() self.name = "Triangle" class Polygon(Mesh): """ Build a polygon in the `xy` plane. """ def __init__(self, pos=(0, 0, 0), nsides=6, r=1.0, c="coral", alpha=1.0): """ Build a polygon in the `xy` plane of `nsides` of radius `r`. ![](https://raw.githubusercontent.com/lorensen/VTKExamples/master/src/Testing/Baseline/Cxx/GeometricObjects/TestRegularPolygonSource.png) """ t = np.linspace(np.pi / 2, 5 / 2 * np.pi, num=nsides, endpoint=False) x, y = utils.pol2cart(np.ones_like(t) * r, t) faces = [list(range(nsides))] # do not use: vtkRegularPolygonSource Mesh.__init__(self, [np.c_[x, y], faces], c, alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) self.SetPosition(pos) self.GetProperty().LightingOff() self.name = "Polygon " + str(nsides) class Circle(Polygon): """ Build a Circle of radius `r`. """ def __init__(self, pos=(0, 0, 0), r=1.0, res=120, c="gray5", alpha=1.0): """ Build a Circle of radius `r`. """ Polygon.__init__(self, pos, nsides=res, r=r) self.center = [] # filled by pointcloud.pcaEllipse self.nr_of_points = 0 self.va = 0 self.vb = 0 self.axis1 = [] self.axis2 = [] self.alpha(alpha).c(c) self.name = "Circle" class GeoCircle(Polygon): """ Build a Circle of radius `r`. """ def __init__(self, lat, lon, r=1.0, res=60, c="red4", alpha=1.0): """ Build a Circle of radius `r` as projected on a geographic map. Circles near the poles will look very squashed. See example: ```bash vedo -r earthquake ``` """ coords = [] sinr, cosr = np.sin(r), np.cos(r) sinlat, coslat = np.sin(lat), np.cos(lat) for phi in np.linspace(0, 2 * np.pi, num=res, endpoint=False): clat = np.arcsin(sinlat * cosr + coslat * sinr * np.cos(phi)) clng = lon + np.arctan2(np.sin(phi) * sinr * coslat, cosr - sinlat * np.sin(clat)) coords.append([clng / np.pi + 1, clat * 2 / np.pi + 1, 0]) Polygon.__init__(self, nsides=res, c=c, alpha=alpha) self.points(coords) # warp polygon points to match geo projection self.name = "Circle" class Star(Mesh): """ Build a 2D star shape. """ def __init__(self, pos=(0, 0, 0), n=5, r1=0.7, r2=1.0, line=False, c="blue6", alpha=1.0): """ Build a 2D star shape of `n` cusps of inner radius `r1` and outer radius `r2`. If line is True then only build the outer line (no internal surface meshing). Example: - [extrude.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/extrude.py) ![](https://vedo.embl.es/images/basic/extrude.png) """ t = np.linspace(np.pi / 2, 5 / 2 * np.pi, num=n, endpoint=False) x, y = utils.pol2cart(np.ones_like(t) * r2, t) pts = np.c_[x, y, np.zeros_like(x)] apts = [] for i, p in enumerate(pts): apts.append(p) if i + 1 < n: apts.append((p + pts[i + 1]) / 2 * r1 / r2) apts.append((pts[-1] + pts[0]) / 2 * r1 / r2) if line: apts.append(pts[0]) poly = utils.buildPolyData(apts, lines=list(range(len(apts)))) Mesh.__init__(self, poly, c, alpha) self.lw(2) else: apts.append((0, 0, 0)) cells = [] for i in range(2 * n - 1): cell = [2 * n, i, i + 1] cells.append(cell) cells.append([2 * n, i + 1, 0]) Mesh.__init__(self, [apts, cells], c, alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) self.SetPosition(pos) self.property.LightingOff() self.name = "Star" class Disc(Mesh): """ Build a 2D disc. """ def __init__( self, pos=(0, 0, 0), r1=0.5, r2=1.0, res=(1, 120), angle_range=(), c="gray4", alpha=1.0 ): """ Build a 2D disc of inner radius `r1` and outer radius `r2`. Set `res` as the resolution in R and Phi (can be a list). Use `angle_range` to create a disc sector between the 2 specified angles. ![](https://raw.githubusercontent.com/lorensen/VTKExamples/master/src/Testing/Baseline/Cxx/GeometricObjects/TestDisk.png) """ if utils.is_sequence(res): res_r, res_phi = res else: res_r, res_phi = res, 12 * res if len(angle_range) == 0: ps = vtk.vtkDiskSource() else: ps = vtk.vtkSectorSource() ps.SetStartAngle(angle_range[0]) ps.SetEndAngle(angle_range[1]) ps.SetInnerRadius(r1) ps.SetOuterRadius(r2) ps.SetRadialResolution(res_r) ps.SetCircumferentialResolution(res_phi) ps.Update() Mesh.__init__(self, ps.GetOutput(), c, alpha) self.flat() self.SetPosition(utils.make3d(pos)) self.name = "Disc" class Arc(Mesh): """ Build a 2D circular arc between 2 points. """ def __init__( self, center, point1, point2=None, normal=None, angle=None, invert=False, res=50, c="gray4", alpha=1.0, ): """ Build a 2D circular arc between 2 points `point1` and `point2`. If `normal` is specified then `center` is ignored, and normal vector, a starting `point1` (polar vector) and an angle defining the arc length need to be assigned. Arc spans the shortest angular sector point1 and point2, if `invert=True`, then the opposite happens. """ if len(point1) == 2: point1 = (point1[0], point1[1], 0) if point2 is not None and len(point2) == 2: point2 = (point2[0], point2[1], 0) self.base = point1 self.top = point2 ar = vtk.vtkArcSource() if point2 is not None: self.top = point2 point2 = point2 - np.asarray(point1) ar.UseNormalAndAngleOff() ar.SetPoint1([0, 0, 0]) ar.SetPoint2(point2) ar.SetCenter(center) elif normal is not None and angle is not None: ar.UseNormalAndAngleOn() ar.SetAngle(angle) ar.SetPolarVector(point1) ar.SetNormal(normal) else: vedo.logger.error("incorrect input combination") return ar.SetNegative(invert) ar.SetResolution(res) ar.Update() Mesh.__init__(self, ar.GetOutput(), c, alpha) self.SetPosition(self.base) self.lw(2).lighting("off") self.name = "Arc" class IcoSphere(Mesh): """ Create a sphere made of a uniform triangle mesh. """ def __init__(self, pos=(0, 0, 0), r=1.0, subdivisions=3, c="r5", alpha=1.0): """ Create a sphere made of a uniform triangle mesh (from recursive subdivision of an icosahedron). Example: ```python from vedo import * icos = IcoSphere(subdivisions=3) icos.compute_quality().cmap('coolwarm') icos.show(axes=1).close() ``` ![](https://vedo.embl.es/images/basic/icosphere.jpg) """ subdivisions = int(min(subdivisions, 9)) # to avoid disasters t = (1.0 + np.sqrt(5.0)) / 2.0 points = np.array( [ [-1, t, 0], [1, t, 0], [-1, -t, 0], [1, -t, 0], [0, -1, t], [0, 1, t], [0, -1, -t], [0, 1, -t], [t, 0, -1], [t, 0, 1], [-t, 0, -1], [-t, 0, 1], ] ) faces = [ [0, 11, 5], [0, 5, 1], [0, 1, 7], [0, 7, 10], [0, 10, 11], [1, 5, 9], [5, 11, 4], [11, 10, 2], [10, 7, 6], [7, 1, 8], [3, 9, 4], [3, 4, 2], [3, 2, 6], [3, 6, 8], [3, 8, 9], [4, 9, 5], [2, 4, 11], [6, 2, 10], [8, 6, 7], [9, 8, 1], ] Mesh.__init__(self, [points * r, faces], c=c, alpha=alpha) for _ in range(subdivisions): self.subdivide(method=1) pts = utils.versor(self.points()) * r self.points(pts) self.SetPosition(pos) self.name = "IcoSphere" class Sphere(Mesh): """ Build a sphere. """ def __init__(self, pos=(0, 0, 0), r=1.0, res=24, quads=False, c="r5", alpha=1.0): """ Build a sphere at position `pos` of radius `r`. Arguments: r : (float) sphere radius res : (int, list) resolution in phi, resolution in theta is by default `2*res` quads : (bool) sphere mesh will be made of quads instead of triangles [](https://user-images.githubusercontent.com/32848391/72433092-f0a31e00-3798-11ea-85f7-b2f5fcc31568.png) """ if len(pos) == 2: pos = np.asarray([pos[0], pos[1], 0]) self.radius = r # used by fitSphere self.center = pos self.residue = 0 if quads: res = max(res, 4) img = vtk.vtkImageData() img.SetDimensions(res - 1, res - 1, res - 1) rs = 1.0 / (res - 2) img.SetSpacing(rs, rs, rs) gf = vtk.vtkGeometryFilter() gf.SetInputData(img) gf.Update() Mesh.__init__(self, gf.GetOutput(), c, alpha) self.lw(0.1) cgpts = self.points() - (0.5, 0.5, 0.5) x, y, z = cgpts.T x = x * (1 + x * x) / 2 y = y * (1 + y * y) / 2 z = z * (1 + z * z) / 2 _, theta, phi = utils.cart2spher(x, y, z) pts = utils.spher2cart(np.ones_like(phi) * r, theta, phi) self.points(pts) else: if utils.is_sequence(res): res_t, res_phi = res else: res_t, res_phi = 2 * res, res ss = vtk.vtkSphereSource() ss.SetRadius(r) ss.SetThetaResolution(res_t) ss.SetPhiResolution(res_phi) ss.Update() Mesh.__init__(self, ss.GetOutput(), c, alpha) self.phong() self.SetPosition(pos) self.name = "Sphere" class Spheres(Mesh): """ Build a large set of spheres. """ def __init__(self, centers, r=1.0, res=8, c="r5", alpha=1): """ Build a (possibly large) set of spheres at `centers` of radius `r`. Either `c` or `r` can be a list of RGB colors or radii. Examples: - [manyspheres.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/manyspheres.py) ![](https://vedo.embl.es/images/basic/manyspheres.jpg) """ if isinstance(centers, Points): centers = centers.points() centers = np.asarray(centers, dtype=float) base = centers[0] cisseq = False if utils.is_sequence(c): cisseq = True if cisseq: if len(centers) != len(c): vedo.logger.error(f"mismatch #centers {len(centers)} != {len(c)} #colors") raise RuntimeError() risseq = False if utils.is_sequence(r): risseq = True if risseq: if len(centers) != len(r): vedo.logger.error(f"mismatch #centers {len(centers)} != {len(r)} #radii") raise RuntimeError() if cisseq and risseq: vedo.logger.error("Limitation: c and r cannot be both sequences.") raise RuntimeError() src = vtk.vtkSphereSource() if not risseq: src.SetRadius(r) if utils.is_sequence(res): res_t, res_phi = res else: res_t, res_phi = 2 * res, res src.SetThetaResolution(res_t) src.SetPhiResolution(res_phi) src.Update() psrc = vtk.vtkPointSource() psrc.SetNumberOfPoints(len(centers)) psrc.Update() pd = psrc.GetOutput() vpts = pd.GetPoints() glyph = vtk.vtkGlyph3D() glyph.SetSourceConnection(src.GetOutputPort()) if cisseq: glyph.SetColorModeToColorByScalar() ucols = vtk.vtkUnsignedCharArray() ucols.SetNumberOfComponents(3) ucols.SetName("Colors") for acol in c: cx, cy, cz = get_color(acol) ucols.InsertNextTuple3(cx * 255, cy * 255, cz * 255) pd.GetPointData().AddArray(ucols) pd.GetPointData().SetActiveScalars("Colors") glyph.ScalingOff() elif risseq: glyph.SetScaleModeToScaleByScalar() urads = utils.numpy2vtk(2 * np.ascontiguousarray(r), dtype=np.float32) urads.SetName("Radii") pd.GetPointData().AddArray(urads) pd.GetPointData().SetActiveScalars("Radii") vpts.SetData(utils.numpy2vtk(centers - base, dtype=np.float32)) glyph.SetInputData(pd) glyph.Update() Mesh.__init__(self, glyph.GetOutput(), alpha=alpha) self.SetPosition(base) self.base = base self.top = centers[-1] self.phong() if cisseq: self.mapper().ScalarVisibilityOn() else: self.mapper().ScalarVisibilityOff() self.GetProperty().SetColor(get_color(c)) self.name = "Spheres" class Earth(Mesh): """ Build a textured mesh representing the Earth. """ def __init__(self, style=1, r=1.0): """ Build a textured mesh representing the Earth. Example: - [geodesic.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/geodesic.py) ![](https://vedo.embl.es/images/advanced/geodesic.png) """ tss = vtk.vtkTexturedSphereSource() tss.SetRadius(r) tss.SetThetaResolution(72) tss.SetPhiResolution(36) Mesh.__init__(self, tss, c="w") atext = vtk.vtkTexture() pnm_reader = vtk.vtkJPEGReader() fn = vedo.file_io.download(vedo.dataurl + f"textures/earth{style}.jpg", verbose=False) pnm_reader.SetFileName(fn) atext.SetInputConnection(pnm_reader.GetOutputPort()) atext.InterpolateOn() self.SetTexture(atext) self.name = "Earth" class Ellipsoid(Mesh): """ Build a 3D ellipsoid. """ def __init__( self, pos=(0, 0, 0), axis1=(1, 0, 0), axis2=(0, 2, 0), axis3=(0, 0, 3), res=24, c="cyan4", alpha=1.0, ): """ Build a 3D ellipsoid centered at position `pos`. Arguments: axis1 : (list) First axis axis2 : (list) Second axis axis3 : (list) Third axis .. note:: `axis1` and `axis2` are only used to define sizes and one azimuth angle. """ self.center = pos self.va_error = 0 self.vb_error = 0 self.vc_error = 0 self.axis1 = axis1 self.axis2 = axis2 self.axis3 = axis3 self.nr_of_points = 1 # used by pcaEllipsoid if utils.is_sequence(res): res_t, res_phi = res else: res_t, res_phi = 2 * res, res elli_source = vtk.vtkSphereSource() elli_source.SetThetaResolution(res_t) elli_source.SetPhiResolution(res_phi) elli_source.Update() l1 = np.linalg.norm(axis1) l2 = np.linalg.norm(axis2) l3 = np.linalg.norm(axis3) self.va = l1 self.vb = l2 self.vc = l3 axis1 = np.array(axis1) / l1 axis2 = np.array(axis2) / l2 axis3 = np.array(axis3) / l3 angle = np.arcsin(np.dot(axis1, axis2)) theta = np.arccos(axis3[2]) phi = np.arctan2(axis3[1], axis3[0]) t = vtk.vtkTransform() t.PostMultiply() t.Scale(l1, l2, l3) t.RotateX(np.rad2deg(angle)) t.RotateY(np.rad2deg(theta)) t.RotateZ(np.rad2deg(phi)) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputData(elli_source.GetOutput()) tf.SetTransform(t) tf.Update() pd = tf.GetOutput() self.transformation = t Mesh.__init__(self, pd, c, alpha) self.phong() if len(pos) == 2: pos = (pos[0], pos[1], 0) self.SetPosition(pos) self.name = "Ellipsoid" def asphericity(self): """ Return a measure of how different an ellipsoid is froma sphere. Values close to zero correspond to a spheric object. """ a,b,c = self.va, self.vb, self.vc asp = ( ((a-b)/(a+b))**2 + ((a-c)/(a+c))**2 + ((b-c)/(b+c))**2 )/3. * 4. return asp def asphericity_error(self): """ Calculate statistical error on the asphericity value. Errors on the main axes are stored in `Ellipsoid.va_error, Ellipsoid.vb_error and Ellipsoid.vc_error`. """ a, b, c = self.va, self.vb, self.vc sqrtn = np.sqrt(self.nr_of_points) ea, eb, ec = a / 2 / sqrtn, b / 2 / sqrtn, b / 2 / sqrtn # from sympy import * # init_printing(use_unicode=True) # a, b, c, ea, eb, ec = symbols("a b c, ea, eb,ec") # L = ( # (((a - b) / (a + b)) ** 2 + ((c - b) / (c + b)) ** 2 + ((a - c) / (a + c)) ** 2) # / 3 * 4) # dl2 = (diff(L, a) * ea) ** 2 + (diff(L, b) * eb) ** 2 + (diff(L, c) * ec) ** 2 # print(dl2) # exit() dL2 = ( ea ** 2 * ( -8 * (a - b) ** 2 / (3 * (a + b) ** 3) - 8 * (a - c) ** 2 / (3 * (a + c) ** 3) + 4 * (2 * a - 2 * c) / (3 * (a + c) ** 2) + 4 * (2 * a - 2 * b) / (3 * (a + b) ** 2) ) ** 2 + eb ** 2 * ( 4 * (-2 * a + 2 * b) / (3 * (a + b) ** 2) - 8 * (a - b) ** 2 / (3 * (a + b) ** 3) - 8 * (-b + c) ** 2 / (3 * (b + c) ** 3) + 4 * (2 * b - 2 * c) / (3 * (b + c) ** 2) ) ** 2 + ec ** 2 * ( 4 * (-2 * a + 2 * c) / (3 * (a + c) ** 2) - 8 * (a - c) ** 2 / (3 * (a + c) ** 3) + 4 * (-2 * b + 2 * c) / (3 * (b + c) ** 2) - 8 * (-b + c) ** 2 / (3 * (b + c) ** 3) ) ** 2 ) err = np.sqrt(dL2) self.va_error = ea self.vb_error = eb self.vc_error = ec return err class Grid(Mesh): """ An even or uneven 2D grid. """ def __init__(self, pos=(0, 0, 0), s=(1, 1), res=(10, 10), lw=1, c="k3", alpha=1.0): """ Create an even or uneven 2D grid. Arguments: s : (float, list) if a float is provided it is interpreted as the total size along x and y, if a list of coords is provided they are interpreted as the vertices of the grid along x and y. In this case keyword `res` is ignored (see example below). res : (list) resolutions along x and y, e.i. the number of subdivisions lw : (int) line width Example: ```python from vedo import * import numpy as np xcoords = np.arange(0, 2, 0.2) ycoords = np.arange(0, 1, 0.2) sqrtx = sqrt(xcoords) grid = Grid(s=(sqrtx, ycoords)).lw(2) grid.show(axes=8) # can also create a grid from np.mgrid: X, Y = np.mgrid[-12:12:1000*1j, 0:15:1000*1j] vgrid = Grid(s=(X[:,0], Y[0])) vgrid.show(axes=1).close() ``` ![](https://vedo.embl.es/images/feats/uneven_grid.png) """ resx, resy = res sx, sy = s if len(pos) == 2: pos = (pos[0], pos[1], 0) if utils.is_sequence(sx) and utils.is_sequence(sy): verts = [] for y in sy: for x in sx: verts.append([x, y, 0]) faces = [] n = len(sx) m = len(sy) for j in range(m - 1): j1n = (j + 1) * n for i in range(n - 1): faces.append([i + j * n, i + 1 + j * n, i + 1 + j1n, i + j1n]) verts = np.array(verts) Mesh.__init__(self, [verts, faces], c, alpha) else: ps = vtk.vtkPlaneSource() ps.SetResolution(resx, resy) ps.Update() poly0 = ps.GetOutput() t0 = vtk.vtkTransform() t0.Scale(sx, sy, 1) tf0 = vtk.vtkTransformPolyDataFilter() tf0.SetInputData(poly0) tf0.SetTransform(t0) tf0.Update() poly = tf0.GetOutput() Mesh.__init__(self, poly, c, alpha) self.SetPosition(pos) self.wireframe().lw(lw) self.GetProperty().LightingOff() self.name = "Grid" class Plane(Mesh): """ Create a plane in space. """ def __init__(self, pos=(0, 0, 0), normal=(0, 0, 1), s=(1, 1), res=(1, 1), c="gray5", alpha=1.0): """ Create a plane of size `s=(xsize, ysize)` oriented perpendicular to vector `normal` and so that it passes through point `pos`. Arguments: normal : (list) normal vector to the plane """ pos = utils.make3d(pos) sx, sy = s self.normal = np.asarray(normal, dtype=float) self.center = np.asarray(pos, dtype=float) self.variance = 0 ps = vtk.vtkPlaneSource() ps.SetResolution(res[0], res[1]) tri = vtk.vtkTriangleFilter() tri.SetInputConnection(ps.GetOutputPort()) tri.Update() poly = tri.GetOutput() axis = self.normal / np.linalg.norm(normal) theta = np.arccos(axis[2]) phi = np.arctan2(axis[1], axis[0]) t = vtk.vtkTransform() t.PostMultiply() t.Scale(sx, sy, 1) t.RotateY(np.rad2deg(theta)) t.RotateZ(np.rad2deg(phi)) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputData(poly) tf.SetTransform(t) tf.Update() Mesh.__init__(self, tf.GetOutput(), c, alpha) self.lighting("off") self.SetPosition(pos) self.name = "Plane" self.top = self.normal self.bottom = np.array([0.0, 0.0, 0.0]) def contains(self, points): """ Check if each of the provided point lies on this plane. `points` is an array of shape (n, 3). """ points = np.array(points, dtype=float) bounds = self.points() mask = np.isclose(np.dot(points - self.center, self.normal), 0) for i in [1, 3]: AB = bounds[i] - bounds[0] AP = points - bounds[0] mask_l = np.less_equal(np.dot(AP, AB), np.linalg.norm(AB)) mask_g = np.greater_equal(np.dot(AP, AB), 0) mask = np.logical_and(mask, mask_l) mask = np.logical_and(mask, mask_g) return mask class Rectangle(Mesh): """ Build a rectangle in the xy plane. """ def __init__(self, p1=(0, 0), p2=(1, 1), radius=None, res=12, c="gray5", alpha=1.0): """ Build a rectangle in the xy plane identified by any two corner points. Arguments: p1 : (list) bottom-left position of the corner p2 : (list) top-right position of the corner radius : (float, list) smoothing radius of the corner in world units. A list can be passed with 4 individual values. """ if len(p1) == 2: p1 = np.array([p1[0], p1[1], 0.0]) else: p1 = np.array(p1, dtype=float) if len(p2) == 2: p2 = np.array([p2[0], p2[1], 0.0]) else: p2 = np.array(p2, dtype=float) self.corner1 = p1 self.corner2 = p2 color = c smoothr = False risseq = False if utils.is_sequence(radius): risseq = True smoothr = True if max(radius) == 0: smoothr = False elif radius: smoothr = True if not smoothr: radius = None self.radius = radius if smoothr: r = radius if not risseq: r = [r, r, r, r] rd, ra, rb, rc = r if p1[0] > p2[0]: # flip p1 - p2 p1, p2 = p2, p1 if p1[1] > p2[1]: # flip p1y - p2y p1[1], p2[1] = p2[1], p1[1] px, py, _ = p2 - p1 k = min(px / 2, py / 2) ra = min(abs(ra), k) rb = min(abs(rb), k) rc = min(abs(rc), k) rd = min(abs(rd), k) beta = np.linspace(0, 2 * np.pi, num=res * 4, endpoint=False) betas = np.split(beta, 4) rrx = np.cos(betas) rry = np.sin(betas) q1 = (rd, 0) # q2 = (px-ra, 0) q3 = (px, ra) # q4 = (px, py-rb) q5 = (px - rb, py) # q6 = (rc, py) q7 = (0, py - rc) # q8 = (0, rd) a = np.c_[rrx[3], rry[3]]*ra + [px-ra, ra] if ra else np.array([]) b = np.c_[rrx[0], rry[0]]*rb + [px-rb, py-rb] if rb else np.array([]) c = np.c_[rrx[1], rry[1]]*rc + [rc, py-rc] if rc else np.array([]) d = np.c_[rrx[2], rry[2]]*rd + [rd, rd] if rd else np.array([]) pts = [q1, *a.tolist(), q3, *b.tolist(), q5, *c.tolist(), q7, *d.tolist()] faces = [list(range(len(pts)))] else: p1r = np.array([p2[0], p1[1], 0.0]) p2l = np.array([p1[0], p2[1], 0.0]) pts = ([0.0, 0.0, 0.0], p1r - p1, p2 - p1, p2l - p1) faces = [(0, 1, 2, 3)] Mesh.__init__(self, [pts, faces], color, alpha) self.SetPosition(p1) self.property.LightingOff() self.name = "Rectangle" class Box(Mesh): """ Build a box of specified dimensions. """ def __init__(self, pos=(0, 0, 0), length=1.0, width=2.0, height=3.0, size=(), c="g4", alpha=1.0): """ Build a box of dimensions `x=length, y=width and z=height`. Alternatively dimensions can be defined by setting `size` keyword with a tuple. If `size` is a list of 6 numbers, this will be interpreted as the bounding box: `[xmin,xmax, ymin,ymax, zmin,zmax]` Examples: - [aspring1.py](https://github.com/marcomusy/vedo/tree/master/examples/simulations/aspring1.py) ![](https://vedo.embl.es/images/simulations/50738955-7e891800-11d9-11e9-85cd-02bd4f3f13ea.gif) """ if len(size) == 6: bounds = size length = bounds[1] - bounds[0] width = bounds[3] - bounds[2] height = bounds[5] - bounds[4] xp = (bounds[1] + bounds[0]) / 2 yp = (bounds[3] + bounds[2]) / 2 zp = (bounds[5] + bounds[4]) / 2 pos = (xp, yp, zp) elif len(size) == 3: length, width, height = size src = vtk.vtkCubeSource() src.SetXLength(length) src.SetYLength(width) src.SetZLength(height) src.Update() pd = src.GetOutput() tc = [ [0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 0.0], [1.0, 1.0], [0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 1.0], [0.0, 0.0], [0.0, 1.0], [0.0, 0.0], [1.0, 1.0], [1.0, 0.0], [1.0, 0.0], [0.0, 0.0], [1.0, 1.0], [0.0, 1.0], [0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0], ] vtc = utils.numpy2vtk(tc) pd.GetPointData().SetTCoords(vtc) Mesh.__init__(self, pd, c, alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) self.SetPosition(pos) self.name = "Box" class Cube(Box): """Build a cube.""" def __init__(self, pos=(0, 0, 0), side=1.0, c="g4", alpha=1.0): """Build a cube of size `side`.""" Box.__init__(self, pos, side, side, side, (), c, alpha) self.name = "Cube" class TessellatedBox(Mesh): """ Build a cubic `Mesh` made of quads. """ def __init__(self, pos=(0, 0, 0), n=10, spacing=(1, 1, 1), bounds=(), c="k5", alpha=0.5): """ Build a cubic `Mesh` made of `n` small quads in the 3 axis directions. Arguments: pos : (list) position of the left bottom corner n : (int, list) number of subdivisions along each side spacing : (float) size of the side of the single quad in the 3 directions """ if utils.is_sequence(n): # slow img = vtk.vtkImageData() img.SetDimensions(n[0] + 1, n[1] + 1, n[2] + 1) img.SetSpacing(spacing) gf = vtk.vtkGeometryFilter() gf.SetInputData(img) gf.Update() poly = gf.GetOutput() else: # fast n -= 1 tbs = vtk.vtkTessellatedBoxSource() tbs.SetLevel(n) if len(bounds): tbs.SetBounds(bounds) else: tbs.SetBounds(0, n * spacing[0], 0, n * spacing[1], 0, n * spacing[2]) tbs.QuadsOn() tbs.SetOutputPointsPrecision(vtk.vtkAlgorithm.SINGLE_PRECISION) tbs.Update() poly = tbs.GetOutput() Mesh.__init__(self, poly, c=c, alpha=alpha) self.SetPosition(pos) self.lw(1).lighting("off") self.base = np.array([0.5, 0.5, 0.0]) self.top = np.array([0.5, 0.5, 1.0]) self.name = "TessellatedBox" class Spring(Mesh): """ Build a spring model. """ def __init__( self, start_pt=(0, 0, 0), end_pt=(1, 0, 0), coils=20, r1=0.1, r2=None, thickness=None, c="gray5", alpha=1.0, ): """ Build a spring of specified nr of `coils` between `start_pt` and `end_pt`. Arguments: coils : (int) number of coils r1 : (float) radius at start point r2 : (float) radius at end point thickness : (float) thickness of the coil section """ diff = end_pt - np.array(start_pt, dtype=float) length = np.linalg.norm(diff) if not length: return if not r1: r1 = length / 20 trange = np.linspace(0, length, num=50 * coils) om = 6.283 * (coils - 0.5) / length if not r2: r2 = r1 pts = [] for t in trange: f = (length - t) / length rd = r1 * f + r2 * (1 - f) pts.append([rd * np.cos(om * t), rd * np.sin(om * t), t]) pts = [[0, 0, 0]] + pts + [[0, 0, length]] diff = diff / length theta = np.arccos(diff[2]) phi = np.arctan2(diff[1], diff[0]) sp = Line(pts).polydata(False) t = vtk.vtkTransform() t.RotateZ(np.rad2deg(phi)) t.RotateY(np.rad2deg(theta)) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputData(sp) tf.SetTransform(t) tf.Update() tuf = vtk.vtkTubeFilter() tuf.SetNumberOfSides(12) tuf.CappingOn() tuf.SetInputData(tf.GetOutput()) if not thickness: thickness = r1 / 10 tuf.SetRadius(thickness) tuf.Update() Mesh.__init__(self, tuf.GetOutput(), c, alpha) self.phong() self.SetPosition(start_pt) self.base = np.array(start_pt, dtype=float) self.top = np.array(end_pt, dtype=float) self.name = "Spring" class Cylinder(Mesh): """ Build a cylinder of specified height and radius. """ def __init__( self, pos=(0, 0, 0), r=1.0, height=2.0, axis=(0, 0, 1), cap=True, res=24, c="teal3", alpha=1.0 ): """ Build a cylinder of specified height and radius `r`, centered at `pos`. If `pos` is a list of 2 points, e.g. `pos=[v1,v2]`, build a cylinder with base centered at `v1` and top at `v2`. ![](https://raw.githubusercontent.com/lorensen/VTKExamples/master/src/Testing/Baseline/Cxx/GeometricObjects/TestCylinder.png) """ if utils.is_sequence(pos[0]): # assume user is passing pos=[base, top] base = np.array(pos[0], dtype=float) top = np.array(pos[1], dtype=float) pos = (base + top) / 2 height = np.linalg.norm(top - base) axis = top - base axis = utils.versor(axis) else: axis = utils.versor(axis) base = pos - axis * height / 2 top = pos + axis * height / 2 cyl = vtk.vtkCylinderSource() cyl.SetResolution(res) cyl.SetRadius(r) cyl.SetHeight(height) cyl.SetCapping(cap) cyl.Update() theta = np.arccos(axis[2]) phi = np.arctan2(axis[1], axis[0]) t = vtk.vtkTransform() t.PostMultiply() t.RotateX(90) # put it along Z t.RotateY(np.rad2deg(theta)) t.RotateZ(np.rad2deg(phi)) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputData(cyl.GetOutput()) tf.SetTransform(t) tf.Update() pd = tf.GetOutput() Mesh.__init__(self, pd, c, alpha) self.phong() self.SetPosition(pos) self.base = base + pos self.top = top + pos self.name = "Cylinder" class Cone(Mesh): """Build a cone of specified radius and height.""" def __init__(self, pos=(0, 0, 0), r=1.0, height=3.0, axis=(0, 0, 1), res=48, c="green3", alpha=1.0): """Build a cone of specified radius `r` and `height`, centered at `pos`.""" con = vtk.vtkConeSource() con.SetResolution(res) con.SetRadius(r) con.SetHeight(height) con.SetDirection(axis) con.Update() Mesh.__init__(self, con.GetOutput(), c, alpha) self.phong() if len(pos) == 2: pos = (pos[0], pos[1], 0) self.SetPosition(pos) v = utils.versor(axis) * height / 2 self.base = pos - v self.top = pos + v self.name = "Cone" class Pyramid(Cone): """Build a pyramidal shape.""" def __init__(self, pos=(0, 0, 0), s=1.0, height=1.0, axis=(0, 0, 1), c="green3", alpha=1): """Build a pyramid of specified base size `s` and `height`, centered at `pos`.""" Cone.__init__(self, pos, s, height, axis, 4, c, alpha) self.name = "Pyramid" class Torus(Mesh): """ Build a toroidal shape. """ def __init__(self, pos=(0, 0, 0), r1=1.0, r2=0.2, res=36, quads=False, c="yellow3", alpha=1.0): """ Build a torus of specified outer radius `r1` internal radius `r2`, centered at `pos`. If `quad=True` a quad-mesh is generated. """ if utils.is_sequence(res): res_u, res_v = res else: res_u, res_v = 3 * res, res if quads: # https://github.com/marcomusy/vedo/issues/710 n = res_v m = res_u theta = np.linspace(0, 2.0 * np.pi, n) phi = np.linspace(0, 2.0 * np.pi, m) theta, phi = np.meshgrid(theta, phi) t = r1 + r2 * np.cos(theta) x = t * np.cos(phi) y = t * np.sin(phi) z = r2 * np.sin(theta) pts = np.column_stack((x.ravel(), y.ravel(), z.ravel())) faces = [] for j in range(m - 1): j1n = (j + 1) * n for i in range(n - 1): faces.append([i + j * n, i + 1 + j * n, i + 1 + j1n, i + j1n]) Mesh.__init__(self, [pts, faces], c, alpha) else: rs = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricTorus() rs.SetRingRadius(r1) rs.SetCrossSectionRadius(r2) pfs = vtk.vtkParametricFunctionSource() pfs.SetParametricFunction(rs) pfs.SetUResolution(res_u) pfs.SetVResolution(res_v) pfs.Update() Mesh.__init__(self, pfs.GetOutput(), c, alpha) self.phong() if len(pos) == 2: pos = (pos[0], pos[1], 0) self.SetPosition(pos) self.name = "Torus" class Paraboloid(Mesh): """ Build a paraboloid. """ def __init__(self, pos=(0, 0, 0), height=1.0, res=50, c="cyan5", alpha=1.0): """ Build a paraboloid of specified height and radius `r`, centered at `pos`. Full volumetric expression is: `F(x,y,z)=a_0x^2+a_1y^2+a_2z^2+a_3xy+a_4yz+a_5xz+ a_6x+a_7y+a_8z+a_9` ![](https://user-images.githubusercontent.com/32848391/51211547-260ef480-1916-11e9-95f6-4a677e37e355.png) """ quadric = vtk.vtkQuadric() quadric.SetCoefficients(1, 1, 0, 0, 0, 0, 0, 0, height / 4, 0) # F(x,y,z) = a0*x^2 + a1*y^2 + a2*z^2 # + a3*x*y + a4*y*z + a5*x*z # + a6*x + a7*y + a8*z +a9 sample = vtk.vtkSampleFunction() sample.SetSampleDimensions(res, res, res) sample.SetImplicitFunction(quadric) contours = vtk.vtkContourFilter() contours.SetInputConnection(sample.GetOutputPort()) contours.GenerateValues(1, 0.01, 0.01) contours.Update() Mesh.__init__(self, contours.GetOutput(), c, alpha) self.compute_normals().phong() self.mapper().ScalarVisibilityOff() self.SetPosition(pos) self.name = "Paraboloid" class Hyperboloid(Mesh): """ Build a hyperboloid. """ def __init__(self, pos=(0, 0, 0), a2=1.0, value=0.5, res=100, c="pink4", alpha=1.0): """ Build a hyperboloid of specified aperture `a2` and `height`, centered at `pos`. Full volumetric expression is: `F(x,y,z)=a_0x^2+a_1y^2+a_2z^2+a_3xy+a_4yz+a_5xz+ a_6x+a_7y+a_8z+a_9` """ q = vtk.vtkQuadric() q.SetCoefficients(2, 2, -1 / a2, 0, 0, 0, 0, 0, 0, 0) # F(x,y,z) = a0*x^2 + a1*y^2 + a2*z^2 # + a3*x*y + a4*y*z + a5*x*z # + a6*x + a7*y + a8*z +a9 sample = vtk.vtkSampleFunction() sample.SetSampleDimensions(res, res, res) sample.SetImplicitFunction(q) contours = vtk.vtkContourFilter() contours.SetInputConnection(sample.GetOutputPort()) contours.GenerateValues(1, value, value) contours.Update() Mesh.__init__(self, contours.GetOutput(), c, alpha) self.compute_normals().phong() self.mapper().ScalarVisibilityOff() self.SetPosition(pos) self.name = "Hyperboloid" def Marker(symbol, pos=(0, 0, 0), c="k", alpha=1.0, s=0.1, filled=True): """ Generate a marker shape. Typically used in association with `Glyph`. """ if isinstance(symbol, Mesh): return symbol.c(c).alpha(alpha).lighting("off") if isinstance(symbol, int): symbs = [".", "o", "O", "0", "p", "*", "h", "D", "d", "v", "^", ">", "<", "s", "x", "a"] symbol = symbol % len(symbs) symbol = symbs[symbol] if symbol == ".": mesh = Polygon(nsides=24, r=s * 0.6) elif symbol == "o": mesh = Polygon(nsides=24, r=s * 0.75) elif symbol == "O": mesh = Disc(r1=s * 0.6, r2=s * 0.75, res=(1, 24)) elif symbol == "0": m1 = Disc(r1=s * 0.6, r2=s * 0.75, res=(1, 24)) m2 = Circle(r=s * 0.36).reverse() mesh = merge(m1, m2) elif symbol == "p": mesh = Polygon(nsides=5, r=s) elif symbol == "*": mesh = Star(r1=0.65 * s * 1.1, r2=s * 1.1, line=not filled) elif symbol == "h": mesh = Polygon(nsides=6, r=s) elif symbol == "D": mesh = Polygon(nsides=4, r=s) elif symbol == "d": mesh = Polygon(nsides=4, r=s * 1.1).scale([0.5, 1, 1]) elif symbol == "v": mesh = Polygon(nsides=3, r=s).rotate_z(180) elif symbol == "^": mesh = Polygon(nsides=3, r=s) elif symbol == ">": mesh = Polygon(nsides=3, r=s).rotate_z(-90) elif symbol == "<": mesh = Polygon(nsides=3, r=s).rotate_z(90) elif symbol == "s": mesh = Mesh( [[[-1, -1, 0], [1, -1, 0], [1, 1, 0], [-1, 1, 0]], [[0, 1, 2, 3]]] ).scale(s / 1.4) elif symbol == "x": mesh = Text3D("+", pos=(0, 0, 0), s=s * 2.6, justify="center", depth=0) # mesh.rotate_z(45) elif symbol == "a": mesh = Text3D("*", pos=(0, 0, 0), s=s * 2.6, justify="center", depth=0) else: mesh = Text3D(symbol, pos=(0, 0, 0), s=s * 2, justify="center", depth=0) mesh.flat().lighting("off").wireframe(not filled).c(c).alpha(alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) mesh.SetPosition(pos) mesh.name = "Marker" return mesh class Brace(Mesh): """ Create a brace (bracket) shape. """ def __init__( self, q1, q2, style="}", padding1=0.0, font="Theemim", comment="", justify=None, angle=0.0, padding2=0.2, s=1.0, italic=0, c="k1", alpha=1.0, ): """ Create a brace (bracket) shape which spans from point q1 to point q2. Arguments: q1 : (list) point 1. q2 : (list) point 2. style : (str) style of the bracket, eg. `{}, [], (), <>`. padding1 : (float) padding space in percent form the input points. font : (str) font type comment : (str) additional text to appear next to the brace symbol. justify : (str) specify the anchor point to justify text comment, e.g. "top-left". italic : float italicness of the text comment (can be a positive or negative number) angle : (float) rotation angle of text. Use `None` to keep it horizontal. padding2 : (float) padding space in percent form brace to text comment. s : (float) scale factor for the comment Examples: - [scatter3.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/scatter3.py) ![](https://vedo.embl.es/images/pyplot/scatter3.png) """ if isinstance(q1, vtk.vtkActor): q1 = q1.GetPosition() if isinstance(q2, vtk.vtkActor): q2 = q2.GetPosition() if len(q1) == 2: q1 = [q1[0], q1[1], 0.0] if len(q2) == 2: q2 = [q2[0], q2[1], 0.0] q1 = np.array(q1, dtype=float) q2 = np.array(q2, dtype=float) mq = (q1 + q2) / 2 q1 = q1 - mq q2 = q2 - mq d = np.linalg.norm(q2 - q1) q2[2] = q1[2] if style not in "{}[]()<>|I": vedo.logger.error(f"unknown style {style}." + "Use {}[]()<>|I") style = "}" flip = False if style in ["{", "[", "(", "<"]: flip = True i = ["{", "[", "(", "<"].index(style) style = ["}", "]", ")", ">"][i] br = Text3D(style, font="Theemim", justify="center-left") br.scale([0.4, 1, 1]) angler = np.arctan2(q2[1], q2[0]) * 180 / np.pi - 90 if flip: angler += 180 _, x1, y0, y1, _, _ = br.bounds() if comment: just = "center-top" if angle is None: angle = -angler + 90 if not flip: angle += 180 if flip: angle += 180 just = "center-bottom" if justify is not None: just = justify cmt = Text3D(comment, font=font, justify=just, italic=italic) cx0, cx1 = cmt.xbounds() cmt.rotate_z(90 + angle) cmt.scale(1 / (cx1 - cx0) * s * len(comment) / 5) cmt.shift(x1 * (1 + padding2), 0, 0) poly = merge(br, cmt).polydata() else: poly = br.polydata() tr = vtk.vtkTransform() tr.RotateZ(angler) tr.Translate(padding1 * d, 0, 0) pscale = 1 tr.Scale(pscale / (y1 - y0) * d, pscale / (y1 - y0) * d, 1) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputData(poly) tf.SetTransform(tr) tf.Update() poly = tf.GetOutput() Mesh.__init__(self, poly, c, alpha) self.SetPosition(mq) self.name = "Brace" self.base = q1 self.top = q2 class Star3D(Mesh): """ Build a 3D starred shape. """ def __init__(self, pos=(0, 0, 0), r=1.0, thickness=0.1, c="blue4", alpha=1.0): """ Build a 3D star shape of 5 cusps, mainly useful as a 3D marker. """ pts = ((1.34, 0., -0.37), (5.75e-3, -0.588, thickness/10), (0.377, 0.,-0.38), (0.0116, 0., -1.35), (-0.366, 0., -0.384), (-1.33, 0., -0.385), (-0.600, 0., 0.321), (-0.829, 0., 1.19), (-1.17e-3, 0., 0.761), (0.824, 0., 1.20), (0.602, 0., 0.328), (6.07e-3, 0.588, thickness/10)) fcs = [[0, 1, 2], [0, 11,10], [2, 1, 3], [2, 11, 0], [3, 1, 4], [3, 11, 2], [4, 1, 5], [4, 11, 3], [5, 1, 6], [5, 11, 4], [6, 1, 7], [6, 11, 5], [7, 1, 8], [7, 11, 6], [8, 1, 9], [8, 11, 7], [9, 1,10], [9, 11, 8], [10,1, 0],[10,11, 9]] Mesh.__init__(self, [pts, fcs], c, alpha) self.RotateX(90) self.scale(r).lighting("shiny") if len(pos) == 2: pos = (pos[0], pos[1], 0) self.SetPosition(pos) self.name = "Star3D" class Cross3D(Mesh): """ Build a 3D cross shape. """ def __init__(self, pos=(0, 0, 0), s=1.0, thickness=0.3, c="b", alpha=1.0): """ Build a 3D cross shape, mainly useful as a 3D marker. """ c1 = Cylinder(r=thickness * s, height=2 * s) c2 = Cylinder(r=thickness * s, height=2 * s).rotate_x(90) c3 = Cylinder(r=thickness * s, height=2 * s).rotate_y(90) poly = merge(c1, c2, c3).color(c).alpha(alpha).polydata(False) Mesh.__init__(self, poly, c, alpha) if len(pos) == 2: pos = (pos[0], pos[1], 0) self.SetPosition(pos) self.name = "Cross3D" class ParametricShape(Mesh): """ A set of built-in shapes mainly for illustration purposes. """ def __init__(self, name, res=51, n=25, seed=1): """ A set of built-in shapes mainly for illustration purposes. Name can be an integer or a string in this list: `['Boy', 'ConicSpiral', 'CrossCap', 'Dini', 'Enneper', 'Figure8Klein', 'Klein', 'Mobius', 'RandomHills', 'Roman', 'SuperEllipsoid', 'BohemianDome', 'Bour', 'CatalanMinimal', 'Henneberg', 'Kuen', 'PluckerConoid', 'Pseudosphere']`. Example: ```python from vedo import * settings.immediate_rendering = False plt = Plotter(N=18) for i in range(18): ps = ParametricShape(i).color(i) plt.at(i).show(ps, ps.name) plt.interactive().close() ``` """ shapes = [ "Boy", "ConicSpiral", "CrossCap", "Enneper", "Figure8Klein", "Klein", "Dini", "Mobius", "RandomHills", "Roman", "SuperEllipsoid", "BohemianDome", "Bour", "CatalanMinimal", "Henneberg", "Kuen", "PluckerConoid", "Pseudosphere", ] if isinstance(name, int): name = name % len(shapes) name = shapes[name] if name == "Boy": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricBoy() elif name == "ConicSpiral": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricConicSpiral() elif name == "CrossCap": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricCrossCap() elif name == "Dini": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricDini() elif name == "Enneper": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricEnneper() elif name == "Figure8Klein": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricFigure8Klein() elif name == "Klein": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricKlein() elif name == "Mobius": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricMobius() ps.SetRadius(2.0) ps.SetMinimumV(-0.5) ps.SetMaximumV(0.5) elif name == "RandomHills": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricRandomHills() ps.AllowRandomGenerationOn() ps.SetRandomSeed(seed) ps.SetNumberOfHills(n) elif name == "Roman": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricRoman() elif name == "SuperEllipsoid": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricSuperEllipsoid() ps.SetN1(0.5) ps.SetN2(0.4) elif name == "BohemianDome": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricBohemianDome() ps.SetA(5.0) ps.SetB(1.0) ps.SetC(2.0) elif name == "Bour": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricBour() elif name == "CatalanMinimal": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricCatalanMinimal() elif name == "Henneberg": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricHenneberg() elif name == "Kuen": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricKuen() ps.SetDeltaV0(0.001) elif name == "PluckerConoid": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricPluckerConoid() elif name == "Pseudosphere": ps = vtk.vtkmodules.vtkCommonComputationalGeometry.vtkParametricPseudosphere() else: vedo.logger.error(f"unknown ParametricShape {name}") return pfs = vtk.vtkParametricFunctionSource() pfs.SetParametricFunction(ps) pfs.SetUResolution(res) pfs.SetVResolution(res) pfs.SetWResolution(res) pfs.SetScalarModeToZ() pfs.Update() Mesh.__init__(self, pfs.GetOutput()) if name != 'Kuen': self.normalize() if name == 'Dini': self.scale(0.4) if name == 'Enneper': self.scale(0.4) if name == 'ConicSpiral': self.bc('tomato') self.name = name @lru_cache(None) def _load_font(font): # print('_load_font()', font) if utils.is_number(font): font = list(settings.font_parameters.keys())[int(font)] if font.endswith(".npz"): # user passed font as a local path fontfile = font font = os.path.basename(font).split(".")[0] elif font.startswith("https"): # user passed URL link, make it a path try: fontfile = vedo.file_io.download(font, verbose=False, force=False) font = os.path.basename(font).split(".")[0] except: vedo.logger.warning(f"font {font} not found") font = settings.default_font fontfile = os.path.join(vedo.fonts_path, font + ".npz") else: # user passed font by its standard name font = font[:1].upper() + font[1:] # capitalize first letter only fontfile = os.path.join(vedo.fonts_path, font + ".npz") if font not in settings.font_parameters.keys(): font = "Normografo" vedo.logger.warning( f"Unknown font: {font}\n" f"Available 3D fonts are: " f"{list(settings.font_parameters.keys())}\n" f"Using font {font} instead." ) fontfile = os.path.join(vedo.fonts_path, font + ".npz") if not settings.font_parameters[font]["islocal"]: font = "https://vedo.embl.es/fonts/" + font + ".npz" try: fontfile = vedo.file_io.download(font, verbose=False, force=False) font = os.path.basename(font).split(".")[0] except: vedo.logger.warning(f"font {font} not found") font = settings.default_font fontfile = os.path.join(vedo.fonts_path, font + ".npz") ##### try: font_meshes = np.load(fontfile, allow_pickle=True)["font"][0] except: vedo.logger.warning(f"font name {font} not found.") raise RuntimeError return font_meshes @lru_cache(None) def _get_font_letter(font, letter): # print("_get_font_letter", font, letter) font_meshes = _load_font(font) try: pts, faces = font_meshes[letter] return utils.buildPolyData(pts, faces) except KeyError: return None class Text3D(Mesh): """ Generate a 3D polygonal Mesh to represent a text string. """ def __init__( self, txt, pos=(0, 0, 0), s=1.0, font="", hspacing=1.15, vspacing=2.15, depth=0.0, italic=False, justify="bottom-left", literal=False, c=None, alpha=1.0, ): """ Generate a 3D polygonal `Mesh` representing a text string. Can render strings like `3.7 10^9` or `H_2 O` with subscripts and superscripts. Most Latex symbols are also supported. Symbols `~ ^ _` are reserved modifiers: - use ~ to add a short space, 1/4 of the default empty space, - use ^ and _ to start up/sub scripting, a space terminates their effect. Monospaced fonts are: `Calco, ComicMono, Glasgo, SmartCouric, VictorMono, Justino`. More fonts at: https://vedo.embl.es/fonts/ Arguments: pos : (list) position coordinates in 3D space s : (float) size of the text depth : (float) text thickness (along z) italic : (bool), float italic font type (can be a signed float too) justify : (str) text justification as centering of the bounding box (bottom-left, bottom-right, top-left, top-right, centered) font : (str, int) some of the available 3D-polygonized fonts are: Bongas, Calco, Comae, ComicMono, Kanopus, Glasgo, Ubuntu, LogoType, Normografo, Quikhand, SmartCouric, Theemim, VictorMono, VTK, Capsmall, Cartoons123, Vega, Justino, Spears, Meson. Check for more at https://vedo.embl.es/fonts/ Or type in your terminal `vedo --run fonts`. Default is Normografo, which can be changed using `settings.default_font`. hspacing : (float) horizontal spacing of the font vspacing : (float) vertical spacing of the font for multiple lines text literal : (bool) if set to True will ignore modifiers like _ or ^ Examples: - [markpoint.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/markpoint.py) - [fonts.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/fonts.py) - [caption.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/caption.py) ![](https://vedo.embl.es/images/pyplot/fonts3d.png) .. note:: Type `vedo -r fonts` for a demo. """ if len(pos) == 2: pos = (pos[0], pos[1], 0) if c is None: # automatic black or white pli = vedo.plotter_instance if pli and pli.renderer: c = (0.9, 0.9, 0.9) if pli.renderer.GetGradientBackground(): bgcol = pli.renderer.GetBackground2() else: bgcol = pli.renderer.GetBackground() if np.sum(bgcol) > 1.5: c = (0.1, 0.1, 0.1) else: c = (0.6, 0.6, 0.6) tpoly = self._get_text3d_poly( txt, s, font, hspacing, vspacing, depth, italic, justify, literal ) Mesh.__init__(self, tpoly, c, alpha) self.lighting("off") self.SetPosition(pos) self.PickableOff() self.DragableOff() self.name = "Text3D" self.txt = txt def text( self, txt=None, s=1, font="", hspacing=1.15, vspacing=2.15, depth=0, italic=False, justify="bottom-left", literal=False, ): """ Update the font style of the text. Check [available fonts here](https://vedo.embl.es/fonts). """ if txt is None: return self.txt tpoly = self._get_text3d_poly( txt, s, font, hspacing, vspacing, depth, italic, justify, literal ) self._update(tpoly) self.txt = txt return self def _get_text3d_poly( self, txt, s=1, font="", hspacing=1.15, vspacing=2.15, depth=0, italic=False, justify="bottom-left", literal=False, ): if not font: font = settings.default_font txt = str(txt) if font == "VTK": ####################################### vtt = vtk.vtkVectorText() vtt.SetText(txt) vtt.Update() tpoly = vtt.GetOutput() else: ################################################### stxt = set(txt) # check here if null or only spaces if not txt or (len(stxt) == 1 and " " in stxt): return vtk.vtkPolyData() if italic is True: italic = 1 if isinstance(font, int): lfonts = list(settings.font_parameters.keys()) font = font % len(lfonts) font = lfonts[font] if font not in settings.font_parameters.keys(): fpars = settings.font_parameters["Normografo"] else: fpars = settings.font_parameters[font] # ad hoc adjustments mono = fpars["mono"] lspacing = fpars["lspacing"] hspacing *= fpars["hspacing"] fscale = fpars["fscale"] dotsep = fpars["dotsep"] # replacements if ":" in txt: for r in _reps: txt = txt.replace(r[0], r[1]) if not literal: reps2 = [ ("\_", "┭"), # trick to protect ~ _ and ^ chars ("\^", "┮"), # ("\~", "┯"), # ("**", "^"), # order matters ("e+0", dotsep + "10^"), ("e-0", dotsep + "10^-"), ("E+0", dotsep + "10^"), ("E-0", dotsep + "10^-"), ("e+", dotsep + "10^"), ("e-", dotsep + "10^-"), ("E+", dotsep + "10^"), ("E-", dotsep + "10^-"), ] for r in reps2: txt = txt.replace(r[0], r[1]) xmax, ymax, yshift, scale = 0, 0, 0, 1 save_xmax = 0 notfounds = set() polyletters = [] ntxt = len(txt) for i, t in enumerate(txt): ########## if t == "┭": t = "_" elif t == "┮": t = "^" elif t == "┯": t = "~" elif t == "^" and not literal: if yshift < 0: xmax = save_xmax yshift = 0.9 * fscale scale = 0.5 continue elif t == "_" and not literal: if yshift > 0: xmax = save_xmax yshift = -0.3 * fscale scale = 0.5 continue elif (t in (" ", "\\n")) and yshift: yshift = 0 scale = 1 save_xmax = xmax if t == " ": continue elif t == "~": if i < ntxt - 1 and txt[i + 1] == "_": continue xmax += hspacing * scale * fscale / 4 continue ############ if t == " ": xmax += hspacing * scale * fscale elif t == "\n": xmax = 0 save_xmax = 0 ymax -= vspacing else: poly = _get_font_letter(font, t) if not poly: notfounds.add(t) xmax += hspacing * scale * fscale continue tr = vtk.vtkTransform() tr.Translate(xmax, ymax + yshift, 0) pscale = scale * fscale / 1000 tr.Scale(pscale, pscale, pscale) if italic: tr.Concatenate([1, italic * 0.15, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputData(poly) tf.SetTransform(tr) tf.Update() poly = tf.GetOutput() polyletters.append(poly) bx = poly.GetBounds() if mono: xmax += hspacing * scale * fscale else: xmax += bx[1] - bx[0] + hspacing * scale * fscale * lspacing if yshift == 0: save_xmax = xmax if len(polyletters) == 1: tpoly = polyletters[0] else: polyapp = vtk.vtkAppendPolyData() for polyd in polyletters: polyapp.AddInputData(polyd) polyapp.Update() tpoly = polyapp.GetOutput() if notfounds: wmsg = f"These characters are not available in font name {font}: {notfounds}. " wmsg += 'Type "vedo -r fonts" for a demo.' vedo.logger.warning(wmsg) bb = tpoly.GetBounds() dx, dy = (bb[1] - bb[0]) / 2 * s, (bb[3] - bb[2]) / 2 * s shift = -np.array([(bb[1] + bb[0]), (bb[3] + bb[2]), (bb[5] + bb[4])]) * s /2 if "bottom" in justify: shift += np.array([ 0, dy, 0.]) if "top" in justify: shift += np.array([ 0,-dy, 0.]) if "left" in justify: shift += np.array([ dx, 0, 0.]) if "right" in justify: shift += np.array([-dx, 0, 0.]) t = vtk.vtkTransform() t.PostMultiply() t.Scale(s, s, s) t.Translate(shift) tf = vtk.vtkTransformPolyDataFilter() tf.SetInputData(tpoly) tf.SetTransform(t) tf.Update() tpoly = tf.GetOutput() if depth: extrude = vtk.vtkLinearExtrusionFilter() extrude.SetInputData(tpoly) extrude.SetExtrusionTypeToVectorExtrusion() extrude.SetVector(0, 0, 1) extrude.SetScaleFactor(depth * dy) extrude.Update() tpoly = extrude.GetOutput() return tpoly class TextBase: "Base class." def __init__(self): "Do not instantiate this base class." self.rendered_at = set() self.property = None if isinstance(settings.default_font, int): lfonts = list(settings.font_parameters.keys()) font = settings.default_font % len(lfonts) self.fontname = lfonts[font] else: self.fontname = settings.default_font self.name = "Text" def angle(self, a): """Orientation angle in degrees""" self.property.SetOrientation(a) return self def line_spacing(self, ls): """Set the extra spacing between lines, expressed as a text height multiplication factor.""" self.property.SetLineSpacing(ls) return self def line_offset(self, lo): """Set/Get the vertical offset (measured in pixels).""" self.property.SetLineOffset(lo) return self def bold(self, value=True): """Set bold face""" self.property.SetBold(value) return self def italic(self, value=True): """Set italic face""" self.property.SetItalic(value) return self def shadow(self, offset=(1, -1)): """Text shadowing. Set to `None` to disable it.""" if offset is None: self.property.ShadowOff() else: self.property.ShadowOn() self.property.SetShadowOffset(offset) return self def color(self, c=None): """Set the text color""" if c is None: return get_color(self.property.GetColor()) self.property.SetColor(get_color(c)) return self def c(self, color=None): """Set the text color""" if color is None: return get_color(self.property.GetColor()) return self.color(color) def alpha(self, value): """Set the text opacity""" self.property.SetBackgroundOpacity(value) return self def background(self, color="k9", alpha=1.0): """Text background. Set to `None` to disable it.""" bg = get_color(color) if color is None: self.property.SetBackgroundOpacity(0) else: self.property.SetBackgroundColor(bg) if alpha: self.property.SetBackgroundOpacity(alpha) return self def frame(self, color="k1", lw=2): """Border color and width""" if color is None: self.property.FrameOff() else: c = get_color(color) self.property.FrameOn() self.property.SetFrameColor(c) self.property.SetFrameWidth(lw) return self def font(self, font): """Text font face""" if isinstance(font, int): lfonts = list(settings.font_parameters.keys()) n = font % len(lfonts) font = lfonts[n] self.fontname = font if not font: # use default font font = self.fontname fpath = os.path.join(vedo.fonts_path, font + ".ttf") elif font.startswith("https"): # user passed URL link, make it a path fpath = vedo.file_io.download(font, verbose=False, force=False) elif font.endswith(".ttf"): # user passing a local path to font file fpath = font else: # user passing name of preset font fpath = os.path.join(vedo.fonts_path, font + ".ttf") if font == "Courier": self.property.SetFontFamilyToCourier() elif font == "Times": self.property.SetFontFamilyToTimes() elif font == "Arial": self.property.SetFontFamilyToArial() else: fpath = utils.get_font_path(font) self.property.SetFontFamily(vtk.VTK_FONT_FILE) self.property.SetFontFile(fpath) self.fontname = font # io.tonumpy() uses it return self class Text2D(TextBase, vtk.vtkActor2D): """ Create a 2D text object. """ def __init__( self, txt="", pos="top-left", s=1.0, bg=None, font="", justify="", bold=False, italic=False, c=None, alpha=0.2, ): """ Create a 2D text object. All properties of the text, and the text itself, can be changed after creation (which is especially useful in loops). Arguments: pos : (str) text is placed in one of the 8 positions: - bottom-left - bottom-right - top-left - top-right - bottom-middle - middle-right - middle-left - top-middle If a pair (x,y) is passed as input the 2D text is place at that position in the coordinate system of the 2D screen (with the origin sitting at the bottom left). s : (float) size of text bg : (color) background color alpha : (float) background opacity justify : (str) text justification font : (str) built-in available fonts are: - Arial - Bongas - Calco - Comae - ComicMono - Courier - Glasgo - Kanopus - LogoType - Normografo - Quikhand - SmartCouric - Theemim - Times - VictorMono - More fonts at: https://vedo.embl.es/fonts/ A path to a `.otf` or `.ttf` font-file can also be supplied as input. Examples: - [fonts.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/fonts.py) - [caption.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/caption.py) - [colorcubes.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/colorcubes.py) ![](https://vedo.embl.es/images/basic/colorcubes.png) """ vtk.vtkActor2D.__init__(self) TextBase.__init__(self) self._mapper = vtk.vtkTextMapper() self.SetMapper(self._mapper) self.property = self._mapper.GetTextProperty() self.GetPositionCoordinate().SetCoordinateSystemToNormalizedViewport() # automatic black or white if c is None: c = (0.1, 0.1, 0.1) if vedo.plotter_instance and vedo.plotter_instance.renderer: if vedo.plotter_instance.renderer.GetGradientBackground(): bgcol = vedo.plotter_instance.renderer.GetBackground2() else: bgcol = vedo.plotter_instance.renderer.GetBackground() c = (0.9, 0.9, 0.9) if np.sum(bgcol) > 1.5: c = (0.1, 0.1, 0.1) self.font(font).color(c).background(bg, alpha).bold(bold).italic(italic) self.pos(pos, justify).size(s).text(txt).line_spacing(1.2).line_offset(5) self.PickableOff() def pos(self, pos="top-left", justify=""): """ Set position of the text to draw. Keyword `pos` can be a string or 2D coordinates in the range [0,1], being (0,0) the bottom left corner. """ ajustify = "top-left" # autojustify if isinstance(pos, str): # corners ajustify = pos if "top" in pos: if "left" in pos: pos = (0.008, 0.994) elif "right" in pos: pos = (0.994, 0.994) elif "mid" in pos or "cent" in pos: pos = (0.5, 0.994) elif "bottom" in pos: if "left" in pos: pos = (0.008, 0.008) elif "right" in pos: pos = (0.994, 0.008) elif "mid" in pos or "cent" in pos: pos = (0.5, 0.008) elif "mid" in pos or "cent" in pos: if "left" in pos: pos = (0.008, 0.5) elif "right" in pos: pos = (0.994, 0.5) else: pos = (0.5, 0.5) else: vedo.logger.warning(f"cannot understand text position {pos}") pos = (0.008, 0.994) ajustify = "top-left" elif len(pos) != 2: vedo.logger.error("pos must be of length 2 or integer value or string") raise RuntimeError() if not justify: justify = ajustify self.property.SetJustificationToLeft() if "top" in justify: self.property.SetVerticalJustificationToTop() if "bottom" in justify: self.property.SetVerticalJustificationToBottom() if "cent" in justify or "mid" in justify: self.property.SetJustificationToCentered() if "left" in justify: self.property.SetJustificationToLeft() if "right" in justify: self.property.SetJustificationToRight() self.SetPosition(pos) return self def text(self, txt=None): """Set/get the input text string.""" if txt is None: return self._mapper.GetInput() if ":" in txt: for r in _reps: txt = txt.replace(r[0], r[1]) else: txt = str(txt) self._mapper.SetInput(txt) return self def size(self, s): """Set the font size.""" self.property.SetFontSize(int(s * 22.5)) return self class CornerAnnotation(vtk.vtkCornerAnnotation, TextBase): # PROBABLY USELESS given that Text2D does pretty much the same ... """ Annotate the window corner with 2D text. See `Text2D` description as the basic functionality is very similar. The added value of this class is the possibility to manage with one single object the all corner annotations (instead of creating 4 `Text2D` instances). Examples: - [timer_callback2.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/timer_callback2.py) """ def __init__(self, c=None): vtk.vtkCornerAnnotation.__init__(self) TextBase.__init__(self) self.property = self.GetTextProperty() # automatic black or white if c is None: if vedo.plotter_instance and vedo.plotter_instance.renderer: c = (0.9, 0.9, 0.9) if vedo.plotter_instance.renderer.GetGradientBackground(): bgcol = vedo.plotter_instance.renderer.GetBackground2() else: bgcol = vedo.plotter_instance.renderer.GetBackground() if np.sum(bgcol) > 1.5: c = (0.1, 0.1, 0.1) else: c = (0.5, 0.5, 0.5) self.SetNonlinearFontScaleFactor(1 / 2.75) self.PickableOff() self.property.SetColor(get_color(c)) self.property.SetBold(False) self.property.SetItalic(False) def size(self, s, linear=False): """ The font size is calculated as the largest possible value such that the annotations for the given viewport do not overlap. This font size can be scaled non-linearly with the viewport size, to maintain an acceptable readable size at larger viewport sizes, without being too big. `f' = linearScale * pow(f,nonlinearScale)` """ if linear: self.SetLinearFontScaleFactor(s * 5.5) else: self.SetNonlinearFontScaleFactor(s / 2.75) return self def text(self, txt, pos=2): """Set text at the assigned position""" if isinstance(pos, str): # corners if "top" in pos: if "left" in pos: pos = 2 elif "right" in pos: pos = 3 elif "mid" in pos or "cent" in pos: pos = 7 elif "bottom" in pos: if "left" in pos: pos = 0 elif "right" in pos: pos = 1 elif "mid" in pos or "cent" in pos: pos = 4 else: if "left" in pos: pos = 6 elif "right" in pos: pos = 5 else: pos = 2 if "\\" in repr(txt): for r in _reps: txt = txt.replace(r[0], r[1]) else: txt = str(txt) self.SetText(pos, txt) return self def clear(self): """Remove all text from all corners""" self.ClearAllTexts() return self class Latex(Picture): """ Render Latex text and formulas. """ def __init__(self, formula, pos=(0, 0, 0), s=1.0, bg=None, res=150, usetex=False, c="k", alpha=1.0): """ Render Latex text and formulas. Arguments: formula : (str) latex text string pos : (list) position coordinates in space bg : (color) background color box res : (int) dpi resolution usetex : (bool) use latex compiler of matplotlib if available You can access the latex formula in `Latex.formula`. Examples: - [latex.py](https://github.com/marcomusy/vedo/tree/master/examples/pyplot/latex.py) ![](https://vedo.embl.es/images/pyplot/latex.png) """ self.formula = formula try: from tempfile import NamedTemporaryFile import matplotlib.pyplot as mpltib def build_img_plt(formula, tfile): mpltib.rc("text", usetex=usetex) formula1 = "$" + formula + "$" mpltib.axis("off") col = get_color(c) if bg: bx = dict(boxstyle="square", ec=col, fc=get_color(bg)) else: bx = None mpltib.text( 0.5, 0.5, formula1, size=res, color=col, alpha=alpha, ha="center", va="center", bbox=bx, ) mpltib.savefig( tfile, format="png", transparent=True, bbox_inches="tight", pad_inches=0 ) mpltib.close() if len(pos) == 2: pos = (pos[0], pos[1], 0) tmp_file = NamedTemporaryFile(delete=True) tmp_file.name = tmp_file.name + ".png" build_img_plt(formula, tmp_file.name) Picture.__init__(self, tmp_file.name, channels=4) self.alpha(alpha) self.SetScale(0.25 / res * s, 0.25 / res * s, 0.25 / res * s) self.SetPosition(pos) self.name = "Latex" except: printc("Error in Latex()\n", formula, c="r") printc(" latex or dvipng not installed?", c="r") printc(" Try: usetex=False", c="r") printc(" Try: sudo apt install dvipng", c="r") class ConvexHull(Mesh): """ Create the 2D/3D convex hull from a set of points. """ def __init__(self, pts): """ Create the 2D/3D convex hull from a set of input points or input Mesh. Examples: - [convex_hull.py](https://github.com/marcomusy/vedo/tree/master/examples/advanced/convex_hull.py) ![](https://vedo.embl.es/images/advanced/convexHull.png) """ if utils.is_sequence(pts): pts = utils.make3d(pts).astype(float) mesh = Points(pts) else: mesh = pts apoly = mesh.clean().polydata() # Create the convex hull of the pointcloud z0, z1 = mesh.zbounds() d = mesh.diagonal_size() if (z1 - z0) / d > 0.0001: delaunay = vtk.vtkDelaunay3D() delaunay.SetInputData(apoly) delaunay.Update() surfaceFilter = vtk.vtkDataSetSurfaceFilter() surfaceFilter.SetInputConnection(delaunay.GetOutputPort()) surfaceFilter.Update() out = surfaceFilter.GetOutput() else: delaunay = vtk.vtkDelaunay2D() delaunay.SetInputData(apoly) delaunay.Update() fe = vtk.vtkFeatureEdges() fe.SetInputConnection(delaunay.GetOutputPort()) fe.BoundaryEdgesOn() fe.Update() out = fe.GetOutput() Mesh.__init__(self, out, c=mesh.color(), alpha=0.75) # self.triangulate() self.flat() self.name = "ConvexHull" def VedoLogo(distance=0.0, c=None, bc="t", version=False, frame=True): """ Create the 3D vedo logo. Arguments: distance : (float) send back logo by this distance from camera version : (bool) add version text to the right end of the logo bc : (color) text back face color """ if c is None: c = (0, 0, 0) if vedo.plotter_instance: if sum(get_color(vedo.plotter_instance.backgrcol)) > 1.5: c = [0, 0, 0] else: c = "linen" font = "Comae" vlogo = Text3D("vэdo", font=font, s=1350, depth=0.2, c=c, hspacing=0.8) vlogo.scale([1, 0.95, 1]).x(-2525).pickable(False).bc(bc) vlogo.GetProperty().LightingOn() vr, rul = None, None if version: vr = Text3D( vedo.__version__, font=font, s=165, depth=0.2, c=c, hspacing=1 ).scale([1, 0.7, 1]) vr.RotateZ(90) vr.pos(2450, 50, 80).bc(bc).pickable(False) elif frame: rul = vedo.RulerAxes( (-2600, 2110, 0, 1650, 0, 0), xlabel="European Molecular Biology Laboratory", ylabel=vedo.__version__, font=font, xpadding=0.09, ypadding=0.04, ) fakept = vedo.Point((0, 500, distance * 1725), alpha=0, c=c, r=1).pickable(0) return vedo.Assembly([vlogo, vr, fakept, rul]).scale(1 / 1725) vedo-2023.4.6/vedo/tetmesh.py000066400000000000000000000416431444463326400157070ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import numpy as np import vedo from vedo import utils from vedo.base import BaseGrid from vedo.mesh import Mesh from vedo.file_io import download, loadUnStructuredGrid __docformat__ = "google" __doc__ = """ Work with tetrahedral meshes. ![](https://vedo.embl.es/images/volumetric/82767107-2631d500-9e25-11ea-967c-42558f98f721.jpg) """ __all__ = ["TetMesh", "delaunay3d"] ########################################################################## def delaunay3d(mesh, radius=0, tol=None): """ Create 3D Delaunay triangulation of input points. Arguments: radius : (float) specify distance (or "alpha") value to control output. For a non-zero values, only tetra contained within the circumsphere will be output. tol : (float) Specify a tolerance to control discarding of closely spaced points. This tolerance is specified as a fraction of the diagonal length of the bounding box of the points. """ deln = vtk.vtkDelaunay3D() if utils.is_sequence(mesh): pd = vtk.vtkPolyData() vpts = vtk.vtkPoints() vpts.SetData(utils.numpy2vtk(mesh, dtype=np.float32)) pd.SetPoints(vpts) deln.SetInputData(pd) else: deln.SetInputData(mesh.GetMapper().GetInput()) deln.SetAlpha(radius) deln.AlphaTetsOn() deln.AlphaTrisOff() deln.AlphaLinesOff() deln.AlphaVertsOff() deln.BoundingTriangulationOff() if tol: deln.SetTolerance(tol) deln.Update() m = TetMesh(deln.GetOutput()) m.pipeline = utils.OperationNode( "delaunay3d", c="#e9c46a:#edabab", parents=[mesh], ) return m def _buildtetugrid(points, cells): ug = vtk.vtkUnstructuredGrid() if len(points) == 0: return ug if not utils.is_sequence(points[0]): return ug if len(cells) == 0: return ug if not utils.is_sequence(cells[0]): tets = [] nf = cells[0] + 1 for i, cl in enumerate(cells): if i in (nf, 0): k = i + 1 nf = cl + k cell = [cells[j + k] for j in range(cl)] tets.append(cell) cells = tets source_points = vtk.vtkPoints() varr = utils.numpy2vtk(points, dtype=np.float32) source_points.SetData(varr) ug.SetPoints(source_points) source_tets = vtk.vtkCellArray() for f in cells: ele = vtk.vtkTetra() pid = ele.GetPointIds() for i, fi in enumerate(f): pid.SetId(i, fi) source_tets.InsertNextCell(ele) ug.SetCells(vtk.VTK_TETRA, source_tets) return ug ########################################################################## class TetMesh(BaseGrid, vtk.vtkVolume): """The class describing tetrahedral meshes.""" def __init__( self, inputobj=None, c=("r", "y", "lg", "lb", "b"), # ('b','lb','lg','y','r') alpha=(0.5, 1), alpha_unit=1, mapper="tetra", ): """ Arguments: inputobj : (vtkDataSet, list, str) list of points and tet indices, or filename alpha_unit : (float) opacity scale mapper : (str) choose a visualization style in `['tetra', 'raycast', 'zsweep']` """ vtk.vtkVolume.__init__(self) BaseGrid.__init__(self) self.useArray = 0 # inputtype = str(type(inputobj)) # print('TetMesh inputtype', inputtype) ################### if inputobj is None: self._data = vtk.vtkUnstructuredGrid() elif isinstance(inputobj, vtk.vtkUnstructuredGrid): self._data = inputobj elif isinstance(inputobj, vtk.vtkRectilinearGrid): r2t = vtk.vtkRectilinearGridToTetrahedra() r2t.SetInputData(inputobj) r2t.RememberVoxelIdOn() r2t.SetTetraPerCellTo6() r2t.Update() self._data = r2t.GetOutput() elif isinstance(inputobj, vtk.vtkDataSet): r2t = vtk.vtkDataSetTriangleFilter() r2t.SetInputData(inputobj) # r2t.TetrahedraOnlyOn() r2t.Update() self._data = r2t.GetOutput() elif isinstance(inputobj, str): if "https://" in inputobj: inputobj = download(inputobj, verbose=False) ug = loadUnStructuredGrid(inputobj) tt = vtk.vtkDataSetTriangleFilter() tt.SetInputData(ug) tt.SetTetrahedraOnly(True) tt.Update() self._data = tt.GetOutput() elif utils.is_sequence(inputobj): # if "ndarray" not in inputtype: # inputobj = np.array(inputobj) self._data = _buildtetugrid(inputobj[0], inputobj[1]) ################### if "tetra" in mapper: self._mapper = vtk.vtkProjectedTetrahedraMapper() elif "ray" in mapper: self._mapper = vtk.vtkUnstructuredGridVolumeRayCastMapper() elif "zs" in mapper: self._mapper = vtk.vtkUnstructuredGridVolumeZSweepMapper() elif isinstance(mapper, vtk.vtkMapper): self._mapper = mapper else: vedo.logger.error(f"Unknown mapper type {type(mapper)}") raise RuntimeError() self._mapper.SetInputData(self._data) self.SetMapper(self._mapper) self.color(c).alpha(alpha) if alpha_unit: self.GetProperty().SetScalarOpacityUnitDistance(alpha_unit) # remember stuff: self._color = c self._alpha = alpha self._alpha_unit = alpha_unit self.pipeline = utils.OperationNode( self, comment=f"#tets {self._data.GetNumberOfCells()}", c="#9e2a2b", ) # ----------------------------------------------------------- def _repr_html_(self): """ HTML representation of the TetMesh object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.tetmesh.TetMesh" help_url = "https://vedo.embl.es/docs/vedo/tetmesh.html" arr = self.thumbnail() im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" bounds = "
".join( [ utils.precision(min_x,4) + " ... " + utils.precision(max_x,4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" pdata = "" if self._data.GetPointData().GetScalars(): if self._data.GetPointData().GetScalars().GetName(): name = self._data.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" if self._data.GetCellData().GetScalars(): if self._data.GetCellData().GetScalars().GetName(): name = self._data.GetCellData().GetScalars().GetName() cdata = " cell data array " + name + "" pts = self.points() cm = np.mean(pts, axis=0) allt = [ "", "", "", "
", image, "
", help_text, "", "", "", "", pdata, cdata, "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + utils.precision(cm,3) + "
nr. points / tets " + str(self.npoints) + " / " + str(self.ncells) + "
", "
", ] return "\n".join(allt) def _update(self, data): self._data = data self.mapper().SetInputData(data) self.mapper().Modified() return self def clone(self): """Clone the `TetMesh` object to yield an exact copy.""" ugCopy = vtk.vtkUnstructuredGrid() ugCopy.DeepCopy(self._data) cloned = TetMesh(ugCopy) pr = vtk.vtkVolumeProperty() pr.DeepCopy(self.GetProperty()) cloned.SetProperty(pr) # assign the same transformation to the copy cloned.SetOrigin(self.GetOrigin()) cloned.SetScale(self.GetScale()) cloned.SetOrientation(self.GetOrientation()) cloned.SetPosition(self.GetPosition()) cloned.mapper().SetScalarMode(self.mapper().GetScalarMode()) cloned.name = self.name cloned.pipeline = utils.OperationNode( "clone", c="#edabab", shape="diamond", parents=[self], ) return cloned def compute_quality(self, metric=7): """ Calculate functions of quality for the elements of a triangular mesh. This method adds to the mesh a cell array named "Quality". Arguments: metric : (int) type of estimators: - EDGE RATIO, 0 - ASPECT RATIO, 1 - RADIUS RATIO, 2 - ASPECT FROBENIUS, 3 - MIN_ANGLE, 4 - COLLAPSE RATIO, 5 - ASPECT GAMMA, 6 - VOLUME, 7 - ... See class [vtkMeshQuality](https://vtk.org/doc/nightly/html/classvtkMeshQuality.html) for an explanation of the meaning of each metric.. """ qf = vtk.vtkMeshQuality() qf.SetInputData(self._data) qf.SetTetQualityMeasure(metric) qf.SaveCellQualityOn() qf.Update() self._update(qf.GetOutput()) return utils.vtk2numpy(qf.GetOutput().GetCellData().GetArray("Quality")) def compute_tets_volume(self): """Add to this mesh a cell data array containing the tetrahedron volume.""" csf = vtk.vtkCellSizeFilter() csf.SetInputData(self._data) csf.SetComputeArea(False) csf.SetComputeVolume(True) csf.SetComputeLength(False) csf.SetComputeVertexCount(False) csf.SetVolumeArrayName("TetVolume") csf.Update() self._update(csf.GetOutput()) return utils.vtk2numpy(csf.GetOutput().GetCellData().GetArray("TetVolume")) def check_validity(self, tol=0): """ Return an array of possible problematic tets following this convention: ```python Valid = 0 WrongNumberOfPoints = 01 IntersectingEdges = 02 IntersectingFaces = 04 NoncontiguousEdges = 08 Nonconvex = 10 OrientedIncorrectly = 20 ``` Arguments: tol : (float) This value is used as an epsilon for floating point equality checks throughout the cell checking process. """ vald = vtk.vtkCellValidator() if tol: vald.SetTolerance(tol) vald.SetInputData(self._data) vald.Update() varr = vald.GetOutput().GetCellData().GetArray("ValidityState") return utils.vtk2numpy(varr) def threshold(self, name=None, above=None, below=None, on="cells"): """ Threshold the tetrahedral mesh by a cell scalar value. Reduce to only tets which satisfy the threshold limits. - if `above = below` will only select tets with that specific value. - if `above > below` selection range is flipped. Set keyword "on" to either "cells" or "points". """ th = vtk.vtkThreshold() th.SetInputData(self._data) if name is None: if self.celldata.keys(): name = self.celldata.keys()[0] th.SetInputArrayToProcess(0, 0, 0, 1, name) elif self.pointdata.keys(): name = self.pointdata.keys()[0] th.SetInputArrayToProcess(0, 0, 0, 0, name) if name is None: vedo.logger.warning("cannot find active array. Skip.") return self else: if on.startswith("c"): th.SetInputArrayToProcess(0, 0, 0, 1, name) else: th.SetInputArrayToProcess(0, 0, 0, 0, name) if above is not None and below is not None: if above > below: if vedo.vtk_version[0] >= 9: th.SetInvert(True) th.ThresholdBetween(below, above) else: vedo.logger.error("in vtk<9, above cannot be larger than below. Skip") return self else: th.ThresholdBetween(above, below) elif above is not None: th.ThresholdByUpper(above) elif below is not None: th.ThresholdByLower(below) th.Update() return self._update(th.GetOutput()) def decimate(self, scalars_name, fraction=0.5, n=0): """ Downsample the number of tets in a TetMesh to a specified fraction. Either `fraction` or `n` must be set. Arguments: fraction : (float) the desired final fraction of the total. n : (int) the desired number of final tets .. note:: setting `fraction=0.1` leaves 10% of the original nr of tets. """ decimate = vtk.vtkUnstructuredGridQuadricDecimation() decimate.SetInputData(self._data) decimate.SetScalarsName(scalars_name) if n: # n = desired number of points decimate.SetNumberOfTetsOutput(n) else: decimate.SetTargetReduction(1 - fraction) decimate.Update() self._update(decimate.GetOutput()) self.pipeline = utils.OperationNode( "decimate", comment=f"array: {scalars_name}", c="#edabab", parents=[self], ) return self def subdvide(self): """ Increase the number of tets of a `TetMesh`. Subdivide one tetrahedron into twelve for every tetra. """ sd = vtk.vtkSubdivideTetra() sd.SetInputData(self._data) sd.Update() self._update(sd.GetOutput()) self.pipeline = utils.OperationNode( "subdvide", c="#edabab", parents=[self], ) return self def isosurface(self, value=True): """ Return a `vedo.Mesh` isosurface. Set `value` to a single value or list of values to compute the isosurface(s). """ if not self._data.GetPointData().GetScalars(): self.map_cells_to_points() scrange = self._data.GetPointData().GetScalars().GetRange() cf = vtk.vtkContourFilter() # vtk.vtkContourGrid() cf.SetInputData(self._data) if utils.is_sequence(value): cf.SetNumberOfContours(len(value)) for i, t in enumerate(value): cf.SetValue(i, t) cf.Update() else: if value is True: value = (2 * scrange[0] + scrange[1]) / 3.0 cf.SetValue(0, value) cf.Update() clp = vtk.vtkCleanPolyData() clp.SetInputData(cf.GetOutput()) clp.Update() msh = Mesh(clp.GetOutput(), c=None).phong() msh.mapper().SetLookupTable(utils.ctf2lut(self)) msh.pipeline = utils.OperationNode("isosurface", c="#edabab", parents=[self]) return msh def slice(self, origin=(0, 0, 0), normal=(1, 0, 0)): """ Return a 2D slice of the mesh by a plane passing through origin and assigned normal. """ strn = str(normal) if strn == "x": normal = (1, 0, 0) elif strn == "y": normal = (0, 1, 0) elif strn == "z": normal = (0, 0, 1) elif strn == "-x": normal = (-1, 0, 0) elif strn == "-y": normal = (0, -1, 0) elif strn == "-z": normal = (0, 0, -1) plane = vtk.vtkPlane() plane.SetOrigin(origin) plane.SetNormal(normal) cc = vtk.vtkCutter() cc.SetInputData(self._data) cc.SetCutFunction(plane) cc.Update() msh = Mesh(cc.GetOutput()).flat().lighting("ambient") msh.mapper().SetLookupTable(utils.ctf2lut(self)) msh.pipeline = utils.OperationNode("slice", c="#edabab", parents=[self]) return msh vedo-2023.4.6/vedo/ugrid.py000066400000000000000000000312331444463326400153420ustar00rootroot00000000000000import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo from vedo import settings from vedo import colors from vedo import utils from vedo.base import BaseGrid from vedo.file_io import download, loadUnStructuredGrid __docformat__ = "google" __doc__ = """ Work with unstructured grid datasets """ __all__ = ["UGrid"] ######################################################################### class UGrid(BaseGrid, vtk.vtkActor): """Support for UnstructuredGrid objects.""" def __init__(self, inputobj=None): """ Support for UnstructuredGrid objects. Arguments: inputobj : (list, vtkUnstructuredGrid, str) A list in the form `[points, cells, celltypes]`, or a vtkUnstructuredGrid object, or a filename Celltypes are identified by the following convention: - VTK_TETRA = 10 - VTK_VOXEL = 11 - VTK_HEXAHEDRON = 12 - VTK_WEDGE = 13 - VTK_PYRAMID = 14 - VTK_HEXAGONAL_PRISM = 15 - VTK_PENTAGONAL_PRISM = 16 """ vtk.vtkActor.__init__(self) BaseGrid.__init__(self) inputtype = str(type(inputobj)) self._data = None self._polydata = None self._bfprop = None self.name = "UGrid" ################### if inputobj is None: self._data = vtk.vtkUnstructuredGrid() elif utils.is_sequence(inputobj): pts, cells, celltypes = inputobj self._data = vtk.vtkUnstructuredGrid() if not utils.is_sequence(cells[0]): tets = [] nf = cells[0] + 1 for i, cl in enumerate(cells): if i in (nf, 0): k = i + 1 nf = cl + k cell = [cells[j + k] for j in range(cl)] tets.append(cell) cells = tets # This would fill the points and use those to define orientation vpts = utils.numpy2vtk(pts, dtype=np.float32) points = vtk.vtkPoints() points.SetData(vpts) self._data.SetPoints(points) # This fill the points and use cells to define orientation # points = vtk.vtkPoints() # for c in cells: # for pid in c: # points.InsertNextPoint(pts[pid]) # self._data.SetPoints(points) # Fill cells # https://vtk.org/doc/nightly/html/vtkCellType_8h_source.html for i, ct in enumerate(celltypes): cell_conn = cells[i] if ct == vtk.VTK_HEXAHEDRON: cell = vtk.vtkHexahedron() elif ct == vtk.VTK_TETRA: cell = vtk.vtkTetra() elif ct == vtk.VTK_VOXEL: cell = vtk.vtkVoxel() elif ct == vtk.VTK_WEDGE: cell = vtk.vtkWedge() elif ct == vtk.VTK_PYRAMID: cell = vtk.vtkPyramid() elif ct == vtk.VTK_HEXAGONAL_PRISM: cell = vtk.vtkHexagonalPrism() elif ct == vtk.VTK_PENTAGONAL_PRISM: cell = vtk.vtkPentagonalPrism() else: print("UGrid: cell type", ct, "not implemented. Skip.") continue cpids = cell.GetPointIds() for j, pid in enumerate(cell_conn): cpids.SetId(j, pid) self._data.InsertNextCell(ct, cpids) elif "UnstructuredGrid" in inputtype: self._data = inputobj elif isinstance(inputobj, str): if "https://" in inputobj: inputobj = download(inputobj, verbose=False) self._data = loadUnStructuredGrid(inputobj) self.filename = inputobj else: vedo.logger.error(f"cannot understand input type {inputtype}") return # self._mapper = vtk.vtkDataSetMapper() self._mapper = vtk.vtkPolyDataMapper() self._mapper.SetInterpolateScalarsBeforeMapping(settings.interpolate_scalars_before_mapping) if settings.use_polygon_offset: self._mapper.SetResolveCoincidentTopologyToPolygonOffset() pof, pou = settings.polygon_offset_factor, settings.polygon_offset_units self._mapper.SetResolveCoincidentTopologyPolygonOffsetParameters(pof, pou) self.GetProperty().SetInterpolationToFlat() if not self._data: return # now fill the representation of the vtk unstr grid sf = vtk.vtkShrinkFilter() sf.SetInputData(self._data) sf.SetShrinkFactor(1.0) sf.Update() gf = vtk.vtkGeometryFilter() gf.SetInputData(sf.GetOutput()) gf.Update() self._polydata = gf.GetOutput() self._mapper.SetInputData(self._polydata) sc = None if self.useCells: sc = self._polydata.GetCellData().GetScalars() else: sc = self._polydata.GetPointData().GetScalars() if sc: self._mapper.SetScalarRange(sc.GetRange()) self.SetMapper(self._mapper) self.property = self.GetProperty() self.pipeline = utils.OperationNode( self, comment=f"#cells {self._data.GetNumberOfCells()}", c="#4cc9f0", ) # ------------------------------------------------------------------ def _repr_html_(self): """ HTML representation of the UGrid object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.ugrid.UGrid" help_url = "https://vedo.embl.es/docs/vedo/ugrid.html" arr = self.thumbnail() im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" bounds = "
".join( [ utils.precision(min_x,4) + " ... " + utils.precision(max_x,4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" pdata = "" if self._data.GetPointData().GetScalars(): if self._data.GetPointData().GetScalars().GetName(): name = self._data.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" if self._data.GetCellData().GetScalars(): if self._data.GetCellData().GetScalars().GetName(): name = self._data.GetCellData().GetScalars().GetName() cdata = " cell data array " + name + "" pts = self.points() cm = np.mean(pts, axis=0) all = [ "", "", "", "
", image, "
", help_text, "", "", "", # "", "", pdata, cdata, "
bounds
(x/y/z)
" + str(bounds) + "
center of mass " + utils.precision(cm,3) + "
average size " + str(average_size) + "
nr. points / cells " + str(self.npoints) + " / " + str(self.ncells) + "
", "
", ] return "\n".join(all) def clone(self): """Clone the UGrid object to yield an exact copy.""" ugCopy = vtk.vtkUnstructuredGrid() ugCopy.DeepCopy(self._data) cloned = UGrid(ugCopy) pr = self.GetProperty() if isinstance(pr, vtk.vtkVolumeProperty): prv = vtk.vtkVolumeProperty() else: prv = vtk.vtkProperty() prv.DeepCopy(pr) cloned.SetProperty(prv) cloned.property = prv # assign the same transformation to the copy cloned.SetOrigin(self.GetOrigin()) cloned.SetScale(self.GetScale()) cloned.SetOrientation(self.GetOrientation()) cloned.SetPosition(self.GetPosition()) cloned.name = self.name cloned.pipeline = utils.OperationNode( "clone", parents=[self], shape='diamond', c='#bbe1ed', ) return cloned def color(self, c=False, alpha=None): """ Set/get UGrid color. If None is passed as input, will use colors from active scalars. Same as `ugrid.c()`. """ if c is False: return np.array(self.GetProperty().GetColor()) if c is None: self._mapper.ScalarVisibilityOn() return self self._mapper.ScalarVisibilityOff() cc = colors.get_color(c) self.property.SetColor(cc) if self.trail: self.trail.GetProperty().SetColor(cc) if alpha is not None: self.alpha(alpha) return self def alpha(self, opacity=None): """Set/get mesh's transparency. Same as `mesh.opacity()`.""" if opacity is None: return self.property.GetOpacity() self.property.SetOpacity(opacity) bfp = self.GetBackfaceProperty() if bfp: if opacity < 1: self._bfprop = bfp self.SetBackfaceProperty(None) else: self.SetBackfaceProperty(self._bfprop) return self def opacity(self, alpha=None): """Set/get mesh's transparency. Same as `mesh.alpha()`.""" return self.alpha(alpha) def wireframe(self, value=True): """Set mesh's representation as wireframe or solid surface. Same as `mesh.wireframe()`.""" if value: self.property.SetRepresentationToWireframe() else: self.property.SetRepresentationToSurface() return self def linewidth(self, lw=None): """Set/get width of mesh edges. Same as `lw()`.""" if lw is not None: if lw == 0: self.property.EdgeVisibilityOff() self.property.SetRepresentationToSurface() return self self.property.EdgeVisibilityOn() self.property.SetLineWidth(lw) else: return self.property.GetLineWidth() return self def lw(self, linewidth=None): """Set/get width of mesh edges. Same as `linewidth()`.""" return self.linewidth(linewidth) def linecolor(self, lc=None): """Set/get color of mesh edges. Same as `lc()`.""" if lc is not None: if "ireframe" in self.property.GetRepresentationAsString(): self.property.EdgeVisibilityOff() self.color(lc) return self self.property.EdgeVisibilityOn() self.property.SetEdgeColor(colors.get_color(lc)) else: return self.property.GetEdgeColor() return self def lc(self, linecolor=None): """Set/get color of mesh edges. Same as `linecolor()`.""" return self.linecolor(linecolor) def extract_cell_type(self, ctype): """Extract a specific cell type and return a new `UGrid`.""" uarr = self._data.GetCellTypesArray() ctarrtyp = np.where(utils.vtk2numpy(uarr) == ctype)[0] uarrtyp = utils.numpy2vtk(ctarrtyp, deep=False, dtype="id") selection_node = vtk.vtkSelectionNode() selection_node.SetFieldType(vtk.vtkSelectionNode.CELL) selection_node.SetContentType(vtk.vtkSelectionNode.INDICES) selection_node.SetSelectionList(uarrtyp) selection = vtk.vtkSelection() selection.AddNode(selection_node) es = vtk.vtkExtractSelection() es.SetInputData(0, self._data) es.SetInputData(1, selection) es.Update() ug = UGrid(es.GetOutput()) ug.pipeline = utils.OperationNode( "extract_cell_type", comment=f"type {ctype}", c="#edabab", parents=[self], ) return ugvedo-2023.4.6/vedo/utils.py000066400000000000000000002545241444463326400154020ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- import math import os import time import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk from vtkmodules.util.numpy_support import numpy_to_vtk from vtkmodules.util.numpy_support import numpy_to_vtkIdTypeArray from vtkmodules.util.numpy_support import vtk_to_numpy import vedo __docformat__ = "google" __doc__ = "Utilities submodule." __all__ = [ "OperationNode", "ProgressBar", "progressbar", "geometry", "extract_cells_by_type", "is_sequence", "lin_interpolate", "vector", "mag", "mag2", "versor", "precision", "round_to_digit", "point_in_triangle", "point_line_distance", "closest", "grep", "print_info", "make_bands", "pack_spheres", "spher2cart", "cart2spher", "cart2cyl", "cyl2cart", "cyl2spher", "spher2cyl", "cart2pol", "pol2cart", "humansort", "print_histogram", "camera_from_quaternion", "camera_from_neuroglancer", "oriented_camera", "vedo2trimesh", "trimesh2vedo", "vedo2meshlab", "meshlab2vedo", "vedo2open3d", "open3d2vedo", "vtk2numpy", "numpy2vtk", "get_uv", ] ########################################################################### array_types = {} array_types[vtk.VTK_UNSIGNED_CHAR] = ("UNSIGNED_CHAR", "np.uint8") array_types[vtk.VTK_UNSIGNED_SHORT]= ("UNSIGNED_SHORT", "np.uint16") array_types[vtk.VTK_UNSIGNED_INT] = ("UNSIGNED_INT", "np.uint32") array_types[vtk.VTK_UNSIGNED_LONG_LONG] = ("UNSIGNED_LONG_LONG", "np.uint64") array_types[vtk.VTK_CHAR] = ("CHAR", "np.int8") array_types[vtk.VTK_SHORT] = ("SHORT", "np.int16") array_types[vtk.VTK_INT] = ("INT", "np.int32") array_types[vtk.VTK_LONG] = ("LONG", "") # ?? array_types[vtk.VTK_LONG_LONG] = ("LONG_LONG", "np.int64") array_types[vtk.VTK_FLOAT] = ("FLOAT", "np.float32") array_types[vtk.VTK_DOUBLE] = ("DOUBLE", "np.float64") array_types[vtk.VTK_SIGNED_CHAR] = ("SIGNED_CHAR", "np.int8") array_types[vtk.VTK_ID_TYPE] = ("ID", "np.int64") ########################################################################### class OperationNode: """ Keep track of the operations which led to a final object. """ # https://www.graphviz.org/doc/info/shapes.html#html # Mesh #e9c46a # Follower #d9ed92 # Volume, UGrid #4cc9f0 # TetMesh #9e2a2b # File #8a817c # Picture #f28482 # Assembly #f08080 def __init__( self, operation, parents=(), comment="", shape="none", c="#e9c46a", style="filled" ): """ Keep track of the operations which led to a final object. This allows to show the `pipeline` tree for any `vedo` object with e.g.: ```python from vedo import * sp = Sphere() sp.clean().subdivide() sp.pipeline.show() ``` Arguments: operation : (str, class) descriptor label, if a class is passed then grab its name parents : (list) list of the parent classes the object comes from comment : (str) a second-line text description shape : (str) shape of the frame, check out [this link.](https://graphviz.org/doc/info/shapes.html) c : (hex) hex color style : (str) comma-separated list of styles Example: ```python from vedo.utils import OperationNode op_node1 = OperationNode("Operation1", c="lightblue") op_node2 = OperationNode("Operation2") op_node3 = OperationNode("Operation3", shape='diamond') op_node4 = OperationNode("Operation4") op_node5 = OperationNode("Operation5") op_node6 = OperationNode("Result", c="lightgreen") op_node3.add_parent(op_node1) op_node4.add_parent(op_node1) op_node3.add_parent(op_node2) op_node5.add_parent(op_node2) op_node6.add_parent(op_node3) op_node6.add_parent(op_node5) op_node6.add_parent(op_node1) op_node6.show(orientation="TB") ``` ![](https://vedo.embl.es/images/feats/operation_node.png) """ if not vedo.settings.enable_pipeline: return if isinstance(operation, str): self.operation = operation else: self.operation = operation.__class__.__name__ self.operation_plain = str(self.operation) pp = [] # filter out invalid stuff for p in parents: if hasattr(p, "pipeline"): pp.append(p.pipeline) self.parents = pp if comment: self.operation = f"<{self.operation}
{comment}>" self.dot = None self.time = time.time() self.shape = shape self.style = style self.color = c self.counts = 0 def add_parent(self, parent): self.parents.append(parent) def _build_tree(self, dot): dot.node( str(id(self)), label=self.operation, shape=self.shape, color=self.color, style=self.style, ) for parent in self.parents: if parent: t = f"{self.time - parent.time: .1f}s" dot.edge(str(id(parent)), str(id(self)), label=t) parent._build_tree(dot) def __repr__(self): try: from treelib import Tree except ImportError: vedo.logger.error( "To use this functionality please install treelib:" "\n pip install treelib" ) return "" def _build_tree(parent): for par in parent.parents: if par: op = par.operation_plain tree.create_node( op, op + str(par.time), parent=parent.operation_plain + str(parent.time) ) _build_tree(par) tree = Tree() tree.create_node(self.operation_plain, self.operation_plain + str(self.time)) _build_tree(self) return tree.show(reverse=True, stdout=False) def show(self, orientation="LR", popup=True): """Show the graphviz output for the pipeline of this object""" if not vedo.settings.enable_pipeline: return try: from graphviz import Digraph except ImportError: vedo.logger.error("please install graphviz with command\n pip install graphviz") return # visualize the entire tree dot = Digraph( node_attr={"fontcolor": "#201010", "fontname": "Helvetica", "fontsize": "12"}, edge_attr={"fontname": "Helvetica", "fontsize": "6", "arrowsize": "0.4"}, ) dot.attr(rankdir=orientation) self.counts = 0 self._build_tree(dot) self.dot = dot dot.render(".vedo_pipeline_graphviz", view=popup) ########################################################################### class ProgressBar: """ Class to print a progress bar. """ def __init__( self, start, stop, step=1, c=None, bold=True, italic=False, title="", eta=True, delay=0.0, width=25, char="\U00002501", char_back="\U00002500", ): """ Class to print a progress bar with optional text message. Check out also function `progressbar()`. Example: ```python import time pb = ProgressBar(0,400, c='red') for i in pb.range(): time.sleep(0.1) pb.print('some message') ``` ![](https://user-images.githubusercontent.com/32848391/51858823-ed1f4880-2335-11e9-8788-2d102ace2578.png) """ self.char = char self.char_back = char_back self.title = title + " " if title: self.title = " " + self.title self.start = start self.stop = stop self.step = step self.color = c self.bold = bold self.italic = italic self.width = width self.pbar = "" self.percent = 0.0 self.percent_int = 0 self.eta = eta self.delay = delay self.t0 = time.time() self._remaining = 1e10 self._update(0) self._counts = 0 self._oldbar = "" self._lentxt = 0 self._range = np.arange(start, stop, step) def print(self, txt="", c=None): """Print the progress bar with an optional message.""" if not c: c = self.color self._update(self._counts + self.step) if self.delay: if time.time() - self.t0 < self.delay: return if self.pbar != self._oldbar: self._oldbar = self.pbar if self.eta and self._counts > 1: tdenom = time.time() - self.t0 if tdenom: vel = self._counts / tdenom self._remaining = (self.stop - self._counts) / vel else: vel = 1 self._remaining = 0.0 if self._remaining > 60: mins = int(self._remaining / 60) secs = self._remaining - 60 * mins mins = f"{mins}m" secs = f"{int(secs + 0.5)}s " else: mins = "" secs = f"{int(self._remaining + 0.5)}s " vel = round(vel, 1) eta = f"eta: {mins}{secs}({vel} it/s) " if self._remaining < 0.5: dt = time.time() - self.t0 if dt > 60: mins = int(dt / 60) secs = dt - 60 * mins mins = f"{mins}m" secs = f"{int(secs + 0.5)}s " else: mins = "" secs = f"{int(dt + 0.5)}s " eta = f"elapsed: {mins}{secs}({vel} it/s) " txt = "" else: eta = "" eraser = " " * self._lentxt + "\b" * self._lentxt s = f"{self.pbar} {eraser}{eta}{txt}\r" vedo.printc(s, c=c, bold=self.bold, italic=self.italic, end="") if self.percent > 99.999: print("") self._lentxt = len(txt) def range(self): """Return the range iterator.""" return self._range def _update(self, counts): if counts < self.start: counts = self.start elif counts > self.stop: counts = self.stop self._counts = counts self.percent = (self._counts - self.start) * 100.0 delta = self.stop - self.start if delta: self.percent /= delta else: self.percent = 0.0 self.percent_int = int(round(self.percent)) af = self.width - 2 nh = int(round(self.percent_int / 100 * af)) pbar_background = "\x1b[2m" + self.char_back * (af - nh) self.pbar = f"{self.title}{self.char * (nh-1)}{pbar_background}" if self.percent < 100.0: ps = f" {self.percent_int}%" else: ps = "" self.pbar += ps ##################################### def progressbar(iterable, c=None, bold=True, italic=False, title="", eta=True, width=25, delay=0.5): """ Function to print a progress bar with optional text message. Use delay to set a minimum time before printing anything. Example: ```python import time for i in progressbar(range(100), c='red'): time.sleep(0.1) ``` ![](https://user-images.githubusercontent.com/32848391/51858823-ed1f4880-2335-11e9-8788-2d102ace2578.png) """ try: if is_number(iterable): total = int(iterable) iterable = range(total) else: total = len(iterable) except TypeError: iterable = list(iterable) total = len(iterable) pb = ProgressBar( 0, total, c=c, bold=bold, italic=italic, title=title, eta=eta, delay=delay, width=width ) for item in iterable: pb.print() yield item ########################################################### def numpy2vtk(arr, dtype=None, deep=True, name=""): """ Convert a numpy array into a `vtkDataArray`. Use `dtype='id'` for `vtkIdTypeArray` objects. """ # https://github.com/Kitware/VTK/blob/master/Wrapping/Python/vtkmodules/util/numpy_support.py if arr is None: return None arr = np.ascontiguousarray(arr) if dtype == "id": varr = numpy_to_vtkIdTypeArray(arr.astype(np.int64), deep=deep) elif dtype: varr = numpy_to_vtk(arr.astype(dtype), deep=deep) else: # let numpy_to_vtk() decide what is best type based on arr type varr = numpy_to_vtk(arr, deep=deep) if name: varr.SetName(name) return varr def vtk2numpy(varr): """Convert a `vtkDataArray`, `vtkIdList` or `vtTransform` into a numpy array.""" if isinstance(varr, vtk.vtkIdList): return np.array([varr.GetId(i) for i in range(varr.GetNumberOfIds())]) elif isinstance(varr, vtk.vtkBitArray): carr = vtk.vtkCharArray() carr.DeepCopy(varr) varr = carr elif isinstance(varr, vtk.vtkHomogeneousTransform): try: varr = varr.GetMatrix() except AttributeError: pass n = 4 M = [[varr.GetElement(i, j) for j in range(n)] for i in range(n)] return np.array(M) return vtk_to_numpy(varr) def make3d(pts, transpose=False): """ Make an array which might be 2D to 3D. Array can also be in the form `[allx, ally, allz]`. Use `transpose` to resolve ambiguous cases (eg, shapes like `[3,3]`). """ pts = np.asarray(pts) if pts.dtype == "object": raise ValueError("Cannot form a valid numpy array, input may be non-homogenous") if pts.shape[0] == 0: # empty list return pts if pts.ndim == 1: if pts.shape[0] == 2: return np.hstack([pts, [0]]).astype(pts.dtype) elif pts.shape[0] == 3: return pts else: raise ValueError if pts.shape[1] == 3: return pts if transpose or (2 <= pts.shape[0] <= 3 and pts.shape[1] > 3): pts = pts.T if pts.shape[1] == 2: return np.c_[pts, np.zeros(pts.shape[0], dtype=pts.dtype)] if pts.shape[1] != 3: raise ValueError("input shape is not supported.") return pts def geometry(obj, extent=None): """ Apply the `vtkGeometryFilter` to the input object. This is a general-purpose filter to extract geometry (and associated data) from any type of dataset. This filter also may be used to convert any type of data to polygonal type. The conversion process may be less than satisfactory for some 3D datasets. For example, this filter will extract the outer surface of a volume or structured grid dataset. Returns a `vedo.Mesh` object. Set `extent` as the `[xmin,xmax, ymin,ymax, zmin,zmax]` bounding box to clip data. """ gf = vtk.vtkGeometryFilter() gf.SetInputData(obj) if extent is not None: gf.SetExtent(extent) gf.Update() return vedo.Mesh(gf.GetOutput()) def extract_cells_by_type(obj, types=()): """ Extract cells of a specified type from a vtk dataset. Given an input `vtkDataSet` and a list of cell types, produce an output containing only cells of the specified type(s). Find [here](https://vtk.org/doc/nightly/html/vtkCellType_8h_source.html) the list of possible cell types. Return: a `vtkDataSet` object which can be wrapped. """ ef = vtk.vtkExtractCellsByType() try: ef.SetInputData(obj.inputdata()) except: ef.SetInputData(obj) for ct in types: ef.AddCellType(ct) ef.Update() return ef.GetOutput() def buildPolyData(vertices, faces=None, lines=None, index_offset=0, tetras=False): """ Build a `vtkPolyData` object from a list of vertices where faces represents the connectivity of the polygonal mesh. E.g. : - `vertices=[[x1,y1,z1],[x2,y2,z2], ...]` - `faces=[[0,1,2], [1,2,3], ...]` - `lines=[[0,1], [1,2,3,4], ...]` Use `index_offset=1` if face numbering starts from 1 instead of 0. If `tetras=True`, interpret 4-point faces as tetrahedrons instead of surface quads. """ poly = vtk.vtkPolyData() if len(vertices) == 0: return poly if not is_sequence(vertices[0]): return poly vertices = make3d(vertices) source_points = vtk.vtkPoints() source_points.SetData(numpy2vtk(vertices, dtype=np.float32)) poly.SetPoints(source_points) if lines is not None: # Create a cell array to store the lines in and add the lines to it linesarr = vtk.vtkCellArray() if is_sequence(lines[0]): # assume format [(id0,id1),..] for iline in lines: for i in range(0, len(iline) - 1): i1, i2 = iline[i], iline[i + 1] if i1 != i2: vline = vtk.vtkLine() vline.GetPointIds().SetId(0, i1) vline.GetPointIds().SetId(1, i2) linesarr.InsertNextCell(vline) else: # assume format [id0,id1,...] for i in range(0, len(lines) - 1): vline = vtk.vtkLine() vline.GetPointIds().SetId(0, lines[i]) vline.GetPointIds().SetId(1, lines[i + 1]) linesarr.InsertNextCell(vline) # print('Wrong format for lines in utils.buildPolydata(), skip.') poly.SetLines(linesarr) if faces is None: source_vertices = vtk.vtkCellArray() for i in range(len(vertices)): source_vertices.InsertNextCell(1) source_vertices.InsertCellPoint(i) poly.SetVerts(source_vertices) return poly ################### # faces exist source_polygons = vtk.vtkCellArray() if isinstance(faces, np.ndarray) or not is_ragged(faces): ##### all faces are composed of equal nr of vtxs, FAST faces = np.asarray(faces) ast = np.int32 if vtk.vtkIdTypeArray().GetDataTypeSize() != 4: ast = np.int64 if faces.ndim > 1: nf, nc = faces.shape hs = np.hstack((np.zeros(nf)[:, None] + nc, faces)).astype(ast).ravel() arr = numpy_to_vtkIdTypeArray(hs, deep=True) source_polygons.SetCells(nf, arr) else: ############################# manually add faces, SLOW showbar = False if len(faces) > 25000: showbar = True pb = ProgressBar(0, len(faces), eta=False) for f in faces: n = len(f) if n == 3: ele = vtk.vtkTriangle() pids = ele.GetPointIds() for i in range(3): pids.SetId(i, f[i] - index_offset) source_polygons.InsertNextCell(ele) elif n == 4 and tetras: # do not use vtkTetra() because it fails # with dolfin faces orientation ele0 = vtk.vtkTriangle() ele1 = vtk.vtkTriangle() ele2 = vtk.vtkTriangle() ele3 = vtk.vtkTriangle() if index_offset: for i in [0, 1, 2, 3]: f[i] -= index_offset f0, f1, f2, f3 = f pid0 = ele0.GetPointIds() pid1 = ele1.GetPointIds() pid2 = ele2.GetPointIds() pid3 = ele3.GetPointIds() pid0.SetId(0, f0) pid0.SetId(1, f1) pid0.SetId(2, f2) pid1.SetId(0, f0) pid1.SetId(1, f1) pid1.SetId(2, f3) pid2.SetId(0, f1) pid2.SetId(1, f2) pid2.SetId(2, f3) pid3.SetId(0, f2) pid3.SetId(1, f3) pid3.SetId(2, f0) source_polygons.InsertNextCell(ele0) source_polygons.InsertNextCell(ele1) source_polygons.InsertNextCell(ele2) source_polygons.InsertNextCell(ele3) else: ele = vtk.vtkPolygon() pids = ele.GetPointIds() pids.SetNumberOfIds(n) for i in range(n): pids.SetId(i, f[i] - index_offset) source_polygons.InsertNextCell(ele) if showbar: pb.print("converting mesh... ") poly.SetPolys(source_polygons) return poly ############################################################################## def get_font_path(font): """Internal use.""" if font in vedo.settings.font_parameters.keys(): if vedo.settings.font_parameters[font]["islocal"]: fl = os.path.join(vedo.fonts_path, f"{font}.ttf") else: try: fl = vedo.file_io.download(f"https://vedo.embl.es/fonts/{font}.ttf", verbose=False) except: vedo.logger.warning(f"Could not download https://vedo.embl.es/fonts/{font}.ttf") fl = os.path.join(vedo.fonts_path, "Normografo.ttf") else: if font.startswith("https://"): fl = vedo.file_io.download(font, verbose=False) elif os.path.isfile(font): fl = font # assume user is passing a valid file else: if font.endswith(".ttf"): vedo.logger.error( f"Could not set font file {font}" f"-> using default: {vedo.settings.default_font}" ) else: vedo.settings.default_font = "Normografo" vedo.logger.error( f"Could not set font name {font}" f" -> using default: Normografo\n" f"Check out https://vedo.embl.es/fonts for additional fonts\n" f"Type 'vedo -r fonts' to see available fonts" ) fl = get_font_path(vedo.settings.default_font) return fl def isSequence(arg): "Deprecated. Please use `is_sequence()`" m = "Warning! isSequence() is deprecated. Please use is_sequence()." print("\x1b[1m\x1b[33;1m " + m + "\x1b[0m") return is_sequence(arg) def is_sequence(arg): """Check if the input is iterable.""" if hasattr(arg, "strip"): return False if hasattr(arg, "__getslice__"): return True if hasattr(arg, "__iter__"): return True return False def is_ragged(arr, deep=False): """ A ragged array in Python is an array with arrays of different lengths as its elements. To check if an array is ragged, we iterate through the elements and check if their lengths are the same. Example: ```python arr = [[1, 2, 3], [[4, 5], [6], 1], [7, 8, 9]] print(is_ragged(arr, deep=True)) # output: True ``` """ if is_sequence(arr[0]): length = len(arr[0]) for i in range(1, len(arr)): if len(arr[i]) != length or (deep and is_ragged(arr[i])): return True return False return False def flatten(list_to_flatten): """Flatten out a list.""" def _genflatten(lst): for elem in lst: if isinstance(elem, (list, tuple)): for x in flatten(elem): yield x else: yield elem return list(_genflatten(list_to_flatten)) def humansort(alist): """ Sort in place a given list the way humans expect. E.g. `['file11', 'file1'] -> ['file1', 'file11']` .. warning:: input list is modified in-place by this function. """ import re def alphanum_key(s): # Turn a string into a list of string and number chunks. # e.g. "z23a" -> ["z", 23, "a"] def tryint(s): if s.isdigit(): return int(s) return s return [tryint(c) for c in re.split("([0-9]+)", s)] alist.sort(key=alphanum_key) return alist # NB: input list is modified def sort_by_column(arr, nth, invert=False): """Sort a numpy array by its `n-th` column.""" arr = np.asarray(arr) arr = arr[arr[:, nth].argsort()] if invert: return np.flip(arr, axis=0) return arr def point_in_triangle(p, p1, p2, p3): """ Return True if a point is inside (or above/below) a triangle defined by 3 points in space. """ p1 = np.array(p1) u = p2 - p1 v = p3 - p1 n = np.cross(u, v) w = p - p1 ln = np.dot(n, n) if not ln: return None # degenerate triangle gamma = (np.dot(np.cross(u, w), n)) / ln if 0 < gamma < 1: beta = (np.dot(np.cross(w, v), n)) / ln if 0 < beta < 1: alpha = 1 - gamma - beta if 0 < alpha < 1: return True return False def intersection_ray_triangle(P0, P1, V0, V1, V2): """ Fast intersection between a directional ray defined by `P0,P1` and triangle `V0, V1, V2`. Returns the intersection point or - `None` if triangle is degenerate, or ray is parallel to triangle plane. - `False` if no intersection, or ray direction points away from triangle. """ # Credits: http://geomalgorithms.com/a06-_intersect-2.html # Get triangle edge vectors and plane normal # todo : this is slow should check # https://vtk.org/doc/nightly/html/classvtkCell.html#aa850382213d7b8693f0eeec0209c347b V0 = np.asarray(V0, dtype=float) P0 = np.asarray(P0, dtype=float) u = V1 - V0 v = V2 - V0 n = np.cross(u, v) if not np.abs(v).sum(): # triangle is degenerate return None # do not deal with this case rd = P1 - P0 # ray direction vector w0 = P0 - V0 a = -np.dot(n, w0) b = np.dot(n, rd) if not b: # ray is parallel to triangle plane return None # Get intersect point of ray with triangle plane r = a / b if r < 0.0: # ray goes away from triangle return False # => no intersect # Gor a segment, also test if (r > 1.0) => no intersect I = P0 + r * rd # intersect point of ray and plane # is I inside T? uu = np.dot(u, u) uv = np.dot(u, v) vv = np.dot(v, v) w = I - V0 wu = np.dot(w, u) wv = np.dot(w, v) D = uv * uv - uu * vv # Get and test parametric coords s = (uv * wv - vv * wu) / D if s < 0.0 or s > 1.0: # I is outside T return False t = (uv * wu - uu * wv) / D if t < 0.0 or (s + t) > 1.0: # I is outside T return False return I # I is in T def triangle_solver(**input_dict): """ Solve a triangle from any 3 known elements. (Note that there might be more than one solution or none). Angles are in radians. Example: ```python print(triangle_solver(a=3, b=4, c=5)) print(triangle_solver(a=3, ac=0.9273, ab=1.5716)) print(triangle_solver(a=3, b=4, ab=1.5716)) print(triangle_solver(b=4, bc=.64, ab=1.5716)) print(triangle_solver(c=5, ac=.9273, bc=0.6435)) print(triangle_solver(a=3, c=5, bc=0.6435)) print(triangle_solver(b=4, c=5, ac=0.927)) ``` """ a = input_dict.get("a") b = input_dict.get("b") c = input_dict.get("c") ab = input_dict.get("ab") bc = input_dict.get("bc") ac = input_dict.get("ac") if ab and bc: ac = np.pi - bc - ab elif bc and ac: ab = np.pi - bc - ac elif ab and ac: bc = np.pi - ab - ac if a is not None and b is not None and c is not None: ab = np.arccos((a ** 2 + b ** 2 - c ** 2) / (2 * a * b)) sinab = np.sin(ab) ac = np.arcsin(a / c * sinab) bc = np.arcsin(b / c * sinab) elif a is not None and b is not None and ab is not None: c = np.sqrt(a ** 2 + b ** 2 - 2 * a * b * np.cos(ab)) sinab = np.sin(ab) ac = np.arcsin(a / c * sinab) bc = np.arcsin(b / c * sinab) elif a is not None and ac is not None and ab is not None: h = a * np.sin(ac) b = h / np.sin(bc) c = b * np.cos(bc) + a * np.cos(ac) elif b is not None and bc is not None and ab is not None: h = b * np.sin(bc) a = h / np.sin(ac) c = np.sqrt(a * a + b * b) elif c is not None and ac is not None and bc is not None: h = c * np.sin(bc) b1 = c * np.cos(bc) b2 = h / np.tan(ab) b = b1 + b2 a = np.sqrt(b2 * b2 + h * h) elif a is not None and c is not None and bc is not None: # double solution h = c * np.sin(bc) k = np.sqrt(a * a - h * h) omega = np.arcsin(k / a) cosbc = np.cos(bc) b = c * cosbc - k phi = np.pi / 2 - bc - omega ac = phi ab = np.pi - ac - bc if k: b2 = c * cosbc + k ac2 = phi + 2 * omega ab2 = np.pi - ac2 - bc return [ {"a": a, "b": b, "c": c, "ab": ab, "bc": bc, "ac": ac}, {"a": a, "b": b2, "c": c, "ab": ab2, "bc": bc, "ac": ac2}, ] elif b is not None and c is not None and ac is not None: # double solution h = c * np.sin(ac) k = np.sqrt(b * b - h * h) omega = np.arcsin(k / b) cosac = np.cos(ac) a = c * cosac - k phi = np.pi / 2 - ac - omega bc = phi ab = np.pi - bc - ac if k: a2 = c * cosac + k bc2 = phi + 2 * omega ab2 = np.pi - ac - bc2 return [ {"a": a, "b": b, "c": c, "ab": ab, "bc": bc, "ac": ac}, {"a": a2, "b": b, "c": c, "ab": ab2, "bc": bc2, "ac": ac}, ] else: vedo.logger.error(f"Case {input_dict} is not supported.") return [] return [{"a": a, "b": b, "c": c, "ab": ab, "bc": bc, "ac": ac}] ############################################################################# def point_line_distance(p, p1, p2): """ Compute the distance of a point to a line (not the segment) defined by `p1` and `p2`. """ return np.sqrt(vtk.vtkLine.DistanceToLine(p, p1, p2)) def closest(point, points, n=1, return_ids=False, use_tree=False): """ Returns the distances and the closest point(s) to the given set of points. Needs `scipy.spatial` library. Arguments: n : (int) the nr of closest points to return return_ids : (bool) return the ids instead of the points coordinates use_tree : (bool) build a `scipy.spatial.KDTree`. An already existing one can be passed to avoid rebuilding. """ from scipy.spatial import distance, KDTree points = np.asarray(points) if n == 1: dists = distance.cdist([point], points) closest_idx = np.argmin(dists) else: if use_tree: if isinstance(use_tree, KDTree): # reuse tree = use_tree else: tree = KDTree(points) dists, closest_idx = tree.query([point], k=n) closest_idx = closest_idx[0] else: dists = distance.cdist([point], points) closest_idx = np.argsort(dists)[0][:n] if return_ids: return dists, closest_idx else: return dists, points[closest_idx] ############################################################################# def lin_interpolate(x, rangeX, rangeY): """ Interpolate linearly the variable `x` in `rangeX` onto the new `rangeY`. If `x` is a 3D vector the linear weight is the distance to the two 3D `rangeX` vectors. E.g. if `x` runs in `rangeX=[x0,x1]` and I want it to run in `rangeY=[y0,y1]` then `y = lin_interpolate(x, rangeX, rangeY)` will interpolate `x` onto `rangeY`. Examples: - [lin_interpolate.py](https://github.com/marcomusy/vedo/tree/master/examples/basic/lin_interpolate.py) ![](https://vedo.embl.es/images/basic/linInterpolate.png) """ if is_sequence(x): x = np.asarray(x) x0, x1 = np.asarray(rangeX) y0, y1 = np.asarray(rangeY) dx = x1 - x0 dxn = np.linalg.norm(dx) if not dxn: return y0 s = np.linalg.norm(x - x0) / dxn t = np.linalg.norm(x - x1) / dxn st = s + t out = y0 * (t / st) + y1 * (s / st) else: # faster x0 = rangeX[0] dx = rangeX[1] - x0 if not dx: return rangeY[0] s = (x - x0) / dx out = rangeY[0] * (1 - s) + rangeY[1] * s return out def get_uv(p, x, v): """ Obtain the texture uv-coords of a point p belonging to a face that has point coordinates (x0, x1, x2) with the corresponding uv-coordinates v=(v0, v1, v2). All p and x0,x1,x2 are 3D-vectors, while v are their 2D uv-coordinates. Example: ```python from vedo import * pic = Picture(dataurl+"coloured_cube_faces.jpg") cb = Mesh(dataurl+"coloured_cube.obj").lighting("off").texture(pic) cbpts = cb.points() faces = cb.faces() uv = cb.pointdata["Material"] pt = [-0.2, 0.75, 2] pr = cb.closest_point(pt) idface = cb.closest_point(pt, return_cell_id=True) idpts = faces[idface] uv_face = uv[idpts] uv_pr = utils.get_uv(pr, cbpts[idpts], uv_face) print("interpolated uv =", uv_pr) sx, sy = pic.dimensions() i_interp_uv = uv_pr * [sy, sx] ix, iy = i_interp_uv.astype(int) mpic = pic.tomesh() rgba = mpic.pointdata["RGBA"].reshape(sy, sx, 3) print("color =", rgba[ix, iy]) show( [[cb, Point(pr), cb.labels("Material")], [pic, Point(i_interp_uv)]], N=2, axes=1, sharecam=False, ).close() ``` ![](https://vedo.embl.es/images/feats/utils_get_uv.png) """ # Vector vp=p-x0 is representable as alpha*s + beta*t, # where s = x1-x0 and t = x2-x0, in matrix form # vp = [alpha, beta] . matrix(s,t) # M = matrix(s,t) is 2x3 matrix, so (alpha, beta) can be found by # inverting any of its minor A with non-zero determinant. # Once found, uv-coords of p are vt0 + alpha (vt1-v0) + beta (vt2-v0) p = np.asarray(p) x0, x1, x2 = np.asarray(x)[:3] vt0, vt1, vt2 = np.asarray(v)[:3] s = x1 - x0 t = x2 - x0 vs = vt1 - vt0 vt = vt2 - vt0 vp = p - x0 # finding a minor with independent rows M = np.matrix([s, t]) mnr = [0, 1] A = M[:, mnr] if np.abs(np.linalg.det(A)) < 0.000001: mnr = [0, 2] A = M[:, mnr] if np.abs(np.linalg.det(A)) < 0.000001: mnr = [1, 2] A = M[:, mnr] Ainv = np.linalg.inv(A) alpha_beta = vp[mnr].dot(Ainv) # [alpha, beta] return np.asarray(vt0 + alpha_beta.dot(np.matrix([vs, vt])))[0] def vector(x, y=None, z=0.0, dtype=np.float64): """ Return a 3D numpy array representing a vector. If `y` is `None`, assume input is already in the form `[x,y,z]`. """ if y is None: # assume x is already [x,y,z] return np.asarray(x, dtype=dtype) return np.array([x, y, z], dtype=dtype) def versor(x, y=None, z=0.0, dtype=np.float64): """Return the unit vector. Input can be a list of vectors.""" v = vector(x, y, z, dtype) if isinstance(v[0], np.ndarray): return np.divide(v, mag(v)[:, None]) return v / mag(v) def mag(v): """Get the magnitude of a vector or array of vectors.""" v = np.asarray(v) if v.ndim == 1: return np.linalg.norm(v) return np.linalg.norm(v, axis=1) def mag2(v): """Get the squared magnitude of a vector or array of vectors.""" v = np.asarray(v) if v.ndim == 1: return np.square(v).sum() return np.square(v).sum(axis=1) def is_integer(n): """Check if input is an integer.""" try: float(n) except (ValueError, TypeError): return False else: return float(n).is_integer() def is_number(n): """Check if input is a number""" try: float(n) return True except (ValueError, TypeError): return False def round_to_digit(x, p): """Round a real number to the specified number of significant digits.""" if not x: return 0 r = np.round(x, p - int(np.floor(np.log10(abs(x)))) - 1) if int(r) == r: return int(r) return r def pack_spheres(bounds, radius): """ Packing spheres into a bounding box. Returns a numpy array of sphere centers. """ h = 0.8164965 / 2 d = 0.8660254 a = 0.288675135 if is_sequence(bounds): x0, x1, y0, y1, z0, z1 = bounds else: x0, x1, y0, y1, z0, z1 = bounds.bounds() x = np.arange(x0, x1, radius) nul = np.zeros_like(x) nz = int((z1 - z0) / radius / h / 2 + 1.5) ny = int((y1 - y0) / radius / d + 1.5) pts = [] for iz in range(nz): z = z0 + nul + iz * h * radius dx, dy, dz = [radius * 0.5, radius * a, iz * h * radius] for iy in range(ny): y = y0 + nul + iy * d * radius if iy % 2: xs = x else: xs = x + radius * 0.5 if iz % 2: p = np.c_[xs, y, z] + [dx, dy, dz] else: p = np.c_[xs, y, z] + [0, 0, dz] pts += p.tolist() return np.array(pts) def precision(x, p, vrange=None, delimiter="e"): """ Returns a string representation of `x` formatted to precision `p`. Set `vrange` to the range in which x exists (to snap x to '0' if below precision). """ # Based on the webkit javascript implementation # `from here `_, # and implemented by `randlet `_. # Modified for vedo by M.Musy 2020 if isinstance(x, str): # do nothing return x if is_sequence(x): out = "(" nn = len(x) - 1 for i, ix in enumerate(x): try: if np.isnan(ix): return "NaN" except: # cannot handle list of list continue out += precision(ix, p) if i < nn: out += ", " return out + ")" ############ <-- if np.isnan(x): return "NaN" x = float(x) if x == 0.0 or (vrange is not None and abs(x) < vrange / pow(10, p)): return "0" out = [] if x < 0: out.append("-") x = -x e = int(math.log10(x)) tens = math.pow(10, e - p + 1) n = math.floor(x / tens) if n < math.pow(10, p - 1): e = e - 1 tens = math.pow(10, e - p + 1) n = math.floor(x / tens) if abs((n + 1.0) * tens - x) <= abs(n * tens - x): n = n + 1 if n >= math.pow(10, p): n = n / 10.0 e = e + 1 m = "%.*g" % (p, n) if e < -2 or e >= p: out.append(m[0]) if p > 1: out.append(".") out.extend(m[1:p]) out.append(delimiter) if e > 0: out.append("+") out.append(str(e)) elif e == (p - 1): out.append(m) elif e >= 0: out.append(m[: e + 1]) if e + 1 < len(m): out.append(".") out.extend(m[e + 1 :]) else: out.append("0.") out.extend(["0"] * -(e + 1)) out.append(m) return "".join(out) ################################################################################## # 2d ###### def cart2pol(x, y): """2D Cartesian to Polar coordinates conversion.""" theta = np.arctan2(y, x) rho = np.hypot(x, y) return np.array([rho, theta]) def pol2cart(rho, theta): """2D Polar to Cartesian coordinates conversion.""" x = rho * np.cos(theta) y = rho * np.sin(theta) return np.array([x, y]) # 3d ###### def cart2spher(x, y, z): """3D Cartesian to Spherical coordinate conversion.""" hxy = np.hypot(x, y) rho = np.hypot(hxy, z) theta = np.arctan2(hxy, z) phi = np.arctan2(y, x) return np.array([rho, theta, phi]) def spher2cart(rho, theta, phi): """3D Spherical to Cartesian coordinate conversion.""" st = np.sin(theta) sp = np.sin(phi) ct = np.cos(theta) cp = np.cos(phi) rst = rho * st x = rst * cp y = rst * sp z = rho * ct return np.array([x, y, z]) def cart2cyl(x, y, z): """3D Cartesian to Cylindrical coordinate conversion.""" rho = np.sqrt(x * x + y * y) theta = np.arctan2(y, x) return np.array([rho, theta, z]) def cyl2cart(rho, theta, z): """3D Cylindrical to Cartesian coordinate conversion.""" x = rho * np.cos(theta) y = rho * np.sin(theta) return np.array([x, y, z]) def cyl2spher(rho, theta, z): """3D Cylindrical to Spherical coordinate conversion.""" rhos = np.sqrt(rho * rho + z * z) phi = np.arctan2(rho, z) return np.array([rhos, phi, theta]) def spher2cyl(rho, theta, phi): """3D Spherical to Cylindrical coordinate conversion.""" rhoc = rho * np.sin(theta) z = rho * np.cos(theta) return np.array([rhoc, phi, z]) ################################################################################## def grep(filename, tag, column=None, first_occurrence_only=False): """Greps the line in a file that starts with a specific `tag` string inside the file.""" import re with open(filename, "r", encoding="UTF-8") as afile: content = [] for line in afile: if re.search(tag, line): c = line.split() c[-1] = c[-1].replace("\n", "") if column is not None: c = c[column] content.append(c) if first_occurrence_only: break return content def print_info(obj): """Print information about a `vedo` object.""" def _print_data(poly, c): ptdata = poly.GetPointData() cldata = poly.GetCellData() fldata = poly.GetFieldData() if ptdata.GetNumberOfArrays() + cldata.GetNumberOfArrays(): for i in range(ptdata.GetNumberOfArrays()): name = ptdata.GetArrayName(i) if name and ptdata.GetArray(i): vedo.printc("pointdata".ljust(14) + ": ", c=c, bold=True, end="") try: tt, _ = array_types[ptdata.GetArray(i).GetDataType()] except: tt = "VTKTYPE" + str(ptdata.GetArray(i).GetDataType()) ncomp = ptdata.GetArray(i).GetNumberOfComponents() rng = ptdata.GetArray(i).GetRange() vedo.printc(f'"{name}" ({ncomp} {tt}),', c=c, bold=False, end="") vedo.printc( " range=(" + precision(rng[0], 3) + "," + precision(rng[1], 3) + ")", c=c, bold=False, ) if ptdata.GetScalars(): vedo.printc("active scalars".ljust(14) + ": ", c=c, bold=True, end="") vedo.printc(ptdata.GetScalars().GetName(), "(pointdata) ", c=c, bold=False) if ptdata.GetVectors(): vedo.printc("active vectors".ljust(14) + ": ", c=c, bold=True, end="") vedo.printc(ptdata.GetVectors().GetName(), "(pointdata) ", c=c, bold=False) if ptdata.GetTensors(): vedo.printc("active tensors".ljust(14) + ": ", c=c, bold=True, end="") vedo.printc(ptdata.GetTensors().GetName(), "(pointdata) ", c=c, bold=False) # same for cells for i in range(cldata.GetNumberOfArrays()): name = cldata.GetArrayName(i) if name and cldata.GetArray(i): vedo.printc("celldata".ljust(14) + ": ", c=c, bold=True, end="") try: tt, _ = array_types[cldata.GetArray(i).GetDataType()] except: tt = cldata.GetArray(i).GetDataType() ncomp = cldata.GetArray(i).GetNumberOfComponents() rng = cldata.GetArray(i).GetRange() vedo.printc(f'"{name}" ({ncomp} {tt}),', c=c, bold=False, end="") vedo.printc( " range=(" + precision(rng[0], 4) + "," + precision(rng[1], 4) + ")", c=c, bold=False, ) if cldata.GetScalars(): vedo.printc("active scalars".ljust(14) + ": ", c=c, bold=True, end="") vedo.printc(cldata.GetScalars().GetName(), "(celldata)", c=c, bold=False) if cldata.GetVectors(): vedo.printc("active vectors".ljust(14) + ": ", c=c, bold=True, end="") vedo.printc(cldata.GetVectors().GetName(), "(celldata)", c=c, bold=False) for i in range(fldata.GetNumberOfArrays()): name = fldata.GetArrayName(i) if name and fldata.GetAbstractArray(i): arr = fldata.GetAbstractArray(i) vedo.printc("metadata".ljust(14) + ": ", c=c, bold=True, end="") ncomp = arr.GetNumberOfComponents() nvals = arr.GetNumberOfValues() vedo.printc(f'"{name}" ({ncomp} components, {nvals} values)', c=c, bold=False) else: vedo.printc("mesh data".ljust(14) + ":", c=c, bold=True, end=" ") vedo.printc("no point or cell data is present.", c=c, bold=False) ################################ def _printvtkactor(actor): if not actor.GetPickable(): return mapper = actor.GetMapper() if hasattr(actor, "polydata"): poly = actor.polydata() else: poly = mapper.GetInput() pro = actor.GetProperty() pos = actor.GetPosition() bnds = actor.bounds() col = precision(pro.GetColor(), 3) alpha = pro.GetOpacity() npt = poly.GetNumberOfPoints() npl = poly.GetNumberOfPolys() nln = poly.GetNumberOfLines() vedo.printc("Mesh/Points".ljust(70), c="g", bold=True, invert=True, dim=1, end="") if hasattr(actor, "info") and "legend" in actor.info.keys() and actor.info["legend"]: vedo.printc("legend".ljust(14) + ": ", c="g", bold=True, end="") vedo.printc(actor.info["legend"], c="g", bold=False) else: print() if hasattr(actor, "name") and actor.name: vedo.printc("name".ljust(14) + ": ", c="g", bold=True, end="") vedo.printc(actor.name, c="g", bold=False) if hasattr(actor, "filename") and actor.filename: vedo.printc("file name".ljust(14) + ": ", c="g", bold=True, end="") vedo.printc(actor.filename, c="g", bold=False) if not actor.GetMapper().GetScalarVisibility(): vedo.printc("color".ljust(14) + ": ", c="g", bold=True, end="") cname = vedo.colors.get_color_name(pro.GetColor()) vedo.printc(f"{cname}, rgb={col}, alpha={alpha}", c="g", bold=False) if actor.GetBackfaceProperty(): bcol = actor.GetBackfaceProperty().GetDiffuseColor() cname = vedo.colors.get_color_name(bcol) vedo.printc("back color".ljust(14) + ": ", c="g", bold=True, end="") vedo.printc(f"{cname}, rgb={precision(bcol,3)}", c="g", bold=False) vedo.printc("points".ljust(14) + ":", npt, c="g", bold=True) # ncl = poly.GetNumberOfCells() # vedo.printc("cells".ljust(14)+":", ncl, c="g", bold=True) vedo.printc("polygons".ljust(14) + ":", npl, c="g", bold=True) if nln: vedo.printc("lines".ljust(14) + ":", nln, c="g", bold=True) vedo.printc("position".ljust(14) + ":", pos, c="g", bold=True) if hasattr(actor, "GetScale"): vedo.printc("scale".ljust(14) + ":", c="g", bold=True, end=" ") vedo.printc(precision(actor.GetScale(), 3), c="g", bold=False) if hasattr(actor, "polydata") and actor.npoints: vedo.printc("center of mass".ljust(14) + ":", c="g", bold=True, end=" ") cm = tuple(actor.center_of_mass()) vedo.printc(precision(cm, 3), c="g", bold=False) vedo.printc("average size".ljust(14) + ":", c="g", bold=True, end=" ") vedo.printc(precision(actor.average_size(), 6), c="g", bold=False) vedo.printc("diagonal size".ljust(14) + ":", c="g", bold=True, end=" ") vedo.printc(precision(actor.diagonal_size(), 6), c="g", bold=False) vedo.printc("bounds".ljust(14) + ":", c="g", bold=True, end=" ") bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c="g", bold=False, end="") by1, by2 = precision(bnds[2], 3), precision(bnds[3], 3) vedo.printc(" y=(" + by1 + ", " + by2 + ")", c="g", bold=False, end="") bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c="g", bold=False) _print_data(poly, "g") if hasattr(actor, "picked3d") and actor.picked3d is not None: idpt = actor.closest_point(actor.picked3d, return_point_id=True) idcell = actor.closest_point(actor.picked3d, return_cell_id=True) vedo.printc( "clicked point".ljust(14) + ":", precision(actor.picked3d, 6), f"pointID={idpt}, cellID={idcell}", c="g", bold=True, ) if obj is None: return if isinstance(obj, np.ndarray): cf = "y" vedo.printc("Numpy Array".ljust(70), c=cf, invert=True) vedo.printc(obj, c=cf) vedo.printc("shape".ljust(8) + ":", obj.shape, c=cf) vedo.printc("range".ljust(8) + f": ({np.min(obj)}, {np.max(obj)})", c=cf) vedo.printc("mean".ljust(8) + ":", np.mean(obj), c=cf) vedo.printc("std_dev".ljust(8) + ":", np.std(obj), c=cf) if len(obj.shape) >= 2: vedo.printc("Axis 0".ljust(8) + ":", c=cf, italic=1) vedo.printc("\tmin :", np.min(obj, axis=0), c=cf) vedo.printc("\tmax :", np.max(obj, axis=0), c=cf) vedo.printc("\tmean:", np.mean(obj, axis=0), c=cf) if obj.shape[1] > 3: vedo.printc("Axis 1".ljust(8) + ":", c=cf, italic=1) tmin = str(np.min(obj, axis=1).tolist()[:2]).replace("]", ", ...") tmax = str(np.max(obj, axis=1).tolist()[:2]).replace("]", ", ...") tmea = str(np.mean(obj, axis=1).tolist()[:2]).replace("]", ", ...") vedo.printc(f"\tmin : {tmin}", c=cf) vedo.printc(f"\tmax : {tmax}", c=cf) vedo.printc(f"\tmean: {tmea}", c=cf) elif isinstance(obj, vedo.Points): _printvtkactor(obj) elif isinstance(obj, vedo.Assembly): vedo.printc("Assembly".ljust(75), c="g", bold=True, invert=True) pos = obj.GetPosition() bnds = obj.GetBounds() vedo.printc("position".ljust(14) + ": ", c="g", bold=True, end="") vedo.printc(pos, c="g", bold=False) vedo.printc("bounds".ljust(14) + ": ", c="g", bold=True, end="") bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c="g", bold=False, end="") by1, by2 = precision(bnds[2], 3), precision(bnds[3], 3) vedo.printc(" y=(" + by1 + ", " + by2 + ")", c="g", bold=False, end="") bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c="g", bold=False) cl = vtk.vtkPropCollection() obj.GetActors(cl) cl.InitTraversal() for _ in range(obj.GetNumberOfPaths()): act = vtk.vtkActor.SafeDownCast(cl.GetNextProp()) if isinstance(act, vtk.vtkActor): _printvtkactor(act) elif isinstance(obj, vedo.TetMesh): cf = "m" vedo.printc("TetMesh".ljust(70), c=cf, bold=True, invert=True) pos = obj.GetPosition() bnds = obj.GetBounds() ug = obj.inputdata() vedo.printc("nr. of tetras".ljust(14) + ": ", c=cf, bold=True, end="") vedo.printc(ug.GetNumberOfCells(), c=cf, bold=False) vedo.printc("position".ljust(14) + ": ", c=cf, bold=True, end="") vedo.printc(pos, c=cf, bold=False) vedo.printc("bounds".ljust(14) + ": ", c=cf, bold=True, end="") bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c=cf, bold=False, end="") by1, by2 = precision(bnds[2], 3), precision(bnds[3], 3) vedo.printc(" y=(" + by1 + ", " + by2 + ")", c=cf, bold=False, end="") bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c=cf, bold=False) _print_data(ug, cf) elif isinstance(obj, (vedo.volume.Volume, vedo.volume.VolumeSlice)): vedo.printc("Volume".ljust(70), c="b", bold=True, invert=True) img = obj.GetMapper().GetInput() vedo.printc("origin".ljust(14) + ": ", c="b", bold=True, end="") vedo.printc(precision(obj.origin(), 6), c="b", bold=False) vedo.printc("center".ljust(14) + ": ", c="b", bold=True, end="") vedo.printc(precision(obj.center(), 6), c="b", bold=False) vedo.printc("dimensions".ljust(14) + ": ", c="b", bold=True, end="") vedo.printc(img.GetDimensions(), c="b", bold=False) vedo.printc("spacing".ljust(14) + ": ", c="b", bold=True, end="") vedo.printc(precision(img.GetSpacing(), 6), c="b", bold=False) # vedo.printc("data dimension".ljust(14) + ": ", c="b", bold=True, end="") # vedo.printc(img.GetDataDimension(), c="b", bold=False) vedo.printc("memory size".ljust(14) + ": ", c="b", bold=True, end="") vedo.printc(int(img.GetActualMemorySize() / 1024), "MB", c="b", bold=False) vedo.printc("scalar #bytes".ljust(14) + ": ", c="b", bold=True, end="") vedo.printc(img.GetScalarSize(), c="b", bold=False) bnds = obj.GetBounds() vedo.printc("bounds".ljust(14) + ": ", c="b", bold=True, end="") bx1, bx2 = precision(bnds[0], 4), precision(bnds[1], 4) vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c="b", bold=False, end="") by1, by2 = precision(bnds[2], 4), precision(bnds[3], 4) vedo.printc(" y=(" + by1 + ", " + by2 + ")", c="b", bold=False, end="") bz1, bz2 = precision(bnds[4], 4), precision(bnds[5], 4) vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c="b", bold=False) vedo.printc("scalar range".ljust(14) + ": ", c="b", bold=True, end="") vedo.printc(img.GetScalarRange(), c="b", bold=False) print_histogram(obj, horizontal=True, logscale=True, bins=8, height=15, c="b", bold=True) elif isinstance(obj, vedo.Plotter) and obj.interactor: # dumps Plotter info axtype = { 0: "(no axes)", 1: "(three customizable gray grid walls)", 2: "(cartesian axes from origin", 3: "(positive range of cartesian axes from origin", 4: "(axes triad at bottom left)", 5: "(oriented cube at bottom left)", 6: "(mark the corners of the bounding box)", 7: "(3D ruler at each side of the cartesian axes)", 8: "(the vtkCubeAxesActor object)", 9: "(the bounding box outline)", 10: "(circles of maximum bounding box range)", 11: "(show a large grid on the x-y plane)", 12: "(show polar axes)", 13: "(simple ruler at the bottom of the window)", 14: "(the vtkCameraOrientationWidget object)", } bns, totpt = [], 0 for a in obj.actors: b = a.GetBounds() if a.GetBounds() is not None: if isinstance(a, vtk.vtkActor) and a.GetMapper(): totpt += a.GetMapper().GetInput().GetNumberOfPoints() bns.append(b) if len(bns) == 0: return vedo.printc("Plotter".ljust(70), invert=True, dim=1, c="c") otit = obj.title if not otit: otit = None vedo.printc("window title".ljust(14) + ":", otit, bold=False, c="c") vedo.printc( "window size".ljust(14) + ":", obj.window.GetSize(), "- full screen size:", obj.window.GetScreenSize(), bold=False, c="c", ) vedo.printc( "actv renderer".ljust(14) + ":", "nr.", obj.renderers.index(obj.renderer), f"(of {len(obj.renderers)} renderers)", bold=False, c="c", ) vedo.printc("nr. of actors".ljust(14) + ":", len(obj.actors), bold=False, c="c", end="") vedo.printc(" (" + str(totpt), "vertices)", bold=False, c="c") max_bns = np.max(bns, axis=0) min_bns = np.min(bns, axis=0) vedo.printc("max bounds".ljust(14) + ": ", c="c", bold=False, end="") bx1, bx2 = precision(min_bns[0], 3), precision(max_bns[1], 3) vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c="c", bold=False, end="") by1, by2 = precision(min_bns[2], 3), precision(max_bns[3], 3) vedo.printc(" y=(" + by1 + ", " + by2 + ")", c="c", bold=False, end="") bz1, bz2 = precision(min_bns[4], 3), precision(max_bns[5], 3) vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c="c", bold=False) if isinstance(obj.axes, dict): obj.axes = 1 if obj.axes: vedo.printc("axes style".ljust(14) + ":", obj.axes, axtype[obj.axes], bold=False, c="c") elif isinstance(obj, vedo.Picture): # dumps Picture info vedo.printc("Picture".ljust(70), c="y", bold=True, invert=True) try: # generate a print thumbnail width, height = obj.dimensions() w = 45 h = int(height / width * (w - 1) * 0.5 + 0.5) img_arr = obj.clone().resize([w, h]).tonumpy() h, w = img_arr.shape[:2] for x in range(h): for y in range(w): pix = img_arr[x][y] r, g, b = pix[:3] print(f"\x1b[48;2;{r};{g};{b}m", end=" ") print("\x1b[0m") except: pass img = obj.GetMapper().GetInput() pos = obj.GetPosition() vedo.printc("position".ljust(14) + ": ", c="y", bold=True, end="") vedo.printc(pos, c="y", bold=False) vedo.printc("dimensions".ljust(14) + ": ", c="y", bold=True, end="") vedo.printc(obj.shape, c="y", bold=False) vedo.printc("memory size".ljust(14) + ": ", c="y", bold=True, end="") vedo.printc(int(img.GetActualMemorySize()), "kB", c="y", bold=False) bnds = obj.GetBounds() vedo.printc("bounds".ljust(14) + ": ", c="y", bold=True, end="") bx1, bx2 = precision(bnds[0], 3), precision(bnds[1], 3) vedo.printc("x=(" + bx1 + ", " + bx2 + ")", c="y", bold=False, end="") by1, by2 = precision(bnds[2], 3), precision(bnds[3], 3) vedo.printc(" y=(" + by1 + ", " + by2 + ")", c="y", bold=False, end="") bz1, bz2 = precision(bnds[4], 3), precision(bnds[5], 3) vedo.printc(" z=(" + bz1 + ", " + bz2 + ")", c="y", bold=False) vedo.printc("intensty range".ljust(14) + ": ", c="y", bold=True, end="") vedo.printc(img.GetScalarRange(), c="y", bold=False) vedo.printc("level / window".ljust(14) + ": ", c="y", bold=True, end="") vedo.printc(obj.level(), "/", obj.window(), c="y", bold=False) else: vedo.printc(str(type(obj)).ljust(70), invert=True) vedo.printc(obj) def print_histogram( data, bins=10, height=10, logscale=False, minbin=0, horizontal=False, char="\u2588", c=None, bold=True, title="histogram", spacer="", ): """ Ascii histogram printing. Input can be a `vedo.Volume` or `vedo.Mesh`. Returns the raw data before binning (useful when passing vtk objects). Arguments: bins : (int) number of histogram bins height : (int) height of the histogram in character units logscale : (bool) use logscale for frequencies minbin : (int) ignore bins before minbin horizontal : (bool) show histogram horizontally char : (str) character to be used bold : (bool) use boldface title : (str) histogram title spacer : (str) horizontal spacer Example: ```python from vedo import print_histogram import numpy as np d = np.random.normal(size=1000) data = print_histogram(d, c='blue', logscale=True, title='my scalars') data = print_histogram(d, c=1, horizontal=1) print(np.mean(data)) # data here is same as d ``` ![](https://vedo.embl.es/images/feats/print_histogram.png) """ # credits: http://pyinsci.blogspot.com/2009/10/ascii-histograms.html # adapted for vedo by M.Musy, 2019 if not horizontal: # better aspect ratio bins *= 2 isimg = isinstance(data, vtk.vtkImageData) isvol = isinstance(data, vtk.vtkVolume) if isimg or isvol: if isvol: img = data.imagedata() else: img = data dims = img.GetDimensions() nvx = min(100000, dims[0] * dims[1] * dims[2]) idxs = np.random.randint(0, min(dims), size=(nvx, 3)) data = [] for ix, iy, iz in idxs: d = img.GetScalarComponentAsFloat(ix, iy, iz, 0) data.append(d) elif isinstance(data, vtk.vtkActor): arr = data.polydata().GetPointData().GetScalars() if not arr: arr = data.polydata().GetCellData().GetScalars() if not arr: return None data = vtk2numpy(arr) try: h = np.histogram(data, bins=bins) except TypeError as e: vedo.logger.error(f"cannot compute histogram: {e}") return "" if minbin: hi = h[0][minbin:-1] else: hi = h[0] if char == "\U00002589" and horizontal: char = "\U00002586" title = title.ljust(14) + ":" entrs = " entries=" + str(len(data)) if logscale: h0 = np.log10(hi + 1) maxh0 = int(max(h0) * 100) / 100 title = title + entrs + " (logscale)" else: h0 = hi maxh0 = max(h0) title = title + entrs def _v(): his = "" if title: his += title + "\n" bars = h0 / maxh0 * height for l in reversed(range(1, height + 1)): line = "" if l == height: line = "%s " % maxh0 else: line = " |" + " " * (len(str(maxh0)) - 3) for c in bars: if c >= np.ceil(l): line += char else: line += " " line += "\n" his += line his += "%.2f" % h[1][0] + "." * (bins) + "%.2f" % h[1][-1] + "\n" return his def _h(): his = "" if title: his += title + "\n" xl = ["%.2f" % n for n in h[1]] lxl = [len(l) for l in xl] bars = h0 / maxh0 * height his += spacer + " " * int(max(bars) + 2 + max(lxl)) + "%s\n" % maxh0 for i, c in enumerate(bars): line = xl[i] + " " * int(max(lxl) - lxl[i]) + "| " + char * int(c) + "\n" his += spacer + line return his if horizontal: height *= 2 vedo.printc(_h(), c=c, bold=bold) else: vedo.printc(_v(), c=c, bold=bold) return data def print_table(*columns, headers=None, c="g"): """ Print lists as tables. Example: ```python from vedo.utils import print_table list1 = ["A", "B", "C"] list2 = [142, 220, 330] list3 = [True, False, True] headers = ["First Column", "Second Column", "Third Column"] print_table(list1, list2, list3, headers=headers) ``` ![](https://vedo.embl.es/images/feats/) """ # If headers is not provided, use default header names corner = "─" if headers is None: headers = [f"Column {i}" for i in range(1, len(columns) + 1)] assert len(headers) == len(columns) # Find the maximum length of the elements in each column and header max_lens = [max(len(str(x)) for x in column) for column in columns] max_len_headers = [max(len(str(header)), max_len) for header, max_len in zip(headers, max_lens)] # Construct the table header header = ( "│ " + " │ ".join(header.ljust(max_len) for header, max_len in zip(headers, max_len_headers)) + " │" ) # Construct the line separator line1 = "┌" + corner.join("─" * (max_len + 2) for max_len in max_len_headers) + "┐" line2 = "└" + corner.join("─" * (max_len + 2) for max_len in max_len_headers) + "┘" # Print the table header vedo.printc(line1, c=c) vedo.printc(header, c=c) vedo.printc(line2, c=c) # Print the data rows for row in zip(*columns): row = ( "│ " + " │ ".join(str(col).ljust(max_len) for col, max_len in zip(row, max_len_headers)) + " │" ) vedo.printc(row, bold=False, c=c) # Print the line separator again to close the table vedo.printc(line2, c=c) def make_bands(inputlist, n): """ Group values of a list into bands of equal value, where `n` is the number of bands, a positive integer > 2. Returns a binned list of the same length as the input. """ if n < 2: return inputlist vmin = np.min(inputlist) vmax = np.max(inputlist) bb = np.linspace(vmin, vmax, n, endpoint=0) dr = bb[1] - bb[0] bb += dr / 2 tol = dr / 2 * 1.001 newlist = [] for s in inputlist: for b in bb: if abs(s - b) < tol: newlist.append(b) break return np.array(newlist) ################################################################# # Functions adapted from: # https://github.com/sdorkenw/MeshParty/blob/master/meshparty/trimesh_vtk.py def camera_from_quaternion(pos, quaternion, distance=10000, ngl_correct=True): """ Define a `vtkCamera` with a particular orientation. Arguments: pos: (np.array, list, tuple) an iterator of length 3 containing the focus point of the camera quaternion: (np.array, list, tuple) a len(4) quaternion `(x,y,z,w)` describing the rotation of the camera such as returned by neuroglancer `x,y,z,w` all in `[0,1]` range distance: (float) the desired distance from pos to the camera (default = 10000 nm) Returns: `vtk.vtkCamera`, a vtk camera setup according to these rules. """ camera = vtk.vtkCamera() # define the quaternion in vtk, note the swapped order # w,x,y,z instead of x,y,z,w quat_vtk = vtk.vtkQuaterniond(quaternion[3], quaternion[0], quaternion[1], quaternion[2]) # use this to define a rotation matrix in x,y,z # right handed units M = np.zeros((3, 3), dtype=np.float32) quat_vtk.ToMatrix3x3(M) # the default camera orientation is y up up = [0, 1, 0] # calculate default camera position is backed off in positive z pos = [0, 0, distance] # set the camera rototation by applying the rotation matrix camera.SetViewUp(*np.dot(M, up)) # set the camera position by applying the rotation matrix camera.SetPosition(*np.dot(M, pos)) if ngl_correct: # neuroglancer has positive y going down # so apply these azimuth and roll corrections # to fix orientatins camera.Azimuth(-180) camera.Roll(180) # shift the camera posiiton and focal position # to be centered on the desired location p = camera.GetPosition() p_new = np.array(p) + pos camera.SetPosition(*p_new) camera.SetFocalPoint(*pos) return camera def camera_from_neuroglancer(state, zoom=300): """ Define a `vtkCamera` from a neuroglancer state dictionary. Arguments: state: (dict) an neuroglancer state dictionary. zoom: (float) how much to multiply zoom by to get camera backoff distance default = 300 > ngl_zoom = 1 > 300 nm backoff distance. Returns: `vtk.vtkCamera`, a vtk camera setup that matches this state. """ orient = state.get("perspectiveOrientation", [0.0, 0.0, 0.0, 1.0]) pzoom = state.get("perspectiveZoom", 10.0) position = state["navigation"]["pose"]["position"] pos_nm = np.array(position["voxelCoordinates"]) * position["voxelSize"] return camera_from_quaternion(pos_nm, orient, pzoom * zoom, ngl_correct=True) def oriented_camera(center=(0, 0, 0), up_vector=(0, 1, 0), backoff_vector=(0, 0, 1), backoff=1.0): """ Generate a `vtkCamera` pointed at a specific location, oriented with a given up direction, set to a backoff. """ vup = np.array(up_vector) vup = vup / np.linalg.norm(vup) pt_backoff = center - backoff * np.array(backoff_vector) camera = vtk.vtkCamera() camera.SetFocalPoint(center[0], center[1], center[2]) camera.SetViewUp(vup[0], vup[1], vup[2]) camera.SetPosition(pt_backoff[0], pt_backoff[1], pt_backoff[2]) return camera def camera_from_dict(camera, modify_inplace=None): """ Generate a `vtkCamera` from a dictionary. """ if modify_inplace: vcam = modify_inplace else: vcam = vtk.vtkCamera() camera = dict(camera) # make a copy so input is not emptied by pop() cm_pos = camera.pop("position", camera.pop("pos", None)) cm_focal_point = camera.pop("focal_point", camera.pop("focalPoint", None)) cm_viewup = camera.pop("viewup", None) cm_distance = camera.pop("distance", None) cm_clipping_range = camera.pop("clipping_range", camera.pop("clippingRange", None)) cm_parallel_scale = camera.pop("parallel_scale", camera.pop("parallelScale", None)) cm_thickness = camera.pop("thickness", None) cm_view_angle = camera.pop("view_angle", camera.pop("viewAngle", None)) if len(camera.keys()) > 0: vedo.logger.warning(f"in camera_from_dict, key(s) not recognized: {camera.keys()}") if cm_pos is not None: vcam.SetPosition(cm_pos) if cm_focal_point is not None: vcam.SetFocalPoint(cm_focal_point) if cm_viewup is not None: vcam.SetViewUp(cm_viewup) if cm_distance is not None: vcam.SetDistance(cm_distance) if cm_clipping_range is not None: vcam.SetClippingRange(cm_clipping_range) if cm_parallel_scale is not None: vcam.SetParallelScale(cm_parallel_scale) if cm_thickness is not None: vcam.SetThickness(cm_thickness) if cm_view_angle is not None: vcam.SetViewAngle(cm_view_angle) return vcam def vtkCameraToK3D(vtkcam): """ Convert a `vtkCamera` object into a 9-element list to be used by the K3D backend. Output format is: `[posx,posy,posz, targetx,targety,targetz, upx,upy,upz]`. """ cpos = np.array(vtkcam.GetPosition()) kam = [cpos.tolist()] kam.append(vtkcam.GetFocalPoint()) kam.append(vtkcam.GetViewUp()) return np.array(kam).ravel() def make_ticks(x0, x1, n=None, labels=None, digits=None, logscale=False, useformat=""): """ Generate numeric labels for the `[x0, x1]` range. The format specifier could be expressed in the format: `:[[fill]align][sign][#][0][width][,][.precision][type]` where, the options are: ``` fill = any character align = < | > | = | ^ sign = + | - | " " width = integer precision = integer type = b | c | d | e | E | f | F | g | G | n | o | s | x | X | % ``` E.g.: useformat=":.2f" """ # Copyright M. Musy, 2021, license: MIT. # # useformat eg: ":.2f", check out: # https://mkaz.blog/code/python-string-format-cookbook/ # https://www.programiz.com/python-programming/methods/built-in/format if x1 <= x0: # vedo.printc("Error in make_ticks(): x0 >= x1", x0,x1, c='r') return np.array([0.0, 1.0]), ["", ""] ticks_str, ticks_float = [], [] baseline = (1, 2, 5, 10, 20, 50) if logscale: if x0 <= 0 or x1 <= 0: vedo.logger.error("make_ticks: zero or negative range with log scale.") raise RuntimeError if n is None: n = int(abs(np.log10(x1) - np.log10(x0))) + 1 x0, x1 = np.log10([x0, x1]) if not n: n = 5 if labels is not None: # user is passing custom labels ticks_float.append(0) ticks_str.append("") for tp, ts in labels: if tp == x1: continue ticks_str.append(str(ts)) tickn = lin_interpolate(tp, [x0, x1], [0, 1]) ticks_float.append(tickn) else: # ..here comes one of the shortest and most painful pieces of code: # automatically choose the best natural axis subdivision based on multiples of 1,2,5 dstep = (x1 - x0) / n # desired step size, begin of the nightmare basestep = pow(10, np.floor(np.log10(dstep))) steps = np.array([basestep * i for i in baseline]) idx = (np.abs(steps - dstep)).argmin() s = steps[idx] # chosen step size low_bound, up_bound = 0, 0 if x0 < 0: low_bound = -pow(10, np.ceil(np.log10(-x0))) if x1 > 0: up_bound = pow(10, np.ceil(np.log10(x1))) if low_bound < 0: if up_bound < 0: negaxis = np.arange(low_bound, int(up_bound / s) * s) else: if -low_bound / s > 1.0e06: return np.array([0.0, 1.0]), ["", ""] negaxis = np.arange(low_bound, 0, s) else: negaxis = np.array([]) if up_bound > 0: if low_bound > 0: posaxis = np.arange(int(low_bound / s) * s, up_bound, s) else: if up_bound / s > 1.0e06: return np.array([0.0, 1.0]), ["", ""] posaxis = np.arange(0, up_bound, s) else: posaxis = np.array([]) fulaxis = np.unique(np.clip(np.concatenate([negaxis, posaxis]), x0, x1)) # end of the nightmare if useformat: sf = "{" + f"{useformat}" + "}" sas = "" for x in fulaxis: sas += sf.format(x) + " " elif digits is None: np.set_printoptions(suppress=True) # avoid zero precision sas = str(fulaxis).replace("[", "").replace("]", "") sas = sas.replace(".e", "e").replace("e+0", "e+").replace("e-0", "e-") np.set_printoptions(suppress=None) # set back to default else: sas = precision(fulaxis, digits, vrange=(x0, x1)) sas = sas.replace("[", "").replace("]", "").replace(")", "").replace(",", "") sas2 = [] for s in sas.split(): if s.endswith("."): s = s[:-1] if s == "-0": s = "0" if digits is not None and "e" in s: s += " " # add space to terminate modifiers sas2.append(s) for ts, tp in zip(sas2, fulaxis): if tp == x1: continue tickn = lin_interpolate(tp, [x0, x1], [0, 1]) ticks_float.append(tickn) if logscale: val = np.power(10, tp) if useformat: sf = "{" + f"{useformat}" + "}" ticks_str.append(sf.format(val)) else: if val >= 10: val = int(val + 0.5) else: val = round_to_digit(val, 2) ticks_str.append(str(val)) else: ticks_str.append(ts) ticks_str.append("") ticks_float.append(1) ticks_float = np.array(ticks_float) return ticks_float, ticks_str def grid_corners(i, nm, size, margin=0, yflip=True): """ Compute the 2 corners coordinates of the i-th box in a grid of shape n*m. The top-left square is square number 1. Arguments: i : (int) input index of the desired grid square (to be used in `show(..., at=...)`). nm : (list) grid shape as (n,m). size : (list) total size of the grid along x and y. margin : (float) keep a small margin between boxes. yflip : (bool) y-coordinate points downwards Returns: Two 2D points representing the bottom-left corner and the top-right corner of the `i`-nth box in the grid. Example: ```python from vedo import * acts=[] n,m = 5,7 for i in range(1, n*m + 1): c1,c2 = utils.grid_corners(i, [n,m], [1,1], 0.01) t = Text3D(i, (c1+c2)/2, c='k', s=0.02, justify='center').z(0.01) r = Rectangle(c1, c2, c=i) acts += [t,r] show(acts, axes=1).close() ``` ![](https://vedo.embl.es/images/feats/grid_corners.png) """ i -= 1 n, m = nm sx, sy = size dx, dy = sx / n, sy / m nx = i % n ny = int((i - nx) / n) if yflip: ny = n - ny c1 = (dx * nx + margin, dy * ny + margin) c2 = (dx * (nx + 1) - margin, dy * (ny + 1) - margin) return np.array(c1), np.array(c2) ############################################################################ # Trimesh support # # Install trimesh with: # # sudo apt install python3-rtree # pip install rtree shapely # conda install trimesh # # Check the example gallery in: examples/other/trimesh> ########################################################################### def vedo2trimesh(mesh): """ Convert `vedo.mesh.Mesh` to `Trimesh.Mesh` object. """ if is_sequence(mesh): tms = [] for a in mesh: tms.append(vedo2trimesh(a)) return tms from trimesh import Trimesh tris = mesh.faces() carr = mesh.celldata["CellIndividualColors"] ccols = carr points = mesh.points() varr = mesh.pointdata["VertexColors"] vcols = varr if len(tris) == 0: tris = None return Trimesh(vertices=points, faces=tris, face_colors=ccols, vertex_colors=vcols) def trimesh2vedo(inputobj): """ Convert a `Trimesh` object to `vedo.Mesh` or `vedo.Assembly` object. """ if is_sequence(inputobj): vms = [] for ob in inputobj: vms.append(trimesh2vedo(ob)) return vms inputobj_type = str(type(inputobj)) if "Trimesh" in inputobj_type or "primitives" in inputobj_type: faces = inputobj.faces poly = buildPolyData(inputobj.vertices, faces) tact = vedo.Mesh(poly) if inputobj.visual.kind == "face": trim_c = inputobj.visual.face_colors else: trim_c = inputobj.visual.vertex_colors if is_sequence(trim_c): if is_sequence(trim_c[0]): same_color = len(np.unique(trim_c, axis=0)) < 2 # all vtxs have same color if same_color: tact.c(trim_c[0, [0, 1, 2]]).alpha(trim_c[0, 3]) else: if inputobj.visual.kind == "face": tact.cell_individual_colors(trim_c) return tact if "PointCloud" in inputobj_type: trim_cc, trim_al = "black", 1 if hasattr(inputobj, "vertices_color"): trim_c = inputobj.vertices_color if len(trim_c) > 0: trim_cc = trim_c[:, [0, 1, 2]] / 255 trim_al = trim_c[:, 3] / 255 trim_al = np.sum(trim_al) / len(trim_al) # just the average return vedo.shapes.Points(inputobj.vertices, r=8, c=trim_cc, alpha=trim_al) if "path" in inputobj_type: lines = [] for e in inputobj.entities: # print('trimesh entity', e.to_dict()) l = vedo.shapes.Line(inputobj.vertices[e.points], c="k", lw=2) lines.append(l) return vedo.Assembly(lines) return None def vedo2meshlab(vmesh): """Convert a `vedo.Mesh` to a Meshlab object.""" try: import pymeshlab as mlab except RuntimeError: vedo.logger.error("Need pymeshlab to run:\npip install pymeshlab") vertex_matrix = vmesh.points().astype(np.float64) try: face_matrix = np.asarray(vmesh.faces(), dtype=np.float64) except: print("In vedo2meshlab, need to triangulate mesh first!") face_matrix = np.array(vmesh.clone().triangulate().faces(), dtype=np.float64) v_normals_matrix = vmesh.normals(cells=False, recompute=False) if not v_normals_matrix.shape[0]: v_normals_matrix = np.empty((0, 3), dtype=np.float64) f_normals_matrix = vmesh.normals(cells=True, recompute=False) if not f_normals_matrix.shape[0]: f_normals_matrix = np.empty((0, 3), dtype=np.float64) v_color_matrix = vmesh.pointdata["RGBA"] if v_color_matrix is None: v_color_matrix = np.empty((0, 4), dtype=np.float64) else: v_color_matrix = v_color_matrix.astype(np.float64) / 255 if v_color_matrix.shape[1] == 3: v_color_matrix = np.c_[ v_color_matrix, np.ones(v_color_matrix.shape[0], dtype=np.float64) ] f_color_matrix = vmesh.celldata["RGBA"] if f_color_matrix is None: f_color_matrix = np.empty((0, 4), dtype=np.float64) else: f_color_matrix = f_color_matrix.astype(np.float64) / 255 if f_color_matrix.shape[1] == 3: f_color_matrix = np.c_[ f_color_matrix, np.ones(f_color_matrix.shape[0], dtype=np.float64) ] m = mlab.Mesh( vertex_matrix=vertex_matrix, face_matrix=face_matrix, v_normals_matrix=v_normals_matrix, f_normals_matrix=f_normals_matrix, v_color_matrix=v_color_matrix, f_color_matrix=f_color_matrix, ) for k in vmesh.pointdata.keys(): data = vmesh.pointdata[k] if data is not None: if data.ndim == 1: # scalar m.add_vertex_custom_scalar_attribute(data.astype(np.float64), k) elif data.ndim == 2: # vectorial data m.add_vertex_custom_point_attribute(data.astype(np.float64), k) for k in vmesh.celldata.keys(): data = vmesh.celldata[k] if data is not None: if data.ndim == 1: # scalar m.add_face_custom_scalar_attribute(data.astype(np.float64), k) elif data.ndim == 2: # vectorial data m.add_face_custom_point_attribute(data.astype(np.float64), k) m.update_bounding_box() return m def meshlab2vedo(mmesh): """Convert a Meshlab object to `vedo.Mesh`.""" inputtype = str(type(mmesh)) if "MeshSet" in inputtype: mmesh = mmesh.current_mesh() mpoints, mcells = mmesh.vertex_matrix(), mmesh.face_matrix() if len(mcells) > 0: polydata = buildPolyData(mpoints, mcells) else: polydata = buildPolyData(mpoints, None) if mmesh.has_vertex_scalar(): parr = mmesh.vertex_scalar_array() parr_vtk = numpy_to_vtk(parr) parr_vtk.SetName("MeshLabScalars") x0, x1 = parr_vtk.GetRange() if x1 - x0: polydata.GetPointData().AddArray(parr_vtk) polydata.GetPointData().SetActiveScalars("MeshLabScalars") if mmesh.has_face_scalar(): carr = mmesh.face_scalar_array() carr_vtk = numpy_to_vtk(carr) carr_vtk.SetName("MeshLabScalars") x0, x1 = carr_vtk.GetRange() if x1 - x0: polydata.GetCellData().AddArray(carr_vtk) polydata.GetCellData().SetActiveScalars("MeshLabScalars") pnorms = mmesh.vertex_normal_matrix() if len(pnorms) > 0: polydata.GetPointData().SetNormals(numpy2vtk(pnorms)) cnorms = mmesh.face_normal_matrix() if len(cnorms) > 0: polydata.GetCellData().SetNormals(numpy2vtk(cnorms)) return polydata def open3d2vedo(o3d_mesh): """Convert `open3d.geometry.TriangleMesh` to a `vedo.Mesh`.""" m = vedo.Mesh([np.array(o3d_mesh.vertices), np.array(o3d_mesh.triangles)]) # TODO: could also check whether normals and color are present in # order to port with the above vertices/faces return m def vedo2open3d(vedo_mesh): """ Return an `open3d.geometry.TriangleMesh` version of the current mesh. """ try: import open3d as o3d except RuntimeError: vedo.logger.error("Need open3d to run:\npip install open3d") # create from numpy arrays o3d_mesh = o3d.geometry.TriangleMesh( vertices=o3d.utility.Vector3dVector(vedo_mesh.points()), triangles=o3d.utility.Vector3iVector(vedo_mesh.faces()), ) # TODO: need to add some if check here in case color and normals # info are not existing # o3d_mesh.vertex_colors = o3d.utility.Vector3dVector(vedo_mesh.pointdata["RGB"]/255) # o3d_mesh.vertex_normals= o3d.utility.Vector3dVector(vedo_mesh.pointdata["Normals"]) return o3d_mesh def vtk_version_at_least(major, minor=0, build=0): """ Check the installed VTK version. Return `True` if the requested VTK version is greater or equal to the actual VTK version. Arguments: major : (int) Major version. minor : (int) Minor version. build : (int) Build version. """ needed_version = 10000000000 * int(major) + 100000000 * int(minor) + int(build) try: vtk_version_number = vtk.VTK_VERSION_NUMBER except AttributeError: # as error: ver = vtk.vtkVersion() vtk_version_number = ( 10000000000 * ver.GetVTKMajorVersion() + 100000000 * ver.GetVTKMinorVersion() + ver.GetVTKBuildVersion() ) return vtk_version_number >= needed_version def ctf2lut(tvobj, logscale=False): """Internal use.""" # build LUT from a color transfer function for tmesh or volume pr = tvobj.GetProperty() if not isinstance(pr, vtk.vtkVolumeProperty): return None ctf = pr.GetRGBTransferFunction() otf = pr.GetScalarOpacity() x0, x1 = tvobj.inputdata().GetScalarRange() cols, alphas = [], [] for x in np.linspace(x0, x1, 256): cols.append(ctf.GetColor(x)) alphas.append(otf.GetValue(x)) if logscale: lut = vtk.vtkLogLookupTable() else: lut = vtk.vtkLookupTable() lut.SetRange(x0, x1) lut.SetNumberOfTableValues(len(cols)) for i, col in enumerate(cols): r, g, b = col lut.SetTableValue(i, r, g, b, alphas[i]) lut.Build() return lut vedo-2023.4.6/vedo/version.py000066400000000000000000000000261444463326400157110ustar00rootroot00000000000000_version = '2023.4.6' vedo-2023.4.6/vedo/volume.py000066400000000000000000001707441444463326400155520ustar00rootroot00000000000000import glob import os from deprecated import deprecated import numpy as np try: import vedo.vtkclasses as vtk except ImportError: import vtkmodules.all as vtk import vedo from vedo import utils from vedo.base import Base3DProp from vedo.base import BaseGrid from vedo.mesh import Mesh __docformat__ = "google" __doc__ = """ Work with volumetric datasets (voxel data). ![](https://vedo.embl.es/images/volumetric/slicePlane2.png) """ __all__ = ["BaseVolume", "Volume", "VolumeSlice"] ########################################################################## class BaseVolume: """ Base class. Do not instantiate. """ def __init__(self): """Base class. Do not instantiate.""" self._data = None self._mapper = None self.transform = None self.pipeline = None def _repr_html_(self): """ HTML representation of the Volume object for Jupyter Notebooks. Returns: HTML text with the image and some properties. """ import io import base64 from PIL import Image library_name = "vedo.volume.Volume" help_url = "https://vedo.embl.es/docs/vedo/volume.html" arr = self.thumbnail(azimuth=0, elevation=-60, zoom=1.4, axes=True) im = Image.fromarray(arr) buffered = io.BytesIO() im.save(buffered, format="PNG", quality=100) encoded = base64.b64encode(buffered.getvalue()).decode("utf-8") url = "data:image/png;base64," + encoded image = f"" # statisitics bounds = "
".join( [ utils.precision(min_x, 4) + " ... " + utils.precision(max_x, 4) for min_x, max_x in zip(self.bounds()[::2], self.bounds()[1::2]) ] ) help_text = "" if self.name: help_text += f" {self.name}:   " help_text += '' + library_name + "" if self.filename: dots = "" if len(self.filename) > 30: dots = "..." help_text += f"
({dots}{self.filename[-30:]})" pdata = "" if self._data.GetPointData().GetScalars(): if self._data.GetPointData().GetScalars().GetName(): name = self._data.GetPointData().GetScalars().GetName() pdata = " point data array " + name + "" cdata = "" if self._data.GetCellData().GetScalars(): if self._data.GetCellData().GetScalars().GetName(): name = self._data.GetCellData().GetScalars().GetName() cdata = " voxel data array " + name + "" img = self.GetMapper().GetInput() allt = [ "", "", "", "
", image, "
", help_text, "", "", "", "", "", pdata, cdata, "", "
bounds
(x/y/z)
" + str(bounds) + "
dimensions " + str(img.GetDimensions()) + "
voxel spacing " + utils.precision(img.GetSpacing(), 3) + "
in memory size " + str(int(img.GetActualMemorySize() / 1024)) + "MB
scalar range " + utils.precision(img.GetScalarRange(), 4) + "
", "
", ] return "\n".join(allt) def _update(self, img): self._data = img self._data.GetPointData().Modified() self._mapper.SetInputData(img) self._mapper.Modified() self._mapper.Update() return self def clone(self): """Return a clone copy of the Volume.""" newimg = vtk.vtkImageData() newimg.CopyStructure(self._data) newimg.CopyAttributes(self._data) newvol = Volume(newimg) prop = vtk.vtkVolumeProperty() prop.DeepCopy(self.GetProperty()) newvol.SetProperty(prop) newvol.SetOrigin(self.GetOrigin()) newvol.SetScale(self.GetScale()) newvol.SetOrientation(self.GetOrientation()) newvol.SetPosition(self.GetPosition()) newvol.pipeline = utils.OperationNode("clone", parents=[self], c="#bbd0ff", shape="diamond") return newvol def imagedata(self): """Return the underlying `vtkImagaData` object.""" return self._data def tonumpy(self): """ Get read-write access to voxels of a Volume object as a numpy array. When you set values in the output image, you don't want numpy to reallocate the array but instead set values in the existing array, so use the [:] operator. Example: `arr[:] = arr*2 + 15` If the array is modified add a call to: `volume.imagedata().GetPointData().GetScalars().Modified()` when all your modifications are completed. """ narray_shape = tuple(reversed(self._data.GetDimensions())) scals = self._data.GetPointData().GetScalars() comps = scals.GetNumberOfComponents() if comps == 1: narray = utils.vtk2numpy(scals).reshape(narray_shape) narray = np.transpose(narray, axes=[2, 1, 0]) else: narray = utils.vtk2numpy(scals).reshape(*narray_shape, comps) narray = np.transpose(narray, axes=[2, 1, 0, 3]) # narray = utils.vtk2numpy(self._data.GetPointData().GetScalars()).reshape(narray_shape) # narray = np.transpose(narray, axes=[2, 1, 0]) return narray def dimensions(self): """Return the nr. of voxels in the 3 dimensions.""" return np.array(self._data.GetDimensions()) @deprecated(reason=vedo.colors.red + "Please use scalar_range()" + vedo.colors.reset) def scalarRange(self): "Deprecated. Please use `scalar_range()`." return self.scalar_range() def scalar_range(self): """Return the range of the scalar values.""" return np.array(self._data.GetScalarRange()) def spacing(self, s=None): """Set/get the voxels size in the 3 dimensions.""" if s is not None: self._data.SetSpacing(s) return self return np.array(self._data.GetSpacing()) # def pos(self, p=None): # conflicts with API of base.x() # """Same effect as calling `origin()`.""" # return self.origin(p) def origin(self, s=None): """Set/get the origin of the volumetric dataset.""" ### supersedes base.origin() ### DIFFERENT from base.origin()! if s is not None: self._data.SetOrigin(s) return self return np.array(self._data.GetOrigin()) def center(self, p=None): """Set/get the center of the volumetric dataset.""" if p is not None: self._data.SetCenter(p) return self return np.array(self._data.GetCenter()) def permute_axes(self, x, y, z): """ Reorder the axes of the Volume by specifying the input axes which are supposed to become the new X, Y, and Z. """ imp = vtk.vtkImagePermute() imp.SetFilteredAxes(x, y, z) imp.SetInputData(self.imagedata()) imp.Update() self._update(imp.GetOutput()) self.pipeline = utils.OperationNode( f"permute_axes\n{(x,y,z)}", parents=[self], c="#4cc9f0" ) return self def resample(self, new_spacing, interpolation=1): """ Resamples a `Volume` to be larger or smaller. This method modifies the spacing of the input. Linear interpolation is used to resample the data. Arguments: new_spacing : (list) a list of 3 new spacings for the 3 axes interpolation : (int) 0=nearest_neighbor, 1=linear, 2=cubic """ rsp = vtk.vtkImageResample() oldsp = self.spacing() for i in range(3): if oldsp[i] != new_spacing[i]: rsp.SetAxisOutputSpacing(i, new_spacing[i]) rsp.InterpolateOn() rsp.SetInterpolationMode(interpolation) rsp.OptimizationOn() rsp.Update() self._update(rsp.GetOutput()) self.pipeline = utils.OperationNode( f"resample\n{tuple(new_spacing)}", parents=[self], c="#4cc9f0" ) return self def interpolation(self, itype): """ Set interpolation type. 0=nearest neighbour, 1=linear """ self.property.SetInterpolationType(itype) return self def threshold(self, above=None, below=None, replace=None, replace_value=None): """ Binary or continuous volume thresholding. Find the voxels that contain a value above/below the input values and replace them with a new value (default is 0). """ th = vtk.vtkImageThreshold() th.SetInputData(self.imagedata()) # sanity checks if above is not None and below is not None: if above == below: return self if above > below: vedo.logger.warning("in volume.threshold(), above > below, skip.") return self ## cases if below is not None and above is not None: th.ThresholdBetween(above, below) elif above is not None: th.ThresholdByUpper(above) elif below is not None: th.ThresholdByLower(below) ## if replace is not None: th.SetReplaceIn(True) th.SetInValue(replace) else: th.SetReplaceIn(False) if replace_value is not None: th.SetReplaceOut(True) th.SetOutValue(replace_value) else: th.SetReplaceOut(False) th.Update() self._update(th.GetOutput()) self.pipeline = utils.OperationNode("threshold", parents=[self], c="#4cc9f0") return self def crop(self, left=None, right=None, back=None, front=None, bottom=None, top=None, VOI=()): """ Crop a `Volume` object. Arguments: left : (float) fraction to crop from the left plane (negative x) right : (float) fraction to crop from the right plane (positive x) back : (float) fraction to crop from the back plane (negative y) front : (float) fraction to crop from the front plane (positive y) bottom : (float) fraction to crop from the bottom plane (negative z) top : (float) fraction to crop from the top plane (positive z) VOI : (list) extract Volume Of Interest expressed in voxel numbers Example: `vol.crop(VOI=(xmin, xmax, ymin, ymax, zmin, zmax)) # all integers nrs` """ extractVOI = vtk.vtkExtractVOI() extractVOI.SetInputData(self.imagedata()) if VOI: extractVOI.SetVOI(VOI) else: d = self.imagedata().GetDimensions() bx0, bx1, by0, by1, bz0, bz1 = 0, d[0]-1, 0, d[1]-1, 0, d[2]-1 if left is not None: bx0 = int((d[0]-1)*left) if right is not None: bx1 = int((d[0]-1)*(1-right)) if back is not None: by0 = int((d[1]-1)*back) if front is not None: by1 = int((d[1]-1)*(1-front)) if bottom is not None: bz0 = int((d[2]-1)*bottom) if top is not None: bz1 = int((d[2]-1)*(1-top)) extractVOI.SetVOI(bx0, bx1, by0, by1, bz0, bz1) extractVOI.Update() self._update(extractVOI.GetOutput()) self.pipeline = utils.OperationNode( "crop", parents=[self], c="#4cc9f0", comment=f"dims={tuple(self.dimensions())}" ) return self def append(self, volumes, axis="z", preserve_extents=False): """ Take the components from multiple inputs and merges them into one output. Except for the append axis, all inputs must have the same extent. All inputs must have the same number of scalar components. The output has the same origin and spacing as the first input. The origin and spacing of all other inputs are ignored. All inputs must have the same scalar type. Arguments: axis : (int, str) axis expanded to hold the multiple images preserve_extents : (bool) if True, the extent of the inputs is used to place the image in the output. The whole extent of the output is the union of the input whole extents. Any portion of the output not covered by the inputs is set to zero. The origin and spacing is taken from the first input. Example: ```python from vedo import Volume, dataurl vol = Volume(dataurl+'embryo.tif') vol.append(vol, axis='x').show().close() ``` ![](https://vedo.embl.es/images/feats/volume_append.png) """ ima = vtk.vtkImageAppend() ima.SetInputData(self.imagedata()) if not utils.is_sequence(volumes): volumes = [volumes] for volume in volumes: if isinstance(volume, vtk.vtkImageData): ima.AddInputData(volume) else: ima.AddInputData(volume.imagedata()) ima.SetPreserveExtents(preserve_extents) if axis == "x": axis = 0 elif axis == "y": axis = 1 elif axis == "z": axis = 2 ima.SetAppendAxis(axis) ima.Update() self._update(ima.GetOutput()) self.pipeline = utils.OperationNode( "append", parents=[self, *volumes], c="#4cc9f0", comment=f"dims={tuple(self.dimensions())}", ) return self def pad(self, voxels=10, value=0): """ Add the specified number of voxels at the `Volume` borders. Voxels can be a list formatted as `[nx0, nx1, ny0, ny1, nz0, nz1]`. Arguments: voxels : (int, list) number of voxels to be added (or a list of length 4) value : (int) intensity value (gray-scale color) of the padding Example: ```python from vedo import Volume, dataurl, show iso = Volume(dataurl+'embryo.tif').isosurface() vol = iso.binarize(spacing=(100, 100, 100)).pad(10) vol.dilate([15,15,15]) show(iso, vol.isosurface(), N=2, axes=1) ``` ![](https://vedo.embl.es/images/volumetric/volume_pad.png) """ x0, x1, y0, y1, z0, z1 = self._data.GetExtent() pf = vtk.vtkImageConstantPad() pf.SetInputData(self._data) pf.SetConstant(value) if utils.is_sequence(voxels): pf.SetOutputWholeExtent( x0 - voxels[0], x1 + voxels[1], y0 - voxels[2], y1 + voxels[3], z0 - voxels[4], z1 + voxels[5], ) else: pf.SetOutputWholeExtent( x0 - voxels, x1 + voxels, y0 - voxels, y1 + voxels, z0 - voxels, z1 + voxels, ) pf.Update() self._update(pf.GetOutput()) self.pipeline = utils.OperationNode( "pad", comment=f"{voxels} voxels", parents=[self], c="#f28482" ) return self def resize(self, *newdims): """Increase or reduce the number of voxels of a Volume with interpolation.""" old_dims = np.array(self.imagedata().GetDimensions()) old_spac = np.array(self.imagedata().GetSpacing()) rsz = vtk.vtkImageResize() rsz.SetResizeMethodToOutputDimensions() rsz.SetInputData(self.imagedata()) rsz.SetOutputDimensions(newdims) rsz.Update() self._data = rsz.GetOutput() new_spac = old_spac * old_dims / newdims # keep aspect ratio self._data.SetSpacing(new_spac) self._update(self._data) self.pipeline = utils.OperationNode( "resize", parents=[self], c="#4cc9f0", comment=f"dims={tuple(self.dimensions())}" ) return self def normalize(self): """Normalize that scalar components for each point.""" norm = vtk.vtkImageNormalize() norm.SetInputData(self.imagedata()) norm.Update() self._update(norm.GetOutput()) self.pipeline = utils.OperationNode("normalize", parents=[self], c="#4cc9f0") return self def mirror(self, axis="x"): """ Mirror flip along one of the cartesian axes. """ img = self.imagedata() ff = vtk.vtkImageFlip() ff.SetInputData(img) if axis.lower() == "x": ff.SetFilteredAxis(0) elif axis.lower() == "y": ff.SetFilteredAxis(1) elif axis.lower() == "z": ff.SetFilteredAxis(2) else: vedo.logger.error("mirror must be set to either x, y, z or n") raise RuntimeError() ff.Update() self._update(ff.GetOutput()) self.pipeline = utils.OperationNode(f"mirror {axis}", parents=[self], c="#4cc9f0") return self def operation(self, operation, volume2=None): """ Perform operations with `Volume` objects. Keyword `volume2` can be a constant float. Possible operations are: ``` +, -, /, 1/x, sin, cos, exp, log, abs, **2, sqrt, min, max, atan, atan2, median, mag, dot, gradient, divergence, laplacian. ``` Examples: - [volume_operations.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/volume_operations.py) """ op = operation.lower() image1 = self._data mf = None if op in ["median"]: mf = vtk.vtkImageMedian3D() mf.SetInputData(image1) elif op in ["mag"]: mf = vtk.vtkImageMagnitude() mf.SetInputData(image1) elif op in ["dot", "dotproduct"]: mf = vtk.vtkImageDotProduct() mf.SetInput1Data(image1) mf.SetInput2Data(volume2.imagedata()) elif op in ["grad", "gradient"]: mf = vtk.vtkImageGradient() mf.SetDimensionality(3) mf.SetInputData(image1) elif op in ["div", "divergence"]: mf = vtk.vtkImageDivergence() mf.SetInputData(image1) elif op in ["laplacian"]: mf = vtk.vtkImageLaplacian() mf.SetDimensionality(3) mf.SetInputData(image1) if mf is not None: mf.Update() vol = Volume(mf.GetOutput()) vol.pipeline = utils.OperationNode( f"operation\n{op}", parents=[self], c="#4cc9f0", shape="cylinder" ) return vol ########################### mat = vtk.vtkImageMathematics() mat.SetInput1Data(image1) K = None if utils.is_number(volume2): K = volume2 mat.SetConstantK(K) mat.SetConstantC(K) elif volume2 is not None: # assume image2 is a constant value mat.SetInput2Data(volume2.imagedata()) # ########################### if op in ["+", "add", "plus"]: if K: mat.SetOperationToAddConstant() else: mat.SetOperationToAdd() elif op in ["-", "subtract", "minus"]: if K: mat.SetConstantC(-float(K)) mat.SetOperationToAddConstant() else: mat.SetOperationToSubtract() elif op in ["*", "multiply", "times"]: if K: mat.SetOperationToMultiplyByK() else: mat.SetOperationToMultiply() elif op in ["/", "divide"]: if K: mat.SetConstantK(1.0 / K) mat.SetOperationToMultiplyByK() else: mat.SetOperationToDivide() elif op in ["1/x", "invert"]: mat.SetOperationToInvert() elif op in ["sin"]: mat.SetOperationToSin() elif op in ["cos"]: mat.SetOperationToCos() elif op in ["exp"]: mat.SetOperationToExp() elif op in ["log"]: mat.SetOperationToLog() elif op in ["abs"]: mat.SetOperationToAbsoluteValue() elif op in ["**2", "square"]: mat.SetOperationToSquare() elif op in ["sqrt", "sqr"]: mat.SetOperationToSquareRoot() elif op in ["min"]: mat.SetOperationToMin() elif op in ["max"]: mat.SetOperationToMax() elif op in ["atan"]: mat.SetOperationToATAN() elif op in ["atan2"]: mat.SetOperationToATAN2() else: vedo.logger.error(f"unknown operation {operation}") raise RuntimeError() mat.Update() self._update(mat.GetOutput()) self.pipeline = utils.OperationNode( f"operation\n{op}", parents=[self, volume2], shape="cylinder", c="#4cc9f0" ) return self def frequency_pass_filter(self, low_cutoff=None, high_cutoff=None, order=1): """ Low-pass and high-pass filtering become trivial in the frequency domain. A portion of the pixels/voxels are simply masked or attenuated. This function applies a high pass Butterworth filter that attenuates the frequency domain image. The gradual attenuation of the filter is important. A simple high-pass filter would simply mask a set of pixels in the frequency domain, but the abrupt transition would cause a ringing effect in the spatial domain. Arguments: low_cutoff : (list) the cutoff frequencies for x, y and z high_cutoff : (list) the cutoff frequencies for x, y and z order : (int) order determines sharpness of the cutoff curve """ # https://lorensen.github.io/VTKExamples/site/Cxx/ImageProcessing/IdealHighPass fft = vtk.vtkImageFFT() fft.SetInputData(self._data) fft.Update() out = fft.GetOutput() if high_cutoff: blp = vtk.vtkImageButterworthLowPass() blp.SetInputData(out) blp.SetCutOff(high_cutoff) blp.SetOrder(order) blp.Update() out = blp.GetOutput() if low_cutoff: bhp = vtk.vtkImageButterworthHighPass() bhp.SetInputData(out) bhp.SetCutOff(low_cutoff) bhp.SetOrder(order) bhp.Update() out = bhp.GetOutput() rfft = vtk.vtkImageRFFT() rfft.SetInputData(out) rfft.Update() ecomp = vtk.vtkImageExtractComponents() ecomp.SetInputData(rfft.GetOutput()) ecomp.SetComponents(0) ecomp.Update() self._update(ecomp.GetOutput()) self.pipeline = utils.OperationNode("frequency_pass_filter", parents=[self], c="#4cc9f0") return self def smooth_gaussian(self, sigma=(2, 2, 2), radius=None): """ Performs a convolution of the input Volume with a gaussian. Arguments: sigma : (float, list) standard deviation(s) in voxel units. A list can be given to smooth in the three direction differently. radius : (float, list) radius factor(s) determine how far out the gaussian kernel will go before being clamped to zero. A list can be given too. """ gsf = vtk.vtkImageGaussianSmooth() gsf.SetDimensionality(3) gsf.SetInputData(self.imagedata()) if utils.is_sequence(sigma): gsf.SetStandardDeviations(sigma) else: gsf.SetStandardDeviation(sigma) if radius is not None: if utils.is_sequence(radius): gsf.SetRadiusFactors(radius) else: gsf.SetRadiusFactor(radius) gsf.Update() self._update(gsf.GetOutput()) self.pipeline = utils.OperationNode("smooth_gaussian", parents=[self], c="#4cc9f0") return self def smooth_median(self, neighbours=(2, 2, 2)): """ Median filter that replaces each pixel with the median value from a rectangular neighborhood around that pixel. """ imgm = vtk.vtkImageMedian3D() imgm.SetInputData(self.imagedata()) if utils.is_sequence(neighbours): imgm.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) else: imgm.SetKernelSize(neighbours, neighbours, neighbours) imgm.Update() self._update(imgm.GetOutput()) self.pipeline = utils.OperationNode("smooth_median", parents=[self], c="#4cc9f0") return self def erode(self, neighbours=(2, 2, 2)): """ Replace a voxel with the minimum over an ellipsoidal neighborhood of voxels. If `neighbours` of an axis is 1, no processing is done on that axis. Examples: - [erode_dilate.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/erode_dilate.py) ![](https://vedo.embl.es/images/volumetric/erode_dilate.png) """ ver = vtk.vtkImageContinuousErode3D() ver.SetInputData(self._data) ver.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) ver.Update() self._update(ver.GetOutput()) self.pipeline = utils.OperationNode("erode", parents=[self], c="#4cc9f0") return self def dilate(self, neighbours=(2, 2, 2)): """ Replace a voxel with the maximum over an ellipsoidal neighborhood of voxels. If `neighbours` of an axis is 1, no processing is done on that axis. Check also `erode()` and `pad()`. Examples: - [erode_dilate.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/erode_dilate.py) """ ver = vtk.vtkImageContinuousDilate3D() ver.SetInputData(self._data) ver.SetKernelSize(neighbours[0], neighbours[1], neighbours[2]) ver.Update() self._update(ver.GetOutput()) self.pipeline = utils.OperationNode("dilate", parents=[self], c="#4cc9f0") return self def magnitude(self): """Colapses components with magnitude function.""" imgm = vtk.vtkImageMagnitude() imgm.SetInputData(self.imagedata()) imgm.Update() self._update(imgm.GetOutput()) self.pipeline = utils.OperationNode("magnitude", parents=[self], c="#4cc9f0") return self def topoints(self): """ Extract all image voxels as points. This function takes an input `Volume` and creates an `Mesh` that contains the points and the point attributes. Examples: - [vol2points.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/vol2points.py) """ v2p = vtk.vtkImageToPoints() v2p.SetInputData(self.imagedata()) v2p.Update() mpts = vedo.Points(v2p.GetOutput()) mpts.pipeline = utils.OperationNode("topoints", parents=[self], c="#4cc9f0:#e9c46a") return mpts def euclidean_distance(self, anisotropy=False, max_distance=None): """ Implementation of the Euclidean DT (Distance Transform) using Saito's algorithm. The distance map produced contains the square of the Euclidean distance values. The algorithm has a O(n^(D+1)) complexity over n x n x...x n images in D dimensions. Check out also: https://en.wikipedia.org/wiki/Distance_transform Arguments: anisotropy : bool used to define whether Spacing should be used in the computation of the distances. max_distance : bool any distance bigger than max_distance will not be computed but set to this specified value instead. Examples: - [euclidian_dist.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/euclidian_dist.py) """ euv = vtk.vtkImageEuclideanDistance() euv.SetInputData(self._data) euv.SetConsiderAnisotropy(anisotropy) if max_distance is not None: euv.InitializeOn() euv.SetMaximumDistance(max_distance) euv.SetAlgorithmToSaito() euv.Update() vol = Volume(euv.GetOutput()) vol.pipeline = utils.OperationNode("euclidean_distance", parents=[self], c="#4cc9f0") return vol def correlation_with(self, vol2, dim=2): """ Find the correlation between two volumetric data sets. Keyword `dim` determines whether the correlation will be 3D, 2D or 1D. The default is a 2D Correlation. The output size will match the size of the first input. The second input is considered the correlation kernel. """ imc = vtk.vtkImageCorrelation() imc.SetInput1Data(self._data) imc.SetInput2Data(vol2.imagedata()) imc.SetDimensionality(dim) imc.Update() vol = Volume(imc.GetOutput()) vol.pipeline = utils.OperationNode("correlation_with", parents=[self, vol2], c="#4cc9f0") return vol def scale_voxels(self, scale=1): """Scale the voxel content by factor `scale`.""" rsl = vtk.vtkImageReslice() rsl.SetInputData(self.imagedata()) rsl.SetScalarScale(scale) rsl.Update() self._update(rsl.GetOutput()) self.pipeline = utils.OperationNode( f"scale_voxels\nscale={scale}", parents=[self], c="#4cc9f0" ) return self ########################################################################## class Volume(BaseVolume, BaseGrid, vtk.vtkVolume): """ Class to describe dataset that are defined on "voxels": the 3D equivalent of 2D pixels. """ def __init__( self, inputobj=None, c="RdBu_r", alpha=(0.0, 0.0, 0.2, 0.4, 0.8, 1.0), alpha_gradient=None, alpha_unit=1, mode=0, spacing=None, dims=None, origin=None, mapper="smart", ): """ This class can be initialized with a numpy object, a `vtkImageData` or a list of 2D bmp files. Arguments: c : (list, str) sets colors along the scalar range, or a matplotlib color map name alphas : (float, list) sets transparencies along the scalar range alpha_unit : (float) low values make composite rendering look brighter and denser origin : (list) set volume origin coordinates spacing : (list) voxel dimensions in x, y and z. dims : (list) specify the dimensions of the volume. mapper : (str) either 'gpu', 'opengl_gpu', 'fixed' or 'smart' mode : (int) define the volumetric rendering style: - 0, composite rendering - 1, maximum projection - 2, minimum projection - 3, average projection - 4, additive mode
The default mode is "composite" where the scalar values are sampled through the volume and composited in a front-to-back scheme through alpha blending. The final color and opacity is determined using the color and opacity transfer functions specified in alpha keyword. Maximum and minimum intensity blend modes use the maximum and minimum scalar values, respectively, along the sampling ray. The final color and opacity is determined by passing the resultant value through the color and opacity transfer functions. Additive blend mode accumulates scalar values by passing each value through the opacity transfer function and then adding up the product of the value and its opacity. In other words, the scalar values are scaled using the opacity transfer function and summed to derive the final color. Note that the resulting image is always grayscale i.e. aggregated values are not passed through the color transfer function. This is because the final value is a derived value and not a real data value along the sampling ray. Average intensity blend mode works similar to the additive blend mode where the scalar values are multiplied by opacity calculated from the opacity transfer function and then added. The additional step here is to divide the sum by the number of samples taken through the volume. As is the case with the additive intensity projection, the final image will always be grayscale i.e. the aggregated values are not passed through the color transfer function. Example: ```python from vedo import Volume vol = Volume("path/to/mydata/rec*.bmp") vol.show() ``` Examples: - [numpy2volume1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/numpy2volume1.py) ![](https://vedo.embl.es/images/volumetric/numpy2volume1.png) - [read_volume2.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/read_volume2.py) ![](https://vedo.embl.es/images/volumetric/read_volume2.png) .. note:: if a `list` of values is used for `alphas` this is interpreted as a transfer function along the range of the scalar. """ vtk.vtkVolume.__init__(self) BaseGrid.__init__(self) BaseVolume.__init__(self) # super().__init__() ################### if isinstance(inputobj, str): if "https://" in inputobj: inputobj = vedo.file_io.download(inputobj, verbose=False) # fpath elif os.path.isfile(inputobj): pass else: inputobj = sorted(glob.glob(inputobj)) ################### if "gpu" in mapper: self._mapper = vtk.vtkGPUVolumeRayCastMapper() elif "opengl_gpu" in mapper: self._mapper = vtk.vtkOpenGLGPUVolumeRayCastMapper() elif "smart" in mapper: self._mapper = vtk.vtkSmartVolumeMapper() elif "fixed" in mapper: self._mapper = vtk.vtkFixedPointVolumeRayCastMapper() elif isinstance(mapper, vtk.vtkMapper): self._mapper = mapper else: print("Error unknown mapper type", [mapper]) raise RuntimeError() self.SetMapper(self._mapper) ################### inputtype = str(type(inputobj)) # print('Volume inputtype', inputtype, c='b') if inputobj is None: img = vtk.vtkImageData() elif utils.is_sequence(inputobj): if isinstance(inputobj[0], str) and ".bmp" in inputobj[0].lower(): # scan sequence of BMP files ima = vtk.vtkImageAppend() ima.SetAppendAxis(2) pb = utils.ProgressBar(0, len(inputobj)) for i in pb.range(): f = inputobj[i] if "_rec_spr.bmp" in f: continue picr = vtk.vtkBMPReader() picr.SetFileName(f) picr.Update() mgf = vtk.vtkImageMagnitude() mgf.SetInputData(picr.GetOutput()) mgf.Update() ima.AddInputData(mgf.GetOutput()) pb.print("loading...") ima.Update() img = ima.GetOutput() else: if len(inputobj.shape) == 1: varr = utils.numpy2vtk(inputobj) else: varr = utils.numpy2vtk(inputobj.ravel(order="F")) varr.SetName("input_scalars") img = vtk.vtkImageData() if dims is not None: img.SetDimensions(dims[2], dims[1], dims[0]) else: if len(inputobj.shape) == 1: vedo.logger.error("must set dimensions (dims keyword) in Volume") raise RuntimeError() img.SetDimensions(inputobj.shape) img.GetPointData().AddArray(varr) img.GetPointData().SetActiveScalars(varr.GetName()) elif "ImageData" in inputtype: img = inputobj elif isinstance(inputobj, Volume): img = inputobj.inputdata() elif "UniformGrid" in inputtype: img = inputobj elif hasattr(inputobj, "GetOutput"): # passing vtk object, try extract imagdedata if hasattr(inputobj, "Update"): inputobj.Update() img = inputobj.GetOutput() elif isinstance(inputobj, str): if "https://" in inputobj: inputobj = vedo.file_io.download(inputobj, verbose=False) img = vedo.file_io.loadImageData(inputobj) else: vedo.logger.error(f"cannot understand input type {inputtype}") return if dims is not None: img.SetDimensions(dims) if origin is not None: img.SetOrigin(origin) ### DIFFERENT from volume.origin()! if spacing is not None: img.SetSpacing(spacing) self._data = img self._mapper.SetInputData(img) if img.GetPointData().GetScalars(): if img.GetPointData().GetScalars().GetNumberOfComponents() == 1: self.mode(mode).color(c).alpha(alpha).alpha_gradient(alpha_gradient) self.GetProperty().SetShade(True) self.GetProperty().SetInterpolationType(1) self.GetProperty().SetScalarOpacityUnitDistance(alpha_unit) # remember stuff: self._mode = mode self._color = c self._alpha = alpha self._alpha_grad = alpha_gradient self._alpha_unit = alpha_unit self.pipeline = utils.OperationNode( "Volume", comment=f"dims={tuple(self.dimensions())}", c="#4cc9f0" ) ####################################################################### def _update(self, data): self._data = data self._data.GetPointData().Modified() self._mapper.SetInputData(data) self._mapper.Modified() self._mapper.Update() return self def mode(self, mode=None): """ Define the volumetric rendering mode following this: - 0, composite rendering - 1, maximum projection rendering - 2, minimum projection rendering - 3, average projection rendering - 4, additive mode The default mode is "composite" where the scalar values are sampled through the volume and composited in a front-to-back scheme through alpha blending. The final color and opacity is determined using the color and opacity transfer functions specified in alpha keyword. Maximum and minimum intensity blend modes use the maximum and minimum scalar values, respectively, along the sampling ray. The final color and opacity is determined by passing the resultant value through the color and opacity transfer functions. Additive blend mode accumulates scalar values by passing each value through the opacity transfer function and then adding up the product of the value and its opacity. In other words, the scalar values are scaled using the opacity transfer function and summed to derive the final color. Note that the resulting image is always grayscale i.e. aggregated values are not passed through the color transfer function. This is because the final value is a derived value and not a real data value along the sampling ray. Average intensity blend mode works similar to the additive blend mode where the scalar values are multiplied by opacity calculated from the opacity transfer function and then added. The additional step here is to divide the sum by the number of samples taken through the volume. As is the case with the additive intensity projection, the final image will always be grayscale i.e. the aggregated values are not passed through the color transfer function. """ if mode is None: return self._mapper.GetBlendMode() if isinstance(mode, str): if "comp" in mode: mode = 0 elif "proj" in mode: if "max" in mode: mode = 1 elif "min" in mode: mode = 2 elif "ave" in mode: mode = 3 else: vedo.logger.warning(f"unknown mode {mode}") mode = 0 elif "add" in mode: mode = 4 else: vedo.logger.warning(f"unknown mode {mode}") mode = 0 self._mapper.SetBlendMode(mode) self._mode = mode return self def shade(self, status=None): """ Set/Get the shading of a Volume. Shading can be further controlled with `volume.lighting()` method. If shading is turned on, the mapper may perform shading calculations. In some cases shading does not apply (for example, in maximum intensity projection mode). """ if status is None: return self.GetProperty().GetShade() self.GetProperty().SetShade(status) return self def cmap(self, c, alpha=None, vmin=None, vmax=None): """Same as `color()`. Arguments: alpha : (list) use a list to specify transparencies along the scalar range vmin : (float) force the min of the scalar range to be this value vmax : (float) force the max of the scalar range to be this value """ return self.color(c, alpha, vmin, vmax) def jittering(self, status=None): """ If `True`, each ray traversal direction will be perturbed slightly using a noise-texture to get rid of wood-grain effects. """ if hasattr(self._mapper, "SetUseJittering"): # tetmesh doesnt have it if status is None: return self._mapper.GetUseJittering() self._mapper.SetUseJittering(status) return self def mask(self, data): """ Mask a volume visualization with a binary value. Needs to specify keyword mapper='gpu'. Example: ```python from vedo import np, Volume, show data_matrix = np.zeros([75, 75, 75], dtype=np.uint8) # all voxels have value zero except: data_matrix[0:35, 0:35, 0:35] = 1 data_matrix[35:55, 35:55, 35:55] = 2 data_matrix[55:74, 55:74, 55:74] = 3 vol = Volume(data_matrix, c=['white','b','g','r'], mapper='gpu') data_mask = np.zeros_like(data_matrix) data_mask[10:65, 10:45, 20:75] = 1 vol.mask(data_mask) show(vol, axes=1).close() ``` See also: `volume.hide_voxels()` """ mask = Volume(data.astype(np.uint8)) try: self.mapper().SetMaskTypeToBinary() self.mapper().SetMaskInput(mask.inputdata()) except AttributeError: vedo.logger.error("volume.mask() must create the volume with Volume(..., mapper='gpu')") return self def hide_voxels(self, ids): """ Hide voxels (cells) from visualization. Example: ```python from vedo import * embryo = Volume(dataurl+'embryo.tif') embryo.hide_voxels(list(range(10000))) show(embryo, axes=1).close() ``` See also: `volume.mask()` """ ghost_mask = np.zeros(self.ncells, dtype=np.uint8) ghost_mask[ids] = vtk.vtkDataSetAttributes.HIDDENCELL name = vtk.vtkDataSetAttributes.GhostArrayName() garr = utils.numpy2vtk(ghost_mask, name=name, dtype=np.uint8) self._data.GetCellData().AddArray(garr) self._data.GetCellData().Modified() return self def alpha_gradient(self, alpha_grad, vmin=None, vmax=None): """ Assign a set of tranparencies to a volume's gradient along the range of the scalar value. A single constant value can also be assigned. The gradient function is used to decrease the opacity in the "flat" regions of the volume while maintaining the opacity at the boundaries between material types. The gradient is measured as the amount by which the intensity changes over unit distance. The format for alpha_grad is the same as for method `volume.alpha()`. """ if vmin is None: vmin, _ = self._data.GetScalarRange() if vmax is None: _, vmax = self._data.GetScalarRange() self._alpha_grad = alpha_grad volumeProperty = self.GetProperty() if alpha_grad is None: volumeProperty.DisableGradientOpacityOn() return self volumeProperty.DisableGradientOpacityOff() gotf = volumeProperty.GetGradientOpacity() if utils.is_sequence(alpha_grad): alpha_grad = np.array(alpha_grad) if len(alpha_grad.shape) == 1: # user passing a flat list e.g. (0.0, 0.3, 0.9, 1) for i, al in enumerate(alpha_grad): xalpha = vmin + (vmax - vmin) * i / (len(alpha_grad) - 1) # Create transfer mapping scalar value to gradient opacity gotf.AddPoint(xalpha, al) elif len(alpha_grad.shape) == 2: # user passing [(x0,alpha0), ...] gotf.AddPoint(vmin, alpha_grad[0][1]) for xalpha, al in alpha_grad: # Create transfer mapping scalar value to opacity gotf.AddPoint(xalpha, al) gotf.AddPoint(vmax, alpha_grad[-1][1]) # print("alpha_grad at", round(xalpha, 1), "\tset to", al) else: gotf.AddPoint(vmin, alpha_grad) # constant alpha_grad gotf.AddPoint(vmax, alpha_grad) return self def component_weight(self, i, weight): """Set the scalar component weight in range [0,1].""" self.GetProperty().SetComponentWeight(i, weight) return self def xslice(self, i): """Extract the slice at index `i` of volume along x-axis.""" vslice = vtk.vtkImageDataGeometryFilter() vslice.SetInputData(self.imagedata()) nx, ny, nz = self.imagedata().GetDimensions() if i > nx - 1: i = nx - 1 vslice.SetExtent(i, i, 0, ny, 0, nz) vslice.Update() m = Mesh(vslice.GetOutput()) m.pipeline = utils.OperationNode(f"xslice {i}", parents=[self], c="#4cc9f0:#e9c46a") return m def yslice(self, j): """Extract the slice at index `j` of volume along y-axis.""" vslice = vtk.vtkImageDataGeometryFilter() vslice.SetInputData(self.imagedata()) nx, ny, nz = self.imagedata().GetDimensions() if j > ny - 1: j = ny - 1 vslice.SetExtent(0, nx, j, j, 0, nz) vslice.Update() m = Mesh(vslice.GetOutput()) m.pipeline = utils.OperationNode(f"yslice {j}", parents=[self], c="#4cc9f0:#e9c46a") return m def zslice(self, k): """Extract the slice at index `i` of volume along z-axis.""" vslice = vtk.vtkImageDataGeometryFilter() vslice.SetInputData(self.imagedata()) nx, ny, nz = self.imagedata().GetDimensions() if k > nz - 1: k = nz - 1 vslice.SetExtent(0, nx, 0, ny, k, k) vslice.Update() m = Mesh(vslice.GetOutput()) m.pipeline = utils.OperationNode(f"zslice {k}", parents=[self], c="#4cc9f0:#e9c46a") return m @deprecated(reason=vedo.colors.red + "Please use slice_plane()" + vedo.colors.reset) def slicePlane(self, *a, **b): "Deprecated. Please use `slice_plane()`" return self.slice_plane(*a, **b) def slice_plane(self, origin=(0, 0, 0), normal=(1, 1, 1), autocrop=False): """ Extract the slice along a given plane position and normal. Example: - [slice_plane1.py](https://github.com/marcomusy/vedo/tree/master/examples/volumetric/slice_plane1.py) ![](https://vedo.embl.es/images/volumetric/slicePlane1.gif) """ reslice = vtk.vtkImageReslice() reslice.SetInputData(self._data) reslice.SetOutputDimensionality(2) newaxis = utils.versor(normal) pos = np.array(origin) initaxis = (0, 0, 1) crossvec = np.cross(initaxis, newaxis) angle = np.arccos(np.dot(initaxis, newaxis)) T = vtk.vtkTransform() T.PostMultiply() T.RotateWXYZ(np.rad2deg(angle), crossvec) T.Translate(pos) M = T.GetMatrix() reslice.SetResliceAxes(M) reslice.SetInterpolationModeToLinear() reslice.SetAutoCropOutput(not autocrop) reslice.Update() vslice = vtk.vtkImageDataGeometryFilter() vslice.SetInputData(reslice.GetOutput()) vslice.Update() msh = Mesh(vslice.GetOutput()) msh.SetOrientation(T.GetOrientation()) msh.SetPosition(pos) msh.pipeline = utils.OperationNode("slice_plane", parents=[self], c="#4cc9f0:#e9c46a") return msh def warp(self, source, target, sigma=1, mode="3d", fit=False): """ Warp volume scalars within a Volume by specifying source and target sets of points. Arguments: source : (Points, list) the list of source points target : (Points, list) the list of target points fit : (bool) fit/adapt the old bounding box to the warped geometry """ if isinstance(source, vedo.Points): source = source.points() if isinstance(target, vedo.Points): target = target.points() ns = len(source) ptsou = vtk.vtkPoints() ptsou.SetNumberOfPoints(ns) for i in range(ns): ptsou.SetPoint(i, source[i]) nt = len(target) if ns != nt: vedo.logger.error(f"#source {ns} != {nt} #target points") raise RuntimeError() pttar = vtk.vtkPoints() pttar.SetNumberOfPoints(nt) for i in range(ns): pttar.SetPoint(i, target[i]) T = vtk.vtkThinPlateSplineTransform() if mode.lower() == "3d": T.SetBasisToR() elif mode.lower() == "2d": T.SetBasisToR2LogR() else: vedo.logger.error(f"unknown mode {mode}") raise RuntimeError() T.SetSigma(sigma) T.SetSourceLandmarks(ptsou) T.SetTargetLandmarks(pttar) T.Inverse() self.transform = T self.apply_transform(T, fit=fit) self.pipeline = utils.OperationNode("warp", parents=[self], c="#4cc9f0") return self def apply_transform(self, T, fit=False): """ Apply a transform to the scalars in the volume. Arguments: T : (vtkTransform, matrix) The transformation to be applied fit : (bool) fit/adapt the old bounding box to the warped geometry """ if isinstance(T, vtk.vtkMatrix4x4): tr = vtk.vtkTransform() tr.SetMatrix(T) T = tr elif utils.is_sequence(T): M = vtk.vtkMatrix4x4() n = len(T[0]) for i in range(n): for j in range(n): M.SetElement(i, j, T[i][j]) tr = vtk.vtkTransform() tr.SetMatrix(M) T = tr reslice = vtk.vtkImageReslice() reslice.SetInputData(self._data) reslice.SetResliceTransform(T) reslice.SetOutputDimensionality(3) reslice.SetInterpolationModeToLinear() spacing = self._data.GetSpacing() origin = self._data.GetOrigin() if fit: bb = self.box() if isinstance(T, vtk.vtkThinPlateSplineTransform): TI = vtk.vtkThinPlateSplineTransform() TI.DeepCopy(T) TI.Inverse() else: TI = vtk.vtkTransform() TI.DeepCopy(T) bb.apply_transform(TI) bounds = bb.GetBounds() bounds = ( bounds[0] / spacing[0], bounds[1] / spacing[0], bounds[2] / spacing[1], bounds[3] / spacing[1], bounds[4] / spacing[2], bounds[5] / spacing[2], ) bounds = np.round(bounds).astype(int) reslice.SetOutputExtent(bounds) reslice.SetOutputSpacing(spacing[0], spacing[1], spacing[2]) reslice.SetOutputOrigin(origin[0], origin[1], origin[2]) reslice.Update() self._update(reslice.GetOutput()) self.pipeline = utils.OperationNode("apply_transform", parents=[self], c="#4cc9f0") return self ########################################################################## class VolumeSlice(BaseVolume, Base3DProp, vtk.vtkImageSlice): """ Derived class of `vtkImageSlice`. """ def __init__(self, inputobj=None): """ This class is equivalent to `Volume` except for its representation. The main purpose of this class is to be used in conjunction with `Volume` for visualization using `mode="image"`. """ vtk.vtkImageSlice.__init__(self) Base3DProp.__init__(self) BaseVolume.__init__(self) # super().__init__() self._mapper = vtk.vtkImageResliceMapper() self._mapper.SliceFacesCameraOn() self._mapper.SliceAtFocalPointOn() self._mapper.SetAutoAdjustImageQuality(False) self._mapper.BorderOff() self.lut = None self.property = vtk.vtkImageProperty() self.property.SetInterpolationTypeToLinear() self.SetProperty(self.property) ################### if isinstance(inputobj, str): if "https://" in inputobj: inputobj = vedo.file_io.download(inputobj, verbose=False) # fpath elif os.path.isfile(inputobj): pass else: inputobj = sorted(glob.glob(inputobj)) ################### inputtype = str(type(inputobj)) if inputobj is None: img = vtk.vtkImageData() if isinstance(inputobj, Volume): img = inputobj.imagedata() self.lut = utils.ctf2lut(inputobj) elif utils.is_sequence(inputobj): if isinstance(inputobj[0], str): # scan sequence of BMP files ima = vtk.vtkImageAppend() ima.SetAppendAxis(2) pb = utils.ProgressBar(0, len(inputobj)) for i in pb.range(): f = inputobj[i] picr = vtk.vtkBMPReader() picr.SetFileName(f) picr.Update() mgf = vtk.vtkImageMagnitude() mgf.SetInputData(picr.GetOutput()) mgf.Update() ima.AddInputData(mgf.GetOutput()) pb.print("loading...") ima.Update() img = ima.GetOutput() else: if "ndarray" not in inputtype: inputobj = np.array(inputobj) if len(inputobj.shape) == 1: varr = utils.numpy2vtk(inputobj, dtype=float) else: if len(inputobj.shape) > 2: inputobj = np.transpose(inputobj, axes=[2, 1, 0]) varr = utils.numpy2vtk(inputobj.ravel(order="F"), dtype=float) varr.SetName("input_scalars") img = vtk.vtkImageData() img.SetDimensions(inputobj.shape) img.GetPointData().AddArray(varr) img.GetPointData().SetActiveScalars(varr.GetName()) elif "ImageData" in inputtype: img = inputobj elif isinstance(inputobj, Volume): img = inputobj.inputdata() elif "UniformGrid" in inputtype: img = inputobj elif hasattr(inputobj, "GetOutput"): # passing vtk object, try extract imagdedata if hasattr(inputobj, "Update"): inputobj.Update() img = inputobj.GetOutput() elif isinstance(inputobj, str): if "https://" in inputobj: inputobj = vedo.file_io.download(inputobj, verbose=False) img = vedo.file_io.loadImageData(inputobj) else: vedo.logger.error(f"cannot understand input type {inputtype}") return self._data = img self._mapper.SetInputData(img) self.SetMapper(self._mapper) def bounds(self): """Return the bounding box as [x0,x1, y0,y1, z0,z1]""" bns = [0, 0, 0, 0, 0, 0] self.GetBounds(bns) return bns def colorize(self, lut=None, fix_scalar_range=False): """ Assign a LUT (Look Up Table) to colorize the slice, leave it `None` to reuse an existing Volume color map. Use "bw" for automatic black and white. """ if lut is None and self.lut: self.property.SetLookupTable(self.lut) elif isinstance(lut, vtk.vtkLookupTable): self.property.SetLookupTable(lut) elif lut == "bw": self.property.SetLookupTable(None) self.property.SetUseLookupTableScalarRange(fix_scalar_range) return self def alpha(self, value): """Set opacity to the slice""" self.property.SetOpacity(value) return self def auto_adjust_quality(self, value=True): """Automatically reduce the rendering quality for greater speed when interacting""" self._mapper.SetAutoAdjustImageQuality(value) return self def slab(self, thickness=0, mode=0, sample_factor=2): """ Make a thick slice (slab). Arguments: thickness : (float) set the slab thickness, for thick slicing mode : (int) The slab type: 0 = min 1 = max 2 = mean 3 = sum sample_factor : (float) Set the number of slab samples to use as a factor of the number of input slices within the slab thickness. The default value is 2, but 1 will increase speed with very little loss of quality. """ self._mapper.SetSlabThickness(thickness) self._mapper.SetSlabType(mode) self._mapper.SetSlabSampleFactor(sample_factor) return self def face_camera(self, value=True): """Make the slice always face the camera or not.""" self._mapper.SetSliceFacesCameraOn(value) return self def jump_to_nearest_slice(self, value=True): """ This causes the slicing to occur at the closest slice to the focal point, instead of the default behavior where a new slice is interpolated between the original slices. Nothing happens if the plane is oblique to the original slices.""" self.SetJumpToNearestSlice(value) return self def fill_background(self, value=True): """ Instead of rendering only to the image border, render out to the viewport boundary with the background color. The background color will be the lowest color on the lookup table that is being used for the image.""" self._mapper.SetBackground(value) return self def lighting(self, window, level, ambient=1.0, diffuse=0.0): """Assign the values for window and color level.""" self.property.SetColorWindow(window) self.property.SetColorLevel(level) self.property.SetAmbient(ambient) self.property.SetDiffuse(diffuse) return self vedo-2023.4.6/vedo/vtkclasses.py000066400000000000000000000316141444463326400164150ustar00rootroot00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Subset of vtk classes to be imported directly """ import vtkmodules.vtkCommonComputationalGeometry from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkCommonCore import ( mutable, VTK_UNSIGNED_CHAR, VTK_UNSIGNED_SHORT, VTK_UNSIGNED_INT, VTK_UNSIGNED_LONG, VTK_UNSIGNED_LONG_LONG, VTK_UNSIGNED_CHAR, VTK_CHAR, VTK_SHORT, VTK_INT, VTK_LONG, VTK_LONG_LONG, VTK_FLOAT, VTK_DOUBLE, VTK_SIGNED_CHAR, VTK_ID_TYPE, VTK_VERSION_NUMBER, VTK_FONT_FILE, vtkArray, vtkIdTypeArray, vtkBitArray, vtkCharArray, vtkDoubleArray, vtkFloatArray, vtkIdList, vtkIntArray, vtkLookupTable, vtkMath, vtkPoints, vtkStringArray, vtkUnsignedCharArray, vtkVariant, vtkVariantArray, vtkVersion, ) from vtkmodules.vtkCommonDataModel import ( VTK_HEXAHEDRON, VTK_TETRA, VTK_VOXEL, VTK_WEDGE, VTK_PYRAMID, VTK_HEXAGONAL_PRISM, VTK_PENTAGONAL_PRISM, vtkCellArray, vtkBox, vtkCellLocator, vtkCylinder, vtkDataSetAttributes, vtkDataObject, vtkDataSet, vtkFieldData, vtkHexagonalPrism, vtkHexahedron, vtkImageData, vtkImplicitDataSet, vtkImplicitSelectionLoop, vtkImplicitWindowFunction, vtkIterativeClosestPointTransform, vtkLine, vtkMultiBlockDataSet, vtkMutableDirectedGraph, vtkPentagonalPrism, vtkPlane, vtkPlanes, vtkPointLocator, vtkPolyData, vtkPolyLine, vtkPolyPlane, vtkPolygon, vtkPyramid, vtkQuadric, vtkRectilinearGrid, vtkSelection, vtkSelectionNode, vtkSphere, vtkStaticCellLocator, vtkStaticPointLocator, vtkStructuredGrid, vtkTetra, vtkTriangle, vtkUnstructuredGrid, vtkVoxel, vtkWedge, ) from vtkmodules.vtkCommonExecutionModel import vtkAlgorithm from vtkmodules.vtkCommonMath import vtkMatrix4x4, vtkQuaternion from vtkmodules.vtkCommonTransforms import ( vtkHomogeneousTransform, vtkLandmarkTransform, vtkThinPlateSplineTransform, vtkTransform ) from vtkmodules.vtkFiltersCore import ( VTK_BEST_FITTING_PLANE, vtk3DLinearGridCrinkleExtractor, vtkAppendPolyData, vtkCellCenters, vtkCellDataToPointData, vtkCenterOfMass, vtkCleanPolyData, vtkClipPolyData, vtkPolyDataConnectivityFilter, vtkPolyDataEdgeConnectivityFilter, vtkContourFilter, vtkContourGrid, vtkCutter, vtkDecimatePro, vtkDelaunay2D, vtkDelaunay3D, vtkElevationFilter, vtkFeatureEdges, vtkFlyingEdges3D, vtkGlyph3D, vtkIdFilter, vtkImageAppend, vtkImplicitPolyDataDistance, vtkMarchingSquares, vtkMaskPoints, vtkMassProperties, vtkPointDataToCellData, vtkPolyDataNormals, vtkProbeFilter, vtkQuadricDecimation, vtkResampleWithDataSet, vtkReverseSense, vtkStripper, vtkTensorGlyph, vtkThreshold, vtkTriangleFilter, vtkTubeFilter, vtkUnstructuredGridQuadricDecimation, vtkVoronoi2D, vtkWindowedSincPolyDataFilter, ) try: from vtkmodules.vtkFiltersCore import vtkStaticCleanUnstructuredGrid, vtkPolyDataPlaneCutter except ImportError: pass from vtkmodules.vtkFiltersExtraction import ( vtkExtractCellsByType, vtkExtractGeometry, vtkExtractPolyDataGeometry, vtkExtractSelection, ) try: from vtkmodules.vtkFiltersExtraction import vtkExtractEdges # vtk9.0 except ImportError: from vtkmodules.vtkFiltersCore import vtkExtractEdges # vtk9.2 from vtkmodules.vtkFiltersFlowPaths import vtkStreamTracer from vtkmodules.vtkFiltersGeneral import ( vtkBooleanOperationPolyDataFilter, vtkBoxClipDataSet, vtkCellValidator, vtkClipDataSet, vtkCountVertices, vtkContourTriangulator, vtkCurvatures, vtkDataSetTriangleFilter, vtkDensifyPolyData, vtkDistancePolyDataFilter, vtkGradientFilter, vtkIntersectionPolyDataFilter, vtkLoopBooleanPolyDataFilter, vtkMultiBlockDataGroupFilter, vtkTransformPolyDataFilter, vtkOBBTree, vtkQuantizePolyDataPoints, vtkRandomAttributeGenerator, vtkShrinkFilter, vtkShrinkPolyData, vtkRectilinearGridToTetrahedra, vtkVertexGlyphFilter, ) try: from vtkmodules.vtkCommonDataModel import vtkCellTreeLocator except ImportError: from vtkmodules.vtkFiltersGeneral import vtkCellTreeLocator from vtkmodules.vtkFiltersGeometry import ( vtkGeometryFilter, vtkDataSetSurfaceFilter, vtkImageDataGeometryFilter, ) try: from vtkmodules.vtkFiltersGeometry import vtkMarkBoundaryFilter except ImportError: pass from vtkmodules.vtkFiltersHybrid import ( vtkFacetReader, vtkImplicitModeller, vtkPolyDataSilhouette, vtkProcrustesAlignmentFilter, vtkRenderLargeImage, ) from vtkmodules.vtkFiltersModeling import ( vtkAdaptiveSubdivisionFilter, vtkBandedPolyDataContourFilter, vtkButterflySubdivisionFilter, vtkContourLoopExtraction, vtkCookieCutter, vtkDijkstraGraphGeodesicPath, vtkFillHolesFilter, vtkHausdorffDistancePointSetFilter, vtkLinearExtrusionFilter, vtkLinearSubdivisionFilter, vtkLoopSubdivisionFilter, vtkRibbonFilter, vtkRotationalExtrusionFilter, vtkRuledSurfaceFilter, vtkSectorSource, vtkSelectEnclosedPoints, vtkSelectPolyData, vtkSubdivideTetra, ) try: from vtkmodules.vtkFiltersModeling import vtkCollisionDetectionFilter except ImportError: pass try: from vtkmodules.vtkFiltersModeling import vtkImprintFilter except ImportError: pass from vtkmodules.vtkFiltersPoints import ( vtkConnectedPointsFilter, vtkDensifyPointCloudFilter, vtkEuclideanClusterExtraction, vtkExtractEnclosedPoints, vtkExtractSurface, vtkGaussianKernel, vtkLinearKernel, vtkPCANormalEstimation, vtkPointDensityFilter, vtkPointInterpolator, vtkRadiusOutlierRemoval, vtkShepardKernel, vtkSignedDistance, vtkVoronoiKernel, ) from vtkmodules.vtkFiltersSources import ( vtkArcSource, vtkArrowSource, vtkConeSource, vtkCubeSource, vtkCylinderSource, vtkDiskSource, vtkGlyphSource2D, vtkGraphToPolyData, vtkLineSource, vtkOutlineCornerFilter, vtkParametricFunctionSource, vtkPlaneSource, vtkPointSource, vtkProgrammableSource, vtkSphereSource, vtkTexturedSphereSource, vtkTessellatedBoxSource, ) from vtkmodules.vtkFiltersTexture import vtkTextureMapToPlane from vtkmodules.vtkFiltersVerdict import vtkMeshQuality, vtkCellSizeFilter from vtkmodules.vtkImagingStencil import vtkPolyDataToImageStencil from vtkmodules.vtkIOExport import vtkX3DExporter from vtkmodules.vtkIOExportGL2PS import vtkGL2PSExporter from vtkmodules.vtkIOGeometry import ( vtkBYUReader, vtkFacetWriter, vtkOBJReader, vtkOpenFOAMReader, vtkParticleReader, vtkSTLReader, vtkSTLWriter, ) from vtkmodules.vtkIOImage import ( vtkBMPReader, vtkBMPWriter, vtkDEMReader, vtkDICOMImageReader, vtkHDRReader, vtkJPEGReader, vtkJPEGWriter, vtkMetaImageReader, vtkMetaImageWriter, vtkNIFTIImageReader, vtkNIFTIImageWriter, vtkNrrdReader, vtkPNGReader, vtkPNGWriter, vtkSLCReader, vtkTIFFReader, vtkTIFFWriter, ) from vtkmodules.vtkIOImport import ( vtk3DSImporter, vtkOBJImporter, vtkVRMLImporter, ) from vtkmodules.vtkIOLegacy import ( vtkSimplePointsWriter, vtkStructuredGridReader, vtkStructuredPointsReader, vtkDataSetReader, vtkDataSetWriter, vtkPolyDataWriter, vtkRectilinearGridReader, vtkUnstructuredGridReader, ) from vtkmodules.vtkIOPLY import vtkPLYReader, vtkPLYWriter from vtkmodules.vtkIOXML import ( vtkXMLGenericDataObjectReader, vtkXMLImageDataReader, vtkXMLImageDataWriter, vtkXMLMultiBlockDataReader, vtkXMLMultiBlockDataWriter, vtkXMLPRectilinearGridReader, vtkXMLPUnstructuredGridReader, vtkXMLPolyDataReader, vtkXMLPolyDataWriter, vtkXMLRectilinearGridReader, vtkXMLStructuredGridReader, vtkXMLUnstructuredGridReader, vtkXMLUnstructuredGridWriter, ) from vtkmodules.vtkImagingColor import ( vtkImageLuminance, vtkImageMapToWindowLevelColors, ) from vtkmodules.vtkImagingCore import ( vtkExtractVOI, vtkImageAppendComponents, vtkImageBlend, vtkImageCast, vtkImageConstantPad, vtkImageExtractComponents, vtkImageFlip, vtkImageMapToColors, vtkImageMirrorPad, vtkImagePermute, vtkImageResample, vtkImageResize, vtkImageReslice, vtkImageThreshold, vtkImageTranslateExtent, ) from vtkmodules.vtkImagingFourier import ( vtkImageButterworthHighPass, vtkImageButterworthLowPass, vtkImageFFT, vtkImageFourierCenter, vtkImageRFFT, ) from vtkmodules.vtkImagingGeneral import ( vtkImageCorrelation, vtkImageEuclideanDistance, vtkImageGaussianSmooth, vtkImageGradient, vtkImageHybridMedian2D, vtkImageLaplacian, vtkImageMedian3D, vtkImageNormalize, ) from vtkmodules.vtkImagingHybrid import vtkImageToPoints, vtkSampleFunction from vtkmodules.vtkImagingMath import ( vtkImageDivergence, vtkImageDotProduct, vtkImageLogarithmicScale, vtkImageMagnitude, vtkImageMathematics, ) from vtkmodules.vtkImagingMorphological import ( vtkImageContinuousDilate3D, vtkImageContinuousErode3D, ) from vtkmodules.vtkImagingSources import vtkImageCanvasSource2D from vtkmodules.vtkImagingStencil import vtkImageStencil from vtkmodules.vtkInfovisLayout import ( vtkCircularLayoutStrategy, vtkClustering2DLayoutStrategy, vtkConeLayoutStrategy, vtkFast2DLayoutStrategy, vtkForceDirectedLayoutStrategy, vtkGraphLayout, vtkSimple2DLayoutStrategy, vtkSimple3DCirclesStrategy, vtkSpanTreeLayoutStrategy, ) from vtkmodules.vtkInteractionStyle import ( vtkInteractorStyleFlight, vtkInteractorStyleImage, vtkInteractorStyleJoystickActor, vtkInteractorStyleJoystickCamera, vtkInteractorStyleRubberBand2D, vtkInteractorStyleRubberBand3D, vtkInteractorStyleRubberBandZoom, vtkInteractorStyleTerrain, vtkInteractorStyleTrackballActor, vtkInteractorStyleTrackballCamera, vtkInteractorStyleUnicam, vtkInteractorStyleUser, ) from vtkmodules.vtkInteractionWidgets import ( vtkBalloonRepresentation, vtkBalloonWidget, vtkBoxWidget, vtkContourWidget, vtkPlaneWidget, vtkFocalPlanePointPlacer, vtkImplicitPlaneWidget, vtkOrientationMarkerWidget, vtkOrientedGlyphContourRepresentation, vtkPolygonalSurfacePointPlacer, vtkSliderRepresentation2D, vtkSliderRepresentation3D, vtkSliderWidget, vtkSphereWidget, ) try: from vtkmodules.vtkInteractionWidgets import vtkCameraOrientationWidget except ImportError: pass from vtkmodules.vtkRenderingAnnotation import ( vtkAnnotatedCubeActor, vtkAxesActor, vtkAxisActor2D, vtkCaptionActor2D, vtkCornerAnnotation, vtkCubeAxesActor, vtkLegendBoxActor, vtkLegendScaleActor, vtkPolarAxesActor, vtkScalarBarActor, vtkXYPlotActor, ) from vtkmodules.vtkRenderingCore import ( vtkActor, vtkActor2D, vtkAssembly, vtkBillboardTextActor3D, vtkCamera, vtkCameraInterpolator, vtkColorTransferFunction, vtkCoordinate, vtkDataSetMapper, vtkDistanceToCamera, vtkFlagpoleLabel, vtkFollower, vtkHierarchicalPolyDataMapper, vtkImageActor, vtkImageMapper, vtkImageProperty, vtkImageSlice, vtkInteractorEventRecorder, vtkInteractorObserver, vtkLight, vtkLogLookupTable, vtkMapper, vtkPointGaussianMapper, vtkPolyDataMapper, vtkPolyDataMapper2D, vtkProp, vtkProp3D, vtkPropAssembly, vtkPropCollection, vtkPropPicker, vtkProperty, vtkRenderWindow, vtkRenderer, vtkRenderWindowInteractor, vtkSelectVisiblePoints, vtkSkybox, vtkTextActor, vtkTextMapper, vtkTextProperty, vtkTextRenderer, vtkTexture, vtkVolume, vtkVolumeProperty, vtkWindowToImageFilter, ) from vtkmodules.vtkRenderingFreeType import vtkVectorText from vtkmodules.vtkRenderingImage import vtkImageResliceMapper from vtkmodules.vtkRenderingLabel import vtkLabeledDataMapper from vtkmodules.vtkRenderingOpenGL2 import ( vtkDepthOfFieldPass, vtkCameraPass, vtkDualDepthPeelingPass, vtkEquirectangularToCubeMapTexture, vtkLightsPass, vtkOpaquePass, vtkOverlayPass, vtkRenderPassCollection, vtkSSAOPass, vtkSequencePass, vtkShader, vtkShadowMapPass, vtkTranslucentPass, vtkVolumetricPass, ) from vtkmodules.vtkRenderingVolume import ( vtkFixedPointVolumeRayCastMapper, vtkGPUVolumeRayCastMapper, vtkProjectedTetrahedraMapper, vtkUnstructuredGridVolumeRayCastMapper, vtkUnstructuredGridVolumeZSweepMapper, ) from vtkmodules.vtkRenderingVolumeOpenGL2 import ( vtkOpenGLGPUVolumeRayCastMapper, vtkSmartVolumeMapper, ) # print("successfully finished importing vtkmodules")