pax_global_header00006660000000000000000000000064146421467230014523gustar00rootroot0000000000000052 comment=7eae0badbdd9c47f442cf72b880b4bb18704d249 scikit-fmm-2024.05.29/000077500000000000000000000000001464214672300141735ustar00rootroot00000000000000scikit-fmm-2024.05.29/.github/000077500000000000000000000000001464214672300155335ustar00rootroot00000000000000scikit-fmm-2024.05.29/.github/workflows/000077500000000000000000000000001464214672300175705ustar00rootroot00000000000000scikit-fmm-2024.05.29/.github/workflows/build.yaml000066400000000000000000000017721464214672300215620ustar00rootroot00000000000000name: Linux Build on: [push] jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install numpy wheel build - name: Build extension run: | python --version python -c "import struct; print(struct.calcsize('P') * 8)" python -m build pip install . pip list cd .. && python -c "import skfmm; print(skfmm.__version__)" - name: Run skfmm tests run: | cd .. && python -c "import skfmm, sys; sys.exit(skfmm.test())" - uses: actions/upload-artifact@v3 with: name: linux-artifacts path: dist/*scikit-fmm-2024.05.29/.github/workflows/windows_build.yaml000066400000000000000000000021041464214672300233220ustar00rootroot00000000000000name: Windows Build on: [push] jobs: build: runs-on: windows-latest strategy: matrix: python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install numpy wheel - name: Build extension run: | python --version python -c "import struct; print(struct.calcsize('P') * 8)" pip install build python -m build pip install . pip list - uses: actions/upload-artifact@v3 with: name: windows-artifacts path: dist/* # - name: Run skfmm tests # run: | # python -c 'import os; os.chdir(".."); import skfmm; print(skfmm.__version__)' # python -c 'import os; os.chdir(".."); import skfmm, sys; sys.exit(skfmm.test())' scikit-fmm-2024.05.29/.gitignore000066400000000000000000000003711464214672300161640ustar00rootroot00000000000000build/ *.pyc *~ scikits.fmm.egg-info/ \#* dist/ *.so scikit_fmm.egg-info/PKG-INFO scikit_fmm.egg-info/SOURCES.txt scikit_fmm.egg-info/dependency_links.txt scikit_fmm.egg-info/requires.txt scikit_fmm.egg-info/top_level.txt install_log.txt skfmm/*.pydscikit-fmm-2024.05.29/.readthedocs.yaml000066400000000000000000000011011464214672300174130ustar00rootroot00000000000000# .readthedocs.yaml # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the version of Python and other tools you might need build: os: ubuntu-22.04 tools: python: "3.11" # Build documentation in the docs/ directory with Sphinx sphinx: configuration: docs/conf.py # We recommend specifying your dependencies to enable reproducible builds: # https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html # python: # install: # - requirements: docs/requirements.txt scikit-fmm-2024.05.29/CONTRIBUTORS.txt000066400000000000000000000005061464214672300166720ustar00rootroot00000000000000Jason Furtney Chris Richardson Luigi Costalli Daniel Wheeler Ján Margeta Geordie McBain Eugene Prilepin Lester Hedges jakirkham Adrian Butscher Wolfram Moebius Jens Glaser ManifoldFR Murray Cutforth okonrad f-fanni David Parsson Robin Thibaut Joshua Gehre Xylar Asay-Davis Amin Sadeghi Daniel Ammar Fernando Bordignon DorSSS scikit-fmm-2024.05.29/LICENSE.txt000066400000000000000000000030041464214672300160130ustar00rootroot00000000000000Unless otherwise specified by LICENSE.txt files in individual directories, all code is Copyright (C) 2024 the scikit-fmm team All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. 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. 3. Neither the name of scikit-fmm nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. scikit-fmm-2024.05.29/MANIFEST.in000066400000000000000000000007101464214672300157270ustar00rootroot00000000000000include README.txt include examples/*.py include setup.py include skfmm/*.cpp include skfmm/*.h include skfmm/setup.py include skfmm/__init__.py include skfmm/pfmm.py include skfmm/heap.py include skfmm/pheap.pyx include Makefile include LICENSE.txt include CONTRIBUTORS.txt include profile/prof.cpp include profile/prof.sh include profile/profile.py include doc/*.png include doc/*.rst include doc/conf.py include static_analysis.sh include pyproject.tomlscikit-fmm-2024.05.29/Makefile000066400000000000000000000126711464214672300156420ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) doc # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) doc .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/scikit-fmm.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/scikit-fmm.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/scikit-fmm" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/scikit-fmm" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." scikit-fmm-2024.05.29/README.md000066400000000000000000000237651464214672300154670ustar00rootroot00000000000000![Linux build](https://github.com/scikit-fmm/scikit-fmm/actions/workflows/build.yaml/badge.svg) ![Windows build](https://github.com/scikit-fmm/scikit-fmm/actions/workflows/windows_build.yaml/badge.svg) [![PyPI version](https://badge.fury.io/py/scikit-fmm.svg)](http://pypi.python.org/pypi/scikit-fmm)[![Documentation Status](https://readthedocs.org/projects/scikit-fmm/badge/?version=latest)](https://scikit-fmm.readthedocs.io/en/latest/?badge=latest) ![Contributors](https://img.shields.io/github/contributors/scikit-fmm/scikit-fmm.svg)Downloads # scikit-fmm: the fast marching method for Python `scikit-fmm` is a Python extension module which implements the fast marching method. The fast marching method is used to model the evolution of boundaries and interfaces in a variety of application areas. More specifically, the fast marching method is a numerical technique for finding approximate solutions to boundary value problems of the Eikonal equation: F(x) | grad T(x) | = 1 Typically, such a problem describes the evolution of a closed curve as a function of time T with speed F(x)>0 in the normal direction at a point x on the curve. The speed function is specified, and the time at which the contour crosses a point x is obtained by solving the equation. scikit-fmm is a simple module which provides functions to calculate the signed distance and travel time to an interface described by the zero contour of the input array phi. ```python import skfmm import numpy as np phi = np.ones((3, 3)) phi[1, 1] = -1 skfmm.distance(phi) ``` ```python array([[ 1.20710678, 0.5 , 1.20710678], [ 0.5 , -0.35355339, 0.5 ], [ 1.20710678, 0.5 , 1.20710678]]) ``` --- ```python skfmm.travel_time(phi, speed = 3.0 * np.ones_like(phi)) ``` ```python array([[ 0.40236893, 0.16666667, 0.40236893], [ 0.16666667, 0.11785113, 0.16666667], [ 0.40236893, 0.16666667, 0.40236893]]) ``` --- The input array can be of 1, 2, 3 or higher dimensions and can be a masked array. A function is provided to compute extension velocities. ### Documentation * http://scikit-fmm.readthedocs.org/en/master/ ### PyPI * http://pypi.python.org/pypi/scikit-fmm ### Requirements * Numpy >= 1.0.2 * Building requires the pypa/build module (https://github.com/pypa/build) and a C/C++ compiler ### Bugs, questions, patches, feature requests, discussion & cetera * Open a GitHub pull request or a GitHub issue * Email list: http://groups.google.com/group/scikit-fmm * Send an email to scikit-fmm+subscribe@googlegroups.com to subscribe. ### Installing * Via pip: `pip install scikit-fmm` * 64-bit Windows binaries from Christoph Gohlke: * http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-fmm * Anaconda linux-64 and linux-ppc64le packages: * `conda install scikit-fmm` * Ubuntu PPA * https://launchpad.net/~nvidia-digits/+archive/ubuntu/dev * Debian * https://tracker.debian.org/pkg/scikit-fmm ### Building and installing from Source * `pip install build` * `python -m build` * `pip install .` ### Running Tests * `python -c "import skfmm; skfmm.test(True)"` (Do not run the tests from the source directory.) * Tests are doctests in `skfmm/__init__.py` ### Building documentation * Requires sphinx and numpydoc * `make html` ### Publications using scikit-fmm * Akinola, I., J Varley, B. Chen, and P.K. Allen (2018) "Workspace Aware Online Grasp Planning" arXiv:1806.11402v1 [cs.RO] 29 Jun 2018 https://arxiv.org/pdf/1806.11402.pdf * Bortolussi, V., B. Figliuzzi, F. Willot, M. Faessel, M. Jeandin (2018) "Morphological modeling of cold spray coatings" Image Anal Stereol 2018;37:145-158 doi:10.5566/ias.1894 https://hal.archives-ouvertes.fr/hal-01837906/document * Chalmers, S., C.D. Saunter, J.M. Girkin and J.G. McCarron (2016) "Age decreases mitochondrial motility and increases mitochondrial size in vascular smooth muscle." Journal of Physiology, 594.15 pp 4283–4295. * Diogo Brandão Amorim (2014) "Efficient path planning of a mobile robot on rough terrain" Master's Thesis, Department of Aerospace Engineering, University of Lisbon. * Giometto, A., D.R. Nelson, and A.W. Murray (2018) "Physical interactions reduce the power of natural selection in growing yeast colonies", PNAS November 6, 2018 115 (45) 11448-11453; published ahead of print October 23, 2018 https://doi.org/10.1073/pnas.1809587115 * Joshua A. Taillon, Christopher Pellegrinelli, Yilin Huang, Eric D. Wachsman, and Lourdes G. Salamanca-Riba (2014) "Three Dimensional Microstructural Characterization of Cathode Degradation in SOFCs Using Focused Ion Beam and SEM" ECS Trans. 2014 61(1): 109-120; https://www.joshuataillon.com/pdfs/2015-08-06%20jtaillon%203D%20SOFC%20cathode%20degradation.pdf * Marshak, C., I. Yanovsky, and L. Vese (2017) "Energy Minimization for Cirrus and Cumulus Cloud Separation in Atmospheric Images" IGARSS 2018 - 2018 IEEE International Geoscience and Remote Sensing Symposium DOI: 10.1109/IGARSS.2018.8517940 ftp://ftp.math.ucla.edu/pub/camreport/cam17-68.pdf * Moon, K. R., V. Delouille, J.J. Li, R. De Visscher, F. Watson and A.O. Hero III (2016) "Image patch analysis of sunspots and active regions." J. Space Weather Space Clim., 6, A3, DOI: 10.1051/swsc/2015043. * Tao, M., J. Solomon and A. Butscher (2016) "Near-Isometric Level Set Tracking." in Eurographics Symposium on Geometry Processing 2016 Eds: M. Ovsjanikov and D. Panozzo. Volume 35 (2016), Number 5 * Thibaut, R., Laloy, E., Hermans, T., 2021. A new framework for experimental design using Bayesian Evidential Learning: The case of wellhead protection area. J. Hydrol. 603, 126903. https://doi.org/10.1016/j.jhydrol.2021.126903 * Vargiu, Antioco, M. Marrocu, L. Massidda (2015) "Implementazione e valutazione su un caso reale del servizio di Cloud Computing per la simulazione di incendi boschivi in Sardegna" (Implementation and evaluation on a real case of Cloud computing service for simulation of Forest fires in Sardinia). Sardinia Department of Energy and Environment. CRS4 PIA 2010 D5.4. * Wronkiewicz, M. (2018) "Mapping buildings with help from machine learning" Medium article, June 29th 2018 https://medium.com/devseed/mapping-buildings-with-help-from-machine-learning-f8d8d221214a * Makki, K., Ben Salem, D., Ben Amor, B. (2021) "Toward the Assessment of Intrinsic Geometry of Implicit Brain MRI Manifolds" IEEE Access, volume 9, pages 131054 - 131071 (September 2021) DOI: 10.1109/ACCESS.2021.3113611 https://ieeexplore.ieee.org/abstract/document/9540688 ### Version History: * 0.0.1: February 13 2012 * Initial release * 0.0.2: February 26th 2012 * Including tests and docs in source distribution. Minor changes to documentation. * 0.0.3: August 4th 2012 * Extension velocities. * Fixes for 64 bit platforms. * Optional keyword argument for point update order. * Bug reports and patches from three contributors. * 0.0.4: October 15th 2012 * Contributions from Daniel Wheeler: * Bug fixes in extension velocity. * Many additional tests and migration to doctest format. * Additional optional input to extension_velocities() for FiPy compatibly. * 0.0.5: May 12th 2014 * Fix for building with MSVC (Jan Margeta). * Corrected second-order point update. * 0.0.6: February 20th 2015 * Documentation clarification (Geordie McBain). * Python 3 port (Eugene Prilepin). * Python wrapper for binary min-heap. * Freeze equidistant narrow-band points simultaneously. * 0.0.7: October 21st 2015 * Bug fix to upwind finite difference approximation for negative phi from Lester Hedges. * 0.0.8: March 9th 2016 * Narrow band capability: an optional "narrow" keyword argument limits the extent of the marching algorithm (Adrian Butscher). * 0.0.9: August 5th 2016 * Periodic boundaries: an optional "periodic" keyword argument enables periodic boundaries in one or more directions (Wolfram Moebius). * 2019.1.30 January 30th 2019 * Abrupt change to version numbering scheme. * Bugfix in setup.py to allow installing via pip with numpy (ManifoldFR). * Handle C++ exceptions during fast marching (Jens Glaser). * Accept a zero discriminant in travel time point update. * 2021.1.20 January 20th 2021 * Fix divide by zero bugs in travel_time and extension_velocities * Contributions from Murray Cutforth, f-fanni, and okonrad * 2021.1.21 January 21st 2021 * Minor C++ change (removed the auto keyword) to fix the compile on TravisCI. * 2021.2.2 February 2nd 2021 * Add a pyproject.toml file to specify numpy as a build requirement, this is needed to build with new version of pip (David Parsson). * 2021.7.8 July 8th 2021 * Add a pyproject.toml file to the MANIFEST.in file to fix the numpy build dependency (David Parsson). Fix numpy deprecation warnings and improve source code formatting (Robin Thibaut). * 2021.9.23 September 23rd 2021 * Make the pyproject.toml file specify the oldest supported numpy as a build requirement, to allow using wheels with any numpy version. (David Parsson). * 2021.10.29 October 29th 2021 * Fix for point update discriminant exactly equal to zero * Fall back calculation for point update when discriminant becomes negative * (Joshua Gehre) * 2022.02.02 February 2nd 2022 * Fixes for Python 3.10 compatibility * (Amin Sadeghi, Xylar Asay-Davis, David Parsson) * 2022.03.26 March 26th 2022 * Following the breaking changes in setuptools v61.0.0 it is suggested to set py_modules to disable auto-discovery behavior. * (Daniel Ammar) * 2022.08.15 August 15th 2022 * Following the breaking changes in setuptools v65 pin setuptools to v64 * (DorSSS) * 2022.04.02 April 2nd 2023 * Build fixes for Python 3.11 (update pheap cython wrapper) * No solver changes * 2024.05.29 May 29th 2024 * Update build system to use meson * Python 3.12 support * No solver changes Copyright 2023 The scikit-fmm team. BSD-style license. See LICENSE.txt in the source directory. scikit-fmm-2024.05.29/dev_notes.org000066400000000000000000000025741464214672300167020ustar00rootroot00000000000000 * To make a release: ** Increment version number Currently the version number is hard-coded in the following locations: ./doc/conf.py ./pyproject.toml ./meson.build ./skfmm/__init__.py ./README.txt The version number format is YYYY.MM.DD with leading zeros ** Tag the release $ git tag YYYY.MM.DD $ git push --tags origin master ** Build the documentation To build the documentation you need Sphinx and the numpydoc Sphinx extension $ make html check that everything looks ok by opening build/html/index.html the documentation should build automatically on RTD. Check https://scikit-fmm.readthedocs.io/en/latest/ trigger a build if needed. ** Upload to PyPI make sure you have twine installed with: $ pip install twine One the final commit has been made, wait for the GitHub workflow builds to finish. Make sure all the tests pass on all the platforms. Copy the build artifacts from the GitHub actions to dist/ $ twine upload dist/* * Cython Wrapper for heap class The binary min heap C++ class has a Cython wrapper to expose it to Python. Cython is not required to build this module as the c++ files created by Cython are checked into the git repo. If changes are made to skfmm/heap.h or skfmm/heap.cpp the Cython c++ file pheap.cpp needs to be updated. This is done with the command: $ cython3 --cplus -3 pheap.pyx The updates pheap.cpp should also be checked into the git repo scikit-fmm-2024.05.29/doc/000077500000000000000000000000001464214672300147405ustar00rootroot00000000000000scikit-fmm-2024.05.29/doc/2d_phi.png000066400000000000000000000402341464214672300166160ustar00rootroot00000000000000PNG  IHDR XvpsBIT|d pHYsaa?i IDATxyUՙ?\PL `Qy:Iڨl `mJw &t+JFhTDDRT_ՏvQ}Dƍ =ؘ4iR8eʔ8p`}Fznݺ2٘:uj>: ]v[oE^^^իvaQV裏*gk{WUVQNhٲe|e9rdqFz0w>h-ZT2t%˲RCzY2_El>oK.Ehڴiԭ[7:wO=Զ2 Prކ Rj9<'˲m_~eۿ[t) Aѭ[xǶK+3&z5u/~X~}yG}OZRc8K^'~xyoK6n<@{%СC? O?n)>[n4i$N9ӟTf̝;7N?hԨQԯ_?zӦM+5۶m?yDDٳܲe?qm6j׮o1{25liHxsv…qGzJd֬YqǾuԉmƏK͗=z}|kC7{޼yq9D&M ;x*\v[^+aON'O|;ׯ_'|r q!O~/b1w/~Qf}[RѴ'|2&NvZ\qǤIbƌo>S2osLZ*N;ԩSq9ĩZoVt-|x\qQf8묳CG̙3㷿mӧdGq衇F=Erʘ4iR?z뭒 ƍǠAbȑ{KѶmR{G۷/8>;vl}1y䒋Xxq,Z(8-s=7r\5*zQj]ܟmEEEѫW;wnuQqeŦM_nmwiW'jKcȑG>}QF1mڴ[OSME.\ݺu?eʔ,eC )6mdڵ+6bĈ,e5k?vM7e\.:th~Y.R'N,QF[ӭޚrlر r ;wnƏrk-3/r\6yrMm=z>oQfK,)wycى'լY'pBKa…%?yu=3Y.N;2n۶m{ַ*վvSNGgZիM>L~vR <8rٯR/.uN,^~,emڴ>裒 6dgyf;R5>;[~}iׯVXQ\.]~{¬v٢EJڋ_y|0rُ~RůS[r_.y]mK.T{qiݺuٚիWgM4^zԴ_Y.˾jZ/毿믿Դ3gf5k7n}g%;ZvwlAXo}+_f:(QF[o__Y..Ғ /3Sg\.k߾}iӦ2ѣ |Y..R\sMmذ!kժUִilݺu%|IVnݬC~\'?r\vVz0aBѣGjߞP|۵kW=f͚iwz+ꫯYVR>rʬFY.]]ܹs˽>,;ó5jd&L(5SNYZO?r6lȚ6mZ\.թST(OOY.ˆ^f5jdxVkްaCVXXկ_?[l]n]V^aÆ'|RfzwqǕΝ;jR`(~Oi۶maÆ2_5#l#L{yCv3fĦM""J Q+W_EDěoM߸qc7^{뮻+__h֬Ys=._VrٶmhڴiٳgG.+ަ:DVbѢEzhРAuϛ7/>ڵVo6~뭷b͚5ѽ{hԨQzo~RϏۯٚ;PzGy$Νz+R{JEA)ԨQ#?xcܹp}Gyd~_5*Ν]tQi}HmT|sO<[C_[O?4"*~JEQQN_֛* *z3f̈;,͚55kFe1dȐroDh}~/~xKC=k.s؞c_TT\.ZjѥK(**?>N9(,,5j… cԨQ] _ *'?:̘1ur/i?g/<_Դ⋺+VܯSv>s֢EhV/~ٕ5lm}TeKΫokl cǎ1gΜ={vn: #"3fNهxկ~S9tx衇N7n#3gnӺ+\lY*UŊU,oUOv{ւހmuOx1?Q-ԠAh߾}|ecm#*ָq㈈r`vK~ϗ(5Xyõŏ~x㡇;9sLdYO?V׿`rq痙V(UwgR)ޗGSe{q7FNbر^ķӆy䑑eY> ڵk 6z9(,,%[n-Ot7O)omk ܚױ 6ċ/\nfϞy~qGB?1-ZjՊnݺ_z饑eY\wu.W\v[rKK9hذaL81VXQҾf͚+wJZ~_jĉ˽,owߍnaիW|1jԨ7n\]p ;Έm?W\qEmV>۵kW=3ֳ>De{}^N̛7o޾۩mٗ-i֬Y\p1s̸ N,Zh6mZ?ZnO=Tc]s5~K˽xOJosqM7Ƶ^Ye]ŏXfM\~e~?d%Yf\xgŭZjwy'ᄄU{s^p¸{KM>}z&MĹ[~GGDĈ#JCGq3=P{o,Z(N:餒{.vTQQQ}9sf<ѨQR0 ~Ox7駟\.wqG4k֬dk6~8qb|ߎSO=57n\\2R%???~ӟmGqDs9aÆ~x,X ?ƙg?Sj3<3:蠸{^N:ŋ㩧38c~(<_~y\};tr!1lذ#>;:cƌQXX#omF}޽{G-o[<3ѷo;vlzN:?~|wyqꩧFݺum۶q}ω'XSVZc=5k֌8 r\\tEZ<,~8ccKƛo3gΌ{ߠe]֭.]ă>Xfzƍ?iDD\r%1k֬6lXo>N>cժUpxK/aÆUj9昸cСq衇F޽^zO믿w\\wuZנAb??ѱc8ӣAs=կJy/3f̈=zʕ+/"hӦM[^zE^^^tMkEƍ#-Q]w]'|r<;TׯO>q 'D>}bYfs=-Z(l?>?3Oݺue˖'67e={,Ӿ`wYFgݺu&MT .Zjխ[7;C+۰aCzeVTqɲ;ӦM?l}jժj*;S<_z5n8kРAvqe'N̞r߹qo x[$˲lƌى'fyyy#O_>nݺ~E6mN:)}[x_*zdvy'8㌒sޢE裏n2@=cYݳ du=;(ذaCvg]t g;v~fNyn!СCVvq+ޭ=b#d:u֭[~%KdW\qE֦MVZYfͲs=79sf)**~doVvˆ-Z~<`m1cFvf͚5+yoя~Tw1\rI6o޼7nկ_?޽{ϖYf{޿w8&e;=_|Cӧ+EEE1bĈ+|QQQ\?!֬Y]t8PN:)SnHmѢEqƀw]UՆ{@*bŊ⭷ފN:ED±iӦ8c̘1qWСCcѣGro,]w?O %Te˖ƾf͊Ν;WzǴiJ~GD7:v G}tW ^{-|ɘ5kV<3qgnk  ԪU+w߈#4?>7o^M6}#<_}UԬYs ٳ[n۷oo`s);w/2ϟ_UAջcӦM'c=?Pڶm6mrl#dXlYhѢL{qҥKSCvkFڵ˴שS'"\2yh۶mԭ[w[fM,Z(N>hڴiUS- @ݺucݺue׮][2<< #<\pAUQ- @-flٲ [i׮]D|ݡ9]W {:+,YR='pBVફ{キ`/›o^xauN:u/bdYVCO׏;\C9ܛaG}sh`5vFg$RuM;?yņ Jz}Q<%m+Wqřg| XxqDD\yѰaøcѱhѢ8"ҵk׸K7ވ}' YŐ!Cl [pw{\.?O<\..hذarRì""bҤIqu}k֬.]ѣCU+[@`…[gĈ1bĈ25ÇwEiF~T`rQH*T$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2}O>%uYq'/ⷿ/u֍u֕i_vmmqG]^uUѨQRm~m6~cƌ1cƔj+**jHZhQ0e˖EDD˖-y[ou{ӳXyϞ=;:*h& q1XzuӧGDDNyn4klՑR޽{ƍ㡇*i[n]1"vZ?0͛6l(oŊe7iҤ={vr)xMU.]D>}⦛n˗GcԨQx1bD|7xc=:-Zp@DDt-<8ꨣ0fϞov G[o5~Ov<ѽ{yr\rR}ߏz*}/e˖0 d{\eYU׊oj5k%ڷon'N: +ڎs$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2$# @2{7Vu ^. qxw߭Rv{+V{rwkUu)Vڵ`/#P-͝;7N8Ϫjk>2Z;pAs=5Ro@>2m;wMǏ;/"";vAţ>d`w ?>c%mk׎.,MK,͛7/ M6}ĉ㫯ڥJ9scǎQPPPs1w-.{Giܹs|1[,TH-[-Z(^ܶt], Y&j׮]N:%+v^dnB@ݺucݺue׮][2}W,qUWEFJ/պ9ƌcƌ)VTTTE9 hѢܡR˖--[e#"r! >={vuQUTў q1XzuӧGDDN*\SN1{Ȳ̲׏;@*лwظqcF/#Fw7ѣcѢEqDk׮q%oO 6,,!CT.@@`q뭷?|I|ߎ'|2w^2O.\.Wj4iR\wuq}Ś5kK.1zСC݆k׎CСC+gĈ)֨Q>|x >|WՊ{@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d =—_~Y%P U] ]w]<㑗'SoI~~~tIqWGaaaU͛i1cFTR/G}4x8ê`/bo16lXeT[ ,N:)`/#P-u)f̘|>}zUe رc̙3'^xxwފ+⦛n*նnݺ*[ Tk5jԈ={FϞ=j{b`^FU]@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@(͚5իW̙3R<8[.v_U]jӦMqǫ_}>1lذѣG̚5+:JkԨJݞRǴibqyEDD߾}cǎ1hРxG+޽{G&MvePmUGKGDDӦMo߾1qꫯ*M6g}YR@*0gΜ8#˴w9˘?~sFFaÆѿX|. C*lٲѣG-ZDDҥK[V7i$99昨]v &^y啘9sf4h`W"dY֭ԼuԉkFڵ+f͚-+,]t . 7pC=^@NzԼ͋;Fݺu -k׮خ/_%?m1\uUѨQ2o 3fL3T[QQQU+!#GԼ͛7Z-]e˖EDD˖-֭[ǪU8Ͻ['Sgώ:*3d.hԩS⋑eYrӧGcǎ\Geh"`UwGO|2eJzhWՖ{@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d HF@d ~axѳghРAԩSiK,}Fƍ09Xp.͋CƲe\.W?ٳgq-Đ!CbΜ9q 'ĪUvU1cTu %5r|;߉UVżyꫯ  ,'|2ڸꪫge˖w߽ *}($} ѨQ^~ѥK8ꨣJ>8%@$d6mW_}5ֹsxw/ ;٪UbѢE2ӊۖ.],-WuZenݺJ[Nޚ5k""vxoZvmDD;\盯wy'fϞ]Eհ(**HB_#봊غ=>L:5zUy͛;vܡխ[7"^Exo*~L^C5@e]s5U]{]I_#Eű[eTK{|9Cbȑy;&MDڵcٲeelٲeO>xGm۶ڵkc…q'Wu)@o袋m////;찘1cFiӧOG]iӦqݺu57ŋǼyJ;f̘f*i{뭷bʔ)ѧO%n#eYVEnxcرq饗F۶m#"__KѣG iӦ?<8Xzu\{sOdYs΍}'7 ~ cF.w%mrJ?|~,8∘:ujIo={F "///NM5.Y$78sJndYfQPPz9sTjG^^^S{[.nhٲeԫW/v'OԲ;;mo9rd]yyy|S|1hР8SI&F۶-2eJZ⯞ϛ7/;v?İaâG1k֬8蠃*x JQƮ*܀b„ qWGbĈqiŔ)SDٻlo+vmEvJrVXv[i&:u?|˼m*zO>ɲ,ƍrlԩ^e岙3g͛7/n^/رc\.M0mŊYƍ r\2&Or.i[vmvAeݺu;H1bDYf2[.裏,˲3gf\.5jT޶ "ѨQ^~ѥKR;?O7/}Ə͛7;iӦѷoߘ8qb|WZϦM>mc{G~~~ 8vqeŴibɒ%[\vgE;ߊeYW7RjժoD6{۶@M6ūwLܹkBz8e&VRb$gQzU7Ť" ˺*4nD/W]R/ ,2,"rF/d|Q<qQ__}f[5557lؠ߿ΪUTRR"ۭr<-ߟv:4'I#?r[RCC<\.vڥ7oL\1Md֏?z'<=-P9eT'NPggn޼fB!mݺUx|Z挙+%/:D" lxge*++S8 a%OӑEm̖-[T[[eLMG@`պzjFۖ弿R-ZHKX"`&k^wÿfBY=W.y,bTTTpN>m( y|r:t֭[h4:H$J\.k=dZ?1&HD.K~0ƨ?*lf/_ftRrLCCäw,kǎ3k֬1noΞ=kFFFlM3L"0ijkkͽ{Ҷ9|q8ݻwifH6ommm&SXXh|>9~Y}3Z2[mP@XC` 5P@XC` 5P@XC` 5P@XC` 5P@XC` 5P@XC` 5P@XC` 5P@XC` 5P@XC` 5za&IDATP@XC` 5g@IENDB`scikit-fmm-2024.05.29/doc/2d_phi_distance.png000066400000000000000000001114711464214672300204720ustar00rootroot00000000000000PNG  IHDR XvpsBIT|d pHYsaa?i IDATxyxT $!@ ,IXU eoh[*n"-TKA*ԂUdua!!!d2s~I @2 _5r9Y<<˱l۶ Hݡ"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""~rLCDDDrx.F\.ȹq\.˗/wIt"݉Piٲ%)))\ 0FeYXuNNNƲ,vyǨ͛ǘ1cHII$,,K/JUϳH5Y ",&L%;;~7x^{]2gڵkٳgSPPp箋>裲ۦM:\M杻 "sm`\~Yƍ߲e@xN9peSCDD.@Wϼyׯ{'f.qDDDȠAxwXl.={k.\.WF*;|JWգk׮<ض]#Gr{n^~e.B"""hڴ)s999>}q}Ѯ];"##iذ!ݻwg֭[NF2dk֬kZ:aٲeضKΕ8x wy'͛7'88Yf;ЧObbb䢋.bʔ);grr2Z"//x-[IN(..fɴk׎ڶmˋ/XTTff&w}7 ӱcGfΜY/^iԨmۖcr*sm3k,:wLdd$M4as~V^]iGaɒ%\s5 4?̘1۷fHVV}eСqF&NDz}׭[ǀbРA :CЫW/}ʓDz,fΜݻy+ȑ#у3tP\.WYoIkܸqcnVիǢE?~</fɒ%G+,:n7seС|'⋬];7nO~deeѳgO>|8nwy;ň#8q"'NaÆ\}3ϰh"+ׯ~geɒ%x C>3vwS An+V0x`㏙:u*C=D ۉ7={$&&ܱ3333f ={d4nܘ3c F]΢"Ovv6 "::֭[ӧO~i^yr/ l9+e.n;88v\Ν;˶۷c-[sa'%%٭Z;v(ٷ~mYj*J'%%{-^\\lǶ,oWrrrs;mڴ#""˗wyvBBv+}>?WkWʲ,۲,o^}˞W_m[e?~IJJ-˲l_~i[eݺu=Zvߎ;PsUz>9Y.mߴilwo?eYvϞ=jm۞9smYT &ؖeaaa {l˲ѣGm|o\.߶-˲?|Q۽{w/]Զ,˞8q}ږe]vʶm۶;wCBB _}?n\ѣvǎr?+/ثʶ,ճ^sYJmnҤrիWmݰaCuUjZkږeٓ&M^|=&55ն,~˶-X,˾kOy>,;vlO>ݶ,^hQéHxx}Сry睶eY3ݷuV;((nݺ$rUZje\.{ҥׯZdUHzrv\v^^^ٶkֶ,޴iSԩ_JȝwYG111vdddY@[bEYH޽m˲?Қ?m'O-˲rرv\Uy.5mڴrö*|ܢEl˲?~V)"r.,Ϲ8[n:0|pK=*r*<,Z;vw+|܉bZh *_rW_}]*6m66o\JrrpR֭ò,~_]v4oޜ]v74)66VZ{Lfؽ{7]t)w_x,[&55)S0eկkr~z> +ײ,ƍoȑ#Yv-ׯn"rNS +Vziڴ)'rqss!VXy?>7ndƍ򜯾jYoÉKWr}Noi~…\uUg}S4Zn]4jpj;fe]t*zKW2+...ux nzlƍx߿??7n,?((ݟ+]/w_|qZuT|I]|yL`6˖-+wٷoZvL\z9rM6U1+zݎ=ʆ (kԧt St?exLyرW۷oaÆRÆ 6lV/sΥu 0)"R(Ԡ nF ?~I/**bʕ{<9eYeQn<:P6__z&Od.\ȼy!CЦM^|JW_}uW?;(V=^~۶-('{?DrwuWYjժ:o =pM7-_ܳgO;Sl!C8/Aݻ7aaatԉ#FO3f.]J۶mٶm1_}t0| 7/L),,d?){e]_Ldd${eܹ RQcT.RƎԩSر#C%22O>7һwoy:Qg◿%SL]v W^IϞ=>|8M6eŊ\VZ1e}g͚W\ 7P.w!CЮ];Ν˾}֭{a… 2B':?)))SCѹsgnYx1999\tE|w~3f /W^ >h֬Yʕ+:t( ,OԣG.b[BCC9͙ŷD^!,,nܸݵkW/^\c㱧Nj_yvbbnۗ^z/yyyo[Ee5jT6m;>>ގvjk]l˲m9rrNkT۶={{ݪU+;44nԨݣGk}322q;v###z۷ fϙ3...>kse?͛gˮ_nw~'+\899qOV^ϊ<:ٹVXa>n֬j۝;wz!{ڵU]._3gδ;udGDDwwnNHHCBBf͚ٷvu ߻w} 7qqqvDDݭ[7߷-[Vd̙3meϚ5}sεSRR~n6;--}Gv= 4h嗕d=seYëHmgv5}uwcԩZolRSS۫lƎOAAݺucڴitܹ+dĈ|rDlI3gά/==+ɹAC*q!&MDRR:ubٲe\Ѥ׿5}cǎaÆK׏kҶm^DDj={oӡCUΦTjҤI宯t.@(Rf͚kr%T ,૯b7`oߞ &0gΜ*[DDjz[2o<4i%i'+V“Ce];Jm4mڴ,|4jԈÇoxVgƌ,_D}Y:K9-gN*e6DFFT o X~}K.!??[:Pbҥx^v}t9"߿?111DEE1dȐWɹOPn{$#DEE1j(^z%>Ǝe]w(9wiV (,,$,,pJ/va/^Lrrr """*((`׮] 8F۶m#77Ǝ_~}ڵkWm6lÆ +5\ӧO<?\b&.ƕŋs뭷hm"""R3|Mn喀s۶mo߾ϳuj !'ٳ'ݻw>s9@j@BBBìҀ#*Rݛo\pszz{>lYV[}230`/ӧӻw唹qirw+w@iNwýULMh#*:UYE3(?)|ʝ!9fO^cu} ш.3KYZ1I~7w~W~gXMmw(4ot5e]=]FÇr6o̭ZnI@(JL>a)բE ͓#@j@N/moMUVU7C.S.KeuiӦ)).LLC S^ ,7on [CJӕO3S#6l@&Mjzqf͚N||e1b, ˲bY:} uH- r vy}RSSIMM=ɹMs@j"P IDAT: Զm4o^2DDDDDNH-d6+VWDK9- 8x0.EDDDD(2~n{n嗷vӢRK|6ӧС2}.KDDDD)jM×1aB_""B.KDDDD(_o⋛z]ttI"""""B@s|7#=5CDDDD) 37 2DDDDD^7P۶qN """"R#@DDDDD$`@DDDDD$`@DDDDD$`@DDDDD$`@DDDDD$`@DDDDD$`@DDDDD$`@ض@DDDDD$`@SPjv0JDDDDT Rm JHD>V""""R1|+S)HyRR@DDDDR rn?eذN#"""" vrrvO>ɞ=F.KDDDD "fcV~Kau[ҡC剈Ms5ЬW\ǔ:ODdB^}5yr8rKǎaύZԜG]x;׼~?i R|ou#u IH;ch.0DDDE#!%n~nG}f͚I=N3gr*/###4=A۸t5 _j=myx9c9#GЮ];RSSLjj6qqA.{Y;a$$h] JVzeWfذa 6\s O><O!'x,RRdwx""""R)T"""]n{aaagϞt޽J3Xm7t7tiԧc42}z~Ygt,lܹ̝;o[vvCՈN HHHpUZZ͚5;chт[rӧWY>ƍկ"yș uѥK*}4;wf֭m_j:u:cرƍWK}t3y&,Y!""""SСCz+en7у͛Ζ-[(...СC厷h"֭[ǠAjluEPڵ8\. iV%uưaxȠM6̚5={Z߸q={6v"11.tBLL ֭_'11Xn ͝wsME$fϞ͟'x 裏իW>eaY 7x#1K,!??f͚q=0a„7zFŞA"""""raaaL:SVOjj_I4iRMW ItuEDDDLS-Yr=wӸq0|!""""FSz(^d$7EDDDl K/eq>Z M~Θ1qZZbWDDDDjZfڴL~82mZ!""""H-Gɍ-+""""b:Zbl =!""""H-ǹqGwO+|Hb5k >|?W_]m+R ۻUW Ø3VZOP> Gx?lIdު3:DDDDtRm}w[d4t6<ċA-[͛Ü9̛ל/wZ#h\O?˜1qpCӥz^/%;]ڵ 婧.㜰a#d9]ȹv裏ҬY3"##ѣ}Y駟ҫW/cذa޽+ShL'4n̚P&dd1Jٵm(."eo.zEDDȑ#ywyh׮ Gm۶\W_MJJ SLg s(H/EÒ/KCEF@_z½Absh\0 0$BCA 4kr,X@pp0w}wٶ0Fٿ?͛7/#GyfƎ[>."?|͛R(HXs[ B.XRfׯ}ԫWo%\ * nrEFFyf222\sT~ S^UE<|7|-ktu"""0ߤ>nHHH(tہ*|\&MeŊ~333ٴiW9)YaVwK]| Լ-]ko.(( eWrq=SO1~xFENNcǎ`vsrV NW@KЧU1 :V1o)7""l8_/>|S2eѣ?YnX{@gWm2,|Xuc`^ R7=߶n:tRn߄ YЬYJŒ3x'ضmM4m۶|Ѷm۳zb>9ml}{4\DD.ܹ3˖-#77m_j:u:1zx^-[F݉TOzba'0 """uСCz+en7ѣltlBqqI3ϐC=Tu"U{%oa """uUn6l=iӆYfgRSS7ngf׮]$&&oҷo_Ϙ?>wu]wSOIHDNi~عd՗;]8mO7 ++/>^zcY D;<4iu]~ 9~@X}x ˜:u*SNtT(Xej:1H}C|#9{ Ruïn։yФȹ@C`h ΁h+sz@Oax+¢Y """"R"e{ ✮HDDDD5 Rɰj|$t9)}/̄K8]4DH;wt5""""r.Sl8b"""""JC I""""RRkp R=*j蕈z@ꨬlxeht5"""J&1HRG=Zrs^jI 0oYa5H)Al}#4w'0.Y.}NWTr3 zBDΐH4w!ʄF9]5q5]`֨);[ l2D )A3 ~ЮӕTiM5l*3ߠcX ۬F5V0x kT"g8]dVM"Ru uO᫵pP+S6¼:A|U"f5-JauamX6(Zr[lV0BC"R)1B(]C*gV$/ ^ gXOEIư >U a5Vz@Dj5:a`_p1Q jSeZӕÊ kװ.C{@|}_6ĬPHRdf7~NW" ȰyX ,z#Y 2omk+!Xs@zb¶THߵ%+)ӕmmCHT?s (0O8. rļl`)1.{@B1-+bN oI-Ϛ5k| ||'A(ʅKS?r E!666VS 686%İ+|AǛ ե뀈f uBh~\ւ9 u w Sڔu a}If̪ex̻u|a_YAA$"URqyx衇 i0tQM!19]Z+Ȅ $$8]M"tE!P2&İ_^<VS˘x]\ b_qI/IJ{>̪zKzADV27ۆ{Uӕm?Oд8% 7/6H7~:8]^BbӕGaW 3WhI1Qmn)20xJ.Fh+j% "R+Nj n7F;]IbK?{NV4ԃG}>}UPoÖh>8jhaX7ՃhS򅂅aYޢxMR:<İ<1ODND?Ҿ}{+6+u(/ ǿՏFY1n"q ?,j!ذP9~02qVX(r ;°O^ %Hzl(ar)LjT 5G. t%<!Xf5B44m7RW]Dm.*~ ) }e\66#W V'B EK 3._a怜 KGJ qSĜ"OCT2,8T+z'd nXcG. Y~xqZQt B [06ܬϻ]P"Rk)efoE :kp4PҨ3,x&ȴ) 2.11sEa^ɭaħ"R@ۖkrদNWRfhG(&sFMuj" [K. ZfV;z(8>wYw;/WaaMDLD*n z)iTG# ca3#?d ^b6|\fʈH)anF4.͸ذ%xs(M kE!30A4t ǯlX0*< aNW/?o֗"Ru "ut(':]Iyp:v0-EqF-wkc% V)΄X [dΆpȱ߱aa "Hቝ0oPo(  9@6cdR8(6n ذ^c+pzeBYC|9%_(^}#"VlɃ7::]Ižj7ɢ 5g.ì+Is 8\ 3 ذ  0,fA}Bhɂ Tz@D|/q;\] ^* ԰z#M$ԣe@iē.513kXx 6RDNDzrNWR]f$6| %ڰ~1iE0I6Ұ`sb{KV1s50:f1xzmmjߗYF> pqa?#B Gu1,xOX-\@ EHYẌ́hee!X"HCHxTn1Ǹ(\A0VM1~1e=%s@B +`5@B vx0Ěyfe኉ 6kTHcօiu?JmmxyKs Dڲ9@ 5lΌ2yB !Ҭ,ܐ1fx33 3WFDNHA:f/b3p%'((󮂞b . g~P?rDj[)v\<:^jf5>*bc4N' #M9ϸ7LKq[ |~PCү㛚'ys,C۶)8|2DjZ@!<^ vUǵ'y y|y43 %i5;Bq&NRB(p6,AOn+wɎq"Ͼ}0kb|Qn.ŅN!RfHQ%>0Dw-$hR VL6OIo"ITh' l+%?|xif0'n~ :]?ۆ{ӕ^740kve*X{bX=>/EDND@YXzu>̀b><>bjV'3m*mA̛XDMjy R_D\t%g$eٽ=.Oξ}N R(8,~̃(lp~./  {>+(f:Ghnb|O-.Æ_k ߗF6z IDAT4Vp@lӕ;̚o{x#$1Rt "H|6kr`w!.aY%Kͅ Ԃ T2cBF}) ]ޖpyCH2s^YL&AØm`/۴p]NRN!< f BP1Lj\9޿t~bB.O޽Bvӥ3o\tEL3vX^Õ 'b1? {s}H6;>~fd'+ ;}QRRkbxW[7_`{rhkm*"[Kֵ(q! $d'df~L@$y>CuqM; 7s?- V$@Cu ?kT|;B^,ɏryA Nr K:"ws \Z;F[!vyÈ u)"BPν$ + EEefvr 7 /pw2`yw8묳|n&.~aN'iJ[.wDO0? s [ 02Ǖ$RGqG.;@5l4d ~$mU|jXPW 9f}l ܽjN33ҩ֬YÒ%K?>f` :ٳgbŊ#Gvm<裝Y bf)̺;%([lr9s0b^x~C=>X* "8pŰKDSJ^:3\ [_Cv!`ܟc*|BVj awJ?!4lm&e. q^hw  6w΂;{xnzr_/}w}mFVԢ"rf]ETF^ dw"vk9(SIVA|iwHԭNV4F`SDTV(/7ndnb8CN3^Z=ꪚþ 2sm&T20kn>@=q i?27vI"5AI!9 ִe 10~x&?bF/wRqY,4l7Ç5V@q&ž[I1u)SXp~?L0 CAA---_wUC.?|. OjjaG\Ԣ)X"ҮvuOфCP§sqw +FRȵ;Jxpc{o`=k!u vУxcN-߷u+gwS3?SrRVVF~xꩧعs'_w=h" 33tI"UKI!6-("QGDDNg.E[G(*4"kH1boG 9 ;J!mQj*MpIڽƚwuf?gf&..+ H Q|"2p"9Q3XK AxԲ \~}vGi DF@B!(Z= 9`-66 A?pFMH7l]H0_4~̙Cvv6L07|[YY̙3IOO'>>s=wpb""N1c=ȌRl ƐYۍ~!xPqӟ \O .SU%;k_کBp8$m7n3¬u)` ["-T@nGe,X_̊+`0%\ŋۘ7oeeeL4fD#?!I",H =rH|:l7|u@?uN<~&  N֮˼"Wj\ TUƍTAs}F@DNPtݶDk֬aɒ%̟?Yf0}tٳZB.]ʕ+Yt)W\qW^y%yyy<<3{iOh' (>o);~.epy*d-ex $UZ* "k9d _I"mZ~d2O? ð"}mtR\.3gҸ+yWhnn"m\.* 9Q[>Jf)k9!#8G"F^#AP+0VkL v'ik lSjȁ,Dh\cbO?œHba[C{·|=#())!+흠w{EL$w)ذ 4dvOJb2i 444x;ar>1QrCBt~/{sj9ƣlb!Cn+"OLB `a τ #|uϞ=R^|ŃUTTs饗6l7#Iɣd[\.6hwbPMoUH/QI"q\@ /~m +9Э?|$m ;EѣoHȰ3 OhcrǏgԩ{̙3 rsN͛wusr5e&L7~3q&MD(bܹvvDNʷ5r醓)b vG:!$2ŧlü&XX "^v⹌&6фۊ']*]ewz~4t >=|zY4zG"sD2u5EEvGJ* Gh"~inv˖-cĉ_cYV}*W]u ,`dddo3`m\ܼHSH'Si!MfH㏼G AQoO*VpH ;J[cկٝschgwHN@dgpۜ$ҁ-x>$"I(<ͣVZɓ#^O g-y')//~[ %y4nhwɽzᎍ"T@DM'Ed! Le7| қ4e/!NX8(]V<60kz . 력$zC|6z$,+ݰQG#p6p Qr6@pE4|gC}p ҽӟ lm42 QJ -D,9Ӽׂa Æ76hF@DN xxXLa7_dwc+l Υ}FnkC,Rk:lNV3d- +yw۝$g0Ti5lqHPA\k E% $dڼu C*([x.h΅F@ \@Z̰F77!@B6/񡱣 8fF,i`Qڊ?j },-ZD; vod4ٷm1D |@Pnwcr9c>: P$9 +޸EOϠeI"uԬ?< oY i).&Pm֡)kDH8Xt?SewGw`4'.0&d >Ρvh+c*{s*m08cԬ~S{s"h2b[~߾"Qew9u]C3騾:(a0vi(c ;NXΡif'nzK1}@%v CAVo Ȁ{34_ַ/4VeijC>Wy)~~^#dvG:aK ҝcȻ>Τ[C7U7k#  {|FD߸_j*1 t&`oMNA* "m]Ӭ{޷*K >)ݍIlY $Xv`v%Rc8Tڐcae77A(6k{Yw߾4۲,zvO9"5H''wSf]&J̺ ݰrN Ep׭;I44 8qw߾JK ֙uFIR^ԖC$h !́me1!EĬ#u ͡𔮺??ba`$E&`\K1QU$Rg9&FOF.*b Z$hd-\iwH-o!< Ra֙$C\"Ucy<ۜKI={Rv*ȉy4VÎFXS._]ʊp;kK❐肖|T+ҦDF78?5\~N5$T08R 7>rI;NP14FbGA/Z,'mx, rn uwsaQ$1'RcDpX[`s|\ kau`Bà{7nĕ .ͅvGKce1Dր,c`&8LwU*Et\A P&v9,N&Џl#h=J1(|dsC£F4|loCA* N)ox',XN'wAbvG:* "3Ct,}|p[.9c}荛|Y >ü=B(A"'8aI".gւo@Nh1뎇W/ HND $^ ;φ[r᷻{pߖh} 8Շ42H` fm I8)(,xߴsT, |C߉9~;'oYוKsY uT@DHɃ]0}C/71gT">|H!æaA?V@bT'`h4Xu{ mq(wN-\^1D H憟'T3:`wcaq7~<}͘wXwNcW< ]00@h,0woHf8GwhY4cD(?FæZAxhr>F7;a&nı.2ɣjj(;JֳSL`4;IPeւo<^eNݣ47ػ(bSڪ[t* " 3 c&h6kYXJ7V:ӆhzƍ4dRNlæ;y[|7""N IDAT;T~!5Z[ۜ$YsA$"ܰh(v.*&G3NOʨavG!$(ìnbGp߬FRoΰ2rܬ"W5ԛ6pD )IJc'o(zXHRK m5,\8؈Yw2k\40lrKI"%.2l_Zvrff9>* "76ofSSIăų2xq3|Yw>v40&67m O?rbj nZ65kőL̬uO"r|T@DNQa8DGT0L6o ~̺PA(b߰dpBa$5 *+٬o ZT@D )o,5&<rzh؝!bZx-yM#vr{ 5l.7h2mz4V@, rڬNe6řAKYDQnļ#j$ejFpd3f]# >Mx]C39TL/T$[xw .`l<= +_u<$46Ʌ~dy a 9ì|2hioCgCakRZ i# ii!"'AD^& [}ХSGQow6v̻F* \ 'v~l2j +I{W5LMHSB{ k>zC׃'uvGi/짎}eK&:d765 w`wz|w7k%BY랜.〿 ap[&u՗BFA ]Yk\lȌW4+.lV$)ͼnVUj1ki9v* "]̠x77 IIJ `)݈#/;0kGU-wӃe0kWYlt'_zRڬGn H@D Ht__7۝%q@,,zN H xIڰ" b}w45ZDlk7k2ݙ @p~ȉRbr5& xYiؚ.|Hְ3JtŰb;Z Џm]`> ݠII MCDJD& w|&ցЄYHư)֩a +Z M ?X@j*,"E9-Zfmx|4ba@I&D2̺O*6W$,<VpCa1pAY%AYD5X*"FD 2b70n`vGI԰G7GȠ# '+ AXdh4kIPg׺#>P1gΜ9dgg˄ x7}˗/;={󑙙yk * "]3s`Q14v.AxȰD|xqW@bFf%4-:ݩŰo + C7p>(ӧOg8N.bVXqmٲ7?ٳٷo\r ~GDL2q[ZXOf]j$؜K h"Pt{|ULb,&@K347;4X#6`Yu5k֬aɒ%̟?Yf0}tٳZBf̘3"[۷/ .kb?tq`l",6lTAİ&Z VF|c|}'[@ IYӝh0݊#Xg.dҥ\.fΜy9Ì3Xr%wa>4nw{GWd??hwHO"vJ!uk62$ap0,;~l4kj0odߺ&qaÆj***(((cu]W̢""\ux߰} °ҰCphXqHдh4ϊxh2kolѰbخ6xk?+$##_{.ݳyDD1~8/4_E fDHG5  0>88H hX)Z@rASD~ %a%wЭGЀi=_w}7;w'ꫯ+'O>b<`B2lY(6l V>B@M$;Anbi2xq#D 8a hE5nɰ ^B~2A-_7/x.Xu#F]wGG?7o>T@fANOy )p۸(Ѩ!ָ8h-e#fYW@bZey<* xlF>dm_Ѻu;f|feevUII Kn.Ry*++INN>KtQ{)-P\s^:$Bް-xh1,iiJp h֟. t`AZ11d$=QFRSSCB—[^#Gu`ږá:W})fi駟nwNʜ9s8sr֍L6՚U@Rqac _5˅f Z@Bh児ah1f-[fSLa,\U~|&L@=سg+|YVVFFFFUVV /0l0;7#Np:JC6q\$''S]8A?}V7C O9n(VrW؝ >pYͬda# ݹ [c.XǼg ̺z&a Ō?SrRVVF~xꩧعs'_w=h" ٳ']t?)//OM#L* ]eA\bI,g?z+p!6#|TװW&sWalw"xaa׉8ƬJ<:Mq&`X)ZGBŠan52!hM.XXh?Oyٿ?#F`ٲeL8k,:da3xgyǨ$55'r2zm T@~`vҏcO~Bhǫvx!.  ?iDȊn OfB EɅ f# Y- . fh0+tBRy<͛Ǽy[n[nT@QC`_h֬YLu35W@-_8ȇqō"t 9sL[+NҵYͭ8 n h 7HA4B?ԺS$u &9ˬ\,aRDaґRGA^{$b]þU5N+24X@ve֟NX&147D1Uzm" ok&B]2uQa i2wiVPssx+^J* ]߁:v'S?R 4..CM@Lh2o$ư\X1}M1Sb3SKN"2eBWQ F@L2+!CG@պKiS4"T@ [ :Dḩ̺~`\Y f̘ oqS\bV1 iD$tAӾ驰 _+">L+FA'0b9 ׀UBb}-=evCJQ(a,[GL;O瀈D5þHgFx;/.`P(>SID H-~2~ l-;q+E"rT@;opt4.,sADDDDstq_?*ٝFDDDDNu* ]e@KKh*t$!+~0ZxQHGQw1+?;T@_ +~N#"""""9(&^\^zػD""""rQiqD""""r*Q6a򵰿D""""rP3 l-󮁲 ȩ@Dhpxg ߅M[N$""""NDj X0;v'h"_w.|=.et"$1O -_؝JDDDD 3VX|x] `4"""""NDY`?0!}1ݩDDDD$ ).~u?\]s.\p-\M; ƍ;Hr)/jQ)"'epX^| `p9pL8bxږtm;3SfY߂<ߺ߁=N)""rZ;Fn] ccii7Ngl  zg^.&k7B `wRSeuiw^~8ބ=F }GwHmZ.'@犈YT@C%&45`jX OYqC:bi8.`*b?B'P45Cq)X.9^ ;Wsr/""""'O@Sƅ9'^:=#]q\svxk"tm=0r$';؝DDDDD@Hߞ£N[ N""""")XF6-Dnc>kw@s)DDDD4b$˲ˋˊ(+m+0]DDDDbXKCC.+!hwp["""">T@ ֳ-b]EHtS1ܸq>,_Z-![:w3* QNbJ\%DDDDDv7ܐLee;,%&Ӱtk_DDDD HC̞]eܹ*!""""]T@w 9eP fN糸R*+]3^tQ<כƏ/dݺv|)XG Kظq#g&55I&ҿc'xt{QYӛ~OfquI눈,#Xt)+Wdҥ\q\y3L2 @n/7ab>_*W\""""b]ҥK޽ƕW^+Bs󱭷TWWw>,x;cg͛늈+#X~=Gnq㨯g9}%99DONYYY{G`Y?a7VMmmQ'wJ:* GPRRBVVVODDZx1/xҦ4"ѩKA?^۽{w ,999۷隷ydtdܲc?LftӻėI; u1fD.q噙_\9r$Prի#//sB! m&u9_߇fsV?Ws=qG Z$"""sOSYYﭬdټK4440~x~_2jԨNH.vL2R^|ŃUTTs饗v>sN "_^^3RQQ^qmq睩lڏ (m7hl ښMDDD 7>Y`N/+V}{^x1vͣI&uNJ/v# 'bʔ)L0o>IPsFg_^ՋCzyYd F?agv+-cu[Sx nG]wэxSik͚5,Y3k,OСC={QKH{,KWGp8xWꪫX`g&##~DֲiZ]wk֬aܹy|̙3˗IS|Y_;/ٳs W{EDDKr9s<3f`ʕ޽mÞ%zErr2O>$ovq;C xn…|'TUUy衇<9//Ǎ 8Y ѳGdXر^6iԗ8.'d?p6at(_˲,8#3Έ׿g=Syt ;Hjp8M,ړ9#{"s0eJ"S$o_GˠAۘ93_*W3DDD:;ɟa<ǗtQ=KЕ[1o^O>Yo~X"""F͛x~@@#9r$֭#d{"'u0kV*N=Wmw`SL!pƒ~0a=z`Ϟ=c=YNM%fM+f׮frsCDDT5~xNʽKYY㩧bΝ|=âE(,,gϞ,&i7#FwعSDDDTh"~ӟO~Fe˘8q=},XƏϢE,&i7>_LC,9y<͛ǼyOvdD1րHx1hs1 CXEDDDD""""""FDڍ@DDDD먀HQN""""""FDDDDDD: t4* """""iT@ TXXiwb^"""""ҮT@ 4uf~3#|Rfwvb:+~@Mѣbw,b3ergC1zBV*;IQ1bI[787g-DDDDDN H6,+g1o iiu>.ȱq:̙3}q5/bYSŲ,3DS?]Oow #""""r\T@5 ###("""""E$ Yĉ=y}vG9.* Q*//jc(㤩)`w n D(wEDDD$HQR:PDDDD t IDATDDDD!L(J&6ִgDѣs׭1csk4* """""iT@DDDDDӨHQN""""""FDDDDDD: t4* """""iT@DDDDDӨHQN""""""FDDDDDD: t4* """""iT@DDDDDӨHQN""""""FDDDDoc*?PhK[z *.F хeIn$$nnh%b0Ku]"[ nHSڒ :\j-RN-0pΜk !k C+WTJJbcc5|?Ԃ (eddhѢEڿFEy^=׺u딜竦FӦMC~Z'OVKKl٢sO?ռy,+//U^^%KHb{CXBSLі-[ c` ˕ 4yd飏>˗=fJJ5~`# 4s~sŋuQPkk>sXB=.!%XkOKK$577oq|a%%%E?ZZ1nÆV%'7}sZl7ƨǯ1$I݊.+--QCC?[o?0Ɲ8qYmmojk[+W<[YY5Vvv -ݒh˓$?C=ӧkڵڵk_~1nt͜(w?5kV5ORFMMMݥVҴHӇW?v_rWkٲe3c ۷O9kRLLGTKWWƍ7+,,ԙ3gڴc-\ϭtO<)ݧٳgy ޽[wuW Gq!WXX<-_\_|ImذϺ˖-޽{z}m7|zJLLԱc?Y.Kls\OvZRnn}]eeeYq>iIOsFɣg={(]xQ|&g}Φ UTTqZ9ү;8үqƍqѣG}v#e .۷o/)Ayf+m]џ>}JKKZ7555%%%)22R---^mKOO }veff*:::Z@uwwQ ,ŋK~iĉ!F\\B26~c wYyyg͝;ׯ>rGUUU}^566رc(Fcɓ'vZ555#GBK.]"0jpd7n$>|XeeezG)IZ~o|ݻW^٩y<YFzelg@/XeeerG[l}8rO[ll7_TNN*++}zgUPP8\.UVVƦ&)11QZx{\R)))UWWWߗ^zI.w«G<5qDO?o gs^ZZ:1rtY c.\bw}JJJҶm1 G%TTT ؞1Sn^}Uegg[ntvv@G?"""?QX=׫x@ZnURR|hڴi~i&#]|ٯq^խ+//WDDV\kc=iwk]y/c<\R&LUW]%I;cd zٳ6g544… a ̙3ϙ3G/^ѣGWBB&M~kèN}.SI:x}?@WAA_:~xHjExqC#Atl, %JJJSO=wyG;wԊ+TVVK'$5chi#yURRZnvޭo]N Yq`h| =1kݨ%S߻o$|Zϟ_)77WoURRgyƯz<]]]#@G st>ρZh,Xs~ ĉZqڵ֫gH;:::_Zڽ{w`o#Ȝb@{vm~ߺc804΀UZZ׺o/))IjiiZo[zzzF2iiirtLE`PP۔)S>804H\}Zl\.|ͪZUUNkԌdg̘}>UUUQvv0ĉ}{rrrgy<ګ$}7 dW_)%%%h5bt%Xcɓ'vZ555#Gu u}6رC .}wkkk1~m ]Taa\wyӣ[*//OӧOvoG s>1'cx1

SYYf̘Aԇ~իWkԩڶm8ݻw;ݓ}]8qB\s]F:YYY9sf͚xj˖-Puu5gAF7|Sjnn֦MdߙUViҤIH0q~ms)tRo̢ELCC1Lϟ7+V0'O6111`"4ߏ?ͤĪ Lvv~g:;;mtwwkך4en6k׮><#rOFMNNIHH0&L0'4gϞ0 }>;q5|5@XC` 5@XC` 5@XC` 5@XC` 5@XC` 5@XC` 5@XC` 5@XC` 5@XC` 5@XC` 5Z9YIENDB`scikit-fmm-2024.05.29/doc/2d_phi_distance_narrow.png000066400000000000000000001341271464214672300220650ustar00rootroot00000000000000PNG  IHDR XvpsBIT|d pHYsaa?i IDATxy\U>̓8 QYTjNMZ?,mM](Mq,nYs9P ٿ?sEp@8qZ{8?2L4q˵n8(Q""""""NDDDDDDF8q """""4 @DDDDDi(Q""""""NDDDDDDF8q """""4 @DDDDDi(Q""""""NDDDDDDF8q """""4 @DDDDDi(Q""""""NDDDDDDF8q """""4 @DDDDDi(Q""""""NDDDDDDF:`*muba%ZOiBCCUVٳgcX3gNջvZ, /RQ }\ڕƟ"b>bI*UhҤ C j0 (re^Yq5Z8p G~\IMtF[Z<9z̤Jg e"7"k)} `ĉdffμyOhڴ)ϧnݺ9;w.W]'sVZQZE߿ʕ+V?W}""R]&LȕYhwy'۷o' f͚l L4M=W\9ʕ+Wuxyy^u\4KVJ>s:tcxWrlkǜ9shݺ5xyyL׮]Yp!qG%&&&{VW_}E ___6m̙3>d9r|z+^^^TV=ο#FPn]T-Z`v>Ԯ]OOO*WL=ؾ}{-֭[^:ѥK-Z#ٳݻ7kڶm ]?K*U$88={jժ7LbбcG+5X,̝;ZjˇuYV}5k4oޜ} gΜaСI={CǖaK.sQfMiԨ˖- ##_~uEXXN:|"~zLz>>y$jժf_+GuЁAchCΝ;رcW^^^TX]G}xӓu2uT}?zi9Vv;vлwog244zu;ʕ+sO8BXXXUVBOSzu[9sfL^y֭k94fӤIZ*<'N(qȵ)0xYv-9ӦM˵rƍcʔ)Ԯ]xN8mXx1VZL8ӧsoذcBV^:ΝcժU<3l۶-^x~ݻӵkWV^G}s=l߾.]@ӧIIIٳ^z_|іwΝtܙvJ>}8u_}m۶eҥt͡GOFݩ[.'Od{זwذaԯ_:ӧY|9 ??CuN8I&GϞ=Y&ǏgӦM̟?N:ȟ0GN8_~g}ͯ`2da_2l06l~kDڴi#55 2h , =*T`ٲe3g5ٷo͛7wޜ:u ҹsg{=P}srwҥK3f )))z~Yի۷o'22^zQJ70ӧ!!!˖-cÆ kwwkj*N[?>̑#GlN|||` tԉCʒ%Kxg?x|=lذHʕ+Ƿ~ԩSg֬Y9N6#GRB}Qʗ/O6mle 0-KyRSSMWWWbo>׾+V4k֬i&''*9b֪U+z:+j>ie˖۲CBBcǎ322o4 ܺuk 5-`\u?~}zzYN\~}|'N0WnyO={fJ̽{[i?iiifNL77\]+Vau1O8}tti9g7 رc'a֭+\#Gحޱ}gaf&MK./]d6m4 ra!CLjK߻wj|v}9 1 0wn'0 bŊfsٶ:ttww75j5k֘a/Rt{([Q!Ca?|۷o7!/[C5 0x0M3&&ơwm˛˗7sSϚaf 3g7.\0+Vh6lȱ^3 0;wlKKNN6===f͚(ܹi'ضM>4 O;M6]v9ͳgϚu1 u|5mLHH_t 3]\\̸8[ÇM777RJ9~&XVwACݩTa2e8 Ya0b k8=&LF m6[_9ByrdoСC >v /@\\CD{=233?~< σÆ ###á:P^z(^)S{{{kLJ7|3G/EDD[f$%%]u1 ӧfKk۶-$&&kxVZnݚ={\ә?>ʕѣФI~jOW_ͱ-,,#FV_a0c <<|222>|8t0x5H!XR$>ᇙ9s&7|3}lٲH]gΜ_g:t(״i\iIBB-ph͛qW>8p}X^a8zműcrXB׮]Ν;qqqC~X,vޝk[ݺu͕^fML$!!!G@S\ʗ/o-((#GФI\۪WNzz:qqqvHG>޿?ɶwkԾ}bR? 99mvpw0yd2/Ԯ];Wzd<} àyy!;wJ...~̛7ݻw۩S'֭[ڵkٳ'WݝӡCV^ df~zիWhݺu֕羨џ}תU5k4)HpY`3m4j׮Mtt4SLaʔ)oA:u311f͚C-8p +VՕz-RSSk5Q83gzArapҥJLL0 =t͛7'11o] fΜ9y+PBq9*UdƗsuurv{'@{8gkA?{[^/:sZݼ9pv]yXuenQk|5O~ :ˏSNL0իW&hѢtԉEg.^0`@Rʕ)m;_fwM @6l@ff&ժU nbggԩSlذ?qϞ=Xl+/n޼z몎 p7믿{)zիo7|g2{\/E/X>/_RRR7o𹌌\ kYٳdffc[FFO.)qˊO;tz?D xx֭[GHHƍ7ZZ_^={0rT񤤤'{wڕբ{ 믿?ϵ=zPNy<͛7;JO>+&Mb߾}[V-LuVXa >z޸Ӛ5kb>q۷ӦMbccYp!w}7_mkݺ5L>3g1r1e~'~mmF8}4 .ҥKۅ^XQYstf͢o߾oߞ}RfMv?H`` |A{<֭[a:u-Yٯ 뽓TׯOIKKcSOѶm[[ޒ:_ aʔ)9FqS\9VX_ }"r 8w߲ŋ .]*T0 0gϞ !Cʕ+>>>fǎ͝;w`^<"xxxfӦM͡C+Vs:䘃===ݜ:u٭[73884Tbjr͹%'4kԨa[gm߻wٽ{wJ*ٴiSO>1cbbL0r5M8piX!ך iG5 f֪Utww7+Wll|Ws协7njc֯_6}}}po߾͌O6ol۬RnV^֭dɒ6mdqf L???]ve̵k=+/_nvլXaz2׬Y#_jj /5j0ͺuSL1322۴X,)54M|7͈4 #yj5}]iӦw}yw ͵ٳMŒk {yw){:337nYvm:Wka㸸8sРAf@@e6jȜ3gN`~{UVǕh=ڬ[aVPܹ?:\i_v4m۶w`!!!a< 0-#ĉs[ͧzʬ^a|̙3S+όi ƍ~ 0uH`,Cڵ VZ] vXVڵkǯʨQT.ǎcǎ9DDDDDJ GPPqqqTR;vЬY3]x17o }ׯL8cEDDDDz =TR(XŋSZ5[Ys׏e˖]"""""ek.C6k֌$k*kKH mvOEDDDDw @JHJJ ҳWvd}^B/!^^^J^dOfŊvХK*WԺؿsM7Xҥ|m9C+We[F=sL6Z7CDƱo>o=~-=iaj{㋽\))qqq$&&k)ӧ//w@Eq斫aW_?!,7{ET4ng>/ @EBΖr 8 77Kr!'I~ӀFT#`)WðT^=}LhL#\{X^7RL ~ ǶQ../.0ww" wZ5=\`hs/_>>$&""""Rhk=5^&zاDRrcE[D> """""4 @DDDDDi(Q""""""NDDDDDDF8q """""4 @DDDDDi(Q""""""NDDDDDDF8q """""4 @DDDDDiH2zhe˖\VZŠALJ:u0d/11*U`XXdIq8)2m4 3pqq!227ѣY~={f̙<,\Fq<0aa}8$˜ IDAT׺""""Rlݺ/(y @5jTAi۶m]Ҿ}{~m&Mk &0a„=q*H-^WWWjK`l޼Ǐ@vX"ﷻ3}:9ғ׿?Oppp,)d<<aWN퉉OLL !!!Q""""RS""|]n׾}nFvZ.\Ÿ-[аa|;s ;w&==5kPj\y;]vmÆ ',W\uIDDDDq/7m}!**?#GY+GGGӲeK Xqqq$&&k֣K$665kPNuL<3gH?~ """"eC­WUă|]nohnFvZ.\-}˖-4lp뭷fwF'Npu))F@_n|ޛCTT~!#GVFe˖!Sqqq$&&k=o?^z۷M6OR"%4u DDD$4oޜ}2vXSsѣDGG3sCpp-}ٳs~z^|E[W^yUVqw0bLdƌT\q9P)efE ..5ns2~x͛GBB 4om۶n_|ATT?< ~57XFnhܸ3ٴ~{+_OOV56ƭVR%"ag>(ŋquueС4̸q8~mϼɅ ť\3C,ZeB*>tȑ15G'DMH>vExx89қ5kݻ @:vŋqwwK.XΝ̞ ~$իİaѣM @DDDDn @kw'N乯=;v\rl߾7|֭[sNjԨQb. >7;۶Z5_l@qmUb*""""R @򑜜GtOOOۗ}߽{wt/{W .3gxm6ND.a,[uquuDi Y/jb6|xyy+=%%Ŷ0ڴiC-Nolb<ϞӈDT& `Ĉ<\K|¸p!~KO掷z@DDZ` ,ȑvܹkIH>5jڵkp~~~-[аaBy!3mڴj5ŋ/!!!Û3fL"Oӧ3THȑtKt38y2NR%. -v{ܹs'M4F-){O>DEE2rH kehZli+..Dpu:Nh,_;w38@]byoٲ8=t+r!!勵'ٲ%Nb׮d~5'3l۫VuF 7jpI/\[ם C""""; h޼9}eرSN̙ѣG3f s%&&U[nMƍiҤ ܹYf̸qv ))L|s]b)ܹLVʕY"P{1thEnՓz< (UZ1]DDDlSRs2~x͛GBB 4om۶MUwHǸ2j5yo裝VWFhQ5f۶dȫVbN}Y_#p<6w^(xЬ|A6SDDDDHHd 5g=xцiuOƍuhڧXsV?mp(&+ n7Յm!&UjP2T(둖 iTo,)1iSs766:ʺu5*^zUíL?& {Wh$Ǣv(X#8i,EH3n*|ҽPڵyX,zum:t-r aBpVĽ]`AvY="""""()Cyg+Sl$*. j~>`A0Unӄ^;7C۬J)~'#F|ϳ϶`퓙i2jT,oyĴiAnPi7+7`o;QJ՚,}p)f @ʀOKp:;OzɀGYoĈ_o vh[]:JYόH?@JL)).\HFr̛w..͝j|- W-LqxEX +BE=k虬kVq[?_>+74 i 5Ǐg۶!l? ̬.P*YC\2ğz#;o^ ^.ad)UM0CDDDDR(3 㭷9OT){ \=0M2M{¬YkzեX+,?Մ6pSW ,%N8RhѢ=lt^`3ztUaՑ&G]ӄudkV/ƭ5aЩ~V]̫H٥zmًy \Hn!< o ZAPέpeKHzE6lHoB %+<;^\vj:| >2f1$ t=,xS4lId_y' )05Mx?mZdw Tp|$;q]""""5 eE,(`:};+!ȁWÜ0ow=i0j7t +2Ow@DDDD2wP})P#yr8̓;Al* 6axc f֔\7  \bb&'0n\\]wX >~ <  ޅpġm I՝fQi%0𺞖rHZ [ ߝ>C/z&-8oz B6UHYiIM'4ڹb!b00MK@ dS%aaW""""FH)t9<< \22`p?04٬& _ӰNw Vʧiyݍ.@oO$PvEDDDJ5(Ŗ.=Gξoj; x<ݹNԽrh 癦+ɩܒxLH?fx5CDDDʞTFMPP޴lْ+W:obb"C% ___vڕ+i4l???UFdd$7o.'QRJ%$diSR n?$wr J˄'et|jbS< tZ3]DDn dڴi 03fBdd$7nw?w͂ 1bSN%>>:py1l04hi9r$'۷g۶m%yxRB4ZV+tT;x~Xe)Y/dƟp|Ʊu>gfBM7wݘVvah\n_|ATT?< ~5* dl޼ŋӫW/Gxx8'Ndddd{ѷo_̙cۿo߾Ԯ]>f͚QJIPH)jE q7 p2?^ݛ@f='m .J$ M|n y\unŸ2tP[f?~<}Uf >*WL~XlB*Urb˫JAH)a%nݷ|+VC@_0aߦ?8ə0^2Mz_H0[?ojطIąr0Hk׀VM IDAT.#{|mܸqf͚ğ -Z`|g=z_Rb7b)uB&B6yr-/ GjASV&rcN&&@ ^%""׽Xsg8qXOW'44 k.6nHhhU\ 7XRlTLӃΜ=a3|7t w' 6\ >O Ǔut?{U-pwdRB Mz@:"{QAQ*E%J %$$L231r1@ m}?y㛬>p.NRtirV,/%O]1]%;䒊4, !Qnn.6===/~0yyyҠAڴi7Lbb"&MO>_૽qIR g[n0i6{Vf–69 M*(PUFebfFGd!G@28J \dS@6%IsK[MSiL%RRCBQA9}8uSW׼}wWpеkWt1k׮4hЀ~I&QjHR A1pn>N>0 8JH:P(|eZRN!(r]K:YugLJ2DUvmW{wI\LL cÆ PZBǎӲ{ICA Й\vV}gfҫ6}D3(+D@QTBq)/|L w{ܯڱ/b[{Mn:233l͛hҤM4az/27oތuׂ'%%t:/#??aD"Oбc˯76o!h4D@]ڇ;N:]<橳A> #5eD@Q*8HBK0+MBٯ_?N'3gμngٴnݚpN>;}.IGRR˖-YJJ K,wXu`\{ǎ8pM^dV~XP[/U]adOnL3*+ @>>⿴! rƗ]yxW,:Zfpaj~fÙ]!%.66sϑLtt4s!!!ٳg_?~΀hcD37L~Pxr!P@#1pcшB!D% H)ߔT5P3)ǝȁ>9]DLXuN65 }ᇌ=[J|V-sRsmVݻQ@Tս&Db~&Lsj̦ ge͘:B!ʇWH9 A}%CgCkEA2MTU套^"u8GZy\}e#Lgth"ׯ_htK ,Z:QFQtͼ`Z$zG;.=|=[C%#ΜPe_#) KUe_@NJ ޡB!D%̔BFo/0rZ'di ~B >XA)g%OlT\sN /pP9:| ̔ ''&@S % IIH"BkB6 Y HAk2L(:w,ee' [ ݡ0+];;B;}P@Oݰx<"gT2N/\FE!e$ XabZ(I%"L7ޡ~֘7tfJRUul,Du(HH08! BQRH=>2^yc$LHbqprb6:Կ@ 6,~I~vGk'*'Nᡳ'/=T*2K!e$ B0C&Dҗ:q@ V@Ujo7w8(6_xpfܹÇ_%BKRbsܵP@&$Ϗɸq(XƊNr0'8Ɵ:C c3PAQ /_O@ml5@vBZf\ծm!BYQF3z]]FNEe?38Ƣb䘰G5O:GіơM|jxF@qi!i/ti;ݰܝ;jX={V J:3/B!($)lT$)la(!*竃**.R@ f|G¢y8 /eȄ !qPtΝ;0ΉZipd/<0Nw۷U? ynB8yK!e$ eљ"X!{ ”FV|\8䩏`UbQopb&8s QظEEVEg`߿&^Զm8dBQ1L%/tQ^r]0Oe^&̃)6yu BW|L?(A s r$hM3` ԎݹΝtz5~ܢ;S~=DD)BMQFnr5&_My/L= Q/}Vc"r)#ǯ{w.-B2OQTDUwlWKr]1S6l1{>.8 NršT;67V/랄|9͆-he9CDu}m!B r %LUsp;u-NX腧m,Ju =A)Uk@v&nher f_cY@zBQI"C]c8j>0T1\!xb6LJ_*m~=V} RgmO.(961o U6ůܯB!I@DRSqu"0QoI뻌BdPLĢtHʍhx^2v^ /'A}~얟0]sa%;4{n=ZB!($C]CĤĔpkԇ߀[͉$G:m]4T~J@||4c^=#SB!(d(W\EFI>T{y Z V*98%kOm<￧ >G+^ ܰBQ.H" ,a\80j> E{᢯y`)hrϹ[>ys[Ԍgf﫯h8hӽBQ,Q(\> ﹋ Z*ѯqa, Tb;s'YW1n.đG3:r!BrF qBp U맠3j~|fL=AofM Ѝ1k1=zHs!D.{ 'fBYr|jÿ~P~XwGA~|[74w./&Q,ؼS[2믍C!LIGҕ+DqDCe|U[ u 2?T{j<EP Y&~+,~"uc7>ݫ !б7ů=Df)$ B/ 59+(8^JsrAnqq'Bp0_ޖŰ^ ,~OCE_/dXA(VflZ|<{,oc2HBj 4Ao+*6I@Dŕ5 Gx}i܂?W."X/To*].XÀO((x:z)[&p@<[@F0x#B!IuAYާ]P#)c ýʙ ٶjWxAd`wp˫p `2p궪}~P&Lޮ]lތs't0"B!($ٟW_,Ci痰qpB[| , ?z=G#WB!I@DŔ{Wq.}tf aspCB[O6y2E8:X!$ bO[XIx䜃&oW Yݸď{׽LFO?Qkj~'5 ic%BrGQ1.TeYIu*lpyh W:z!BSUң({a|wA;4Ӣ*I&>UxP{,ڵm 9J!D-y_GOUa/WP:>EС/\Hɓ }YCngQ߾䥥qXnBQI"&']ɰj|9Z7 v/Xkt'׏ܸ8j,YB`~ک._ʉMoZ*EEB!$BZ +IOajҪa7gYC<<cc SUFd…[]BQ1H"ǐ 6öaO)VM[rݻv&Loۭ5jl6^LxB!$LGa8};!CAp3V KqK7t0 UU'LKG!Dr|:I!|tɽjOoqq=zΜ о4h [-gf&I'x֯Ox5mjrz6MBɓiԨbB!?I@(ah[(ȇj;Pp:ݟr{Kq[ZREuH[HMo2r$&֝1?̡dB!($8|7\NXqXF7UUZ#oN︃jSQh5NY:`G{шBQ^I"Dq8yj+uɇd~=ɯJxts'UBq$`7nժU֭ۛ[vZCmx衇 ח.]sk3g_jOY[laѢE;:KÆ ;vҥKٸq#K.o߾ 0:u/3rzR[BGJ Y֑v-+WRpǷkW˕hN6M/D;-[!(׳?Opp0֭5k2b֬YCnݮ]kAf@ tR, =l6Æ cƍ;Qz#'5u'mtBch۶BQ\g]vp8hѢ%qV&M2JB$&&v>;ufN:iX|GD11n]<7Ƴ~}L^^>G^[>__o䓘bBz<+%NժU߮d袄IR\lO5]q[Qe+MFD` R*f?6ɬXwc\]_!Dv=.+Te$ n_y^^ů_|JJv n'y.n4vƕXB\3$s\\MJ ($)DXXؿN^ V5i 7owg bРAB!ĵ`,Xpg%4-e ؽ`3{z^YҫY|3g*Q:IRMn:233Dz͛7ФIB6i҄ף%6oތut yzo\v (lQqx4q,B ;vмy[?ӈFWɠصc=԰aC, [n_~󉋋cEKQ 1ׯN3g^n3{lZn}TӧOo>%mXlRRRXd {*|+,ט97g q];׭vpQ#qcrٶ 5Xj2e y 0-& ヒSB2'T#_@׮]7oYYYc?sa%3 }1 "}Km֭i.]^Fѣi8c7{6͘! !tx ڴiCǎ1b'N`ʔ)r-t޳(h;w./9Νq|kb(LL&;ƌôi%66sRv}a l!wNrl!{zΘGmӡ9!(`n Ʒ?iXeBB\gMvZƍǨQgEDfcL<Иٳg__ȬY5kֵ(L>>xKHI!_\I6 S@wAvzЫ6iƒ69r%}ϗjB!zVj۶(GdBq/,!!u?GOq#G{HN#GLѣy8.@>kۖS^B!D& AQ( ^SWo1۶Ч)}y'YrECHݺ}KKw!BD! IEys§OSϘtv\ȉÃo͠o%az>iݚ!"DVKz 1:wSsJp:9ڣ۴! Ջ[( bc9O`B!$8Gѿ -Gr EQV7n֪UnߞcwIѣE+vmmDVףZ!噜%Dqu,zGCD{Fӽ7{V^ATBàruNf*WR<E{w|v%mN 2a!Fa0ԏg@#Fl`rϞ%'mB!($8Dֆp$s) Xma0qqN_)nuCXh ":)QL&* >$M_$/3M aZ3{6^|v̘B!*I@(.գ` W>3N^8 ~Ls=vݡݭ|ŗ2Rw4dxCZQW 3lm( y7kǎE1h3zG!$ B~P]~a<0I;n6d x5iB̖-$M'맟1oʕu*BW_EuXXiW4!BT ]=%]/  L/ÚDxa{)䧠{ ^XMMDիɍ`flb(tyubz=KB!X$BK Rէ`H8v`'P_nvΝX#"8ܱ#iKj( =N,^_!BTN&*à'a0kDՇFOZ;kx8Q?Lwп?ɓ'*^L=nbwpȑ+!!BwrJzZtw=Т3$k?-/,'S9=nPbxo_ rr掄BQNI"(8[}%.>>ƹO w( U_{)S83iFJB{r<Ȋ2F!$ BhRR– y?UG>eBfv2:7G?+~>.hPȑON{8zJFv͟ώO>;B!D9$ p` ,v{D@rqC!0jAr= O5Aы0e4l^㮾n@𣏢\z ,T~96 O?gٱ#u\]!D-w1 -_I0.$ `/|AuAJ~wKnW"o.P+ֽ.`}0F؝8SR8X*W&hؿ$d{,<7ll^؅BQH"E׵vN[ob8 $& ٕ%#?{0C'LiN<vÝilxm?|+BrG!JEJ5ܯw?gÑ_`Wu6 a7B0hxAHx8=;b( |@O[YSMx˖Ի.B-XBQ&tQql>PV?&a+ݳ!+F5ܛۋbs`t6S,j,^חp<OȩXB!DTT¹f;KxU/O*yp8tX\8NoǴiY}˗m|B!(w$bUaT o I-x6\XٝR8P[-:y2)Sfn|^ݫFđg|lB!(w$G'(w%5 Za ; >n }+/jSv‰qfϼ2e 'OutB!D# jAaP=j}K˳6û1F KLT7N7>N7 /=BQ)Xb G^!-x7!?B?2Uj8jNLT'Q_ n/r 1&? o&m4=jբor駩4t(-[jw0?aGɱB!D% *_±pSa0y=R7Jʮ C!yXlF mq`$8'z)E#al2VO?ϕܝB!0I@DU ׅ#eyRE1YA7_wC=9!kdlo@ !=Y˛L}T_ TxxkZU6 +5*f3զMHN-\H{ر9fgvOB!($ Bq-2|Mt:ҷٵ=kRm(xv;> oN2S9^ O?5};vįwo&L kߟ-|@Ob2_,Bė_OwI@D9T{^"V-D \81AP?Sx0nLI}/3v=Ioƍ9g?flgV8r%uo}!Wo ?rL{BH"Dis;z aCx _k~;}_ްY3U)~%Lo~ը5kƑ5k-BrAQF($@QPbW_"5UI(}:VO ]9]ύ!06L׏y$ƻ`V.Wvٱ#_[!e$ ֧V^⁧Lq#ٮΨY^Py ch0iڱMCPXTwݻjMI'q>BQI"+>`7U郏WTN9;Zg@`J.}ox 4"n 7S!e$ L"\+2eVeZSbQ8NhATG[?n{ Y`6mw8ߪU 6e]B!($)E./l34G*q2ʦ,rI&#dp8aYx*@C]ߠC+n8TSoGb[ t/]E wB!4R )wCBhE-!S,L!*&.!8+Sâކl!syͽA0n/pp-4_x\`0DՇ?~iիysr $6$nl8!BmQFg@ ➠QP#D1\NG2N\-dBo$L>YaOm3@YշTtjxTǸs@FaRN@?g66%PNи .#873<Z kX(&5ȏ^̓G !l2؍% vxH@ T1qȅj|O|^&є=L\oQz.ZN=#2d0 TM@<"#% ᒀ!.H'0g6 $0Kh(8 rꜾ%B2MR(# B`{~_U`K~\- W^{'|w,4z#>5_0H\\׸p8BSY&QIEUP/YYqU `Әj lZ Jped#(F !L)OzePFTDH09 4ސc6EbK8Ir7<r, /̗Ϝ̸V^]hK-@%PPIh$ U O='U;;tヨ+3s`Eu:qX< O!DٕرcY|9ҴiSCO<ȑ#Yf .Ν;3uTjOۼ}::ubhʢsdff /`X:u*;v$..fŊ|¼=ٔOպDCN:#)װ;GW/CdXƓ0D0] nn ""e@f6˙j$l뒊^Tjm۲l2.Q04j95*`<== ::~ڵ;wAקOعsH5Rڴ$+С\ڵ+}Bnsvv@BGK痎a68#t_z=}ʫyӵq-:d~ K!o/_۲f15 $D:ky,""Rm%ѝ3㾛zX=,,2SNl߾ݻwKttZVnFSݻwӲeK|}gϞڵwp ??|X(@mxbg9 !о |6/}WAVu#aMۼÝy,3nnNbVzЀ4p`&Yq1Uw7:簫Jn3..$֭[ǰapk֬axl'NE6m?uT[Cزe 'O.׺ukV\̙3 R54۳wC/vrZξ+W„18,{2H;;bBH# WqqqٓѣG3{] `֬YE&$$Ю]"e>(-[dK+qO8p ۷Ocƌ7`Ɍ1F1vXS^Lۗmۮ8wW,N:צ1tjw8?# > k}X`@FǮ79\27RV+6l{e$&&ҰaC>ZjUb)6ϏO?>}s?Ν;uVBB~ZiÃ۷3avɄ xw:t(;v 88ؔ+%_??-￿Jf pcRP_x8|<`z~\FV+0$#^3yϛ=[z; """% bɒ%,Ya-[X޸q";:ܹs;wn)UGw@jX_Vش}0װf6 ^uh\.͍~tu20#Y9\v6.4%"""R2~}wzp+ 0b(| 𱯂`#\v2v *lχޞ,ȹJWXs+u(uDDDDH v=lt    mN&uo v0Ky޵>Y,ۓ;Oecgf=/:FDDDD9P@~:?ȑOpwF_za\,C],4p܇c6vR@%~Lܫ,cqn@owYnVYX,A&k֨\]gXp+xY""""%S77|E1=xaq(X;Y [?;;믡g}k6ּ|q>ja= ikhnuwg>ڥ[DDDB@jQ"L[ VgnV݆v%Vy> sJ3fѴcƜ5烂&= c[];i=Mv"T6wh б> 3Ά""""Mrʕ޺;W^=ޘ=ep7p{5/w\AjvuDDDDnP>:{2qb(03\q `@!|l/3W+xa=~nSW¦[vVsZ>=;w^c̘0~~wʻ '1 -Zc`w_m!?U )[_-z.l<m0մnMM#haЬDDDDPܬ,]:Ν'7IpXƝ"$č!Coa pc;xppOw0ó=oaVȻ>U ׇ hސu@N\͇2L X;7 f3 Fv~C7@DDDD̥RCjfؿӿÇwXb`A#.\gĈqKp'| x>9]Ӄ*^ gp/ !ŕ``<6^m)c8rfŕ5HSF?yc΍7ѦMnn} n]3;s5ka!Y/>k9ZICݠUQ՞|^ۤ""""Rh~ fXxA4nСp>ڵ2{֭Vxwpfnk27EW C (R{ҽFzuqs2{HH83o^#xݓkV/ o =o+G5>a`"""d/UԮH%SZea Ly;=Mi8'Los7^7΍Fxe^YQߵ)&բwvEDDjQ;؋X)uH-1`@4&Mx^NqsKN9\ٔ0k`x,pp{+UUy+m蘈Hy,mUFU~R)"ԩL1{3fLg{ڴdĈt-ה2bS X;AP?q}3r-|{컬/2^@^Ϸ\:6<܃?nܹ>,}tŋЫo9=#?['M7]kh-AdSF wfͅ,W!?4@V.B#DDDDjZjx@,˗sy≛\:BbbC硇Nq-G_ !)_W1ضNa8;7 㺵a.HZ-o'IZZ?յo;zkWoK9ylyMhzOu .Q6h ]'""""R \xqѠA%99٥c}YVkwuذv1u17)smxzu3hzeT49SOr`N ~P Rl6 HLL$$$ ޽{r_?p:u gqW0e-̞}{/{)sk??μyˇϰaT[`r6@JĮ]HJJbС̙3YbK\;,4ԇ 㥗v2m'_߱l:tplT nKf~e|34>z~4(&fU+)H!XHJJ"<<0|s˗1LlZHL;ƐG׮yo> 6nlAjj[oD~>LJdd mbӬYsӧ]w)/+"""R)"99.]+޽;YYY>|إvZhAPP;wZ=oLؓ3ХboBmy裡l܂ ڳzuS3?A&i gƌ3^}/&3rCICJFLLLRSSi߾}s7ɶmx/_r;۞#Yȑx~DFU@7bp{;iiyޝſErr6?9_XaCw4IiНzW޴k#`PDDDv0 rss]@NN>'xz}… 2eK,;GsX-ϴiкЛE 2o<̿8>J7̘Mӊ'ڒў;[Ҷ'=tJ """"5GҶm[-[Rp>*55iii4jԨ\}iҤ L8"e#Gdȑ:̙1߃sw`nFĉ=i*RZ_ܸf_Ǝ fSdfXDDj+Wr"e.m`N0tLNؾ};a`ăݻwKtttaǏk׮͛7 -4ԇ?v&MŢE_`uW<ҕqw7' kaC9tR9CDDD*[Iܷoӟ"qqq={u]p5k0p@<<< O8AJJJϟ?_Eq_u/OO7͐!yL/UVѹsg~a_K=3Gwf߾4~{?o%s"::1xpkvmժDDDD@JaZٰa'OfdggӣGyZjUb)2L `ԨQܹkגCdd$SLaڴi+id]DХK/t'II߰p~; r]-ׯ9͹@ :EDDDXd K,qXo˖-/^\U2w݊no]NGٸ({fٳ 7ԘN1K* 27iF>͘3.\by4|Bn5Z(ѻwSϡ""""˦"ða66I'99-[nAlޜ@llsmisAD*6mBi&#of3F^OJx=7"""""hZWjOĉK9xE.^ȸqhР~~~ƒұbĉ ///V+'N(~FF4o///4iή#; R 33{""""f1`8@bbb6111ݻ(ڵ о}{ڵkǗ_~YjK.qmʸq㈊ܹs|g]/O\"U>*3j5DDDD[RRv"))COtt43gdŊ|RS0̪e˖닏{v8lK̡"UJ늈H4"""Vy[> Ӽk=zXΜ9S))30\@NN>_YS]r͛s|ͼk̞=R%e""""R< ԯvKuVbcc]j'%%hK -9992UA;, 7t͛7g׮]r)Znk@p9N,ZvR۶m˲e\j:<<*iUZZ5rNV ?Vy|@DDDDjm2'ǨA]KFBBBЩS'oߎaX~6Qt]^[n:usk׮R#""""R˵m ]WAÕ| ..$֭[ǰapk֬axxx=qYYYiӦ牎Wׯ~ $$M6q)|yAR. """"b8zѣo wB7 Yfm۰le/_fر H?~|ayqwлwoƍǥKxiݺ5MxR1jeÆ L<瓝M=xwhժU0-t?3w\"##2c M/C_,21]̧""""" bɒ%,Ya-[+,rGę~ѯ_2Q6"(i@DDDDD4 """""b1FDDDDDDL""""""Q(i@DDDDD4 """""b1FDDDDDDL""""""Q(i@DDDDD4 """""b1FDDDDDDL""""""Q(i@DDDDD4*jW)rQ5M@DDDDj勡moA5ەMDDDDk ]~U _6$t1FDDDDDDL""""""Q(i@DDDDD4 """""b1FDDDDDDL""""""Q(i@DDDDD4 """""b1FDDDDDDL""""""Q(i@DDDDD4 """""b1ŋ7n 4ϏX]:vݺu{エh___ڴiäIt=V{Vː pH`0` 11.\HLL {%**?07&!!Mr^}U6l}*'A^^*^"))]vСC'::3gb ǯ]>})ڵ+<+V`رŎٸq#6m"11{^`)/ dz~z`Ȑ!{.//'| &вe ^*"99.]+޽;YYY>|m9s+p%OaeT 1EZZ RSS9spww'..H3gx={6~~~T 23 \Lӳ糳ԇ{z)SbUPCMz """"@V[[R;)))DGG]bhm߾cҿ"f|'.'QF:W+n۶-˖-sp>ԪaViii4jȥK DǎIJJj-: 11[oH? 0P6mҹ)r˗7m[{h8OLfԨ% #!!Lgԩ۷o0"q޽___qQOxx86lǧX'OӼyb 4 w< """"\۶tRxŹ>$qqq$%%n: LYQXĉdeeѦM²3gpwƍ )</.6d,XsiŞ"""""gϞ=op't05kV l۶ VXֿ;Fbb"۶m+R?<уwyVZkX 8p_|X1114ݞT1MPPK,aɒ%mٲXՃ>ȃ>Xh#B1FDDDDDDL""""""Q(i@DDDDD4 """""b1FDDDDDDL""""""Q(i@DDDDD4 """""b1FDDDDDDL""""""Q)ř3g:u*}֭[ӧ~2d;VE=@J‹/HZZ;vb|+W۷/۷ogڴi̚5dn6ӫ"""""5H)uFzz:)))L8/\#G2i$&LMHKKcܹUc]V]\ &)H) *IIIу]nݚ~z(-BZzL l68@n݊=׽{w=Jfff5LDDDDz)Tt^JDDD RSSHs0 rss]UeggYjuDDDDD:@nJllKuSRRJ =999E\A(9x`_;wHȑٷrN |× )c@>JOރt8;#p ;-3|VCHG@S<\t>}}X,_șp܀WI8s JWOCFzȸzl'=s{v.]ž6)N׻(]\ܰav;RmX 0UٳlܸѥC ! HYRR|i6 ___Ǝ˫Z3fϓoVXQ\꧈,˗/3+MUٻw/]tHP'`V+7x#{)ݻiٲep]w|r"##KC""""5Ovv6Ǐ箻2mڴa޽GԉRN8AVVVg\\SNe޽8t[la%joNDDDnj9LHS'`s=_ͪU3f L>^LL ۶mf]rΝ;Ipww_0 OHHEDDDD&PqjbX0 Oµk?m ׷o_mV L8M6a۷/ͣEBDDDDDDLEDDDD4 ̙3L:}je֭ejS~}2dǎKE]xqѠA%99٥c}YVkVK~L2FCϞ=׿ұyOH(^lYaʹsL蹔Uff&3gΤcZy]>^oij‹/Htt4;vd׮]X,r }%##iӦμyؿ?U{)+ƀ8ppBbbbػw/QQQ.Ww77)|A֮]ĉiժK.f˖-Wũ׻ٳi޼yT={6͚5SN|.[ CEFF?ak֬1,uV3gaX/,%%pww7?TzbVZeX,cڵeϟ7ׯouz̙3 bUM)ݻwŘ;wnaYNNe}O*r.]jX,c޽UM$ٳg 0/°X,oұ|8!XϏrD=~ںukի+RgСedz~z\jfq٤z%%%θq <==;v,v"׻addd[5QjzѰaC27Wo@j!Ɓ֭[wѣG̬IiK({deeqaiѢAAApkx5KNN&::Ȱ8_W;<2b\}%00___̑#GRqLJOOիDDD{,55niii^<,^kCj*nV222\EkEb\3___F… HLLdՋSNUYz-&W0uWϗ o~A|999^O|x ]wE>}xYhQwX>"H%غu+>>>.=*kҫ%} )RG*_yw_#G͛+*r]=!U-M7R{-Tm۲l2ꆇW|xzzV칂FU|6-Zą ߿u\ڵk,^,77KҳgO7n 3gHII!??ȱ'f.3aۧp-ϷHY m(Pm{9kVZŘ1c`bbbضm6ʕ+tܙ &M;/2a~BBBL}-fw|WL5-[ ۶s9tz+M6t2sL>|]tQQQѹsgN9kժ dgg3qD7oNXX]vO?~vJ۶m?YsgT*55o8BBBԩof_x1C aÆжm[&MDFFF=۶9s&ݺu#,,ƍ3~x:T۷og4mڔ`6mʘ1cرcG}ǎyW=^Kv].< ڵ#$$-ZCQXXXn]=zѣ9x`+0dZlIHH111 0?~deeqҪU+x'yq8̚5[UW]U""QikXv-C k!66M6裏ү_?JٳgcѢE̟?дiS %K_ԩk$%%_pyѱcG7xoP*7oζmh޼y)!!ɓ'3}t&Nyk׮^V4-bߟŋK/UW]M7ĕW^ɝwɪUxwHMMe…^Y~=_~9iii 4#F§~J>}O$O>$111 :X~Gy.\իW ^z%Kp3dYlk֬aÆ}.2;ưaر#7ofܹ|嗜wy^?5j+WdȐ!DFFg1m4>oQ>ׯϘ1c?wDEE9vjj*&Lw 8FqAϟϐ!C1cǏ/SgAA'==AI֭袋xx|^;O^ lv8={϶,ҥZyn߿o}^gϞm[ee3m4۲,W^lۺuhk>xK.ÇpKlNHHq˲{mslaׯ_^b1m0,޸qg{aaݦM;44k۶M6Jω߲,۲,{̘1zo-˲[li:tȳ:tmY3x=e˖eYUW]ex7eYvTTݳgO;##Ν; [n:9gdY}mn۳}ӦM;vW_}e[e۫6۶7|Ӷ,˞8qbj+^\m۶'Nh[e?޳vgup8w}k߶,>묳c̘1eYe~>m۶k۲,'^{yiiiv۶m퀀;99ٳ}׮]v``:nh[U*??>p@222N: 4sss+0`SW^ymY/xm̴#""-[z7""&S9yUw}mYo>϶\;::ڎ+>s`@3a۲,{…W_m;Nرc^5*} ߃,)))e[m˲3fyl۶mv@@ݺuk7;w,󜄄p_u.b;(( |FvVVV."pٞmW_}mYiӦr׵kW;66R~/zeȰ찰0O@[r'o߾eY^atҥK+>l{m˲'x;wG~^x2a駟}… m˲kj[eO25`"˲ٳgZ^2s8@f aȑ̘1ŋ{[M6q5РAsW^ rÇrغu ԔУG2=Jݻ6}v6o|aXѪU+@֯_eY\r%ek׮M6edeey M&!!sٳgOCӦM),,$99~vQf{ͱm4jfW&00>۶<Ҩ_~^_~eEFFҵkWVXܹ͛3ׯ(}t+Wdƍ۷R]˲-yLKKl+HHHy۷c+=+V 99<˛?¹[n̓ "!!zg}P^{5[+:](ƍO>aĈ1`ڴiCxx8˗c2c fΜiPN>~#㗏>\.g[jj*.߳,cǎU:T3R~y+'Yf[yIi]':w}%\K/ꫯ&22 ;wn3|VwZEDODze˸袋ܹs}M?~<'O?cǎL>;*u.""2"5`ǎtرLpݬ\3<{=>3RSS /ĶmVXQ#x] һ9VFݱme˖ylǎ߿r״.B=ZfQƍ 4K ~t” oei>ҡrΝ;~cbbbʄ܋õ^˚5ko={6[/?cH HHH`۶m^m'x͛7WxsўK;vl?ĉ=s!~o!&&Ç+Æ M6dѢEzjrssk[n(ߏmeTJʽLvvvsN䭷bƍ^۞x 2335jg޽{ӡCV\G}9sXr%:tO>\p3f{ȍ7H`` ?سgg(wLBB^_u,YrZu]\wudggsmDDACDNƉCqC;[n\s5j*6oСC?~k֬gҥ8N:wL.]סCx n9 Dv(,,d޽|74nܸ̕|.k2h Kpp0]vp((3p@ ?ХKطo?v"993!dr.B&MĴiԩgnϢE_۷/<@y*u?K.SӮ]; BV8v{aŊ۷ZNdݛ#GҤIV\ɪUHHH`ԩ^Μ9pu1l0:t֭[O,s#aÆѮ];fϞٳ'{e޼y 6>ܚlْSr}ѭ[7:"##Yx1tܙ~9&L`Ӈ#GڵkYj#F`Μ9~Ջ.]? "" XUnoEEK~3}tf͚EXX}e̙̙3 TܱcDztR\.Ww7ҥK^xk,YBDD9뮻J5G%==j*n7cƌ9aDQ8syY`o&xz)SԱNKM:nݺ+0k, i۶-_<ZR/>֤Iݻ7/2+WdܹDGGӴiSnJVz{wÇ3}tnJz7n\z /@njr9=~Kҿ#"ReRL֭[ڵ+P+Tn+ٳgs=0m4>_̎;jl9ݻ;*|H!X'99X֭[_Ι3իW3gFI5b0 &^05VSU2L$]GwJߥyfn&q_*LT[MHݣRv7|m^Yf ^(ug;>$ԡCE@=ڴiF]GTNJTT7mԘڜ/hڴ14n|ctߥxEAᬪ FGG{bb(ɤD$ 4;Q'U1H;|nb¹ǜ{G844轂ʴDLI)99-[PTT6b:v>C%xEDDDR +{S͛7{f"##y衇5kwE@qիƍcӦM ۶y'v>"""""r/{,>>c,bDFFbY0+… yxͥgϞ̚5KDDDDNS9]vtDlfƌ̘1&JZhԨQ.A|HH4DDG [yODDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDDD|FDDDDD$;;ɓ'3h 4h`̙z+ꪫhѢ4nܘK/Epb L֭[ڵ+eU۷ot?_L4GrW;db %>>dbccYn~;~xƏuּkx]F= """"R%AAA`i/44 xDDDDD|.339¬YضmӦMwY """"s#Gdɒ%0x`?W%""""R7cǪ}Yx˫_ϼy0`@ADDDD lՊ:Ƨ;wΝ^۲ N'ҥKϿo&wm۶{M1H-hdw?cU_=zq+#00C2uTӉ*X""""w8j HHNNf˖-y>|~|G{DFFD *{WHOƠ7{p=C=ĬYؽ{7-Z`4oޜ={޽{ILL$%%7|_#>"""""U /g,O>?Ʋ,FMdd$eaYƏ{IOO'&&>}4H"""""Uk׮Hbb׶:~%"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">"""""">w""""r BGR)R DDD.{Y\@DDDDjݫó R4DDDDDD|Fr]H(Rn7ZFMZNZFJτzBDDDDj@jC) UTH-pYW"""""R5 m=ࡻ]H(˿ ['ah&Hbamp}4kY"""""D ϼ^&uC(""""lkW%""""r@ t™С>cw7|‡y@ t`,W!""""R@DDDDDg@DDDDDg@DDDDDg@DDDDD  IDATg@DDDDDg@DDDDDg@DDDDDg@DDDDDg@DDDDDg@DDDDDg@ض+)HqH@JDDDDT Rm\}WHTj_3Yvv6'OfРA4h̙3+dz!Ozp8,_+(Huo+3YJJ SLa֭t˪-[0m4ܹs+g 3;dbRDDDǓLll,֭ϯs;<=Jtt4sa5XHDN[^?Syц4no+3YPPU\3""&JZD-E2s.f\l `Ҥ'""""SJs|i #5Ed~xF Aǎ.SDDDD "m+r93?"#MǎA~{4CFp84&""w5Ь_Tǔ:OD8r77~+u@_^;:4=Cb#k[Ʊ< +r<<^|([fH^=. x"""&<w?CF=m㴎+r<ݰy',,^z_yo&>ʫfǹ/y≆ߖY/\CDDDDz@N`ر|GL8vڑȐ!CݻI?eEEETUvm.?¢Eٜ}v3g1jT """rIOOm۶8jvJ1}'T{oSNL4UVivքݻ x|Ag{5kp(xH+sA͛޽{{䡇b֬Y޽-ZxO믿0k,VX>?P9sp:~m?Gyд'{ٶMVVaaat'=‹/Ax#ѣPyسge'cYG&22˲cYmcYo8 g> h߾}ulܸ߿?QQQ3l0vQ#VܹYt/xa6!"""d׮]nn7. wioGbb*_K-g>T ))2Kv7'<˳orr2[lȳ_JJJ-\3hРj{qMHgUviVzɵ^?ÇiӦ 3gd޽$&&z+;޽;=z **oТE yj3#ŨQX$_n̟\_""""b,5k=oiiit҅ ЧO>`>cɒ%wɓu־} } Y9DI"""""~rL6iӦUObbW)S2eJ bV}\4MÆ^RCDDDDj Z믳t- wI"""""R,^|!Cѻw5'**%TH- . gfGk+r}\zi8s4%8XCDDDDj'd vm.W^ / 壏>DDDDvSk`;v0d>:v b愄M-ZC1h^`DDOs@ s옛ի[Ѱ>a@DDDDJekgIe-kIBB9#X+P1҂x8. ߥluC t pC8c6X1.b۶`B@NZlbb]"~VXbϞt~1CvW| ۶ٹ3j=MB( }uش)-[o_W tвe4m6MiS֭S~(!!N9êJ۶wNN!{t.229xGDjLff> nwxo$'MsN,_߉6mӼy!$'cLvNgǎ,_7@nn)РA(/<.k]]%""""ADmhvf󷑗WĹ2ztk4| ۶9t(|((pyt* )]*$IQDFWשH5Pj]ooitܘDeY4iA&W":u%iiyё߾^4ö)3<+R@-X^ľ}׍GK˖ZmJDD綜WCǭJݦ"Uv`B>d oC.KDD{ ZfTqNS*?+%00##G-"""~}54^]T7B&}1th{xc """"R5 rR9!+WwT&GV rB;vewHO㫯Fӷo / (Z R 4CXVZDDD LWgҲeVݢ!"RY%7n?W‰MS)c͚ 6]6n^`$"R'6!JYc2D)~:oӹsc. $"RLca@%a "e),ؽ;ߦM "rFsa i$Br\"q2D)y\qŻhэDFjؕ>S܆6Ha= !O+ ZD,3Sn%66%)2I oaoػJ /@ yw)^ES"Ls2ouVC#"6MMpIwCA}n Bȡ"8 `aL8MvL!"Ȍp7?pGС]HbX[nÊ (kV[hH3lE=fJn\Hlr 1Q7n.]4ᩧZǴކ@5k  VH!dJFqs@"pDr@갿m%[8 S "e +2-DCaO /9fX "|`EhH-Vg{w:SdҤt刜۬v"%+T֨4.T[^@8+3ˬ7+0_QHmRG=Wԯw)"'dY`Uka_DBa5 զ.nV 8H(݆̈Hh:h}g+tA1^@EQV/8v 9xheȒ øUpa` 1DD6SH󫉋Ǹq]Ȱ"#;fVCƍ!Wq=/LQ"&мIQ8&ϰR|/ެ B(4,Y%wh F"R9 uLRRo#'"((a,2nSd qu5m ]%Ce@Q/˸h\q۰չDr@Y~$ vw)b j9),T7[y1l^n@H7m]ɟc`7,L"6)"R9 um$&nk&::刁BBRlժxݻj55/'հQN0#I2'3$q,@Dj):䧟uk*Gww)b`5kE˖d?MWA6/7i^HxɟlCqHa$du"Ö"R+)!o^ Ow)b6mcQABB,7Qְ> oAN dN6ka%r  "R`y= A`XM"R9 ugmg|.j׮۶ /eѴjh4lycVQ!aXMp̰R2+ǰ@(0$B@ Q#rr Y ^X1ۗAnY &M>lV,:ka7cfJr<Ȱ(q3c6,H("7{7w)bcm$%ŬOwCl. @۬{|E HRG[w@9'ߥyZ]~[LLGWTaà !pPdз '%LqmXM"R9N /)tw)eϬ]۬~5vh"Qƍq:ۗRDG;0#dũlÖ q $% he@, 8pb\ &"RGlT@L/r+Pӂ]G@PRRjU;8v̬Ohɭt od`) ;(2,8pW"[įyy뭷HOOs<\ve'}_|O>Ɇ K/矧e˖>\͠kQRvJM.+}WG`` _~(*rsH],7*dPYP]Z*(i[rc`\MeXƅVucK/q7/!CXj ` Daa!>,w˗/O>9rGՋ?gJjBNN!))9lR7n,7O -XXX7oj3YMƴhf-*ٰ!Nb[--). w^K +!)ߌ$9{$$@z \T=\*bRRqqqen;x`kܸ1Ѭ\k{jj*6m g8~Hi.ͺgժI(*9p-jhp1lzzDWYEPϬ65%$d؟fW5m0Ϗr=k8H7%8Վ_>ppw#0n82334iض]sao91:;]l ɠw.ˁEݘ@RaW- \eX(*z)XjpB4@Pqe̙k[FF6p̾Ty"O=GaڴiL:2~x^}2úc؟)5l222u"FXp;NK.Iw)^o/֮Y gԒ;Q9V@ cXC ӰƾM>š?q!t?c5q_=z7..aVIIIW:̘1l߾ƍӶm[nh􂔘Ϭ߼Rcڶ-TaXRyҷo uk>ЪY v45]B6,dÆ`QHa(2jMMxCuƶmھfvzcһwoڶmbٲe\pT;:Y♲IIY'S#Gr˝\}Y.M h>Ӭ$hjX9\mZB6+? f̣z@qeTX+X61b.^{ͳ-??DzY+99-[PTTt=$''s}hbs.gH -s%bw Q:6ṇKr6 -]䒕4pj!44MMfI4lũ< 5,Ӱ7œJٓk~ÇӦMfΜ޽{ILLC1k,vMſ4~m>#Gxx8_~%~!vÇ))!%F;{n^[СhȬ;.͏?1lY-G 7Z5w%ޒ2!2BOj!Ęզ&7!XF-kcK!͵($@ZRYfc[oF.]X`}cYs֡CҘ2e uY?n)(upm?W"Yh;6W26m'; jl]m+VQthf=$)tXԤᢾa&ܸKaCl'<90I]̴iӘ6mZ$&&z@ -[VՉ*5m+ضԩի}6X:;Ϭ]?SmZoӡy}W-S@]TaÝ = "z@?E-ʕ{Y`#+VЭ[f57m ԬAnBrIibE}⢁a= Sr4l O "YEg<ג!C2l櫯r>ls;vBa7Gdv+=kFxipq1a\6 9<X!5]d`eؒ"R9 "uLQqҼyO=Th,.4P~Mmk7nbjٓQDn2qk`H=Bp4| A_ZfeKᇃ̜y5aaf^=8  3kpA7ps!8(kq" kG6H'nz#"f؟P)?p1c>/лfp4lhVW7WR/IѰイ| z@!ڰbZ4b "u\qŻtܘaFzUjVe(RƦp4w%r `aJV|8ڙuQQa L'͵%0(洈TY}Eۗ嗿M,Xpf(ԫ`p,Nߕx5ܶyda'I#hÆ`咁Eq]*b "g3Y,Yr3 ո9^aM7Efޯ:X IDATf(ydK6D;ͻ> ia,rq&ư~ePs.1l74s~Hڹ3.JW_E 4OHJ*O2ol_} w%eg7P[p0m^ inXQC:aM. aN 릈T X1y饣ƹv ,0lhBf질Tc I3.(z@Dj/3gmOD6ǪUвY|mWrf^54l=o9Aߕxs18׬4)$@R8FNaV!pZ/9U "g۶yٕ :K/M`ٲƚ5DT:+!C kX] f<{ Zo@1UiY4$ˠdsԸRa̚'"$%%cpv}"|b2'vm. 㭷⍬{i3Qjd1fN0x,qJ0!L:ex(q= .qei0OTp啳ڵ ?xgdgf{fU VNQ^DI!""$RD"Qh.6Zf{"K^ 9ʕ;sncgs?\va _t:&w Z`;ڌ&K\#)t R 3, Hr$3j!Ic $٘M;@*9z4k_dǎ~8f _߉޽Ō-8utV;BV,T8 ĚOI!% b` H6hXDl܂%I6"11E~e޼=!S&0q{ʪQjGn[~)Ib$IEߥhQKS=L>\C,E7pvUԎ=j VhÌҨ'؄H!$% & 7@dF3RgEf㉿&IfFJd(/^}U" vNoGE5G-p}ʮD;7 X pY1RCO& ((x vā*G' \V5 OxrkJ,B$*Ν+hΕ9s:IaޟA0E#y1p5S;R -?= `G`ܢH fGڝf% \GZ[b_{QHEEҡC _`K'< |l;SAڋu3@W7Iw-A '证Ci$"ImFaҸ̔OlixڑW[BvЪ<ܒv$E) 'Cw?7fc4l5GVfn=x5D'X\DSU~%Ip2$ӤIf~ U!6|>UH`~5 1D444'$ ~Jބlz'G* eI@*$a$IǎѤ-u9RmW0y$k})90ڑn`}C,s,[$I[dc̙30oQ& WH7Jv(Ip H!U~,w,1$ Oz'On:fϞ͛o ^:o_&!7nرclܸ=zлwoBCC6m}$I61xp?͌>L /c`LxyNhgF luW"nO@Sx)'sGp6EE@Z\ 8Ϊ$7nΎaÆ{ё!Cp1z͏?`j]A(ve`NCQ`[MQ;v1]q-<``uIƷ<`\DsB& pz.@E\RwLl<ę3g %pv9suY~}򈌌|J(ҥԯ;; N[7=-7V;bcf˖lVd׮\51%][bϿIQ0pq=z# ޠ,QJ)gTlĚN6H1. 9zNцgLmC'd~bF 9L J> d9ʘ f_>w7C~^=V$Id]QN"##ξfĉԮHڵPs]]] UVᣏZw@""R T)38 t|꓏3gѻw,~~OV'!˖|q- ZW'BpiGL:4 KZ}K>.dC.Ҫ04FD7I>̘cݨ smLCwMdO_ 8M pAMpd K>$ỈgϞL&,Yr1^ϲe #((D"""0=7))~clذΝ;coVq\\i←vH3~xٳ2rd}ñ7 Y O8]30m7oVȑ e HAp3v~>jrjYp T#wHF'C'B#O= ISGIf㇃  |p4I>b9Vf] DKw "u ȝCD_NvDdhРzb$''SBVXAtt4˖-s&MbʕDEEX0^~e.]7 .DQO_2eJp+칁K;3h8m .&Nl¸q\螀D#Ǿ}ٓ\C_us|y|vQS!*wǀ; 0G to5k0+ zo7IF"3R@n",ޠuQ;{.$b$uMbq)7Wٌ""\*5RIˉxV\ԩSYjԪUm۶Ѵi{?hjZv 7o4hЀ+WRRk%OO'vLjs& @~֒/ϖ}:5I3Rd>G 'A *H]AK1#wH,%R]Ǝpo9DY|C[<Y]($},$iVKN:IcntvGG(tbm$['7*FäIM dpٴ7xAV8С[9k{ deg8z4$#II&$$5e .3 <^vE,.8E/H5!H 餲L UlSw b/BdyӞ Q\AO2od,^FF1ADH |__FN$I*>ߍ?l@͟Ӽy'3gW_uN Y2`!!4oB2T@Ī͓0 g/ZV;> el`GĆ30|ΑNE(\0 |T x$r>ėc +q8F; [<×8JWޥ}|q1J";(MM9pdnsw˪dd"ѪU9%cd䦄 1,Z+c̄ 6BĽʕoʮ]!/o@3?~&~?OσQ`iYrĮm[: 8(`؝z ۚ vEhOuɈ/#$ʴf0=>D( b=Ntѡe:݄I>̘8*I>rC,A0[I>rO`ʀ*Gd!I@vUv89ѲeY^MS;v`g&WW Ѵ-||I7.u번6fKN!t ]`n+'Agŋ;`)42 G@yh 03d&~x ap/IyS( %ф4aZ7K"x# iJsp,UN52B3qDqqq!,,={hV+Bo&AqvΡCuZ9;SP`?(4*TAл )!%3sZ!Wr儫͛sKW=[ҩmۺ>0{ t:K/1G+!%MK<9H1_a$I!s'>Rrt.]Vztɣ#oHUCM6b4%F{ 3 =(| ZN]fӦM;J*l2:viҤC7e{,''Ç[;lI2P:Nt1aBI;:m?͢L75Y_JÇٻ7ݻsY$WW :1p'ڹao/qdfo^%'O&nyE; UQc`;AV=(Hs IDATqGK8TGSR vLӖg)vHDs}, oby],2m1ɓ[ٳgo0`W[oő#ݦM"}w:KB >7{3qb2^ҥ鴘LJfE:ѽ;ݻ[:e@cp rUJ>21*|Jcb$ ?sYDY|yn$F 9bNt-cI>ruܓ`|䝱!|<3gׯٳgRRRؽ{7ݺuYcɺ IxrP 4jի[4HkO_FP_~O\\E)ő#yT~>}b3ɵ$08 sC`){t[/3Ӗu&+߄NY m$)WӉXNr7:Aj* 18xM.ݹI}z QWa)6_@Cqbs1zW?T9 6p(֭[dۯE,=3ǎc5b`{Nےju]׋+2Ty#Fx{,)Ɲ7HHaPWlx} :T}Q=X^=aR9^AƂ?D=S20l汇xI+¨vH$sELrjRH6?dII@de鼆"7c:-''{V^m۶gAJ6G& 6\9)ˋ/ҦM4|K/q$ ŀ̝̙Y&sKѷ'h1Q5MQ` nY\5@̣u9Ւ|`}D(L'Ud w>'&w\&;ҕ2Fr,Û2u\#$0B.\^ `*q~מon=k\s5'{03z}{(nܸ=z4ZJV!Q;C1"≊20e>$U99i8чAJIwedI,E-=liB["-}=_+FO"fx*|~ :gOCI2z>Ɨ~xd˕n.T!h [̘9:4) bTy 6D-C0$wʭ}Վ^-5 V(f@`m[z5 O qp3uj mۺҰ,֒c `Djպɷеj1͞i7 np]#mz+w8s*[N=@.I -?L-A&`XasԠ7 *'},$4%0I[Hb,7!HSzg0BP툊/ZaU,_7ԩÁĉԮ]^TX <~Vzd)S|(QBO?$Ν9<͚9ӭ[,Ha:G+`XZ+Pc`'k'|( | uC 77ʈ|P4@]B%d[9 FВ |dO8IOu |(Is+b8GVt%M򡆞={b2Xdɽz=˖-#,,DDD`4=̙3DDDЯ_b[߲ߢihƕݻsE%K`/ŢEju$uLvikي5v:\J VXsvdvzW/A8ui@&1,]K3pr34!Y™x fHd$i̡$oQhEH(?]T> 6F5hЀ^z1yd&NȒ%Khժ̚5M4jժ=pWFr TɁ_-P; Fh4^{$u:ѣGd۶EϦ#8QG;X5k޶`c-xQcOc{yqNZNPF Tpmbp ē ?Kq!Y=n/ɖOqHV\ԩSYjԪUm۶Ѵi{?hxlfݺuԫWJ*gؒ'Fk0mKT5r_csbϞ_Esqg_ab>BY4ȩ0ɇ @P7/PP zGvLPɇ_5{t&0g?_q ԡP9M,/`"`I> )p C|#GGGf͚E||<?~Q˖-d2rZN:U!K+ 6R { w8:vf z,޽;Zb= ^XSrM44*C]wk\Ȇr.| okfabB%46{t*H y=t]a|@2oAX-N "ɇ$b4K͝$SV EˠA /\|Jx§7-!͊ᰚk)\W6b9bWd10KeÊ$N 7`rYL'J8AGmeR % 8* 5' "QqÓW8 E!vjv9$I%%uɶt/G!Cprзg?dpb-Ec|( |#]ghF`f2ɄRA8"x[CA!ogN+? B|dwh5[h$ɦDzY ՎB|vvVV-'t!:PlcO"o?VzGoZGnYh CO˖$1z)8MYq泗:a]/f+3q$ݙA)A*DRF ^!Dy2@DcyUlpׇ$x0mvDdSd"= pk)%<<gg-]Ɛ_<քZ_hZB_;ΣڞՏ–X^kC)qj{rO)>OzLvr18 R o1 K@#:1W #ї,6g.+ $~׻G;CC&9p'I!IVNLLa ??;Ãr#m gqZU~L*nJ7XNz t aPxL(( ru$e3d0N"{h1;AV\$0p AoC0@`@sU;*KRt*u-@$&"tW\ -;Kfft<6LDF&26WV͗T`MjrbY3b9Ш^/X=kguhQɺc=ȖdqrL30X oi,2Ls2x!DD/0 !ݓvkd"mH= [ %v {]1?d#d"=:wfEԩO2%pqGԇܽh+fh&==<2|9ro[ h$֭U)]Zxo_.D˖.-kc@p>jXq <`˅M@u'A'XT ɉ_gI`f)G^ z ,0GF[/ a9Atmi`&Ig.nthqV;,3p+`U$¦n|j}ԎHlL@^h7̂`o$tZt: ^^̫֥F ?Tr6999z4C4ica K/Iݏܹط/ط/+5ݞ?j,iqZx:lu+k`Th5?b@5t>#:8%D2=$ZHbn{b49^NƇfrH rEI&klU#NUvDI`cg0/X_$ _zu?aܧT)7JrMQYYzmd wرaggu&:/Uh,`pо70{ Xl;z%?p: l*QPDF #3 /R{Q&w&%ޣsc a:텙EC0GJ[CPH S]Z􇒡s x$=5d$ Ñ~jm[?\EU:u?U.`Æ2iҕW^IM5Z}=!;6lqZV{bq].^riG4W)d5Pɇ 3k9\vS` |&p#[t`"5 LQbx '0~#p['F(pʷe!IOL@$I@*yWxq$5kwtRzta  ;`YfHrOZ:avDɰ5\Z fFN$'Kl@.9wn8+{ӺJT0rvLjU-I;N󊐞7jLw)($NbQW(!,1nJ0TX,?3Lhpa͍l|y(%i-+e-]EyXүY{TvDT $و vk5`LBgqުcl iahXRruy~mL !wH7l#LEf'HM&ґm K%pqh:5*6/t;92V1Cp?x`vT׶X0#L@$Ɇi;=ގO>9ۊ5 4ȓRs+^hmن_`1ve1 ;Sh~%YMRx\!7 Uqč Pzl‰EtQ8SO,Lp;$~ At%@ҫ(pb6leX=CԎJVD1vl#/7ߜaذŖ8:j=ڋ+2~"V֖qCòO@A9CL%$PGvB[:e>.>[pÑNʨ=f; љ)vX(HC/FduA"C~'Tl &AM VMIzĆ.gР,[fIBƍUlj fᄈj,M 0+ ɐmŕ*wa~İ,f*(%J=X~sTa ]C#|%Ҙ4c(ve"bsvXr}PqSn2i@UCYl.IL$I3jOx0vl#kGn,]Θ1^h k4Ъ ;bΝA xb\1tFUAiB4Q,i|^e$JP˗1'T)* D…fjR@k ʯ;1VH>olnȇ!ߙ$%S~%`IwZƏo9p X|\Tȹs-Fo\\+NܫIX d#Hc^,d Wxp2nB% 6fݙ!TnbJMC1@(/*,Nbd!I* 2ZmִhQ>}6mڴqK˺u݆ը8_vP.%Zo p#ߺc$Ac` _hDEѕQzTF o8rВNLU i#Wp cOYò0ކ!e1,W;*)6o+%I2QF#Yy\evvZ֮}N۬> nS3Vp (q$?S]{W,L#俴`ph7p6)ls  \NR7g Z)ο@9ԎngoA㷡FYl.I JM5mݎfN'֝S|}]lɖ-W>^ǎnDDm:Ԫ.[mBZu(qzex+Ȥ.\=6E фJjuXγiɡ S !c XAE#%Dq!` :w UMjG$Iҟ)իTh$))??I[> fhnF9zԺ ˃Qt' m阬7#RP%f#14a6ф3DܸTzE95!X'NG:ZiN!|ѯrytbΊKukG" @vJ0eڦ!q8v[ ^|qyy7cΟzf>x{@\!`)/V+P@Iĉl1aM`9'eqy3c8l2_8sщڼ]&?_PmƖ`y?Ax[+ԡ%eIG_U*;r()OO 1oO. 1 1W>MxɵDE%ХKSvаa7qbI)6A8fH`/0wq2pp(Ya1$r3W36xd.)4bNrHf Y|J5&Sq0 boz?eu?c )ձ"KI ؄kNJȑBBCL =&( T}y6k֌*j%5kdʔ)tŴ6ZEj]{Ш7Z!p}:C?d]Dp#x34^7ƧDЂ܅zfNO-"VtZnǠ*j '4 6΀+F@guU"R PQkL L݄ˋjժ~ߨ(ڴիW3h SANؼFGFH MPR҄@O4y~dKvVq wp6KK&kyxvњ}6@|˭./MzOa <\3>=2"Rby&]ۋB&nܢEideζ`ƌ\(((`ذam.{-[b#] <܋$s֯ 6AdG'@|qgr'3lemm> $Xz0mhc-W ϟ\l}񃰸3~rQ{><QÓGͽ L{'!ܑdz@ɝ879lb?߳;DnpjY fA *$#QfP{"42Y5&"X;6 W x e!Cplo#) &&VL7359BM iPYZLGo)$GR?OLe+"$/S3O.ř'!~h-xմ*c{aaG8 -}>͟ 'ȩrrFjҗM^4ğ޽/eΜh } HطEEW\fZaW@ތ&@{bvb NL~jϡ_GqϘ~ʝta^C<7/3L*\$pt4\f&#cWqf+r95|bySN]sqq$&ĉٹ|v9:n;tE?In  7S y&iP䎃 I>F>) ` hur.Y$~8B_MnNDm!OhԼ\ ̂OzCĵ0\;C>xsc{ 5׸Ɗlܘcj;ݺ5k"xu;"eܝP皇ԸyX:A# \CBMMQd@z!T7| 0L yt Ǐu%gӨN8BRA@O"*4R.'7 6+S_'B`kj?}t0w \D*rn]o6Nw8 lz'Զlϼ;DWgs3>שj^'׌3qP:XaLl\H;gLc8r'6s#śx`򘾒2 X9o̕9q>}7-Wj( À^B^''׳* &>+/0 SWVs5S|OfoNXyxRk3Bĝ M uM. $dn{K'p-~鍊=gSPڬ h (.GK: bBe I0rk;˅wwa̓p4)c* ? عհfμOOƌLCʉS?'3iFU=L 9 5 '{@8#deb9k3& n #'фN6reB7k{hi A nKXnO8t0m FC*zzu-0>p~3֛ޞNaLFkB3I8殂uu|k#H&0NW~6ѕ \xhȕlORy`FRxaץr#B6D} 럀χA0GkuU.{Ý  nfuE"H9VX$-GcOY|+fdBɣ2 !pk,uS)3~&Y[dqyt6RvY(>ԵU]˄Kpb6yZjԆᲶVW$R)scT#6uw[dĈ)fvH=<M~s= x0q# r8N(Lk;A>|A.£ǍpdDra8| 'c8agйBm##R)s;qeU3'-yx8X?ݺ5_%lp-Je1B1yI|5yd 3ym rܛX~_vJõ $1?:SpeõGP[ AQkKZ]Kn6<= 495&+Tp {CnJx+VJvuk1kĺ]̞Zo{Y 6$ r 29#Pf%vߣ&S]+KᲭ\ vC[]Kr&O# Lܖ ҘCC!?l va* _zCÅu?/Mn1<4@HRR &MKukޞ,XПk1nA<0pC'BxJyr^DIL(3ƝceY=gɎ@.h[\=ǹ6l1\0c0^jg*R(Tի{2yrM}7|p8xXzwpUd. wk3r SW($ϲy&3yaR9=NNu1,"`6< %_GA{/@*k{1qKڿFwӵknm^;͛,EDb>)M|D tmuE"r, č7pItO}=.!:z˖OS'[niΠA1_Azz.'HM&/0%8Mj A`5/r!cƌK>$1Q7 b[-M; '4]贔`yIaA뭮O߁YB'PP`ss啱<@[Æ]ɭ^ATTKyTIui&+ v@Hcc[2;wKnٲ+WFD=s{ R/BSK:0 ]8OowUsr$_cVAuX_X@? ^UV@޼fmF>L߾ li=#1^O?dÆ|>|s3N'Cy\vYjeHd<\O-fkcAg.!0w3aln@kL. O]awUxyyyµkMv6oҥKyy衇5jW^y%'Ofƍy޽{ӺukK*XX@+V%)a(,*T%Q?iiA67 V{vPG'|,|lTpH0aB1ƍǦMHHe 33"3KR6aٲ^}K%pjDD*`^Eq??O¥_MVl2 |^ c6CHsr͆ia0) m2ؾ};M6%0vcǎF & o>SjJg@ ;]ۋC.NPX pyódt(LKWBp_k_'qR\릃M9 ?c\`+ ?{eS>|s;v,ݻwjժlݺW_}N:MDDiu=(TcV#9SS kZ]meNɉ.?'oSh-4/kG~ . ᱁P.miuE_ȹs7_?!C0dȐׯzK.|@VWtypEGx6cւÇIyi`F,\t%nəN?C;xnnnKkC|:O'JgC)*J&/`K-+"bBe.WÀͯ)l2ޚo@ 0M g R.zAÁgm6g=4<<ìSN`޽>OJp :xӝBnEDt[80gǏӷ0i6 ꊊe,]1ciْ:<zYZaN=5[jźu$(FQQQ\}uWr%4TT+U 9M Wx饣}|7)sI/þ>G+|EaR}Gpg{cksA$'I6in^!o4)**bΜ9?>;vnݺkg rk/^,JlĚ{q:tȺWBDLN8x7΅Ss~Vg\=Fa-³NcWs_ά,MgKxJ;} 2G}d7n… 9x /~ԩSYhqqqԯ_N:ѺukڴiCpp0̛7cY-n6,o ]8VU+_)R߃|cu5D= ~g < nf?P~|%YnѢE<|ѲeKV\IΝp8 iÆ 㫯bժUdggSN.~i $@Νٲ S8^{wUҾ#"R&A>; f\(ta!WYXM۟{eo@Ax`&|`a̙̜9󼏙?="3f`ƌf'6fl\lЀc$N¿>QDDfpgdu% ;B70h9t{>D}/|&#}</ "erB<=;v .EDJȅmfu%.m(nfm? ouE8q6v,WE̠bCϳAoşsMߟomQ""q$u8a3&l˭À7@ (-C}r7[~]UHEbC}Rx7˖EgڕK4ǎY[HyP@,┛ip3p˧l]=+/^f= U1>o:t wVZEӜH2bC7]w<Qۭ"&1O={Ѱ>ѳC`uU.83jֶ* 8أLŋ {%6YXǠK9K7 0pFxpmv[0ti}\~yzcG?ڷqco<<4ODL"^cuE%ÓC\CyeuErn%~p:ioouI"͵ ZFa{!ZvS7?\Irr!?p5kV7y*4lX SǛZ< "RRHH($>?, 6q:! fͪpajү aW VAP]+:-f<6 ]Wub?ıc*">:u.IR]\9p]{?ppڨ' bذ` sMK+bvس'uIH(\{zyAݺԫEfU+oo'N8Y8ųqcC~S""v KwB " ' /PuH/"H9qu0`<~VWU2ի{ҳg ={q 9BԬIh!!xz{V^^%">B|2 I=n228G[޽.IR*XLNj1쌁C!ש))ZWD*Tg0k ]0{tmGhh!b ΄  %00=z}{ɶ'6mg}]Nmar8 K^5wDDRq\ܣȦX!s-TlV]$08kF:taT>͚Y]!Xt:۷/;wdԬYٳgӭ[7mƥ%!w%02Z_vWYL.mk ""''{=,ڷfOv};<cr37…x^xA{؈yDFFi&"##4hCiӦ<|%Q)5֫ kNȫOcmmΩwb,xbLKn_o- a "o|#GZ]?uԮ]8|0tP>s JtIFFIoW/c`CcJSbֿ0-l>r6o&m[ iO "6r۷ougo׮ݻDiԨժUjժ5.OOx)X:, :}eތ-hD }kGHk]X…٥ pڵ$9HLL$<<㧎>|רQx9s|rƏҥK4! ((6}aR͕2/wm.g,}6,,ĉ$Cȑ_s~}T9 aW577~='|3oߞ#F0{lLRzJeuk8ָG`x9jJs""R<3~^ ΃cXѣ$z+Q7~))*EY~==z(ccbbhڴ)~~~ -k9Ç3i$֬YsjժuKN??zw{+nf7f}s+@)kȠtv,Y’%K8E*J@7o΂ JڵkVf@:uV-;v삏5k9矔-}KI~?,Zo>\ED2(ȇ& m>2VTiܘ?@ M6nAVZ=T\}OqFwnTT4mڴuA\\[Bkٮ!< |#0meHyt<S#$u4Rg h̟G^DMB?sVXQ|,55e˖q7}zكs)))g]w!55oѼϣ_Oؽ3߅]]ԋ^Y]( ~@R}瞣ҥ %g*".}=z4?#NX 6lW^y%lذKҪU+.w;knS`m0E$´0&P{2% &/ z~ʒ .C\-yxxx_s뭷o0ydhҤu8g1rH6oә8q"۶mcʔ)+iYa=mjY\FB WT7uWf}5q'hym‡a1O v˖V#RUܹs;wvڳ͙3ǬLK4 ":MPDsά,%yq">6ܙ?˗H)D] 3|  W@U ~/߷)#b g߃6t 0矩uUVTlA*KeM9KH r/L~ aм 7/H; +4QQ\~%6w._w:ubhd$!!VtQg_0)G9/õasz;Wȋ!(vƮ諯#Eݏ>³Z5K&Ndo{5k]}`DGCe]4DJI`g0^΅g68;rsTDDʛk֐KY3tY/]JKk =%$|>[[FA 'wۿ s|eT=aF 9bu5%wjޠim""R~^4<%{kGQ^EC @lhH+9߮0bVW 7] w|7 h RIڱ;t ;5q?̕ÆY]HRNFސl8%""o.]]qB$JK2x{yXaY"""Ÿq\vc֯'(,Z{2sLjPRILL$<<㧎>|/1tPVZ@@@| {.BŖ@DDDDʹAoGΓ#rrr9븯oK/#<yw6l_|={@DDDDʹu7⮑%gs?c;xnnnJ˖-{ȑnݚ{l)@DDDDʹOB{'?NM6g=2<<ìSNZo_$==jժ|)_ JVػw/gꫯ.5O iE)**bΜ9?>;v,^+)) |Y|9-Zjժb) Ri߾=C G%99ƍpB<7uT-ZD\\wԫWV|NJJ ,;wRR[hO>$|iiilْ+Wҹs87?YfN͚5ܹ3>(/~" """"Rj>>>̜9Ο?{w{4DDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDFDDDDDDDDDDLB͚G5E@DDDDʹRSYYe~Mrn:nݰ̯}6mRi9$%%1uTwNPP_THHH`СT^` LXDDDĽ2e uߟ;yeq%90sLꪫp8%>?++ݻO?3}toN׮]9vYe%|č|gu"3f F7ӓ>}q wYR)C۶m9v111L8Ϟ=}rJ~aj*yWLXDED*͛7tR^|E^z%Ə?@ ֬Y3z>䓲(QDDD2xyy1a„c>>>7M6ps/>K?2t:ٹs'm۶=kڵc8q‚DDDDiڴ)go׮;v찢,)'@رc'<<:vaw%"""Rfu#0 JX__ߋn/''puC_t_a q1]h洱>=i\\MU]Ǐ?.v3H4ڧ$$SXx,8rr3o +6c 3ԟG:G84$b9@јDđ7qb޿!j8XjR׽[,ݐV:?@Νx4wwO\@tt4^esu|f`w nX:Pu#Q]p8%سgY/[p8K^JJp8g}ۆ0{s/^lЇ>}~,^t7)e`ܹnW\ap goØ3gN/}T y,XD]EWF |||HLL &W-kL<7:W.ѹ ?w#Gr),㩧2zeT^p8Ƃ J|~e5y#<<5:t`Znj303>K*&XdݺuуMRfM6mĺuҥKʢudff2i$x׊{Yj0i\[N']w;wdԬYٳgs!mƥ^zM3<û{ƦOzf/1|p/_ĉiҤ g˖-]k]X,Xw3K-rLZqqq4jԈ p%n:,XPy J+33HKK3 -AK/غuk񱘘xʼ^8K.5|c)))FՍn/?rQ3˔R2+5.RSN֬Y3z>䓲(QPdd$kfРABBB:t(9%$##Cˋ &aܸqlڴsouܲ})aIQQJR aaa~߸ȅ)CN;wҶm۳֮];ω',Lgnڵ#;;{:5ZjTZQF\֥J m߾M1$\?S;v\ܲ})ݻw'88Ͼ}LUq S);F~~>4q9̦C 5r)1dPL*X),uwџSh0V PXT0 G9}l{>@>>l]Ԗp z544۷500p8ݻw+HeIM|>?~\wݑr2IDATΞ=H$;w*m( 8? :9Iť_Rd2^ip_!v^GUss"8i1ڵK]]]z+C`ٱ₍79mnnv| Zz]Զ~z ϸ^{Aׅ3NjZ*FZ[[<&&&X98?NB/ .H޼yp8'N(HFFFRzzzS-..fgg H$tUVVҥK>dn~ZéSqbS}3ջFG͛zsauvvŋ|waݽ{WCCCjkkӍ7KE"uwwKuMMMMiÆ (/ּ][nնmT__ ]zU---b삔˗/ϟ铮\CvUWW Qa1^O===ڌ1&>S__ojkkMooy#O?~0|>wތ"gɓ'ͦML]]2fvvA24k̃c>|֞|@y)###& 5k֘*̩Sׯ_m?!=7T_8?v@Xg@XC` 5@XC` 5@XC` 5@XC` 5@XC` 5@XC` 5@XC` 5@XC` 5@XC` 5@XC` 5@X>1DIENDB`scikit-fmm-2024.05.29/doc/2d_phi_travel_time_mask.png000066400000000000000000001524261464214672300222330ustar00rootroot00000000000000PNG  IHDR XvpsBIT|d pHYsaa?i IDATxy|l@ ΄CA99E bZ?[PUDDDDDD|F % """""3J@DDDDDg(Q"""""">DDDDDD|F % """""3J@DDDDDg(Q"""""">DDDDDD|F % """""3J@DDDDDg(Q"""""">DDDDDD|F % """""3J@DDDDDgNMAϞ=l}0e7oNXX7x!+~F&LprJlW{UǓPe#Fp8HLLw(eops;ٕktp8o̙,*%(mܹ=px &L@Ν%>J;Ɩey3*uCbw"vƏv!50ydRSS=z4nm!\q?,;w$<<܇\>o͚5MяW_}U4c\T@Ǐ(>}:iii=z!*ꪫB=z˲.C{mqP˞wnn.?}k<GARZ5n66lPq7`q۟<Ԯ]@$~!_=QQQӪU+^z%>jTFFcƌnݺӦM>xhܸ1aaa4jԈ%ڧ~FNN$..PZh3\%K߿?ժU#44F1vXRSSK/c9s&m۶%<<5j0j(?u={0|pj׮MHHkc޽Wn~~>/"7&44z1n8rss5w\ڷoڇÇsQoҿׯOhh(111ݛ/2s&=='xxyxq8̚57npp뭷zk.s[]իݦp}ΏթG9|<10o<:vHJaذaEKoJs}ur~K](ƍկ~Ell,"_iӦQn]x =ݶmÆ #>>Pbcci߾=cƌ!//(yzڶ{nƍG^+ևz#GҥK0`kիY|yӧyi֬DGGs7lٲ-/"Go@wq6lqO?ҽ{w @*U8x .d|ڵkӻwo.]ʏ?H-ܶq1-[Fh޼|ڴiS֭[GݺuKO ?ɓ'0f״6mڸ[Tuo,^o={d׿̭=-?̚5kx8u-r[ϦM馛8s }eРA$'''еkW>cW˲1cd„ ^;}4:ur 4z[3K/Qzu"""Xh< K,aҥ\z͙3gfΜ9 4ŋ7ҿBBByǨ^:C )vJ9s.]!C?p0|p{9{9bbb\7 [nW_eѢE]ʕ+/eҥ :j*O7|VkogrmѼysvٳY`_~%:tp[5}ذa^ΤI8qӦM؇'|*Up}_|A.]XS=z4]tO>T^G駟ҿNʨQ<ɡgϞзo_"##iР_= o ~cѤIj׮_V,˗ӵkWiaaa\wu:9*U`v|z-.\mFϞ=Yn|[ne˖-P/P>_WXŠA_>6l ,`{,7zhVZŝw:&O̪UXz5!!!@aqJBBiiiٳ&001c'b Fu_zk׮?~'6l@Zܖ?~<'Nr 8ur[{=nbѣ믧={>}xDZDJe~pwXeZnmN:\jjÇZjf͚ϙ3Xe~{,3i$cYy7]ev2AAAqѣn/_o#fqYMBBB-2={t+?~,DGG;wʳW_mRYrkZAAݻ,lٲUk6lh7ƘGڵk8])n-2eMoeY~<3`cYyݖ_,z&''Uj*cY2;v4i3m۶%v.Ye~_WO?dMꫯeYK.nč3eYf̘1%y.}3fcY5j4m8˲LӦM3ey|?1믿6e{έС9s挫<##4j$WMPPqNAAկ~e,8͑#G2e/^l?czꩧJv}5߅̞=Xeniyyy&>>Xh8^xc}L@.]zx.e˖.g'\pyo߱-[˲̐!C.㼮[WD.LUeѱc"Y7xkגVȑ#ԩSP ԩSYdZƍ駟;Zkٵkĉk׮bۖо}{i*v9^Mٳ;v\VIǻUrڴieѫW/i7v8ptI^֪Uz=k&77$T7&""£nݺc8s挫7kć~QkNNɜ9s*Uhݻw(M6\;vЪU+6m8CaUիWeuVmŲ,xW3.o@ݺu9tǴ۷+rJrChh(-[s߾}IHHw_&,, ~Wiq˗c? 7@:uxWYr%}qvUgr1Jz/4W|Ry_ϻ͛=uթSFdd$Ceʔ) 8Aq 7ХK6lXllE={63f`֭n:}m9)))^@u[Dʞ+D5 4pzMÆ T+V̈#:u*3gtP;Aw}n:u W^y,"##Rxxil?En,ޱ J8|0)))n vގå:˛SN_beq' E}Gy|KrƦ,DFFzy;&θۏuѫW/ 8p 86ô < 7eC1n8>Fƍټy3~{{wS5bʕp ӧ˗/'**kD. o磷^n穷.t5\êU̼yxw6<ǏgСi̘1ԪU~QvmW:}tNRRRRGbRReˊlp&˝+GBCCٰaM4qvVXLΝiܸ1 .$--0̙C߿ۼQQQXEjj'z … [}{E5Vvq14h1XQ GE܇'O:[sEqv*Qqn4kcx_xoݦ/a^uFb_bĈ=PũW^|,_ܭW;l2;Ʈ]0`kY4nأ@NOeÆ |o㮻zlo§LB˖-oT{chΜ9CVV0e}R//"F^K=~ <,ΝΩS뮻pscuۀ?,Q9/@v0ƸuCw^>LBB'孬?Ν;si/㖚ʖ-[ s; CU oau[n/YU~۷k{|tsY~=~-s̡AtMZύ7vj*nm۶1w\%FqײPyǪU,kΡxא :ws=ǔ)S}0pM7y$f߾}tܙ"\ETJ@p ޽m<c &L`ǎE>Q>|g#FG%((1cƸBRNNV}ĉu}naÆg^Yv-s|^x@~~>1xt+e9u, me &ưa\w҅&Mzj>#͛իiҤ[^{-SNu~7(UE otSOym+Sy.]zI<#yddd_pvM[od c /p;FbeaTZ9sx|&Ó=ڟn/ϡ_zN;ߔ2(;jZWٳg5iyx'Sx-۷[n̟?ӧ{~p*Xo7ŕC?L۶m; b͚5ر駟z]N:ٓ˗HVhݺ|M4aڴi\}ۗƍKbb"VFO|7x#6lo߾t֍ڴiPPX/{Ӈo뮻֭[ΡCٿ?III:Rwܹ3cǎeҤIhU|l߾nݺSOj7eՋ^z~ƍӿ9{,dʕtc׏.]0dj֬իYf KnΜ9޽{swrmѤIv'|Bdd@|v7fΜ9>|;g?Siy饗x'i۶-wy',Y4ZjŶmܖ=z4K,k׮ 2H6l5k4h+שS'Zn֭[ v%ȥCVغuG ;w&,,'N1.QQ:ÙK5:t(sΥM6ݛT-[{g^Yf 8:upqV^MΝL,}zŨQ2e ;v$::Çm6oκu^~ "R_w%#>>k7=z`כ3f0mڴ1*U2իW7wq̈́ (Dg7ün~0#F07!!!&&&ƴl<ݼ$_0oL:uL``q8fȑ޺-nf̘an:2cN8aƍgZhaMDDꪫ{gJ?}9ܹsM׮]MʕMhhiѢyC_d1b[Q.3*ɶV^m bjժeMlli۶y'ƍK/w!,,ƚm_ڵk{M\\ 2j2{ٽ{:dNSjUf:vh>c7x=;ŝs1ڵ3&66{رcE>3:u2+W6UT1}1V*rŝ3{7$|IcYiѢǴ>}au٢b/LΝMDD<6߿Xv^Hi](onvSzulׯoysر"׿~kMPSN3f.]jFi7onLJLӦM~;}fϞ~?.͹sFPS^=裏SN]Xh۷Z 13wqJqt/ۛf4h`n3uuy,"gSF8/3L4wߑ=zy*JJJ cǎ?&33;kѶmr\DٳY|9={w8""bjRd&NȮ]hӦ p_ 曙3g?8&Mĉу{g""|@͕|)BZHJJ"667yvZ͛w!Cꪫ?~.ED.>wfܹ1qD$""6J[Km޼yԬYӕ|TV!C0{lrss]=ꈈ\NNʕ+W_،ryf}_s5޽GqRrp1<ʝe\DDDDr7 ++P";y$K,!>>EeffrCj|={^n\27.˕G H9 #;;ۣ9blQŒ%K{56)g6UW]Uٽ{)3J@A\\jVǎ {&!!(5k֬mL__S IDATCLKn~^{&fK:Lyc߆;ɓOre&w(.w^6h5zh&O\nq|嶉R[p/| %'qǩB?"m?a'HAz[LuDV0yHj;cDDDDDD|F % """""3J@DDDDDg(Q"""""">DDDDDD|F % """""3J@DDDDDg(Q"""""">DDDDDD|F % """""3J@DDDDDgHddd0~xKժUq8̜9Dˮ\[ozF5Xxq9G-vDDDDDJ%99'k.ڴieY%ZvϞ=zcrinf{ [l"HRV-eƍ\s5%^vԨQ5ʭGA}e،ހH 1Fj u \ZZ999CTpGGjDDٯ2_/SO=Ebb"?:t( .wM% """"\P|<11O}sr.iiݺڵko[v]n{P""""RU?Z]:_ڴi۷DPP ॗ^"%%rߦzN$vI^^ĉ󥤤GѲeK"##}`H曤pQ.\Hbb"?87Yfqի@~[.;v$66DONrr23f)R{8x e3|,bDFFbYe-7j(ΝɓIII!&&]O۱HŠDDDDDJmgL>ݭGGo.WQ"""""">DDDDDD|F % """""3J@DDDDDg(Q"""""">DDDDDD|F % """""3J@DDDDDg(Q"""""">DDDDDD|F % """""3J@DDDDDg(Q"""""">DDDDDD|F @ """"ۡjhٯtVٯSxJ@*(cFPFٯ78,U+n]_M)[j"""""">*(w"""""*(}z""""Rˇ@ F HQH('ChG!""""R:J@*U/ƮDDDDDtT ;sp]{#)% ĊupXv,F""""R(_C!{T kX"""""Em*3 ^|&jVwRF0q8 <[ wT"""""N =У;, M; =6Ws|G ,Q=% """""3J@DDDDDg(Q"""""">DDDDDD|F % """""3J@DDDDDgH1)2SPPX~DDDDDJ :DDDDU2]$$Do@DDD.g?}RjU3g,ѲIII7={Rre+V(NH, 4T,99'k.ڴieΝ;4iǎUVZV.@.wFhEBBCrTV-eƍ\s5%^C>}h͛ڵk1R#% rɲ ??_?ųVF V"""`bcc03""IrT>wӧO͛;L9% R$c +WcTO'5̓yh k T1{'(ۺyeN)'OҠA?^C#CDDĎZMj_*,œe[Rfi^)O!C"y(>\㉈YЮ%bXg'M6Ѿ}KZ4`C1@ZSN|\nƌ88qڵ0-[gٲ &LÍ5ݻWR!""""eFo@1b>#ƌCƍ>}:믿K.\~ĉ$$$EEEWaC&S2gЬY03g1lXAAJ8DDD%%%BF mҙP>W_}'x{w-Z0vX֬Ysu׏v:<8p?Li`έq8xHɼ曤pQ.\Hbb"?87YfqիZ^`̚5+Wr7a޼yBBB5j< Gv{cHOO'<<22 O맩Z5i><%rKJGテ,+d*\^{5<eY|̟?˲>|8X*',eYL6͵% ?% Eؼy3W]uh\s [l`ҳgOΞ=Kpp0}^QFsq,HǓ8~ݣD{rǎ#..ΣY|MJ9r$={$22 6suױi&ԩSnq/996'~*W5i0g JX|6%qޞ"M_>l_}Ay;g` 6|gM>:D4!331/BCC]Ӌ2x`[oO>\GGIs;#գSVS ln).U)?'D۶m5_fAPӥ,O^#mvSK>/ @A~ĝ! =L!,,l,ҥ ^{m=z4neÆ cذa%VFFqy'o?Q5QٲY3xUh=;vlϞ}q2s i?' 6K@#f?` ̙39s渕%nWۈZرcԪUSw|'O޳~!!C;1rdzxs[Jo 6/\A_Y1oj}eGPQ;E>m!\RaɣA\6dj>ұi۶-w&==ݭ|iӦܷoիW/yTAA7&pJ>DJ*<&P{z)=yą䟟WYIa6L@O,,$"% "??~Uԩ$vI^^kd-ZM6ѷo25/ǹ瞣 ɺu4m ׶t3к#qDA@U% dn\pF& ?' -"a+tؑOs 6l̙3ILLtN;]wڵ}DEEi&MFzxg4| ;ҥLRG"b ߦ@#Q@8FT(9dl}C`p`Wk"RbJ@1k,?rZng}F׮]]x`gС|,]sQV-z!Ə_UʥC:u[cgCTa7vrqqx?  #C5>s% n7  s])@,9K%ŋe\DD2?8{nel\E":Iկ-xN6TY"CH!fo9E5ףjsz!n&n]ʈx ՞-dіP,u{TjMC&iO%b|N@4TD6l[ѹs}CDmI,aWM004Ts$H&jCD.fml?D,XPP}\"b_U o't fUwR$lj۬MC:'~> K*X6G߾Tg%"BɇۻG ~h$6ύ헀$D!6+a%PbC xg X6j1] ct.wքkfeH(!6kqS@qHbm^&Pa%cuzSlڔłuIHWWƊ\N9&ĻsLzi>ANQ6IN%(pR CK`ggy8^+*W "?I0(v٫}*Α~]s$m& 6kkaa"RbJ@l讻".{R^pvZh\E0 l6a&9%Tw(n)T^j#9OQG R(^]VtU))0h+ [122gWH m6E 7Ul!CXo; E W:q"UÀp4 淆5R"='`l6icaECq~eۗ$G R,W|La$?KAAٶ0ưo.R؜A3׻tZB @$4uCDQ@UY+L@Kw"Yę[wOyCܒ GӨQU6BÆUhР UHppUئYsr9x0MF RQi}u:I_36L |rw(NHUrO@Q"&--E{Y$%a*\}u,Ca*ԭEtt(IIg9|8Rػ4+Vdڴdf]t U1eJ_nAYHܼge<|H:,l (lMmP)G⦀,8D0}@Q"exfʧ&++-c>5ݻkk=13HK&++|7Nη!ޮBCW/HUVÂ5@ {>B;9B87E \ hPe,@])9fLY{Vj=ԫw] [E͚ԬiJ"xnV9-V*edp<Ğݚo-c)|_?G.6|kGHD.IVVo=/3g49gANV>~sW[bM  ˘d?@s!IMBmkX $%Y{ ~O@z@YW)gy:ȑmynԯo"rA´#2ʕo|OجY?=9^jحi0 oM:hB%iN0@8@#jmr4COTB^ߑ@~9I=L,M ʧb0w2jWox |uq&Cdo+LB*dLIM,M.?piP<`/jpCqi8F0}IH DjХs&HY?/k%'c66Uד;)Xs>I$AR\Q㞸x /qЏJǫ-"|Y#oc$جkl~ V~D 0ȑ4>.bc9x/IvߨaWR~ l9Gc)Q/Q-)Ḙ̑P~)TbL vӴ", 2괶Ssw(^dC}52jDCq LTa0 @ _]0= 6|pEl#j4%ߡxUP,oR6lp$2v/k$xוl6?I*agWBH#ٛ ﰥ̽Z*3rd["6d ΞU+Q>sHg25OwQUkǿSR&wJ*]\(^+/T0ŋF@ I(*]H4ғ$3s?"\s&Vֽk23E`f~#>qnJYvRV8lE' ,nN!2B1X(oGGqh4%'Ǫ\B*FUR\yo9:()QjCpr*wac(l"9WEŇ+KKBiLqtX!@SJL1J7(o{w5 (@I9“Oޏ:q UYɤ5k^/9PXxD`f!Tɶ1֊PH6tVd6 W%@Nu1T$jFK̙+<\c DfI׉(-@.];D}H  !8*~0|S3@: ~F C3o+x(0H5fYy"(T>?)wpv֐b-&~$RF]xp/6,W'\s )q7zF?KTg^;u4 z =hRytrB Pa$?yV*xA ɢ]rS](7tA& K8x0.]P(_r0a?(HOZ8noR#$|fTqT)vQQG8e8Bi5sS )wlSxAPQT'ahVo:2DE"I(nV@t^ %|'''tBtt4U\؂UM\ErǸƌSwWNFFF!!!ʚxOÍvtV0m4 8S`4ZVrc^D)Egt'˝\|y "9V,en)n`},|L>O>=z0l0̙sö.SLJrrT/r_^K:Ε^}S~(%J8؇sċxWvJ.&>c#xalXR4;Nb<$w\Z mp==Ё=::,:{+H5Y_ܹL|3o 3g88@͚ BBXD RY9M1'0Ci(i7-.(5j0c 6SD y Wb;(Vr7z'H87$\OVYJѬY3bccp@ӦMozXVbcciժ..&QTaay2'(#[/}'O^RJɋ db%+F,`tuqEh3q»gl@&(x\LrUԥJ*R%%w+<s>[$կ_?;w.cƌJ;\кukRRR&22򺶻MJJ gՁ(@ l9D`2'ё#E4i+J{rv8:G1t4Ɖ D@Mgl)j6$qM_HvIn-8g,p,wjٲ%g„ Qvm,X˗v~ Oxx8=VcǎuVVX#x'*$ jٹ􏺨"sAil6sѧO]j8z}ogᚍZ_厣* c/7iDܑ-?9_bSaOsrsbZC@#Voe…L4EE&MXv-ڵvFFs vݺu?d2Q^=kFQտ QTW:lIٰ'O3gNoI3Z=wBo+wCB{S -%wrae7K8Y|z7g-X2J ᖜ>}:ӧO/>111׭@JN'(X{&^|$Q#I|Gak.wcB, T`m@]#ݑ?L&i h|?)`^F9ĀK 04; -RMsS6l8ݗYv"YHfθk%B!l4ChKg5vrIO7QVb6:I\q䬇ȝDxWjb1v:vW/Mv$_-sgюQ<l%XN3+>$$vZO8T%X7(mw}; 5"Ԍ{8}:EF(rbF ;+``?̔q$^ Ttl'?x8Rx 2yʝF(@:s&I曭i Pr1I PUrIg/KG'h$w[*2 hQ虮P|ʝD(@Xl 35jxmѺvm]b0B2glQUʆwZ1P8ɗƓrG)[\ZʝDxgjf„m8̂ wJM{?u$>ghc,>#gb$xrW?̗J T"Ȋ3fࡇjLWB߾nrG섄VN='Wt.r4!/w3R9sAr'jA PM8O7[疖,ɡKWKpXXH8Kw2VT>A;mq|hzHfy;t T.sW{ W]pݻM|}Q;BJ*9H'ڢ%!LГ1.!qpJnIP ,!!ݿڵb0(U}'?{?aGH ;8oEϞ|covFlllY(::>h UH+9.R?&҇(¸S&rH4θӕW?l*+d07DžrǹiuN"Ֆ:^A&'?g˖=ŀ =ݼ,6رih̀+ʗIpXN #H[Uɪ(&>"c2Ψsd}ꫭ8=mYhQcG* (dQ:8iZ҅8ۖ [E6f*xP.XAO8I鶫WN"՚} ZmwGY:^x&#$DWﲳt`_{F.8.hFw`P{$acsI$=?lx <;O֊ k~t#j& APboȆ DFG]6qhr„4L&h̟"8ЅqXљUWtBY)g?^; T{$\MFF!Tz{Y48;1zP7k{C>m5$LOgpTGwo"GbبU˛3 i*Ԯ(YȜ9̜HHqXrlΓF S5x{bN -tGL%5skE!.~+ ܅7f͂YӋڵ}j5h4ܴba6[)((+lpk3􄄸#!!xu0oN׮_>CghP~)䰃3,OӍf,[8`3myt;Q@*cp%J.8((@6_ΤIyN|f.\?3IL%))b+ង{KT/1$&fM:XR~.9ΐ P;^^c5OW#ݱ >J:!,Fd-b (D#wh,-Zpi 6w3'9s[I8B%3Sa. # 6K<̃ԴێV"!egmDCz\'8*}@xp ~CN"_߫ FBB.KJEJH(a0#=ȑ^r*I%߹ )J-ǃ6>Q66X)ц4ܑt ]Y^F #J!5 ?Xptɜ~6OE÷Ձ΂ q$E$xI 2 +;9~=/PNrGc6 h Z]$ $ni*]d\)+M 'G|F8ofvWY1.YR9sRD 8рPƄቘrb~e69FgFQrG+̧XB^2?ށj񂾅ŷŸW*9A|2cΜ,f Z@դ Idq+ēI V$q @) &զ՝(" DHw#\c s{H>AT q%̑9Le}?PDJeK>+x3bDt6ldSHyK 9&lREBB?:RH (8n) 6\z3jX&q;N$BX$UƏM&ŸSD"B8zJ{wWf;N\/oޅq%b&3 ɢl >7|axy'ҹ&fǑǘrG+6R\BYF M m&r&D"B/Grv4sK$G;x` O/nF ^-[Vd;s%AŇ/l!pqnO 5p1r F e4Эe  Mlөjܦ#U6 #AVQVtdz5\a:޼+]S>٫JFiA((@A0v$sg%Fa'ªB E`>Os9}?!JH 1F|yx^rħA*DFn.s劕N IDAT;"UKW~N$ K6LF-g%j̔; ! AYjjGj_ n]'# B;3e2ިгD)"a/#OaHBSMp]AKҵ ճ@Xdh+~x`lX! /g-||$+\ (@AkOi6ΝV>>xYQo"r-f]y G;d9>ÍGS~i3w .Z@lSȣ&gT rRz;nbpƝǘd i~xq|^r -fƏOHH...nݚ[ٌ9ܹ3ĂP5V̥s4hȮ]+>$ F-"r#3$S("F^ T2Gp)r Œ3 x w6o[%rfRqڛfqKx/0/AXB: FGQf| yB\йɝF; `a,_hF.>x`6lȸqnY\={rJ|I @TT'OfU;BE˳2dի?&NCQɕҿI4[St]M8cb8vBh@G4,Q!HUS+s<$M4 !R+W9rۜ6l{!))閏 V|1`~gJJJ*5 T?0Ӳe<[aLC`8psϞS8](+y~-ӋvU|H12b.!wl?>-wA(@paps~YE9r䖏m޼ hтBΞ=[aHļyYhq^Á5yqwcݵ9æͧj;@䰍l3 Q.jOVRy"·8PHw&K5`'jd?h4|WoKNNV<~Z:V+E$v(GFL<ٷ c>=;ɝFP6mZc6mʮ]$麫Օ ~Z?Bn4h5[gAԫ'[&M32{v/^~q*U~Y2k1$zDOa۰7>*.*TBrw.#Ѡ%<("hv@ilL$&^@.,!{5xBu&6#_~XVΝ{6LLL [&44N>b^mX>} Νca8Ц7l~QH1c}nv[|\Xٙu?ݩUQjxe'›z,6XH, 2G!Ҁ@@?I(`=WJ/BX#uvgJ .<N.M/Q|;!… 4i-"++&MvZڵkw>CZ3vXfΜde˖,\:u2j: yn>x\ןcy&|qܵ"'N9p{McܹbӍ]]up0Citj?χpD.i$qDIJ(ojИV $vy$$ L&3(\D _LR!8u֣ܩn͔[^?KDr NNNL>ӧyVDb޼y̛72#V!2҇ qR6>Ys~VЫWbX…bΞ-I3'N9~ɓf,Igzpeڷ7,Vʒ|?oXxqJT@FN)|2Р#H҇0K]$ B @BYVrGsy(0 !d2h]Nuk6,aS DJWr~ yZ5ww`_C>Q,[O1EV^~3j!5ՊhhXB|| II$Z6tukFyӼ39a0. ;ƾo "_鼊4R8G g0r\R&F#ninoJZm!/0sgZ&PoAbpm Wܩn8~}  u^߂GܩAD"\gO,6WHf}Fo^׭SHJ*md%8XOPp:vt!":u[ב *Vm*ڶT8GjǴ !U"2'?I@Kݝݥ3=LE zSZqNgA-w*AP=Q75rLq̟qɉi^}b|:uraD?uK0sX "k9#⢣X)!TI"D2I$rI@jD҃jEZ%Rn6a J*$Y;\~UC"pir;a ݾ^QJ (@(>J~G{̝m -]K_߉peKm7φF> # \!trI%TrH!#y#a'>Ns| ǗpA'~n`!ba6 pIyI}tC,H~N1|_PzG׻̻ˢEΦqL2]o=SNܹWF\AA;=|2C><&k"pgfR7ʺ:lÆyQXhbΜ)ԩW?矗k;Х+{ѭ6ʆ巠ӕx1ϣIHPDC!ME>sB(팠A;x@8"/B&gpTbΒm槟X$GM$ @^MX'e̘£^Ar'S ڒ W) Z83pĀ#8!83nw\ĀNV͆$O 'Ԫ`F) Jz ^5N&** 7뷋h#GIOOg˖- 8Aw{&ލgȟ!: ^w>П("0}N5 p tvH(d'9,mhg9;޽ yB?_$UAzӫF)]-99ϵ|rV~UD|=5ի0ڷcR:^}Շ_flLɠA {㣌}.B`L?_Zx˝J* XApmVq/Z{n:c!w#zU%yK ?B}6ȝB\"7R*yod2t.ggk/%K@n.:Qs$.&O=H׮`/R*#<ؓ/d+,]˗_2p퇓Se` Lz](P)$l#% ZxęfuU'C7tZ^Oc@}P)ud/ėK'~n+ιy!a007^TTtq˫VBD%||tlΨQFN&>%(xy/x#A z֥? 5d"dXA.˱u;if͇/}VZWCWtUOw5^U| w 6+@HHV,YWՍ(@TQ;0iR:ݺҪ, .(Hϲe K/ФE6}=~ M B5c6؅g3qXJ }kA^%N)Ar4R EoJ|5kFll,yyy>iӦz%KI˖-=bKe4 'eÆ| ק;ǏעC?kP\,OkeWcX.% ܵ-VHc4'W($CAG}HxlANkWWl)I^||t^W_e曩:TĪUaV?Ǻnz}֮pG̜&_G,$' ON?OxK o+$W9r'+?S!PQ~iٲ%g„ Qvm,X˗v~ Ox/^ WՑ(@TNG,;ۇ͝y$Zڵ5n^>k%3O>9O;OL 4y /$MXpmQQPw@2XL2:ګ 2i$-ZDVVM4aڵk}4Ml6/_<@:u2v*Z=88hX?\Zmڸp`Mo[ <OUڑ m>7ēleړl"oC0 (< 6`q*>2˳F_Gprrb$''c2ػw tcbbZ7~hZ8p@UFB^7N) D^Y$~vX]V[ޙO)ƁYd,%Q7 T/Ŝ䳁bN+]e\b3;b: k8E}KiШK6܂Z-w*AA *h$"wwR!Cy$Nbઝ-xXޚKfUS1[h !B)` lBZq+> wPt@Rp hk}W.nM/CEh2 (@TJ)*wA…!hyd,CÍ'|0dtjHV3ϧC/A>yP,SH,lEGtÍh̳Eg82CaqU^2:Gԏ@T !Q TN_aF5 Xu+!,=Kvs+ro+D1E'p\# ]nyNA\APKڪo@qO%,5.h8X JD9VW_a2I<\2ZzZ-L~~X Oܟwܟ%T ŜDabhx2 :OUL-= 5f +<.:Lg#D"T ̭i&\+$}{-[V^NmWgx3 tܸK=_vmHJ10{1hp™:DXU8g㢮fcm@p=4̽2++R2{\r4%34\RBEDda`IK;}^ {!+p Х;Z{gvrnwuJ읕$I@ RgmطweZ`ݺ`:tg8QP4x뿄G=i.ٙ\ 9K!?Q) 39:0tF(q9s5 | rrS|~x :: ]$-YHZ`g N!4kG^9z4N/&{! z\pU!^Hc".Q8K!g(`A'4Ƌhbm..fz:n0+xqq\BqNNN* vUP:tB>\ٶ=9p 1cnѮ {_4 @g;H)0O1JޮRD,&~85A8D-,Ypi[? !}*3 84 rM`(n < &,D@ td"{92>:I\\&]rv(ST*%*ooz ͛쳍fM?]HNdΑ#L-Y`Fhpv?< KP+5w@XGJ}?LoD F1D$`$3ٿ74DeDd]Xt ,D,\B X(Lal`&YD:&1 8WዊJ DCy5!hEM*|+ΐ?Һͪ(\BVx_ fX! 7qpb/<Y^l$"YHReР( "&&׿cS^'mfծ+<ԩ뎟ؗa}a7g1/W_Oqm |pG;J"JRigJRˎ=zrPL'dS$<ޠa.6N8s9-]VMi:8Q !CNT ` Jw p3ׄS yZLvPKCA,} I*E$гg ~y$5jҡj,9i^|ћJԼzX+6NۄCd8p H͔ +b+ u.A^ r)귰 |5³BޙݛSaHlL!rG =ػi^z)/ɓl.ӻN7ش)~3nھGh%Gc*iG!n kπl.8G;ґ:|5ٽHC`\Gi$UDv$UjpO^~y/,]f dTOg2 ; tGL~V*xH[i! `m+]paֲE+a$' ݆;NdJqlƏogفla6)BZ%G{[̞z"V;pGxaaKRaʂmrBRplA a&uyO j((juy0ULRHKޠ؆mB`k?Q^f ͸q>Ԏ%x44:_{gvnФ#wVTaAmNNN-9cbb).b23Y'jBK\h3MQ@wC&kaJ7xf߾+t!,Nf:> t>>bz"J\Y Hě1F.eL"7p;<(([]AEU1cvp G@Q^6|6 6- S[#JeK9%I (>01yyEĤ1yr+a1$q7V-?֭EhRu/hF̠JTBM!O/x2OSL9l% -Qx2wGAܺ77@[ |;#,fʺ[~ uJ ,af,b-BNA@[Nz[%JKi$ ovX,P~%a1$q E1g =jSQCF#QEH|% 0oFAd&\'OY %-K1\ J7n(·_X/AH+w~GOq .TwVeO3/g*:Y8$#*;… YOX I]#x8~<6m„h;qJ-R%J\i+)"L` <'PRFz*_ <}"[k{gUzrnR0dB3v!: Un zQ-U JSsJ,@Э[FzI/態UUF 5kfx˫J6mŨ_?//gjU b ?*4T f<|H|Q`דRZkCP0Ճy:FP;Cd x9 ,XKo=V=$94Y8 IoqIBZzb5cÆ [TJZ̉b'BC5>](4D !" A6޼D:IaDϛzom!:{a*[phD g?~X ;Ê70 'ImTd#fEX(bc3sg[P0sL!(0`bԯs=?@`$ޞ-4$`GevFMsSzTP+{ANIoG))V}cq]|X,px;<]V=`C <3]T1!5$,FX?QQF1o޼ =m{ {jռq#A\"-M"7" Al$)4t X071  -n<08jo!'(|aT[Š0e]PtS$"`9p>길b֫Ѻu/2:uԩSvs=NJOܸS23Mx{7yԡ)PN/\iO*ok'45\CWKrȸ1Z{gW:jQЬ(y[cƐmS$" T-iS1gJڴ 8^{M\4@TTQQz vmX/ ?-#b ltB%nt#I(;/)Pi*$L!헋e֡ %| (- V;>@xm\+9eH23ٳaT{%ICnr@*U\ n"8t(PɩHƒǟy䲃8$PAA!}MqmɼnxWkS׶yRރ~Ua;6ŖL1wwvĔí ڤ <¾Qy{;5Ir8qP;sO\ҥ:˗RV3|9B:bX, r&f@aNw>h:= Ismlfw8+E_M`{;{bX޶ڵXT9}V읚$9,Y8-tX,49ww_G*}nY j"+LD $$AiZ-`hDBp ?mJ4x$5fFص Հ/A7sQl,7w'O4jt4~Ik$UqP-ZX@hG EO?(tTn⎏|ڇT_Ph;ɤ2@'Aƒ$34; .`0ۨ/$(ʅ3KlO áFcX}^_ U=3[֩C/}; p{&I,@TpH' P(xݎ:uO?@TܞӉHL  a!2D=2xT~^z4 $e!Po2f8 փOAH'Աwv%o"uL|ƎZt4z;-I*Wd:wveϞ<?ưa xoXR)n/yJ :P$\ ޼9dd&bMV[ZL4⏅Cs})v{sK4+S3B$IM kW7]+9a̝JɰaV,qI䱿f<9l% Qh t)䟂f4zoĻ_F# ׆JV<=P/;[35/ѿM5IRE$';0''O<ټ^]hGƌ0}AOywXV7<ԙ^hʷ;xA 7fn-Y9 F`OjCp=t٩ {}uOxsw .qk8vƵcG*܉fM{%I,@ܰa^Xo/SOm[GUǔ6G&3c@rbIr+R0m4yռ!{)@n|0T[`5.t8>֪̈́9B 2@ 倻^fٲ n2,;0p`O=b2LIJ%.)F>!]˗ eQB c"[lK#uoHNPg06x])lZC^M0d*x+97iӸRb'OҺS$,@ʉ |Q̞jӸUz1{v{fcU(!p~9߉W%A7c ^wLd~)W""H7_Kx B㔤2E,'U/KfkV Sf߾N^_^vIS (zݘ ;y}O.iv͕xi \C *5U4N`(#H}\mԈ#pi׎j٨N ر>Tf[vߡCU~y$mۆ1h6ZZ vEDmg:xd)̶Pb *8 rC1P ǯZ=(*b㔲sܙ>Ã$x:!Ie,@WW%cG._}emPz+[c!Ӭ't괆ݻc0Κ$IOIA+yR씏,9 IDAT+6A={sMHzW|b ƩںJI|6h@իoJ5wj$y o9ӷ;=ȑIn킷}&o_ӧchߣt wE޵h<gY,23 IN#55lR(&ny-T8B+Rfd9x6 Ml0tFPpY( r pa4). > vPNOL%}nn>#GЈ?^# rFPǁԭI|yrQ Ppx֭,Zt''MӸq uSWfpR:̹sHK+Ks BB<_I 5Lo1}Pxݛe)L%m(D7^j]# 7i9%.ο`.,$cbf\PĉLCNK#H9aѢJ rn8Ӯ( 7y,?'qH<ݗYfVEj>Ԯg̘fԬG@+z+:RGb[,,0$%rj&vqR%IW:0s$H:y 6Az&  ԁ9HfU\m%qq> &>m{s,&Yk֐2}:ƄFot4 1 x ֬YCff&c֬Yto?oժU<3wIIIHW*CdRN 7쳉ԯLec[Ra@6 d^B#Rٯ-Z5Z %!!R$W ԧ>\:2θ,piō(E{@FT@X;RlR) O/@, ۷jUo dd;Ir8O7&E;M&e f``p )NJx}Oܽ{kޜ{ " B6oGs 6nȜ9sxw1b ,,W^y垞K. 4OoZmٸa*U6$!\]lLR0)T HSL@>_.T> x,|'sP-6NDD{i\bA\kۖ;BAۇl϶lقZ1V;FB?oXd*7I%1dREFjټ9}x$9u%UyD7&SH6/Eخyhl TސFlʠ+Ʃ#G־=a#dNõ}{ ݿ3g۟:>TR0=3eڵk'Ջ˗/ U*{dRt|y&ojtʼ}XE ]D6"mW^ŋ}v^yO˖-qㆰC6WÇ{ldݕLk,'Ietd y@K$'`Y|/K!8'8R}]qq관_% $OQ|C|?g^?x-8#ڭ;?^PPp~ gg<<䓿wϞ=ܹ3mڴa,Yݏ)SR<9Y:H$-`1&􃨩]bgxkPp^lжp~AN8EFR#4Fi1dgWXEڥK߾Avi~P{ r%rr|hР} <R(y4 IQ,B$IKv@:76PB{ہP  / ,f3gWbQd$'>oKի¯`0rJ7oNpp0`l~E鐒!vӧy'/ٝ܂UK`C~=-[?$G8vPxq43MP6BKqN l %$}qqׇ?{~@[&ƄL99K׏cϸq$8A8w.+;2iӦ-.ڀ~SNp<T@[ɺ~meKL ;|>V^͸qXf cǎd2sNZ!_Peh;0f?ɓ' B [pd||Tlҥ/DX ' ;O&N0/y5|~~ 5Nd0\ 38 c@ gP- ',SDEed\q~>g5ݷ̳'ONj̝;7oRPP?HN1+Wd20sLN>MFFWm$4|}&ط/++D$t\r)n׆k 9 N!NA]r AL}|~i&wz :h ;*.N`8 'cPd{_!*OOTz ̹k?e ))4?NEaT2h:ŋٺ5ˣvX6lȒ!4NӈxO;j=1f>(9~MG&7xnt##DW@dH(_z5ۣU1NܡC|Ҭۇ !ys^psCH ۃ_J6. xopJ}$TAA1GD6phKOBY~L+"9,4n-!'0 ,u$CʑJ^NR ?g<Çe U<IdRn}@ 7}{R&LEzzid$Ӣ; x4*%ƫ! I7p"<OYvmb8N `-@ ȆH~j*Gfq:$=Kuq$HԽ<3 Gzsb5xCϲe_גIKo$I L vɲY"#hхB[ ^J. NUjCӣX!4o".|""yj:6.^$j@Jy)$I&ՕASGA(5;pqQ2m9ҋ ̋/&mwz$2'Рb&_GM*PP\9u8Yi#7)Fw^; U1u`2aLLԲelݛ*3eZ jgg1%I;YAZ-|1cC 5Y;7L֭9ԩK۶X"l=Kw<.ȰIj4GGGS@Iw]='QJaׅДL6޼),@MTܙ'lU*Iv' 2J ߬,>rrz53f艏ڵA89)1"zΊ$%-Zpf]…!15h 1W Jp]](T%W5WsJ6,@ԁW@bbl/$IYaagcݎUPƆkJ d߾P]̙zMH`` u\a$֮"&Y+I-/Fs&cU9$;4 :`1A`qUrZS#l! ^J%Ƥ$a1rp C{'̕q׫`;-n*k*W0q/'lкEAZZjr"<܉05AAT)IK3b"!ȍ\VLll1Wa65 䏮$;#h|p txA97.G6c&%.bh# 1\]L @P۰D:+J%*??L)b(̲ $=yn ;>@e 95x2`'&N*yjߊ8x0#wqVCpʕԨDήh4 ̬ZE7p~QT5 biD޸ Ɖ jCq-u DLʠB%"&R-@H=Jc\||(HKC{' ax|l\tx{ɍNxqd#IIFrsPO74TèQIjWDGS2VBcSlD1*4Bbh()"F\PS]Ao[(}|0=m \2C8magp'2уhkhXG۶ԭL@@ժL&~؆JRݨA.BXbR )&FX FH ɬƜ!5gOOKY8v-ap"응mHIGJth8@8‰d6VQD8UbcC_%v D)W@$ CF9sƓ(ʿtoe~+e@'ye;"IZ4:GYX%*|L:b4`D`6&W'\@p_䉽pWzx`FQ^:^*8rfnݺq9^y|}}Yx1<?ի&K.{T*UW'~]ZKåe,@$>R}ʯܠ>*|DMe&4(NX=_zBn6+@ǐ$.l±cزe {_~DFF2}t֮]{Oӷo_|||X9Ⱥ2p'd0zueAy$,q'Q,XP ,=W "0JaZO(z$.+K(]]1 ^t)Iҽ[b˖-TTϏ~_R\|oMfl,n{zW+`p& {+k$Iw@A]} 1bq~T0!t'I`oA}(,Ex0D Yř3ghԨ_衇ҥKlK=LK d7T&w +!]80!pk$BMb%+DE.:Bavvh0!Iҽ]$&&o?vͿ|Fٺu+#F`ƍ<ڇp|q7XQJH=7l&95Rr ]ui.ܕXW"Vfۗ4%;L5+Z-XZL2BX, \2bV{_Kcƌ?4mڔzŋꫯS>+&iݎIs?, z!$qtyyVn>iF#LhN H"yQѕ/@ʒ uo + %k-(F#W@$ ȡCh߾=}ŋDݱh),Y&78 &-@ƍ_>w> ]^:Ùпl▤5h?XftJ]Dk,EZ4hQQ0";֋j(Kn`^Jb8YmShS-[o(5̥²~z֯_23Ş&IM(@jժŪUc+UXZiUbb"AAA*c.\xէ+i^`VXT {৖$ {@\K3cPi7TJ`U% ؖ&wyhR w%wE~EdRR,@bq1lQ4X0L(8;<}47~畤B  2>A9rǏJdd}aX鋔6.~úH뛛!%aT3cq~ 7'BB~;%&C45 !!BbhPa8@ X/@-"EEE` e9q شA I](@}emF>}HMMeMxYy%KHMM=;AV0{] Y`h헤 reY``1qnFz~|}a3pS|H$IRi]ۗ͛3|pnX1cƟ>vȐ!>|_{WU{巠0*(itPaV2uIevMٙ9əIϔw28SNMtL-DR(:" }{m؏ߵk}ߵd]{5zh͛7Oƍ>c(..NO>GR!J>"z" [/|/%mu=ݓ8#i58 {;w6mڤ4 6L~bbbk:SZtdiRApn^9!7ƌjּr_òTx bLJ{J萔)Sz-1Ҭ{'HlAx]v{m:e>l5Yz `R;wsvogwPT$%d߸'RҹBҪevZp"$#i^?K{^jK>"@2i,K_"vE pߓR' > Lnon + Wjlv%xٻu"B2HI/J{0Żu"BI Wi #xk󱵾77{^^j RJiD*j]Ul6oWގҋIwZq6 xVwI(@D#I_(tRِ5w@Bcfz6$in~%, >(pA(i^4et+FbI,>g~Em` ׁ[Jǫ IoWGNHO>~+w cׇDjni}#&oWpIDATrMYicқ/vU 9MZ0Q}ү?N\vE ģ#JП@`:w@F'7\n Ātn Żu#6oB!iJOOWTTݻw_5sL5J>|O/Tހ-ZH7n… i& 0@8e>LzꩧyfZ}Z[lѼy;{uf~>.2z]uUkkiyءn;_GU||~i:S6 @V)>ե)!!Ü~ͪRԚ|P/jkkT- NSiiڵK&L2۾SRRRܬ G[cc233ֹsTRR&|UUUW[[;wj.33Jn_nQQܾXs\2! e ,C`@X2! e ,C`@X2! e ,C`@X2! e 8wVZdGsj3g P=C:y*Vcc@%%%i,mNhÆ m&Il___d}GkתXw}=U6^׽],{-Z7j…ڴi _貟Y 8qURR˗;jŊzgk.UVV_@HBСC /kɒ%5zhu,}N+,,sssG7߬ӧkǎ(krss뫥K:}]=BGq=zT'N0mҤI*++W_}ܣX n>i$Iґ#GQUWWˊ0ٳV6|]cحy]^_CCӐW[~SGM͒h/IT#TT43(+,BǏLiiJ;w)/ݟ+**TTT:U"#nSQQ/TTTu?+$~ ]:)xv%ҕZG|UpNT$C"\4Pej :PmT'Z IJ9{|~\jY_JRѣ ̶{\CWI_$Ƿ(44˯T =:$I:w^cٺ:~xolf߾}Z߅ f3֭0W^16͔vwF/^xūoAlݺՒ.z{:s1cLFFFw8 ׇ -ܢn;b7tPôNΘ1C۷oWtt\xnɓ'5c CIo)00# QLLLNfuc@_>|{1ǫô|;VAAAЂ <]"p)SxeZd덋S^^hϗ$M0wpN>vm)))*((PaaڻwfϞmunfedd8$9RRSKJJR ٌ1EF֭$;vL999Zx%Ik֬q7m4߿_---zũN+V^z%ct{";̝;Wo/_c*;;[֞={4uTIOK߶m5j(Gg:kPz-f|||ڽM֡cΜ9cfϞmBCCMHH9s)++sL4fڴi&88l6Tm 36f2'NԘ'xDDD lg?Y7Npn7iii&22ɓ'>[}]==̫TgכfƌfȐ!fnn7+W4L<ڵ<-2>>>ԩSڻ{g@$//Op葖y:z͛7 uM7u?~_h˖-4`͝;*ϟ;wj劉Qff w^qWgeeizu7ۙ»5f=Z7x򔕕խJǁkrLMM1g[~lÎk{9 fvhp2dyGٿ ȥK}vF1b~aG[DD̙?ϺrJҢ/R^+___-]T =SWx+c>{vρ9sf̘K/ꫯ`x 85΀}ح;NHRvtÇ}GǏWAAAi;v,xO0A}1l|)66:1*//ow'4X'..NyyySHH=??_R_'x+c~5'N7 Ոށ}_N>vm)))*((PaaڻwowHII?vEz5p@G{g}…|WuE};\Ḫ577+##بL%%%iȑsΩDMMMvw{@ʘw{***b$t/Zn$رcŋ-IZfciӦijiiq+..NuuuZb|}}K/9ngAZZZ4uT}'Zr㩸gΜQAAbbbv6ށ7oƍ'}ф tΛ;wz--_\cǎUvv>={hԩEi۶m*//רQ$9=w(>>^ UQQ^{59R~ߩVgϞՖ-[;t=3 v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'scikit-fmmdoc' # -- Options for LaTeX output -------------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'scikit-fmm.tex', u'scikit-fmm Documentation', u'scikit-fmm team', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'scikit-fmm', u'scikit-fmm Documentation', [u'scikit-fmm team'], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------------ # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'scikit-fmm', u'scikit-fmm Documentation', u'scikit-fmm team', 'scikit-fmm', 'extension module for the fast marching method', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {'http://docs.python.org/': None} scikit-fmm-2024.05.29/doc/doc.pip000066400000000000000000000000101464214672300162060ustar00rootroot00000000000000numpydocscikit-fmm-2024.05.29/doc/examples.rst000066400000000000000000000006011464214672300173050ustar00rootroot00000000000000 ================= Example Listing ================= 2d_example.py ============= .. literalinclude:: ../examples/2d_example.py boundaryconditions_example.py ============================= .. literalinclude:: ../examples/boundaryconditions_example.py extension_velocities_example.py =============================== .. literalinclude:: ../examples/extension_velocities_example.py scikit-fmm-2024.05.29/doc/extension_velocity.png000066400000000000000000000641051464214672300214060ustar00rootroot00000000000000PNG  IHDR,d(sBIT|d pHYsaa?i IDATxw|TeLB:I$PB' A]~Y]]Uk]כv"M)RDҤ R)$@\? TIx=y(gs\f1 {P ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", "7siĉjР|||dەVXnvMVyd_i[߷~!C(22Rv]:tv,4bycǏnkĉ9snw)|v]/V,#^GE{USڃWe6qD͝;WӔ)S rYf+k]s[oU_㕐|_TX_(mݥ^+ݮ~ []*YbbbԸq"5zGO>^{MCm۶UM7ʁ(++K+Wz9y<#W ݔb)}"m۶)11Q/z [/ W_O6MSN-ڵk_+]UR9RݻwW:u=WؾrgP ѣѣGVU]o7B={VիWMɧf͚Y>}ZTn ['v#SL)ec*=00P-Zv3Px>6BJӇ~8]Irrr4k,uM V\\;p_݇o~HR;͚5K;wVΝ;_W?.\*""BjܸƎo&.__~Ym۶UppԧO-\02ޖǏ뮻RZN:oOw$g7!\݅ 55UO=Zh@EDD[nњ5k򵡨.>w\w}ܹܹ<=r!?^Փu=y^<,nBWO>+**JAAAԩϟ_;w`W_}U׹އkwyGv]{ouC驧RNɓ' UVW jĈvʕ[UV-Yfz' =|Z|7m$ݮ;3Lj߾BBBTzuC ,(z][o.={*,,LAAAj޼~}]jTcڴi:xv P`[۶m+???;wDhEǎSxxj֬WFFbccUZ5mڴI5w\IRƍݵd=ӊUPP5h ^:_>]VShh4|p}w9{{1lR!!! S5a=z®a)>w|.](88X5k]wݥ4}tv͜9'O:wgzIW9}z!_QQQ5jo^<^qg}OOu,.YDW:uuwޚ5kVpR?^|Eխ[W˗/W@@@糳_JVRllƍ}zGe]{u]Z=ܣtcǎբEԨQ#l裏kE~a1} Edd ?u֩UVر$g!ChƍjݺyeddhŊ׎;4}|8q℺vMj„ JJJ… 5b^?qDըQC˖-ӈ#Ծ}{2$I)))ѣ<]7Ο?E[n믿a zW_՚5ktkРAJMM-ܺu 1B4o<-[LWV.]$9?~\?Ծ}{1BlwaRRRԫW/kҤIJIIѢEtwԟ||zWԣG=:q>C 8P;vPVʤ,mjԩڹsgu.裏ohի{nZ|EGGYԩSϫz1b4hQ6mҼy4p@kMiӦVZk.OW_ޫ7|SsߞyW0?: 0@;wTN4i$9}g;vۧJ%7y ۴f5jHǏWu1-]T{Vfc :To~ke˖[oՃ>}O?_ݭ+33S=z5dq25f5i$ϲ|(>2k,-_\wq-[hѢEڹsv-??Bgܹs?!ܥǫk=zTzٳg5h }xb}'Zxq/kƍkԩ1c$˵mJ׿nݺ1bjժDڵKz"ҶnjLPPٶmL:l6?8\3i$cҥKӏ;fl6lgɷyftb233322Lǎf3+6fnݺ<3gθ/fnv~9ӨQ#cƍ=n_<^rlfذayϞ=l6;xlol6yL?x 5~~~رc^f337 1;w8'e˖nEynf-[?nl68qbjf3cƌ3رc&""G]=ܹs|<]×_~Yyf3v=ϴʺZ?hM_b1=nWfӧw)f޽{9sf&Ojٲ7y_tɄ:u9fL0l6ky˗СCn7;vpOwӦMsO+M=f;#eΟ?wAc|`l6ӟf֬Yq^+p fԩӧO7C=dl6y駍1; Zĉ߷o_c>|8sol˷-M4 64yʕ+&00Є|?^O`V 6zҫW/c (CKHHAӧOggg___ӹs<ӫJ`)<깨uM6I&yvm> 2bc=>߾}{U~?g f3?{څ ڵeܹl6OyXz1aaa&888&hlL͋\7KA5j˦}n3N:yKawGK\s={˗f,9c~ُLR: oٲl6_=zWWթSGڵ+luE=zT 4euoc h֭j˗չsgwk/zlCitڵDw!O M6iǎݻuaÆjԨQӴiӴs|u)4___ծ][)))&+*<8{=͙3GvRjjrss];-[d5t"yfUVM .ط;++KϟWJJjԨQM2%_7 5 Wwp8dQBBBeeggKj%(--Mݺu8"QY߯iӦ?]w%-ʕ+zeefNJ﯅ SN ݮ%K͛%9z/Ο?/~V~}\hM>];vаaԳgOo߾Xâ_1m,̨Qy湯i<޽{{|yiǎ?~|Wlq㏫uֺ뮻ԻwoS*bAM0A;vȑ# /ڤ$IÇkl6222M/~R͚5}Zj… i_~euO&Lp_qm[X\=])\p8\wY4JF*5|ILj+z.GPz4l0EGG+00P4{|;FźORRrss 1fSzzz~߿>s8p@ZҹsrJuAmڴɳ^\}ZI$ǻq_ԛo,o=7omjͺ馛4hР/õ_^Ru~VzumٲESNgI"##gr=ⶱ0=z~mZJCUVV,X( 69^]Ug*TZ4k,f |KQ,hԩծ];{u5jGnn9o^O .Hvԩ_HbRږgz|̙3y^WJ/B999^_E ʲ}ף\/Ͽō<09sڶmjܹz5eM2EJIIѕ+W=nk{{ &H"yp_^Iz ]<-VWnv[Nu5<}tm޼YڻwW;͜9߾FGG뭷Rbbݫ3g*""B E`k?VJJƎ'l]jVkv{Ǐ͛7+99Y|&MuiȐ!y~E,` ]/_ ͛=~a.8溇8p8WeM6:{vUkWMԩSytYv}uZj@ڵ/Xeӝ 4\u8?N8o \a_ysa=*c <ϝ:u*.ݻwʕ+\~ݕq5j5o<c;Zj;vluڵL.ijJaaaڵkW_8]\|Mw^}W2eZj{e˖:uǡ ݻKR~M7GqYtic'zRƍ|r˵? ʵ-7nwvK0>>>%:aÆ7Խޫ$mܸ˹QX,d۶m8qdɒbG}TgΜ]|9kΜ9D<Ӻt{zff.ٓ&M*\#>xbrss|w}2'ӕ… ze+-/Fj4n8ܑ#G4sLi;wn￟JNN֓O>y]mVϞ=ղeKmܸQ~a>mܸQ-[T^d}999cǎi̙ %SW\)6lؐu{0G%I?/宛TJ z%ZFFF ҝwީSN㾿"##uwkz>>zu%=Cke\j͚5 伖e˖3g>#ƪO>E.IIIQ||ZH-\P>>>;vl؅Wǎջwo}G={ٳ}-Ki|wLj\{u%͚5K+VPv]/RVǫh 3wWO\KΛJڵKWWttua}Wz饗ٲeZhZn;C6MK.uA}Gy W_}UFըQC?$׀4i$͜9S]tQxxN:ݻwk߾}ڲeK/^jx C͛7WTTN:e˖GOt݄LMM5M͍Q2dYzdee?Ϧ~4oL>x{%$$^|T†5.Ϙ9sqXL3Ϙf͚ӰaC#o1~:t0aÆfԨQfڵ^qFswz???e:t`q74ivSV-]벲믿nzaŒiԨ4h?>%7cCK.&$$-Zwȑ#'&&cǚڵkc=5jPPP6Ϲә3gf~x\֨Qn7z鯽5rvEK/;h4ibn6ddd_[Xc=f:ud"##iܸ=zټysyj+8Z1f3~~~&11ז4>iԨ3fȑf8+ fdd|ԯ_ݞ] /^mFi4ibLDD3Lzzz)SOnhv]sZ 4}*a)Bzz|I 2DyD{jTppz@PW^yE#;VE`)… G ;|+W4p@]V3gUvm :BG)*lz5b^Zwqu111;&%%魷*oۧ͛7hޯ_?kNO>lR.m*;lǎ:ut]wi֬YelUqJzϒ%KԪU+[r7n8m۶0U\}Po_L0AC)))z7+k+ K9ڻwokh}nݺypV\"o TF.]u-FY;wH,(99Y%%%{nʕ܌7{Ow}w/ FFB`׍{21\EO܌rY$=T~LL4#|se,H֬R|lS"7Yz+_ogv3)f'MQ}7Ϝϲ?MZuWYXQ͚5okZ͚5= IU\\9}"Jfv{k_/kSwΰR.(/V VӸrY$ۢ'?P&.b,Yw%̄ʫ~GvxrҸ}*^]QUw7./Gm۶ݻM߳g$M6$ʣ畺K(ERFh۶mi999zԭ[7թSNj&xDbXb222tEIN>II&iܹ:z4h ISGYfZf׶ ;QwR =N8!yŋkŲl:v6l(!Ñgz???}z'裏*33S:tЊ+ԻwoomNvJv[uWL+~P7݌RoJWw Nװ$O|<?-7XرcEfٚ={vQQQ3gN9z*hmM]1UR/,CӠYw'n/a^Z1ׯXװGy @@`WܾkJ*o7U,,,*o7U,,儡G`_XP,{_ ", Tzt$ "#6T nF`@\bYE``YP$xtfiE`(g m T= n* YƒC,,o7@Y +eX*CC`UWˢ;XA`@`HceX@ՖbHOOɓ@uA .,r9sn{|$&&V@ˁʋ*uׯT*n@e0j(m߾]Zhy)>>^CE?gj*ϴj.P%Pw@ţX~֬Yk̘1}ĉz'4f텟jӦ*@@`Ut +’%KTzu=:'ںuk0ƔW**^o7{X*Kݫ|*mVo߾"qmW5kԯbȨ;Qw(o iҢKXԬY|]}r nݺzgխ[7jݚ>}u릯!ɓgZ|||V1|͟??ϴ"VI3$\3mrX-i5ҋ1d7j;@%1q,ﴥ*"[nEr߽zնm[M2EK,)p3fߪcǎ;iV<XW;(iR9 z}%2]%,qo+g}7f͚UJNNv?_5RϞ=e˖2iPQw@ţX7|/Ñg={$9GD) vm*x"aȑJOO|g9s]hyGՆ Խ{l&PPw@Ża. PR\RCjzMjZj͛hҤI;w= Hu ў={׿Uz罹YQw@ţ*Ί4Gnƍ+-K1|Gzg4e%''+66V ,Нw~3}۶m5o<,^@,:p( ݀ʯ‡4;XF`YT2])_E`, ]=*ή? */_,}(gW*˸ P0K5ydEGG+00P:t… 5obb^EFF*88X=z_|Q-*?K֞7ϲ$xoՕYi`]8"5JsUBB>3uY?ʕ+8p֮]3gj]WPʉ`En}Zfϟ1cH'N'И1cd{|oۧ͛7k׮~]vz'e˖ 2t*z}gW*gX dU^]G3}ĉ:}n-4%KԪU+[|||4n8m۶MgΜ)vuxWo7{Ulll_ڶm+Iڷo_|g^FFac0\Kׯpv%IIIj֬Y ~]I畤ɓ'+<<<ϴxn*ϟ{jjjxB6P9iŘ{Gݡ+mݡx,5c yu[uK-*dI q&y-CݹX?J|f]|uW%5kPrru72JQ{VF61wX q7kr8yٳGԦMm۶vޝozqnd"bȑJOO|g9sg4O8p@۶msO{ァnݺN:n24.a)СC5x`=JKKSӦM5|ZJ͓f$M4IsѣGՠAI}ݧ=zOH͚5K֚5^+BftXGgє)SX-X@wy5CC4???}z'裏*33S:tЊ+Իwool PiPwwTF`].K5c ͘1̞=[g7=**Js)֡4rss񑯯Ez!+GvLCEeKlv&_?|٨;/cLvٹ292W՝Yw>՜gSw. *l>}Z?Μ9g*11QϟWRRRRR4]xQTvvvo`(44T W͚5UV-EFFN:SU~}\{?0SIr&EWΦʹu>MI ~YW丒>/`~v(0G Upx5D*"VO5+jWjM=ihccrR3tT.Nѕ3):iʺKݥ:.'r3.q)+ ;_?}*8W!ZOuUE+||~qv,~IԡCȑ#:z?3g9;R222b5nXM4QfԼysjJKe肋utRe|VSD]>$SϺP%.&rv@n#RRFRhɗO;u,Ƀ:ce9#guy]:q^iN9YFY9JO)~}T~bTI6 _E##0+7$ᰄ,߿_;wݻg۷OOvJ,55U;wΝ;=WzutMjӦnfkN۷WXXZ1;wIHIH?m{M,K:S2$I^_5eԺtss] }Kn[ *z%txtdtttl)$iW\9F/)%]"Izl6mImJZ:Y^ƨ5XP1:t萶l٢m۶믿֮]uUsEmݺU[Yfԩt颮]*..NnhIg}ۜJ?yU.+[sX/kה:$ui#um|W^;QEe\s[=]P~+)c~$:Kk{;~m5.''G~֯_뫯x7 PzTNEEE)**J5kTDDjԨ0($$DAAA U&vl6g/Ŀr劮\K.)##C/^TZZRSSd?^Νӹstiz{}Z`$;;vT>}ԧOٓ0(cS_JK7:]ukȿNj/*L~ZDoX|ʷz|dWvj%]lɑkcP/;t9=Wst)-W?(#5[iv!K?%f)lR^OY*msI'MqR8OG):l/>˒»%uܮ 3(e}/2ڋ _PUU]ƒu=`'O6?_}}$_8um}šKrl';k,YJ9sE9ۦLi7·K:R?]ۤ+A`A3Zj֬Y/R/^,v7n-ZYfjڴbbb԰aC5lP.$33SN҉'tq=zTGÇu!eff{YYYYڼy6oެW^yEv]:u5dC~~~5HW;~q֪65ԬQ`LE*a-_C>I9%xE~t%=˻ )#;|{-IJI:Ka2/J;\wKǿUj)y]5&u!_Z|YԝaSbpYO\R:}wҡҩs%[ɳ·<ٿt ,(#'hŊJkN7|ڴi֭[Yfly R-ԢE|9:uJ}ۧݻwkڷo_F-s8ڶmmۦ_~Y!!!8pnV >\I:+mD:%5o/5YjVjZjJ ׌Vd51j:#I"? !{K9 _$G;\zR0O?<,={SO駟ր4qD5J(拾A_*#uj|yqIZ9K' %鵃G0&)ʭ+;P̑ҋDzV=pg pUݾku/f5t>#m+$}3ys~9R7\&6bK8&gW<Ο?wyGo,q:tFÇ+""Zyc5~xeggkZt=U:I7m t'UX8C闉ω EŅҚR gVi=WI͂t%]pAK,ѬYe˖*x<߿FL]vYdw}(**JiiiJKKo[[N ,ҥKuzy衇_B'OV|||[a,Krte{ZnRRR#!ˤO=,吏acJl)t_=<H _,gwIgIGK%լkݠRhI1Nˆ]쟣%7J[o'OF]w*v2\LI@EEEz駕cVV3>ӊ+4fŠ DEEO>ѣGStq=SرƎ 8EľJXm~]a%n.=]:Siu_{Jk#_J#WTHwXj(!u~HԴ;abEڜ!"=$b{_H?ߕkf#DÇkʔ)СMGzݮaÆ5j>޽[>(7&t9R+VЁ4}t(/^խ[7r-Z~}[>{QxktvMWJ^".]e nj#)}3iR~1qVHo-FC2iˏme}i|%)X͐<~%; j<]\zۤhOKwCJx[+`x%߿_'NԕW^_|QgϞ]BBfΜÇkի|;jƌ*,,ԲetM7veYbE7DEŒ$gҾ) "^37)uz}ayiU > (SI3$\ےjqwIһ~. AgIfR,S[X!̧ۭ~^ZGwpE;/^ҿJ+ڛK;p&LDE飿ڷoN-[oի'Q#6lPFF .~)GI Sb4N ^bтtO '9"9I#%M#_͢[HCJ;(u}KAo|E+Jϥڽ.s,%XXk ?\&MRbb^uwWeYFv ak׮zt!egg+66v7nTFFzuYz7Ҝ4_P|ܻRߤvHMD#.Fz"E* TUIz^(I%1ԾI+eI͐tfgҕO3',B5',-m`қOa^}\ FKM:U;wwoذݻW-ҵ^DZO;"iIc%m3Qiy߬iwR'zߔߪpx<Ҡʾ?J}}Yفe$q8a… zԩS'=:|mbbb4e8p@gWp9xפIw}ڷoΝ|rjܸq:|UͰfI@$J_{n%5OZ.QgP^v%=*闒g$= }T[ROGĹBYFKZ%.,R^^_J_~em5j|P~;5h@wu٣uر6e7Pbbx :O$++>H }oI?4[Kne:तH#>I/ȞGv|,WtTKaﮋ'ik__}e[I9a$$o7|l%1o{T%C]rKĽF`q ˲l2uE/וG魷UW]V"4mTӧO׾}4i$EEUYvRSS裏}U5vK(: qQuAl"Imm#J٫ItM̝bd_^*VIU.,po+ޤ^NiI.-;NOĜD`qC[oհatȑJ_~Ն "iFo߮~UzҥK9s{uuN4>/L{&X d˕t'=9xܸ r;ό=͛;eס!C݀0`5[v?޽5I~'Ava VRRٳg+99YN4hiӦiϞ=9r$wGHtU?C?x 1cI_+ifE@U_"}aBe6\圤%#@U7^ٷ𫨋钸1jޕ 7{yޒ'ײmbÇ릛n/KWPAAz)5n@ x< :Tvc=W7Trr֬Y/KI%"{% Y =\1I?|>ʗLb-Y\&{EIɵ!@bes]*_}E`X 5bwӒ%K|ru D0Kƍ_Z۷oW^*=1=C!h=}SM9<.=03Y)͙\p/+twxCy]wݥ]vi Ѻt5k^SCݜ6d-UvP/;fj&JjԌ?1OJj|_NeC @BBVZs?'**J'NTAA BYsdG~XDtẤqm}UP7,'OV~~Ӯ];z7\R:/Zlnp*7^}WS95ޔٗ8%6#<{Osz>M<ƌ;wjѡnNnK?F+?h.ˆJo% uCzԮ];kђ%Kw޼ys*:t_0_|ЯmCS{%'$ۆ^ zY"ӽ+޻Qͭa1tPm޼Y3gTbb.\,(++˯c̛7OIIIk"0DG0 V\\1BԻwoֈ#Uخ]kàj5K794 [|Pũ`]A1 yyy4lذry:r>ؿ.e˲h= ;+!,UعstRRJJ$ 2Dъ~@Ⱥc.Kأw%<0$ 'Oz7ұ'Ozw5m4Yfڱc}Y?,#>k] }= )s; R[Qw^89qhJ0{W|}{$M^Z$m$I^(=_S;v 7ܠ7x_*^aaf̘ӧcw yu"&i5ڧ[nUIII1Pjz_M*֭[5c vm>{=nb% ޿,ԝ殄&W!33SZlY͛vکG߿_ׯWϞ=L P{@Qwܡ$LngELKm 4H ɓuiuIZb.\Xф 4|߿_۷$ 0@}Urr6m|=sSO=_ 0_,~3}IczW_cWQQtŋk+))QIIISRRpB}g:wZnk^Wbj><wx2֭[uui˖-d{M(V+rmsvړǎ`ޑtr^s@c .`@-ԻbbݹsXPjǡnjɤIف9LخT zWK#<XZ? @Ee\ۣ,E`,c8Xd CvZ B/]T%*%;pdD :e1+X%nri w%2XP%VC(X\w%rX-; "VCXj^w%XPSeɮ!"+ k6f P2%Kӻ`ڪk/Kv@Za:w,E`Q]X"DŒ^)@"U.q%,\w~n1wuj-0-@9%>;f]ο!"*kԩ8pZj(=5:5n8jJM4QzzV^PC˭_iYri`"wCPkXX\˲.hP%_++ R'Nhܹx233%I/\~i͚55k~miF Һuj6j|E&KHHЗ_~)I:yrrrjG裏>R=$I}Q5uTmܸ1m܎ 5K7ݾ IV+?YU}򔔔T-Iѣi&}EƑ.FGݹqK1@vܩ޽{Wz<%%ETPPrϝ?^k.`N֭[C݌U>w#ǯKIiw渒tswOէ[S'm-r{9JDT9XnO-]RC[:={>zگm{Q5teml{\}8麋$E/}ɓ;p$i6!]w]P+;<n!ǭK96c3-3ѹY޷˕"7k[دu::wћԒSuI"&]V}km۶[nȻ -X@ I@ټy&M;CwqGٿ; 0; ϟׁꦸ^$'o> }Vze˖5jT@^m*:ڿ 0Gzzz"&iA}͔ر]=@Qw@Qw 9(33Sw֦Mt,X4Ņu@x8)bzXjk:{Μ9#^dٲe0aϟu?^gְaϪUV3gݫ+g+ uuX`y<XQQQlqUz̲,رcرcX+&&JOOVZ_p>,!t `lxcSuiϫS&jچPs.rKI=9P{n;7#Ν;ޡ8%%E‹ݥKEE hoX>WΩBykwL;)tsVaq"4K;yc}Iuܹ֯iӦ)--M͚5ӎ;*--M~aYᆢ}n=NS'ה[u uWu'ԝs"B}݊ k׮U߾}v۶m^u(7ި+%%E?&)uW3qZSu>8 IIIkmUll*=^Xll_ǩI;tPvloWjױcGp ڸqc. y@@S'Sw{Z{]}CUwǏ 9w+KiA}͔ر]uIDATڴ[nUIII5}moj̥ y k Ωj{Ωڽ7uWʟۭGݕʺ"B}݊I.ݻwkӦMe]tI ,PZZ}b-[Svʭ~kٳgHN5I<5NkRwΉ 9wЬRtR_<5|pkҥҥKl[֡CpյkWC֢E̴4h`[8jѢ5w\kĉ-c-Zv޿7ZjK/Ym۶7on}n=:l9@ |[Mjo)9n=7]8 XBBx,cEEE²ƍW1˲cǎYcǎbcc+==ZjUP^\\lV||հaC+55ZdIf͚Y׷ڵkg3ڻwoPsZ&sꎺ TդsS݅ep+9,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, cXX"0,E``, c?A3-%IENDB`scikit-fmm-2024.05.29/doc/index.rst000066400000000000000000000126331464214672300166060ustar00rootroot00000000000000.. py:module:: skfmm scikit-fmm documentation ======================== :py:obj:`scikit-fmm` is a python extension module which implements the fast marching method. The fast marching method is used to model the evolution of boundaries and interfaces in a variety of application areas. More specifically, the fast marching method is a numerical technique for finding approximate solutions to boundary value problems of the Eikonal equation, .. math:: F(x) | \nabla T(x) | = 1 Typically, such a problem describes the evolution of a closed curve as a function of time :math:`T` with speed :math:`F(x)>0` in the normal direction at a point x on the curve. The speed function is specified, and the time at which the contour crosses a point x is obtained by solving the equation. The initial location of the boundary is defined by the zero contour (or zero level-set) of a scalar function. In this document the scalar function containing the initial interface location is referred to as phi. The scalar function phi can be thought to exist in a dimension higher than the boundary of interest and only the zero contour of the function is physically meaningful. The boundary grows outward in the local normal direction at a speed given by :math:`F(x)`. :py:obj:`scikit-fmm` is a simple module which provides the functions: :py:func:`distance`, :py:func:`travel_time` and :py:func:`extension_velocities`. The import name of :py:obj:`scikit-fmm` is :py:mod:`skfmm`. Examples ======== First, a simple example:: >>> import skfmm >>> import numpy as np >>> phi = np.ones((3, 3)) >>> phi[1, 1] = -1 >>> skfmm.distance(phi) array([[ 1.20710678, 0.5 , 1.20710678], [ 0.5 , -0.35355339, 0.5 ], [ 1.20710678, 0.5 , 1.20710678]]) Here the zero contour of phi is around the (1, 1) point. The return value of :py:func:`distance` gives the signed distance from zero contour. No grid spacing is given, so it is taken as 1. To specify a spacing use the optional dx argument:: >>> skfmm.distance(phi, dx=0.25) array([[ 0.3017767 , 0.125 , 0.3017767 ], [ 0.125 , -0.08838835, 0.125 ], [ 0.3017767 , 0.125 , 0.3017767 ]]) A more detailed example: .. image:: 2d_phi.png The boundary is specified as the zero contour of a scalar function phi: :: >>> import numpy as np >>> import pylab as pl >>> X, Y = np.meshgrid(np.linspace(-1,1,200), np.linspace(-1,1,200)) >>> phi = -1 * np.ones_like(X) >>> phi[X > -0.5] = 1 >>> phi[np.logical_and(np.abs(Y) < 0.25, X > -0.75)] = 1 >>> d = skfmm.distance(phi, dx=1e-2) .. image:: 2d_phi_distance.png :py:obj:`scikit-fmm` can also calculate travel times from an interface given an array containing the interface propogation speed at each point. Using the same initial interface position as above we set the interface propagation speed to be 1.5 times greater in the upper half of the domain. :: >>> speed = np.ones_like(X) >>> speed[Y > 0] = 1.5 >>> t = skfmm.travel_time(phi, speed, dx=1e-2) .. image:: 2d_phi_travel_time.png Consider an obstacle within which the speed is vanishing. In principle this may lead to singularities (division by zero) in the update algorithm. Therefore, both :py:func:`travel_time` and :py:func:`distance` support masked arrays for input. This allows an obstacle to be introduced. (Note that if the speed in a cell is less than machine precision, a cell is masked internally to prevent division by 0.) :: >>> mask = np.logical_and(abs(X) < 0.1, abs(Y) < 0.5) >>> phi = np.ma.MaskedArray(phi, mask) >>> t = skfmm.travel_time(phi, speed, dx=1e-2) .. image:: 2d_phi_travel_time_mask.png The distance function, travel time or extension velocities can be limited to with in a narrow band around the zero contour by specifying the `narrow` keyword. :: >>> phi = -1 * np.ones_like(X) >>> phi[X > -0.5] = 1 >>> phi[np.logical_and(np.abs(Y) < 0.25, X > -0.75)] = 1 >>> d = skfmm.distance(phi, dx=1e-2, narrow=0.3) .. image:: 2d_phi_distance_narrow.png The full example is in examples/2d_example.py. :doc:`examples` An example of using periodic boundary conditions. :: >>> X, Y = np.meshgrid(np.linspace(-1,1,501), np.linspace(-1,1,501)) >>> phi = (X+0.8)**2+(Y+0.8)**2 - 0.01 >>> speed = 1+X**2+Y**2 >>> skfmm.distance(phi, dx=2.0/500) >>> skfmm.distance(phi, dx=2.0/500, periodic=True) >>> skfmm.travel_time(phi, speed, dx=2.0/500, periodic=(1,0)) .. image:: periodic.png The full example is in examples/boundaryconditions_example.py :doc:`examples` An example of using :py:obj:`scikit-fmm` to compute extension velocities. :: >>> N = 150 >>> X, Y = np.meshgrid(np.linspace(-1, 1, N), np.linspace(-1, 1, N)) >>> r = 1.75 >>> dx = 2.0 / (N - 1) >>> phi = (X) ** 2 + (Y+1.85) ** 2 - r ** 2 >>> speed = X + 1.25 >>> d, f_ext = extension_velocities(phi, speed, dx) .. image:: extension_velocity.png The full example is in examples/extension_velocities_example.py. :doc:`examples` .. toctree:: :maxdepth: 2 examples testing Limitations: ============ :py:obj:`scikit-fmm` only works for regular Cartesian grids, but grid cells may have a different (uniform) length in each dimension. Function Reference ================== .. autofunction:: distance .. autofunction:: travel_time .. autofunction:: extension_velocities .. autoclass:: heap :members: Testing ======= To run all the tests use $ python -c "import skfmm; skfmm.test()" See the full :doc:`testing`. scikit-fmm-2024.05.29/doc/periodic.png000066400000000000000000004540721464214672300172600ustar00rootroot00000000000000PNG  IHDRhJsBIT|d pHYsaa?i IDATxwxn齑z BHU@:TQQ񂊠bAQTzEPR)MPT@ BtchBMx?yAgfg~ξ{9iB!B`B!]R !BOZ!BQIQ+B!J<)jB!D'EB!(B!%B!ēVĸq(_Cjժŋ//L@@ޱPEQ!D _>=6ml6[(UԆRB[ʨwh„ $$$>553gb6Y=L&JΚ5kR@޽iҤ eʔ;(+hFNN o,\>-ZDJ /$55+Di$E-7nuۗ˄ QG4#s.]e˖z(WWWcQL2вhƎ˲eh߾='}ٲeeD!J ~pM2+VP~}ϟ_h}NN1M4gggիG}TgSNѯ_?1 ڵ+ӧO3dʖ-d"((Cr[z [lʕ+GϞ=ٶm[4Mcܹ4lWWW\\\hذ!sεZJ6meȑ@5 =WÇM6-y_gff2c jժ3DFF|BǿQwk_-X /Mhݺ5 b=/_fє/_Ʉ}kݺu׉}]mӦ ڵk3eHՙ={u{y/4hЀσeŴjՊ .X_T ЬY3ptt\rtԉe˖OΝ;WdWիW3x`qqqŅfϞm>lذ~'ԪU GGGxǹvyEƍGʕqrrۛF1}tێ30G:t覞[QIKxb^{5Yv-gggӭ[7lB*U8p رcr,XPhOQF3h pssk׎wNj8q .d͚5l۶1L6 WWWzIpp0.]gѢEm6Axbʕ+c=(|׌5{_BB͚5d2C1bЫW/EajՊVZ#44,:t]Z*cƌ!55+VЯ_?~g'Ǣ(,_M6ѥK|Iܹs4k֌˗/ӦM  X|9ׯgժUt[W^!44aÆx7ʝIvHLL&33+W2~xNgĉ";vdǎ|駜9s[ϡCر# DFFҧORSS9vSNe>|:@ǎӧ111^͛zj:utǞ{Qiؿ999i/)?^3f#hjk׮_~9MQMUUmVYJMUUm/[LSEZj͛5EQ+jQQQ_x1+MQ-""BKMM_EDDX͔XFY;vL3Z lwihSN_EѺu/BCC5UU~ ʗ/_`5EQ4mٲҡCMUU7(~ЌF㣥X(ֺu:Nc233kaaaݻjڴi7еkϟ-Xল !{ ^OFFfgg;w.yV [  '66[;ٳg.:tvˇ )hW-22RSUbfffykɒ%l-,,Lstt,p4M҂>qpVL\٬y{{k < Z~eʔݻw(ּyslѢEzu릩Y۶kNSUUۺuku۶mEڶm[`(T>-[TU-PݨXf0'OZgihVSKSE ղ oTE)axذaڼy ?E>e+WEzucYFSE{笮5UU7t?Miiiу+W/ҿ۝H&M -ayS.۷3 !n=Fȇ~Hj۷/-[I&]nF\\o7nٳS/Zn<ٷo?XKM:SNiǏ.Bޮ!CpzmX X^w'3C^z…B۟>}jkٳjQؿ/|ǎ@A4^{5Ea7u_zɒ%KhӦ gΜ__o0|:s лwBzYy57n,k7)jo1b&UVk lرctcǎ%==6/_ڧ(͚5#<<={rVX={yرc4gyK.Ze#F@4&MDZZZ4^xEG)cFlfĉ ǘM( ><y*Upssc͚5/OOO7+((s9{ŋW^w옓&M"333>}:&}W^_~ܹ&Mt333~*x{{mAhh(*`9Œ3~<]%KZ=zG}Tdo>#nRrr2={$## yf6o\_O2G'n:ڴiCPPW^ԩSݻ_U;ς СGTR'Nfoj3eONժUǩr {I&̛7~5kְ|rWNϞ=QիWs9_EsNPPK,h4( 2`}Y6nȚ5k]6]t!55˗?OӦMg4?~<ӧON:Ջl[ CřΝKyزe 矬X-ʔ)CFF5jԠ{MP6sσhy?irCVV7f…xyy]wiii4oޜ+R~}BBBHOOoĉу۶m?Nldd$&ڵkӭ[7 oپ};*UԩS|7jzX|9;vd|'4nܘt;Ǝ;?FVZENڵ+M6N:899q<ATTT}HJsifmx jڵӼ5ɤ-[VkѢ6cƌc1YsImȐ!Z``foojC :UqlܸQܹ988hʕzرжs4h9;;kZDD6gUUUkӦuÆ v:kN soլYSsrrܴHmҥE>7|SXf2^ҴPB ݡ.]5J L&[;t%oxk׮icƌʖ-988hժU>BUV`(L{EDDh#G~feeio֥K-$$Dstt&MhOIIF珃;|Ǐzk...ZDD6o޼"E52ګZh݅ ѣGk*TL&5nX1cFmI&i5kԜ5WWWrC=}WVEӤE|(ٳg"BF !BOZ!BQIQ+D)p'HB!J2S+B!JUC%% ° z ΁Jz')چ \9U| ]XVիWj*̙VG\+ !%'T zgspi|V߀Kzť0mD'j’!;KdŦ( > KTd:w"5?.}ľcSOa+iIQ+BtnK0e¡il 79GwWoc|NuS;v$4FH۾]HEj0j]La+EBQZ(*v_K}v ,WNy88oA5SAFɊͮreߏ}\ЁO>;R"xsrӺR !j~G>j _ _wOź~FՆꝪ _OMc-?N?fY|;q. !Qhd5 s"kY.032AiOxw<z>C[Ztmb4={6vU7nYOx1 i䓘4nqq吖Z!~u'ZwP8:W5U0.ߧwbs=I߹ˑd_w$K39eV!ߨ( ]Pnׄ]c ,<.L3?2NV,N:Qfrjܘ_~;UM~&&v|)jBwuh) u'©lGNwgWw Mx1?wbU2c!ysҶm;UtPZ!B/4|XVu[Z0`2Y0> 60$Ս ص S&\ܙ dSB!유(K eBUQK0G(/u+z!up4I|m݇Ҳ2B43h)%Zhe@h9@ޛj3؁b8(Ζ 8Ӻ$*Jùuph:PSal 'k ɮK0s\̙(V)EB/Tȹ(ȉ0_s4c 8Zw7P=@ ToP}@ 2EwXt Bp_6sa03~v7( Ӧa(S1cȹz?GwBQ˱k=~E`4VwP-۪cdb؁bң-li@6he-dKlZbn1[`_cEw4U?P˂B P0w9) h)b/| ^uLsh4ZxëY nT;uח1b/EBvƺR/ LnKoaS̹e0_ `26C9 ``{f)kۢ(PXR6~֩*yjF,c>=;u9?'W{J} OOcsR !Di- 5oi7,dӐ} B"K0XZX j6ձLS!*?G@ž[Jz'u#01 t c۵#`vt֭ ؼޱ))jBbi6fifC[aH[dX1Tz`M S{_`q58DN~z'5RX;~Y~NV$SÆŕjтm0랑_B~js\&=   =,xC\; Hd:U[kVLw[(}4kkL=8YTe_:wCVQ-Zuޑ)jBܿ#A.x }KpC;y0B8Q=@G+(N..c܆703|5̶.,ݻQL&.GFyޑ )jBR `W Rz} c-& uw!h-oh<ևoʦpn7L_S{BJީd,[;QܪwNZ!FTW0W{$p~2DY 6\- KȹwjQ | =Cv*hۆCUWu.VPc@;v` rdޑ*)jB[.Fsxox 7HW $Uv'ʶc-, ?ς,ݼF]a!0mCCҶ-G鮑V!]ڂ =~}e"-]Yoȝf>0T{enݼ0k`銰hv?1xyu+ư0Ka{ޑ )jB;NCs _qdl Cr0sCtIH;qt 5xk}!6lX"Wڵ+]B!&L-m&_-}qC7oo==Xy6i`*8.ij IDATiʪ6,+ڑyޑ()jB{EQ:NtS=/CrYg0E#a  ;խ!nN^ NdU~av+I-}ݿ`I- %B  #a Ye \iۖStGHQ+BcEK osAR1,cÄG8˔@t bMzk6M֭\nۖtۤB!l]] g~z0VIMsoR 9z'+{x+0>lkq6u+;mV!U2d,w a\;W2BBț,KpTC^g÷ ީ 1mZFWڷ''6VHLZ!$Py $W-ÃeɯoR>t2FpՒ׶P ϵXk oɹr+]`NJ;-V!(I<noC:tNS:&YUM!ީn[aB`{TfNj^h%?HQ+BT'8?k3B⣖ۤJ_=4z2m5ld|\2ZׄY&lxADZ!z o[Z!ST0uowpxRޅ!d;*ahX!|;\5l;Q!-[t)V7f ZIKZ!41V,#'  uNw9Aˏ7pe\?7\=-P=L靨=S%WSlR !ap9!Ķ%+ ߺ}r2Nu}&GNTx BҧXB!J3ϯ5hi bBQ:C8jgNu}#L z? }$\G"'I]^87$EBq?PTp k (2cY+nBg^H\DvfީOQw`4b |MEpz%!#]B!DQwP '6 6UTȂæ>{mwGP0xV YTEY+]zG*B! wS`A9uKHw9 GR_Օ]w$zB? R",&l&Rroi䐎tdb& ,40aZTT (Q1bB& 8G`5_7pTQP|Z`rY :`WGtFQXotG靬h{9,S z D5iBq#ޱ V!J93٤\&dpL L$,Ѱ6g C{ 8` E dEL9Cj b/Lb/&q e0ჂmxWZۘ8\1Dƿ!:Bנk;{1r/-ʕk.kGQx) =, !k~Rq;<1=>=^nqLj zkR&,'EmxMCsw;u}A5A3lu#fPq8QHlBq3mGŤw8xI!+dE:H\ CD EA*83a8S {C*;p~BېW1PJX tC`Ec<*̺}ez_X-e~.<HQ+/1#3 !+#rha&{|q!JU\&.:FZ$\`jwW'<6 R(AT5,E_L[i:q(תw$)jB  đ@h\L)dNpdR7jF-\WX3|pC\[p3K^[v34 f?Ŗ;xzwQT/r\ޝ0I^B!J='D9|i XF|H'$~#߸/İ, 8F-ܩ;peZGH_ &BtUK_[Vז2y@u>{&@/rl~Z<_X!;96Q]˥> [G^B!K J~0AIg9p98N()^OV!(7Fu13$#7(p6DM )w{ϮeV/![> ?L3K?okjwºd8CN#y0o[&BOń'x"XBCV3p> }8_9feRRKQiސ8ĵz'+>{k; Nd] 3sz=jR !ȁ2҇GS6SPK,09ȃ9u7xmskAe띬xLm#T[á@ס0Q~iP=[K!05fH l'U\`>NKG#AzǽLm($ I/B pvNvc;hɐ|"?Ն&EARe׷@HS::wlݎ,BR*vxєp&Ә ]\ Ǹ*I;ݥ8=h)SgwSh 6=iz*`_BfJw8{TDV!,n30&l bӼ>r)s QFs[Zmc[@)SOe-\bgwM0kS:?N)jB{Ā#~t&hZBxd~r>|2;ݡ8XFD SR>zlcu$D靨 g703$X}HQ+B/ &ܩ˟9$8T:/.o>? wz{dêfxVDyM^ z'礨B!tNyƬOY2yK$TcY k!k?Ԃz1{/(FXb;QA0us)bB!0J}jNpwOw2t.rx|]&ws ޻V?ꝨjMṅb%SR !6FA& YE=b5q #9@;9C,Si;QA-Gބ%zgB!leX0s_8P2x~ .π^0BL]H[ws߂O˨v靨'Bwz'B!JNя &_O cH0L \`]o:_NjD>pމ:)jBDj>*&L4J~qrp{R>Vީf ]AMWMD3$'讒V!(hLmRq^G-AQyx 2v蝪hFGZl2"Bet9z'kB!J8wRq&qIJd- $ϴkwz'[r8>{^4wB!D)Nmj1ZEőxI"?|k38? IB@lt޼6| owaջ R !u\j0 3ʳ`c`b7c)df}^TuE\:0_;%EBCdB H$8b!hDM,5J*db.W@ *~t$T`l r/0wgW|Ķyz'2ܗkeۄSz'7䕖 ^ Yz'czBL2F"H"$I&dRsH#4I' 2$:#c! 'qgq\q7p(oWMŞu-1y@uKXz x5o"<1KDw%K$N 65`jw|AMg(o),l_;.2 _+Y!Dv*D \md#e <(OR.r)K fV.G@ʏ,x<Cz*(-]tKhމ 8&|Z-z'%+W!}WP*T,Ò]&s<{6'P¨H%*}]AAx҈?)fp-T?8bW߈^ a8$Upw*? )Rj wTf \gI n[E,{7ԃOs_V!{L8 GC#8'8Jc@¨AMRȳКߙaR mwPpyT/H|k(6R󇅠J0v.5굇Csl*B&KS%H$Ư׬d-LejRp. ԧ> 9,NqGp $ -rƈ Loq_8@اws }et-]Dsa0z'W12NS,R ! wҌ'81M8i>|,v$yWВz,™x23YzǺ>kdl>o]h,]p'XiEZ!)a#"lc&o8i@ d‡̢(?oj1@ p阱1ObH_ Ff#x,mqc>=+`2}X!EBa#B)P3'‹,#>W~)ŭ0&gᆪ6?Ν'{@B . A E "M@z-TI&3q!*br$g&`Nʚwgo =mi@T@9IɈ"vN׻[_=l{ѪLJ:+MW&&#YWO&S/B ftc'W6cvѾb v-u|=϶t ϦTߝt>ۏe f)kʼnWg 4B f.=Z\[jikZ*lcrW\}.ǰ|4O'& 8WNcQ'JlþyhldJmAl"8馹+Y|VL4_[t4ըF/y=-R![\r\j/OJC Ylkz_kO{)QtMCRJҿ>c2l OK6ON1;ß v>/$! -4LSmf[cȅ IDATsZVr P}V,K|YaרZTb*Rk,Vg5e櫵sXZ':Un uWPvE29=*f4_xg]ФcCh'd&od y|:NmɑWIWsJmFljP.[W*:Aˊ%KZJ_m*Xm6jU{ o,=XE+QT3/o[$t'>4wTY"?k- O:?:SlB I,f<8xlf7 [ŀr"C TO{R׊Q"ݤB6JS2b}X*Rˋ77k GUMlڬWm2gqvL:VFE=,ފ%{S&QHy'm˜Íekn6ѡAl) <ۨ߯Pg*Ug?F3E+6D P"[vP/{{rV32D-UFN|w>z#u}IGR>.24iece{P~ob)Uy'q!yY(AF+%SFM&[ Ka+}2SuW`;-Pfu?m1NFJ7ZLrHJK;%+#wW/lN޾e"v{i#, hz `=HUbGdzoXe<\;4RKoDQ1>qCn;Gs)?Ӥ$?I4"X?mEe?ҽRԞmsq]L.K̾] sI[@õE}z5ت))8ǫV:ט`|ұT$Kka{cגEJ=K1?/}nZߘRA2@lܙza501aqwgeX{>'4|r[,˼tTqƱ,?/h$Q7f9$1 6 Eej1j6DP^s[UJ:JIWJ 4LJ:RFv_JoC%gȊR~Ya㨯I6K B \Cup!nJ\gbS|\o% e)0oe+3Ωj-J:RFɕ \RlUy'bJmA"MPhjCTa |kBG;fGS>. f58Y~Lm}9 y7eXB fBsrMqwTO8COG=5KZNgǙ&l(E-4.(&eJXB ftB{s%k鬳юاnw~N'ha;\`ɆIwrl~.E~nr֡Pj 9H{\6Y&XlMѾR;v喹HJoQa5$\ahJ(KN CelѻdXB f\kCi h.w[V"\j>rIF)JoaUL.GQޛ1gnG|RAp!Pg&9fWkm65j̃c=mHaRt..n\2Ri91odXGI U̪cNs_7e hFj["0(Eq̫2ViڦiCv%7_r\-t6TyѾTmenw:r$KkY}S]XEz%bLf7n]p^;N$a6[hMSjPˤ5LY5|Er~~I*S>+ʔYEȋ2E47QUHUc /o`F6Ͻ}9̡W}sKLYE+* b#tp.雯m3Qp{pAGVos vdD9ykKϰ$* XjyWN 0go^Wf;>9YDl:]5miECfExV3VkVd0D e|y~¢J tٮ3{H_% uaF:X*_yQL?O.LpGgۗVgh]˛?ǁd% 6`#t ȍVP)siW̫OoMM;qjn\PE>][S(my&v;IGBts^y^I;|\Z#0%/+tnK&ðo nfIdRA;ue@ކ_5hyRwWj^]MK-Y[o+f.2OLpNU:EgoxÊNIGzT)1HIUR|1+N8r?C:/hg4 8A:sPi- ')rF%udA/&v6=,et*'sl^ƒn]SusN%Lln';{svq@gVn 4%y[ޜ'Ӕء?gB>.Pj  ^e/PY؋7FͥdF%66:AvLTt/0ԣ#%GZ>.TenO.HEԿGd(NyV% 6 dE 炖Ս9=C 'ϧv˨Vp7Si![3!wӟkIGRbN6íLL.HΖh\LϣvMf7JmAkY}3{q]̱fz *7 >ZmbG7ɵiL/%ˁVR V;9V&$/(5M5L覱.mPA*i_ ]ޓ*38^Sͧ|lOȕrN՝f9D5ײt\Q{ݣ.[RzjspcrARt~J2CR>>@(AVliؙ 8>96dc~7,q,nf*u#7ϣєrnh՞?If~Igz{QaE6 ֋"+/Zb5C1b:Vm[6Pcg#:z$G)dԨ6Q^fB_}1 EL%Pj s*=xuM3g,@mnOwNT5tÜL HCw7'HĦ6'+:*vbϬ!  XJ]mY#f,m^7HT]K} *U>zX'# 6}ɄHqs9|@B `Pt6<5oD"?wv^iґ_M=QK׌f\M:xS%6OhY^Rb9xLIɄ(:kuq'~qW7ÙC DG1;=s94r\fjζ5 3/su}\Չ#3M :|Pj  Fy3 ƴdoRҮ_ZtTt$;IJDҺ9rZD2(:ƅTv#(ǸkRA1KE1]Yfd%4Gr]ijk`^Bb9m>q$u'y2bE ?,:pb~wj=-W-;Cwkhlo  KVfY+ɒo;8/.9%: 73\RfW& HRm=S0yqeX[jY i[L:ҵ8[>bqf%C9h6C #}3M+|C%%-m ^mlH.N?@љ,ٕ5/C}?Sjg>E=B Z^sy{g>ZsZNRw]1 ,ȬfV` ʬf](o̬S]Y]VÒbJdr2?_K6m6lޖm|ڱf"l5?gS1kt0[zγLyufC[ߕVoI̜wm9fm(AA\8Wf1~afյ(M[SW~8-3+- {7)mB u{fw돷dXLMzk*Sis5 [s3saٵ;{̬&9KE)܁sr6X OZl8T?;,rnOD/ b^^?*J^LΌw6`#T۰cW"'!2l}|)OoÈ.7=KZ=1>Y~3z+r~aAJmbY鯇zȑ{4fWߏwxG HŸ9n26/LjA}8lUhHѣ|zύ~<#o9IޘnF+\JvÞ6)V&#^T%vn'ThNd[Pj 6re/]L;7刁<4-ou\j 30b: 3롓|皨Zr1^ԒD2tp&uSóڮZa$tGsE(AF!ڞ+va3+ԛ3=k6- xs3.DR."~Dlg{ SUq( x禲uGCr0C 6:Y)vν3G\oev ;]iʬl&Ŷ?ӓzʂrȱ]M042#ކ V]ޣ]¼1^+ `֢ӷbxQ`^3NlHbgbvʥ& ^OyBsF+EaN[ &|"޹JmA𭐊سώآ'=A v4`k&L=J$ sLJnv7\|HFYcIl?([0ܵB ux;t'u waٖ9:g"imhvb9:뢯~WKQ v}CX} M1?;sB zWr׾?1r{_&8d_O9 al|2jFMKav*+Dwtj,j GÌ+67!Az}[fν}sɜ _S2}0fph+/MNlB63^T*l>[%\+  XkX^>g_/P Op[&lY,e*akȏD;2oYej#/4YǑPj sg۞~|2'D}m;q[{n_/?M: :P;כnՉd(Uja^3Fu[!*$GKslG?;!A(]+jN/-`.O: '\KM&Mx%)iooHVkrwgu|)  TQ\c8=T_J,e\H9-P ˙zxRXH"E^Kd}4i4ߣϖ$uoR?9 6 B*wKN;u1uD7e<܄ϰV ۫;X)VDNyHSܗAET{❛Pj kZsG띸5eIw)"и IDATlj>tݬRf3_Pü5j̵4Ţ<ϔڤA(AA_Jq6͂U Ǧ$ߵIpGޯfi-1:9>* [Voz=(<>[a4|ن 6 3n׉ilfa[smn\m (lj<4V`ykֈ֫H}-6Fm{s'ՆPj *\2){e4 fˑr޴+bUwcʮRxnf7]Ն94nV\q?4 Uc4E?VҲ"(S^JHge..ov ˪9%YϝK. &|@U_X#?3wLTI圵=2ν8L-b3C >Y=30lPSTH540^W/H>}vd ӷs4ml,nh3k9GşsG<- |l[Qy6R*$wGj 6 p͘]叏1 (vٚ֕eʢص_?S rN5[pT$PWgoˊZNF J6nE~vBZ:]cAGc-HS\֧r/wOVJx~AϽ.ߣ.\rײh _ɨ-_{'~pOWʊ9bڎ32%zxGFo1'I65qdʶv0ʘϭD$2-IYX>RA;2VVs/wl9`CQZ{yO 8M3mddW &EyoN&áګndSؘoV>|sKS΍A(A?^Ϋd~=֕x4癛Ԗ}W~wgx.;?@RsV}g}:2?k[ɵV3Gxo*P&~-loY\eJ6W6`#;m"FnJ1ᯌ܊3.˔?Úfr[_!,鈫jG`5(ٛlǼR\i-JsB';w= 6 3qvن{ߚbT2:f󣧓23{k],ܽľbCO -`b+w;fWJmAމ;~ӧ+GGI'rtݸ-lK[/Ifڛlun, 4ƼpKQm|Crf `ӿg桲ndBOduMɾC2'"8,H.GNOYA`+:󀹱d*UkTcwb+g'ּHSI(AFkm?1&2ݤS(قdeϫ,vJS-qi2hc|~k[)7AQL$mc+wkl4jC uz0{ȯo>GEA~K.ש+XDM` B?L4!S(1Ro6 쫭wJmAT^ʣd";*=PύɩI( nXIȞxb+;~VZiٱ-7rjBژ/XOB R)~~2GgYN/O0ktX9 ᚥ]+u=:@I&:T2!Q^恱57s= 6 ^sp>y䷻qBL3,sBM̷kse0ֹ))69R[,y;ֹr6 6&{3?&~lhYe;s8^L^ݴw_H/-2-QGJ \)goE,Q @(AAVc*h&LM:GmV8)c^-9U:7F#Oc]))RF193,qM'/A紮hSɎhzyRWܐOVa-/V;H*<|:#:fZևSV|3דPj _T-vsoc\8aBpm ̋y Bw=LI%%r6SތwzJmA|<} qk[rD^y B=Ԫ5;ƣRJBlAݻ4%e 6 DǶ0NSWgi9 7s=6 =y< ?2,glEA6,/e?0ZnYPt4b %LM?7|u,  l?c(̭]f&p1eLYk;\ xՒXv,3X+mk{/A(Ad͚& 66uL3}zŋ44ļp{aR%c⟽}3BBvѠlƑT,) ɼAlfͪƎ]c„:S֙5ҥ_pIѲeJNi={f?9 բEVwQ$8DQa9rі%ߎ6ENE^K 9Q|VO$-' u-P&67a\B PUUZ'V{f<%զMmuNmڲeܯ_#GvȓgC 3k)ⶋ-t _Jb㛻 i*23%Nf˼W^Ԥ^WUĪ4.&"X(Agjo {R={qUI ZrN9̙s{j*Q3Ѻ":[j$`R IBlɢQ,ZάY,_^5nxԲ'۷WWyKisGs˺ZԮ #f j޸τmHH%}c+ 8-O~HR+w h*XصSf`@6nȩS4n|+5ZWV4M0Zf̀xIm}J<108)m1=B:L[kospɼ[ IBx<ol:4m핈qc3|ޟ㞁Od}~ h^Aؔ&#a!B9-/"H'Q[L`0V!ĝ:5%V* KgԨ <2a?vy> q<;&5e/z}g4&^T!CgR `<"Ij.׳OYWᶰX {/S2%gI* ً!QxA0_5ܡjH9-GyrFkL/"I׼D/yR"IB6|?g2seFҽx=p肾ma椶6~$AEQtҹA^Dldk%JZ!vMڢ(D.hD0$7Æ5'X*AR"IBҐ!ts%0'Bz,Y7n*4\szvƘx6 r:==-fPL!Ss7?W]7nPftwdC`@H&Y[L< _, OZ!Ƌ/_"!Ae?Aj@lxՀƞZO,q OjS%ɝPypQ[L`ӻzZiV!]m̘-w@ki@%آyHdدyJxrRcO^%Im:/P3ˁM|EZ!w5_`4CoomP,ߠ5,1a)1k4?{R{ }A '}78jOjp!IBORw;0jְ_N]qg E Ƥ?.-AhMjCP.+ !yzٗ9^žp^5f=3' - {jCg& -1}%Mnq/}l/wEOmzz:cǎVZ|&EIKK>N:1+$ BÆ 3;23[F@M6 < …:4Wˬv@aN}={[/{@cRkP iLjC$=xAUŬMj?p}㏳gϞ[:fcԩ,] pR mذ>}pT2h d{q(4_/ 6dfn`Ҥ7Xx1 ,jժC/L,H4 c\S1Ղ`~= T‰\}չT7ذExjiŗ\CL͵:\:駟֭[aЪU+Wʕ0 Ν;Ǿ}Xz5ׯ'/#GЪU+,X@NtBܱ[Ovv`8ڵ#.nu!$$ƙ3gؽ{7+Wd hcҴiSVXAƍAn^|]:-np< Č)gGСkLj0EIgJfdhKj-y-0<7Pjm6:w\B/www_"##oϞ=yW8u|?tܙ:B;ْ%Kx˫ </ =aaaE޷O>:to̘1@YΟ͛}v>mԩsqt.*W~6rmp2Y 5*)ˤL2=_GX/(׺%Ԟ9sݻJhׯϮ]xMhTbEz-Kf mILL,z !+ٿ~B[x ~^{b+UViӦ}v fg'q$' ];{R~qѕj?R f" gL+Z Ҳ4Ώk]I$Rg}SJ޽;7ov7|h֭[G m4h6+(77ya,[}Ě IDATf0hذ!6m">%% #'ѣKRjլ.ETǴơ!6 QbƤֽ Z ez\RtR/^T־}{ϟMݝYfѣGu_qM>_ .f':u*妏ŋiҤ0blؠo-Xwo8*Pոtmζ ؀}A>XIC_{ 9ZĦy4 OPRIRW_}թ|̛7ww[>b?/T>a„B !*33_hK[ӧO/];w.ڕgRkv. ٳ'qmp⬶pXM$yI@~V3BƤ-ƅlӈx`#[4b^4E.NeNtTpp0-r*;x ˗//Bq'[`O>[~ӦM_îVF ; @k֬Yo̵vm7.]R=/*g4^ 5&YE~ L25&,j5JcL z͸U.~NVZ`o?\hګc !Eb_)lڵM6gذa/lƾ`^U{ێї$A= Uc^ⓟUiP$ ׾X16'iM2@IR{,[C ]1 ~ک~ Ƅw,V^=ɼ$jK ~,@ ~jώ'%&~p)վ.>ns3tJƏKwL5',AR4pIjϝ;GBBSY׮]o[ġCn[&&&_0l643tI_R땿TƋ-s-?јcZ1+֦w؞)1-gLR{W\ = 8\]!ۜ={nJ)4ԗ /^jWŒL ОZg"0(wt'Ү5e\.pOۿ޲]kB(yZ3ܮX rs%&f~§sa`7SڂUDxdo$WC~WHMu^[PG"-e)''^bֺCtE\zT^~g Mi3PƓ Ӧ=FrB N?~x~{{(عsSYŊo[A_[]M[HrCtػPړMk"Bxej[vmcǎo݅ԩs !ĝ" >}ۼys*gqssjժ-^SbOm!/ImuwړZ=ڱ қ怡S \&ԩgΜ?bʢJes!YV:t}y\:~)6W_}4>mJǏۓEth>;CAR1Ɔ\rhL0#՘d\@XRRIO>'O'zsr7x!ĝ֞kmn/cIN 4`<(ۓh}Iru ڴ>,lxh<<L[E&LֹTRۨQ#ڶmTꫯrRqI^xBqJ-BɺuFjՀ؇ `ȑt={[o-o`ݻw2`߾BCMBB%CCmH΄ /}RZ?E&yxjLgÆ 76CsOmhMoK%P455G}[>vFF={b!Ľj2i$wЕc㏗ʬ3ϟGdemMf2[>vIڕMz?,R#<5NjM<0tP`T.ԶlْC:޽zP2z#RRRxᇯ׮O>t妏+_~aŊU|DOg7nСC߮y ƺuҥ ]tiY쫕$22ŋkƫՙn/)9xl6-$'p}1AYR5''Dߗ< MGo[Z]zY;rqm .d…TRS^=ˣB ۷kr"Ʋe˴&wf͚|r~a.]?7?l[|ԩS6mPNN<ٳ5k>@]tPz%~õӲe4iNpԭ-$4%s!@ֲIjӰT e04vMj֭˖-[8p +W,=11/↎0|TRZBֺuk6oL޽ٳg: h<aA|}AA ,йsg̙CH22l,[oָB!,X_#!2LCNB" Ԛf\Ƣ3%Cc7)p+}-_iӦkqś: _pssɆvU[l&#cE(~4[| \P|2dH*)z}p]jGНȁf-?5HcRN:& rIŝPm(eVRcjfX1bGߦziذ!۷/T^J&Mđ#G;v$BQ OOOƏϑ#GxT909v!-[o-$m_RNSÇ3t2&q֬<;jk땂i PScGM\1ԆhL0Iok咊?mP췆_4n^) c2fʕ+ٹs'Gk׮K*Uhذ!qqq4nXBP|y^u&MĖ-[X~=vѣ<|g~ɗ;w݄￟SN2oke N8#ѾXFbf 0s![AƤ|$iޱ^S[B+fJj AzW^mC ) !4M5kFf͜}2ѵ}q*MHoԛH\ Hڳdc:2՘*9$v~kxB!ĵؘ6-gOи.hxYmrޯ4wRUg" wLCt'KpCid5$B!(|Bf/{+k ˎS4^u ­18M&4NJ ~Ƿfc^kRkK+@Ƌ8VKy}J$B!Jyyg9O͚n'w{Ho܍jBφࡖzK؊qj`5&'軘"qo18Uw:Bqټ9^Kh\yy0;<4^<IvQbȄqG\ `ƃ lw,eIjBUΝˣwz0iR٬b8Czꍻ,Mhqf@I'Zc)@Iqa 3xq(<WJ$B!99>}Α0fJOF!>q/+3[D㜸IIkLjm?8?xa))1q0/B{PA{S Ŷ/aC ӦpyΝ_)G;~UoA oɂxvhJlvќv%f.P`Y)H崦d "XnSN4M.\xj%ʂdIIr刉gal"k-%QQQTZ/+_ni2iҤkOqsn/_ o A<޽FkO]e]{aL0yyy$''w^Νg}Fll,_~%5jpߜ9sHOOc/q&L(Tѣ t֨Q#M5+{j}||ؿ?kT.\HVVVrܻHR[^}BeΝcȑ|7";;}t4h*T`ذay'N`ԨQԬYoooBBBhڴ)z1jժIhh(=z`۶m%zLpwwuN噙xzzb&_~ӶiӦa&3gt]?So^xZ,֯__k֬]v@nKt9994i4YdI4MxO]L^yjԨF… L<8B IIIIΝ/]j4M-Zw4M[Gcj{M1 qm1ȣ>ʡCJt .4MF]4$[%1 Cy}VZ P*Tp*+tq)0TjԈ#/ ׯzR*!!AM8Q 5i$5qD5qDh"DZj׮իƍj׮ P,T+4U>}T``0`zTLL2 C֭[Upp2MSũ^zI5JuAYV}o߮BBBbQ]tQcƌQO= Rjٲe~jJ˗/;V\x.z){LTG-_hzꩧa]vsĉ*11Q)̙3aSnnnGjر[n0 U|yTs8r P?\zGWLtϊ|||T||PO?z===UNոq?駟ײeKeXԑ#G :t2 Coީ?Ti5`/=z(4Utt:{l:]8&NU60 ;^Pi^z)5`׿Uխ[WFΝ<==U>}Ԙ1cT&MaO>qFVzرcՠAR֭(TFqv#Gtڿcǎb͟?__:vF:uJ)G} P{VnnngϞjرcǎ0 RSS[\UfffӧOWaI&FZJfee)777eJHHpԆ"HW'LQQQ*::ظ.|РA4Me+0T*U<զMeںu<;;4o޼BqN8wnnV*s)*U=2MS-]Q6n8:t"##6Mի;~ڵ0 5q"$nnnj͚5NƍLTu_oQa6m(ͦۧ|||TŊՙ3gJ|!\YIZ0TӦMUJJJ/^TɅ>BCCU&Mg̘Q{}5klΝj 8%^J)dɒ"; J U/r۵Z0TrtTXXڶmcfs$tgffp紿RJ%&&0UjUwsyij#G*oooնm[Un]GyvvQ5r:FQ_c{ T6mr6rHe6mu믔R&L(:(ܜ>#0g*77"P"GR+VfǏ'<lzzͰaذacǎo߾dff2gʕ+Wjn`'O.r@ GGGӽ{wmFrrO>xyy9œ9sW^>G}h tڕ:ߒ{+xS `̘1DEE9ʼݻ7ۗx R޽QrIƌ?@dd$IHHnk[hA.]9}46m"==T!CдiSmy, ӧOw*߱c;vk׮Nq @*߿?}u֥O>mۖ͛|.\waٲe>|4608qDAڿxlӦMAN[_~&NXhR_x͛7`c^z%ڵkhLWΪU0 _%Uǧ$L?{gao=11/kg7Xs!\p~|JÃ]gV+Ç/OBB&MrJj zԅWx{{;%W;w. Ϗ|h|||0 +ViӦB믙5k#I5ka0h } گ/RIۯۡ^6ZۮLPJJήTs`˖-9x7nL``SRkZyލ*g > 2}t>CҘ7otѱ߁ o+Im)O?K ;ea5QFqy6lyoطo{1g̘zM61eʔ[:'oQ\0 ŋӵk[ݾ}{V\ɪUظq#h±mdggaի4ڝdÆ qy ²e˜i۶m xq֯\ ܹ*U8m;pJ:t <<;fY`8zyR իWJپ}{6mĺuXz5`m۶eժUebccRڷoO͚5;w._~%KNu;4Dɘ;R7x0߿ 744Y9tcb)t! àgϞ]Qf͚*]kߢǺcV\իiѢm.\`ڴixެ .Я_?Yz5O<+Vw_A^^GQFbǀHMM_ .$55ڷڰam9v{n۶mBǙ1c999wl sϑ_͌3psss:S~!Ξ=K߾}YnUTOE6999!!!;waQQQ( %+'O.ކ~(/^̼y mGTVSoڴnܸ1,Z}95czzPpѣGK}:͚5#33}fx ҩS'vJ-hԨ;v[rN:ucI\\-r*Ij8t ժƯ7J*UrRh{ʔ),Y޽{31X?i޼9_-rl_ƌC ٳ'in:ҥK_k֬IӦMEիW/_FӟDڵܹ35j ##G~zjԨqC\->>SҩS'/O<=MF+OOO.\H׮]M64h=ʖ-[8z(N+qwwe˖Ni ԭ[ *piCǮaÆ_Kxx8aO;j Я_?>s g-1o3MSXϪ~)NNzwU.]T*U*Wj޼O&VJ45|pʅ߯zʗ/|}}UllUBB2MS 2xV"׮]L,rcǎ?OjժCf͚ɓ'ܹsjܸq~G5k޽{Ds ( =((Hl6mÆ Si͛y߫۶mS:tPb(4Ϝ9y (۷oWjժҥK4M裏^XBb۝OU *W۷:pc۷yO>D,1c5cj*225h@9Rmܸ|K.gyF;E ._LTݻwwϵ>Ri ڶdef>}Z3Fխ[Wy{{+UV-կ_?7ߔ|RꭷRiJ*ֿezoqƍU\\ p|ιǰ$6nܨ (4߹PJmB!U}Fw^(s$B!EԫW'Orر^I:S+Bq֮]ƍ8|0ƍHR+Bq{ȑ#0aBYW%B!˓yjB!˓V!B4i4i҄O>y\kŋy嗩_>>>>ҨQ#ƍGFF5Wq裏rʌ99?`djj*?<Ѹ;>oW`֭ۗʕ+IJر#`ĉTZ04 x8p +WÃp  {e{ҴiS||| _~$pQڶmѣGiݺ5;w&--%KЩS'>B:x`fϞMXXz",,Ǐfj׮Mƍyꩧ bѢE<#4jQky >___zMrXv-o6K,aƍJX|9ݺu# ݻ΅ ؿ?ӦM^+SŦMx7y1bd…nݚ-[:ͥ[nԮ]ɚ5k9r$[la֬Y7>|DFF3`׿>|87ndΜ9N{ !!8;FLL ÇfqLs='MѣTÆ ͍Eyf(tH/^cǎ;zo7c j{ԨQgϲm6MF޽i׮.]bʔ)4jԈGyq68[nCѽ{wܹ֭sYhV"&& `ԩ|wtޝ86o?OvΝ;qss+co ,`ٲeٓvڱsN,Xڵk矩QcK.Ѯ];vEƍ:t(6+VOo߾"7|֭[3tPΟ?WᡇbԩS#Fη~K߾}ٵkW^G۶mcǎ$''ӦMzEzz:cĉ+%zl-P.ÅrrrT||rwwW'Ot P*99QWV:s挣]5kRSScӧ9s2MS͚5&LPiu9 Pp0 5l0}MSSNIIIEjk׮u<Ӷŋ+0T͚5Ǐ PGV6QnСCijŎ<qqq^_}HOOwXe믝{'NT޼ysez 5))Ieeey?;'WoT͕a*::>ŵ)QQQ4MC9 {o߾}M:މ'.x^&(RvBEoaN:N&LPaw^mO<2MS͟?:\m̙ҥK}0 աCA)47,թS'eXԮ] ijƌE#**so*0TnT^^ܹs_~q(;;qyϹ}\>-… ijΜ9NW.t+4({וi b)qRR{Vi;v87kLYVf$bE% ۍ$+VTمk.eӧOXh2MSM6Qv})4LR[|]xQ+oooD^i?9:qNׯWJ?}:| 7ok׮N?N2K.9GA:t"q= 6,'_~T1Ϟ=R޽{P5V<_ڵ+-00￟~;m/k;SYu| Z*|; !|:,,h䐒Ã0j'''9J~$''R^r^Lurpqq)u%מ׺T*39!D\aNg_N8'y^QdyT7祮~?ĢEسgӦMcĉ|gnRCaKLLLGGG9dXbŃ1ڷoqoߦR ǚ>}|o/O9=sfI^*m۲k.ؽ{7GҥKtؑW[ϳ~'J`vuQYrk49;;;z=? {xyWxy뜜kOkFAuC_<|5j3]v=KdyT76jo޼ Hg߾}:Ȫo&<<\XZZ2|VZErr2|R ܾ}[1 iҤ *ԪUΝ;j5BY???۷RRR8{,T^:AAA|'ub:t '???UǎMZRi易-L]]# "ϻ:QrY s@SH_kZ<5jQJrDDD<{y|GM4A!k7{^jx޾}eҧOLLL9s&w}1c<볰}Pu3x``G=⭾}63gY{ȟŋ<ŋlU9!5<8:: ۷Em񤦦ү_?Y1󴅮pƬYymÆ 8p1j#FɈ#.rb2p@Oԅ?FR=RMW׈?M6ٳL2NdGBW_= ͸qt6koСj&MT57J%k jժ:tk>ޚ5k8tUV}$Vٳ͛7?Z۲eӇ'O2y"ׄ[nqΝihZ>GƉgҤIT* u]G;vۛ7Yw-^aÆxbuFnpwwŋl߾ݻyb=C2e cƌϏ=z#6mx]G&&&^zͼyhҤ \|{>H3GJʂ8zxWbƍb߾}H|嗏$juUBEg{~~~HlݺUHKK|zbԩ֭[H 8/j%:q7|#4h lllTСX`AuW\)*UgΜy۷M addHٱJzsN"HIIyXիE޽FԮ][L0A?*2=ǎh4ViF:uꩲ˗/ZLxzz@1eq{g3ghذVVVAg{9ӮO!HLLVOL0Adee=u|Mf͚%jԨ!ͅ1bHMMޢRJ^[Ž 9v֭puufffCmV]n޼)^u^u\~] wwwajj*Ehhh嬞^w/q͢iӦZۋ7|ĬYD@@KjJ̘1C$&&>8Yn999okV4o\Zꩺtq !DxxxwEJprrM4SLytJdSMzz:8::j /Ձ̀ʚK2p@/^eJ:ef٤T 0`^z^ڗTfϞMDD ,ÃC 0`Y6y R$))O>sss6lȌ3*i(#T**Q0`@ibX bj 0` bj 0` IA||<۷o cdeeqBBBeǰ0`)˵L۷ӷo߲ڀq/_N>}za5`@YQkmC-[N%~K` qys [^` hdeL ꂧL@0Pβin(ZBޗpͫ/}̨̍s*4@^$T\"K z`CW4%J,+dId>H e~ЗHB [YK"`N8lW3'Aйm%_T[E/u%4qJClǁnybbi>O?uKDqy>ۗnugC0txz2EDfC30V7@h9o:NM CijHouByܧ3v >ޕ+W۷l21j .X dfAѰf 4F .B% \̧VAE,لKᏼ+- DZRdhBcKF, W:GC`$ A!sNA;#Ww`qa%[3"THCOXq6i`v C|w!X=Kg@PmZzu/*G3|NjԨÎ}hKmc0vlllz5SZAi \K+܉ҡk'Ili :_Enr48p xRf-DcpzYBܺ o=v^ ڭa~QA 0„J䗒'c)[2M*˖&٤Qze8MsdjE@A߲U[@6'ђ%KN g+XBE#*q䣕%  9Xo%ne`Ds!I^VīJ:nЦk3'A4z3h-{!^s&h,uN7hN ?%DA28lFQ,+Ԩ]6UAL_flGC6%w? BAҍ] ymx*˷I#L/ap/e4BٲI }?X? j;H? [rlYoI'ʖmJeaN LYDlY>H##Xs^u€2ХK5o/]`֬D =ZzV\> "K~o >w"'2CdኚE5"F9/$k:dq 3jb$seLڊ_n0Sh e9#e$$A͡Z380|-'- S醮$˛/sR@Lr9K+$^c$42ُ%Aȋ` Y!mlbL92'[0Œ;-[!d˪P1;I-0 #b*8ް,Y?Vr? ܾDP}׊+(B z˞ cX,ʹ@&GoC=8gù4S^2h{Iq9G8NXF/ <6`gp!-Y‚f2^YSuj--`װe)\ 5^ /g|ZX;T vҟ9`WkBFځdLtVR[쐿v%ٲ#*Pl) Ke>0Tm#kҏV~%d" 6/ E!r'N$ɖu~ Woԅ`:8_孷6qRlYOC6Zf:ur~*ʤդI &L_,XNr9)aYInX *hGk=yNsf4d` ^ Bꔒ9 J%̍B>uC`sQq@ <սMyi/,:{BC/sv*Z(:B:ZNqABtca2ٍ6XH,;&<'̶H?${+^%[rKl%B $9B~*Ž?I>8*UΤlSwY%n)_#11zHL]9N& >|+{T(\̙<+AJ-8JY~^ z/_ ^N썤a :C$AC*E!1I 5JIg+F8`^c%/Q Yr.i04AAAYNnͻAH_07²*U9nZA%?I2$YhG2ݰSA -C<-!rcTF tdKPɝQkǚr],D9ȗ&fXqem0!2=}`zk;Iw`5 ̅TezkZՕIY +`ʔC%) Ξs XDAC0o^Glml7适oGcXZ~ZZKyj +}iʄCW@r%Xc'a8azȞ{0`n v/ ВFil]:/Q[_-Z)'6BLxg`B BOr=Q90-)\B WXp'pƆ:xʖ:$PEA4#$"@oٲIT$15`k<,PJNs'CöY3kV{Fгg-OG5lF^^nݺI۶+`.\:}`dTsl6~gȉӠU3h2)Yf:JFmrRRYF*U0Jy!if11Ȧ*zVĄJC Kn'͘l7Oդ,W~m-?^[y8v3%S:)?`yZA`Z_eN8lM~hLlFZ2&idI.Yo^l:F(ȮK lZQ1Oր$"SٌP;qx"/Cj1}HyF[Q [aPEPv fAL>\e?cҤ`,9…gh~%tKv>lY&pd$۷dӦ> ݺ_;Ӵi2I+wF SJGeOa:x ~V?|x7PWECL.[^#c+|^vp pRr(&%vR:*ʩ|Hg |¨-`~uZA]^ukK04722!1b}ɠ'ϻ<6Jůu+4aH[B+BK}> F_a塃yRn N,re%\|q`LٲI _FJ%omԪ`E $ۨU*-8IyYjNs Q [DE Ԫ/CDD=O7BLmCJ3[0j+~Νa͚lxe@FԫFNT@ ,,P !֭$]…XNĉH23h رM++OzBEtt>'Ozc$1dfC׶fJǡ ]ժ@Gp!)Xaěz =8O8$3@"D"hBO0) cl^jcTF8CHFKp:ܸ"'&Czd f`e)N 5|^ yc@ c7H0퍒NɃn砚XV#*er'ڲe+ X^k:p ޲d}h pԑ#Q+qy0F%dAVցıKWsOf NƿJEznԫ-Lc;>ΩSQ_33͍Q /OKffe1+W/hA^ԯ DZ~}6xogCl|;N? uo0]}(`9) +=DJ 9C\sY oKLRX-=P+^2h/Ǹ^K8]aD Cl_\85 -d0WEHylUT+$pt-+'ִHIٗR[v!|d;%jEkTX:%K[*ш6mdj9F2ꂱ5HAXb|i)>0:C$Tt#,۸6U^SVʍܻBtt: Y吓S`bb vv8;[nCŊ8pghQ2''0e3;귷rmv.y*{^Z6|7:&ބ;h.b IF S3KDrX> D\'˴bD-iv"1j_Nܕniٰ}VR&ݒ _o<>1-G0h$ K_b'P^73qg?p~2˚z+ZQkִ'5lôq/dɚaL;갚H=\lMĉW$8^R pqɶ0ڏ7u&,%UK0P2T/|yv[*k6lH2ĎcW $quo(`!ɄIfT&$pz~hŁxS_o<, o`Lʰ/@ SvBөjƠ] _ܔڐv,k:ID׸(z"͜9Uq N"8AM^S *ٲ$v=wkKwGd˺Pg*qQAi0{Yc:N+/ q`1)QХ ZP:N5Va`X)R<ǎtA.6{oҕ&< ~#u+cOj†|g3I`0q$n4Ы4Dqt-2^),$xT+e6-DC4/ /,G!"vOJ!8 `3!N(tvL0WVt؀ Q)hKo`LVDdĜFPT~-BEme#[ c:WXk0vČ1Ēn.H 5:,TT}ݤ$ #z ;ٵ+NkVXZ_N8|0/y `k!vq\ʀo}u '%$8*YϟC>ZV7𠖂:E+>THbzcBwνIZ mJ߃o;dW!W%VC[XXS’QR SOId X2^)]il@-=d˒i|BL=*+dPaKoBò" Ɖl- D5e'\Cڵ-%l*<G~N@E%i֭tNp%kxH5i/%+4A?cN÷0LihoH5o)i7!4֋BDiBRMd:|yT+/@]v1_ejn8/mBZP}Zޞ*FLx3 ~%2WL^xk8)j:PWevZȖRX%-1C+Ae,y[KC_H;u\IEӭjҎ['HQӃF> -P 3>y$s,E:RFuKgI12wqc(e1#N b:OKj&9˦вraмrZ?7!-8FH#R ,q RAAM:'XCpy\Rq)}̳))cmdܖa\v\F?B%PCNj:J'B ;} %1NTWPDq:o+:ۨJs,d!.T:m) x&bMG*1D  v]@#?Pb{8+Ät]AvuZ`z CCm'%h%'92Yq*Vŏ'#lAA806wRYB qJ,jgfQVX!YIBuK\LpzKPՐ'[܊L&9F08qՊ-0%rR`3@5i ''i9 FA.0C/bZ>wMqaR; wC1`x%x1Xf, f)٤юJ%@P@ Pa ߔZ'?cw'^7jz7Rt p%nK݈7L1xh$cTׯ'PJٛFܡx % Mq=Z`!RT)'j,!%hž!䉝5F.#Z}R_2Pa=ÈK)ZT }$qj BbA1]"@9Ŝ6ѸsJZê:p>.yV߲m$""#bX.7ްa7\\JVY4_EoW p2G_R#yrO-ZZ!np ;zI&#Z ? TfS8TFh,$B@F.$f@j6dKZ!z 1{ Oj> # , v%A[HZB"-ľmp3}Z+ږi"HkG%d桡JrnJc-d"Y$1WɖwŇ*4P)֐4Çe776X3 g#jF(~ ;}U:6Pv fJⰴTtfOM?S S(eÌ0Mh!9p :b0$18ேjѤCBe!Ks|8Q{cIR r ۼbuJfPjC RmJKzAj"wC#*~ƠB"Kp#{$c:x)ґOGY'uN"yb~B)/.!(-j ur]IyP4ЏbbC8,&Yi3Mtm}JjLbԫwѣcז+W*曶nО zC y X>LѾ;o C`,eQ0:Tձ8|FC/c..48kk>,v1 ?C4ñ1.1@`d^ _ #!FBL!%$Q\ F 2g iXi֓E Mh) d~AC2/m^/`菣 [e^%v4+WK,7."=`gk kbe sk6 Ow _z@ќ:Eh&GG尷C!p ޞs)i\"~0mS0* }u0%0W:68&F &h<2I#0.\pehd Vu-rR.ð-Մ?8C6KqA Jw  8@2 /qmԣ#'2*HR0B/TF:R6B%d,N)B ZYDZq;ypW}#)q,ґ .50::Solx> !<vi'8T׈bGx1suԧ+^ bRY _c@p+vR@#}G'7]wp8O8pԣ,Gl!;4g0jŞo0 ;)DLfeJ02kUqbٜ$]Q7ui6H"*TE63dWD&VG-HG6j#R5ۙ:@)+X2&Mм]n_ݹv2e0@rWS0!հ u>}"1⯿|XYbXsy8._>ĕuYN|F>q$1[xD"8:E:<]Zr{oz E/L$}s5{_84z$!!y MI{w[.]Į]^ooQzag0f2{&:m}mMGځ+ŢBtIZʕ`QgvDQy6~SZ3 c=%=L+3QbDٗ&0 Ԩ{Cv1:,t&U:8"A+<Ԅ \v0,i,nj'aE9`E ɛ*K@6_g]!tn.`7l )& UW '^7=0vX}C 2=#qǹo8V GumIl9uM$@@qOL)vsZW#3pwC j({$1r跮K{9^5ehM-Ig9G`A#*)SHmLy͛D0'! #CÙڕ;Z -ZX2c+]vS~VS0ػ*tZ$$"(͊(2vǮR"͎HI @ xPk@;Y<~u=|d9E>3pAN, #yVPA} yQ|*!xJ_wڑHIn! 8]HƆEf ؽ7{ڑ xo 镣N W7|Zo"Я>}sp&[Š2_ I,zԊ,%.\dar)!a/`EtVQYe!nD'?$# P P<Ⱥ. ū$/L}Iwsԛ[i,̒ki3v$iN9αp-$JE;إ''f2VUv88ɐMmXabdD倷#6`PؼyM+6uj/\oƌ4lCjzMe,+dpD=^洽E>ө{R5ƿ!Vywܟ6gk2PWȌFBqr5 BQDp}6{q8!k2u kUg^5i_=P >m j[[ꜞŀ z:U吰v:JFDL28F =!I/!"*2B$P#gIKƕ}GUJRq\ľNk$$xsCj۩ff<շ>Adg+QO()ܦnF>{X/FދtT_iڴIժUS5i,==1*9P(lŊJ[ܼye~ߗREEABݢE=:8S ןsSݗFޜ< 1'aFv ]VDgEz%y|{d \iٔb9*F^&/R2 Av0vS^;xݽ K[竘:hU#5!Ht`jLV*dJdbPXV~)fz~, ^%W^<#+w<@mת'5dzaaobexSywcĽG I5Ԉ"$ƖT`Y|O&ɑmy̚H?%P/ [@9 -쭃&yM-5} Yk6B}հ4WseUu|N رE}vV ##YzIjJTfU%HNN@(DyyXII!!V_֪U+Q6ڷOsq5GΝ_.f0& p/OW9u/^8Vp rJ7Mc<>F:Q#SꦥAX4C}g}1_csBJ8WiVҿ/ ^c9RPkb4LE𡜵6x}ELX$S=jFpUZ/5R33NԊtBX$oȎY*N6wNA:DoI3Riő wY{#h,UwّmbT}և4zKwtܲ 4~;8[^AN[Z a39?JvC=h}j}Bo+0zˈ .sE$ […/.S!??HPWvmHAAXiiXEE&&Jի'j8ٮW/Iff'k} ~yj 9) mq%fú@Z}dηA7]?Qv'I59YeM )yJLEU㨳/SL>C&I'_)!OyeKa%+)zIMA*Yi4N J(4%NSMKQ*$%5;ʄv{Nk=utHq֛$ER46cc-eJbjlVyc cm3tcW۝=- Nwu>zM}QB]] Vb4)CF.w5(֦$Jp:Rrc3rj쵍Mhd=oǬ+;xuós(nѱ'JC5ĒYJmTL1N8ZpYhgx v/.klJC{_jWXpf0}eKjDZV ^;:*=l\4#rh~Ή R<תNl30VIY!L_PKJ zjGM4wR&Ko [ d"I'#POo>jgnqlLl󙇌r^Q"ld؋dwV@ {rUWˣs{?nY[ŇboRY4R% / &RqH[w8{-%deR;q_WY, N5=Y!h;bMT{Xk\4-R~i:ݨrEG:a2 Us|2LW \%/;۝ Vp>&|3*P7H xs} Go˟a}%GbtAC7 LI^(zs#Yja! l2?[(a52L-6 ]ha~I6BpkrIlid883=FVmo|;#tͣx YghldAޣ%#p1WS {_- 5/cɸʡ;ܤ?gwi|wJDnm6eUtRV"E$KgCG)q졉%$3/Qܜ* T]}ӔcS,"N/LK.qsb ~&sŤ+i-PPNiX˨.ڙJh&RRb}qk9(SXdC\n8ǖ9IyGV/ʗ3@֎@/Τ6΄}ؕrmMUk5T-.slIh/M1QZ9| ?CABI?#QQgWPZ߲u/EL#9&Hd1P;D+[q4sd>ru "lQ:jQy$"Ky\BΑc_ =@s9r Lj3{o_+qkՍS7αT3v/dN.R.; T=dJiq [omV3cƦ.Pݡ"I 2h;ZolӤva=;(XKMQo꘢eUZ֞P pv1;d ƾz:=d|IVKm7>9(\H(=ofڣqyPm !zPZr/8^X(Ab[Uv>; \? E#@5SUOX,9qYo''Ks z_3q{ǡXO ǐI"zN 'tsd^*XENxEvuǚ c쭅ٮr wbk&Y1/ad;vLKC{Cf ,M6r+JlӤBl0,GVEȿEof.SW8J* -kIVz@ Qu-܅ꡞe@55i, ozmwZ-uiЛ ~9pd{Ijr7ȣEynRCĤb A_땹0̎羓*i.N?Vp]ޏpҀ;3}]R>KSVT%1k`K[9S͋1 nLp.+. 1V4RieT ƨ> N 6`&oWi^FKezZ;Q >utСbRKC3L7Ḵ͆h2UQ5'/t%F )cD54HPJZ`z3R>u'!4}Eb$Vˬ EH2<`dqIH3&=Rw:Fw<]/1Q7ȷ>1ke_gFV)e-{ٻe;MH?Xhy(OdU:jLhThN>Ԉl!̶}RT# 8MFr(x"@뤙LpNCOwdX$'s i\/MZ܈\e92Wwj ;Ta T˭4,Si|e(mY>0PЧ)Eu$.5 ˈ)Ǽc(K˷w!  z|&)6E V%RJ6Rͤh$Y}IЅPi EQge6RuSej5e,_[%_(TDkTUM u]iFhHr`E_Z Oc#˦~g3r[u#*tY$GR͗oeb#hE8}lܥd%xY3/ 1$si ĸ)p'9f~ԬqF]&p,[kgrr4+\;rESoKR +,߫ ]Kԉ:%]w&@Fr5yUq@j<F 5ϣ)8dc$$U~3/lVDK(Ã:I5Ͷ|?dp\>񦤫"鮕Lt褟ݥx e';6?G_`53$jAQxy v6Ykm~ˈ|o%1n -rZNeBib7oH#b>BVXm?[8G#iI@ea;`Lj7D]Te3ӵB+T*䫰Rj YRra ~ $.Q=IZIِ'k(I#)H_𑯍j\Z :yLbD 댰mj;_mgE(\/' ߢϙNѡ1{uL{5û`St;[Yze.gxIl+r ~oUt½3~؉~1ֹ]rQYzSQ>Hf%\ڄے ]'OWU 0-we*9?b6fwAB4~fp={W7w'#ƭ("垓+|iD]s:1_dhc?gŵ7r]B Jwm7Y<$6f T+rTLjGXȗKV_ GmՌ2#)-%-PleΑ,/IV%QӤEo}%.)RuRW-͗o 70}bOMc>&72bLV Z:uwvQQɓ_pTM39s|5=9w&9ƇPv1LCB|cmZaǭȾN%aV{JiAO;&mڳ3lO5wG`t6ΫVPb-,Ig͜zS~6$H0i$vN#EFYbU-˳}:_~ ey ΋;EoF݃ˈZ&Ǚ9QKAվzso|dw,~6R-M6s ,_ҡZ=9 Q _wdۭMUOiN )1~)cט'2)f `[*ϕMVۅ&A-%fs,Z2&bni},ئIm59ak|m#tK շ:&z"SOKwh豨},!M&pڳwEYÍT4aUt/<btFueb!77Zrcx]hG}XkQlۻB*|Np^{7{,Q P-ndE:v4΢$GN\3WHVm>nOU#5N1Zl9~wXaI:v}u,1Uo15%* !!ڧ x9O^GDB8}R-y)K׫7N眙U%xzsO;niw-s%yUb48XOSG,_L5&&lk/boİ}r`j֥"05X_º" ױUoJj*Mhֈ\Ѷֻōr]HK_'rnWWA|9U{ =ãZ$ It-k18YO\Q -\<>3xbBdUr;#/ ,u#jF4jᨲ$ue{],wSǥ1n1_S5 IDATjirv)gΝ.&BEo}¾uxe76$QZN 59:x[EAuvZh -Hq@ou:1B2O#InXoj9x*KpZM\6e\R餭7zh YY:ɼ"S/ngcj Ӫ՟b;-JJYîU"Ofa%2 ĭW-ŗv,i5?,5O%Ov&1 6>jtszs) 2 $FM`%?ZaڎVa<><;蒷go/xt,uN8bhxyV7ǎ|-%"B4{6! j;W{uivNM"Izk@?# wLUuNv\/bhޞEfzv[7 TgxcwN }HVJKFdoJaz tv= yݢG;Dwo=e,IlRBW8\vd=v&aayMǮ,Pai{3eQe;hM&+}{e{ك0ԌPqϠxq ybnpIr&hz%U졉Uk-=ԋ:$IB3}=;H[PBc3xxF*9\#86'ړ _gvM XIcpCufXOƛ2-qi [M+%ALOርS A2Q^̌'*:ݯN BLjJ5ח~2^js@x*OHAKe5xHK]'(Jf?rT"ޢkSӸk(tӹwxcmuil)$aqP^CE$!Ӄ- 魁cfְ9 5Es]Fiinw^4Ǐݔ7=90/.㪟HM9>Nϭw\a,ˁ15 ׆ ;H+4 pX oF_A/;N}Jp9?;I 2~w> mw!?λ6BfgE:DUK̔ZeocXX /V?ZAR9U?siyBn <75CNbߖۦpz.1Cm\VbUL1mRdq~t.bxYk{VH.B4AXUXaI2e{E5|yGUmm7I&JGz]Ho"EQAA( (b+R{oRCBH}XULyg }60sk; _(TKIti#"S߭M(+j,#Ә0G2J4+P 2LEO ؄]@@H~#ŏZsiu L$ u{k&A^V)P[Fu.M!\n ׂ: rXK2osvniaDžDRHRs\`RF!TDSVPl_.W`%tgAy۝ | n@ԇN8q HW jibXHvhy.TWf|EvJmMB$70pOś% w$ ,u+Cu"+ "+Q-7~/?PP"Xi⹌>DPT *'䲅`& “gѨV0@`Xsv 6 uںNaW)Vh[p؂}u*>UFs^ak+#zNc>[vFohE īd#~LFvs‡Aenpkq0N] l2X[ia΀aI Lp.Az4y ~̓0"8@,B(:J-L(۸@x6)$q='4Z0jWk!T> IG"9?YǙ! KzgŊ-jc8MqGI!t.rd;JN}ܱqyDL{=^0rzU`bO5[J}9 w~w0hBX$h*=۟*oW!BfF'_\'I#bZ9-ZBNiP-Nim2< ; l a TES$4MjɘO;c/N*NnƗ&LьHjVpZ0q b>DЇim$3 6 Cck7)@Е1~ gAV4@+fD!=M UTćpt6JQ& K27H:\%d< &:R A? ҙGߢ#@ƅꏇv`!]A'Nw ڋߋU֭w|:"baB/eA?VopN3{B;A:_d_•^FТ%E'&m6aqeGЯ^ZrfkT!фy' EN.;$\E{wR=GՅFnd؁3c:fQqoB%~ +Ѷpz>#jD!G]y I \%1Axx'AN$I&x2C:I# Q"T!8Q"{ ,%(f P'wRdΊd0e~y՞nAͷ)0fQmawD Xz*F#^Nf*.[hq‡8)G"`L‰Oq+ٖd(p2?)4J?/fMשl)dgVM@J3WGs|^NC{3&8 (?Md4Ń@ctƜ\+ Ћ\MOħ`ȁ)ǚJB9S1mR&҈% 8 ^88Wp'ta-1aD!1O9CA.F)䒎jxB UA$Û0t  frXO*b6Ǜقkʀ[ c- g e~m^% k wWOxg%j4IX`kKQa-OYGGI~m!gU- 'sG?i&BQx 9OTs~ua`Ch^tkWai<4tÍ 'Gg `f~ ]b,,$ ޳9Bpt U- \ƃuS\sr;4|-4yMJP×r}MAl2'$H"rI#hH_A[aA3w Ag<~+xwp'q£TZ)Xe3i|+I0@\0 iEkȕؽBtd%0 i!(&t۾t,Aߗ|-/ cHF7(qt;:єP6FҘM,p;ތÿ  W66|]Wm R W`1 p m sHc>4đPNŦ9VSFO\r,':3PEZf2IeY,COMBـ#6 ]trKʘqx  GY/F*j p wJ݄)$yD!f1ah=-ZCc#zq'>]Hgv8ъP>đz6>S]Y;/UoSCκL&2b?ba(hNcnO}mpXGFmnV:LW:jҙG q^BO5UWEb|m[. G6Kp+~NeIBLP < |]%A:G?3PO'42W+5H&d3'[/ VpډaUWa2(D] V˲P F# .%ȍNC$%P~)8ՠǃAӟl֒W=Y\n] 'b`UyFFVWBj_<1|xV$@MW( K"W00o^ {ni5Q' &+ ,:(GZ2 '  %|.WmR1 F@dQA~/⯜xY:Sa)EYQ@ASdl6rs8`J }x/AbWXBe{b6.d {zrw7~E`0> < .~ oBg_4v4Aу!x*.=Í䱛 KOۈʇ# )`ECAZV]CUʼn4#>o{  n@Ӣle@5U߲Ogj1f0a-SNQ8H20r OǛhme}X G3 z)Rcd5C1wJeEm) YK+0p 0wcbHw6ePP~x=䗰ezT/r|=YbkbRwso_0?p}:?>ØH*X{o]pi w&Oc(&][έ q=\"H "qgδ p.^\ H1{1AnТL,aW3üyL LE~g(ub8XRRrk4{(8{Nx0YN Eyx4+UNa7q0`D(L6ca.i|Ep`#aP;{;,`x4jۜg/_c V *U[[B?{f{b6{74*Q `6yp~)tÈؿNh~w+DRYQ[J`&䰞~BTŇqtSB+$"5k(%Au^ӭZʔJl׮Y;OOBVv$f=>0w~^irV**Cc}'hؾUwmNCtҾ/Jw;I6F^Û*sg l9M6 IDATo|=M0iͳa_ȯ$Íevw_;?ݱ&T\J'? *Ax/(p8X)ZZ-o'$U^YQ[O>e+lL :Bp ՋW%قbi2]}%h9X 3m[v쓯XupW/,;r;Oq_w9sH; z X/?dP^i'qR=M 1Oʡ^%V/4'!8MhH]nrXGsIe&p#T+sO3VyZJ1[W:XX(\Bbeca),%85ATV92泛$@:QK5;\"M PGUZ'OHg>8\ ~ .k%E^̗Q']+kVWg8 *^Bmض, =F@a^zfeEm1-"s|)}q+zCMUOnKg 0Mx} ZbС?N]8T W1޸A‹/ ƭ{߷ti_[/P6?IgHj/u1ĽU!hZ,ގ<r}YQkc#s<`"Hy:`O,ź)q}ރOP1`89x :/{f &JQukd^MȚ587kF0w.8'b.Za'Nc;vf ?@%PيhwxHDH^jZqtCP4Eb`:8Ӝ|.e(yXoH1 k@3ދDLC2ȥ-`Q nԡ7ѩ$L*Q,$T2tT;k"hA0KqJs6$~ Mz s'(P>Ͱ}x P $(Ѣ6H'Gꢧ&Z“=G!(4UpQh3m_5@g΂bog=egI·l__ɩɱV/6{6issΎˉؑخ]ؿ}5+8BEtS Nax,v*v/t^E]pqd~-Ի߀i3mw"Y|OJg 7X \A'XPS1kAaY 4|F=pU1aAa'#xdSI%[;3FNg?*Б1xr B2\~b?Ma~/A[+XE]ȉO(nP{4xY4L&8 v|{m aggkhQk!4>B!q,TJaqP0`$W^)Fn4S WHCh]i)fy 7gOk[Z)0x?7Vg]C!L{~cg^2oHz |&M:9~=ڴ!&2r`pqWIn0i)׻ GO~Cx^=WuBe%xtsu7aOD X,z,C ށnBtt%q1@] $sD|Rb.&ܡOc*uSf $`Z\G48߸B B,ldkk**Cq3Þ 8P;KZ1AB/( Q:CIX?2o}Hca\Qa~괲zɜ͛0 34pAA-ؑݻXaSX_'K /P(4}pܙŋ<ӡB)l۴!S'w쁠¨9&6e 0q1UxݠbԒNz֯GhYiK ~\AxpmA΂9pp*fZ<&-ĉSAe.#\g1Тe44Psقsl8kpǟJb-ɤ.9PWc5Nq0—M~|:!r5 $ !' GJrhoРǞPU̸WI_@`NNYşlr6> '$uHû!>'FEۣmHBut}RضkGLNoۆd'^OIP?:b=-`pXE~6 (jyWƕG6Oz f6%Kgvw:;Up+槔o#pA<襲 sܠJ U4d@ IyEBA`!U0ǸWSLw?WBwhፐqN|g,ܳ((m/f$=6}jwPeQ[{({?ՠу0z|` f#L 0 4Qo}E—o@0yNDnT]Ԭ?VN ȱN·o'Cb{-[/lϢ0 \j_Bf͇J]Yh $=qDqCPi1p=z?J L$]e! 0v4*?'ݙ@Jqp(lhK$} u."{.q?u18>;yX)p`Ƿr]8Z@!{/ʊڇLH].&gA_Bf3+o;G?4y]:iu) ~ 4wnbuéY3֯G뤮éA)l##cuuTQcR؎l.6}ٰFF@Ny*#5p( ˜8[3=ouP/ sXXr ,x,MɖHlg#Բ,Bq\ 3!(N{$*[ %iÞ`Y3-U (b4m o*+'[:}5 ikp&[+߯V 4m*(+j&( AP g2K ( 2 j@G!P娢0\?o/UY6gVnsք]zA{N s'ĴoOضm։@_ľ0tN%s,\ ΆO}T"YĢi?de/ X_BT:8x!KH`D;24tly7U41,bL!eʊENl yo2M* _ǁ1W:y _XV5q* ~R=@e׮%\:v$dj}:կO]t@L۶on =T &r oP *􃝯IEҽWgD=0.xy <{? F| T x>j6F&ri#~"Qᴢ5UUU-Z"M9iEob&&ɳh*Y>$Bp#nzpfm}/ˆ[#{pd -{B6SDYQ[Z`1@>ĊSa{H*N$Ipfr 9\GnNfܹ$͟] }jDGLd$-Zm*t<wE'ar?BA|`iP*VA,2`JU>'w_;Q`(i7 *u+^12KdqOp ܭP,H5q18~0<P `Y<7ئ;xX)>C+ڨ؝y#y*\sB2Q(pI;ZfO$ 7 *wV8GDQ@B/kQV ѐW>ٻ pㄆc l;"aR;kIr R>S.dH.q ~LG "?A$!a n8 l?" *ؚճ`,ßdڠi&J\vJҗ؇}@DMI`ch-q^k`hT UEΎO>Bnjx:KuQA4ag'/;0%"25 {Bq~)ԑhm~[ӀcyB EY:Q:O hQzwaA'4R11 OFᅇ ,`T 80TbOoή'hȗMb_ GwR_ZQ f|wwUDxJXl)`Rؖ!BֽZW>,rlQ17&Idz2\1{xVZFGtE?zS;hDQq8htVtW#X AɗB0gH9rϥA_N>Du8U]`~+b3}틏ˆ B硪;e^͝!Cp_ПFoSfl,ߵi={bE B y} @tVmڄ}J|7a+,r𵁯V'_5aiqcxTh -ԿfTYS"1k/^O@;8HH(EE0 j@"X*}(87cUpaRDxFf>AԵ"$6Qv& vܩZ‰ ȸy"oٺCt̡7nݻc͚>o3fXopr1B0}O;{I 9X;¦8xYFv†dX ICoKq! p3HayCOHʹ87YUM!(p G-M$1@•V[< ƂVEb_D @2Y,gBv*8M85d۾D?EQ0ݹCoXb(]E-HzQ0Z4E]ZOpNR+"߽;[cI `KXr#kRvgA:E4rES IDAT2WRl+xW핵'4~d0q1p/-G9:x,g/&n]<˫SHxe4..vʚAQ`rA]~H&Vp'WIWjґJїA0$HM<@[ 4'Pt|Al7{Y䳔iZzkKGZ̭tDq3~_7[pb^G|­_.@q-3X22 ı~}4BsV?> {р}ZE:y'!<ˬF 璂gy<O.ۮqpt"HyЬ+4<][9v"]]ݴ)7[I[}{F߼əK3d*m$"ݻ|: ]a(&~ga@n"ú@QWfS^#҇ υA}M3 kfianA6~l)( +8=vPO `1VsS6+%1IYSXt.VPqcRFo/Pn]-Ka2H^l r TQL~g)<{V׳g1qtD_&N 9|8u뢯];?y+٢֭J  8!?8g6CgF;{gpmV|Ve#| Mߐ$&VQM:wga0U:u(w0;ݢa6ܲUk:l( )Cʴix2s Lyg Cm /(P?aX멒2fk^_Y kNLI|kKIDSfU<> _1 Le%݋Y>G *1fA-vY$ҔԤ A R {YQEpU^G| > PH{'?ouF.f`b-y(z£O@AB=aJNY龞=EBtkcA_+l*f>ؿ 8V0!FCB*yc6ѥƼ+CttmGEy pLA}h(qW/b"#%G6PL&F$5 q㬶 Q?<l`Ѧ{Uo2K* A "* "XEQ ODQyRABEz !fiq1so|k5${n2s>8Hs#U Jc TpwK D`8.LL%VR6::a+ 5EG^LmbhX8E:cM( aie *ՠp>xl_~Vn NmU@9#`kU\J_7vwvE*A?v*&Vm-2EǪTpCoͦ_$=w.Ç0hqXA  ^U  X%M@z\= _0o!o9UсC"ʭF9@)afZb U48KcѤӝB'|t /u ut, wpX7i8TMH˪ɪwR~*PIp@ՠDȮIy5BF칹;Rz萊Z,x4lWV*uukZ³i6 N :$Q='T7A3A/dw@Z] mwe}Q[ž0rJ׸Mo%}(~GAc3QRB~z?@@P #;psoݕd`KJs_v9kBIکl5ƨÒi,!AHPRtxVC l Aϡ*a7 N _j<Fj͚[` >W^g});t׭>ݭfl]{qYm0BY0Cw@4xVMRW0T2!5HJpfa.?@iC fvA#:p3#֡X1E xPE]ACtHv:oWZu<Ǫ]ބ *\IUs3:| _}U4p`4*J8@80FDݦ Aߏݺ5͛cpvΧqYw4rT_5*ULQX$,힆S+@kjB< ]`ƴiHi)&'H KL 6oƧS'} ]g[)W7: k=ʑ. ~1@,m/P*! B=DFg;(W?@]4Fǔ* Xf ʣ4ȳ3ټI!_Gj0M{hJ~A)J^+`XHئvjhL3DnX_%ᩔ < W]"56޽ۧp*}m[ž^9m^N>-T;͠ΛP{=RC+zmSc{{?Uw޳;stwT;;5Pk8 ^M8PQ9`cyw̃F=fW]ȒN@cQ /9nww"&Oc HK9[Ц';8бvg[UӍ]@V0"JV$e 9]-C泪)I5W, ße&y|F>QD釿c Z'l ~9z@~m`_NgCk$ټg%4,4E g.$phM]"JW3jj-`S4&b59IKlJ9á=/Oo|xIX92MTtVwT1=4x7^ A2l")d 4d1y<-tD[[^`VJ#UsŬNյ9pfQi=?ԞnV(A0WQ 9_MmߪBݣy(.ƴs'1mߎy>p {u|;wƻ}{|.vWS+Xx$`# HF&v2lCVέR~SwjA}"q¶*7Lq}QEo+Iڑ cj^łinJ6oƴu+~ c͚r 5 ÷kW%qrI8`#2R ,Dc!+<ŃFxsHFBq##Vr'%-C0Gx _N&62XI)0AC 7KyQ՚*ͣeq6r:PY-UE-"nA#C 0^"Sօ܊7LI+(m"膾"/Ew2DOMS܈;lS61 N3A-fƣ1:|787Pw+8lZUs^",x lF-aWp`fEDGSa7bھ10۽;f{w<[N%1_*+Ӯ];D=Um)p#/*wA<ĝiDp`#b,VI8bHJVɑ%UFi+1ROb$ȭ)JVPE"D!rZ wߋ|$2H~eHW.oY;#.!GvGڋJy"K9ؿ 1IRz؋vyRv_Ծ|X$A ddx˝(}%[Y!d"'oV٭rcE%rh~vK E.rȞfUNH9~(Ar>Hun`ܗ|YʊE~_D6>+b+Ye"sI#b:]HJ8P$([T;ClxmPGDf&_bnYIz#C$YŢ5,̑Ő)Pu1IK6R(_bZ)cpEF3~GM䨆j(ce9eqqwMr`nnw͒{Rz8*ѩ7s:WED")R K%MXi)1ROHkIX6]̕?sNIHHx[ױE<uO`E^'Sd lyy۲DF5-O`r9n0H/jl" bv{g=-2Zi~"ǿDwW~(.PF#$^ILb*ؕ8zϙe"Dz1nT{E&?6)$Ni#yb9jk̗2Lfb-vk#򥌖oe)sH`5u|MdpmmNH"wD:/'gڷ '$ɛ7OYU7S^8*&Um#\%2Fe8* M"oDy+bVfE7cR&="]E}\BSGδo-]䄷$"l"o&Km'v`ϚdYlE"I/hϑf=A%_H#1R_b$`ɓyb?=Jwro" "^D9 cHƏ]^L'12P$VݑpC6yH^LI,1TIT$W6R&7ఈܩ-Οo|H9ǖ8HnJ;(55+Kr>D:wV$}/Y"B]UvjpR9)92]⥻H=$S^<8ѷ;DAD.k|R_<[Ud`[rOZ+wb/ո{֡jCB_?T}D̮E"a{K,RR!#"C@^T8})fDߥrpö<{B%',DN,=j{H1/rmY)_XZJ9 IDATI$ȭrFIqހTTO"E;\8ntDDL;,EE굸,XKJL()RlV+Jj2F|C!_a#ọCE(-]xGϩ<v4ޏݭo.t9;< 'g4j})~تRa\7u[g)Ho@I:4СYl8B=SퟰK(KdCgx?zwt+qީ{N./aN A`x>]<+y_ob /ӨAMJ 6f}q?7Ћk]v(!''F Pq΀bzC h9w8`(88zmw:Tg\_NƸqתEe{`)*$+LL٘srkn.Jss1QGi~>ips燧뫾׳swo#'NСSjFS& ݸS`#!Q}Ő~S&}ow*3Ëw@tw <1 ^Az} LCB 7CppLRY+ 1" p/]JwmX$¶< oqdbCJ O΁Xanr#n.-uLt"5\؍L 0N]ŝ@L/(="N_U wn:8& Z n[)r4?y.Byo]Q۲" (LNVGJ E## l83 ߰0|BC^xg@{{Wx'k˘R,YA Ǎ *X#D.َ]? ͞ N-u5b6L{ #&j p)@1 nScOD/ Yx WH8\ |f$—iu`lChoۿ%;/JB EBrE5y[rqG|@.If\XYI,wl['{ e1| : m/Ν3PZuvaΘAk^f¿GM6]e]wb}ϯF vmuԬ_͚׬oD~FDѳW.pv8"f)|)LɓTɑ$ɖɖɑ$ɓT)L)<)84jV5I yYbJKɑbXP!]G D> }Hav{"Xi#V?d>LZ"S=E!R߹J2mZ 䔤('%O]Lv=j&LdJHmJ"+@pC|i&!u+#L%_J\cwd<*)4Wi/MkNpӮEl~Hyz~jUga4pז[/ua0:#1Unҷ);u8v-6aϏ]٭ tNvEdBCpPH9$G2yG*dw#_&O|0w0b(j8 6,X1S2J(3?4u0H Cu a4$.RUVR# wjx@WJ~3 QKnk &a:,)}SE3g˱aa3%vc!Hu#NskAE-EOaXU;pز7Ej~)>UqOܖ-mJҮ]XKJ0zyQ}{vDݶ-MV,WS{MfdpLNI,Ya P`LmI`yԨbc+gRHO*y$c" 'SԢ9>TyX%w)a=^\G8oC'/dˁP ^TKnsrlïfozx |JIT$9čPm>OCgG`aReÙPԛ 5ݛ\>D“8nh,tK(.{͹V,ȇ0I8(a,Oɍ:/K(#6r, e>%CD"`!c$ܱur?օ1P:+@npwNفT7\nI=c~1"L=BӬJ$I=+xSѲ%W_Mx֫w8WS;5j!mU՗`"hB'p"/ ("l$r6:\C[[W0Ls'|e?!vH ioA9:ܳ)KElm?W:c?{Fkߟaf큺骞ca<>OzAK4iy%,P^yX7ҭ]Kӛ=F,"o51d3c e !~g87q+Wdǁ|F&ȣ >̠tM.2.lgg} !8y2 P~^ >Hiز~ >Hj? TN8v9uӧɍ !D 1e π|yӬ=W{N4kӫ=:rtj/U!$sdbŌ?aDҞFt&M+&/SH.PAv_Y.VDu({4*ʹ7v`2>5j jt*sKbE7)K\M*C\ A sMiJ[ΘR2u[ˠUۺ?5kؑS׭n+ Ţ4o331`ͥ.cEEXyW1KIɹb󻌙L8r:hsکcF:''x04ҙ0tR8J&/QAqCGHkJBBfq|u*nn(Aڣs9nzUN.CGU ܯd=A=2Nɋq@+)}Ȏd.9+4iH[9!4^? fxLn*hg8 IN8# Ҽ0h汃4IBg3v0S9wJTًt_t-Э$rOC۝q3` Eg{m|%JůgO"LC(\8?εͿ#'Oԩ:WK_d,Q2[w R*ŕ4,9-M%N:KR3Cmڻh'"mN yy]&k>"c{ll(ȏk9M$K$gv{ F/${uwH쒯d<%e,䠬¿=ENjl,vIGC&Iԓ-iR~2WޑUb״be̖lwFDi# r$yb"}E 64)-YK]wË\q" ):p8`r9}r$;ż+w.R+nԦ71AOßŌa;$`$ǩFܩE*$qE**2$QeZjoRejrV0q1XZغJ ^0i6Խ@h-Юr`I.`>Chwiΐ@ry`>n ;VbJ;^4hZsUTVM:vꩂwt'xfRMp'ad O_VS &4Y3!ྵy~ 7`DsYD jki/hQc_i4 Bj߬^9Pb荃ἌuxD=KvfaăxP-vw6XuN⦔ %c:tnۧMXI=,Hf%쵠ҏ|LJq~ܸ\|iʱuGKQ**y9= &kF]¡C0w?Բẽ 0 F'p!'ؑĞ=)ٶ Ljj× ?yKcBk7O> CsU읪Yt!v-l-T3b"tP1ΰr[gCV0wxh,2-v*O:Op7Yy汄f ^11x%RfM'pyfë`IO~~@Vum! GCz XM=:p\Mb˜["")n,?9UVݞ8!y2_b$JH.v\IM_-k+dX],+qqsEF|E"u,2`ȴ"{Dl:/V &E 'J$5R$DI&[EbI<&儤d!#Kd C%xzIb pvgˋ49%ys" y"oUEd no0EEIСrCNIQRzh^R*j2Xre,/d,䈬H$Jo9-MPp>!";hwlv+~@ p7/xJ~$"'i#RDߪ*u.&I1#$S&C'B$[l#򜜐mb׸["Ȅ"g<ܠO"26ѓ"n NĦIt8i#gdhXԊY,Y-#el8!72[AY풍R9ѱuLPm+)L"_ߦqƅl[.rG:6Ϳ*'Jt͚r$kWkW.r,Tɡ|L`R)ÌRaÆ9Pn0F Шc $Si?qMnU|>i|SeA{TZlbP9~FаauU赫+M?ݰHIF>iI!~H >?^7xFVa+f,PF`zP`L=BO( x¯,%CԤ9J8^C-$$|L-fbD%Qs\&+FE IDAT FOfVpU{xoaíԺJ!34|-׫dZfkuqhF:c|{[A4;2,Ҋ>/;8N\\N8$Arpn^*IŲ;9M0  :Me/w<>ޑ* `hP]4k%5{hD *RBGQ}sg35 ̾9k?{繟hwnw Y+VX<#egrw&Vrsb jw]5N#m5TGM[}'7LbkKF5U m٧ Vi}i_8Qȯj.טug{o }FNt 6035rC]Ӄ?9z⨱BVraA.ΫJMAhIFyL:V}ǼǡLk8kAV%<32{-0`t ߷ ˸zwΥg-@eU`<5exRcczDvm:AJxAFĆϙ~Yiٍ˯yg@T!7^F{%[NJϷ嗭{%cƐ~z䑪~I,la٠q/:ArLD|mbevPZGk `;Xs`ؗ}Ii@ ʡ-AOM1a38s?ͻ]-/%Dc KzpP-z;|%}Rl1cbɳNs109nյsw ް~vuHQbN&Kc/#(-}Hˈs˟/ - Vq3ɳ铢Uۯ?lϻ % Zֿ ÆQR"CUUo_wV6R&ڊH)lSDkZo"|YӌLg= T9EuMVZ.Pe f?iOj&uAB/?^|]i''?"$uĎ_y}~%Xۄ&%vx fNdZBʯsxX}AZ?dJ]͛Ѭ-meB"h$ GG תr*RrvlG ia:-.Zf[cG7IG}xXʍEF7'&od7yLy<򯭗\!f,iz .NjH,tMwF;ApU5\n>}Q#~Y_@wwPjNV/#?2\V M4KrO?P GD9?F|2\Ʋ}F(DI ƌQ B -7WNǎr;wөNtX!bۃ QoQˑҡn#)S5I:Yb՝mȶơ|>ķtJv9?P.ʣҀSFSm,s@Vvi1\/m 3V`;36DOPjE)JcѮB :MKq_D߇ٹ_|離O."g %Ǥlj'*0Aĉ 'MR4u*%% e r7~j"ݭ9ngM2P/G=k!r!+v bOttpҹ-(%wW.4K<&>EW(Ǘa hcz.^J*-B' 4rJ" trh/ʫlUszhS:dfpQW'qt;ZpLvqsޅ'pjpJxHCb<4+F=F^WYkZW]lsVU0MU lowDm r/㼩m:3t?bεH++&(81 v'O/ܮ]v"wM7o{P %,VjR+$Vf %ҍ?Lir"]UjJWG25ɹgg<R޸b[lT8F?`XmZvS]!hnxg ߽̙_Q=hD; f?{(AΗ#=$!7aFy\Svlے z;H뜒jS֯9>"+QB2JGE 0U-RGg5 f6఍c}t-уnu -r"_k1]b[9BI>hwR4ap%so&ݜPV@w_kw :zAOQ*7LWlstT4˒tQA _:L-di%NmGٱSEd=dz>V#tvN)-\g!j}ICU K\lw4J/~ %4%6!)dpygmLjh݉뭛SSvu0$j'ޏ\\6~. 8m+ȉL癎Y?9Pt/hI̶ jW'hА0fk7!_ `l5[Ga,-ֱt6ۗy,r4+_& <] զ%\B"d,wyA,U *0Q) ek)25Le-Cu?;(IX2eZAtŖ(9Ҵ\]K%R]=5Rәzi-?7нӠ{=-Lʔ|O鯆.QO }kpyUr}g`[ 6]njSZeQdeC\UzUjՠN-ԥa=7A_ FV<|R[艅5}kr5,U$RyM3}8d{;Xr_W'Mb%ߧ5pj.,P7^$#)IY3nf ߍ[2ksjn66.C>8P-eUeE3W6bH`TUu γ¿}bNO2HӦHхfs)jk ~Glbfӽzh{):ƶ3y23OQf&KSKT#ϷX7c"KGn-um2ݧ8uiYb/`֮gj֮Ol5U3ڴ]kHv5VO癷*jpi [i{]qYL? -W慘mKzp;)SCX[}Y"ˬnU]eֱd5fǷIޒPIî`4ߟCFj+$ g]Xr|Щ1vso!٠qKwuqY{z*+͡:Eu]Vh^>@~Vv9C;%`]TsT|g(;ѽu:3iT= xcXr .ъD <[֤fe}$_z#~?EwFgiףɠ\\-eb-bfelω~h5w+{vb.MFQ((mݛ)M7;pFX1]d`1#FobCeqʟ$,sJ>[fFZZNۏ(s>w-Xv%WEt=/dCm_1lP-\)u^ υA0=NJg†p]x=IW~)0az+Ua~⼳9oIO)PSv^^{P\UBݯCU`jt JC8fBCBxrarZKBI愽 epgx? ÷aQ,! OŠs ! iXnHnO$BȻ5i!8:u~H<-\VIe=ۄ]v [CXxˏ%[sپRh%MUպ+mZA$GL #]VjyT߭{ZOTۢf/w|F6oc|3jx,ɋvAx~Qǰ Ғ|k''ZyVVX*dcb|C}#57P-Ra}N9a8Fʀ}O{e俰[z+ߌ&KnFJypEƘ3;ZNcy5Ue]Ğk9_]C~Fhk?{L*TßwY>5jy>Ԭ\jKy;5qxnG2uJx~El" dZ]5wjR/s=g3?B4"}L޲F~RqJjz ë0՝b.j^V7i9zQUOdS sbϿlxrB_j~IM1訯IvTWuJic*,uy&)rjշz׿8t۝[bp&Ǚxo=e}~l15λr6'oMi<36oZeyNNhU^eXtY]n\Ur9z֊_Qf-ufMu],[÷{~T|Һ/g}MS[4u".e hj̝϶'l@=S0uS9|_*HyhJ{98%J=b}mkein EDjG!A{Zʲ)|O+݆NgڏX LiХz2oP׵) 27椴j-7(.HWI)6 1W.>Jwc<&{F^K gO2b&Gv݄|K\$Ǯj([m~N*}3ÆW[]Jg)|sԪPTLdq2C l]@CONdD(wb'//:[yewz?u n pswXU|&e*>^ˣ+,Z"כI=`?sa]PW5W;BUm3$z:4#}mHl;VDrw,-jd^7D& **n{lw!#E Xh eKnR_-.{;O?_}GҼ gݹ!֕q\4·sa/.z3(%-x=wx\#JbjrؠSc:uRu˜5Uc |&1V'=Ai}(-%3}o Tϳ# I\$KFys 7N]Q<| 'm3) Jڒn)d~!()e riQ+Ӯ F_sbTYmUM꫓ybwx<+v0)<+8_4;Y8e*_$Wm;_5oƜ8w&Ya7*"hݷ%K uNY9=q7oENP4 iF:_:NlLsXb2c2blK؛-\3!zjUl.H"D֥)2hLf6G0!S}1>spTϥ㾲"oQ *[ |)鲴ؓ2$a F08+G*nNBT461^}MQGʊns). #`*G6+ X|(8ٴLJ4ˍgS'TΈҬ ֖e%,*Qq++- nAEqVc,.͝sPkG$ymV7p,Q|''T/3.c~Q;СqKsNc7GK TõT)9#yTX<1Axԟ'J7O^bQ'& nygaVXBڎ ѫN=sB2q8ѫBO ݨG!uo- aC(KBI85, M,s6 Cq! 9ayRZaMx&\e$@01@"7{0Kޭo½B()~]8xz_06=w;>,#CQ[cy3HlM&Sàva^(yEVϷgxp_BhB=Cxʒg !T,!ߤFѽi<V?'qf0*w03< oBI(=]9g( b|OY~N]B"='?*Gv ƴ=; *͆pW!­1dyQ,S!T0c'DcnYH"LGaQlEj8?<Ii-á,<[#JpP׸nT4-:+pSz'^џ0,ޤ_C"!&u !aj85 IlGa}% 0>L7f-_Y!wNСKF~^qZ[BCȼ('RtgGg&s[Xᥰ&Ʀa|lE08 Ci0'aP׋alFxi?FYI_5BVcJIqc C8F!‚~tqkT IL]-sz2hNhH5,)N64_ރosM(4rӥ9[-hjRXUVYۼmm8c)4dfER;5dՑ@y݆v'-Qtku#X4 a+eks|I|1ob97ځvv䷗_=Uss;mZҿJ8NPS-7΢^47i kU3x  .0bi쯽ct o߹B_1+diWbcI6-Lᛮl29#==.iΐ xt7 MRAf{Um,2{Vy&Nl{}ڊp1تA)S3\ƹ;0Ebjǜ4iiQ-w^0yQLnnNSSXRjw-[\ le? lI=Mi?GarM[5ɛоY++sݎ]"slόRM]pe,NdTs, $bI #=ێ˥ɶMWi 62ߕFxOZkgç*m2kpjQ??[iǵ6ҀֹubU]o"%(k"1&)/t8qa5=RIZ¿$.Ҹ-7xwY[= "uqP]-Zא[f|DQ&m4P?5Δ˔{sZ.15v~EԮɠ[Vҹoo[?yn?mƖIQZ*KFr9"kb4I<5S۝>urGp}hci@{F%{Zt[{sho?gUۢiir|GޑSV+]F>G N ø`?Nܑ[{o(Ѻ2gn/߁{r$7"?œjxL#*¤u v`e,ɶeԟӚ:OZ\}4>fYq\ 3w[`^ΐ3pL22IoƧk2vI4~1fs$~ƴ|)/^{1DO9N~-GN4-3ǹ4&>i&K)߱h>]ͣu7NiR.w\ðN=!DfqJs8xNrUi`xUuWVY3֑9!aP6|NcC1>Lvra^5Qylxzg[eiJByp>kʹ h=ޜ|g^N~ ({{FDAK,n?tbN{v hYK.qVObtuI3|Khq[t宱ݩiY+:&Q8yݟ{~RZ=yH}UM5r3з?n{2HC}ūo{| s Flt҉Umj8S]n6vk|PфS_`լMS(HqWm6u~)7e>0gR.)ph! ;B'[%MԊiHMg~Ycͩ^rq^S}|v9*D +LYruN>X-Jȓ&RE>:jer D ?v|s*@f x|}KLڍÒ[gٲR<_b3f[?\өV-]rrddDΥAAAaCBAddЬY6moC;1GN_.OKc щcayn]j{țgqC/ 33]j҉;o/RTBK*S;>]4w}ߋDڶ9M,Uj@{j1˜YUQUmv2+D5©VE[Pr+.*/'yGպ95[&fZ&*tN̅3Khh0^5wx?ǩMp$Ex(6n.nvdꯢ*\ĤtN'b4@eohMC PNWl:O0x;ȷIa[D zRO*-α9u)nU Wk@Z/s#n $} c)T  vKJ$p^RZH1Sk,FW,$/t)-fUq0 Tw 5TSNDF{wݛC^Z5kq_?gq7ظ UᇕO٤oʉP"8˛%̥ sEd]q, |@.ta NxI y#XR_`ԩ_(Q >Ayyip|.\bm876#N:%qԩ%B}_^S/_ A!n} q4R%>BW]!|'Oׄ(*ֿZ WIɹZ qC|/Nr)6f&]|$֋DIHoHQ[<%B":wgTx'n#J'L Wx!X' +J(&GĊ⦈yDW/ .!]"D{-?k)7g>}bEbݺ QP`z{9vZϚB4fU}~=/OfU Qw l_Et"[kTYKB+2z1^|+:Κߐ/.HQCDHѝ`*"!NR8 q`sZȸxNԞ4[kOB |< .OUTg&U*^8B D>? R?C|Z/TFo1O795Vn ֿ̍K8' IAm7Vpb BA"W9 WFQB2Yllaf*}'ARi|55ͱÍ*JD.Ѝ*=R8F&+)A6pŞq%tOJ':0%3|Tŏ;:9!'ȿWj@غAwaT44 U9;A'ѐ_BݏlXwzׂ_Aܻ/PK)=*A7ܚ'ނA ``h M(o^1W3Pw6$AZCiF,iTwRƜf hY=Ig)Bfc8rUDs"y 8P͡!c2Zj6IA]&W:0jLVtмUNE/B }\1lkT!g4ƖQ$B+N&NJ:2<2t{YQ6`G=ȗ|>)[@Yo80=b-՝lt 4 [ai%:R>ڽB6=a:([B04 R%f7ꖅA Up;Fow`6H73Սlɽ)~PD% KFF@[v9\bT #("\x+p ˤ־/B!!r, Ğc&NTŸRebHeJhP$#'#@Y GCGkLJ*UYȇ۷+_I JDfI _R6>[9.ҞH{X@d,MX@ap_XzBVɋjC{a +Q<U-/BʕGRZ*fÌpzԀkaHZ]^Qhpsz4?% `Dl'Bs,<`1ޜ!OHӝcZJ;I%qRoڤRj}\ف3CQ$9M*1ԥT7\6qtm&F@0lhvjA[\)Uu:M a%|ړ 2%e+~ÆZ3lu( xc`ʃ+!e#,mk0&*oZv]! !X *>jajvLs  s~wx{ݩÖtJrlEp.+QD/ C :w oHY-A]`.Q ڗFp-i9Ixch-OB+8P O. LNdd0cǺ1g]*Ud C*"ll`Rh rW3~7QXUE\8 9ϘX3 O֓ŷdA K XT*q'[‰~81.HY-126Xad>)A65p y~5^,ĉ$14?0Cr(d C>#a h`PȐtxX_~I:>Ns( =`]uؐhE!ɒWP }iDiTt",`b3&n@(ILS_MU943>6PAK+|1|pd7bE'R9R )23ǢGiQ@`%7sg11ETɜ9虢X[& j@ns5MY_TvaM<#g:`HHln8aXڒH9BSҗsl<x2 W^'Y.}*b'o聅P62Z}7~aXIz|z(W\T}"Tv|'.6.yuTO@BQ /yvJqyA>Y9j`[]ʢ$ ~RŖFX96$rtⰞ'+ӛ%$cLIAwP9Bj>f0**۠|p/9p|y^yŕh2h6 (_9aAk !~. ,ś LItWwӂD#ў<ǯ: 2xs {CHW@e6P, M…հ$M3KZ<-j2^nކ~1^=`k.8{,ރd^ӑ,X ||+6n}!}+H>}4E>ċRK'g|( FNP ojRVjpI㉻c0ȄkA3hN܅a^x* XQH)J) ̝ܺULQlܘiu1k0峲/CAjk1i(!O%sb79#f8Mt$d%υ3B<0kS((+uTIoM7 5GaI8JdޣӢYUuz!$"t/O*('>TC(ͩ6Α'<^pR;ћSNko(*6i!Xz 8cOdb8EUڡH|O-RI]k&L(i I4|@#4Ʈ+ubەn%Џf8w.+1c(,4w$@PS=ԁiYUڈ\!3fz]Mʱ}đ&GA /Q:"en<~})Aʟ!2apu ׽/wh WaE5Qo03~` D$CᄾY |] YȒƂ -ZjR@{nJ[F*€YlԾu9ii-Ʉ]*Z`"8%TX- ~TBC|.db=#?}_a`Lg.B>#Mh\Nh)|S& aeSI>tÁfT"R娍R^ V8ҕ, dciAFzCyx9Bqbvb]Q[s, R9yhWJoo`6uyɂ(DDR~.poRV} _~sN{h}@"#'  u=cLLLŊ!|0bI^/L3dC-ٌbF!:lNmEpQ kě^5nxa;dêZ>&{xr# ڀCh=F۳av8s $Bv'> ];a'+P#8BV0 Xo?ܽ81н:ח=`y\# 3lt D r)d? XJs"B #)!<3*!S#!{[lHќlh9V Y*M%5K X0 9Y`m504]:5}s3;§x|h؎ǃpu5ҤI {_w4 &~uYUBV>X'ߔPXQE, $'KfS 9/E+s:9VҞĆpfy+p pKXBo hdKUYE ayhn!pb{Wn;s5? Mxrpbv~qB9{XhID-r<2.%|=ƷὝ0*`/ {fs< %OiH0; [[PH$4ZS ʒAa6׃Tvj]j^NPH6;pUC(.ԁk$I2%~r֒Qp0M-hHw窒yǢa+_;)ar<-;fZBж~En7l< _R;R`=uā81KHГzN-!':0b 'R؄79l P"ׅ] z0wSFK՝l S;DyjsP5,X BaBH> waDjǃ)+) B:0EX4Ns6aZtZ@l@y_1`vWxʫ[έem`(;pJ6';~T㚔f&!!-sT)\h^*#4fL'~ Ns^a@=x;c%f2/kLlX@V\r\ Z`'6JB.j嶺]ٲ aDp@)z憋3<Vρ`@Py\DZv)l?; kL8Z.GVH#K;a[R+gH&}:b". l\M?g=F%SIu{-M (( 9n){Y@[ƑDX"m~?śe8ы$ Ǥ7( x [ˆnix׆G U<_T9|(>YAA%診<*XYsmu> 3J"joMgw7H!ICyVJY 7H$Z0 6v (kc9H 206c'8l (!^sa(D +5 WÚFh2!]cGl5̋Q;a20९X l?ţAQQ QQi9r-[gY$`S|yoΉq$$d#JÔ7'aDwx#ŋ奦5jتC V5:,="VWU)>5`Dkch]rXq Jbќ(_T~>6aOawC٥pwNKsB1@!0*T}R#fnX< B7[`LHMU2~ǽ30{2LN_ +apo)u+(u$;PӃac jk7Ƃ8t₃Z=4kA&Ǩ ?{ڒ.S<=sR$&h*C\)!XK|wu 2cn0,uJ¦nS5 K8y;?HD5F}[I͚^ԯGӦT"ἧ=:WW}E^{3v|6ceo+n0*&]NP^R d#7Hdeq4YŅa43:P]nCP:< [\ن71 ɫ +?K 2A ]U¨r}TQ#h@a^#x}zё8W͠ JK+ q!w ĥ !bD j3 F*u?{C"Gȑߟ**N*\!8!ߗr?; _sIIyC^XY'ehx98~ QPp˫ fQ\(xgcAMsGrhA/ɪK3lxDyTP҈e8.$P6>xHXF-`ɕysQ"V[jN_L\NB.& V%K9M%&o]zNW5,z v:S/ Y$aaӾZ_OZG RyL8:ZӾ}kύqp ڵ r@Y;XZ*l臟%;&5pKR/7t꘏ :ԫz@x$Ph#]p` ˨܃h"~~=1@ +?bN!f Peoru:h~PQNšƏkXڡa4ʓ ;[Ul"34:-pì^+jC`VdH b3زZr` B<Eq9A -&* 84쿐(BrQ%;iV+A8JGyͱQ EJ`S"̄OBT[g =;O&V8M +۩^݋Ç_ܹF#|}A( j0gN;nǚ5ݸs'-U/9~\gEpv6m?&z > Շя6kQfԮ8wpP9~}aVxs\_|^\5xcLŊp\_*ssc- ˆ7y`84!O:ٿMXh\~ƚK:)DD2&]ߑ 8a+q\lLPfH й P.2`?{7_D6_jˉX'gWQv ,[֙;# ]ȪUg4X|A>(;SD?zvqBN1!K5em ]a(q{^wINَT,)fIJƞN> #LP2Yg ޓ j~6$//]ovn!m:܄J;\`Wba Wuv1C.rW%-P?-e[ "I PDSK`K#8yMlr$6(7ҜhJH*jc?O%Fj]u/9D4 ^ڹ2r `Ioy0bl$6gM֬[qoOa46WkP ]בo[ntK/!><.UCN.L/Q8 ~PXQy<+]tǀ'1re:͚E{9w.VYěLZZBdd0bsZ!#F$AF,^FfDmlT]':TAf씓x da KQ J<9X >Iuj'%d*ax$(`T6rI2\@,!QԆ $1 v#GԾ(G|~Bi0%;T.?YىR??'{}1pOPx;:μfqqVV G{!IGsf$اsj:X0U)@;R@s P:4%.0K?‰ 8F( t<_c ߛDL U>$&V̙|7ÆҼ=VRRpv6dEӦv §zsD))!|/F^{-?z+\)+! $25#\rTȄNep#AANŘ\d|% V+HV.oZj, 55o%((xIh̞6eqɦ!xJ-,7K%VPb۠](<[I{<5 ևxkk V¬Y19^)h|`,(+N{o<} ~UU(+FfrY*( 6X)6e2Ic#!nPS `j7^'-(0)d Bdd0ve <=?|~ٺ5 +˗;$V lsQ4o'U2~^XP)^θaE @oB>%gC 89X:sρ4ZB Q+%⨊53)(yt^sl ܁>`#e\KǂZ8{][S2(¿Ք˟c⓼z;Fb,w>\끻=Ll K@i.ET 4pYJ2:aIܰ ҃<'Ae{P ~,i꓅ zD \3_rQ#)S4ș ̙ErWbd֬2DGWWTT䧟˃^3 "Z.VjX Zl|uz9Hfr;tkI"Bs5)!b4v]XCeyG+*jM"/;A>~\PZ+`ĀvC*PG;cy+TOLQz 3b,Yҙ O0k]zveK;ƎMP\&tkANV-vzm!" mr 2k^Q[s~ CU]a O`)>ӧ7gʔ}l (§zQȢEifuN_;+>t2$fVT ڏtޖbx NKAeX>2%5 5(N損V_?ZI`8~(& x3L;!},(EmFF ]2mZ2SxpP UX?}T`޽e= |Jvty;ònn\ HΖ-UaāXK|Ĕg֮)IyLOAO/ؚ[H='l(j $,r5QP"$klBU{WUڦEr+B5o!,W$RA":$Q3ET)bד`5xXm{aX0o)@(ŠI%=O 7ܹ\ڭkkc UדP0ēk h.16ϘvО73|JCҗU04҂D 'It8_+S9`n7BGGRUԚLUDxxY%nfw8J$&T蟮ki޵ai5( sW 1rJPr(, V#ȣDXB)HUK#BƮb2kƐVp;M>u%sN{nB\MAI \]BOA߾ڵG0+ ۂ!C󎯢J{nBh)"H&"VEW,kY]\۪u׮b\EWA) IH'cnK\Wsfg<'W^)Ӥ>pQgեl X D+!  _+YA-3FbGb>?5yiEp]4M< vzgx('kqN1Zv";88`+Q/??Y DȰ'IXQuT[o?ZqU1NeѪOa`BwllJ%  Dt2KKp\yςB: b!J!B’+%fn঻]Q Kl $G@_/( 6*JM(0wnӷEmjuw)XU?M .o1\C885O$ {vAc1ؙP~ L #E(:2M` șOY~7v:f,G=Zɔ|r}]^|E^xy[ 3sGYJ.!i(-+6.XَC*5`+!jÉ3)[%UMwY٘$VVsGHXrRFB?T*$pr΁Acu!//%K0k,^x^|E{={ʴj a/x_ٻWV,+iah5GM?闂۫6dh &X:/g .MIwx5kn@A/7JW%I&0Q`!}Z$OCL8=/D[OH$Gvv6O>$ݻw'66Cr뭷3yǹi1x:wc=M{4}h3uj>Si0b ̚/wP=EIA ~tJ^rs$OBF.LWb$s,)uY79~a-F%XӃ*H$Bx8@`k\VEiwR-nˁ,XQ|Nصk=$%%q3m4z!|ANʐ!Cw<ﴈrk<}z$۷;Ǧ}Z0u<|ą=UrWkC;!$yR4ȅUPʥPjM ]DAFgD I,Ly:tӢ(H93'y!jg*cVo,W呓ɓ'cfpG`&k&0f}%ڶm9xPTYveO6ɈLؖP}L$oD B<HTsR$L$NcNw!8,/.1IPbSJƒ…܃Xu@C=DY&Z|E׍#Ǯ]ꪫС/{._#==;Ca9s|;NeӪw&xTO5d:cUg6Q[ry(( gp5>W绂O>YJx饗V]Zꖔ?ޜ? 䯖8 MU<0}[F! <L' ry IDATB(UpbH!Y6NBI7"r?\vJ哯$~SOѥK/3Zu\۴k׎%HL j60yr VRUt{4r ѠszxMǩ|OkȟSجA1p7( ɟx5` !ѕa{;͆7!mvQe{xIɔ)S2e 퀻Z;͈)B>^V8=x?1l0}4?)``\CLB8dDÏfS20s>-Bf쒢6N-"ck8JD^l1UQFTȒ[ I>x.w;c!عOҞ =z4_qVhh(={dȑ >.]``ĉ̘1d,#ӇyQ\]mҤpjk}|Dǜ0yY2Kܩ_~HlHQG[W%N# OJX9C!Jw a̠ὀz"vH Ղ\¶YEK4)T1.رcykQ;W5kPQQMXd K,aÆ TTT?sキxƱbF-,lcbLLɛoQS#A}lb_$:ZlFBF]*DR+U H,n$Xa˙4i`|Z$;7N ].OBRK X`h:aÆdɒS[TT=ׯ_oKe*++YbSN=}W},6` 1ȊkׯpwGR^O/z 7%z$O{CMG46A,YNĖN2=G[?lD̼Ջz (*X2EB"H?BzK@x7n֭;u#@Ԛ0bj؍dد@Jqz"hMR]*FkғE` D>LK0=!y _nch*j.ѥ'G}ٳ@K`6~,X;Cllb,Y# M6k [˖ ų[@VïCu.8 X(:H•b<>*DƖ%p$"#* AXS&T/e(1 YO.[F 6/eB q-Oz>k4o,]zbNTll,+W#4III||X,'|yDŽ غ]=W_cmƏV;\ NDD?>_7i&v I%Yn\I;8?$&bc. _vM{4pYE?2~ݬ3f݀b-[Ƹq㤏eĈXJ3<<>, a^]Kq ()%F[!KV&#>Xbb@V*$:Y !eG&Id.Jg*^#Pp,tւf11F23_i}Qyb ,ǏFѣn:>DV^8$X (؋`'(*!X5c)5#^BCwATa@CӟaAlO߇jKt+C$:[.4vS;2Ŋ*4;v_C=D~4[{}'ꫯRS?[wj ~ Νypشr5dWwP+̕Hc;h ܒo@(L'*2>#Dkx84 vFp?\,_b!DV.B1C'`M%Ql}iVQۥE\z׻f?5g:;>@h}j~ߟ%6;$. 츨O!|.5V/(f4s9tsGOr$[BD 2ʟV&kCTIZf%M~|W'c>0H4^H bi}I8T%TP`#X@ 89,>N|>~;!!СCFqkZoKhESQdG&-s"#oXJSM?U6pE |XlDjiO8cwdW b` qقAx*4ɐ A/jsfv:]r (jRaP-f*|6maжm-8>rsLjD (p1*5B0$DT/q-teoR)GXB bB=joz*j=VGdxbZJq*b/*W!AP#q^BYgCBԚQ}jHDxd,a>&H< !0x0HkxOm> 7V+I\Iuq\ۮ]6VЊtllDmFV<]=-[BE=_t\ rʴIAP+>/<2.'X?jG8ӋeALF9)3`'wRC!4O@`ǂG[ >-hVQk4~p 5X%&&Cͫ5y([[_/5o85%ٌ?[b$8ʏ?&Ň%ns DGr&afKh#v0qK:E!:D jSR©phжoob.?f!oFK[AL0GI lR$ԳR1!٬HSPG'd1DڏZĩ!'L`ȱdml3)OcEBȌ=q1 .u|V,6pkh 3ڴ{vB_OX^TLF>רKp&; X|FD/l@Z2Rj4dI/79 ׅ b R^.)93ЬV$y,ՠPۤӡ^tZᐋB9rQLMns](D}MDceNyRlqR"=8.Qùx>Zq~;\rPRm.xm,#>/~W-1"m5c7u6!AP=P׹ݻwYLkكuI rm vȰpvU=xlfj_\Bab/!ZQt!hfJV`Jf= &x/x;#)M7[g*j  448 ˗kT}VZ߆Kr1Lt99ꅮAe%aH_YvYօGBw/Hp1GdTs=qcr6;DUJϢ"ωt턟kkk$k&FVh+8RRL4 8 [U{wj3IU hJ D'K51p+ȧ/I4X fg7;6`bx*>oɚ`P ic8fYYF~ Hf޼%gs\r%7߳IpB|r:՛gig_;zQ`ȉ[KAԊ6%hU$>񫸂Uo3^) CBQa&qc({A},>$<Z;~>|k4YI[^bZUUډaͦh$B'$)Gs5(;}2eGkS  V"p~Sp2\G0(  Q p>-l4ݳGS6vX BO,Y֭eYp!pPcӦz:w E0,,𑆍ffְXIY/TI5$:ЖKO;Ga܀Z=@=RNAZѬ6$DabOjj"_ s_pw}LkbcxDŽY Ua׍ۡ[mSn1ͩF_JVQOƆ5D ;]OPZތLJ, : (짂ɚA6VʿjcEAߕB̙38| ΤIx'R|> ]wnw;`#~(LhX烟6BBXeƉ=X-%RM pcDC"8qS0k=U=x^=nT1k >< o5ucB"/-LA4CI=Di  1N5 +'V__ϨQx뭷*n7>} L&},Fg222oniPm4 (t')(M$?SDk jz]H8 "e7(!+`JgPfO3+a>'W݀ _O>EFF)[Z1b3f\lk:͛Yɓ#!'#ER`jkc( "_JlWy(E3#8[񋠑HT7_Z!("LB&#W`A$SSgDPViJ曹Nxtrwҽ{wm?H߾}O-qk$;wӾ}k2=Vip [R{g 5.A0m0z0:҂P`Bߚ(2^;'띖gѬgO/77V9|={2x`f͚ŁN|>x9r$;wfٲ psnuTUJr+"v>bᡬρmr fq*`p/"%[k)'H"C1Fp;Ęb[#1*F(B((NK-%Dm`-!j{$K[u@( K,aܸq-[о}{ƌüyTIDAT9!zzٳgo_jh;xٺ]%)pX3Cͧ(0>S$|LPH=gÄb+9Bä0`77Nr97yR&bd|ي5D\[E_>Dʕ6NZnMpp0B˖-),] Տv>1f͚A0A'Up}Q Z &|!.$۝$:e"]JԪ]1/no#V"O4' k%4ID"ʩ#A(B`{!!\)KxI.^/|Xc2?>cƌ9y^KnFRSS %--d]̜93ǿ}{55.zN|nG=M2=ոo:lʅz ǩ>ˎj7'Մ$C/ZҒ>QTG9Fp A9Y?lK7pZ6E9ZK/ߣvU| nn~099dgS[;<LANxO ̜YLL;]vP@~$.*՟VP̋8i%!j $ ;V$;Q4bMxgÚnP!DSݢb|\VX8 !jBG.ܶhbk:bF >USSCvv68geff?4BUX꥽mȥZIGsc˷Pc c Tj~k> A .:J8Dv;"JHw4AhO.jf^cɒ-34h;vFll6iK' hPsq^!2r/O<wfԨQR̟_3ϴ (Hm]50 W"'jTyj\⣭lIVr6 pFopBwYqD>n[,s*n6!$n㯄oVBi`::'q׳w^ySCbb"/2[lO>8SY \s=V6t,аk^DW su/q w%cCiI _) 7H{hfhm80`wz.j*+ a v~arrrX`& E?_ʵb܏+!!{@]n˧O"xw T>dI+U@C>mg('E+Q&$"5\5H,KAD"nܭPZPM ^A7(`"_b. q w݉@]=D-,Dp0oX9"""x8rW^y%gsOHH`ĉ,Z,瞀Lm2jTOmdXz &׵r7|qmP0n$:ݹ{(빭Ѝ+)hh; #T2O'BF`4([oөA V+ƍcܸq|>ʢGxx8$%ɯq2_HV Zb0Ϲq>{[|m VOºu;1/XxGa%XاK-^J1,&/j` 4d܈Ih%L ؀B"IڎXA\5E[iQ1 ͏;:򄆆r-p-&;; dddssՙQhmEmuddXG6kl0q3E9R-2gi1>@AYJDp ̢fz+0lX9tOAEQHLL$1Q=|P[ot xi6%Øacj\Y|25TOނ.XS7I^x(a̤ y,`IςIj_O _H$Icg}+aQ;0C "wz oocՂQCh(& mGڴOYj bl6ҿU{`(X(pU 5u I0Qd…7gÀatc~)GƠ`#XGTSJ?1@0è#˜{wr^40n\ww {6?T˴iLm=EȂ/o#ƂMЮ廣;ct/|Jȋ-?Rq-A1%YY38Op -hX((dH%\JV ёh" y}W(Oio`ojosRXXW_e[#?ߍݮnSwITS}vj\?tU 8  {#ůjm۟1& {Yu' 8ك-l/Ov2(۶s啹e7Szb ck-0"cW%qQ$Dm%DD`/^#R" EϚ΃C8V@$!nXN N̜>f5`D#* $r~#HCRT\I)c]L+A:~"'cHqtbP '>W#7lrMC^г?l17+7ؙ(A'ڻ*٠NdZFEWiΊkkqH TJ]/Eh%TRD1p%|%SxrމZP#KЫaòy2>`Μr ɦS'++V)KOB r0KD[AzI8X <}TobZIF*<^,ÿnk{c.&Qފ&Rr" bB"RU`LJ"6zmț{IFk1톷抏bΜT?]usҺu`Vp8C>n훀1*DО° \; F(I(<8G>y)jA|Gr]\JJ쾴˭1eJ>7βe҂``Oʓ`x0; /gpmo+?RK?#QMJ8L0Qm}xpLin0_fo  mq[bHË[* qE=3iY#!j/{B8\^[tһfi~\wM`֬,"5J{>@nhI|O]$v /$D 0HEj9H,-ǹ8l۩w5sJ&Ej-q*/-s{cguv#z: kx]g^'N\oΆCG`@PNcZP^/#,RIDRB9R"eP0Dܜעk c 0th9)"Srlޜ)MzaʃjeOͱnQ/QR +#Xx(޶n;:ْ`uAt>|ݺX$B%3`{$]Fٸ'Ѣrbeʉx9 xu.lx5uWOZmb׮ PecάAQZcoDnSK& (. Ilx%v.4.Q oϒdŨQ,]ZW&$t|>+Wp59tr;,X婴imR4?x b$| q0bwܔ z-5 !`ѕȧ%W'6cيT> :rZ1m>+]8ZS$QdC(-eD7K·hE/ jj]r [oOrs\x#FDCxJ,_QMT>VraD>m{%`+.l#kRQt %[ ذҞz6 ,GmYZKhlgY. 1Q0B" 'Ix?y(27ʀMs||:GT2ubFnM7Ηz/3~Xk4@b8[Xt;_Ud`&K"%V (Sts\ 1 YDm]ױkqXpm0u]__.t>cGQ 1Df&MҳlL@4.N߹7)))aҥc>IGGG,FALLK'kι9"juttttttttts?9]\VGGGGGGGGG:::::::::<ѹE.jutttttttt.xtQsZ ]\VGGGGGGGGku/AIENDB`scikit-fmm-2024.05.29/doc/requirements.txt000066400000000000000000000000171464214672300202220ustar00rootroot00000000000000numpy numpydoc scikit-fmm-2024.05.29/doc/testing.rst000066400000000000000000000000741464214672300171500ustar00rootroot00000000000000======== Doctests ======== .. autofunction:: skfmm.testing scikit-fmm-2024.05.29/examples/000077500000000000000000000000001464214672300160115ustar00rootroot00000000000000scikit-fmm-2024.05.29/examples/2d_example.py000066400000000000000000000031211464214672300204000ustar00rootroot00000000000000import numpy as np import pylab as plt import skfmm X, Y = np.meshgrid(np.linspace(-1,1,201), np.linspace(-1,1,201)) phi = -1*np.ones_like(X) phi[X>-0.5] = 1 phi[np.logical_and(np.abs(Y)<0.25, X>-0.75)] = 1 plt.contour(X, Y, phi,[0], linewidths=(3), colors='black') plt.title('Boundary location: the zero contour of phi') plt.savefig('2d_phi.png') plt.show() d = skfmm.distance(phi, dx=1e-2) plt.title('Distance from the boundary') plt.contour(X, Y, phi,[0], linewidths=(3), colors='black') plt.contour(X, Y, d, 15) plt.colorbar() plt.savefig('2d_phi_distance.png') plt.show() speed = np.ones_like(X) speed[Y>0] = 1.5 t = skfmm.travel_time(phi, speed, dx=1e-2) plt.title('Travel time from the boundary') plt.contour(X, Y, phi,[0], linewidths=(3), colors='black') plt.contour(X, Y, t, 15) plt.colorbar() plt.savefig('2d_phi_travel_time.png') plt.show() mask = np.logical_and(abs(X)<0.1, abs(Y)<0.5) phi = np.ma.MaskedArray(phi, mask) t = skfmm.travel_time(phi, speed, dx=1e-2) plt.title('Travel time from the boundary with an obstacle') plt.contour(X, Y, phi, [0], linewidths=(3), colors='black') plt.contour(X, Y, phi.mask, [0], linewidths=(3), colors='red') plt.contour(X, Y, t, 15) plt.colorbar() plt.savefig('2d_phi_travel_time_mask.png') plt.show() phi = -1 * np.ones_like(X) phi[X > -0.5] = 1 phi[np.logical_and(np.abs(Y) < 0.25, X > -0.75)] = 1 d = skfmm.distance(phi, dx=1e-2, narrow=0.3) plt.title('Distance calculation limited to narrow band') plt.contour(X, Y, phi, [0], linewidths=(3), colors='black') plt.contour(X, Y, d, 15) plt.colorbar() plt.savefig('2d_phi_distance_narrow.png') plt.show() scikit-fmm-2024.05.29/examples/boundaryconditions_example.py000066400000000000000000000021041464214672300240100ustar00rootroot00000000000000import numpy as np import pylab as plt import skfmm X, Y = np.meshgrid(np.linspace(-1,1,501), np.linspace(-1,1,501)) phi = (X+0.8)**2+(Y+0.8)**2 - 0.01 speed = 1+X**2+Y**2 plt.subplot(221) plt.title("Zero-contour of phi") plt.contour(X, Y, phi, [0], colors='black', linewidths=(3)) plt.gca().set_aspect(1) plt.xticks([]); plt.yticks([]) plt.subplot(222) plt.title("Distance") plt.contour(X, Y, phi, [0], colors='black', linewidths=(3)) plt.contour(X, Y, skfmm.distance(phi, dx=2.0/500), 15) plt.gca().set_aspect(1) plt.xticks([]); plt.yticks([]) plt.subplot(223) plt.title("Distance with x- \nand y- directions periodic") plt.contour(X, Y, phi, [0], colors='black', linewidths=(3)) plt.contour(X, Y, skfmm.distance(phi, dx=2.0/500, periodic=True), 15) plt.gca().set_aspect(1) plt.xticks([]); plt.yticks([]) plt.subplot(224) plt.title("Travel time with y- \ndirection periodic ") plt.contour(X, Y, phi, [0], colors='black', linewidths=(3)) plt.contour(X, Y, skfmm.travel_time(phi, speed, dx=2.0/500, periodic=(1,0)), 15) plt.gca().set_aspect(1) plt.xticks([]); plt.yticks([]) plt.show() scikit-fmm-2024.05.29/examples/extension_velocities_example.py000066400000000000000000000013741464214672300243450ustar00rootroot00000000000000import numpy as np import pylab as plt from skfmm import extension_velocities N = 150 X, Y = np.meshgrid(np.linspace(-1, 1, N), np.linspace(-1, 1, N)) r = 1.75 dx = 2.0 / (N - 1) phi = (X) ** 2 + (Y+1.85) ** 2 - r ** 2 speed = X+1.25 d, f_ext = extension_velocities(phi, speed, dx) plt.subplot(131) plt.title("Zero-contour of phi") plt.contour(X, Y, phi,[0], colors='black', linewidths=(3)) plt.gca().set_aspect(1) plt.subplot(132) plt.title("Interface velocity") plt.contour(X, Y, phi,[0], colors='black', linewidths=(3)) plt.contourf(X, Y, speed) plt.gca().set_aspect(1) plt.subplot(133) plt.title("Extension velocities") plt.contour(X, Y, phi,[0], colors='black', linewidths=(3)) plt.contourf(X, Y, f_ext) plt.gca().set_aspect(1) plt.show() scikit-fmm-2024.05.29/meson.build000066400000000000000000000023101464214672300163310ustar00rootroot00000000000000project('skfmm', 'cpp', version: '2024.05.29') py = import('python').find_installation() incdir_numpy = meson.get_external_property('numpy-include-dir', 'not-given') if incdir_numpy == 'not-given' incdir_numpy = run_command(py, [ '-c', ''' import os import numpy as np try: incdir = os.path.relpath(np.get_include()) except Exception: incdir = np.get_include() print(incdir) ''' ], check: true ).stdout().strip() endif inc_np = include_directories(incdir_numpy) np_dep = declare_dependency(include_directories: inc_np) includes = include_directories('skfmm') srcs = [ 'skfmm/fmm.cpp', 'skfmm/heap.cpp', 'skfmm/base_marcher.cpp', 'skfmm/distance_marcher.cpp', 'skfmm/travel_time_marcher.cpp', 'skfmm/extension_velocity_marcher.cpp', ] py.install_sources( ['skfmm/__init__.py', 'skfmm/pfmm.py', 'skfmm/heap.py'], subdir: 'skfmm', pure: false, ) py.extension_module( 'cfmm', srcs, install: true, subdir: 'skfmm', include_directories: [includes, inc_np], dependencies: [np_dep], ) py.extension_module( 'pheap', ['skfmm/pheap.cpp', 'skfmm/heap.cpp'], install: true, subdir: 'skfmm', include_directories: includes, ) scikit-fmm-2024.05.29/profile/000077500000000000000000000000001464214672300156335ustar00rootroot00000000000000scikit-fmm-2024.05.29/profile/.gitignore000066400000000000000000000002511464214672300176210ustar00rootroot00000000000000base_marcher.cpp base_marcher.h distance_marcher.cpp distance_marcher.h output.txt a.out gmon.out heap.cpp heap.h clean.out a.out.dSYM/ session* a2.out a2.out.dSYM/ datascikit-fmm-2024.05.29/profile/prof.cpp000066400000000000000000000013021464214672300173010ustar00rootroot00000000000000#include "distance_marcher.h" #include "math.h" int main(void) { int size = 1500; int dim = 2; double dx[] = { 0.1, 0.1, 0.1 }; int shape[3]; shape[0]=size; shape[1]=size; shape[2]=size; int lsize =pow(size,dim); double *phi = new double[lsize]; double *distance = new double[lsize]; long *flag = new long[lsize]; for (int i=0; imarch(); delete [] phi; delete [] distance; delete [] flag; delete fm; fm = 0; flag = 0; phi = distance = 0; return 0; } scikit-fmm-2024.05.29/profile/prof.sh000066400000000000000000000024731464214672300171430ustar00rootroot00000000000000# make a temporary environment for profiling only the extension module cp ../skfmm/base_marcher.cpp . cp ../skfmm/base_marcher.h . cp ../skfmm/distance_marcher.cpp . cp ../skfmm/distance_marcher.h . cp ../skfmm/heap.cpp . cp ../skfmm/heap.h . g++ -O2 base_marcher.cpp distance_marcher.cpp heap.cpp prof.cpp -g -pg -o a.out g++ -O2 base_marcher.cpp distance_marcher.cpp heap.cpp prof.cpp -o clean.out time ./clean.out time ./a.out gprof ./a.out > output.txt shark -i -1 -G ./clean.out ######################################################################### # notes on profiling: # # profile.py corresponds to the case in prof.cpp # # the python version and the c version are more or less the same speed # # (when compiled with the same level of optimization!) # # the call to gprof here lets us to profile the c++ code # # the python version only sees the cfmm module as a black box. # # beware that compiling c code with the profiler flags makes it slower # ######################################################################### # on os x: shark -i -1 -G my_program # to check for memory leaks #g++ -O1 prof.cpp fast_marching.cpp heap.cpp -g -o a2.out #valgrind --leak-check=yes ./a2.out scikit-fmm-2024.05.29/profile/profile.py000066400000000000000000000013121464214672300176420ustar00rootroot00000000000000import numpy as np from skfmm import distance import time import pylab as pl def p(m): pl.matshow(m); pl.colorbar(); pl.show() def c(m): pl.contour(m); pl.colorbar(); pl.show() def cf(m): pl.contourf(m); pl.colorbar(); pl.show() def test0(): "circular level" N = 1500 X, Y = np.meshgrid(np.linspace(-1,1,N),np.linspace(-1,1,N)) r = 0.5 dx = [2./(N-1),2./(N-1)] phi = (X)**2 + (Y)**2-r**2 phi = np.ones_like(phi) phi[0][0]=-1 t0=time.time() d = distance(phi,dx) t1=time.time() print("benchmark time", t1-t0) return d import cProfile cProfile.run('test0()', 'data') import pstats p=pstats.Stats('data') p.strip_dirs().sort_stats('cumulative').print_stats(10) scikit-fmm-2024.05.29/pyproject.toml000066400000000000000000000016471464214672300171170ustar00rootroot00000000000000[build-system] build-backend = 'mesonpy' requires = ['meson-python', 'wheel', 'oldest-supported-numpy'] [project] name = 'scikit-fmm' version = '2024.05.29' description = 'An extension module implementing the fast marching method' readme = 'README.md' requires-python = '>=3.8' license = {file = 'LICENSE.txt'} url = 'https://github.com/scikit-fmm/scikit-fmm' authors = [ {name = 'Jason Furtney', email = 'jkfurtney@gmail.com'}, ] keywords = ['fast marching method', 'Eikonal equation', 'interface', 'boundary'] classifiers = ["Development Status :: 5 - Production/Stable", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Topic :: Scientific/Engineering", "Intended Audience :: Science/Research", "Programming Language :: C++", "Programming Language :: Python :: 3"]scikit-fmm-2024.05.29/skfmm/000077500000000000000000000000001464214672300153105ustar00rootroot00000000000000scikit-fmm-2024.05.29/skfmm/__init__.py000066400000000000000000001013301464214672300174170ustar00rootroot00000000000000# -*- mode: doctest -*- """scikit-fmm is a Python extension module which implements the fast marching method. https://github.com/scikit-fmm/scikit-fmm The fast marching method is used to model the evolution of boundaries and interfaces in a variety of application areas. More specifically, the fast marching method is a numerical technique for finding approximate solutions to boundary value problems of the Eikonal equation: F(x) | grad T(x) | = 1. Typically, such a problem describes the evolution of a closed curve as a function of time T with speed F(x)>0 in the normal direction at a point x on the curve. The speed function is specified, and the time at which the contour crosses a point x is obtained by solving the equation. skfmm.distance(phi, dx=1.0, self_test=False, order=2, narrow=0.0, periodic=False) Return the signed distance from the zero contour of the array phi. skfmm.travel_time(phi, speed, dx=1.0, self_test=False, order=2, narrow=0.0, periodic=False) Return the travel from the zero contour of the array phi given the scalar velocity field speed. skfmm.extension_velocities(phi, speed, dx=1.0, self_test=False, order=2, ext_mask=None, narrow=0.0, periodic=False) Extend the velocities defined at the zero contour of phi, in the normal direction, to the rest of the domain. Extend the velocities such that grad f_ext dot grad d = 0 where where f_ext is the extension velocity and d is the signed distance function. :Copyright: Copyright 2023 The scikit-fmm team. :License: BSD-style license. See LICENSE.txt in the source directory. """ from __future__ import print_function __version__ = "2024.05.29" __docformat__ = 'restructuredtext' from .pfmm import distance, travel_time, extension_velocities from .heap import heap def testing(): r""" These tests are gathered from FiPy_, PyLSMLIB_ and original Scikit-fmm_ tests. .. _FiPy: http://www.ctcms.nist.gov/fipy/ .. _PyLSMLIB: https://github.com/ktchu/LSMLIB/tree/master/pylsmlib .. _Scikit-fmm: http://packages.python.org/scikit-fmm/ .. _LSMLIB: http://ktchu.serendipityresearch.org/software/lsmlib/index.html **1D Test** >>> import numpy as np >>> print(np.allclose(distance((-1., -1., -1., -1., 1., 1., 1., 1.), dx=.5), ... (-1.75, -1.25, -.75, -0.25, 0.25, 0.75, 1.25, 1.75))) True Small dimensions. >>> dx = 1e-10 >>> print(np.allclose(distance((-1., -1., -1., -1., 1., 1., 1., 1.), dx=dx), ... np.arange(8) * dx - 3.5 * dx)) True **Bug Fix** Test case for a bug in the upwind finite difference scheme for negative phi. When computing finite differences we want to preferentially use information from the frozen neighbors that are closest to the zero contour in each dimension. This means that we must compare absolute distances when checking neighbors in the negative phi direction. The error can result in incorrect values of the updated signed distance function for regions close to the minimum contour of the level set function, i.e. in the middle of holes. To test we use a square matrix for the initial phi field that is equal to -1 on the main diagonal and on the three diagonals above and below this. The matrix is set to 1 everywhere else. The bug results in errors in positions (1,1), (2,2), (3,3), (6,6), (7,7) and (8,8) along the main diagonal. This error occurs for first- and second-order updates. For simplicity, we choose to only test the first-order update. >>> phi = np.ones((10, 10)) >>> i,j = np.indices(phi.shape) >>> phi[i==j-3] = -1 >>> phi[i==j-2] = -1 >>> phi[i==j-1] = -1 >>> phi[i==j] = -1 >>> phi[i==j+1] = -1 >>> phi[i==j+2] = -1 >>> phi[i==j+3] = -1 >>> phi = distance(phi, order=1) >>> print(np.allclose(phi[1, 1], -2.70464, atol=1e-4)) True >>> print(np.allclose(phi[2, 2], -2.50873, atol=1e-4)) True >>> print(np.allclose(phi[3, 3], -2.47487, atol=1e-4)) True >>> print(np.allclose(phi[6, 6], -2.47487, atol=1e-4)) True >>> print(np.allclose(phi[7, 7], -2.50873, atol=1e-4)) True >>> print(np.allclose(phi[8, 8], -2.70464, atol=1e-4)) True **Bug Fix** A 2D test case to test trial values for a pathological case. >>> dx = 1. >>> dy = 2. >>> vbl = -dx * dy / np.sqrt(dx**2 + dy**2) / 2. >>> vbr = dx / 2 >>> vml = dy / 2. >>> crossProd = dx * dy >>> dsq = dx**2 + dy**2 >>> top = vbr * dx**2 + vml * dy**2 >>> sqrt = crossProd**2 *(dsq - (vbr - vml)**2) >>> sqrt = np.sqrt(max(sqrt, 0)) >>> vmr = (top + sqrt) / dsq >>> print(np.allclose(distance(((-1., 1., -1.), (1., 1., 1.)), dx=(dx, dy), order=1), ... ((vbl, vml, vbl), (vbr, vmr, vbr)))) True **Test Extension Field Calculation** >>> tmp = 1 / np.sqrt(2) >>> phi = np.array([[-1., 1.], [1., 1.]]) >>> phi, ext = extension_velocities(phi, ... [[-1, .5], [2., -1.]], ... ext_mask=phi < 0, ... dx=1., order=1) >>> print(np.allclose(phi, ((-tmp / 2, 0.5), (0.5, 0.5 + tmp)))) True >>> print(np.allclose(ext, [[1.25, .5], [2., 1.25]])) True >>> phi = np.array(((-1., 1., 1.), (1., 1., 1.), (1., 1., 1.))) >>> phi, ext = extension_velocities(phi, ... ((-1., 2., -1.), ... (.5, -1., -1.), ... (-1., -1., -1.)), ... ext_mask=phi < 0, ... order=1) >>> v1 = 0.5 + tmp >>> v2 = 1.5 >>> tmp1 = (v1 + v2) / 2 + np.sqrt(2. - (v1 - v2)**2) / 2 >>> tmp2 = tmp1 + 1 / np.sqrt(2) >>> print(np.allclose(phi, ((-tmp / 2, 0.5, 1.5), ... (0.5, 0.5 + tmp, tmp1), ... (1.5, tmp1, tmp2)))) True >>> print(np.allclose(ext, ((1.25, 2., 2.), ... (.5, 1.25, 1.5456), ... (.5, 0.9544, 1.25)), ... rtol = 1e-4)) True **Bug Fix** Test case for a bug that occurs when initializing the distance variable at the interface. Currently it is assumed that adjacent cells that are opposite sign neighbors have perpendicular normal vectors. In fact the two closest cells could have opposite normals. >>> print(np.allclose(distance((-1., 1., -1.)), (-0.5, 0.5, -0.5))) True Testing second order. This example failed with Scikit-fmm_. >>> phi = ((-1., -1., 1., 1.), ... (-1., -1., 1., 1.), ... (1., 1., 1., 1.), ... (1., 1., 1., 1.)) >>> answer = ((-1.30473785, -0.5, 0.5, 1.49923009), ... (-0.5, -0.35355339, 0.5, 1.45118446), ... (0.5, 0.5, 0.97140452, 1.76215286), ... (1.49923009, 1.45118446, 1.76215286, 2.33721352)) >>> print(np.allclose(distance(phi), ... answer, ... rtol=1e-9)) True **A test for a bug in both LSMLIB and Scikit-fmm** The following test gives different results depending on whether LSMLIB_ or Scikit-fmm_ is used. This issue occurs when calculating second order accurate distance functions. When a value becomes "known" after previously being a "trial" value it updates its neighbors' values. In a second order scheme the neighbors one step away also need to be updated (if the cell between the new "known" cell and the cell required for second order accuracy also happens to be "known"), but are not updated in either package. By luck (due to trial values having the same value), the values calculated in Scikit-fmm_ for the following example are correct although an example that didn't work for Scikit-fmm_ could also be constructed. >>> phi = distance([[-1, -1, -1, -1], ... [ 1, 1, -1, -1], ... [ 1, 1, -1, -1], ... [ 1, 1, -1, -1]], order=2) >>> phi = distance(phi, order=2) The following values come form Scikit-fmm_. >>> answer = [[-0.5, -0.58578644, -1.08578644, -1.85136395], ... [ 0.5, 0.29289322, -0.58578644, -1.54389939], ... [ 1.30473785, 0.5, -0.5, -1.5 ], ... [ 1.49547948, 0.5, -0.5, -1.5 ]] The 3rd and 7th element are different for LSMLIB_. This is because the 15th element is not "known" when the "trial" value for the 7th element is calculated. Scikit-fmm_ calculates the values in a slightly different order so gets a seemingly better answer, but this is just chance. >>> print(np.allclose(phi, answer, rtol=1e-9)) True The following tests for the same issue but is a better test case guaranteed to fail. >>> phi = np.array([[-1, 1, 1, 1, 1, -1], ... [-1, -1, -1, -1, -1, -1], ... [-1, -1, -1, -1, -1, -1]]) >>> phi = distance(phi) >>> print(phi[2, 2] == phi[2, 3]) True >>> phi = distance(phi) >>> print(phi[2, 2] == phi[2, 3]) True **Circle Example** Solve the level set equation in two dimensions for a circle. The 2D level set equation can be written, .. math:: |\nabla \phi| = 1 and the boundary condition for a circle is given by, :math:`\phi = 0` at :math:`(x - L / 2)^2 + (y - L / 2)^2 = (L / 4)^2`. The solution to this problem will be demonstrated in the following script. Firstly, setup the parameters. >>> def mesh(nx=1, ny=1, dx=1., dy=1.): ... y, x = np.mgrid[0:nx,0:ny] ... x = x * dx + dx / 2 ... y = y * dy + dy / 2 ... return x, y >>> dx = 1. >>> N = 11 >>> L = N * dx >>> x, y = mesh(nx=N, ny=N, dx=dx, dy=dx) >>> phi = -np.ones(N * N, 'd') >>> phi[(x.flatten() - L / 2.)**2 + (y.flatten() - L / 2.)**2 < (L / 4.)**2] = 1. >>> phi = np.reshape(phi, (N, N)) >>> phi = distance(phi, dx=dx, order=1).flatten() >>> dX = dx / 2. >>> m1 = dX * dX / np.sqrt(dX**2 + dX**2) >>> def evalCell(phix, phiy, dx): ... aa = dx**2 + dx**2 ... bb = -2 * ( phix * dx**2 + phiy * dx**2) ... cc = dx**2 * phix**2 + dx**2 * phiy**2 - dx**2 * dx**2 ... sqr = np.sqrt(bb**2 - 4. * aa * cc) ... return ((-bb - sqr) / 2. / aa, (-bb + sqr) / 2. / aa) >>> v1 = evalCell(-dX, -m1, dx)[0] >>> v2 = evalCell(-m1, -dX, dx)[0] >>> v3 = evalCell(m1, m1, dx)[1] >>> v4 = evalCell(v3, dX, dx)[1] >>> v5 = evalCell(dX, v3, dx)[1] >>> MASK = -1000. >>> trialValues = np.array(( ... MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK, ... MASK, MASK, MASK, MASK,-3*dX,-3*dX,-3*dX, MASK, MASK, MASK, MASK, ... MASK, MASK, MASK, v1, -dX, -dX, -dX, v1, MASK, MASK, MASK, ... MASK, MASK, v2, -m1, m1, dX, m1, -m1, v2, MASK, MASK, ... MASK, -dX*3, -dX, m1, v3, v4, v3, m1, -dX,-dX*3, MASK, ... MASK, -dX*3, -dX, dX, v5, MASK, v5, dX, -dX,-dX*3, MASK, ... MASK, -dX*3, -dX, m1, v3, v4, v3, m1, -dX,-dX*3, MASK, ... MASK, MASK, v2, -m1, m1, dX, m1, -m1, v2, MASK, MASK, ... MASK, MASK, MASK, v1, -dX, -dX, -dX, v1, MASK, MASK, MASK, ... MASK, MASK, MASK, MASK,-3*dX,-3*dX,-3*dX, MASK, MASK, MASK, MASK, ... MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK, MASK), 'd') >>> phi[trialValues == MASK] = MASK >>> print(np.allclose(phi, trialValues)) True **Square Example** Here we solve the level set equation in two dimensions for a square. The equation is given by: .. math:: |\nabla \phi| &= 1 \\ \phi &= 0 \qquad \text{at} \qquad \begin{cases} x = \left( L / 3, 2 L / 3 \right) & \text{for $L / 3 \le y \le 2 L / 3$} \\ y = \left( L / 3, 2 L / 3 \right) & \text{for $L / 3 \le x \le 2 L / 3$} \end{cases} >>> dx = 0.5 >>> dy = 2. >>> nx = 5 >>> ny = 5 >>> Lx = nx * dx >>> Ly = ny * dy >>> x, y = mesh(nx=nx, ny=ny, dx=dx, dy=dy) >>> x = x.flatten() >>> y = y.flatten() >>> phi = -np.ones(nx * ny, 'd') >>> phi[((Lx / 3. < x) & (x < 2. * Lx / 3.)) & ((Ly / 3. < y) & (y < 2. * Ly / 3))] = 1. >>> phi = np.reshape(phi, (nx, ny)) >>> phi = distance(phi, dx=(dy, dx), order=1).flatten() >>> def evalCell(phix, phiy, dx, dy): ... aa = dy**2 + dx**2 ... bb = -2 * ( phix * dy**2 + phiy * dx**2) ... cc = dy**2 * phix**2 + dx**2 * phiy**2 - dx**2 * dy**2 ... sqr = np.sqrt(bb**2 - 4. * aa * cc) ... return ((-bb - sqr) / 2. / aa, (-bb + sqr) / 2. / aa) >>> val = evalCell(-dy / 2., -dx / 2., dx, dy)[0] >>> v1 = evalCell(val, -3. * dx / 2., dx, dy)[0] >>> v2 = evalCell(-3. * dy / 2., val, dx, dy)[0] >>> v3 = evalCell(v2, v1, dx, dy)[0] >>> v4 = dx * dy / np.sqrt(dx**2 + dy**2) / 2 >>> arr = np.array(( ... v3 , v2 , -3. * dy / 2. , v2 , v3, ... v1 , val , -dy / 2. , val , v1 , ... -3. * dx / 2., -dx / 2., v4 , -dx / 2., -3. * dx / 2., ... v1 , val , -dy / 2. , val , v1 , ... v3 , v2 , -3. * dy / 2. , v2 , v3 )) >>> print(np.allclose(arr, phi)) True **Assertion Errors** >>> distance([[-1, 1],[1, 1]], dx=(1, 2, 3)) Traceback (most recent call last): ... ValueError: dx must be of length len(phi.shape) >>> extension_velocities([[-1, 1],[1, 1]], speed=[1, 1]) Traceback (most recent call last): ... ValueError: phi and speed must have the same shape **Test for 1D equality between `distance` and `travel_time`** >>> phi = np.arange(-5, 5) + 0.499 >>> d = distance(phi) >>> t = travel_time(phi, speed=np.ones_like(phi)) >>> np.testing.assert_allclose(t, np.abs(d)) **Tests taken from FiPy** >>> phi = np.array(((-1, -1, 1, 1), ... (-1, -1, 1, 1), ... (1, 1, 1, 1), ... (1, 1, 1, 1))) >>> o1 = distance(phi, order=1, self_test=True) >>> dw_o1 = [[-1.20710678, -0.5, 0.5, 1.5], ... [-0.5, -0.35355339, 0.5, 1.5], ... [ 0.5, 0.5, 1.20710678, 2.04532893], ... [ 1.5, 1.5, 2.04532893, 2.75243571]] >>> np.testing.assert_allclose(o1, dw_o1) >>> phi = np.array(((-1, -1, 1, 1), ... (-1, -1, 1, 1), ... (1, 1, 1, 1), ... (1, 1, 1, 1))) >>> o1 = travel_time(phi, np.ones_like(phi), order=1, self_test=True) >>> dw_o1 = [[-1.20710678, -0.5, 0.5, 1.5], ... [-0.5, -0.35355339, 0.5, 1.5], ... [ 0.5, 0.5, 1.20710678, 2.04532893], ... [ 1.5, 1.5, 2.04532893, 2.75243571]] >>> np.testing.assert_allclose(o1, np.abs(dw_o1)) >>> phi = np.array(((-1, -1, 1, 1), ... (-1, -1, 1, 1), ... (1, 1, 1, 1), ... (1, 1, 1, 1))) >>> o2 = distance(phi, self_test=True) >>> dw_o2 = [[-1.30473785, -0.5, 0.5, 1.49923009], ... [-0.5, -0.35355339, 0.5, 1.45118446], ... [ 0.5, 0.5, 0.97140452, 1.76215286], ... [ 1.49923009, 1.45118446, 1.76215286, 2.33721352]] >>> np.testing.assert_allclose(o2, dw_o2) >>> phi = np.array(((-1, -1, 1, 1), ... (-1, -1, 1, 1), ... (1, 1, 1, 1), ... (1, 1, 1, 1))) >>> o2 = travel_time(phi, np.ones_like(phi), self_test=True) >>> dw_o2 = [[-1.30473785, -0.5, 0.5, 1.49923009], ... [-0.5, -0.35355339, 0.5, 1.45118446], ... [ 0.5, 0.5, 0.97140452, 1.76215286], ... [ 1.49923009, 1.45118446, 1.76215286, 2.33721352]] >>> np.testing.assert_allclose(o2, np.abs(dw_o2)) >>> distance([-1,1], order=0) Traceback (most recent call last): ... ValueError: order must be 1 or 2 >>> distance([-1,1], order=3) Traceback (most recent call last): ... ValueError: order must be 1 or 2 **Extension velocity tests** Test 1d extension constant. >>> phi = [-1,-1,-1,1,1,1] >>> speed = [1,1,1,1,1,1] >>> d, f_ext = extension_velocities(phi, speed, self_test=True) >>> np.testing.assert_allclose(speed, f_ext) Test the 1D extension block. >>> phi = np.ones(10) >>> phi[0] =- 1 >>> speed = np.ones(10) >>> speed[0:3] = 5 >>> d, f_ext = extension_velocities(phi, speed, self_test=True) >>> np.testing.assert_allclose(f_ext, 5) Test that a uniform speed value is preserved. >>> N = 50 >>> X, Y = np.meshgrid(np.linspace(-1, 1, N), np.linspace(-1, 1, N)) >>> r = 0.25 >>> dx = 2.0 / (N - 1) >>> phi = (X) ** 2 + (Y) ** 2 - r ** 2 >>> speed = np.ones_like(phi) >>> d, f_ext = extension_velocities(phi, speed, dx, self_test=True) >>> np.testing.assert_allclose(f_ext, 1.0) Constant value march-out test >>> speed[abs(Y)<0.3] = 10.0 >>> d, f_ext = extension_velocities(phi, speed, dx, self_test=True) >>> np.testing.assert_allclose(f_ext, 10.0) Test distance from extension >>> speed = np.ones_like(phi) >>> d, f_ext = extension_velocities(phi, speed, dx, self_test=True) >>> d2 = distance(phi, dx, self_test=True) >>> np.testing.assert_allclose(d, d2) Test for extension velocity bug >>> N = 150 >>> X, Y = np.meshgrid(np.linspace(-1, 1, N), np.linspace(-1, 1, N)) >>> r = 0.5 >>> dx = 2.0 / (N - 1) >>> phi = (X) ** 2 + (Y) ** 2 - r ** 2 >>> speed = np.ones_like(phi) >>> speed[X>0.25] = 3.0 >>> d2, f_ext = extension_velocities(phi, speed, dx) >>> assert (f_ext <= 3.0000001).all() >>> assert (f_ext >= 1).all() >>> np.testing.assert_almost_equal(f_ext[137, 95], 1, 3) >>> np.testing.assert_almost_equal(f_ext[103, 78], 1, 2) >>> np.testing.assert_almost_equal(f_ext[72, 100], 3, 3) >>> np.testing.assert_almost_equal(f_ext[72, 86], 3, 3) >>> np.testing.assert_almost_equal(f_ext[110, 121], 3, 3) Simple two point tests >>> np.testing.assert_array_equal(distance([-1, 1]), ... [-0.5, 0.5]) >>> np.testing.assert_allclose(distance([-1, -1, -1, 1, 1, 1]), ... [-2.5, -1.5, -0.5, 0.5, 1.5, 2.5]) >>> np.testing.assert_allclose(distance([1, 1, 1, -1, -1, -1]), ... [2.5, 1.5, 0.5, -0.5, -1.5, -2.5]) Three point test case >>> np.testing.assert_array_equal(distance([-1, 0, 1]), [-1, 0, 1]) >>> np.testing.assert_array_equal(distance([-1, 0, 1], dx=[2]), [-2, 0, 2]) >>> np.testing.assert_array_equal(distance([-1, 0, 1], dx=2), [-2, 0, 2]) >>> np.testing.assert_array_equal(distance([-1, 0, 1], dx=2.0), [-2, 0, 2]) >>> np.testing.assert_array_equal(travel_time([1, 0, -1], [1, 1, 1]), ... [1, 0, 1]) >>> np.testing.assert_array_equal(travel_time([-1, 0, 1], [1, 1, 1]), ... [1, 0, 1]) >>> np.testing.assert_array_equal(travel_time([1, 0, -1], [1, 1, 1], dx=2), ... [2, 0, 2]) >>> np.testing.assert_array_equal(travel_time([1, 0, -1], [1, 1, 1], dx=[2]), ... [2, 0, 2]) >>> np.testing.assert_array_equal(travel_time([1, 0, -1], [1, 1, 1], dx=2.0), ... [2, 0, 2]) Travel time tests 1 >>> np.testing.assert_allclose(travel_time([0, 1, 1, 1, 1], [2, 2, 2, 2, 2]), ... [0, 0.5, 1.0, 1.5, 2.0]) >>> np.testing.assert_array_equal(travel_time([1, 0, -1], [2, 2, 2]), ... [0.5, 0, 0.5]) Travel time tests 2 >>> phi = [1, 1, 1, -1, -1, -1] >>> t = travel_time(phi, np.ones_like(phi)) >>> exact = [2.5, 1.5, 0.5, 0.5, 1.5, 2.5] >>> np.testing.assert_allclose(t, exact) Travel time tests 3 >>> phi = [-1, -1, -1, 1, 1, 1] >>> t = travel_time(phi, np.ones_like(phi)) >>> exact = [2.5, 1.5, 0.5, 0.5, 1.5, 2.5] >>> np.testing.assert_allclose(t, exact) Corner case >>> np.testing.assert_array_equal(distance([0, 0]), [0, 0]) >>> np.testing.assert_array_equal(travel_time([0, 0], [1, 1]), [0, 0]) Test zero >>> distance([1, 0, 1, 1], 0) Traceback (most recent call last): ... ValueError: dx must be greater than zero Test dx shape >>> distance([0, 0, 1, 0, 0], [0, 0, 1, 0, 0]) Traceback (most recent call last): ... ValueError: dx must be of length len(phi.shape) Test for small speeds Test catching speeds which are too small. Speeds less than the machine epsilon are masked off to avoid an overflow. >>> t = travel_time([-1, -1, 0, 1, 1], [1, 1, 1, 1, 0]) >>> assert isinstance(t, np.ma.MaskedArray) >>> np.testing.assert_array_equal(t.data[:-1], [2, 1, 0, 1]) >>> np.testing.assert_array_equal(t.mask, [False, False, False, False, True]) >>> t2 = travel_time([-1, -1, 0, 1, 1], [1, 1, 1, 1, 1e-300]) >>> np.testing.assert_array_equal(t, t2) Mask test Test that when the mask cuts off the solution, the cut off points are also masked. >>> ma = np.ma.MaskedArray([1, 1, 1, 0], [False, True, False, False]) >>> d = distance(ma) >>> exact = np.ma.MaskedArray([0, 0, 1, 0], [True, True, False, False]) >>> np.testing.assert_array_equal(d.mask, exact.mask) >>> np.testing.assert_array_equal(d, exact) Circular level set >>> N = 50 >>> X, Y = np.meshgrid(np.linspace(-1, 1, N), np.linspace(-1, 1, N)) >>> r = 0.5 >>> dx = 2.0 / (N - 1) >>> phi = (X) ** 2 + (Y) ** 2 - r ** 2 >>> d = distance(phi, dx, self_test=True) >>> exact = np.sqrt(X ** 2 + Y ** 2) - r >>> np.testing.assert_allclose(d, exact, atol=dx) Planar level set >>> N = 50 >>> X, Y = np.meshgrid(np.linspace(-1, 1, N), np.linspace(-1, 1, N)) >>> dx = 2.0 / (N - 1) >>> phi = np.ones_like(X) >>> phi[0, :] = -1 >>> d = distance(phi, dx, self_test=True) >>> exact = Y + 1 - dx / 2.0 >>> np.testing.assert_allclose(d, exact) Masked input >>> N = 50 >>> X, Y = np.meshgrid(np.linspace(-1, 1, N), np.linspace(-1, 1, N)) >>> dx = 2.0 / (N - 1) >>> phi = np.ones_like(X) >>> phi[0, 0] = -1 >>> mask = np.logical_and(abs(X) < 0.25, abs(Y) < 0.25) >>> mphi = np.ma.MaskedArray(phi.copy(), mask) >>> d0 = distance(phi, dx, self_test=True) >>> d = distance(mphi, dx, self_test=True) >>> d0[mask] = 0 >>> d[mask] = 0 >>> shadow = d0 - d >>> bsh = abs(shadow) > 0.001 >>> diff = (bsh).sum() >>> assert diff > 635 and diff < 645 Test Eikonal solution >>> N = 50 >>> X, Y = np.meshgrid(np.linspace(-1, 1, N), np.linspace(-1, 1, N)) >>> r = 0.5 >>> dx = 2.0 / (N - 1) >>> phi = (X) ** 2 + (Y) ** 2 - r ** 2 >>> speed = np.ones_like(phi) * 2 >>> t = travel_time(phi, speed, dx) >>> exact = 0.5 * np.abs(np.sqrt(X ** 2 + Y ** 2) - 0.5) >>> np.testing.assert_allclose(t, exact, atol=dx) Test 1d >>> N = 100 >>> X = np.linspace(-1.0, 1.0, N) >>> dx = 2.0 / (N - 1) >>> phi = np.zeros_like(X) >>> phi[X < 0] = -1 >>> phi[X > 0] = 1 >>> d = distance(phi, dx, self_test=True) >>> np.testing.assert_allclose(d, X) Test 3d >>> N = 15 >>> X = np.linspace(-1, 1, N) >>> Y = np.linspace(-1, 1, N) >>> Z = np.linspace(-1, 1, N) >>> phi = np.ones((N, N, N)) >>> phi[0, 0, 0] = -1.0 >>> dx = 2.0 / (N - 1) >>> d = distance(phi, dx, self_test=True) >>> exact = np.sqrt((X + 1) ** 2 + ... (Y + 1)[:, np.newaxis] ** 2 + ... (Z + 1)[:, np.newaxis, np.newaxis] ** 2) >>> np.testing.assert_allclose(d, exact, atol=dx) Test default dx >>> N = 50 >>> X, Y = np.meshgrid(np.linspace(-1, 1, N), np.linspace(-1, 1, N)) >>> r = 0.5 >>> phi = (X) ** 2 + (Y) ** 2 - r ** 2 >>> speed = np.ones_like(phi) * 2 >>> out = travel_time(phi, speed, self_test=True) Test non-square grid and dx different in different directions >>> N = 50 >>> NX, NY = N, 5 * N >>> X, Y = np.meshgrid(np.linspace(-1, 1, NY), np.linspace(-1, 1, NX)) >>> r = 0.5 >>> phi = X ** 2 + Y ** 2 - r ** 2 >>> dx = [2.0 / (NX - 1), 2.0 / (NY - 1)] >>> d = distance(phi, dx, self_test=True) >>> exact = np.sqrt(X ** 2 + Y ** 2) - r >>> np.testing.assert_allclose(d, exact, atol=1.3*max(dx)) No zero level set test >>> distance([1, 1], self_test=False) Traceback (most recent call last): ... ValueError: the array phi contains no zero contour (no zero level set) Shape mismatch test >>> travel_time([-1, 1], [2]) Traceback (most recent call last): ... ValueError: phi and speed must have the same shape Speed wrong type test >>> travel_time([0, 0, 1, 1], 2) Traceback (most recent call last): ... ValueError: speed must be a 1D to 12-D array of doubles dx mismatch test >>> travel_time([-1, 1], [2, 2], [2, 2, 2, 2]) Traceback (most recent call last): ... ValueError: dx must be of length len(phi.shape) Test c error handling >>> distance([-1, 1], self_test=44) Traceback (most recent call last): ... ValueError: self_test must be 0 or 1 Check array type test >>> distance(np.array(["a", "b"])) Traceback (most recent call last): ... ValueError: phi must be a 1 to 12-D array of doubles >>> from skfmm import heap >>> h = heap(10,True) >>> h.push(0,0.2) 0 >>> h.push(1,0.3) 1 >>> h.push(2,0.1) 2 >>> h.update(1, 0.01) >>> h.pop() (1, 0.01) >>> h.pop() (2, 0.1) >>> h.pop() (0, 0.2) >>> h.empty() True >>> h.pop() Traceback (most recent call last): ... RuntimeError: heap pop error: empty heap Test narrow optional argument. >>> phi = np.array([-1,-1,-1,1,1,1]) >>> d = distance(phi, narrow=1.0) >>> d.data[2:-2] array([-0.5, 0.5]) >>> assert (d.mask == [ True, True, False, False, True, True]).all() >>> N = 50 >>> X, Y = np.meshgrid(np.linspace(-1, 1, N), np.linspace(-1, 1, N)) >>> r = 0.5 >>> dx = 2.0 / (N - 1) >>> phi = (X) ** 2 + (Y) ** 2 - r ** 2 >>> exact = np.sqrt(X ** 2 + Y ** 2) - r >>> d = distance(phi, dx) >>> bandwidth=5*dx >>> d2 = distance(phi, dx, narrow=bandwidth) >>> np.testing.assert_allclose(d, exact, atol=dx) >>> # make sure we get a normal array if there are no points outside the narrow band >>> np.testing.assert_allclose(distance(phi, dx, narrow=1000*dx), exact, atol=dx) >>> assert (d2>> assert type(d2) is np.ma.masked_array >>> speed = np.ones_like(phi) >>> speed[X>0] = 1.8 >>> t = travel_time(phi, speed, dx) >>> t2 = travel_time(phi, speed, dx, narrow=bandwidth) >>> assert type(t2) is np.ma.masked_array >>> assert (t2>> speed = np.ones_like(phi) >>> speed = X + Y >>> ed, ev = extension_velocities(phi, speed, dx) >>> ed2, ev2 = extension_velocities(phi, speed, dx, narrow=bandwidth) >>> assert type(ed2) is np.ma.masked_array >>> assert type(ev2) is np.ma.masked_array >>> assert (ed2>> assert ed2.shape == ed.shape == ev.shape == ev2.shape >>> distance(phi, dx, narrow=-1) Traceback (most recent call last): ... ValueError: parameter "narrow" must be greater than or equal to zero. >>> # make sure the narrow options works with an existing mask. >>> mask = abs(X)<0.25 >>> d3 = distance(np.ma.masked_array(phi, mask), dx, narrow=bandwidth) >>> assert (d3.mask[mask]==True).all() >>> assert d3.mask.sum() > mask.sum() Testing periodic argument >>> X, Y = np.meshgrid(np.linspace(-2,2,200), np.linspace(-2,2,200)) >>> phi = -1*np.ones_like(X); phi[X**2+(Y-0.9)**2<0.5] = 1.0 >>> speed = np.ones_like(X); speed[(X-0.9)**2+Y**2<1.0] = 2.0 >>> np.allclose(distance(phi),distance(phi,periodic=False)) and np.allclose(distance(phi),distance(phi,periodic=(0,0))) True >>> np.allclose(travel_time(phi,speed),travel_time(phi,speed,periodic=False)) and np.allclose(travel_time(phi,speed),travel_time(phi,speed,periodic=(0,0))) True >>> phi = -1*np.ones_like(X); phi[X**2+Y**2<0.5] = 1.0 >>> speed = np.ones_like(X); speed[X**2+Y**2<1.0] = 2.0 >>> np.allclose(distance(phi),distance(phi,periodic=True)) and np.allclose(distance(phi),distance(phi,periodic=(1,1))) True >>> np.allclose(travel_time(phi,speed),travel_time(phi,speed,periodic=True)) and np.allclose(travel_time(phi,speed),travel_time(phi,speed,periodic=(1,1))) True >>> np.allclose(travel_time(phi,speed),travel_time(phi,speed,periodic=True)) and np.allclose(travel_time(phi,speed),travel_time(phi,speed,periodic=[1,1])) True >>> np.allclose(travel_time(phi,speed),travel_time(phi,speed,periodic=True)) and np.allclose(travel_time(phi,speed),travel_time(phi,speed,periodic=[True,True])) True >>> phi = -1*np.ones_like(X); phi[X**2+(Y-0.9)**2<0.5] = 1.0 >>> speed = np.ones_like(X); speed[(X-0.9)**2+Y**2<1.0] = 2.0 >>> np.allclose(distance(np.roll(phi,137,axis=0),periodic=True),np.roll(distance(phi,periodic=True),137,axis=0)) True >>> np.allclose(travel_time(np.roll(phi,-77,axis=1),np.roll(speed,-77,axis=1),periodic=True),np.roll(travel_time(phi,speed,periodic=True),-77,axis=1)) True >>> phi=[1,-1,1,1,1,1] >>> speed=[4,1,2,2,2,2] >>> np.allclose(extension_velocities(phi,speed)[1],(2.5,2.5,1.5,1.5,1.5,1.5)) True >>> np.allclose(extension_velocities(phi,speed,periodic=True)[1],(2.5,2.5,1.5,1.5,1.5,2.5)) True This is issue #18, >>> phi = np.array([[ 1, 1, -1, -1, -1, -1, 1], ... [ 3, 1, -1, -1, -1, -1, 1], ... [ 3, 3, 1, 1, 1, 1, 3], ... [ 3, 3, 3, 3, 3, 3, 3], ... [ 3, 3, 3, 3, 3, 3, 3]]) >>> speed = np.array([[ 1. , 1. , 0.057, 0.128, 0.037, 0.039, 1. ], ... [ 1. , 1. , 0.199, 0.408, 0.997, 0.688, 1. ], ... [ 1. , 1. , 1. , 1. , 1. , 1. , 1. ], ... [ 1. , 1. , 1. , 1. , 1. , 1. , 1. ], ... [ 1. , 1. , 1. , 1. , 1. , 1. , 1. ]]) >>> assert not travel_time(phi,speed)[0][3] == 0 >>> phi = np.array([[1, -1, -1], ... [0, 0, -1], ... [0, 0, 1]]) >>> value = 0.01 >>> speed = np.array([[ 1, value, 0.1], ... [ 0, 0, 1. ], ... [ 0, 0, 1. ]]) >>> phi = np.ma.MaskedArray(phi, phi==0) >>> tt = travel_time(phi,speed) >>> tt.fill_value=0 >>> np.testing.assert_allclose(tt.data, ((0.5, 50, 7.5), ... (0, 0, 0.5), ... (0, 0, 0.5))) This is from Pull Request #57: >>> a = np.array([[[600, 399, 641], [607, 605, 796], [602, 641, 797], [602, 658, 814]], [[272, -1, 398], [208, 282, 539], [209, 285, 513], [208, 298, 519]], [[-19, 51, 307], [-191, 2, 403], [-171, 5, 325], [-172, 3, 318]]]) >>> d = distance(a) >>> assert not (d==0).any() A 2D version of this bug was also discovered >>> a = np.array([[399, -1, 51, 10.0], [605, 282, 2, -3], [641, 285, 5, -100], [658, 298, 3, -3]]) >>> d = distance(a) >>> assert not (d==0).any() """ def test(verbose=None): r""" Run all the doctests available. """ import doctest import skfmm fail0, test0 = doctest.testmod(skfmm, verbose=verbose) fail1, test1 = doctest.testfile("heap.py", verbose=verbose) print ("Summary: {} tests run {} failures".format(test0+test1, fail0+fail1)) return fail0+fail1 scikit-fmm-2024.05.29/skfmm/base_marcher.cpp000066400000000000000000000131101464214672300204230ustar00rootroot00000000000000//fast_marching.cpp // this file is a C++ implementation of the fast marching method. The // code in this file is independent of Python. #include "base_marcher.h" #include "heap.h" #include "math.h" #include extern "C" { baseMarcher::baseMarcher( double *phi, double *dx, long *flag, double *distance, int ndim, int *shape, bool self_test, int order, double narrow, int periodic) { narrow_ = narrow; order_ = order; error_ = 1; phi_ = phi; dx_ = dx; flag_ = flag; distance_ = distance; dim_ = ndim; size_ = 1; self_test_ = self_test; heapptr_ = 0; heap_ = 0; periodic_ = periodic; for (int i=0; ipush(i,fabs(d)); } } // for each direction } // for each dimension } // each far field point } } // now we apply the fast marching algorithm main loop // (1) take the smallest narrow band element and // freeze it. // (2) for each neighbor of the frozen point calculate distance based // on frozen elements // - mark each neighbor as narrow band and stick it // into the heap // - if the neighbor is already in the heap update the // distance value. void baseMarcher::solve() { int frozenCount=0; for (int i=0; i toFreeze; while (! heap_->empty()) { toFreeze.clear(); i++; double value = 0; int addr = 0; heap_->pop(&addr, &value); if ((narrow_ != 0) && (fabs(value) > narrow_)) { break; } flag_[addr]=Frozen; finalizePoint(addr, value); toFreeze.push_back(addr); bool done=false; while (!done) { if (! heap_->empty() && value == heap_->peek()) { double l_value = 0; int l_addr = 0; heap_->pop(&l_addr, &l_value); flag_[l_addr]=Frozen; finalizePoint(l_addr, l_value); toFreeze.push_back(l_addr); } else done = true; } for (unsigned int k=0; kset(heapptr_[naddr],fabs(d)); distance_[naddr]=d; } } else if (flag_[naddr]==Far) { double d; if (order_ == 2) d = updatePointOrderTwo(naddr); else d = updatePointOrderOne(naddr); if (d) { distance_[naddr]=d; flag_[naddr]=Narrow; heapptr_[naddr] = heap_->push(naddr,fabs(d)); } } } //========================================================== // update the far point in the second order stencil // "jump" over a Frozen point if needed if (order_ == 2) { int local_naddr = _getN(addr,dim,j,Mask); if (local_naddr!=-1 && flag_[local_naddr]==Frozen) { int naddr2 = _getN(addr,dim,j*2,Frozen); if (naddr2!=-1 && flag_[naddr2]==Narrow) { double d = updatePointOrderTwo(naddr2); if (d) { heap_->set(heapptr_[naddr2], fabs(d)); distance_[naddr2]=d; } } } } //========================================================== } // for each direction } // for each dimension } } // main loop of Fast Marching Method // add back mask here. The python wrapper will look for elements // equal to maxDouble and add the mask back for (int i=0; i using namespace std; #define doubleEpsilon numeric_limits::epsilon() #define maxDouble numeric_limits::max() class heap; extern "C" { class baseMarcher { public: baseMarcher(double *phi, double *dx, long *flag, double *distance, int ndim, int *shape, bool self_test, int order, double narrow, int periodic); virtual ~baseMarcher(); void march(); int getError() const { return error_;} private: void initalizeNarrow(); void solve(); void _setIndex(int current, int coord[MaximumDimension]) { int rem = current; for (int i=0; i= shape_[dim] || newc < 0) return -1; int newa = current + dir*shift_[dim]; if (flag_[newa]==flag) return -1; return newa; } double * distance_; // return value modified in place double * phi_; double * dx_; long * flag_; int error_; int dim_; // number of dimensions int size_; // flat size double idx2_[MaximumDimension]; }; } // extern "C" scikit-fmm-2024.05.29/skfmm/distance_marcher.cpp000066400000000000000000000102741464214672300213130ustar00rootroot00000000000000#include "distance_marcher.h" #include "math.h" #include double distanceMarcher::updatePointOrderOne(int i) { double a,b,c; a=b=c=0; int naddr=0; for (int dim=0; dim=0) || (distance_[naddr2]>=value1 && value1 <=0))) { value2=distance_[naddr2]; } } } } if (value2= 0) { if (phi_[i] > doubleEpsilon) { return (-b + sqrt(det)) / 2.0 / a; } else { return (-b - sqrt(det)) / 2.0 / a; } } else { throw std::runtime_error("Negative discriminant in distance marcher quadratic."); } } void distanceMarcher::initalizeFrozen() { //loop over phi to find zero values // and mark them as frozen for (int i=0; id) { ldistance[dim] = d; } } } // for each direction } // for each dimension if (borders) { double dsum = 0; for (int dim=0; dim0) dsum += 1/ldistance[dim]/ldistance[dim]; if (phi_[i]<0) distance_[i] = -sqrt(1/dsum); else distance_[i] = sqrt(1/dsum); flag_[i]=Frozen; } }// for each point in the far field } scikit-fmm-2024.05.29/skfmm/distance_marcher.h000066400000000000000000000014161464214672300207560ustar00rootroot00000000000000//distance_marcher.h #pragma once #include "base_marcher.h" class distanceMarcher : public baseMarcher { public: distanceMarcher(double *phi, double *dx, long *flag, double *distance, int ndim, int *shape, bool self_test, int order, double narrow, int periodic): baseMarcher(phi, dx, flag, distance, ndim, shape, self_test, order, narrow, periodic) { } virtual ~distanceMarcher() { } protected: virtual double solveQuadratic(int i, const double &a, const double &b, double &c); virtual void initalizeFrozen(); virtual double updatePointOrderOne(int i); virtual double updatePointOrderTwo(int i); }; scikit-fmm-2024.05.29/skfmm/extension_velocity_marcher.cpp000066400000000000000000000101301464214672300234420ustar00rootroot00000000000000//extension_velocity_marcher.cpp #include "extension_velocity_marcher.h" #include #include #include "math.h" void extensionVelocityMarcher::initalizeFrozen() { //loop over phi to find zero values // and mark them as frozen for (int i=0; id) { ldistance[dim] = d; if (ext_mask_[i]) lspeed[dim] = speed_[naddr]; else if (ext_mask_[naddr]) lspeed[dim] = speed_[i]; else lspeed[dim] = speed_[i] + d / dx_[dim] * (speed_[naddr] - speed_[i]); } } } // for each direction } // for each dimension if (borders) { double numerator = 0.0; double denominator = 0.0; for (int dim=0; dim0) dsum += 1/ldistance[dim]/ldistance[dim]; if (phi_[i]<0) distance_[i] = -sqrt(1/dsum); else distance_[i] = sqrt(1/dsum); flag_[i]=Frozen; } }// for each point in the far field } void extensionVelocityMarcher::finalizePoint(int i, double phi_i) { // set the extension velocity of this point // find f_ext where grad f_ext . grad phi = 0 // as described in Adalsteinsson and Sethian // technically we do not need to calculate this extension velocity // until the point is frozen. double ldistance[MaximumDimension]; double lspeed[MaximumDimension]; double numerator = 0.0; double denominator = 0.0; for (int dim=0; dimd) { // this condition avoids a rare div by zero case where d = 0 if (fabs(d) > std::numeric_limits::epsilon()) { ldistance[dim] = d; lspeed[dim] = f_ext_[naddr]; } } } } // for each direction } // for each dimension for (int dim=0; dim #define DISTANCE 0 #define TRAVEL_TIME 1 #define EXTENSION_VELOCITY 2 static PyObject *distance_method(PyObject *self, PyObject *args); static PyMethodDef fmm_methods[] = { {"cFastMarcher", (PyCFunction)distance_method, METH_VARARGS, "Entry point for scikit-fmm c extension" "Use the python wrapper to this function" }, {NULL, NULL, 0, NULL} }; #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef moduledef = { PyModuleDef_HEAD_INIT, "cfmm", /* m_name */ "c extension module for scikit-fmm", /* m_doc */ -1, /* m_size */ fmm_methods, /* m_methods */ NULL, /* m_reload */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL, /* m_free */ }; #endif PyMODINIT_FUNC #if PY_MAJOR_VERSION >= 3 PyInit_cfmm(void) #else initcfmm(void) #endif { PyObject* m; #if PY_MAJOR_VERSION >= 3 m = PyModule_Create(&moduledef); if (m == NULL) return NULL; import_array(); return m; #else m = Py_InitModule3("cfmm", fmm_methods, "c extension module for scikit-fmm"); if (m == NULL) return; import_array(); #endif } static PyObject *distance_method(PyObject *self, PyObject *args) { // when we get here we should have: // -- phi, dx, flag, and speed // -- and the input error checking should be done PyObject *pphi, *pdx, *pflag, *pspeed, *pext_mask; int self_test, mode, order, periodic; PyArrayObject *phi, *dx, *flag, *speed, *distance, *f_ext, *ext_mask; double narrow=0; distance = 0; f_ext = 0; speed = 0; ext_mask = 0; if (!PyArg_ParseTuple(args, "OOOOOiiidi", &pphi, &pdx, &pflag, &pspeed, &pext_mask, &self_test, &mode, &order, &narrow, &periodic)) { return NULL; } if (! (self_test==0 || self_test==1)) { PyErr_SetString(PyExc_ValueError, "self_test must be 0 or 1"); return NULL; } if (! (order==1 || order==2)) { PyErr_SetString(PyExc_ValueError, "order must be 1 or 2"); return NULL; } if (! (mode==DISTANCE || mode==TRAVEL_TIME || mode==EXTENSION_VELOCITY)) { PyErr_SetString(PyExc_ValueError, "invalid mode flag"); return NULL; } phi = (PyArrayObject *)PyArray_FROMANY(pphi, PyArray_DOUBLE, 1, 10, NPY_IN_ARRAY); if (!phi) { PyErr_SetString(PyExc_ValueError, "phi must be a 1 to 12-D array of doubles"); return NULL; } dx = (PyArrayObject *)PyArray_FROMANY(pdx, PyArray_DOUBLE, 1, 1, NPY_IN_ARRAY); if (!dx) { PyErr_SetString(PyExc_ValueError, "dx must be a 1D array of doubles"); Py_XDECREF(phi); return NULL; } flag = (PyArrayObject *)PyArray_FROMANY(pflag, PyArray_LONG, 1, 10, NPY_IN_ARRAY); if (!flag) { PyErr_SetString(PyExc_ValueError, "flag must be a 1D to 12-D array of integers"); Py_XDECREF(phi); Py_XDECREF(dx); return NULL; } if (mode == TRAVEL_TIME || mode == EXTENSION_VELOCITY) { { speed = (PyArrayObject *)PyArray_FROMANY(pspeed, PyArray_DOUBLE, 1, 10, NPY_IN_ARRAY); if (!speed) { PyErr_SetString(PyExc_ValueError, "speed must be a 1D to 12-D array of doubles"); Py_XDECREF(phi); Py_XDECREF(dx); Py_XDECREF(flag); return NULL; } if (! PyArray_SAMESHAPE(phi,speed)) { PyErr_SetString(PyExc_ValueError, "phi and speed must have the same shape"); Py_XDECREF(phi); Py_XDECREF(dx); Py_XDECREF(flag); Py_XDECREF(speed); return NULL; } } } if (! (PyArray_NDIM(phi)==(npy_intp)PyArray_DIM(dx,0))) // ?! { PyErr_SetString(PyExc_ValueError, "dx must be of length len(phi.shape)"); Py_XDECREF(phi); Py_XDECREF(dx); Py_XDECREF(flag); Py_XDECREF(speed); return NULL; } for (int i=0; imarch(); error = marcher->getError(); delete marcher; } catch (const std::exception& exn) { // propagate error PyErr_SetString(PyExc_RuntimeError, exn.what()); Py_XDECREF(phi); Py_XDECREF(dx); Py_XDECREF(flag); Py_XDECREF(speed); Py_XDECREF(ext_mask); return NULL; } Py_DECREF(phi); Py_DECREF(flag); Py_DECREF(dx); Py_XDECREF(speed); Py_XDECREF(ext_mask); switch (error) { case 0: // no-error break; case 1: // unknown error // we should never get here PyErr_SetString(PyExc_ValueError, "an unknown error has occurred in the scikit-fmm c " "extension module"); Py_XDECREF(distance); return NULL; case 2: PyErr_SetString(PyExc_ValueError, "the array phi contains no zero contour (no zero level set)"); Py_XDECREF(distance); return NULL; } if (mode == EXTENSION_VELOCITY) { return Py_BuildValue("NN", distance, f_ext); } return (PyObject *)distance; } scikit-fmm-2024.05.29/skfmm/heap.cpp000066400000000000000000000131401464214672300167300ustar00rootroot00000000000000//heap.cpp ////////////////////////////////////////////////////////////////////////////// // The heap index (return by the push() method) is a map from the grid // // address to the index of heap's internal data representation. // // // // c_ is the current size of the heap. // // depth_ is the final size of the heap. // // // // distance_[] is the unsigned distance from the zero level set to each // // element in the heap. // // // // address_[] is the (original) grid address of each element in the heap. // // // // backPointer_[] is a map from the index of distance_ (or address_) to the // // current location of the element in the heap. // // // // heap_ is an array of integer indices into the distance_ (or address_) // // array the heap invariant is maintained by moving elements in this list. // // // // if selfTest_ is true a consistency check is done after each operation. // ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // Currently, the heap constructor needs to know the number of elements // // that will enter the heap during the calculation. // ////////////////////////////////////////////////////////////////////////// #include "heap.h" #include #include #include heap::heap(int maxLength, bool selfTest) { maxLength_ = maxLength; heapLength_ = 0; listLength_ = 0; selfTest_ = selfTest; distance_ = new double [maxLength_]; backPointer_ = new int [maxLength_]; heap_ = new int [maxLength_]; address_ = new int [maxLength_]; } heap::~heap() { delete[] distance_; delete[] backPointer_; delete[] heap_; delete[] address_; } int heap::push(int address, double value) { if (heapLength_==maxLength_) throw std::runtime_error("heap push error: heap full\n"); heap_[heapLength_] = listLength_; address_[listLength_] = address; distance_[listLength_] = value; backPointer_[listLength_] = heapLength_; listLength_++; heapLength_++; _siftDown(0,heapLength_-1); if (selfTest_) test(); return listLength_-1; } const double &heap::peek() const { if (heapLength_==0) throw std::runtime_error("heap peek error: empty heap\n"); int loc=heap_[0]; return distance_[loc]; } void heap::pop(int *address, double *value) { // out: address to element with min value and value if (heapLength_==0) throw std::runtime_error("heap pop error: empty heap\n"); int loc = heap_[0]; *value = distance_[loc]; *address = address_[heap_[0]]; heap_[0] = heap_[heapLength_-1]; backPointer_[heap_[0]] = 0; heapLength_--; _siftUp(0); if (selfTest_) test(); } void heap::_siftDown(int startPos, int pos) { int newItem; int parent; int parentPos; newItem = heap_[pos]; while (pos > startPos) { parentPos = (pos-1)>>1; parent = heap_[parentPos]; if (distance_[newItem] < distance_[parent]) { heap_[pos]=parent; backPointer_[parent]=pos; pos=parentPos; continue; } break; } heap_[pos]=newItem; backPointer_[newItem]=pos; } void heap::_siftUp(int pos) { int endPos = heapLength_; int startPos = pos; int newItem; int rightPos; newItem = heap_[pos]; int childPos = 2*pos + 1; while (childPos < endPos) { rightPos = childPos + 1; if ((rightPos < endPos) && ! (distance_[heap_[childPos]] < distance_[heap_[rightPos]])) { childPos = rightPos; } heap_[pos]=heap_[childPos]; backPointer_[heap_[childPos]]=pos; pos = childPos; childPos = 2*pos + 1; } heap_[pos] = newItem; _siftDown(startPos, pos); } void heap::set(int index, double newDistance) { double oldDistance = distance_[index]; int pos = backPointer_[index]; distance_[index]=newDistance; if (newDistance > oldDistance) { _siftUp(pos); } if (distance_[heap_[pos]] != newDistance) { if (selfTest_) test(); return; } _siftDown(0,pos); if (selfTest_) test(); } bool heap::empty() const { if (heapLength_==0) return true; return false; } void heap::test() const { for (int i=0; i>> from skfmm import heap >>> h = heap(10) >>> h.push(10,0.2) 0 >>> h.push(11,0.3) 1 >>> h.push(12,0.1) 2 >>> h.peek() 0.1 >>> h.update(1, 0.01) >>> h.peek() 0.01 >>> h.pop() (11, 0.01) >>> h.pop() (12, 0.1) >>> h.pop() (10, 0.2) >>> assert h.empty() """ def __init__(self, max_size, self_test=False): """Create a new min heap. Parameters ---------- max_heap : int The maximum size of the heap. self_test : Boolean If True a consistency check is made after each heap operation. This is used in testing and results in a slower calculation. """ self._heap = _pheap(max_size, self_test) def push(self, addr, value): """Add a value to the heap, give an address and a value. Parameters ---------- addr : int An id number which is returned when the element is popped off the heap. value : float An initial numerical value for this element. Returns ------- heap_id : int An id number into the heap used to update the value of this element. The value of a point in the heap can be updated by calling :py:meth:`update` with this id and a new value. """ return self._heap._push(addr, value) def pop(self): """Remove and return the address and value of the top element on the heap. Returns ------- (addr, value) : tuple A tuple of the address given when the element was pushed onto the heap and the current value of the element. """ return self._heap._pop() def update(self, heap_id, value): """Update the value of a point already in the heap, the heap ordering is updated. Parameters ---------- heap_id : int The :py:obj:`heap_id` value returned by :py:meth:`push` when this element was added to the heap. value : float The new value for this element. """ self._heap._set(heap_id, value) def empty(self): """ Returns ------- empty : Boolean True if the heap is empty. """ return self._heap._empty() def peek(self): """ Returns the top (smallest) value on the heap without removing it. Returns ------- value : float The top (smallest) value on the heap. """ return self._heap._peek() scikit-fmm-2024.05.29/skfmm/pfmm.py000066400000000000000000000227311464214672300166260ustar00rootroot00000000000000from sys import float_info import numpy as np from .cfmm import cFastMarcher FAR, NARROW, FROZEN, MASK = 0, 1, 2, 3 DISTANCE, TRAVEL_TIME, EXTENSION_VELOCITY = 0, 1, 2 def pre_process_args(phi, dx, narrow, periodic, ext_mask=None): """ get input data into the correct form for calling the c extension module This wrapper allows for a little bit of flexibility in the input types """ if not isinstance(phi, np.ndarray): phi = np.array(phi) if type(dx) is float or type(dx) is int: dx = [dx for _ in range(phi.ndim)] dx = np.array(dx) if isinstance(phi, np.ma.MaskedArray): flag = np.zeros(phi.shape, dtype=int) flag[phi.mask] = MASK phi = phi.data else: flag = np.zeros(phi.shape, dtype=int) if ext_mask is None: ext_mask = np.zeros(phi.shape, dtype=int) periodic_data = 0 if isinstance(periodic, bool): if periodic: periodic_data = int(2 ** phi.ndim - 1) else: if hasattr(periodic, "__len__") and len(periodic) == phi.ndim: for i, value in enumerate(periodic): if value: periodic_data |= 1 << i else: raise ValueError("parameter \"periodic\" must be of type bool or sequence of type bool of length phi.ndim.") if narrow < 0: raise ValueError("parameter \"narrow\" must be greater than or equal to zero.") return phi, dx, flag, ext_mask, periodic_data def post_process_result(result): """ post-process results from the c module (add mask) """ if (result == float_info.max).any(): mask = (result == float_info.max) result[mask] = 0 result = np.ma.MaskedArray(result, mask) return result def distance(phi, dx=1.0, self_test=False, order=2, narrow=0.0, periodic=False): """Return the signed distance from the zero contour of the array phi. Parameters ---------- phi : array-like the zero contour of this array is the boundary location for the distance calculation. Phi can of 1,2,3 or higher dimension and can be a masked array. dx : float or an array-like of len phi.ndim, optional the cell length in each dimension. self_test : bool, optional if True consistency checks are made on the binary min heap during the calculation. This is used in testing and results in a slower calculation. order : int, optional order of computational stencil to use in updating points during the fast marching method. Must be 1 or 2, the default is 2. narrow : float, optional narrow band half-width. If this optional argument is specified the marching algorithm is limited to within a given narrow band. If far-field points remain when this condition is met a masked array is returned. The default value is 0.0 which means no narrow band limit. periodic : bool or an array-like of len phi.ndim, optional specifies whether and in which directions periodic boundary conditions are used. True sets periodic boundary conditions in all directions. An array-like (interpreted as True or False values) specifies the absence or presence of periodic boundaries in individual directions. The default value is False, i.e., no periodic boundaries in any direction. Returns ------- d : an array the same shape as phi contains the signed distance from the zero contour (zero level set) of phi to each point in the array. The sign is specified by the sign of phi at the given point. """ phi, dx, flag, ext_mask, periodic = \ pre_process_args(phi, dx, narrow, periodic) d = cFastMarcher(phi, dx, flag, None, ext_mask, int(self_test), DISTANCE, order, narrow, periodic) d = post_process_result(d) return d def travel_time(phi, speed, dx=1.0, self_test=False, order=2, narrow=0.0, periodic=False): """Return the travel from the zero contour of the array phi given the scalar velocity field speed. Parameters ---------- phi : array-like the zero contour of this array is the boundary location for the travel time calculation. Phi can of 1,2,3 or higher dimension and can be a masked array. speed : array-like, the same shape as phi contains the speed of interface propagation at each point in the domain. dx : float or an array-like of len phi.ndim, optional the cell length in each dimension. self_test : bool, optional if True consistency checks are made on the binary min heap during the calculation. This is used in testing and results in a slower calculation. order : int, optional order of computational stencil to use in updating points during the fast marching method. Must be 1 or 2, the default is 2. narrow : float, optional narrow band half-width. If this optional argument is specified the marching algorithm is limited to travel times within a given value. If far-field points remain when this condition is met a masked array is returned. The default value is 0.0 which means no narrow band limit. periodic : bool or an array-like of len phi.ndim, optional specifies whether and in which directions periodic boundary conditions are used. True sets periodic boundary conditions in all directions. An array-like (interpreted as True or False values) specifies the absence or presence of periodic boundaries in individual directions. The default value is False, i.e., no periodic boundaries in any direction. Returns ------- t : an array the same shape as phi contains the travel time from the zero contour (zero level set) of phi to each point in the array given the scalar velocity field speed. If the input array speed has values less than or equal to zero the return value will be a masked array. """ phi, dx, flag, ext_mask, periodic \ = pre_process_args(phi, dx, narrow, periodic) t = cFastMarcher(phi, dx, flag, speed, ext_mask, int(self_test), TRAVEL_TIME, order, narrow, periodic) t = post_process_result(t) return t def extension_velocities(phi, speed, dx=1.0, self_test=False, order=2, ext_mask=None, narrow=0.0, periodic=False): """Extend the velocities defined at the zero contour of phi, in the normal direction, to the rest of the domain. Extend the velocities such that grad f_ext dot grad d = 0 where where f_ext is the extension velocity and d is the signed distance function. Parameters ---------- phi : array-like the zero contour of this array is the boundary location for the travel time calculation. Phi can of 1,2,3 or higher dimension and can be a masked array. speed : array-like, the same shape as phi contains the speed of interface propagation at each point in the domain. dx : float or an array-like of len phi.ndim, optional the cell length in each dimension. self_test : bool, optional if True consistency checks are made on the binary min heap during the calculation. This is used in testing and results in a slower calculation. order : int, optional order of computational stencil to use in updating points during the fast marching method. Must be 1 or 2, the default is 2. ext_mask : array-like, the same shape as phi, optional enables initial front values to be eliminated when calculating the value at the interface before the values are extended away from the interface. narrow : float, optional narrow band half-width. If this optional argument is specified the marching algorithm is limited to within a given narrow band. If far-field points remain when this condition is met a masked arrays are returned. The default value is 0.0 which means no narrow band limit. periodic : bool or an array-like of len phi.ndim, optional specifies whether and in which directions periodic boundary conditions are used. True sets periodic boundary conditions in all directions. An array-like (interpreted as True or False values) specifies the absence or presence of periodic boundaries in individual directions. The default value is False, i.e., no periodic boundaries in any direction. Returns ------- (d, f_ext) : tuple a tuple containing the signed distance function d and the extension velocities f_ext. """ phi, dx, flag, ext_mask, periodic = \ pre_process_args(phi, dx, narrow, periodic, ext_mask) distance, f_ext = cFastMarcher(phi, dx, flag, speed, ext_mask, int(self_test), EXTENSION_VELOCITY, order, narrow, periodic) distance = post_process_result(distance) f_ext = post_process_result(f_ext) return distance, f_ext scikit-fmm-2024.05.29/skfmm/pheap.cpp000066400000000000000000012163251464214672300171230ustar00rootroot00000000000000/* Generated by Cython 3.0.9 */ #ifndef PY_SSIZE_T_CLEAN #define PY_SSIZE_T_CLEAN #endif /* PY_SSIZE_T_CLEAN */ #if defined(CYTHON_LIMITED_API) && 0 #ifndef Py_LIMITED_API #if CYTHON_LIMITED_API+0 > 0x03030000 #define Py_LIMITED_API CYTHON_LIMITED_API #else #define Py_LIMITED_API 0x03030000 #endif #endif #endif #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.7+ or Python 3.3+. #else #if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API #define __PYX_EXTRA_ABI_MODULE_NAME "limited" #else #define __PYX_EXTRA_ABI_MODULE_NAME "" #endif #define CYTHON_ABI "3_0_9" __PYX_EXTRA_ABI_MODULE_NAME #define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI #define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." #define CYTHON_HEX_VERSION 0x030009F0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #define HAVE_LONG_LONG #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX #if defined(GRAALVM_PYTHON) /* For very preliminary testing purposes. Most variables are set the same as PyPy. The existence of this section does not imply that anything works or is even tested */ #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 1 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) #endif #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(PYPY_VERSION) #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #ifndef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) #endif #if PY_VERSION_HEX < 0x03090000 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(CYTHON_LIMITED_API) #ifdef Py_LIMITED_API #undef __PYX_LIMITED_VERSION_HEX #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API #endif #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 1 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_CLINE_IN_TRACEBACK #define CYTHON_CLINE_IN_TRACEBACK 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 1 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #endif #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_GIL #define CYTHON_FAST_GIL 0 #undef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS 1 #endif #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 1 #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #endif #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 #endif #elif defined(Py_GIL_DISABLED) || defined(Py_NOGIL) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #ifndef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 1 #endif #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #define CYTHON_COMPILING_IN_LIMITED_API 0 #define CYTHON_COMPILING_IN_GRAAL 0 #define CYTHON_COMPILING_IN_NOGIL 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #ifndef CYTHON_USE_TYPE_SPECS #define CYTHON_USE_TYPE_SPECS 0 #endif #ifndef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #ifndef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_GIL #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) #endif #ifndef CYTHON_METH_FASTCALL #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #ifndef CYTHON_PEP487_INIT_SUBCLASS #define CYTHON_PEP487_INIT_SUBCLASS 1 #endif #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) #define CYTHON_PEP489_MULTI_PHASE_INIT 1 #endif #ifndef CYTHON_USE_MODULE_STATE #define CYTHON_USE_MODULE_STATE 0 #endif #if PY_VERSION_HEX < 0x030400a1 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #elif !defined(CYTHON_USE_TP_FINALIZE) #define CYTHON_USE_TP_FINALIZE 1 #endif #if PY_VERSION_HEX < 0x030600B1 #undef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS 0 #elif !defined(CYTHON_USE_DICT_VERSIONS) #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) #endif #if PY_VERSION_HEX < 0x030700A3 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 #elif !defined(CYTHON_USE_EXC_INFO_STACK) #define CYTHON_USE_EXC_INFO_STACK 1 #endif #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if !defined(CYTHON_VECTORCALL) #define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) #endif #define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) #if CYTHON_USE_PYLONG_INTERNALS #if PY_MAJOR_VERSION < 3 #include "longintrepr.h" #endif #undef SHIFT #undef BASE #undef MASK #ifdef SIZEOF_VOID_P enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; #endif #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED #if defined(__cplusplus) /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 * but leads to warnings with -pedantic, since it is a C++17 feature */ #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) #if __has_cpp_attribute(maybe_unused) #define CYTHON_UNUSED [[maybe_unused]] #endif #endif #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_UNUSED_VAR( const T& ) { } # else # define CYTHON_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #ifndef CYTHON_USE_CPP_STD_MOVE #if defined(__cplusplus) && (\ __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) #define CYTHON_USE_CPP_STD_MOVE 1 #else #define CYTHON_USE_CPP_STD_MOVE 0 #endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #endif #endif #if _MSC_VER < 1300 #ifdef _WIN64 typedef unsigned long long __pyx_uintptr_t; #else typedef unsigned int __pyx_uintptr_t; #endif #else #ifdef _WIN64 typedef unsigned __int64 __pyx_uintptr_t; #else typedef unsigned __int32 __pyx_uintptr_t; #endif #endif #else #include typedef uintptr_t __pyx_uintptr_t; #endif #ifndef CYTHON_FALLTHROUGH #if defined(__cplusplus) /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 * but leads to warnings with -pedantic, since it is a C++17 feature */ #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] #endif #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #if defined(__clang__) && defined(__apple_build_version__) #if __apple_build_version__ < 7000000 #undef CYTHON_FALLTHROUGH #define CYTHON_FALLTHROUGH #endif #endif #endif #ifdef __cplusplus template struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) #else #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) #endif #if CYTHON_COMPILING_IN_PYPY == 1 #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) #else #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) #endif #define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) #ifndef __cplusplus #error "Cython files generated with the C++ option must be compiled with a C++ compiler." #endif #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #else #define CYTHON_INLINE inline #endif #endif template void __Pyx_call_destructor(T& x) { x.~T(); } template class __Pyx_FakeReference { public: __Pyx_FakeReference() : ptr(NULL) { } __Pyx_FakeReference(const T& ref) : ptr(const_cast(&ref)) { } T *operator->() { return ptr; } T *operator&() { return ptr; } operator T&() { return *ptr; } template bool operator ==(const U& other) const { return *ptr == other; } template bool operator !=(const U& other) const { return *ptr != other; } template bool operator==(const __Pyx_FakeReference& other) const { return *ptr == *other.ptr; } template bool operator!=(const __Pyx_FakeReference& other) const { return *ptr != *other.ptr; } private: T *ptr; }; #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_DefaultClassType PyClass_Type #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_DefaultClassType PyType_Type #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, PyObject *code, PyObject *c, PyObject* n, PyObject *v, PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyObject *exception_table = NULL; PyObject *types_module=NULL, *code_type=NULL, *result=NULL; #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 PyObject *version_info; PyObject *py_minor_version = NULL; #endif long minor_version = 0; PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 minor_version = 11; #else if (!(version_info = PySys_GetObject("version_info"))) goto end; if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; minor_version = PyLong_AsLong(py_minor_version); Py_DECREF(py_minor_version); if (minor_version == -1 && PyErr_Occurred()) goto end; #endif if (!(types_module = PyImport_ImportModule("types"))) goto end; if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; if (minor_version <= 7) { (void)p; result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, c, n, v, fn, name, fline, lnos, fv, cell); } else if (minor_version <= 10) { result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, c, n, v, fn, name, fline, lnos, fv, cell); } else { if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); } end: Py_XDECREF(code_type); Py_XDECREF(exception_table); Py_XDECREF(types_module); if (type) { PyErr_Restore(type, value, traceback); } return result; } #ifndef CO_OPTIMIZED #define CO_OPTIMIZED 0x0001 #endif #ifndef CO_NEWLOCALS #define CO_NEWLOCALS 0x0002 #endif #ifndef CO_VARARGS #define CO_VARARGS 0x0004 #endif #ifndef CO_VARKEYWORDS #define CO_VARKEYWORDS 0x0008 #endif #ifndef CO_ASYNC_GENERATOR #define CO_ASYNC_GENERATOR 0x0200 #endif #ifndef CO_GENERATOR #define CO_GENERATOR 0x0020 #endif #ifndef CO_COROUTINE #define CO_COROUTINE 0x0080 #endif #elif PY_VERSION_HEX >= 0x030B0000 static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, PyObject *code, PyObject *c, PyObject* n, PyObject *v, PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyCodeObject *result; PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); if (!empty_bytes) return NULL; result = #if PY_VERSION_HEX >= 0x030C0000 PyUnstable_Code_NewWithPosOnlyArgs #else PyCode_NewWithPosOnlyArgs #endif (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); Py_DECREF(empty_bytes); return result; } #elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #endif #if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) #else #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) #define __Pyx_Py_Is(x, y) Py_Is(x, y) #else #define __Pyx_Py_Is(x, y) ((x) == (y)) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) #else #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) #else #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) #endif #if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) #else #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) #endif #define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) #if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) #else #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) #endif #ifndef CO_COROUTINE #define CO_COROUTINE 0x80 #endif #ifndef CO_ASYNC_GENERATOR #define CO_ASYNC_GENERATOR 0x200 #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #ifndef Py_TPFLAGS_SEQUENCE #define Py_TPFLAGS_SEQUENCE 0 #endif #ifndef Py_TPFLAGS_MAPPING #define Py_TPFLAGS_MAPPING 0 #endif #ifndef METH_STACKLESS #define METH_STACKLESS 0 #endif #if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else #if PY_VERSION_HEX >= 0x030d00A4 # define __Pyx_PyCFunctionFast PyCFunctionFast # define __Pyx_PyCFunctionFastWithKeywords PyCFunctionFastWithKeywords #else # define __Pyx_PyCFunctionFast _PyCFunctionFast # define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #endif #if CYTHON_METH_FASTCALL #define __Pyx_METH_FASTCALL METH_FASTCALL #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords #else #define __Pyx_METH_FASTCALL METH_VARARGS #define __Pyx_PyCFunction_FastCall PyCFunction #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords #endif #if CYTHON_VECTORCALL #define __pyx_vectorcallfunc vectorcallfunc #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) #elif CYTHON_BACKPORT_VECTORCALL typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames); #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) #else #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) #endif #if PY_MAJOR_VERSION >= 0x030900B1 #define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) #else #define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) #endif #define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) #elif !CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) #endif #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; } #endif static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { #if CYTHON_COMPILING_IN_LIMITED_API return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; #else return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; #endif } #define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) #if __PYX_LIMITED_VERSION_HEX < 0x030900B1 #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); #else #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) #define __Pyx_PyCMethod PyCMethod #endif #ifndef METH_METHOD #define METH_METHOD 0x200 #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyThreadState_Current PyThreadState_Get() #elif !CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_Current PyThreadState_GET() #elif PY_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() #elif PY_VERSION_HEX >= 0x03060000 #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() #elif PY_VERSION_HEX >= 0x03000000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #else #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) { void *result; result = PyModule_GetState(op); if (!result) Py_FatalError("Couldn't find the module state"); return result; } #endif #define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) #else #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) #endif #if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) #include "pythread.h" #define Py_tss_NEEDS_INIT 0 typedef int Py_tss_t; static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { *key = PyThread_create_key(); return 0; } static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); *key = Py_tss_NEEDS_INIT; return key; } static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { PyObject_Free(key); } static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { return *key != Py_tss_NEEDS_INIT; } static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { PyThread_delete_key(*key); *key = Py_tss_NEEDS_INIT; } static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { return PyThread_set_key_value(*key, value); } static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { return PyThread_get_key_value(*key); } #endif #if PY_MAJOR_VERSION < 3 #if CYTHON_COMPILING_IN_PYPY #if PYPY_VERSION_NUM < 0x07030600 #if defined(__cplusplus) && __cplusplus >= 201402L [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] #elif defined(__GNUC__) || defined(__clang__) __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) #elif defined(_MSC_VER) __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) #endif static CYTHON_INLINE int PyGILState_Check(void) { return 0; } #else // PYPY_VERSION_NUM < 0x07030600 #endif // PYPY_VERSION_NUM < 0x07030600 #else static CYTHON_INLINE int PyGILState_Check(void) { PyThreadState * tstate = _PyThreadState_Current; return tstate && (tstate == PyGILState_GetThisThreadState()); } #endif #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else #define __Pyx_PyDict_NewPresized(n) PyDict_New() #endif #if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS #define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); if (res == NULL) PyErr_Clear(); return res; } #elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) #define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError #define __Pyx_PyDict_GetItemStr PyDict_GetItem #else static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { #if CYTHON_COMPILING_IN_PYPY return PyDict_GetItem(dict, name); #else PyDictEntry *ep; PyDictObject *mp = (PyDictObject*) dict; long hash = ((PyStringObject *) name)->ob_shash; assert(hash != -1); ep = (mp->ma_lookup)(mp, name, hash); if (ep == NULL) { return NULL; } return ep->me_value; #endif } #define __Pyx_PyDict_GetItemStr PyDict_GetItem #endif #if CYTHON_USE_TYPE_SLOTS #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) #else #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next #endif #if CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) #else #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) #endif #if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 #define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ PyTypeObject *type = Py_TYPE((PyObject*)obj);\ assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ PyObject_GC_Del(obj);\ Py_DECREF(type);\ } #else #define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) #endif #if CYTHON_COMPILING_IN_LIMITED_API #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) #define __Pyx_PyUnicode_DATA(u) ((void*)u) #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) #elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #if PY_VERSION_HEX >= 0x030C0000 #define __Pyx_PyUnicode_READY(op) (0) #else #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #endif #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) #if PY_VERSION_HEX >= 0x030C0000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) #else #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) #else #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #endif #endif #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY #if !defined(PyUnicode_DecodeUnicodeEscape) #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) #endif #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) #undef PyUnicode_Contains #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #ifndef PyObject_Unicode #define PyObject_Unicode PyObject_Str #endif #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_PySequence_ListKeepNew(obj)\ (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) #else #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) #endif #if PY_VERSION_HEX >= 0x030900A4 #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) #else #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) #endif #if CYTHON_ASSUME_SAFE_MACROS #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) #else #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) #endif #if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) #else static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { PyObject *module = PyImport_AddModule(name); Py_XINCREF(module); return module; } #endif #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define __Pyx_Py3Int_Check(op) PyLong_Check(op) #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #else #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef __Pyx_PyAsyncMethodsStruct typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #endif #if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) #if !defined(_USE_MATH_DEFINES) #define _USE_MATH_DEFINES #endif #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } #ifdef CYTHON_EXTERN_C #undef __PYX_EXTERN_C #define __PYX_EXTERN_C CYTHON_EXTERN_C #elif defined(__PYX_EXTERN_C) #ifdef _MSC_VER #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") #else #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. #endif #else #define __PYX_EXTERN_C extern "C++" #endif #define __PYX_HAVE__skfmm__pheap #define __PYX_HAVE_API__skfmm__pheap /* Early includes */ #include "ios" #include "new" #include "stdexcept" #include "typeinfo" #include "heap.h" #ifdef _OPENMP #include #endif /* _OPENMP */ #if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { return (size_t) i < (size_t) limit; } #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) #define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #if CYTHON_USE_PYLONG_INTERNALS #if PY_VERSION_HEX >= 0x030C00A7 #ifndef _PyLong_SIGN_MASK #define _PyLong_SIGN_MASK 3 #endif #ifndef _PyLong_NON_SIZE_BITS #define _PyLong_NON_SIZE_BITS 3 #endif #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) #define __Pyx_PyLong_SignedDigitCount(x)\ ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) #else #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) #endif typedef Py_ssize_t __Pyx_compact_pylong; typedef size_t __Pyx_compact_upylong; #else #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) #define __Pyx_PyLong_CompactValue(x)\ ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) typedef sdigit __Pyx_compact_pylong; typedef digit __Pyx_compact_upylong; #endif #if PY_VERSION_HEX >= 0x030C00A5 #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) #else #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) #endif #endif #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII #include static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = (char) c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #include static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } #if !CYTHON_USE_MODULE_STATE static PyObject *__pyx_m = NULL; #endif static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm = __FILE__; static const char *__pyx_filename; /* #### Code section: filename_table ### */ static const char *__pyx_f[] = { "", "pheap.pyx", }; /* #### Code section: utility_code_proto_before_types ### */ /* ForceInitThreads.proto */ #ifndef __PYX_FORCE_INIT_THREADS #define __PYX_FORCE_INIT_THREADS 0 #endif /* #### Code section: numeric_typedefs ### */ /* #### Code section: complex_type_declarations ### */ /* #### Code section: type_declarations ### */ /*--- Type declarations ---*/ struct __pyx_obj_5skfmm_5pheap_pheap; /* "skfmm/pheap.pyx":15 * double peek() except + * * cdef class pheap: # <<<<<<<<<<<<<< * cdef heap *thisptr * def __cinit__(self, n, self_test): */ struct __pyx_obj_5skfmm_5pheap_pheap { PyObject_HEAD heap *thisptr; }; /* #### Code section: utility_code_proto ### */ /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, Py_ssize_t); void (*DECREF)(void*, PyObject*, Py_ssize_t); void (*GOTREF)(void*, PyObject*, Py_ssize_t); void (*GIVEREF)(void*, PyObject*, Py_ssize_t); void* (*SetupContext)(const char*, Py_ssize_t, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ } #define __Pyx_RefNannyFinishContextNogil() {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __Pyx_RefNannyFinishContext();\ PyGILState_Release(__pyx_gilstate_save);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() #endif #define __Pyx_RefNannyFinishContextNogil() {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __Pyx_RefNannyFinishContext();\ PyGILState_Release(__pyx_gilstate_save);\ } #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContextNogil() #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_Py_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; Py_XDECREF(tmp);\ } while (0) #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* PyErrExceptionMatches.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); #else #define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) #endif /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; #if PY_VERSION_HEX >= 0x030C00A6 #define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) #define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) #else #define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) #define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) #endif #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) #define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() #endif /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 #define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) #else #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #endif #else #define __Pyx_PyErr_Clear() PyErr_Clear() #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* PyObjectGetAttrStrNoError.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* TupleAndListFromArray.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); #endif /* IncludeStringH.proto */ #include /* BytesEquals.proto */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); /* UnicodeEquals.proto */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /* fastcall.proto */ #if CYTHON_AVOID_BORROWED_REFS #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) #elif CYTHON_ASSUME_SAFE_MACROS #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) #else #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) #endif #if CYTHON_AVOID_BORROWED_REFS #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) #else #define __Pyx_Arg_NewRef_VARARGS(arg) arg #define __Pyx_Arg_XDECREF_VARARGS(arg) #endif #define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) #define __Pyx_KwValues_VARARGS(args, nargs) NULL #define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) #define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) #if CYTHON_METH_FASTCALL #define __Pyx_Arg_FASTCALL(args, i) args[i] #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); #else #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) #endif #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs to have the same reference counting */ #define __Pyx_Arg_XDECREF_FASTCALL(arg) #else #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) #endif #if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS #define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) #define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) #else #define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) #define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) #endif /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /* KeywordStringCheck.proto */ static int __Pyx_CheckKeywordStrings(PyObject *kw, const char* function_name, int kw_allowed); /* RaiseException.proto */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /* IncludeStructmemberH.proto */ #include /* FixUpExtensionType.proto */ #if CYTHON_USE_TYPE_SPECS static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); #endif /* PyFunctionFastCall.proto */ #if CYTHON_FAST_PYCALL #if !CYTHON_VECTORCALL #define __Pyx_PyFunction_FastCall(func, args, nargs)\ __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); #endif #define __Pyx_BUILD_ASSERT_EXPR(cond)\ (sizeof(char [1 - 2*!(cond)]) - 1) #ifndef Py_MEMBER_SIZE #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) #endif #if !CYTHON_VECTORCALL #if PY_VERSION_HEX >= 0x03080000 #include "frameobject.h" #if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API #ifndef Py_BUILD_CORE #define Py_BUILD_CORE 1 #endif #include "internal/pycore_frame.h" #endif #define __Pxy_PyFrame_Initialize_Offsets() #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) #else static size_t __pyx_pyframe_localsplus_offset = 0; #include "frameobject.h" #define __Pxy_PyFrame_Initialize_Offsets()\ ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) #define __Pyx_PyFrame_GetLocalsplus(frame)\ (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) #endif #endif #endif /* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif /* PyObjectCallMethO.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); #endif /* PyObjectFastCall.proto */ #define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); /* PyObjectCallNoArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); /* PyObjectCallOneArg.proto */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); /* PyObjectGetMethod.proto */ static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); /* PyObjectCallMethod0.proto */ static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); /* ValidateBasesTuple.proto */ #if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases); #endif /* PyType_Ready.proto */ CYTHON_UNUSED static int __Pyx_PyType_Ready(PyTypeObject *t); /* PyObject_GenericGetAttrNoDict.proto */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr #endif /* PyObject_GenericGetAttr.proto */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); #else #define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr #endif /* SetupReduce.proto */ #if !CYTHON_COMPILING_IN_LIMITED_API static int __Pyx_setup_reduce(PyObject* type_obj); #endif /* FetchSharedCythonModule.proto */ static PyObject *__Pyx_FetchSharedCythonABIModule(void); /* FetchCommonType.proto */ #if !CYTHON_USE_TYPE_SPECS static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); #else static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); #endif /* PyMethodNew.proto */ #if CYTHON_COMPILING_IN_LIMITED_API static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; CYTHON_UNUSED_VAR(typ); if (!self) return __Pyx_NewRef(func); typesModule = PyImport_ImportModule("types"); if (!typesModule) return NULL; methodType = PyObject_GetAttrString(typesModule, "MethodType"); Py_DECREF(typesModule); if (!methodType) return NULL; result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); Py_DECREF(methodType); return result; } #elif PY_MAJOR_VERSION >= 3 static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { CYTHON_UNUSED_VAR(typ); if (!self) return __Pyx_NewRef(func); return PyMethod_New(func, self); } #else #define __Pyx_PyMethod_New PyMethod_New #endif /* PyVectorcallFastCallDict.proto */ #if CYTHON_METH_FASTCALL static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); #endif /* CythonFunctionShared.proto */ #define __Pyx_CyFunction_USED #define __Pyx_CYFUNCTION_STATICMETHOD 0x01 #define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 #define __Pyx_CYFUNCTION_CCLASS 0x04 #define __Pyx_CYFUNCTION_COROUTINE 0x08 #define __Pyx_CyFunction_GetClosure(f)\ (((__pyx_CyFunctionObject *) (f))->func_closure) #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyFunction_GetClassObj(f)\ (((__pyx_CyFunctionObject *) (f))->func_classobj) #else #define __Pyx_CyFunction_GetClassObj(f)\ ((PyObject*) ((PyCMethodObject *) (f))->mm_class) #endif #define __Pyx_CyFunction_SetClassObj(f, classobj)\ __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) #define __Pyx_CyFunction_Defaults(type, f)\ ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) #define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) typedef struct { #if CYTHON_COMPILING_IN_LIMITED_API PyObject_HEAD PyObject *func; #elif PY_VERSION_HEX < 0x030900B1 PyCFunctionObject func; #else PyCMethodObject func; #endif #if CYTHON_BACKPORT_VECTORCALL __pyx_vectorcallfunc func_vectorcall; #endif #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API PyObject *func_weakreflist; #endif PyObject *func_dict; PyObject *func_name; PyObject *func_qualname; PyObject *func_doc; PyObject *func_globals; PyObject *func_code; PyObject *func_closure; #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API PyObject *func_classobj; #endif void *defaults; int defaults_pyobjects; size_t defaults_size; int flags; PyObject *defaults_tuple; PyObject *defaults_kwdict; PyObject *(*defaults_getter)(PyObject *); PyObject *func_annotations; PyObject *func_is_coroutine; } __pyx_CyFunctionObject; #undef __Pyx_CyOrPyCFunction_Check #define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) #define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) #define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); #undef __Pyx_IsSameCFunction #define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject *globals, PyObject* code); static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, size_t size, int pyobjects); static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, PyObject *tuple); static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, PyObject *dict); static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, PyObject *dict); static int __pyx_CyFunction_init(PyObject *module); #if CYTHON_METH_FASTCALL static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); #if CYTHON_BACKPORT_VECTORCALL #define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) #else #define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) #endif #endif /* CythonFunction.proto */ static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject *globals, PyObject* code); /* PyDictVersioning.proto */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS #define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) #define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ (version_var) = __PYX_GET_DICT_VERSION(dict);\ (cache_var) = (value); #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ (VAR) = __pyx_dict_cached_value;\ } else {\ (VAR) = __pyx_dict_cached_value = (LOOKUP);\ __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ }\ } static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); #else #define __PYX_GET_DICT_VERSION(dict) (0) #define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) #define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); #endif /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) #else static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); #endif /* CodeObjectCache.proto */ #if !CYTHON_COMPILING_IN_LIMITED_API typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); #endif /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* GCCDiagnostics.proto */ #if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) #define __Pyx_HAS_GCC_DIAGNOSTIC #endif /* CppExceptionConversion.proto */ #ifndef __Pyx_CppExn2PyErr #include #include #include #include static void __Pyx_CppExn2PyErr() { try { if (PyErr_Occurred()) ; // let the latest Python exn pass through and ignore the current one else throw; } catch (const std::bad_alloc& exn) { PyErr_SetString(PyExc_MemoryError, exn.what()); } catch (const std::bad_cast& exn) { PyErr_SetString(PyExc_TypeError, exn.what()); } catch (const std::bad_typeid& exn) { PyErr_SetString(PyExc_TypeError, exn.what()); } catch (const std::domain_error& exn) { PyErr_SetString(PyExc_ValueError, exn.what()); } catch (const std::invalid_argument& exn) { PyErr_SetString(PyExc_ValueError, exn.what()); } catch (const std::ios_base::failure& exn) { PyErr_SetString(PyExc_IOError, exn.what()); } catch (const std::out_of_range& exn) { PyErr_SetString(PyExc_IndexError, exn.what()); } catch (const std::overflow_error& exn) { PyErr_SetString(PyExc_OverflowError, exn.what()); } catch (const std::range_error& exn) { PyErr_SetString(PyExc_ArithmeticError, exn.what()); } catch (const std::underflow_error& exn) { PyErr_SetString(PyExc_ArithmeticError, exn.what()); } catch (const std::exception& exn) { PyErr_SetString(PyExc_RuntimeError, exn.what()); } catch (...) { PyErr_SetString(PyExc_RuntimeError, "Unknown exception"); } } #endif /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); /* FormatTypeName.proto */ #if CYTHON_COMPILING_IN_LIMITED_API typedef PyObject *__Pyx_TypeName; #define __Pyx_FMT_TYPENAME "%U" static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); #define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) #else typedef const char *__Pyx_TypeName; #define __Pyx_FMT_TYPENAME "%.200s" #define __Pyx_PyType_GetName(tp) ((tp)->tp_name) #define __Pyx_DECREF_TypeName(obj) #endif /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* FastTypeChecks.proto */ #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) #define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); #else #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) #define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) #define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) #endif #define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) /* CheckBinaryVersion.proto */ static unsigned long __Pyx_get_runtime_version(void); static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* #### Code section: module_declarations ### */ /* Module declarations from "libcpp" */ /* Module declarations from "skfmm.pheap" */ /* #### Code section: typeinfo ### */ /* #### Code section: before_global_var ### */ #define __Pyx_MODULE_NAME "skfmm.pheap" extern int __pyx_module_is_main_skfmm__pheap; int __pyx_module_is_main_skfmm__pheap = 0; /* Implementation of "skfmm.pheap" */ /* #### Code section: global_var ### */ static PyObject *__pyx_builtin_TypeError; /* #### Code section: string_decls ### */ static const char __pyx_k_n[] = "n"; static const char __pyx_k_gc[] = "gc"; static const char __pyx_k__12[] = "?"; static const char __pyx_k_pop[] = "_pop"; static const char __pyx_k_set[] = "_set"; static const char __pyx_k_addr[] = "addr"; static const char __pyx_k_dist[] = "dist"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_name[] = "__name__"; static const char __pyx_k_peek[] = "_peek"; static const char __pyx_k_push[] = "_push"; static const char __pyx_k_self[] = "self"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_empty[] = "_empty"; static const char __pyx_k_pheap[] = "pheap"; static const char __pyx_k_value[] = "value"; static const char __pyx_k_enable[] = "enable"; static const char __pyx_k_reduce[] = "__reduce__"; static const char __pyx_k_disable[] = "disable"; static const char __pyx_k_getstate[] = "__getstate__"; static const char __pyx_k_setstate[] = "__setstate__"; static const char __pyx_k_TypeError[] = "TypeError"; static const char __pyx_k_isenabled[] = "isenabled"; static const char __pyx_k_pheap_pyx[] = "pheap.pyx"; static const char __pyx_k_pyx_state[] = "__pyx_state"; static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; static const char __pyx_k_self_test[] = "self_test"; static const char __pyx_k_pheap__pop[] = "pheap._pop"; static const char __pyx_k_pheap__set[] = "pheap._set"; static const char __pyx_k_pheap__peek[] = "pheap._peek"; static const char __pyx_k_pheap__push[] = "pheap._push"; static const char __pyx_k_skfmm_pheap[] = "skfmm.pheap"; static const char __pyx_k_is_coroutine[] = "_is_coroutine"; static const char __pyx_k_pheap__empty[] = "pheap._empty"; static const char __pyx_k_stringsource[] = ""; static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_pheap___reduce_cython[] = "pheap.__reduce_cython__"; static const char __pyx_k_pheap___setstate_cython[] = "pheap.__setstate_cython__"; static const char __pyx_k_no_default___reduce___due_to_non[] = "no default __reduce__ due to non-trivial __cinit__"; /* #### Code section: decls ### */ static int __pyx_pf_5skfmm_5pheap_5pheap___cinit__(struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self, PyObject *__pyx_v_n, PyObject *__pyx_v_self_test); /* proto */ static void __pyx_pf_5skfmm_5pheap_5pheap_2__dealloc__(struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_5skfmm_5pheap_5pheap_4_push(struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self, PyObject *__pyx_v_addr, PyObject *__pyx_v_value); /* proto */ static PyObject *__pyx_pf_5skfmm_5pheap_5pheap_6_pop(struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_5skfmm_5pheap_5pheap_8_set(struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self, PyObject *__pyx_v_addr, PyObject *__pyx_v_value); /* proto */ static PyObject *__pyx_pf_5skfmm_5pheap_5pheap_10_empty(struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_5skfmm_5pheap_5pheap_12_peek(struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_5skfmm_5pheap_5pheap_14__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_5skfmm_5pheap_5pheap_16__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ static PyObject *__pyx_tp_new_5skfmm_5pheap_pheap(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ /* #### Code section: late_includes ### */ /* #### Code section: module_state ### */ typedef struct { PyObject *__pyx_d; PyObject *__pyx_b; PyObject *__pyx_cython_runtime; PyObject *__pyx_empty_tuple; PyObject *__pyx_empty_bytes; PyObject *__pyx_empty_unicode; #ifdef __Pyx_CyFunction_USED PyTypeObject *__pyx_CyFunctionType; #endif #ifdef __Pyx_FusedFunction_USED PyTypeObject *__pyx_FusedFunctionType; #endif #ifdef __Pyx_Generator_USED PyTypeObject *__pyx_GeneratorType; #endif #ifdef __Pyx_IterableCoroutine_USED PyTypeObject *__pyx_IterableCoroutineType; #endif #ifdef __Pyx_Coroutine_USED PyTypeObject *__pyx_CoroutineAwaitType; #endif #ifdef __Pyx_Coroutine_USED PyTypeObject *__pyx_CoroutineType; #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE PyObject *__pyx_type_5skfmm_5pheap_pheap; #endif PyTypeObject *__pyx_ptype_5skfmm_5pheap_pheap; PyObject *__pyx_n_s_TypeError; PyObject *__pyx_n_s__12; PyObject *__pyx_n_s_addr; PyObject *__pyx_n_s_asyncio_coroutines; PyObject *__pyx_n_s_cline_in_traceback; PyObject *__pyx_kp_u_disable; PyObject *__pyx_n_s_dist; PyObject *__pyx_n_s_empty; PyObject *__pyx_kp_u_enable; PyObject *__pyx_kp_u_gc; PyObject *__pyx_n_s_getstate; PyObject *__pyx_n_s_is_coroutine; PyObject *__pyx_kp_u_isenabled; PyObject *__pyx_n_s_main; PyObject *__pyx_n_s_n; PyObject *__pyx_n_s_name; PyObject *__pyx_kp_s_no_default___reduce___due_to_non; PyObject *__pyx_n_s_peek; PyObject *__pyx_n_s_pheap; PyObject *__pyx_n_s_pheap___reduce_cython; PyObject *__pyx_n_s_pheap___setstate_cython; PyObject *__pyx_n_s_pheap__empty; PyObject *__pyx_n_s_pheap__peek; PyObject *__pyx_n_s_pheap__pop; PyObject *__pyx_n_s_pheap__push; PyObject *__pyx_n_s_pheap__set; PyObject *__pyx_kp_s_pheap_pyx; PyObject *__pyx_n_s_pop; PyObject *__pyx_n_s_push; PyObject *__pyx_n_s_pyx_state; PyObject *__pyx_n_s_reduce; PyObject *__pyx_n_s_reduce_cython; PyObject *__pyx_n_s_reduce_ex; PyObject *__pyx_n_s_self; PyObject *__pyx_n_s_self_test; PyObject *__pyx_n_s_set; PyObject *__pyx_n_s_setstate; PyObject *__pyx_n_s_setstate_cython; PyObject *__pyx_n_s_skfmm_pheap; PyObject *__pyx_kp_s_stringsource; PyObject *__pyx_n_s_test; PyObject *__pyx_n_s_value; PyObject *__pyx_tuple_; PyObject *__pyx_tuple__5; PyObject *__pyx_tuple__7; PyObject *__pyx_tuple__10; PyObject *__pyx_codeobj__2; PyObject *__pyx_codeobj__3; PyObject *__pyx_codeobj__4; PyObject *__pyx_codeobj__6; PyObject *__pyx_codeobj__8; PyObject *__pyx_codeobj__9; PyObject *__pyx_codeobj__11; } __pyx_mstate; #if CYTHON_USE_MODULE_STATE #ifdef __cplusplus namespace { extern struct PyModuleDef __pyx_moduledef; } /* anonymous namespace */ #else static struct PyModuleDef __pyx_moduledef; #endif #define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) #define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) #define __pyx_m (PyState_FindModule(&__pyx_moduledef)) #else static __pyx_mstate __pyx_mstate_global_static = #ifdef __cplusplus {}; #else {0}; #endif static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; #endif /* #### Code section: module_state_clear ### */ #if CYTHON_USE_MODULE_STATE static int __pyx_m_clear(PyObject *m) { __pyx_mstate *clear_module_state = __pyx_mstate(m); if (!clear_module_state) return 0; Py_CLEAR(clear_module_state->__pyx_d); Py_CLEAR(clear_module_state->__pyx_b); Py_CLEAR(clear_module_state->__pyx_cython_runtime); Py_CLEAR(clear_module_state->__pyx_empty_tuple); Py_CLEAR(clear_module_state->__pyx_empty_bytes); Py_CLEAR(clear_module_state->__pyx_empty_unicode); #ifdef __Pyx_CyFunction_USED Py_CLEAR(clear_module_state->__pyx_CyFunctionType); #endif #ifdef __Pyx_FusedFunction_USED Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); #endif Py_CLEAR(clear_module_state->__pyx_ptype_5skfmm_5pheap_pheap); Py_CLEAR(clear_module_state->__pyx_type_5skfmm_5pheap_pheap); Py_CLEAR(clear_module_state->__pyx_n_s_TypeError); Py_CLEAR(clear_module_state->__pyx_n_s__12); Py_CLEAR(clear_module_state->__pyx_n_s_addr); Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); Py_CLEAR(clear_module_state->__pyx_kp_u_disable); Py_CLEAR(clear_module_state->__pyx_n_s_dist); Py_CLEAR(clear_module_state->__pyx_n_s_empty); Py_CLEAR(clear_module_state->__pyx_kp_u_enable); Py_CLEAR(clear_module_state->__pyx_kp_u_gc); Py_CLEAR(clear_module_state->__pyx_n_s_getstate); Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); Py_CLEAR(clear_module_state->__pyx_kp_u_isenabled); Py_CLEAR(clear_module_state->__pyx_n_s_main); Py_CLEAR(clear_module_state->__pyx_n_s_n); Py_CLEAR(clear_module_state->__pyx_n_s_name); Py_CLEAR(clear_module_state->__pyx_kp_s_no_default___reduce___due_to_non); Py_CLEAR(clear_module_state->__pyx_n_s_peek); Py_CLEAR(clear_module_state->__pyx_n_s_pheap); Py_CLEAR(clear_module_state->__pyx_n_s_pheap___reduce_cython); Py_CLEAR(clear_module_state->__pyx_n_s_pheap___setstate_cython); Py_CLEAR(clear_module_state->__pyx_n_s_pheap__empty); Py_CLEAR(clear_module_state->__pyx_n_s_pheap__peek); Py_CLEAR(clear_module_state->__pyx_n_s_pheap__pop); Py_CLEAR(clear_module_state->__pyx_n_s_pheap__push); Py_CLEAR(clear_module_state->__pyx_n_s_pheap__set); Py_CLEAR(clear_module_state->__pyx_kp_s_pheap_pyx); Py_CLEAR(clear_module_state->__pyx_n_s_pop); Py_CLEAR(clear_module_state->__pyx_n_s_push); Py_CLEAR(clear_module_state->__pyx_n_s_pyx_state); Py_CLEAR(clear_module_state->__pyx_n_s_reduce); Py_CLEAR(clear_module_state->__pyx_n_s_reduce_cython); Py_CLEAR(clear_module_state->__pyx_n_s_reduce_ex); Py_CLEAR(clear_module_state->__pyx_n_s_self); Py_CLEAR(clear_module_state->__pyx_n_s_self_test); Py_CLEAR(clear_module_state->__pyx_n_s_set); Py_CLEAR(clear_module_state->__pyx_n_s_setstate); Py_CLEAR(clear_module_state->__pyx_n_s_setstate_cython); Py_CLEAR(clear_module_state->__pyx_n_s_skfmm_pheap); Py_CLEAR(clear_module_state->__pyx_kp_s_stringsource); Py_CLEAR(clear_module_state->__pyx_n_s_test); Py_CLEAR(clear_module_state->__pyx_n_s_value); Py_CLEAR(clear_module_state->__pyx_tuple_); Py_CLEAR(clear_module_state->__pyx_tuple__5); Py_CLEAR(clear_module_state->__pyx_tuple__7); Py_CLEAR(clear_module_state->__pyx_tuple__10); Py_CLEAR(clear_module_state->__pyx_codeobj__2); Py_CLEAR(clear_module_state->__pyx_codeobj__3); Py_CLEAR(clear_module_state->__pyx_codeobj__4); Py_CLEAR(clear_module_state->__pyx_codeobj__6); Py_CLEAR(clear_module_state->__pyx_codeobj__8); Py_CLEAR(clear_module_state->__pyx_codeobj__9); Py_CLEAR(clear_module_state->__pyx_codeobj__11); return 0; } #endif /* #### Code section: module_state_traverse ### */ #if CYTHON_USE_MODULE_STATE static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { __pyx_mstate *traverse_module_state = __pyx_mstate(m); if (!traverse_module_state) return 0; Py_VISIT(traverse_module_state->__pyx_d); Py_VISIT(traverse_module_state->__pyx_b); Py_VISIT(traverse_module_state->__pyx_cython_runtime); Py_VISIT(traverse_module_state->__pyx_empty_tuple); Py_VISIT(traverse_module_state->__pyx_empty_bytes); Py_VISIT(traverse_module_state->__pyx_empty_unicode); #ifdef __Pyx_CyFunction_USED Py_VISIT(traverse_module_state->__pyx_CyFunctionType); #endif #ifdef __Pyx_FusedFunction_USED Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); #endif Py_VISIT(traverse_module_state->__pyx_ptype_5skfmm_5pheap_pheap); Py_VISIT(traverse_module_state->__pyx_type_5skfmm_5pheap_pheap); Py_VISIT(traverse_module_state->__pyx_n_s_TypeError); Py_VISIT(traverse_module_state->__pyx_n_s__12); Py_VISIT(traverse_module_state->__pyx_n_s_addr); Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); Py_VISIT(traverse_module_state->__pyx_kp_u_disable); Py_VISIT(traverse_module_state->__pyx_n_s_dist); Py_VISIT(traverse_module_state->__pyx_n_s_empty); Py_VISIT(traverse_module_state->__pyx_kp_u_enable); Py_VISIT(traverse_module_state->__pyx_kp_u_gc); Py_VISIT(traverse_module_state->__pyx_n_s_getstate); Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); Py_VISIT(traverse_module_state->__pyx_kp_u_isenabled); Py_VISIT(traverse_module_state->__pyx_n_s_main); Py_VISIT(traverse_module_state->__pyx_n_s_n); Py_VISIT(traverse_module_state->__pyx_n_s_name); Py_VISIT(traverse_module_state->__pyx_kp_s_no_default___reduce___due_to_non); Py_VISIT(traverse_module_state->__pyx_n_s_peek); Py_VISIT(traverse_module_state->__pyx_n_s_pheap); Py_VISIT(traverse_module_state->__pyx_n_s_pheap___reduce_cython); Py_VISIT(traverse_module_state->__pyx_n_s_pheap___setstate_cython); Py_VISIT(traverse_module_state->__pyx_n_s_pheap__empty); Py_VISIT(traverse_module_state->__pyx_n_s_pheap__peek); Py_VISIT(traverse_module_state->__pyx_n_s_pheap__pop); Py_VISIT(traverse_module_state->__pyx_n_s_pheap__push); Py_VISIT(traverse_module_state->__pyx_n_s_pheap__set); Py_VISIT(traverse_module_state->__pyx_kp_s_pheap_pyx); Py_VISIT(traverse_module_state->__pyx_n_s_pop); Py_VISIT(traverse_module_state->__pyx_n_s_push); Py_VISIT(traverse_module_state->__pyx_n_s_pyx_state); Py_VISIT(traverse_module_state->__pyx_n_s_reduce); Py_VISIT(traverse_module_state->__pyx_n_s_reduce_cython); Py_VISIT(traverse_module_state->__pyx_n_s_reduce_ex); Py_VISIT(traverse_module_state->__pyx_n_s_self); Py_VISIT(traverse_module_state->__pyx_n_s_self_test); Py_VISIT(traverse_module_state->__pyx_n_s_set); Py_VISIT(traverse_module_state->__pyx_n_s_setstate); Py_VISIT(traverse_module_state->__pyx_n_s_setstate_cython); Py_VISIT(traverse_module_state->__pyx_n_s_skfmm_pheap); Py_VISIT(traverse_module_state->__pyx_kp_s_stringsource); Py_VISIT(traverse_module_state->__pyx_n_s_test); Py_VISIT(traverse_module_state->__pyx_n_s_value); Py_VISIT(traverse_module_state->__pyx_tuple_); Py_VISIT(traverse_module_state->__pyx_tuple__5); Py_VISIT(traverse_module_state->__pyx_tuple__7); Py_VISIT(traverse_module_state->__pyx_tuple__10); Py_VISIT(traverse_module_state->__pyx_codeobj__2); Py_VISIT(traverse_module_state->__pyx_codeobj__3); Py_VISIT(traverse_module_state->__pyx_codeobj__4); Py_VISIT(traverse_module_state->__pyx_codeobj__6); Py_VISIT(traverse_module_state->__pyx_codeobj__8); Py_VISIT(traverse_module_state->__pyx_codeobj__9); Py_VISIT(traverse_module_state->__pyx_codeobj__11); return 0; } #endif /* #### Code section: module_state_defines ### */ #define __pyx_d __pyx_mstate_global->__pyx_d #define __pyx_b __pyx_mstate_global->__pyx_b #define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime #define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple #define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes #define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode #ifdef __Pyx_CyFunction_USED #define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType #endif #ifdef __Pyx_FusedFunction_USED #define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType #endif #ifdef __Pyx_Generator_USED #define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType #endif #ifdef __Pyx_IterableCoroutine_USED #define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType #endif #ifdef __Pyx_Coroutine_USED #define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType #endif #ifdef __Pyx_Coroutine_USED #define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType #endif #if CYTHON_USE_MODULE_STATE #endif #if CYTHON_USE_MODULE_STATE #define __pyx_type_5skfmm_5pheap_pheap __pyx_mstate_global->__pyx_type_5skfmm_5pheap_pheap #endif #define __pyx_ptype_5skfmm_5pheap_pheap __pyx_mstate_global->__pyx_ptype_5skfmm_5pheap_pheap #define __pyx_n_s_TypeError __pyx_mstate_global->__pyx_n_s_TypeError #define __pyx_n_s__12 __pyx_mstate_global->__pyx_n_s__12 #define __pyx_n_s_addr __pyx_mstate_global->__pyx_n_s_addr #define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines #define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback #define __pyx_kp_u_disable __pyx_mstate_global->__pyx_kp_u_disable #define __pyx_n_s_dist __pyx_mstate_global->__pyx_n_s_dist #define __pyx_n_s_empty __pyx_mstate_global->__pyx_n_s_empty #define __pyx_kp_u_enable __pyx_mstate_global->__pyx_kp_u_enable #define __pyx_kp_u_gc __pyx_mstate_global->__pyx_kp_u_gc #define __pyx_n_s_getstate __pyx_mstate_global->__pyx_n_s_getstate #define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine #define __pyx_kp_u_isenabled __pyx_mstate_global->__pyx_kp_u_isenabled #define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main #define __pyx_n_s_n __pyx_mstate_global->__pyx_n_s_n #define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name #define __pyx_kp_s_no_default___reduce___due_to_non __pyx_mstate_global->__pyx_kp_s_no_default___reduce___due_to_non #define __pyx_n_s_peek __pyx_mstate_global->__pyx_n_s_peek #define __pyx_n_s_pheap __pyx_mstate_global->__pyx_n_s_pheap #define __pyx_n_s_pheap___reduce_cython __pyx_mstate_global->__pyx_n_s_pheap___reduce_cython #define __pyx_n_s_pheap___setstate_cython __pyx_mstate_global->__pyx_n_s_pheap___setstate_cython #define __pyx_n_s_pheap__empty __pyx_mstate_global->__pyx_n_s_pheap__empty #define __pyx_n_s_pheap__peek __pyx_mstate_global->__pyx_n_s_pheap__peek #define __pyx_n_s_pheap__pop __pyx_mstate_global->__pyx_n_s_pheap__pop #define __pyx_n_s_pheap__push __pyx_mstate_global->__pyx_n_s_pheap__push #define __pyx_n_s_pheap__set __pyx_mstate_global->__pyx_n_s_pheap__set #define __pyx_kp_s_pheap_pyx __pyx_mstate_global->__pyx_kp_s_pheap_pyx #define __pyx_n_s_pop __pyx_mstate_global->__pyx_n_s_pop #define __pyx_n_s_push __pyx_mstate_global->__pyx_n_s_push #define __pyx_n_s_pyx_state __pyx_mstate_global->__pyx_n_s_pyx_state #define __pyx_n_s_reduce __pyx_mstate_global->__pyx_n_s_reduce #define __pyx_n_s_reduce_cython __pyx_mstate_global->__pyx_n_s_reduce_cython #define __pyx_n_s_reduce_ex __pyx_mstate_global->__pyx_n_s_reduce_ex #define __pyx_n_s_self __pyx_mstate_global->__pyx_n_s_self #define __pyx_n_s_self_test __pyx_mstate_global->__pyx_n_s_self_test #define __pyx_n_s_set __pyx_mstate_global->__pyx_n_s_set #define __pyx_n_s_setstate __pyx_mstate_global->__pyx_n_s_setstate #define __pyx_n_s_setstate_cython __pyx_mstate_global->__pyx_n_s_setstate_cython #define __pyx_n_s_skfmm_pheap __pyx_mstate_global->__pyx_n_s_skfmm_pheap #define __pyx_kp_s_stringsource __pyx_mstate_global->__pyx_kp_s_stringsource #define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test #define __pyx_n_s_value __pyx_mstate_global->__pyx_n_s_value #define __pyx_tuple_ __pyx_mstate_global->__pyx_tuple_ #define __pyx_tuple__5 __pyx_mstate_global->__pyx_tuple__5 #define __pyx_tuple__7 __pyx_mstate_global->__pyx_tuple__7 #define __pyx_tuple__10 __pyx_mstate_global->__pyx_tuple__10 #define __pyx_codeobj__2 __pyx_mstate_global->__pyx_codeobj__2 #define __pyx_codeobj__3 __pyx_mstate_global->__pyx_codeobj__3 #define __pyx_codeobj__4 __pyx_mstate_global->__pyx_codeobj__4 #define __pyx_codeobj__6 __pyx_mstate_global->__pyx_codeobj__6 #define __pyx_codeobj__8 __pyx_mstate_global->__pyx_codeobj__8 #define __pyx_codeobj__9 __pyx_mstate_global->__pyx_codeobj__9 #define __pyx_codeobj__11 __pyx_mstate_global->__pyx_codeobj__11 /* #### Code section: module_code ### */ /* "skfmm/pheap.pyx":17 * cdef class pheap: * cdef heap *thisptr * def __cinit__(self, n, self_test): # <<<<<<<<<<<<<< * self.thisptr = new heap(n, self_test) * */ /* Python wrapper */ static int __pyx_pw_5skfmm_5pheap_5pheap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_5skfmm_5pheap_5pheap_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_n = 0; PyObject *__pyx_v_self_test = 0; CYTHON_UNUSED Py_ssize_t __pyx_nargs; CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[2] = {0,0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1; #endif __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_n,&__pyx_n_s_self_test,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 2: values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_VARARGS(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_n)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 17, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_VARARGS(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_self_test)) != 0)) { (void)__Pyx_Arg_NewRef_VARARGS(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 17, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); __PYX_ERR(1, 17, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__cinit__") < 0)) __PYX_ERR(1, 17, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 2)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_VARARGS(__pyx_args, 0); values[1] = __Pyx_Arg_VARARGS(__pyx_args, 1); } __pyx_v_n = values[0]; __pyx_v_self_test = values[1]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, __pyx_nargs); __PYX_ERR(1, 17, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); } } __Pyx_AddTraceback("skfmm.pheap.pheap.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_5skfmm_5pheap_5pheap___cinit__(((struct __pyx_obj_5skfmm_5pheap_pheap *)__pyx_v_self), __pyx_v_n, __pyx_v_self_test); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_VARARGS(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_5skfmm_5pheap_5pheap___cinit__(struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self, PyObject *__pyx_v_n, PyObject *__pyx_v_self_test) { int __pyx_r; int __pyx_t_1; bool __pyx_t_2; heap *__pyx_t_3; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; /* "skfmm/pheap.pyx":18 * cdef heap *thisptr * def __cinit__(self, n, self_test): * self.thisptr = new heap(n, self_test) # <<<<<<<<<<<<<< * * def __dealloc__(self): */ __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_n); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 18, __pyx_L1_error) __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_self_test); if (unlikely((__pyx_t_2 == ((bool)-1)) && PyErr_Occurred())) __PYX_ERR(1, 18, __pyx_L1_error) try { __pyx_t_3 = new heap(__pyx_t_1, __pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); __PYX_ERR(1, 18, __pyx_L1_error) } __pyx_v_self->thisptr = __pyx_t_3; /* "skfmm/pheap.pyx":17 * cdef class pheap: * cdef heap *thisptr * def __cinit__(self, n, self_test): # <<<<<<<<<<<<<< * self.thisptr = new heap(n, self_test) * */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("skfmm.pheap.pheap.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; return __pyx_r; } /* "skfmm/pheap.pyx":20 * self.thisptr = new heap(n, self_test) * * def __dealloc__(self): # <<<<<<<<<<<<<< * del self.thisptr * */ /* Python wrapper */ static void __pyx_pw_5skfmm_5pheap_5pheap_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ static void __pyx_pw_5skfmm_5pheap_5pheap_3__dealloc__(PyObject *__pyx_v_self) { CYTHON_UNUSED PyObject *const *__pyx_kwvalues; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs); __pyx_pf_5skfmm_5pheap_5pheap_2__dealloc__(((struct __pyx_obj_5skfmm_5pheap_pheap *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); } static void __pyx_pf_5skfmm_5pheap_5pheap_2__dealloc__(struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self) { /* "skfmm/pheap.pyx":21 * * def __dealloc__(self): * del self.thisptr # <<<<<<<<<<<<<< * * def _push(self, addr, value): */ delete __pyx_v_self->thisptr; /* "skfmm/pheap.pyx":20 * self.thisptr = new heap(n, self_test) * * def __dealloc__(self): # <<<<<<<<<<<<<< * del self.thisptr * */ /* function exit code */ } /* "skfmm/pheap.pyx":23 * del self.thisptr * * def _push(self, addr, value): # <<<<<<<<<<<<<< * return self.thisptr.push(addr, value) * */ /* Python wrapper */ static PyObject *__pyx_pw_5skfmm_5pheap_5pheap_5_push(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_5skfmm_5pheap_5pheap_5_push = {"_push", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5skfmm_5pheap_5pheap_5_push, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_5skfmm_5pheap_5pheap_5_push(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { PyObject *__pyx_v_addr = 0; PyObject *__pyx_v_value = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[2] = {0,0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_push (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_addr,&__pyx_n_s_value,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_addr)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 23, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_value)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 23, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("_push", 1, 2, 2, 1); __PYX_ERR(1, 23, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_push") < 0)) __PYX_ERR(1, 23, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 2)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); } __pyx_v_addr = values[0]; __pyx_v_value = values[1]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("_push", 1, 2, 2, __pyx_nargs); __PYX_ERR(1, 23, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("skfmm.pheap.pheap._push", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_5skfmm_5pheap_5pheap_4_push(((struct __pyx_obj_5skfmm_5pheap_pheap *)__pyx_v_self), __pyx_v_addr, __pyx_v_value); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_5skfmm_5pheap_5pheap_4_push(struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self, PyObject *__pyx_v_addr, PyObject *__pyx_v_value) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; double __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_push", 1); /* "skfmm/pheap.pyx":24 * * def _push(self, addr, value): * return self.thisptr.push(addr, value) # <<<<<<<<<<<<<< * * def _pop(self): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_addr); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 24, __pyx_L1_error) __pyx_t_2 = __pyx_PyFloat_AsDouble(__pyx_v_value); if (unlikely((__pyx_t_2 == (double)-1) && PyErr_Occurred())) __PYX_ERR(1, 24, __pyx_L1_error) try { __pyx_t_3 = __pyx_v_self->thisptr->push(__pyx_t_1, __pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); __PYX_ERR(1, 24, __pyx_L1_error) } __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 24, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; /* "skfmm/pheap.pyx":23 * del self.thisptr * * def _push(self, addr, value): # <<<<<<<<<<<<<< * return self.thisptr.push(addr, value) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("skfmm.pheap.pheap._push", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "skfmm/pheap.pyx":26 * return self.thisptr.push(addr, value) * * def _pop(self): # <<<<<<<<<<<<<< * cdef int addr * cdef double value */ /* Python wrapper */ static PyObject *__pyx_pw_5skfmm_5pheap_5pheap_7_pop(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_5skfmm_5pheap_5pheap_7_pop = {"_pop", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5skfmm_5pheap_5pheap_7_pop, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_5skfmm_5pheap_5pheap_7_pop(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_pop (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); if (unlikely(__pyx_nargs > 0)) { __Pyx_RaiseArgtupleInvalid("_pop", 1, 0, 0, __pyx_nargs); return NULL;} if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_pop", 0))) return NULL; __pyx_r = __pyx_pf_5skfmm_5pheap_5pheap_6_pop(((struct __pyx_obj_5skfmm_5pheap_pheap *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_5skfmm_5pheap_5pheap_6_pop(struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self) { int __pyx_v_addr; double __pyx_v_value; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_pop", 1); /* "skfmm/pheap.pyx":29 * cdef int addr * cdef double value * self.thisptr.pop(&addr, &value) # <<<<<<<<<<<<<< * return addr, value * */ try { __pyx_v_self->thisptr->pop((&__pyx_v_addr), (&__pyx_v_value)); } catch(...) { __Pyx_CppExn2PyErr(); __PYX_ERR(1, 29, __pyx_L1_error) } /* "skfmm/pheap.pyx":30 * cdef double value * self.thisptr.pop(&addr, &value) * return addr, value # <<<<<<<<<<<<<< * * def _set(self, addr, value): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_addr); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyFloat_FromDouble(__pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1)) __PYX_ERR(1, 30, __pyx_L1_error); __Pyx_GIVEREF(__pyx_t_2); if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2)) __PYX_ERR(1, 30, __pyx_L1_error); __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "skfmm/pheap.pyx":26 * return self.thisptr.push(addr, value) * * def _pop(self): # <<<<<<<<<<<<<< * cdef int addr * cdef double value */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("skfmm.pheap.pheap._pop", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "skfmm/pheap.pyx":32 * return addr, value * * def _set(self, addr, value): # <<<<<<<<<<<<<< * self.thisptr.set(addr, value) * */ /* Python wrapper */ static PyObject *__pyx_pw_5skfmm_5pheap_5pheap_9_set(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_5skfmm_5pheap_5pheap_9_set = {"_set", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5skfmm_5pheap_5pheap_9_set, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_5skfmm_5pheap_5pheap_9_set(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { PyObject *__pyx_v_addr = 0; PyObject *__pyx_v_value = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[2] = {0,0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_set (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_addr,&__pyx_n_s_value,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_addr)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 32, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_value)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(1, 32, __pyx_L3_error) else { __Pyx_RaiseArgtupleInvalid("_set", 1, 2, 2, 1); __PYX_ERR(1, 32, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_set") < 0)) __PYX_ERR(1, 32, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 2)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); } __pyx_v_addr = values[0]; __pyx_v_value = values[1]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("_set", 1, 2, 2, __pyx_nargs); __PYX_ERR(1, 32, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("skfmm.pheap.pheap._set", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_5skfmm_5pheap_5pheap_8_set(((struct __pyx_obj_5skfmm_5pheap_pheap *)__pyx_v_self), __pyx_v_addr, __pyx_v_value); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_5skfmm_5pheap_5pheap_8_set(struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self, PyObject *__pyx_v_addr, PyObject *__pyx_v_value) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; double __pyx_t_2; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_set", 1); /* "skfmm/pheap.pyx":33 * * def _set(self, addr, value): * self.thisptr.set(addr, value) # <<<<<<<<<<<<<< * * def _empty(self): */ __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_addr); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 33, __pyx_L1_error) __pyx_t_2 = __pyx_PyFloat_AsDouble(__pyx_v_value); if (unlikely((__pyx_t_2 == (double)-1) && PyErr_Occurred())) __PYX_ERR(1, 33, __pyx_L1_error) try { __pyx_v_self->thisptr->set(__pyx_t_1, __pyx_t_2); } catch(...) { __Pyx_CppExn2PyErr(); __PYX_ERR(1, 33, __pyx_L1_error) } /* "skfmm/pheap.pyx":32 * return addr, value * * def _set(self, addr, value): # <<<<<<<<<<<<<< * self.thisptr.set(addr, value) * */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("skfmm.pheap.pheap._set", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "skfmm/pheap.pyx":35 * self.thisptr.set(addr, value) * * def _empty(self): # <<<<<<<<<<<<<< * return self.thisptr.empty() * */ /* Python wrapper */ static PyObject *__pyx_pw_5skfmm_5pheap_5pheap_11_empty(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_5skfmm_5pheap_5pheap_11_empty = {"_empty", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5skfmm_5pheap_5pheap_11_empty, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_5skfmm_5pheap_5pheap_11_empty(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_empty (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); if (unlikely(__pyx_nargs > 0)) { __Pyx_RaiseArgtupleInvalid("_empty", 1, 0, 0, __pyx_nargs); return NULL;} if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_empty", 0))) return NULL; __pyx_r = __pyx_pf_5skfmm_5pheap_5pheap_10_empty(((struct __pyx_obj_5skfmm_5pheap_pheap *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_5skfmm_5pheap_5pheap_10_empty(struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_empty", 1); /* "skfmm/pheap.pyx":36 * * def _empty(self): * return self.thisptr.empty() # <<<<<<<<<<<<<< * * def _peek(self): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->thisptr->empty()); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 36, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "skfmm/pheap.pyx":35 * self.thisptr.set(addr, value) * * def _empty(self): # <<<<<<<<<<<<<< * return self.thisptr.empty() * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("skfmm.pheap.pheap._empty", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "skfmm/pheap.pyx":38 * return self.thisptr.empty() * * def _peek(self): # <<<<<<<<<<<<<< * cdef double dist * return self.thisptr.peek() */ /* Python wrapper */ static PyObject *__pyx_pw_5skfmm_5pheap_5pheap_13_peek(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_5skfmm_5pheap_5pheap_13_peek = {"_peek", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5skfmm_5pheap_5pheap_13_peek, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_5skfmm_5pheap_5pheap_13_peek(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_peek (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); if (unlikely(__pyx_nargs > 0)) { __Pyx_RaiseArgtupleInvalid("_peek", 1, 0, 0, __pyx_nargs); return NULL;} if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_peek", 0))) return NULL; __pyx_r = __pyx_pf_5skfmm_5pheap_5pheap_12_peek(((struct __pyx_obj_5skfmm_5pheap_pheap *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_5skfmm_5pheap_5pheap_12_peek(struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations double __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_peek", 1); /* "skfmm/pheap.pyx":40 * def _peek(self): * cdef double dist * return self.thisptr.peek() # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); try { __pyx_t_1 = __pyx_v_self->thisptr->peek(); } catch(...) { __Pyx_CppExn2PyErr(); __PYX_ERR(1, 40, __pyx_L1_error) } __pyx_t_2 = PyFloat_FromDouble(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 40, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; /* "skfmm/pheap.pyx":38 * return self.thisptr.empty() * * def _peek(self): # <<<<<<<<<<<<<< * cdef double dist * return self.thisptr.peek() */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("skfmm.pheap.pheap._peek", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ /* Python wrapper */ static PyObject *__pyx_pw_5skfmm_5pheap_5pheap_15__reduce_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_5skfmm_5pheap_5pheap_15__reduce_cython__ = {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5skfmm_5pheap_5pheap_15__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_5skfmm_5pheap_5pheap_15__reduce_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); if (unlikely(__pyx_nargs > 0)) { __Pyx_RaiseArgtupleInvalid("__reduce_cython__", 1, 0, 0, __pyx_nargs); return NULL;} if (unlikely(__pyx_kwds) && __Pyx_NumKwargs_FASTCALL(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__reduce_cython__", 0))) return NULL; __pyx_r = __pyx_pf_5skfmm_5pheap_5pheap_14__reduce_cython__(((struct __pyx_obj_5skfmm_5pheap_pheap *)__pyx_v_self)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_5skfmm_5pheap_5pheap_14__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 1); /* "(tree fragment)":2 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< * def __setstate_cython__(self, __pyx_state): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); __PYX_ERR(0, 2, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ /* function exit code */ __pyx_L1_error:; __Pyx_AddTraceback("skfmm.pheap.pheap.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ /* Python wrapper */ static PyObject *__pyx_pw_5skfmm_5pheap_5pheap_17__setstate_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ); /*proto*/ static PyMethodDef __pyx_mdef_5skfmm_5pheap_5pheap_17__setstate_cython__ = {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5skfmm_5pheap_5pheap_17__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_5skfmm_5pheap_5pheap_17__setstate_cython__(PyObject *__pyx_v_self, #if CYTHON_METH_FASTCALL PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds #else PyObject *__pyx_args, PyObject *__pyx_kwds #endif ) { CYTHON_UNUSED PyObject *__pyx_v___pyx_state = 0; #if !CYTHON_METH_FASTCALL CYTHON_UNUSED Py_ssize_t __pyx_nargs; #endif CYTHON_UNUSED PyObject *const *__pyx_kwvalues; PyObject* values[1] = {0}; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); #if !CYTHON_METH_FASTCALL #if CYTHON_ASSUME_SAFE_MACROS __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); #else __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; #endif #endif __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); { PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_state,0}; if (__pyx_kwds) { Py_ssize_t kw_args; switch (__pyx_nargs) { case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); switch (__pyx_nargs) { case 0: if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_pyx_state)) != 0)) { (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); kw_args--; } else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 3, __pyx_L3_error) else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__setstate_cython__") < 0)) __PYX_ERR(0, 3, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 1)) { goto __pyx_L5_argtuple_error; } else { values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); } __pyx_v___pyx_state = values[0]; } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__setstate_cython__", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 3, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_AddTraceback("skfmm.pheap.pheap.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_5skfmm_5pheap_5pheap_16__setstate_cython__(((struct __pyx_obj_5skfmm_5pheap_pheap *)__pyx_v_self), __pyx_v___pyx_state); /* function exit code */ { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); } } __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_5skfmm_5pheap_5pheap_16__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_5skfmm_5pheap_pheap *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 1); /* "(tree fragment)":4 * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" # <<<<<<<<<<<<<< */ __Pyx_Raise(__pyx_builtin_TypeError, __pyx_kp_s_no_default___reduce___due_to_non, 0, 0); __PYX_ERR(0, 4, __pyx_L1_error) /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ /* function exit code */ __pyx_L1_error:; __Pyx_AddTraceback("skfmm.pheap.pheap.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_tp_new_5skfmm_5pheap_pheap(PyTypeObject *t, PyObject *a, PyObject *k) { PyObject *o; #if CYTHON_COMPILING_IN_LIMITED_API allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); o = alloc_func(t, 0); #else if (likely(!__Pyx_PyType_HasFeature(t, Py_TPFLAGS_IS_ABSTRACT))) { o = (*t->tp_alloc)(t, 0); } else { o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); } if (unlikely(!o)) return 0; #endif if (unlikely(__pyx_pw_5skfmm_5pheap_5pheap_1__cinit__(o, a, k) < 0)) goto bad; return o; bad: Py_DECREF(o); o = 0; return NULL; } static void __pyx_tp_dealloc_5skfmm_5pheap_pheap(PyObject *o) { #if CYTHON_USE_TP_FINALIZE if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) { if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_5skfmm_5pheap_pheap) { if (PyObject_CallFinalizerFromDealloc(o)) return; } } #endif { PyObject *etype, *eval, *etb; PyErr_Fetch(&etype, &eval, &etb); __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); __pyx_pw_5skfmm_5pheap_5pheap_3__dealloc__(o); __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); PyErr_Restore(etype, eval, etb); } #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY (*Py_TYPE(o)->tp_free)(o); #else { freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); if (tp_free) tp_free(o); } #endif } static PyMethodDef __pyx_methods_5skfmm_5pheap_pheap[] = { {"_push", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5skfmm_5pheap_5pheap_5_push, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"_pop", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5skfmm_5pheap_5pheap_7_pop, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"_set", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5skfmm_5pheap_5pheap_9_set, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"_empty", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5skfmm_5pheap_5pheap_11_empty, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"_peek", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5skfmm_5pheap_5pheap_13_peek, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"__reduce_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5skfmm_5pheap_5pheap_15__reduce_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {"__setstate_cython__", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_5skfmm_5pheap_5pheap_17__setstate_cython__, __Pyx_METH_FASTCALL|METH_KEYWORDS, 0}, {0, 0, 0, 0} }; #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_type_5skfmm_5pheap_pheap_slots[] = { {Py_tp_dealloc, (void *)__pyx_tp_dealloc_5skfmm_5pheap_pheap}, {Py_tp_methods, (void *)__pyx_methods_5skfmm_5pheap_pheap}, {Py_tp_new, (void *)__pyx_tp_new_5skfmm_5pheap_pheap}, {0, 0}, }; static PyType_Spec __pyx_type_5skfmm_5pheap_pheap_spec = { "skfmm.pheap.pheap", sizeof(struct __pyx_obj_5skfmm_5pheap_pheap), 0, Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, __pyx_type_5skfmm_5pheap_pheap_slots, }; #else static PyTypeObject __pyx_type_5skfmm_5pheap_pheap = { PyVarObject_HEAD_INIT(0, 0) "skfmm.pheap.""pheap", /*tp_name*/ sizeof(struct __pyx_obj_5skfmm_5pheap_pheap), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_5skfmm_5pheap_pheap, /*tp_dealloc*/ #if PY_VERSION_HEX < 0x030800b4 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030800b4 0, /*tp_vectorcall_offset*/ #endif 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #endif #if PY_MAJOR_VERSION >= 3 0, /*tp_as_async*/ #endif 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ 0, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_5skfmm_5pheap_pheap, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ #if !CYTHON_USE_TYPE_SPECS 0, /*tp_dictoffset*/ #endif 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_5skfmm_5pheap_pheap, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ 0, /*tp_version_tag*/ #if PY_VERSION_HEX >= 0x030400a1 #if CYTHON_USE_TP_FINALIZE 0, /*tp_finalize*/ #else NULL, /*tp_finalize*/ #endif #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if __PYX_NEED_TP_PRINT_SLOT == 1 0, /*tp_print*/ #endif #if PY_VERSION_HEX >= 0x030C0000 0, /*tp_watched*/ #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, /*tp_pypy_flags*/ #endif }; #endif static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #ifndef CYTHON_SMALL_CODE #if defined(__clang__) #define CYTHON_SMALL_CODE #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) #define CYTHON_SMALL_CODE __attribute__((cold)) #else #define CYTHON_SMALL_CODE #endif #endif /* #### Code section: pystring_table ### */ static int __Pyx_CreateStringTabAndInitStrings(void) { __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, {&__pyx_n_s__12, __pyx_k__12, sizeof(__pyx_k__12), 0, 0, 1, 1}, {&__pyx_n_s_addr, __pyx_k_addr, sizeof(__pyx_k_addr), 0, 0, 1, 1}, {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_kp_u_disable, __pyx_k_disable, sizeof(__pyx_k_disable), 0, 1, 0, 0}, {&__pyx_n_s_dist, __pyx_k_dist, sizeof(__pyx_k_dist), 0, 0, 1, 1}, {&__pyx_n_s_empty, __pyx_k_empty, sizeof(__pyx_k_empty), 0, 0, 1, 1}, {&__pyx_kp_u_enable, __pyx_k_enable, sizeof(__pyx_k_enable), 0, 1, 0, 0}, {&__pyx_kp_u_gc, __pyx_k_gc, sizeof(__pyx_k_gc), 0, 1, 0, 0}, {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, {&__pyx_kp_u_isenabled, __pyx_k_isenabled, sizeof(__pyx_k_isenabled), 0, 1, 0, 0}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_n, __pyx_k_n, sizeof(__pyx_k_n), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, {&__pyx_n_s_peek, __pyx_k_peek, sizeof(__pyx_k_peek), 0, 0, 1, 1}, {&__pyx_n_s_pheap, __pyx_k_pheap, sizeof(__pyx_k_pheap), 0, 0, 1, 1}, {&__pyx_n_s_pheap___reduce_cython, __pyx_k_pheap___reduce_cython, sizeof(__pyx_k_pheap___reduce_cython), 0, 0, 1, 1}, {&__pyx_n_s_pheap___setstate_cython, __pyx_k_pheap___setstate_cython, sizeof(__pyx_k_pheap___setstate_cython), 0, 0, 1, 1}, {&__pyx_n_s_pheap__empty, __pyx_k_pheap__empty, sizeof(__pyx_k_pheap__empty), 0, 0, 1, 1}, {&__pyx_n_s_pheap__peek, __pyx_k_pheap__peek, sizeof(__pyx_k_pheap__peek), 0, 0, 1, 1}, {&__pyx_n_s_pheap__pop, __pyx_k_pheap__pop, sizeof(__pyx_k_pheap__pop), 0, 0, 1, 1}, {&__pyx_n_s_pheap__push, __pyx_k_pheap__push, sizeof(__pyx_k_pheap__push), 0, 0, 1, 1}, {&__pyx_n_s_pheap__set, __pyx_k_pheap__set, sizeof(__pyx_k_pheap__set), 0, 0, 1, 1}, {&__pyx_kp_s_pheap_pyx, __pyx_k_pheap_pyx, sizeof(__pyx_k_pheap_pyx), 0, 0, 1, 0}, {&__pyx_n_s_pop, __pyx_k_pop, sizeof(__pyx_k_pop), 0, 0, 1, 1}, {&__pyx_n_s_push, __pyx_k_push, sizeof(__pyx_k_push), 0, 0, 1, 1}, {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, {&__pyx_n_s_self, __pyx_k_self, sizeof(__pyx_k_self), 0, 0, 1, 1}, {&__pyx_n_s_self_test, __pyx_k_self_test, sizeof(__pyx_k_self_test), 0, 0, 1, 1}, {&__pyx_n_s_set, __pyx_k_set, sizeof(__pyx_k_set), 0, 0, 1, 1}, {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, {&__pyx_n_s_skfmm_pheap, __pyx_k_skfmm_pheap, sizeof(__pyx_k_skfmm_pheap), 0, 0, 1, 1}, {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_s_value, __pyx_k_value, sizeof(__pyx_k_value), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; return __Pyx_InitStrings(__pyx_string_tab); } /* #### Code section: cached_builtins ### */ static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 2, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } /* #### Code section: cached_constants ### */ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "skfmm/pheap.pyx":23 * del self.thisptr * * def _push(self, addr, value): # <<<<<<<<<<<<<< * return self.thisptr.push(addr, value) * */ __pyx_tuple_ = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_addr, __pyx_n_s_value); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 23, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); __pyx_codeobj__2 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple_, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pheap_pyx, __pyx_n_s_push, 23, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__2)) __PYX_ERR(1, 23, __pyx_L1_error) /* "skfmm/pheap.pyx":26 * return self.thisptr.push(addr, value) * * def _pop(self): # <<<<<<<<<<<<<< * cdef int addr * cdef double value */ __pyx_codeobj__3 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple_, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pheap_pyx, __pyx_n_s_pop, 26, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__3)) __PYX_ERR(1, 26, __pyx_L1_error) /* "skfmm/pheap.pyx":32 * return addr, value * * def _set(self, addr, value): # <<<<<<<<<<<<<< * self.thisptr.set(addr, value) * */ __pyx_codeobj__4 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple_, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pheap_pyx, __pyx_n_s_set, 32, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__4)) __PYX_ERR(1, 32, __pyx_L1_error) /* "skfmm/pheap.pyx":35 * self.thisptr.set(addr, value) * * def _empty(self): # <<<<<<<<<<<<<< * return self.thisptr.empty() * */ __pyx_tuple__5 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); __pyx_codeobj__6 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__5, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pheap_pyx, __pyx_n_s_empty, 35, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__6)) __PYX_ERR(1, 35, __pyx_L1_error) /* "skfmm/pheap.pyx":38 * return self.thisptr.empty() * * def _peek(self): # <<<<<<<<<<<<<< * cdef double dist * return self.thisptr.peek() */ __pyx_tuple__7 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_dist); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(1, 38, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7); __pyx_codeobj__8 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pheap_pyx, __pyx_n_s_peek, 38, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__8)) __PYX_ERR(1, 38, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ __pyx_codeobj__9 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__5, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_reduce_cython, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__9)) __PYX_ERR(0, 1, __pyx_L1_error) /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ __pyx_tuple__10 = PyTuple_Pack(2, __pyx_n_s_self, __pyx_n_s_pyx_state); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 3, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__10); __Pyx_GIVEREF(__pyx_tuple__10); __pyx_codeobj__11 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__10, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 3, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__11)) __PYX_ERR(0, 3, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } /* #### Code section: init_constants ### */ static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(1, 1, __pyx_L1_error); return 0; __pyx_L1_error:; return -1; } /* #### Code section: init_globals ### */ static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { return 0; } /* #### Code section: init_module ### */ static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ static int __Pyx_modinit_global_init_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); /*--- Global init code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); /*--- Variable export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_export_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); /*--- Function export code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ #if CYTHON_USE_TYPE_SPECS __pyx_ptype_5skfmm_5pheap_pheap = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_5skfmm_5pheap_pheap_spec, NULL); if (unlikely(!__pyx_ptype_5skfmm_5pheap_pheap)) __PYX_ERR(1, 15, __pyx_L1_error) if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_5skfmm_5pheap_pheap_spec, __pyx_ptype_5skfmm_5pheap_pheap) < 0) __PYX_ERR(1, 15, __pyx_L1_error) #else __pyx_ptype_5skfmm_5pheap_pheap = &__pyx_type_5skfmm_5pheap_pheap; #endif #if !CYTHON_COMPILING_IN_LIMITED_API #endif #if !CYTHON_USE_TYPE_SPECS if (__Pyx_PyType_Ready(__pyx_ptype_5skfmm_5pheap_pheap) < 0) __PYX_ERR(1, 15, __pyx_L1_error) #endif #if PY_MAJOR_VERSION < 3 __pyx_ptype_5skfmm_5pheap_pheap->tp_print = 0; #endif #if !CYTHON_COMPILING_IN_LIMITED_API if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_5skfmm_5pheap_pheap->tp_dictoffset && __pyx_ptype_5skfmm_5pheap_pheap->tp_getattro == PyObject_GenericGetAttr)) { __pyx_ptype_5skfmm_5pheap_pheap->tp_getattro = __Pyx_PyObject_GenericGetAttr; } #endif if (PyObject_SetAttr(__pyx_m, __pyx_n_s_pheap, (PyObject *) __pyx_ptype_5skfmm_5pheap_pheap) < 0) __PYX_ERR(1, 15, __pyx_L1_error) #if !CYTHON_COMPILING_IN_LIMITED_API if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_5skfmm_5pheap_pheap) < 0) __PYX_ERR(1, 15, __pyx_L1_error) #endif __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_variable_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); /*--- Variable import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_modinit_function_import_code(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); /*--- Function import code ---*/ __Pyx_RefNannyFinishContext(); return 0; } #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ static int __pyx_pymod_exec_pheap(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec_pheap}, {0, NULL} }; #endif #ifdef __cplusplus namespace { struct PyModuleDef __pyx_moduledef = #else static struct PyModuleDef __pyx_moduledef = #endif { PyModuleDef_HEAD_INIT, "pheap", 0, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ #elif CYTHON_USE_MODULE_STATE sizeof(__pyx_mstate), /* m_size */ #else -1, /* m_size */ #endif __pyx_methods /* m_methods */, #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_moduledef_slots, /* m_slots */ #else NULL, /* m_reload */ #endif #if CYTHON_USE_MODULE_STATE __pyx_m_traverse, /* m_traverse */ __pyx_m_clear, /* m_clear */ NULL /* m_free */ #else NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ #endif }; #ifdef __cplusplus } /* anonymous namespace */ #endif #endif #ifndef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC #elif PY_MAJOR_VERSION < 3 #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" void #else #define __Pyx_PyMODINIT_FUNC void #endif #else #ifdef __cplusplus #define __Pyx_PyMODINIT_FUNC extern "C" PyObject * #else #define __Pyx_PyMODINIT_FUNC PyObject * #endif #endif #if PY_MAJOR_VERSION < 3 __Pyx_PyMODINIT_FUNC initpheap(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC initpheap(void) #else __Pyx_PyMODINIT_FUNC PyInit_pheap(void) CYTHON_SMALL_CODE; /*proto*/ __Pyx_PyMODINIT_FUNC PyInit_pheap(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); } static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { #if PY_VERSION_HEX >= 0x030700A1 static PY_INT64_T main_interpreter_id = -1; PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); if (main_interpreter_id == -1) { main_interpreter_id = current_id; return (unlikely(current_id == -1)) ? -1 : 0; } else if (unlikely(main_interpreter_id != current_id)) #else static PyInterpreterState *main_interpreter = NULL; PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; if (!main_interpreter) { main_interpreter = current_interpreter; } else if (unlikely(main_interpreter != current_interpreter)) #endif { PyErr_SetString( PyExc_ImportError, "Interpreter change detected - this module can only be loaded into one interpreter per process."); return -1; } return 0; } #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) #else static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) #endif { PyObject *value = PyObject_GetAttrString(spec, from_name); int result = 0; if (likely(value)) { if (allow_none || value != Py_None) { #if CYTHON_COMPILING_IN_LIMITED_API result = PyModule_AddObject(module, to_name, value); #else result = PyDict_SetItemString(moddict, to_name, value); #endif } Py_DECREF(value); } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } else { result = -1; } return result; } static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { PyObject *module = NULL, *moddict, *modname; CYTHON_UNUSED_VAR(def); if (__Pyx_check_single_interpreter()) return NULL; if (__pyx_m) return __Pyx_NewRef(__pyx_m); modname = PyObject_GetAttrString(spec, "name"); if (unlikely(!modname)) goto bad; module = PyModule_NewObject(modname); Py_DECREF(modname); if (unlikely(!module)) goto bad; #if CYTHON_COMPILING_IN_LIMITED_API moddict = module; #else moddict = PyModule_GetDict(module); if (unlikely(!moddict)) goto bad; #endif if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; return module; bad: Py_XDECREF(module); return NULL; } static CYTHON_SMALL_CODE int __pyx_pymod_exec_pheap(PyObject *__pyx_pyinit_module) #endif #endif { int stringtab_initialized = 0; #if CYTHON_USE_MODULE_STATE int pystate_addmodule_run = 0; #endif PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m) { if (__pyx_m == __pyx_pyinit_module) return 0; PyErr_SetString(PyExc_RuntimeError, "Module 'pheap' has already been imported. Re-initialisation is not supported."); return -1; } #elif PY_MAJOR_VERSION >= 3 if (__pyx_m) return __Pyx_NewRef(__pyx_m); #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("pheap", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); if (unlikely(!__pyx_m)) __PYX_ERR(1, 1, __pyx_L1_error) #elif CYTHON_USE_MODULE_STATE __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) { int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "pheap" pseudovariable */ if (unlikely((add_module_result < 0))) __PYX_ERR(1, 1, __pyx_L1_error) pystate_addmodule_run = 1; } #else __pyx_m = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_m)) __PYX_ERR(1, 1, __pyx_L1_error) #endif #endif CYTHON_UNUSED_VAR(__pyx_t_1); __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(1, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(1, 1, __pyx_L1_error) __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(1, 1, __pyx_L1_error) if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(1, 1, __pyx_L1_error) #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_pheap(void)", 0); if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(1, 1, __pyx_L1_error) #ifdef __Pxy_PyFrame_Initialize_Offsets __Pxy_PyFrame_Initialize_Offsets(); #endif __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(1, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(1, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(1, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(1, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(1, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(1, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(1, 1, __pyx_L1_error) #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(1, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(1, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS PyEval_InitThreads(); #endif /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitConstants() < 0) __PYX_ERR(1, 1, __pyx_L1_error) stringtab_initialized = 1; if (__Pyx_InitGlobals() < 0) __PYX_ERR(1, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(1, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_skfmm__pheap) { if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(1, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(1, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "skfmm.pheap")) { if (unlikely((PyDict_SetItemString(modules, "skfmm.pheap", __pyx_m) < 0))) __PYX_ERR(1, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(1, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(1, 1, __pyx_L1_error) /*--- Global type/function init code ---*/ (void)__Pyx_modinit_global_init_code(); (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); if (unlikely((__Pyx_modinit_type_init_code() < 0))) __PYX_ERR(1, 1, __pyx_L1_error) (void)__Pyx_modinit_type_import_code(); (void)__Pyx_modinit_variable_import_code(); (void)__Pyx_modinit_function_import_code(); /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(1, 1, __pyx_L1_error) #endif /* "skfmm/pheap.pyx":23 * del self.thisptr * * def _push(self, addr, value): # <<<<<<<<<<<<<< * return self.thisptr.push(addr, value) * */ __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_5skfmm_5pheap_5pheap_5_push, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_pheap__push, NULL, __pyx_n_s_skfmm_pheap, __pyx_d, ((PyObject *)__pyx_codeobj__2)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 23, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_5skfmm_5pheap_pheap, __pyx_n_s_push, __pyx_t_2) < 0) __PYX_ERR(1, 23, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; PyType_Modified(__pyx_ptype_5skfmm_5pheap_pheap); /* "skfmm/pheap.pyx":26 * return self.thisptr.push(addr, value) * * def _pop(self): # <<<<<<<<<<<<<< * cdef int addr * cdef double value */ __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_5skfmm_5pheap_5pheap_7_pop, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_pheap__pop, NULL, __pyx_n_s_skfmm_pheap, __pyx_d, ((PyObject *)__pyx_codeobj__3)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 26, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_5skfmm_5pheap_pheap, __pyx_n_s_pop, __pyx_t_2) < 0) __PYX_ERR(1, 26, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; PyType_Modified(__pyx_ptype_5skfmm_5pheap_pheap); /* "skfmm/pheap.pyx":32 * return addr, value * * def _set(self, addr, value): # <<<<<<<<<<<<<< * self.thisptr.set(addr, value) * */ __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_5skfmm_5pheap_5pheap_9_set, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_pheap__set, NULL, __pyx_n_s_skfmm_pheap, __pyx_d, ((PyObject *)__pyx_codeobj__4)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 32, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_5skfmm_5pheap_pheap, __pyx_n_s_set, __pyx_t_2) < 0) __PYX_ERR(1, 32, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; PyType_Modified(__pyx_ptype_5skfmm_5pheap_pheap); /* "skfmm/pheap.pyx":35 * self.thisptr.set(addr, value) * * def _empty(self): # <<<<<<<<<<<<<< * return self.thisptr.empty() * */ __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_5skfmm_5pheap_5pheap_11_empty, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_pheap__empty, NULL, __pyx_n_s_skfmm_pheap, __pyx_d, ((PyObject *)__pyx_codeobj__6)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_5skfmm_5pheap_pheap, __pyx_n_s_empty, __pyx_t_2) < 0) __PYX_ERR(1, 35, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; PyType_Modified(__pyx_ptype_5skfmm_5pheap_pheap); /* "skfmm/pheap.pyx":38 * return self.thisptr.empty() * * def _peek(self): # <<<<<<<<<<<<<< * cdef double dist * return self.thisptr.peek() */ __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_5skfmm_5pheap_5pheap_13_peek, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_pheap__peek, NULL, __pyx_n_s_skfmm_pheap, __pyx_d, ((PyObject *)__pyx_codeobj__8)); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 38, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_5skfmm_5pheap_pheap, __pyx_n_s_peek, __pyx_t_2) < 0) __PYX_ERR(1, 38, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; PyType_Modified(__pyx_ptype_5skfmm_5pheap_pheap); /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): */ __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_5skfmm_5pheap_5pheap_15__reduce_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_pheap___reduce_cython, NULL, __pyx_n_s_skfmm_pheap, __pyx_d, ((PyObject *)__pyx_codeobj__9)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce_cython, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "(tree fragment)":3 * def __reduce_cython__(self): * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< * raise TypeError, "no default __reduce__ due to non-trivial __cinit__" */ __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_5skfmm_5pheap_5pheap_17__setstate_cython__, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_pheap___setstate_cython, NULL, __pyx_n_s_skfmm_pheap, __pyx_d, ((PyObject *)__pyx_codeobj__11)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 3, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_setstate_cython, __pyx_t_2) < 0) __PYX_ERR(0, 3, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "skfmm/pheap.pyx":1 * # distutils: language = c++ # <<<<<<<<<<<<<< * # distutils: sources = heap.cpp * */ __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(1, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); if (__pyx_m) { if (__pyx_d && stringtab_initialized) { __Pyx_AddTraceback("init skfmm.pheap", __pyx_clineno, __pyx_lineno, __pyx_filename); } #if !CYTHON_USE_MODULE_STATE Py_CLEAR(__pyx_m); #else Py_DECREF(__pyx_m); if (pystate_addmodule_run) { PyObject *tp, *value, *tb; PyErr_Fetch(&tp, &value, &tb); PyState_RemoveModule(&__pyx_moduledef); PyErr_Restore(tp, value, tb); } #endif } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init skfmm.pheap"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if CYTHON_PEP489_MULTI_PHASE_INIT return (__pyx_m != NULL) ? 0 : -1; #elif PY_MAJOR_VERSION >= 3 return __pyx_m; #else return; #endif } /* #### Code section: cleanup_globals ### */ /* #### Code section: cleanup_module ### */ /* #### Code section: main_method ### */ /* #### Code section: utility_code_pragmas ### */ #ifdef _MSC_VER #pragma warning( push ) /* Warning 4127: conditional expression is constant * Cython uses constant conditional expressions to allow in inline functions to be optimized at * compile-time, so this warning is not useful */ #pragma warning( disable : 4127 ) #endif /* #### Code section: utility_code_def ### */ /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule(modname); if (!m) goto end; p = PyObject_GetAttrString(m, "RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* PyErrExceptionMatches */ #if CYTHON_FAST_THREAD_STATE static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; i= 0x030C00A6 PyObject *current_exception = tstate->current_exception; if (unlikely(!current_exception)) return 0; exc_type = (PyObject*) Py_TYPE(current_exception); if (exc_type == err) return 1; #else exc_type = tstate->curexc_type; if (exc_type == err) return 1; if (unlikely(!exc_type)) return 0; #endif #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(exc_type); #endif if (unlikely(PyTuple_Check(err))) { result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); } else { result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); } #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(exc_type); #endif return result; } #endif /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyObject *tmp_value; assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); if (value) { #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) #endif PyException_SetTraceback(value, tb); } tmp_value = tstate->current_exception; tstate->current_exception = value; Py_XDECREF(tmp_value); Py_XDECREF(type); Py_XDECREF(tb); #else PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #endif } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyObject* exc_value; exc_value = tstate->current_exception; tstate->current_exception = 0; *value = exc_value; *type = NULL; *tb = NULL; if (exc_value) { *type = (PyObject*) Py_TYPE(exc_value); Py_INCREF(*type); #if CYTHON_COMPILING_IN_CPYTHON *tb = ((PyBaseExceptionObject*) exc_value)->traceback; Py_XINCREF(*tb); #else *tb = PyException_GetTraceback(exc_value); #endif } #else *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #endif } #endif /* PyObjectGetAttrStr */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #endif /* PyObjectGetAttrStrNoError */ #if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) __Pyx_PyErr_Clear(); } #endif static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { PyObject *result; #if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 (void) PyObject_GetOptionalAttr(obj, attr_name, &result); return result; #else #if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); } #endif result = __Pyx_PyObject_GetAttrStr(obj, attr_name); if (unlikely(!result)) { __Pyx_PyObject_GetAttrStr_ClearAttributeError(); } return result; #endif } /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); if (unlikely(!result) && !PyErr_Occurred()) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* TupleAndListFromArray */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { PyObject *v; Py_ssize_t i; for (i = 0; i < length; i++) { v = dest[i] = src[i]; Py_INCREF(v); } } static CYTHON_INLINE PyObject * __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) { PyObject *res; if (n <= 0) { Py_INCREF(__pyx_empty_tuple); return __pyx_empty_tuple; } res = PyTuple_New(n); if (unlikely(res == NULL)) return NULL; __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); return res; } static CYTHON_INLINE PyObject * __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) { PyObject *res; if (n <= 0) { return PyList_New(0); } res = PyList_New(n); if (unlikely(res == NULL)) return NULL; __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); return res; } #endif /* BytesEquals */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API return PyObject_RichCompareBool(s1, s2, equals); #else if (s1 == s2) { return (equals == Py_EQ); } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { const char *ps1, *ps2; Py_ssize_t length = PyBytes_GET_SIZE(s1); if (length != PyBytes_GET_SIZE(s2)) return (equals == Py_NE); ps1 = PyBytes_AS_STRING(s1); ps2 = PyBytes_AS_STRING(s2); if (ps1[0] != ps2[0]) { return (equals == Py_NE); } else if (length == 1) { return (equals == Py_EQ); } else { int result; #if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) Py_hash_t hash1, hash2; hash1 = ((PyBytesObject*)s1)->ob_shash; hash2 = ((PyBytesObject*)s2)->ob_shash; if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { return (equals == Py_NE); } #endif result = memcmp(ps1, ps2, (size_t)length); return (equals == Py_EQ) ? (result == 0) : (result != 0); } } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { return (equals == Py_NE); } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { return (equals == Py_NE); } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); Py_DECREF(py_result); return result; } #endif } /* UnicodeEquals */ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API return PyObject_RichCompareBool(s1, s2, equals); #else #if PY_MAJOR_VERSION < 3 PyObject* owned_ref = NULL; #endif int s1_is_unicode, s2_is_unicode; if (s1 == s2) { goto return_eq; } s1_is_unicode = PyUnicode_CheckExact(s1); s2_is_unicode = PyUnicode_CheckExact(s2); #if PY_MAJOR_VERSION < 3 if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { owned_ref = PyUnicode_FromObject(s2); if (unlikely(!owned_ref)) return -1; s2 = owned_ref; s2_is_unicode = 1; } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { owned_ref = PyUnicode_FromObject(s1); if (unlikely(!owned_ref)) return -1; s1 = owned_ref; s1_is_unicode = 1; } else if (((!s2_is_unicode) & (!s1_is_unicode))) { return __Pyx_PyBytes_Equals(s1, s2, equals); } #endif if (s1_is_unicode & s2_is_unicode) { Py_ssize_t length; int kind; void *data1, *data2; if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) return -1; length = __Pyx_PyUnicode_GET_LENGTH(s1); if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { goto return_ne; } #if CYTHON_USE_UNICODE_INTERNALS { Py_hash_t hash1, hash2; #if CYTHON_PEP393_ENABLED hash1 = ((PyASCIIObject*)s1)->hash; hash2 = ((PyASCIIObject*)s2)->hash; #else hash1 = ((PyUnicodeObject*)s1)->hash; hash2 = ((PyUnicodeObject*)s2)->hash; #endif if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { goto return_ne; } } #endif kind = __Pyx_PyUnicode_KIND(s1); if (kind != __Pyx_PyUnicode_KIND(s2)) { goto return_ne; } data1 = __Pyx_PyUnicode_DATA(s1); data2 = __Pyx_PyUnicode_DATA(s2); if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { goto return_ne; } else if (length == 1) { goto return_eq; } else { int result = memcmp(data1, data2, (size_t)(length * kind)); #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_EQ) ? (result == 0) : (result != 0); } } else if ((s1 == Py_None) & s2_is_unicode) { goto return_ne; } else if ((s2 == Py_None) & s1_is_unicode) { goto return_ne; } else { int result; PyObject* py_result = PyObject_RichCompare(s1, s2, equals); #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif if (!py_result) return -1; result = __Pyx_PyObject_IsTrue(py_result); Py_DECREF(py_result); return result; } return_eq: #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_EQ); return_ne: #if PY_MAJOR_VERSION < 3 Py_XDECREF(owned_ref); #endif return (equals == Py_NE); #endif } /* fastcall */ #if CYTHON_METH_FASTCALL static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) { Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); for (i = 0; i < n; i++) { if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; } for (i = 0; i < n; i++) { int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); if (unlikely(eq != 0)) { if (unlikely(eq < 0)) return NULL; return kwvalues[i]; } } return NULL; } #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); PyObject *dict; dict = PyDict_New(); if (unlikely(!dict)) return NULL; for (i=0; i= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } /* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject *const *kwvalues, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); while (1) { Py_XDECREF(key); key = NULL; Py_XDECREF(value); value = NULL; if (kwds_is_tuple) { Py_ssize_t size; #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(kwds); #else size = PyTuple_Size(kwds); if (size < 0) goto bad; #endif if (pos >= size) break; #if CYTHON_AVOID_BORROWED_REFS key = __Pyx_PySequence_ITEM(kwds, pos); if (!key) goto bad; #elif CYTHON_ASSUME_SAFE_MACROS key = PyTuple_GET_ITEM(kwds, pos); #else key = PyTuple_GetItem(kwds, pos); if (!key) goto bad; #endif value = kwvalues[pos]; pos++; } else { if (!PyDict_Next(kwds, &pos, &key, &value)) break; #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(key); #endif } name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS Py_INCREF(value); Py_DECREF(key); #endif key = NULL; value = NULL; continue; } #if !CYTHON_AVOID_BORROWED_REFS Py_INCREF(key); #endif Py_INCREF(value); name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS value = NULL; #endif break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = ( #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**name, key) ); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS value = NULL; #endif break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } Py_XDECREF(key); Py_XDECREF(value); return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: #if PY_MAJOR_VERSION < 3 PyErr_Format(PyExc_TypeError, "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else PyErr_Format(PyExc_TypeError, "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: Py_XDECREF(key); Py_XDECREF(value); return -1; } /* KeywordStringCheck */ static int __Pyx_CheckKeywordStrings( PyObject *kw, const char* function_name, int kw_allowed) { PyObject* key = 0; Py_ssize_t pos = 0; #if CYTHON_COMPILING_IN_PYPY if (!kw_allowed && PyDict_Next(kw, &pos, &key, 0)) goto invalid_keyword; return 1; #else if (CYTHON_METH_FASTCALL && likely(PyTuple_Check(kw))) { Py_ssize_t kwsize; #if CYTHON_ASSUME_SAFE_MACROS kwsize = PyTuple_GET_SIZE(kw); #else kwsize = PyTuple_Size(kw); if (kwsize < 0) return 0; #endif if (unlikely(kwsize == 0)) return 1; if (!kw_allowed) { #if CYTHON_ASSUME_SAFE_MACROS key = PyTuple_GET_ITEM(kw, 0); #else key = PyTuple_GetItem(kw, pos); if (!key) return 0; #endif goto invalid_keyword; } #if PY_VERSION_HEX < 0x03090000 for (pos = 0; pos < kwsize; pos++) { #if CYTHON_ASSUME_SAFE_MACROS key = PyTuple_GET_ITEM(kw, pos); #else key = PyTuple_GetItem(kw, pos); if (!key) return 0; #endif if (unlikely(!PyUnicode_Check(key))) goto invalid_keyword_type; } #endif return 1; } while (PyDict_Next(kw, &pos, &key, 0)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyString_Check(key))) #endif if (unlikely(!PyUnicode_Check(key))) goto invalid_keyword_type; } if (!kw_allowed && unlikely(key)) goto invalid_keyword; return 1; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); return 0; #endif invalid_keyword: #if PY_MAJOR_VERSION < 3 PyErr_Format(PyExc_TypeError, "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else PyErr_Format(PyExc_TypeError, "%s() got an unexpected keyword argument '%U'", function_name, key); #endif return 0; } /* RaiseException */ #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { __Pyx_PyThreadState_declare CYTHON_UNUSED_VAR(cause); Py_XINCREF(type); if (!value || value == Py_None) value = NULL; else Py_INCREF(value); if (!tb || tb == Py_None) tb = NULL; else { Py_INCREF(tb); if (!PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } } if (PyType_Check(type)) { #if CYTHON_COMPILING_IN_PYPY if (!value) { Py_INCREF(Py_None); value = Py_None; } #endif PyErr_NormalizeException(&type, &value, &tb); } else { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } value = type; type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } } __Pyx_PyThreadState_assign __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { PyObject* owned_instance = NULL; if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (PyExceptionClass_Check(type)) { PyObject *instance_class = NULL; if (value && PyExceptionInstance_Check(value)) { instance_class = (PyObject*) Py_TYPE(value); if (instance_class != type) { int is_subclass = PyObject_IsSubclass(instance_class, type); if (!is_subclass) { instance_class = NULL; } else if (unlikely(is_subclass == -1)) { goto bad; } else { type = instance_class; } } } if (!instance_class) { PyObject *args; if (!value) args = PyTuple_New(0); else if (PyTuple_Check(value)) { Py_INCREF(value); args = value; } else args = PyTuple_Pack(1, value); if (!args) goto bad; owned_instance = PyObject_Call(type, args, NULL); Py_DECREF(args); if (!owned_instance) goto bad; value = owned_instance; if (!PyExceptionInstance_Check(value)) { PyErr_Format(PyExc_TypeError, "calling %R should have returned an instance of " "BaseException, not %R", type, Py_TYPE(value)); goto bad; } } } else { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } if (cause) { PyObject *fixed_cause; if (cause == Py_None) { fixed_cause = NULL; } else if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { #if PY_VERSION_HEX >= 0x030C00A6 PyException_SetTraceback(value, tb); #elif CYTHON_FAST_THREAD_STATE PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } #else PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); Py_INCREF(tb); PyErr_Restore(tmp_type, tmp_value, tb); Py_XDECREF(tmp_tb); #endif } bad: Py_XDECREF(owned_instance); return; } #endif /* FixUpExtensionType */ #if CYTHON_USE_TYPE_SPECS static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { #if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API CYTHON_UNUSED_VAR(spec); CYTHON_UNUSED_VAR(type); #else const PyType_Slot *slot = spec->slots; while (slot && slot->slot && slot->slot != Py_tp_members) slot++; if (slot && slot->slot == Py_tp_members) { int changed = 0; #if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) const #endif PyMemberDef *memb = (PyMemberDef*) slot->pfunc; while (memb && memb->name) { if (memb->name[0] == '_' && memb->name[1] == '_') { #if PY_VERSION_HEX < 0x030900b1 if (strcmp(memb->name, "__weaklistoffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); type->tp_weaklistoffset = memb->offset; changed = 1; } else if (strcmp(memb->name, "__dictoffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); type->tp_dictoffset = memb->offset; changed = 1; } #if CYTHON_METH_FASTCALL else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { assert(memb->type == T_PYSSIZET); assert(memb->flags == READONLY); #if PY_VERSION_HEX >= 0x030800b4 type->tp_vectorcall_offset = memb->offset; #else type->tp_print = (printfunc) memb->offset; #endif changed = 1; } #endif #else if ((0)); #endif #if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON else if (strcmp(memb->name, "__module__") == 0) { PyObject *descr; assert(memb->type == T_OBJECT); assert(memb->flags == 0 || memb->flags == READONLY); descr = PyDescr_NewMember(type, memb); if (unlikely(!descr)) return -1; if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { Py_DECREF(descr); return -1; } Py_DECREF(descr); changed = 1; } #endif } memb++; } if (changed) PyType_Modified(type); } #endif return 0; } #endif /* PyFunctionFastCall */ #if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, PyObject *globals) { PyFrameObject *f; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject **fastlocals; Py_ssize_t i; PyObject *result; assert(globals != NULL); /* XXX Perhaps we should create a specialized PyFrame_New() that doesn't take locals, but does take builtins without sanity checking them. */ assert(tstate != NULL); f = PyFrame_New(tstate, co, globals, NULL); if (f == NULL) { return NULL; } fastlocals = __Pyx_PyFrame_GetLocalsplus(f); for (i = 0; i < na; i++) { Py_INCREF(*args); fastlocals[i] = *args++; } result = PyEval_EvalFrameEx(f,0); ++tstate->recursion_depth; Py_DECREF(f); --tstate->recursion_depth; return result; } static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); PyObject *globals = PyFunction_GET_GLOBALS(func); PyObject *argdefs = PyFunction_GET_DEFAULTS(func); PyObject *closure; #if PY_MAJOR_VERSION >= 3 PyObject *kwdefs; #endif PyObject *kwtuple, **k; PyObject **d; Py_ssize_t nd; Py_ssize_t nk; PyObject *result; assert(kwargs == NULL || PyDict_Check(kwargs)); nk = kwargs ? PyDict_Size(kwargs) : 0; #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { return NULL; } #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { return NULL; } #endif if ( #if PY_MAJOR_VERSION >= 3 co->co_kwonlyargcount == 0 && #endif likely(kwargs == NULL || nk == 0) && co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { if (argdefs == NULL && co->co_argcount == nargs) { result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); goto done; } else if (nargs == 0 && argdefs != NULL && co->co_argcount == Py_SIZE(argdefs)) { /* function called with no arguments, but all parameters have a default value: use default values as arguments .*/ args = &PyTuple_GET_ITEM(argdefs, 0); result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); goto done; } } if (kwargs != NULL) { Py_ssize_t pos, i; kwtuple = PyTuple_New(2 * nk); if (kwtuple == NULL) { result = NULL; goto done; } k = &PyTuple_GET_ITEM(kwtuple, 0); pos = i = 0; while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { Py_INCREF(k[i]); Py_INCREF(k[i+1]); i += 2; } nk = i / 2; } else { kwtuple = NULL; k = NULL; } closure = PyFunction_GET_CLOSURE(func); #if PY_MAJOR_VERSION >= 3 kwdefs = PyFunction_GET_KW_DEFAULTS(func); #endif if (argdefs != NULL) { d = &PyTuple_GET_ITEM(argdefs, 0); nd = Py_SIZE(argdefs); } else { d = NULL; nd = 0; } #if PY_MAJOR_VERSION >= 3 result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, kwdefs, closure); #else result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, args, (int)nargs, k, (int)nk, d, (int)nd, closure); #endif Py_XDECREF(kwtuple); done: Py_LeaveRecursiveCall(); return result; } #endif /* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = Py_TYPE(func)->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) return NULL; #endif result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectCallMethO */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { PyObject *self, *result; PyCFunction cfunc; cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); self = __Pyx_CyOrPyCFunction_GET_SELF(func); #if PY_MAJOR_VERSION < 3 if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; #else if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) return NULL; #endif result = cfunc(self, arg); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* PyObjectFastCall */ #if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { PyObject *argstuple; PyObject *result = 0; size_t i; argstuple = PyTuple_New((Py_ssize_t)nargs); if (unlikely(!argstuple)) return NULL; for (i = 0; i < nargs; i++) { Py_INCREF(args[i]); if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; } result = __Pyx_PyObject_Call(func, argstuple, kwargs); bad: Py_DECREF(argstuple); return result; } #endif static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); #if CYTHON_COMPILING_IN_CPYTHON if (nargs == 0 && kwargs == NULL) { if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) return __Pyx_PyObject_CallMethO(func, NULL); } else if (nargs == 1 && kwargs == NULL) { if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) return __Pyx_PyObject_CallMethO(func, args[0]); } #endif #if PY_VERSION_HEX < 0x030800B1 #if CYTHON_FAST_PYCCALL if (PyCFunction_Check(func)) { if (kwargs) { return _PyCFunction_FastCallDict(func, args, nargs, kwargs); } else { return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); } } #if PY_VERSION_HEX >= 0x030700A1 if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); } #endif #endif #if CYTHON_FAST_PYCALL if (PyFunction_Check(func)) { return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); } #endif #endif if (kwargs == NULL) { #if CYTHON_VECTORCALL #if PY_VERSION_HEX < 0x03090000 vectorcallfunc f = _PyVectorcall_Function(func); #else vectorcallfunc f = PyVectorcall_Function(func); #endif if (f) { return f(func, args, (size_t)nargs, NULL); } #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL if (__Pyx_CyFunction_CheckExact(func)) { __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); if (f) return f(func, args, (size_t)nargs, NULL); } #endif } if (nargs == 0) { return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); } #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); #else return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); #endif } /* PyObjectCallNoArg */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { PyObject *arg[2] = {NULL, NULL}; return __Pyx_PyObject_FastCall(func, arg + 1, 0 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); } /* PyObjectCallOneArg */ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *args[2] = {NULL, arg}; return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); } /* PyObjectGetMethod */ static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { PyObject *attr; #if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP __Pyx_TypeName type_name; PyTypeObject *tp = Py_TYPE(obj); PyObject *descr; descrgetfunc f = NULL; PyObject **dictptr, *dict; int meth_found = 0; assert (*method == NULL); if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { attr = __Pyx_PyObject_GetAttrStr(obj, name); goto try_unpack; } if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { return 0; } descr = _PyType_Lookup(tp, name); if (likely(descr != NULL)) { Py_INCREF(descr); #if defined(Py_TPFLAGS_METHOD_DESCRIPTOR) && Py_TPFLAGS_METHOD_DESCRIPTOR if (__Pyx_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) #elif PY_MAJOR_VERSION >= 3 #ifdef __Pyx_CyFunction_USED if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) #else if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type))) #endif #else #ifdef __Pyx_CyFunction_USED if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) #else if (likely(PyFunction_Check(descr))) #endif #endif { meth_found = 1; } else { f = Py_TYPE(descr)->tp_descr_get; if (f != NULL && PyDescr_IsData(descr)) { attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); goto try_unpack; } } } dictptr = _PyObject_GetDictPtr(obj); if (dictptr != NULL && (dict = *dictptr) != NULL) { Py_INCREF(dict); attr = __Pyx_PyDict_GetItemStr(dict, name); if (attr != NULL) { Py_INCREF(attr); Py_DECREF(dict); Py_XDECREF(descr); goto try_unpack; } Py_DECREF(dict); } if (meth_found) { *method = descr; return 1; } if (f != NULL) { attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); Py_DECREF(descr); goto try_unpack; } if (likely(descr != NULL)) { *method = descr; return 0; } type_name = __Pyx_PyType_GetName(tp); PyErr_Format(PyExc_AttributeError, #if PY_MAJOR_VERSION >= 3 "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", type_name, name); #else "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", type_name, PyString_AS_STRING(name)); #endif __Pyx_DECREF_TypeName(type_name); return 0; #else attr = __Pyx_PyObject_GetAttrStr(obj, name); goto try_unpack; #endif try_unpack: #if CYTHON_UNPACK_METHODS if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { PyObject *function = PyMethod_GET_FUNCTION(attr); Py_INCREF(function); Py_DECREF(attr); *method = function; return 1; } #endif *method = attr; return 0; } /* PyObjectCallMethod0 */ static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { PyObject *method = NULL, *result = NULL; int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); if (likely(is_method)) { result = __Pyx_PyObject_CallOneArg(method, obj); Py_DECREF(method); return result; } if (unlikely(!method)) goto bad; result = __Pyx_PyObject_CallNoArg(method); Py_DECREF(method); bad: return result; } /* ValidateBasesTuple */ #if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases) { Py_ssize_t i, n; #if CYTHON_ASSUME_SAFE_MACROS n = PyTuple_GET_SIZE(bases); #else n = PyTuple_Size(bases); if (n < 0) return -1; #endif for (i = 1; i < n; i++) { #if CYTHON_AVOID_BORROWED_REFS PyObject *b0 = PySequence_GetItem(bases, i); if (!b0) return -1; #elif CYTHON_ASSUME_SAFE_MACROS PyObject *b0 = PyTuple_GET_ITEM(bases, i); #else PyObject *b0 = PyTuple_GetItem(bases, i); if (!b0) return -1; #endif PyTypeObject *b; #if PY_MAJOR_VERSION < 3 if (PyClass_Check(b0)) { PyErr_Format(PyExc_TypeError, "base class '%.200s' is an old-style class", PyString_AS_STRING(((PyClassObject*)b0)->cl_name)); #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(b0); #endif return -1; } #endif b = (PyTypeObject*) b0; if (!__Pyx_PyType_HasFeature(b, Py_TPFLAGS_HEAPTYPE)) { __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); PyErr_Format(PyExc_TypeError, "base class '" __Pyx_FMT_TYPENAME "' is not a heap type", b_name); __Pyx_DECREF_TypeName(b_name); #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(b0); #endif return -1; } if (dictoffset == 0) { Py_ssize_t b_dictoffset = 0; #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY b_dictoffset = b->tp_dictoffset; #else PyObject *py_b_dictoffset = PyObject_GetAttrString((PyObject*)b, "__dictoffset__"); if (!py_b_dictoffset) goto dictoffset_return; b_dictoffset = PyLong_AsSsize_t(py_b_dictoffset); Py_DECREF(py_b_dictoffset); if (b_dictoffset == -1 && PyErr_Occurred()) goto dictoffset_return; #endif if (b_dictoffset) { { __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); PyErr_Format(PyExc_TypeError, "extension type '%.200s' has no __dict__ slot, " "but base type '" __Pyx_FMT_TYPENAME "' has: " "either add 'cdef dict __dict__' to the extension type " "or add '__slots__ = [...]' to the base type", type_name, b_name); __Pyx_DECREF_TypeName(b_name); } #if !(CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY) dictoffset_return: #endif #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(b0); #endif return -1; } } #if CYTHON_AVOID_BORROWED_REFS Py_DECREF(b0); #endif } return 0; } #endif /* PyType_Ready */ static int __Pyx_PyType_Ready(PyTypeObject *t) { #if CYTHON_USE_TYPE_SPECS || !(CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API) || defined(PYSTON_MAJOR_VERSION) (void)__Pyx_PyObject_CallMethod0; #if CYTHON_USE_TYPE_SPECS (void)__Pyx_validate_bases_tuple; #endif return PyType_Ready(t); #else int r; PyObject *bases = __Pyx_PyType_GetSlot(t, tp_bases, PyObject*); if (bases && unlikely(__Pyx_validate_bases_tuple(t->tp_name, t->tp_dictoffset, bases) == -1)) return -1; #if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) { int gc_was_enabled; #if PY_VERSION_HEX >= 0x030A00b1 gc_was_enabled = PyGC_Disable(); (void)__Pyx_PyObject_CallMethod0; #else PyObject *ret, *py_status; PyObject *gc = NULL; #if PY_VERSION_HEX >= 0x030700a1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM+0 >= 0x07030400) gc = PyImport_GetModule(__pyx_kp_u_gc); #endif if (unlikely(!gc)) gc = PyImport_Import(__pyx_kp_u_gc); if (unlikely(!gc)) return -1; py_status = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_isenabled); if (unlikely(!py_status)) { Py_DECREF(gc); return -1; } gc_was_enabled = __Pyx_PyObject_IsTrue(py_status); Py_DECREF(py_status); if (gc_was_enabled > 0) { ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_disable); if (unlikely(!ret)) { Py_DECREF(gc); return -1; } Py_DECREF(ret); } else if (unlikely(gc_was_enabled == -1)) { Py_DECREF(gc); return -1; } #endif t->tp_flags |= Py_TPFLAGS_HEAPTYPE; #if PY_VERSION_HEX >= 0x030A0000 t->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE; #endif #else (void)__Pyx_PyObject_CallMethod0; #endif r = PyType_Ready(t); #if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) t->tp_flags &= ~Py_TPFLAGS_HEAPTYPE; #if PY_VERSION_HEX >= 0x030A00b1 if (gc_was_enabled) PyGC_Enable(); #else if (gc_was_enabled) { PyObject *tp, *v, *tb; PyErr_Fetch(&tp, &v, &tb); ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_enable); if (likely(ret || r == -1)) { Py_XDECREF(ret); PyErr_Restore(tp, v, tb); } else { Py_XDECREF(tp); Py_XDECREF(v); Py_XDECREF(tb); r = -1; } } Py_DECREF(gc); #endif } #endif return r; #endif } /* PyObject_GenericGetAttrNoDict */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { __Pyx_TypeName type_name = __Pyx_PyType_GetName(tp); PyErr_Format(PyExc_AttributeError, #if PY_MAJOR_VERSION >= 3 "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", type_name, attr_name); #else "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", type_name, PyString_AS_STRING(attr_name)); #endif __Pyx_DECREF_TypeName(type_name); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { PyObject *descr; PyTypeObject *tp = Py_TYPE(obj); if (unlikely(!PyString_Check(attr_name))) { return PyObject_GenericGetAttr(obj, attr_name); } assert(!tp->tp_dictoffset); descr = _PyType_Lookup(tp, attr_name); if (unlikely(!descr)) { return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); } Py_INCREF(descr); #if PY_MAJOR_VERSION < 3 if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) #endif { descrgetfunc f = Py_TYPE(descr)->tp_descr_get; if (unlikely(f)) { PyObject *res = f(descr, obj, (PyObject *)tp); Py_DECREF(descr); return res; } } return descr; } #endif /* PyObject_GenericGetAttr */ #if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { return PyObject_GenericGetAttr(obj, attr_name); } return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); } #endif /* SetupReduce */ #if !CYTHON_COMPILING_IN_LIMITED_API static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { int ret; PyObject *name_attr; name_attr = __Pyx_PyObject_GetAttrStrNoError(meth, __pyx_n_s_name); if (likely(name_attr)) { ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); } else { ret = -1; } if (unlikely(ret < 0)) { PyErr_Clear(); ret = 0; } Py_XDECREF(name_attr); return ret; } static int __Pyx_setup_reduce(PyObject* type_obj) { int ret = 0; PyObject *object_reduce = NULL; PyObject *object_getstate = NULL; PyObject *object_reduce_ex = NULL; PyObject *reduce = NULL; PyObject *reduce_ex = NULL; PyObject *reduce_cython = NULL; PyObject *setstate = NULL; PyObject *setstate_cython = NULL; PyObject *getstate = NULL; #if CYTHON_USE_PYTYPE_LOOKUP getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); #else getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); if (!getstate && PyErr_Occurred()) { goto __PYX_BAD; } #endif if (getstate) { #if CYTHON_USE_PYTYPE_LOOKUP object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); #else object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); if (!object_getstate && PyErr_Occurred()) { goto __PYX_BAD; } #endif if (object_getstate != getstate) { goto __PYX_GOOD; } } #if CYTHON_USE_PYTYPE_LOOKUP object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #else object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #endif reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; if (reduce_ex == object_reduce_ex) { #if CYTHON_USE_PYTYPE_LOOKUP object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; #else object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; #endif reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); if (likely(reduce_cython)) { ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; } else if (reduce == object_reduce || PyErr_Occurred()) { goto __PYX_BAD; } setstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate); if (!setstate) PyErr_Clear(); if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); if (likely(setstate_cython)) { ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; } else if (!setstate || PyErr_Occurred()) { goto __PYX_BAD; } } PyType_Modified((PyTypeObject*)type_obj); } } goto __PYX_GOOD; __PYX_BAD: if (!PyErr_Occurred()) { __Pyx_TypeName type_obj_name = __Pyx_PyType_GetName((PyTypeObject*)type_obj); PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for " __Pyx_FMT_TYPENAME, type_obj_name); __Pyx_DECREF_TypeName(type_obj_name); } ret = -1; __PYX_GOOD: #if !CYTHON_USE_PYTYPE_LOOKUP Py_XDECREF(object_reduce); Py_XDECREF(object_reduce_ex); Py_XDECREF(object_getstate); Py_XDECREF(getstate); #endif Py_XDECREF(reduce); Py_XDECREF(reduce_ex); Py_XDECREF(reduce_cython); Py_XDECREF(setstate); Py_XDECREF(setstate_cython); return ret; } #endif /* FetchSharedCythonModule */ static PyObject *__Pyx_FetchSharedCythonABIModule(void) { return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); } /* FetchCommonType */ static int __Pyx_VerifyCachedType(PyObject *cached_type, const char *name, Py_ssize_t basicsize, Py_ssize_t expected_basicsize) { if (!PyType_Check(cached_type)) { PyErr_Format(PyExc_TypeError, "Shared Cython type %.200s is not a type object", name); return -1; } if (basicsize != expected_basicsize) { PyErr_Format(PyExc_TypeError, "Shared Cython type %.200s has the wrong size, try recompiling", name); return -1; } return 0; } #if !CYTHON_USE_TYPE_SPECS static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { PyObject* abi_module; const char* object_name; PyTypeObject *cached_type = NULL; abi_module = __Pyx_FetchSharedCythonABIModule(); if (!abi_module) return NULL; object_name = strrchr(type->tp_name, '.'); object_name = object_name ? object_name+1 : type->tp_name; cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); if (cached_type) { if (__Pyx_VerifyCachedType( (PyObject *)cached_type, object_name, cached_type->tp_basicsize, type->tp_basicsize) < 0) { goto bad; } goto done; } if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; PyErr_Clear(); if (PyType_Ready(type) < 0) goto bad; if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) goto bad; Py_INCREF(type); cached_type = type; done: Py_DECREF(abi_module); return cached_type; bad: Py_XDECREF(cached_type); cached_type = NULL; goto done; } #else static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { PyObject *abi_module, *cached_type = NULL; const char* object_name = strrchr(spec->name, '.'); object_name = object_name ? object_name+1 : spec->name; abi_module = __Pyx_FetchSharedCythonABIModule(); if (!abi_module) return NULL; cached_type = PyObject_GetAttrString(abi_module, object_name); if (cached_type) { Py_ssize_t basicsize; #if CYTHON_COMPILING_IN_LIMITED_API PyObject *py_basicsize; py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); if (unlikely(!py_basicsize)) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; #else basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; #endif if (__Pyx_VerifyCachedType( cached_type, object_name, basicsize, spec->basicsize) < 0) { goto bad; } goto done; } if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; PyErr_Clear(); CYTHON_UNUSED_VAR(module); cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); if (unlikely(!cached_type)) goto bad; if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; done: Py_DECREF(abi_module); assert(cached_type == NULL || PyType_Check(cached_type)); return (PyTypeObject *) cached_type; bad: Py_XDECREF(cached_type); cached_type = NULL; goto done; } #endif /* PyVectorcallFastCallDict */ #if CYTHON_METH_FASTCALL static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) { PyObject *res = NULL; PyObject *kwnames; PyObject **newargs; PyObject **kwvalues; Py_ssize_t i, pos; size_t j; PyObject *key, *value; unsigned long keys_are_strings; Py_ssize_t nkw = PyDict_GET_SIZE(kw); newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); if (unlikely(newargs == NULL)) { PyErr_NoMemory(); return NULL; } for (j = 0; j < nargs; j++) newargs[j] = args[j]; kwnames = PyTuple_New(nkw); if (unlikely(kwnames == NULL)) { PyMem_Free(newargs); return NULL; } kwvalues = newargs + nargs; pos = i = 0; keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; while (PyDict_Next(kw, &pos, &key, &value)) { keys_are_strings &= Py_TYPE(key)->tp_flags; Py_INCREF(key); Py_INCREF(value); PyTuple_SET_ITEM(kwnames, i, key); kwvalues[i] = value; i++; } if (unlikely(!keys_are_strings)) { PyErr_SetString(PyExc_TypeError, "keywords must be strings"); goto cleanup; } res = vc(func, newargs, nargs, kwnames); cleanup: Py_DECREF(kwnames); for (i = 0; i < nkw; i++) Py_DECREF(kwvalues[i]); PyMem_Free(newargs); return res; } static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) { if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { return vc(func, args, nargs, NULL); } return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); } #endif /* CythonFunctionShared */ #if CYTHON_COMPILING_IN_LIMITED_API static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { if (__Pyx_CyFunction_Check(func)) { return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; } else if (PyCFunction_Check(func)) { return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; } return 0; } #else static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; } #endif static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API __Pyx_Py_XDECREF_SET( __Pyx_CyFunction_GetClassObj(f), ((classobj) ? __Pyx_NewRef(classobj) : NULL)); #else __Pyx_Py_XDECREF_SET( ((PyCMethodObject *) (f))->mm_class, (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); #endif } static PyObject * __Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) { CYTHON_UNUSED_VAR(closure); if (unlikely(op->func_doc == NULL)) { #if CYTHON_COMPILING_IN_LIMITED_API op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); if (unlikely(!op->func_doc)) return NULL; #else if (((PyCFunctionObject*)op)->m_ml->ml_doc) { #if PY_MAJOR_VERSION >= 3 op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); #else op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); #endif if (unlikely(op->func_doc == NULL)) return NULL; } else { Py_INCREF(Py_None); return Py_None; } #endif } Py_INCREF(op->func_doc); return op->func_doc; } static int __Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); if (value == NULL) { value = Py_None; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_doc, value); return 0; } static PyObject * __Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(op->func_name == NULL)) { #if CYTHON_COMPILING_IN_LIMITED_API op->func_name = PyObject_GetAttrString(op->func, "__name__"); #elif PY_MAJOR_VERSION >= 3 op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); #else op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); #endif if (unlikely(op->func_name == NULL)) return NULL; } Py_INCREF(op->func_name); return op->func_name; } static int __Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); #if PY_MAJOR_VERSION >= 3 if (unlikely(value == NULL || !PyUnicode_Check(value))) #else if (unlikely(value == NULL || !PyString_Check(value))) #endif { PyErr_SetString(PyExc_TypeError, "__name__ must be set to a string object"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_name, value); return 0; } static PyObject * __Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); Py_INCREF(op->func_qualname); return op->func_qualname; } static int __Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); #if PY_MAJOR_VERSION >= 3 if (unlikely(value == NULL || !PyUnicode_Check(value))) #else if (unlikely(value == NULL || !PyString_Check(value))) #endif { PyErr_SetString(PyExc_TypeError, "__qualname__ must be set to a string object"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_qualname, value); return 0; } static PyObject * __Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(op->func_dict == NULL)) { op->func_dict = PyDict_New(); if (unlikely(op->func_dict == NULL)) return NULL; } Py_INCREF(op->func_dict); return op->func_dict; } static int __Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) { CYTHON_UNUSED_VAR(context); if (unlikely(value == NULL)) { PyErr_SetString(PyExc_TypeError, "function's dictionary may not be deleted"); return -1; } if (unlikely(!PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "setting function's dictionary to a non-dict"); return -1; } Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->func_dict, value); return 0; } static PyObject * __Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); Py_INCREF(op->func_globals); return op->func_globals; } static PyObject * __Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(op); CYTHON_UNUSED_VAR(context); Py_INCREF(Py_None); return Py_None; } static PyObject * __Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) { PyObject* result = (op->func_code) ? op->func_code : Py_None; CYTHON_UNUSED_VAR(context); Py_INCREF(result); return result; } static int __Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { int result = 0; PyObject *res = op->defaults_getter((PyObject *) op); if (unlikely(!res)) return -1; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS op->defaults_tuple = PyTuple_GET_ITEM(res, 0); Py_INCREF(op->defaults_tuple); op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); Py_INCREF(op->defaults_kwdict); #else op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); if (unlikely(!op->defaults_tuple)) result = -1; else { op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); if (unlikely(!op->defaults_kwdict)) result = -1; } #endif Py_DECREF(res); return result; } static int __Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value) { value = Py_None; } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { PyErr_SetString(PyExc_TypeError, "__defaults__ must be set to a tuple object"); return -1; } PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " "currently affect the values used in function calls", 1); Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); return 0; } static PyObject * __Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->defaults_tuple; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { if (op->defaults_getter) { if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; result = op->defaults_tuple; } else { result = Py_None; } } Py_INCREF(result); return result; } static int __Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value) { value = Py_None; } else if (unlikely(value != Py_None && !PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "__kwdefaults__ must be set to a dict object"); return -1; } PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " "currently affect the values used in function calls", 1); Py_INCREF(value); __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); return 0; } static PyObject * __Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->defaults_kwdict; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { if (op->defaults_getter) { if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; result = op->defaults_kwdict; } else { result = Py_None; } } Py_INCREF(result); return result; } static int __Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); if (!value || value == Py_None) { value = NULL; } else if (unlikely(!PyDict_Check(value))) { PyErr_SetString(PyExc_TypeError, "__annotations__ must be set to a dict object"); return -1; } Py_XINCREF(value); __Pyx_Py_XDECREF_SET(op->func_annotations, value); return 0; } static PyObject * __Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { PyObject* result = op->func_annotations; CYTHON_UNUSED_VAR(context); if (unlikely(!result)) { result = PyDict_New(); if (unlikely(!result)) return NULL; op->func_annotations = result; } Py_INCREF(result); return result; } static PyObject * __Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { int is_coroutine; CYTHON_UNUSED_VAR(context); if (op->func_is_coroutine) { return __Pyx_NewRef(op->func_is_coroutine); } is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; #if PY_VERSION_HEX >= 0x03050000 if (is_coroutine) { PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; fromlist = PyList_New(1); if (unlikely(!fromlist)) return NULL; Py_INCREF(marker); #if CYTHON_ASSUME_SAFE_MACROS PyList_SET_ITEM(fromlist, 0, marker); #else if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { Py_DECREF(marker); Py_DECREF(fromlist); return NULL; } #endif module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); Py_DECREF(fromlist); if (unlikely(!module)) goto ignore; op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); Py_DECREF(module); if (likely(op->func_is_coroutine)) { return __Pyx_NewRef(op->func_is_coroutine); } ignore: PyErr_Clear(); } #endif op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); return __Pyx_NewRef(op->func_is_coroutine); } #if CYTHON_COMPILING_IN_LIMITED_API static PyObject * __Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { CYTHON_UNUSED_VAR(context); return PyObject_GetAttrString(op->func, "__module__"); } static int __Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { CYTHON_UNUSED_VAR(context); return PyObject_SetAttrString(op->func, "__module__", value); } #endif static PyGetSetDef __pyx_CyFunction_getsets[] = { {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, #if CYTHON_COMPILING_IN_LIMITED_API {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, #endif {0, 0, 0, 0, 0} }; static PyMemberDef __pyx_CyFunction_members[] = { #if !CYTHON_COMPILING_IN_LIMITED_API {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, #endif #if CYTHON_USE_TYPE_SPECS {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, #if CYTHON_METH_FASTCALL #if CYTHON_BACKPORT_VECTORCALL {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, #else #if !CYTHON_COMPILING_IN_LIMITED_API {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, #endif #endif #endif #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, #else {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, #endif #endif {0, 0, 0, 0, 0} }; static PyObject * __Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) { CYTHON_UNUSED_VAR(args); #if PY_MAJOR_VERSION >= 3 Py_INCREF(m->func_qualname); return m->func_qualname; #else return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); #endif } static PyMethodDef __pyx_CyFunction_methods[] = { {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, {0, 0, 0, 0} }; #if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API #define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) #else #define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) #endif static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { #if !CYTHON_COMPILING_IN_LIMITED_API PyCFunctionObject *cf = (PyCFunctionObject*) op; #endif if (unlikely(op == NULL)) return NULL; #if CYTHON_COMPILING_IN_LIMITED_API op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); if (unlikely(!op->func)) return NULL; #endif op->flags = flags; __Pyx_CyFunction_weakreflist(op) = NULL; #if !CYTHON_COMPILING_IN_LIMITED_API cf->m_ml = ml; cf->m_self = (PyObject *) op; #endif Py_XINCREF(closure); op->func_closure = closure; #if !CYTHON_COMPILING_IN_LIMITED_API Py_XINCREF(module); cf->m_module = module; #endif op->func_dict = NULL; op->func_name = NULL; Py_INCREF(qualname); op->func_qualname = qualname; op->func_doc = NULL; #if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API op->func_classobj = NULL; #else ((PyCMethodObject*)op)->mm_class = NULL; #endif op->func_globals = globals; Py_INCREF(op->func_globals); Py_XINCREF(code); op->func_code = code; op->defaults_pyobjects = 0; op->defaults_size = 0; op->defaults = NULL; op->defaults_tuple = NULL; op->defaults_kwdict = NULL; op->defaults_getter = NULL; op->func_annotations = NULL; op->func_is_coroutine = NULL; #if CYTHON_METH_FASTCALL switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { case METH_NOARGS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; break; case METH_O: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; break; case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; break; case METH_FASTCALL | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; break; case METH_VARARGS | METH_KEYWORDS: __Pyx_CyFunction_func_vectorcall(op) = NULL; break; default: PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); Py_DECREF(op); return NULL; } #endif return (PyObject *) op; } static int __Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) { Py_CLEAR(m->func_closure); #if CYTHON_COMPILING_IN_LIMITED_API Py_CLEAR(m->func); #else Py_CLEAR(((PyCFunctionObject*)m)->m_module); #endif Py_CLEAR(m->func_dict); Py_CLEAR(m->func_name); Py_CLEAR(m->func_qualname); Py_CLEAR(m->func_doc); Py_CLEAR(m->func_globals); Py_CLEAR(m->func_code); #if !CYTHON_COMPILING_IN_LIMITED_API #if PY_VERSION_HEX < 0x030900B1 Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); #else { PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; ((PyCMethodObject *) (m))->mm_class = NULL; Py_XDECREF(cls); } #endif #endif Py_CLEAR(m->defaults_tuple); Py_CLEAR(m->defaults_kwdict); Py_CLEAR(m->func_annotations); Py_CLEAR(m->func_is_coroutine); if (m->defaults) { PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); int i; for (i = 0; i < m->defaults_pyobjects; i++) Py_XDECREF(pydefaults[i]); PyObject_Free(m->defaults); m->defaults = NULL; } return 0; } static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) { if (__Pyx_CyFunction_weakreflist(m) != NULL) PyObject_ClearWeakRefs((PyObject *) m); __Pyx_CyFunction_clear(m); __Pyx_PyHeapTypeObject_GC_Del(m); } static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) { PyObject_GC_UnTrack(m); __Pyx__CyFunction_dealloc(m); } static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) { Py_VISIT(m->func_closure); #if CYTHON_COMPILING_IN_LIMITED_API Py_VISIT(m->func); #else Py_VISIT(((PyCFunctionObject*)m)->m_module); #endif Py_VISIT(m->func_dict); Py_VISIT(m->func_name); Py_VISIT(m->func_qualname); Py_VISIT(m->func_doc); Py_VISIT(m->func_globals); Py_VISIT(m->func_code); #if !CYTHON_COMPILING_IN_LIMITED_API Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); #endif Py_VISIT(m->defaults_tuple); Py_VISIT(m->defaults_kwdict); Py_VISIT(m->func_is_coroutine); if (m->defaults) { PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); int i; for (i = 0; i < m->defaults_pyobjects; i++) Py_VISIT(pydefaults[i]); } return 0; } static PyObject* __Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) { #if PY_MAJOR_VERSION >= 3 return PyUnicode_FromFormat("", op->func_qualname, (void *)op); #else return PyString_FromFormat("", PyString_AsString(op->func_qualname), (void *)op); #endif } static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { #if CYTHON_COMPILING_IN_LIMITED_API PyObject *f = ((__pyx_CyFunctionObject*)func)->func; PyObject *py_name = NULL; PyCFunction meth; int flags; meth = PyCFunction_GetFunction(f); if (unlikely(!meth)) return NULL; flags = PyCFunction_GetFlags(f); if (unlikely(flags < 0)) return NULL; #else PyCFunctionObject* f = (PyCFunctionObject*)func; PyCFunction meth = f->m_ml->ml_meth; int flags = f->m_ml->ml_flags; #endif Py_ssize_t size; switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { case METH_VARARGS: if (likely(kw == NULL || PyDict_Size(kw) == 0)) return (*meth)(self, arg); break; case METH_VARARGS | METH_KEYWORDS: return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); case METH_NOARGS: if (likely(kw == NULL || PyDict_Size(kw) == 0)) { #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(arg); #else size = PyTuple_Size(arg); if (unlikely(size < 0)) return NULL; #endif if (likely(size == 0)) return (*meth)(self, NULL); #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", py_name, size); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", f->m_ml->ml_name, size); #endif return NULL; } break; case METH_O: if (likely(kw == NULL || PyDict_Size(kw) == 0)) { #if CYTHON_ASSUME_SAFE_MACROS size = PyTuple_GET_SIZE(arg); #else size = PyTuple_Size(arg); if (unlikely(size < 0)) return NULL; #endif if (likely(size == 1)) { PyObject *result, *arg0; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS arg0 = PyTuple_GET_ITEM(arg, 0); #else arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; #endif result = (*meth)(self, arg0); #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) Py_DECREF(arg0); #endif return result; } #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", py_name, size); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", f->m_ml->ml_name, size); #endif return NULL; } break; default: PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); return NULL; } #if CYTHON_COMPILING_IN_LIMITED_API py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); if (!py_name) return NULL; PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", py_name); Py_DECREF(py_name); #else PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", f->m_ml->ml_name); #endif return NULL; } static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *self, *result; #if CYTHON_COMPILING_IN_LIMITED_API self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); if (unlikely(!self) && PyErr_Occurred()) return NULL; #else self = ((PyCFunctionObject*)func)->m_self; #endif result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); return result; } static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { PyObject *result; __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; #if CYTHON_METH_FASTCALL __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); if (vc) { #if CYTHON_ASSUME_SAFE_MACROS return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); #else (void) &__Pyx_PyVectorcall_FastCallDict; return PyVectorcall_Call(func, args, kw); #endif } #endif if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { Py_ssize_t argc; PyObject *new_args; PyObject *self; #if CYTHON_ASSUME_SAFE_MACROS argc = PyTuple_GET_SIZE(args); #else argc = PyTuple_Size(args); if (unlikely(!argc) < 0) return NULL; #endif new_args = PyTuple_GetSlice(args, 1, argc); if (unlikely(!new_args)) return NULL; self = PyTuple_GetItem(args, 0); if (unlikely(!self)) { Py_DECREF(new_args); #if PY_MAJOR_VERSION > 2 PyErr_Format(PyExc_TypeError, "unbound method %.200S() needs an argument", cyfunc->func_qualname); #else PyErr_SetString(PyExc_TypeError, "unbound method needs an argument"); #endif return NULL; } result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); Py_DECREF(new_args); } else { result = __Pyx_CyFunction_Call(func, args, kw); } return result; } #if CYTHON_METH_FASTCALL static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) { int ret = 0; if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { if (unlikely(nargs < 1)) { PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); return -1; } ret = 1; } if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); return -1; } return ret; } static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } if (unlikely(nargs != 0)) { PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", def->ml_name, nargs); return NULL; } return def->ml_meth(self, NULL); } static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } if (unlikely(nargs != 1)) { PyErr_Format(PyExc_TypeError, "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", def->ml_name, nargs); return NULL; } return def->ml_meth(self, args[0]); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } return ((__Pyx_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); #if CYTHON_BACKPORT_VECTORCALL Py_ssize_t nargs = (Py_ssize_t)nargsf; #else Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); #endif PyObject *self; switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { case 1: self = args[0]; args += 1; nargs -= 1; break; case 0: self = ((PyCFunctionObject*)cyfunc)->m_self; break; default: return NULL; } return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); } #endif #if CYTHON_USE_TYPE_SPECS static PyType_Slot __pyx_CyFunctionType_slots[] = { {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, {Py_tp_methods, (void *)__pyx_CyFunction_methods}, {Py_tp_members, (void *)__pyx_CyFunction_members}, {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, {0, 0}, }; static PyType_Spec __pyx_CyFunctionType_spec = { __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", sizeof(__pyx_CyFunctionObject), 0, #ifdef Py_TPFLAGS_METHOD_DESCRIPTOR Py_TPFLAGS_METHOD_DESCRIPTOR | #endif #if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) _Py_TPFLAGS_HAVE_VECTORCALL | #endif Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, __pyx_CyFunctionType_slots }; #else static PyTypeObject __pyx_CyFunctionType_type = { PyVarObject_HEAD_INIT(0, 0) __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", sizeof(__pyx_CyFunctionObject), 0, (destructor) __Pyx_CyFunction_dealloc, #if !CYTHON_METH_FASTCALL 0, #elif CYTHON_BACKPORT_VECTORCALL (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), #else offsetof(PyCFunctionObject, vectorcall), #endif 0, 0, #if PY_MAJOR_VERSION < 3 0, #else 0, #endif (reprfunc) __Pyx_CyFunction_repr, 0, 0, 0, 0, __Pyx_CyFunction_CallAsMethod, 0, 0, 0, 0, #ifdef Py_TPFLAGS_METHOD_DESCRIPTOR Py_TPFLAGS_METHOD_DESCRIPTOR | #endif #if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL _Py_TPFLAGS_HAVE_VECTORCALL | #endif Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, 0, (traverseproc) __Pyx_CyFunction_traverse, (inquiry) __Pyx_CyFunction_clear, 0, #if PY_VERSION_HEX < 0x030500A0 offsetof(__pyx_CyFunctionObject, func_weakreflist), #else offsetof(PyCFunctionObject, m_weakreflist), #endif 0, 0, __pyx_CyFunction_methods, __pyx_CyFunction_members, __pyx_CyFunction_getsets, 0, 0, __Pyx_PyMethod_New, 0, offsetof(__pyx_CyFunctionObject, func_dict), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, #if PY_VERSION_HEX >= 0x030400a1 0, #endif #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, #endif #if __PYX_NEED_TP_PRINT_SLOT 0, #endif #if PY_VERSION_HEX >= 0x030C0000 0, #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 0, #endif }; #endif static int __pyx_CyFunction_init(PyObject *module) { #if CYTHON_USE_TYPE_SPECS __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); #else CYTHON_UNUSED_VAR(module); __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); #endif if (unlikely(__pyx_CyFunctionType == NULL)) { return -1; } return 0; } static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults = PyObject_Malloc(size); if (unlikely(!m->defaults)) return PyErr_NoMemory(); memset(m->defaults, 0, size); m->defaults_pyobjects = pyobjects; m->defaults_size = size; return m->defaults; } static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults_tuple = tuple; Py_INCREF(tuple); } static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->defaults_kwdict = dict; Py_INCREF(dict); } static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; m->func_annotations = dict; Py_INCREF(dict); } /* CythonFunction */ static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { PyObject *op = __Pyx_CyFunction_Init( PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), ml, flags, qualname, closure, module, globals, code ); if (likely(op)) { PyObject_GC_Track(op); } return op; } /* PyDictVersioning */ #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { PyObject *dict = Py_TYPE(obj)->tp_dict; return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; } static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { PyObject **dictptr = NULL; Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; if (offset) { #if CYTHON_COMPILING_IN_CPYTHON dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); #else dictptr = _PyObject_GetDictPtr(obj); #endif } return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; } static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { PyObject *dict = Py_TYPE(obj)->tp_dict; if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) return 0; return obj_dict_version == __Pyx_get_object_dict_version(obj); } #endif /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif CYTHON_MAYBE_UNUSED_VAR(tstate); if (unlikely(!__pyx_cython_runtime)) { return c_line; } __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { __PYX_PY_DICT_LOOKUP_IF_MODIFIED( use_cline, *cython_runtime_dict, __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) } else #endif { PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { PyErr_Clear(); use_cline = NULL; } } if (!use_cline) { c_line = 0; (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { c_line = 0; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); return c_line; } #endif /* CodeObjectCache */ #if !CYTHON_COMPILING_IN_LIMITED_API static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } #endif /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" #if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API #ifndef Py_BUILD_CORE #define Py_BUILD_CORE 1 #endif #include "internal/pycore_frame.h" #endif #if CYTHON_COMPILING_IN_LIMITED_API static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, PyObject *firstlineno, PyObject *name) { PyObject *replace = NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; replace = PyObject_GetAttrString(code, "replace"); if (likely(replace)) { PyObject *result; result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); Py_DECREF(replace); return result; } PyErr_Clear(); #if __PYX_LIMITED_VERSION_HEX < 0x030780000 { PyObject *compiled = NULL, *result = NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; compiled = Py_CompileString( "out = type(code)(\n" " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" " code.co_lnotab)\n", "", Py_file_input); if (!compiled) return NULL; result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); Py_DECREF(compiled); if (!result) PyErr_Print(); Py_DECREF(result); result = PyDict_GetItemString(scratch_dict, "out"); if (result) Py_INCREF(result); return result; } #else return NULL; #endif } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; PyObject *replace = NULL, *getframe = NULL, *frame = NULL; PyObject *exc_type, *exc_value, *exc_traceback; int success = 0; if (c_line) { (void) __pyx_cfilenm; (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); } PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); code_object = Py_CompileString("_getframe()", filename, Py_eval_input); if (unlikely(!code_object)) goto bad; py_py_line = PyLong_FromLong(py_line); if (unlikely(!py_py_line)) goto bad; py_funcname = PyUnicode_FromString(funcname); if (unlikely(!py_funcname)) goto bad; dict = PyDict_New(); if (unlikely(!dict)) goto bad; { PyObject *old_code_object = code_object; code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); Py_DECREF(old_code_object); } if (unlikely(!code_object)) goto bad; getframe = PySys_GetObject("_getframe"); if (unlikely(!getframe)) goto bad; if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; frame = PyEval_EvalCode(code_object, dict, dict); if (unlikely(!frame) || frame == Py_None) goto bad; success = 1; bad: PyErr_Restore(exc_type, exc_value, exc_traceback); Py_XDECREF(code_object); Py_XDECREF(py_py_line); Py_XDECREF(py_funcname); Py_XDECREF(dict); Py_XDECREF(replace); if (success) { PyTraceBack_Here( (struct _frame*)frame); } Py_XDECREF(frame); } #else static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = NULL; PyObject *py_funcname = NULL; #if PY_MAJOR_VERSION < 3 PyObject *py_srcfile = NULL; py_srcfile = PyString_FromString(filename); if (!py_srcfile) goto bad; #endif if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); if (!py_funcname) goto bad; #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); if (!py_funcname) goto bad; funcname = PyUnicode_AsUTF8(py_funcname); if (!funcname) goto bad; #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); if (!py_funcname) goto bad; #endif } #if PY_MAJOR_VERSION < 3 py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); #else py_code = PyCode_NewEmpty(filename, funcname, py_line); #endif Py_XDECREF(py_funcname); return py_code; bad: Py_XDECREF(py_funcname); #if PY_MAJOR_VERSION < 3 Py_XDECREF(py_srcfile); #endif return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject *ptype, *pvalue, *ptraceback; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) { /* If the code object creation fails, then we should clear the fetched exception references and propagate the new exception */ Py_XDECREF(ptype); Py_XDECREF(pvalue); Py_XDECREF(ptraceback); goto bad; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( tstate, /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } #endif /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if ((sizeof(int) < sizeof(long))) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS if (unlikely(__Pyx_PyLong_IsNeg(x))) { goto raise_neg_overflow; } else if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_DigitCount(x)) { case 2: if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } } #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if ((sizeof(int) <= sizeof(unsigned long))) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_SignedDigitCount(x)) { case -2: if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } } #endif if ((sizeof(int) <= sizeof(long))) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int ret = -1; #if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); #else PyObject *stepval = NULL, *mask = NULL, *shift = NULL; int bits, remaining_bits, is_negative = 0; long idigit; int chunk_size = (sizeof(long) < 8) ? 30 : 62; if (unlikely(!PyLong_CheckExact(v))) { PyObject *tmp = v; v = PyNumber_Long(v); assert(PyLong_CheckExact(v)); Py_DECREF(tmp); if (unlikely(!v)) return (int) -1; } #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(x) == 0) return (int) 0; is_negative = Py_SIZE(x) < 0; #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; is_negative = result == 1; } #endif if (is_unsigned && unlikely(is_negative)) { goto raise_neg_overflow; } else if (is_negative) { stepval = PyNumber_Invert(v); if (unlikely(!stepval)) return (int) -1; } else { stepval = __Pyx_NewRef(v); } val = (int) 0; mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { PyObject *tmp, *digit; digit = PyNumber_And(stepval, mask); if (unlikely(!digit)) goto done; idigit = PyLong_AsLong(digit); Py_DECREF(digit); if (unlikely(idigit < 0)) goto done; tmp = PyNumber_Rshift(stepval, shift); if (unlikely(!tmp)) goto done; Py_DECREF(stepval); stepval = tmp; val |= ((int) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(stepval) == 0) goto unpacking_done; #endif } idigit = PyLong_AsLong(stepval); if (unlikely(idigit < 0)) goto done; remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); if (unlikely(idigit >= (1L << remaining_bits))) goto raise_overflow; val |= ((int) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 unpacking_done: #endif if (!is_unsigned) { if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) goto raise_overflow; if (is_negative) val = ~val; } ret = 0; done: Py_XDECREF(shift); Py_XDECREF(mask); Py_XDECREF(stepval); #endif Py_DECREF(v); if (likely(!ret)) return val; } return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const int neg_one = (int) -1, const_zero = (int) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(int) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(int) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(int) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; #if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 return _PyLong_FromByteArray(bytes, sizeof(int), little, !is_unsigned); #else PyObject *from_bytes, *result = NULL; PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); if (!from_bytes) return NULL; py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); if (!py_bytes) goto limited_bad; order_str = PyUnicode_FromString(little ? "little" : "big"); if (!order_str) goto limited_bad; arg_tuple = PyTuple_Pack(2, py_bytes, order_str); if (!arg_tuple) goto limited_bad; if (!is_unsigned) { kwds = PyDict_New(); if (!kwds) goto limited_bad; if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; } result = PyObject_Call(from_bytes, arg_tuple, kwds); limited_bad: Py_XDECREF(kwds); Py_XDECREF(arg_tuple); Py_XDECREF(order_str); Py_XDECREF(py_bytes); Py_XDECREF(from_bytes); return result; #endif } } /* FormatTypeName */ #if CYTHON_COMPILING_IN_LIMITED_API static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp) { PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, __pyx_n_s_name); if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { PyErr_Clear(); Py_XDECREF(name); name = __Pyx_NewRef(__pyx_n_s__12); } return name; } #endif /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; #if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); #else PyObject *from_bytes, *result = NULL; PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); if (!from_bytes) return NULL; py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); if (!py_bytes) goto limited_bad; order_str = PyUnicode_FromString(little ? "little" : "big"); if (!order_str) goto limited_bad; arg_tuple = PyTuple_Pack(2, py_bytes, order_str); if (!arg_tuple) goto limited_bad; if (!is_unsigned) { kwds = PyDict_New(); if (!kwds) goto limited_bad; if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; } result = PyObject_Call(from_bytes, arg_tuple, kwds); limited_bad: Py_XDECREF(kwds); Py_XDECREF(arg_tuple); Py_XDECREF(order_str); Py_XDECREF(py_bytes); Py_XDECREF(from_bytes); return result; #endif } } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif const long neg_one = (long) -1, const_zero = (long) 0; #ifdef __Pyx_HAS_GCC_DIAGNOSTIC #pragma GCC diagnostic pop #endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if ((sizeof(long) < sizeof(long))) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS if (unlikely(__Pyx_PyLong_IsNeg(x))) { goto raise_neg_overflow; } else if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_DigitCount(x)) { case 2: if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } } #endif #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if ((sizeof(long) <= sizeof(unsigned long))) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS if (__Pyx_PyLong_IsCompact(x)) { __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) } else { const digit* digits = __Pyx_PyLong_Digits(x); assert(__Pyx_PyLong_DigitCount(x) > 1); switch (__Pyx_PyLong_SignedDigitCount(x)) { case -2: if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } } #endif if ((sizeof(long) <= sizeof(long))) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int ret = -1; #if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); #else PyObject *stepval = NULL, *mask = NULL, *shift = NULL; int bits, remaining_bits, is_negative = 0; long idigit; int chunk_size = (sizeof(long) < 8) ? 30 : 62; if (unlikely(!PyLong_CheckExact(v))) { PyObject *tmp = v; v = PyNumber_Long(v); assert(PyLong_CheckExact(v)); Py_DECREF(tmp); if (unlikely(!v)) return (long) -1; } #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(x) == 0) return (long) 0; is_negative = Py_SIZE(x) < 0; #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; is_negative = result == 1; } #endif if (is_unsigned && unlikely(is_negative)) { goto raise_neg_overflow; } else if (is_negative) { stepval = PyNumber_Invert(v); if (unlikely(!stepval)) return (long) -1; } else { stepval = __Pyx_NewRef(v); } val = (long) 0; mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { PyObject *tmp, *digit; digit = PyNumber_And(stepval, mask); if (unlikely(!digit)) goto done; idigit = PyLong_AsLong(digit); Py_DECREF(digit); if (unlikely(idigit < 0)) goto done; tmp = PyNumber_Rshift(stepval, shift); if (unlikely(!tmp)) goto done; Py_DECREF(stepval); stepval = tmp; val |= ((long) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 if (Py_SIZE(stepval) == 0) goto unpacking_done; #endif } idigit = PyLong_AsLong(stepval); if (unlikely(idigit < 0)) goto done; remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); if (unlikely(idigit >= (1L << remaining_bits))) goto raise_overflow; val |= ((long) idigit) << bits; #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 unpacking_done: #endif if (!is_unsigned) { if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) goto raise_overflow; if (is_negative) val = ~val; } ret = 0; done: Py_XDECREF(shift); Py_XDECREF(mask); Py_XDECREF(stepval); #endif Py_DECREF(v); if (likely(!ret)) return val; } return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* FastTypeChecks */ #if CYTHON_COMPILING_IN_CPYTHON static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { while (a) { a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); if (a == b) return 1; } return b == &PyBaseObject_Type; } static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (a == b) return 1; mro = a->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(a, b); } static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (cls == a || cls == b) return 1; mro = cls->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { PyObject *base = PyTuple_GET_ITEM(mro, i); if (base == (PyObject *)a || base == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); } #if PY_MAJOR_VERSION == 2 static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { PyObject *exception, *value, *tb; int res; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&exception, &value, &tb); res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } if (!res) { res = PyObject_IsSubclass(err, exc_type2); if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } } __Pyx_ErrRestore(exception, value, tb); return res; } #else static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { if (exc_type1) { return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); } else { return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); } } #endif static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { Py_ssize_t i, n; assert(PyExceptionClass_Check(exc_type)); n = PyTuple_GET_SIZE(tuple); #if PY_MAJOR_VERSION >= 3 for (i=0; i= 0x030B00A4 return Py_Version & ~0xFFUL; #else const char* rt_version = Py_GetVersion(); unsigned long version = 0; unsigned long factor = 0x01000000UL; unsigned int digit = 0; int i = 0; while (factor) { while ('0' <= rt_version[i] && rt_version[i] <= '9') { digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); ++i; } version += factor * digit; if (rt_version[i] != '.') break; digit = 0; factor >>= 8; ++i; } return version; #endif } static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { const unsigned long MAJOR_MINOR = 0xFFFF0000UL; if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) return 0; if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) return 1; { char message[200]; PyOS_snprintf(message, sizeof(message), "compile time Python version %d.%d " "of module '%.100s' " "%s " "runtime version %d.%d", (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), __Pyx_MODULE_NAME, (allow_newer) ? "was newer than" : "does not match", (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) ); return PyErr_WarnEx(NULL, message, 1); } } /* InitStrings */ #if PY_MAJOR_VERSION >= 3 static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { if (t.is_unicode | t.is_str) { if (t.intern) { *str = PyUnicode_InternFromString(t.s); } else if (t.encoding) { *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); } else { *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); } } else { *str = PyBytes_FromStringAndSize(t.s, t.n - 1); } if (!*str) return -1; if (PyObject_Hash(*str) == -1) return -1; return 0; } #endif static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION >= 3 __Pyx_InitString(*t, t->p); #else if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) return -1; #endif ++t; } return 0; } #include static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { size_t len = strlen(s); if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { PyErr_SetString(PyExc_OverflowError, "byte string is too long"); return -1; } return (Py_ssize_t) len; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { Py_ssize_t len = __Pyx_ssize_strlen(c_str); if (unlikely(len < 0)) return NULL; return __Pyx_PyUnicode_FromStringAndSize(c_str, len); } static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { Py_ssize_t len = __Pyx_ssize_strlen(c_str); if (unlikely(len < 0)) return NULL; return PyByteArray_FromStringAndSize(c_str, len); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #if !CYTHON_PEP393_ENABLED static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; } #else static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (likely(PyUnicode_IS_ASCII(o))) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif } #endif #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { return __Pyx_PyUnicode_AsStringAndSize(o, length); } else #endif #if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { int retval; if (unlikely(!x)) return -1; retval = __Pyx_PyObject_IsTrue(x); Py_DECREF(x); return retval; } static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); #if PY_MAJOR_VERSION >= 3 if (PyLong_Check(result)) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " "The ability to return an instance of a strict subclass of int is deprecated, " "and may be removed in a future version of Python.", result_type_name)) { __Pyx_DECREF_TypeName(result_type_name); Py_DECREF(result); return NULL; } __Pyx_DECREF_TypeName(result_type_name); return result; } #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", type_name, type_name, result_type_name); __Pyx_DECREF_TypeName(result_type_name); Py_DECREF(result); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x) || PyLong_Check(x))) #else if (likely(PyLong_Check(x))) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = m->nb_int(x); } else if (m && m->nb_long) { name = "long"; res = m->nb_long(x); } #else if (likely(m && m->nb_int)) { name = "int"; res = m->nb_int(x); } #endif #else if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { res = PyNumber_Int(x); } #endif if (likely(res)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { #else if (unlikely(!PyLong_CheckExact(res))) { #endif return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(b); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS if (likely(__Pyx_PyLong_IsCompact(b))) { return __Pyx_PyLong_CompactValue(b); } else { const digit* digits = __Pyx_PyLong_Digits(b); const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); #if PY_MAJOR_VERSION < 3 } else if (likely(PyInt_CheckExact(o))) { return PyInt_AS_LONG(o); #endif } else { Py_ssize_t ival; PyObject *x; x = PyNumber_Index(o); if (!x) return -1; ival = PyInt_AsLong(x); Py_DECREF(x); return ival; } } static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } /* #### Code section: utility_code_pragmas_end ### */ #ifdef _MSC_VER #pragma warning( pop ) #endif /* #### Code section: end ### */ #endif /* Py_PYTHON_H */ scikit-fmm-2024.05.29/skfmm/pheap.pyx000066400000000000000000000016551464214672300171560ustar00rootroot00000000000000# distutils: language = c++ # distutils: sources = heap.cpp from libcpp cimport bool cdef extern from "heap.h": cdef cppclass heap: heap(int, bool) except + int push(int, double) except + void pop(int *, double *) except + void set(int, double) except + bool empty() double peek() except + cdef class pheap: cdef heap *thisptr def __cinit__(self, n, self_test): self.thisptr = new heap(n, self_test) def __dealloc__(self): del self.thisptr def _push(self, addr, value): return self.thisptr.push(addr, value) def _pop(self): cdef int addr cdef double value self.thisptr.pop(&addr, &value) return addr, value def _set(self, addr, value): self.thisptr.set(addr, value) def _empty(self): return self.thisptr.empty() def _peek(self): cdef double dist return self.thisptr.peek() scikit-fmm-2024.05.29/skfmm/travel_time_marcher.cpp000066400000000000000000000067151464214672300220410ustar00rootroot00000000000000//travel_time_marcher.cpp #include "travel_time_marcher.h" #include "math.h" #include "heap.h" #include #include #include // std::min_element, std::max_element void travelTimeMarcher::initalizeFrozen() { distanceMarcher::initalizeFrozen(); for (int i=0; i()); if(res == std::numeric_limits::infinity()) throw std::runtime_error("Unreachable voxel"); else return res; } // second order point update // update the distance from the frozen points const double aa = 9.0/4.0; const double oneThird = 1.0/3.0; double travelTimeMarcher::updatePointOrderTwo(int i, std::setavoid_dim) { double a,b,c; a=b=c=0; int naddr=0; for (int dim=0; dim=0) || (distance_[naddr2]>=value1 && value1 <=0))) { value2=distance_[naddr2]; if (phi_[naddr2] * phi_[naddr] < 0 || phi_[naddr2] * phi_[i] < 0) value2 *= -1; } } } } if (value2::infinity(); //end of the recursion, use inf so that it is discarded selecting the minimum std::vector sols; for (int ind=0; ind tempset = avoid_dim; std::pair::iterator, bool> ret = tempset.insert(ind); if(!ret.second) continue; //avoid recursive call on identical parameters (the set already had *ind* in it) sols.push_back(updatePointOrderTwo(i,tempset)); } if(sols.size()==0) return std::numeric_limits::infinity();//All the derivates with different dimensionalities are 0 return *std::min_element(sols.begin(), sols.end()); } } double travelTimeMarcher::solveQuadratic(int i, const double &a, const double &b, double &c) { c -= 1/pow(speed_[i],2); double r0=0; double det = pow(b,2)-4*a*c; if (det>=0) { r0 = (-b+sqrt(det))/2.0/a; } else { throw std::runtime_error("Negative discriminant in time marcher quadratic."); } return r0; } scikit-fmm-2024.05.29/skfmm/travel_time_marcher.h000066400000000000000000000021541464214672300214770ustar00rootroot00000000000000//travel_time_marcher.h #include "distance_marcher.h" #include class heap; class travelTimeMarcher : public distanceMarcher { public: travelTimeMarcher(double *phi, double *dx, long *flag, double *distance, int ndim, int *shape, bool self_test, int order, double *speed, double narrow, int periodic) : distanceMarcher(phi, dx, flag, distance, ndim, shape, self_test, order, narrow, periodic), speed_(speed) { for (int i=0; i avoid_dim); virtual double solveQuadratic(int i, const double &a, const double &b, double &c); private: double *speed_; }; scikit-fmm-2024.05.29/static_analysis.sh000066400000000000000000000001151464214672300177160ustar00rootroot00000000000000cppcheck --enable=all skfmm/ pyflakes skfmm/ pylint skfmm/ pychecker skfmm/