[
  {
    "path": ".gitattributes",
    "content": "*.ipynb linguist-vendored"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "# This workflow will install Python dependencies, run tests and lint with a variety of Python versions\n# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions\n\nname: build\n\non:\n  push:\n    branches: [ \"master\" ]\n  pull_request:\n    branches: [ \"master\" ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        python-version: [\"3.8\", \"3.9\", \"3.10\"]\n\n    steps:\n    - uses: actions/checkout@v3\n    - name: Set up Python ${{ matrix.python-version }}\n      uses: actions/setup-python@v3\n      with:\n        python-version: ${{ matrix.python-version }}\n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        python -m pip install flake8 pytest\n        if [ -f requirements.txt ]; then pip install -r requirements.txt; fi\n        pip install -e .'[dev]'\n    - name: Lint with flake8\n      run: |\n        # stop the build if there are Python syntax errors or undefined names\n        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics\n        # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide\n        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics\n    - name: Test with pytest\n      run: |\n        pip install pytest\n        pip install pytest-cov\n        pip install pytest-subtests\n        pytest tests/ --doctest-modules --junitxml=junit/test-results.xml --cov=com --cov-report=xml --cov-report=html\n"
  },
  {
    "path": ".github/workflows/documentation-links.yaml",
    "content": "# .github/workflows/documentation-links.yaml\n\nname: Read the Docs Pull Request Preview\non:\n  pull_request_target:\n    types:\n      - opened\n\npermissions:\n  pull-requests: write\n\njobs:\n  documentation-links:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: readthedocs/actions/preview@v1\n        with:\n          project-slug: \"pymgrid\"\n"
  },
  {
    "path": ".github/workflows/garage-compat.yml",
    "content": "# This workflow will install Python dependencies, run tests and lint with a variety of Python versions\n# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions\n\nname: garage-compat\n\non:\n  push:\n    branches: [ \"master\" ]\n  pull_request:\n    branches: [ \"master\" ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        python-version: [\"3.8\", \"3.9\"]\n\n    steps:\n    - uses: actions/checkout@v3\n    - name: Set up Python ${{ matrix.python-version }}\n      uses: actions/setup-python@v3\n      with:\n        python-version: ${{ matrix.python-version }}\n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        python -m pip install flake8 pytest\n        if [ -f requirements.txt ]; then pip install -r requirements.txt; fi\n        pip install -e .'[dev]'\n    - name: Get garage VERSION\n      uses: wei/wget@v1\n      with:\n        args: -O VERSION https://raw.githubusercontent.com/rlworkgroup/garage/master/VERSION\n    - name: Get garage README.md\n      uses: wei/wget@v1\n      with:\n        args: -O README.md https://raw.githubusercontent.com/rlworkgroup/garage/master/README.md\n    - name: Get garage setup.py\n      uses: wei/wget@v1\n      with:\n        args: -O garage_setup.py https://raw.githubusercontent.com/rlworkgroup/garage/master/setup.py\n    - name: Extract garage dependencies\n      run:  |\n        python -m garage_setup egg_info\n        in_all=false\n        while IFS= read -r line; do\n          if [[ \"$line\" == *\"[all]\"* ]]; then\n            in_all=true\n          elif [[ \"$line\" == \\[* ]]; then\n            in_all=false\n          elif [[ $in_all == true ]]; then\n            echo $\"$line\" >> src/garage.egg-info/requires_all.txt\n          fi\n        done < \"src/garage.egg-info/requires.txt\"\n    - name: Install garage dependencies\n      run:  |\n        sudo apt install libopenmpi-dev\n        cat src/garage.egg-info/requires_all.txt\n        python -m pip install -r src/garage.egg-info/requires_all.txt        \n    - name: Lint with flake8\n      run: |\n        # stop the build if there are Python syntax errors or undefined names\n        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics\n        # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide\n        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics\n    - name: Test with pytest\n      run: |\n        pip install pytest\n        pip install pytest-cov\n        pip install pytest-subtests\n        pytest tests/ --doctest-modules --junitxml=junit/test-results.xml --cov=com --cov-report=xml --cov-report=html\n"
  },
  {
    "path": ".gitignore",
    "content": "#Ignore what is not python code\nnotebooks/\n.DS_STORE\n.idea\n*.pkl\npymgrid/__pycache__/\n*.ipynb\n.ipynb_checkpoints\n__pycache__/\n\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\ndocs/source/reference/api/\npip-wheel-metadata/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n*sandbox.py\n"
  },
  {
    "path": ".readthedocs.yaml",
    "content": "# .readthedocs.yaml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details\n\n# Required\nversion: 2\n\n# Set the version of Python and other tools you might need\nbuild:\n  os: ubuntu-20.04\n  tools:\n    python: \"3.8\"\n\nsphinx:\n   configuration: docs/source/conf.py\n\npython:\n   install:\n     - method: pip\n       path: .\n       extra_requirements:\n         - all\n\nformats:\n  - pdf"
  },
  {
    "path": "CHANGELOG.md",
    "content": "\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "\n"
  },
  {
    "path": "LICENSE",
    "content": "                   GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n  This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n  0. Additional Definitions.\n\n  As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n  \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n  An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n  A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library.  The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n  The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n  The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n  1. Exception to Section 3 of the GNU GPL.\n\n  You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n  2. Conveying Modified Versions.\n\n  If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n   a) under this License, provided that you make a good faith effort to\n   ensure that, in the event an Application does not supply the\n   function or data, the facility still operates, and performs\n   whatever part of its purpose remains meaningful, or\n\n   b) under the GNU GPL, with none of the additional permissions of\n   this License applicable to that copy.\n\n  3. Object Code Incorporating Material from Library Header Files.\n\n  The object code form of an Application may incorporate material from\na header file that is part of the Library.  You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n   a) Give prominent notice with each copy of the object code that the\n   Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the object code with a copy of the GNU GPL and this license\n   document.\n\n  4. Combined Works.\n\n  You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n   a) Give prominent notice with each copy of the Combined Work that\n   the Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the Combined Work with a copy of the GNU GPL and this license\n   document.\n\n   c) For a Combined Work that displays copyright notices during\n   execution, include the copyright notice for the Library among\n   these notices, as well as a reference directing the user to the\n   copies of the GNU GPL and this license document.\n\n   d) Do one of the following:\n\n       0) Convey the Minimal Corresponding Source under the terms of this\n       License, and the Corresponding Application Code in a form\n       suitable for, and under terms that permit, the user to\n       recombine or relink the Application with a modified version of\n       the Linked Version to produce a modified Combined Work, in the\n       manner specified by section 6 of the GNU GPL for conveying\n       Corresponding Source.\n\n       1) Use a suitable shared library mechanism for linking with the\n       Library.  A suitable mechanism is one that (a) uses at run time\n       a copy of the Library already present on the user's computer\n       system, and (b) will operate properly with a modified version\n       of the Library that is interface-compatible with the Linked\n       Version.\n\n   e) Provide Installation Information, but only if you would otherwise\n   be required to provide such information under section 6 of the\n   GNU GPL, and only to the extent that such information is\n   necessary to install and execute a modified version of the\n   Combined Work produced by recombining or relinking the\n   Application with a modified version of the Linked Version. (If\n   you use option 4d0, the Installation Information must accompany\n   the Minimal Corresponding Source and Corresponding Application\n   Code. If you use option 4d1, you must provide the Installation\n   Information in the manner specified by section 6 of the GNU GPL\n   for conveying Corresponding Source.)\n\n  5. Combined Libraries.\n\n  You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n   a) Accompany the combined library with a copy of the same work based\n   on the Library, uncombined with any other library facilities,\n   conveyed under the terms of this License.\n\n   b) Give prominent notice with the combined library that part of it\n   is a work based on the Library, and explaining where to find the\n   accompanying uncombined form of the same work.\n\n  6. Revised Versions of the GNU Lesser General Public License.\n\n  The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n  Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n  If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary.\n"
  },
  {
    "path": "MANIFEST.in",
    "content": "global-include *.csv\nglobal-include *.pkl\n"
  },
  {
    "path": "README.md",
    "content": "# pymgrid\n\n## Important Notice\n\n### The person that has been maintaining pymgrid since 2020 has moved future development to [python-microgrid](https://github.com/ahalev/python-microgrid) for the foreseeable future, a drop in replacement for pymgrid, and pymgrid may not be receiving any future updates. Please open any new issues in python-microgrid.\n\n\n![Build](https://github.com/Total-RD/pymgrid/workflows/build/badge.svg?dummy=unused)\n\npymgrid (PYthon MicroGRID) is a python library to generate and simulate a large number of microgrids.\n\nFor more context, please see the [presentation](https://www.climatechange.ai/papers/neurips2020/3) done at Climate Change AI\nand the [documentation](https://pymgrid.readthedocs.io).\n\n## Installation\n\nThe easiest way to install pymgrid is with pip:\n\n`pip install -U pymgrid`\n\nAlternatively, you can install from source. First clone the repo:\n \n```bash\ngit clone https://github.com/Total-RD/pymgrid.git\n``` \nThen navigate to the root directory of pymgrid and call\n\n```bash\npip install .\n```\n## Getting Started\n\nMicrogrids are straightforward to generate from scratch. Simply define some modules and pass them\nto a microgrid:\n```python\nimport numpy as np\nfrom pymgrid import Microgrid\nfrom pymgrid.modules import GensetModule, BatteryModule, LoadModule, RenewableModule\n\n\ngenset = GensetModule(running_min_production=10,\n                      running_max_production=50,\n                      genset_cost=0.5)\n\nbattery = BatteryModule(min_capacity=0,\n                        max_capacity=100,\n                        max_charge=50,\n                        max_discharge=50,\n                        efficiency=1.0,\n                        init_soc=0.5)\n\n# Using random data\nrenewable = RenewableModule(time_series=50*np.random.rand(100))\n\nload = LoadModule(time_series=60*np.random.rand(100),\n                  loss_load_cost=10)\n\nmicrogrid = Microgrid([genset, battery, (\"pv\", renewable), load])\n```\n\nThis creates a microgrid with the modules defined above, as well as an unbalanced energy module -- \nwhich reconciles situations when energy demand cannot be matched to supply.\n\nPrinting the microgrid gives us its architecture:\n\n```python\n>> microgrid\n\nMicrogrid([genset x 1, load x 1, battery x 1, pv x 1, balancing x 1])\n```\n\nA microgrid is contained of fixed modules and flex modules. Some modules can be both -- `GridModule`, for example\n-- but not at the same time.\n\n\nA *fixed* module has requires a request of a certain amount of energy ahead of time, and then attempts to \nproduce or consume said amount. `LoadModule` is an example of this; you must tell it to consume a certain amount of energy\nand it will then do so.\n\n A *flex* module, on the other hand, is able to adapt to meet demand. `RenewableModule` is an example of this as\n it allows for curtailment of any excess renewable produced.\n \n A microgrid will tell you which modules are which:\n \n ```python\n>> microgrid.fixed_modules\n\n{\n  \"genset\": \"[GensetModule(running_min_production=10, running_max_production=50, genset_cost=0.5, co2_per_unit=0, cost_per_unit_co2=0, start_up_time=0, wind_down_time=0, allow_abortion=True, init_start_up=True, raise_errors=False, provided_energy_name=genset_production)]\",\n  \"load\": \"[LoadModule(time_series=<class 'numpy.ndarray'>, loss_load_cost=10, forecaster=NoForecaster, forecast_horizon=0, forecaster_increase_uncertainty=False, raise_errors=False)]\",\n  \"battery\": \"[BatteryModule(min_capacity=0, max_capacity=100, max_charge=50, max_discharge=50, efficiency=1.0, battery_cost_cycle=0.0, battery_transition_model=None, init_charge=None, init_soc=0.5, raise_errors=False)]\"\n}\n\n>>microgrid.flex_modules\n\n{\n  \"pv\": \"[RenewableModule(time_series=<class 'numpy.ndarray'>, raise_errors=False, forecaster=NoForecaster, forecast_horizon=0, forecaster_increase_uncertainty=False, provided_energy_name=renewable_used)]\",\n  \"balancing\": \"[UnbalancedEnergyModule(raise_errors=False, loss_load_cost=10, overgeneration_cost=2)]\"\n}\n\n```\n\n\nRunning the microgrid is straightforward. Simply pass an action for each fixed module to `microgrid.run`. The microgrid\ncan also provide you a random action by calling `microgrid.sample_action.` Once the microgrid has been run for a\ncertain number of steps, results can be viewed by calling microgrid.get_log.\n\n```python\n>> for j in range(10):\n>>    action = microgrid.sample_action(strict_bound=True)\n>>    microgrid.run(action)\n\n>> microgrid.get_log(drop_singleton_key=True)\n\n      genset  ...                     balance\n      reward  ... fixed_absorbed_by_microgrid\n0  -5.000000  ...                   10.672095\n1 -14.344353  ...                   50.626726\n2  -5.000000  ...                   17.538018\n3  -0.000000  ...                   15.492778\n4  -0.000000  ...                   35.748724\n5  -0.000000  ...                   30.302300\n6  -5.000000  ...                   36.451662\n7  -0.000000  ...                   66.533872\n8  -0.000000  ...                   20.645077\n9  -0.000000  ...                   10.632957\n```\n\n## Benchmarking\n\n`pymgrid` also comes pre-packaged with a set of 25 microgrids for benchmarking.\nThe config files for these microgrids are available in `data/scenario/pymgrid25`.\nSimply deserialize one of the yaml files to load one of the saved microgrids; for example,\nto load the zeroth microgrid:\n\n```python\nimport yaml\nfrom pymgrid import PROJECT_PATH\n\nyaml_file = PROJECT_PATH / 'data/scenario/pymgrid25/microgrid_0/microgrid_0.yaml'\nmicrogrid = yaml.safe_load(yaml_file.open('r'))\n```\n\nAlternatively, `Microgrid.load(yaml_file.open('r'))` will perform the same deserialization.\n\n\n## Citation\n\nIf you use this package for your research, please cite the following paper:\n\n@misc{henri2020pymgrid,\n      title={pymgrid: An Open-Source Python Microgrid Simulator for Applied Artificial Intelligence Research}, \n      author={Gonzague Henri, Tanguy Levent, Avishai Halev, Reda Alami and Philippe Cordier},\n      year={2020},\n      eprint={2011.08004},\n      archivePrefix={arXiv},\n      primaryClass={cs.AI}\n}\n\nYou can find it on Arxiv here: https://arxiv.org/abs/2011.08004\n\n## Data\n\nData in pymgrid are based on TMY3 (data based on representative weather). The PV data comes from DOE/NREL/ALLIANCE (https://nsrdb.nrel.gov/about/tmy.html) and the load data comes from OpenEI (https://openei.org/doe-opendata/dataset/commercial-and-residential-hourly-load-profiles-for-all-tmy3-locations-in-the-united-states)\n\nThe CO2 data is from Jacque de Chalendar and his gridemissions API.\n\n## Contributing\nPull requests are welcome for bug fixes. For new features, please open an issue first to discuss what you would like to add.\n\nPlease make sure to update tests as appropriate.\n\n## License\n\nThis repo is under a GNU LGPL 3.0 (https://github.com/total-sa/pymgrid/edit/master/LICENSE)\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line, and also\n# from the environment for the first two.\nSPHINXOPTS    ?=\nSPHINXBUILD   ?= sphinx-build\nSOURCEDIR     = source\nBUILDDIR      = build\n\n# Put it first so that \"make\" without argument is like \"make help\".\nhelp:\n\t@$(SPHINXBUILD) -M help \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n\n.PHONY: help Makefile\n\n# Catch-all target: route all unknown targets to Sphinx using the new\n# \"make mode\" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).\n%: Makefile\n\t@$(SPHINXBUILD) -M $@ \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n"
  },
  {
    "path": "docs/make.bat",
    "content": "@ECHO OFF\n\npushd %~dp0\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=sphinx-build\n)\nset SOURCEDIR=source\nset BUILDDIR=build\n\n%SPHINXBUILD% >NUL 2>NUL\nif errorlevel 9009 (\n\techo.\n\techo.The 'sphinx-build' command was not found. Make sure you have Sphinx\n\techo.installed, then set the SPHINXBUILD environment variable to point\n\techo.to the full path of the 'sphinx-build' executable. Alternatively you\n\techo.may add the Sphinx directory to PATH.\n\techo.\n\techo.If you don't have Sphinx installed, grab it from\n\techo.https://www.sphinx-doc.org/\n\texit /b 1\n)\n\nif \"%1\" == \"\" goto help\n\n%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%\ngoto end\n\n:help\n%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%\n\n:end\npopd\n"
  },
  {
    "path": "docs/requirements.txt",
    "content": "nbsphinx==0.8.10\nnbsphinx-link==1.3.0\nnumpydoc==1.5.0\npydata_sphinx_theme==0.12.0\nSphinx==5.3.0\n"
  },
  {
    "path": "docs/source/_templates/autosummary/base.rst",
    "content": "{{ objname | escape | underline }}\n\n.. currentmodule:: {{ module }}\n\n.. auto{{ objtype }}:: {{ objname }}\n"
  },
  {
    "path": "docs/source/_templates/autosummary/class.rst",
    "content": "{{ fullname | escape | underline}}\n\n.. currentmodule:: {{ module }}\n\n.. autoclass:: {{ objname }}\n\n   {% block methods %}\n\n   {% if methods %}\n   .. rubric:: {{ _('Methods') }}\n\n   .. autosummary::\n      :toctree: generated/\n\n   {% for item in methods %}\n       {% if item != \"__init__\" %}\n          ~{{ name }}.{{ item }}\n       {% endif %}\n   {%- endfor %}\n   {% endif %}\n   {% endblock %}\n\n   {% block attributes %}\n   {% if attributes %}\n   .. rubric:: {{ _('Attributes') }}\n\n   .. autosummary::\n      :toctree: generated/\n\n   {% for item in attributes %}\n      ~{{ name }}.{{ item }}\n   {%- endfor %}\n   {% endif %}\n   {% endblock %}\n"
  },
  {
    "path": "docs/source/conf.py",
    "content": "# Configuration file for the Sphinx documentation builder.\n#\n# For the full list of built-in configuration values, see the documentation:\n# https://www.sphinx-doc.org/en/master/usage/configuration.html\n\nimport inspect\nimport os\nimport sys\n\nfrom copy import deepcopy\nfrom builtins import object\n\nimport pymgrid\n\n\n# -- Project information -----------------------------------------------------\n# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information\n\nproject = 'pymgrid'\ncopyright = '2022, TotalEnergies'\nauthor = 'Avishai Halev'\nrelease = pymgrid.__version__\nversion = pymgrid.__version__\n\n# -- General configuration ---------------------------------------------------\n# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration\n\nextensions = [\n    'sphinx.ext.duration',\n    'sphinx.ext.autodoc',\n    'sphinx.ext.coverage',\n    'sphinx.ext.autosummary',\n    'sphinx.ext.doctest',\n    'sphinx.ext.linkcode',\n    'sphinx.ext.intersphinx',\n    'sphinx.ext.mathjax',\n    'nbsphinx',\n    'nbsphinx_link',\n    'IPython.sphinxext.ipython_console_highlighting'\n]\n\ntemplates_path = ['_templates']\nexclude_patterns = []\n\n\n# -- Options for HTML output -------------------------------------------------\n# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output\n\nhtml_theme = 'pydata_sphinx_theme'\n\nhtml_theme_options = {\n    \"primary_sidebar_end\": [\"indices.html\", \"sidebar-ethical-ads.html\"],\n\n    \"logo\": {\n          \"image_light\": \"logo-light.png\",\n          \"image_dark\": \"logo-dark.png\",\n       },\n\n    \"icon_links\": [\n            {\n                \"name\": \"GitHub\",\n                \"url\": \"https://github.com/Total-RD/pymgrid\",\n                \"icon\": \"fa-brands fa-github\",\n            },\n            {\n                \"name\": \"PyPI\",\n                \"url\": \"https://pypi.org/project/pymgrid/\",\n                \"icon\": \"fa-solid fa-box\",\n            }\n    ]\n}\n\n\nhtml_static_path = ['_static']\n\n\n# These are attributes that don't have a __doc__ attribute to read ':meta private:' from.\nskip_members = [\n    'yaml_flow_style',\n    'metadata',\n    'render_mode',\n    'reward_range',\n    'spec'\n                ]\n\n\ndef autodoc_skip_member(app, what, name, obj, skip, options):\n    if name in skip_members:\n        return True\n\n    try:\n        doc = obj.__doc__\n    except AttributeError:\n        return None\n\n    if doc is not None and ':meta private:' in doc:\n        return True\n    return None\n\n\ndef autodoc_process_signature(app, what, name, obj, options, signature, return_annotation):\n    \"\"\"\n    If a class signature is being read from cls.__new__, we want to replace it with the signature from cls.__init__.\n    \"\"\"\n    if what == 'class' and signature[1:] in str(inspect.signature(obj.__new__)):\n        obj_copy = deepcopy(obj)\n        obj_copy.__new__ = object.__new__\n        signature = str(inspect.signature(obj_copy))\n        return signature, return_annotation\n\n\ndef linkcode_resolve(domain, info):\n    \"\"\"\n    Determine the URL corresponding to Python object\n    \"\"\"\n    if domain != \"py\":\n        return None\n\n    modname = info[\"module\"]\n    fullname = info[\"fullname\"]\n\n    submod = sys.modules.get(modname)\n    if submod is None:\n        return None\n\n    obj = submod\n    for part in fullname.split(\".\"):\n        try:\n            obj = getattr(obj, part)\n        except AttributeError:\n            return None\n\n    try:\n        fn = inspect.getsourcefile(inspect.unwrap(obj))\n    except TypeError:\n        try:  # property\n            fn = inspect.getsourcefile(inspect.unwrap(obj.fget))\n        except (AttributeError, TypeError):\n            fn = None\n    if not fn:\n        return None\n\n    try:\n        source, lineno = inspect.getsourcelines(obj)\n    except TypeError:\n        try:  # property\n            source, lineno = inspect.getsourcelines(obj.fget)\n        except (AttributeError, TypeError):\n            lineno = None\n    except OSError:\n        lineno = None\n\n    if lineno:\n        linespec = f\"#L{lineno}-L{lineno + len(source) - 1}\"\n    else:\n        linespec = \"\"\n\n    fn = os.path.relpath(fn, start=os.path.dirname(pymgrid.__file__))\n\n    return f'https://github.com/Total-RD/pymgrid/tree/v{pymgrid.__version__}/src/pymgrid/{fn}{linespec}'\n\n\nintersphinx_mapping = {\n    'gym': ('https://www.gymlibrary.dev/', None)\n}\n\n\ndef setup(app):\n    app.connect('autodoc-skip-member', autodoc_skip_member)\n    app.connect('autodoc-process-signature', autodoc_process_signature)\n"
  },
  {
    "path": "docs/source/examples/index.rst",
    "content": "Examples\n========\n\nTo run the examples, clone the repository:\n\n.. code-block:: bash\n\n    $ git clone https://github.com/Total-RD/pymgrid.git\n\nand use `Jupyter <http://jupyter.readthedocs.org/en/latest/install.html>`_ to open any notebook in\nthe :code:`notebooks` directory.\n\n.. toctree::\n   :maxdepth: 2\n\n   quick-start\n   rbc-example\n   mpc-example\n   rl-example"
  },
  {
    "path": "docs/source/examples/mpc-example.nblink",
    "content": "{\n    \"path\": \"../../../notebooks/mpc-example.ipynb\"\n}"
  },
  {
    "path": "docs/source/examples/quick-start.nblink",
    "content": "{\n    \"path\": \"../../../notebooks/quick-start.ipynb\"\n}\n"
  },
  {
    "path": "docs/source/examples/rbc-example.nblink",
    "content": "{\n    \"path\": \"../../../notebooks/rbc-example.ipynb\"\n}\n"
  },
  {
    "path": "docs/source/examples/rl-example.nblink",
    "content": "{\n    \"path\": \"../../../notebooks/rl-example.ipynb\"\n}\n"
  },
  {
    "path": "docs/source/getting_started.rst",
    "content": "Getting Started\n===============\n\n.. _installation:\n\nInstallation\n------------\n\nThe easiest way to install *pymgrid* is with pip:\n\n.. code-block:: console\n\n    $ pip install -U pymgrid\n\nAlternatively, you can install from source. First clone the repo:\n\n.. code-block:: bash\n\n    $ git clone https://github.com/Total-RD/pymgrid.git\n\nThen navigate to the root directory of pymgrid and call\n\n.. code-block:: bash\n\n    $ pip install .\n\nAdvanced Installation\n---------------------\n\nTo use the included model predictive control algorithm <link> on microgrids containing gensets,\nadditional dependencies are required as the optimization problem becomes mixed integer.\n\nThe packages MOSEK and CVXOPT can both handle this case; you can install both by calling\n\n.. code-block:: bash\n\n    $ pip install pymgrid[genset_mpc]\n\nNote that MOSEK requires a license; see https://www.mosek.com/ for details.\nAcademic and trial licenses are available.\n\nSimple Example\n--------------\nSee :doc:`examples/quick-start` for a simple example to get started.\n"
  },
  {
    "path": "docs/source/index.rst",
    "content": ".. pymgrid documentation master file, created by\n   sphinx-quickstart on Sat Nov 19 12:49:18 2022.\n   You can adapt this file completely to your liking, but it should at least\n   contain the root `toctree` directive.\n\n*********************\npymgrid documentation\n*********************\n\nImportant Notice\n----------------\n\n**The person that has been maintaining pymgrid since 2020 has moved future development to**\n`python-microgrid <https://github.com/ahalev/python-microgrid>`__\n**for the foreseeable future, a drop in replacement for pymgrid, and pymgrid may not be receiving any future updates.**\n**Please open any new issues in python-microgrid. You can also view python-microgrid's documentation**\n`at this link <https://python-microgrid.readthedocs.io/en/latest/>`__.\n\n**Version**: |version|\n\n*pymgrid* is a Python library to simulate tertiary control of electrical microgrids. *pymgrid* allows\nusers to create and customize microgrids of their choosing. These microgrids can then be controlled using a user-defined\nalgorithm or one of the control algorithms contained in *pymgrid*: rule-based control and model predictive control.\n\nEnvironments corresponding to the OpenAI-Gym API are also provided, with both continuous and discrete action space\nenvironments available. These environments can be used with your choice of reinforcement learning algorithm to train\na control algorithm.\n\n*pymgrid* attempts to offer the simplest and most intuitive API possible, allowing the user to\nfocus on their particular application.\n\nSee the :doc:`getting_started` section for further information, including instructions on how to\n:ref:`install <installation>` the project.\n\n**Useful links**:\n`Binary Installers <https://pypi.org/project/pymgrid/>`__ |\n`Source Repository <https://github.com/Total-RD/pymgrid>`__\n\n\n.. note::\n\n   This project is under active development.\n\nContents\n========\n\n.. toctree::\n   :maxdepth: 2\n\n   getting_started\n   examples/index\n   reference/index\n\nIndices and tables\n==================\n\n* :ref:`genindex`\n* :ref:`modindex`\n* :ref:`search`\n"
  },
  {
    "path": "docs/source/reference/algos/index.rst",
    "content": ".. _api.control:\n\nControl Algorithms\n==================\n\n.. currentmodule:: pymgrid.algos\n\nControl algorithms built into pymgrid, as well as references for external algorithms that can be deployed\n\nRule Based Control\n------------------\n\nHeuristic Algorithm that deploys modules via a priority list.\n\n.. autosummary::\n    :toctree: ../api/algos/\n\n    RuleBasedControl\n\n\nModel Predictive Control\n------------------------\n\nAlgorithm that depends on a future forecast as well as a model of state transitions to determine optimal controls.\n\n\n.. autosummary::\n    :toctree: ../api/algos/\n\n    ModelPredictiveControl\n\n\nReinforcement Learning\n----------------------\n\nAlgorithms that treat a microgrid as a Markov process, and train a black-box policy by repeated interactions with\nthe environment. See :doc:`here <../../examples/rl-example>` for an example of using\nreinforcement learning to train such an algorithm.\n\n\n\n..\n   HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages.\n   Copied from pandas docs.\n\n   .. currentmodule:: pymgrid.algos.priority_list\n\n   .. autosummary::\n      :toctree: ../api/algos/priority_list/\n      PriorityListElement"
  },
  {
    "path": "docs/source/reference/envs/index.rst",
    "content": ".. _api.envs:\n\nReinforcement Learning (RL) Environments\n======================\n\n.. currentmodule:: pymgrid.envs\n\nEnvironment classes using the `OpenAI Gym API <https://www.gymlibrary.dev//>`_ for reinforcement learning.\n\nDiscrete\n--------\n\nEnvironment with a discrete action space.\n\n\n.. autosummary::\n    :toctree: ../api/envs/\n\n    DiscreteMicrogridEnv\n\nContinuous\n----------\n\nEnvironment with a discrete action space.\n\n\n.. autosummary::\n    :toctree: ../api/envs/\n\n    ContinuousMicrogridEnv\n"
  },
  {
    "path": "docs/source/reference/forecast/index.rst",
    "content": ".. _api.forecast:\n\nForecasting\n===========\n\n.. currentmodule:: pymgrid.forecast\n\nClasses available to use for time-series forecasting, as well a class that allows users to define their own forecaster.\n\n.. autosummary::\n    :toctree: ../api/forecast/\n\n   get_forecaster\n   OracleForecaster\n   GaussianNoiseForecaster\n   UserDefinedForecaster\n   NoForecaster\n\n"
  },
  {
    "path": "docs/source/reference/general/index.rst",
    "content": ".. _api.general:\n\nGeneral functions and objects\n=============================\n\n.. currentmodule:: pymgrid.modules\n\nModuleContainer\n---------------\n\nObject that store's a microgrid's modules.\n\n.. autosummary::\n   :toctree: ../api/general/\n\n   ModuleContainer\n\nModuleSpace\n-----------\n\nObject for module action and observation spaces.\n\n.. currentmodule:: pymgrid.utils.space\n\n.. autosummary::\n   :toctree: ../api/general/\n\n   ModuleSpace\n"
  },
  {
    "path": "docs/source/reference/index.rst",
    "content": "API reference\n=============\n\nThis page contains an overview of all public *pymgrid* objects and functions.\n\n.. toctree::\n   :maxdepth: 2\n\n   microgrid\n   modules/index\n   forecast/index\n   envs/index\n   algos/index\n   general/index"
  },
  {
    "path": "docs/source/reference/microgrid.rst",
    "content": ".. _api.microgrid:\n\n\nMicrogrid\n=================\n\n.. currentmodule:: pymgrid\n\nConstructor\n-----------\n.. autosummary::\n    :toctree: api/microgrid/\n\n    Microgrid\n\nMethods\n-------\n.. autosummary::\n\n    :toctree: api/microgrid/\n\n    Microgrid.run\n    Microgrid.reset\n    Microgrid.sample_action\n    Microgrid.get_log\n    Microgrid.get_forecast_horizon\n    Microgrid.get_empty_action\n\nSerialization/IO/Conversion\n---------------------------\n.. autosummary::\n\n    :toctree: api/microgrid/\n\n    Microgrid.load\n    Microgrid.dump\n    Microgrid.from_nonmodular\n    Microgrid.from_scenario\n    Microgrid.to_nonmodular"
  },
  {
    "path": "docs/source/reference/modules/index.rst",
    "content": ".. _api.modules:\n\nModules\n=======\n\n.. currentmodule:: pymgrid.modules\n\nThe modules defined here are commonly found in microgrids.\nPass any combination of modules to :ref:`Microgrid <api.microgrid>` to define and run a microgrid.\n\nTimeseries Modules\n------------------\n\nModules that are temporal in nature.\n\n\n\n.. autosummary::\n    :toctree: ../api/modules/\n\n    GridModule\n    LoadModule\n    RenewableModule\n\nNon-temporal Modules\n--------------------\n\nModules that do not depend on an underlying timeseries.\n\n.. autosummary::\n    :toctree: ../api/modules/\n\n    BatteryModule\n    GensetModule\n\nHelper Module\n--------------\n\nA module that cleans up after all the other modules are deployed.\n\n.. autosummary::\n    :toctree: ../api/modules/\n\n    UnbalancedEnergyModule"
  },
  {
    "path": "pyproject.toml",
    "content": "[tool.pytest.ini_options]\nlog_cli = true\nlog_cli_level = \"INFO\"\nlog_cli_format = \"%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)\"\nlog_cli_date_format = \"%Y-%m-%d %H:%M:%S\""
  },
  {
    "path": "requirements.txt",
    "content": "cufflinks>=0.17.3\ncvxpy>=1.1.4\ngym>=0.15.7\nmatplotlib>=3.1.1\nnumpy>=1.19.5\npandas>=1.0.3\nplotly>=4.9.0\nscipy>=1.5.3\nstatsmodels>=0.11.1\ntqdm>=4.1.0\npyyaml>=1.5"
  },
  {
    "path": "setup.cfg",
    "content": "[metadata]\ndescription-file = README.md\n\n[tool:pytest]\nnorecursedirs=tests/helpers"
  },
  {
    "path": "setup.py",
    "content": "from pathlib import Path\nfrom setuptools import setup, find_packages\n\nv = {}\nexec(open('src/pymgrid/version.py').read(), v)  # read __version__\nVERSION = v['__version__']\nDESCRIPTION = \"A simulator for tertiary control of electrical microgrids\"\nDOWNLOAD_URL = f\"https://github.com/Total-RD/pymgrid/archive/refs/tags/v{VERSION}.tar.gz\"\nMAINTAINER = \"Avishai Halev\"\nMAINTAINER_EMAIL = \"avishaihalev@gmail.com\"\nLICENSE = \"GNU LGPL 3.0\"\nPROJECT_URLS = {\"Source Code\": \"https://github.com/Total-RD/pymgrid\",\n                \"Documentation\": \"https://pymgrid.readthedocs.io/en/latest/\"}\n\nEXTRAS = dict()\nEXTRAS[\"genset_mpc\"] = [\"Mosek\", \"cvxopt\"]\nEXTRAS[\"dev\"] = [\n    \"pytest\",\n    \"pytest-subtests\",\n    \"flake8\",\n    \"sphinx\",\n    \"pydata_sphinx_theme\",\n    \"numpydoc\",\n    \"nbsphinx\",\n    \"nbsphinx-link\",\n    *EXTRAS[\"genset_mpc\"]]\n\nEXTRAS[\"rtd\"] = [\"ipython\"]\n\nEXTRAS[\"all\"] = list(set(sum(EXTRAS.values(), [])))\n\n\nsetup(\n    name=\"pymgrid\",\n    package_dir={\"\": \"src\"},\n    packages=find_packages(\"src\"),\n    python_requires=\">=3.6\",\n    version=VERSION,\n    maintainer=MAINTAINER,\n    maintainer_email=MAINTAINER_EMAIL,\n    download_url=DOWNLOAD_URL,\n    project_urls=PROJECT_URLS,\n    description=DESCRIPTION,\n    license=LICENSE,\n    long_description=(Path(__file__).parent / \"README.md\").read_text(),\n    long_description_content_type=\"text/markdown\",\n    include_package_data=True,\n    install_requires=[\n        \"pandas\",\n        \"numpy\",\n        \"cvxpy\",\n        \"statsmodels\",\n        \"matplotlib\",\n        \"plotly\",\n        \"cufflinks\",\n        \"gym\",\n        \"tqdm\",\n        \"pyyaml\"\n    ],\n    extras_require=EXTRAS\n)\n"
  },
  {
    "path": "src/__init__.py",
    "content": ""
  },
  {
    "path": "src/pymgrid/MicrogridGenerator.py",
    "content": "\"\"\"\nCopyright 2020 Total S.A., Tanguy Levent all rights reserved,\nAuthors:Gonzague Henri <gonzague.henri@total.com>, Tanguy Levent <>\nPermission to use, modify, and distribute this software is given under the\nterms of the pymgrid License.\nNO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.\n$Date: 2020/06/04 14:54 $\nGonzague Henri\n\"\"\"\n\"\"\"\n<pymgrid is a Python library to simulate microgrids>\nCopyright (C) <2020> <Total S.A.>\n\nThis program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.\n\nYou should have received a copy of the GNU Lesser General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.\n\n\"\"\"\n\nimport numpy as np\nimport pandas as pd\nfrom pymgrid import NonModularMicrogrid, Microgrid, PROJECT_PATH\nfrom os import listdir\nfrom os.path import isfile, join\nimport os\nimport sys\nimport pickle\nfrom IPython.display import display\nfrom pathlib import Path\n\n# MICROGRID_DEFAULT_CONFIG : {\n#     'load_type':'Folder', #or 'File'\n#     'load_path': 'default', # or a specific path\n#     'pv_type':'Folder', #or 'File'\n#     'pv_path': 'default', # or a specific path\n#     'co2_type':'Folder', #or 'File'\n#     'co2_path': 'default', # or a specific path\n\n\n#     'parameters':{\n\n#     }, #Dictionary\n#     'df_actions':df_actions, #Dataframe\n#     'architecture':architecture, #Dictionary\n#     'df_status':df_status, #Dictionary\n#     'df_actual_generation':df_actual_production,#Dataframe\n#     'grid_spec':grid_spec, #value = 0\n#     'df_cost':df_cost, #Dataframe of 1 value = 0.0\n#     'df_co2': df_co2,\n#     'pv':pv, #Dataframe\n#     'load': load, #Dataframe\n#     'grid_ts':grid_ts, #Dataframe\n#     'control_dict': column_actions, #dictionnary\n#     'grid_price_import' : grid_price_import_ts,\n#     'grid_price_export' : grid_price_export_ts,\n#     'grid_co2': grid_co2_ts,\n# }\n\nclass MicrogridGenerator:\n    \"\"\"\n        The class MicrogridGenerator generates a number of microgrids with differerent and randomized paramters based on\n        the load and renewable data files in the data folder.\n\n        Parameters\n        ----------\n            nb_microgrid: int, optional\n                Number representing the number of microgrid to be generated.\n            random_seed: int, optional\n                Seed to be used to generate the needed random numbers to size microgrids.\n            timestep: int, optional\n                Timestep to be used in the time series.\n            path: string\n                The path to the pymgrid folder, used to get the data files needed.\n\n        Attributes\n        ----------\n        self.microgrids= [] # generate a list of microgrid object\n        #self.annual_load\n        self.nb_microgrids=nb_microgrid\n        self.timestep=1\n        self.path=path\n\n            microgrids: list\n                List that contains all the generated microgrids\n            nb_microgrid: int, optional\n                Number representing the number of microgrid to be generated.\n                this microgrid has one of them\n            timestep: int, optional\n                Timestep to be used in the time series.\n            path: string\n                The path to the pymgrid folder, used to get the data files needed.\n\n        Notes\n        -----\n        Due to the random nature of the implemented process, all the generated microgrids might not make the most sense\n        economically or in term of generator sizing. The main idea is to generate realistic-ich microgrids to develop,\n        test and compare control algorithms and advance AI research applied to microgrids.\n\n        Examples\n        --------\n        To create microgrids through MicrogridGenerator:\n        >>> m_gen=mg.MicrogridGenerator(nb_microgrid=10)\n        >>> m_gen.generate_microgrid()\n\n        To plot informations about the generated microgrids:\n        >>> m_gen.print_mg_parameters()\n        \"\"\"\n\n\n    def __init__(self, nb_microgrid=10,\n                 random_seed=42,\n                 timestep=1,\n                 path=str(Path(__file__).parent)):\n        \n        np.random.seed(random_seed)\n        self.microgrids= [] # generate a list of microgrid object\n        #self.annual_load\n        self.nb_microgrids=nb_microgrid\n        self.timestep=1\n        self.path=path\n\n\n    ###########################################\n    #utility functions\n    ###########################################\n    def _get_random_file(self, path):\n        \"\"\" Based on a path, and a folder containing data files, return a file chosen randomly.\"\"\"\n        from pathlib import Path\n        _path = Path(path)\n        data_files = list(_path.glob(\"*.csv\"))\n        if not len(data_files):\n            raise NameError(f\"Unable to find csv data files in {path}\")\n        return pd.read_csv(np.random.choice(data_files))\n\n    def _scale_ts(self, df_ts, size, scaling_method='sum'):\n        \"\"\" Scales a time series based on either the sum or the maximum of the time series.\"\"\"\n\n        actual_ratio=1\n        if scaling_method =='sum':\n            actual_ratio = size/df_ts.sum()#.values[0]\n\n        if scaling_method == 'max':\n            actual_ratio=size / df_ts.max()\n        df_ts = df_ts * actual_ratio\n\n        return df_ts\n\n    def _resize_timeseries(self, timeseries, current_time_step, new_time_step):\n        \"\"\" Change the frequency of a time series. \"\"\"\n\n        index = pd.date_range('1/1/2015 00:00:00', freq=str(int(current_time_step * 60)) + 'Min',\n                              periods=(len(timeseries)))  # , freq='0.9S')\n\n        try:\n            timeseries = timeseries.squeeze()\n        except AttributeError:\n            pass\n\n        try:\n            timeseries = timeseries.values\n        except AttributeError:\n            pass\n\n        unsampled = pd.Series(timeseries, index=index)\n        resampled = unsampled.resample(rule=str(int(new_time_step * 60)) + 'Min').mean().interpolate(method='linear')\n\n        return resampled.values\n\n    ###########################################\n    # methods to generate timeseries\n    ###########################################\n    # def load_generator(self, shape, annual_consumption=1): #consumption inMWh\n    #     ts_load = np.random(shape)\n    #     annual_consumption = annual_consumption\n\n    def _get_pv_ts(self):\n        \"\"\" Function to get a random PV file.\"\"\"\n        #open pv folder\n        # get list of file\n        # select randomly rank if file to select in the list\n\n        path = self.path+'/data/pv/'\n        return self._get_random_file(path)\n\n    def _get_load_ts(self):\n        \"\"\" Function to get a random load file. \"\"\"\n        #open load folder\n        # get list of file\n        # select randomly rank if file to select in the list\n\n        path = self.path+'/data/load/'\n        return self._get_random_file(path)\n\n    def _get_wind_ts(self):\n        \"\"\" Function to get a random wind file. \"\"\"\n        #open load folder\n        # get list of file\n        # select randomly rank if file to select in the list\n\n        path = self.path+'/data/wind/'\n        return self._get_random_file(path)\n\n    def _get_co2_ts(self):\n        \"\"\" Function to get a random wind file. \"\"\"\n        # open load folder\n        # get list of file\n        # select randomly rank if file to select in the list\n\n        path = self.path + '/data/co2/'\n        return self._get_random_file(path)\n\n    def _get_genset(self, rated_power=1000, pmax=0.9, pmin=0.05):\n        \"\"\" Function generates a dictionnary with the genset information. \"\"\"\n\n        polynom=[np.random.rand()*10, np.random.rand(), np.random.rand()/10] #fuel consumption\n\n        genset={\n            'polynom':polynom,\n            'rated_power':rated_power,\n            'pmax':pmax,\n            'pmin':pmin,\n            'fuel_cost':0.4,\n            'co2':2,\n        }\n\n        return genset\n\n    def _get_battery(self, capa=1000, duration=4, pcharge=100, pdischarge=100, soc_max=1, soc_min=0.2, efficiency=0.9):\n        \"\"\" Function generates a dictionnary with the battery information. \"\"\"\n        battery={\n            'capa':capa,\n            'pcharge':int(np.ceil(capa/duration)),\n            'pdischarge':int(np.ceil(capa/duration)),\n            'soc_max':soc_max,\n            'soc_min':soc_min,\n            'efficiency':efficiency,\n            'soc_0':min(max(np.random.randn(), soc_min),soc_max),\n            'cost_cycle':0.02\n\n        }\n        return battery\n\n\n    def _get_grid_price_ts(self, nb_time_step_per_year, tou=0, rt=0, price=0):\n        \"\"\" This functions is used to generate time series of import and export prices.\"\"\"\n        if tou == 0  and rt ==0:\n            price_ts = [price for i in range(nb_time_step_per_year)]\n\n        return price_ts\n\n    def _get_electricity_tariff(self, scenario):\n        \"\"\"\n        Function to generate price time series based on existing tariffs.\n        scenario == 1 representes the TOU A-6 2020 summer from PG&E (https://www.pge.com/tariffs/electric.shtml)\n        scenario == 2 represents the commercial tariff from France, with a Marseille TOU plage 5 (\n        times: https://www.fournisseurs-electricite.com/edf/tarifs/heures-creuses-heures-pleines,\n        prices: https://www.cre.fr/Electricite/marche-de-detail-de-l-electricite\n        )\n        \"\"\"\n        price_import = []\n        price_export = np.zeros((8760,))\n\n        if scenario == 1: # PGE A-6 TOU 2020 summer\n\n            for i in range(8760):\n                if (i% 24 >= 12 and i%24 <18):\n                    price_import.append(0.59)\n                elif (i% 24 < 8 or i%24 >=21):\n                    price_import.append(0.22)\n                else:\n                    price_import.append(0.29)\n\n\n        if scenario == 2: # France Commercial TOU Marseille plage 5\n            for i in range(8760):\n                if (i% 24 >= 0 and i%24 <5) or (i%24>=14 and i%24<17):\n                    price_import.append(0.08)\n                else:\n                    price_import.append(0.11)\n\n        # if scenario == 3: Belgium\n\n        return price_import, price_export\n\n\n    def _get_grid(self, rated_power=1000, weak_grid=0, pmin=0.2, price_scenario=0, price_export = 0, price_import =0.3):\n        \"\"\" Function generates a dictionnary with the grid information. \"\"\"\n\n        if weak_grid == 1:\n            rand_outage_per_day = np.random.randn()*3/4 +0.25\n            rand_duration = np.random.randint(low=1, high =8)\n            grid_ts = self._generate_weak_grid_profile( rand_outage_per_day, rand_duration,8760/self.timestep)\n\n        else:\n            #grid_ts=pd.DataFrame([1+i*0 for i in range(int(np.floor(8760/self.timestep)))], columns=['grid_status'])\n            grid_ts = pd.DataFrame(np.ones(int(np.floor(8760 / self.timestep))),\n                                   columns=['grid_status'])\n\n        # Make sure grid_ts is of length 8760\n        grid_ts = grid_ts.iloc[:8760]\n\n        # price_export = pd.DataFrame(self._get_grid_price_ts(price_export,8760),\n        #                            columns=['grid_price_export'])\n        # price_import = pd.DataFrame(self._get_grid_price_ts(price_import, 8760),\n        #                            columns=['grid_price_import'])\n\n        price_import, price_export = self._get_electricity_tariff(price_scenario)\n\n        grid={\n            'grid_power_import':rated_power,\n            'grid_power_export':rated_power,\n            'grid_ts':grid_ts,\n            'grid_price_export':pd.DataFrame(price_export),\n            'grid_price_import': pd.DataFrame(price_import),\n        }\n\n        return grid\n\n    def _generate_weak_grid_profile(self, outage_per_day, duration_of_outage,nb_time_step_per_year):\n        \"\"\" Function generates an outage time series to be used in the microgrids with a weak grid. \"\"\"\n\n        #weak_grid_timeseries = np.random.random_integers(0,1, int(nb_time_step_per_year+1) ) #for a number of time steps, value between 0 and 1\n        #generate a timeseries of 8760/timestep points based on np.random seed\n        #profile of ones and zeros\n        weak_grid_timeseries = np.random.random(int(nb_time_step_per_year+1) ) #for a number of time steps, value between 0 and 1\n\n\n        weak_grid_timeseries = [0 if weak_grid_timeseries[i] < outage_per_day/24 else 1 for i in range(len(weak_grid_timeseries))]\n\n        timestep=8760/nb_time_step_per_year\n        for i in range(len(weak_grid_timeseries)):\n            if weak_grid_timeseries[i] == 0:\n                for j in range(1, int(duration_of_outage/timestep)):\n                    if i-j > 0:\n                        weak_grid_timeseries[i-j] = 0\n        #print weak_grid_timeseries\n\n        return pd.DataFrame(weak_grid_timeseries, columns=['grid_status']) #[0 if weak_grid_timeseries[i] < h_outage_per_day/24 else 1 for i in range(len(weak_grid_timeseries))]\n\n\n    ###########################################\n    # sizing functions\n    ###########################################\n    def _size_mg(self, load, size_load=1):\n        '''\n         Function that returns a dictionnary with the size of each component of a microgrid. We chose to define PV\n         penetration as defined by NREL (https://www.nrel.gov/docs/fy12osti/55094.pdf)\n         PV penetration = peak PV power / peak load power\n         '''\n        # generate a list of size based on the number of architecture  generated\n        # 2 size the other generators based on the load\n\n        #PV penetration definition by NREL: https: // www.nrel.gov/docs/fy12osti/55094.pdf\n        # penetragion = peak pv / peak load\n        pv=load.max().values[0]*(np.random.randint(low=30, high=151)/100)\n\n        #battery_size = self._size_battery(load)\n        # return a dataframe with the power of each generator, and if applicable the number of generator\n\n        size={\n            'pv': pv,\n            'load': size_load,\n            'battery': self._size_battery(load),\n            'genset': self._size_genset(load),\n            'grid': int(max(load.values)*2),\n        }\n\n        return size\n\n    def _size_genset(self, load, max_operating_loading = 0.9):\n        \"\"\" Function that returns the maximum power a genset. \"\"\"\n        #random number > 3 < 20\n        # polynomial for fuel consumption\n\n        _size_genset = int(np.ceil(np.max(load)/max_operating_loading))\n\n        return _size_genset\n\n\n    def _size_battery(self, load):\n        \"\"\" Function that returns the capacity of the battery, equivalent to 3 to 5 hours of mean load. \"\"\"\n        #energy duration\n        battery = int(np.ceil(np.random.randint(low=3,high=6)*np.mean(load).item()))\n        return battery\n\n\n    ###########################################\n    #generate the microgrid\n    ###########################################\n\n    def generate_microgrid(self, modular=True, verbose=False):\n        \"\"\" Function used to generate the nb_microgrids to append them to the microgrids list. \"\"\"\n\n        convert = lambda x: x.to_modular() if modular else x\n\n        for i in range(self.nb_microgrids):\n            #size=self._size_mg()\n            self.microgrids.append(convert(self._create_microgrid()))\n        \n        if verbose and not modular:\n            self.print_mg_parameters()\n\n        return self\n\n    @classmethod\n    def load(cls, scenario):\n        instance = cls()\n        instance.microgrids = [\n            Microgrid.load(\n                (PROJECT_PATH/ f'data/scenario/{scenario}/microgrid_{j}/microgrid_{j}.yaml').open('r')\n            ) for j in range(25)]\n\n        return instance\n\n    def _bin_genset_grid(self):\n        rand = np.random.rand()\n        bin_genset = 0\n        bin_grid = 0\n\n        if rand < 0.33:\n\n            bin_genset = 1\n\n        elif rand >= 0.33 and rand < 0.66:\n\n            bin_grid = 1\n\n        else:\n\n            bin_genset = 1\n            bin_grid = 1\n\n        return bin_genset, bin_grid\n\n    def _size_load(self, size_load=None):\n        if size_load is None:\n            return np.random.randint(low=100,high=100001)\n        else:\n            return size_load\n\n    def _create_microgrid(self):\n        \"\"\"\n        Function used to create one microgrid. First selecting a load file, and a load size  and a randome architecture\n        and then size the other components of the microgrid depending on the load size. This function also initializes\n        the tracking dataframes to be used in microgrid.\n        \"\"\"\n\n        # get the sizing data\n        # create microgrid object and append\n        # return the list\n\n        bin_genset, bin_grid = self._bin_genset_grid()\n\n        architecture = {'PV':1, 'battery':1, 'genset':bin_genset, 'grid':bin_grid}\n        size_load = self._size_load()\n        load = self._scale_ts(self._get_load_ts(), size_load, scaling_method='max') #obtain dataframe of loads\n        size = self._size_mg(load, size_load) #obtain a dictionary of mg sizing components\n        column_actions=[]\n        column_actual_production=[]\n        column_cost = []\n        grid_ts=[]\n        grid_price_export_ts = []\n        grid_price_import_ts = []\n        grid_co2_ts = []\n        df_parameters = pd.DataFrame()\n        # df_cost = {'cost':[]}\n        df_status = {}\n        df_co2 = {'co2':[]}\n\n        df_parameters['load'] = [size_load]\n        df_parameters['cost_loss_load'] = 10\n        df_parameters['cost_overgeneration'] = 1\n        df_parameters['cost_co2'] = 0.1\n        #df_cost['cost'] = [0.0]\n        df_status['load'] = [np.around(load.iloc[0,0],1)]# --> il y a doublon pour l'instant avec l'architecture PV, -> non si pas de pv la net load est juste la load\n        df_status['hour'] = [0]\n        column_actual_production.append('loss_load')\n        column_actual_production.append('overgeneration')\n        column_actions.append('load')\n        column_cost.append('loss_load')\n        column_cost.append('overgeneration')\n        column_cost.append('co2')\n        if architecture['PV'] == 1:\n\n            df_parameters['PV_rated_power'] = np.around(size['pv'],2)\n            column_actual_production.append('pv_consummed')\n            column_actual_production.append('pv_curtailed')\n            column_actions.append('pv_consummed')\n            column_actions.append('pv_curtailed')\n            column_actions.append('pv')\n            pv = pd.DataFrame(self._scale_ts(self._get_pv_ts(), size['pv'], scaling_method='max'))\n            df_status['pv'] = [np.around( pv.iloc[0].values[0],1)]\n\n        if architecture['battery']==1:\n\n            battery = self._get_battery(capa=size['battery']) #return a dictionary of battery characteristic\n            df_parameters['battery_soc_0'] = battery['soc_0']\n            df_parameters['battery_power_charge'] = battery['pcharge']\n            df_parameters['battery_power_discharge'] = battery['pdischarge']\n            df_parameters['battery_capacity'] = battery['capa']\n            df_parameters['battery_efficiency'] = battery['efficiency']\n            df_parameters['battery_soc_min'] = battery['soc_min']\n            df_parameters['battery_soc_max'] = battery['soc_max']\n            df_parameters['battery_cost_cycle'] = battery['cost_cycle']\n            column_actual_production.append('battery_charge')\n            column_actual_production.append('battery_discharge')\n            column_actions.append('battery_charge')\n            column_actions.append('battery_discharge')\n            column_cost.append('battery')\n            df_status['battery_soc'] = [battery['soc_0']]\n\n            capa_to_charge = max(\n                (df_parameters['battery_soc_max'].values[0] * df_parameters['battery_capacity'].values[0] -\n                 df_parameters['battery_soc_0'].iloc[-1] *\n                 df_parameters['battery_capacity'].values[0]\n                 ) / df_parameters['battery_efficiency'].values[0], 0)\n\n            capa_to_discharge = max((df_parameters['battery_soc_0'].iloc[-1] *\n                                     df_parameters['battery_capacity'].values[0]\n                                     - df_parameters['battery_soc_min'].values[0] *\n                                     df_parameters['battery_capacity'].values[0])\n                                     * df_parameters['battery_efficiency'].values[0], 0)\n\n            df_status['capa_to_charge'] = [np.around(capa_to_charge,1)]\n            df_status['capa_to_discharge'] = [np.around(capa_to_discharge,1)]\n\n\n\n        grid_spec=0\n\n        if architecture['grid']==1:\n\n            rand_weak_grid = np.random.randint(low=0, high=2)\n            price_scenario = np.random.randint(low=1, high=3)\n            if rand_weak_grid == 1:\n                architecture['genset'] = 1\n            grid = self._get_grid(rated_power=size['grid'], weak_grid=rand_weak_grid, price_scenario=price_scenario)\n            df_parameters['grid_weak'] = rand_weak_grid\n            df_parameters['grid_power_import'] = grid['grid_power_import']\n            df_parameters['grid_power_export'] = grid['grid_power_export']\n            grid_ts = grid['grid_ts']\n            #df_parameters['grid_price_import'] = grid['grid_price_import']\n            #df_parameters['grid_price_export'] = grid['grid_price_export']\n            column_actual_production.append('grid_import')\n            column_actual_production.append('grid_export')\n            column_actions.append('grid_import')\n            column_actions.append('grid_export')\n            column_cost.append('grid_import')\n            column_cost.append('grid_export')\n            df_status['grid_status'] = [grid_ts.iloc[0,0]]\n            #todo Switch back to random file to generate the new version of pymgrid25\n            grid_co2_ts = self._get_co2_ts() \n            df_status['grid_co2'] = [grid_co2_ts.iloc[0, 0]]\n\n            grid_price_import_ts = grid['grid_price_import']\n            grid_price_export_ts = grid['grid_price_export']\n            df_status['grid_price_import'] = [grid_price_import_ts.iloc[0, 0]]\n            df_status['grid_price_export'] = [grid_price_export_ts.iloc[0, 0]]\n\n        if architecture['genset']==1:\n            genset = self._get_genset(rated_power=size['genset'])\n            df_parameters['genset_polynom_order'] = len(genset['polynom'])\n\n            for i in range(len(genset['polynom'])):\n                df_parameters['genset_polynom_'+str(i)]=genset['polynom'][i]\n\n            df_parameters['genset_rated_power'] = genset['rated_power']\n            df_parameters['genset_pmin'] = genset['pmin']\n            df_parameters['genset_pmax'] = genset['pmax']\n            df_parameters['fuel_cost'] = genset['fuel_cost']\n            df_parameters['genset_co2'] = genset['co2']\n            column_actual_production.append('genset')\n            column_actions.append('genset')\n            column_cost.append('genset')\n\n        column_cost.append('total_cost')\n        df_actions= {key:[] for key in column_actions}#pd.DataFrame(columns = column_actions, )\n        df_actual_production = {key:[] for key in column_actual_production}#pd.DataFrame(columns=column_actual_production)\n        df_cost = {key: [] for key in column_cost}\n\n        microgrid_spec={\n            'parameters':df_parameters, #Dictionary\n            'df_actions':df_actions, #Dataframe\n            'architecture':architecture, #Dictionary\n            'df_status':df_status, #Dictionary\n            'df_actual_generation':df_actual_production,#Dataframe\n            'grid_spec':grid_spec, #value = 0\n            'df_cost':df_cost, #Dataframe of 1 value = 0.0\n            'df_co2': df_co2,\n            'pv':pv, #Dataframe\n            'load': load, #Dataframe\n            'grid_ts':grid_ts, #Dataframe\n            'control_dict': column_actions, #dictionnary\n            'grid_price_import' : grid_price_import_ts,\n            'grid_price_export' : grid_price_export_ts,\n            'grid_co2': grid_co2_ts,\n        }\n\n        microgrid = NonModularMicrogrid(microgrid_spec)\n\n        return microgrid\n    ########################################################\n    # PRINT / PLOT FUNCTIONS\n    ########################################################\n\n    # function to plot the parameters of all the microgrid generated\n    def print_mg_parameters(self, id='all'):\n        \"\"\" This function is used to print the parameters of all the generated microgrids.\"\"\"\n\n        if id == 'all':\n\n            if self.microgrids != []:\n                parameters = pd.DataFrame()\n                for i in range(self.nb_microgrids):\n                    parameters = parameters.append(self.microgrids[i].parameters, ignore_index=True)\n\n                pd.options.display.max_columns = None\n                display(parameters)\n\n        elif isinstance(id, int) and id < self.nb_microgrids:\n            display(self.microgrids[id].parameters)\n\n    def print_all_costs(self):\n\n        #one column ID, one run cost, one rule based, one mpc\n        #if train test split, for each train and test\n        df_cost = pd.DataFrame()\n        for i in range(self.nb_microgrids):\n\n            if self.microgrids[i]._has_train_test_split == False:\n\n                cost_run = self.microgrids[i]._df_record_cost.sum().values\n                cost_mpc = np.nan\n                cost_rule_based = np.nan\n\n                if self.microgrids[i]._has_run_mpc_baseline == True:\n                    cost_mpc = np.around(self.microgrids[i]._baseline_linprog_cost.sum().values[0], 1)\n\n                if self.microgrids[i]._has_run_rule_based_baseline == True:\n                    cost_rule_based = np.around(self.microgrids[i]._baseline_priority_list_cost.sum().values[0],1)\n\n\n            else:\n                cost_run = self.microgrids[i]._df_record_cost.sum().values\n                cost_mpc = np.nan\n                cost_rule_based = np.nan\n\n                if self.microgrids[i]._has_run_mpc_baseline == True:\n                    cost_mpc = np.around(self.microgrids[i]._baseline_linprog_cost.iloc[self.microgrids[i]._limit_index:].sum().values[0],1)\n\n                if self.microgrids[i]._has_run_rule_based_baseline == True:\n                    cost_rule_based = np.around(self.microgrids[i]._baseline_priority_list_cost.iloc[self.microgrids[i]._limit_index:].sum().values[0],1)\n\n            df_cost =df_cost.append({'ID':i, 'Cost': cost_run, 'Cost (MPC)': cost_mpc, 'Cost (rule-based)':cost_rule_based}, ignore_index=True)\n\n        display(df_cost)\n"
  },
  {
    "path": "src/pymgrid/__init__.py",
    "content": "from pathlib import Path\nfrom .version import __version__\n\nPROJECT_PATH = Path(__file__).parent\n\nfrom ._deprecated.non_modular_microgrid import NonModularMicrogrid\nfrom .microgrid import Microgrid\nfrom .MicrogridGenerator import MicrogridGenerator\n\nfrom .utils import add_pymgrid_yaml_representers\n\nimport pymgrid.envs\n\n__all__ = [\n    'Microgrid',\n    'MicrogridGenerator',\n    'NonModularMicrogrid',\n    'envs'\n]"
  },
  {
    "path": "src/pymgrid/_deprecated/Environments/Environment.py",
    "content": "\"\"\"\nCopyright 2020 Total S.A\nAuthors:Gonzague Henri <gonzague.henri@total.com>\nPermission to use, modify, and distribute this software is given under the\nterms of the pymgrid License.\nNO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.\n$Date: 2020/10/21 07:43 $\nGonzague Henri\n\"\"\"\n\n\"\"\"\n<pymgrid is a Python library to simulate microgrids>\nCopyright (C) <2020> <Total S.A.>\nThis program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.\nYou should have received a copy of the GNU Lesser General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.\n\"\"\"\n\nimport numpy as np\nimport gym\nfrom gym.utils import seeding\nfrom gym.spaces import Space, Discrete, Box\nfrom . import Preprocessing\nfrom pymgrid.algos.saa.saa import SampleAverageApproximation\n\nDEFAULT_CONFIG={\n    'microgrid': None, #need to be passed by user\n    'training_reward_smoothing':'sqrt', #'peak_load'\n    'resampling_on_reset':True,\n    'forecast_args':None, #used to init the SAA for resampling on reset\n    'baseline_sampling_args':None,\n}\n\ndef generate_sampler(microgrid, forecast_args):\n    \"\"\"\n    Generates an instance of SampleAverageApproximate to use in future sampling.\n    :param microgrid:\n    :param forecast_args:\n    :return:\n    \"\"\"\n    if forecast_args is None:\n        forecast_args = dict()\n\n    return SampleAverageApproximation(microgrid, **forecast_args)\n\nclass Environment(gym.Env):\n    \"\"\"\n    Markov Decision Process associated to the microgrid.\n        Parameters\n        ----------\n            microgrid: microgrid, mandatory\n                The controlled microgrid.\n            random_seed: int, optional\n                Seed to be used to generate the needed random numbers to size microgrids.\n    \"\"\"\n\n    def __init__(self, env_config, seed = 42):\n        # Set seed\n        np.random.seed(seed)\n\n        self.states_normalization = Preprocessing.normalize_environment_states(env_config['microgrid'])\n\n        self.TRAIN = True\n        # Microgrid\n        self.env_config = env_config\n        self.mg = env_config['microgrid']\n        # State space\n        self.mg.train_test_split()\n        #np.zeros(2+self.mg.architecture['grid']*3+self.mg.architecture['genset']*1)\n        # Number of states\n        self.Ns = len(self.mg._df_record_state.keys())+1\n        # Number of actions\n\n        #training_reward_smoothing\n        try:\n            self.training_reward_smoothing = env_config['training_reward_smoothing']\n        except:\n            self.training_reward_smoothing = 'sqrt'\n\n        try:\n            self.resampling_on_reset = env_config['resampling_on_reset']\n        except:\n            self.resampling_on_reset = False\n        \n        if self.resampling_on_reset == True:\n            self.forecast_args = env_config['forecast_args']\n            self.baseline_sampling_args = env_config['baseline_sampling_args']\n            self.saa = generate_sampler(self.mg, self.forecast_args)\n        \n        self.observation_space = Box(low=-1, high=np.float('inf'), shape=(self.Ns,), dtype=np.float)\n        #np.zeros(len(self.mg._df_record_state.keys()))\n        # Action space\n        self.metadata = {\"render.modes\": [ \"human\"]}\n        \n        self.state, self.reward, self.done, self.info, self.round = None, None, None, None, None\n        self.round = None\n\n        # Start the first round\n        self.seed()\n        self.reset()\n        \n\n        try:\n            assert (self.observation_space.contains(self.state))\n        except AssertionError:\n            print(\"ERROR : INVALID STATE\", self.state)\n\n    def get_reward(self):\n        if self.TRAIN == True:\n            if self.training_reward_smoothing == 'sqrt':\n                return -(self.mg.get_cost()**0.5)\n            if self.training_reward_smoothing == 'peak_load':\n                return -self.mg.get_cost()/self.mg.parameters['load'].values[0]\n        return -self.mg.get_cost()\n\n    def get_cost(self):\n        return sum(self.mg._df_record_cost['cost'])\n\n\n\n    def step(self, action):\n\n        # CONTROL\n        if self.done:\n            print(\"WARNING : EPISODE DONE\")  # should never reach this point\n            return self.state, self.reward, self.done, self.info\n        try:\n            assert (self.observation_space.contains(self.state))\n        except AssertionError:\n            print(\"ERROR : INVALID STATE\", self.state)\n\n        try:\n            assert (self.action_space.contains(action))\n        except AssertionError:\n            print(\"ERROR : INVALD ACTION\", action)\n\n        # UPDATE THE MICROGRID\n        control_dict = self.get_action(action)\n        self.mg.run(control_dict)\n\n        # COMPUTE NEW STATE AND REWARD\n        self.state = self.transition()\n        self.reward = self.get_reward()\n        self.done = self.mg.done\n        self.info = {}\n        self.round += 1\n\n        return self.state, self.reward, self.done, self.info\n        \n#         control_dict = self.get_action(action)\n#         self.mg.run(control_dict)\n#         reward = self.reward()\n#         s_ = self.transition()\n#         self.state = s_\n#         done = self.mg.done\n#         self.round += 1\n#         return s_, reward, done, {}\n\n    def reset(self, testing=False):\n        if \"testing\" in self.env_config:\n            testing = self.env_config[\"testing\"]\n        self.round = 1\n        # Reseting microgrid\n        self.mg.reset(testing=testing)\n        if testing == True:\n            self.TRAIN = False\n        elif self.resampling_on_reset == True:\n            Preprocessing.sample_reset(self.mg.architecture['grid'] == 1, self.saa, self.mg, sampling_args=self.sampling_args)\n        \n        \n        self.state, self.reward, self.done, self.info =  self.transition(), 0, False, {}\n        \n        return self.state\n\n\n    def get_action(self, action):\n        \"\"\"\n        :param action: current action\n        :return: control_dict : dicco of controls\n        \"\"\"\n        '''\n        States are:\n        binary variable whether charging or dischargin\n        battery power, normalized to 1\n        binary variable whether importing or exporting\n        grid power, normalized to 1\n        binary variable whether genset is on or off\n        genset power, normalized to 1\n        '''\n\n        control_dict=[]\n\n        return control_dict\n\n    def states(self):  # soc, price, load, pv 'df status?'\n        observation_space = []\n        return observation_space\n\n    # Transition function\n    def transition(self):\n        #         net_load = round(self.mg.load - self.mg.pv)\n        #         soc = round(self.mg.battery.soc,1)\n        #         s_ = (net_load, soc)  # next state\n        updated_values = self.mg.get_updated_values()\n        updated_values = {x:float(updated_values[x])/self.states_normalization[x] for x in self.states_normalization}  \n        updated_values['hour_sin'] = np.sin(2*np.pi*updated_values['hour']) # the hour is already divided by 24 in the line above\n        updated_values['hour_cos'] = np.cos(2*np.pi*updated_values['hour'])  \n        updated_values.pop('hour', None)\n\n        s_ = np.array(list(updated_values.values()))\n        #np.array(self.mg.get_updated_values().values)#.astype(np.float)#self.mg.get_updated_values()\n        #s_ = [ s_[key] for key in s_.keys()]\n        return s_\n    \n    def seed (self, seed=None):\n        self.np_random, seed = seeding.np_random(seed)\n        return [seed]\n    \n    def render(self, mode=\"human\"):\n        txt = \"state: \" + str(self.state) + \" reward: \" + str(self.reward) + \" info: \" + str(self.info)\n        print(txt)\n\n    # Mapping between action and the control_dict\n    def get_action_continuous(self, action):\n        \"\"\"\n        :param action: current action\n        :return: control_dict : dicco of controls\n        \"\"\"\n        '''\n        Actions are:\n        binary variable whether charging or dischargin\n        battery power, normalized to 1\n        binary variable whether importing or exporting\n        grid power, normalized to 1\n        binary variable whether genset is on or off\n        genset power, normalized to 1\n        '''\n\n        mg = self.mg\n        pv = mg.pv\n        load = mg.load\n        net_load = load - pv\n        capa_to_charge = mg.battery.capa_to_charge\n        p_charge_max = mg.battery.p_charge_max\n        p_charge = max(0, min(-net_load, capa_to_charge, p_charge_max))\n\n        capa_to_discharge = mg.battery.capa_to_discharge\n        p_discharge_max = mg.battery.p_discharge_max\n        p_discharge = max(0, min(net_load, capa_to_discharge, p_discharge_max))\n\n        control_dict = {}\n\n        if mg.architecture['battery'] == 1:\n            control_dict['battery_charge'] = max(0, action[0] * min(action[1] * mg.battery.capacity,\n                                                                    mg.battery.capa_to_charge,\n                                                                    mg.battery.p_charge_max))\n            control_dict['battery_discharge'] = max(0, (1 - action[0]) * min(action[1] * mg.battery.capacity,\n                                                                             mg.battery.capa_to_discharge,\n                                                                             mg.battery.p_discharge_max))\n\n        if mg.architecture['grid'] == 1:\n            if mg.grid.status == 1:\n                control_dict['grid_import'] = max(0, action[2] * min(action[3] * mg.grid.power_import,\n                                                                     mg.grid.power_import))\n                control_dict['grid_export'] = max(0, (1 - action[2]) * min(action[3] * mg.grid.power_export,\n                                                                           mg.grid.power_export))\n            else:\n                # avoid warnings\n                control_dict['grid_import'] = 0\n                control_dict['grid_export'] = 0\n\n        if mg.architecture['genset'] == 1:\n            control_dict['genset'] = max(0, action[4] * min(action[5] * mg.genset.rated_power,\n                                                            mg.genset.rated_power))\n        return control_dict\n\n    def get_action_discrete(self, action):\n        \"\"\"\n        :param action: current action\n        :return: control_dict : dicco of controls\n        \"\"\"\n        '''\n        Actions are:\n        binary variable whether charging or dischargin\n        battery power, normalized to 1\n        binary variable whether importing or exporting\n        grid power, normalized to 1\n        binary variable whether genset is on or off\n        genset power, normalized to 1\n        '''\n        control_dict={}\n\n        control_dict['pv_consumed'] = action[0]\n        if self.mg.architecture['battery'] == 1:\n            control_dict['battery_charge'] = action[1] * action[3]\n            control_dict['battery_discharge'] =  action[2] * (1- action[3])\n\n        if self.mg.architecture['genset'] == 1:\n            control_dict['genset'] = action[4]\n\n            if self.mg.architecture['grid'] == 1:\n                control_dict['grid_import'] = action[5] * action[7]\n                control_dict['grid_export'] = action[6] * (1- action[7])\n\n        elif self.mg.architecture['grid'] == 1:\n            control_dict['grid_import'] = action[4] * action[6]\n            control_dict['grid_export'] = action[5] * (1 - action[6])\n\n\n\n\n        return control_dict\n\n    # Mapping between action and the control_dict\n    def get_action_priority_list(self, action):\n        \"\"\"\n        :param action: current action\n        :return: control_dict : dicco of controls\n        \"\"\"\n        '''\n        States are:\n        binary variable whether charging or dischargin\n        battery power, normalized to 1\n        binary variable whether importing or exporting\n        grid power, normalized to 1\n        binary variable whether genset is on or off\n        genset power, normalized to 1\n        '''\n\n        mg = self.mg\n        pv = mg.pv\n        load = mg.load\n        net_load = load - pv\n        capa_to_charge = mg.battery.capa_to_charge\n        p_charge_max = mg.battery.p_charge_max\n        p_charge = max(0, min(-net_load, capa_to_charge, p_charge_max))\n\n        capa_to_discharge = mg.battery.capa_to_discharge\n        p_discharge_max = mg.battery.p_discharge_max\n        p_discharge = max(0, min(net_load, capa_to_discharge, p_discharge_max))\n\n        control_dict = {}\n\n        control_dict = self.actions_agent_discret(mg, action)\n\n        return control_dict\n\n\n    def actions_agent_discret(self, mg, action):\n        if mg.architecture['genset'] == 1 and mg.architecture['grid'] == 1:\n            control_dict = self.action_grid_genset(mg, action)\n\n        elif mg.architecture['genset'] == 1 and mg.architecture['grid'] == 0:\n            control_dict = self.action_genset(mg, action)\n\n        else:\n            control_dict = self.action_grid(mg, action)\n\n        return control_dict\n\n    def action_grid(self, mg, action):\n        # slack is grid\n\n        pv = mg.pv\n        load = mg.load\n\n        net_load = load - pv\n\n        capa_to_charge = mg.battery.capa_to_charge\n        p_charge_max = mg.battery.p_charge_max\n        p_charge_pv = max(0, min(-net_load, capa_to_charge, p_charge_max))\n        p_charge_grid = max(0, min( capa_to_charge, p_charge_max))\n\n        capa_to_discharge = mg.battery.capa_to_discharge\n        p_discharge_max = mg.battery.p_discharge_max\n        p_discharge = max(0, min(net_load, capa_to_discharge, p_discharge_max))\n\n        # Charge\n        if action == 0:\n\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': p_charge_pv,\n                            'battery_discharge': 0,\n                            'grid_import': 0,\n                            'grid_export': max(0, pv - min(pv, load) - p_charge_pv),\n                            'genset': 0\n                            }\n        \n        if action == 4:\n            load = load + p_charge_grid\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': p_charge_grid,\n                            'battery_discharge': 0,\n                            'grid_import': max(0, load - min(pv, load)),\n                            'grid_export': max(0, pv - min(pv, load) - p_charge_grid) ,\n                            'genset': 0\n                            }\n\n\n        # décharger full\n        elif action == 1:\n\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': 0,\n                            'battery_discharge': p_discharge,\n                            'grid_import': max(0, load - min(pv, load) - p_discharge),\n                            'grid_export': 0,\n                            'genset': 0\n                            }\n\n        # Import\n        elif action == 2:\n\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': 0,\n                            'battery_discharge': 0,\n                            'grid_import': max(0, net_load),\n                            'grid_export': 0,\n                            'genset': 0\n                            }\n        # Export\n        elif action == 3:\n\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': 0,\n                            'battery_discharge': 0,\n                            'grid_import': 0,\n                            'grid_export': abs(min(net_load, 0)),\n                            'genset': 0\n                            }\n\n        return control_dict\n\n    def action_grid_genset(self, mg, action):\n        # slack is grid\n\n        pv = mg.pv\n        load = mg.load\n\n        net_load = load - pv\n        status = mg.grid.status  # whether there is an outage or not\n        capa_to_charge = mg.battery.capa_to_charge\n        p_charge_max = mg.battery.p_charge_max\n        p_charge_pv = max(0, min(-net_load, capa_to_charge, p_charge_max))\n        p_charge_grid = max(0, min( capa_to_charge, p_charge_max))\n\n        capa_to_discharge = mg.battery.capa_to_discharge\n        p_discharge_max = mg.battery.p_discharge_max\n        p_discharge = max(0, min(net_load, capa_to_discharge, p_discharge_max))\n\n        capa_to_genset = mg.genset.rated_power * mg.genset.p_max\n        p_genset = max(0, min(net_load, capa_to_genset))\n\n        # Charge\n        if action == 0:\n\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': p_charge_pv,\n                            'battery_discharge': 0,\n                            'grid_import': 0,\n                            'grid_export': max(0, pv - min(pv, load) - p_charge_pv) * status,\n                            'genset': 0\n                            }\n        if action == 5:\n            load = load+p_charge_grid\n\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': p_charge_grid,\n                            'battery_discharge': 0,\n                            'grid_import': max(0, load - min(pv, load)) * status,\n                            'grid_export': max(0, pv - min(pv, load) - p_charge_grid) * status,\n                            'genset': 0\n                            }\n\n\n        # décharger full\n        elif action == 1:\n\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': 0,\n                            'battery_discharge': p_discharge,\n                            'grid_import': max(0, load - min(pv, load) - p_discharge) * status,\n                            'grid_export': 0,\n                            'genset': 0\n                            }\n\n        # Import\n        elif action == 2:\n\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': 0,\n                            'battery_discharge': 0,\n                            'grid_import': max(0, net_load) * status,\n                            'grid_export': 0,\n                            'genset': 0\n                            }\n        # Export\n        elif action == 3:\n\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': 0,\n                            'battery_discharge': 0,\n                            'grid_import': 0,\n                            'grid_export': abs(min(net_load, 0)) * status,\n                            'genset': 0\n                            }\n        # Genset\n        elif action == 4:\n\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': 0,\n                            'battery_discharge': 0,\n                            'grid_import': 0,\n                            'grid_export': 0,\n                            'genset': max(net_load, 0)\n                            }\n\n        elif action == 6:\n\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': 0,\n                            'battery_discharge': p_discharge,\n                            'grid_import': 0,\n                            'grid_export': 0,\n                            'genset': max(0, load - min(pv, load) - p_discharge),\n                            }\n\n        return control_dict\n\n    def action_genset(self, mg, action):\n        # slack is genset\n\n        pv = mg.pv\n        load = mg.load\n\n        net_load = load - pv\n\n        capa_to_charge = mg.battery.capa_to_charge\n        p_charge_max = mg.battery.p_charge_max\n        p_charge = max(0, min(-net_load, capa_to_charge, p_charge_max))\n\n        capa_to_discharge = mg.battery.capa_to_discharge\n        p_discharge_max = mg.battery.p_discharge_max\n        p_discharge = max(0, min(net_load, capa_to_discharge, p_discharge_max))\n\n        capa_to_genset = mg.genset.rated_power * mg.genset.p_max\n        p_genset = max(0, min(net_load, capa_to_genset))\n\n        # Charge\n        if action == 0:\n\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': p_charge,\n                            'battery_discharge': 0,\n                            'grid_import': 0,\n                            'grid_export': 0,\n                            'genset': 0\n                            }\n\n\n        # décharger full\n        elif action == 1:\n\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': 0,\n                            'battery_discharge': p_discharge,\n                            'grid_import': 0,\n                            'grid_export': 0,\n                            'genset': max(0, load - min(pv, load) - p_discharge)\n                            }\n\n        # Genset\n        elif action == 2:\n\n            control_dict = {'pv_consummed': min(pv, load),\n                            'battery_charge': 0,\n                            'battery_discharge': 0,\n                            'grid_import': 0,\n                            'grid_export': 0,\n                            'genset': max(0, load - min(pv, load))\n                            }\n\n        return control_dict\n"
  },
  {
    "path": "src/pymgrid/_deprecated/Environments/Preprocessing.py",
    "content": "import pandas as pd\n\ndef normalize_environment_states(mg):\n    max_values = {}\n    for keys in mg._df_record_state:\n        if keys == 'hour':\n            max_values[keys] = 24\n        elif keys == 'capa_to_charge' or keys == 'capa_to_discharge' :\n            max_values[keys] = mg.parameters.battery_capacity.values[0]\n        elif keys == 'grid_status' or keys == 'battery_soc':\n            max_values[keys] = 1\n        elif keys == 'grid_co2':\n            max_values[keys] = max(mg._grid_co2.values[0])\n        elif keys == 'grid_price_import':\n            max_values[keys] = max(mg._grid_price_import.values[0]) \n        elif keys == 'grid_price_export':\n            max_values[keys] = max(mg._grid_price_import.values[0]) \n        elif keys == 'load':\n            max_values[keys] = mg.parameters.load.values[0]\n        elif keys == 'pv':\n            max_values[keys] = mg.parameters.PV_rated_power.values[0]\n        else:\n            max_values[keys] = mg.parameters[keys].values[0] \n            \n    return max_values\n\ndef sample_reset(has_grid, saa, microgrid, sampling_args=None):\n    \"\"\"\n    Generates a new sample using an instance of SampleAverageApproximation and\n    :param has_grid: bool, whether the microgrid has a grid.\n    :param saa:, SampleAverageApproximation\n    :param microgrid: Microgrid\n    :param sampling_args: arguments to be passed to saa.sample_from_forecasts().\n    :return:\n    \"\"\"\n    if sampling_args is None:\n        sampling_args = dict()\n\n    sample = saa.sample_from_forecasts(n_samples=1, **sampling_args)\n    sample = sample[0]\n\n    microgrid._load_ts = pd.DataFrame(sample['load'])\n    microgrid._pv_ts = pd.DataFrame(sample['pv'])\n    microgrid._df_record_state['load'] = [sample['load'].iloc[0].squeeze()]\n    microgrid._df_record_state['pv'] = [sample['pv'].iloc[0].squeeze()]\n    if has_grid:\n        microgrid._grid_status_ts = pd.DataFrame(sample['grid'])\n        microgrid._df_record_state['grid_status'] = [sample['grid'].iloc[0].squeeze()]"
  },
  {
    "path": "src/pymgrid/_deprecated/Environments/__init__.py",
    "content": "\n"
  },
  {
    "path": "src/pymgrid/_deprecated/Environments/pymgrid_csca.py",
    "content": "from abc import ABC\nimport gym, logging, numpy as np, pandas as pd\nfrom gym import Env\nfrom pymgrid._deprecated.non_modular_microgrid import NonModularMicrogrid\nfrom pymgrid.MicrogridGenerator import MicrogridGenerator\nfrom copy import deepcopy\nfrom pymgrid.algos.saa.saa import SampleAverageApproximation\nfrom pymgrid.algos import ModelPredictiveControl\n\nlogger = logging.getLogger(__name__)\nLOG = False\nDEBUG = True\n\n# If you get a JSON serializable error, turn this on:\nJSON_ERROR = False\n\n\ndef sample_reset(has_grid, saa, microgrid, sampling_args=None):\n    \"\"\"\n    Generates a new sample using an instance of SampleAverageApproximation and\n    :param has_grid: bool, whether the microgrid has a grid.\n    :param saa:, SampleAverageApproximation\n    :param microgrid: Microgrid\n    :param sampling_args: arguments to be passed to saa.sample_from_forecasts().\n    :return:\n    \"\"\"\n    if sampling_args is None:\n        sampling_args = dict()\n\n    sample = saa.sample_from_forecasts(n_samples=1, **sampling_args)\n    sample = sample[0]\n\n    microgrid._load_ts = pd.DataFrame(sample['load'])\n    microgrid._pv_ts = pd.DataFrame(sample['pv'])\n    microgrid._df_record_state['load'] = [sample['load'].iloc[0].squeeze()]\n    microgrid._df_record_state['pv'] = [sample['pv'].iloc[0].squeeze()]\n    if has_grid:\n        microgrid._grid_status_ts = pd.DataFrame(sample['grid'])\n        microgrid._df_record_state['grid_status'] = [sample['grid'].iloc[0].squeeze()]\n\n\ndef generate_sampler(microgrid, forecast_args):\n    \"\"\"\n    Generates an instance of SampleAverageApproximate to use in future sampling.\n    :param microgrid:\n    :param forecast_args:\n    :return:\n    \"\"\"\n    if forecast_args is None:\n        forecast_args = dict()\n\n    return SampleAverageApproximation(microgrid, **forecast_args)\n\n\nclass MicrogridEnv(Env, ABC):\n    metadata = {'render.modes': ['human']}\n\n    def __init__(self, microgrid, trajectory_len=None, max_episode_len=None):\n        \"\"\"\n        :param max_episode_len:\n        :param microgrid: Microgrid, the underlying microgrid.\n        :param trajectory_len: int, length of a trajectory (to be started at a random index).\n            Default None, runs an entire year\n        \"\"\"\n        super().__init__()\n\n        if isinstance(microgrid, int) and 0<=microgrid<=25:\n            print('Initializing microgrid {} of 25 using 25 microgrids from MicrogridGenerator'.format(microgrid))\n            m_gen = MicrogridGenerator(nb_microgrid=25)\n            m_gen.generate_microgrid(verbose=False)\n            self.microgrid = deepcopy(m_gen.microgrids[microgrid])\n\n        elif isinstance(microgrid, NonModularMicrogrid):\n            self.microgrid = deepcopy(microgrid)\n\n        else:\n            raise ValueError('microgrid must be of type Microgrid, is {}'.format(type(microgrid)))\n\n        assert self.microgrid._data_length == 8760, 'Microgrid data length should be 8760, is {}'.format(self.microgrid._data_length)\n\n        self.has_grid = self.microgrid.architecture['grid'] == 1\n        self.has_genset = self.microgrid.architecture['genset'] == 1\n\n        observation_dim = len(self.microgrid._df_record_state)\n        self.observation_space = gym.spaces.Box(low=0, high=np.float('inf'), shape=(observation_dim,), dtype=np.float64)\n        self.action_space = None\n\n        self.current_action = None\n        self.current_obs = None\n\n\n        if max_episode_len is None:\n            self.microgrid.horizon = 0\n        else:\n            self.microgrid.horizon = self.microgrid._data_length - max_episode_len\n\n        self.trajectory_len = trajectory_len\n        self._short_trajectory_set()\n\n\n    def _short_trajectory_set(self):\n        trajectory_len = self.trajectory_len\n        if trajectory_len is not None:\n            assert isinstance(trajectory_len, int)\n            from numpy.random import randint\n            high_range = self.microgrid._data_length - self.microgrid.horizon - trajectory_len\n\n            start_index = randint(low=0, high=high_range)\n            self.microgrid._tracking_timestep = start_index\n            self.microgrid._data_length = start_index + trajectory_len + self.microgrid.horizon\n\n    def reset(self):\n        self.microgrid.reset()\n        self._short_trajectory_set()\n\n        initial_state = self.microgrid.get_updated_values()\n        observations = np.array(list(initial_state.values()))\n\n        self.current_obs = observations\n\n        return observations\n\n    def step(self, action, **kwargs):\n        \"\"\"\n        :param **kwargs:\n        :param\n            action:\n        :return:\n            observation, np.ndarray\n                If self.has_grid, shape (10,), with values\n                        [load, hour, pv, battery_soc, capa_to_charge, capa_to_discharge,\n                            grid_status, grid_co2, grid_price_import, grid_price_export]\n                Else, shape (6,), with values\n                        [load, hour, pv, battery_soc, capa_to_charge, capa_to_discharge]\n            reward, float\n                The reward (negative cost) of the step\n            done, bool\n                Whether the episode is complete\n            info, dict\n                Info\n\n        \"\"\"\n        control_dict = self.get_control_dict(action)\n        observation = self.run_control(control_dict)\n        reward = -1.0 * self.microgrid.get_cost()\n        done = self.microgrid.done\n        info = dict()\n\n        self.current_obs = observation\n        self.current_action = action\n\n        return observation, reward, done, info\n\n    def get_control_dict(self, action):\n        \"\"\"\n        A function that takes an action (discrete or continuous) and returns a control_dict.\n            See ContinuousMicrogridEnv for an example.\n        \"\"\"\n        return NotImplemented\n\n    def run_control(self, control_dict):\n        \"\"\"\n        Given a control_dict, calls microgrid.run(_) and returns the observations.\n        :param control_dict:\n        :return: observations, np.ndarray\n        \"\"\"\n        updated_vals = self.microgrid.run(control_dict)\n        observations = np.array(list(updated_vals.values()))\n\n        assert len(observations) == self.observation_space.shape[0]\n        return observations\n\n\nclass ContinuousMicrogridEnv(MicrogridEnv):\n    \"\"\"\n    Class to run a Microgrid in the format of a gym env. Continuous states, continuous actions.\n    \"\"\"\n    def __init__(self, microgrid, standardization=True, trajectory_len=None, max_episode_len=None, **kwargs):\n        \"\"\"\n        :param microgrid: Microgrid, the underlying microgrid.\n        :param standardization: bool, default True. whether to scale the actions to a factor determined by a run of MPC.\n        \"\"\"\n        super().__init__(microgrid, trajectory_len=trajectory_len, max_episode_len=max_episode_len)\n\n        self.logger = kwargs['logger'] if 'logger' in kwargs else None\n\n        action_dim = 5+self.has_genset\n        upper_bound, lower_bound = self._get_action_ub_lb()\n\n        self.action_space = gym.spaces.Box(low=lower_bound, high=upper_bound, shape=(action_dim,), dtype=np.float64)\n\n        self.standardization = standardization\n        if not JSON_ERROR and self.standardization:\n            self.standardizations = self.pre_compute_standardizations()\n\n            # Rescale the action space\n            low_new = self.standardize(self.action_space.low, use_proxy='action')\n            self.action_space.low = low_new\n            high_new = self.standardize(self.action_space.high, use_proxy='action')\n            high_new[1] = 0.1 # This is a hard-coded grid_export bound\n            self.action_space.high = high_new\n        else:\n            self.standardizations = None\n\n    def _get_action_ub_lb(self):\n        # Upper Bound\n        p_max_import = self.microgrid.parameters['grid_power_import'].values[0]\n        p_max_export = self.microgrid.parameters['grid_power_export'].values[0]\n        p_max_charge = self.microgrid.parameters['battery_power_charge'].values[0]\n        p_max_discharge = self.microgrid.parameters['battery_power_discharge'].values[0]\n        pv_max = self.microgrid.parameters.PV_rated_power.squeeze()\n\n        upper_bound = [p_max_import, p_max_export, p_max_charge, p_max_discharge, pv_max]\n\n        if self.has_genset:\n            p_genset_max = self.microgrid.parameters['genset_rated_power'].values[0] * self.microgrid.parameters['genset_pmax'].values[0]\n            upper_bound.insert(0,p_genset_max)\n\n        upper_bound = np.array(upper_bound)\n\n        # Lower Bound\n\n        lower_bound = [0]*5\n\n        if self.has_genset:\n            action_dim = 6\n            p_genset_min = self.microgrid.parameters['genset_rated_power'].values[0] * \\\n                           self.microgrid.parameters['genset_pmin'].values[0]\n            lower_bound.insert(0, p_genset_min)\n\n        lower_bound = np.array(lower_bound)\n\n        return upper_bound, lower_bound\n\n\n\n    def get_values(self, *value_names):\n        # TODO Speed this up. Refactor standardizations. nan_to_num takes significant time.\n        \"\"\"\n        Helper function. Given a list of value names (e.g., the names of components of the state/actions),\n            returns their values in the same order.\n        Note: if the env standardizes values, this function returns the unstandarized values.\n        :param value_names:\n        :return:\n        \"\"\"\n        genset_actions = ['genset', 'grid_import', 'grid_export', 'battery_charge', 'battery_discharge', 'pv_consummed']\n        no_genset_actions = ['grid_import', 'grid_export', 'battery_charge', 'battery_discharge', 'pv_consummed']\n\n        grid_observations = ['load', 'hour', 'pv', 'battery_soc', 'capa_to_charge', 'capa_to_discharge',\n                            'grid_status', 'grid_co2', 'grid_price_import', 'grid_price_export']\n        no_grid_observations = ['load', 'hour', 'pv', 'battery_soc', 'capa_to_charge', 'capa_to_discharge']\n\n        if self.current_action is None:\n            print('Warning: current_action is None, should only happen on first iteration')\n            if self.has_genset:\n                self.current_action = np.array([0]*len(genset_actions))\n            else:\n                self.current_action = np.array([0]*len(no_genset_actions))\n\n            action = self.current_action\n            obs = self.current_obs\n\n        elif self.standardization:\n            obs_mean, obs_std, action_mean, action_std = self.standardizations\n            action = self.standardize(self.current_action, action_mean, action_std, direction='backward')\n            obs = self.standardize(self.current_obs, obs_mean, obs_std, direction='backward')\n        else:\n            action = self.current_action\n            obs = self.current_obs\n\n        if self.has_genset:\n            actions_dict = dict(zip(genset_actions, action))\n        else:\n            actions_dict = dict(zip(no_genset_actions, action))\n        if self.has_grid:\n            obs_dict = dict(zip(grid_observations, obs))\n        else:\n            obs_dict = dict(zip(no_grid_observations, obs))\n\n        values = []\n\n\n        for name in value_names:\n            if name in actions_dict.keys():\n                values.append(actions_dict[name])\n            elif name in obs_dict.keys():\n                values.append(obs_dict[name])\n            else:\n                raise ValueError('Value \\'{}\\' not recognized with current architecture'.format(name))\n\n        return values\n\n    def reset(self):\n        observation = super().reset()\n        if self.standardization:\n            obs_mean, obs_std, action_mean, action_std = self.standardizations\n            observation = self.standardize(observation, obs_mean, obs_std, direction='forward')\n            self.current_obs = observation\n\n        return observation\n\n\n\n    def step(self, action, **kwargs):\n        \"\"\"\n        :param **kwargs:\n        :param\n            action: np.ndarray\n                If self.has_genset: shape (6,), with values\n                    [genset, grid_import, grid_export, battery_charge, battery_discharge, pv_consummed]\n                Else: shape (5,), with values\n                    [grid_import, grid_export, battery_charge, battery_discharge, pv_consummed]\n        :return:\n            observation, np.ndarray\n                If self.has_grid, shape (10,), with values\n                        [load, hour, pv, battery_soc, capa_to_charge, capa_to_discharge,\n                            grid_status, grid_co2, grid_price_import, grid_price_export]\n                Else, shape (6,), with values\n                        [load, hour, pv, battery_soc, capa_to_charge, capa_to_discharge]\n            reward, float\n                The reward (negative cost) of the step\n            done, bool\n                Whether the episode is complete\n            info, dict\n                Info\n\n        \"\"\"\n        # Actions must be passed in order as defined in pymgrid25 paper\n        assert isinstance(action, np.ndarray)\n\n        unscaled_action = action.copy()\n\n        if self.standardization:\n            if not isinstance(action, np.ndarray):\n                raise TypeError('action must be of type np.ndarray')\n\n            obs_mean, obs_std, action_mean, action_std = self.standardizations\n\n            action = self.standardize(action, action_mean, action_std, direction='backward')\n\n        observation, reward, done, info = super().step(action)\n\n        if self.standardization:\n            observation = self.standardize(observation, obs_mean, obs_std, direction='forward')\n\n        self.current_obs = observation\n        self.current_action = unscaled_action\n\n        # Do you want to deal w everything in normalized space or unnormalized space\n\n        return observation, reward, done, info\n\n\n    def standardize(self, data, mean_proxy=None, std_proxy=None, direction='forward', use_proxy=None):\n        \"\"\"\n        :param data: np.ndarray, shape (observation_dim,) or (action_dim), observation or action to rescale\n        :param mean_proxy: np.ndarray, shape (observation_dim,) or (action_dim), mean to use in rescaling\n        :param std_proxy: np.ndarray, shape (observation_dim,) or (action_dim), standard deviation to use in rescaling\n        :param direction: str, default 'forward'. One of 'forward' or 'backward', whether to scale to or from standard normal\n        :return: np.ndarray, rescaled values.\n        \"\"\"\n\n        if (mean_proxy is None and std_proxy is None and use_proxy is None) or (mean_proxy is not None and use_proxy is not None):\n            raise ValueError('Must pass mean_proxy and std_proxy, or use_proxy must be a str in (\\'action\\', \\'obs\\'), but not both')\n        if mean_proxy is None and std_proxy is None:\n            if use_proxy == 'action':\n                mean_proxy, std_proxy = [x for x in self.standardizations[2:]]\n            elif use_proxy == 'obs':\n                mean_proxy, std_proxy = [x for x in self.standardizations[:2]]\n            else:\n                raise NameError('Unable to recognize use_proxy {}, must be one of \\'action\\' or \\'obs\\''.format(use_proxy))\n\n\n        names = ('data', 'mean_proxy', 'std_proxy')\n        vals = (data, mean_proxy, std_proxy)\n        dirs = ('forward', 'backward')\n\n        for name, v in zip(names, vals):\n            if not isinstance(v, np.ndarray):\n                raise TypeError('{} must be of type numpy.ndarray, is {}'.format(name, type(v)))\n        if not (data.shape == mean_proxy.shape and mean_proxy.shape == std_proxy.shape):\n            raise ValueError('Incompatible shapes of data, mean_proxy, std_proxy. Must be equal, are: {}'.format(\n                dict(zip(names, [v.shape for v in vals]))))\n\n        if direction not in dirs:\n            raise ValueError('direction must be one of {}'.format(dirs))\n\n        if direction == 'forward':\n            return (data-mean_proxy)/std_proxy\n        else:\n            return data*std_proxy+mean_proxy\n\n    def pre_compute_standardizations(self,alg_to_use='mpc'):\n        \"\"\"\n        Runs a control algorithm to pre compute the standardizations for actions/observations to rescale to standard normal (ish).\n        :param alg_to_use: str, default 'mpc'. What algorithm to run to compute the standardizations\n        :return: tuple len(4,): obs_mean, obs_std, action_mean, action_std\n        \"\"\"\n\n        action_mean = [0]*self.action_space.shape[0]\n        action_std = [0]*self.action_space.shape[0]\n        obs_mean = [0]*self.observation_space.shape[0]\n        obs_std = [0]*self.observation_space.shape[0]\n\n        if alg_to_use == 'mpc':\n            old_horizon = self.microgrid.horizon\n            self.microgrid.horizon = 24\n            MPC = ModelPredictiveControl(self.microgrid)\n            mpc_output = MPC.run(max_steps=1000)\n            self.microgrid.horizon = old_horizon\n            if self.has_genset:\n\n                action_keys = 'genset', 'grid_import, grid_export, battery_charge, battery_discharge, pv_consummed'\n\n                for j, name in enumerate(action_keys):\n                    action_mean[j] = np.mean(mpc_output['action'][name])\n                    action_std[j] = np.std(mpc_output['action'][name])\n\n                obs_keys = list(self.microgrid._df_record_state.keys())\n\n                for j, name in enumerate(obs_keys):\n                    obs_mean[j] = np.mean(mpc_output['status'][name])\n                    obs_std[j] = np.std(mpc_output['status'][name])\n\n            else:\n                action_keys = 'grid_import', 'grid_export', 'battery_charge', 'battery_discharge', 'pv_consummed'\n\n                for j, name in enumerate(action_keys):\n                    action_mean[j] = np.mean(mpc_output['action'][name])\n                    action_std[j] = np.std(mpc_output['action'][name])\n\n                obs_keys = list(self.microgrid._df_record_state.keys())\n\n                for j, name in enumerate(obs_keys):\n                    obs_mean[j] = np.mean(mpc_output['status'][name])\n                    obs_std[j] = np.std(mpc_output['status'][name])\n        else:\n            raise RuntimeError('algorithm name {} not currently supported'.format(alg_to_use))\n\n        for j in range(len(obs_std)):\n            if obs_std[j] < 1.0:\n                obs_std[j] = 1.0\n        for j in range(len(action_std)):\n            if action_std[j] < 1.0:\n                action_std[j] = 1.0\n\n        names = ('obs_mean', 'obs_std', 'action_mean', 'action_std')\n        outputs = obs_mean, obs_std, action_mean, action_std\n        outputs = tuple(np.array(output) for output in outputs)\n\n        for name, output in zip(names,outputs):\n            if (output == 0).sum() != 0:\n                for j,val in enumerate(output):\n                    if val == 0:\n                        print('Warning: Zero value in pos {} in {}, may not have been filled properly'.format(j,name))\n\n        return outputs\n\n    def get_control_dict(self, action):\n        \"\"\"\n        Given an np.ndarray of actions, parses into a control_dict.\n        :param action: np.ndarray, shape (action_dim,)\n        :return: dict, control_dict\n        \"\"\"\n\n        if not isinstance(action, np.ndarray):\n            raise TypeError('action must be an ndarray, is {}'.format(type(action)))\n\n        if self.has_genset:\n\n            control_dict = {'battery_charge': action[3],\n                            'battery_discharge': action[4],\n                            'genset': action[0],\n                            'grid_import': action[1],\n                            'grid_export': action[2],\n                            'pv_consummed': action[5]}\n        else:\n            control_dict = {'battery_charge': action[2],\n                            'battery_discharge': action[3],\n                            'grid_import': action[0],\n                            'grid_export': action[1],\n                            'pv_consummed': action[4]}\n\n        return control_dict\n\n\nclass ContinuousMicrogridSampleEnv(ContinuousMicrogridEnv):\n    \"\"\"\n    Same as ContinuousMicrogridEnv but uses samples generated from SampleAverageApproximation as states.\n    \"\"\"\n    metadata = {'render.modes': ['human']}\n    def __init__(self, microgrid, standardization=True,\n                 forecast_args=None, baseline_sampling_args=None, max_episode_len=None):\n\n        super().__init__(microgrid, standardization=standardization, max_episode_len=max_episode_len)\n        self.forecast_args = forecast_args\n        self.baseline_sampling_args = baseline_sampling_args\n        self.saa = generate_sampler(self.microgrid, forecast_args)\n\n    def reset(self, sampling_args=None):\n        \"\"\"\n        Generates a new sample to use as load/pv/grid data. Then calls parent reset function.\n        :param sampling_args:\n        :return:\n        \"\"\"\n        sample_reset(self.has_grid, self.saa, self.microgrid, sampling_args=sampling_args)\n        observations = super().reset()\n        return observations\n\n\nclass SafeExpMicrogridEnv(ContinuousMicrogridEnv):\n    \"\"\"\n    ContinuousMicrogridEnv but with constraint functionality for safety layer.\n    \"\"\"\n    def __init__(self, microgrid,\n                 standardization=True,\n                 balance_tolerance=1.,\n                 scale_constraints=True,\n                 only_inequality_constr=True,\n                 trajectory_len=None,\n                 max_episode_len=None):\n\n        super().__init__(microgrid,\n                         standardization=standardization,\n                         trajectory_len=trajectory_len,\n                         max_episode_len=max_episode_len)\n\n        self.balance_tolerance=balance_tolerance\n        self.scale_constraints = scale_constraints\n        self.only_inequality_constr = only_inequality_constr\n\n        self.n_constraints = 9 if self.has_genset else 7\n        if only_inequality_constr:\n            self.n_constraints -= 1\n\n    def get_num_constraints(self):\n        \"\"\"\n        Two for energy balance (one equality)\n        One each p_charge, p_discharge, p_import, p_export\n        Two p_genset if genset\n        TODO: do you need pv_curtail and loss_load\n        :return:\n        \"\"\"\n        return self.n_constraints\n\n    def get_constraint_values(self):\n        \"\"\"\n        All constraints are set up here such that we return c_i for constraints of the form c_i<0\n        :return:\n        \"\"\"\n        inequality_constraints = self._get_inequality_constraints()\n        energy_balance = self._get_energy_balance()\n\n        if self.only_inequality_constr:\n            constraints = inequality_constraints\n            return constraints\n\n        return np.append(inequality_constraints, energy_balance)\n\n    def _get_energy_balance(self):\n        if self.has_genset:\n            p_import, p_export, p_charge, p_discharge, p_genset, load, pv, pv_consumed = \\\n                self.get_values('grid_import','grid_export', 'battery_charge', 'battery_discharge','genset','load','pv','pv_consummed')\n        else:\n            p_import, p_export, p_charge, p_discharge, load, pv, pv_consumed = \\\n                self.get_values('grid_import', 'grid_export', 'battery_charge', 'battery_discharge', 'load',\n                                'pv', 'pv_consummed')\n\n            p_genset = 0\n\n        pv_curtailed = pv-pv_consumed\n\n        energy_balance = np.array(p_import-p_export-p_charge+p_discharge+p_genset-pv_curtailed-load+pv)\n\n        if self.scale_constraints:\n            charge_scale_factor = float(self.microgrid.parameters.battery_capacity.squeeze())\n            energy_balance /= charge_scale_factor\n\n        return energy_balance\n\n    def _get_inequality_constraints(self):\n        constraints = []\n\n        p_charge, p_discharge, p_max_charge, p_max_discharge = self.get_values('battery_charge','battery_discharge',\n                                                                                'capa_to_charge','capa_to_discharge')\n\n        if self.scale_constraints:\n            charge_scale_factor = float(self.microgrid.parameters.battery_capacity.squeeze())\n\n            constraints.append((p_charge-p_max_charge)/charge_scale_factor)\n            constraints.append((p_discharge-p_max_discharge)/charge_scale_factor)\n        else:\n            constraints.append(p_charge - p_max_charge)\n            constraints.append(p_discharge - p_max_discharge)\n\n        p_max_import = self.microgrid.parameters['grid_power_import'].values[0]\n        p_max_export = self.microgrid.parameters['grid_power_export'].values[0]\n        p_import, p_export, grid_status = self.get_values('grid_import','grid_export','grid_status')\n\n        if self.scale_constraints:\n            constraints.append((p_import - p_max_import * grid_status)/p_max_import)\n            constraints.append((p_export - p_max_export * grid_status)/p_max_export)\n        else:\n            constraints.append(p_import-p_max_import*grid_status)\n            constraints.append(p_export-p_max_export*grid_status)\n\n        battery_max = self.microgrid.parameters['battery_soc_max'].values[0]\n        battery_min = self.microgrid.parameters['battery_soc_min'].values[0]\n        battery_soc, = self.get_values('battery_soc')\n\n        if self.scale_constraints:\n            constraints.append((battery_soc - battery_max)/battery_max)\n            constraints.append((battery_min - battery_soc)/battery_min)\n        else:\n            constraints.append(battery_soc-battery_max)\n            constraints.append(battery_min-battery_soc)\n\n        if self.has_genset:\n\n            p_genset_max = self.microgrid.parameters['genset_rated_power'].values[0] * self.microgrid.parameters['genset_pmax'].values[0]\n            p_genset_min = self.microgrid.parameters['genset_rated_power'].values[0] * self.microgrid.parameters['genset_pmin'].values[0]\n            p_genset, = self.get_values('genset')\n\n            # TODO what if we want it to be off? For now, this:\n            if p_genset<1:\n                if self.scale_constraints:\n                    constraints.append((p_genset-1)/p_genset_max)\n                    constraints.append((-p_genset-self.balance_tolerance)/p_genset_max)\n                else:\n                    constraints.append(p_genset - 1)\n                    constraints.append(-p_genset - self.balance_tolerance)\n            else:\n                if self.scale_constraints:\n                    constraints.append((p_genset - p_genset_max)/p_genset_max)\n                    constraints.append((p_genset_min - p_genset)/p_genset_min)\n                else:\n                    constraints.append(p_genset-p_genset_max)\n                    constraints.append(p_genset_min-p_genset)\n\n        constraints = np.array(constraints)\n\n        return constraints\n\n\nclass SafeExpMicrogridSampleEnv(SafeExpMicrogridEnv):\n    def __init__(self,\n                 microgrid,\n                 standardization=True,\n                 balance_tolerance=1.,\n                 scale_constraints=True,\n                 only_inequality_constr=True,\n                 forecast_args=None,\n                 baseline_sampling_args=None,\n                 trajectory_len=None,\n                 max_episode_len=None):\n        super().__init__(microgrid,\n                         standardization=standardization,\n                         balance_tolerance=balance_tolerance,\n                         scale_constraints=scale_constraints,\n                         only_inequality_constr=only_inequality_constr,\n                         trajectory_len=trajectory_len,\n                         max_episode_len=max_episode_len)\n\n        self.forecast_args = forecast_args\n        self.forecast_args = forecast_args\n        self.baseline_sampling_args = baseline_sampling_args\n        self.saa = generate_sampler(self.microgrid, forecast_args)\n\n    def reset(self, sampling_args=None):\n        sample_reset(self.has_grid, self.saa, self.microgrid, sampling_args=sampling_args)\n        observations = super().reset()\n        return observations\n\n"
  },
  {
    "path": "src/pymgrid/_deprecated/Environments/pymgrid_csca_old.py",
    "content": "from pymgrid.Environments.Environment import Environment\nimport numpy as np\nimport gym\nfrom gym.utils import seeding\nfrom gym.spaces import Space, Discrete, Box\n\n\nclass MicroGridEnv(Environment):\n    \"\"\"\n    Markov Decision Process associated to the microgrid.\n\n        Parameters\n        ----------\n            microgrid: microgrid, mandatory\n                The controlled microgrid.\n            random_seed: int, optional\n                Seed to be used to generate the needed random numbers to size microgrids.\n\n    \"\"\"\n    def __init__(self, env_config, seed=42):\n        super().__init__(env_config, seed)\n        self.Na = 4 + self.mg.architecture['grid'] * 3 + self.mg.architecture['genset'] * 1\n\n        action_limits = [int(self.mg._pv_ts.max().values[0]),\n                         int(self.mg.parameters['battery_power_charge'].values[0]),\n                         int(self.mg.parameters['battery_power_discharge'].values[0]),\n                         2,\n                         ]\n        if self.mg.architecture['genset'] ==1:\n            action_limits.append(int(self.mg.parameters['genset_rated_power'].values[0]* self.mg.parameters['genset_pmax'].values[0]))\n\n        if self.mg.architecture['grid'] == 1:\n            action_limits.append(int(self.mg.parameters['grid_power_import'].values[0]))\n            action_limits.append(int(self.mg.parameters['grid_power_export'].values[0]))\n            action_limits.append(2)\n\n        self.action_space = gym.spaces.Tuple([gym.spaces.Discrete(x) for x in action_limits])\n\n\n    def get_action(self, action):\n        return self.get_action_continuous(action)"
  },
  {
    "path": "src/pymgrid/_deprecated/Environments/pymgrid_csda.py",
    "content": "from pymgrid.Environments.Environment import Environment\nimport numpy as np\nimport gym\nfrom gym.utils import seeding\nfrom gym.spaces import Space, Discrete, Box\n\n\nclass MicroGridEnv(Environment):\n    \"\"\"\n    Markov Decision Process associated to the microgrid.\n\n        Parameters\n        ----------\n            microgrid: microgrid, mandatory\n                The controlled microgrid.\n            random_seed: int, optional\n                Seed to be used to generate the needed random numbers to size microgrids.\n\n    \"\"\"\n    def __init__(self, env_config, seed=42):\n        super().__init__(env_config, seed)\n        self.Na = 4 + self.mg.architecture['grid'] * 3 + self.mg.architecture['genset'] * 1\n\n        action_limits = [int(self.mg._pv_ts.max().values[0]),\n                         int(self.mg.parameters['battery_power_charge'].values[0]),\n                         int(self.mg.parameters['battery_power_discharge'].values[0]),\n                         2,\n                         ]\n        if self.mg.architecture['genset'] ==1:\n            action_limits.append(int(self.mg.parameters['genset_rated_power'].values[0]* self.mg.parameters['genset_pmax'].values[0]))\n\n        if self.mg.architecture['grid'] == 1:\n            action_limits.append(int(self.mg.parameters['grid_power_import'].values[0]))\n            action_limits.append(int(self.mg.parameters['grid_power_export'].values[0]))\n            action_limits.append(2)\n\n        self.action_space = gym.spaces.Tuple([gym.spaces.Discrete(x) for x in action_limits])\n\n\n    def get_action(self, action):\n        return self.get_action_discrete(action)"
  },
  {
    "path": "src/pymgrid/_deprecated/Environments/pymgrid_cspla.py",
    "content": "\"\"\"\nCopyright 2020 Total S.A\nAuthors:Gonzague Henri <gonzague.henri@total.com>\nPermission to use, modify, and distribute this software is given under the\nterms of the pymgrid License.\nNO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.\n$Date: 2020/10/21 07:43 $\nGonzague Henri\n\"\"\"\n\n\"\"\"\n<pymgrid is a Python library to simulate microgrids>\nCopyright (C) <2020> <Total S.A.>\n\nThis program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.\n\nYou should have received a copy of the GNU Lesser General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.\n\n\"\"\"\nfrom pymgrid.Environments.Environment import Environment\nimport numpy as np\nimport gym\nfrom gym.utils import seeding\nfrom gym.spaces import Space, Discrete, Box\n\nclass MicroGridEnv(Environment):\n    \"\"\"\n    Markov Decision Process associated to the microgrid.\n\n        Parameters\n        ----------\n            microgrid: microgrid, mandatory\n                The controlled microgrid.\n            random_seed: int, optional\n                Seed to be used to generate the needed random numbers to size microgrids.\n\n    \"\"\"\n\n    def __init__(self, env_config, seed=42):\n        super().__init__(env_config, seed)\n        self.Na = 2 + self.mg.architecture['grid'] * 3 + self.mg.architecture['genset'] * 1 \n        if self.mg.architecture['grid'] == 1 and self.mg.architecture['genset'] == 1:\n            self.Na += 1\n        self.action_space = Discrete(self.Na)\n\n\n\n    def get_action(self, action):\n        return self.get_action_priority_list(action)\n\n    \n\n\n"
  },
  {
    "path": "src/pymgrid/_deprecated/__init__.py",
    "content": ""
  },
  {
    "path": "src/pymgrid/_deprecated/non_modular_microgrid.py",
    "content": "\"\"\"\nCopyright 2020 Total S.A., Tanguy Levent all rights reserved,\nAuthors:Gonzague Henri <gonzague.henri@total.com>, Tanguy Levent <>\nPermission to use, modify, and distribute this software is given under the\nterms of the pymgrid License.\nNO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.\n$Date: 2020/06/04 14:54 $\nGonzague Henri\n\"\"\"\n\n\"\"\"\n<pymgrid is a Python library to simulate microgrids>\nCopyright (C) <2020> <Total S.A.>\n\nThis program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.\n\nYou should have received a copy of the GNU Lesser General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.\n\n\"\"\"\n\nimport pandas as pd\nimport numpy as np\nfrom copy import copy\nfrom plotly.offline import init_notebook_mode, iplot\nimport matplotlib.pyplot as plt\nfrom IPython.display import display\nfrom IPython import get_ipython\n\ndef in_ipynb():\n    try:\n        cfg = get_ipython().config\n        if cfg['IPKernelApp']['parent_appname'] == 'ipython-notebook':\n            return True\n        else:\n            return False\n    except (NameError, AttributeError):\n        return False\n\nif in_ipynb():\n    init_notebook_mode(connected=False)\n\nnp.random.seed(123)\n\n#cf.set_config_file(offline=True, theme='pearl') #commented for now, issues with parallel processes\n\nDEFAULT_HORIZON = 24 #in hours\nDEFAULT_TIMESTEP = 1 #in hours\nZERO = 10**-5\n\n'''\nThe following classes are used to contain the information related to the different components\nof the microgrid. Their main use is for easy access in a notebook.\n'''\n\nclass Battery:\n\n    \"\"\"\n    The class battery is used to store the information related to the battery in a microgrid. One of the main use for\n    this class is for an easy access to information in a notebook using the battery object contained in a microgrid.\n\n    Parameters\n    ----------\n    param_battery : dataframe\n        All the data to initialize the battery.\n    capa_to_charge : float\n        Represents the amount of energy that a battery can charge before being full.\n    capa_to_discharge : float\n        Represents the amount of energy available that a battery can discharge before being empty.\n\n    Attributes\n    ----------\n    soc: float\n        Value between 0 and 1 representing the state of charge of the battery (1 being full, 0 being empty)\n    capacity: int\n        Total energy capacity of the battery (kWh).\n    soc_max: float\n        Value representing the maximum SOC that a battery can reach\n    soc_min: float\n        Value representing the minimum SOC that a battery can reach\n    p_charge_max: float\n        Value representing the maximum charging rate of the battery (kW)\n    p_discharge_max: float\n        Value representing the maximum discharging rate of the battery (kW)\n    efficiency: float\n        Value between 0 and 1 representing a one-way efficiency of the battery (considering same efficiency for charging\n        and discharging).\n    cost_cycle: float\n        Value representing the cost of using the battery in $/kWh.\n    capa_to_charge : float\n        Represents the amount of energy that a battery can charge before being full.\n    capa_to_discharge : float\n        Represents the amount of energy available that a battery can discharge before being empty.\n\n\n    Notes\n    -----\n    Another way to use this information in a notebook is to use /tab/ after /microgrid.battery./ so you can see all the\n    battery attributes.\n\n    Examples\n    --------\n    >>> m_gen=mg.MicrogridGenerator(nb_microgrid=1,path='your_path')\n    >>> m_gen.generate_microgrid()\n    >>> m_gen.microgrids[0].battery\n    You can then add a point and use tab to have suggestion of the different paramterers\n    You can access state of charge for example with:\n    >>> m_gen.microgrids[0].battery.soc\n    \"\"\"\n\n    def __init__(self, param_battery, capa_to_charge, capa_to_discharge):\n\n        self.soc = param_battery['battery_soc_0'].values[0]\n        self.capacity = param_battery['battery_capacity'].values[0]\n        self.soc_max = param_battery['battery_soc_max'].values[0]\n        self.soc_min = param_battery['battery_soc_min'].values[0]\n        self.p_charge_max = param_battery['battery_power_charge'].values[0]\n        self.p_discharge_max = param_battery['battery_power_discharge'].values[0]\n        self.efficiency = param_battery['battery_efficiency'].values[0]\n        self.cost_cycle = param_battery['battery_cost_cycle'].values[0]\n        self.capa_to_charge = capa_to_charge\n        self.capa_to_discharge = capa_to_discharge\n\n\n\nclass Genset:\n    \"\"\"\n    The class Genset is used to store the information related to the genset in a microgrid. One of the main use for\n    this class is for an easy access to information in a notebook using the genset object contained in a microgrid.\n\n    Parameters\n    ----------\n    param : dataframe\n        All the data to initialize the genset.\n\n    Attributes\n    ----------\n    rated_power: int\n        Maximum rater power of the genset.\n    p_min: float\n        Value representing the minimum operating power of the genset (kW)\n    p_max: float\n        Value representing the maximum operating power of the genset (kW)\n    fuel_cost: float\n        Value representing the cost of using the genset in $/kWh.\n\n    Notes\n    -----\n    Another way to use this information in a notebook is to use /tab/ after /microgrid.genset./ so you can see all the\n    genset attributes.\n\n    Examples\n    --------\n    >>> m_gen=mg.MicrogridGenerator(nb_microgrid=1,path='your_path')\n    >>> m_gen.generate_microgrid()\n    >>> m_gen.microgrids[0].genset\n    You can then add a point and use tab to have suggestion of the different paramaterers\n    You can access the maximum power max for example with:\n    >>> m_gen.microgrids[0].genset.p_max\n    \"\"\"\n    def __init__(self, param):\n        self.rated_power = param['genset_rated_power'].values[0]\n        self.p_min = param['genset_pmin'].values[0]\n        self.p_max = param['genset_pmax'].values[0]\n        self.fuel_cost = param['fuel_cost'].values[0]\n        self.co2 = param['genset_co2'].values[0]\n\n\nclass Grid:\n    \"\"\"\n    The class Grid is used to store the information related to the grid in a microgrid. One of the main use for\n    this class is for an easy access to information in a notebook using the grid object contained in a microgrid.\n\n    Parameters\n    ----------\n    param : dataframe\n        All the data to initialize the grid.\n    status: int\n        Whether the grid is connected or not at the first time step.\n\n\n    Attributes\n    ----------\n    power_export: float\n        Value representing the maximum export power to the grid (kW)\n    power_import: float\n        Value representing the maximum import power from the grid (kW)\n    price_export: float\n        Value representing the cost of exporting to the grid in $/kWh.\n    price_import: float\n        Value representing the cost of importing to the grid in $/kWh.\n    status: int, binary\n        Binary value representing whether the grid is connected or not (for example 0 represent a black-out of the\n        main grid).\n\n    Notes\n    -----\n    Another way to use this information in a notebook is to use /tab/ after /microgrid.grid./ so you can see all the\n    grid attributes.\n\n    Examples\n    --------\n    >>> m_gen=mg.MicrogridGenerator(nb_microgrid=1,path='your_path')\n    >>> m_gen.generate_microgrid()\n    >>> m_gen.microgrids[0].grid\n    You can then add a point and use tab to have suggestion of the different paramaterers\n    You can access the status of the grid for example with:\n    >>> m_gen.microgrids[0].grid.status\n    \"\"\"\n    def __init__(self, param, status, price_import, price_export, co2):\n        self.power_export = param['grid_power_export'].values[0]\n        self.power_import = param['grid_power_import'].values[0]\n        self.price_export = price_export #param['grid_price_export'].values[0]\n        self.price_import = price_import # param['grid_price_import'].values[0]\n        self.status = status\n        self.co2 = co2\n\n\nclass NonModularMicrogrid:\n\n    \"\"\"\n    The class microgrid implement a microgrid. It is also used to run the simulation and different benchmarks.\n\n    Parameters\n    ----------\n    parameters : dataframe\n        In parameters we find:\n            -'parameters': a dataframe containing all the fixed (not changing with time ) parameters of the microgrid\n            -'architecture': a dictionnary containing a binary variable for each possible generator and indicating if\n             this microgrid has one of them\n            -'load': the load time series\n            -'pv': the pv time series\n            -'grid_ts': a time series of 1 and 0 indicating whether the grid is available\n            -'df_actions': an empty dataframe representing the actions that the microgrid can take\n            -'df_status': a dataframe representing the parameters of the microgrid that change with time, with the\n             information for the first time step\n            -'df_actual_generation': an empty dataframe that is used to store what actually happens in the microgrid\n             after control actions are taken\n            -'df_cost': dataframe to track the cost of operating the microgrid at each time step\n            -'control_dict': an example of the control dictionnary that needs to be passed in run to operate the\n             microgrid\n    horizon : int, optional\n        The horizon considered to control the microgrid, mainly used in the MPC function and to return the forecasting\n         values (in hour).\n    timestep : int, optional\n        Time step the microgrid is operating at (in hour).\n\n    Attributes\n    ----------\n        parameters: dataframe\n            A dataframe containing all the fixed (not changing with time ) parameters of the microgrid\n        architecture : dictionary\n            A dictionary containing a binary variable for each possible generator and indicating if\n            this microgrid has one of them\n        _load_ts: dataframe\n            The time series of load\n        _pv_ts: dataframe\n            Time series of PV generation\n        pv: float\n            The PV production at _run_timestep\n        load: float\n            The load consumption at _run_timestep\n        _next_pv: float\n            The PV production at _run_timestep +1\n        _next_load: float\n            The load consumption at _run_timestep + 1\n        _grid_status_ts: dataframe\n            A timeseries of binary values indicating whether the grid is connected or not.\n        _df_record_control_dict: dataframe\n            This dataframe is used to record the control actions taked at each time step.\n        _df_record_state : dataframe\n            This dataframe is used to record the variable parameters of the microgrid at each time step.\n        _df_record_actual_production : dataframe\n            This dataframe is used to record the actual generation of the microgrid at each time step.\n        _df_record_cost : dataframe\n            This dataframe is used to record the cost of operating the microgrid at each time step.\n        _df_cost_per_epochs  : dataframe\n            In the case we run the simulation through multiple epochs, this dataframe is used to record the cost of\n             operating the microgrid at each time step of each epoch.\n        horizon : int, optional\n            The horizon considered to control the microgrid, mainly used in the MPC function and to return the forecasting\n             values (in hour).\n        _run_timestep : int\n            Time step the microgrid is operating at (in hour).\n        _data_length: int\n            Represents the number of time steps in PV/Load files (minimum between the 2) that will be used to run the\n            simulation.\n        done: True or False\n            Indicates whether a simulation is done or not\n        _has_run_rule_based_baseline: True or False\n            Indicates whether the rule based benchmark has already been run or not.\n        _has_run_mpc_baseline: True or False\n            Indicates whether the MPC benchmark has already been run or not.\n        _epoch: int\n            Tracks what epoch the microgrid is at\n        _zero: float\n            Approximate value to 0, used in some comparisons\n        control_dict: dictionnary\n            Represents the list of control actions to pass in the run function\n        battery: object\n            Represents all the parameter of the battery, including the value changing with time (in this case it is the\n            value at _run_timestep).\n        genset: object\n            Represents all the parameter of the genset, including the value changing with time (in this case it is the\n            value at _run_timestep).\n        grid: object\n            Represents all the parameter of the grid, including the value changing with time (in this case it is the\n            value at _run_timestep).\n        benchmarks: algos.Control.Benchmarks\n            Benchmark object with the ability to run benchmark algorithms and store/print the results.\n\n    Notes\n    -----\n    We are trying to keep hidden a lot of what is happening under the hood to simplify using this class for control or\n    RL research at the maximum. A few notes, in this class parameters refer to the fixed parameters of the microgrid,\n    meaning they don't vary with time. The varying parameters can be found in either the other classes or\n    _df_record_state.\n\n    Examples\n    --------\n    To create microgrids through MicrogridGenerator:\n    >>> m_gen=mg.MicrogridGenerator(nb_microgrid=1,path='your_path')\n    >>> m_gen.generate_microgrid()\n    >>>microgrid = m_gen.microgrid[0]\n\n    To plot informations about the microgrid:\n    >>> microgrid.print_info()\n    >>> microgrid.print_control_info()\n\n    To compute the benchmarks:\n    >>> microgrid.compute_benchmark() # to compute them all\n    >>> microgrid.compute_benchmark('mpc_linprog') #to compute only the MPC\n\n    For example, a simple control loop:\n    >>> while m_gen.microgrids[0].done == False:\n    >>>     load = mg_data['load']\n    >>>     pv = mg_data['pv']\n    >>>     control_dict = {'battery_charge': 0, 'battery_discharge': 0,'grid_import': max(0, load-pv),'grid_export':0,'pv': min(pv, load),}\n    >>>     mg_data = m_gen.microgrids[0].run(control_dict)\n    \"\"\"\n\n    def __init__(self, parameters, horizon=DEFAULT_HORIZON, timestep=DEFAULT_TIMESTEP):\n        #list of parameters\n        #this is a static dataframe: parameters of the microgrid that do not change with time\n\n        #self._param_check(parameters)\n\n        self.parameters = parameters['parameters']\n        self.architecture = parameters['architecture']\n        #different timeseries\n        self._load_ts=parameters['load']\n        self._pv_ts=parameters['pv']\n\n        self.pv = self._pv_ts.iloc[0,0]\n        self.load = self._load_ts.iloc[0, 0]\n        self._next_load = self._load_ts.iloc[1,0]\n        self._next_pv = self._pv_ts.iloc[1,0]\n        if parameters['architecture']['grid']==1:\n            self._grid_status_ts=parameters['grid_ts'] #time series of outages\n            #self.grid_status = self._grid_status_ts.iloc[0, 0]\n            self._grid_price_import=parameters['grid_price_import']\n            self._grid_price_export=parameters['grid_price_export']\n            self._grid_co2 = parameters['grid_co2']\n\n            self._next_grid_status = self._grid_status_ts.iloc[0, 0]\n            self._next_grid_price_export = self._grid_price_export.iloc[0, 0]\n            self._next_grid_price_import = self._grid_price_import.iloc[0, 0]\n            self._next_grid_co2 = self._grid_co2.iloc[0, 0]\n\n        # those dataframe record what is happening at each time step\n        self._df_record_control_dict=parameters['df_actions']\n        self._df_record_state = parameters['df_status']\n        self._df_record_actual_production = parameters['df_actual_generation']\n        self._df_record_cost = parameters['df_cost']\n        self._df_record_co2 = parameters['df_co2']\n        self._df_cost_per_epochs = []\n        self.horizon = horizon\n        self._tracking_timestep = 0\n        self._data_length = min(self._load_ts.shape[0], self._pv_ts.shape[0])\n        self.done = False\n        self._has_run_rule_based_baseline = False\n        self._has_run_mpc_baseline = False\n        self._has_train_test_split = False\n        self._epoch=0\n        self._zero = ZERO\n        self.control_dict = parameters['control_dict']\n        self._data_set_to_use_default = 'all'\n        self._data_set_to_use = 'all'\n\n        if self.architecture['battery'] == 1:\n            self.battery = Battery(self.parameters,\n                                   self._df_record_state['capa_to_charge'][0],\n                                   self._df_record_state['capa_to_discharge'][0])\n        if self.architecture['genset'] == 1:\n            self.genset = Genset(self.parameters)\n        if self.architecture['grid'] == 1:\n            self.grid = Grid(self.parameters, self._grid_status_ts.iloc[0,0],\n                             self._grid_price_import.iloc[0, 0],\n                             self._grid_price_export.iloc[0, 0],\n                             self._grid_co2.iloc[0, 0])\n\n    def _param_check(self, parameters):\n        \"\"\"Simple parameter checks\"\"\"\n\n        # Check parameters\n        if not isinstance(parameters, dict):\n            raise TypeError('parameters must be of type dict, is ({})'.format(type(parameters)))\n\n\n        # Check architecture\n        try:\n            architecture = parameters['architecture']\n        except KeyError:\n            print('Dict of parameters does not appear to contain architecture key')\n            raise\n        if not isinstance(architecture, dict):\n            raise TypeError('parameters[\\'architecture\\'] must be of type dict, is ({})'.format(type(architecture)))\n\n        for key, val in architecture.items():\n            if isinstance(val,bool):\n                continue\n            elif isinstance(val,int) and (val == 0 or val == 1):\n                continue\n            else:\n                raise TypeError('Value ({}) of key ({}) in architecture is of unrecognizable type, '\n                                'must be bool or in {{0,1}}, is ({})'.format(val, key, type(val)))\n\n        # Ensure various DataFrames exist and are in fact DataFrames\n\n        keys = ('parameters', 'load', 'pv', 'df_actions', 'df_status', 'df_actual_generation', 'df_cost')\n\n        for key in keys:\n            try:\n                df = parameters[key]\n            except KeyError:\n                print('Dict of parameters does not appear to contain {} key'.format(key))\n                raise\n            if not isinstance(df, pd.DataFrame):\n                raise TypeError('parameters[\\'{}\\'] must be of type pd.DataFrame, is ({})'.format(key, type(df)))\n\n\n\n    def set_horizon(self, horizon):\n        \"\"\"Function used to change the horizon of the simulation.\"\"\"\n        self.horizon = horizon\n\n    def set_cost_co2(self, co2_cost):\n        \"\"\"Function used to change the horizon of the simulation.\"\"\"\n        self.parameters['cost_co2'] = co2_cost\n\n    def get_data(self):\n        \"\"\"Function to return the time series used in the microgrid\"\"\"\n        return self._load_ts, self._pv_ts\n\n    def get_training_testing_data(self):\n\n        if self._has_train_test_split == True:\n\n            return self._limit_index, self._load_train, self._pv_train, self._load_test, self._pv_test\n\n        else:\n            print('You have not split the dataset into training and testing sets')\n\n    def get_control_dict(self):\n        \"\"\" Function that returns the control_dict. \"\"\"\n        return self.control_dict\n\n\n    def get_parameters(self):\n        \"\"\" Function that returns the parameters of the microgrid. \"\"\"\n        return self.parameters\n\n\n    def get_cost(self):\n        \"\"\" Function that returns the cost associated the operation of the last time step. \"\"\"\n        return self._df_record_cost['total_cost'][-1]\n\n    def get_co2(self):\n        \"\"\" Function that returns the co2 emissions associated to the operation of the last time step. \"\"\"\n        return self._df_record_co2['co2'][-1]\n\n    def get_updated_values(self):\n        \"\"\"\n        Function that returns microgrid parameters that change with time. Depending on the architecture we have:\n            - PV production\n            - Load\n            - Battery state of charge\n            - Battery capacity to charge\n            - Battery capacity to discharge\n            - Whether the grid is connected or not\n            - CO2 intensity of the grid\n        \"\"\"\n        mg_data = {}\n\n        for i in self._df_record_state:\n            mg_data[i] = self._df_record_state[i][-1]\n\n        return mg_data\n\n\n    def forecast_all(self):\n        \"\"\" Function that returns the PV, load and grid_status forecasted values for the next horizon. \"\"\"\n        forecast = {\n            'pv': self.forecast_pv(),\n            'load': self.forecast_load(),\n        }\n        if self.architecture['grid'] == 1:\n            forecast['grid_status'] = self.forecast_grid_status()\n            forecast['grid_import'], forecast['grid_export'] = self.forecast_grid_prices()\n            forecast['grid_co2'] = self.forecast_grid_co2()\n\n        return forecast\n\n\n    def forecast_pv(self):\n        \"\"\" Function that returns the PV forecasted values for the next horizon. \"\"\"\n        forecast = np.nan\n        if self._data_set_to_use == 'training':\n            forecast=self._pv_train.iloc[self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        if self._data_set_to_use == 'testing':\n            forecast = self._pv_test.iloc[\n                       self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        if self._data_set_to_use == 'all':\n            forecast = self._pv_ts.iloc[self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        return forecast\n\n\n    def forecast_load(self):\n        \"\"\" Function that returns the load forecasted values for the next horizon. \"\"\"\n        forecast = np.nan\n        if self._data_set_to_use == 'training':\n            forecast = self._load_train.iloc[self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        if self._data_set_to_use == 'testing':\n            forecast = self._load_test.iloc[self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        if self._data_set_to_use == 'all':\n            forecast = self._load_ts.iloc[self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        return forecast\n\n    def forecast_grid_status(self):\n        \"\"\" Function that returns the grid_status forecasted values for the next horizon. \"\"\"\n        forecast = np.nan\n        if self._data_set_to_use == 'training':\n            forecast = self._grid_status_train.iloc[\n               self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        if self._data_set_to_use == 'testing':\n            forecast = self._grid_status_test.iloc[\n               self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        if self._data_set_to_use == 'all':\n            forecast = self._grid_status_ts.iloc[\n               self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        return forecast\n\n    def forecast_grid_co2(self):\n        \"\"\" Function that returns the grid_status forecasted values for the next horizon. \"\"\"\n        forecast = np.nan\n        if self._data_set_to_use == 'training':\n            forecast = self._grid_co2_train.iloc[\n                       self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        if self._data_set_to_use == 'testing':\n            forecast = self._grid_co2_test.iloc[\n                       self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        if self._data_set_to_use == 'all':\n            forecast = self._grid_co2.iloc[\n                       self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        return forecast\n\n    def forecast_grid_prices(self):\n        \"\"\" Function that returns the forecasted import and export prices for the next horizon. \"\"\"\n        forecast_import = np.nan\n        forecast_export = np.nan\n        if self._data_set_to_use == 'training':\n            forecast_import = self._grid_price_import_train.iloc[\n                       self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n            forecast_export = self._grid_price_export_train.iloc[\n                              self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        if self._data_set_to_use == 'testing':\n            forecast_import = self._grid_price_import_test.iloc[\n                       self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n            forecast_export = self._grid_price_export_test.iloc[\n                       self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        if self._data_set_to_use == 'all':\n            forecast_import = self._grid_price_import.iloc[\n                       self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n            forecast_export = self._grid_price_export.iloc[\n                       self._tracking_timestep:self._tracking_timestep + self.horizon].values.flatten()\n\n        return forecast_import, forecast_export\n\n\n\n    #if return whole pv and load ts, the time can be counted in notebook\n    def run(self, control_dict):\n        \"\"\"\n        Function to 'run' the microgrid and iterate over the dataset.\n\n        Parameters\n        ----------\n        control_dict : dictionnary\n            Dictionnary containing the different control actions we want to apply to the microgrid. Its fields depend\n            on the architecture of the microgrid\n\n        Return\n        ----------\n        self.get_updated_values(): dictionnary\n            Return all the parameters that change with time in the microgrid. CF this function for more details.\n\n        Notes\n        ----------\n        This loop is the main connexion with a user in a notebook. That is where the simulation is ran and where the\n        control actions are recorder and applied.\n\n        \"\"\"\n\n        control_dict['load'] = self.load\n        control_dict['pv'] = self.pv\n\n        self._df_record_control_dict = self._record_action(control_dict, self._df_record_control_dict)\n\n\n\n        self._df_record_actual_production = self._record_production(control_dict,\n                                                                         self._df_record_actual_production,\n                                                                    self._df_record_state)\n\n        if self.architecture['grid'] == 1:\n            self._df_record_co2 = self._record_co2({ i:self._df_record_actual_production[i][-1] for i in self._df_record_actual_production},\n                                                   self._df_record_co2, self.grid.co2)\n\n            self._df_record_cost = self._record_cost({ i:self._df_record_actual_production[i][-1] for i in self._df_record_actual_production},\n                                                               self._df_record_cost, self._df_record_co2, self.grid.price_import, self.grid.price_export)\n            self._df_record_state = self._update_status({key: value[-1] for key, value in self._df_record_actual_production.items()},\n                                                        self._df_record_state, self._next_load, self._next_pv,\n                                                        self._next_grid_status, self._next_grid_price_import,\n                                                        self._next_grid_price_export, self._next_grid_co2)\n\n\n        else:\n            self._df_record_co2 = self._record_co2({ i:self._df_record_actual_production[i][-1] for i in self._df_record_actual_production},\n                                                   self._df_record_co2)\n\n            self._df_record_cost = self._record_cost({ i:self._df_record_actual_production[i][-1] for i in self._df_record_actual_production},\n                                                     self._df_record_cost, self._df_record_co2)\n            self._df_record_state = self._update_status(control_dict,\n                                                        self._df_record_state, self._next_load, self._next_pv)\n\n        if self._tracking_timestep == self._data_length - self.horizon or self._tracking_timestep == self._data_length - 1:\n            self.done = True\n            return self.get_updated_values()\n\n        self._tracking_timestep += 1\n        self.update_variables()\n\n        return self.get_updated_values()\n\n\n    def train_test_split(self, train_size=0.67, shuffle = False, cancel=False):\n        \"\"\"\n        Function to split our data between a training and testing set.\n\n        Parameters\n        ----------\n        train_size : float, optional\n            Value between 0 and 1 reflecting the percentage of the dataset that should be in the training set.\n        shuffle: boolean\n            Variable to know if the training and testing sets should be shuffled or in the 'temporal' order\n            Not implemented yet for shuffle = True\n        cancel: boolean\n            Variable indicating if the split needs to be reverted, and the data brought back into one dataset\n\n        Attributes\n        ----------\n        _limit_index : int\n            Index that delimit the training and testing sets in the time series\n        load_train : dataframe\n            Timeseries of load in training set\n        pv_train: dataframe\n            Timeseries of PV in training set\n        load_test : dataframe\n            Timeseries of load in testing set\n        pv_test: dataframe\n            Timeseries of PV in testing set\n        grid_status_train: dataframe\n            Timeseries of grid_status in training set\n        grid_status_test: dataframe\n            Timeseries of grid_status in testing set\n        grid_price_import_train: dataframe\n            Timeseries of price_import in training set\n        grid_price_import_test: dataframe\n            Timeseries of price_import in testing set\n        grid_price_export_train: dataframe\n            Timeseries of price_export in training set\n        grid_price_export_test: dataframe\n            Timeseries of price_export in testing set\n\n        \"\"\"\n\n        if self._has_train_test_split ==  False:\n            self._limit_index = int(np.ceil(self._data_length*train_size))\n            self._load_train = self._load_ts.iloc[:self._limit_index]\n            self._pv_train = self._pv_ts.iloc[:self._limit_index]\n\n            self._load_test = self._load_ts.iloc[self._limit_index:]\n            self._pv_test = self._pv_ts.iloc[self._limit_index:]\n\n            if self.architecture['grid'] == 1:\n                self._grid_status_train = self._grid_status_ts.iloc[:self._limit_index]\n                self._grid_status_test = self._grid_status_ts.iloc[self._limit_index:]\n\n                self._grid_price_import_train = self._grid_price_import.iloc[:self._limit_index]\n                self._grid_price_import_test = self._grid_price_import.iloc[self._limit_index:]\n\n                self._grid_price_export_train = self._grid_price_export.iloc[:self._limit_index]\n                self._grid_price_export_test = self._grid_price_export.iloc[self._limit_index:]\n\n                self._grid_co2_train = self._grid_co2.iloc[:self._limit_index]\n                self._grid_co2_test = self._grid_co2.iloc[self._limit_index:]\n\n            self._has_train_test_split = True\n            self._data_set_to_use_default = 'training'\n            self._data_set_to_use = 'training'\n\n        elif self._has_train_test_split ==  True and cancel == True:\n            self._has_train_test_split = False\n            self._data_set_to_use_default = 'all'\n            self._data_set_to_use = 'all'\n\n        self.reset()\n\n    def update_variables(self):\n        \"\"\" Function that updates the variablers containing the parameters of the microgrid changing with time. \"\"\"\n\n        if self._data_set_to_use == 'training':\n            self.pv = self._pv_train.iloc[self._tracking_timestep, 0]\n            self.load = self._load_train.iloc[self._tracking_timestep, 0]\n\n            self._next_pv = self._pv_train.iloc[self._tracking_timestep +1, 0]\n            self._next_load = self._load_train.iloc[self._tracking_timestep+1, 0]\n\n\n        if self._data_set_to_use == 'testing':\n            self.pv = self._pv_test.iloc[self._tracking_timestep, 0]\n            self.load = self._load_test.iloc[self._tracking_timestep, 0]\n\n            self._next_pv = self._pv_test.iloc[self._tracking_timestep+1, 0]\n            self._next_load = self._load_test.iloc[self._tracking_timestep+1, 0]\n\n        if self._data_set_to_use == 'all':\n            self.pv = self._pv_ts.iloc[self._tracking_timestep, 0]\n            self.load = self._load_ts.iloc[self._tracking_timestep, 0]\n\n\n            if self._tracking_timestep < self._data_length - 1:\n                self._next_pv = self._pv_ts.iloc[self._tracking_timestep+1, 0]\n                self._next_load = self._load_ts.iloc[self._tracking_timestep+1, 0]\n            else:\n                self._next_pv, self._next_load = None, None\n\n\n        if self.architecture['grid']==1:\n            if self._data_set_to_use == 'training':\n                self.grid.status = self._grid_status_train.iloc[self._tracking_timestep, 0]\n                self.grid.price_import = self._grid_price_import_train.iloc[self._tracking_timestep,0]\n                self.grid.price_export = self._grid_price_export_train.iloc[self._tracking_timestep,0]\n                self.grid.co2 = self._grid_co2_train.iloc[self._tracking_timestep, 0]\n\n                self._next_grid_status = self._grid_status_train.iloc[self._tracking_timestep +1, 0]\n                self._next_grid_price_import = self._grid_price_import_train.iloc[self._tracking_timestep +1, 0]\n                self._next_grid_price_export = self._grid_price_export_train.iloc[self._tracking_timestep +1, 0]\n                self._next_grid_co2 = self._grid_co2_train.iloc[self._tracking_timestep + 1, 0]\n\n            if self._data_set_to_use == 'testing':\n                self.grid.status = self._grid_status_test.iloc[self._tracking_timestep, 0]\n                self.grid.price_import = self._grid_price_import_test.iloc[self._tracking_timestep, 0]\n                self.grid.price_export = self._grid_price_export_test.iloc[self._tracking_timestep, 0]\n                self.grid.co2 = self._grid_co2_test.iloc[self._tracking_timestep, 0]\n\n                self._next_grid_status = self._grid_status_test.iloc[self._tracking_timestep + 1, 0]\n                self._next_grid_price_import = self._grid_price_import_test.iloc[self._tracking_timestep + 1, 0]\n                self._next_grid_price_export = self._grid_price_export_test.iloc[self._tracking_timestep + 1, 0]\n                self._next_grid_co2 = self._grid_co2_test.iloc[self._tracking_timestep + 1, 0]\n\n\n            if self._data_set_to_use == 'all':\n                self.grid.status = self._grid_status_ts.iloc[self._tracking_timestep, 0]\n                self.grid.price_import = self._grid_price_import.iloc[self._tracking_timestep, 0]\n                self.grid.price_export = self._grid_price_export.iloc[self._tracking_timestep, 0]\n                self.grid.co2 = self._grid_co2.iloc[self._tracking_timestep, 0]\n\n                if self._tracking_timestep < self._data_length - 1:\n                    self._next_grid_status = self._grid_status_ts.iloc[self._tracking_timestep + 1, 0]\n                    self._next_grid_price_import = self._grid_price_import.iloc[self._tracking_timestep + 1, 0]\n                    self._next_grid_price_export = self._grid_price_export.iloc[self._tracking_timestep + 1, 0]\n                    self._next_grid_co2 = self._grid_co2.iloc[self._tracking_timestep + 1, 0]\n                else:\n                    self._next_grid_status, self._next_grid_price_import, self._next_grid_price_export, \\\n                    self._next_grid_co2 = None, None, None, None\n\n        if self.architecture['battery'] == 1:\n            self.battery.soc = self._df_record_state['battery_soc'][-1]\n            self.battery.capa_to_discharge = self._df_record_state['capa_to_discharge'][-1]\n            self.battery.capa_to_charge = self._df_record_state['capa_to_charge'][-1]\n\n    def reset(self, testing=False):\n        \"\"\"This function is used to reset the dataframes that track what is happening in simulation. Mainly used in RL.\"\"\"\n        if self._data_set_to_use == 'training':\n            temp_cost = copy(self._df_record_cost)\n            temp_cost['epoch'] = self._epoch\n            self._df_cost_per_epochs.append(temp_cost)\n\n        self._df_record_control_dict = {i:[] for i in self._df_record_control_dict}\n        self._df_record_state = {i:[self._df_record_state[i][0]] for i in self._df_record_state}\n        self._df_record_actual_production = {i:[] for i in self._df_record_actual_production}\n        self._df_record_cost = {i:[] for i in self._df_record_cost}\n        self._df_record_co2 = {i:[] for i in self._df_record_co2}\n\n        self._tracking_timestep = 0\n\n        if testing == True and self._data_set_to_use_default == 'training':\n            self._data_set_to_use = 'testing'\n            self._data_length = min(self._load_test.shape[0], self._pv_test.shape[0])\n        else:\n            self._data_set_to_use = self._data_set_to_use_default\n            if self._data_set_to_use == 'training':\n                self._data_length = min(self._load_train.shape[0], self._pv_train.shape[0])\n            else:\n                self._data_length = min(self._load_ts.shape[0], self._pv_ts.shape[0])\n\n        self.update_variables()\n        self.done = False\n\n\n\n        self._epoch+=1\n\n\n    ########################################################\n    # FUNCTIONS TO UPDATE THE INTERNAL DICTIONARIES\n    ########################################################\n\n\n    def _record_action(self, control_dict, df):\n        \"\"\" This function is used to record the actions taken, before being checked for feasability. \"\"\"\n        if not isinstance(df, dict):\n            raise TypeError('We know this should be named differently but df needs to be dict, is {}'.format(type(df)))\n        for j in df:\n            if j in control_dict.keys():\n                df[j].append(control_dict[j])\n            else:\n                df[j].append({j:0})\n        #df = df.append(control_dict,ignore_index=True)\n\n        return df\n\n\n    def _update_status(self, production_dict, df, next_load, next_pv, next_grid = 0, next_price_import =0, next_price_export = 0, next_co2 = 0):\n        \"\"\" This function update the parameters of the microgrid that change with time. \"\"\"\n        #self.df_status = self.df_status.append(self.new_row, ignore_index=True)\n\n        if not isinstance(df, dict):\n            raise TypeError('We know this should be named differently but df needs to be dict, is {}'.format(type(df)))\n\n        new_dict = {\n            'load': next_load,\n                    'pv': next_pv,\n            'hour':self._tracking_timestep%24,\n        }\n        new_soc =np.nan\n        if self.architecture['battery'] == 1:\n            new_soc = df['battery_soc'][-1] + (production_dict['battery_charge'] * self.parameters['battery_efficiency'].values[0]\n                                               - production_dict['battery_discharge'] / self.parameters['battery_efficiency'].values[0]) / self.parameters['battery_capacity'].values[0]\n            #if col == 'net_load':\n            capa_to_charge = max(\n                (self.parameters['battery_soc_max'].values[0] * self.parameters['battery_capacity'].values[0] -\n                 new_soc *\n                 self.parameters['battery_capacity'].values[0]\n                 ) * self.parameters['battery_efficiency'].values[0], 0)\n\n            capa_to_discharge = max((new_soc *\n                                     self.parameters['battery_capacity'].values[0]\n                                     - self.parameters['battery_soc_min'].values[0] *\n                                     self.parameters['battery_capacity'].values[0]\n                                     ) * self.parameters['battery_efficiency'].values[0], 0)\n\n            new_dict['battery_soc']=new_soc\n            new_dict['capa_to_discharge'] = capa_to_discharge\n            new_dict['capa_to_charge'] = capa_to_charge\n\n        if self.architecture['grid'] == 1 :\n            new_dict['grid_status'] = next_grid\n            new_dict['grid_price_import'] = next_price_import\n            new_dict['grid_price_export'] = next_price_export\n            new_dict['grid_co2'] = next_co2\n\n        for j in df:\n            df[j].append(new_dict[j])\n\n        #df = df.append(dict,ignore_index=True)\n\n\n\n        return df\n\n\n    #now we consider all the generators on all the time (mainly concern genset)\n\n    def _check_constraints_genset(self, p_genset):\n        \"\"\" This function checks that the constraints of the genset are respected.\"\"\"\n        if p_genset < 0:\n            p_genset =0\n            print('error, genset power cannot be lower than 0')\n\n        if p_genset < self.parameters['genset_rated_power'].values[0] * self.parameters['genset_pmin'].values[0] and p_genset >1:\n            p_genset = self.parameters['genset_rated_power'].values[0] * self.parameters['genset_pmin'].values[0]\n\n        if p_genset > self.parameters['genset_rated_power'].values[0] * self.parameters['genset_pmax'].values[0]:\n            p_genset = self.parameters['genset_rated_power'].values[0] * self.parameters['genset_pmax'].values[0]\n\n        return p_genset\n\n    def _check_constraints_grid(self, p_import, p_export):\n        \"\"\" This function checks that the constraints of the grid are respected.\"\"\"\n        if p_import < 0:\n            p_import = 0\n\n        if p_export <0:\n            p_export = 0\n\n        if p_import > self._zero and p_export > self._zero:\n        \tpass\n            #print ('cannot import and export at the same time')\n            #todo how to deal with that?\n\n        if p_import > self.parameters['grid_power_import'].values[0]:\n            p_import = self.parameters['grid_power_import'].values[0]\n\n        if p_export > self.parameters['grid_power_export'].values[0]:\n            p_export = self.parameters['grid_power_export'].values[0]\n\n        return p_import, p_export\n\n    def _check_constraints_battery(self, p_charge, p_discharge, status):\n        \"\"\" This function checks that the constraints of the battery are respected.\"\"\"\n\n        if p_charge < 0:\n            p_charge = 0\n\n        if p_discharge < 0:\n            p_discharge = 0\n\n        if p_charge > self._zero and p_discharge > self._zero:\n            pass\n\n        capa_to_charge = max(\n                        (self.parameters['battery_soc_max'].values[0] * self.parameters['battery_capacity'].values[0] -\n                         status['battery_soc'][-1] *\n                         self.parameters['battery_capacity'].values[0]\n                         ) * self.parameters['battery_efficiency'].values[0], 0)\n\n        capa_to_discharge = max((status['battery_soc'][-1] *\n                                 self.parameters['battery_capacity'].values[0]\n                                 - self.parameters['battery_soc_min'].values[0] *\n                                 self.parameters['battery_capacity'].values[0]\n                                 ) * self.parameters['battery_efficiency'].values[0], 0)\n\n        if p_charge > capa_to_charge or p_charge > self.parameters['battery_power_charge'].values[0]:\n            p_charge = min (capa_to_charge, self.parameters['battery_power_charge'].values[0])\n\n\n        if p_discharge > capa_to_discharge or p_discharge > self.parameters['battery_power_discharge'].values[0]:\n            p_discharge = min (capa_to_discharge, self.parameters['battery_power_discharge'].values[0])\n\n        return p_charge, p_discharge\n\n    def _record_production(self, control_dict, production_dict, status):\n        \"\"\"\n        This function records the actual production occuring in the microgrid. Based on the control actions and the\n        parameters of the microgrid. This function will check that the control actions respect the constraints of\n        the microgrid and then record what generators have produced energy.\n\n        Parameters\n        ----------\n        control_dict : dictionnary\n            Dictionnary representing the control actions taken by an algorithm (either benchmark or in the run function).\n        df: dataframe\n            Previous version of the record_production dataframe (coming from the run loop, or benchmarks).\n        status: dataframe\n            One line dataframe representing the changing parameters of the microgrid.\n\n        Notes\n        -----\n        The mechanism to incure a penalty in case of over-generation is not yet in its final version.\n        \"\"\"\n        assert isinstance(production_dict, dict)\n        try:\n            control_dict.pop('pv_consummed')\n        except KeyError:\n            pass\n\n\n        has_grid = self.architecture['grid'] == 1\n        has_genset = self.architecture['genset'] == 1\n        has_battery = self.architecture['battery'] == 1\n\n        sources = 0.0\n        sinks = control_dict['load']\n\n        # Battery\n        if has_battery:\n            p_charge, p_discharge = self._check_constraints_battery(control_dict['battery_charge'],\n                                                                    control_dict['battery_discharge'],\n                                                                    status)\n            production_dict['battery_charge'].append(p_charge)\n            production_dict['battery_discharge'].append(p_discharge)\n\n            sources += p_discharge\n            sinks += p_charge\n\n        if has_grid:\n            p_import, p_export = self._check_constraints_grid(control_dict['grid_import'],\n                                                                    control_dict['grid_export'])\n            production_dict['grid_import'].append(p_import)\n            production_dict['grid_export'].append(p_export)\n\n            sources += p_import\n            sinks += p_export\n\n        if has_genset:\n            p_genset = self._check_constraints_genset(control_dict['genset'])\n            production_dict['genset'].append(p_genset)\n            sources += p_genset\n\n        pv_required = sinks-sources\n        pv_available = control_dict['pv']\n\n        if np.abs(pv_required-pv_available) < 1e-3:         # meeting demand\n            pv_consumed = pv_available\n            loss_load = 0\n            pv_curtailed = 0\n            overgeneration = 0\n\n        elif pv_required > pv_available:                    # loss load\n            pv_consumed = pv_available\n            loss_load = pv_required-pv_available\n            pv_curtailed = 0\n            overgeneration = 0\n\n        elif 0 < pv_required < pv_available:                # curtail pv\n            pv_consumed = pv_required\n            loss_load = 0\n            pv_curtailed = pv_available-pv_required\n            overgeneration = 0\n\n        else:                                               # overgeneration. Requires NO pv whatsoever\n            assert pv_required < 0\n            pv_consumed = 0\n            loss_load = 0\n            pv_curtailed = pv_available if pv_available > 0 else 0\n            overgeneration = -pv_required\n\n        production_dict['pv_consummed'].append(pv_consumed)\n        production_dict['loss_load'].append(loss_load)\n        production_dict['pv_curtailed'].append(pv_curtailed)\n        production_dict['overgeneration'].append(overgeneration)\n\n        return production_dict\n\n    def _record_co2(self, control_dict, df, grid_co2=0):\n        \"\"\" This function record the cost of operating the microgrid at each time step.\"\"\"\n        co2 = 0\n\n        if self.architecture['genset'] == 1:\n            co2 += control_dict['genset'] * self.parameters['genset_co2'].values[0]\n\n        if self.architecture['grid'] == 1:\n            co2 += grid_co2 * control_dict['grid_import']\n\n        cost_dict = {'co2': co2}\n\n        df['co2'].append( co2)\n\n        return df\n\n    def _record_cost(self, control_dict, df, df_co2, cost_import=0, cost_export=0):\n        \"\"\" This function record the cost of operating the microgrid at each time step.\"\"\"\n\n        if not isinstance(df, dict):\n            raise TypeError('We know this should be named differently but df needs to be dict, is {}'.format(type(df)))\n\n        cost_loss_load = control_dict['loss_load'] * self.parameters['cost_loss_load'].values[0]\n        cost_overgeneration = control_dict['overgeneration'] * self.parameters['cost_overgeneration'].values[0]\n\n        df['loss_load'].append(cost_loss_load)\n        df['overgeneration'].append(cost_overgeneration)\n\n        # cost += control_dict['loss_load'] * self.parameters['cost_loss_load'].values[0]\n        # cost += control_dict['overgeneration'] * self.parameters['cost_overgeneration'].values[0]\n\n        if self.architecture['genset'] == 1:\n            genset_cost = control_dict['genset'] * self.parameters['fuel_cost'].values[0]\n            df['genset'].append(genset_cost)\n\n        if self.architecture['grid'] ==1:\n            grid_import_cost = cost_import * control_dict['grid_import']\n            grid_export_cost = - cost_export * control_dict['grid_export']\n            df['grid_import'].append(grid_import_cost)\n            df['grid_export'].append(grid_export_cost)\n\n\n        if self.architecture['battery'] ==1 :\n            battery_cost = (control_dict['battery_charge']+control_dict['battery_discharge'])*self.parameters['battery_cost_cycle'].values[0]\n            df['battery'].append(battery_cost)\n\n        co2_cost = self.parameters['cost_co2'].values[0] * df_co2['co2'][-1]\n        df['co2'].append(co2_cost)\n\n        total_cost = np.sum([val[-1] for key, val in df.items() if key != 'total_cost'])\n        df['total_cost'].append(total_cost)\n\n        return df\n\n    ########################################################\n    # PRINT FUNCTIONS\n    ########################################################\n\n\n    def print_load_pv(self):\n\n        print('Load')\n        fig1 = self._load_ts.iplot(asFigure=True)\n        iplot(fig1)\n\n        print('PV')\n        fig2 =self._pv_ts.iplot(asFigure=True)\n        iplot(fig2)\n\n    def print_actual_production(self):\n        if self._df_record_actual_production != type(pd.DataFrame()):\n            df = pd.DataFrame(self._df_record_actual_production)\n            fig1 = df.iplot(asFigure=True)\n            iplot(fig1)\n        else:\n            fig1 = self._df_record_actual_production.iplot(asFigure=True)\n            iplot(fig1)\n\n    def print_control(self):\n        if self._df_record_control_dict != type(pd.DataFrame()):\n            df = pd.DataFrame(self._df_record_control_dict)\n            fig1 = df.iplot(asFigure=True)\n            iplot(fig1)\n        else:\n            fig1 = self._df_record_control_dict.iplot(asFigure=True)\n            iplot(fig1)\n\n    def print_co2(self):\n        if self._df_record_co2 != type(pd.DataFrame()):\n            df = pd.DataFrame(self._df_record_co2)\n            fig1 = df.iplot(asFigure=True)\n            iplot(fig1)\n        else:\n            fig1 = self._df_record_co2.iplot(asFigure=True)\n            iplot(fig1)\n\n    def print_cumsum_cost(self):\n        if self._df_record_cost != type(pd.DataFrame()):\n            df = pd.DataFrame(self._df_record_cost)\n            plt.plot(df.cumsum())\n            plt.show()\n        else:\n            plt.plot(self._df_record_cost.cumsum())\n            plt.show()\n\n\n\n    def print_benchmark_cost(self):\n        \"\"\"\n        This function prints the cumulative cost of the different benchmark ran and different part of the dataset\n        depending on if split it in train/test or not.\n        \"\"\"\n        from pymgrid.algos.Control import Benchmarks\n        benchmarks = Benchmarks(self)\n\n        if len(benchmarks.outputs_dict) == 0:\n            print('No benchmark algorithms have been run, running all.')\n            #self.benchmarks.run_benchmarks()\n\n        if self._has_train_test_split:\n            benchmarks.describe_benchmarks(test_split=self._has_train_test_split, test_index=self._limit_index)\n\n        else:\n            benchmarks.describe_benchmarks(test_split=False)\n\n    def print_info(self):\n        \"\"\" This function prints the main information regarding the microgrid.\"\"\"\n\n        print('Microgrid parameters')\n        display(self.parameters)\n        print('Architecture:')\n        print(self.architecture)\n        print('Actions: ')\n        print(self._df_record_control_dict.keys())\n        print('Control dictionnary:')\n        print(self.control_dict)\n        print('Status: ')\n        print(self._df_record_state.keys())\n        print('Has run mpc baseline:')\n        print(self._has_run_mpc_baseline)\n        print('Has run rule based baseline:')\n        print(self._has_run_rule_based_baseline)\n\n    def print_control_info(self):\n        \"\"\" This function prints the control_dict that needs to be used to control the microgrid\"\"\"\n\n        print('you should fill this dictionnary at each time step')\n        print('it is included in the mg_data object')\n        print('you can copy it by: ctrl = mg_data.control_dict')\n        print('or you can use self.get_conrol_dict()')\n        print('Control dictionnary:')\n        print(self.control_dict)\n\n    def print_updated_parameters(self):\n        \"\"\" This function prints the last values for the parameters of the microgrid changing with time.\"\"\"\n        state={}\n        for i in self._df_record_state:\n            state[i] = self._df_record_state[i][-1]\n\n        print(state)\n\n    ########################################################\n    # RL UTILITY FUNCTIONS\n    ########################################################\n    #todo add a forecasting function that add noise to the time series\n    #todo forecasting function can be used for both mpc benchmart and rl loop\n\n\n    #todo verbose\n    def penalty(self, coef = 1):\n        \"\"\"Penalty that represents discrepancies between control dict and what really happens. \"\"\"\n        penalty = 0\n        for i in self._df_record_control_dict:\n            penalty += abs(self._df_record_control_dict[i][-1] - self._df_record_actual_production[i][-1])\n\n        return penalty*coef\n\n\n    @classmethod\n    def from_modular(cls, modular):\n        from pymgrid.convert.convert import to_nonmodular\n        return to_nonmodular(modular)\n\n    def to_modular(self):\n        from pymgrid.convert.convert import to_modular\n        return to_modular(self)\n\n"
  },
  {
    "path": "src/pymgrid/algos/Control.py",
    "content": "\n\"\"\"\nCopyright 2020 Total S.A.\nAuthors:Gonzague Henri <gonzague.henri@total.com>, Avishai Halev <>\nPermission to use, modify, and distribute this software is given under the\nterms of the pymgrid License.\nNO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.\n$Date: 2020/08/27 08:04 $\nGonzague Henri\n\"\"\"\n\n\"\"\"\n<pymgrid is a Python library to simulate microgrids>\nCopyright (C) <2020> <Total S.A.>\n\nThis program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.\n\nYou should have received a copy of the GNU Lesser General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.\n\n\"\"\"\nimport pandas as pd\nimport numpy as np\nfrom copy import deepcopy\n\n\nclass HorizonOutput:\n\n    def __init__(self,control_dicts, microgrid, current_step):\n        self.df = pd.DataFrame(control_dicts)\n        self.microgrid = microgrid\n        self.current_step = current_step\n        self.cost = self.compute_cost_over_horizon(current_step)\n        self.first_dict = control_dicts[0]\n\n    def compute_cost_over_horizon(self, current_step):\n\n        horizon = self.microgrid.horizon\n        cost = 0.0\n\n        cost += self.df['loss_load'].sum()*self.microgrid.parameters['cost_loss_load'].values[0]  # loss load\n\n        if self.microgrid.architecture['genset'] == 1:\n            cost += self.df['genset'].sum() * self.microgrid.parameters['fuel_cost'].values[0]\n\n        if self.microgrid.architecture['grid'] == 1:\n            price_import = self.microgrid._grid_price_import.iloc[current_step:current_step + horizon].values\n            price_export = self.microgrid._grid_price_export.iloc[current_step:current_step + horizon].values\n\n            import_cost_vec = price_import.reshape(-1)*self.df['grid_import']\n            export_cost_vec = price_export.reshape(-1)*self.df['grid_export']\n            grid_cost = import_cost_vec.sum()-export_cost_vec.sum()\n\n            cost += grid_cost\n\n        return cost\n\n    def __eq__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n        return self.cost == other.cost\n\n    def __lt__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n        return self.cost < other.cost\n\n    def __gt__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n        return self.cost > other.cost\n\n\nclass ControlOutput(dict):\n    \"\"\"\n    Helper class that allows comparisons between controls by comparing the sum of their resultant costs\n    Parameters:\n        names: tuple, len 4\n            names of each of the dataframes output in MPC\n        dfs: tuple, len 4\n            DataFrames of the outputs of MPC\n        alg_name: str\n            Name of the algorithm that produced the output\n    Usage: dict-like, e.g.:\n\n     >>>  names = ('action', 'status', 'production', 'cost', 'co2')\n     >>>  dfs = (baseline_linprog_action, baseline_linprog_update_status,\n     >>>          baseline_linprog_record_production, baseline_linprog_cost) # From MPC\n     >>> M = ControlOutput(names, dfs,'mpc')\n     >>> actions = M['action'] # returns the dataframe baseline_linprog_action\n\n    \"\"\"\n    def __init__(self, names=None, dfs=None, alg_name=None, empty=False, microgrid=None):\n\n        if not empty:\n            if names is None:\n                raise TypeError('names cannot be None unless initializing empty and empty=True')\n            if dfs is None:\n                raise TypeError('dfs cannot be None unless initializing empty and empty=True')\n            if alg_name is None:\n                raise TypeError('alg_name cannot be None unless initializing empty and empty=True')\n        # else:\n            # if not isinstance(microgrid,Microgrid.Microgrid):\n            #     raise TypeError('microgrid must be a Microgrid if empty is True')\n\n        if not empty:\n            names_needed = ('action', 'status', 'production', 'cost', 'co2')\n            if any([needed not in names for needed in names_needed]):\n                raise ValueError('Names must contain {}, currently contains {}'.format(names,names_needed))\n\n            super(ControlOutput, self).__init__(zip(names, dfs))\n            self.alg_name = alg_name\n            self.microgrid = microgrid\n\n        else:\n            names = ('action', 'status', 'production', 'cost', 'co2')\n            baseline_linprog_action = deepcopy(microgrid._df_record_control_dict)\n            baseline_linprog_update_status = deepcopy(microgrid._df_record_state)\n            baseline_linprog_record_production = deepcopy(microgrid._df_record_actual_production)\n            baseline_linprog_cost = deepcopy(microgrid._df_record_cost)\n            baseline_linprog_co2 = deepcopy(microgrid._df_record_co2)\n\n            dfs = (baseline_linprog_action, baseline_linprog_update_status,\n               baseline_linprog_record_production, baseline_linprog_cost, baseline_linprog_co2)\n\n            super(ControlOutput, self).__init__(zip(names, dfs))\n            self.alg_name = alg_name\n            self.microgrid = microgrid\n\n    def append(self, other_output, actual_load=None, actual_pv=None, actual_grid = None, slice_to_use=0):\n        if isinstance(other_output, ControlOutput):\n            for name in self.keys():\n                if name not in other_output.keys():\n                    raise KeyError('name {} not founds in other_output keys'.format(name))\n\n                self[name].append(other_output[name].iloc[slice_to_use], ignore_index=True)\n\n        elif isinstance(other_output, HorizonOutput):\n            action = self['action']\n            production = self['production']\n            cost = self['cost']\n            status = self['status']\n            co2 = self['co2']\n\n            action = self.microgrid._record_action(other_output.first_dict, action)\n            production = self.microgrid._record_production(other_output.first_dict, production, status)\n\n            last_prod = dict([(key, production[key][-1]) for key in production])\n\n            i = other_output.current_step\n\n            if self.microgrid.architecture['grid'] == 1:\n                co2 = self.microgrid._record_co2(\n                    last_prod,\n                    co2,\n                    self.microgrid._grid_co2.iloc[i].values[0]\n                )\n\n                status = self.microgrid._update_status(\n                    last_prod,\n                    status,\n                    actual_load,\n                    actual_pv,\n                    actual_grid,\n                    self.microgrid._grid_price_import.iloc[i + 1].values[0],\n                    self.microgrid._grid_price_export.iloc[i + 1].values[0],\n                    self.microgrid._grid_co2.iloc[i + 1].values[0]\n                )\n\n                cost = self.microgrid._record_cost(\n                    last_prod,\n                    cost,\n                    co2,\n                    self.microgrid._grid_price_import.iloc[i, 0],\n                    self.microgrid._grid_price_export.iloc[i, 0])\n            else:\n\n                co2 = self.microgrid._record_co2(\n                    last_prod,\n                    co2,\n                )\n\n                status = self.microgrid._update_status(\n                    last_prod,\n                    status,\n                    actual_load,\n                    actual_pv\n                )\n                cost = self.microgrid._record_cost(\n                    last_prod,\n                    cost,\n                    co2\n                )\n\n            self['action'] = action\n            self['production'] = production\n            self['cost'] = cost\n            self['status'] = status\n            self['co2'] = co2\n\n    def to_frame(self):\n        d = dict()\n        max_len = -np.inf\n        for k_1, v_1 in self.items():\n            for k_2, v_2 in v_1.items():\n                if len(v_2) > max_len:\n                    max_len = len(v_2)\n                d[(k_1, k_2)] = v_2\n\n        for _, v in d.items():\n            if len(v) < max_len:\n                v.extend([np.nan]*(max_len-len(v)))\n\n        return pd.DataFrame(d)\n\n    def __eq__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n        return np.sum(self['cost']) == np.sum(other['cost'])\n\n    def __lt__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n        return np.sum(self['cost']) < np.sum(other['cost'])\n\n    def __gt__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n        return np.sum(self['cost']) > np.sum(other['cost'])\n\n\nclass Benchmarks:\n    \"\"\"\n    Class to run various control algorithms. Currently supports MPC and rule-based control.\n\n    Parameters\n    -----------\n    microgrid: Microgrid.Microgrid\n        microgrid on which to run the benchmarks\n\n    Attributes\n    -----------\n    microgrid, Microgrid.Microgrid\n        microgrid on which to run the benchmarks\n    mpc_output: ControlOutput or None, default None\n        output of MPC if it has been run, otherwise None\n    outputs_dict: dict\n        Dictionary of the outputs of all run algorithm. Keys are names of algorithms, any or all of 'mpc' or 'rbc' as of now.\n    has_mpc_benchmark: bool, default False\n        whether the MPC benchmark has been run or not\n    rule_based_output: ControlOutput or None, default None\n        output of rule basded control if it has been run, otherwise None\n    has_rule_based_benchmark: bool, default False\n        whether the rule based benchmark has been run or not\n\n    \"\"\"\n    def __init__(self, microgrid):\n        # if not isinstance(microgrid, Microgrid.Microgrid):\n        #     raise TypeError('microgrid must be of type Microgrid, is {}'.format(type(microgrid)))\n\n        self.microgrid = microgrid\n        self.outputs_dict = dict()\n\n        self.mpc_output = None\n        self.has_mpc_benchmark = False\n        self.rule_based_output = None\n        self.has_rule_based_benchmark = False\n        self.saa_output = None\n        self.has_saa_benchmark = False\n\n    def run_mpc_benchmark(self, verbose=False, **kwargs):\n        \"\"\"\n        Run the MPC benchmark and store the output in self.mpc_output\n        :return:\n            None\n        \"\"\"\n        from pymgrid.algos import ModelPredictiveControl\n        MPC = ModelPredictiveControl(self.microgrid)\n        self.mpc_output = MPC.run(verbose=verbose, **kwargs)\n        self.has_mpc_benchmark = True\n        self.outputs_dict[self.mpc_output.alg_name] = self.mpc_output\n\n    def run_rule_based_benchmark(self):\n        \"\"\"\n        Run the rule based benchmark and store the output in self.rule_based_output\n        :return:\n            None\n        \"\"\"\n        from pymgrid.algos import RuleBasedControl\n        RBC = RuleBasedControl(self.microgrid)\n        self.rule_based_output = RBC.run_rule_based()\n        self.has_rule_based_benchmark = True\n        self.outputs_dict[self.rule_based_output.alg_name] = self.rule_based_output\n\n    def run_saa_benchmark(self, preset_to_use=85, **kwargs):\n        from pymgrid.algos.saa import SampleAverageApproximation\n        SAA = SampleAverageApproximation(self.microgrid, preset_to_use=preset_to_use, **kwargs)\n        self.saa_output = SAA.run(**kwargs)\n        self.has_saa_benchmark = True\n        self.outputs_dict[self.saa_output.alg_name] = self.saa_output\n\n    def run_benchmarks(self, algo=None, verbose=False, preset_to_use=85, **kwargs):\n        \"\"\"\n        Runs both run_mpc_benchmark() and self.run_mpc_benchmark() and stores the results.\n        :param verbose: bool, default False\n            Whether to describe benchmarks after running.\n        :return:\n            None\n        \"\"\"\n\n        if algo == 'mpc':\n            self.run_mpc_benchmark(verbose=verbose, **kwargs)\n        elif algo == 'rbc':\n            self.run_rule_based_benchmark()\n        elif algo == 'saa':\n            self.run_saa_benchmark(preset_to_use=preset_to_use, **kwargs)\n        else:\n            self.run_mpc_benchmark(verbose=verbose, **kwargs)\n            self.run_rule_based_benchmark()\n            self.run_saa_benchmark(preset_to_use=preset_to_use, **kwargs)\n\n        if verbose:\n            self.describe_benchmarks()\n\n    def describe_benchmarks(self, test_split=False, test_ratio=None, test_index=None, algorithms=None):\n        \"\"\"\n        Prints the cost of any and all benchmarks that have been run.\n        If test_split==True, must have either a test_ratio or a test_index but not both.\n\n        :param test_split: bool, default False\n            Whether to report the cost of the partial tail (e.g. the last third steps) or all steps.\n        :param test_ratio: float, default None\n            If test_split, the percentage of the data set to report on.\n        :param test_index: int, default None\n            If test_split, the index to split the data into train/test sets\n        :return:\n            None\n        \"\"\"\n        possible_benchmarks = ('saa', 'mpc', 'rbc')\n\n        if algorithms is not None:\n            if any([b_name not in possible_benchmarks for b_name in algorithms]):\n                raise ValueError('Unable to recognize one or multiple of list_of_benchmarks: {}, can only contain {}'.format(\n                    algorithms, possible_benchmarks))\n        else:\n            algorithms = possible_benchmarks\n\n        t_vals = []\n        for key in self.outputs_dict:\n            t_vals.append(len(self.outputs_dict[key]['cost']['total_cost']))\n\n        if not all([t_val == t_vals[0] for t_val in t_vals]):\n            raise ValueError('Outputs are of different lengths')\n\n        T = t_vals[0]\n\n        if test_split:\n            if test_ratio is None and test_index is None:\n                raise ValueError('If test_split, must have either a test_ratio or test_index')\n            elif test_ratio is not None and test_index is not None:\n                raise ValueError('Cannot have both test_ratio and test_split')\n            elif test_ratio is not None and not (0 <= test_ratio <= 1):\n                raise ValueError('test_ratio must be in [0,1], is {}'.format(test_ratio))\n            elif test_index is not None and test_index > T:\n                raise ValueError('test_index cannot be larger than length of output')\n\n        if T != 8736:\n            print('length of MPCOutput cost is {}, not 8736, may be invalid'.format(T))\n\n        if not test_split or test_ratio is not None:\n            if not test_split:\n                test_ratio = 1\n\n            steps = T - int(np.ceil(T * (1 - test_ratio)))\n            percent = round(test_ratio * 100, 1)\n\n            if self.has_mpc_benchmark and 'mpc' in algorithms:\n                cost = round(np.sum(self.mpc_output['cost']['total_cost'][int(np.ceil(T*(1-test_ratio))):]), 2)\n                print('Cost of the last {} steps ({} percent of all steps) using MPC: {}'.format(steps, percent, cost))\n\n            if self.has_rule_based_benchmark and 'rbc' in algorithms:\n                cost = round(np.sum(self.rule_based_output['cost']['total_cost'][int(np.ceil(T*(1-test_ratio))):]), 2)\n                print('Cost of the last {} steps ({} percent of all steps) using rule-based control: {}'.format(steps, percent, cost))\n\n            if self.has_saa_benchmark and 'saa' in algorithms:\n                cost = round(np.sum(self.saa_output['cost']['total_cost'][int(np.ceil(T*(1-test_ratio))):]), 2)\n                print('Cost of the last {} steps ({} percent of all steps) using sample-average MPC control: {}'.format(steps, percent, cost))\n\n        else:\n\n            if self.has_mpc_benchmark and 'mpc' in algorithms:\n                cost_train = round(np.sum(self.mpc_output['cost']['total_cost'][:test_index]), 2)\n                cost_test = round(np.sum(self.mpc_output['cost']['total_cost'][test_index:]), 2)\n\n                print('Test set cost using MPC: {}'.format(cost_test))\n                print('Train set cost using MPC: {}'.format(cost_train))\n\n            if self.has_rule_based_benchmark and 'rbc' in algorithms:\n                cost_train = round(np.sum(self.rule_based_output['cost']['total_cost'][:test_index]), 2)\n                cost_test = round(np.sum(self.rule_based_output['cost']['total_cost'][test_index:]), 2)\n\n                print('Test set cost using RBC: {}'.format(cost_test))\n                print('Train set cost using RBC: {}'.format(cost_train))\n\n            if self.has_saa_benchmark and 'saa' in algorithms:\n                cost_train = round(np.sum(self.saa_output['cost']['total_cost'][:test_index]), 2)\n                cost_test = round(np.sum(self.saa_output['cost']['total_cost'][test_index:]), 2)\n\n                print('Test set cost using SAA: {}'.format(cost_test))\n                print('Train set cost using SAA: {}'.format(cost_train))\n"
  },
  {
    "path": "src/pymgrid/algos/__init__.py",
    "content": "from .mpc.mpc import ModelPredictiveControl\nfrom .rbc.rbc import RuleBasedControl\n"
  },
  {
    "path": "src/pymgrid/algos/example.log",
    "content": ""
  },
  {
    "path": "src/pymgrid/algos/mpc/__init__.py",
    "content": ""
  },
  {
    "path": "src/pymgrid/algos/mpc/mpc.py",
    "content": "import time\nfrom copy import deepcopy\nfrom tqdm import tqdm\nimport cvxpy as cp\nimport numpy as np\nimport pandas as pd\nfrom warnings import warn\nfrom scipy.sparse import csr_matrix\n\ntry:\n    import mosek\nexcept ImportError:\n    mosek = None\n\nfrom pymgrid.algos.Control import ControlOutput, HorizonOutput\nfrom pymgrid.utils.DataGenerator import return_underlying_data\nimport logging\n\n\nlogger = logging.getLogger(__name__)\n\n\"\"\"\nAttributes:\n--------------\nmicrogrid: Union[Microgrid.Microgrid, modular_microgrid.ModularMicrogrid]\n    The underlying microgrid\n\nhorizon: int\n    The forecast horizon being used in MPC\n\nhas_genset: bool\n    Whether the microgrid has a genset or not\n\np_vars: cvxpy.Variable, shape ((7+self.has_genset)*horizon,)\n    Vector of all of the controls, at all timesteps. See P in pymgrid paper for details.\n\nu_genset: None or cvxpy.Variable, shape (self.horizon,)\n    Boolean vector variable denoting the status of the genset (on or off) at each timestep if\n    the genset exists. If not genset, u_genset = None.\n\ncosts: cvxpy.Parameter, shape ((7+self.has_genset)*self.horizon,)\n    Parameter vector of all of the respective costs, at all timesteps. See C in pymgrid paper for details.\n\nequality_rhs: cvxpy.Parameter, shape (2 * self.horizon,)\n    Parameter vector contraining the RHS of the equality constraint equation. See b in pymgrid paper for details.\n\ninequality_rhs: cvxpy.Parameter, shape (8 * self.horizon,)\n    Parameter vector contraining the RHS of the inequality constraint equation. See d in pymgrid paper for details.\n\nproblem: cvxpy.problems.problem.Problem\n    The constraint optimization problem to solve\n\"\"\"\n\n\nclass ModelPredictiveControl:\n    \"\"\"\n    Run a model predictive control algorithm on a microgrid.\n\n    In model predictive control, a model of the microgrid is used to predict the microgrid's response to taking\n    certain actions. Armed with this prediction model, we can predict the microgrid's response to simulating forward\n    a certain number of steps (the forecast \"horizon\"). This results in an objective function -- with the objective\n    being the cost of running the microgrid over the entire horizon.\n\n    Given the solution of this optimization problem, we apply the control we found at the current step (ignoring the\n    rest) and then repeat.\n\n    The specifics of the model implementation can be seen in the accompanying paper.\n\n    .. warning::\n       This implementation of model predictive control does not support arbitrary microgrid components. One each\n       of load, renewable, battery, grid, and genset are allowed. Microgrids are not required to have both grid and\n       genset but they must have one; they also must have one each of load, renewable, and battery.\n\n    Parameters\n    ----------\n\n    microgrid : :class:`pymgrid.Microgrid`\n        Microgrid on which to run model predictive control.\n\n    \"\"\"\n    def __init__(self, microgrid, solver=None):\n        self.microgrid, self.is_modular, self.microgrid_module_names = self._verify_microgrid(microgrid)\n        self.horizon = self._get_horizon()\n\n        if self.has_genset:\n            self.p_vars = cp.Variable((8*self.horizon,), pos=True)\n            self.u_genset = cp.Variable((self.horizon,), boolean=True)\n            self.costs = cp.Parameter(8 * self.horizon)\n            self.inequality_rhs = cp.Parameter(9 * self.horizon)\n\n        else:\n            self.p_vars = cp.Variable((7*self.horizon,), pos=True)\n            self.u_genset = None\n            self.costs = cp.Parameter(7 * self.horizon, nonneg=True)\n            self.inequality_rhs = cp.Parameter(8 * self.horizon)\n\n        self.equality_rhs = cp.Parameter(2 * self.horizon)  # rhs\n\n        parameters = self._parse_microgrid()\n\n        self.problem = self._create_problem(*parameters)\n        self._passed_solver = solver\n        self._solver = self._get_solver()\n\n    @property\n    def has_genset(self):\n        \"\"\"\n        :meta private:\n        \"\"\"\n        if self.is_modular:\n            return \"genset\" in self.microgrid_module_names.keys()\n        else:\n            return self.microgrid.architecture[\"genset\"] == 1\n\n    def _verify_microgrid(self, microgrid):\n        try:\n            microgrid.to_modular()\n            return microgrid, False, {}\n        except AttributeError:\n            try:\n                microgrid.to_nonmodular()\n                return microgrid, True, self._get_modules(microgrid)\n            except Exception as e:\n                if isinstance(e, AttributeError) and \"to_nonmodular\" in e.args[0]:\n                    raise TypeError(f\"Unable to verify microgrid as modular or nonmodular.\") from e\n\n                raise ValueError(f\"Modular microgrid must be convertable to nonmodular. \"\n                                 f\"Is not due to:\\n{type(e)}: {e}\") from e\n\n    def _get_modules(self, modular_microgrid):\n        def remove_suffix(s, suf):\n            if suf and s.endswith(suf):\n                return s[:-len(suf)]\n            return s\n        return {remove_suffix(module.item().__class__.__name__, \"Module\").lower(): name\n                for name, module in modular_microgrid.modules.iterdict()}\n\n    def _get_horizon(self):\n        if self.is_modular:\n            horizon = self.microgrid.get_forecast_horizon() + 1\n            if horizon == 0:\n                raise ValueError(\"Microgrid has horizon=0. Do your timeseries modules have a forecaster?\")\n            return horizon\n\n        return self.microgrid.horizon\n\n    def _parse_microgrid(self):\n        \"\"\"\n        Protected helper function.\n        Parses the microgrid in self.microgrid to extract the parameters necessary to run MPC.\n        :return:\n            eta: float\n                battery efficiency\n            battery_capacity: float\n                battery capacity for normalization\n            fuel_cost: float\n                fuel cost for the genset\n            cost_battery_cycle: float\n                cost of cycling the battery\n            cost_loss_load: float\n                cost of loss load\n            p_genset_min: float\n                minimum production of the genset\n            p_genset_max: float\n                maximum production of the genset\n        \"\"\"\n        if self.is_modular:\n            return self._parse_modular_microgrid()\n        else:\n            return self._parse_nonmodular_microgrid()\n\n    def _parse_nonmodular_microgrid(self):\n        parameters = self.microgrid.parameters\n\n        eta = parameters['battery_efficiency'].values[0]\n        battery_capacity = parameters['battery_capacity'].values[0]\n\n        if self.microgrid.architecture['genset'] == 1:\n            fuel_cost = parameters['fuel_cost'].values[0]\n        else:\n            fuel_cost = 0\n\n        cost_battery_cycle = parameters['battery_cost_cycle'].values[0]\n        cost_loss_load = parameters['cost_loss_load'].values[0]\n        cost_co2 = parameters['cost_co2'].values[0]\n\n        if self.has_genset:\n            p_genset_min = parameters['genset_pmin'].values[0] * parameters['genset_rated_power'].values[0]\n            p_genset_max = parameters['genset_pmax'].values[0] * parameters['genset_rated_power'].values[0]\n            genset_co2 = parameters['genset_co2'].values[0]\n\n        else:\n            p_genset_min = 0\n            p_genset_max = 0\n            genset_co2 = 0\n\n        return eta, battery_capacity, fuel_cost, cost_battery_cycle, cost_loss_load, p_genset_min, p_genset_max, cost_co2, genset_co2\n\n    def _parse_modular_microgrid(self):\n        battery = self.microgrid.battery.item()\n\n        eta = battery.efficiency\n        battery_capacity = battery.max_capacity\n        cost_battery_cycle = battery.battery_cost_cycle\n\n        cost_loss_load = self.microgrid.modules[self.microgrid_module_names[\"unbalancedenergy\"]].item().loss_load_cost\n\n        if self.has_genset:\n            genset = self.microgrid.modules[self.microgrid_module_names[\"genset\"]].item()\n            fuel_cost = genset.genset_cost\n            p_genset_min = genset.running_min_production\n            p_genset_max = genset.running_max_production\n            cost_co2 = genset.cost_per_unit_co2\n            genset_co2 = genset.co2_per_unit\n\n        else:\n            fuel_cost, p_genset_min, p_genset_max, cost_co2, genset_co2 = 0, 0, 0, 0, 0\n\n        return (\n            eta,\n            battery_capacity,\n            fuel_cost,\n            cost_battery_cycle,\n            cost_loss_load,\n            p_genset_min,\n            p_genset_max,\n            cost_co2,\n            genset_co2\n        )\n\n    def _create_problem(self, eta, battery_capacity, fuel_cost, cost_battery_cycle, cost_loss_load,\n                        p_genset_min, p_genset_max, cost_co2, genset_co2):\n\n        \"\"\"\n        Protected, automatically called on initialization.\n\n        Defines the constrainted optimization problem to be stored in self.problem.\n        The parameters defined here do not change between timesteps.\n\n        :param eta: float\n            battery efficiency\n        :param battery_capacity: float\n            battery capacity for normalization\n        :param fuel_cost: float\n            fuel cost for the genset\n        :param cost_battery_cycle: float\n            cost of cycling the battery\n        :param cost_loss_load: float\n            cost of loss load\n        :param p_genset_min: float\n            minimum production of the genset\n        :param p_genset_max: float\n            maximum production of the genset\n        :return :\n            problem: cvxpy.problems.problem.Problem\n                The constrainted optimization problem to be solved at each step of the MPC.\n        \"\"\"\n\n        delta_t = 1\n\n        # Define matrix Y\n        if self.has_genset:\n            Y = np.zeros((self.horizon, self.horizon * 8))\n\n            Y[0, 3] = -1.0 * eta * delta_t/battery_capacity\n            Y[0, 4] = delta_t / (eta * battery_capacity)\n            Y[0, 7] = 1\n\n            gamma = np.zeros(16)\n            gamma[7] = -1\n            gamma[11] = -1.0 * eta * delta_t/battery_capacity\n            gamma[12] = delta_t / (eta * battery_capacity)\n            gamma[15] = 1\n\n            for j in range(1, self.horizon):\n                start = (j - 1) * 8\n\n                Y[j, start:start + 16] = gamma\n        else:\n            Y = np.zeros((self.horizon, self.horizon * 7))\n            Y[0, 2] = -1.0 * eta * delta_t / battery_capacity\n            Y[0, 3] = delta_t / (eta * battery_capacity)\n            Y[0, 6] = 1\n\n            gamma = np.zeros(14)\n            gamma[6] = -1\n            gamma[9] = -1.0 * eta * delta_t/battery_capacity\n            gamma[10] = delta_t / (eta * battery_capacity)\n            gamma[13] = 1\n\n            for j in range(1, self.horizon):\n                start = (j - 1) * 7\n\n                Y[j, start:start + 14] = gamma\n\n        # done with Y\n        if self.has_genset:\n            X = np.zeros((self.horizon, self.horizon * 8))\n\n            alpha = np.ones(8)\n            alpha[2] = -1\n            alpha[3] = -1\n            alpha[5] = -1\n            alpha[7] = 0\n\n            for j in range(self.horizon):\n                start = j * 8\n                X[j, start:start + 8] = alpha\n\n        else:\n\n            X = np.zeros((self.horizon, self.horizon * 7))\n\n            alpha = np.ones(7)\n            alpha[1] = -1\n            alpha[2] = -1\n            alpha[4] = -1\n            alpha[6] = 0\n\n            for j in range(self.horizon):\n                start = j * 7\n                X[j, start:start + 7] = alpha\n\n        A = np.concatenate((X, Y))  # lhs\n        A = csr_matrix(A)\n\n        # Define inequality constraints\n\n        # Inequality lhs\n        # This is for one timestep\n\n        C_block = np.zeros((9, 8))\n        C_block[0, 0] = 1\n        C_block[1, 7] = 1\n        C_block[2, 7] = -1\n        C_block[3, 3] = 1\n        C_block[4, 4] = 1\n        C_block[5, 1] = 1\n        C_block[6, 2] = 1\n        C_block[7, 5] = 1\n        C_block[8, 6] = 1\n\n        if not self.has_genset:             # drop the first column if no genset\n            C_block = C_block[1:, 1:]\n\n        # For all timesteps\n        block_lists = [[C_block if i == j else np.zeros(C_block.shape) for i in range(self.horizon)] for j in\n                       range(self.horizon)]\n        C = np.block(block_lists)\n        C = csr_matrix(C)\n\n        # Inequality rhs\n\n        constraints = [A @ self.p_vars == self.equality_rhs, C @ self.p_vars <= self.inequality_rhs]\n\n        if self.has_genset:\n            constraints.extend((p_genset_min * self.u_genset <= self.p_vars[:: 8],\n                                self.p_vars[:: 8] <= p_genset_max * self.u_genset))\n\n        # Define  objective\n        if self.has_genset:\n            cost_vector = np.array([fuel_cost + cost_co2 * genset_co2, 0, 0,\n                                cost_battery_cycle, cost_battery_cycle, 0, cost_loss_load, 0])\n        else:\n            cost_vector = np.array([0, 0,\n                                    cost_battery_cycle, cost_battery_cycle, 0, cost_loss_load, 0])\n\n        costs_vector = np.concatenate([cost_vector] * self.horizon)\n\n        self.costs.value = costs_vector\n\n        objective = cp.Minimize(self.costs @ self.p_vars)\n\n        return cp.Problem(objective, constraints)\n\n    def _get_solver(self, mosek_failure=None):\n        if self._passed_solver is not None:\n            return self._passed_solver\n\n        elif \"MOSEK\" in cp.installed_solvers() and mosek_failure is None:\n            solver = cp.MOSEK\n        elif \"GLPK_MI\" in cp.installed_solvers():\n            solver = cp.GLPK_MI\n        elif self.problem.is_mixed_integer():\n            assert self.has_genset\n            raise RuntimeError(\"If microgrid has a genset, the cvxpy problem becomes mixed integer. Either MOSEK or \"\n                               \"CVXOPT must be installed.\\n\"\n                               \"You can install both by calling pip install -e .'[genset_mpc]' in the root folder of \"\n                               \"pymgrid. Note that MOSEK requires a license; see https://www.mosek.com/ for details.\\n\"\n                               \"Academic and trial licenses are available.\")\n        else:\n            solver = None\n\n        if mosek_failure is not None:\n            logger.info(f\"MOSEK Solver failed due to {mosek_failure}. Retrying with solver={solver}\")\n        else:\n            logger.info(\"Using default solver.\" if solver is None else f\"Using {solver} solver.\")\n\n        return solver\n\n    def _set_parameters(self, load_vector, pv_vector, grid_vector, import_price, export_price,\n                        e_max, e_min, p_max_charge, p_max_discharge,\n                        p_max_import, p_max_export, soc_0, p_genset_max, cost_co2, grid_co2, genset_co2,):\n\n        \"\"\"\n        Protected, called by _set_and_solve.\n        Sets the time-varying (and some static) parameters in the optimization problem at any given timestep.\n\n        :param load_vector: np.ndarray, shape (self.horizon,)\n            load values over the horizon\n        :param pv_vector: np.ndarray, shape (self.horizon,)\n            pv values over the horizon\n        :param grid_vector: np.ndarray, shape (self.horizon,)\n            grid values (boolean) over the horizon\n        :param import_price: np.ndarray, shape (self.horizon,)\n            import prices over the horizon\n        :param export_price: np.ndarray, shape (self.horizon,)\n            export prices over the horizon\n        :param e_max: float\n            maximum state of charge of the battery\n        :param e_min: float\n            minimum state of charge of the battery\n        :param p_max_charge: float\n            maximum amount of power the battery can charge in one timestep\n        :param p_max_discharge: float\n            maximum amount of power the battery can discharge in one timestep\n        :param p_max_import: float\n            maximum amount of power that can be imported in one timestep\n        :param p_max_export: float\n            maximum amount of power that can be exported in one timestep\n        :param soc_0: float\n            state of charge of the battery at the timestep just preceding the current horizon\n        :return:\n            None\n        \"\"\"\n        vector_dict = dict(load_vector=load_vector,\n                           pv_vector=pv_vector,\n                           grid_vector=grid_vector,\n                           import_price=import_price,\n                           export_price=export_price)\n\n        for name, vector in vector_dict.items():\n            if not isinstance(vector, np.ndarray):\n                raise TypeError(f'Vector {name} must be ndarray, is {type(vector)}.')\n\n            if len(vector.shape) != 1 and load_vector.shape[0] != self.horizon:\n                raise ValueError(f'Invalid {name} shape {vector.shape}, must have shape ({self.horizon}, ).')\n\n        # Set equality rhs\n        equality_rhs_vals = np.zeros(self.equality_rhs.shape)\n        equality_rhs_vals[:self.horizon] = load_vector-pv_vector\n        equality_rhs_vals[self.horizon] = soc_0\n        self.equality_rhs.value = equality_rhs_vals\n\n        # Set inequality rhs\n        if self.has_genset:\n            inequality_rhs_block = np.array([p_genset_max, e_max, -e_min, p_max_charge, p_max_discharge,\n                                             np.nan, np.nan, np.nan, np.nan])\n        else:\n            inequality_rhs_block = np.array([e_max, -e_min, p_max_charge, p_max_discharge,\n                                         np.nan, np.nan, np.nan, np.nan])\n\n        inequality_rhs_vals = np.concatenate([inequality_rhs_block]*self.horizon)\n\n        # set d7-d10\n        if self.has_genset:\n            inequality_rhs_vals[5::9] = p_max_import * grid_vector\n            inequality_rhs_vals[6::9] = p_max_export * grid_vector\n            inequality_rhs_vals[7::9] = pv_vector\n            inequality_rhs_vals[8::9] = load_vector\n\n        else:\n            inequality_rhs_vals[4::8] = p_max_import * grid_vector\n            inequality_rhs_vals[5::8] = p_max_export * grid_vector\n            inequality_rhs_vals[6::8] = pv_vector\n            inequality_rhs_vals[7::8] = load_vector\n\n        if np.isnan(inequality_rhs_vals).any():\n            raise RuntimeError('There are still nan values in inequality_rhs_vals, something is wrong')\n\n        self.inequality_rhs.value = inequality_rhs_vals\n\n        # Set costs\n        if self.has_genset:\n            self.costs.value[1::8] = import_price.reshape(-1) + grid_co2.reshape(-1) * cost_co2\n            self.costs.value[2::8] = export_price.reshape(-1)\n        else:\n            self.costs.value[0::7] = import_price.reshape(-1) + grid_co2.reshape(-1) * cost_co2\n            self.costs.value[1::7] = export_price.reshape(-1)\n\n        if np.isnan(self.costs.value).any():\n            raise RuntimeError('There are still nan values in self.costs.value, something is wrong')\n\n    def run(self, max_steps=None, verbose=False):\n        \"\"\"\n        Run the model prediction control algorithm.\n\n        Parameters\n        ---------\n        max_steps : int or None, default None\n            Maximum number of MPC steps. If None, run until the microgrid terminates.\n\n        verbose : bool, default False\n            Whether to display a progress bar.\n\n        Returns\n        -------\n        log : pd.DataFrame\n            Results of running the rule-based control algorithm.\n\n        \"\"\"\n        if self.is_modular:\n            return self._run_mpc_on_modular(forecast_steps=max_steps, verbose=verbose)\n        else:\n            return self._run_mpc_on_nonmodular(forecast_steps=max_steps, verbose=verbose)\n\n    def _run_mpc_on_nonmodular(self, forecast_steps=None, verbose=False):\n        \"\"\"\n        Function that allows MPC to be run on self.microgrid by first parsing its data\n\n        :param forecast_steps: int, default None\n            Number of steps to run MPC on. If None, runs over 8760-self.horizon steps\n        :param verbose: bool\n            Whether to discuss progress\n        :return:\n            output, ControlOutput\n                dict-like containing the DataFrames ('action', 'status', 'production', 'cost'),\n                but with an ordering defined via comparing the costs.\n        \"\"\"\n        sample = return_underlying_data(self.microgrid)\n        sample = sample.reset_index(drop=True)\n        return self._run_mpc_on_sample(sample, forecast_steps=forecast_steps, verbose=verbose)\n\n    def _run_mpc_on_modular(self, forecast_steps=None, verbose=False):\n\n        num_iter = self._get_num_iter(forecast_steps)\n        self.microgrid.reset()\n\n        for i in tqdm(range(num_iter), desc=\"MPC Progress\", disable=(not verbose)):\n            control = self._set_and_solve(*self._get_modular_state_values(),\n                                         iteration=i,\n                                         total_iterations=num_iter,\n                                          verbose=verbose>1)\n\n            _, _, done, _ = self.microgrid.run(control, normalized=False)\n\n            if done:\n                break\n\n        return self.microgrid.get_log()\n\n\n    def _get_num_iter(self, forecast_steps=None):\n        if forecast_steps is not None:\n            assert forecast_steps <= len(self.microgrid), 'forecast steps cannot be longer than data length.'\n            return forecast_steps\n\n        elif not self.is_modular:\n            return len(self.microgrid) - self.horizon\n\n        return self.microgrid.final_step - self.microgrid.initial_step\n\n    def _run_mpc_on_sample(self, sample, forecast_steps=None, verbose=False):\n        \"\"\"\n        Runs MPC on a sample over a number of iterations\n\n        :param sample: pd.DataFrame, shape (8760,3)\n            sample to run the MPC on. Must contain columns 'load', 'pv', and 'grid'.\n        :param forecast_steps: int, default None\n            Number of steps to run MPC on. If None, runs over 8760-self.horizon steps\n        :param verbose: bool\n            Whether to discuss progress\n        :return:\n            output, ControlOutput\n                dict-like containing the DataFrames ('action', 'status', 'production', 'cost'),\n                but with an ordering defined via comparing the costs.\n        \"\"\"\n        if not isinstance(sample, pd.DataFrame):\n            raise TypeError('sample must be of type pd.DataFrame, is {}'.format(type(sample)))\n\n        sample = sample.iloc[:self.microgrid._data_length]\n\n        # dataframes, copied API from _baseline_linprog\n        self.microgrid.reset()\n        baseline_linprog_action = deepcopy(self.microgrid._df_record_control_dict)\n        baseline_linprog_update_status = deepcopy(self.microgrid._df_record_state)\n        baseline_linprog_record_production = deepcopy(self.microgrid._df_record_actual_production)\n        baseline_linprog_cost = deepcopy(self.microgrid._df_record_cost)\n        baseline_linprog_co2 = deepcopy(self.microgrid._df_record_co2)\n\n        T = len(sample)\n        horizon = self.microgrid.horizon\n\n        if forecast_steps is None:\n            num_iter = T - horizon\n        else:\n            assert forecast_steps <= T - horizon, 'forecast steps can\\'t look past horizon'\n            num_iter = forecast_steps\n\n        t0 = time.time()\n        old_control_dict = None\n\n        for i in tqdm(range(num_iter), desc=\"MPC Progress\", disable=(not verbose)):\n\n            if self.microgrid.architecture['grid'] == 0:\n                temp_grid = np.zeros(horizon)\n                price_import = np.zeros(horizon)\n                price_export = np.zeros(horizon)\n                p_max_import = 0\n                p_max_export = 0\n                grid_co2 = np.zeros(horizon)\n            else:\n                temp_grid = sample.loc[i:i + horizon - 1, 'grid'].values\n                price_import = self.microgrid._grid_price_import.iloc[i:i + horizon].values\n                price_export = self.microgrid._grid_price_export.iloc[i:i + horizon].values\n                grid_co2 = self.microgrid._grid_co2.iloc[i:i + horizon].values\n                p_max_import = self.microgrid.parameters['grid_power_import'].values[0]\n                p_max_export = self.microgrid.parameters['grid_power_export'].values[0]\n\n                if temp_grid.shape != price_export.shape and price_export.shape != price_import.shape:\n                    raise RuntimeError('I think this is a problem')\n\n\n            e_min = self.microgrid.parameters['battery_soc_min'].values[0]\n            e_max = self.microgrid.parameters['battery_soc_max'].values[0]\n            p_max_charge = self.microgrid.parameters['battery_power_charge'].values[0]\n            p_max_discharge = self.microgrid.parameters['battery_power_discharge'].values[0]\n\n            soc_0 = baseline_linprog_update_status['battery_soc'][-1]\n\n            cost_co2 = self.microgrid.parameters['cost_co2'].values[0]\n\n            if self.has_genset:\n                p_genset_max = self.microgrid.parameters['genset_pmax'].values[0] *\\\n                           self.microgrid.parameters['genset_rated_power'].values[0]\n                genset_co2 = self.microgrid.parameters['genset_co2'].values[0]\n            else:\n                p_genset_max = None\n                genset_co2 = None\n\n            # Solve one step of MPC\n            control_dict = self._set_and_solve(sample.loc[i:i + horizon - 1, 'load'].values,\n                                              sample.loc[i:i + horizon - 1, 'pv'].values, temp_grid, price_import,\n                                              price_export, e_max, e_min, p_max_charge, p_max_discharge, p_max_import,\n                                              p_max_export, soc_0, p_genset_max, cost_co2, grid_co2, genset_co2, iteration = i, total_iterations = num_iter)\n\n            if control_dict is not None:\n                baseline_linprog_action = self.microgrid._record_action(control_dict, baseline_linprog_action)\n                baseline_linprog_record_production = self.microgrid._record_production(control_dict,\n                                                                                       baseline_linprog_record_production,\n                                                                                       baseline_linprog_update_status)\n                old_control_dict = control_dict.copy()\n\n            elif old_control_dict is not None:\n                print('Using previous controls')\n                baseline_linprog_action = self.microgrid._record_action(old_control_dict, baseline_linprog_action)\n                baseline_linprog_record_production = self.microgrid._record_production(old_control_dict,\n                                                                                       baseline_linprog_record_production,\n                                                                                       baseline_linprog_update_status)\n            else:\n                raise RuntimeError('Fell through, was unable to solve for control_dict and could not find previous control dict')\n\n            if self.microgrid.architecture['grid'] == 1:\n                baseline_linprog_co2 = self.microgrid._record_co2(\n                    {i: baseline_linprog_record_production[i][-1] for i in baseline_linprog_record_production},\n                    baseline_linprog_co2,\n                    self.microgrid._grid_co2.iloc[i].values[0],\n                )\n\n                baseline_linprog_update_status = self.microgrid._update_status(\n                    {i: baseline_linprog_record_production[i][-1] for i in baseline_linprog_record_production},\n                    baseline_linprog_update_status,\n                    sample.at[i + 1, 'load'],\n                    sample.at[i + 1, 'pv'],\n                    sample.at[i + 1, 'grid'],\n                    self.microgrid._grid_price_import.iloc[i + 1].values[0],\n                    self.microgrid._grid_price_export.iloc[i + 1].values[0],\n                    self.microgrid._grid_co2.iloc[i + 1].values[0],\n                )\n\n                baseline_linprog_cost = self.microgrid._record_cost(\n                    {i: baseline_linprog_record_production[i][-1] for i in baseline_linprog_record_production},\n                    baseline_linprog_cost,\n                    baseline_linprog_co2,\n                    self.microgrid._grid_price_import.iloc[i, 0],\n                    self.microgrid._grid_price_export.iloc[i, 0])\n            else:\n                baseline_linprog_co2 = self.microgrid._record_co2(\n                    {i: baseline_linprog_record_production[i][-1] for i in baseline_linprog_record_production},\n                    baseline_linprog_co2,\n                )\n\n                baseline_linprog_update_status = self.microgrid._update_status(\n                    {i: baseline_linprog_record_production[i][-1] for i in baseline_linprog_record_production},\n                    baseline_linprog_update_status,\n                    sample.at[i + 1, 'load'],\n                    sample.at[i + 1, 'pv']\n                )\n                baseline_linprog_cost = self.microgrid._record_cost(\n                    {i: baseline_linprog_record_production[i][-1] for i in baseline_linprog_record_production},\n                    baseline_linprog_cost,\n                    baseline_linprog_co2,\n                )\n\n        names = ('action', 'status', 'production', 'cost', 'co2')\n\n        dfs = (baseline_linprog_action, baseline_linprog_update_status,\n               baseline_linprog_record_production, baseline_linprog_cost, baseline_linprog_co2)\n\n        if verbose:\n            print('Total time: {} minutes'.format(round((time.time()-t0)/60, 2)))\n\n        return ControlOutput(names, dfs, 'mpc')\n\n    def _set_and_solve(self,\n                      load_vector,\n                      pv_vector,\n                      grid_vector,\n                      import_price,\n                      export_price,\n                      e_max,\n                      e_min,\n                      p_max_charge,\n                      p_max_discharge,\n                      p_max_import,\n                      p_max_export,\n                      soc_0,\n                      p_genset_max,\n                      cost_co2,\n                      grid_co2,\n                      genset_co2,\n                      iteration=None,\n                      total_iterations=None,\n                      return_steps=0,\n                       verbose=False):\n        \"\"\"\n        Sets the parameters in the problem and then solves the problem.\n            Specifically, sets the right-hand sides b and d from the paper of the\n            equality and inequality equations, respectively, and the costs vector by calling _set_parameters, then\n            solves the problem and returns a control dictionary\n\n\n        :param load_vector: np.ndarray, shape (self.horizon,)\n            load values over the horizon\n        :param pv_vector: np.ndarray, shape (self.horizon,)\n            pv values over the horizon\n        :param grid_vector: np.ndarray, shape (self.horizon,)\n            grid values (boolean) over the horizon\n        :param import_price: np.ndarray, shape (self.horizon,)\n            import prices over the horizon\n        :param export_price: np.ndarray, shape (self.horizon,)\n            export prices over the horizon\n        :param e_max: float\n            maximum state of charge of the battery\n        :param e_min: float\n            minimum state of charge of the battery\n        :param p_max_charge: float\n            maximum amount of power the battery can charge in one timestep\n        :param p_max_discharge: float\n            maximum amount of power the battery can discharge in one timestep\n        :param p_max_import: float\n            maximum amount of power that can be imported in one timestep\n        :param p_max_export: float\n            maximum amount of power that can be exported in one timestep\n        :param soc_0: float\n            state of charge of the battery at the timestep just preceding the current horizon\n        :param p_genset_max: float\n            maximum amount of production of the genset\n        :param iteration: int\n            Current iteration, used for verbosity\n        :param total_iterations:\n            Total iterations, used for verbosity\n        :return:\n            control_dict, dict\n            dictionary of the controls of the first timestep, as MPC does.\n        \"\"\"\n\n        self._set_parameters(load_vector, pv_vector, grid_vector, import_price, export_price,\n                             e_max, e_min, p_max_charge, p_max_discharge,\n                             p_max_import, p_max_export, soc_0, p_genset_max, cost_co2, grid_co2, genset_co2,)\n\n        if mosek is not None:\n            try:\n                self.problem.solve(warm_start=True, solver=self._solver)\n            except mosek.Error as e:\n                self._solver = self._get_solver(mosek_failure=e)\n                self.problem.solve(warm_start=True, solver=self._solver)\n        else:\n            self.problem.solve(warm_start=True, solver=self._solver)\n\n        if self.problem.status == 'infeasible':\n            warn(\"Infeasible problem\")\n\n        if self.is_modular:\n            return self._extract_modular_control(load_vector, verbose)\n        else:\n            return self._extract_control_dict(return_steps, pv_vector, load_vector)\n\n    def _extract_control_dict(self, return_steps, pv_vector, load_vector):\n        if return_steps == 0:\n            if self.has_genset:\n                control_dict = {'battery_charge': self.p_vars.value[3],\n                                'battery_discharge': self.p_vars.value[4],\n                                'genset': self.p_vars.value[0],\n                                'grid_import': self.p_vars.value[1],\n                                'grid_export': self.p_vars.value[2],\n                                'loss_load': self.p_vars.value[6],\n                                'pv_consummed': pv_vector[0] - self.p_vars.value[5],\n                                'pv_curtailed': self.p_vars.value[5],\n                                'load': load_vector[0],\n                                'pv': pv_vector[0]}\n            else:\n                control_dict = {'battery_charge': self.p_vars.value[2],\n                                'battery_discharge': self.p_vars.value[3],\n                                'grid_import': self.p_vars.value[0],\n                                'grid_export': self.p_vars.value[1],\n                                'loss_load': self.p_vars.value[5],\n                                'pv_consummed': pv_vector[0] - self.p_vars.value[4],\n                                'pv_curtailed': self.p_vars.value[4],\n                                'load': load_vector[0],\n                                'pv': pv_vector[0]}\n\n            return control_dict\n\n        else:\n            if return_steps > self.horizon:\n                raise ValueError('return_steps cannot be greater than horizon')\n\n            control_dicts = []\n\n            if self.has_genset:\n                for j in range(return_steps):\n                    start_index = j*8\n\n                    control_dict = {'battery_charge': self.p_vars.value[start_index+3],\n                                    'battery_discharge': self.p_vars.value[start_index+4],\n                                    'genset': self.p_vars.value[start_index],\n                                    'grid_import': self.p_vars.value[start_index+1],\n                                    'grid_export': self.p_vars.value[start_index+2],\n                                    'loss_load': self.p_vars.value[start_index+6],\n                                    'pv_consummed': pv_vector[j] - self.p_vars.value[start_index+5],\n                                    'pv_curtailed': self.p_vars.value[start_index+5],\n                                    'load': load_vector[j],\n                                    'pv': pv_vector[j]}\n\n                    control_dicts.append(control_dict)\n\n            else:\n                for j in range(return_steps):\n                    start_index = j * 7\n\n                    control_dict = {'battery_charge': self.p_vars.value[start_index + 2],\n                                    'battery_discharge': self.p_vars.value[start_index + 3],\n                                    'grid_import': self.p_vars.value[start_index],\n                                    'grid_export': self.p_vars.value[start_index + 1],\n                                    'loss_load': self.p_vars.value[start_index + 5],\n                                    'pv_consummed': pv_vector[j] - self.p_vars.value[start_index + 4],\n                                    'pv_curtailed': self.p_vars.value[start_index + 4],\n                                    'load': load_vector[j],\n                                    'pv': pv_vector[j]}\n\n                    control_dicts.append(control_dict)\n\n            return control_dicts\n\n    def _extract_modular_control(self, load_vector, verbose):\n        control = dict()\n        control_vals = list(self.p_vars.value)\n\n        if self.has_genset:\n            genset = control_vals.pop(0)\n            genset_status = self.u_genset.value[0]\n            control[self.microgrid_module_names[\"genset\"]] = [np.array([genset_status, genset])]\n\n        battery_charge, battery_discharge = control_vals[2:4]\n        battery_diff = battery_discharge - battery_charge\n\n        grid_import, grid_export = control_vals[0:2]\n        grid_diff = grid_import - grid_export\n\n        if battery_charge > 0 and battery_discharge > 0:\n            if verbose and not np.isclose([battery_charge, battery_discharge], 0, atol=1e-4).any():\n                warn(f\"battery_charge={battery_charge} and battery_discharge={battery_discharge} are both nonzero. \"\n                    f\"Flattening to the difference, leading to a {'discharge' if battery_diff > 0 else 'charge'} of {battery_diff}.\")\n\n        if grid_import > 0 and grid_export > 0:\n            if verbose and not np.isclose([grid_import, grid_export], 0, atol=1e-4).any():\n                warn(f\"grid_import={grid_import} and grid_export={grid_export} are both nonzero. \"\n                    f\"Flattening to the difference, leading to a {'import' if grid_diff > 0 else 'export'} of {grid_diff}.\")\n\n        if \"grid\" in self.microgrid_module_names.keys():\n            control.update({self.microgrid_module_names[\"grid\"]: grid_diff})\n\n        control.update({self.microgrid_module_names[\"battery\"]: battery_diff})\n\n        return control\n\n    def _get_modular_state_values(self):\n\n        load_state = -1.0 * self.microgrid.modules[self.microgrid_module_names[\"load\"]].item().state # state is negative, want positive values.\n        pv_state = self.microgrid.modules[self.microgrid_module_names[\"renewable\"]].item().state\n\n        try:\n            grid = self.microgrid.modules[self.microgrid_module_names[\"grid\"]].item()\n        except KeyError:\n            grid_status = np.zeros(self.horizon)\n            price_import = np.zeros(self.horizon)\n            price_export = np.zeros(self.horizon)\n            grid_co2_per_kwh = np.zeros(self.horizon)\n            cost_co2 = []\n\n            grid_max_import, grid_max_export = 0, 0\n        else:\n            grid_status = np.ones(self.horizon)\n\n            price_import = grid.import_price\n            price_export = grid.export_price\n            grid_co2_per_kwh = grid.co2_per_kwh\n            cost_co2 = [grid.cost_per_unit_co2]\n\n            grid_max_import, grid_max_export = grid.max_import, grid.max_export\n\n        try:\n            battery = self.microgrid.battery.item()\n        except AttributeError:\n            raise ValueError(f\"Microgrid {self.microgrid} has no battery.\")\n        else:\n            e_min = battery.min_soc\n            e_max = battery.max_soc\n            battery_max_charge = battery.max_charge\n            battery_max_discharge = battery.max_discharge\n\n            soc_0 = battery.soc\n\n        try:\n            genset = self.microgrid.modules[self.microgrid_module_names[\"genset\"]].item()\n        except KeyError:\n            genset_max_prod, genset_co2_per_kwh = None, None\n        else:\n            genset_max_prod = genset.running_max_production\n            genset_co2_per_kwh = genset.co2_per_unit\n            cost_co2.append(genset.cost_per_unit_co2)\n\n        cost_co2 = np.mean(cost_co2)\n\n        return (\n            load_state,\n            pv_state,\n            grid_status,\n            price_import,\n            price_export,\n            e_max,\n            e_min,\n            battery_max_charge,\n            battery_max_discharge,\n            grid_max_import,\n            grid_max_export,\n            soc_0,\n            genset_max_prod,\n            cost_co2,\n            grid_co2_per_kwh,\n            genset_co2_per_kwh\n        )\n\n    def mpc_single_step(self, sample, previous_output, current_step):\n        \"\"\"\n        :meta private:\n\n        Parameters\n        ----------\n        sample\n        previous_output\n        current_step\n\n        Returns\n        -------\n\n        \"\"\"\n\n        if not isinstance(previous_output, ControlOutput):\n            raise TypeError('previous_output must be ControlOutput, unless first_step is True')\n\n        # baseline_linprog_update_status = pd.DataFrame(previous_output['status'].iloc[-1].squeeze()).transpose()\n\n        horizon = self.microgrid.horizon\n\n        if self.microgrid.architecture['grid'] == 0:\n            temp_grid = np.zeros(horizon)\n            price_import = np.zeros(horizon)\n            price_export = np.zeros(horizon)\n            grid_co2 = np.zeros(horizon)\n            p_max_import = 0\n            p_max_export = 0\n        else:\n            temp_grid = sample.loc[current_step:current_step + horizon - 1, 'grid'].values\n            price_import = self.microgrid._grid_price_import.iloc[current_step:current_step + horizon].values\n            price_export = self.microgrid._grid_price_export.iloc[current_step:current_step + horizon].values\n            grid_co2 = self.microgrid._grid_co2.iloc[current_step:current_step + horizon].values\n            p_max_import = self.microgrid.parameters['grid_power_import'].values[0]\n            p_max_export = self.microgrid.parameters['grid_power_export'].values[0]\n\n            if temp_grid.shape != price_export.shape and price_export.shape != price_import.shape:\n                raise RuntimeError('I think this is a problem')\n\n        e_min = self.microgrid.parameters['battery_soc_min'].values[0]\n        e_max = self.microgrid.parameters['battery_soc_max'].values[0]\n        p_max_charge = self.microgrid.parameters['battery_power_charge'].values[0]\n        p_max_discharge = self.microgrid.parameters['battery_power_discharge'].values[0]\n        soc_0 = previous_output['status']['battery_soc'][-1]\n\n        cost_co2 = self.microgrid.parameters['cost_co2'].values[0]\n\n        if self.has_genset:\n            p_genset_max = self.microgrid.parameters['genset_pmax'].values[0] * \\\n                           self.microgrid.parameters['genset_rated_power'].values[0]\n            genset_co2 = self.microgrid.parameters['genset_co2'].values[0]\n        else:\n            p_genset_max = None\n            genset_co2 = 0\n\n        # Solve one step of MPC\n        control_dicts = self._set_and_solve(sample.loc[current_step:current_step + horizon - 1, 'load'].values,\n                                          sample.loc[current_step:current_step + horizon - 1, 'pv'].values, temp_grid, price_import,\n                                          price_export, e_max, e_min, p_max_charge, p_max_discharge, p_max_import,\n                                          p_max_export, soc_0, p_genset_max, cost_co2, grid_co2, genset_co2, iteration=current_step, return_steps=self.microgrid.horizon)\n\n        if any([d is None for d in control_dicts]):\n            for j, d in enumerate(control_dicts):\n                if d is None:\n                    raise TypeError('control_dict number {} is None'.format(j))\n\n        return HorizonOutput(control_dicts, self.microgrid, current_step)"
  },
  {
    "path": "src/pymgrid/algos/priority_list/__init__.py",
    "content": "from .priority_list_element import PriorityListElement\nfrom .priority_list import PriorityListAlgo\n"
  },
  {
    "path": "src/pymgrid/algos/priority_list/priority_list.py",
    "content": "import numpy as np\nimport pandas as pd\n\nfrom abc import abstractmethod\nfrom itertools import permutations\n\n\nfrom gym.spaces import Discrete\n\nfrom pymgrid.algos.priority_list import PriorityListElement as Element\nfrom pymgrid.modules import GensetModule\n\n\nclass PriorityListAlgo:\n    def get_priority_lists(self, remove_redundant_gensets):\n        \"\"\"\n        Get all of the priority lists for the microgrid.\n\n        A priority list is an order in which to deploy all of the controllable modules of the microgrid.\n\n        Returns\n        -------\n        priority_lists : list of list of :class:`.PriorityListElement`\n            List of all priority lists.\n\n        \"\"\"\n        controllable_sources = [Element(module.name, module.action_space.shape[0], n_actions, module.marginal_cost)\n                                for module in self.modules.controllable.sources.iterlist()\n                                for n_actions in range(module.action_space.shape[0])]\n\n        controllable_sources.extend([Element(module.name, module.action_space.shape[0], n_actions, module.marginal_cost)\n                                     for module in self.modules.controllable.source_and_sinks.iterlist()\n                                     for n_actions in range(module.action_space.shape[0])])\n\n        all_permutations = permutations(controllable_sources)\n        priority_lists = self._remove_redundant_actions(all_permutations, gensets=remove_redundant_gensets)\n\n        return priority_lists\n\n    def _remove_redundant_actions(self, priority_lists, gensets=False):\n        pls = []\n        for pl in priority_lists:\n            is_redundant = pd.DataFrame(el.module for el in pl).duplicated()\n            pls.append(tuple(el for j, el in enumerate(pl) if not is_redundant.iloc[j]))\n\n        unique_pls = list(dict.fromkeys(pls))\n\n        if gensets:\n            unique_pls = self._remove_redundant_gensets(unique_pls)\n\n        return unique_pls\n\n    def _remove_redundant_gensets(self, priority_lists):\n        redundant_genset_actions = []\n        for module_name, module_list in self.modules.iterdict():\n            for module_n, module in enumerate(module_list):\n                if isinstance(module, GensetModule):\n                    if module.running_min_production == 0:\n                        removable_element = Element(\n                            module=(module_name, module_n),\n                            module_actions=2,\n                            action=0,\n                            marginal_cost=module.marginal_cost\n                        )\n                        redundant_genset_actions.append(removable_element)\n\n        return [el for el in priority_lists if not any(redundant in el for redundant in redundant_genset_actions)]\n\n    def _populate_action(self, priority_list):\n        action = self.get_empty_action()\n        loads, total_load = self._get_load()\n        renewable = self._get_renewable()\n        assert total_load >= 0 and renewable >= 0\n\n        remaining_load = (total_load-renewable).item()\n\n        for element in priority_list:\n            module_name, module_number = element.module\n            total_module_actions = element.module_actions\n            module_action_number = element.action\n\n            module_to_deploy = self.modules[module_name][module_number]\n\n            if total_module_actions > 1:\n                if action[module_name][module_number] is not None:\n                    # Already hit this module in the priority list (as it has multiple elements)\n                    continue\n                else:\n                    action[module_name][module_number] = [module_action_number]\n\n            if np.isclose(remaining_load, 0.0, atol=1e-4):\n                # Don't need to do anything\n                module_energy = 0.0\n            elif remaining_load > 0:\n                # Need to produce\n                module_energy = self._produce_from_module(module_action_number, module_to_deploy, remaining_load)\n            else:\n                # Need to consume. These are sources and sources_and_sinks, so need to only use sources_and_sinks.\n                module_energy = self._consume_in_module(module_to_deploy, remaining_load)\n\n            try:\n                action[module_name][module_number].append(module_energy)\n            except AttributeError:\n                action[module_name][module_number] = module_energy\n\n            remaining_load -= module_energy\n\n            if total_module_actions > 1:\n                # If we have, e.g. a genset (with two actions)\n                action[module_name][module_number] = np.array(action[module_name][module_number])\n\n        bad_keys = [k for k, v in action.items() if v is None]\n        if len(bad_keys):\n            raise RuntimeError(f'None values found in action, corresponding to keys\\n\\t{bad_keys}')\n\n        return action\n\n    def _consume_in_module(self, module_to_deploy, remaining_load):\n        module_max_consumption = module_to_deploy.max_consumption\n\n        assert remaining_load <= 0.0\n\n        if module_to_deploy.is_sink:\n            assert module_max_consumption >= 0\n\n            if -1 * remaining_load > module_to_deploy.max_consumption:\n                # Can't consume it all\n                module_consumption = -1.0 * module_to_deploy.max_consumption\n            else:\n                # Can consume all\n                module_consumption = remaining_load\n        else:  # Not a sink\n            module_consumption = 0.0\n\n        assert module_consumption <= 0\n        return module_consumption\n\n    def _produce_from_module(self, module_action_number, module_to_deploy, remaining_load):\n        try:\n            max_production = module_to_deploy.next_max_production(module_action_number)\n            min_production = module_to_deploy.next_min_production(module_action_number)\n        except AttributeError:\n            max_production, min_production = module_to_deploy.max_production, module_to_deploy.min_production\n        if min_production <= remaining_load <= max_production:\n            # Module can meet demand\n            module_production = remaining_load\n        elif remaining_load < min_production:\n            # Module production too much\n            module_production = min_production\n        else:\n            # Module production not enough\n            module_production = max_production\n\n        assert module_production >= 0\n        return module_production\n\n    def _get_load(self):\n        loads = dict()\n        total_load = 0.0\n        for fixed_sink in self.fixed.sinks.iterlist():\n            loads[fixed_sink.name] = fixed_sink.max_consumption\n            total_load += fixed_sink.max_consumption\n\n        return loads, total_load\n\n    def _get_renewable(self):\n        return np.sum([flex_source.max_production for flex_source in self.flex.sources.iterlist()])\n\n    @property\n    @abstractmethod\n    def modules(self):\n        pass\n\n    @property\n    @abstractmethod\n    def fixed(self):\n        pass\n\n    @property\n    @abstractmethod\n    def flex(self):\n        pass\n\n    @abstractmethod\n    def get_empty_action(self):\n        pass\n"
  },
  {
    "path": "src/pymgrid/algos/priority_list/priority_list_element.py",
    "content": "from dataclasses import dataclass\nfrom functools import total_ordering\nfrom typing import Tuple, Optional\n\n\n@total_ordering\n@dataclass(frozen=True)\nclass PriorityListElement:\n    \"\"\"\n    A dataclass that acts as a representation of a module's position in a deployment order.\n\n    Used in :class:`.RuleBasedControl` and :class:`.DiscreteMicrogridEnv` to define actions given a specific order\n    of module deployment.\n\n    In :class:`.RuleBasedControl`, one list of these elements is used at every step to define actions.\n\n    In :class:`.DiscreteMicrogridEnv`, each action in the environment's action space corresponds to a distinct priority\n    list.\n\n    See :attr:`.PriorityListElement.module_actions` and :attr:`.PriorityListElement.action` for further details\n    of how these elements are incorporated in algorithms.\n\n    \"\"\"\n\n    module: Tuple[str, int]\n    \"\"\"\n    Module name.\n    \"\"\"\n\n    module_actions: int\n    \"\"\"\n    Number of possible action classes.\n    \n    * If one, actions generated with this element will be scalar.\n    \n    * If greater than one, actions generated this element will be a length-2 array. The first element\n      is the action number (defined by `action`) and the second is a float corresponding to the scalar case.\n      \n      See :attr:`.PriorityListElement.action` for additional details.\n\n    \"\"\"\n\n    action: int\n    \"\"\"\n    Action number in {0, ..., :attr:`.PriorityListElement.module_actions`-1}.\n\n    This is most relevant to :class:`GensetModule<pymgrid.modules.GensetModule>` and other elements with an action space\n    with more than one dimension.\n    \n    Specifically, :class:`GensetModules<pymgrid.modules.GensetModule>` have a two-dimensional action space: \n    the first element defines whether to turn the module on or off, and the second is an amount of energy to draw -- \n    assuming the module is on. See :meth:`.GensetModule.step` and :meth:`.GensetModule.update_status` for details.\n    \"\"\"\n\n    marginal_cost: Optional[float] = None\n    \"\"\"\n    Marginal cost of using the module.\n    \n    Defines an ordering on elements.\n    \"\"\"\n\n    def __eq__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n\n        return (\n                self.module == other.module and\n                self.module_actions == other.module_actions and\n                self.action == other.action and\n                self.marginal_cost == other.marginal_cost\n        )\n\n    def __lt__(self, other):\n        if type(self) != type(other) or self.marginal_cost is None or other.marginal_cost is None:\n            return NotImplemented\n\n        return (\n                self.marginal_cost < other.marginal_cost or\n                (self.marginal_cost == other.marginal_cost and self.action > other.action)\n        )\n"
  },
  {
    "path": "src/pymgrid/algos/rbc/__init__.py",
    "content": ""
  },
  {
    "path": "src/pymgrid/algos/rbc/_nonmodular_rbc.py",
    "content": "import operator\nimport sys\nfrom copy import deepcopy\n\nfrom pymgrid.algos.Control import ControlOutput\n\n\nclass NonModularRuleBasedControl:\n    def __init__(self, microgrid):\n        # if not isinstance(microgrid, Microgrid.Microgrid):\n        #     raise TypeError('microgrid must be of type Microgrid, is {}'.format(type(microgrid)))\n\n        self.microgrid = microgrid\n\n    def _generate_priority_list(self, architecture, parameters, grid_status=0, price_import=0, price_export=0):\n        \"\"\"\n        Depending on the architecture of the microgrid and grid related import/export costs, this function generates a\n        priority list to be run in the rule based benchmark.\n        \"\"\"\n        # compute marginal cost of each resource\n        # construct priority list\n        # should receive fuel cost and cost curve, price of electricity\n        if architecture['grid'] == 1:\n\n            if price_export / (parameters['battery_efficiency'].values[0]**2) < price_import:\n\n                # should return something like ['gen', starting at in MW]?\n                priority_dict = {'PV': 1 * architecture['PV'],\n                                 'battery': 2 * architecture['battery'],\n                                 'grid': int(3 * architecture['grid'] * grid_status),\n                                 'genset': 4 * architecture['genset']}\n\n            else:\n                # should return something like ['gen', starting at in MW]?\n                priority_dict = {'PV': 1 * architecture['PV'],\n                                 'battery': 3 * architecture['battery'],\n                                 'grid': int(2 * architecture['grid'] * grid_status),\n                                 'genset': 4 * architecture['genset']}\n\n        else:\n            priority_dict = {'PV': 1 * architecture['PV'],\n                             'battery': 2 * architecture['battery'],\n                             'grid': 0,\n                             'genset': 4 * architecture['genset']}\n\n        return priority_dict\n\n    def _run_priority_based(self, load, pv, parameters, status, priority_dict):\n        \"\"\"\n        This function runs one loop of rule based control, based on a priority list, load and pv, dispatch the\n        generators\n\n        Parameters\n        ----------\n        load: float\n            Demand value\n        PV: float\n            PV generation\n        parameters: dataframe\n            The fixed parameters of the mircrogrid\n        status: dataframe\n            The parameters of the microgrid changing with time.\n        priority_dict: dictionnary\n            Dictionnary representing the priority with which run each generator.\n\n        \"\"\"\n\n        temp_load = load\n        excess_gen = 0\n\n        p_charge = 0\n        p_discharge = 0\n        p_import = 0\n        p_export = 0\n        p_genset = 0\n        load_not_matched = 0\n        pv_not_curtailed = 0\n        self_consumed_pv = 0\n\n\n        sorted_priority = priority_dict\n        min_load = 0\n        if self.microgrid.architecture['genset'] == 1:\n            #load - pv - min(capa_to_discharge, p_discharge) > 0: then genset on and min load, else genset off\n            grid_first = 0\n            capa_to_discharge = max(min((status['battery_soc'][-1] *\n                                     parameters['battery_capacity'].values[0]\n                                     - parameters['battery_soc_min'].values[0] *\n                                     parameters['battery_capacity'].values[0]\n                                     ) * parameters['battery_efficiency'].values[0], self.microgrid.battery.p_discharge_max), 0)\n\n            if self.microgrid.architecture['grid'] == 1 and sorted_priority['grid'] < sorted_priority['genset'] and sorted_priority['grid']>0:\n                grid_first=1\n\n            if temp_load > pv + capa_to_discharge and grid_first ==0:\n\n                min_load = self.microgrid.parameters['genset_rated_power'].values[0] * self.microgrid.parameters['genset_pmin'].values[0]\n                if min_load <= temp_load:\n                    temp_load = temp_load - min_load\n                else:\n                    temp_load = min_load\n                    priority_dict = {'PV': 0,\n                                     'battery': 0,\n                                     'grid': 0,\n                                     'genset': 1}\n\n        sorted_priority = sorted(priority_dict.items(), key=operator.itemgetter(1))\n        # for gen with prio i in 1:max(priority_dict)\n        # we sort the priority list\n        # probably we should force the PV to be number one, the min_power should be absorbed by genset, grid?\n        # print (sorted_priority)\n        for gen, priority in sorted_priority:  # .iteritems():\n\n            if priority > 0:\n\n                if gen == 'PV':\n                    self_consumed_pv = min(temp_load, pv)  # self.maximum_instantaneous_pv_penetration,\n                    temp_load = max(0, temp_load - self_consumed_pv)\n                    excess_gen = pv - self_consumed_pv\n                    pv_not_curtailed = pv_not_curtailed + pv - excess_gen\n\n                if gen == 'battery':\n\n                    capa_to_charge = max(\n                        (parameters['battery_soc_max'].values[0] * parameters['battery_capacity'].values[0] -\n                         status['battery_soc'][-1] *\n                         parameters['battery_capacity'].values[0]\n                         ) / self.microgrid.parameters['battery_efficiency'].values[0], 0)\n                    capa_to_discharge = max((status['battery_soc'][-1] *\n                                             parameters['battery_capacity'].values[0]\n                                             - parameters['battery_soc_min'].values[0] *\n                                             parameters['battery_capacity'].values[0]\n                                             ) * parameters['battery_efficiency'].values[0], 0)\n                    if temp_load > 0:\n                        p_discharge = max(0, min(capa_to_discharge, parameters['battery_power_discharge'].values[0],\n                                                temp_load))\n                        temp_load = temp_load - p_discharge\n\n                    elif excess_gen > 0:\n                        p_charge = max(0, min(capa_to_charge, parameters['battery_power_charge'].values[0],\n                                             excess_gen))\n                        excess_gen = excess_gen - p_charge\n\n                        pv_not_curtailed = pv_not_curtailed + p_charge\n\n                if gen == 'grid':\n                    if temp_load > 0:\n                        p_import = temp_load\n                        temp_load = 0\n\n\n\n                    elif excess_gen > 0:\n                        p_export = excess_gen\n                        excess_gen = 0\n\n                        pv_not_curtailed = pv_not_curtailed + p_export\n\n                if gen == 'genset':\n                    if temp_load > 0:\n                        p_genset = temp_load + min_load\n                        temp_load = 0\n                        min_load = 0\n\n        if temp_load > 0:\n            load_not_matched = 1\n\n        control_dict = {'battery_charge': p_charge,\n                        'battery_discharge': p_discharge,\n                        'genset': p_genset,\n                        'grid_import': p_import,\n                        'grid_export': p_export,\n                        'loss_load': load_not_matched,\n                        'pv_consummed': pv_not_curtailed,\n                        'pv_curtailed': pv - pv_not_curtailed,\n                        'load': load,\n                        'pv': pv}\n\n        return control_dict\n\n    def run_rule_based(self, priority_list=0, length=None):\n\n        \"\"\" This function runs the rule based benchmark over the datasets (load and pv profiles) in the microgrid.\"\"\"\n\n        baseline_priority_list_action = deepcopy(self.microgrid._df_record_control_dict)\n        baseline_priority_list_update_status = deepcopy(self.microgrid._df_record_state)\n        baseline_priority_list_record_production = deepcopy(self.microgrid._df_record_actual_production)\n        baseline_priority_list_cost = deepcopy(self.microgrid._df_record_cost)\n        baseline_priority_list_co2 = deepcopy(self.microgrid._df_record_co2)\n\n        if length is None or length >= self.microgrid._data_length:\n            length = self.microgrid._data_length-1\n\n        n = length - self.microgrid.horizon\n        print_ratio = n/100\n\n        for i in range(length - self.microgrid.horizon):\n\n            e = i\n\n            if e == (n-1):\n\n               e = n\n\n            e = e/print_ratio\n\n            sys.stdout.write(\"\\rIn Progress %d%% \" % e)\n            sys.stdout.flush()\n\n            if e == 100:\n\n                sys.stdout.write(\"\\nRules Based Calculation Finished\")\n                sys.stdout.flush()\n                sys.stdout.write(\"\\n\")\n\n\n            if self.microgrid.architecture['grid'] == 1:\n                priority_dict = self._generate_priority_list(self.microgrid.architecture, self.microgrid.parameters,\n                                                             self.microgrid._grid_status_ts.iloc[i].values[0],\n                                                             self.microgrid._grid_price_import.iloc[i].values[0],\n                                                             self.microgrid._grid_price_export.iloc[i].values[0])\n            else:\n                priority_dict = self._generate_priority_list(self.microgrid.architecture, self.microgrid.parameters)\n\n            control_dict = self._run_priority_based(self.microgrid._load_ts.iloc[i].values[0], self.microgrid._pv_ts.iloc[i].values[0],\n                                                    self.microgrid.parameters,\n                                                    baseline_priority_list_update_status, priority_dict)\n\n            baseline_priority_list_action = self.microgrid._record_action(control_dict,\n                                                                      baseline_priority_list_action)\n\n            baseline_priority_list_record_production = self.microgrid._record_production(control_dict,\n                                                                                     baseline_priority_list_record_production,\n                                                                                     baseline_priority_list_update_status)\n\n\n            if self.microgrid.architecture['grid']==1:\n\n                baseline_priority_list_co2 = self.microgrid._record_co2(\n                    {i: baseline_priority_list_record_production[i][-1] for i in baseline_priority_list_record_production},\n                    baseline_priority_list_co2,\n                    self.microgrid._grid_co2.iloc[i].values[0],\n                )\n\n                baseline_priority_list_update_status = self.microgrid._update_status(\n                    {i: baseline_priority_list_record_production[i][-1] for i in baseline_priority_list_record_production},\n                    baseline_priority_list_update_status, self.microgrid._load_ts.iloc[i + 1].values[0],\n                    self.microgrid._pv_ts.iloc[i + 1].values[0],\n                    self.microgrid._grid_status_ts.iloc[i + 1].values[0],\n                    self.microgrid._grid_price_import.iloc[i + 1].values[0],\n                    self.microgrid._grid_price_export.iloc[i + 1].values[0],\n                    self.microgrid._grid_co2.iloc[i + 1].values[0],\n                )\n\n\n                baseline_priority_list_cost = self.microgrid._record_cost(\n                    {i: baseline_priority_list_record_production[i][-1] for i in\n                     baseline_priority_list_record_production},\n                    baseline_priority_list_cost,\n                    baseline_priority_list_co2,\n                    self.microgrid._grid_price_import.iloc[i,0], self.microgrid._grid_price_export.iloc[i,0])\n            else:\n\n                baseline_priority_list_co2 = self.microgrid._record_co2(\n                    {i: baseline_priority_list_record_production[i][-1] for i in\n                     baseline_priority_list_record_production},\n                     baseline_priority_list_co2,\n                )\n\n                baseline_priority_list_update_status = self.microgrid._update_status(\n                    {i: baseline_priority_list_record_production[i][-1] for i in\n                     baseline_priority_list_record_production},\n                    baseline_priority_list_update_status, self.microgrid._load_ts.iloc[i + 1].values[0],\n                    self.microgrid._pv_ts.iloc[i + 1].values[0])\n\n                baseline_priority_list_cost = self.microgrid._record_cost(\n                    {i: baseline_priority_list_record_production[i][-1] for i in\n                     baseline_priority_list_record_production},\n                    baseline_priority_list_cost,\n                    baseline_priority_list_co2)\n\n        names = ('action', 'status', 'production', 'cost', 'co2')\n\n        dfs = (baseline_priority_list_action, baseline_priority_list_update_status,\n               baseline_priority_list_record_production, baseline_priority_list_cost, baseline_priority_list_co2)\n\n        return ControlOutput(names, dfs, 'rbc')"
  },
  {
    "path": "src/pymgrid/algos/rbc/rbc.py",
    "content": "from copy import deepcopy\nfrom tqdm import tqdm\n\nfrom pymgrid.algos.priority_list import PriorityListAlgo\n\n\nclass RuleBasedControl(PriorityListAlgo):\n    \"\"\"\n\n    Run a rule-based (heuristic) control algorithm on a microgrid.\n\n    In rule-based control, modules are deployed in a preset order. You can either define this order by passing a\n    priority list or the order will be defined automatically from the module with the lowest marginal cost to the\n    highest.\n\n    Parameters\n    ----------\n    microgrid : :class:`pymgrid.Microgrid`\n        Microgrid on which to run rule-based control.\n\n    priority_list : list of :class:`.PriorityListElement` or None, default None.\n        Priority list to use. If None, the order will be defined automatically from the module with the lowest marginal\n        cost to the highest.\n\n    \"\"\"\n    def __init__(self, microgrid, priority_list=None, remove_redundant_gensets=True):\n        super().__init__()\n        self._microgrid = deepcopy(microgrid)\n        self._priority_list = self._get_priority_list(priority_list, remove_redundant_gensets)\n\n    def _get_priority_list(self, priority_list, remove_redundant_gensets):\n        \"\"\"\n        Given a microgrid, return the optimal order of module deployment.\n        \"\"\"\n        priority_lists = self.get_priority_lists(remove_redundant_gensets=remove_redundant_gensets)\n\n        if priority_list is None:\n            return sorted(priority_lists[0])\n\n        if priority_list not in priority_lists:\n            raise ValueError('Invalid priority list. Use RuleBasedControl.get_priority_lists to view all '\n                             'valid priority lists.')\n\n        return priority_list\n\n    def _get_action(self):\n        \"\"\"\n        Given the priority list, define an action.\n        \"\"\"\n        return self._populate_action(self._priority_list)\n\n    def reset(self):\n        \"\"\"\n        Reset the underlying microgrid.\n\n        Returns\n        -------\n        obs : dict[str, list[float]]\n            Observations from resetting the modules as well as the flushed balance log.\n\n        \"\"\"\n        return self._microgrid.reset()\n\n    def run(self, max_steps=None, verbose=False):\n        \"\"\"\n        Get the priority list and then deploy on the microgrid for some number of steps.\n\n        Parameters\n        ---------\n        max_steps : int or None, default None\n            Maximum number of RBC steps. If None, run until the microgrid terminates.\n\n        verbose : bool, default False\n            Whether to display a progress bar.\n\n        Returns\n        -------\n        log : pd.DataFrame\n            Results of running the rule-based control algorithm.\n\n        \"\"\"\n        if max_steps is None:\n            max_steps = len(self.microgrid)\n\n        self.reset()\n\n        for _ in tqdm(range(max_steps), desc=\"RBC Progress\", disable=(not verbose)):\n            action = self._get_action()\n            _, _, done, _ = self._microgrid.run(action, normalized=False)\n            if done:\n                break\n\n        return self._microgrid.get_log(as_frame=True)\n\n    def get_empty_action(self):\n        \"\"\"\n        :meta private:\n        \"\"\"\n        return self._microgrid.get_empty_action()\n\n    @property\n    def microgrid(self):\n        \"\"\"\n        View of the microgrid.\n\n        Returns\n        -------\n        microgrid : :class:`pymgrid.Microgrid`\n            The microgrid that RBC is being run on.\n\n        \"\"\"\n        return self._microgrid\n\n    @property\n    def fixed(self):\n        \"\"\":meta private:\"\"\"\n        return self._microgrid.fixed\n\n    @property\n    def flex(self):\n        \"\"\":meta private:\"\"\"\n        return self._microgrid.flex\n\n    @property\n    def modules(self):\n        \"\"\":meta private:\"\"\"\n        return self._microgrid.modules\n\n    @property\n    def priority_list(self):\n        \"\"\"\n        Order in which to deploy controllable modules.\n\n        Returns\n        -------\n        priority_list: list of :class:`.PriorityListElement`\n            Priority list.\n\n        \"\"\"\n        return self._priority_list\n"
  },
  {
    "path": "src/pymgrid/algos/saa/__init__.py",
    "content": "from .saa import SampleAverageApproximation"
  },
  {
    "path": "src/pymgrid/algos/saa/saa.py",
    "content": "import time\n\nimport numpy as np\nimport pandas as pd\nfrom pymgrid.algos.Control import ControlOutput\nfrom pymgrid.utils.DataGenerator import SampleGenerator\nfrom pymgrid.algos import ModelPredictiveControl\n\n\nclass SampleAverageApproximation(SampleGenerator):\n    \"\"\"\n    A class to run a Sample Average Approximation version of Stochastic MPC.\n\n    Parameters\n\n        microgrid: pymgrid.Microgrid.Microgrid\n            the underlying microgrid\n        control_duration: int\n            number of iterations to learn over\n\n    Attributes:\n\n        microgrid: pymgrid.Microgrid.Microgrid\n            the underlying microgrid\n        control_duration: int\n            number of iterations to learn over\n        mpc: algos.Control.ModelPredictiveControl\n            An instance of MPC class to run MPC over for each sample\n        NPV: utils.DataGenerator.NoisyPVData\n            An instance of NoisyPVData to produce pv forecast and samples\n        NL: utils.DataGenerator.NoisyLoadData\n            An instance of NoisyLoadData to produce initial load forecast\n        NG: utils.DataGenerator.NoisyGridData or None\n            An instance of NoisyGridData to produce initial grid forecast. None if there is no grid\n        forecasts: pd.DataFrame, shape (8760,3)\n            load, pv, grid forecasts. See create_forecasts for details.\n        samples: list of pd.DataFrame of shape (8760,3), or None\n            list of samples created from sampling from distributions defined in forecasts.\n                See sample_from_forecasts for details. None if sample_from_forecasts hasn't been called\n    \"\"\"\n    def __init__(self, microgrid, control_duration=8760, **forecast_args):\n        if control_duration > 8760:\n            raise ValueError('control_duration must be less than 8760')\n\n        # if not isinstance(microgrid, Microgrid.Microgrid):\n        #     raise TypeError('microgrid must be of type \\'pymgrid.Microgrid.Microgrid\\', is {}'.format(type(microgrid)))\n\n        super().__init__(microgrid, **forecast_args)\n        self.control_duration = control_duration\n        self.mpc = ModelPredictiveControl(self.microgrid)\n\n    def run(self, n_samples=10, forecast_steps=None, optimal_percentile=0.5, use_previous_samples=True, verbose=False, **kwargs):\n        \"\"\"\n        Runs MPC over a number of samples for to average out for SAA\n        :param n_samples: int, default 25\n            number of samples to run\n        :param forecast_steps: int or None, default None\n            number of steps to use in forecast. If None, uses 8760-self.horizon\n        :param use_previous_samples: bool, default True\n            whether to use previous previous stored in self.samples if they are available\n        :param verbose: bool, default False\n            verbosity\n        :return:\n            outputs, list of ControlOutput\n                list of ControlOutputs for each sample. See ControlOutput or run_mpc_on_sample for details.\n        \"\"\"\n        if self.samples is None or not use_previous_samples:\n            self.samples = self.sample_from_forecasts(n_samples=n_samples, **kwargs)\n\n        outputs = []\n\n        t0 = time.time()\n\n        output = self.run_mpc_on_group(self.samples, forecast_steps=forecast_steps,\n                                        optimal_percentile=optimal_percentile, verbose=verbose)\n\n        if verbose:\n            print('Running time: {}'.format(round(time.time()-t0)))\n\n        return output\n\n    def determine_optimal_actions(self, outputs=None, percentile=0.5, verbose=False):\n        \"\"\"\n        Given a list of samples from run(), determines which one has cost at the percentile in percentile.\n\n        :param outputs: list of ControlOutput\n            list of ControlOutputs from run()\n        :param percentile: float, default 0.5\n            which percentile to return as optimal.\n        :return:\n            optimal_output, ControlOutput\n                output at optimal percentile\n        \"\"\"\n        if percentile < 0. or percentile > 1.:\n            raise ValueError('percentile must be in [0,1]')\n\n        partition_val = int(np.floor(len(outputs)*percentile))\n        partition = np.partition(outputs, partition_val)\n\n        if verbose:\n            sorted_outputs = np.sort(outputs)\n            selected_output = partition[partition_val]\n            print()\n            for j, output in enumerate(sorted_outputs):\n                print('Output {}, cost: {}, battery charge {}, discharge {}:'.format(\n                    j, round(output.cost,2) , round(output.first_dict['battery_charge'],2), round(output.first_dict['battery_discharge'],2)))\n                if output is selected_output:\n                    print('Selected output {} with percentile {}'.format(j, percentile))\n\n        return partition[partition_val]\n\n    def run_mpc_on_group(self, samples, forecast_steps=None, optimal_percentile=0.5, verbose=False):\n        columns_needed = ('pv', 'load', 'grid')\n\n        output = ControlOutput(alg_name='saa', empty=True, microgrid=self.microgrid)\n\n        T = min([len(sample) for sample in samples])\n        if forecast_steps is None:\n            forecast_steps = T-self.microgrid.horizon\n        elif forecast_steps>T-self.microgrid.horizon:\n            raise ValueError('forecast steps must be less than length of samples minus horizon')\n\n        for j in range(forecast_steps):\n            if verbose:\n                print('iter {}'.format(j))\n\n            horizon_outputs = []\n\n            for sample in samples:\n                if not isinstance(sample, pd.DataFrame):\n                    raise TypeError('samples must be pd.DataFrame')\n                if not all([needed in sample.columns.values for needed in columns_needed]):\n                    raise KeyError('samples must contain columns {}, currently contains {}'.format(\n                        columns_needed, sample.columns.values))\n\n                sample.iloc[j] = self.underlying_data.iloc[j]  # overwrite with actual data\n\n                horizon_output = self.mpc.mpc_single_step(sample, output, j)\n\n                horizon_outputs.append(horizon_output)\n\n            # return horizon_outputs\n\n            optimal_output = self.determine_optimal_actions(outputs=horizon_outputs, percentile=optimal_percentile)\n            output.append(optimal_output, actual_load=self.underlying_data.loc[j,'load'],\n                          actual_pv=self.underlying_data.loc[j,'pv'],\n                          actual_grid=self.underlying_data.loc[j,'grid'])\n\n        return output\n\n    def run_deterministic_on_forecast(self, forecast_steps=None, verbose=False):\n\n        sample = self.forecasts.copy()\n        output = ControlOutput(alg_name='mpc', empty=True, microgrid=self.microgrid)\n\n        T = len(sample)\n\n        if forecast_steps is None:\n            forecast_steps = T - self.microgrid.horizon\n        elif forecast_steps > T - self.microgrid.horizon:\n            raise ValueError('forecast steps must be less than length of samples minus horizon')\n\n        for j in range(forecast_steps):\n            if verbose:\n                print('iter {}'.format(j))\n\n                sample.iloc[j] = self.underlying_data.iloc[j]  # overwrite with actual data\n\n                horizon_output = self.mpc.mpc_single_step(sample, output, j)\n\n                output.append(horizon_output)\n\n            return output"
  },
  {
    "path": "src/pymgrid/convert/__init__.py",
    "content": ""
  },
  {
    "path": "src/pymgrid/convert/convert.py",
    "content": "from pymgrid._deprecated.non_modular_microgrid import NonModularMicrogrid\nfrom pymgrid.microgrid.microgrid import Microgrid\nfrom pymgrid.convert.get_module import get_module\nfrom pymgrid.convert.to_nonmodular_ops import check_viability, add_params_from_module, get_empty_params, finalize_params\n\n\ndef to_modular(nonmodular, raise_errors=False):\n    modules = [('load', get_module('load', nonmodular, raise_errors)),\n               ('unbalanced_energy', get_module('unbalanced_energy', nonmodular, raise_errors))]\n    for component, exists in nonmodular.architecture.items():\n        if exists:\n            module = get_module(component, nonmodular, raise_errors)\n            modules.append((component, module))\n    return Microgrid(modules, add_unbalanced_module=False)\n\n\ndef to_nonmodular(modular):\n    \"\"\"\n    microgrid_params needs to contain the following:\n        parameters: ('DataFrame', (1, 16))\n        df_actions: ('dict', {'load': [], 'pv_consummed': [], 'pv_curtailed': [], 'pv': [], 'battery_charge': [], 'battery_discharge': [], 'grid_import': [], 'grid_export': []})\n        architecture: ('dict', {'PV': 1, 'battery': 1, 'genset': 0, 'grid': 1})\n        df_status: ('dict', {'load': [304.4], 'hour': [0], 'pv': [0.0], 'battery_soc': [0.2], 'capa_to_charge': [1290.7], 'capa_to_discharge': [0.0], 'grid_status': [1.0], 'grid_co2': [0.23975790800000002], 'grid_price_import': [0.22], 'grid_price_export': [0.0]})\n        df_actual_generation: ('dict', {'loss_load': [], 'overgeneration': [], 'pv_consummed': [], 'pv_curtailed': [], 'battery_charge': [], 'battery_discharge': [], 'grid_import': [], 'grid_export': []})\n        grid_spec: ('int', 0)\n        df_cost: ('dict', {'loss_load': [], 'overgeneration': [], 'co2': [], 'battery': [], 'grid_import': [], 'grid_export': [], 'total_cost': []})\n        df_co2: ('dict', {'co2': []})\n        pv: ('DataFrame', (8760, 1))\n        load: ('DataFrame', (8760, 1))\n        grid_ts: ('DataFrame', (8760, 1))\n        control_dict: ('list', ['load', 'pv_consummed', 'pv_curtailed', 'pv', 'battery_charge', 'battery_discharge', 'grid_import', 'grid_export'])\n        grid_price_import: ('DataFrame', (8760, 1))\n        grid_price_export: ('DataFrame', (8760, 1))\n        grid_co2: ('DataFrame', (8760, 1))\n    :param modular:\n    :return:\n    \"\"\"\n    check_viability(modular)\n    microgrid_params = get_empty_params()\n    for _, module_list in modular.modules.iterdict():\n        add_params_from_module(module_list[0], microgrid_params)\n    finalize_params(microgrid_params)\n    return NonModularMicrogrid(parameters=microgrid_params, horizon=modular.get_forecast_horizon() + 1)\n"
  },
  {
    "path": "src/pymgrid/convert/get_module.py",
    "content": "import pandas as pd\nfrom pymgrid.modules import LoadModule, RenewableModule, BatteryModule, GridModule, GensetModule, UnbalancedEnergyModule\n\n\ndef get_module(component, nonmodular, raise_errors):\n    if component == 'load':\n        return get_load_module(nonmodular, raise_errors)\n    elif component == 'PV':\n        return get_pv_module(nonmodular, raise_errors)\n    elif component == 'battery':\n        return get_battery_module(nonmodular, raise_errors)\n    elif component == 'genset':\n        return get_genset_module(nonmodular, raise_errors)\n    elif component == 'grid':\n        return get_grid_module(nonmodular, raise_errors)\n    elif component == 'unbalanced_energy':\n        return get_unbalanced_energy_module(nonmodular, raise_errors)\n    else:\n        raise ValueError(f'Cannot parse component {component}.')\n\n\ndef get_load_module(nonmodular, raise_errors):\n    time_series = nonmodular._load_ts\n    return LoadModule(time_series=time_series,\n                      forecaster='oracle',\n                      forecast_horizon=nonmodular.horizon-1,\n                      raise_errors=raise_errors)\n\n\ndef get_pv_module(nonmodular, raise_errors):\n    time_series = nonmodular._pv_ts\n    return RenewableModule(time_series=time_series,\n                           raise_errors=raise_errors,\n                           forecaster='oracle',\n                           forecast_horizon=nonmodular.horizon-1\n                           )\n\n\ndef get_battery_module(nonmodular, raise_errors):\n    battery = nonmodular.battery\n    max_capacity = battery.capacity\n    min_capacity = max_capacity*battery.soc_min\n    max_charge = battery.p_charge_max\n    max_discharge = battery.p_discharge_max\n    efficiency = battery.efficiency\n    battery_cost_cycle = battery.cost_cycle\n    init_soc = battery.soc\n    return BatteryModule(min_capacity=min_capacity,\n                         max_capacity=max_capacity,\n                         max_charge=max_charge,\n                         max_discharge=max_discharge,\n                         efficiency=efficiency,\n                         battery_cost_cycle=battery_cost_cycle,\n                         init_soc=init_soc,\n                         raise_errors=raise_errors)\n\n\ndef get_genset_module(nonmodular, raise_errors):\n    genset = nonmodular.genset\n    min_production = genset.p_min*genset.rated_power\n    max_production = genset.p_max*genset.rated_power\n    genset_cost = genset.fuel_cost\n    co2_per_unit = nonmodular.parameters.genset_co2.item()\n    cost_per_unit_co2 = nonmodular.parameters.cost_co2.item()\n    return GensetModule(running_min_production=min_production,\n                        running_max_production=max_production,\n                        genset_cost=genset_cost,\n                        co2_per_unit=co2_per_unit,\n                        cost_per_unit_co2=cost_per_unit_co2,\n                        start_up_time=0,\n                        wind_down_time=0,\n                        raise_errors=raise_errors)\n\n\ndef get_grid_module(nonmodular, raise_errors):\n    max_import = nonmodular.grid.power_import\n    max_export = nonmodular.grid.power_export\n    cost_per_unit_co2 = nonmodular.parameters.cost_co2.item()\n\n    cost_import = nonmodular._grid_price_import.squeeze()\n    cost_import.name = 'cost_import'\n    cost_export = nonmodular._grid_price_export.squeeze()\n    cost_export.name = 'cost_export'\n    co2_per_unit = nonmodular._grid_co2.squeeze()\n    co2_per_unit.name = 'co2_per_unit_production'\n    grid_status = nonmodular._grid_status_ts.squeeze()\n    grid_status.name = 'grid_status'\n    time_series = pd.concat([cost_import, cost_export, co2_per_unit, grid_status], axis=1)\n\n    return GridModule(max_import=max_import,\n                      max_export=max_export,\n                      time_series=time_series,\n                      forecaster='oracle',\n                      forecast_horizon=nonmodular.horizon - 1,\n                      cost_per_unit_co2=cost_per_unit_co2,\n                      raise_errors=raise_errors)\n\n\ndef get_unbalanced_energy_module(nonmodular, raise_errors):\n    return UnbalancedEnergyModule(raise_errors=raise_errors,\n                                  loss_load_cost=nonmodular.parameters['cost_loss_load'].item(),\n                                  overgeneration_cost=nonmodular.parameters['cost_overgeneration'].item()\n                                  )"
  },
  {
    "path": "src/pymgrid/convert/to_nonmodular_ops.py",
    "content": "from pymgrid.modules import LoadModule, RenewableModule, BatteryModule, GridModule, GensetModule, UnbalancedEnergyModule\nfrom copy import deepcopy\nimport pandas as pd\nimport numpy as np\nfrom warnings import warn\n\n_empty_params = dict(parameters=dict(),\n                     df_actions=dict(),\n                     architecture=dict(PV=0, battery=0, genset=0, grid=0),\n                     df_status=dict(hour=[0]),\n                     df_actual_generation=dict(loss_load=[], overgeneration=[]),\n                     df_cost=dict(loss_load=[], overgeneration=[], total_cost=[]),\n                     df_co2=dict(co2=[]),\n                     pv=None,\n                     load=None,\n                     grid_ts=None,\n                     control_dict=[],\n                     grid_price_import=None,\n                     grid_price_export=None,\n                     grid_co2=None,\n                    )\n\n\ndef get_empty_params():\n    return deepcopy(_empty_params)\n\n\ndef check_viability(modular):\n    classes = LoadModule, RenewableModule, BatteryModule, GridModule, GensetModule, UnbalancedEnergyModule\n    classes_str = '\\n'.join([str(x) for x in classes])\n    n_modules_by_cls = dict(zip(classes, [0]*len(classes)))\n\n    for name, module_list in modular.modules.iterdict():\n        if len(module_list) > 1:\n            raise ValueError('Cannot convert modular microgrid with multiple modules of same type. '\n                         f'The following module name has multiple modules: {name}')\n\n        module = module_list[0]\n        if not isinstance(module, classes):\n            raise TypeError(f'Unable to parse module {name} of type {module.__class__.__name__}.'\n                            f'Must be one of:\\n{classes_str}')\n\n        n_modules_by_cls[module.__class__] += 1\n\n    invalid = []\n    for cls, n_modules in n_modules_by_cls.items():\n        if n_modules > 1:\n            invalid.append((cls, n_modules))\n\n    if len(invalid):\n        raise ValueError('Cannot convert modular microgrid with multiple modules of same type. '\n                         f'The following module types conflict: {invalid}')\n\n    if n_modules_by_cls[LoadModule] != 1:\n        raise ValueError('Cannot convert modular microgrid that has no LoadModule.')\n\n\ndef finalize_params(params_dict):\n    params_dict['parameters'] = pd.DataFrame(params_dict['parameters'])\n\n\ndef add_params_from_module(module, params_dict):\n    if isinstance(module, LoadModule):\n        add_load_params(module, params_dict)\n    elif isinstance(module, RenewableModule):\n        add_pv_params(module, params_dict)\n    elif isinstance(module, BatteryModule):\n        add_battery_params(module, params_dict)\n    elif isinstance(module, GridModule):\n        add_grid_params(module, params_dict)\n    elif isinstance(module, GensetModule):\n        add_genset_params(module, params_dict)\n    elif isinstance(module, UnbalancedEnergyModule):\n        add_unbalanced_energy_params(module, params_dict)\n    else:\n        raise ValueError(f'Cannot parse module {module}.')\n\n\ndef add_load_params(load_module, params_dict):\n    params_dict['load'] = pd.DataFrame(load_module.time_series)\n    _add_to_parameters(params_dict,\n                       load=-1 * load_module.min_act)\n    _add_to_control_dict(params_dict, 'load')\n    _add_to_df_actual_generation(params_dict, 'loss_load')\n    _add_to_df_actions(params_dict, 'load')\n    _add_to_df_status(params_dict, load=round(load_module.current_load, 1))\n\n\ndef add_pv_params(pv_module, params_dict):\n    params_dict['pv'] = pd.DataFrame(pv_module.time_series)\n    _add_to_architecture(params_dict, 'PV')\n    _add_to_parameters(params_dict, PV_rated_power=pv_module.max_act)\n    _add_to_df_actions(params_dict, 'pv_consummed','pv_curtailed','pv')\n    _add_to_df_status(params_dict, pv=[pv_module.current_renewable])\n    _add_to_df_actual_generation(params_dict, 'pv_consummed','pv_curtailed')\n    _add_to_control_dict(params_dict, 'pv_consummed', 'pv_curtailed', 'pv')\n\n\ndef add_battery_params(battery_module, params_dict):\n    _add_to_architecture(params_dict, 'battery')\n    _add_to_parameters(params_dict,\n                       battery_soc_0=battery_module.soc,\n                       battery_power_charge=battery_module.max_charge,\n                       battery_power_discharge=battery_module.max_discharge,\n                       battery_capacity=battery_module.max_capacity,\n                       battery_efficiency=battery_module.efficiency,\n                       battery_soc_min=battery_module.min_soc,\n                       battery_soc_max=battery_module.max_soc,\n                       battery_cost_cycle=battery_module.battery_cost_cycle)\n    _add_to_df_actions(params_dict, 'battery_charge', 'battery_discharge')\n    _add_to_df_status(params_dict,\n                      battery_soc=battery_module.soc,\n                      capa_to_charge=round((battery_module.max_soc-battery_module.soc) *\n                                     battery_module.max_capacity/battery_module.efficiency, 1),\n                      capa_to_discharge=round((battery_module.soc-battery_module.min_soc) *\n                                        battery_module.max_capacity/battery_module.efficiency, 1)\n                      )\n    _add_to_df_actual_generation(params_dict, 'battery_charge', 'battery_discharge')\n    _add_to_df_cost(params_dict, 'battery')\n    _add_to_control_dict(params_dict, 'battery_charge','battery_discharge')\n\n\ndef add_grid_params(grid_module, params_dict):\n    time_series_df = pd.DataFrame(grid_module.time_series,\n                                  columns=['grid_price_import', 'grid_price_export', 'grid_co2', 'grid_status'])\n    params_dict['grid_price_import'] = time_series_df['grid_price_import'].to_frame()\n    params_dict['grid_price_export'] = time_series_df['grid_price_export'].to_frame()\n    params_dict['grid_co2'] = time_series_df['grid_co2'].to_frame()\n    params_dict['grid_ts'] = time_series_df['grid_status'].to_frame()\n    _add_to_architecture(params_dict, 'grid')\n    _add_to_parameters(params_dict,\n                       grid_weak=(time_series_df['grid_status'].min() < 1).item(),\n                       grid_power_import=grid_module.max_import,\n                       grid_power_export=grid_module.max_export)\n    _add_to_df_actions(params_dict, 'grid_import','grid_export')\n    _add_to_df_status(params_dict,\n                      grid_status=time_series_df['grid_status'].iloc[0],\n                      grid_co2=time_series_df['grid_co2'].iloc[0],\n                      grid_price_import=time_series_df['grid_price_import'].iloc[0],\n                      grid_price_export=time_series_df['grid_price_export'].iloc[0]\n                      )\n    _add_to_df_actual_generation(params_dict, 'grid_import', 'grid_export')\n    _add_to_df_cost(params_dict, 'grid_import', 'grid_export')\n    _add_to_control_dict(params_dict, 'grid_import', 'grid_export')\n    _add_cost_co2(params_dict, grid_module.cost_per_unit_co2)\n\n\ndef add_genset_params(genset_module, params_dict):\n    warn('GensetModules does not contain separate rated_power and p_max information.'\n         'Assuming p_max=0.9.')\n    genset_pmax=0.9\n    genset_rated_power = genset_module.running_max_production/genset_pmax\n    _add_to_architecture(params_dict, 'genset')\n    _add_genset_polynom(params_dict)\n\n    if genset_rated_power == 0:\n        raise RuntimeError\n\n    _add_to_parameters(params_dict,\n                       genset_rated_power=genset_rated_power,\n                       genset_pmin=genset_module.running_min_production/genset_rated_power,\n                       genset_pmax=genset_pmax,\n                       fuel_cost=genset_module.genset_cost,\n                       genset_co2=genset_module.co2_per_unit)\n    _add_to_df_actions(params_dict, 'genset')\n    _add_to_df_actual_generation(params_dict, 'genset')\n    _add_to_df_cost(params_dict, 'genset')\n    _add_to_control_dict(params_dict, 'genset')\n    _add_cost_co2(params_dict, genset_module.cost_per_unit_co2)\n\n\ndef add_unbalanced_energy_params(unbalanced_energy_module, params_dict):\n    _add_to_parameters(params_dict,\n                       cost_overgeneration=unbalanced_energy_module.overgeneration_cost,\n                       cost_loss_load=unbalanced_energy_module.loss_load_cost\n                       )\n    _add_to_df_actual_generation(params_dict, 'overgeneration')\n    _add_to_df_cost(params_dict, 'overgeneration')\n\n\ndef _add_empty(params_dict, subdict_name, *keys):\n    params_dict[subdict_name].update({k: [] for k in keys})\n\n\ndef _add_to_architecture(params_dict, component):\n    if component not in params_dict['architecture']:\n        raise NameError(f'Component {component} not viable member of architecture')\n    params_dict['architecture'][component] = 1\n\n\ndef _add_to_parameters(params_dict, **parameters):\n    params_dict['parameters'].update({key: [value] if not isinstance(value, list) else value\n                                     for key, value in parameters.items()})\n\n\ndef _add_to_df_actions(params_dict, *keys):\n    _add_empty(params_dict, 'df_actions', *keys)\n\n\ndef _add_to_df_status(params_dict, **init_status_values):\n    params_dict['df_status'].update({key: [value] if not isinstance(value, list) else value\n                                     for key, value in init_status_values.items()})\n\n\ndef _add_to_df_actual_generation(params_dict, *keys):\n    _add_empty(params_dict, 'df_actual_generation', *keys)\n\n\ndef _add_to_df_cost(params_dict, *keys):\n    _add_empty(params_dict, 'df_cost', *keys)\n\n\ndef _add_to_control_dict(params_dict, *keys):\n    params_dict['control_dict'].extend(list(keys))\n\n\ndef _add_cost_co2(params_dict, cost_co2):\n    from warnings import warn\n    if 'cost_co2' in params_dict['parameters']:\n        existing_cost_co2 = params_dict['parameters']['cost_co2']\n        if cost_co2 != existing_cost_co2:\n            warn(f'cost_co2 value {cost_co2} being added is different from existing cost_co2 value {existing_cost_co2}. Using mean.')\n            params_dict['parameters']['cost_co2'] = np.mean([cost_co2, existing_cost_co2])\n    else:\n        params_dict['parameters']['cost_co2'] = cost_co2\n    _add_to_df_cost(params_dict, 'co2')\n\n\ndef _add_genset_polynom(params_dict):\n    np.random.seed(0)\n    warn('Getting genset_polynom parameters randomly')\n    polynom = [np.random.rand() * 10, np.random.rand(), np.random.rand() / 10]\n\n    to_add = dict(genset_polynom_order= len(polynom))\n    to_add.update({f'genset_polynom_{i}': pn for i, pn in enumerate(polynom)})\n    _add_to_parameters(params_dict, **to_add)\n"
  },
  {
    "path": "src/pymgrid/data/__init__.py",
    "content": ""
  },
  {
    "path": "src/pymgrid/data/co2/__init__.py",
    "content": "\n"
  },
  {
    "path": "src/pymgrid/data/co2/co2_caiso.csv",
    "content": "﻿CO2_CISO_I_kwh\n0.239757908\n0.273658597\n0.270383127\n0.263688693\n0.263670279\n0.256445238\n0.267006115\n0.274550944\n0.267613187\n0.266741336\n0.26746132\n0.269173428\n0.269990956\n0.271028271\n0.270058934\n0.268036139\n0.236242171\n0.177314676\n0.154404466\n0.147119995\n0.147060657\n0.150619718\n0.156484683\n0.184585793\n0.250248606\n0.289011446\n0.288417659\n0.288337825\n0.289301535\n0.29418243\n0.296393424\n0.304166993\n0.303465012\n0.295390834\n0.296951475\n0.295942991\n0.295578139\n0.286425806\n0.280217876\n0.275590509\n0.246901798\n0.217547715\n0.208005751\n0.211882361\n0.203469985\n0.201741889\n0.195967453\n0.214437429\n0.272056768\n0.300616844\n0.296783156\n0.291532829\n0.290556598\n0.294955075\n0.294574193\n0.300728842\n0.302722491\n0.31236428\n0.307939541\n0.309055794\n0.308309809\n0.307864263\n0.300942505\n0.296042317\n0.268257638\n0.226625768\n0.207230953\n0.20124007\n0.196122838\n0.193176453\n0.193404135\n0.213004368\n0.263539846\n0.296691293\n0.296315322\n0.294381326\n0.297044876\n0.302081347\n0.305479609\n0.310128117\n0.3087233\n0.311700663\n0.308973918\n0.305551591\n0.304476064\n0.297371264\n0.299913497\n0.295400355\n0.267633036\n0.226043798\n0.211563169\n0.202177586\n0.19741457\n0.193169566\n0.197307382\n0.205310133\n0.26027688\n0.296469681\n0.291818727\n0.289371423\n0.294616941\n0.29810709\n0.295023839\n0.295312882\n0.302571943\n0.3064725\n0.314152679\n0.314814876\n0.31099023\n0.308228761\n0.301228412\n0.298608843\n0.291481056\n0.28382679\n0.276813705\n0.27215815\n0.269548695\n0.27827998\n0.285880613\n0.285613037\n0.285879447\n0.276830807\n0.276983058\n0.283877005\n0.289039287\n0.294354531\n0.299135418\n0.298177954\n0.298434138\n0.288398424\n0.274751799\n0.266503639\n0.260859738\n0.256843409\n0.247924097\n0.248441845\n0.224745492\n0.19997862\n0.184211314\n0.176089131\n0.185706524\n0.18716479\n0.184938979\n0.191200436\n0.235093704\n0.262553323\n0.261442654\n0.257232605\n0.26336575\n0.263390475\n0.254297935\n0.24922211\n0.239186685\n0.221383891\n0.239144654\n0.246095055\n0.256867884\n0.256266396\n0.276982553\n0.277780968\n0.264251235\n0.240382014\n0.215846656\n0.204254314\n0.204438407\n0.199814001\n0.201097036\n0.206934874\n0.254798077\n0.28379816\n0.286879008\n0.293273746\n0.299146513\n0.297468135\n0.292119332\n0.292816583\n0.296064021\n0.309215463\n0.30795091\n0.303655574\n0.299185975\n0.30368989\n0.30999528\n0.310459026\n0.288029279\n0.264054668\n0.245802917\n0.242450294\n0.246569765\n0.245003934\n0.242895616\n0.261746669\n0.300528152\n0.308113662\n0.304507821\n0.306886278\n0.30784345\n0.308000762\n0.304480517\n0.297069873\n0.301870789\n0.298644395\n0.293790601\n0.29257514\n0.298759163\n0.290674402\n0.289286699\n0.296318156\n0.270860182\n0.245242306\n0.227650263\n0.225549414\n0.228970894\n0.227340897\n0.222231727\n0.23718597\n0.24752179\n0.253513386\n0.274696309\n0.28317075\n0.284807118\n0.28676015\n0.294430183\n0.299458195\n0.282361503\n0.276856841\n0.276543346\n0.284446476\n0.276600614\n0.27593708\n0.283849531\n0.288986152\n0.261484853\n0.227273266\n0.206685845\n0.200077955\n0.198170793\n0.196673081\n0.197639861\n0.212373207\n0.259574403\n0.285245258\n0.284041993\n0.289488008\n0.294485007\n0.294491703\n0.299462772\n0.302219863\n0.296677723\n0.300466822\n0.297550391\n0.293607297\n0.294575633\n0.29540649\n0.314645385\n0.308760999\n0.284136374\n0.24901169\n0.233212481\n0.219375824\n0.21633989\n0.211687978\n0.227549396\n0.24164401\n0.265387961\n0.285720046\n0.288836207\n0.281938519\n0.284619624\n0.290527869\n0.291229428\n0.2903171\n0.286878894\n0.287712043\n0.290639367\n0.295219632\n0.294903689\n0.29677747\n0.301869033\n0.290040336\n0.29080052\n0.270403696\n0.24074526\n0.239169997\n0.230958929\n0.236281289\n0.233596045\n0.234476814\n0.260798573\n0.278059207\n0.277062158\n0.285013042\n0.287431558\n0.298817415\n0.297423703\n0.298965968\n0.304437182\n0.305210932\n0.305708366\n0.304586211\n0.301210209\n0.300977316\n0.297289366\n0.29834836\n0.255318771\n0.205694763\n0.191123325\n0.186391081\n0.188492211\n0.194467404\n0.213983098\n0.239654552\n0.268720494\n0.288166495\n0.291908119\n0.291220485\n0.291112717\n0.294619867\n0.292544121\n0.303157442\n0.299930709\n0.289089098\n0.286683668\n0.28801689\n0.282436345\n0.286037533\n0.282509017\n0.28584748\n0.281566589\n0.267533537\n0.267105939\n0.271656947\n0.27467654\n0.274951508\n0.287504228\n0.291146696\n0.293029198\n0.298818765\n0.29958442\n0.29811917\n0.300452644\n0.303957922\n0.308718698\n0.308404081\n0.303055313\n0.304915423\n0.309794754\n0.307246616\n0.308226092\n0.290359959\n0.29078798\n0.293509778\n0.294085084\n0.291878054\n0.291335556\n0.28861339\n0.29291906\n0.291469217\n0.282315479\n0.280383603\n0.288773582\n0.300469536\n0.301123947\n0.290266672\n0.292052738\n0.299621366\n0.306632885\n0.309048478\n0.304509266\n0.299546356\n0.295770292\n0.293245807\n0.284652792\n0.269175712\n0.277998221\n0.285923552\n0.280911866\n0.26000099\n0.24530869\n0.240835942\n0.244462439\n0.241290986\n0.244892955\n0.248222642\n0.269538705\n0.284642533\n0.28782122\n0.282783345\n0.283958973\n0.288480498\n0.286778957\n0.280874885\n0.277714428\n0.27155806\n0.263505278\n0.274230182\n0.281320168\n0.284298723\n0.282245343\n0.284427584\n0.274034176\n0.268983783\n0.245622054\n0.246097374\n0.251443004\n0.2330393\n0.237100168\n0.261204409\n0.270864238\n0.273008109\n0.269360972\n0.263255035\n0.266460752\n0.257097678\n0.252981547\n0.238657124\n0.244103853\n0.238549324\n0.231298485\n0.233569998\n0.237429261\n0.24596879\n0.265024705\n0.270160199\n0.238020386\n0.198571153\n0.190180678\n0.172310065\n0.176016274\n0.189252673\n0.184591422\n0.191440152\n0.23826288\n0.281826049\n0.283582191\n0.279801369\n0.287715024\n0.288370007\n0.300276535\n0.303813142\n0.296220458\n0.285982617\n0.283505685\n0.279979635\n0.275873267\n0.281196944\n0.284024478\n0.288190638\n0.248072063\n0.191139183\n0.166132555\n0.161205241\n0.156898483\n0.158121836\n0.161050217\n0.176920117\n0.220687197\n0.274090617\n0.282792257\n0.278886008\n0.276441224\n0.285837232\n0.292709299\n0.29756951\n0.296333837\n0.291700887\n0.286073605\n0.285815858\n0.280577598\n0.281277263\n0.278984249\n0.27311252\n0.249829131\n0.213140538\n0.189302364\n0.169661603\n0.164082823\n0.163978443\n0.167174857\n0.201524328\n0.225719917\n0.238469175\n0.237091638\n0.224886695\n0.241525958\n0.248268502\n0.248032563\n0.237085082\n0.215552734\n0.210476759\n0.204419293\n0.201762415\n0.222034753\n0.226771043\n0.236646807\n0.246461318\n0.220421048\n0.172756348\n0.152905082\n0.138163191\n0.137943822\n0.145783818\n0.154621152\n0.168482805\n0.20392132\n0.245275921\n0.254625274\n0.246621814\n0.243137776\n0.243008593\n0.23804854\n0.224705783\n0.230690448\n0.238218818\n0.245077431\n0.254307791\n0.261653374\n0.262301757\n0.274810794\n0.283274262\n0.251084019\n0.200169504\n0.174988042\n0.176280122\n0.185695184\n0.188150848\n0.195138729\n0.193984571\n0.235543079\n0.297165953\n0.296303288\n0.302084244\n0.302609727\n0.305662015\n0.301709971\n0.300524776\n0.303140363\n0.305882221\n0.30640477\n0.30283904\n0.304976255\n0.295654257\n0.297735372\n0.30354639\n0.274230175\n0.220862074\n0.202261871\n0.199072068\n0.200770167\n0.198011678\n0.202312177\n0.19707774\n0.246677497\n0.286786294\n0.29600396\n0.291290288\n0.297712547\n0.303765275\n0.309478804\n0.313160015\n0.319873955\n0.320999244\n0.314892421\n0.312461606\n0.311102283\n0.312967207\n0.304993108\n0.296619996\n0.261405896\n0.221898449\n0.19645611\n0.189428507\n0.186308033\n0.186740677\n0.1903907\n0.196764491\n0.249002787\n0.299872471\n0.300776787\n0.301971974\n0.303616382\n0.308073829\n0.305795191\n0.319078154\n0.308677112\n0.303238619\n0.302882028\n0.302225557\n0.300175635\n0.302058122\n0.294319626\n0.293461474\n0.257545986\n0.210445467\n0.203274088\n0.188858586\n0.184517972\n0.182872382\n0.193682779\n0.193910012\n0.227571199\n0.28079727\n0.285639027\n0.289297885\n0.288217747\n0.28825648\n0.292190847\n0.294808485\n0.294409547\n0.288514775\n0.286463394\n0.286408078\n0.281812532\n0.288816359\n0.285509316\n0.274558727\n0.232483986\n0.175982872\n0.157226765\n0.1573535\n0.157375119\n0.157627785\n0.158949981\n0.178966117\n0.221597772\n0.263830432\n0.272169739\n0.277909814\n0.280713961\n0.281524323\n0.288478188\n0.294320744\n0.28922656\n0.295416368\n0.295799638\n0.290363077\n0.289672312\n0.285821702\n0.280274424\n0.278283157\n0.236736266\n0.192880508\n0.162624785\n0.147700798\n0.143451938\n0.151215277\n0.156577766\n0.175946423\n0.205708731\n0.273283565\n0.280965822\n0.280830608\n0.284503661\n0.288192285\n0.290274864\n0.299478504\n0.296822096\n0.297521401\n0.302390438\n0.308260154\n0.308504267\n0.303102605\n0.295941296\n0.290123014\n0.269012324\n0.239412028\n0.235451945\n0.229822754\n0.224692518\n0.214965787\n0.226326674\n0.250583648\n0.277712114\n0.297069617\n0.297851144\n0.293361402\n0.295601433\n0.300183667\n0.303205963\n0.307199453\n0.318123539\n0.325253201\n0.325321103\n0.324879659\n0.315874189\n0.304346116\n0.297644763\n0.297072063\n0.281625062\n0.260635144\n0.23817746\n0.228955177\n0.221926803\n0.23309094\n0.239342342\n0.251371977\n0.280077998\n0.293088745\n0.294562904\n0.295937775\n0.29481502\n0.299234457\n0.304371478\n0.305918108\n0.302219399\n0.316226418\n0.316833001\n0.317749284\n0.31848051\n0.311327261\n0.301546433\n0.300184496\n0.285512763\n0.260475427\n0.244907938\n0.223766183\n0.205275547\n0.204728475\n0.209616619\n0.223696081\n0.253166748\n0.293809161\n0.294736719\n0.298319273\n0.298843517\n0.29748615\n0.29935798\n0.300612417\n0.308271715\n0.309087519\n0.308737162\n0.305583225\n0.303104123\n0.293815657\n0.288355168\n0.292556669\n0.279469662\n0.272296401\n0.262849822\n0.237455359\n0.244593333\n0.247057884\n0.241296991\n0.237685984\n0.255236139\n0.282819255\n0.290187325\n0.29310424\n0.297165857\n0.295050849\n0.302791037\n0.309110101\n0.306176029\n0.308693441\n0.306791032\n0.308310548\n0.307272475\n0.292965176\n0.295065011\n0.289385775\n0.263237682\n0.228610443\n0.224262183\n0.227246914\n0.225453494\n0.225867338\n0.230432162\n0.249851857\n0.272646919\n0.275293026\n0.270633781\n0.264383355\n0.267371791\n0.270095794\n0.274443267\n0.277826271\n0.269461575\n0.269006788\n0.272827567\n0.270131226\n0.275554513\n0.272653884\n0.265203366\n0.269202301\n0.272089266\n0.253559876\n0.237704242\n0.225775459\n0.244841469\n0.234610093\n0.223883657\n0.231113507\n0.245674691\n0.26035349\n0.265307183\n0.269682419\n0.275129803\n0.2705953\n0.271785278\n0.262687858\n0.249557574\n0.241104832\n0.241425326\n0.235939697\n0.231793116\n0.234940998\n0.240945216\n0.242132671\n0.212297882\n0.194885097\n0.173234968\n0.174585247\n0.167060392\n0.157021555\n0.159883053\n0.182609267\n0.202751925\n0.239927402\n0.261541839\n0.263884926\n0.268205612\n0.277034471\n0.27787268\n0.274959917\n0.276465012\n0.271225721\n0.271467913\n0.266526407\n0.265762079\n0.262608702\n0.250434007\n0.254786723\n0.24698362\n0.231221313\n0.218578962\n0.229141696\n0.212938\n0.218873776\n0.213465245\n0.214793904\n0.238936117\n0.271645336\n0.286728694\n0.289543449\n0.280967917\n0.278318811\n0.279102665\n0.280247245\n0.274266881\n0.274828942\n0.278914715\n0.291625769\n0.285611238\n0.282240126\n0.287167695\n0.292047823\n0.253416263\n0.232241427\n0.215083877\n0.211042015\n0.221740035\n0.219843423\n0.213815986\n0.238960301\n0.259922564\n0.289983279\n0.302528629\n0.293800967\n0.299814451\n0.290152492\n0.282037608\n0.268155776\n0.259310481\n0.257985781\n0.265357926\n0.274943148\n0.27520478\n0.263718358\n0.303526135\n0.289833658\n0.24035198\n0.209247896\n0.186735461\n0.180366697\n0.179185009\n0.180485666\n0.178364241\n0.187066064\n0.210388113\n0.285334608\n0.312915613\n0.31657332\n0.30985729\n0.313468071\n0.313807399\n0.322799516\n0.318197377\n0.324084721\n0.316970966\n0.315276008\n0.31662613\n0.321639185\n0.327308509\n0.327719143\n0.271699736\n0.219411035\n0.193930386\n0.206189246\n0.196511476\n0.190893128\n0.197550705\n0.196699431\n0.230305963\n0.288547205\n0.310923279\n0.314118334\n0.313650959\n0.313937909\n0.305010781\n0.314770847\n0.306678459\n0.308040928\n0.318941478\n0.317304101\n0.316382194\n0.324152769\n0.329246542\n0.315310655\n0.261613879\n0.218318071\n0.201688044\n0.200355965\n0.196487774\n0.193661213\n0.189134648\n0.196370769\n0.22449376\n0.283504901\n0.294998878\n0.298106427\n0.296994785\n0.296759054\n0.294614669\n0.297180357\n0.296315642\n0.300094814\n0.297326959\n0.296879395\n0.289844299\n0.285451361\n0.287431175\n0.280011117\n0.245314994\n0.213693749\n0.208433646\n0.183525534\n0.173897234\n0.169558901\n0.160796084\n0.164335159\n0.18825557\n0.233640631\n0.258860483\n0.269589684\n0.276068933\n0.281912342\n0.289555807\n0.294566412\n0.296398928\n0.30451099\n0.312045723\n0.318120037\n0.321928896\n0.311195314\n0.306779929\n0.290079755\n0.250550227\n0.209513338\n0.197663016\n0.178103996\n0.16757904\n0.180777074\n0.182044868\n0.18954705\n0.206324333\n0.246681506\n0.273943652\n0.274019724\n0.275831366\n0.287304092\n0.283743057\n0.27308146\n0.289089406\n0.294066187\n0.295803057\n0.301512333\n0.317688204\n0.294863069\n0.294512124\n0.291852527\n0.25142998\n0.211031239\n0.193231874\n0.198377575\n0.19826369\n0.195282436\n0.203190939\n0.205209096\n0.239564515\n0.305621105\n0.319791013\n0.320215822\n0.313928562\n0.313694187\n0.317423813\n0.331571241\n0.345517877\n0.353570008\n0.354682946\n0.351972681\n0.342605281\n0.325687225\n0.328030819\n0.313974853\n0.273935179\n0.25386512\n0.243783248\n0.237873018\n0.232120944\n0.242450091\n0.258076809\n0.280005873\n0.297333485\n0.310978046\n0.32280456\n0.315001609\n0.319272524\n0.31811851\n0.320772293\n0.31929064\n0.320913187\n0.305677563\n0.295115401\n0.293303481\n0.282329472\n0.290440579\n0.289024174\n0.301531426\n0.299973797\n0.296647314\n0.289481638\n0.264280783\n0.260064953\n0.272460748\n0.298633403\n0.283883166\n0.297302999\n0.305195648\n0.316977928\n0.301796178\n0.30616785\n0.305391142\n0.298878665\n0.296106211\n0.289644004\n0.284864368\n0.272792295\n0.270534401\n0.276245956\n0.286340108\n0.294416321\n0.297374877\n0.292748185\n0.288272319\n0.270666635\n0.241935542\n0.255140626\n0.24466004\n0.242033048\n0.24355977\n0.255739853\n0.29069038\n0.278710045\n0.281019535\n0.292682846\n0.29367582\n0.287623685\n0.290491605\n0.272945855\n0.251074921\n0.258751196\n0.254747796\n0.254329162\n0.263685873\n0.278763012\n0.289152956\n0.272855741\n0.254986381\n0.220222001\n0.212775858\n0.193605763\n0.202900583\n0.208754876\n0.231414572\n0.249307441\n0.293041384\n0.289773224\n0.283574889\n0.289338721\n0.294569379\n0.289646871\n0.281154877\n0.279110191\n0.26362303\n0.251848014\n0.252123604\n0.243376125\n0.236255978\n0.23777045\n0.233480111\n0.186110806\n0.142440492\n0.125218694\n0.123967665\n0.123066969\n0.128734398\n0.12667051\n0.125960602\n0.13868468\n0.215105743\n0.255203682\n0.26380107\n0.261340224\n0.248742035\n0.241277416\n0.248993582\n0.24925303\n0.262902418\n0.279261221\n0.281201464\n0.276251019\n0.255778997\n0.26544994\n0.248618008\n0.19940242\n0.171037516\n0.16079153\n0.154639901\n0.162537154\n0.15576435\n0.16547999\n0.168059284\n0.1868575\n0.263045705\n0.296925712\n0.286121001\n0.278728906\n0.264797399\n0.26781444\n0.278297894\n0.267415845\n0.264203204\n0.265518714\n0.267509671\n0.266329819\n0.255894572\n0.259010348\n0.25157632\n0.208221266\n0.168193021\n0.165788438\n0.17083624\n0.176918172\n0.176677014\n0.179729394\n0.179883104\n0.195469266\n0.25101253\n0.294084025\n0.281833216\n0.282290386\n0.286712403\n0.286036417\n0.287552098\n0.285255296\n0.291088631\n0.296627415\n0.30413612\n0.30488006\n0.308802548\n0.32177939\n0.314296214\n0.253490018\n0.231094643\n0.212346627\n0.213136241\n0.211160221\n0.210006626\n0.207079184\n0.209580115\n0.241444195\n0.290475197\n0.303612784\n0.29098914\n0.290048604\n0.284406636\n0.281675296\n0.281692871\n0.272873703\n0.272241069\n0.273368235\n0.262707348\n0.272823863\n0.27942716\n0.277761111\n0.259541666\n0.220405029\n0.208783209\n0.193445477\n0.186803253\n0.186986423\n0.207288724\n0.227138154\n0.23451609\n0.249257723\n0.279915415\n0.290848852\n0.292264936\n0.296598928\n0.296404636\n0.294712251\n0.299505329\n0.298241241\n0.301934551\n0.302592735\n0.30452505\n0.291698679\n0.289778752\n0.286800257\n0.285073392\n0.282692634\n0.259471459\n0.225164121\n0.231117202\n0.225993317\n0.208887983\n0.212371596\n0.233088108\n0.23778107\n0.26182127\n0.28537153\n0.281257711\n0.277707308\n0.292307166\n0.2877074\n0.27916233\n0.278272933\n0.277794779\n0.279946654\n0.281930267\n0.281948779\n0.284844687\n0.281912456\n0.280121965\n0.234188222\n0.195735379\n0.19145066\n0.191592778\n0.181657022\n0.174613863\n0.169450394\n0.181555682\n0.198236189\n0.241014234\n0.275810129\n0.273816387\n0.28365418\n0.294124801\n0.289956618\n0.29403173\n0.293056596\n0.293795315\n0.290424767\n0.292386816\n0.296773342\n0.291349328\n0.302747717\n0.274887117\n0.213513408\n0.170390756\n0.151109221\n0.144769596\n0.147055823\n0.145676727\n0.154387232\n0.182784828\n0.199214186\n0.255087656\n0.280659615\n0.282271674\n0.285604876\n0.289520801\n0.296242531\n0.297569442\n0.296993314\n0.29955948\n0.306740269\n0.308774155\n0.312500526\n0.310345367\n0.311089462\n0.297818202\n0.222074725\n0.18011658\n0.15389691\n0.148084653\n0.145560227\n0.144017764\n0.14639527\n0.16703183\n0.180146751\n0.250914879\n0.287311804\n0.283534427\n0.293004646\n0.295919603\n0.300382362\n0.30025567\n0.31027629\n0.31407984\n0.316318958\n0.314869827\n0.308575157\n0.301331728\n0.304070144\n0.297665679\n0.241667151\n0.203358388\n0.185345436\n0.181034974\n0.175973519\n0.186888237\n0.184185896\n0.180499593\n0.213560279\n0.27542321\n0.303231981\n0.301431861\n0.300635819\n0.302851429\n0.302829623\n0.29532811\n0.288908246\n0.286228211\n0.296736115\n0.302457373\n0.306164421\n0.301621634\n0.305317607\n0.289107429\n0.238346004\n0.215236286\n0.202495945\n0.1979963\n0.232408425\n0.229045882\n0.246741745\n0.261317844\n0.299152588\n0.312988816\n0.327087788\n0.323988726\n0.320015078\n0.315438784\n0.306832753\n0.300180332\n0.293875978\n0.278950809\n0.281274057\n0.281630875\n0.269245785\n0.270557464\n0.285236199\n0.289540791\n0.254460237\n0.230687764\n0.21293961\n0.220206637\n0.215798014\n0.213629756\n0.231621603\n0.230363253\n0.235459313\n0.279769549\n0.309490844\n0.310444845\n0.310461329\n0.303137278\n0.291167227\n0.289985278\n0.287846874\n0.274768476\n0.275231056\n0.281851168\n0.292585778\n0.28604985\n0.289503179\n0.275778873\n0.221412402\n0.185951206\n0.169787025\n0.173485724\n0.169813599\n0.16792857\n0.164205926\n0.170791501\n0.181703326\n0.24311847\n0.283848528\n0.300037145\n0.300672777\n0.296956912\n0.289797939\n0.282528197\n0.266299799\n0.266236292\n0.267729067\n0.259787212\n0.255293089\n0.261224288\n0.285090654\n0.285213495\n0.26017402\n0.218276959\n0.196027118\n0.199423427\n0.206340105\n0.212765552\n0.218930416\n0.213476116\n0.226985702\n0.273617111\n0.300178303\n0.31151733\n0.309442011\n0.30453572\n0.311430149\n0.306052419\n0.293783553\n0.282932595\n0.275569916\n0.276162873\n0.272587823\n0.267296831\n0.265340099\n0.263584755\n0.258138035\n0.23201566\n0.211985772\n0.186357129\n0.184492581\n0.186178023\n0.172634254\n0.163513248\n0.170056457\n0.239239628\n0.286638595\n0.285364822\n0.279102768\n0.277000639\n0.277124334\n0.277067089\n0.272465148\n0.275273118\n0.2653433\n0.264853693\n0.264964359\n0.257272741\n0.256669961\n0.235203233\n0.175929619\n0.164033262\n0.15336813\n0.14697741\n0.134648142\n0.144527246\n0.148218005\n0.148055716\n0.171107184\n0.220425876\n0.265198384\n0.276352117\n0.275855951\n0.268647003\n0.263812178\n0.249249115\n0.253330452\n0.246505431\n0.251798915\n0.245942035\n0.24699277\n0.257241953\n0.27234824\n0.262792065\n0.217442473\n0.180994243\n0.181964664\n0.194659242\n0.191607245\n0.189205903\n0.185801076\n0.205450639\n0.221233724\n0.275651156\n0.31659283\n0.318837425\n0.315345311\n0.31173576\n0.312561423\n0.306502375\n0.303186011\n0.299568005\n0.302555092\n0.29802956\n0.30276376\n0.297715303\n0.314630431\n0.304178273\n0.271797725\n0.246116191\n0.237368062\n0.232694667\n0.231849423\n0.223231286\n0.228478636\n0.211186426\n0.233275796\n0.270545366\n0.300113039\n0.29439914\n0.295928579\n0.297500394\n0.293759632\n0.302101782\n0.283121884\n0.261557811\n0.257130117\n0.24894512\n0.242111019\n0.249840359\n0.261642988\n0.270348043\n0.251466566\n0.238907355\n0.213950524\n0.208711117\n0.209465943\n0.195763716\n0.18223482\n0.19706215\n0.21574018\n0.250751514\n0.282681226\n0.28406371\n0.277450628\n0.266561864\n0.261881429\n0.25855219\n0.248318313\n0.234048882\n0.227825699\n0.221026195\n0.225381767\n0.233303475\n0.245473945\n0.230990274\n0.173853577\n0.14576115\n0.135089108\n0.132177654\n0.138017788\n0.138745347\n0.150066905\n0.159060272\n0.182574182\n0.228293651\n0.267493407\n0.276184001\n0.25981139\n0.25532205\n0.254513484\n0.244904098\n0.235117525\n0.219954072\n0.207895017\n0.211935327\n0.212647182\n0.208537349\n0.216807252\n0.212518025\n0.161357191\n0.123175695\n0.117174319\n0.117627664\n0.112405308\n0.114758616\n0.11081695\n0.126721159\n0.146731427\n0.193098592\n0.246079472\n0.259124201\n0.257968848\n0.251645148\n0.238304373\n0.233424324\n0.225858856\n0.211630912\n0.223705931\n0.232262127\n0.228933156\n0.233864768\n0.23264082\n0.205877005\n0.145449808\n0.112870729\n0.117391918\n0.123626096\n0.121630928\n0.123947976\n0.134277427\n0.154097879\n0.169786241\n0.223146531\n0.262093375\n0.265002531\n0.266094983\n0.258996581\n0.260801149\n0.258420087\n0.262123432\n0.253525401\n0.244024225\n0.257157488\n0.254536672\n0.263653865\n0.274098978\n0.247832927\n0.19172375\n0.160038082\n0.152299163\n0.159503323\n0.160119564\n0.165393086\n0.173881067\n0.180808361\n0.196633187\n0.243557653\n0.280791633\n0.281396456\n0.276511992\n0.268714743\n0.265156181\n0.265541292\n0.273651811\n0.271821282\n0.276379094\n0.281917075\n0.280217239\n0.2927716\n0.312029434\n0.285591576\n0.23257987\n0.205017401\n0.186357201\n0.197813994\n0.201377721\n0.211709824\n0.219487436\n0.215711439\n0.227150883\n0.261340985\n0.295833749\n0.291920446\n0.281632876\n0.274008085\n0.265805278\n0.270071345\n0.265705654\n0.248336949\n0.235553327\n0.232118151\n0.223433846\n0.246466403\n0.268220298\n0.250735312\n0.195523747\n0.154498054\n0.13737063\n0.134259101\n0.134637974\n0.135125196\n0.13371177\n0.137926135\n0.140651203\n0.17583704\n0.233311558\n0.233647052\n0.235525005\n0.231310993\n0.230630365\n0.222923778\n0.21747511\n0.204671057\n0.200717063\n0.200236188\n0.193743105\n0.211801985\n0.23192354\n0.198738867\n0.155613546\n0.143391078\n0.138234744\n0.146518213\n0.142718083\n0.136751792\n0.138311145\n0.135926199\n0.139914006\n0.181285549\n0.240648632\n0.254278055\n0.258965981\n0.259905754\n0.25977508\n0.259857042\n0.253181534\n0.251728487\n0.249428854\n0.252540316\n0.259020564\n0.281197827\n0.302811347\n0.246024563\n0.179798136\n0.140202082\n0.134591514\n0.139104176\n0.135063634\n0.137874197\n0.140773957\n0.146660618\n0.158966749\n0.208898874\n0.282300894\n0.28948646\n0.282632615\n0.276823484\n0.274603803\n0.267560595\n0.253440038\n0.252314976\n0.2453012\n0.241998643\n0.243985513\n0.260053278\n0.27591586\n0.238913584\n0.17175661\n0.130800823\n0.131285392\n0.127555848\n0.127835964\n0.125326167\n0.125802106\n0.135460014\n0.154063773\n0.19427281\n0.27108263\n0.277631019\n0.271785957\n0.26234833\n0.262552907\n0.263444911\n0.265763606\n0.259533287\n0.253646193\n0.255815159\n0.259670179\n0.257733727\n0.26135533\n0.218289246\n0.14067884\n0.11964535\n0.111229142\n0.10624024\n0.106599669\n0.108187636\n0.118086075\n0.123999054\n0.128531651\n0.182299794\n0.256421484\n0.270075952\n0.259316475\n0.25162149\n0.255571365\n0.254718971\n0.255998472\n0.251188178\n0.246818703\n0.247874985\n0.250440164\n0.246408067\n0.246429735\n0.198177136\n0.132670638\n0.116889786\n0.108752564\n0.108294593\n0.10857278\n0.106230943\n0.108777511\n0.115495433\n0.133338194\n0.20141101\n0.258280536\n0.26255252\n0.254772058\n0.250881801\n0.249960866\n0.253760901\n0.255933737\n0.247232554\n0.250348481\n0.244118814\n0.243092868\n0.257039666\n0.280024067\n0.234019143\n0.17429702\n0.155274462\n0.145343269\n0.145626311\n0.139082769\n0.134053783\n0.148267318\n0.161270612\n0.17513562\n0.21856528\n0.268964733\n0.275424363\n0.264663212\n0.255125535\n0.25354379\n0.245191229\n0.233944293\n0.233124847\n0.235465098\n0.236248392\n0.238867054\n0.241763345\n0.256197376\n0.23007811\n0.19036636\n0.177808434\n0.166379479\n0.156144148\n0.162806857\n0.170828096\n0.191561014\n0.209973468\n0.215010635\n0.223970167\n0.239608867\n0.230959924\n0.227864805\n0.218815544\n0.20178846\n0.197739806\n0.206783678\n0.197618439\n0.190030924\n0.19467084\n0.205616\n0.220812116\n0.23314162\n0.233566908\n0.235439728\n0.217275116\n0.184748495\n0.166680802\n0.1644454\n0.173487685\n0.163702151\n0.174008532\n0.175966656\n0.208316412\n0.221843599\n0.228039028\n0.219880723\n0.220371576\n0.215706556\n0.195617495\n0.187526611\n0.19056371\n0.181553403\n0.185327154\n0.193723926\n0.217150736\n0.223806268\n0.201591066\n0.181667625\n0.144075461\n0.14162859\n0.139563595\n0.136521046\n0.121246857\n0.124155834\n0.120747192\n0.130089124\n0.16204288\n0.198721547\n0.202968799\n0.193965932\n0.182213154\n0.17770825\n0.172612545\n0.171323857\n0.16913323\n0.164777238\n0.165650239\n0.173310477\n0.189939537\n0.200281766\n0.176012106\n0.12873841\n0.11842347\n0.117894217\n0.117495866\n0.111265059\n0.109699796\n0.115562854\n0.111926174\n0.127310038\n0.151545251\n0.189479936\n0.201969244\n0.200525208\n0.193229801\n0.195684683\n0.191372496\n0.177729916\n0.172398919\n0.164273316\n0.181959257\n0.184748153\n0.166873713\n0.163217901\n0.153292321\n0.107746184\n0.113312241\n0.104852906\n0.090046503\n0.086217546\n0.0834232\n0.079542164\n0.078820527\n0.083324438\n0.111686719\n0.138721929\n0.154382537\n0.160599888\n0.160251192\n0.16061279\n0.157562014\n0.154730936\n0.14834522\n0.140277591\n0.137877751\n0.143561392\n0.150214018\n0.155353478\n0.133650304\n0.120265161\n0.106586701\n0.10484715\n0.112523352\n0.112508364\n0.106786024\n0.109243313\n0.113447698\n0.115817944\n0.160930438\n0.21935548\n0.235372964\n0.222390991\n0.213683217\n0.213764574\n0.211993528\n0.218292193\n0.219102293\n0.220529033\n0.223436365\n0.215953486\n0.225318765\n0.235612772\n0.196713044\n0.151756121\n0.135108651\n0.118730359\n0.125181993\n0.133176102\n0.132903828\n0.131471537\n0.141331705\n0.142515423\n0.185666865\n0.244572712\n0.253397148\n0.237807009\n0.234364386\n0.2305106\n0.216946811\n0.215824976\n0.209830419\n0.2034194\n0.202622809\n0.205889767\n0.213202426\n0.228698528\n0.200858391\n0.157479407\n0.133747612\n0.122915084\n0.116258766\n0.116182958\n0.118889686\n0.112852306\n0.132796631\n0.149059605\n0.189279641\n0.242116492\n0.250551248\n0.242067305\n0.230308921\n0.215234095\n0.20734963\n0.205829163\n0.19263939\n0.199124337\n0.192279936\n0.205075759\n0.209753037\n0.220928362\n0.218103852\n0.185691009\n0.165407643\n0.156658661\n0.151877173\n0.146365453\n0.142950818\n0.145869073\n0.143948348\n0.145387628\n0.164452821\n0.20473647\n0.222356907\n0.21977601\n0.207536876\n0.192350042\n0.18732028\n0.18074839\n0.178363251\n0.179484068\n0.181092965\n0.183070651\n0.192432527\n0.202689066\n0.167661177\n0.125740267\n0.113283017\n0.10541492\n0.102230455\n0.104537038\n0.102231116\n0.106652092\n0.122881232\n0.135761818\n0.156029332\n0.203429186\n0.206177128\n0.204950246\n0.199113861\n0.185774781\n0.172916058\n0.178209933\n0.177713544\n0.173010183\n0.167635824\n0.178843122\n0.189238162\n0.196790772\n0.159761467\n0.124482139\n0.11215947\n0.118513942\n0.115855089\n0.11487758\n0.110409836\n0.111028825\n0.114057471\n0.119632811\n0.139499419\n0.174918376\n0.187462354\n0.182978367\n0.1855865\n0.177558902\n0.174668217\n0.173459888\n0.17048875\n0.169791064\n0.165405202\n0.173775124\n0.182234927\n0.190124598\n0.155588587\n0.114784077\n0.109495934\n0.112559466\n0.113669631\n0.119447186\n0.126658053\n0.124375169\n0.109813859\n0.115095273\n0.158866087\n0.207708922\n0.215359359\n0.218674683\n0.225376537\n0.22369999\n0.222103665\n0.221988194\n0.218697281\n0.214480939\n0.217629592\n0.215838202\n0.21260311\n0.216637139\n0.158627486\n0.118902823\n0.099997893\n0.100674746\n0.097974339\n0.099968362\n0.09665369\n0.10503652\n0.120450188\n0.127230106\n0.187801589\n0.239513111\n0.249058995\n0.241332511\n0.234674006\n0.231863489\n0.225050799\n0.219986408\n0.210803537\n0.215602991\n0.217952746\n0.219430478\n0.234095962\n0.238529909\n0.203496965\n0.165508244\n0.155663665\n0.146756782\n0.143221786\n0.145442796\n0.144198586\n0.15824393\n0.17794414\n0.193372656\n0.236215863\n0.254590929\n0.254731924\n0.243212932\n0.236744241\n0.234151657\n0.220138816\n0.210906985\n0.207231686\n0.201599866\n0.192158391\n0.197083012\n0.215534855\n0.212516308\n0.185670517\n0.149161513\n0.136058139\n0.118503337\n0.122477198\n0.123671588\n0.112414\n0.115937546\n0.125805022\n0.138609611\n0.165233332\n0.203133842\n0.22030554\n0.213262266\n0.214416477\n0.208496264\n0.196816825\n0.170913755\n0.171639712\n0.178313028\n0.182984812\n0.192012377\n0.195378575\n0.204331832\n0.169732542\n0.153094888\n0.142996168\n0.126839762\n0.12285828\n0.128711551\n0.123879198\n0.131555459\n0.142036335\n0.150523493\n0.188806001\n0.217054778\n0.228378551\n0.224669181\n0.222339537\n0.21692243\n0.210306298\n0.209842131\n0.206806712\n0.207645876\n0.203560887\n0.218104971\n0.232205773\n0.23513942\n0.217113799\n0.200301312\n0.167413446\n0.163462193\n0.146454204\n0.14875447\n0.14240372\n0.143338043\n0.166348614\n0.186402119\n0.199922155\n0.230025709\n0.242893324\n0.229754962\n0.229763093\n0.221813077\n0.210426283\n0.198418105\n0.188297088\n0.180447378\n0.176094444\n0.185337885\n0.204708352\n0.21213912\n0.179000499\n0.149838414\n0.148152319\n0.141109225\n0.138762734\n0.137600495\n0.13227985\n0.135685588\n0.132873285\n0.138250248\n0.159099061\n0.196040993\n0.207630966\n0.202454668\n0.200778727\n0.186693384\n0.161262982\n0.161896979\n0.152245619\n0.156840945\n0.159151652\n0.171448354\n0.184263752\n0.183556139\n0.14587093\n0.112991731\n0.109134261\n0.107381616\n0.108211923\n0.106679411\n0.111063179\n0.108015466\n0.102626875\n0.106836859\n0.132336425\n0.166014471\n0.181708757\n0.183107165\n0.182611991\n0.178041048\n0.165946921\n0.156137387\n0.15070673\n0.142170786\n0.143416459\n0.143215936\n0.149249448\n0.155184556\n0.121311046\n0.104572883\n0.104498483\n0.110513916\n0.110341929\n0.106417071\n0.108681219\n0.104331994\n0.114940883\n0.116136428\n0.151827071\n0.186110336\n0.203369654\n0.196959976\n0.189511526\n0.181755689\n0.174076792\n0.173971026\n0.171396337\n0.171601998\n0.172377321\n0.176465898\n0.189624534\n0.202054448\n0.178990927\n0.154515924\n0.14336657\n0.130949939\n0.134426802\n0.134407355\n0.138604242\n0.128073632\n0.140413925\n0.158438693\n0.191014343\n0.219862359\n0.223430184\n0.213127146\n0.209089963\n0.197722511\n0.17712586\n0.16380645\n0.156268623\n0.147946544\n0.142595014\n0.152142797\n0.168481786\n0.175238163\n0.147732317\n0.121954035\n0.117932776\n0.110577306\n0.109595124\n0.109242991\n0.105368532\n0.10375334\n0.105323348\n0.113538881\n0.138098058\n0.168212359\n0.200311681\n0.192461767\n0.170635336\n0.140955429\n0.126595941\n0.121148333\n0.118422969\n0.121077394\n0.126824835\n0.129080168\n0.148900461\n0.143238691\n0.116237872\n0.099774841\n0.086432545\n0.083900991\n0.086258367\n0.088392467\n0.082055107\n0.077903292\n0.070227218\n0.097241719\n0.126278319\n0.173366714\n0.183009676\n0.172779975\n0.166248524\n0.150544316\n0.1464552\n0.153684809\n0.156005763\n0.145343631\n0.147131343\n0.152986728\n0.182404284\n0.192806235\n0.145345499\n0.129839732\n0.116907582\n0.109579938\n0.094690727\n0.114365181\n0.103749748\n0.123814325\n0.127844167\n0.135364336\n0.147597191\n0.182127667\n0.197092831\n0.18527132\n0.17943881\n0.160506887\n0.147659172\n0.140560104\n0.141953828\n0.135682589\n0.136239424\n0.148573224\n0.173861977\n0.19325687\n0.15710335\n0.123336024\n0.111490269\n0.108380494\n0.11396232\n0.11516691\n0.114855137\n0.109699749\n0.113736839\n0.118371482\n0.143405969\n0.197065297\n0.210688834\n0.199540445\n0.192620621\n0.198507477\n0.191384144\n0.192041227\n0.195857549\n0.19464364\n0.194984331\n0.197465013\n0.2038644\n0.201210806\n0.146373262\n0.11141612\n0.102832311\n0.090080682\n0.09139255\n0.098459152\n0.093853697\n0.095154657\n0.09927143\n0.117840045\n0.155714806\n0.220293174\n0.234090673\n0.220555343\n0.204546982\n0.179029908\n0.159764565\n0.151685024\n0.142422821\n0.132886224\n0.12933583\n0.133283825\n0.135294312\n0.12517522\n0.098238597\n0.085819295\n0.085944921\n0.083603536\n0.081394096\n0.082249218\n0.088607166\n0.087579126\n0.090352875\n0.107237723\n0.132330557\n0.174147162\n0.200100464\n0.187997118\n0.177791887\n0.156445942\n0.142230951\n0.135991322\n0.136116265\n0.136726474\n0.136014739\n0.149063152\n0.160594685\n0.1595041\n0.135558121\n0.10307481\n0.093128486\n0.099162118\n0.088815037\n0.090065743\n0.08698484\n0.09071188\n0.101870899\n0.132017234\n0.165981067\n0.206002651\n0.220355986\n0.219482089\n0.211769721\n0.188615431\n0.15985196\n0.153792227\n0.151517909\n0.152932731\n0.147089223\n0.151151472\n0.15960833\n0.163628813\n0.145101488\n0.133115831\n0.112940149\n0.121141052\n0.1185276\n0.121226663\n0.113432171\n0.101551888\n0.11172575\n0.110597063\n0.132560625\n0.172601986\n0.186990121\n0.180208579\n0.168476006\n0.158292834\n0.148214421\n0.138880296\n0.138175962\n0.135699188\n0.13344158\n0.134270896\n0.153108434\n0.149024063\n0.115463354\n0.103466491\n0.096699366\n0.092922364\n0.09792645\n0.105161599\n0.103458609\n0.113459231\n0.120061856\n0.131690848\n0.156553691\n0.210331012\n0.227707386\n0.211841595\n0.201140559\n0.191429879\n0.184131971\n0.175308862\n0.172284995\n0.168499193\n0.168095208\n0.178552508\n0.198988533\n0.196177533\n0.13320543\n0.111587289\n0.108605487\n0.10646233\n0.113366945\n0.107274989\n0.105525041\n0.109364768\n0.131422568\n0.146153189\n0.187453882\n0.246928603\n0.254120241\n0.242255975\n0.230244582\n0.219487613\n0.212123019\n0.215702008\n0.200237532\n0.196283213\n0.193588816\n0.198344536\n0.205669187\n0.194631241\n0.160793953\n0.140025199\n0.141673447\n0.13853085\n0.135330131\n0.147022698\n0.133834394\n0.133276097\n0.138199775\n0.154045084\n0.177917073\n0.213206431\n0.217418752\n0.205506658\n0.198666418\n0.177310383\n0.159556974\n0.168591162\n0.161773652\n0.153238826\n0.145648698\n0.143088241\n0.143185045\n0.138429854\n0.102869763\n0.087657533\n0.07749207\n0.076728898\n0.075241492\n0.086159086\n0.092280187\n0.072910544\n0.081069245\n0.086065713\n0.110537487\n0.145304308\n0.159581743\n0.16170071\n0.165800784\n0.161193642\n0.162821698\n0.164653893\n0.159190242\n0.147173423\n0.153846169\n0.156609219\n0.15003484\n0.134761995\n0.100320661\n0.0883758\n0.082504161\n0.082010681\n0.081285129\n0.079228163\n0.076243918\n0.079213213\n0.081131034\n0.081915824\n0.102672257\n0.145421411\n0.153710618\n0.148103208\n0.146172584\n0.141865559\n0.149225069\n0.158060145\n0.166791818\n0.156479969\n0.154519096\n0.160497415\n0.172744717\n0.162419463\n0.124317408\n0.102607923\n0.094178885\n0.092595813\n0.086458854\n0.087596566\n0.092379929\n0.099370154\n0.10478606\n0.125138919\n0.149980444\n0.194891803\n0.215213984\n0.21483534\n0.202623041\n0.187148294\n0.187912997\n0.179005463\n0.169886655\n0.168334444\n0.167320086\n0.176735637\n0.192543984\n0.17496089\n0.13650195\n0.119471114\n0.121920365\n0.122932226\n0.125468415\n0.126765235\n0.130748549\n0.131341743\n0.138887701\n0.146059026\n0.168846605\n0.226395578\n0.238084285\n0.225628965\n0.209223938\n0.205092552\n0.196245966\n0.18684256\n0.172487075\n0.170114052\n0.170552653\n0.18042068\n0.201229028\n0.192136036\n0.149040997\n0.141237288\n0.137105502\n0.132140283\n0.129980873\n0.128001669\n0.128083289\n0.129879924\n0.146054603\n0.153046723\n0.187953923\n0.23796886\n0.24932536\n0.238213932\n0.21965554\n0.200010354\n0.174961134\n0.163118729\n0.155008868\n0.150773297\n0.148252299\n0.157151668\n0.176957696\n0.169911604\n0.138485607\n0.123289805\n0.124428781\n0.121303623\n0.12695815\n0.122685548\n0.123475685\n0.130551849\n0.135503778\n0.147417765\n0.188133191\n0.233763112\n0.239095147\n0.233564103\n0.214640348\n0.19414909\n0.181483582\n0.169616672\n0.160161945\n0.140296242\n0.131562369\n0.144578622\n0.167623497\n0.152144894\n0.114533466\n0.104475573\n0.101085546\n0.098016751\n0.099599412\n0.10229161\n0.09761565\n0.105195983\n0.121921825\n0.129988418\n0.158844899\n0.207959963\n0.216283721\n0.20991625\n0.192826466\n0.17011509\n0.146479822\n0.13339186\n0.115593989\n0.112546931\n0.110216472\n0.112471359\n0.120686581\n0.116560289\n0.103789665\n0.089964686\n0.090653824\n0.091721677\n0.093295899\n0.09058358\n0.09038538\n0.08284901\n0.099849626\n0.111983036\n0.12906638\n0.151880295\n0.17147746\n0.176318552\n0.169557355\n0.14976506\n0.140136214\n0.136327223\n0.133878393\n0.132421422\n0.130563617\n0.141339171\n0.152926035\n0.142252401\n0.105644197\n0.086851382\n0.083499119\n0.086754172\n0.085315834\n0.084617692\n0.091103101\n0.087078968\n0.114136286\n0.14590842\n0.197518197\n0.22403241\n0.218637573\n0.206869285\n0.198919241\n0.187119252\n0.176423393\n0.157689157\n0.149481351\n0.142916259\n0.135689639\n0.14562584\n0.152481739\n0.159333112\n0.140508198\n0.107812241\n0.102024192\n0.107491269\n0.115655776\n0.11959107\n0.126249109\n0.128360957\n0.129916031\n0.145371536\n0.156049498\n0.182629799\n0.192085548\n0.189210146\n0.185118227\n0.173487039\n0.15893718\n0.155472166\n0.153958219\n0.155322018\n0.151473687\n0.161902795\n0.179459213\n0.164160374\n0.133561498\n0.113691341\n0.107353401\n0.106127101\n0.104721796\n0.099055999\n0.098213046\n0.103237433\n0.112236595\n0.119868733\n0.147044692\n0.193046654\n0.213608905\n0.211715358\n0.207417228\n0.202007723\n0.184496417\n0.171128199\n0.16427359\n0.162642709\n0.163981556\n0.168335959\n0.183428913\n0.173064832\n0.134862432\n0.125056638\n0.116789499\n0.122550142\n0.125192218\n0.12697656\n0.126415853\n0.123484032\n0.136674673\n0.141594732\n0.162932792\n0.197665302\n0.208300363\n0.206695697\n0.187948499\n0.182976603\n0.164896753\n0.176481145\n0.165998696\n0.156865291\n0.154643075\n0.176827853\n0.180177986\n0.16048862\n0.131698236\n0.13076613\n0.130870339\n0.127948778\n0.131963989\n0.138851256\n0.135791677\n0.138638135\n0.143652557\n0.142621848\n0.164345076\n0.194526833\n0.207493047\n0.211274942\n0.194130154\n0.17912295\n0.18282025\n0.178856751\n0.180859693\n0.184313368\n0.18357476\n0.183704428\n0.188907669\n0.167499405\n0.13987903\n0.125056972\n0.122374705\n0.125039666\n0.125340217\n0.121790976\n0.117142828\n0.120381164\n0.127756851\n0.124902382\n0.153375109\n0.197831354\n0.216745586\n0.209396156\n0.199787231\n0.189442467\n0.183512398\n0.163282692\n0.155705377\n0.162905634\n0.167795005\n0.174791364\n0.172032197\n0.136558173\n0.102552698\n0.092340563\n0.090568529\n0.088672071\n0.087455186\n0.084439955\n0.080751989\n0.078296241\n0.09445608\n0.101238468\n0.138025762\n0.187616105\n0.197736639\n0.196953763\n0.188951752\n0.191283285\n0.175967829\n0.154011172\n0.145180223\n0.141042638\n0.141437585\n0.147202649\n0.156944053\n0.128998775\n0.092374987\n0.081355013\n0.079734054\n0.077543019\n0.07650882\n0.069534614\n0.063050744\n0.06264452\n0.079840231\n0.102096865\n0.128032863\n0.178064427\n0.197894301\n0.200543364\n0.197346063\n0.182800655\n0.169765914\n0.166500393\n0.168716815\n0.165072224\n0.159260092\n0.167178745\n0.173489514\n0.162825136\n0.147289702\n0.128607781\n0.121532531\n0.119142949\n0.111916185\n0.10831462\n0.102465508\n0.112034029\n0.117363421\n0.112588126\n0.145718553\n0.183693071\n0.197237085\n0.204598946\n0.191409841\n0.17509774\n0.173576143\n0.168248671\n0.167511059\n0.172773437\n0.159859994\n0.159524213\n0.169126092\n0.164078125\n0.13900896\n0.121030872\n0.114227017\n0.123095422\n0.116838613\n0.108929576\n0.106119778\n0.109709827\n0.116680197\n0.114951207\n0.144490542\n0.190617574\n0.203057751\n0.195044148\n0.187789672\n0.180339799\n0.165066441\n0.169774759\n0.158494897\n0.148125215\n0.133609265\n0.138580762\n0.156599139\n0.151401395\n0.135396269\n0.134683602\n0.134549318\n0.137268732\n0.133226149\n0.133936535\n0.12368963\n0.134409233\n0.131391625\n0.129436443\n0.142449672\n0.190928736\n0.220234238\n0.211534203\n0.201165383\n0.181517621\n0.165174936\n0.16206553\n0.154999561\n0.146261367\n0.150504583\n0.156334174\n0.166915777\n0.166923791\n0.156537329\n0.141484268\n0.134478953\n0.114066997\n0.123131628\n0.123223088\n0.112149933\n0.122271777\n0.128288847\n0.132312521\n0.151318056\n0.198280977\n0.209437178\n0.205875767\n0.200040097\n0.196892532\n0.197340452\n0.171558026\n0.161653526\n0.165360451\n0.165554884\n0.175989105\n0.195769452\n0.19033386\n0.180012284\n0.182004733\n0.1696117\n0.153341854\n0.145648325\n0.146400199\n0.15552287\n0.164435706\n0.174329234\n0.180526142\n0.19582368\n0.216864185\n0.231602449\n0.235316795\n0.226479735\n0.216067721\n0.209630225\n0.188349631\n0.178378884\n0.171076927\n0.169487312\n0.170711295\n0.173144881\n0.174616615\n0.144504955\n0.129837079\n0.116443056\n0.114995292\n0.118792068\n0.115614056\n0.117493687\n0.114907587\n0.120667384\n0.12634812\n0.147636885\n0.179583467\n0.196154885\n0.201634576\n0.190755459\n0.17541704\n0.172206242\n0.159849434\n0.150009612\n0.144438072\n0.138241673\n0.142690654\n0.148494153\n0.137108267\n0.116622419\n0.110368777\n0.111672512\n0.113523714\n0.112713853\n0.107831036\n0.10412646\n0.099757935\n0.108866209\n0.112083905\n0.130792352\n0.151545909\n0.165809107\n0.165232405\n0.153296429\n0.147062376\n0.144889725\n0.142615711\n0.144592536\n0.141081119\n0.142803113\n0.14813133\n0.154628625\n0.149615403\n0.121130558\n0.12453457\n0.121016123\n0.124603645\n0.12164862\n0.116907833\n0.122898966\n0.131875966\n0.130883679\n0.138345944\n0.156315349\n0.188806084\n0.201595693\n0.201472922\n0.192205714\n0.183563555\n0.16080061\n0.155087228\n0.149167244\n0.143482852\n0.141209377\n0.148510424\n0.166129563\n0.160682912\n0.141986428\n0.129582639\n0.132941228\n0.135651448\n0.139711033\n0.137805316\n0.135513413\n0.132501161\n0.151250191\n0.163671421\n0.180755119\n0.210617579\n0.243598334\n0.237860448\n0.218731973\n0.209540989\n0.18875323\n0.181923635\n0.16846915\n0.167386817\n0.163146298\n0.173533304\n0.195810131\n0.203611582\n0.204392777\n0.189969565\n0.157914763\n0.145912745\n0.139765933\n0.139115076\n0.142741912\n0.149423841\n0.172841192\n0.181792362\n0.205404461\n0.217316816\n0.225108995\n0.212246025\n0.198855763\n0.183082993\n0.158731185\n0.15381733\n0.149859656\n0.140666398\n0.145656202\n0.151344098\n0.165502866\n0.174951769\n0.159088509\n0.127434259\n0.121519885\n0.11699355\n0.106465823\n0.112996856\n0.115179015\n0.111047299\n0.126368202\n0.12512697\n0.12964928\n0.160463662\n0.188822148\n0.170788421\n0.168332062\n0.162677075\n0.158514411\n0.127201816\n0.124448744\n0.126877103\n0.124975657\n0.118309883\n0.124695395\n0.118725563\n0.110627959\n0.112532051\n0.109523117\n0.106549529\n0.104910092\n0.106562995\n0.111579872\n0.109927398\n0.114809483\n0.122167319\n0.125077405\n0.12660864\n0.131554578\n0.134087859\n0.124996278\n0.121105191\n0.120042799\n0.113405\n0.12197942\n0.122911019\n0.120417431\n0.123548617\n0.128103597\n0.123532122\n0.105132639\n0.106426105\n0.10476174\n0.103691588\n0.101951139\n0.114896653\n0.112485913\n0.106107571\n0.105781472\n0.109868751\n0.129932729\n0.141293603\n0.151375275\n0.158743919\n0.146025013\n0.138828422\n0.128272018\n0.123074743\n0.121467561\n0.128592691\n0.133068095\n0.130830374\n0.140223277\n0.128085052\n0.136622443\n0.124140545\n0.119234091\n0.10940946\n0.100004169\n0.101397745\n0.111660584\n0.104144312\n0.107997761\n0.112883082\n0.117764634\n0.131750059\n0.137620627\n0.138003187\n0.130430662\n0.125156462\n0.133540065\n0.132955938\n0.129898768\n0.127620036\n0.124408627\n0.118330945\n0.131655382\n0.123835444\n0.10027511\n0.103860954\n0.106392314\n0.10363017\n0.102120459\n0.108973245\n0.111946851\n0.102929333\n0.107381385\n0.114654306\n0.111334303\n0.137239657\n0.149023334\n0.152991056\n0.144806007\n0.141373888\n0.130663013\n0.126430686\n0.124001704\n0.129475202\n0.127546004\n0.128289892\n0.139907022\n0.12773257\n0.110097695\n0.106138326\n0.116104307\n0.115010153\n0.120469682\n0.122023892\n0.10916779\n0.102267991\n0.111965565\n0.116029129\n0.123762086\n0.155780661\n0.167019129\n0.169760527\n0.158987934\n0.144399924\n0.130653601\n0.136134026\n0.135007228\n0.135924383\n0.120829819\n0.11696863\n0.123692942\n0.120328507\n0.109278849\n0.116323009\n0.113998054\n0.115577386\n0.119455825\n0.126460288\n0.117212589\n0.097499899\n0.099677603\n0.095983601\n0.100498628\n0.129379714\n0.138616973\n0.144582909\n0.146094836\n0.136793959\n0.137381931\n0.134673018\n0.13921384\n0.139148608\n0.138251562\n0.142567675\n0.152132256\n0.155843481\n0.150797367\n0.144579545\n0.142441745\n0.14117486\n0.141668753\n0.132096142\n0.134610759\n0.138373163\n0.139344061\n0.148621112\n0.156741379\n0.176570685\n0.184007513\n0.186297888\n0.167740181\n0.148297527\n0.137341293\n0.127546543\n0.127535576\n0.128251793\n0.12638816\n0.132864302\n0.138669715\n0.120788181\n0.103529756\n0.104399207\n0.10982348\n0.111148323\n0.113153142\n0.109324165\n0.11006988\n0.106673514\n0.105346147\n0.106373795\n0.119133898\n0.149807737\n0.151678877\n0.145831412\n0.143674\n0.132147044\n0.123242105\n0.111952264\n0.102312889\n0.097194046\n0.097684446\n0.104652832\n0.109606531\n0.091655381\n0.085642439\n0.088649998\n0.088705615\n0.090363785\n0.079636219\n0.083052307\n0.084946097\n0.087172663\n0.092251523\n0.098233908\n0.104198541\n0.122535947\n0.131005356\n0.138080485\n0.143618379\n0.139717717\n0.131288169\n0.120248225\n0.11920601\n0.112139697\n0.110548877\n0.107842376\n0.106750726\n0.096593586\n0.082504969\n0.083788583\n0.083224197\n0.078684338\n0.071739569\n0.072223225\n0.072104352\n0.085476309\n0.082028142\n0.093430649\n0.105304058\n0.119682321\n0.11815435\n0.119626927\n0.121481862\n0.128499177\n0.121555659\n0.121606434\n0.115978442\n0.112359392\n0.108878164\n0.106538243\n0.110666011\n0.089887281\n0.080158458\n0.073174866\n0.075781216\n0.078196881\n0.067931041\n0.075447981\n0.07763776\n0.067455514\n0.081130925\n0.076953317\n0.079776613\n0.090777596\n0.099291197\n0.105987188\n0.108803941\n0.1093675\n0.109612801\n0.095576067\n0.096710654\n0.097488055\n0.100455346\n0.098082968\n0.109660819\n0.093903327\n0.088164349\n0.082472565\n0.093926118\n0.103326519\n0.098345615\n0.102444392\n0.099844953\n0.108965333\n0.108142882\n0.113906085\n0.123962928\n0.132519049\n0.137983489\n0.149958993\n0.149142502\n0.140366852\n0.135745189\n0.132774659\n0.129287002\n0.126620728\n0.124374046\n0.133149841\n0.138603792\n0.126601765\n0.10780314\n0.106683081\n0.129954661\n0.123140728\n0.12275613\n0.127107448\n0.112691291\n0.118283784\n0.129064345\n0.127953149\n0.133780933\n0.163018692\n0.17815291\n0.170661106\n0.166686118\n0.1570324\n0.146462385\n0.141329021\n0.128713822\n0.124239405\n0.121616288\n0.130757819\n0.13559043\n0.11786885\n0.09663019\n0.096011989\n0.096539276\n0.101048953\n0.10467421\n0.104157583\n0.096477164\n0.096685341\n0.108260149\n0.115266088\n0.125207852\n0.173381367\n0.189030004\n0.179274158\n0.177714464\n0.172041225\n0.157283681\n0.150166316\n0.139181447\n0.136396075\n0.135074239\n0.138721596\n0.142533843\n0.134011085\n0.111600106\n0.109053565\n0.118230864\n0.116901252\n0.115897691\n0.108214502\n0.111252918\n0.110536117\n0.117165659\n0.119858059\n0.139648965\n0.168510432\n0.175673018\n0.164671747\n0.161744437\n0.157670115\n0.152354884\n0.143315016\n0.133988683\n0.129316802\n0.128703243\n0.13149163\n0.131225594\n0.106330133\n0.097340861\n0.093359181\n0.096946696\n0.094034631\n0.095344173\n0.097419395\n0.097685706\n0.092588661\n0.103365918\n0.10755438\n0.126007857\n0.147708026\n0.15728397\n0.171725029\n0.17594429\n0.161058173\n0.157797632\n0.144171233\n0.132781835\n0.127148412\n0.121488017\n0.123813497\n0.120161993\n0.103807145\n0.109056587\n0.107854939\n0.109332499\n0.111118222\n0.10637456\n0.107603406\n0.100586467\n0.095270941\n0.098860815\n0.107030437\n0.120878613\n0.141891135\n0.154273054\n0.161278533\n0.150615381\n0.14211207\n0.140090497\n0.122889161\n0.115277894\n0.115624728\n0.122207431\n0.126272918\n0.131321736\n0.124576867\n0.109386478\n0.110592478\n0.108060158\n0.108672338\n0.111076161\n0.111029688\n0.10771916\n0.110862986\n0.117426849\n0.122713477\n0.136256745\n0.171714829\n0.184996108\n0.186004915\n0.177498158\n0.165354929\n0.144968498\n0.133768666\n0.134232365\n0.127799141\n0.132053435\n0.134640057\n0.147270779\n0.14337594\n0.125386747\n0.122544423\n0.126807798\n0.129849015\n0.12450884\n0.12296763\n0.129128228\n0.142699206\n0.156022987\n0.149607978\n0.164140706\n0.187079359\n0.208305667\n0.211203565\n0.200123654\n0.186213776\n0.173078885\n0.163502304\n0.151783666\n0.149305827\n0.149009175\n0.149469304\n0.148896419\n0.138621184\n0.127786611\n0.120333164\n0.121731578\n0.123627829\n0.130406003\n0.145435864\n0.150974143\n0.147488042\n0.152759075\n0.168016392\n0.19263178\n0.22192671\n0.228014549\n0.22856794\n0.216914327\n0.197493137\n0.188626589\n0.175742353\n0.157218707\n0.150052186\n0.141185094\n0.141555962\n0.148078343\n0.131911505\n0.114278815\n0.111428888\n0.101545215\n0.094472185\n0.097593375\n0.095200858\n0.094588589\n0.101873731\n0.11394595\n0.117779512\n0.136607164\n0.173111386\n0.184569342\n0.180262301\n0.177371505\n0.16861154\n0.151739438\n0.140169077\n0.130139904\n0.125365279\n0.127564631\n0.127366478\n0.135122918\n0.122144077\n0.108316825\n0.108094621\n0.103667309\n0.108436507\n0.10650184\n0.104312165\n0.101601683\n0.102447583\n0.112961305\n0.117877156\n0.122187642\n0.139144899\n0.15709184\n0.155211607\n0.154431264\n0.142234779\n0.127083998\n0.116343355\n0.112259513\n0.11760248\n0.117797726\n0.120754696\n0.126912767\n0.120863773\n0.112912627\n0.112301569\n0.114678917\n0.110765654\n0.11214403\n0.10742377\n0.105979048\n0.101395957\n0.124010511\n0.118453184\n0.143606895\n0.187928179\n0.212785968\n0.206781344\n0.208541962\n0.208725569\n0.210770934\n0.204799559\n0.192757433\n0.179939845\n0.175979843\n0.173361223\n0.165936742\n0.145084705\n0.137113859\n0.11648458\n0.113166038\n0.115399936\n0.114567154\n0.113953756\n0.115139957\n0.117788722\n0.138002642\n0.152488021\n0.185454653\n0.22949211\n0.251348417\n0.251619653\n0.252402112\n0.244794573\n0.236805225\n0.232777687\n0.218929354\n0.211640486\n0.206932888\n0.212291952\n0.211736617\n0.186029278\n0.161538626\n0.147513833\n0.154354842\n0.159087297\n0.168126762\n0.185303738\n0.198618926\n0.21087654\n0.227415441\n0.247449471\n0.266167335\n0.28426733\n0.302191598\n0.303481859\n0.279427917\n0.270884881\n0.263181081\n0.255483135\n0.24833087\n0.243914221\n0.240419741\n0.244384094\n0.245678028\n0.213226134\n0.19204308\n0.176281711\n0.188280118\n0.199390059\n0.212998047\n0.228901925\n0.237539801\n0.243283633\n0.254878781\n0.263813787\n0.279575147\n0.298167838\n0.305653538\n0.298642417\n0.288679745\n0.282409006\n0.268713151\n0.259353616\n0.24678013\n0.237917052\n0.235429508\n0.240948195\n0.244060853\n0.215447446\n0.182981099\n0.173330058\n0.189449465\n0.191999427\n0.19859968\n0.208751759\n0.21680332\n0.223767658\n0.229592702\n0.236574317\n0.254434864\n0.276083229\n0.290310362\n0.280976666\n0.264238187\n0.25082423\n0.231348513\n0.213682116\n0.204528821\n0.198763\n0.190187858\n0.193789082\n0.193420475\n0.172048908\n0.14480235\n0.129522017\n0.133072441\n0.132385428\n0.12984197\n0.137894549\n0.126751186\n0.13299266\n0.14873029\n0.157334146\n0.170839177\n0.19798834\n0.207804532\n0.207866636\n0.20817285\n0.199936011\n0.190706238\n0.169157542\n0.159686878\n0.152064478\n0.148975091\n0.146444725\n0.151199655\n0.129786661\n0.111789958\n0.114681812\n0.109981617\n0.109394606\n0.105153789\n0.092374093\n0.093023592\n0.10003204\n0.107567684\n0.122738955\n0.140690777\n0.169621548\n0.189407613\n0.190491685\n0.185042461\n0.174956118\n0.161390557\n0.155129262\n0.151698458\n0.148927754\n0.145664\n0.148957706\n0.149182042\n0.11672787\n0.099238327\n0.094937166\n0.09416615\n0.092277827\n0.094419229\n0.094044616\n0.095915812\n0.096499315\n0.104981147\n0.113401008\n0.12446861\n0.161249689\n0.182259511\n0.182459351\n0.18191521\n0.187474663\n0.174874287\n0.162993604\n0.155066997\n0.154587338\n0.152451585\n0.155024251\n0.151679824\n0.130426334\n0.114405571\n0.109508401\n0.10508782\n0.106098833\n0.100905267\n0.102933926\n0.103602108\n0.100197495\n0.12066496\n0.12326576\n0.137944264\n0.175447303\n0.194163566\n0.193186179\n0.193583348\n0.188161033\n0.179872859\n0.169487236\n0.172031076\n0.179471586\n0.178955158\n0.184810879\n0.180913496\n0.169405012\n0.148533768\n0.138654826\n0.138615246\n0.139049727\n0.140773862\n0.144400562\n0.147818183\n0.146636457\n0.150057161\n0.155445682\n0.176095811\n0.209034312\n0.225342397\n0.226093469\n0.225363798\n0.220037783\n0.206957665\n0.199602392\n0.190641339\n0.188418704\n0.182440186\n0.181446392\n0.181360196\n0.167501788\n0.144569417\n0.13706867\n0.138331026\n0.136896469\n0.139720683\n0.131970677\n0.139926617\n0.141900608\n0.149466025\n0.15032022\n0.164357726\n0.198895782\n0.216077926\n0.213835815\n0.20312686\n0.196906532\n0.185348635\n0.168746521\n0.16268071\n0.159979704\n0.154513048\n0.155068781\n0.163543631\n0.140897534\n0.129108323\n0.127541495\n0.129204414\n0.129881808\n0.135035346\n0.139943838\n0.135130094\n0.13335001\n0.136959292\n0.138924118\n0.150745568\n0.186127823\n0.208644987\n0.209100026\n0.199764038\n0.18179354\n0.165509403\n0.151934133\n0.137539012\n0.129062892\n0.122494097\n0.123623153\n0.127358128\n0.114109288\n0.102843098\n0.098606513\n0.102850368\n0.101432204\n0.09829171\n0.094846595\n0.097178339\n0.093121266\n0.098076911\n0.105607177\n0.130143443\n0.167298915\n0.190606734\n0.189554505\n0.178422192\n0.166480511\n0.154569648\n0.15748056\n0.159951364\n0.154816805\n0.144815837\n0.143802525\n0.148121159\n0.131748733\n0.100464616\n0.087307694\n0.093309436\n0.093112777\n0.087688028\n0.089278812\n0.089175851\n0.09152905\n0.098721459\n0.104325212\n0.112717626\n0.143665325\n0.169715235\n0.166089638\n0.168037171\n0.164321197\n0.161963362\n0.15445242\n0.149409028\n0.146735026\n0.152488915\n0.157235141\n0.157192262\n0.132268889\n0.10582855\n0.105019489\n0.097464142\n0.096220166\n0.104225285\n0.10311046\n0.099193081\n0.095125478\n0.116652806\n0.125095937\n0.145992994\n0.18540326\n0.205998552\n0.212584646\n0.208835174\n0.199765195\n0.193296879\n0.188706701\n0.183684751\n0.185488303\n0.180502262\n0.177693231\n0.178999285\n0.144329413\n0.116376331\n0.105824973\n0.10218141\n0.103239357\n0.098206642\n0.09630043\n0.099020872\n0.109577289\n0.128505655\n0.137953373\n0.160863919\n0.206081557\n0.23338779\n0.234625153\n0.221497056\n0.207789664\n0.186598252\n0.17960062\n0.172465294\n0.166131545\n0.169033331\n0.170211486\n0.170093142\n0.153683668\n0.134362782\n0.134168645\n0.139097315\n0.138492568\n0.140254475\n0.141736565\n0.14430118\n0.148682454\n0.1534212\n0.163725138\n0.181309352\n0.221158992\n0.236164016\n0.23135758\n0.226749805\n0.20958764\n0.197914974\n0.186876142\n0.18277571\n0.173299212\n0.168456033\n0.168992612\n0.175238875\n0.168076115\n0.149303172\n0.144648874\n0.156312069\n0.155574292\n0.14967508\n0.152040343\n0.145260867\n0.150391474\n0.151126051\n0.154536785\n0.168137868\n0.1940829\n0.209193145\n0.210371422\n0.205904813\n0.204912371\n0.184341683\n0.172038583\n0.16460662\n0.158130481\n0.154072098\n0.159762943\n0.159939715\n0.144699584\n0.132165443\n0.127809282\n0.130053228\n0.123554541\n0.118823421\n0.115708747\n0.115291497\n0.112413193\n0.114483002\n0.114094491\n0.125062675\n0.15643038\n0.178617291\n0.185509915\n0.188313044\n0.185078362\n0.170399824\n0.165712445\n0.160184881\n0.155397675\n0.154791635\n0.155684985\n0.157630236\n0.143323603\n0.120875275\n0.120115326\n0.11662847\n0.129591153\n0.128751503\n0.120306628\n0.117920894\n0.118853823\n0.125166271\n0.122982547\n0.136363934\n0.171143709\n0.189784848\n0.189886246\n0.191972053\n0.187138967\n0.178528539\n0.16258417\n0.162965198\n0.169440425\n0.171160607\n0.178807326\n0.168860713\n0.154171993\n0.123605933\n0.126217403\n0.126705683\n0.12571609\n0.129445379\n0.131297454\n0.135857893\n0.147040968\n0.141911802\n0.14566775\n0.157512689\n0.18275566\n0.203012039\n0.206806214\n0.207985972\n0.199121938\n0.193271363\n0.188989247\n0.174913425\n0.181245486\n0.183164693\n0.183598513\n0.181076508\n0.181682904\n0.158725475\n0.140961974\n0.133159446\n0.132478609\n0.128973102\n0.133466323\n0.137491336\n0.150573972\n0.160384404\n0.169213361\n0.192492378\n0.211459408\n0.216708014\n0.219799869\n0.222979084\n0.213095777\n0.201225473\n0.18592383\n0.180817537\n0.179673452\n0.174494146\n0.171213695\n0.17671645\n0.167096296\n0.138361179\n0.126588395\n0.121207886\n0.121904468\n0.126270582\n0.123297082\n0.116159484\n0.120724539\n0.129140187\n0.145341653\n0.158509698\n0.195386156\n0.22062278\n0.21792102\n0.217218259\n0.205940289\n0.183629226\n0.181819867\n0.174525535\n0.166318459\n0.167543234\n0.178646364\n0.179831354\n0.147980505\n0.125521756\n0.118631837\n0.128590126\n0.132269963\n0.134096813\n0.135330621\n0.137104017\n0.135503424\n0.137701679\n0.148296637\n0.168013605\n0.198359647\n0.22533388\n0.218406011\n0.210616749\n0.206316856\n0.188861571\n0.185210228\n0.171753842\n0.163868589\n0.155902621\n0.151359516\n0.15586314\n0.13108958\n0.116799563\n0.112681444\n0.1086867\n0.107167476\n0.110812298\n0.10866888\n0.108438678\n0.117462555\n0.128133951\n0.137003863\n0.150284935\n0.192389329\n0.213254403\n0.213957471\n0.208396654\n0.199649454\n0.187055195\n0.180417164\n0.17590524\n0.168110494\n0.160511926\n0.162441879\n0.161846912\n0.13480405\n0.117745667\n0.108268454\n0.106390507\n0.107426108\n0.105582474\n0.106528948\n0.107240533\n0.117143858\n0.131414628\n0.139639632\n0.156000197\n0.194231604\n0.212508564\n0.212408224\n0.206153015\n0.203793365\n0.190239868\n0.176854192\n0.15823341\n0.151048506\n0.145595361\n0.136621157\n0.135773459\n0.122930754\n0.103372108\n0.102135141\n0.10505591\n0.104638937\n0.10302653\n0.115170898\n0.088090613\n0.087653558\n0.098699013\n0.11006013\n0.162805626\n0.193639134\n0.193725056\n0.187052278\n0.187358197\n0.184004379\n0.184447776\n0.179835793\n0.178258504\n0.172358687\n0.168732113\n0.168901815\n0.176981603\n0.156797393\n0.127575786\n0.118693795\n0.117603872\n0.120521773\n0.126620762\n0.127706248\n0.135552624\n0.140320439\n0.14573008\n0.15325655\n0.167403768\n0.202448793\n0.216215084\n0.22206123\n0.219452091\n0.213010594\n0.195689678\n0.183569202\n0.17067062\n0.165761859\n0.163928487\n0.166833062\n0.161393374\n0.144102107\n0.12073806\n0.107431309\n0.111157177\n0.109322324\n0.110310041\n0.113317354\n0.113437371\n0.12210968\n0.130818893\n0.142854738\n0.161529659\n0.194420614\n0.211710315\n0.208834494\n0.206711278\n0.193658908\n0.175076114\n0.166982101\n0.159146972\n0.157712761\n0.160136835\n0.160996608\n0.159503092\n0.150903879\n0.130750842\n0.118052887\n0.116433941\n0.113332891\n0.112576617\n0.104307416\n0.099070641\n0.096819453\n0.10963834\n0.115533785\n0.141373889\n0.17345247\n0.191987125\n0.198818805\n0.200561907\n0.185221033\n0.176608954\n0.168131038\n0.156555484\n0.149579766\n0.155072119\n0.15988641\n0.157110432\n0.14301787\n0.122641648\n0.116158316\n0.113547033\n0.107698491\n0.106008795\n0.107304172\n0.098931725\n0.101115591\n0.109174527\n0.121892874\n0.146526017\n0.179006441\n0.202015861\n0.205169397\n0.208545236\n0.201540918\n0.192556661\n0.182109985\n0.17364481\n0.170340451\n0.172270082\n0.178320599\n0.187574996\n0.170154765\n0.143293391\n0.136785188\n0.139072511\n0.142841647\n0.14573324\n0.152397294\n0.158884558\n0.156550471\n0.166612425\n0.179427817\n0.19764185\n0.227976042\n0.236458213\n0.23736368\n0.234242765\n0.234208695\n0.228729047\n0.216865608\n0.214604318\n0.209650828\n0.203379472\n0.202879025\n0.210636853\n0.19241779\n0.163466723\n0.160677695\n0.155222032\n0.160345228\n0.171741909\n0.176568801\n0.17071247\n0.173715169\n0.185799153\n0.191600663\n0.206300924\n0.234644985\n0.245998174\n0.25010856\n0.247323569\n0.248611575\n0.239116663\n0.227135061\n0.226086466\n0.218225246\n0.209869956\n0.21405681\n0.225100782\n0.209624758\n0.181132959\n0.174167046\n0.176830808\n0.181890772\n0.180670695\n0.191644984\n0.196864203\n0.204990028\n0.206904666\n0.20910056\n0.219968782\n0.241748025\n0.247957228\n0.247560545\n0.24383485\n0.252478452\n0.244740429\n0.24213774\n0.230300254\n0.225101916\n0.227172656\n0.234939318\n0.243250641\n0.22141798\n0.194784595\n0.184671215\n0.181201211\n0.186390154\n0.18449891\n0.212488123\n0.215638512\n0.220423669\n0.214448698\n0.215369722\n0.228750447\n0.25715449\n0.266911436\n0.260297452\n0.255916353\n0.2539289\n0.255100377\n0.240420067\n0.229988457\n0.224617806\n0.221116304\n0.2193372\n0.23547377\n0.209420286\n0.171673587\n0.163937773\n0.162510304\n0.163618307\n0.168006952\n0.173689535\n0.181813832\n0.190496638\n0.199814075\n0.215749145\n0.233665637\n0.261907509\n0.275427568\n0.26743115\n0.26592812\n0.268008893\n0.257188453\n0.248429948\n0.232900702\n0.229941555\n0.227692782\n0.22600384\n0.221389229\n0.193838362\n0.154996596\n0.145329595\n0.142739284\n0.146343877\n0.142952244\n0.146804304\n0.160479226\n0.172023436\n0.181776546\n0.193332293\n0.209731581\n0.241958942\n0.262586006\n0.26771956\n0.266244301\n0.254330854\n0.238220266\n0.230875928\n0.223800543\n0.220248814\n0.217225268\n0.218055016\n0.220216291\n0.19551145\n0.167965388\n0.153263703\n0.148666167\n0.155653222\n0.164154785\n0.171245139\n0.173099443\n0.181808192\n0.188377833\n0.199524199\n0.212027782\n0.235300484\n0.253540837\n0.245373633\n0.24679171\n0.247652765\n0.237301073\n0.218629486\n0.207473626\n0.202800979\n0.202575364\n0.205029036\n0.207269497\n0.185440091\n0.15738463\n0.148662134\n0.144844139\n0.148735225\n0.151310343\n0.162262978\n0.165474279\n0.168006684\n0.1797029\n0.194179673\n0.205297931\n0.229284069\n0.246278776\n0.250941907\n0.247876357\n0.239790232\n0.229294058\n0.212105038\n0.201634234\n0.194247655\n0.194176532\n0.193371082\n0.200361166\n0.185507623\n0.156790788\n0.15793636\n0.161831244\n0.158238455\n0.163343784\n0.168600226\n0.171173592\n0.178017459\n0.192479301\n0.196703183\n0.21021259\n0.238332712\n0.256022516\n0.25218005\n0.248342489\n0.249496509\n0.240446877\n0.226552771\n0.213506637\n0.209843908\n0.205657367\n0.206675405\n0.205027463\n0.182183503\n0.155476249\n0.146836915\n0.142114079\n0.137638536\n0.13751237\n0.141757632\n0.141895383\n0.143343972\n0.153989443\n0.167280802\n0.184490186\n0.21788215\n0.236398866\n0.238124404\n0.232303589\n0.229004898\n0.224403794\n0.222917693\n0.211499224\n0.209285189\n0.202609494\n0.202017776\n0.210133647\n0.183044372\n0.152390748\n0.148058975\n0.15024615\n0.153655749\n0.145140342\n0.143384551\n0.147358327\n0.152274717\n0.156368481\n0.16492797\n0.185136236\n0.214201915\n0.232199255\n0.231573732\n0.233412361\n0.238515459\n0.231502228\n0.222588017\n0.20826248\n0.207005434\n0.200531878\n0.198615079\n0.20418339\n0.176357284\n0.139662324\n0.126900477\n0.123995662\n0.128342224\n0.132010709\n0.140498198\n0.137673717\n0.148691389\n0.155423997\n0.167557169\n0.188079936\n0.219677213\n0.230428095\n0.236761229\n0.246985085\n0.251429907\n0.240481166\n0.239962228\n0.238154488\n0.234083963\n0.227636286\n0.229285053\n0.235446212\n0.209907819\n0.174375827\n0.163710981\n0.158145451\n0.160027521\n0.161169517\n0.16171462\n0.176247277\n0.190805567\n0.216902639\n0.233081467\n0.255255747\n0.276871264\n0.279568521\n0.273527846\n0.278662609\n0.284196263\n0.271456117\n0.266961979\n0.2557257\n0.253293194\n0.256609845\n0.254410596\n0.258293503\n0.239407972\n0.212361517\n0.206399915\n0.209124751\n0.211600011\n0.212285289\n0.230680468\n0.243610883\n0.24753261\n0.25792744\n0.264406341\n0.278381318\n0.298025201\n0.302895652\n0.297994719\n0.298803455\n0.30149533\n0.289856817\n0.27579673\n0.270296206\n0.267489314\n0.273812229\n0.279568143\n0.285532125\n0.275270617\n0.257491342\n0.244774013\n0.235484796\n0.244998414\n0.255030623\n0.257563266\n0.255872021\n0.264500145\n0.263556404\n0.27410056\n0.283200729\n0.297960251\n0.304047459\n0.296390276\n0.295760339\n0.294370394\n0.287108391\n0.282583207\n0.27381007\n0.272051141\n0.273969946\n0.279900619\n0.273725155\n0.257217266\n0.228155593\n0.220459748\n0.224433709\n0.233239292\n0.24875133\n0.259773347\n0.257733095\n0.258702942\n0.255934041\n0.256635825\n0.271336566\n0.290687517\n0.29502566\n0.295969461\n0.289751252\n0.288056515\n0.285712548\n0.277778132\n0.275766332\n0.273956094\n0.274784387\n0.278520381\n0.284410145\n0.275507197\n0.258414035\n0.257243333\n0.256655929\n0.244643596\n0.257604299\n0.264613049\n0.271207034\n0.277255855\n0.281428254\n0.288024767\n0.294930612\n0.300111631\n0.304509181\n0.297311285\n0.292675548\n0.290370581\n0.288252181\n0.289755028\n0.28481807\n0.28145928\n0.278025274\n0.280252006\n0.2796413\n0.257461893\n0.221747203\n0.210372896\n0.208945706\n0.211840275\n0.217225746\n0.231657109\n0.226717705\n0.230193526\n0.237082625\n0.234210125\n0.2459178\n0.269057475\n0.280816545\n0.275653496\n0.274332306\n0.264219308\n0.256205433\n0.247387097\n0.244683718\n0.246289695\n0.248758507\n0.251235445\n0.255247687\n0.233591328\n0.203449603\n0.188870376\n0.188233644\n0.190527602\n0.191596945\n0.201190475\n0.203446998\n0.210240483\n0.214890687\n0.222772372\n0.239336224\n0.272804368\n0.278786469\n0.273460478\n0.275246466\n0.275723422\n0.269831034\n0.265986219\n0.259949524\n0.259373378\n0.257286041\n0.261687825\n0.257789186\n0.23996812\n0.209507854\n0.192655044\n0.189781146\n0.183515039\n0.18152357\n0.19028171\n0.206375892\n0.214838572\n0.22627498\n0.228695692\n0.25301407\n0.294873743\n0.305336917\n0.294468908\n0.29166585\n0.284262138\n0.27038465\n0.257440281\n0.25163651\n0.250187016\n0.248565966\n0.244470391\n0.24627284\n0.230627054\n0.20849919\n0.194028124\n0.187570966\n0.189335101\n0.186030782\n0.191234918\n0.198808977\n0.205078672\n0.212271622\n0.221085608\n0.243507727\n0.272928486\n0.282018907\n0.279916002\n0.276911935\n0.262933147\n0.256867696\n0.244663057\n0.241106673\n0.238923727\n0.233841192\n0.234215453\n0.242596477\n0.225486708\n0.202835853\n0.195180935\n0.193569232\n0.196520541\n0.204019078\n0.204811494\n0.212046091\n0.212084528\n0.217113438\n0.220129678\n0.225846441\n0.24885297\n0.25504518\n0.255293123\n0.248035429\n0.245330399\n0.241435836\n0.250723018\n0.252259529\n0.251643294\n0.261231335\n0.255014523\n0.254259583\n0.238159144\n0.217340783\n0.21376985\n0.199879851\n0.201790248\n0.196152048\n0.195651347\n0.192237506\n0.20498133\n0.216071778\n0.217809919\n0.228949765\n0.265694916\n0.272856345\n0.2738294\n0.2729736\n0.273815649\n0.266438439\n0.252411791\n0.24490099\n0.241948324\n0.241556841\n0.242189133\n0.244660427\n0.223750306\n0.190009219\n0.172452963\n0.171675897\n0.174542361\n0.178976834\n0.186681073\n0.184901613\n0.197800193\n0.205662676\n0.213574771\n0.230623052\n0.258905463\n0.268038192\n0.262677057\n0.253960153\n0.250529104\n0.247903474\n0.235396853\n0.225794954\n0.235798904\n0.228436902\n0.227734704\n0.239665314\n0.225540871\n0.190370928\n0.18027933\n0.181046323\n0.181781469\n0.193461577\n0.201332543\n0.212633891\n0.218842688\n0.22329439\n0.22379663\n0.228663788\n0.258397156\n0.272814543\n0.261308112\n0.267896514\n0.26582935\n0.262110405\n0.257998776\n0.248754408\n0.249302327\n0.248142323\n0.249090061\n0.257875778\n0.246292125\n0.200302451\n0.188724242\n0.184437263\n0.18562667\n0.185845911\n0.19321519\n0.20155161\n0.210313247\n0.220844336\n0.223925882\n0.241389826\n0.275775869\n0.279666337\n0.273735504\n0.27128106\n0.267731198\n0.265939623\n0.257687829\n0.258719645\n0.249072883\n0.246999005\n0.247933391\n0.253654086\n0.226054056\n0.192710162\n0.179269939\n0.176431302\n0.176977989\n0.178476496\n0.197506224\n0.203940443\n0.214241118\n0.223248756\n0.233167503\n0.250092723\n0.284190509\n0.288728227\n0.28337217\n0.278084381\n0.281432261\n0.271050943\n0.258915707\n0.256389429\n0.249339288\n0.250683125\n0.251746557\n0.255364712\n0.238326479\n0.221753657\n0.214171097\n0.203903176\n0.203782366\n0.207383502\n0.217503956\n0.234914421\n0.242989283\n0.249978214\n0.260656597\n0.282038749\n0.302855584\n0.301630596\n0.297445745\n0.293439854\n0.287386685\n0.276456426\n0.263467251\n0.259462956\n0.262621283\n0.262936187\n0.26306007\n0.265425416\n0.262195928\n0.243813902\n0.237048457\n0.236002249\n0.234743784\n0.236534965\n0.236351033\n0.245589989\n0.254334041\n0.258982525\n0.267625988\n0.280618127\n0.301651724\n0.303140019\n0.298301503\n0.295436582\n0.28507977\n0.280875884\n0.264822004\n0.251977866\n0.25351072\n0.251030465\n0.252333657\n0.250998947\n0.23975782\n0.21955358\n0.201302521\n0.200776378\n0.205546244\n0.206785245\n0.211952871\n0.221402229\n0.235142251\n0.245796664\n0.241060875\n0.251076017\n0.277024125\n0.283704004\n0.277523913\n0.271502018\n0.264266331\n0.247516\n0.235547854\n0.228470059\n0.231542535\n0.233231451\n0.231838732\n0.237190715\n0.21658309\n0.189211973\n0.176189082\n0.169426182\n0.168263609\n0.169543188\n0.173581633\n0.182227222\n0.183612931\n0.187738075\n0.191855295\n0.205249575\n0.243839162\n0.250097967\n0.243062089\n0.242952009\n0.244012981\n0.24155216\n0.23245549\n0.22753196\n0.227516502\n0.229078853\n0.233609589\n0.239273883\n0.223823912\n0.184779107\n0.160775803\n0.154468319\n0.151808879\n0.154380594\n0.158835725\n0.165663631\n0.168405795\n0.177482164\n0.183532513\n0.202772649\n0.237368615\n0.247823543\n0.254170275\n0.257121886\n0.24642004\n0.234792654\n0.227338676\n0.221961846\n0.218876552\n0.218102063\n0.222208477\n0.222260964\n0.195949409\n0.139579867\n0.118688653\n0.135764033\n0.127138046\n0.120991783\n0.117065346\n0.12462923\n0.128717512\n0.14265126\n0.149956705\n0.175546407\n0.212246648\n0.226014741\n0.225405702\n0.228824472\n0.233798084\n0.2183302\n0.209600619\n0.201358686\n0.193049151\n0.194959509\n0.197559534\n0.199375532\n0.174099705\n0.13421974\n0.122112647\n0.110759989\n0.11369543\n0.112100772\n0.116769721\n0.120774968\n0.126566363\n0.145088518\n0.156693555\n0.177611172\n0.214669792\n0.232664714\n0.235232198\n0.238826172\n0.23770801\n0.231265712\n0.225193388\n0.231121611\n0.234264809\n0.237112289\n0.236892092\n0.242590473\n0.223647941\n0.187505565\n0.173760011\n0.166725647\n0.169035332\n0.177719544\n0.184144899\n0.196534557\n0.205568946\n0.219199909\n0.224916221\n0.243064265\n0.270522381\n0.274955204\n0.273908\n0.274336474\n0.280244292\n0.273597884\n0.269191443\n0.267266994\n0.264861969\n0.26235052\n0.269763125\n0.275399101\n0.263838214\n0.216562429\n0.186022549\n0.199530578\n0.195784338\n0.204466511\n0.213221588\n0.217036289\n0.223975828\n0.230935313\n0.246623325\n0.264266115\n0.293767499\n0.293965957\n0.291057643\n0.289069104\n0.299319859\n0.289560925\n0.287160208\n0.282830612\n0.274703189\n0.278339798\n0.276179407\n0.274887554\n0.254241425\n0.212778888\n0.194904543\n0.189393282\n0.201417535\n0.208577028\n0.221132181\n0.228887321\n0.239903502\n0.248094674\n0.25373918\n0.269647832\n0.30064116\n0.302756959\n0.297126203\n0.282812035\n0.28601729\n0.276308326\n0.266687704\n0.263168047\n0.262542904\n0.262518545\n0.261973361\n0.267561644\n0.250503073\n0.219031716\n0.203119401\n0.20039829\n0.197547574\n0.209228828\n0.217601134\n0.229666083\n0.234699101\n0.244016335\n0.248930514\n0.265785216\n0.294409805\n0.298947641\n0.288710833\n0.27767666\n0.269330951\n0.256754345\n0.245851605\n0.234713011\n0.229046479\n0.227074445\n0.23557876\n0.231568236\n0.222119803\n0.198004892\n0.186980022\n0.183576413\n0.179804911\n0.188391279\n0.199877627\n0.206405361\n0.211680598\n0.21753871\n0.218486402\n0.240757916\n0.278344724\n0.284246767\n0.273939496\n0.269032684\n0.2653696\n0.253000393\n0.251675799\n0.247891674\n0.243313629\n0.234941734\n0.228033108\n0.228333536\n0.205166294\n0.176960777\n0.157894598\n0.152449265\n0.147708678\n0.15092389\n0.153971981\n0.159933128\n0.163620674\n0.172630666\n0.17978019\n0.20765003\n0.24650055\n0.249920746\n0.251642028\n0.256274855\n0.260056707\n0.255162384\n0.24455501\n0.238048861\n0.237340187\n0.236790023\n0.235456483\n0.239197835\n0.21981474\n0.172032567\n0.151506406\n0.143470427\n0.146464682\n0.148083267\n0.149413113\n0.152721375\n0.160833049\n0.172072355\n0.190236765\n0.220763792\n0.264016886\n0.263218275\n0.265599741\n0.265559102\n0.262258743\n0.252291861\n0.242263864\n0.241077299\n0.242287603\n0.240845064\n0.246378394\n0.24910443\n0.230385771\n0.202723415\n0.177985845\n0.174735995\n0.175614687\n0.176468012\n0.178057155\n0.181109717\n0.191815218\n0.206432293\n0.21345063\n0.240699165\n0.280090157\n0.275847783\n0.270171123\n0.267181265\n0.265382344\n0.25890432\n0.248649099\n0.244445796\n0.250983114\n0.256449629\n0.261462165\n0.264739791\n0.245424543\n0.199997481\n0.178801811\n0.173562287\n0.175267314\n0.173570573\n0.186099402\n0.195900024\n0.200760352\n0.208138922\n0.215494776\n0.239674642\n0.275113931\n0.267717098\n0.264858334\n0.257253118\n0.251304134\n0.236206239\n0.216493198\n0.207957546\n0.203483913\n0.20464536\n0.224541698\n0.229799867\n0.216836701\n0.177859679\n0.167042791\n0.169203209\n0.172780288\n0.184435505\n0.194151687\n0.196700835\n0.195944725\n0.21544009\n0.21370362\n0.237835507\n0.264869793\n0.264557267\n0.260057477\n0.255589496\n0.253684911\n0.236733603\n0.223627016\n0.225347787\n0.222111807\n0.216832761\n0.225311075\n0.228578453\n0.224956566\n0.199521983\n0.185393619\n0.170851999\n0.1746687\n0.175032872\n0.183371535\n0.190046295\n0.198782954\n0.208972797\n0.225050187\n0.24977458\n0.274835642\n0.274224856\n0.268982807\n0.26514858\n0.262891714\n0.254783108\n0.249286698\n0.254937704\n0.257092422\n0.262747317\n0.270228475\n0.26935696\n0.262682\n0.222709014\n0.194947417\n0.187732996\n0.186486871\n0.190307009\n0.198643461\n0.205497178\n0.214816831\n0.225491484\n0.234165324\n0.259756854\n0.287164441\n0.282231021\n0.282185343\n0.277929438\n0.279425716\n0.286116626\n0.282969491\n0.275241372\n0.271735072\n0.26703225\n0.263872132\n0.260611005\n0.243488964\n0.199565249\n0.175504892\n0.168690663\n0.170146545\n0.168322287\n0.176464052\n0.185415992\n0.198963453\n0.214055573\n0.22488825\n0.257609262\n0.290746551\n0.287958832\n0.284198855\n0.286326803\n0.285168165\n0.277822769\n0.265820942\n0.251457001\n0.241686132\n0.238680835\n0.228729154\n0.226560656\n0.213898437\n0.187033321\n0.16508714\n0.152290493\n0.159198274\n0.171431933\n0.192405319\n0.213921636\n0.202028078\n0.212141424\n0.230587417\n0.256981646\n0.282620307\n0.280572791\n0.275646834\n0.271165341\n0.259221411\n0.246455367\n0.236188588\n0.238141112\n0.237247915\n0.241522419\n0.240756233\n0.252258913\n0.251050566\n0.234062541\n0.218418315\n0.215645983\n0.216865884\n0.227443349\n0.234323814\n0.244936143\n0.253111055\n0.260058116\n0.268910578\n0.287180418\n0.306645598\n0.303419413\n0.29103985\n0.287774695\n0.286742366\n0.27451709\n0.267276462\n0.264740496\n0.260873967\n0.262356182\n0.265286599\n0.27474448\n0.259095641\n0.23341739\n0.215263403\n0.219672483\n0.223378411\n0.232737529\n0.240963004\n0.246438593\n0.252222734\n0.260430405\n0.269502221\n0.28622756\n0.306659409\n0.302228608\n0.293151058\n0.293671527\n0.29364071\n0.28338127\n0.267269295\n0.2638907\n0.257827293\n0.267025781\n0.26599238\n0.273869339\n0.260581105\n0.223046691\n0.200232675\n0.193192622\n0.190052863\n0.191100043\n0.197335308\n0.211268699\n0.213973635\n0.226301377\n0.238753754\n0.265202182\n0.290556411\n0.287069633\n0.282085443\n0.27403126\n0.256693968\n0.246654046\n0.244475452\n0.238734038\n0.238635153\n0.242586054\n0.249078923\n0.255223764\n0.243205101\n0.207214614\n0.183041282\n0.177531325\n0.179052322\n0.1872417\n0.197374721\n0.206702038\n0.212048167\n0.221169672\n0.227305324\n0.248384452\n0.278845668\n0.277917169\n0.275438513\n0.27712372\n0.281738657\n0.273131529\n0.25976165\n0.246602953\n0.236344028\n0.235868469\n0.248474968\n0.258341377\n0.24954554\n0.210310244\n0.194511926\n0.20078858\n0.198728441\n0.208407605\n0.210163002\n0.228257155\n0.227385701\n0.233909593\n0.234162431\n0.26007629\n0.282897094\n0.275963981\n0.277549373\n0.27236761\n0.2600667\n0.267791682\n0.266191152\n0.254147638\n0.248855996\n0.245797503\n0.246664878\n0.259720254\n0.247098249\n0.204354376\n0.191406047\n0.18153938\n0.18237882\n0.192140209\n0.198546327\n0.212888988\n0.225935872\n0.230127795\n0.235812428\n0.259443362\n0.281353957\n0.281794714\n0.283421088\n0.286237676\n0.281183394\n0.272549461\n0.267666479\n0.266468222\n0.258121933\n0.25877749\n0.254740318\n0.256631917\n0.247524452\n0.198414423\n0.184643204\n0.170072627\n0.17660005\n0.190358508\n0.206505306\n0.22182381\n0.23385042\n0.239538515\n0.247848313\n0.268945667\n0.288519936\n0.286926459\n0.288955779\n0.283719343\n0.281547749\n0.270936223\n0.264269995\n0.263718238\n0.26576003\n0.268491844\n0.268517879\n0.269281196\n0.26587497\n0.231109913\n0.214922056\n0.211775985\n0.214046328\n0.222891513\n0.230279539\n0.236354192\n0.240515219\n0.251094976\n0.260211989\n0.282740208\n0.300281718\n0.301608043\n0.302481481\n0.30252651\n0.299307338\n0.276022481\n0.272135977\n0.262959242\n0.261447074\n0.261642037\n0.26345248\n0.267979356\n0.264243739\n0.236500206\n0.217090061\n0.224418313\n0.225633221\n0.235114725\n0.245369448\n0.25472976\n0.262717454\n0.266388605\n0.268340679\n0.282181551\n0.295594594\n0.293979816\n0.296899484\n0.293854737\n0.29279033\n0.28342582\n0.276420587\n0.276767527\n0.278146208\n0.287751185\n0.294201828\n0.297484124\n0.284787715\n0.256006341\n0.232617346\n0.225483604\n0.234979591\n0.245296412\n0.258415635\n0.264262825\n0.269476706\n0.274140209\n0.29256572\n0.309254696\n0.319854491\n0.31627304\n0.315785438\n0.311018422\n0.316121111\n0.318575533\n0.309213607\n0.298596262\n0.301364789\n0.300413341\n0.301077388\n0.297861421\n0.297631453\n0.277100934\n0.250375237\n0.249474343\n0.247194034\n0.251055056\n0.263773604\n0.274222806\n0.271741985\n0.275294679\n0.282783697\n0.306905459\n0.319791867\n0.310842062\n0.311666617\n0.309335494\n0.311177634\n0.294868294\n0.282463959\n0.283270369\n0.279263821\n0.277671918\n0.275958089\n0.282446211\n0.270617304\n0.236341361\n0.217531368\n0.211740862\n0.21808241\n0.223800743\n0.232155833\n0.234226281\n0.231506601\n0.235421277\n0.250501958\n0.27761823\n0.29020866\n0.281198995\n0.276579119\n0.279560572\n0.275452333\n0.261752508\n0.25911892\n0.24904857\n0.241841545\n0.238506097\n0.235452035\n0.234566539\n0.226969454\n0.17612383\n0.150321603\n0.144700871\n0.153258458\n0.157722353\n0.163377142\n0.17492311\n0.185573094\n0.202016315\n0.208945099\n0.226378443\n0.257875434\n0.255884988\n0.250990573\n0.247559746\n0.243345321\n0.236577968\n0.220744901\n0.218805745\n0.216922889\n0.208185949\n0.211888273\n0.212691066\n0.2003366\n0.149088088\n0.120326675\n0.104551385\n0.103215084\n0.10816663\n0.110336761\n0.116940567\n0.13093547\n0.148921856\n0.155430911\n0.18998333\n0.214847622\n0.223703632\n0.231798432\n0.22885875\n0.22915597\n0.23073951\n0.225746709\n0.225564337\n0.2266127\n0.233619006\n0.226504026\n0.231701057\n0.231814589\n0.198675309\n0.167526181\n0.151748605\n0.152333562\n0.152340653\n0.163105544\n0.154112264\n0.158982154\n0.171653497\n0.183859361\n0.216390563\n0.233046938\n0.229991374\n0.233868474\n0.235606041\n0.237245827\n0.232901081\n0.235704248\n0.231289371\n0.230373216\n0.231750879\n0.234644124\n0.237833259\n0.240923232\n0.19913646\n0.157187272\n0.151758235\n0.157722455\n0.144063461\n0.139297277\n0.142103348\n0.140532137\n0.155271728\n0.170294553\n0.205093031\n0.234135131\n0.231366541\n0.239190072\n0.238833659\n0.241613291\n0.240718693\n0.232162575\n0.229977448\n0.233323152\n0.235298163\n0.233272724\n0.228079458\n0.227126327\n0.205482198\n0.186614324\n0.182876791\n0.182647025\n0.180059216\n0.189235781\n0.198659427\n0.189123223\n0.203717005\n0.21615799\n0.256813467\n0.277777361\n0.277803709\n0.280569447\n0.288046376\n0.29982509\n0.299131343\n0.287406271\n0.282987858\n0.286942\n0.288562887\n0.281059586\n0.278408861\n0.271315884\n0.239587707\n0.20337333\n0.189229052\n0.193461031\n0.195735052\n0.207546654\n0.225654341\n0.230498333\n0.239533283\n0.258298509\n0.293373238\n0.314205428\n0.308096588\n0.305103853\n0.30137791\n0.301839395\n0.304305687\n0.300958052\n0.303422229\n0.298233941\n0.296398734\n0.297104337\n0.295156146\n0.283719305\n0.241489371\n0.215015131\n0.205903799\n0.207203545\n0.210109751\n0.221815423\n0.23532121\n0.242479889\n0.256853363\n0.270891883\n0.294567508\n0.309704018\n0.305755618\n0.298987977\n0.295567973\n0.295698425\n0.294006568\n0.289408314\n0.283976672\n0.280668425\n0.276350715\n0.274662242\n0.273772068\n0.268490682\n0.226313433\n0.196606436\n0.191744394\n0.192400039\n0.195688705\n0.20380636\n0.21497504\n0.227672911\n0.243286433\n0.258582279\n0.287560608\n0.301299804\n0.302180462\n0.296561797\n0.298004102\n0.294057637\n0.288563797\n0.289947364\n0.281760285\n0.278047219\n0.279388446\n0.273370434\n0.269355539\n0.26036408\n0.221721849\n0.192521403\n0.191720174\n0.175558018\n0.180993615\n0.194526181\n0.206863392\n0.199626355\n0.218669427\n0.233795268\n0.259742283\n0.279931082\n0.283084943\n0.284939686\n0.285614731\n0.272578178\n0.267122923\n0.268333351\n0.257633723\n0.25858304\n0.259661939\n0.266848184\n0.26492658\n0.259553484\n0.229248652\n0.203522896\n0.183651553\n0.183200976\n0.195052652\n0.193491485\n0.204333168\n0.218638898\n0.220266695\n0.216823178\n0.244412578\n0.258289283\n0.253807475\n0.247627226\n0.250144451\n0.244275772\n0.239619432\n0.235301966\n0.228588196\n0.232229603\n0.234166777\n0.22320705\n0.229047316\n0.233389681\n0.198438647\n0.175039169\n0.176157496\n0.185004953\n0.18765935\n0.180824701\n0.185324282\n0.194338377\n0.19690048\n0.199098262\n0.237796959\n0.257782832\n0.261584243\n0.260361865\n0.262138248\n0.258729849\n0.246709806\n0.231869494\n0.226824398\n0.228236626\n0.228689505\n0.226160585\n0.235746192\n0.236118535\n0.204756954\n0.161242195\n0.165533842\n0.175101557\n0.167719742\n0.166428394\n0.159921087\n0.162291828\n0.165591077\n0.190177362\n0.227985393\n0.24937461\n0.255315065\n0.255623936\n0.260263687\n0.260619133\n0.259607367\n0.246704046\n0.235652232\n0.225212956\n0.226202366\n0.233537431\n0.24207013\n0.240208267\n0.200014325\n0.167464956\n0.157713455\n0.148791383\n0.145405899\n0.146149182\n0.137376119\n0.141932085\n0.156142158\n0.176306408\n0.21771811\n0.239190142\n0.237626665\n0.230110729\n0.237782073\n0.236583823\n0.235191044\n0.238676397\n0.244347341\n0.233316282\n0.236222183\n0.239012669\n0.24899676\n0.249509739\n0.222681179\n0.197748365\n0.185862591\n0.181408893\n0.176924891\n0.174730445\n0.180660065\n0.187791829\n0.1979182\n0.204861205\n0.247281762\n0.269132802\n0.262692068\n0.265753409\n0.265248707\n0.270706542\n0.266536523\n0.267576557\n0.269844582\n0.266782583\n0.262694144\n0.259862891\n0.261881849\n0.249282066\n0.215811071\n0.171733455\n0.160522416\n0.154592325\n0.162370951\n0.164318829\n0.170698606\n0.188925589\n0.206388836\n0.224874373\n0.278934072\n0.300234987\n0.305234402\n0.303303935\n0.303624709\n0.306763525\n0.30794684\n0.300048528\n0.294454323\n0.287379656\n0.286679255\n0.28821695\n0.291049134\n0.283093739\n0.235413521\n0.211400524\n0.193932729\n0.207935598\n0.21276994\n0.216414989\n0.217330082\n0.231095515\n0.245828721\n0.255446875\n0.296953376\n0.313845497\n0.314230069\n0.308590414\n0.308602558\n0.300117532\n0.291478474\n0.295510097\n0.295494895\n0.294000648\n0.298193066\n0.28997115\n0.287297754\n0.289616477\n0.258826273\n0.221008999\n0.20305386\n0.211356028\n0.200255252\n0.212730854\n0.217860692\n0.218899301\n0.224330527\n0.241412208\n0.280833974\n0.294417138\n0.295210216\n0.304873081\n0.308945077\n0.285049019\n0.286930679\n0.276744716\n0.286802261\n0.273663118\n0.275381963\n0.282435686\n0.284774904\n0.280149099\n0.250848288\n0.229896829\n0.226758332\n0.216605096\n0.213878401\n0.222936182\n0.222258032\n0.231518886\n0.244579633\n0.256158414\n0.301066732\n0.313183509\n0.310094987\n0.320883781\n0.314204543\n0.31289092\n0.309334807\n0.303857691\n0.302726909\n0.305926883\n0.305384903\n0.312570779\n0.316321022\n0.317201111\n0.286604939\n0.256478864\n0.249435514\n0.251615596\n0.250792203\n0.249805994\n0.256954889\n0.270719638\n0.289326162\n0.298092904\n0.3232547\n0.335005523\n0.339537562\n0.333436841\n0.324673868\n0.323945377\n0.313206012\n0.310166399\n0.30735379\n0.307057186\n0.308509975\n0.300003801\n0.297546075\n0.304327015\n0.278399125\n0.253008794\n0.250366041\n0.244401729\n0.236912035\n0.232018448\n0.227194808\n0.231660383\n0.238384046\n0.243378091\n0.266433579\n0.274099097\n0.27494001\n0.26778278\n0.267637562\n0.259595344\n0.253590961\n0.244571383\n0.240888633\n0.238414787\n0.236883108\n0.240579724\n0.24241404\n0.248133719\n0.222014117\n0.18589436\n0.180322062\n0.173191314\n0.164940013\n0.16322379\n0.158291679\n0.161642378\n0.16779528\n0.186214349\n0.224268981\n0.24088949\n0.244397711\n0.24697839\n0.25169978\n0.257869929\n0.256557231\n0.254056309\n0.247308469\n0.25021679\n0.24817329\n0.247617621\n0.241811388\n0.236453224\n0.206610857\n0.16024679\n0.147576634\n0.143150045\n0.142090678\n0.135367928\n0.134673429\n0.141444062\n0.151336586\n0.166311524\n0.207231186\n0.223021087\n0.235520124\n0.238730786\n0.238716599\n0.244033564\n0.244960307\n0.249959621\n0.251441514\n0.253769664\n0.255126005\n0.25299013\n0.255196731\n0.251152089\n0.183897895\n0.136535358\n0.128932691\n0.131551286\n0.131346148\n0.13026376\n0.128139521\n0.124613595\n0.143642546\n0.145598511\n0.20575684\n0.22455652\n0.240453899\n0.248264102\n0.247337779\n0.259833465\n0.269477598\n0.26647203\n0.256236465\n0.257301597\n0.257268224\n0.26924589\n0.266687842\n0.26961968\n0.224096906\n0.186580288\n0.164216874\n0.174878453\n0.172344278\n0.168605075\n0.166483561\n0.164834981\n0.172237718\n0.177222299\n0.231198873\n0.247038348\n0.251399505\n0.254210952\n0.250471058\n0.259265802\n0.250943443\n0.246136254\n0.242337081\n0.236918645\n0.239469669\n0.248459138\n0.263263291\n0.267560452\n0.235529315\n0.19570192\n0.189012934\n0.173226068\n0.170509568\n0.174582458\n0.167443074\n0.165890803\n0.175109023\n0.163830097\n0.162743558\n0.16664459\n0.307216331\n0.311829839\n0.320438287\n0.342346055\n0.349549544\n0.362967784\n0.372062695\n0.375435014\n0.377394588\n0.369346603\n0.369468339\n0.361755681\n0.369130947\n0.243667578\n0.242767898\n0.201505513\n0.197016063\n0.20328334\n0.205671359\n0.202364793\n0.227878784\n0.233142161\n0.309623231\n0.334264791\n0.327984497\n0.323637331\n0.323361145\n0.325965238\n0.328204641\n0.323339417\n0.326259782\n0.323618245\n0.324134125\n0.321333771\n0.322865699\n0.321396075\n0.310426992\n0.300786629\n0.302807973\n0.301526869\n0.301126293\n0.302346088\n0.206325728\n0.205223348\n0.208729594\n0.213812562\n0.240869089\n0.303906632\n0.300140222\n0.295752512\n0.291027015\n0.282079356\n0.273710237\n0.261178713\n0.260193074\n0.255119056\n0.263960413\n0.27796411\n0.290365319\n0.29596548\n0.281378962\n0.267023908\n0.255000655\n0.249886392\n0.253379029\n0.255628245\n0.258002929\n0.260229832\n0.198249342\n0.201702221\n0.231794744\n0.247569782\n0.241022815\n0.235992517\n0.237769979\n0.241324853\n0.243563169\n0.240928517\n0.242092337\n0.241062864\n0.245189973\n0.246754687\n0.248492981\n0.246850974\n0.227717277\n0.195396208\n0.181276419\n0.178978259\n0.181354674\n0.181938769\n0.19425962\n0.204239469\n0.222486055\n0.24323687\n0.270644649\n0.280250832\n0.275909168\n0.265734207\n0.269328484\n0.273426635\n0.270523247\n0.261981738\n0.254609294\n0.246231546\n0.245518905\n0.242594823\n0.242981296\n0.246129784\n0.219084476\n0.196266779\n0.186888785\n0.182683299\n0.186346937\n0.193155326\n0.202271819\n0.21556529\n0.235586676\n0.25846652\n0.287677595\n0.292896888\n0.288571836\n0.280105085\n0.277006378\n0.277517151\n0.270450721\n0.265288323\n0.260559652\n0.26162342\n0.26149013\n0.262499248\n0.262410974\n0.263026632\n0.2569359\n0.240496287\n0.238276691\n0.233602012\n0.230886858\n0.238088821\n0.247896819\n0.256165597\n0.267494776\n0.281562762\n0.312243533\n0.316229867\n0.309836394\n0.301772408\n0.297063499\n0.290967263\n0.270932341\n0.256918062\n0.243188925\n0.239648442\n0.247877774\n0.257808133\n0.266343739\n0.274085444\n0.266589933\n0.247782971\n0.205368698\n0.209336278\n0.206859221\n0.213800365\n0.214547671\n0.213458823\n0.225027271\n0.252821522\n0.298041691\n0.301560509\n0.298541157\n0.295510522\n0.296265886\n0.294997746\n0.292414024\n0.279313603\n0.272437611\n0.268344251\n0.278356491\n0.291352554\n0.311415876\n0.318601845\n0.274165826\n0.208467856\n0.19301718\n0.181305736\n0.170880953\n0.173863323\n0.17141915\n0.179253149\n0.199202237\n0.233327754\n0.297638481\n0.307060433\n0.303783701\n0.297910835\n0.286145505\n0.278761664\n0.276051183\n0.277086683\n0.289017523\n0.304262142\n0.314115287\n0.315055304\n0.317134278\n0.319347286\n0.272339013\n0.2039213\n0.185828143\n0.168793754\n0.16941963\n0.169984042\n0.179232805\n0.197489221\n0.219406952\n0.247174537\n0.320945419\n0.334461516\n0.335974628\n0.332827743\n0.338117002\n0.341304967\n0.339490887\n0.335739128\n0.332137605\n0.328407548\n0.33523571\n0.334042073\n0.335310257\n0.3316794\n0.287366752\n0.231431319\n0.213910173\n0.205469158\n0.20740755\n0.215027362\n0.221144462\n0.231634564\n0.257766536\n0.290946387\n0.343109906\n0.349169561\n0.345694542\n0.34287518\n0.343817006\n0.344788295\n0.346230023\n0.343591953\n0.342868907\n0.339910173\n0.339995093\n0.334494994\n0.330579452\n0.324344368\n0.268797043\n0.212763735\n0.194206101\n0.183347911\n0.180709897\n0.187682703\n0.190012401\n0.199251065\n0.221803542\n0.263288906\n0.330639832\n0.335877244\n0.332126951\n0.334665873\n0.334601561\n0.343555763\n0.33827449\n0.332801803\n0.326835189\n0.327473568\n0.32616117\n0.323264292\n0.316775328\n0.31717736\n0.256588736\n0.198552589\n0.176524669\n0.16250167\n0.163573428\n0.167274467\n0.176351193\n0.18693701\n0.219227439\n0.273367489\n0.329467339\n0.336109571\n0.326830238\n0.317838255\n0.302274806\n0.301736879\n0.300932345\n0.286486368\n0.271957187\n0.283687486\n0.291098345\n0.298972889\n0.306975164\n0.30156637\n0.269126579\n0.231962448\n0.216503665\n0.212053278\n0.215202905\n0.220803665\n0.215326276\n0.2224554\n0.24517552\n0.297616026\n0.341124352\n0.339105684\n0.327578624\n0.321362041\n0.325418586\n0.338129524\n0.333862506\n0.3401455\n0.343609971\n0.345307845\n0.346486004\n0.340226695\n0.340761904\n0.338302654\n0.300453915\n0.242120845\n0.225463117\n0.221842633\n0.21276183\n0.217217123\n0.228273108\n0.230977347\n0.263253855\n0.305028949\n0.360704988\n0.360921241\n0.357197525\n0.346407149\n0.345311282\n0.350423217\n0.339854785\n0.337951409\n0.336591127\n0.336523852\n0.339839351\n0.34007831\n0.337718789\n0.332614055\n0.297200358\n0.25980814\n0.24687533\n0.240572871\n0.241420391\n0.246238937\n0.265488206\n0.282258023\n0.300642375\n0.32229702\n0.341036131\n0.339877783\n0.333406223\n0.319311012\n0.309151984\n0.305666257\n0.305634627\n0.303831554\n0.294638504\n0.285315876\n0.286339731\n0.26447809\n0.275940367\n0.285525566\n0.263483307\n0.207606498\n0.167512205\n0.15828305\n0.15238537\n0.152975009\n0.165400843\n0.171194793\n0.186966478\n0.224981144\n0.291962885\n0.303135616\n0.30335577\n0.306187849\n0.309602421\n0.303300171\n0.300109463\n0.293675242\n0.285247431\n0.277640862\n0.277191661\n0.285964281\n0.308983114\n0.315183197\n0.270965304\n0.209874844\n0.199947876\n0.194306564\n0.192161623\n0.19736344\n0.194312246\n0.192282563\n0.203734722\n0.24557289\n0.302909519\n0.309925233\n0.305298289\n0.313028956\n0.319854238\n0.319278218\n0.316395524\n0.306395126\n0.303706209\n0.303234859\n0.305964963\n0.293000044\n0.296854813\n0.287453794\n0.246412256\n0.187755341\n0.164597948\n0.160421891\n0.143723869\n0.151578148\n0.137980666\n0.153578729\n0.190262422\n0.236352631\n0.290423317\n0.302968947\n0.29965749\n0.299347829\n0.295026831\n0.297474746\n0.287527715\n0.286804259\n0.285140817\n0.282237872\n0.28764982\n0.278868853\n0.281340981\n0.283948732\n0.249219691\n0.197509726\n0.169587115\n0.166229549\n0.172869898\n0.175966559\n0.182934071\n0.190789454\n0.217760661\n0.272486315\n0.327398126\n0.328047043\n0.323720721\n0.32376119\n0.330003824\n0.330717732\n0.328007909\n0.324135898\n0.328108155\n0.331180308\n0.331646362\n0.332285261\n0.33799813\n0.341189915\n0.314300962\n0.25657228\n0.234863004\n0.229255736\n0.22256997\n0.230610436\n0.237270384\n0.248960914\n0.271047049\n0.317790499\n0.365636775\n0.366008261\n0.362564674\n0.36183575\n0.362179305\n0.357925364\n0.357583332\n0.354558481\n0.34953532\n0.346988576\n0.337887347\n0.335610036\n0.340988771\n0.348084663\n0.306073754\n0.248767253\n0.231121285\n0.22958587\n0.232499293\n0.258792791\n0.256776503\n0.262471871\n0.286590849\n0.330245333\n0.36903626\n0.362500036\n0.360407835\n0.359820293\n0.356697525\n0.350768459\n0.352708495\n0.351933597\n0.346482558\n0.345014267\n0.347334349\n0.350007813\n0.349858028\n0.352286033\n0.315388012\n0.255177233\n0.242839371\n0.232342174\n0.231565195\n0.244642492\n0.249235296\n0.257310893\n0.282407784\n0.325719895\n0.359843977\n0.35663635\n0.350780645\n0.348427103\n0.343522907\n0.342552735\n0.34398958\n0.333979018\n0.326912015\n0.324849167\n0.324865062\n0.325002622\n0.328422844\n0.331873007\n0.29961734\n0.240638255\n0.226791042\n0.22337995\n0.228765343\n0.241705305\n0.253700361\n0.265137862\n0.288059733\n0.324473475\n0.356068972\n0.361975851\n0.357071032\n0.356014583\n0.353524503\n0.35647595\n0.350785642\n0.344332932\n0.342319902\n0.341713914\n0.341354991\n0.341230327\n0.339779709\n0.338955809\n0.306909298\n0.254676105\n0.240532042\n0.234192732\n0.235335649\n0.241399697\n0.248988186\n0.259227116\n0.279864354\n0.324748377\n0.359471557\n0.357459574\n0.351386081\n0.348372111\n0.341948182\n0.341312278\n0.339365397\n0.33202865\n0.328269992\n0.324171802\n0.318666941\n0.31220958\n0.31092181\n0.314656029\n0.283477211\n0.221740256\n0.194042365\n0.187555668\n0.189910964\n0.183449417\n0.183593687\n0.199962506\n0.227105212\n0.273328792\n0.320589722\n0.319130921\n0.313020231\n0.310099253\n0.311954729\n0.321622663\n0.312350448\n0.292516194\n0.281605281\n0.282784841\n0.285301362\n0.280203157\n0.278682278\n0.277909952\n0.230399608\n0.17740603\n0.16885525\n0.147798636\n0.143088974\n0.141205643\n0.152728955\n0.158789083\n0.192508654\n0.254560789\n0.303640238\n0.315393741\n0.319285938\n0.317299958\n0.307589162\n0.295589003\n0.296479725\n0.302157649\n0.30655129\n0.314185164\n0.327402752\n0.327229903\n0.329667958\n0.346420868\n0.319446769\n0.250788738\n0.226297214\n0.213386958\n0.220006007\n0.224034695\n0.227370234\n0.235671453\n0.266383757\n0.318641471\n0.359636538\n0.357510762\n0.350332471\n0.346765344\n0.338285942\n0.325794978\n0.315755443\n0.308287201\n0.30599368\n0.308633249\n0.313431305\n0.319702288\n0.326984749\n0.330144869\n0.298459671\n0.230759289\n0.204026343\n0.193146728\n0.197870293\n0.197467797\n0.198877238\n0.201262564\n0.22846141\n0.28799103\n0.343393148\n0.353050478\n0.348716272\n0.341950524\n0.337329469\n0.337742605\n0.333124317\n0.330021317\n0.323325724\n0.335577939\n0.343095205\n0.347481404\n0.352343002\n0.36260648\n0.338498969\n0.27116474\n0.240572179\n0.220631714\n0.228143286\n0.234019569\n0.225092258\n0.227089961\n0.248964274\n0.315575408\n0.359450786\n0.364242338\n0.36589829\n0.366033409\n0.366659253\n0.374267665\n0.3702216\n0.36687844\n0.365555629\n0.367830796\n0.364552443\n0.369537783\n0.370275476\n0.375770518\n0.339413018\n0.276849472\n0.255176523\n0.239103758\n0.238831204\n0.232745825\n0.233642743\n0.241530723\n0.259576735\n0.326408282\n0.367947047\n0.363446744\n0.358428276\n0.359331171\n0.364850611\n0.36570834\n0.369648286\n0.365115386\n0.362260583\n0.361538905\n0.360016854\n0.35636104\n0.362748489\n0.373287608\n0.339000145\n0.279960408\n0.247362376\n0.237181815\n0.239524601\n0.236545681\n0.239930684\n0.247018146\n0.265755074\n0.324777709\n0.357423735\n0.35368221\n0.34815439\n0.351611258\n0.348502122\n0.34590532\n0.346716791\n0.353333479\n0.349553249\n0.348864627\n0.346707226\n0.345847003\n0.342114843\n0.347433611\n0.318446294\n0.246550439\n0.216851522\n0.19524536\n0.200832234\n0.207940993\n0.201026563\n0.215689908\n0.258269951\n0.318045428\n0.349701419\n0.337111704\n0.336719427\n0.339473782\n0.33798372\n0.347526581\n0.353955851\n0.344290407\n0.345476874\n0.347732282\n0.345811003\n0.344751722\n0.343948613\n0.351830285\n0.325322197\n0.256163648\n0.236648627\n0.221028611\n0.223458628\n0.23052239\n0.228206748\n0.233376926\n0.269140088\n0.331193964\n0.362616768\n0.353608331\n0.352846692\n0.352003607\n0.350675658\n0.350727116\n0.353330951\n0.353847445\n0.348438148\n0.349746941\n0.34783995\n0.345482546\n0.347168775\n0.359920801\n0.336890277\n0.268548896\n0.259045368\n0.244806292\n0.246066722\n0.25176512\n0.253562072\n0.250289181\n0.281285876\n0.342691264\n0.373543445\n0.369705414\n0.365925113\n0.36403714\n0.363353058\n0.360282803\n0.358502479\n0.358221867\n0.35296087\n0.354522969\n0.355734428\n0.351574484\n0.354127284\n0.360041591\n0.341878311\n0.283194406\n0.255355261\n0.24427513\n0.240885887\n0.247086118\n0.243575849\n0.251519382\n0.280967521\n0.344524234\n0.374003786\n0.365286927\n0.363993347\n0.361400604\n0.362823343\n0.362051395\n0.360117053\n0.351707022\n0.353294388\n0.352056496\n0.347492628\n0.34726401\n0.344577727\n0.361348092\n0.336143646\n0.28065762\n0.260348603\n0.250688301\n0.247983454\n0.251306095\n0.256429656\n0.254611294\n0.276310818\n0.32144555\n0.356952222\n0.348232151\n0.347426622\n0.351819992\n0.353459724\n0.36009641\n0.359139669\n0.358256023\n0.354872911\n0.351632243\n0.348913842\n0.346556227\n0.349320361\n0.356407835\n0.342607348\n0.284057322\n0.254720964\n0.246750649\n0.247365416\n0.250486002\n0.249752214\n0.254682433\n0.272977819\n0.333491946\n0.361399647\n0.355697522\n0.354469413\n0.353519972\n0.353703263\n0.360897183\n0.359486571\n0.356764709\n0.346496173\n0.342855688\n0.339599046\n0.336947942\n0.337570678\n0.349084539\n0.334562906\n0.275840686\n0.251790281\n0.244183043\n0.241619029\n0.24455434\n0.249653502\n0.257565709\n0.270831383\n0.331782209\n0.353467375\n0.34565884\n0.342598736\n0.336671288\n0.34242845\n0.346325092\n0.343998546\n0.341226691\n0.33578401\n0.334323696\n0.327552323\n0.324663416\n0.322197982\n0.329167731\n0.314507721\n0.24634149\n0.221512311\n0.219205844\n0.226487348\n0.229038665\n0.231166795\n0.235377541\n0.253729551\n0.31599197\n0.34760296\n0.337525429\n0.335881445\n0.330842249\n0.329777789\n0.32992347\n0.330953483\n0.323550197\n0.31264272\n0.310771055\n0.311244411\n0.315922791\n0.314102204\n0.310245289\n0.295647915\n0.234780565\n0.215261632\n0.205939938\n0.207162312\n0.204997666\n0.211767081\n0.223203204\n0.24704215\n0.308412069\n0.342280057\n0.333624388\n0.327930411\n0.329360303\n0.330860034\n0.332172157\n0.338374773\n0.335333098\n0.334710066\n0.330130332\n0.330982024\n0.328011148\n0.325312117\n0.326399647\n0.313647353\n0.256467467\n0.236648003\n0.226580051\n0.230046311\n0.226456527\n0.233188429\n0.24085495\n0.274726146\n0.32589974\n0.353157491\n0.346562992\n0.343974595\n0.343115788\n0.348832614\n0.352751805\n0.348303844\n0.346196667\n0.342756414\n0.3376708\n0.333950731\n0.331971603\n0.331629404\n0.337414517\n0.326943978\n0.274574684\n0.254803326\n0.249640009\n0.246833182\n0.253260969\n0.25614238\n0.263835662\n0.279986545\n0.327806882\n0.354695185\n0.349517437\n0.343899884\n0.34175871\n0.342029793\n0.348804048\n0.33957453\n0.341994774\n0.337493804\n0.334285234\n0.335703672\n0.3353609\n0.334992489\n0.341044964\n0.328015685\n0.294145608\n0.265920734\n0.261220186\n0.254142874\n0.252342879\n0.2641514\n0.286473012\n0.311725504\n0.340479556\n0.357213156\n0.340682438\n0.336489054\n0.333578023\n0.330015123\n0.329420178\n0.321920327\n0.323074418\n0.316694568\n0.310782317\n0.314166899\n0.315430529\n0.317823323\n0.324345724\n0.316997441\n0.280404833\n0.266332115\n0.257346548\n0.251998532\n0.253416428\n0.253232283\n0.274949775\n0.299265646\n0.328536288\n0.343249478\n0.334228419\n0.330495484\n0.332614346\n0.33238872\n0.332596991\n0.329583502\n0.330533521\n0.326421519\n0.328087046\n0.326622931\n0.327642782\n0.321547513\n0.329069233\n0.320078102\n0.280728251\n0.25422506\n0.253623635\n0.250217585\n0.25151283\n0.25037353\n0.275561907\n0.280908144\n0.317517242\n0.334765742\n0.323286824\n0.315760051\n0.321239241\n0.331156963\n0.331745272\n0.323541745\n0.327155769\n0.319493838\n0.32126309\n0.324099005\n0.321859728\n0.318204744\n0.320256336\n0.308214786\n0.253294981\n0.226936742\n0.212540996\n0.213979964\n0.213298453\n0.211222886\n0.225547743\n0.250913345\n0.311816278\n0.334225511\n0.328523148\n0.327541129\n0.327804241\n0.32995371\n0.330276155\n0.329241359\n0.323452116\n0.320987162\n0.321224333\n0.312886525\n0.311708991\n0.30667904\n0.309438888\n0.289069299\n0.234846521\n0.208762217\n0.199652092\n0.20115121\n0.201844823\n0.202755008\n0.216540412\n0.248927685\n0.305729487\n0.337216154\n0.333255397\n0.329927329\n0.329341657\n0.331326532\n0.328315039\n0.324783365\n0.322639144\n0.318566519\n0.320566404\n0.323267462\n0.32450827\n0.328096455\n0.3364169\n0.330193008\n0.270010213\n0.253634556\n0.246428815\n0.251733303\n0.259296893\n0.266278924\n0.27711752\n0.291446436\n0.345450565\n0.360602758\n0.352663434\n0.348727519\n0.348817311\n0.349992604\n0.345887348\n0.333639723\n0.325613316\n0.316154823\n0.30844589\n0.298462705\n0.29429738\n0.303472001\n0.317327962\n0.309690028\n0.290925315\n0.269708972\n0.263415513\n0.258672087\n0.253620364\n0.252514665\n0.259826996\n0.279911627\n0.3051813\n0.318285638\n0.328541238\n0.325899865\n0.323697229\n0.316869968\n0.311975829\n0.314028606\n0.308880734\n0.31196267\n0.316467792\n0.307963317\n0.293722183\n0.29409992\n0.302762118\n0.305040686\n0.299738502\n0.288851002\n0.2784756\n0.265062963\n0.247630667\n0.267034596\n0.268355436\n0.293304913\n0.312919701\n0.329981106\n0.330729408\n0.33013071\n0.333708948\n0.335964856\n0.336808946\n0.337934626\n0.339597125\n0.331388911\n0.334233735\n0.332866105\n0.334369939\n0.334927916\n0.343827665\n0.351522715\n0.320382151\n0.286000146\n0.286612641\n0.281897586\n0.284927721\n0.260154632\n0.280170754\n0.305691153\n0.342553226\n0.362819604\n0.355698372\n0.354352011\n0.350951631\n0.352882084\n0.352612617\n0.353639019\n0.351497165\n0.346753967\n0.347676064\n0.345331865\n0.340118264\n0.34143506\n0.348982988\n0.347094589\n0.304660348\n0.270847997\n0.252306604\n0.24626484\n0.25066858\n0.245699823\n0.256929042\n0.27486635\n0.322556352\n0.346469972\n0.338917949\n0.338128043\n0.335308879\n0.334073324\n0.341320491\n0.335763052\n0.334121229\n0.323251832\n0.324521954\n0.317257559\n0.317168311\n0.320095285\n0.325174424\n0.31976734\n0.276822996\n0.231701846\n0.217588947\n0.210740294\n0.208517381\n0.215192524\n0.215633791\n0.230515529\n0.290066765\n0.318505557\n0.31082182\n0.307956675\n0.306139399\n0.30754029\n0.312449423\n0.310047592\n0.306526395\n0.30133122\n0.298832567\n0.29208192\n0.288551265\n0.288480782\n0.295701611\n0.295723786\n0.24327517\n0.208483944\n0.192407031\n0.19476265\n0.196055036\n0.195503069\n0.198057412\n0.218265515\n0.276532007\n0.311991186\n0.304972321\n0.292474303\n0.283385564\n0.30438231\n0.310402072\n0.285081593\n0.264556783\n0.269487359\n0.263811363\n0.258001925\n0.258179136\n0.269873585\n0.273974757\n0.279913159\n0.234119611\n0.196861407\n0.186797181\n0.182024024\n0.184441639\n0.180881817\n0.182563266\n0.211838319\n0.252315101\n0.281739676\n0.284280124\n0.274988512\n0.279118617\n0.282264268\n0.277838203\n0.274368946\n0.274900994\n0.281778918\n0.284051278\n0.293297367\n0.303752598\n0.309361964\n0.323768756\n0.322824763\n0.277837386\n0.253174544\n0.244705166\n0.247721201\n0.25627108\n0.260879195\n0.265332925\n0.290973822\n0.319989847\n0.319946759\n0.318836388\n0.322316396\n0.314473803\n0.311037839\n0.300698708\n0.300287059\n0.290391176\n0.288457611\n0.278810515\n0.265567948\n0.268116496\n0.277279138\n0.300238394\n0.318699113\n0.303768777\n0.286693613\n0.277145999\n0.267883759\n0.267097757\n0.267802649\n0.275840375\n0.278003557\n0.29965762\n0.311950366\n0.304542978\n0.311456791\n0.31526397\n0.319119627\n0.317720921\n0.31153043\n0.310726304\n0.305145501\n0.310195467\n0.307784655\n0.306077141\n0.307236916\n0.30759021\n0.310296474\n0.304613301\n0.296671028\n0.289521938\n0.283422372\n0.293791293\n0.303277019\n0.316576091\n0.329316984\n0.318557229\n0.328729838\n0.324146978\n0.316661146\n0.31866274\n0.322568402\n0.322221672\n0.316860232\n0.318590564\n0.31367848\n0.304141459\n0.294480858\n0.29369537\n0.293977479\n0.298858162\n0.300742402\n0.259052164\n0.218438673\n0.195943652\n0.204329624\n0.200391298\n0.204558289\n0.219493402\n0.230014221\n0.290681803\n0.318553123\n0.316183056\n0.319254505\n0.322188914\n0.322901086\n0.322977948\n0.321976647\n0.314206824\n0.315067812\n0.315215927\n0.31770977\n0.32048847\n0.317374725\n0.323249134\n0.318001197\n0.298097878\n0.273045965\n0.278118707\n0.271792207\n0.273863975\n0.281056712\n0.295690293\n0.317438717\n0.320836839\n0.32462674\n0.314717571\n0.31097404\n0.311115836\n0.315055043\n0.316008333\n0.318583551\n0.312772423\n0.310156275\n0.310156285\n0.307836258\n0.306151908\n0.306734863\n0.301447365\n0.29987099\n0.285289058\n0.271344082\n0.258964172\n0.25807951\n0.255592561\n0.254912227\n0.272480049\n0.284633509\n0.318112032\n0.331047364\n0.328245164\n0.32591328\n0.329037371\n0.328876507\n0.327453382\n0.323553814\n0.318106022\n0.32266617\n0.320425017\n0.3163695\n0.325275547\n0.333220491\n0.341165674\n0.349358624\n0.327150658\n0.299217239\n0.267520585\n0.260454837\n0.262253249\n0.266976152\n0.287581439\n0.320266088\n0.336110685\n0.352781634\n0.34419526\n0.345452517\n0.345710872\n0.34513129\n0.345642571\n0.339479723\n0.338455918\n0.327614749\n0.325978944\n0.320855957\n0.321033637\n0.3233705\n0.340071716\n0.353806733\n0.346079778\n0.331785002\n0.318435098\n0.308506047\n0.315430714\n0.324325584\n0.3343288\n0.349011657\n0.351089162\n0.358964698\n0.347252657\n0.337948139\n0.338883192\n0.33790709\n0.335878776\n0.332597715\n0.320231947\n0.318183448\n0.312209297\n0.311680938\n0.311762573\n0.312377183\n0.325895139\n0.341943522\n0.342423794\n0.335703475\n0.331072653\n0.317988508\n0.321125449\n0.319646152\n0.315222449\n0.325583642\n0.33433887\n0.344575409\n0.338106772\n0.340003933\n0.334135383\n0.333887885\n0.325566728\n0.317221919\n0.309520708\n0.309188886\n0.306881713\n0.307289586\n0.306861024\n0.313736944\n0.328218396\n0.33878885\n0.313547846\n0.284763481\n0.271450397\n0.259314847\n0.265394699\n0.272499287\n0.291607949\n0.309269662\n0.336808258\n0.354143175\n0.344294013\n0.34052651\n0.339917844\n0.340378823\n0.33450991\n0.331964491\n0.32482855\n0.319382074\n0.318820101\n0.317969572\n0.317883431\n0.316255847\n0.330923013\n0.343695227\n0.312458077\n0.289605601\n0.26753978\n0.255362892\n0.265973405\n0.281777024\n0.295074563\n0.304445489\n0.327244526\n0.346449602\n0.332487437\n0.33009107\n0.324160868\n0.325393328\n0.328576129\n0.327678745\n0.320474518\n0.309441505\n0.310039363\n0.306881826\n0.306388712\n0.302846522\n0.299942483\n0.307420995\n0.313135798\n0.299972948\n0.287315266\n0.273771135\n0.271813017\n0.282623611\n0.292566337\n0.310467453\n0.305945513\n0.324718689\n0.317405712\n0.315395517\n0.307105499\n0.311661912\n0.31345579\n0.314272683\n0.307855779\n0.304745542\n0.302750278\n0.30358605\n0.301878168\n0.293284404\n0.287326575\n0.299471824\n0.289005406\n0.276248962\n0.268050159\n0.269272233\n0.26393909\n0.255949457\n0.260215133\n0.263747993\n0.301870848\n0.316990643\n0.292187012\n0.299349202\n0.302518343\n0.298197792\n0.299950755\n0.297097222\n0.291853231\n0.27922473\n0.283151972\n0.279529065\n0.283227411\n0.305700067\n0.323500492\n0.325391459\n0.300922663\n0.277915331\n0.266728074\n0.259100072\n0.255901089\n0.250179625\n0.243231438\n0.273333775\n0.310988947\n0.345814977\n0.338886192\n0.336526741\n0.335591328\n0.341123011\n0.340227976\n0.334949886\n0.338185457\n0.343791513\n0.34244425\n0.341677416\n0.3418678\n0.340423337\n0.341401813\n0.350767826\n0.324846372\n0.313047416\n0.30166039\n0.285362534\n0.285379982\n0.287019277\n0.292221091\n0.312457641\n0.346165514\n0.356090615\n0.346703443\n0.343171603\n0.343081376\n0.343274026\n0.338745417\n0.340781461\n0.343859532\n0.345559619\n0.340276792\n0.333477099\n0.320730121\n0.334290799\n0.335141084\n0.342733812\n0.316253956\n0.282947165\n0.26906091\n0.265820965\n0.267824493\n0.267031862\n0.274533466\n0.293932824\n0.315700592\n0.339568339\n0.343344649\n0.326576772\n0.322917448\n0.31988326\n0.320987423\n0.321027236\n0.318112282\n0.30901272\n0.304449375\n0.297131257\n0.294849829\n0.296130405\n0.308994351\n0.32341728\n0.310418463\n0.272111422\n0.246384092\n0.239544265\n0.237766466\n0.231474091\n0.242024036\n0.25666424\n0.287178346\n0.311941194\n0.308467753\n0.307992792\n0.303915472\n0.298921643\n0.295992157\n0.286364035\n0.279798737\n0.281086173\n0.275807959\n0.28079567\n0.285199508\n0.290149213\n0.303682137\n0.314481571\n0.288148364\n0.255403405\n0.22805975\n0.225088408\n0.222411947\n0.22457698\n0.226395766\n0.238879631\n0.287234944\n0.309005574\n0.302263163\n0.300019752\n0.290448825\n0.295575282\n0.295422208\n0.29367573\n0.28790935\n0.281298583\n0.269594241\n0.271955855\n0.26892\n0.273860584\n0.265796864\n0.279265779\n0.250332744\n0.219726314\n0.19620966\n0.186806002\n0.188826803\n0.187412365\n0.202606417\n0.21976866\n0.261484128\n0.293050756\n0.282641399\n0.273282601\n0.273596357\n0.271528624\n0.268110409\n0.251607363\n0.26176756\n0.25653892\n0.258583858\n0.263787867\n0.265230034\n0.265398836\n0.263493781\n0.263958792\n0.220436465\n0.176559644\n0.167427245\n0.173570344\n0.170350821\n0.179323519\n0.183917509\n0.185093397\n0.250726078\n0.288284968\n0.289440434\n0.299571211\n0.307299753\n0.316473147\n0.313929089\n0.320858741\n0.326159549\n0.312861633\n0.311165253\n0.312258696\n0.313394595\n0.318631375\n0.328725974\n0.333825221\n0.29138117\n0.246483324\n0.217484825\n0.212508725\n0.213525391\n0.210467468\n0.211373489\n0.244207826\n0.303201209\n0.337897898\n0.331320378\n0.330748141\n0.333299067\n0.330509246\n0.333112318\n0.334902737\n0.33090922\n0.328038943\n0.31884632\n0.320627293\n0.320559394\n0.32402425\n0.331804505\n0.33709229\n0.309202601\n0.270913469\n0.25270975\n0.243484591\n0.24059375\n0.239050971\n0.257557639\n0.289775629\n0.321634765\n0.334594718\n0.322041764\n0.323478067\n0.323440439\n0.323391605\n0.325575712\n0.327724064\n0.327285702\n0.325376791\n0.328911601\n0.334227831\n0.337661927\n0.338346383\n0.343749156\n0.34603144\n0.322286287\n0.307740961\n0.300135647\n0.285284687\n0.286981258\n0.293228512\n0.303222835\n0.308989615\n0.328445853\n0.343889165\n0.335647042\n0.327133185\n0.326185486\n0.325668331\n0.329638078\n0.327798132\n0.331917747\n0.3318298\n0.326583236\n0.321650868\n0.330486555\n0.327519839\n0.335388667\n0.336674421\n0.298075573\n0.245758111\n0.226137091\n0.226238086\n0.221695221\n0.219758044\n0.220670215\n0.248785139\n0.308249513\n0.333241996\n0.32694096\n0.322827887\n0.324152136\n0.326079517\n0.321168801\n0.320408946\n0.316841808\n0.309060548\n0.304980989\n0.304831065\n0.304462828\n0.307795645\n0.31116107\n0.320577963\n0.281347242\n0.242516193\n0.231762647\n0.219865703\n0.226955498\n0.221612179\n0.226036903\n0.252589848\n0.302156236\n0.320918839\n0.311115886\n0.310684126\n0.306231583\n0.309121758\n0.31416368\n0.311527107\n0.307574584\n0.309247123\n0.306295647\n0.306501645\n0.295217227\n0.301244318\n0.299429677\n0.306008846\n0.283053776\n0.26337168\n0.241615242\n0.231748395\n0.220710395\n0.227621479\n0.228127915\n0.263968488\n0.289869329\n0.298098606\n0.290122479\n0.295141535\n0.288766993\n0.290078908\n0.294054063\n0.289217515\n0.289724416\n0.291495455\n0.292174709\n0.291753268\n0.279517082\n0.279387304\n0.273637547\n0.284615907\n0.28035076\n0.257203447\n0.244652003\n0.236194173\n0.23898622\n0.241264567\n0.258326562\n0.276098951\n0.285100238\n0.291698421\n0.297450951\n0.294136457\n0.295706642\n0.295022238\n0.300364507\n0.304773454\n0.300739675\n0.290751891\n0.292393682\n0.294483621\n0.2935574\n0.286760059\n0.288443639\n0.297686418\n0.303703027\n0.299912104\n0.298842768\n0.295737283\n0.295083372\n0.298667436\n0.305896481\n0.314376554\n0.311832427\n0.316878589\n0.309603668\n0.311653873\n0.311917773\n0.306510207\n0.308926612\n0.307833109\n0.305476307\n0.295764887\n0.289163203\n0.296916649\n0.294119076\n0.288324115\n0.291287861\n0.298047188\n0.282067257\n0.245290636\n0.224504375\n0.226440032\n0.214247049\n0.213759932\n0.214514066\n0.228390582\n0.261007494\n0.278894486\n0.271389923\n0.270378784\n0.269370614\n0.270815604\n0.27507721\n0.274197453\n0.276140793\n0.278279078\n0.277616304\n0.275742107\n0.26984817\n0.273939485\n0.275898568\n0.282983114\n0.267087196\n0.21900963\n0.208050466\n0.208523624\n0.211598698\n0.214624716\n0.229787599\n0.252092685\n0.275705912\n0.289846249\n0.279209551\n0.277988156\n0.275904702\n0.269888349\n0.268498665\n0.268308332\n0.263706582\n0.258496372\n0.266799714\n0.273255158\n0.278796101\n0.284994096\n0.280263134\n0.28985855\n0.300126226\n0.300799867\n0.29652574\n0.291938795\n0.279793969\n0.277345994\n0.280380082\n0.283499166\n0.299748562\n0.315725282\n0.306669806\n0.304249881\n0.304142999\n0.305835959\n0.307700828\n0.301663549\n0.300958397\n0.295291728\n0.297989672\n0.294623352\n0.288934702\n0.278918769\n0.283364498\n0.293266153\n0.281986997\n0.241473205\n0.207641221\n0.19817285\n0.195341148\n0.202978122\n0.200104841\n0.217652935\n0.261747984\n0.298000809\n0.29075264\n0.297027379\n0.302700343\n0.307032909\n0.308267189\n0.305152308\n0.300426167\n0.302232832\n0.294037885\n0.295175215\n0.285767761\n0.282360614\n0.278005414\n0.290893217\n0.24598572\n0.194277852\n0.175086453\n0.175977519\n0.169161693\n0.166235658\n0.171314784\n0.192399097\n0.251294989\n0.299778438\n0.300199381\n0.298779424\n0.296957853\n0.296240339\n0.299706883\n0.298605013\n0.301283351\n0.293124284\n0.294056147\n0.29394221\n0.29172864\n0.287462797\n0.28924273\n0.297014808\n0.266123869\n0.238300885\n0.217251476\n0.213297305\n0.207917724\n0.215405902\n0.220824582\n0.249341522\n0.282560614\n0.30336899\n0.298916233\n0.293166395\n0.289570802\n0.295495965\n0.29762719\n0.295753046\n0.292729669\n0.289354118\n0.28858822\n0.282525749\n0.272206012\n0.278069993\n0.285915261\n0.299938801\n0.299535478\n0.285000828\n0.265123931\n0.237753905\n0.229807994\n0.234885474\n0.239931006\n0.245147351\n0.281288076\n0.302686844\n0.299266786\n0.293947461\n0.292275906\n0.292783849\n0.29586491\n0.292952347\n0.282662997\n0.272764477\n0.275935514\n0.274616908\n0.268399439\n0.274140352\n0.274238337\n0.277405865\n0.258490521\n0.21490286\n0.187576454\n0.19146053\n0.188791055\n0.18489471\n0.191155565\n0.209066266"
  },
  {
    "path": "src/pymgrid/data/co2/co2_duke.csv",
    "content": "﻿CO2_DUK_I_kwh\n0.180924313\n0.18330306\n0.195031339\n0.190779281\n0.165302356\n0.148113168\n0.140914668\n0.143098532\n0.128036879\n0.123927542\n0.124957329\n0.12943563\n0.124560657\n0.113910851\n0.116719467\n0.159613893\n0.155651577\n0.149032037\n0.14856911\n0.144624445\n0.149420304\n0.160581971\n0.166213341\n0.164033259\n0.169841384\n0.173119022\n0.176464732\n0.169054668\n0.167960843\n0.153002017\n0.14763887\n0.147055356\n0.144711639\n0.143415602\n0.158535003\n0.168648573\n0.180316837\n0.168610615\n0.17225371\n0.165113102\n0.164272143\n0.170081495\n0.171532401\n0.175561898\n0.178842352\n0.177304381\n0.171966076\n0.164751042\n0.170001312\n0.172759279\n0.1671032\n0.160075053\n0.170098685\n0.18329244\n0.180231715\n0.176892934\n0.177131423\n0.175402517\n0.175442807\n0.192481053\n0.195465755\n0.188333364\n0.182832629\n0.177433068\n0.173888007\n0.183734724\n0.188138513\n0.188965016\n0.188272785\n0.188455708\n0.194178438\n0.188020591\n0.175812953\n0.177078925\n0.178597808\n0.186494801\n0.18873142\n0.176015787\n0.172187653\n0.170149274\n0.170767033\n0.166278493\n0.168423919\n0.175109323\n0.185303935\n0.178140683\n0.177864594\n0.172854695\n0.16626808\n0.169422786\n0.175087492\n0.177541067\n0.178081323\n0.177735477\n0.177131884\n0.179394072\n0.188322161\n0.195162166\n0.194831693\n0.196071491\n0.198228827\n0.176730716\n0.174204908\n0.167592255\n0.166092824\n0.162455566\n0.166625646\n0.171409597\n0.170833842\n0.181512774\n0.177599506\n0.176880952\n0.176820555\n0.144794254\n0.148011162\n0.151364413\n0.147907274\n0.147374288\n0.145005515\n0.172538064\n0.169530603\n0.170347237\n0.171879052\n0.174401593\n0.169586172\n0.172805229\n0.178670896\n0.181102599\n0.181977325\n0.181551552\n0.182037704\n0.184736267\n0.182996167\n0.174590372\n0.173904066\n0.186070694\n0.164709348\n0.158346696\n0.156492575\n0.156496902\n0.142211496\n0.142885232\n0.158863465\n0.178352654\n0.172918287\n0.172667975\n0.171941269\n0.18168002\n0.183477841\n0.162407927\n0.163314601\n0.159674654\n0.159781564\n0.160824838\n0.166159923\n0.186500296\n0.186470407\n0.1908492\n0.196925212\n0.184210394\n0.183584741\n0.182721821\n0.172742244\n0.17317108\n0.147707753\n0.153358633\n0.177265769\n0.174206477\n0.17659932\n0.178998273\n0.17738968\n0.174717635\n0.178519236\n0.182833072\n0.169895006\n0.173331704\n0.174184424\n0.173739785\n0.17166303\n0.175624277\n0.18044013\n0.175555722\n0.171454821\n0.180666538\n0.19028659\n0.167605681\n0.159864621\n0.161861117\n0.144903201\n0.151471338\n0.179569627\n0.185760197\n0.175725828\n0.178025756\n0.182180954\n0.193331348\n0.185407863\n0.169473435\n0.163180495\n0.159071655\n0.159999621\n0.164530148\n0.176160787\n0.200176938\n0.200039774\n0.197003122\n0.190024046\n0.204576978\n0.211781871\n0.211274674\n0.196193618\n0.204069397\n0.210811303\n0.218458502\n0.213896958\n0.201796644\n0.208891596\n0.215975291\n0.216389763\n0.225041347\n0.236842535\n0.231899233\n0.234528142\n0.240285522\n0.242249725\n0.262126383\n0.27568526\n0.276193394\n0.279376829\n0.282734494\n0.29386244\n0.307056\n0.296984632\n0.287537749\n0.279098827\n0.281544634\n0.288596532\n0.303456602\n0.317203833\n0.287779971\n0.289123623\n0.303684536\n0.311134116\n0.308108962\n0.312587361\n0.305661509\n0.311893297\n0.317696078\n0.319282265\n0.320309232\n0.319796718\n0.29974939\n0.292561521\n0.294522032\n0.296136828\n0.302936171\n0.313205817\n0.297282751\n0.273374922\n0.262914231\n0.262679808\n0.266165365\n0.273059866\n0.261342074\n0.251113495\n0.268314706\n0.266544477\n0.277013575\n0.288033953\n0.295751029\n0.302622338\n0.307108571\n0.308476696\n0.309800668\n0.311528578\n0.313783056\n0.308659686\n0.304536383\n0.297714205\n0.295283734\n0.296933952\n0.304518272\n0.308372419\n0.301123707\n0.304789137\n0.305383204\n0.306315476\n0.303213992\n0.288195331\n0.284337205\n0.283238887\n0.285942569\n0.290075084\n0.296579005\n0.300957523\n0.29613906\n0.290206826\n0.289324788\n0.285764367\n0.282471358\n0.290332284\n0.295682881\n0.290643459\n0.285674121\n0.284204684\n0.282994583\n0.269999357\n0.263448332\n0.259614136\n0.265349272\n0.261215101\n0.246256254\n0.245005955\n0.268258194\n0.274079979\n0.277024493\n0.280714061\n0.277111577\n0.268520843\n0.266903661\n0.275567181\n0.273026831\n0.268434508\n0.284542655\n0.28106825\n0.282033779\n0.284413226\n0.280508741\n0.285360081\n0.287037293\n0.279409434\n0.279819055\n0.281066379\n0.283114126\n0.284291174\n0.271278807\n0.2632545\n0.266724171\n0.270707084\n0.279467055\n0.286021427\n0.280028611\n0.278030869\n0.283488506\n0.277292108\n0.292833456\n0.308088958\n0.307437725\n0.297992975\n0.294503791\n0.277897879\n0.289462007\n0.309958075\n0.303559187\n0.306758753\n0.307537655\n0.304024124\n0.308978189\n0.30617091\n0.313436694\n0.316630238\n0.320991154\n0.315772489\n0.322850587\n0.326867432\n0.319749579\n0.326925667\n0.334313065\n0.333536274\n0.3364815\n0.349814941\n0.34686376\n0.328887484\n0.32315902\n0.344793392\n0.344717324\n0.327812717\n0.322764273\n0.318297722\n0.305037898\n0.289341751\n0.287293503\n0.289143903\n0.301706581\n0.323492492\n0.330452238\n0.333267159\n0.333140374\n0.32292517\n0.318105083\n0.319803348\n0.317421503\n0.322269518\n0.333311708\n0.342571628\n0.339517457\n0.331082499\n0.329309948\n0.317409654\n0.306163382\n0.309625264\n0.320855873\n0.319091026\n0.328323018\n0.322456724\n0.33251642\n0.332099334\n0.326275762\n0.314529441\n0.313338042\n0.320309017\n0.324403372\n0.302473609\n0.287174384\n0.285592868\n0.278867681\n0.273389252\n0.268058163\n0.264739522\n0.295007511\n0.306155088\n0.303756757\n0.313499904\n0.321153845\n0.302430298\n0.298100339\n0.27085471\n0.269298077\n0.262858052\n0.270814454\n0.267151903\n0.283241881\n0.282098247\n0.293481198\n0.291314465\n0.287840192\n0.287397844\n0.281310918\n0.283379135\n0.279429152\n0.27151283\n0.263743808\n0.245817909\n0.278953153\n0.266684545\n0.291736015\n0.304555771\n0.313741467\n0.318285652\n0.306866317\n0.293424054\n0.296812927\n0.292635104\n0.292747637\n0.28182831\n0.294180598\n0.28892293\n0.292743895\n0.289289704\n0.272483902\n0.272666832\n0.263069478\n0.255951719\n0.249840392\n0.235219945\n0.215177039\n0.205453192\n0.205911709\n0.221847627\n0.244786096\n0.257289424\n0.26687019\n0.275434259\n0.278664661\n0.278480906\n0.296226823\n0.306359795\n0.317819751\n0.325507208\n0.356139328\n0.378627379\n0.392246599\n0.394961877\n0.39874238\n0.398944381\n0.400157363\n0.406251139\n0.41049878\n0.401750783\n0.38988316\n0.383142479\n0.384026669\n0.386610632\n0.385356299\n0.391236202\n0.391499287\n0.388359864\n0.39690274\n0.40072367\n0.404914815\n0.394702688\n0.388443764\n0.383703912\n0.361699197\n0.353336089\n0.36574798\n0.367059277\n0.374367301\n0.391988845\n0.417594342\n0.430833811\n0.431489006\n0.431940505\n0.419502658\n0.412021679\n0.399062166\n0.399364814\n0.389754325\n0.390265502\n0.402277756\n0.394651394\n0.377894129\n0.369636007\n0.368951878\n0.357388943\n0.355955324\n0.353711898\n0.342870772\n0.340146727\n0.357870581\n0.365075948\n0.362789543\n0.376758017\n0.356874127\n0.361070067\n0.35207642\n0.34628823\n0.334129427\n0.328619018\n0.337899317\n0.397204651\n0.372986552\n0.352361973\n0.353956139\n0.345713327\n0.337648371\n0.331051717\n0.323689116\n0.318158308\n0.322593759\n0.324057742\n0.321910653\n0.324340255\n0.334739502\n0.323143391\n0.306369302\n0.291073305\n0.276724928\n0.254059343\n0.259037841\n0.257392322\n0.254750987\n0.257530943\n0.259908919\n0.298748867\n0.295692258\n0.3068435\n0.31672089\n0.319935365\n0.301955247\n0.279056109\n0.264295791\n0.264282913\n0.269292256\n0.283339507\n0.289320927\n0.284413381\n0.280739742\n0.279869568\n0.277320018\n0.280584848\n0.287520962\n0.265561882\n0.271837926\n0.284487442\n0.289462864\n0.301668273\n0.306235563\n0.293450681\n0.271923879\n0.301334236\n0.293163191\n0.29353123\n0.291580692\n0.292588001\n0.291053721\n0.301496836\n0.302136529\n0.304375421\n0.292959087\n0.294149687\n0.305421038\n0.301286762\n0.308932696\n0.318040703\n0.316137929\n0.322186937\n0.321154756\n0.322769672\n0.32371594\n0.319807298\n0.31219\n0.302700122\n0.297001281\n0.303284764\n0.326925457\n0.32894754\n0.310927996\n0.294706781\n0.261604976\n0.246048389\n0.238822035\n0.257385287\n0.271843402\n0.282236791\n0.283812143\n0.283133316\n0.286339959\n0.290840645\n0.292607064\n0.293988447\n0.300698962\n0.311763479\n0.313864868\n0.310999497\n0.309075\n0.30556968\n0.304013138\n0.304303323\n0.317443704\n0.328141495\n0.303392864\n0.291059439\n0.284682839\n0.297057093\n0.308879994\n0.319511077\n0.320191653\n0.321250401\n0.321174406\n0.317631949\n0.314142998\n0.298291618\n0.294070631\n0.278468872\n0.279090386\n0.284758228\n0.292088963\n0.303128761\n0.316286811\n0.302864117\n0.302458264\n0.305624229\n0.319473089\n0.314177953\n0.308644147\n0.301779446\n0.287346976\n0.28007378\n0.276898736\n0.291852932\n0.307457376\n0.327271597\n0.321872335\n0.320939651\n0.314843904\n0.311029961\n0.307773336\n0.29548881\n0.301772165\n0.314649458\n0.322889253\n0.328186537\n0.341962027\n0.354187026\n0.357222538\n0.375261488\n0.379818662\n0.378355374\n0.362178769\n0.355423645\n0.354587543\n0.369023726\n0.366723331\n0.371346071\n0.386056882\n0.398932048\n0.406341958\n0.408799053\n0.409366666\n0.40888444\n0.401221217\n0.406791881\n0.406269626\n0.409920266\n0.42040145\n0.423336351\n0.410399755\n0.391510707\n0.390827146\n0.402597462\n0.424461018\n0.406673798\n0.388398183\n0.36976696\n0.357946026\n0.354541939\n0.368771753\n0.400009432\n0.419342842\n0.417696004\n0.425108287\n0.4236275\n0.426777996\n0.43366225\n0.43188311\n0.43171504\n0.43459681\n0.435451081\n0.432520701\n0.417320205\n0.384582011\n0.377932154\n0.373077494\n0.377490152\n0.387155195\n0.396412431\n0.379135886\n0.350569535\n0.330586595\n0.325056559\n0.33018468\n0.34307769\n0.353272775\n0.365817305\n0.372452119\n0.378507213\n0.396826932\n0.413215813\n0.422017412\n0.422016156\n0.421466662\n0.414577601\n0.416432872\n0.419764737\n0.412219377\n0.393058064\n0.38191098\n0.397321359\n0.409045186\n0.370506134\n0.352643875\n0.326043868\n0.2984083\n0.280705506\n0.274268683\n0.290077453\n0.307536067\n0.32693772\n0.336810848\n0.326589542\n0.312986087\n0.304011076\n0.296316152\n0.284148727\n0.279523507\n0.291360847\n0.29810255\n0.295000625\n0.29084058\n0.285709021\n0.276512286\n0.282147172\n0.292384555\n0.267102446\n0.259986716\n0.23433708\n0.211254685\n0.205419204\n0.201541307\n0.214015041\n0.245777507\n0.25552357\n0.256215554\n0.257687693\n0.26089678\n0.250460133\n0.242148761\n0.243325737\n0.247931833\n0.253705421\n0.260191034\n0.26138715\n0.257419863\n0.251179873\n0.241766598\n0.239116458\n0.243092872\n0.248733513\n0.233574228\n0.234167988\n0.215097613\n0.215123167\n0.213515909\n0.227046504\n0.229120361\n0.232511551\n0.239287039\n0.237237669\n0.236999447\n0.233594682\n0.225804482\n0.216497051\n0.215753548\n0.219783383\n0.22788317\n0.230182084\n0.244370804\n0.241158486\n0.237274715\n0.238516824\n0.240274655\n0.228688914\n0.218275812\n0.215378827\n0.205808526\n0.207157858\n0.209682654\n0.228071918\n0.226962223\n0.22021408\n0.221584871\n0.224276012\n0.227519303\n0.221256271\n0.200886951\n0.202059242\n0.197647529\n0.195568623\n0.201051673\n0.216994741\n0.224874265\n0.227610305\n0.234484768\n0.245141113\n0.243510004\n0.217147054\n0.206984713\n0.203276993\n0.198314265\n0.205284258\n0.204713863\n0.207912244\n0.228441392\n0.217103708\n0.22700854\n0.23175531\n0.233434849\n0.222553933\n0.19950366\n0.177923711\n0.174401775\n0.171169907\n0.175801883\n0.191644814\n0.19918736\n0.224172672\n0.215963265\n0.226130477\n0.228197801\n0.217366308\n0.200625391\n0.203820355\n0.195438141\n0.199091515\n0.196574318\n0.186542474\n0.177187433\n0.180395169\n0.182985669\n0.17949883\n0.186780267\n0.187960933\n0.167372258\n0.165531581\n0.163967412\n0.155416871\n0.15634698\n0.163508263\n0.166916627\n0.187299494\n0.188390214\n0.200227401\n0.189432038\n0.158441074\n0.172233695\n0.181236264\n0.179237253\n0.185111768\n0.195805346\n0.202636811\n0.204513858\n0.191224362\n0.192354085\n0.199431932\n0.204582129\n0.196675472\n0.16476423\n0.158257181\n0.154354338\n0.15194573\n0.152932881\n0.158366375\n0.163808955\n0.197224747\n0.197278924\n0.199730356\n0.162813654\n0.167690027\n0.176892874\n0.176830265\n0.175966302\n0.177621402\n0.183554278\n0.201554398\n0.196787525\n0.192690672\n0.191670898\n0.192865364\n0.201662135\n0.197376883\n0.177466272\n0.18377519\n0.183822047\n0.184424608\n0.180843052\n0.173707042\n0.172510946\n0.203584687\n0.19238245\n0.175055293\n0.174704366\n0.177942872\n0.189335533\n0.188260661\n0.177678052\n0.176965721\n0.174776914\n0.179083195\n0.19895657\n0.196867515\n0.199776659\n0.203977608\n0.208886767\n0.213130033\n0.217002893\n0.219428643\n0.219625622\n0.220357952\n0.218005728\n0.219525044\n0.21513087\n0.205259114\n0.197011898\n0.199630895\n0.212515289\n0.222856355\n0.218960289\n0.205899485\n0.203788183\n0.213016307\n0.217310772\n0.224193656\n0.218986583\n0.204713653\n0.211444552\n0.218181431\n0.224287635\n0.215443973\n0.206719853\n0.20016974\n0.190729083\n0.189981116\n0.187105382\n0.197916262\n0.220604179\n0.219039385\n0.212165387\n0.214084102\n0.208661407\n0.204581102\n0.21418209\n0.223507501\n0.226284377\n0.226582354\n0.226859633\n0.222442909\n0.212648496\n0.202707588\n0.202460239\n0.206472512\n0.206656406\n0.199792371\n0.178792569\n0.176371158\n0.172179926\n0.173861601\n0.174731748\n0.178252839\n0.205749987\n0.199641089\n0.204667902\n0.205333591\n0.208669234\n0.203753687\n0.209170657\n0.224169261\n0.216923614\n0.21418678\n0.21588647\n0.214672597\n0.202092453\n0.196013133\n0.198303362\n0.206268087\n0.211814826\n0.218743847\n0.198114205\n0.184564133\n0.184889664\n0.186207165\n0.187086047\n0.197036464\n0.227789678\n0.211218763\n0.213239146\n0.22505706\n0.219701125\n0.188411554\n0.181518511\n0.182727819\n0.179886592\n0.180426932\n0.180103064\n0.182144228\n0.212804854\n0.199171478\n0.207108575\n0.207601636\n0.204763788\n0.215052264\n0.226010086\n0.228006721\n0.219106125\n0.218444114\n0.220717577\n0.225943429\n0.25184221\n0.23699754\n0.238124103\n0.234088052\n0.232680901\n0.215906614\n0.185965578\n0.183325735\n0.180074597\n0.178409381\n0.191179522\n0.196911554\n0.220123861\n0.209902029\n0.202798854\n0.204655037\n0.211021412\n0.206602776\n0.193832898\n0.181473026\n0.184885255\n0.182856359\n0.17943897\n0.181941283\n0.212101049\n0.199109282\n0.199597444\n0.209597008\n0.211875035\n0.202983158\n0.188808572\n0.186293985\n0.184069656\n0.185316139\n0.195691326\n0.196448406\n0.224071449\n0.215559339\n0.220037611\n0.218289335\n0.217827017\n0.200178027\n0.184425922\n0.169660014\n0.157509848\n0.156773771\n0.159592981\n0.161264801\n0.170620965\n0.162385162\n0.16450384\n0.213584423\n0.21748103\n0.218038347\n0.21620985\n0.211623939\n0.208239387\n0.210058545\n0.211670336\n0.212593424\n0.219239647\n0.229273186\n0.236035275\n0.247166359\n0.250191386\n0.23827437\n0.235580613\n0.221788552\n0.226763785\n0.224407157\n0.22302826\n0.220710282\n0.229058328\n0.239971956\n0.251598182\n0.243360245\n0.243131297\n0.232086031\n0.231578909\n0.245173327\n0.252119263\n0.247276326\n0.248677616\n0.249441965\n0.24049209\n0.243929367\n0.249117892\n0.253757976\n0.271059129\n0.273388753\n0.263597362\n0.240756278\n0.23509488\n0.22828735\n0.220356838\n0.219830502\n0.227974537\n0.235141241\n0.242486423\n0.255174845\n0.258458012\n0.219249143\n0.204249\n0.188138407\n0.178491385\n0.171287949\n0.18274166\n0.210157784\n0.207244097\n0.232237426\n0.230527494\n0.233013849\n0.236683495\n0.226231605\n0.228519098\n0.213037091\n0.211829331\n0.221150167\n0.228076271\n0.236978833\n0.255541921\n0.252960678\n0.25161909\n0.260006968\n0.267571326\n0.270291456\n0.274129402\n0.258953128\n0.273778969\n0.280815625\n0.285106957\n0.296091943\n0.284206828\n0.274774808\n0.273072\n0.272437928\n0.277834842\n0.278628718\n0.2660008\n0.250329888\n0.25315596\n0.25372406\n0.252136012\n0.250144624\n0.260804981\n0.249855573\n0.247783476\n0.245004763\n0.243916048\n0.247402681\n0.252287192\n0.263316192\n0.269203999\n0.272593094\n0.279273769\n0.275241307\n0.268294127\n0.262402141\n0.2652772\n0.269972357\n0.272831078\n0.27408962\n0.266433092\n0.247932569\n0.240243747\n0.234346151\n0.231828332\n0.241311642\n0.256450915\n0.251930963\n0.244969374\n0.250631899\n0.250610573\n0.256806625\n0.258736259\n0.221598878\n0.210838537\n0.203000509\n0.206203175\n0.207185033\n0.241926928\n0.245997121\n0.24873501\n0.235281816\n0.227368643\n0.196362861\n0.16693264\n0.162691943\n0.162263394\n0.163206841\n0.164169547\n0.165143733\n0.183067748\n0.225771847\n0.225385249\n0.233244055\n0.241006858\n0.241222515\n0.242831837\n0.242595525\n0.239220995\n0.238195697\n0.23685026\n0.23796266\n0.235664884\n0.229262401\n0.231190178\n0.238862774\n0.240114383\n0.24035505\n0.237276501\n0.240004529\n0.224802596\n0.221956828\n0.225987788\n0.226038142\n0.229937837\n0.229207342\n0.231569873\n0.227802338\n0.240015647\n0.246839761\n0.252444835\n0.259178664\n0.262983634\n0.269895574\n0.255137933\n0.272762089\n0.269308388\n0.258561238\n0.260663352\n0.263407119\n0.254036972\n0.254287881\n0.249717806\n0.242531867\n0.237994876\n0.227020571\n0.221295524\n0.218672921\n0.226836736\n0.21065389\n0.255603855\n0.250094203\n0.247898137\n0.251062406\n0.21533877\n0.205061213\n0.196797064\n0.17758753\n0.15303794\n0.178688483\n0.210098248\n0.205401325\n0.215858975\n0.222436023\n0.226844901\n0.233045886\n0.244606905\n0.221991177\n0.224530026\n0.23075894\n0.235640103\n0.233395343\n0.252625225\n0.236031641\n0.245897053\n0.251339685\n0.256242272\n0.235361297\n0.204571383\n0.174033541\n0.172755729\n0.179265586\n0.18408788\n0.195583806\n0.200750063\n0.201802875\n0.221997222\n0.230110582\n0.228554905\n0.224636333\n0.210107716\n0.212125787\n0.218013717\n0.226820979\n0.241512658\n0.244768542\n0.247763621\n0.244788795\n0.247234213\n0.246542177\n0.24862931\n0.248463538\n0.233541314\n0.194690629\n0.183536448\n0.19744613\n0.211116694\n0.224614086\n0.222416532\n0.228450871\n0.224794879\n0.224039764\n0.227070181\n0.222008238\n0.225724406\n0.203529362\n0.201657478\n0.200851978\n0.200075315\n0.197784908\n0.24082676\n0.224637737\n0.227116817\n0.242060823\n0.242461767\n0.247378877\n0.248463814\n0.239590047\n0.24316474\n0.249559826\n0.246308549\n0.250620494\n0.25096408\n0.23730872\n0.233829393\n0.232704701\n0.236833577\n0.242148104\n0.247091085\n0.225912681\n0.218133922\n0.210897327\n0.212483724\n0.21022176\n0.24373748\n0.232917607\n0.232180483\n0.245591762\n0.249718587\n0.244149316\n0.241532549\n0.233262162\n0.221847744\n0.224483563\n0.222668012\n0.229561843\n0.244475892\n0.241011795\n0.241399709\n0.24321829\n0.242275275\n0.244393883\n0.226067245\n0.224118599\n0.207508344\n0.199405295\n0.201601288\n0.200613548\n0.216877357\n0.24426647\n0.251140124\n0.258575067\n0.26030387\n0.256337907\n0.250610367\n0.250584441\n0.252585958\n0.261006792\n0.263030892\n0.270106872\n0.270844734\n0.261067941\n0.261847488\n0.255039354\n0.251933986\n0.254833467\n0.264232559\n0.259218128\n0.249021976\n0.2414297\n0.240236668\n0.245401383\n0.256143352\n0.250836333\n0.251713103\n0.249080451\n0.248916836\n0.255842283\n0.228028408\n0.191238451\n0.174660385\n0.166862178\n0.170709684\n0.183801252\n0.207004513\n0.234668817\n0.2599447\n0.258226238\n0.243926976\n0.235275699\n0.219399597\n0.225412728\n0.224025225\n0.22106638\n0.221093793\n0.223258231\n0.217204671\n0.201622848\n0.242208425\n0.233765628\n0.231336469\n0.241381571\n0.271947907\n0.276089338\n0.274114189\n0.278137261\n0.278913325\n0.280210146\n0.298618483\n0.28867604\n0.291444453\n0.295346653\n0.297537509\n0.28121148\n0.273602393\n0.258996646\n0.255614458\n0.257346826\n0.259162545\n0.275261376\n0.290285475\n0.296407477\n0.314887248\n0.331289897\n0.351372824\n0.352291538\n0.329129546\n0.33561073\n0.329575896\n0.318527666\n0.318352836\n0.31603662\n0.337909886\n0.329227618\n0.329915323\n0.345241002\n0.357687385\n0.366766622\n0.357748648\n0.353672592\n0.350362087\n0.363127703\n0.377694158\n0.38777463\n0.384481634\n0.377782094\n0.384910737\n0.39738309\n0.392385582\n0.385003357\n0.392749282\n0.392125014\n0.393086235\n0.390404865\n0.382870052\n0.388661889\n0.38106807\n0.344603798\n0.330441454\n0.32274024\n0.326650413\n0.341638671\n0.366518851\n0.383155641\n0.384000554\n0.381453932\n0.358566386\n0.343028582\n0.349861467\n0.353198236\n0.355877911\n0.355723255\n0.370102236\n0.374548756\n0.359195386\n0.348367674\n0.332227911\n0.318682463\n0.317092619\n0.322560894\n0.341261248\n0.332245995\n0.322882126\n0.330689221\n0.34703233\n0.374601129\n0.376174227\n0.378328156\n0.384045612\n0.377027713\n0.378787437\n0.376452556\n0.369226681\n0.353095056\n0.352905374\n0.368983297\n0.365558113\n0.355017146\n0.341979675\n0.33172738\n0.306298876\n0.273099268\n0.272875022\n0.288099952\n0.319791325\n0.352625623\n0.360689205\n0.364151199\n0.360805712\n0.349845072\n0.316741723\n0.305858388\n0.295059538\n0.296312456\n0.297390171\n0.308268305\n0.336335972\n0.34134646\n0.333515692\n0.353671753\n0.367749818\n0.364062825\n0.350532146\n0.348247734\n0.358331212\n0.365636565\n0.369574443\n0.376618139\n0.366097942\n0.3566797\n0.335315609\n0.344741968\n0.353882117\n0.359739597\n0.327327347\n0.297196418\n0.282138088\n0.285600531\n0.271932086\n0.264735846\n0.259133414\n0.26452695\n0.267964782\n0.260977351\n0.256627395\n0.272854969\n0.287901353\n0.280281817\n0.274149654\n0.268680935\n0.265091458\n0.27241377\n0.278972945\n0.268052881\n0.267828889\n0.274570273\n0.269774503\n0.261522101\n0.252909406\n0.250233282\n0.237527638\n0.237369109\n0.235672514\n0.239873196\n0.24357542\n0.245812688\n0.253732092\n0.25657758\n0.249396536\n0.243265392\n0.258338375\n0.250473862\n0.246549271\n0.247721907\n0.255566755\n0.266179874\n0.279558907\n0.275358217\n0.277250585\n0.280570549\n0.269519685\n0.249850915\n0.200858758\n0.193203778\n0.18496074\n0.178961547\n0.19189284\n0.191193716\n0.230233402\n0.228152214\n0.239864585\n0.253697187\n0.244824471\n0.230558323\n0.227408359\n0.220301486\n0.220364696\n0.228502395\n0.246582495\n0.260954979\n0.280344294\n0.28093734\n0.285807976\n0.286368072\n0.26953833\n0.239181318\n0.218677908\n0.203393764\n0.202247844\n0.208856193\n0.22776385\n0.250745735\n0.261095433\n0.262802599\n0.275669173\n0.287963786\n0.267298653\n0.250681062\n0.242676565\n0.232543767\n0.228948306\n0.232661826\n0.23382164\n0.249492905\n0.275781465\n0.274145649\n0.282593425\n0.293767526\n0.287282487\n0.267475958\n0.248416162\n0.25835552\n0.273815632\n0.290797846\n0.298937583\n0.297261751\n0.278338048\n0.268657204\n0.276787676\n0.288003629\n0.284102781\n0.271618103\n0.249640142\n0.24392656\n0.233926769\n0.236638347\n0.249116653\n0.258012275\n0.267310838\n0.270536488\n0.273850396\n0.280378986\n0.286475934\n0.270759179\n0.22857555\n0.220974321\n0.222415425\n0.218492846\n0.241583021\n0.272098263\n0.268338458\n0.251497124\n0.26866594\n0.277920527\n0.244130207\n0.23284328\n0.218999619\n0.214384146\n0.212615928\n0.220741901\n0.239945729\n0.258218297\n0.285108876\n0.283536347\n0.281498447\n0.29277396\n0.25621725\n0.22383799\n0.188610707\n0.169934236\n0.158077512\n0.148945469\n0.155773561\n0.189688692\n0.230323379\n0.24430192\n0.252329827\n0.238920367\n0.234546735\n0.22824464\n0.217209599\n0.22125621\n0.223677899\n0.23252093\n0.231431858\n0.241951572\n0.249951376\n0.246555288\n0.231575479\n0.228813673\n0.233443744\n0.234767425\n0.218452301\n0.205234567\n0.19979197\n0.199819115\n0.201483993\n0.200336516\n0.22834312\n0.2494585\n0.260068505\n0.248990953\n0.237741889\n0.223683982\n0.218331733\n0.213322332\n0.202711879\n0.200338355\n0.203357135\n0.221702409\n0.229968413\n0.240740601\n0.242867898\n0.240919712\n0.245933888\n0.251352057\n0.263530456\n0.266755346\n0.277101801\n0.283965777\n0.282662368\n0.285537499\n0.274257437\n0.273179988\n0.268624368\n0.281464834\n0.285747548\n0.254981839\n0.226686035\n0.216995671\n0.204394965\n0.194585848\n0.198697857\n0.22372795\n0.232311406\n0.220724544\n0.215233062\n0.214321895\n0.214216188\n0.238851081\n0.26430261\n0.277634657\n0.292539604\n0.331085683\n0.33422864\n0.320205902\n0.314287574\n0.321052464\n0.329376536\n0.344534886\n0.342180797\n0.323504286\n0.314655738\n0.291375589\n0.287105161\n0.281048088\n0.284933531\n0.296667276\n0.288288374\n0.269659191\n0.266111409\n0.275273086\n0.288911234\n0.29743639\n0.282484905\n0.282677533\n0.290649733\n0.299577906\n0.302226658\n0.305029077\n0.29903048\n0.292209082\n0.303082059\n0.313067132\n0.295129222\n0.2781934\n0.26177008\n0.246785699\n0.231472379\n0.223475919\n0.224226052\n0.25633194\n0.275772583\n0.295431459\n0.288341654\n0.305419444\n0.312699574\n0.316153823\n0.304601976\n0.305516218\n0.312093878\n0.320995599\n0.334596012\n0.334763533\n0.321034104\n0.314947006\n0.31936131\n0.329014634\n0.34053306\n0.325291988\n0.323376976\n0.319361376\n0.307957115\n0.303474415\n0.314022066\n0.338369725\n0.342332686\n0.337890047\n0.326064891\n0.327609579\n0.304092211\n0.279177188\n0.28318884\n0.278878899\n0.274842196\n0.269433173\n0.27393144\n0.299315136\n0.330696198\n0.340406756\n0.346168292\n0.343639406\n0.336057764\n0.327451333\n0.32044911\n0.320218257\n0.300536994\n0.295093232\n0.297548065\n0.301373931\n0.350920494\n0.337973141\n0.332725611\n0.339539663\n0.328626116\n0.320874686\n0.316357376\n0.309342216\n0.313976028\n0.325457503\n0.340399138\n0.348928561\n0.314473858\n0.311011231\n0.315240542\n0.328862532\n0.314644956\n0.31303549\n0.301990226\n0.289846349\n0.277835162\n0.254469516\n0.24961303\n0.257977983\n0.295873818\n0.301497787\n0.311237198\n0.305483289\n0.313088077\n0.310995368\n0.299713342\n0.300564525\n0.308189541\n0.312821196\n0.31141746\n0.30764204\n0.307366737\n0.287325838\n0.291902476\n0.313408602\n0.291349563\n0.274813537\n0.258419754\n0.244366198\n0.243724414\n0.231538712\n0.233156077\n0.232302527\n0.278235804\n0.30017231\n0.29707549\n0.303333502\n0.317355266\n0.322934751\n0.321016356\n0.321572445\n0.32115603\n0.333042771\n0.358952587\n0.380503484\n0.371454965\n0.347757832\n0.349204968\n0.346537678\n0.307817631\n0.273524648\n0.243550736\n0.226988797\n0.221158421\n0.219788344\n0.217570331\n0.220293017\n0.273955488\n0.303054359\n0.334091822\n0.343142906\n0.312794018\n0.291583143\n0.263810444\n0.240371867\n0.237153032\n0.239616402\n0.264054661\n0.303836283\n0.323256504\n0.353195545\n0.369267611\n0.360285214\n0.326556539\n0.298241297\n0.298824435\n0.308506946\n0.32945465\n0.350750907\n0.355461924\n0.337636465\n0.315389878\n0.305934986\n0.307885017\n0.305156642\n0.313999357\n0.306969214\n0.288310968\n0.27896529\n0.279135981\n0.284051522\n0.306578748\n0.332342997\n0.367909507\n0.357770325\n0.357738733\n0.363207634\n0.375185\n0.381023414\n0.37253423\n0.354525252\n0.343447491\n0.339186906\n0.332121488\n0.322320538\n0.359575774\n0.374161365\n0.368690789\n0.374571323\n0.388753037\n0.375836069\n0.346421692\n0.344916804\n0.356974649\n0.375530412\n0.38880462\n0.395007354\n0.363962988\n0.34907449\n0.365055259\n0.371967849\n0.371184144\n0.340383331\n0.32382855\n0.299781429\n0.29319258\n0.287347665\n0.290205044\n0.290122512\n0.330704521\n0.343761926\n0.331035711\n0.336675314\n0.352948415\n0.35190115\n0.344447463\n0.348676363\n0.354064189\n0.370482363\n0.378998951\n0.382066636\n0.359486732\n0.350291544\n0.363410906\n0.372618167\n0.372500468\n0.320247258\n0.293748343\n0.292363497\n0.290514332\n0.292166382\n0.300649142\n0.309304039\n0.338665567\n0.353793807\n0.353710761\n0.347969132\n0.359992465\n0.333806481\n0.333633969\n0.329679383\n0.331128583\n0.330055739\n0.351863874\n0.368702645\n0.339862015\n0.329634006\n0.335402374\n0.358034212\n0.339022952\n0.30482756\n0.291777736\n0.284522275\n0.275905926\n0.279036154\n0.301560085\n0.335737333\n0.369099827\n0.378530807\n0.38345635\n0.377725187\n0.373171203\n0.343954577\n0.313436261\n0.297141016\n0.288041304\n0.280008942\n0.277169109\n0.272712568\n0.309553532\n0.341446668\n0.343156559\n0.325577489\n0.285177417\n0.268833558\n0.263741984\n0.267249235\n0.270579968\n0.285548707\n0.305254679\n0.326862046\n0.353659846\n0.353013582\n0.35842726\n0.346815666\n0.340064332\n0.339224546\n0.320967559\n0.314442661\n0.304531624\n0.291747493\n0.288956194\n0.294271425\n0.30236706\n0.291115025\n0.321863484\n0.359224401\n0.366123567\n0.36924226\n0.35371648\n0.349528689\n0.347673158\n0.343389946\n0.353436276\n0.357834881\n0.368090502\n0.384724777\n0.375582669\n0.381109627\n0.386844141\n0.370804165\n0.349835589\n0.350654758\n0.362572602\n0.38112925\n0.396463732\n0.388685992\n0.360797523\n0.339928146\n0.353486655\n0.370854024\n0.367712802\n0.366829069\n0.316269303\n0.327696404\n0.317355275\n0.309774305\n0.314485599\n0.340406695\n0.357046379\n0.358977447\n0.339438297\n0.347984781\n0.362212381\n0.388584987\n0.396211586\n0.395868396\n0.392102816\n0.393049071\n0.394715691\n0.392473671\n0.353744454\n0.334099523\n0.335766245\n0.333137954\n0.33525016\n0.343908275\n0.35869359\n0.374788189\n0.366248488\n0.360519785\n0.364471206\n0.368905084\n0.38707719\n0.381420327\n0.361556004\n0.378668616\n0.384101805\n0.389091352\n0.396161658\n0.396988894\n0.401151218\n0.403570126\n0.405849546\n0.387875965\n0.351676521\n0.334972697\n0.327185074\n0.349265156\n0.3486328\n0.340613408\n0.308692122\n0.317392591\n0.320140401\n0.306887163\n0.317491546\n0.343147332\n0.363236675\n0.351980691\n0.3131539\n0.314943301\n0.341831147\n0.34097884\n0.336181111\n0.339327738\n0.34027988\n0.352205298\n0.360474798\n0.35696501\n0.32258526\n0.31840505\n0.343673654\n0.336117323\n0.311719843\n0.310340158\n0.302606885\n0.310857108\n0.318608897\n0.332995204\n0.345193364\n0.353209799\n0.343553572\n0.326724032\n0.314481562\n0.332653874\n0.354510438\n0.355907399\n0.345807275\n0.335422431\n0.324193539\n0.318055054\n0.330534062\n0.347659646\n0.372815769\n0.354278543\n0.348818046\n0.347886367\n0.348886057\n0.353469766\n0.358999118\n0.357808215\n0.359159491\n0.35919229\n0.364730154\n0.36463607\n0.363176286\n0.3438601\n0.327356957\n0.342017897\n0.349219015\n0.339935103\n0.320370239\n0.29868101\n0.282827577\n0.253229475\n0.239474225\n0.244911855\n0.251761048\n0.271811913\n0.269048025\n0.27019678\n0.262295576\n0.259901533\n0.257796794\n0.258696195\n0.256792386\n0.267412422\n0.275076549\n0.273006804\n0.28352997\n0.276371995\n0.262283615\n0.266495237\n0.271415464\n0.268962945\n0.253496161\n0.242158865\n0.228053255\n0.218049704\n0.217957764\n0.220632335\n0.241823868\n0.245297613\n0.266107198\n0.263984948\n0.259216282\n0.254270805\n0.249041758\n0.24254109\n0.251104808\n0.262140449\n0.263517222\n0.260134557\n0.2541738\n0.247147989\n0.234675022\n0.246615187\n0.261014271\n0.265382403\n0.253614628\n0.240199738\n0.232071728\n0.227200701\n0.23743849\n0.260122365\n0.291816928\n0.284714245\n0.288672839\n0.300761362\n0.301657987\n0.293642885\n0.29954229\n0.310460985\n0.30538951\n0.298179116\n0.295456544\n0.287716428\n0.285996567\n0.285319689\n0.281774234\n0.298050068\n0.310009274\n0.296918497\n0.279597291\n0.265010756\n0.254296264\n0.252794471\n0.257331307\n0.280198353\n0.28393986\n0.299166077\n0.30876678\n0.311982273\n0.31013471\n0.318255315\n0.315731171\n0.32251204\n0.325620484\n0.32538976\n0.323921205\n0.319565153\n0.306804504\n0.29753132\n0.285662568\n0.285179864\n0.29619432\n0.278028935\n0.26612251\n0.254675582\n0.251199279\n0.24518667\n0.253712577\n0.281217989\n0.292048708\n0.289468731\n0.303129744\n0.283446145\n0.268825898\n0.260257083\n0.271013082\n0.275137121\n0.284283321\n0.295035762\n0.308735372\n0.295566851\n0.279221358\n0.270650057\n0.266307341\n0.275424969\n0.291357474\n0.280533083\n0.273308242\n0.259842905\n0.256041671\n0.251580604\n0.255481457\n0.27609041\n0.282805393\n0.27868706\n0.289902891\n0.279097953\n0.281570451\n0.275752325\n0.255325126\n0.27052879\n0.289894217\n0.302998771\n0.303864314\n0.301553446\n0.292990982\n0.281896377\n0.277951547\n0.290329755\n0.294651816\n0.285878583\n0.273421418\n0.234305221\n0.22491571\n0.219016701\n0.225881561\n0.254200169\n0.283038038\n0.301113002\n0.328048361\n0.342585269\n0.342053711\n0.336472917\n0.350691904\n0.341055864\n0.336261714\n0.326068416\n0.325756548\n0.330365715\n0.325113785\n0.328781226\n0.337623865\n0.34270498\n0.338640296\n0.348542001\n0.339091281\n0.322235517\n0.297370468\n0.278061727\n0.283671046\n0.299153928\n0.304602585\n0.295932041\n0.326947537\n0.334376157\n0.336740842\n0.340741853\n0.332655139\n0.326516885\n0.31856471\n0.327004894\n0.332570492\n0.346171223\n0.362802466\n0.374575633\n0.36337334\n0.359705391\n0.357136513\n0.329478345\n0.300731132\n0.285403878\n0.276655332\n0.273241849\n0.257728238\n0.25619575\n0.25083717\n0.240234389\n0.300757836\n0.340644664\n0.345439863\n0.347766865\n0.361997541\n0.362088561\n0.37203799\n0.366179774\n0.360588228\n0.348697896\n0.339999319\n0.334445009\n0.323801897\n0.332998394\n0.350559331\n0.347846249\n0.333188671\n0.309457734\n0.293222735\n0.273422866\n0.269033373\n0.296078965\n0.313488845\n0.310244056\n0.303010144\n0.271532633\n0.254084445\n0.23414185\n0.22540455\n0.237696911\n0.258324302\n0.272021692\n0.287558529\n0.302517555\n0.325377328\n0.328757767\n0.328652675\n0.320413732\n0.310958959\n0.271408252\n0.252580767\n0.23571741\n0.235578361\n0.242480719\n0.25611494\n0.288201186\n0.286154543\n0.29706895\n0.295761148\n0.278498216\n0.25318807\n0.225010659\n0.217355516\n0.224182365\n0.233778778\n0.244152749\n0.286397535\n0.317479512\n0.338535141\n0.345699503\n0.332760036\n0.34068727\n0.339099505\n0.286876664\n0.26059304\n0.243508991\n0.235436055\n0.229582301\n0.234350285\n0.252991526\n0.272273437\n0.285981639\n0.279938781\n0.252795016\n0.242539098\n0.242776545\n0.252510323\n0.263621204\n0.281770663\n0.313377622\n0.316290768\n0.317098988\n0.306075549\n0.305792569\n0.306112565\n0.304443123\n0.312224865\n0.299649797\n0.275271266\n0.243874804\n0.236423089\n0.230732014\n0.233176617\n0.268703135\n0.298394343\n0.307289172\n0.289035497\n0.278381319\n0.263091405\n0.263865654\n0.268323197\n0.278812614\n0.281289784\n0.281606716\n0.304217026\n0.312462642\n0.324553264\n0.328671241\n0.318766327\n0.309158997\n0.306672553\n0.291783485\n0.260987312\n0.215914641\n0.195352859\n0.176840802\n0.178467257\n0.199678014\n0.210094675\n0.224012383\n0.230644392\n0.23487781\n0.233364272\n0.239092618\n0.27882683\n0.270734993\n0.259664842\n0.24406509\n0.238992476\n0.260915562\n0.255438925\n0.232866217\n0.226326243\n0.213060058\n0.185499485\n0.165879773\n0.177515525\n0.159325766\n0.151526036\n0.145436404\n0.145412238\n0.166524006\n0.158956926\n0.162855635\n0.167353615\n0.194258066\n0.191916045\n0.18273016\n0.182061965\n0.175824409\n0.170329311\n0.170172223\n0.175756549\n0.181575981\n0.189678728\n0.19713313\n0.193744099\n0.200376997\n0.207642604\n0.200587391\n0.182976287\n0.168579862\n0.162083453\n0.162492897\n0.169078641\n0.195139737\n0.18735796\n0.197529523\n0.203586425\n0.198014324\n0.189072992\n0.190751447\n0.184415334\n0.180088354\n0.1668321\n0.177955524\n0.157851255\n0.151539856\n0.186076068\n0.194468581\n0.19992198\n0.20811113\n0.208624077\n0.180100136\n0.174027894\n0.171899133\n0.174632538\n0.181600502\n0.193045267\n0.215768122\n0.212884797\n0.212751349\n0.210586717\n0.220583672\n0.221417441\n0.211512125\n0.204178397\n0.197868611\n0.183981196\n0.192463854\n0.197667451\n0.194171969\n0.198425607\n0.216138085\n0.217446553\n0.220471995\n0.206729467\n0.202681397\n0.172732822\n0.160593892\n0.160904149\n0.156628299\n0.162144433\n0.174148699\n0.208460798\n0.209131416\n0.201736554\n0.196699819\n0.193356565\n0.204608023\n0.199486503\n0.209810256\n0.22605406\n0.230280208\n0.235803913\n0.232182468\n0.241257403\n0.246004372\n0.255787159\n0.256486012\n0.257160119\n0.275540641\n0.284060442\n0.262058267\n0.247925899\n0.235256989\n0.239185546\n0.246698756\n0.292941022\n0.276166096\n0.280195712\n0.286992099\n0.273418429\n0.278857531\n0.293679822\n0.296959724\n0.29455653\n0.279440466\n0.289330554\n0.289957442\n0.297840871\n0.299268076\n0.282372155\n0.280612533\n0.29190873\n0.292862699\n0.277408063\n0.246263229\n0.231936161\n0.217470006\n0.216496845\n0.22560385\n0.252121991\n0.245292353\n0.259280365\n0.277772999\n0.281123528\n0.290110793\n0.291498924\n0.283074464\n0.27369622\n0.276037003\n0.269515221\n0.269326891\n0.27402158\n0.273453135\n0.264046977\n0.274415388\n0.293542078\n0.289561745\n0.29500424\n0.283020619\n0.279131504\n0.27925267\n0.285903916\n0.29173572\n0.321383034\n0.307301628\n0.303177903\n0.302487743\n0.297262248\n0.296135481\n0.296972334\n0.295067159\n0.289055955\n0.295001046\n0.305026723\n0.299560256\n0.291197422\n0.277600829\n0.265174329\n0.267627753\n0.256037503\n0.239422692\n0.226969587\n0.210979695\n0.199556312\n0.190319001\n0.178167595\n0.165227765\n0.184669534\n0.189497173\n0.185699279\n0.184213435\n0.159911907\n0.161598146\n0.161310188\n0.164412206\n0.169430163\n0.165747143\n0.174694464\n0.167158031\n0.163323081\n0.168204807\n0.16659959\n0.177185622\n0.186415127\n0.188955908\n0.178470794\n0.171527543\n0.165518101\n0.161038644\n0.158222034\n0.160184033\n0.162198711\n0.162463598\n0.176606897\n0.184007141\n0.181562813\n0.180338446\n0.17853534\n0.182333443\n0.195871413\n0.205053423\n0.20201288\n0.191067875\n0.191901583\n0.197343892\n0.187765715\n0.187543451\n0.186099045\n0.198853495\n0.186023445\n0.173648565\n0.168915208\n0.166891438\n0.171321714\n0.183228617\n0.199765246\n0.194114583\n0.189785032\n0.19831183\n0.19746483\n0.199688055\n0.19948807\n0.201425345\n0.205602882\n0.209808692\n0.212776958\n0.226601071\n0.224264175\n0.22192105\n0.22240495\n0.220749267\n0.20029643\n0.193919705\n0.187650878\n0.17777149\n0.168230229\n0.167348816\n0.173459914\n0.195856971\n0.211943858\n0.199793217\n0.212427459\n0.226978313\n0.235099724\n0.245614732\n0.255219239\n0.266722184\n0.273577824\n0.276029247\n0.279240693\n0.288115171\n0.279957826\n0.2817571\n0.282008775\n0.290415284\n0.285800125\n0.277669454\n0.263823747\n0.239061298\n0.216601386\n0.20835326\n0.209575034\n0.220727425\n0.251657579\n0.274276057\n0.26652432\n0.254406294\n0.269834958\n0.28014665\n0.294030757\n0.308872813\n0.315473878\n0.303860549\n0.302260347\n0.300601145\n0.299706047\n0.309449005\n0.314069719\n0.317153649\n0.305452021\n0.28909964\n0.264613653\n0.229727847\n0.217510972\n0.201836663\n0.203292402\n0.212489641\n0.242235933\n0.26663403\n0.267072265\n0.255687272\n0.261863193\n0.274196975\n0.289787755\n0.291177987\n0.294460356\n0.290484225\n0.286452091\n0.292501787\n0.291721192\n0.294595814\n0.288127809\n0.292246216\n0.308558671\n0.28902556\n0.248885592\n0.222711584\n0.210587948\n0.199978201\n0.202192909\n0.220046307\n0.257365945\n0.27352997\n0.274509712\n0.272215535\n0.281808426\n0.282075398\n0.297111345\n0.299925003\n0.302903829\n0.306286155\n0.32849036\n0.331559813\n0.329275202\n0.333299472\n0.344458402\n0.337706348\n0.333388467\n0.334174429\n0.334314852\n0.322575173\n0.309302126\n0.300858279\n0.295932858\n0.303160723\n0.314939467\n0.323502834\n0.33851208\n0.342906894\n0.344994325\n0.343509265\n0.344279603\n0.336179497\n0.326390902\n0.321731122\n0.335771535\n0.332350053\n0.343110949\n0.338770378\n0.334023433\n0.344774516\n0.34667226\n0.348569162\n0.3296081\n0.306060965\n0.289764083\n0.271143674\n0.260759878\n0.256123485\n0.263917882\n0.273353068\n0.292780444\n0.304370445\n0.328504645\n0.335405243\n0.339886258\n0.339265471\n0.345056\n0.347715609\n0.340647193\n0.331486691\n0.329311247\n0.332386553\n0.329526334\n0.334932539\n0.344154815\n0.323721638\n0.295061847\n0.258198211\n0.2386414\n0.226704811\n0.220264495\n0.237769899\n0.287815284\n0.299516244\n0.304181155\n0.305705376\n0.304325785\n0.308963481\n0.312780474\n0.312502873\n0.300820073\n0.293762287\n0.294798115\n0.303662744\n0.303022196\n0.306184296\n0.311575559\n0.326129584\n0.322075023\n0.289659759\n0.267477389\n0.249128059\n0.231026837\n0.215618819\n0.221776885\n0.240099569\n0.271644648\n0.288153896\n0.279245476\n0.278819908\n0.282000391\n0.294633433\n0.303085231\n0.311526728\n0.323248814\n0.314501289\n0.304761564\n0.304076818\n0.319011465\n0.323349665\n0.312970919\n0.306355657\n0.312917035\n0.30833641\n0.266809058\n0.238188043\n0.228360135\n0.220205266\n0.224020036\n0.245138987\n0.279537406\n0.279656031\n0.276362876\n0.280250062\n0.285937234\n0.300270124\n0.308405942\n0.307376697\n0.309112412\n0.308773287\n0.296652764\n0.290421857\n0.286217323\n0.299022701\n0.303354486\n0.299665145\n0.316784936\n0.307437523\n0.28455053\n0.262220863\n0.237118062\n0.221891812\n0.221149602\n0.23800304\n0.27512773\n0.288869633\n0.289142592\n0.291609792\n0.296122838\n0.302352696\n0.317536945\n0.325976719\n0.326561191\n0.325630675\n0.316770964\n0.308963919\n0.305068014\n0.30636399\n0.305379104\n0.315121889\n0.333429232\n0.308791482\n0.277260006\n0.241247064\n0.214850509\n0.202265492\n0.209028714\n0.237494431\n0.274436519\n0.275970061\n0.276702167\n0.281402002\n0.275181592\n0.278864012\n0.295129555\n0.306840878\n0.306095758\n0.297659075\n0.287467537\n0.279312258\n0.276511205\n0.280134453\n0.273865085\n0.276795226\n0.28616335\n0.271876139\n0.256281267\n0.244113498\n0.229892723\n0.219737786\n0.211551554\n0.210601275\n0.200298957\n0.206972321\n0.207337108\n0.233076268\n0.24072791\n0.252170725\n0.243961929\n0.242549559\n0.244636798\n0.239365134\n0.236796703\n0.235778473\n0.236673984\n0.240498469\n0.239748643\n0.246163165\n0.255531129\n0.25223296\n0.232793713\n0.205807143\n0.186635471\n0.175582059\n0.171297918\n0.172284432\n0.15948203\n0.177835242\n0.208488085\n0.247739825\n0.237606395\n0.239548615\n0.24955526\n0.252571262\n0.247182696\n0.248307468\n0.243698124\n0.247100018\n0.242999698\n0.240850325\n0.234207831\n0.236202181\n0.246488503\n0.243365903\n0.222424137\n0.19998901\n0.183037883\n0.170590352\n0.178192645\n0.200966296\n0.214412435\n0.235746658\n0.235948923\n0.252544978\n0.259419844\n0.2668286\n0.264478096\n0.263769664\n0.26419194\n0.268005394\n0.272492299\n0.271200478\n0.266177703\n0.265979998\n0.26946061\n0.270775473\n0.266314801\n0.244846699\n0.221594513\n0.200218136\n0.188201489\n0.181796885\n0.185878444\n0.208329243\n0.233963119\n0.250428224\n0.22910246\n0.215646146\n0.213413521\n0.213620679\n0.206788959\n0.209166075\n0.215669252\n0.227298626\n0.227196219\n0.240369739\n0.258969636\n0.278868576\n0.284120156\n0.283922428\n0.260471485\n0.231761451\n0.207913492\n0.189896176\n0.184979399\n0.181500078\n0.189008834\n0.208018159\n0.242283414\n0.240286068\n0.218543323\n0.208264405\n0.20547644\n0.207015914\n0.204450087\n0.209537959\n0.214629031\n0.221468529\n0.229632082\n0.220906873\n0.214767288\n0.219465644\n0.234681065\n0.229601484\n0.222406626\n0.216457468\n0.202775058\n0.193409097\n0.189893972\n0.184945744\n0.18764297\n0.204913958\n0.248607468\n0.255886464\n0.232628817\n0.220873816\n0.217107853\n0.227832805\n0.242231845\n0.265033875\n0.28813136\n0.302309555\n0.323963836\n0.322637193\n0.312984706\n0.31282128\n0.321648606\n0.329753195\n0.325293226\n0.282666398\n0.250635778\n0.224227416\n0.21225659\n0.205542653\n0.210868218\n0.224082883\n0.264284589\n0.276650975\n0.277824238\n0.283501727\n0.289243207\n0.310994895\n0.332395293\n0.344734315\n0.356509226\n0.349291256\n0.344526094\n0.346914223\n0.346246556\n0.349065523\n0.35809568\n0.362658365\n0.35439274\n0.348165543\n0.320540345\n0.294217264\n0.271189771\n0.253122796\n0.244703842\n0.236658802\n0.238494566\n0.254784635\n0.286780232\n0.316883116\n0.334557998\n0.342999364\n0.352521432\n0.357534197\n0.359327257\n0.354937113\n0.350427982\n0.347779207\n0.347995701\n0.352527385\n0.348923266\n0.355277098\n0.368143269\n0.352614262\n0.34113183\n0.313954138\n0.290712508\n0.269601488\n0.258352304\n0.243223646\n0.236979656\n0.256297628\n0.299893189\n0.336633008\n0.335619981\n0.350665656\n0.370140599\n0.370770992\n0.3614179\n0.3595369\n0.354872227\n0.353538089\n0.345658689\n0.349845321\n0.354638967\n0.350382529\n0.371092085\n0.37251777\n0.348124083\n0.332615462\n0.308754604\n0.297183578\n0.295980432\n0.324084314\n0.35694435\n0.366487125\n0.368009907\n0.37256545\n0.372842822\n0.369161928\n0.362307858\n0.356994967\n0.366036311\n0.36866864\n0.370278255\n0.368565767\n0.375550994\n0.389004225\n0.395805096\n0.409782294\n0.407666379\n0.379911592\n0.341114676\n0.320592063\n0.303657718\n0.282544568\n0.27066072\n0.276842449\n0.30526134\n0.318568951\n0.318268737\n0.320801158\n0.3437086\n0.356093879\n0.381361108\n0.397895659\n0.381856804\n0.372330933\n0.37419439\n0.37442236\n0.381629983\n0.390882418\n0.394474652\n0.404987508\n0.417423583\n0.388135492\n0.354653321\n0.324172267\n0.296886168\n0.283115489\n0.283619509\n0.293041442\n0.31648997\n0.328665953\n0.333582693\n0.335659644\n0.341703477\n0.341954974\n0.353173831\n0.369681298\n0.383187581\n0.389408223\n0.409703821\n0.412576425\n0.411803413\n0.412334117\n0.417306554\n0.419346324\n0.404420853\n0.37628462\n0.339281001\n0.318107443\n0.293638708\n0.275855764\n0.276037113\n0.297086061\n0.322418139\n0.353089876\n0.360114707\n0.354373577\n0.367268983\n0.379090755\n0.387704107\n0.397438966\n0.404225368\n0.390358913\n0.378927947\n0.376263985\n0.361120794\n0.360556517\n0.362176983\n0.369919875\n0.400723933\n0.386059977\n0.36403932\n0.352138595\n0.340171529\n0.319601864\n0.314711951\n0.328690177\n0.347861329\n0.363156081\n0.371345527\n0.371963104\n0.373658245\n0.370544739\n0.374104272\n0.374270366\n0.372571513\n0.377843085\n0.371492281\n0.371555704\n0.374495088\n0.382447807\n0.392621848\n0.403514866\n0.421207449\n0.426285383\n0.40603902\n0.399246724\n0.367596465\n0.337228235\n0.308855592\n0.295376662\n0.305293525\n0.309398958\n0.329528567\n0.349395394\n0.363165653\n0.390374406\n0.399852968\n0.399925485\n0.389155002\n0.384154475\n0.378962713\n0.37416914\n0.377125403\n0.382338326\n0.392742458\n0.414741517\n0.423379996\n0.404522696\n0.394858012\n0.379358124\n0.354455191\n0.339049402\n0.334953946\n0.319413761\n0.310645111\n0.339119403\n0.372850907\n0.399488636\n0.418580317\n0.429939458\n0.429336084\n0.434713337\n0.427072324\n0.417010363\n0.405768003\n0.395809797\n0.396551297\n0.408649927\n0.430216955\n0.449310842\n0.44562292\n0.424083497\n0.373347962\n0.32256386\n0.286073182\n0.278173462\n0.274231322\n0.273293859\n0.269521053\n0.272026179\n0.292088836\n0.320389904\n0.345418721\n0.371772931\n0.403961286\n0.428618064\n0.425077366\n0.422037702\n0.414576458\n0.397681732\n0.389866904\n0.400721142\n0.421660914\n0.437650436\n0.416803951\n0.376398026\n0.331812388\n0.299912853\n0.282576379\n0.271838234\n0.264592636\n0.281630176\n0.318014807\n0.345169565\n0.355783001\n0.378212413\n0.416786073\n0.434973543\n0.437105941\n0.429679927\n0.412884651\n0.417174075\n0.407771168\n0.406624315\n0.410177523\n0.424705279\n0.431447965\n0.443256805\n0.444977429\n0.427151272\n0.390896301\n0.364674226\n0.327380471\n0.305744388\n0.308738299\n0.319043988\n0.348528175\n0.375312306\n0.387185417\n0.398668344\n0.42408739\n0.436372931\n0.426543635\n0.420495781\n0.416474205\n0.414150175\n0.409399464\n0.419844039\n0.422766398\n0.424508002\n0.41941796\n0.435881468\n0.445478054\n0.414577789\n0.3768188\n0.341421118\n0.31341194\n0.295818174\n0.289753759\n0.319483531\n0.360006419\n0.381303145\n0.391123395\n0.408491963\n0.423681319\n0.44755441\n0.403703874\n0.389483492\n0.385779985\n0.392771452\n0.384666135\n0.388768814\n0.392800854\n0.398972946\n0.394946889\n0.388856293\n0.410220901\n0.406231353\n0.368302009\n0.340016231\n0.324814201\n0.309748341\n0.299977775\n0.309458559\n0.334868679\n0.368022295\n0.373671452\n0.388063986\n0.420154415\n0.441111773\n0.445734836\n0.442573109\n0.435664747\n0.433506724\n0.439555562\n0.434254963\n0.442349661\n0.432639887\n0.408797221\n0.390457369\n0.348317259\n0.310449503\n0.275829698\n0.250863131\n0.237004326\n0.226018517\n0.220904239\n0.222826012\n0.226336737\n0.23797558\n0.250614725\n0.257284748\n0.262802336\n0.275625553\n0.297426312\n0.320003238\n0.345225466\n0.354817951\n0.378106062\n0.39721703\n0.398815667\n0.403896078\n0.397662487\n0.398098879\n0.369022066\n0.322229679\n0.281756074\n0.242505623\n0.233920912\n0.227952613\n0.222052494\n0.22469829\n0.232696929\n0.242025049\n0.262651779\n0.295687763\n0.312047452\n0.32921105\n0.366940342\n0.377273955\n0.393026962\n0.399050705\n0.391904832\n0.389630728\n0.389562424\n0.395392324\n0.391835817\n0.398415478\n0.364135429\n0.327085019\n0.285920657\n0.260855874\n0.247692277\n0.235704681\n0.233872691\n0.25052574\n0.28088056\n0.303591761\n0.313899219\n0.325973798\n0.352107121\n0.379439381\n0.39848547\n0.410658561\n0.411284585\n0.410423318\n0.410745465\n0.403894779\n0.406024382\n0.415852015\n0.414500476\n0.417207088\n0.38516336\n0.321824188\n0.275080711\n0.247802221\n0.232377202\n0.225937858\n0.225266883\n0.242390757\n0.261249668\n0.282799011\n0.291023182\n0.288320485\n0.290785078\n0.294328606\n0.290853315\n0.312553422\n0.353485958\n0.380119532\n0.383993202\n0.386308584\n0.384935244\n0.395844416\n0.403212058\n0.407353606\n0.376563363\n0.339511642\n0.310598421\n0.279917645\n0.258220737\n0.251480625\n0.254003942\n0.277154231\n0.306759744\n0.320567485\n0.327797457\n0.342580013\n0.359909673\n0.374714393\n0.385638568\n0.393112258\n0.391411439\n0.382126942\n0.377405552\n0.369462644\n0.364916546\n0.373706103\n0.37737075\n0.375806297\n0.36457705\n0.320570249\n0.299161049\n0.272875891\n0.268034342\n0.262601526\n0.259764832\n0.271678661\n0.309092649\n0.331665871\n0.333167126\n0.340002828\n0.355707995\n0.354221844\n0.35685769\n0.340607811\n0.345481568\n0.344894918\n0.340230322\n0.341766064\n0.336815191\n0.327476082\n0.322266628\n0.321407092\n0.323808552\n0.297369957\n0.268885331\n0.254183641\n0.236905209\n0.227556874\n0.221119559\n0.235370565\n0.274192388\n0.288736437\n0.307001541\n0.320399603\n0.34038766\n0.354748654\n0.357338773\n0.351934402\n0.35026092\n0.33377063\n0.335151667\n0.350727067\n0.353495532\n0.350484325\n0.335607794\n0.323597014\n0.30685564\n0.270602147\n0.253088711\n0.24041206\n0.226675761\n0.217399234\n0.215190644\n0.220228609\n0.225158501\n0.232517201\n0.244134868\n0.26284592\n0.287751069\n0.296981252\n0.295295774\n0.297322739\n0.296360717\n0.29503702\n0.292427304\n0.295260119\n0.3047378\n0.299666754\n0.290466421\n0.292779806\n0.282596643\n0.269615197\n0.252906086\n0.224652997\n0.214459283\n0.210179872\n0.204007618\n0.206686349\n0.209735888\n0.21029596\n0.222873922\n0.232277125\n0.245566395\n0.249149171\n0.250576924\n0.265361012\n0.266236096\n0.262442986\n0.263406921\n0.278719491\n0.284862902\n0.284860638\n0.277658747\n0.276439936\n0.270728475\n0.251096004\n0.223640929\n0.213054327\n0.206073378\n0.203329915\n0.206339174\n0.21491655\n0.239186922\n0.24460897\n0.261920387\n0.285115813\n0.303109205\n0.296803089\n0.291415789\n0.291048488\n0.288926122\n0.292453868\n0.281166202\n0.285069519\n0.285126592\n0.281925305\n0.282259367\n0.281891779\n0.297646513\n0.281323047\n0.260432623\n0.248590405\n0.237955366\n0.23403756\n0.233102469\n0.229181975\n0.248670691\n0.250346848\n0.255383051\n0.26720752\n0.271840755\n0.286175069\n0.305106028\n0.311184674\n0.304865694\n0.300429188\n0.293860779\n0.287273399\n0.283632399\n0.282447635\n0.263889237\n0.260286416\n0.255580224\n0.243051109\n0.216806752\n0.196075346\n0.187581701\n0.182005652\n0.18522769\n0.196098287\n0.216018558\n0.22247557\n0.214535751\n0.213594259\n0.217580939\n0.219120388\n0.227649982\n0.236471966\n0.242092615\n0.24083149\n0.24058474\n0.239708665\n0.243143418\n0.243445526\n0.24347017\n0.235905718\n0.219631215\n0.21660354\n0.198294003\n0.1892164\n0.180767252\n0.175180469\n0.180529807\n0.193758879\n0.219622952\n0.213885887\n0.217145203\n0.216359621\n0.217870602\n0.225840679\n0.2366837\n0.259100825\n0.258970525\n0.250968986\n0.249692274\n0.251850625\n0.249333658\n0.247549492\n0.251756215\n0.242459884\n0.248269907\n0.253928454\n0.23141409\n0.210363271\n0.188901088\n0.178601015\n0.178365163\n0.190821858\n0.20241324\n0.203226951\n0.209256099\n0.20371375\n0.203173763\n0.203796889\n0.20199144\n0.205823711\n0.212473094\n0.215325039\n0.212352647\n0.216245291\n0.222183506\n0.226109864\n0.208654015\n0.20679505\n0.211509337\n0.205515262\n0.181788711\n0.161209454\n0.150417785\n0.141801622\n0.138253614\n0.142252125\n0.148058953\n0.164873837\n0.177546193\n0.177228907\n0.18138773\n0.206014917\n0.212566676\n0.214942613\n0.224484011\n0.228340753\n0.23062018\n0.227330508\n0.228770899\n0.231850342\n0.232422729\n0.237561933\n0.254910626\n0.249626928\n0.224633527\n0.203825722\n0.186021853\n0.167882552\n0.163119122\n0.164666974\n0.166834704\n0.181114645\n0.206352407\n0.220491476\n0.237518926\n0.280167388\n0.288050994\n0.298144245\n0.307273245\n0.31454942\n0.327045238\n0.322574344\n0.321619807\n0.325341487\n0.348714988\n0.353735245\n0.363254471\n0.343877023\n0.316705637\n0.292811073\n0.277886996\n0.270309858\n0.26885695\n0.272991107\n0.295346995\n0.303068364\n0.30953692\n0.322118604\n0.353115229\n0.364060611\n0.369401341\n0.371770435\n0.373008147\n0.370962865\n0.371410385\n0.373348377\n0.376223645\n0.375987049\n0.373813431\n0.379749506\n0.389165627\n0.381233438\n0.371907244\n0.34717501\n0.323410992\n0.306152252\n0.299582846\n0.314228975\n0.340859822\n0.369538689\n0.376488134\n0.367144262\n0.379494252\n0.39125856\n0.386016236\n0.37712414\n0.373789867\n0.375799566\n0.374658979\n0.375782833\n0.370131169\n0.368588768\n0.362478194\n0.356538534\n0.381986162\n0.375681774\n0.355456014\n0.328839129\n0.315105343\n0.308106687\n0.306738121\n0.322262666\n0.354385521\n0.370821563\n0.372068946\n0.36447639\n0.383790423\n0.384937661\n0.392900184\n0.393031373\n0.385971858\n0.391315727\n0.391135131\n0.386271463\n0.385390361\n0.389608707\n0.39416755\n0.387243706\n0.388980727\n0.380709261\n0.378899373\n0.362178177\n0.338044019\n0.318976699\n0.316271418\n0.332298474\n0.361316071\n0.386450489\n0.391386153\n0.395561868\n0.396036478\n0.389365162\n0.387844641\n0.387247713\n0.387544173\n0.391198986\n0.381795847\n0.382696122\n0.381925886\n0.386583491\n0.39592461\n0.394064717\n0.378260913\n0.346883681\n0.314056435\n0.288941849\n0.271645932\n0.262741572\n0.263258258\n0.275678325\n0.285737093\n0.315085679\n0.327579201\n0.324848927\n0.326966128\n0.345747658\n0.368356911\n0.387821629\n0.394257908\n0.388965233\n0.392077219\n0.396585731\n0.387941331\n0.384180298\n0.365010652\n0.374636235\n0.365627154\n0.336825169\n0.29905294\n0.273584338\n0.265043869\n0.260322607\n0.256987714\n0.257581474\n0.261286852\n0.277769136\n0.287671823\n0.294523413\n0.288966009\n0.290586623\n0.317419414\n0.352883839\n0.357144235\n0.388480285\n0.382917332\n0.367874864\n0.360396286\n0.36546617\n0.34985264\n0.333388079\n0.298616945\n0.283163995\n0.260971585\n0.247688626\n0.244123292\n0.239659559\n0.241262294\n0.246188185\n0.244274026\n0.248737005\n0.261398666\n0.272154295\n0.277294976\n0.277222731\n0.297467471\n0.303202787\n0.316708777\n0.328977917\n0.341421226\n0.362568944\n0.37773123\n0.375799549\n0.364588321\n0.351967983\n0.317732067\n0.29866525\n0.271665589\n0.257463244\n0.250631165\n0.248488511\n0.251927871\n0.260534577\n0.280645348\n0.290121545\n0.297951149\n0.322424436\n0.36145554\n0.403874489\n0.422945723\n0.42714978\n0.420075393\n0.412131549\n0.404140958\n0.401982288\n0.403415473\n0.407603207\n0.409221885\n0.408852325\n0.420026651\n0.385459069\n0.348481259\n0.321842172\n0.302338126\n0.293187161\n0.290879207\n0.293252139\n0.309492233\n0.337763091\n0.345353426\n0.347520524\n0.372228716\n0.40440353\n0.422072311\n0.434728133\n0.436865496\n0.428072826\n0.421262311\n0.415455858\n0.413506042\n0.401273273\n0.397247234\n0.417832311\n0.412395167\n0.369150183\n0.325075947\n0.296453085\n0.282901027\n0.281090981\n0.281313489\n0.285851638\n0.293611465\n0.3024418\n0.31776411\n0.327506045\n0.352440538\n0.377365266\n0.398934021\n0.402826741\n0.413102295\n0.411266184\n0.411534375\n0.411982115\n0.41737515\n0.418295003\n0.430945469\n0.431778167\n0.412982247\n0.371071781\n0.333837905\n0.310489812\n0.299604173\n0.296913406\n0.297055224\n0.303699944\n0.312737313\n0.328651807\n0.343406465\n0.370376708\n0.40562525\n0.418330591\n0.421913559\n0.422826406\n0.417154327\n0.407504822\n0.403592911\n0.398898162\n0.399953449\n0.4035967\n0.410840195\n0.403107114\n0.407343964\n0.390118979\n0.362880947\n0.327029496\n0.297790777\n0.284636577\n0.279362291\n0.285534329\n0.303065925\n0.325722962\n0.342108436\n0.360935491\n0.373464054\n0.39340543\n0.393254904\n0.395039753\n0.396489202\n0.39441657\n0.40071909\n0.403015498\n0.409728374\n0.423839916\n0.425394993\n0.41814041\n0.416105663\n0.39476247\n0.372028003\n0.345585245\n0.320003483\n0.296739733\n0.288897859\n0.281000192\n0.281775517\n0.285402833\n0.301247447\n0.324765628\n0.357767144\n0.396287084\n0.429741941\n0.445041556\n0.438413758\n0.422966107\n0.412999119\n0.408440488\n0.411626726\n0.417744998\n0.420552522\n0.425397897\n0.42620935\n0.401454543\n0.376761995\n0.345536415\n0.308639007\n0.286992608\n0.280972646\n0.275500774\n0.276978444\n0.284221834\n0.300357334\n0.322959027\n0.36324032\n0.403465522\n0.436059391\n0.445494435\n0.442240017\n0.434421521\n0.431172612\n0.427710282\n0.428300697\n0.432250829\n0.445027292\n0.449415743\n0.449630124\n0.425331322\n0.387269101\n0.360628716\n0.351236786\n0.333426845\n0.316952636\n0.32522323\n0.335671205\n0.357827782\n0.367634662\n0.374266351\n0.40988921\n0.438340734\n0.447315562\n0.44982509\n0.443250065\n0.430970212\n0.428708884\n0.433682846\n0.429324792\n0.436357168\n0.437102332\n0.431796428\n0.429522956\n0.410549137\n0.379082604\n0.338708168\n0.314224749\n0.303210052\n0.293771967\n0.302880032\n0.313845751\n0.340603547\n0.370469476\n0.389880492\n0.420403398\n0.446127038\n0.449207212\n0.446789149\n0.4438939\n0.441686691\n0.428329905\n0.423386817\n0.422496505\n0.427574854\n0.440635675\n0.446738707\n0.451593855\n0.429565093\n0.398478654\n0.374668841\n0.349501262\n0.338864606\n0.337792595\n0.342374657\n0.35062696\n0.374144701\n0.380552248\n0.388678913\n0.422347087\n0.441839012\n0.443804387\n0.434837839\n0.425299173\n0.418882392\n0.416912578\n0.420105023\n0.423370856\n0.425450309\n0.424664207\n0.429114826\n0.440971866\n0.422080194\n0.394755566\n0.361134577\n0.323420449\n0.310747587\n0.303883291\n0.302093398\n0.296601326\n0.291459934\n0.308772977\n0.344277142\n0.38109561\n0.404414204\n0.405758365\n0.392301596\n0.39327449\n0.400053453\n0.409056758\n0.408159946\n0.405154635\n0.405178502\n0.394543634\n0.379135374\n0.353548655\n0.331921114\n0.301805173\n0.270470437\n0.248308082\n0.24094836\n0.239453015\n0.247788112\n0.252330966\n0.262818539\n0.28970477\n0.305816837\n0.316280663\n0.344849093\n0.378121589\n0.400157232\n0.412336677\n0.407284378\n0.3995492\n0.39866092\n0.40540689\n0.417110822\n0.424379654\n0.412020349\n0.381608557\n0.344790754\n0.310660809\n0.287821286\n0.272959464\n0.264951937\n0.259775685\n0.26207607\n0.264651144\n0.274574654\n0.287935391\n0.297735467\n0.319759842\n0.351792291\n0.386072714\n0.405615587\n0.408805903\n0.407194484\n0.410078823\n0.417952647\n0.416623507\n0.417617391\n0.41350771\n0.421222046\n0.427184917\n0.392720356\n0.368382809\n0.332803177\n0.299108144\n0.282267479\n0.277710178\n0.271752012\n0.272309426\n0.283754428\n0.300352289\n0.333113856\n0.376598824\n0.417944395\n0.432825377\n0.437881636\n0.430426952\n0.414438653\n0.408139308\n0.414003955\n0.421291889\n0.433374217\n0.439482306\n0.439749983\n0.432602339\n0.397664714\n0.354030786\n0.328128197\n0.315623615\n0.299995657\n0.298497664\n0.30810247\n0.33289704\n0.354034427\n0.38423866\n0.414848758\n0.437322945\n0.44594095\n0.440102778\n0.428183662\n0.415752716\n0.413810062\n0.416648994\n0.417291678\n0.429063967\n0.443899448\n0.457238348\n0.460466303\n0.445951286\n0.426301587\n0.397087337\n0.368659638\n0.339641747\n0.323447041\n0.322229899\n0.334533263\n0.361673563\n0.374515069\n0.381410464\n0.384395341\n0.401214605\n0.412374527\n0.423397617\n0.432392688\n0.430616008\n0.417266137\n0.413786339\n0.409959796\n0.410064639\n0.414388754\n0.429478344\n0.43487583\n0.423958388\n0.396315407\n0.364699022\n0.341205937\n0.313919411\n0.300791162\n0.303376744\n0.326917767\n0.361308559\n0.37958179\n0.392765947\n0.414995447\n0.42881275\n0.441180069\n0.448736482\n0.434521411\n0.424131286\n0.414273923\n0.414073033\n0.412465938\n0.414962054\n0.428424862\n0.452649142\n0.453335632\n0.449557336\n0.427250487\n0.401173742\n0.378785892\n0.355842505\n0.334425535\n0.331602171\n0.353527835\n0.392373846\n0.417320824\n0.43178162\n0.436902467\n0.446964279\n0.445163042\n0.441162423\n0.437864944\n0.425218946\n0.416267732\n0.41876267\n0.417860007\n0.416192542\n0.419403482\n0.412738808\n0.410804781\n0.415611573\n0.424143184\n0.406498313\n0.388916071\n0.368197643\n0.35156274\n0.346087807\n0.365368123\n0.389637259\n0.407119398\n0.414992154\n0.41657211\n0.420011367\n0.436777266\n0.434182333\n0.421769862\n0.410476534\n0.406418387\n0.406803692\n0.412700549\n0.422225034\n0.425241666\n0.437536628\n0.435437359\n0.429299125\n0.407709804\n0.399022257\n0.389637102\n0.366643399\n0.356673432\n0.350276565\n0.353742083\n0.352349256\n0.363532828\n0.388368523\n0.407073055\n0.426090873\n0.439600082\n0.436531681\n0.430106758\n0.426072312\n0.429032997\n0.430056588\n0.431214511\n0.440588912\n0.44143087\n0.437138596\n0.435474613\n0.425691749\n0.381358593\n0.345161699\n0.315844781\n0.300500779\n0.291290017\n0.283970807\n0.281959031\n0.278998813\n0.28576658\n0.307770994\n0.333276233\n0.346138575\n0.380486262\n0.411877902\n0.416624551\n0.426190694\n0.42572107\n0.419968854\n0.415579221\n0.410556871\n0.421007297\n0.437622378\n0.447013301\n0.436887352\n0.408375536\n0.372178945\n0.351692131\n0.330232398\n0.312700083\n0.304339798\n0.329837082\n0.351713915\n0.388028357\n0.420859994\n0.432593217\n0.446006416\n0.447524824\n0.438304105\n0.432979562\n0.42970525\n0.424616716\n0.423079282\n0.425538778\n0.422361517\n0.432401034\n0.442663464\n0.450354845\n0.452031031\n0.432836181\n0.418879095\n0.402176944\n0.378050437\n0.353907052\n0.352437376\n0.368557122\n0.402132038\n0.425499942\n0.441004253\n0.453973705\n0.458638561\n0.450151236\n0.429237961\n0.42526094\n0.428095796\n0.424487502\n0.422812954\n0.423181101\n0.431833421\n0.435068508\n0.439977517\n0.444766614\n0.468137444\n0.454553098\n0.441798561\n0.433023137\n0.413582931\n0.389387118\n0.378881839\n0.393071789\n0.41653761\n0.434004397\n0.441977705\n0.46173378\n0.473439372\n0.468629836\n0.451745552\n0.43878618\n0.436337332\n0.438177275\n0.438932618\n0.437601301\n0.440135838\n0.438895848\n0.433628709\n0.435961597\n0.443448917\n0.435853548\n0.416977336\n0.396394197\n0.385390156\n0.378926421\n0.375877225\n0.385433419\n0.399580309\n0.419538946\n0.436681665\n0.443234172\n0.442476853\n0.451399397\n0.444788553\n0.432501039\n0.423043933\n0.424661648\n0.42823774\n0.430338425\n0.435992557\n0.445862355\n0.452121921\n0.460485528\n0.454699312\n0.4264244\n0.400805103\n0.374992844\n0.353308088\n0.332995135\n0.340668634\n0.352861557\n0.373095754\n0.386469245\n0.408143761\n0.422439102\n0.422771288\n0.413901694\n0.401825987\n0.400716893\n0.404524821\n0.42007486\n0.433895273\n0.428918774\n0.42881951\n0.433582347\n0.442926458\n0.460516593\n0.466984199\n0.454829482\n0.445600147\n0.431479355\n0.406580402\n0.382675751\n0.364414078\n0.359550328\n0.356558556\n0.370956029\n0.400256158\n0.425752147\n0.425095716\n0.444611418\n0.455993098\n0.456290571\n0.450445459\n0.446255916\n0.43788608\n0.43458916\n0.430071278\n0.433737194\n0.44889573\n0.455578391\n0.449771478\n0.429858197\n0.396334543\n0.375527331\n0.354345383\n0.335347947\n0.321167736\n0.316264323\n0.313378106\n0.327278775\n0.360262579\n0.385452946\n0.410277422\n0.429677838\n0.438555733\n0.441499871\n0.441086224\n0.444209632\n0.43683316\n0.430208681\n0.427412113\n0.434092545\n0.451781615\n0.466067518\n0.464829263\n0.444736054\n0.420210613\n0.388781069\n0.361835562\n0.3512608\n0.345887402\n0.343647973\n0.363426287\n0.390884877\n0.413421753\n0.427222539\n0.4499183\n0.450100494\n0.444953117\n0.444813739\n0.439553712\n0.436661879\n0.439335175\n0.442308562\n0.440810336\n0.434364548\n0.431876993\n0.420187674\n0.400172302\n0.395700614\n0.384757239\n0.35864477\n0.329597223\n0.322744662\n0.323233757\n0.332881732\n0.360242901\n0.3754816\n0.392145053\n0.40537152\n0.416914749\n0.415423365\n0.394579266\n0.379278386\n0.38398724\n0.384073505\n0.385183464\n0.386857879\n0.39395449\n0.396624939\n0.384417656\n0.37357338\n0.345389115\n0.293067034\n0.278227126\n0.257193715\n0.246983761\n0.237940605\n0.243719153\n0.255023701\n0.271431675\n0.290857058\n0.29896563\n0.304165548\n0.309378178\n0.313339829\n0.333460569\n0.345149859\n0.364833224\n0.370637578\n0.373031765\n0.376781499\n0.381094883\n0.388603995\n0.400051724\n0.397170529\n0.37064284\n0.307673857\n0.285009567\n0.261119478\n0.241319539\n0.236273202\n0.236504907\n0.245842573\n0.258539445\n0.268995748\n0.280710848\n0.261764821\n0.28604503\n0.30416191\n0.321755952\n0.319141272\n0.310139748\n0.308143087\n0.314033536\n0.313294533\n0.313354553\n0.325517266\n0.325507896\n0.335832475\n0.349713886\n0.312750034\n0.299528219\n0.273579693\n0.255804131\n0.245862512\n0.244281421\n0.250554095\n0.270424792\n0.295535079\n0.307200227\n0.312188667\n0.330333312\n0.354701806\n0.358886429\n0.363829511\n0.355067196\n0.352780126\n0.340030164\n0.341808816\n0.349855805\n0.360035525\n0.3659527\n0.360981474\n0.365450464\n0.319305354\n0.296393433\n0.276273464\n0.259430008\n0.249744019\n0.24590214\n0.242458396\n0.245891118\n0.250222613\n0.260708212\n0.275633712\n0.289996622\n0.311106174\n0.357842219\n0.392741339\n0.40856281\n0.41125633\n0.416236996\n0.419074649\n0.415460063\n0.417635523\n0.438029944\n0.42916688\n0.395878431\n0.340899116\n0.310641677\n0.277124149\n0.259401619\n0.249625884\n0.244850062\n0.245217834\n0.246826904\n0.250502461\n0.264408646\n0.286039618\n0.302567499\n0.324668017\n0.373740458\n0.403854979\n0.409217091\n0.411247583\n0.404857923\n0.392116338\n0.390058321\n0.392884284\n0.389384329\n0.38693442\n0.399642447\n0.3565745\n0.323345752\n0.292561382\n0.274114129\n0.265374856\n0.265286465\n0.278279108\n0.291591518\n0.308140684\n0.324485152\n0.339617904\n0.375992937\n0.41295852\n0.429276147\n0.435012973\n0.43100902\n0.420516345\n0.408765838\n0.407685459\n0.406739043\n0.407666844\n0.4039162\n0.413122661\n0.41776881\n0.386039566\n0.357856317\n0.327989715\n0.296673402\n0.278292372\n0.279398196\n0.28971006\n0.305801234\n0.321916985\n0.333850884\n0.349641721\n0.371718071\n0.393895559\n0.407297403\n0.415872376\n0.412455717\n0.409013801\n0.400765029\n0.406409268\n0.409346197\n0.419408368\n0.423578001\n0.411697756\n0.390510399\n0.372013475\n0.351607067\n0.319917894\n0.302739858\n0.287015338\n0.284542144\n0.301869009\n0.32439453\n0.338330209\n0.351634761\n0.36985546\n0.390387357\n0.400533338\n0.409754195\n0.406615584\n0.386979503\n0.385261564\n0.380506755\n0.384310485\n0.391157297\n0.404267099\n0.411595098\n0.414857121\n0.411539067\n0.396863512\n0.369168496\n0.334710986\n0.311839057\n0.288478973\n0.28621866\n0.303950054\n0.326509678\n0.338464416\n0.357282293\n0.36782282\n0.37886085\n0.391647893\n0.377784876\n0.372134537\n0.366201099\n0.370694582\n0.372894119\n0.374837363\n0.374274412\n0.376205537\n0.36830693\n0.37218836\n0.374999307\n0.356739065\n0.313572402\n0.282403605\n0.265221112\n0.255646374\n0.253215946\n0.262388463\n0.288529334\n0.314095594\n0.326575604\n0.33389852\n0.350056102\n0.361736333\n0.374432321\n0.380791291\n0.386610318\n0.377784362\n0.367430567\n0.359663976\n0.363518378\n0.359919661\n0.354500901\n0.356287495\n0.347491964\n0.332475552\n0.308210653\n0.285798484\n0.273644008\n0.26565472\n0.267850353\n0.274250384\n0.276099336\n0.282042594\n0.292592749\n0.306320326\n0.325539409\n0.334441226\n0.355778034\n0.365032129\n0.368629174\n0.357911903\n0.342151389\n0.335067391\n0.334781703\n0.341663671\n0.353488994\n0.369733781\n0.362730008\n0.347204008\n0.323562656\n0.298920224\n0.28080788\n0.276145891\n0.275942037\n0.277877377\n0.278558796\n0.281482231\n0.292264166\n0.307828772\n0.320012707\n0.327078629\n0.342582575\n0.353103249\n0.361471907\n0.374193958\n0.375600912\n0.374558896\n0.375320401\n0.371274709\n0.363917964\n0.35771301\n0.342335012\n0.311005886\n0.288685489\n0.278824743\n0.273972433\n0.27295824\n0.280855069\n0.299030859\n0.316415935\n0.331438492\n0.337780034\n0.341912088\n0.353405637\n0.36620641\n0.382607806\n0.405889586\n0.418141389\n0.414407698\n0.414086724\n0.416623017\n0.41952503\n0.419517887\n0.427175864\n0.421377968\n0.390383271\n0.345685077\n0.319108438\n0.301969896\n0.290124233\n0.287931806\n0.289083234\n0.301259837\n0.321056873\n0.330752598\n0.340706529\n0.347655732\n0.370180021\n0.389469226\n0.410771556\n0.422488764\n0.422004047\n0.413065774\n0.405578321\n0.399480088\n0.397419244\n0.405313387\n0.401537796\n0.407346793\n0.422460106\n0.406033573\n0.367887654\n0.338386536\n0.31723716\n0.305901377\n0.30725865\n0.325962953\n0.348049644\n0.365685478\n0.382953431\n0.398928126\n0.41374449\n0.4283547\n0.429814032\n0.423149061\n0.412762411\n0.404854905\n0.391770935\n0.388399859\n0.392261378\n0.401780804\n0.403477866\n0.410208758\n0.424927728\n0.405236197\n0.379704769\n0.355165569\n0.330387762\n0.321777252\n0.314828102\n0.322613766\n0.333937292\n0.353922404\n0.369071124\n0.380197807\n0.406561662\n0.42631757\n0.436847907\n0.434475169\n0.431620673\n0.431232484\n0.432056347\n0.425409947\n0.421949139\n0.431727611\n0.448995536\n0.456806676\n0.457135122\n0.413174966\n0.366904039\n0.340022277\n0.321826754\n0.308074402\n0.310106805\n0.314183334\n0.33932317\n0.361624113\n0.375102988\n0.381507015\n0.40491626\n0.439143713\n0.453249826\n0.451954759\n0.442603305\n0.433389248\n0.424280592\n0.414346458\n0.419335039\n0.433693176\n0.4437131\n0.448222936\n0.45450391\n0.430498317\n0.406724323\n0.381716728\n0.3404247\n0.316576524\n0.308833867\n0.314248073\n0.313186912\n0.318356802\n0.349570095\n0.369417429\n0.380673746\n0.402949208\n0.436204598\n0.451653586\n0.45176583\n0.448518253\n0.442176133\n0.434134972\n0.43528113\n0.441710525\n0.445580503\n0.443871657\n0.441404903\n0.410435344\n0.372110393\n0.345384295\n0.32607893\n0.313058366\n0.309691378\n0.310659204\n0.309805301\n0.31393876\n0.322743572\n0.351000809\n0.381594561\n0.410378819\n0.434095697\n0.444486512\n0.444758428\n0.442358132\n0.435494894\n0.423006999\n0.417089665\n0.426715746\n0.438950535\n0.458444138\n0.452216879\n0.420791011\n0.384611571\n0.356459384\n0.339707053\n0.324431021\n0.322724276\n0.347020077\n0.382944134\n0.415871162\n0.430995526\n0.438819272\n0.444472915\n0.456831999\n0.45657444\n0.45210615\n0.450447852\n0.445688594\n0.436562763\n0.427941645\n0.426278354\n0.437863533\n0.44900751\n0.460621211\n0.461587841\n0.446161988\n0.425682633\n0.398890909\n0.391614896\n0.373442082\n0.37232188\n0.397161026\n0.422238174\n0.441345903\n0.450323867\n0.454679052\n0.462068634\n0.457915291\n0.441766583\n0.426793353\n0.42785287\n0.429020569\n0.433411541\n0.441292281\n0.448213423\n0.45195265\n0.462507384\n0.462045928\n0.463697928\n0.447927117\n0.424435108\n0.407769073\n0.396256268\n0.383968268\n0.384162886\n0.406819404\n0.430746113\n0.441223446\n0.43482407\n0.441007618\n0.446944131\n0.455945009\n0.462769861\n0.459001913\n0.444791926\n0.439813363\n0.440182549\n0.43877583\n0.43173191\n0.446907505\n0.451374213\n0.453541954\n0.45633088\n0.445498254\n0.416175231\n0.388751054\n0.362242264\n0.342461121\n0.340080391\n0.35943531\n0.386116564\n0.410416596\n0.422132168\n0.426218935\n0.441851693\n0.446376418\n0.455417318\n0.453049302\n0.448399219\n0.435369367\n0.423317837\n0.422012804\n0.419786565\n0.433978626\n0.434315579\n0.452673871\n0.454728425\n0.440030454\n0.424756284\n0.400694787\n0.374764625\n0.355357937\n0.344654265\n0.360263227\n0.377929571\n0.398484847\n0.418993487\n0.440123114\n0.447109137\n0.457585356\n0.449947529\n0.447530654\n0.440815351\n0.42999899\n0.428229375\n0.429205517\n0.427347123\n0.447521859\n0.459235285\n0.465460462\n0.454951789\n0.436992338\n0.40796938\n0.401670363\n0.382828639\n0.359518875\n0.340964876\n0.340545318\n0.341953644\n0.34921329\n0.385262124\n0.421160953\n0.434463174\n0.445620437\n0.448894997\n0.444647935\n0.442495232\n0.436879904\n0.43855825\n0.442789967\n0.450449332\n0.461153263\n0.459844757\n0.451149389\n0.436934293\n0.40001093\n0.378256734\n0.354787874\n0.334202976\n0.314430206\n0.307461664\n0.307739536\n0.314602762\n0.323314118\n0.359159558\n0.402304275\n0.41844092\n0.42714229\n0.443745455\n0.448471524\n0.439103196\n0.436284348\n0.426970064\n0.42052956\n0.424914223\n0.436961775\n0.444554247\n0.450831492\n0.450596291\n0.435616806\n0.408830463\n0.394360368\n0.377113134\n0.361416814\n0.3617896\n0.382517278\n0.421039617\n0.442721795\n0.449348302\n0.449275777\n0.445304887\n0.449202765\n0.441221483\n0.430640618\n0.432165216\n0.440542244\n0.445999352\n0.446808451\n0.446543616\n0.44707228\n0.44711255\n0.45102515\n0.438320416\n0.406090603\n0.388522549\n0.365506617\n0.343847066\n0.3341038\n0.340455833\n0.361681534\n0.40722551\n0.424045229\n0.424216608\n0.421893668\n0.437311113\n0.450066099\n0.449407528\n0.451168217\n0.44359667\n0.421723768\n0.406243147\n0.411544542\n0.412830954\n0.415544192\n0.420271902\n0.43475658\n0.444858212\n0.432436645\n0.402264856\n0.370807775\n0.35546445\n0.354205322\n0.356505141\n0.380815297\n0.416566095\n0.425723453\n0.434695236\n0.438053538\n0.435418935\n0.449491723\n0.455686841\n0.440626177\n0.428570416\n0.42880848\n0.422536682\n0.424944515\n0.435004974\n0.449825394\n0.445410813\n0.435755806\n0.439315198\n0.416796465\n0.40311396\n0.387457078\n0.373085264\n0.358263205\n0.357898199\n0.385651621\n0.420975113\n0.427368105\n0.436456296\n0.438229157\n0.448981582\n0.454469726\n0.447278041\n0.434319233\n0.43583551\n0.438397935\n0.442895221\n0.453601121\n0.449352838\n0.443942019\n0.441668448\n0.43699302\n0.43373683\n0.405854136\n0.367870302\n0.335339951\n0.327179874\n0.322757926\n0.326487638\n0.340386148\n0.369052327\n0.383228685\n0.392944685\n0.406022194\n0.425034838\n0.433771285\n0.431958215\n0.433471644\n0.436847411\n0.44286919\n0.445844783\n0.44642695\n0.443487949\n0.434753334\n0.43302868\n0.44216302\n0.430960807\n0.388222805\n0.34976918\n0.318954569\n0.304657751\n0.297050692\n0.296267388\n0.29276277\n0.30312996\n0.303699421\n0.309660711\n0.315287941\n0.328180432\n0.325741438\n0.326501581\n0.335228809\n0.323998818\n0.318625926\n0.314412752\n0.309522221\n0.309533142\n0.311965272\n0.313523492\n0.310148887\n0.305198344\n0.294937394\n0.285764672\n0.277940299\n0.269311765\n0.266020149\n0.251920229\n0.249978978\n0.258433521\n0.263042698\n0.27399746\n0.281664212\n0.281507677\n0.283059548\n0.294555886\n0.310908798\n0.314348075\n0.322882534\n0.333955322\n0.337246\n0.338690473\n0.340831932\n0.334698754\n0.347957767\n0.334065519\n0.307580515\n0.293820632\n0.275328419\n0.273160324\n0.270609339\n0.272175979\n0.285206286\n0.309983837\n0.321756519\n0.322956313\n0.318643694\n0.315306405\n0.328856537\n0.350738569\n0.365442907\n0.367275865\n0.371942039\n0.367775923\n0.380113433\n0.380063587\n0.373027562\n0.381736423\n0.395805705\n0.36671852\n0.327949696\n0.295600586\n0.275069072\n0.270129768\n0.268698432\n0.270103955\n0.286770046\n0.318218865\n0.343056362\n0.346534488\n0.348912058\n0.348344081\n0.353671449\n0.373142298\n0.396419637\n0.408450899\n0.40613043\n0.411186661\n0.41500849\n0.414819599\n0.420487256\n0.417195373\n0.426635212\n0.404237964\n0.350143657\n0.319178391\n0.297186643\n0.281309571\n0.282453269\n0.28474126\n0.299108238\n0.344028563\n0.363230693\n0.369178378\n0.360913278\n0.35859151\n0.358951882\n0.371701763\n0.379319123\n0.38721495\n0.383848765\n0.383283458\n0.381952911\n0.385078314\n0.393099548\n0.390051121\n0.396201486\n0.415581925\n0.375609032\n0.326820512\n0.300742777\n0.29064464\n0.282110422\n0.284295942\n0.29650719\n0.327602609\n0.329509015\n0.329532136\n0.329054819\n0.337632647\n0.364735517\n0.387587929\n0.404159596\n0.419078031\n0.41097517\n0.407013137\n0.405757022\n0.400023878\n0.398960263\n0.394879892\n0.387373981\n0.3549996\n0.31859025\n0.306085229\n0.289290064\n0.276488302\n0.275052594\n0.274209881\n0.285993944\n0.303346695\n0.299893227\n0.303583542\n0.304225097\n0.305094896\n0.328238785\n0.37596046\n0.409967985\n0.423386558\n0.415713892\n0.406124669\n0.393099169\n0.395603488\n0.414013973\n0.429829691\n0.428571924\n0.410251386\n0.35918008\n0.342824835\n0.324314484\n0.294146006\n0.27878034\n0.271887789\n0.271846014\n0.278208058\n0.281868699\n0.292259322\n0.302060695\n0.305681619\n0.341160633\n0.381457981\n0.409287116\n0.411868928\n0.402573597\n0.394408215\n0.387253317\n0.392869626\n0.409241395\n0.416419692\n0.41832674\n0.400838719\n0.354990059\n0.326421267\n0.291675859\n0.278005345\n0.273055236\n0.271383659\n0.276609438\n0.273248869\n0.278371024\n0.290197183\n0.319643386\n0.338191663\n0.361624294\n0.388873943\n0.415271126\n0.417272609\n0.411012413\n0.403817137\n0.398842025\n0.403362147\n0.416449552\n0.422818946\n0.426598313\n0.412907405\n0.37860159\n0.346400061\n0.309745857\n0.297867796\n0.291049753\n0.284148731\n0.290694939\n0.296304226\n0.297358039\n0.308586547\n0.327031699\n0.355578448\n0.363975901\n0.376514874\n0.390005181\n0.394924631\n0.394313712\n0.386033841\n0.387881151\n0.389777164\n0.406259266\n0.414711588\n0.424173541\n0.419702993\n0.400808213\n0.377746782\n0.3401916\n0.305948871\n0.292295834\n0.293875838\n0.316584699\n0.369713035\n0.394959832\n0.406107856\n0.417760397\n0.422553142\n0.419800298\n0.41375915\n0.401200201\n0.400964531\n0.404224106\n0.399131449\n0.400632703\n0.403617182\n0.410097924\n0.410288648\n0.418438191\n0.428841095\n0.422742351\n0.406300483\n0.377086086\n0.353079796\n0.334345057\n0.33309965\n0.361981744\n0.414093774\n0.426982602\n0.428846223\n0.428516707\n0.42549932\n0.423573087\n0.417374081\n0.415457113\n0.408101595\n0.399043047\n0.39822817\n0.391475887\n0.390110042\n0.398441735\n0.408037935\n0.406723535\n0.42627611\n0.415447527\n0.411019665\n0.397998501\n0.375144583\n0.361527548\n0.367205643\n0.37390869\n0.40773226\n0.427242175\n0.437889067\n0.443027735\n0.428216781\n0.409852987\n0.413348666\n0.408081973\n0.407544337\n0.408726228\n0.404898131\n0.40410606\n0.408425881\n0.414418654\n0.41900253\n0.431507699\n0.422604304\n0.41617464\n0.411892734\n0.406632874\n0.399591595\n0.393579976\n0.382358599\n0.396232096\n0.429510546\n0.439862022\n0.442834293\n0.448842126\n0.445691889\n0.442269539\n0.4435992\n0.42282748\n0.41575756\n0.411895338\n0.413018697\n0.415573289\n0.418114947\n0.435213603\n0.443891449\n0.443307685\n0.435787774\n0.404399473\n0.375617256\n0.351325665\n0.328354257\n0.29837597\n0.28472756\n0.285253596\n0.29907749\n0.311687786\n0.335134275\n0.358184889\n0.371128307\n0.385742469\n0.377859645\n0.378313749\n0.379564744\n0.369235989\n0.369489154\n0.37628309\n0.379247711\n0.381390752\n0.379644564\n0.384543206\n0.394606026\n0.373378309\n0.364905659\n0.35469653\n0.336629275\n0.3146464\n0.288036246\n0.2907436\n0.290380208\n0.292393489\n0.320493182\n0.353728805\n0.366628873\n0.385169184\n0.386639787\n0.401194788\n0.405079801\n0.389872298\n0.384070763\n0.383648562\n0.385998513\n0.385587952\n0.385142249\n0.389953672\n0.401445531\n0.387545404\n0.36437908\n0.35702635\n0.344457963\n0.332434682\n0.338743937\n0.352275054\n0.385142145\n0.401175597\n0.399479656\n0.404749268\n0.40775765\n0.413656124\n0.411011821\n0.392517949\n0.377813796\n0.382864911\n0.390973804\n0.388172499\n0.388201301\n0.395922495\n0.3947061\n0.402421774\n0.417480023\n0.410833213\n0.381978517\n0.367663459\n0.358618095\n0.33444459\n0.344746645\n0.358835215\n0.382582549\n0.391625318\n0.39444334\n0.396861265\n0.403128903\n0.408648122\n0.415778406\n0.410815075\n0.399264983\n0.388797723\n0.388547424\n0.386689389\n0.386506396\n0.398486566\n0.402584681\n0.412781978\n0.394905945\n0.387260776\n0.380100427\n0.359108159\n0.336803786\n0.314429773\n0.309887052\n0.337507844\n0.383493862\n0.386525239\n0.388077779\n0.391046009\n0.396315802\n0.397363107\n0.409236195\n0.406304244\n0.396717996\n0.391253304\n0.385304799\n0.384713336\n0.389529199\n0.396175527\n0.396054173\n0.395937247\n0.398476265\n0.404809119\n0.384492537\n0.373992264\n0.354525424\n0.333840429\n0.332586093\n0.353882502\n0.382488227\n0.381442812\n0.384327394\n0.392071056\n0.400670929\n0.406008487\n0.410026684\n0.396029738\n0.398190722\n0.396904666\n0.395320615\n0.393963836\n0.392516265\n0.399957839\n0.39296683\n0.392230521\n0.375738992\n0.37873599\n0.353110533\n0.341053959\n0.333676519\n0.329653309\n0.328361953\n0.338119651\n0.354410246\n0.352053942\n0.349563385\n0.353454964\n0.361661584\n0.369523036\n0.374307097\n0.36485913\n0.369937306\n0.366523401\n0.370606376\n0.373746589\n0.361947067\n0.361662895\n0.364334724\n0.370289978\n0.361033089\n0.349548645\n0.343223951\n0.331238556\n0.326557968\n0.315701064\n0.309341414\n0.311433641\n0.323442975\n0.339924839\n0.357508718\n0.363607712\n0.368296796\n0.362388176\n0.380575138\n0.384043063\n0.374987688\n0.368969683\n0.358378591\n0.358106909\n0.363563452\n0.358270868\n0.358461379\n0.377082824\n0.380998996\n0.362250073\n0.345674937\n0.319787974\n0.297813257\n0.290001069\n0.279013527\n0.276554326\n0.289737726\n0.294388425\n0.319216327\n0.348706456\n0.361582645\n0.367180662\n0.366551798\n0.370510367\n0.365429921\n0.361119093\n0.35618661\n0.358783129\n0.364171664\n0.368693808\n0.364493741\n0.370409329\n0.385572421\n0.367756414\n0.351160448\n0.321746728\n0.305493845\n0.297222026\n0.296489464\n0.321149383\n0.369536875\n0.373364203\n0.374258946\n0.377272207\n0.37731542\n0.38913079\n0.402384392\n0.396452093\n0.393513411\n0.399489536\n0.401493497\n0.404468665\n0.411945752\n0.406719449\n0.395843233\n0.394788875\n0.400355066\n0.374695221\n0.362989986\n0.349372164\n0.32461967\n0.306131895\n0.306091791\n0.335782443\n0.369060809\n0.367862481\n0.365677153\n0.372095928\n0.377396666\n0.385255292\n0.39578991\n0.393692808\n0.398316643\n0.397837161\n0.403772433\n0.406193118\n0.412588186\n0.411847089\n0.411244914\n0.414511523\n0.41690752\n0.393356417\n0.35998159\n0.322611253\n0.300065697\n0.291469718\n0.286716902\n0.295827481\n0.329464878\n0.339219715\n0.333251132\n0.327515301\n0.318463815\n0.324546085\n0.33365679\n0.339808358\n0.346672604\n0.344657886\n0.33436294\n0.332350478\n0.33402339\n0.338055181\n0.341656703\n0.349250228\n0.317777141\n0.292485069\n0.25571675\n0.238410505\n0.23365326\n0.22699173\n0.230594599\n0.243749732\n0.27188693\n0.264350652\n0.272343543\n0.26599995\n0.268253667\n0.278365553\n0.307220699\n0.331778273\n0.339708523\n0.341163302\n0.34543064\n0.356420821\n0.36631083\n0.364502025\n0.356522426\n0.352310407\n0.327481894\n0.281395611\n0.234279242\n0.210698047\n0.200730509\n0.199752067\n0.201163876\n0.21728323\n0.255959389\n0.275515332\n0.259129499\n0.250214548\n0.248538071\n0.249578105\n0.251798242\n0.274728286\n0.30613341\n0.323097478\n0.325352866\n0.331433211\n0.324043462\n0.326898929\n0.326061018\n0.321323952\n0.300250985\n0.26369192\n0.234606617\n0.220035552\n0.213326529\n0.213333685\n0.21338763\n0.217768734\n0.225066542\n0.231079517\n0.237873615\n0.242031538\n0.24857538\n0.265384275\n0.286200425\n0.306532213\n0.32213392\n0.316677561\n0.307323276\n0.313952105\n0.322370285\n0.328584442\n0.331241467\n0.345273233\n0.334360026\n0.308981657\n0.274636521\n0.241822152\n0.221499796\n0.217200475\n0.217085415\n0.217231183\n0.220671589\n0.226128\n0.240506812\n0.261439296\n0.276780992\n0.312327358\n0.337500365\n0.34934266\n0.343660229\n0.344783829\n0.35244595\n0.364862077\n0.374673021\n0.369700124\n0.365562739\n0.360215036\n0.343649084\n0.317001986\n0.286577316\n0.258153928\n0.243428706\n0.238369015\n0.244474818\n0.267342679\n0.313409946\n0.328126313\n0.327139646\n0.332450944\n0.347042846\n0.366564002\n0.37130684\n0.39441928\n0.398403881\n0.391121058\n0.388396292\n0.391720758\n0.404890205\n0.406678582\n0.411789206\n0.4182668\n0.38699415\n0.353167075\n0.337906332\n0.323698042\n0.308357459\n0.286714227\n0.286299759\n0.310737982\n0.36354661\n0.371571795\n0.370293317\n0.373425409\n0.377551049\n0.382851826\n0.402204635\n0.403243467\n0.39379155\n0.395170316\n0.39044445\n0.393289215\n0.399913341\n0.401246514\n0.417316774\n0.411210297\n0.387354997\n0.367292725\n0.339246077\n0.320541104\n0.287607516\n0.273856511\n0.274207366\n0.289268425\n0.328613481\n0.344200322\n0.344436614\n0.347097494\n0.35184104\n0.358437605\n0.373509537\n0.404385234\n0.394868618\n0.390991415\n0.386899101\n0.388489073\n0.39788395\n0.398028351\n0.399487325\n0.400803515\n0.409277731\n0.373744569\n0.335840495\n0.318498966\n0.304568943\n0.290641948\n0.293136429\n0.314563933\n0.370453929\n0.386924222\n0.396505319\n0.40034257\n0.397593923\n0.39525847\n0.398634927\n0.405895611\n0.400102681\n0.399671655\n0.393574376\n0.394798938\n0.404412162\n0.411907246\n0.413186081\n0.412610725\n0.416764725\n0.4109159\n0.383487279\n0.360303264\n0.327787089\n0.30896812\n0.310201459\n0.321132091\n0.376321523\n0.38978156\n0.391859006\n0.396133853\n0.399944601\n0.412247748\n0.407104432\n0.413896693\n0.404027833\n0.408601757\n0.402573639\n0.405918883\n0.411349244\n0.410650428\n0.407709384\n0.414702294\n0.420882623\n0.396620601\n0.383268424\n0.367530265\n0.350979875\n0.330880554\n0.314104966\n0.319644327\n0.343610599\n0.348487766\n0.367447813\n0.379902847\n0.38958125\n0.392419907\n0.404149307\n0.410143812\n0.400637276\n0.397574931\n0.396271553\n0.396701768\n0.403805093\n0.404701043\n0.400939339\n0.418919527\n0.414031359\n0.37483187\n0.353248435\n0.332726313\n0.301104939\n0.277313461\n0.267316717\n0.266667597\n0.282419355\n0.299289354\n0.314746946\n0.358150738\n0.383922582\n0.39594288\n0.399341833\n0.399968991\n0.396392485\n0.403512722\n0.399801949\n0.401168164\n0.408778899\n0.403802584\n0.404145934\n0.408891\n0.410556509\n0.411156609\n0.378549952\n0.375404751\n0.36987405\n0.359190795\n0.358177823\n0.384506236\n0.412303347\n0.415186881\n0.418935001\n0.421876704\n0.417572792\n0.419260208\n0.41477493\n0.405082394\n0.404903539\n0.397241477\n0.402359558\n0.405330144\n0.406727422\n0.414622897\n0.420958757\n0.427214759\n0.419407128\n0.390192047\n0.362016577\n0.345762305\n0.330431029\n0.315362293\n0.317721569\n0.348653635\n0.393046879\n0.400538368\n0.386076283\n0.390678081\n0.40600032\n0.414907041\n0.411455167\n0.406093635\n0.404388217\n0.398501773\n0.400796314\n0.404746512\n0.409930943\n0.40792023\n0.413550664\n0.434793148\n0.417112684\n0.394144027\n0.378691592\n0.358840911\n0.332213702\n0.320896753\n0.31619142\n0.346009173\n0.380570819\n0.391813139\n0.38047783\n0.385852994\n0.394755589\n0.398934571\n0.397696631\n0.395662027\n0.394847801\n0.393536985\n0.393242396\n0.404136215\n0.406437473\n0.413948984\n0.423775653\n0.424289131\n0.401399609\n0.380982743\n0.369321585\n0.361304219\n0.355946145\n0.343538995\n0.339052852\n0.353580459\n0.380461739\n0.387825197\n0.377175932\n0.384821024\n0.390463153\n0.417784659\n0.412759792\n0.409838029\n0.399644657\n0.399028192\n0.400942805\n0.401576356\n0.407748673\n0.409338653\n0.412024184\n0.395016786\n0.400130344\n0.372871555\n0.360566437\n0.350059482\n0.337405575\n0.323911359\n0.31604007\n0.332968174\n0.35897643\n0.360868829\n0.36078578\n0.36215547\n0.378105449\n0.395683435\n0.390810512\n0.389673707\n0.386241631\n0.391746344\n0.388043344\n0.393064669\n0.390883488\n0.386637789\n0.384603103\n0.374236414\n0.34602955\n0.332461212\n0.31250023\n0.290907563\n0.281415708\n0.272615252\n0.263385051\n0.259180108\n0.256242698\n0.248142524\n0.255220819\n0.254483158\n0.258929404\n0.264782618\n0.268559089\n0.265008174\n0.263183933\n0.263432845\n0.266986266\n0.276502214\n0.28034411\n0.280268185\n0.271753839\n0.262026925\n0.239271549\n0.214791241\n0.189546171\n0.183691517\n0.178823507\n0.178402226\n0.180078809\n0.186936635\n0.188990629\n0.196724943\n0.204407493\n0.208058467\n0.213690227\n0.219827618\n0.232275673\n0.238257439\n0.253255608\n0.257076608\n0.260439124\n0.249900378\n0.249217946\n0.247176957\n0.250334686\n0.257278595\n0.27074828\n0.253669236\n0.219163645\n0.206127983\n0.197201729\n0.195257128\n0.201580396\n0.231030937\n0.237575808\n0.260966613\n0.282317839\n0.285105397\n0.287358239\n0.30074463\n0.310987444\n0.315135778\n0.315901094\n0.309924333\n0.307250664\n0.312844342\n0.317520202\n0.314933296\n0.322569172\n0.325964557\n0.318178278\n0.297028053\n0.280015294\n0.269081081\n0.256001661\n0.252879183\n0.254689263\n0.271243776\n0.286782055\n0.291043356\n0.297301682\n0.296913476\n0.295492927\n0.30699415\n0.314888349\n0.316549895\n0.32107283\n0.326589758\n0.324266606\n0.327470354\n0.329804339\n0.314601983\n0.319854557\n0.327483938\n0.307565195\n0.27828698\n0.249149204\n0.22713287\n0.222268998\n0.21517433\n0.220694748\n0.257952961\n0.290083291\n0.298542776\n0.290144818\n0.299539336\n0.293371916\n0.288321276\n0.289010828\n0.300088087\n0.305661248\n0.312182813\n0.313933396\n0.306669787\n0.304255246\n0.3030311\n0.306435811\n0.306446235\n0.293595108\n0.258185219\n0.224285556\n0.194780372\n0.179693499\n0.176502789\n0.179862468\n0.207076274\n0.247034356\n0.25797764\n0.261160124\n0.260648029\n0.254991303\n0.250758864\n0.250220421\n0.255340044\n0.265544553\n0.259862919\n0.254105043\n0.258289586\n0.256646057\n0.248329148\n0.255565858\n0.246362252\n0.234927007\n0.207997566\n0.176515728\n0.163918146\n0.160410705\n0.153889907\n0.167446169\n0.184202345\n0.21006886\n0.213916206\n0.225744976\n0.225520727\n0.219305911\n0.211016364\n0.214466709\n0.224453669\n0.240220419\n0.244691527\n0.238114463\n0.242101746\n0.250922364\n0.244280079\n0.243416146\n0.242432572\n0.237925055\n0.222640017\n0.197999457\n0.171927827\n0.151026799\n0.144199012\n0.144865423\n0.149965366\n0.16511891\n0.170896826\n0.202318679\n0.199920169\n0.19998839\n0.20150166\n0.201443641\n0.213990147\n0.218426251\n0.221115303\n0.224419094\n0.219690331\n0.224340139\n0.224915146\n0.228308515\n0.242370118\n0.240839394\n0.216636257\n0.192094061\n0.174065402\n0.16399626\n0.156528045\n0.154704795\n0.163478306\n0.168642511\n0.167601282\n0.204408763\n0.219075987\n0.222566222\n0.224114054\n0.226639371\n0.219567959\n0.219163816\n0.220902034\n0.216351955\n0.206951248\n0.205745525\n0.205965378\n0.210165944\n0.225686683\n0.226729071\n0.216367379\n0.20164191\n0.190894758\n0.180406873\n0.182278378\n0.19602755\n0.227448491\n0.244491949\n0.244150428\n0.250228312\n0.263067435\n0.26029068\n0.26093128\n0.262509753\n0.26346273\n0.259897797\n0.256189319\n0.265958407\n0.269249679\n0.274525902\n0.274063222\n0.269048971\n0.270491039\n0.234845679\n0.217419469\n0.208608531\n0.197166519\n0.178485096\n0.168928541\n0.171540719\n0.202945788\n0.235951779\n0.232970768\n0.241432452\n0.229914916\n0.224624121\n0.22344773\n0.22444692\n0.230845662\n0.23583247\n0.236321972\n0.22969319\n0.226285247\n0.22692464\n0.229317743\n0.231464253\n0.220117615\n0.205654547\n0.20758045\n0.197903544\n0.180581585\n0.174121822\n0.168885188\n0.173982484\n0.196430665\n0.232670099\n0.22590227\n0.221988296\n0.221670765\n0.222400319\n0.233336811\n0.233958112\n0.232899644\n0.239600198\n0.243456319\n0.24094628\n0.239741691\n0.239531078\n0.234709151\n0.242268087\n0.236992319\n0.226370224\n0.198712955\n0.183527051\n0.167063473\n0.157684747\n0.160861327\n0.17775116\n0.21954167\n0.2491576\n0.24614985\n0.252867302\n0.238823337\n0.208532937\n0.208904502\n0.214364842\n0.207717661\n0.211515542\n0.217248462\n0.233091828\n0.244995743\n0.260493687\n0.253003503\n0.255296719\n0.254481809\n0.235300178\n0.208078621\n0.195453185\n0.190960549\n0.191293312\n0.191256691\n0.198431373\n0.216043871\n0.226780734\n0.236222888\n0.23941074\n0.227211897\n0.205170828\n0.194272192\n0.19231936\n0.191660018\n0.187083751\n0.197744355\n0.208432065\n0.233049615\n0.233239959\n0.240366745\n0.241203909\n0.240987512\n0.239986372\n0.216424937\n0.203924338\n0.186978358\n0.176690346\n0.175349829\n0.183417204\n0.189242723\n0.211251549\n0.219636343\n0.231559892\n0.231314782\n0.234846707\n0.237078417\n0.234700905\n0.240157517\n0.228157535\n0.241781546\n0.253499898\n0.258844068\n0.258661318\n0.247077948\n0.247049265\n0.245638141\n0.237782099\n0.214702133\n0.189674469\n0.172817229\n0.16036372\n0.160753345\n0.163148186\n0.173909027\n0.205661871\n0.218315753\n0.231519314\n0.245411606\n0.248399553\n0.244228393\n0.251519078\n0.250891069\n0.244223926\n0.244653506\n0.254748085\n0.26848343\n0.273850913\n0.267923775\n0.281722326\n0.279542811\n0.262590097\n0.222179506\n0.191120306\n0.175067233\n0.165626633\n0.166378175\n0.179184816\n0.22065925\n0.266114175\n0.291775275\n0.301097982\n0.290602779\n0.276982092\n0.268148634\n0.262106501\n0.268714582\n0.283403514\n0.288393646\n0.296610567\n0.296061666\n0.289920245\n0.289254904\n0.296018871\n0.298661883\n0.293185178\n0.265818197\n0.23637397\n0.22511128\n0.212004838\n0.207417316\n0.212235747\n0.240189152\n0.275798119\n0.286033612\n0.305000288\n0.306839063\n0.310020567\n0.308656221\n0.310077417\n0.310420875\n0.309808527\n0.310549548\n0.303065918\n0.29441012\n0.288511586\n0.293335786\n0.291090759\n0.294987091\n0.27987231\n0.275076601\n0.233319179\n0.207246034\n0.208086972\n0.204780671\n0.212032881\n0.240808778\n0.264292701\n0.268259447\n0.283307694\n0.264077941\n0.250965866\n0.236302492\n0.232770642\n0.233640841\n0.239896013\n0.257222858\n0.268223621\n0.27112836\n0.257406153\n0.254934307\n0.265359245\n0.272031223\n0.279542797\n0.259891506\n0.242539216\n0.220846874\n0.215381823\n0.217543766\n0.239009548\n0.267243669\n0.283790205\n0.287930056\n0.30205689\n0.282024373\n0.272699138\n0.264536468\n0.259397476\n0.260258058\n0.263630991\n0.2745828\n0.286690951\n0.301865052\n0.297665237\n0.285395386\n0.292007691\n0.293710575\n0.296075172\n0.267127242\n0.255030719\n0.238854878\n0.225414421\n0.226627553\n0.236095025\n0.256595619\n0.283948468\n0.278044362\n0.289874797\n0.297983654\n0.282961406\n0.273875922\n0.269215112\n0.282951028\n0.281965041\n0.2900384\n0.284747683\n0.285354416\n0.27914267\n0.278136756\n0.280415494\n0.287981351\n0.290702585\n0.279509277\n0.26595484\n0.246972964\n0.243311868\n0.236210919\n0.237291482\n0.242674578\n0.25815371\n0.275898845\n0.288323067\n0.273446639\n0.266030555\n0.267682006\n0.27219317\n0.283343439\n0.291283035\n0.292075501\n0.290103127\n0.294726682\n0.285122212\n0.282238274\n0.28359798\n0.28432897\n0.28618329\n0.280972872\n0.285526603\n0.27294608\n0.272405405\n0.269303119\n0.269418998\n0.270575532\n0.281837628\n0.295307448\n0.303281428\n0.30887129\n0.30366269\n0.306356638\n0.30413782\n0.298125924\n0.295515623\n0.291104216\n0.27982821\n0.280828573\n0.281672551\n0.279077832\n0.278196858\n0.27978308\n0.296517644\n0.279428011\n0.269575997\n0.24795892\n0.239955194\n0.232396015\n0.234695511\n0.254691274\n0.287241742\n0.304389941\n0.294584629\n0.286946365\n0.280182481\n0.28084516\n0.28812564\n0.310807054\n0.312993962\n0.312613418\n0.312404702\n0.29659141\n0.301934558\n0.301760415\n0.301032705\n0.290316501\n0.308781254\n0.301798051\n0.278967405\n0.246130628\n0.220503494\n0.216362772\n0.23223233\n0.249729259\n0.295476613\n0.298917141\n0.306410529\n0.303085075\n0.296124407\n0.299671318\n0.302701575\n0.305546871\n0.308467611\n0.311172433\n0.3180919\n0.31823135\n0.305001501\n0.303077627\n0.316427948\n0.325328784\n0.29771627\n0.292689052\n0.306011981\n0.305829815\n0.305123168\n0.301268103\n0.306300351\n0.295401072\n0.298253767\n0.282931917\n0.292619615\n0.29749548\n0.310376619\n0.325476687\n0.335909703\n0.336180571\n0.335411457\n0.336256269\n0.332273891\n0.3331895\n0.325723757\n0.32139893\n0.32706732\n0.332834615\n0.316908288\n0.304259371\n0.316804347\n0.308724545\n0.306500197\n0.305545947\n0.308632161\n0.298271392\n0.311490172\n0.313208858\n0.326724356\n0.317271101\n0.316792844\n0.326607251\n0.329293126\n0.324390118\n0.32018265\n0.313761093\n0.309172423\n0.306065828\n0.309957529\n0.312931318\n0.323168258\n0.323086448\n0.311435486\n0.287123859\n0.286639498\n0.272871196\n0.272190729\n0.268252302\n0.27542384\n0.271437628\n0.295992094\n0.2912077\n0.291680841\n0.310748409\n0.300564656\n0.286477441\n0.27265163\n0.247850979\n0.232884219\n0.228820894\n0.248517042\n0.254894366\n0.315419021\n0.298244772\n0.306186666\n0.312753582\n0.314219595\n0.287482195\n0.300412162\n0.295286212\n0.299002389\n0.303707328\n0.307584282\n0.301342492\n0.292900465\n0.290643711\n0.286969268\n0.298916649\n0.308104999\n0.291603036\n0.281916992\n0.258465652\n0.245424507\n0.248917133\n0.276294353\n0.313156143\n0.310492006\n0.304339215\n0.304996931\n0.306057502\n0.311213102\n0.303117101\n0.309599803\n0.291954557\n0.295263317\n0.296846224\n0.307643525\n0.293798445\n0.313668735\n0.30475143\n0.301390535\n0.309182897\n0.297037295\n0.277482707\n0.26153823\n0.260974125\n0.247959223\n0.255048828\n0.284734967\n0.313934008\n0.303528268\n0.2924158\n0.294219086\n0.299771865\n0.309619768\n0.314120527\n0.330514037\n0.330461805\n0.330203373\n0.3282031\n0.343885155\n0.346023758\n0.347662762\n0.335445897\n0.336099103\n0.343624576\n0.3403443\n0.330622367\n0.329217156\n0.327195408\n0.336032341\n0.34196037\n0.349550441\n0.362819996\n0.358364202\n0.354522836\n0.358932548\n0.362159565\n0.367339139\n0.345925137\n0.340031184\n0.32764084\n0.316358128\n0.312477505\n0.321298377\n0.327104084\n0.334436821\n0.372412631\n0.363041248\n0.352733731\n0.340065039\n0.333115904\n0.327417019\n0.318602227\n0.327313572\n0.339635315\n0.334888668\n0.339804294\n0.333486615\n0.326765145\n0.334019665\n0.339230673\n0.339599388\n0.338467339\n0.3294884\n0.311833427\n0.295168528\n0.294294388\n0.308807551\n0.317990785\n0.305190734\n0.320312797\n0.314220742\n0.32128733\n0.312249167\n0.306554147\n0.308831952\n0.305583595\n0.307661533\n0.316640665\n0.320806646\n0.33025038\n0.327577708\n0.313611622\n0.318796608\n0.326828471\n0.33524018\n0.333747671\n0.31986525\n0.324486904\n0.327879144\n0.330031815\n0.333473494\n0.334356291\n0.326685986\n0.326979313\n0.32090554\n0.329182875\n0.334192106\n0.320792512\n0.302908874\n0.305621819\n0.318514241\n0.337582828\n0.343120854\n0.342338027\n0.318455765\n0.312016322\n0.322882084\n0.34084033\n0.345967225\n0.338113987\n0.316462909\n0.30633015\n0.289818082\n0.279210404\n0.277153893\n0.292966729\n0.308329118\n0.350266453\n0.348410293\n0.335099848\n0.333841773\n0.325915487\n0.321294443\n0.312973286\n0.297376227\n0.318302075\n0.356216462\n0.367005093\n0.358756369\n0.352638052\n0.352883006\n0.372565073\n0.3837306\n0.391239936\n0.394819909\n0.396427332\n0.394852102\n0.394659028\n0.392219643\n0.39255158\n0.388671974\n0.376328066\n0.369069944\n0.377136403\n0.381364412\n0.368054273\n0.376123811\n0.373136207\n0.374495928\n0.36895659\n0.38683309\n0.388677329\n0.384574548\n0.368335745\n0.3625346\n0.359633598\n0.360612601\n0.365977397\n0.374556403\n0.378474642\n0.378576153\n0.377492204\n0.375046302\n0.374666555\n0.364967444\n0.353908701\n0.354276991\n0.360193852\n0.379811744\n0.391056209\n0.380198985\n0.351419785\n0.330408331\n0.347211537\n0.377326774\n0.392148904\n0.39254008\n0.381540977\n0.389347161\n0.399154164\n0.401094247\n0.362350059\n0.367679483\n0.371812269\n0.372204121\n0.373399188\n0.374244061\n0.372000302\n0.361210002\n0.374342379\n0.365710059\n0.372528795\n0.38479393\n0.380080082\n0.376950676\n0.379113494\n0.371634577\n0.383105196\n0.398589815\n0.401000785\n0.409997279\n0.393077741\n0.393360568\n0.410661656\n0.41779232\n0.374731818\n0.367213229\n0.377040313\n0.377154129\n0.371649555\n0.367371935\n0.361997858\n0.375282266\n0.427304934\n0.416829967\n0.419778437\n0.428349359\n0.42155455\n0.422580063\n0.424315069\n0.422716191\n0.425896013\n0.43769643\n0.445941521\n0.428588165\n0.411490379\n0.407928438\n0.410255225\n0.418178393\n0.408255814\n0.425969604\n0.440269367\n0.443167614\n0.446354043\n0.448937736\n0.437313147\n0.430030911\n0.417360978\n0.416923655\n0.410592615\n0.415209722\n0.42610853\n0.443629161\n0.439397803\n0.420226345\n0.41559895\n0.443635947\n0.439165898\n0.427858526\n0.415821557\n0.411999668\n0.415852048\n0.413899835\n0.429267662\n0.439736364\n0.461385627\n0.464781527\n0.465090605\n0.464164917\n0.454818603\n0.439587367\n0.428341382\n0.423989244\n0.423302968\n0.426920664\n0.441251382\n0.449197487\n0.445168745\n0.451717822\n0.455175319\n0.45611222\n0.449823906\n0.450297619\n0.432036479\n0.424523057\n0.430796398\n0.447421285\n0.417579908\n0.420082392\n0.427401303\n0.411995965\n0.409352007\n0.411124296\n0.408598023\n0.411816394\n0.39981748\n0.395604906\n0.401751631\n0.398204338\n0.390808935\n0.385651705\n0.377935656\n0.380820286\n0.391919062\n0.389261634\n0.382227663\n0.358110974\n0.354252058\n0.358826851\n0.373132356\n0.380391817\n0.374475049\n0.379045591\n0.375257418\n0.370949025\n0.369835765\n0.370797755\n0.372543151\n0.379393711\n0.375423002\n0.369616942\n0.381091423\n0.382131925\n0.377139482\n0.372542531\n0.361952553\n0.368441649\n0.379972434\n0.381404175\n0.376189891\n0.364683476\n0.35920221\n0.359952874\n0.366862249\n0.372089089\n0.377862873\n0.380716367\n0.378092842\n0.375461856\n0.373916776\n0.374776759\n0.370768768\n0.379701164\n0.376006712\n0.367100955\n0.359828751\n0.366676127\n0.347553606\n0.348570324\n0.341228334\n0.357059023\n0.361872385\n0.363991242\n0.360380593\n0.36211224\n0.349906563\n0.353489285\n0.364403171\n0.361735681\n0.361761993\n0.363118593\n0.361978033\n0.358366463\n0.362684117\n0.362577519\n0.36576831\n0.377613462\n0.3353783\n0.321592742\n0.32699506\n0.332832269\n0.337645092\n0.343382936\n0.351829841\n0.372780103\n0.378579811\n0.375621562\n0.371978557\n0.353279784\n0.348125404\n0.350494062\n0.358495737\n0.369883692\n0.379267612\n0.360508254\n0.367513582\n0.361594932\n0.366059871\n0.366716283\n0.372844858\n0.374713061\n0.338163987\n0.336840717\n0.34867192\n0.359541225\n0.372830904\n0.368291874\n0.365525941\n0.350056503\n0.360712484\n0.362810206\n0.362184676\n0.379373106\n0.360654223\n0.357273059\n0.360565518\n0.37473538\n0.375759934\n0.370310128\n0.366741798\n0.363334108\n0.364860393\n0.364516774\n0.373077677\n0.378723634\n0.333011851\n0.32449693\n0.323542973\n0.344572863\n0.347468222\n0.328364102\n0.310789068\n0.309685759\n0.317848309\n0.330722049\n0.335754687\n0.321441302\n0.307620836\n0.308950854\n0.308591908\n0.335503504\n0.370404806\n0.3741352\n0.373512327\n0.370420401\n0.368585223\n0.368532094\n0.382369021\n0.360203241\n0.349394484\n0.341026971\n0.348522267\n0.377439878\n0.377315513\n0.352883492\n0.34893433\n0.371496301\n0.381253155\n0.394346433\n0.401004539\n0.388462181\n0.378157916\n0.381541929\n0.388445799\n0.393087874\n0.382892662\n0.364873386\n0.351962693\n0.332448945\n0.326962655\n0.324873732\n0.334088611\n0.34604338\n0.308012297\n0.299578727\n0.31092014\n0.320085843\n0.327280803\n0.330613831\n0.325586258\n0.315053523\n0.301565254\n0.310175548\n0.338652746\n0.338893662\n0.34469746\n0.351573164\n0.354763051\n0.355428547\n0.340003416\n0.314956799\n0.307982935\n0.290951228\n0.279582973\n0.270360994\n0.247346497\n0.262026084\n0.260787762\n0.273221807\n0.304144515\n0.327089847\n0.349247269\n0.355200762\n0.353240167\n0.348360284\n0.342565835\n0.339369487\n0.339247841\n0.335884527\n0.343985176\n0.34397659\n0.347420299\n0.33161575\n0.300668189\n0.285840562\n0.268612016\n0.260417648\n0.25787635\n0.263696956\n0.258264009\n0.255168756\n0.297946657\n0.319270841\n0.315536914\n0.280194981\n0.268528958\n0.264147008\n0.254559076\n0.252086102\n0.25569735\n0.261105629\n0.298766863\n0.323720212\n0.3288382\n0.333332231\n0.336593686\n0.347460103\n0.358271381\n0.361591322\n0.361005498\n0.360560574\n0.364393288\n0.357309773\n0.349067873\n0.348626233\n0.332818792\n0.315653141\n0.326724265\n0.33870969\n0.340496832\n0.298648078\n0.282534001\n0.271000658\n0.268767285\n0.285576832\n0.319035899\n0.321616544\n0.316752264\n0.316539966\n0.315411162\n0.316932992\n0.324821026\n0.336819525\n0.340497755\n0.342130183\n0.34557364\n0.349977148\n0.347364141\n0.346248688\n0.329127723\n0.326996136\n0.324719968\n0.319185392\n0.316187357\n0.278641206\n0.274711251\n0.284177169\n0.290656263\n0.304756244\n0.321027296\n0.316968322\n0.314332944\n0.322461187\n0.329407222\n0.334547321\n0.330687642\n0.313566936\n0.302015306\n0.288634707\n0.279710396\n0.270976823\n0.265552661\n0.277081367\n0.311745772\n0.31027132\n0.313709439\n0.321957088\n0.321017047\n0.322334363\n0.322990282\n0.329027745\n0.324233731\n0.316321307\n0.324234231\n0.3272965\n0.31988436\n0.309955154\n0.304071954\n0.302648028\n0.295233151\n0.256997989\n0.239958294\n0.228294465\n0.225552133\n0.224571724\n0.2286413\n0.246285445\n0.25355349\n0.247144684\n0.256113851\n0.258563638\n0.238441214\n0.232150964\n0.21964593\n0.216131454\n0.221165553\n0.223635176\n0.230138103\n0.236724548\n0.250698376\n0.257641288\n0.269984833\n0.273962744\n0.272134657\n0.243208651\n0.234777074\n0.232622771\n0.234524467\n0.227417756\n0.245807325\n0.259396895\n0.267078961\n0.265223386\n0.272639898\n0.262653058\n0.239322635\n0.225007754\n0.217933903\n0.213852142\n0.214176787\n0.227785227\n0.246693162\n0.270030737\n0.283064671\n0.28886158\n0.290353034\n0.280706979\n0.274656509\n0.254032361\n0.241740576\n0.227636437\n0.214520557\n0.212534121\n0.217741562\n0.21712565\n0.20716186\n0.212658258\n0.239280482\n0.244244498\n0.248706783\n0.247875633\n0.244052925\n0.246199016\n0.247191502\n0.251913573\n0.263135119\n0.266574936\n0.272030492\n0.274902885\n0.273654126\n0.273989153\n0.263637391\n0.250722589\n0.237830321\n0.235823289\n0.227664192\n0.221287024\n0.224515538\n0.219076741\n0.183512041\n0.251925799\n0.266816463\n0.271741395\n0.279691628\n0.284675707\n0.282204182\n0.263158486\n0.254640622\n0.24786123\n0.260185719\n0.254094658\n0.25668135\n0.258235479\n0.258465833\n0.267252596\n0.276543114\n0.271950498\n0.248377488\n0.238583778\n0.238910058\n0.240320044\n0.259567657\n0.285336988\n0.272733363\n0.277595565\n0.286289796\n0.295933587\n0.305931532\n0.305041922\n0.29501912\n0.28520972\n0.279828146\n0.284523543\n0.271986143\n0.284992501\n0.306769603\n0.30814212\n0.307297782\n0.299578098\n0.295711957\n0.314422848\n0.327920622\n0.327459779\n0.328854284\n0.332770661\n0.339951995\n0.339283116\n0.305405363\n0.290642273\n0.310238793\n0.325683646\n0.302692919\n0.29075752\n0.279538692\n0.271897774\n0.258019113\n0.261573764\n0.292675571\n0.275952291\n0.280303485\n0.286769191\n0.297971651\n0.312656251\n0.31182005\n0.277910777\n0.268497736\n0.265884889\n0.270879682\n0.278795297\n0.288244929\n0.306125395\n0.301846712\n0.299568597\n0.321504412\n0.296288203\n0.269984441\n0.250863274\n0.243182603\n0.235610445\n0.238938944\n0.252454896\n0.283375306\n0.297567483\n0.310045086\n0.317325533\n0.313122505\n0.328235878\n0.336566603\n0.319472193\n0.293790389\n0.288296269\n0.283390744\n0.279673353\n0.310766537\n0.32675072\n0.315996977\n0.320337626\n0.3427894\n0.321679445\n0.271391447\n0.259477176\n0.253706892\n0.247851584\n0.242239549\n0.239460097\n0.274261658\n0.300380942\n0.321554356\n0.33670144\n0.334813325\n0.336107529\n0.340478758\n0.330402724\n0.32784745\n0.333281099\n0.327318545\n0.321550354\n0.31575816\n0.309781419\n0.321632708\n0.315304505\n0.302993559\n0.306127169\n0.312609017\n0.329498556\n0.332586378\n0.325327757\n0.325129278\n0.334991292\n0.347682342\n0.368236937\n0.363048593\n0.352047478\n0.34073305\n0.334898537\n0.327823761\n0.31726175\n0.306422477\n0.300164209\n0.291273311\n0.28866022\n0.30485026\n0.30820527\n0.34421482\n0.33474482\n0.336182126\n0.293926338\n0.285456582\n0.262160919\n0.222378998\n0.216077483\n0.208599687\n0.217848919\n0.233765486\n0.23508438\n0.232473348\n0.244679925\n0.247200854\n0.247918006\n0.246924641\n0.247788747\n0.241006738\n0.238030941\n0.229496538\n0.221777095\n0.256168176\n0.239436941\n0.222597719\n0.219292697\n0.23440861\n0.254601768\n0.248934081\n0.248064967\n0.239346308\n0.24137201\n0.244012617\n0.250918747\n0.258865859\n0.260451962\n0.255500173\n0.268303293\n0.279813623\n0.295138252\n0.291482144\n0.262919121\n0.251605043\n0.245382874\n0.23764744\n0.239067221\n0.267526906\n0.285030523\n0.315668511\n0.305825105\n0.303817441\n0.307548621\n0.314654021\n0.322217819\n0.313424336\n0.305647838\n0.302380468\n0.31112096\n0.315858124\n0.303208201\n0.301961202\n0.305804467\n0.315659824\n0.320589078\n0.29644493\n0.249265049\n0.238167978\n0.230691957\n0.224316206\n0.224661729\n0.234760873\n0.238516986\n0.279033283\n0.303266836\n0.292474174\n0.285656819\n0.277026192\n0.27027286\n0.266105193\n0.264944553\n0.267265814\n0.279159414\n0.301701845\n0.318087878\n0.321778994\n0.310912015\n0.318658925\n0.307968604\n0.262810942\n0.256786915\n0.250260787\n0.241478577\n0.236125746\n0.238345189\n0.241705434\n0.266034291\n0.332524283\n0.331855763\n0.344332144\n0.340553343\n0.30908772\n0.296252876\n0.296061849\n0.300256541\n0.310154301\n0.325024993\n0.354827445\n0.379033474\n0.380908982\n0.380112155\n0.379082066\n0.380720267\n0.386615936\n0.392163483\n0.399386867\n0.398375267\n0.39302649\n0.395319032\n0.389449005\n0.390649578\n0.372659015\n0.371583214\n0.374214163\n0.369286151\n0.352560327\n0.334453813\n0.314673208\n0.301401843\n0.308605744\n0.327875413\n0.357423821\n0.355965083\n0.350148788\n0.348554139\n0.341701804\n0.338798591\n0.351876096\n0.35657309\n0.323598383\n0.313515342\n0.310405773\n0.313462837\n0.313280343\n0.346476283\n0.340478992\n0.343436219\n0.347941875\n0.356186601\n0.362401105\n0.354396516\n0.350554196\n0.347226002\n0.349075465\n0.346763097\n0.352066517\n0.344485546\n0.339440509\n0.327131249\n0.328359953\n0.330104456\n0.323808964\n0.302967028\n0.2831583\n0.280910892\n0.26772444\n0.25771654\n0.255487773\n0.261592033\n0.25746899\n0.276575942\n0.288498734\n0.297832378\n0.288134222\n0.266553198\n0.257064569\n0.239346115\n0.239170987\n0.253720028\n0.268934016\n0.272543765\n0.285413562\n0.285726126\n0.285479704\n0.28443982\n0.287845107\n0.279838021\n0.268379862\n0.263282891\n0.262368707\n0.274422279\n0.289064405\n0.294060542\n0.299401043\n0.29593975\n0.300753075\n0.301049314\n0.260859166\n0.232997852\n0.215500789\n0.202997171\n0.205439367\n0.224962341\n0.258075409\n0.290046858\n0.296412397\n0.307466164\n0.308548063\n0.301357485\n0.294692429\n0.27413051\n0.258461409\n0.243796296\n0.240857603\n0.240496423\n0.245913571\n0.27060869\n0.271545289\n0.28414801\n0.278277872\n0.283978558\n0.263726865\n0.241120113\n0.233515752\n0.232070927\n0.235767493\n0.253917386\n0.274174218\n0.271179458\n0.286032466\n0.287694377\n0.281359058\n0.262643169\n0.245407793\n0.239008106\n0.223765882\n0.219016644\n0.215636346\n0.215713958\n0.219364126\n0.239248302\n0.230458988\n0.246500225\n0.253388014\n0.280558818\n0.284828554\n0.281949366\n0.273077479\n0.279668517\n0.278677247\n0.274229149\n0.283219727\n0.295389104\n0.295782703\n0.294698216\n0.294591251\n0.288804113\n0.279733144\n0.26537377\n0.260707308\n0.258016927\n0.259892644\n0.269625926\n0.279638535\n0.329847127\n0.319984896\n0.314297672\n0.328775952\n0.332705585\n0.308304693\n0.307364756\n0.298893654\n0.287661868\n0.291351862\n0.302517704\n0.334802087\n0.334575848\n0.326337943\n0.327298842\n0.324910678\n0.331392446\n0.344298684\n0.351208559\n0.34123668\n0.343642332\n0.346334166\n0.34939453\n0.345783361\n0.350528793\n0.33573408\n0.328814435\n0.344508237\n0.354248571\n0.331015023\n0.310882615\n0.297193545\n0.295917372\n0.302868021\n0.309538092\n0.329780262\n0.331302173\n0.322269464\n0.320699711\n0.321611845\n0.322285421\n0.324144543\n0.324730088\n0.332397289\n0.332325923\n0.327529328\n0.320894597\n0.321188785\n0.332240851\n0.330970146\n0.331917009\n0.330531211\n0.340177728\n0.330073682\n0.299506911\n0.282855163\n0.260920537\n0.253711538\n0.270706781\n0.298673129\n0.322692151\n0.319919415\n0.32151493\n0.318615079\n0.317034407\n0.328367606\n0.331497392\n0.331573528\n0.331072158\n0.330515664\n0.330747051\n0.330628467\n0.332481286\n0.339984651\n0.331528673\n0.322287005\n0.320994746\n0.324820415\n0.317936327\n0.28440316\n0.254402857\n0.244212863\n0.274479998\n0.282048835\n0.304269\n0.31795202\n0.321165285\n0.321247885\n0.319896018\n0.313940118\n0.310988826\n0.317693431\n0.322664707\n0.320735876\n0.321273239\n0.32384127\n0.325935035\n0.320398678\n0.3147844\n0.318541092\n0.321990719\n0.331161861\n0.319705641\n0.314890324\n0.308276046\n0.30761032\n0.319661602\n0.316547664\n0.325848966\n0.331986675\n0.327231495\n0.323600955\n0.315027659\n0.304217087\n0.289444255\n0.272078895\n0.248031762\n0.237596596\n0.237996189\n0.255999247\n0.274083737\n0.279786103\n0.290637472\n0.284819418\n0.277271958\n0.267138512\n0.262142585\n0.26338375\n0.264466455\n0.271483451\n0.276669575\n0.278886142\n0.281899219\n0.279912866\n0.272705342\n0.259543164\n0.24831974\n0.232046466\n0.20877191\n0.187621834\n0.185538384\n0.181644156\n0.184135659\n0.18990649\n0.180253964\n0.2135037\n0.222954666\n0.219878801\n0.208862328\n0.185165893\n0.158510973\n0.150914851\n0.145478636\n0.165255401\n0.185067453\n0.198960411\n0.197591732\n0.198322805\n0.195743159\n0.204709705\n0.206802829\n0.208927181\n0.208742772\n0.206527452\n0.203950895\n0.205200654\n0.210295874\n0.227892147\n0.23494335\n0.22597848\n0.207271406\n0.212224836\n0.209207702\n0.208116983\n0.186350051\n0.148840517\n0.139058506\n0.153904763\n0.175417775\n0.18690018\n0.204134183\n0.208406335\n0.210391118\n0.216597045\n0.216947547\n0.216721932\n0.205453849\n0.207916935\n0.202906037\n0.206000692\n0.21757236\n0.234710734\n0.240955419\n0.24410334\n0.239431043\n0.241844443\n0.25669785\n0.234103188\n0.199212044\n0.170170526\n0.164389442\n0.174997487\n0.196173856\n0.198043791\n0.195932846\n0.197340287\n0.200248796\n0.201009885\n0.201180323\n0.194394528\n0.203858555\n0.190394188\n0.188635577\n0.188672306\n0.190126817\n0.193512886\n0.203997621\n0.208949955\n0.205709617\n0.200608107\n0.194039091\n0.192784598\n0.183360398\n0.174502643\n0.175899042\n0.178362252\n0.186365828\n0.18784799\n0.199169757\n0.20761674\n0.211737176\n0.209309843\n0.210483797\n0.194534812\n0.182905022\n0.172987955\n0.167213693\n0.162795115\n0.164312156\n0.170806657\n0.160897551\n0.191344313\n0.188333393\n0.187766685\n0.185367798\n0.170595211\n0.166980588\n0.159198971\n0.158553514\n0.159263234\n0.168946735\n0.173587219\n0.170881829\n0.171606891\n0.174513354\n0.17973236\n0.183388616\n0.178675089\n0.175955655\n0.161791967\n0.151874599\n0.144550503\n0.142904194\n0.147814213\n0.149860944\n0.161477738\n0.152756053\n0.173431778\n0.17784254\n0.176735973\n0.176391748\n0.178422289\n0.18012153\n0.179890334\n0.17676021\n0.174847228\n0.17372262\n0.167283522\n0.167027635\n0.171717142\n0.179546163\n0.180498829\n0.164142916\n0.152902986\n0.138159848\n0.130915702\n0.129717519\n0.140455397\n0.159397079\n0.177616207\n0.171300964\n0.168886707\n0.17276085\n0.173686624\n0.173666575\n0.184079593\n0.181293541\n0.177782445\n0.178215058\n0.204155324\n0.197887349\n0.205030071\n0.203420193\n0.188179596\n0.185546138\n0.187023636\n0.179963304\n0.16839123\n0.159170057\n0.158163118\n0.160397664\n0.169656774\n0.199519741\n0.207688718\n0.226900964\n0.229193731\n0.216984257\n0.183102725\n0.178680434\n0.184230342\n0.17035081\n0.169291369\n0.174085011\n0.207125936\n0.221168905"
  },
  {
    "path": "src/pymgrid/data/load/RefBldgFullServiceRestaurantNew2004_v1.3_7.1_6A_USA_MN_MINNEAPOLIS.csv",
    "content": "Electricity:Facility [kW](Hourly)\n22.32153712\n14.64444443\n14.66463229\n14.67616229\n14.82645007\n22.45533704\n38.4123316\n44.81745964\n41.64815833\n34.15881629\n41.66515522\n42.42998564\n41.7092551\n34.18865388\n34.19450022\n34.18642183\n43.74398917\n45.86426911\n45.86706421\n38.50820589\n38.48708445\n38.41358433\n38.30210841\n39.10710387\n22.34240087\n14.64938121\n14.67264305\n14.68419222\n14.83422553\n22.45449367\n38.42022608\n44.83961396\n41.66834953\n34.18271257\n41.67513248\n42.44237189\n41.73814708\n34.22128134\n34.22044581\n34.20532196\n43.7542282\n45.88263805\n45.88973625\n38.52914365\n38.49461095\n38.4127553\n38.29673364\n39.10032965\n22.33791345\n14.64218186\n14.6616314\n14.67096656\n15.33407266\n22.95982553\n38.63474807\n44.81610131\n41.64485636\n34.15765226\n41.64761185\n42.41953937\n41.69987525\n34.17523411\n34.17466307\n34.16240817\n43.70689972\n45.83203385\n45.83865198\n38.33744634\n38.32747662\n38.28870603\n38.2829469\n39.09267795\n22.3317923\n14.62338489\n14.64086258\n14.65291405\n14.80286471\n22.43990588\n38.40085942\n44.8109332\n41.63986703\n34.15245298\n41.64196829\n42.4125638\n41.69114071\n34.16683881\n34.16783242\n34.15535071\n43.69930915\n45.82313433\n45.83163335\n38.47440158\n38.4561629\n38.38685101\n38.27843498\n39.08852555\n22.32762719\n14.61635221\n14.63157017\n14.6422256\n14.79099746\n22.43098136\n38.39462109\n44.80472801\n41.63374145\n34.14641737\n41.63535324\n42.40730551\n41.68433957\n34.16082766\n34.16146638\n34.14930876\n43.69288513\n45.81645168\n45.82338939\n38.46737511\n38.44934681\n38.38071983\n38.27241935\n39.08322397\n22.3219352\n14.60634387\n14.62156451\n14.6354079\n15.30333074\n22.94236494\n38.6241797\n44.80690079\n41.63543701\n34.1492953\n41.63916473\n42.41083096\n41.69079306\n34.16686048\n34.16727751\n34.15477757\n43.70105695\n45.82337966\n45.83262949\n38.33170381\n38.32297533\n38.28459493\n38.27898849\n39.08926517\n22.32885685\n14.61786372\n14.63460647\n14.64731876\n14.79832504\n22.44087297\n38.39963535\n44.80119612\n41.62838063\n34.14969848\n41.64572531\n42.41788818\n41.69591864\n34.17193522\n34.17391383\n34.16314931\n43.70694395\n45.83170777\n45.83788701\n38.48115846\n38.46140722\n38.39241333\n38.28397689\n39.0936309\n22.33431212\n14.62736727\n14.6446073\n14.65714732\n14.80771064\n22.44670044\n38.40422427\n44.80643744\n41.63329802\n34.1488052\n41.65094315\n42.4180647\n41.69853832\n34.17238675\n34.17308591\n34.16055319\n43.70732683\n45.82983392\n45.83483701\n38.47793106\n38.45883139\n38.38963549\n38.28144208\n39.09189975\n22.33310715\n14.6286096\n14.64837311\n14.66154734\n14.81276108\n22.44617048\n38.40682182\n44.81760015\n41.64611105\n34.15876644\n41.65087889\n42.42228128\n41.70401959\n34.17708958\n34.17569778\n34.16333071\n43.70956566\n45.83599669\n45.84357636\n38.48543417\n38.46569382\n38.39571001\n38.28677873\n39.09656833\n22.33736866\n14.63614368\n14.65699346\n14.67032166\n15.33701961\n22.96379724\n38.64053481\n44.82284629\n41.65598396\n34.171404\n41.662299\n42.43258335\n41.71373621\n34.18868748\n34.18744416\n34.17544122\n43.7244649\n45.85007651\n45.85790212\n38.3556631\n38.34546987\n38.30453749\n38.29608187\n39.10298782\n22.34170965\n14.64901805\n14.67268059\n14.68570849\n14.83668817\n22.45405933\n38.41779004\n44.83360037\n41.66184861\n34.1767845\n41.66826405\n42.43949356\n41.72345753\n34.20281398\n34.2088671\n34.20414652\n42.6981956\n45.87614415\n45.87280054\n38.50667214\n38.48570657\n38.4123376\n38.29982943\n39.10533932\n22.34243487\n14.65030829\n14.67284291\n14.68449195\n14.83418801\n22.45328633\n38.41234553\n44.82410885\n41.65278981\n34.16745594\n41.66100942\n42.43486371\n41.71588134\n34.1928964\n34.19138121\n34.17753594\n42.66869662\n45.84874996\n45.85847787\n38.49928686\n38.48056667\n38.41031101\n38.30100984\n39.10952013\n22.34842081\n14.65601118\n14.68043271\n14.69089342\n15.35197768\n22.96770479\n38.64032727\n44.82111097\n41.64924087\n34.16126458\n41.65106312\n42.42374255\n41.70318893\n34.17748775\n34.17724547\n34.16514369\n42.65083245\n45.83650721\n45.84408482\n38.34181525\n38.33183126\n38.29329608\n38.2880465\n39.09805517\n22.33993517\n14.64083261\n14.66351782\n14.67972579\n14.8350861\n22.46831595\n38.44252544\n44.84059092\n41.65756487\n34.17071939\n41.66090096\n42.42772621\n41.70916682\n34.18191931\n34.18082843\n34.16921454\n42.65573886\n45.8375696\n45.84333224\n38.48608974\n38.46535723\n38.39496183\n38.28576285\n39.09553182\n22.33603637\n14.6318247\n14.65028266\n14.66252017\n14.81281729\n22.44796694\n38.40536446\n44.80777162\n41.63820345\n34.15143523\n41.65335137\n42.42224479\n41.70132796\n34.17678686\n34.18010733\n34.16729555\n42.65852235\n45.8402936\n45.84521101\n38.48685925\n38.46766296\n38.39702157\n38.28767057\n39.09730415\n22.33922917\n14.6418106\n14.66251538\n14.67547114\n14.82644171\n22.45516524\n38.41111696\n44.81561102\n41.64425552\n34.15628837\n41.65879509\n42.42739096\n41.70765502\n34.18547457\n34.18464788\n34.1717474\n42.66393566\n45.8436432\n45.84882311\n38.49285566\n38.47385802\n38.40322227\n38.29207513\n39.10010205\n22.3416473\n14.64865513\n14.67237336\n14.68649753\n15.35302965\n22.97241751\n38.65459834\n44.8418475\n41.6661195\n34.17607646\n41.67259196\n42.43752047\n41.71918977\n34.19562582\n34.19368591\n34.17166482\n42.6588035\n45.841916\n45.84757265\n38.34565529\n38.33311068\n38.29171541\n38.28440277\n39.09259089\n22.33097286\n14.62491572\n14.64122629\n14.65041567\n14.79842865\n22.43513918\n38.39675566\n44.80666658\n41.63567276\n34.14773559\n41.63734576\n42.40922548\n41.68706512\n34.16384964\n34.16477042\n34.15264587\n42.63675566\n45.82064293\n45.82725055\n38.47085992\n38.45252538\n38.38332866\n38.27459962\n39.0849501\n22.32294789\n14.60760287\n14.62177277\n14.63429543\n14.78499115\n22.42790019\n38.3937409\n44.80459279\n41.63410935\n34.14625798\n41.63661237\n42.40791094\n41.68543315\n34.16274845\n34.16486318\n34.1533317\n42.63898049\n45.82254224\n45.83001035\n38.47356663\n38.45573766\n38.3870776\n38.27896226\n39.08920972\n22.32886052\n14.61781255\n14.63421423\n14.6475828\n15.31502104\n22.95164314\n38.629096\n44.81133973\n41.63950428\n34.15323153\n41.64470474\n42.41774386\n41.69898412\n34.17257855\n34.17226292\n34.15968629\n42.64870993\n45.83117882\n45.84116928\n38.34015541\n38.33147461\n38.29222718\n38.28565902\n39.0954897\n22.33635496\n14.63579071\n14.65696188\n14.67103529\n14.82312098\n22.45543899\n38.41382351\n44.82319666\n41.65507594\n34.17439359\n41.67209956\n42.43383726\n41.70691239\n34.17813761\n34.17764363\n34.16466592\n42.64626105\n45.82740982\n45.83173929\n38.47422492\n38.45424241\n38.38477516\n38.27501836\n39.08504473\n22.32266742\n14.60739851\n14.62003591\n14.63231277\n14.7824492\n22.42894535\n38.39151107\n44.79298968\n41.62145485\n34.13535712\n41.63171939\n42.40697625\n41.68299536\n34.15983301\n34.1625013\n34.15046445\n41.57787565\n45.8194532\n45.82465735\n38.46921856\n38.451156\n38.38318742\n38.27540319\n39.08641703\n22.32674167\n14.61529003\n14.63205191\n14.6458305\n14.79747027\n22.43794994\n38.40079263\n44.81243194\n41.6417372\n34.1542317\n41.64727324\n42.41337836\n41.69163674\n34.16809198\n34.16807683\n34.1552516\n41.58228491\n45.82457084\n45.83445882\n38.47609636\n38.45795078\n38.38891189\n38.28065352\n39.09078307\n22.3306893\n14.62163582\n14.6379729\n14.64943198\n15.31510434\n22.94999239\n38.62712673\n44.80913072\n41.63724331\n34.15071136\n41.64245968\n42.41801721\n41.69732926\n34.16941792\n34.17014776\n34.1580802\n41.58466556\n45.8287259\n45.83584114\n38.33491431\n38.32571308\n38.28735378\n38.28193781\n39.09213246\n22.33207902\n14.62443729\n14.64274707\n14.65560104\n14.80654893\n22.44292217\n38.40432135\n44.81517785\n41.64399314\n34.1562295\n41.64640516\n42.42095543\n41.69969049\n34.17324822\n34.17361934\n34.16124154\n41.59130582\n45.83397844\n45.84184665\n38.48320836\n38.4642761\n38.39444371\n38.28578288\n39.0954272\n22.33589182\n14.63329489\n14.65322073\n14.66644537\n14.8174481\n22.44765042\n38.40845309\n44.82198454\n41.65084496\n34.16411298\n41.65962778\n42.42736122\n41.71243142\n34.1821188\n34.18076466\n34.16625251\n41.5963935\n45.84177533\n45.84790118\n38.488983\n38.46901854\n38.39741463\n38.28679538\n39.09602801\n22.33529981\n14.6339346\n14.65343543\n14.66404909\n15.32748072\n22.95680618\n38.62742144\n43.75244052\n41.63761911\n34.15267511\n41.64214067\n42.4160632\n41.69426394\n34.16786676\n34.16956323\n34.15779639\n41.58476638\n45.82756956\n45.83293521\n38.33182356\n38.32098119\n38.28234184\n38.27654626\n39.08682539\n22.32508939\n14.61387903\n14.62977733\n14.64187468\n14.79166342\n22.43437718\n38.39440728\n43.73665104\n41.6216118\n34.14129879\n41.63755272\n42.4049806\n41.68132438\n34.158541\n34.15999258\n34.14851639\n41.57475451\n45.81438002\n45.81988855\n38.46347866\n38.44450969\n38.37635457\n38.26748191\n39.0781591\n22.3162754\n14.59612314\n14.60825672\n14.62113615\n14.77168173\n22.42214762\n38.38671377\n43.72945509\n41.61699499\n34.13071517\n41.6310868\n42.40071305\n41.67577405\n34.15297167\n34.15540765\n34.14295361\n41.57022258\n45.8114667\n45.81621347\n38.45996448\n38.44125292\n38.37273379\n38.26447956\n39.0756762\n22.31304326\n14.59173151\n14.60401683\n14.61615498\n14.76608004\n22.41291201\n38.38344709\n43.73563519\n41.62142301\n34.13527414\n41.62566389\n42.39882205\n41.6758929\n34.15370201\n34.15591923\n34.1441788\n41.57160624\n45.81291855\n45.81994165\n38.46341155\n38.4452114\n38.37586603\n38.26697024\n39.07787716\n22.31542391\n14.59497986\n14.60795918\n14.62070939\n15.28773809\n22.92848406\n38.61584907\n43.73878824\n41.62650954\n34.14096965\n41.63393587\n42.40341939\n41.68078786\n34.15852911\n34.15970243\n34.14727484\n41.57834013\n45.81797013\n45.82740286\n38.32778614\n38.31954148\n38.28189956\n38.27688739\n39.08741163\n22.3274163\n14.61556196\n14.63241783\n14.64596372\n14.79741104\n22.43768897\n38.40015575\n43.75235985\n41.63939877\n34.15426161\n41.64873497\n42.42268359\n41.70307816\n34.17604755\n34.17320959\n34.16199033\n41.58914313\n45.83276026\n45.83881423\n38.47774109\n38.45754256\n38.38724363\n38.27876025\n39.08911734\n22.32742882\n14.61946991\n14.63880012\n14.6537563\n14.80738794\n22.4469449\n38.40896764\n43.76433328\n41.65206602\n34.16730035\n41.66253989\n42.4296877\n41.71322512\n34.18854455\n34.18801348\n34.17402854\n41.60860345\n44.78972502\n45.85597018\n38.49369562\n38.47360828\n38.40111567\n38.28931475\n39.09817917\n22.33766738\n14.63839659\n14.65875521\n14.67058054\n15.33544997\n22.96177077\n38.63706783\n43.76126955\n41.64797906\n34.16134171\n41.65520569\n42.42894856\n41.71362767\n34.19012609\n34.1890373\n34.17626489\n41.60706663\n44.79038715\n45.86082447\n38.35895836\n38.34931719\n38.30922309\n38.30112145\n39.10768618\n22.34489379\n14.65208443\n14.67544711\n14.68788858\n14.83823642\n22.45803701\n38.41439571\n43.75859677\n41.64322485\n34.16142358\n41.6533587\n42.42474557\n41.70165165\n34.17688372\n34.1774297\n34.16539367\n41.59169708\n44.77237864\n45.83870305\n38.48006837\n38.45998747\n38.39029393\n38.28067744\n39.09031492\n22.328825\n14.61762162\n14.63250243\n14.64524807\n14.79552676\n22.43817033\n38.39788176\n43.74078446\n41.62760406\n34.14259569\n41.63851699\n42.41302087\n41.6894997\n34.16612798\n34.16784098\n34.15558774\n41.58114116\n44.76498575\n45.828355\n38.46974374\n38.45085926\n38.38210466\n38.27404105\n39.08496521\n22.3239594\n14.61052999\n14.62536786\n14.63726625\n14.78715354\n22.42880294\n38.39291796\n43.74093199\n41.63170651\n34.14692668\n41.63695585\n42.41121983\n41.69127696\n34.16582482\n34.166739\n34.15473348\n41.58063434\n44.7660616\n45.83260472\n38.47376728\n38.4541805\n38.38478144\n38.27557721\n39.0844343\n22.32247457\n14.60816001\n14.62179761\n14.63498969\n15.30351636\n22.94283249\n38.62453986\n43.74729351\n41.63509562\n34.1499442\n41.64100629\n42.41645936\n41.69597318\n34.1703517\n34.17126056\n34.1585584\n41.58616135\n44.77255198\n45.84015081\n38.33925166\n38.3287064\n38.28943568\n38.28423978\n39.09472857\n22.33561627\n14.63285383\n14.65264944\n14.66465749\n14.81431518\n22.44591156\n38.40621526\n42.69670062\n41.64523834\n34.16244882\n41.65651384\n42.42958973\n41.71291332\n34.18615263\n34.18493345\n34.1726656\n41.60505702\n44.79044373\n45.85638268\n38.49559023\n38.47609465\n38.40692739\n38.29917163\n39.10956136\n22.35143569\n14.65851769\n14.68037369\n14.69311621\n14.84407344\n22.4585454\n38.41643626\n42.71744174\n41.6647164\n34.18627602\n41.69056493\n42.45865517\n41.762443\n34.25072052\n34.25631055\n34.24597521\n41.66987002\n44.84341657\n45.90086093\n38.53610143\n38.50455979\n38.42059537\n38.30722058\n39.11252337\n22.34771243\n14.65657791\n14.68126441\n14.69389346\n15.35776616\n22.97024113\n38.64508061\n42.71493499\n41.667376\n34.20415349\n41.72322176\n42.47922633\n41.79887802\n34.283817\n34.29061064\n34.27720986\n41.7019922\n44.87391904\n45.92564865\n38.41979544\n38.40594737\n38.35563455\n38.34048868\n39.12796094\n22.36743787\n14.67880247\n14.70308255\n14.70510745\n14.85259535\n22.4632306\n38.42528714\n42.71041279\n41.66670462\n34.20985097\n41.72728522\n42.4859933\n41.81559342\n34.30517065\n34.30402662\n34.29403694\n41.71847586\n44.87810615\n45.92933092\n38.5723278\n38.55111234\n38.48104285\n38.37336481\n39.14637039\n22.39704976\n14.70430276\n14.72927462\n14.74258906\n14.89356135\n22.50115241\n38.46362344\n42.75056095\n41.6879326\n34.20257946\n41.70799617\n42.45101103\n41.7305501\n34.20575154\n34.20426617\n34.18916398\n41.63010708\n43.75347392\n45.8765712\n38.51592074\n38.49400955\n38.41896354\n38.30509852\n39.10775992\n22.34619114\n14.65488854\n14.6788719\n14.69178108\n14.84279765\n22.45671244\n38.41952187\n42.71657966\n41.66230784\n34.17288639\n41.66630897\n42.43809028\n41.72158252\n34.20378764\n34.20840628\n34.19573897\n41.62387269\n43.73686589\n45.85983715\n38.4999993\n38.47881232\n38.40472131\n38.29319865\n39.10217362\n22.34248041\n14.64623313\n14.66793566\n14.67998198\n15.34458823\n22.96361202\n38.64092838\n42.70436878\n41.65027438\n34.16228951\n41.65320501\n42.42420265\n41.7068811\n34.18144304\n34.17960563\n34.16649423\n41.59383032\n43.7197987\n45.84400096\n38.34184772\n38.33139678\n38.29183795\n38.28584623\n39.09550482\n22.33452277\n14.62739458\n14.64450661\n14.65592419\n14.80558691\n22.44136078\n38.40235742\n42.6937301\n41.640631\n34.15621659\n41.64696159\n42.41952392\n41.69885388\n34.17381957\n34.17459074\n34.16272865\n41.58845131\n43.71434931\n45.83952487\n38.48064298\n38.46226169\n38.39246054\n38.28348429\n39.09359843\n22.33368054\n14.62675414\n14.64396614\n14.65422618\n14.80326293\n22.43911811\n38.40000317\n42.6919533\n41.6406298\n34.1564141\n41.64676145\n42.41913084\n41.70257959\n34.17988977\n34.17901032\n34.16635665\n41.59820726\n43.72250893\n45.84917136\n38.49130011\n38.47406081\n38.40671752\n38.29594158\n39.10268441\n22.34302181\n14.64828742\n14.67176263\n14.68529152\n15.35145163\n22.96969735\n38.64938951\n42.71774623\n41.66462945\n34.17747049\n41.67296024\n42.45118018\n41.75723625\n34.24899276\n34.25382936\n34.23973838\n41.6618781\n43.76847395\n45.88141772\n38.37459349\n38.35536185\n38.30734208\n38.29610337\n39.10270562\n22.34188002\n14.64909011\n14.67033572\n14.68103057\n14.82983289\n22.45446134\n38.4112247\n42.69477747\n41.64923762\n34.17013616\n41.66837966\n42.43605847\n41.72136348\n34.20840592\n34.20109037\n34.18439566\n41.61555969\n43.73028934\n45.85476558\n38.49659414\n38.47482032\n38.4024415\n38.29073135\n39.09954721\n22.33880927\n14.63673955\n14.65517441\n14.66690213\n14.81656663\n22.44917305\n38.40574863\n41.62775976\n41.6367885\n34.15169561\n41.64927779\n42.42321039\n41.70257899\n34.17638957\n34.17811291\n34.16566908\n41.59507917\n43.72046621\n45.84297367\n38.48539313\n38.46533443\n38.39513165\n38.28531083\n39.09442442\n22.33703174\n14.64263303\n14.66347943\n14.67486593\n14.82393144\n22.45361016\n38.41052238\n41.63413342\n41.64412281\n34.15663661\n41.65471408\n42.42801838\n41.70529842\n34.1789789\n34.18036991\n34.16799966\n41.59816935\n43.72352037\n45.84654705\n38.48640118\n38.46658204\n38.3937987\n38.28505303\n39.09454683\n22.3347436\n14.63195842\n14.6520452\n14.66573344\n15.33257221\n22.96072639\n38.63817209\n41.64461302\n41.65296063\n34.17150169\n41.66830521\n42.45219572\n41.77408939\n34.26680748\n34.27556695\n34.27714861\n41.71818533\n43.82105984\n45.9264382\n38.40787335\n38.39343582\n38.34227512\n38.31692547\n39.11080278\n22.34740857\n14.6561891\n14.67875112\n14.69071778\n14.84188508\n22.4556565\n38.41882633\n41.65838083\n41.66848987\n34.19667675\n41.69978362\n42.46532187\n41.77029361\n34.24731477\n34.24791151\n34.22970477\n41.65530242\n43.77517317\n45.89962917\n38.53763928\n38.51651177\n38.4400335\n38.32619474\n39.1201723\n22.36215339\n14.66412304\n14.68556451\n14.69946052\n14.85102341\n22.46469823\n38.43186636\n41.67449774\n41.6810073\n34.19516919\n41.69130224\n42.4509698\n41.74090833\n34.21564287\n34.21476063\n34.19947614\n41.63498702\n42.69690288\n45.88569772\n38.52958866\n38.51202282\n38.44291108\n38.33847902\n39.1349005\n22.38408437\n14.69254336\n14.72138163\n14.7372709\n15.40250797\n23.01899341\n38.70017403\n41.71402913\n41.71384721\n34.21156586\n41.689132\n42.44428123\n41.72323444\n34.19823453\n34.19451359\n34.178264\n41.6082969\n42.67161891\n45.85523813\n38.3530739\n38.34209975\n38.30112654\n38.29278114\n39.10143065\n22.34165802\n14.64716201\n14.67064525\n14.6842085\n14.83512176\n22.45623962\n38.41545045\n41.64369977\n41.65071514\n34.16978473\n41.66815083\n42.42934333\n41.7138546\n34.18658033\n34.18564476\n34.17373515\n41.60617147\n42.66672083\n45.85192817\n38.49512696\n38.47565452\n38.40406182\n38.29297171\n39.10071455\n22.34214591\n14.64375116\n14.66354782\n14.67560511\n14.82524796\n22.45353359\n38.41080577\n41.63811326\n41.64680752\n34.15968534\n41.65959835\n42.43441471\n41.7128834\n34.18868585\n34.18810941\n34.17888683\n41.60757247\n42.67222506\n45.8539456\n38.49508414\n38.47480743\n38.40273708\n38.29111674\n39.10009332\n22.3406309\n14.64488736\n14.6673014\n14.68081894\n14.83165581\n22.45098586\n38.41360766\n41.65042905\n41.65490181\n34.16809735\n41.65985642\n42.4292373\n41.7140272\n34.18814964\n34.18527608\n34.1701465\n41.60140327\n42.66985383\n45.85399894\n38.49493628\n38.4750933\n38.40151906\n38.28990251\n39.09871121\n22.3383875\n14.63890747\n14.65945309\n14.6713323\n15.33612718\n22.9614992\n37.57804647\n41.64208472\n41.65310297\n34.17027267\n41.66025833\n42.4317778\n41.7128772\n34.18549145\n34.18465787\n34.17315645\n41.60177096\n42.66882072\n45.85226913\n38.34889068\n38.33678232\n38.29588251\n38.29009674\n39.09994346\n22.34105216\n14.64317886\n14.66606715\n14.68042502\n14.83238509\n22.45262735\n37.35871984\n41.65526562\n41.67399485\n34.21644317\n41.73701782\n42.49732998\n41.84704797\n34.34207239\n34.35850129\n34.34916099\n41.77855942\n42.82223161\n45.98524458\n38.61163709\n38.57731226\n38.49177282\n38.36277005\n39.13422927\n22.3915922\n14.7093722\n14.72758938\n14.73059498\n14.87619016\n22.47425731\n37.37220052\n41.68396431\n41.70125776\n34.21787688\n41.70656061\n42.46162059\n41.76471544\n34.23523177\n34.22573348\n34.20541799\n41.62660576\n42.67950102\n45.85563639\n38.49583225\n38.47667695\n38.40383759\n38.29349892\n39.10234513\n22.34146224\n14.64050641\n14.66037689\n14.67218536\n15.33721578\n22.95959014\n37.57932996\n41.64194435\n41.64684543\n34.16208492\n41.65315642\n42.42576737\n41.70696592\n34.18014948\n34.18085893\n34.16876818\n41.59564695\n42.66390095\n45.84900302\n38.34723623\n38.33686518\n38.2977474\n38.29218614\n39.10187601\n22.34387995\n14.64559285\n14.66836988\n14.6822853\n14.83406577\n22.4558132\n37.35775922\n41.64328342\n41.65224838\n34.17722809\n41.69412316\n42.46125378\n41.76348887\n34.23757369\n34.23642719\n34.212832\n41.62339179\n42.67939\n45.8604293\n38.50277285\n38.48047026\n38.40805738\n38.29637456\n39.10331992\n22.34326225\n14.64793375\n14.66981839\n14.6827237\n14.83359439\n22.45491022\n37.35580686\n41.64358653\n41.65076014\n34.16289074\n41.66207409\n42.43543238\n41.71343574\n34.19136309\n34.1927807\n34.17551193\n41.60356981\n42.67003695\n45.85069127\n38.48959268\n38.46999185\n38.39895524\n38.28987287\n39.09936289\n22.34003999\n14.6414678\n14.66264598\n14.67484472\n14.82532391\n22.44892707\n37.35341513\n41.64707397\n41.65495031\n34.17194273\n41.66364854\n42.43566202\n41.72361311\n34.20851184\n34.21278785\n34.20115646\n41.63289229\n41.63283729\n45.86333915\n38.50015694\n38.48045502\n38.40701846\n38.29427343\n39.10242204\n22.34258825\n14.64669841\n14.66898403\n14.68167109\n15.34727771\n22.9650434\n37.58432076\n41.6507796\n41.65629061\n34.1701031\n41.66311427\n42.43221975\n41.71165559\n34.19011929\n34.19147678\n34.17845048\n41.61441991\n41.62163094\n45.87067663\n38.37063532\n38.36182858\n38.32052151\n38.30863162\n39.11296135\n22.35290429\n14.66182875\n14.68684643\n14.70058667\n14.85201052\n22.46726779\n36.31640534\n41.67280508\n41.67594086\n34.19021945\n41.68236585\n42.44915836\n41.7343016\n34.21351731\n34.21159983\n34.19859265\n41.63481294\n41.63692717\n45.88005355\n38.52183551\n38.50190531\n38.42990099\n38.3179632\n39.12141427\n22.36385434\n14.67519629\n14.70030268\n14.71366975\n14.86501615\n22.47971323\n36.33199128\n41.68917488\n41.69252971\n34.20640041\n41.70743435\n42.46062603\n41.75522241\n34.2382206\n34.23880258\n34.22369025\n41.65866814\n41.66077314\n45.90545056\n38.5429145\n38.52047119\n38.44383907\n38.33090111\n39.12367939\n22.35783201\n14.66723754\n14.69220188\n14.70720923\n15.37268907\n22.98574583\n36.54712467\n41.67754972\n41.6784601\n34.19888918\n41.69837874\n42.46406049\n41.76158882\n34.24343749\n34.24679058\n34.23571986\n41.67190354\n41.67506792\n45.92027051\n38.41909456\n38.40560817\n38.36122853\n38.35397639\n39.14696468\n22.40213258\n14.71227036\n14.73762563\n14.75481283\n14.90907625\n22.52737949\n36.38113769\n41.7372682\n41.74642697\n34.26560679\n41.76172114\n42.49630575\n41.81526228\n34.29983072\n34.3075831\n34.30000059\n41.74805939\n41.75275151\n45.99923685\n38.64238109\n38.62820981\n38.56388933\n38.45271113\n39.20712854\n14.85975948\n14.86473745\n14.87511729\n15.03938366\n22.64892391\n38.61007604\n43.9557654\n41.83962796\n34.36397974\n41.89519292\n42.61456264\n41.99283587\n34.48452779\n34.49555266\n34.50650246\n42.71367179\n42.99788138\n43.13567812\n38.86036224\n38.70574346\n38.61906033\n38.49436906\n39.22725814\n22.49397306\n14.79552189\n14.81820579\n14.81456861\n14.949636\n22.53501058\n38.48927477\n43.85303226\n41.74120238\n34.26970305\n41.80121209\n42.56377976\n41.91455661\n34.38566741\n34.37993094\n34.35085675\n41.7717147\n41.7788143\n41.79218679\n38.67274\n38.65528282\n38.57731292\n38.46413684\n39.22148974\n22.50559392\n14.81527086\n14.83399432\n14.84816539\n15.51275448\n23.12974925\n38.83125697\n43.95592656\n41.83056967\n34.35409734\n41.87358788\n42.61134414\n42.01167641\n34.43571797\n34.39164935\n34.35330031\n41.76388676\n41.75290553\n41.74350667\n38.46338894\n38.44607761\n38.3957973\n38.38038121\n39.15539205\n22.40872301\n14.72305358\n14.74351902\n14.75372472\n14.90114193\n22.50662797\n38.47088033\n43.83058852\n41.71661265\n34.22911466\n41.73385355\n42.49811115\n41.82636882\n34.26574965\n34.22401438\n34.19477125\n41.62656117\n41.63323618\n41.6487946\n38.52584832\n38.5058113\n38.43564804\n38.3274521\n39.12855583\n22.37371413\n14.68545044\n14.71126937\n14.72070318\n14.86909163\n22.47991919\n38.44529344\n42.74254192\n41.68710066\n34.19973575\n41.69576568\n42.45244937\n41.7389609\n34.214976\n34.21594739\n34.20135603\n41.63103767\n41.63021816\n41.63826191\n38.51151969\n38.4900465\n38.41577724\n38.30380196\n39.11101346\n22.34949878\n14.66126584\n14.68677734\n14.70025257\n15.36562186\n22.97869203\n38.65709049\n42.72875696\n41.67333418\n34.1801473\n41.67542621\n42.44200149\n41.73038179\n34.20924179\n34.20405683\n34.18745679\n41.61838601\n41.62787562\n41.63687359\n37.3084276\n38.35548428\n38.31046861\n38.300583\n39.10925639\n22.34791233\n14.66099574\n14.68439556\n14.69530962\n14.84393351\n22.45879987\n38.41635956\n42.70459969\n41.65179285\n34.16982038\n41.66592101\n42.43310029\n41.71493263\n34.18516597\n34.18415159\n34.17160717\n41.6007782\n41.6051925\n41.61194427\n37.43228175\n38.46989408\n38.39829693\n38.28897795\n39.09838518\n22.33896414\n14.63724424\n14.65754315\n14.67005163\n14.82051488\n22.45147431\n38.40871821\n42.69078344\n41.64315887\n34.15582572\n41.65424433\n42.42998465\n41.71080819\n34.18342816\n34.18353349\n34.17674478\n41.61189411\n41.62322643\n41.62544577\n37.44066403\n38.48104324\n38.40532827\n38.29176171\n39.09893411\n22.34051979\n14.64609197\n14.66758805\n14.67996171\n14.83071064\n22.45109977\n38.41573264\n42.71299211\n41.66445199\n34.19640278\n41.71968448\n42.48562586\n41.82576092\n34.3202928\n34.33027912\n34.31913975\n41.75428321\n41.76075864\n41.74810226\n37.54921422\n38.5780432\n38.49573925\n38.38203448\n39.15098945\n22.407967\n14.7087844\n14.72985601\n14.7346994\n15.39677932\n23.01404328\n38.69428667\n42.76119167\n41.71273934\n34.24259364\n41.75922815\n42.50466288\n41.84666704\n34.34431511\n34.36718498\n34.36142423\n41.79889909\n41.79393719\n41.7901747\n37.44784662\n38.48156542\n38.42287384\n38.40688245\n39.16459717\n22.42933858\n14.73461614\n14.75760956\n14.76833642\n14.91831082\n22.52575628\n38.47491104\n42.75566324\n41.69206788\n34.20013691\n41.69521035\n42.46173771\n41.75941199\n34.23645779\n34.22999862\n34.20746497\n41.63074368\n41.62267476\n41.62458049\n37.44047709\n38.47645844\n38.40220356\n38.2917534\n39.10038706\n22.33916058\n14.63761668\n14.65633399\n14.66807916\n14.81779493\n22.44701028\n38.4082269\n42.69906836\n41.64533279\n34.16100934\n41.65246307\n42.42465026\n41.70390284\n34.17775404\n34.17889274\n34.16633694\n41.5952922\n41.60337244\n41.61341562\n37.43256023\n38.472704\n38.39864667\n38.28925919\n39.09835439\n22.33916769\n14.63828766\n14.65895956\n14.67168263\n15.33810809\n22.96083973\n38.63948242\n41.64501895\n41.65234941\n34.1696829\n41.65977715\n42.43108715\n41.71228966\n34.18740479\n34.192883\n34.1856448\n41.62373917\n41.62630935\n41.62677852\n37.29894881\n38.34860469\n38.30393092\n38.29442756\n39.10281037\n22.34414072\n14.64953345\n14.67298474\n14.68598226\n14.8370722\n22.45751074\n38.41704784\n41.64647097\n41.65533667\n34.17607783\n41.67747252\n42.45870365\n41.76377423\n34.24529316\n34.25209277\n34.23781827\n41.67548523\n41.67619182\n41.66907107\n37.47204704\n38.49546675\n38.41336386\n38.300336\n39.10604243\n22.34629685\n14.64954338\n14.67142202\n14.68308665\n14.83252164\n22.4534134\n38.41280521\n41.63424314\n41.64213977\n34.1568659\n41.65467145\n42.43025548\n41.70788561\n34.18739965\n34.19522903\n34.18893494\n41.62351624\n41.63101338\n41.63303871\n37.44185883\n38.4787256\n38.40382701\n38.29326716\n39.10268921\n22.34623523\n14.65436482\n14.67692556\n14.68886833\n14.8382753\n22.45349316\n38.41725373\n41.65531642\n41.66368288\n34.18715056\n41.69593455\n42.47813312\n41.82231439\n34.31641367\n34.32490833\n34.32390039\n41.7588787\n41.757932\n41.76125079\n37.54663884\n38.57506386\n38.49395358\n38.37087279\n39.14111629\n22.40633712\n14.72187523\n14.7467608\n14.7511327\n15.40908616\n23.01377739\n38.68602166\n41.69626258\n41.70870669\n34.2347678\n41.7454693\n42.49521856\n41.83917372\n34.32459644\n34.32823115\n34.30126712\n41.71977663\n41.72523552\n41.72752118\n37.39977025\n38.44872495\n38.40141062\n38.3913107\n39.14856721\n22.40888972\n14.72093767\n14.74385933\n14.75088714\n14.89789228\n22.50579895\n38.46119478\n41.69668067\n41.71768307\n34.2577896\n41.76869798\n42.5172763\n41.86305664\n34.33712419\n34.33230006\n34.31887579\n41.75606662\n41.75690724\n41.76258992\n36.51876797\n38.60870804\n38.5203072\n38.39738035\n39.15056821\n22.41302127\n14.72877115\n14.74551311\n14.74078554\n14.87743886\n22.48095455\n38.43961655\n41.68938342\n41.71250228\n34.25550697\n41.76849625\n42.52278048\n41.87750961\n34.36757983\n34.3707662\n34.35083805\n41.78911843\n41.79358085\n41.78558831\n36.51707425\n38.59157863\n38.50582765\n38.37742763\n39.15270696\n22.41058895\n14.71327047\n14.73319389\n14.74141803\n15.4026924\n23.01127688\n38.68723394\n41.70679373\n41.72631173\n34.2470896\n41.74806978\n42.49449559\n41.82743325\n34.32113331\n34.32982882\n34.31826899\n41.76003635\n41.75911105\n41.76384474\n36.37378894\n38.47872438\n38.43411697\n38.41380647\n39.16312424\n22.41319891\n14.70694769\n14.71146449\n14.71337193\n14.8590231\n22.46117152\n38.41961873\n41.64924903\n41.65767561\n34.17903281\n41.67516112\n42.43797126\n41.719424\n34.19586324\n34.19563046\n34.18271951\n41.61669049\n41.61599517\n41.6227982\n36.38857274\n38.48626717\n38.41415643\n38.3048927\n39.11138564\n22.34961204\n14.65852951\n14.68386485\n14.69737429\n14.84902753\n22.46371004\n37.37158539\n41.66216728\n41.66835614\n34.17769095\n41.6824605\n42.44539902\n41.73366115\n34.21176705\n34.21528391\n34.19320157\n41.62741375\n41.62739451\n41.62219139\n36.38106985\n38.48046965\n38.40702235\n38.2936533\n39.1008497\n22.34073025\n14.64718648\n14.66801216\n14.6798382\n14.83015747\n22.45105004\n37.35517046\n41.64860227\n41.65385211\n34.16872074\n41.66163769\n42.43314913\n41.71389312\n34.18765648\n34.18797457\n34.17428862\n41.60280684\n41.61016874\n41.62123057\n36.38156623\n38.4814753\n38.40711308\n38.29520969\n39.1027228\n22.34368993\n14.64937776\n14.67259364\n14.68567936\n15.35151714\n22.96680438\n37.58724616\n41.65447687\n41.66181935\n34.17403599\n41.66394211\n42.43150672\n41.71665141\n34.1906301\n34.18620183\n34.17250988\n41.60702656\n41.61072054\n41.62315403\n36.24196185\n38.35004495\n38.30523089\n38.29543809\n39.1027251\n22.34321622\n14.64822329\n14.67093827\n14.68334559\n14.83298567\n22.45074726\n37.3544819\n41.64915543\n41.66281868\n34.18074411\n41.66976366\n42.44293353\n41.73580205\n34.21355954\n34.2147302\n34.20387282\n41.63849624\n41.64537543\n41.65223135\n36.40435582\n38.4963939\n38.4193905\n38.30135917\n39.10556646\n22.34649637\n14.65496874\n14.67866761\n14.69093628\n14.84159314\n22.45563376\n37.36027352\n41.65533476\n41.66965324\n34.18898928\n41.69090919\n42.45537044\n41.7630883\n34.24777963\n34.25437693\n34.25197099\n41.69538508\n41.70744181\n41.71611881\n36.47586142\n38.57056554\n38.49426595\n38.37900007\n39.15147576\n22.4233464\n14.73900105\n14.76840494\n14.78508372\n15.44844546\n23.06034696\n37.69995405\n41.77521484\n41.78466885\n34.29754501\n41.80066021\n42.51357305\n41.86557183\n34.35705316\n34.35873686\n34.34112749\n41.78462479\n41.7825845\n41.78452433\n36.39890929\n38.50126797\n38.44760342\n38.43509759\n39.19507764\n22.47275882\n14.78113313\n14.80129558\n14.80856841\n14.95735071\n22.568101\n37.46219134\n41.74257742\n41.75546998\n34.27655285\n41.76745574\n42.49842947\n41.82267154\n34.31155217\n34.31889437\n34.31262157\n41.75181943\n41.74732942\n41.74758196\n36.49482668\n38.57633436\n38.48786892\n38.3624842\n39.13714726\n22.38297647\n14.68829087\n14.70699054\n14.71248979\n14.85944508\n22.46609803\n37.36771414\n41.65745001\n41.68056395\n34.20727717\n41.71639879\n42.48025813\n41.7982018\n34.28391966\n34.29182247\n34.29039467\n41.73728687\n41.75353773\n41.76870593\n36.53300053\n38.62130363\n38.54470409\n38.42380504\n39.17824803\n22.46451765\n14.79066802\n14.81763846\n14.82294895\n14.97063852\n22.5777739\n36.42359587\n41.78378492\n41.78063751\n34.2942138\n41.79616877\n42.51247775\n41.85121947\n34.35474389\n34.37935098\n34.38922577\n41.82789111\n41.81788621\n41.79869963\n35.46128568\n38.60438464\n38.52298172\n38.41536873\n39.18711735\n22.47324888\n14.79822351\n14.83354648\n14.83074648\n15.47639301\n23.08160053\n36.64410293\n41.76946633\n41.76712315\n34.27787842\n41.77923046\n42.49885383\n41.81264042\n34.28906022\n34.28694712\n34.27042487\n41.7092958\n41.70879975\n41.71751059\n35.27406725\n38.44228001\n38.40275887\n38.39712686\n39.17211341\n22.44015882\n14.7571636\n14.78184852\n14.79286629\n14.94433545\n22.55598168\n36.40265893\n41.76085734\n41.77163873\n34.29511645\n41.7993911\n42.52997374\n41.87384373\n34.36939761\n34.39081673\n34.39586785\n41.85961731\n42.11388235\n42.89875304\n35.83583512\n38.74458701\n38.62172719\n38.47873815\n39.21797654\n22.49996028\n14.80633708\n14.82205809\n14.82397073\n14.96881817\n22.57295201\n36.41868915\n41.7796512\n41.80170815\n34.35316052\n41.87298071\n42.62292939\n42.37192003\n34.63991923\n34.46956424\n34.43371335\n41.83788253\n41.81997359\n41.81841875\n35.52889806\n38.67675296\n38.59541607\n38.48008905\n39.2374195\n22.51891395\n14.84084003\n14.87665598\n14.88766932\n15.58613387\n23.17964194\n36.73629517\n41.85032781\n41.84366257\n34.38004306\n41.90513994\n42.71787938\n43.95987523\n37.35503486\n37.43117974\n38.06375546\n46.99768212\n48.13291805\n48.41216196\n39.34839279\n41.27428849\n39.27751138\n38.60488731\n39.32120678\n22.58903746\n14.8833293\n14.88796603\n14.89685374\n15.06666575\n22.71751179\n36.56099329\n41.91836076\n41.96841744\n34.50715252\n44.31321741\n49.43362516\n50.75809329\n43.8007636\n44.81698516\n46.19393122\n56.39335053\n56.99019938\n58.27084793\n49.58153699\n49.78245769\n48.37239227\n46.26820806\n45.22284503\n25.17726818\n15.05407855\n15.0695187\n15.07041052\n15.24482952\n22.8542695\n36.70064512\n42.43001416\n44.71768107\n36.12859866\n46.35633012\n49.67023504\n51.34882488\n43.60687701\n42.89138986\n42.86350604\n52.43497663\n53.59985128\n54.81806395\n47.24528073\n49.57191952\n45.86110557\n42.21888039\n40.23812214\n22.65344639\n14.94122807\n14.95427148\n14.95171566\n15.08522777\n22.65618364\n36.45335976\n41.81028716\n41.81838358\n34.34784314\n41.85222245\n42.59754119\n42.15785344\n34.46299661\n34.45966157\n34.44137172\n42.31077669\n43.11775567\n44.0963173\n36.45131407\n39.28670733\n38.67230135\n38.51462048\n39.25353552\n22.54203072\n14.85577575\n14.8810844\n14.87841222\n15.58291833\n23.19498207\n35.69315143\n41.87224724\n41.91194943\n34.52162703\n44.9181829\n50.2246779\n53.67048181\n45.868633\n44.75116647\n43.50931886\n50.42029659\n49.67532269\n48.56494686\n37.79927848\n39.01344348\n38.52266192\n38.48114668\n39.21564774\n22.47667952\n14.78413802\n14.79636749\n14.79616754\n14.94149898\n22.53832311\n35.31401808\n41.72799377\n41.73014072\n34.24312945\n41.73806099\n42.48720998\n41.80946781\n34.30224536\n34.31376156\n34.29808232\n41.73006635\n41.73592748\n41.74030046\n35.43589136\n38.5864102\n38.49845034\n38.37258645\n39.14496354\n22.40169595\n14.71228215\n14.73357561\n14.74096057\n14.88302104\n22.4856161\n35.2660693\n41.68346304\n41.70263235\n34.22988593\n41.73711619\n42.48692531\n41.81291236\n34.2924788\n34.29753791\n34.28350039\n41.71732273\n41.72648855\n41.7339948\n35.43025627\n38.58521743\n38.51059086\n38.39279745\n39.1487357\n22.41405226\n14.7199862\n14.74029186\n14.74234459\n15.38810842\n22.99768602\n35.50650987\n41.69604137\n41.69592819\n34.2015784\n41.69301357\n42.44786416\n41.7323059\n34.2111542\n34.20755457\n34.19017058\n41.6253848\n41.63525419\n41.64153825\n35.2061026\n38.3718961\n38.32759794\n38.32036565\n39.12378448\n22.36532835\n14.67639991\n14.69818413\n14.70886494\n14.85978699\n22.47146468\n35.2583539\n41.66377656\n41.67261296\n34.19498476\n41.70281834\n42.46216067\n41.75280685\n34.23652983\n34.244407\n34.23643618\n41.66807576\n41.67478222\n41.68717874\n34.33116259\n38.54198215\n38.46196687\n38.34563951\n39.13562562\n22.38941656\n14.70056043\n14.72496422\n14.7387216\n14.88670198\n22.49957073\n35.2865519\n41.6951138\n41.72112471\n34.25986143\n41.79226604\n42.54939797\n41.92157625\n34.43168692\n34.45460991\n34.47948678\n42.2995341\n42.9608766\n43.3743211\n35.06480408\n38.79611775\n38.65191058\n38.50270343\n39.24860423\n22.54019672\n14.85855925\n14.88741057\n14.90431662\n15.07995512\n22.74441935\n35.50525887\n41.85165679\n41.81705791\n34.31161077\n41.79635056\n42.50090969\n41.82358751\n34.30246499\n34.2821161\n34.25475119\n41.68726924\n41.69379026\n41.70230623\n34.34032095\n38.54941767\n38.46988105\n38.35180884\n39.13249764\n22.38669068\n14.69555353\n14.71981216\n14.73609851\n15.40006566\n22.99584478\n35.48191644\n41.66061358\n41.67084495\n34.19556999\n41.69797159\n42.46304725\n41.76468969\n34.2473587\n34.25224299\n34.23986612\n41.67848505\n41.68031944\n41.67769048\n34.16720451\n38.38658475\n38.33749756\n38.32176415\n39.11534086\n22.35784099\n14.66662681\n14.69209278\n14.70180797\n14.85074049\n22.46223774\n35.24978135\n41.66153526\n41.69838575\n34.23182262\n41.72936583\n42.47779431\n41.80308572\n34.28246922\n34.28065883\n34.2717822\n41.71356418\n41.72262783\n41.73515971\n34.37382383\n38.58485431\n38.50738499\n38.39577868\n39.15794832\n22.43136888\n14.74699412\n14.77605227\n14.78901456\n14.94014849\n22.54578372\n34.27290215\n41.75087374\n41.74698887\n34.24747674\n41.74156924\n42.47573138\n41.77509161\n34.25192327\n34.24316474\n34.21575216\n41.64687396\n41.64572478\n41.6559128\n34.29938178\n38.51235362\n38.43714714\n38.32289621\n39.1263813\n22.37437918\n14.6902446\n14.71922651\n14.73176423\n15.39461083\n23.0086502\n34.45234846\n41.70230144\n41.70511172\n34.22169921\n41.72530205\n42.4798915\n41.78229273\n34.25535911\n34.25295328\n34.24167082\n41.68486825\n41.69341334\n41.70026762\n34.19872464\n38.42495696\n38.38285588\n38.37448946\n39.15507803\n22.42317974\n14.73778338\n14.76396714\n14.78061016\n14.93129397\n22.54603174\n34.2803666\n41.74765771\n41.76532719\n34.30040891\n41.81364241\n42.55749544\n41.92494879\n34.42613208\n34.43759374\n34.43134521\n41.85030152\n41.81255128\n41.81419739\n34.45006147\n38.63534424\n38.53871631\n38.41999508\n39.17346842\n22.44649704\n14.75876653\n14.78622353\n14.79188605\n14.9354008\n22.53390003\n34.2540973\n41.7324264\n41.76586413\n34.29310253\n41.80930469\n42.53625417\n41.87931511\n34.36901892\n34.37808536\n34.37223806\n41.81973312\n41.84879291\n41.90252326\n34.46690066\n38.65038692\n38.54564241\n38.41618092\n39.17136329\n22.44316178\n14.74838017\n14.7592833\n14.75569395\n14.89067545\n22.47975736\n34.19902963\n41.67361153\n41.69863491\n34.23237818\n41.73537674\n42.48381505\n41.81376164\n34.29841504\n34.30891854\n34.30891509\n41.75243429\n41.76414646\n41.77073932\n34.40047502\n38.59529664\n38.50767992\n38.37879578\n39.14998741\n22.41843349\n14.72288588\n14.72071577\n14.72317678\n15.39924693\n23.00417833\n34.44654538\n41.71336874\n41.76037509\n34.31149132\n41.83630855\n42.5867047\n41.99853232\n34.41897737\n34.41942276\n34.40769303\n42.00259681\n42.71763621\n43.0739727\n34.59917001\n38.5457536\n38.47636534\n38.44561201\n39.18716337\n22.45981119\n14.75850458\n14.78399883\n14.79548991\n14.94226062\n22.54784101\n34.2703194\n41.76950846\n41.82318759\n34.37291462\n41.89698716\n42.93369593\n43.72233181\n36.09327567\n35.39975785\n35.24426096\n44.15707554\n44.7338475\n45.26082331\n35.69926473\n39.13919122\n38.65064466\n38.50394448\n39.24494199\n22.52489574\n14.84853277\n14.86999541\n14.86431638\n15.00324548\n22.59813333\n34.3238551\n41.82996937\n41.87873914\n34.41352234\n41.92679198\n42.84464859\n42.63713213\n34.80971478\n34.50188782\n34.58444441\n42.80646772\n43.10887873\n43.13478411\n34.7428887\n38.70892995\n38.60126705\n38.46099075\n39.20020976\n22.47009561\n14.78834043\n14.81446489\n14.82024522\n15.47107673\n23.06286527\n34.50095643\n41.75231629\n41.7736896\n34.31181573\n41.82611282\n42.5702727\n41.99668002\n34.42838555\n34.46453453\n34.46231773\n42.53219638\n42.97923005\n43.43388857\n34.86447168\n37.51592619\n38.47541259\n38.43842471\n39.1875595\n22.46447377\n14.7753762\n14.79460428\n14.80352986\n14.95006707\n22.54349009\n34.26289728\n41.74706815\n41.77596621\n34.31868368\n41.83755321\n42.59028964\n41.94864599\n34.42794477\n34.43000226\n34.43231932\n42.05493681\n42.22221825\n42.86521484\n34.93339181\n37.6572158\n38.61830353\n38.48774631\n39.2307103\n22.50675561\n14.81615131\n14.83693098\n14.84173213\n14.98913682\n22.59113946\n34.31739311\n41.79955987\n41.81613742\n34.33857812\n41.85424375\n42.57603735\n41.93912514\n34.41195281\n34.40193575\n34.36644906\n41.79952689\n41.79616656\n41.79927317\n34.45046794\n37.5964736\n38.55159958\n38.42908218\n39.18805507\n22.46951366\n14.78936025\n14.81645135\n14.8301359\n14.98191826\n21.5369805\n34.33192559\n41.81348159\n41.81280684\n34.3271553\n41.82798294\n42.57588649\n41.89818255\n34.372471\n34.37167331\n34.34940945\n41.78010526\n41.76169791\n41.77229762\n34.41454843\n37.56273924\n38.53888655\n38.42370997\n39.18305323\n22.45837393\n14.77757377\n14.80519877\n14.8183099\n15.48166427\n22.0326796\n34.53655031\n41.77928938\n41.78163272\n34.30347881\n41.80555076\n42.5280098\n41.86650936\n34.35985232\n34.37319116\n34.36652058\n41.81054585\n41.81250713\n41.91971764\n34.32526602\n37.48313337\n38.47454606\n38.44265419\n39.18075475\n22.45453409\n14.76822031\n14.78784737\n14.79834536\n14.9461793\n21.48836978\n34.2777012\n41.78238855\n41.85110732\n34.42997633\n42.2345131\n44.85292672\n47.02191071\n39.37097099\n38.90149495\n38.68451368\n48.231891\n50.09095718\n51.75634555\n42.65594595\n44.66264951\n42.8797814\n40.84739175\n40.09126345\n22.68404641\n14.98124322\n14.99782557\n15.00359702\n15.17717344\n21.71971269\n34.5288345\n42.05501052\n42.51636248\n35.02898185\n44.00964055\n47.32417702\n48.66952896\n40.47078228\n39.6121916\n39.50574638\n48.17654352\n48.95953151\n49.07225788\n39.08405998\n39.28145727\n38.69261657\n38.52709976\n39.28604052\n22.56325007\n14.87777948\n14.9006697\n14.90212069\n15.56083466\n22.09256573\n34.60395107\n41.86011079\n41.8819014\n34.42387945\n41.94560434\n43.39106926\n43.35713248\n34.62061692\n34.45751051\n34.41546186\n41.82728723\n41.80906121\n41.80858425\n34.29733814\n37.46142263\n38.47488039\n38.46450733\n39.20051575\n22.47488471\n14.78890626\n14.80999668\n14.82082467\n14.9717012\n21.51919304\n34.31142655\n41.78611035\n41.80120638\n34.34024881\n41.86215661\n42.60287319\n42.1473627\n34.65022926\n34.72612984\n34.8136294\n42.96748913\n43.14804797\n44.27194946\n35.75687787\n37.87769461\n38.63192686\n38.48867088\n39.22637678\n22.50454208\n14.81225238\n14.8239613\n14.82646417\n14.96197745\n21.50754269\n34.29602108\n41.76907028\n41.78597024\n34.33238232\n41.86852324\n42.6247901\n42.53003506\n35.32012024\n35.28266704\n35.00034102\n43.52847941\n44.31390109\n44.27764499\n35.26686553\n37.7626718\n38.61840535\n38.48104882\n39.22723211\n22.51050509\n14.82084506\n14.83918831\n14.84946198\n14.99715867\n21.54194472\n34.32972753\n41.82087081\n41.83611146\n34.36966656\n41.89184597\n42.66007527\n42.59462381\n34.67331639\n34.5562608\n34.99785201\n44.19057564\n45.87977497\n46.96899673\n37.96641893\n39.31626301\n38.79098694\n38.53224405\n39.2807619\n22.55389652\n14.86200189\n14.87631923\n14.88274207\n15.55837697\n22.10562221\n34.63603271\n41.87984467\n41.92063833\n34.47814485\n42.45316495\n44.86205553\n46.71000539\n39.2185377\n38.78337448\n37.70995562\n46.41099903\n48.24542968\n49.27771047\n39.5404281\n40.77179212\n39.26953247\n38.58505086\n39.32420115\n22.58748393\n14.89428459\n14.92587623\n14.92481198\n15.06074612\n21.58665541\n34.37721027\n41.88148925\n41.94129159\n34.48899151\n42.5990795\n45.35108605\n47.39939701\n39.40048449\n38.8529749\n38.46412617\n47.25068566\n48.57717434\n50.08628189\n40.43865167\n40.12141541\n39.4437751\n38.56972577\n39.32137252\n22.59103912\n14.90215578\n14.92497479\n14.91819959\n15.06251166\n21.61134428\n34.40962585\n41.90679899\n42.06916209\n35.06100506\n44.31489763\n47.61189357\n49.07872699\n40.81981035\n40.36148792\n40.46252637\n49.97837845\n51.58671508\n52.65614089\n42.6285816\n42.23857404\n41.48590549\n39.57848889\n39.44938656\n22.65355238\n14.94552964\n14.95840613\n14.97124074\n15.7368083\n22.25854404\n34.72273391\n41.97967087\n42.53731382\n37.25200343\n48.09518854\n51.93244339\n54.26589224\n45.56126261\n44.93073073\n45.37738984\n55.36532682\n56.94500363\n57.46419754\n46.03854786\n44.98898577\n43.31447172\n40.85775169\n39.61075181\n22.64233403\n14.92839026\n14.94778908\n14.93879876\n15.08145229\n21.62236718\n34.412956\n41.88243268\n41.87649371\n34.39923198\n41.90580111\n42.63226076\n42.2153566\n34.6210719\n34.6387526\n34.91145422\n43.72890099\n43.64942235\n44.01531499\n35.45496346\n36.69791766\n38.62088986\n38.48377054\n39.22343872\n22.50227105\n14.81796526\n14.8261643\n14.82379284\n14.96823699\n20.45292432\n34.30224307\n41.79035064\n41.82234882\n34.35855244\n41.87555696\n42.61424853\n42.20925183\n34.92959364\n35.12531045\n35.64261873\n45.01959106\n46.05813022\n46.77637591\n38.02890348\n38.04815921\n38.69507705\n38.52750917\n39.26468598\n22.53983395\n14.85957629\n14.88503565\n14.8906609\n15.03467183\n20.51014226\n34.37404257\n41.86699184\n41.9172258\n34.48661275\n42.94960671\n46.37142698\n47.79911672\n39.91993343\n39.68127266\n39.17214541\n47.11159723\n48.69220338\n50.26781689\n40.35691808\n40.27264134\n39.61390345\n38.60880686\n39.31534605\n22.57838499\n14.87318386\n14.88960398\n14.89444216\n15.57617989\n21.05515486\n34.63013045\n41.89050093\n41.92171514\n34.42949781\n42.1270228\n45.78368224\n47.60444534\n39.28013684\n38.41986532\n38.15392454\n47.20973214\n48.61522577\n50.03478874\n40.83112207\n40.86100223\n39.76562485\n38.79815211\n39.34009611\n22.61196622\n14.91782974\n14.94787988\n14.94971737\n15.10029836\n20.57929694\n34.44419365\n41.95680576\n42.00978893\n34.93388285\n44.46198031\n47.63459486\n49.24726604\n41.02885604\n39.67551293\n39.20120309\n49.14531151\n50.4216409\n52.01386193\n43.59367249\n43.92435107\n43.03910301\n41.45431662\n40.14878449\n22.70108295\n15.00622384\n15.02940189\n15.04662037\n15.23344427\n20.75209441\n34.64676316\n46.66221718\n49.48749363\n43.26889451\n53.2576026\n58.07476402\n60.84467406\n51.61943718\n49.22888565\n48.84227803\n58.62642094\n58.06708105\n58.96235356\n48.55270736\n47.77045173\n46.31259751\n44.28618645\n42.88018437\n23.79016669\n15.04335918\n15.05641242\n15.0698638\n15.88850636\n21.36988095\n35.12905582\n47.50057986\n52.32379438\n45.92200366\n54.9508938\n59.18669024\n62.73101591\n54.95378434\n51.77343832\n43.66548863\n51.5003948\n54.65314485\n55.38784033\n43.71748819\n43.61582547\n43.05556234\n40.41138028\n39.64836233\n22.70131909\n14.98954505\n15.00616298\n15.01734059\n15.1820865\n20.6798423\n34.59018282\n43.29918051\n45.3736375\n38.65333342\n49.21108778\n54.34672343\n55.62188035\n45.92361065\n39.27827569\n35.43025104\n43.97449566\n44.47896322\n47.01878609\n39.08361135\n39.48540152\n40.9453583\n39.62448432\n39.54895498\n22.6902418\n14.99825911\n15.02202239\n15.03323367\n15.19890743\n20.72661498\n34.58228028\n42.27112907\n43.93597442\n35.18775772\n45.7424238\n48.53516165\n50.80072835\n43.29309505\n41.90923285\n41.51465661\n51.3952246\n51.67465039\n48.94842955\n39.49209202\n41.15514995\n40.49366827\n39.49395206\n39.55342826\n22.68303774\n14.98436001\n15.00019901\n15.00399771\n15.1725137\n20.674422\n34.56034789\n42.15012486\n43.25854499\n34.64331513\n45.22806289\n48.14733406\n50.18080081\n42.30726512\n40.75364301\n39.38519754\n46.17520979\n45.696475\n44.96175562\n35.94750846\n37.83925797\n38.9461285\n38.60035457\n39.34543323\n22.6157171\n14.93327395\n14.96109879\n14.96886402\n15.69308069\n21.15868179\n34.68921947\n41.90439382\n41.91492084\n34.42166986\n41.919056\n42.64039774\n42.4036828\n34.46151011\n34.48298669\n34.51327982\n43.02355639\n44.75589585\n46.43358008\n36.65004973\n37.50586156\n38.66849453\n38.56679041\n39.29881335\n22.57594782\n14.88919411\n14.90967842\n14.91881445\n15.07945529\n20.57650108\n34.43271632\n41.91671672\n41.94690534\n34.47549685\n41.97903684\n43.82686502\n45.51779219\n36.76090343\n34.69340964\n34.48210986\n42.93672035\n43.66786749\n43.93598061\n35.6179139\n37.26336091\n38.70218457\n38.56471717\n39.31469287\n22.59313286\n14.91123005\n14.93757647\n14.94832884\n15.11286965\n20.58678943\n34.43082218\n41.95057759\n42.3096929\n34.79441496\n43.08203643\n45.93801014\n47.04119395\n38.70989058\n38.16437887\n38.21385974\n46.8863866\n48.3362966\n49.99140242\n41.41089299\n40.90891999\n41.22857147\n39.1936093\n39.31266774\n22.57658862\n14.88064408\n14.90458039\n14.90730607\n15.58546957\n21.07319817\n34.656696\n41.9406168\n43.01869309\n37.13833411\n45.47351254\n47.86274331\n48.17967344\n39.79081791\n40.04145715\n40.82288809\n50.52433333\n52.39651483\n53.38713334\n43.21402842\n42.62627961\n43.64340684\n41.85259696\n40.26296361\n22.66656148\n14.96489221\n14.97099604\n14.97582586\n15.1413263\n20.60894697\n34.43573594\n41.9475309\n42.43857565\n34.86247326\n42.954225\n46.39554863\n47.86541027\n40.23817165\n39.73432609\n39.64203645\n48.2855363\n48.21566277\n49.83553941\n41.34374246\n39.59676601\n40.86686501\n39.15023494\n39.31745092\n22.58501785\n14.87860206\n14.89711849\n14.90192901\n15.04447226\n20.53419022\n34.37741621\n41.8948585\n42.12074153\n34.47155504\n43.19943124\n45.3368164\n46.98625039\n39.71627887\n38.86242713\n38.60478637\n47.42903883\n47.87913618\n48.37230814\n39.51168782\n38.10214306\n39.41051231\n38.63125762\n39.25407022\n22.53711786\n14.8752767\n14.90381608\n14.90634262\n15.03502645\n20.51455482\n34.38628858\n41.92099324\n43.0498065\n37.61017994\n47.51651402\n51.86942222\n53.65278666\n43.7945956\n41.72922765\n42.37033618\n52.07138946\n52.9297334\n53.46921466\n43.90906649\n42.75739095\n42.40699354\n40.53547558\n40.50697079\n22.68270386\n14.98012294\n15.0025014\n15.01094374\n15.7780226\n21.29357379\n34.81260365\n43.43327554\n46.07129981\n39.42407846\n48.16703185\n51.55734391\n53.98179038\n45.76276799\n44.7525681\n45.03311435\n55.04944767\n56.28107677\n57.39457256\n46.78082813\n45.88698046\n45.7780122\n43.76992845\n43.29828973\n24.01779259\n15.03611838\n15.05481955\n15.06960652\n15.25684148\n20.762594\n36.05564646\n46.87512099\n48.51841876\n42.82208515\n53.29119024\n58.15894288\n55.33959924\n41.08409267\n41.29914578\n40.84996811\n49.57228399\n50.56435364\n51.35990856\n42.5164695\n42.57510839\n42.65753777\n39.7557872\n39.33840779\n22.57737209\n14.88656723\n14.90657815\n14.90800618\n15.05973183\n20.53336976\n34.36953773\n41.8393761\n41.82972731\n34.34491255\n41.84562026\n42.56313911\n41.90421311\n34.37494899\n34.37687003\n34.37357866\n41.817557\n41.8145242\n41.96728575\n34.46608977\n35.49556166\n38.58598601\n38.47042341\n39.22714795\n22.50756268\n14.82944501\n14.85734868\n14.87220231\n15.55306665\n21.032254\n34.58312973\n41.83071612\n41.82822282\n34.34214223\n41.84617489\n42.5758435\n41.96215459\n34.43816845\n34.47559444\n34.56211895\n43.51200153\n45.36342191\n46.87545786\n37.82088052\n36.8414086\n38.67089613\n38.53032627\n39.27310927\n22.55041939\n14.85964993\n14.87494403\n14.88143417\n15.03318273\n20.51140356\n34.3597209\n41.84537078\n41.91672557\n34.55928609\n43.16459207\n46.785011\n47.79881638\n40.13549835\n39.9695838\n40.16028748\n49.53452131\n50.3536465\n51.84739054\n43.37017586\n41.01384333\n41.85923112\n39.48635302\n39.36152893\n22.62452243\n14.91753198\n14.93958575\n14.94017044\n15.10429239\n20.59009965\n34.43562827\n41.9609303\n42.93705896\n35.43971461\n46.18158757\n49.78922036\n51.30684624\n43.17729218\n42.78072949\n41.79844764\n49.97111501\n49.35835428\n48.76581163\n39.75308077\n40.33628257\n41.52905011\n40.01515045\n40.14464172\n22.69762015\n15.00585015\n15.02067597\n15.02719124\n15.1999972\n20.73582038\n34.57656924\n42.45947668\n43.09085905\n35.35279461\n45.18019118\n49.2477049\n52.52757815\n44.35220094\n42.80790494\n41.45340213\n50.70451654\n49.5574561\n49.4072816\n39.03749421\n37.63876402\n39.12135814\n38.56343203\n39.32212144\n22.58819252\n14.89274641\n14.90949507\n14.90621101\n15.56519823\n21.03800338\n34.62180748\n41.88204043\n41.92205339\n34.43432101\n42.02929483\n43.78906774\n43.53713913\n34.87211196\n34.46197344\n34.44906267\n42.13187766\n42.76502466\n43.48513607\n35.16532419\n35.6438864\n38.52319425\n38.49239389\n39.2347375\n22.5122888\n14.8231566\n14.84535227\n14.8545587\n15.00106133\n20.48479321\n34.3313262\n41.82187337\n41.81881271\n34.34356682\n41.85111618\n42.56781813\n41.91101088\n34.39258294\n34.3879984\n34.37110986\n41.82390363\n41.96925628\n42.87123201\n34.97350884\n35.62559795\n38.61517699\n38.47316021\n39.19509608\n22.46416967\n14.78476902\n14.80971676\n14.81911247\n14.97272825\n20.45168745\n34.30001853\n41.81547881\n41.88237093\n34.4339679\n42.01887654\n43.74695242\n45.57920785\n37.15685749\n36.02489048\n36.22087189\n45.34009839\n45.64202776\n46.44849305\n38.24436794\n37.38426779\n38.94226696\n38.54545298\n39.29400091\n22.57873145\n14.89609252\n14.92626394\n14.92681283\n15.62791865\n21.10805635\n34.67991\n41.92656039\n42.30677005\n34.86286669\n43.27875592\n45.80197205\n46.57667688\n38.59261498\n37.60147984\n37.20209403\n46.57592171\n48.2022503\n49.002487\n39.46608983\n38.32386521\n39.29670754\n38.59325969\n39.2745608\n22.54334399\n14.8688206\n14.90015163\n14.90477755\n15.05386463\n20.53307463\n34.38742816\n41.88918681\n42.15329761\n35.46928311\n45.22340885\n48.23942413\n49.67025936\n43.22623676\n43.55683498\n44.07943554\n52.89530367\n52.75325717\n54.29707111\n44.84856323\n42.43497869\n44.24790804\n42.08117233\n40.51789109\n22.69223783\n14.99290416\n15.01631811\n15.0291836\n15.20322766\n20.7492745\n34.59195926\n42.96785131\n44.58345051\n34.72887314\n43.81014722\n48.14800339\n51.24768169\n43.30882168\n41.93461185\n41.49856822\n50.68118029\n52.68160375\n54.00969516\n44.70553942\n43.84684677\n43.9993117\n41.3110453\n40.47068109\n22.68279644\n14.98182458\n14.99023274\n14.98711807\n15.16177255\n20.65364625\n34.53708912\n43.93422903\n47.49909329\n40.89570442\n49.96969674\n53.39079386\n55.10093774\n46.87701641\n45.58697963\n45.71695485\n55.32472661\n56.77122921\n58.35335557\n48.62522588\n47.23822019\n47.10614691\n45.20025195\n44.06738314\n24.40889497\n15.04108496\n15.05299107\n15.05768598\n15.88549289\n21.38833702\n35.39734766\n46.03082995\n48.04706577\n42.00722606\n51.5565269\n55.60822705\n57.93368365\n51.39866739\n49.88200809\n48.55627256\n57.59125361\n58.63140599\n59.0956112\n48.51041273\n47.16503999\n47.39045098\n45.60029536\n44.41836396\n24.89983777\n15.04502925\n15.07088737\n15.08174333\n15.26766963\n21.00974773\n35.43643122\n46.12632648\n47.73856014\n40.12730904\n48.59793631\n53.95911881\n57.29699913\n49.12236946\n48.82653385\n48.0379026\n59.02343205\n61.53245104\n63.15515095\n53.22149173\n52.49540282\n53.176778\n49.19913931\n45.9419996\n24.29691412\n15.04598221\n15.04646702\n15.05009324\n15.20763831\n20.74708936\n34.57294052\n42.48462945\n43.30370456\n35.14868908\n43.12985392\n44.84195006\n47.680618\n39.4961271\n37.98492071\n38.39822082\n47.43357376\n48.94802062\n50.95919812\n41.6193282\n40.99306711\n41.04014939\n40.32449762\n39.82648781\n22.68550347\n14.99914516\n15.01990902\n15.02924727\n15.79410815\n21.33712778\n34.84014372\n42.68108755\n43.51931994\n36.97356614\n46.44202264\n49.94216049\n51.91100147\n43.31345662\n41.93770481\n41.71704947\n50.52316964\n51.59298001\n53.05624475\n43.30369877\n42.92426743\n43.48031878\n41.8551611\n40.45435868\n22.68190706\n14.97808394\n14.9880956\n14.98914957\n15.15069693\n20.63331814\n34.50280881\n42.90068855\n45.88506342\n39.31512256\n49.0891587\n52.74698449\n53.33260109\n44.7695013\n44.0198463\n43.09153283\n50.64212688\n50.38272726\n51.16064614\n43.10712095\n42.18786402\n43.84209274\n42.59901112\n40.66400116\n22.6902508\n14.98628937\n15.01451692\n15.02447541\n15.19888439\n20.7281536\n34.54584713\n42.04868234\n42.77330265\n34.50331842\n43.34654148\n45.32364199\n48.51101328\n42.66289233\n43.60270492\n44.51275409\n54.81257781\n55.79582988\n57.39895107\n47.85788477\n47.00739763\n45.89752357\n43.68791328\n42.83253883\n22.72480865\n15.03564624\n15.05894681\n15.06900363\n15.22334535\n20.7479639\n34.55446295\n42.0860677\n42.72277111\n35.33670347\n45.98264544\n50.51337069\n51.24932231\n42.16702159\n41.51703257\n41.85064848\n51.48598232\n52.86696853\n55.1845878\n45.60942217\n44.20256384\n43.80158773\n40.78509538\n39.63048045\n22.63906442\n14.93200679\n14.9552358\n14.96248059\n15.68060503\n21.14234333\n34.70212167\n42.04140068\n43.56382809\n37.61865009\n47.17321282\n50.50095111\n51.73074354\n43.28853487\n42.33356707\n42.19965163\n51.37862809\n52.76868003\n53.9030551\n44.85458271\n44.26574642\n44.75181117\n42.67797923\n41.29996668\n22.70915363\n15.01551615\n15.02943286\n15.02590222\n15.19013267\n20.70375241\n34.53135247\n42.85790952\n45.15270664\n38.41583704\n47.35449455\n50.65722357\n52.75520106\n43.93761503\n42.57463655\n42.14925352\n51.66990204\n53.80844266\n55.59574765\n46.4171663\n45.95870376\n45.55518963\n43.24273965\n41.65198944\n22.70164528\n15.00535159\n15.0311265\n15.03895811\n15.20379883\n20.71279881\n34.56245562\n42.98804567\n45.27321877\n38.23538059\n47.59627028\n51.38743004\n54.00085201\n46.10470383\n45.18403636\n44.95728892\n54.59451482\n56.2125777\n58.11011162\n48.69654544\n47.75433435\n47.622883\n45.2571568\n43.9822452\n24.49618165\n15.05646434\n15.07513639\n15.07940191\n15.90293289\n21.3937638\n34.90853887\n43.25882539\n43.51222056\n37.47726511\n47.98677589\n52.63879563\n56.07744207\n49.33304235\n46.98211399\n47.20763606\n58.53103227\n61.40628263\n57.97024757\n45.75525926\n46.40057833\n46.5891728\n43.915859\n41.53745669\n22.71553722\n15.01238363\n15.02272925\n15.02154782\n15.18145796\n20.63626283\n34.46021416\n41.94523463\n42.27388359\n34.98143907\n43.86474524\n46.93257841\n47.66703055\n40.39274515\n40.30524413\n40.36411995\n48.9344463\n49.60596272\n51.21839037\n42.71187886\n41.66290583\n43.33295115\n41.07410235\n39.53970754\n22.62508684\n14.92032007\n14.9311551\n14.93806325\n15.10055832\n20.5849833\n34.44113472\n41.96081138\n43.92680295\n38.17418735\n49.66855878\n52.59994093\n54.77517173\n47.59079329\n46.43475418\n45.8074552\n55.9166775\n56.11507038\n55.95181997\n47.24173534\n47.35920245\n47.08167326\n44.78501937\n44.29773146\n25.03970588\n15.04782428\n15.07341562\n15.06894428\n15.23853666\n20.80611426\n34.63357971\n45.7052199\n49.25565018\n45.46571184\n57.98244922\n64.75646565\n65.98765567\n58.09750123\n57.54107522\n57.39120562\n66.76416339\n67.52466955\n67.63328105\n60.06098406\n60.00931361\n61.58139676\n58.58760978\n55.39853055\n32.72903129\n15.13611654\n15.15227934\n15.14588277\n15.32606529\n26.02088259\n43.31408433\n59.34551882\n62.73630678\n52.20146989\n64.27673716\n67.94431878\n68.04048783\n60.36108722\n51.88078251\n46.57341429\n57.39839973\n61.08394573\n64.79437301\n56.19725281\n55.55048693\n53.73042058\n50.41132156\n48.93902852\n27.94353849\n15.10665906\n15.12712601\n15.13687541\n15.32391078\n23.70779734\n39.1532221\n51.50015279\n54.62676274\n48.64633697\n58.87116387\n64.03556696\n66.83698852\n59.07225274\n58.78074228\n59.19784767\n69.03549612\n69.65899539\n69.45873068\n61.1420418\n60.28272709\n59.87859753\n56.51672516\n54.69441075\n33.12353739\n15.13715059\n15.14914447\n15.1560589\n15.33835164\n25.73254839\n43.007622\n58.04153023\n59.55979073\n50.14917931\n52.10055831\n53.27442284\n59.1394365\n54.54181948\n50.37070094\n45.46586236\n52.90470333\n57.42850561\n61.71414101\n52.91387016\n52.00461349\n51.01949303\n48.79744101\n46.65946242\n24.60539596\n15.07765135\n15.09995903\n15.0985196\n15.90047535\n21.46051267\n36.12163674\n50.91446465\n54.39562913\n48.58634258\n58.73436623\n62.78695542\n64.58472941\n54.24772605\n53.21478355\n52.53699563\n61.6296943\n62.36713523\n63.22564964\n53.58334156\n53.71026218\n52.13052697\n47.8561874\n45.87128105\n25.48109212\n15.05888346\n15.07320699\n15.07726711\n15.24069391\n20.75635265\n34.58248917\n45.22238175\n46.6338172\n38.97049415\n46.94995239\n49.52341594\n49.88152485\n41.79889681\n40.940917\n40.4629344\n48.99554956\n48.92818369\n50.69410738\n42.71624352\n41.41471227\n43.1307687\n41.10148053\n39.69966483\n22.62993044\n14.92304483\n14.94252674\n14.94721927\n15.10063036\n20.57296094\n34.43046981\n41.9455275\n42.52869329\n34.76043248\n43.90447616\n45.84149573\n46.62793423\n38.8458088\n38.36296643\n38.59415199\n48.64397899\n48.36472423\n48.21728857\n39.7674617\n39.43929962\n39.99397155\n39.31969304\n39.6606951\n22.66508592\n14.97232923\n14.99692281\n15.00557484\n15.18998838\n20.72018773\n34.5398484\n42.32508402\n42.83210022\n34.65279239\n42.96107593\n46.45531999\n48.60217721\n40.90653241\n39.85079663\n38.58183354\n48.7377191\n50.26642627\n50.82480949\n42.07907221\n42.07832503\n42.59545502\n40.63871694\n40.03877131\n22.69078877\n15.00348767\n15.02954775\n15.03758801\n15.81177157\n21.3374504\n34.87669366\n42.82519336\n45.57157372\n40.16242838\n49.37188429\n53.48515057\n56.77925827\n47.60085621\n46.95587261\n46.7585421\n56.40550829\n57.93134796\n58.70067238\n48.23730094\n46.25432106\n45.56249073\n44.07563053\n43.53168607\n22.98477596\n15.0121121\n15.0291418\n15.02964551\n15.19785547\n20.71426797\n34.52812421\n42.56785263\n43.92777412\n36.5322996\n44.94141347\n48.30934557\n50.65581964\n43.45287171\n42.37670698\n41.99771651\n51.19220463\n52.48354169\n54.35017663\n44.95869569\n43.76596222\n43.79281108\n40.43407489\n39.60610732\n22.65678973\n14.93409761\n14.95913214\n14.97696018\n15.13918011\n20.60988508\n34.46758611\n42.50925135\n46.22014575\n40.31235338\n50.24913793\n55.04247499\n58.09435706\n49.88744094\n48.87018023\n50.34724946\n61.67912934\n65.37417044\n67.03787676\n57.97619325\n56.91782217\n55.97400229\n53.29884902\n52.20125703\n30.72141192\n15.12170129\n15.16367055\n15.18079614\n16.06526813\n26.86935882\n41.36921493\n54.19149357\n57.33132042\n50.36600182\n59.41917167\n64.50824475\n66.25570435\n57.29925828\n50.74868048\n47.83613437\n56.77182063\n57.38538019\n59.31697786\n50.31311655\n50.48748591\n47.78528053\n43.61226227\n41.46131505\n22.69228527\n14.99953823\n15.02677767\n15.03091338\n15.20066705\n21.7132517\n34.5219747\n43.19333868\n46.44629162\n39.43798683\n48.68635997\n51.7215167\n52.26571034\n44.30563349\n44.30879497\n45.30751365\n55.64171954\n56.08749624\n58.03879117\n49.193842\n47.25569517\n48.95288054\n46.20037458\n44.49470617\n24.27332523\n15.05974929\n15.08165334\n15.0868793\n15.27399515\n21.87729889\n35.07273524\n48.0526573\n51.40660108\n44.76989208\n57.74532822\n62.42084994\n65.97820237\n58.17143418\n57.78146337\n58.01451925\n66.83317724\n66.41127492\n65.54043848\n53.66183762\n50.0873189\n46.89514756\n44.73407089\n44.78232291\n25.24272194\n15.06196612\n15.07413523\n15.08157096\n15.26624001\n21.86988732\n35.26394754\n48.18607315\n53.29300454\n45.43645648\n53.19342664\n56.85878237\n58.13671664\n50.88951083\n48.65280234\n46.54440803\n56.30502108\n57.12606315\n58.31097951\n49.31876446\n49.12464127\n48.24164945\n45.37323611\n42.86457411\n22.73629554\n15.0442044\n15.0634377\n15.0741854\n15.86694615\n22.46378135\n34.94483014\n48.04509785\n51.5365808\n46.71798556\n58.10509064\n65.25692237\n67.46793358\n60.01190766\n59.6470889\n59.65360161\n69.04615753\n69.032493\n68.70553098\n60.73985671\n61.01305633\n62.44468015\n59.38597927\n56.22194074\n34.13899982\n15.15909565\n15.17700697\n15.18235456\n15.36938652\n26.95943481\n41.10645322\n53.70903995\n56.39912741\n49.97392063\n59.99625629\n66.42397901\n68.60298193\n60.86453202\n61.06100506\n61.30594503\n70.39555915\n70.04841075\n69.36246175\n60.53924328\n59.24614409\n56.80790289\n53.81113707\n52.36083933\n31.17602872\n15.13973268\n15.16243026\n15.17565015\n15.38566654\n29.12925722\n43.05200258\n54.51841374\n55.30953814\n44.502627\n50.42212399\n53.93513257\n56.64899324\n48.16176625\n48.06827379\n47.74212483\n55.90116756\n56.46088525\n56.61240939\n46.33866395\n45.65028282\n45.39894702\n43.21683736\n41.49065417\n22.69419594\n14.99246827\n15.01283877\n15.03240135\n15.82324396\n22.39915168\n34.84737723\n43.10320234\n45.97880106\n39.7610361\n49.15036406\n52.09261362\n54.37962054\n45.78852557\n43.96645136\n43.55469206\n53.3087639\n54.93475418\n56.61439181\n46.41488474\n45.44904141\n45.27419852\n43.02992085\n41.62099442\n22.68900002\n14.99321633\n15.01723175\n15.00970303\n15.16975232\n21.70173212\n34.52258101\n42.55556898\n45.46760405\n40.2877644\n49.43226641\n52.26244287\n53.71800503\n46.08199802\n45.75607255\n45.71118483\n54.18633216\n54.31870365\n56.38543452\n48.18564278\n45.5860793\n45.20580666\n43.64610181\n41.38030013\n22.67121346\n14.96298797\n14.99932134\n15.01411272\n15.19279806\n21.76660015\n34.53300402\n43.58890905\n46.52848448\n37.08703449\n47.74514368\n50.44677879\n50.69809574\n41.33313408\n38.90642956\n38.47773961\n49.55472762\n52.2933513\n54.16982423\n45.84640069\n47.31910552\n47.45394333\n45.93096551\n46.29378146\n25.32150941\n15.07554491\n15.09337786\n15.09138602\n15.25913871\n21.84159502\n35.05501102\n49.51222656\n51.75211857\n43.90751562\n53.73936763\n58.81477133\n62.95291531\n55.91576989\n55.36194169\n53.89327812\n61.64366451\n59.66522057\n60.5058394\n52.72130961\n51.34970663\n47.79366736\n45.30983494\n44.00809697\n23.74271602\n15.02728918\n15.03587312\n15.03287624\n15.79569034\n22.36818565\n34.79531862\n42.30300801\n43.67783173\n36.82611979\n45.53080686\n48.34825766\n49.58019598\n41.40889983\n40.53990937\n40.42850587\n49.42053813\n50.40155836\n51.64759961\n42.10592856\n42.19591008\n41.24194067\n39.3651954\n39.39059487\n22.62108134\n14.91731308\n14.94841317\n14.96903706\n15.13724608\n21.66549852\n34.46971776\n42.08714522\n42.65921618\n35.74016714\n44.59336035\n47.38574391\n49.52100449\n41.7467289\n39.92885562\n39.87780115\n49.27728643\n49.4260042\n50.12058312\n41.17084755\n42.26972298\n42.18420472\n39.83755116\n39.45403351\n22.65151829\n14.96462766\n14.99251721\n15.00522367\n15.1736254\n21.7028065\n34.49721464\n42.10275338\n42.93882603\n36.17149414\n45.90156005\n49.67147631\n52.27288829\n43.63700049\n41.25988331\n39.81120912\n50.13402692\n52.08177846\n53.69629267\n44.59209981\n45.08189966\n41.60539788\n39.44962408\n39.47362386\n22.67293097\n14.98265867\n15.01073061\n15.018656\n15.78603696\n22.38105506\n34.8159474\n42.38906859\n43.64302118\n36.98828677\n46.22077225\n50.40399751\n52.73409233\n43.79566412\n42.44171856\n41.79582241\n51.23167218\n52.66913589\n54.90991625\n45.07541408\n44.84248969\n43.4526245\n40.4393773\n39.82012435\n22.68167313\n14.97597208\n15.00246207\n15.01272915\n15.17738893\n21.71425758\n34.50770416\n42.34483267\n46.41711676\n40.70767585\n49.96949351\n53.84502515\n55.51828133\n48.22275926\n47.59769118\n47.07484044\n55.76376755\n56.10326966\n57.69971345\n49.20698887\n48.58510486\n49.02061736\n46.74287084\n44.52737333\n23.1372332\n15.03628963\n15.04847746\n15.05221375\n15.21774301\n22.84251381\n34.56691794\n42.44753408\n45.86137446\n38.23119531\n48.53000886\n50.85659898\n53.41819478\n45.75887749\n45.12659081\n45.22396709\n55.47941128\n56.6931684\n56.5937433\n45.53498423\n44.72840647\n42.61592313\n39.41951366\n39.41476417\n22.68278938\n14.99702616\n14.99669606\n14.99416532\n15.1643272\n22.76684182\n34.51236496\n42.1688543\n43.05447354\n35.25201059\n43.69975613\n45.68920131\n46.91391216\n38.61067514\n38.03055811\n38.09238882\n47.04074541\n47.94204439\n49.45557695\n40.55434144\n40.81796732\n40.37476866\n39.80645113\n40.65721358\n22.88200837\n15.0555162\n15.09457418\n15.12559783\n16.03476775\n29.58216556\n42.23539258\n55.2659685\n58.83104149\n53.14775098\n62.55150717\n67.08824499\n67.70804415\n59.83537119\n59.02786775\n57.61134583\n65.23312644\n66.03766798\n65.77390093\n56.61269746\n56.61576195\n55.86009828\n54.54129522\n52.52773109\n30.61363088\n15.11868411\n15.13822303\n15.13912518\n15.31539823\n26.77081746\n41.42248605\n55.80088674\n58.19436611\n51.98358832\n61.23691993\n64.42219765\n65.19543144\n56.29615453\n54.47768675\n53.68481294\n64.54570847\n68.29171762\n68.83920221\n60.05410155\n60.57972267\n59.52579158\n56.50371503\n54.17176542\n32.14389131\n15.13271028\n15.15069369\n15.1588897\n15.3475057\n27.44180404\n41.10138593\n54.0830475\n50.76648873\n40.81806697\n47.97632254\n50.21502211\n54.00794858\n46.00055107\n45.82125205\n45.80992553\n55.0747226\n57.25965613\n58.36614845\n46.2737551\n45.5078612\n44.64050463\n42.35363713\n41.78441272\n22.69824878\n15.00017188\n15.01901519\n15.01878451\n15.78372542\n23.41550175\n34.77968403\n42.27805795\n43.28170807\n35.28592999\n43.53656966\n46.87075821\n48.5469191\n39.74056063\n38.0268852\n37.05513778\n45.56521258\n47.12783576\n49.28708684\n40.15503795\n40.66656228\n40.31751591\n39.18844411\n39.35016865\n22.63275308\n14.94176724\n14.9676085\n14.97479563\n15.13083916\n22.72691548\n34.44128488\n41.94793207\n42.31231637\n35.28387719\n45.39455528\n48.60278925\n49.17425391\n41.56064003\n41.21878875\n41.3144579\n50.05998366\n50.32744234\n52.61766871\n44.46857017\n43.78789417\n44.36374751\n42.91809671\n41.84312418\n22.70783416\n15.01474492\n15.0364357\n15.04374177\n15.21597461\n22.86221732\n34.56771258\n45.15134371\n48.30102985\n40.43039974\n51.26871203\n53.66925647\n54.42222213\n45.55109601\n43.17293035\n42.92306051\n52.24003492\n52.71134974\n52.93244205\n43.44768858\n44.83921958\n42.47010457\n40.07128172\n40.07705132\n22.69050194\n15.00184761\n15.01891835\n15.0166859\n15.18451814\n22.78072754\n34.51631819\n42.94573525\n45.99741726\n39.09393244\n48.08546697\n50.81057287\n52.06360078\n44.08811278\n43.00276283\n41.86559869\n50.59722685\n51.78047555\n53.05273689\n43.61881108\n45.8373446\n44.56835455\n42.39308067\n41.92271178\n22.79698027\n15.03517511\n15.0510151\n15.06050493\n15.86229306\n23.48112435\n34.89260153\n43.79097924\n44.57102328\n36.82935186\n45.89476098\n49.59726607\n51.55722598\n43.05857188\n40.40524868\n38.17615946\n47.73757434\n49.5429679\n51.5604417\n42.57887841\n44.93926309\n42.76077238\n40.20497816\n39.63361452\n22.68319468\n15.00155042\n15.02431614\n15.02966512\n15.19351973\n22.78484843\n34.51479885\n42.07185994\n43.93987624\n37.91812227\n47.82999431\n52.53650905\n55.62843091\n47.89884078\n46.41776301\n45.4483459\n54.60509472\n55.74506437\n56.86324494\n46.79086819\n48.20528985\n46.00583021\n43.37766995\n41.81096143\n22.70867142\n15.01334655\n15.02958071\n15.03260268\n15.19619692\n22.82885607\n34.52541982\n42.53130061\n45.68613065\n39.60591153\n49.26371198\n53.31548583\n55.72427461\n47.14620442\n44.60980614\n43.5248461\n52.64330312\n54.50301869\n56.23923395\n46.83809682\n48.34462586\n45.92349572\n43.77862352\n42.73671248\n22.7271883\n15.02846062\n15.04357102\n15.05152434\n15.8434984\n23.50360333\n34.89166138\n43.7220359\n46.23769693\n40.53045715\n50.4124642\n55.50682713\n59.07572724\n50.53608885\n48.49522221\n47.74212176\n56.97522766\n59.21918668\n61.2587297\n51.0513192\n52.58068408\n49.699046\n46.72600561\n45.18695352\n24.76751267\n15.07139932\n15.08965524\n15.09847821\n15.27645237\n22.94559116\n35.69913841\n47.17996156\n48.15570051\n40.41479315\n49.46988929\n53.61341122\n52.12315233\n44.04704171\n43.69148817\n41.84862979\n50.21899062\n50.28404273\n51.8379218\n43.59168832\n44.04738766\n43.97660246\n42.76988\n41.70724918\n22.69789057\n14.99904341\n15.01705529\n15.02756815\n15.20105789\n22.84040975\n35.59019566\n42.08278004\n42.85134632\n34.81551865\n45.75985432\n50.42446184\n53.22709135\n46.26462409\n45.44867732\n44.54034229\n53.72254954\n54.75569369\n55.74011376\n46.82963714\n47.94512946\n44.4244636\n41.28871154\n39.86702349\n22.68939544\n15.00467628\n15.0278296\n15.04070951\n15.22398085\n22.87912896\n35.64458437\n42.69019947\n43.33396017\n35.34497311\n44.27815478\n47.99107254\n50.90557097\n42.21444469\n40.41146486\n39.28517511\n48.78224241\n51.0383978\n53.98317166\n45.42126129\n48.15550065\n46.74694548\n44.97971019\n43.712225\n22.82608269\n15.06807527\n15.09016826\n15.09802011\n15.91456044\n23.59434606\n38.13113728\n51.22739072\n54.42898893\n48.53479259\n57.6630581\n63.23266604\n65.68494916\n57.58743227\n56.56349331\n56.38323703\n65.81491853\n66.51472629\n66.50779571\n57.92964704\n60.20391093\n58.93316808\n56.32030148\n47.10720477\n22.78342187\n15.03975453\n15.05880411\n15.06934788\n15.25070927\n22.9242421\n35.69807632\n45.3662648\n47.81388106\n41.10153352\n50.78515391\n54.66133276\n56.54841948\n48.56374961\n47.20301212\n45.47218065\n53.47867716\n54.05238174\n54.67611975\n44.62415779\n46.95973264\n43.50716279\n40.44670743\n39.61933317\n22.6678028\n14.9795591\n14.99245178\n14.99837658\n15.16322944\n22.75828418\n35.53650492\n41.97534908\n42.64694372\n35.11621265\n43.95083725\n47.72481329\n49.38689483\n41.18930244\n39.92968191\n38.93183787\n48.35238914\n50.00492197\n51.15125095\n41.85171637\n44.86676964\n40.77175397\n39.21108178\n39.44564181\n22.67111419\n14.98650589\n15.01860476\n15.03441676\n15.81907465\n23.43737204\n35.84853844\n42.04386534\n42.89510833\n35.57692478\n44.48498718\n47.87924721\n49.2921089\n40.26607142\n38.60337889\n38.87005546\n48.26840715\n48.90350374\n49.86954778\n40.80227715\n43.11170129\n40.05387775\n39.10824685\n39.34364775\n22.62103824\n14.93966942\n14.95862659\n14.95472054\n15.10613517\n22.7045555\n35.48751509\n41.91827886\n42.16964669\n35.11004431\n44.17118493\n47.21643278\n47.81960509\n40.39838196\n40.02144822\n39.26813126\n48.50473656\n48.14473316\n49.47308013\n41.17303464\n43.03191531\n40.99338464\n39.40616646\n39.39454163\n22.63194307\n14.94031428\n14.96516801\n14.97074659\n15.12812011\n22.72241497\n35.49815657\n41.95081159\n42.45718523\n35.45347465\n46.18881922\n49.3538085\n51.32708355\n43.72005019\n43.14968036\n43.46035645\n53.27610849\n54.20548931\n55.4172923\n46.29753771\n48.82586316\n45.60386656\n44.11070457\n44.41351411\n23.96976579\n15.06147137\n15.07939901\n15.08364273\n15.26725926\n22.92220828\n35.68150489\n45.44233772\n48.07486012\n41.32746475\n50.34693216\n53.96886198\n55.84494722\n46.67785648\n44.63709232\n44.51133597\n53.99741577\n55.55528642\n58.18982855\n48.8121459\n50.93315128\n46.99391661\n43.74892076\n41.34111796\n22.68001909\n14.97841165\n14.98605125\n14.97914973\n15.7015412\n23.28031639\n35.73484229\n41.90931895\n41.97543489\n34.47399703\n42.72659489\n45.15472181\n46.7644719\n38.29818145\n36.985334\n36.56072104\n45.07719224\n45.75830097\n46.52610613\n36.86413948\n39.78105484\n38.80838091\n38.53794317\n39.26294877\n22.53611189\n14.85771109\n14.88364508\n14.88395364\n15.0286214\n22.62559413\n35.40207353\n41.84193457\n41.87132994\n34.41341646\n41.93123971\n43.42180168\n43.72257294\n36.21820816\n35.48048614\n35.13491634\n43.41310206\n44.76941882\n45.90195715\n36.23231988\n39.51296478\n38.66999194\n38.49594588\n39.2384327\n22.52974152\n14.84962635\n14.87819654\n14.88795275\n15.03287845\n22.62657884\n35.41324392\n41.84538254\n41.87869929\n34.4330372\n42.27961733\n44.97993381\n46.8817243\n39.21685329\n38.61419334\n38.14966732\n46.88031918\n47.4524942\n47.6428039\n38.35669185\n41.26294399\n39.55775194\n38.72433638\n39.32082923\n22.59140256\n14.9059688\n14.93160025\n14.93296656\n15.62682916\n23.22158444\n36.76448924\n41.8838678\n41.90364036\n34.42437281\n41.93491001\n43.33001722\n43.66574354\n35.61299079\n35.03377213\n34.74719023\n42.95291577\n43.31616196\n43.68252803\n36.40611073\n39.19129003\n38.55584043\n38.53778171\n39.29228821\n22.57732811\n14.90393546\n14.93801592\n14.95225843\n15.12528107\n22.73205059\n36.58159921\n41.92131722\n41.91398344\n34.43486201\n41.92996782\n42.87108159\n42.74834894\n34.82172157\n34.49552135\n34.46220977\n42.4471492\n42.83318131\n43.69860445\n37.03167819\n39.48807759\n39.11379781\n38.66941646\n39.34104658\n22.62323398\n14.93857831\n14.96385295\n14.97462467\n15.14339373\n22.74835662\n36.59750234\n41.95079799\n41.95276975\n34.46136883\n42.01762844\n43.20357154\n43.0385195\n35.14582179\n35.59009978\n35.61272934\n43.8890193\n43.82531063\n43.96073501\n36.83063684\n39.62235569\n38.77093724\n38.57035132\n39.31068396\n22.59617015\n14.92247717\n14.95408989\n14.96761655\n15.13446675\n22.73681175\n36.59076554\n41.94273652\n41.94312469\n34.45497786\n42.04932821\n43.89607121\n46.55874453\n39.14771898\n38.19585547\n37.81544198\n47.86919741\n48.92814884\n49.20277291\n40.15462528\n41.26916722\n39.52558768\n38.64580506\n39.32693949\n22.60634781\n14.9188814\n14.9405753\n14.94476174\n15.64717308\n23.23902971\n36.78209201\n41.89968142\n41.94654791\n34.62407966\n43.58944198\n47.48375828\n49.33049293\n41.6571072\n41.61448306\n41.8747844\n52.14132411\n55.31044191\n58.12362261\n48.42062382\n49.45110522\n46.43212996\n44.76582782\n43.89891645\n23.79339379\n15.04208874\n15.04844007\n15.03530957\n15.18468517\n22.77098826\n36.54461198\n41.90961781\n41.92547325\n34.46308707\n42.33284151\n44.20503878\n45.91340841\n37.04158067\n36.70749499\n35.98898906\n43.85683087\n44.87282139\n45.93172569\n37.54019989\n39.63812476\n38.71192108\n38.52247703\n39.26595075\n22.5420055\n14.85536711\n14.87457952\n14.88196797\n15.02404484\n22.61254341\n36.45821072\n41.82338357\n41.85087154\n34.38996599\n41.90119665\n42.86400745\n43.11461606\n35.37165906\n35.1971894\n35.21659576\n43.98006358\n44.96975128\n45.41356636\n37.43195599\n39.77532255\n38.78442904\n38.52667456\n39.27729257\n22.56669807\n14.89361108\n14.9246975\n14.93593681\n15.65175495\n23.25947339\n36.8071682\n41.9349809\n42.23388787\n35.71015458\n45.54759829\n49.57809221\n51.20221996\n42.77329107\n41.85063903\n41.42585242\n49.9418024\n51.01023128\n51.75852619\n42.32020417\n43.13830215\n40.18512204\n38.96296533\n39.37440321\n22.64858327\n14.94804911\n14.96904303\n14.98077271\n15.15380248\n22.75711458\n36.61440504\n42.00532774\n43.15522025\n37.34360508\n47.17506787\n50.70531393\n51.94778369\n44.77010677\n45.47663852\n44.94388797\n54.65725486\n55.66718191\n56.32429632\n47.65035925\n48.35457913\n48.0000422\n45.53540562\n43.62934265\n22.80416193\n15.04310894\n15.0554736\n15.05132303\n15.20763394\n22.865665\n36.69922683\n42.22473686\n45.33466076\n38.81779139\n50.69705825\n53.052218\n55.25741607\n48.0965545\n46.46644669\n45.68774047\n55.52028449\n56.41197902\n57.01463077\n49.3718983\n49.71628265\n45.69694079\n43.21235059\n42.95715971\n22.96453527\n15.03155453\n15.03509689\n15.04379123\n15.20549857\n22.80465969\n36.66625103\n42.13910703\n44.87939906\n36.66382139\n48.30712648\n53.03524839\n55.62132011\n47.80279956\n46.67372603\n46.62847713\n55.94129109\n56.20911826\n56.30841428\n48.10574175\n48.1810309\n44.10568667\n42.37111234\n41.84671253\n22.72300685\n15.01982305\n15.02638376\n15.03307726\n15.80650806\n23.44717763\n36.93618878\n42.24343603\n43.96534663\n38.07540504\n47.76468421\n53.05741626\n57.6452313\n49.40713281\n46.64179182\n44.66313207\n53.14849245\n53.82281907\n54.91206209\n47.91597554\n50.06871686\n47.76775924\n45.9221771\n44.84193772\n24.806471\n15.06949969\n15.08715082\n15.09277501\n15.27152018\n22.90083083\n38.19113694\n47.83294585\n49.99542014\n42.39814946\n50.71309458\n56.81554855\n61.30920429\n53.23748975\n51.3568721\n48.1276473\n53.89592874\n53.71235392\n54.58659523\n46.32901656\n46.92556145\n44.70036172\n42.66983994\n39.59079825\n22.62580191\n14.9229881\n14.93430982\n14.93093947\n15.07181069\n22.65405998\n37.55280426\n41.84033068\n41.8295975\n34.34188848\n41.83455457\n42.56845424\n41.9420851\n34.41835995\n34.41563721\n34.39459292\n41.84584153\n42.14149229\n42.47426437\n36.59689319\n38.66719196\n38.57075973\n38.44801664\n39.19080533\n22.46209567\n14.78019467\n14.80926482\n14.81162316\n15.46850162\n23.06865839\n37.68690967\n41.76910261\n41.80209977\n34.34428732\n41.85879172\n42.59465302\n42.11642713\n34.45724147\n34.44821561\n34.44938654\n42.46254973\n43.00595072\n43.18249118\n36.62647886\n38.5542898\n38.48848731\n38.46592457\n39.20011224\n22.48027763\n14.79560389\n14.82515223\n14.83771289\n14.98195769\n22.58694665\n37.49590908\n41.79491834\n41.84669512\n34.41085381\n41.93926134\n43.25721694\n43.5978074\n36.22596043\n36.07713615\n35.50474649\n44.87346344\n44.98485895\n45.0831057\n38.14251782\n39.15554221\n38.65558233\n38.52520608\n39.27355472\n22.55264019\n14.85994179\n14.87975143\n14.88512859\n15.02485976\n22.62156043\n37.52166099\n41.82831331\n41.86181624\n34.40742216\n41.95610842\n43.52926834\n44.13997467\n36.20847202\n36.78076772\n37.29423777\n45.581643\n46.02438303\n45.31296718\n37.6726128\n39.18022636\n38.67691847\n38.52590613\n39.28207165\n22.57413036\n14.88179495\n14.89915367\n14.9083042\n15.06514938\n22.66414502\n37.56268376\n41.88134758\n41.91196135\n34.46603119\n42.26384967\n45.10605232\n47.28270594\n39.35204554\n38.26446423\n38.25847418\n46.70407022\n47.4710802\n47.81918923\n41.16852841\n40.08923123\n38.91412808\n38.56049585\n39.30158719\n22.58442098\n14.90629073\n14.93666864\n14.94568242\n15.69397673\n23.31676153\n37.91773396\n41.98470735\n42.26088561\n34.96223117\n44.26628517\n48.70189821\n51.16396416\n42.47746043\n40.50684013\n39.24620996\n48.03938654\n49.64821352\n50.698108\n43.04990716\n42.39761125\n39.72896377\n38.72888927\n39.35422902\n22.62289843\n14.93660228\n14.97288291\n14.98761339\n15.14933311\n22.74731268\n37.64236453\n41.94548217\n42.16538795\n36.29629228\n47.13074825\n51.06656773\n53.2074495\n45.37625095\n43.43889485\n42.02215533\n50.18063838\n50.88079692\n50.19966826\n42.83175143\n41.9110153\n39.29104984\n38.56052508\n39.31138688\n22.58262656\n14.90243142\n14.9267163\n14.92599643\n15.06241151\n22.65617022\n37.55718728\n41.84550358\n41.85963717\n34.40287502\n41.90072262\n42.78070407\n43.07912491\n35.13561727\n35.06508315\n34.92924081\n43.21816891\n44.74237748\n45.06894672\n38.76727357\n38.95625086\n38.62924974\n38.48631958\n39.22986393\n22.51124632\n14.83019293\n14.85198121\n14.86469378\n15.54723728\n23.16125359\n37.79009818\n41.86134108\n41.8633089\n34.37692801\n41.87821246\n42.58822918\n41.96177067\n34.55988323\n36.73737706\n39.06117802\n48.55395914\n49.38938592\n49.88305182\n43.15016361\n42.86481425\n41.12927241\n40.190845\n39.63080649\n22.68594415\n15.01680499\n15.04241446\n15.05215997\n15.24205348\n22.85617029\n37.77135908\n42.32243255\n43.70482269\n36.83942177\n45.72236142\n48.07474747\n47.85693048\n38.68417647\n37.06210621\n35.71964035\n43.39314098\n43.28393098\n43.35901294\n38.14842872\n38.701366\n38.59773243\n38.4780602\n39.20918081\n22.50414169\n14.82693316\n14.84263251\n14.84383595\n14.98376133\n22.58097043\n37.47673948\n41.78419431\n41.82135276\n34.36182291\n41.8693987\n42.60584556\n42.1689826\n34.51999578\n34.47884191\n34.48453244\n42.70310456\n42.88334801\n42.81837031\n37.79251034\n38.73917015\n38.64050586\n38.50579814\n39.25875318\n22.54723993\n14.86005224\n14.88318512\n14.88725748\n15.04299473\n22.64503984\n37.54751695\n41.85019859\n41.85553639\n34.39648467\n41.91817096\n43.06202839\n44.1634163\n35.71105936\n34.63982744\n34.48984818\n42.47600613\n42.70985385\n42.95089756\n37.78069554\n38.71859754\n38.61618805\n38.49383909\n39.24582526\n22.53133466\n14.85061078\n14.87966222\n14.89289317\n15.58672275\n23.20440899\n37.82601535\n41.88573543\n41.87778123\n34.36983044\n41.84941427\n42.53508689\n41.85728076\n34.33391529\n34.33526084\n34.31402425\n41.7525007\n41.75640573\n41.76527632\n38.49258881\n38.47554227\n38.42076158\n38.40039133\n39.17196685\n22.44192702\n14.75503118\n14.77906129\n14.78449322\n14.92037521\n22.51463053\n38.4726642\n41.71948234\n41.75073504\n34.29373094\n41.79217309\n42.51160021\n41.83994842\n34.32397479\n34.32705144\n34.31621897\n41.74303843\n41.74585816\n41.7460549\n38.61897242\n38.59192682\n38.50481825\n38.37983708\n39.1509264\n22.40866674\n14.72745318\n14.75788239\n14.77116831\n14.91301473\n22.51761105\n38.47571111\n41.70765345\n41.7327925\n34.2716929\n41.77510941\n42.48756992\n41.79556764\n34.26983583\n34.2687304\n34.25189117\n41.69905211\n41.70921539\n41.69918492\n38.56025142\n38.53534505\n38.45239991\n38.33950865\n39.14060436\n22.39447507\n14.70431851\n14.73085904\n14.74278594\n15.40092552\n23.00442005\n38.67384865\n41.6899883\n41.70463012\n34.2286605\n41.73123983\n42.48865601\n41.80004758\n34.27653001\n34.28333724\n34.27944803\n41.72266828\n41.72636451\n41.72535305\n38.44436676\n38.42321444\n38.37198216\n38.36170509\n39.14618634\n22.40443971\n14.71879487\n14.75056593\n14.76986843\n14.92030376\n22.52567384\n38.4885188\n41.71969996\n41.7315789\n34.27235271\n41.79861517\n42.55538919\n41.89800788\n34.36420788\n34.36742532\n34.35203846\n41.77873283\n41.76668783\n41.76898608\n38.64457174\n38.62210817\n38.54204386\n38.43009258\n39.18538622\n22.46925008\n14.78465387\n14.81229587\n14.82200771\n14.97461521\n22.57716387\n38.5357256\n41.77023489\n41.77606598\n34.28821663\n41.80454205\n42.51573534\n41.83883593\n34.31678117\n34.3208776\n34.30896249\n41.7479508\n41.73874629\n41.7450441\n38.62169592\n38.60455975\n38.53008349\n38.4168087\n39.18097708\n22.45907851\n14.77850957\n14.78299108\n14.77738043\n14.93066431\n22.54239291\n38.51563375\n41.76730432\n41.76602009\n34.28681882\n41.8190354\n42.5980943\n42.25860973\n34.46577593\n34.46759435\n34.45931765\n42.26160749\n42.80389396\n43.22864265\n39.10728548\n38.74332781\n38.63561721\n38.49543333\n39.24272541\n22.51141355\n14.82417027\n14.83561553\n14.84525377\n15.50131325\n23.10884155\n38.78130783\n41.79115718\n41.81573399\n34.3876222\n41.94014318\n44.29102882\n46.94527579\n39.55591763\n38.68729382\n38.02675415\n46.42536806\n46.82442695\n46.29424471\n39.75464085\n38.66301406\n38.50463127\n38.4863153\n39.24121934\n22.51050763\n14.81274045\n14.83440054\n14.8488875\n14.99762488\n22.5977207\n38.55980184\n41.80234185\n41.83084466\n34.40628154\n42.13562841\n45.42817817\n47.64817688\n40.24104903\n39.71054287\n38.92181011\n47.45083222\n48.02385461\n48.57807273\n41.21772708\n39.85299495\n38.77784218\n38.5426336\n39.28850647\n22.56807238\n14.8810706\n14.8988795\n14.9054974\n15.05848556\n22.65393465\n38.62185465\n41.87470541\n41.91448482\n34.45774939\n42.423988\n46.32946697\n49.64214838\n43.0069843\n42.14637868\n41.04156099\n50.02948735\n51.62360828\n53.71547877\n45.93237804\n43.91498631\n41.52547029\n39.41502141\n39.41784228\n22.66224582\n14.96070649\n14.97940488\n14.98859918\n15.77000836\n23.38442305\n39.0362311\n41.9986264\n42.09737926\n34.49409737\n42.70209229\n44.99708513\n44.98137336\n35.43083823\n34.76426083\n34.49652322\n42.70480657\n43.50621455\n45.64351091\n40.55162943\n40.78000709\n39.52933816\n38.97325338\n39.37541222\n22.64881324\n14.96489235\n14.99152726\n15.00374729\n15.17457161\n22.78974435\n38.77033083\n42.00855129\n42.14093916\n34.6653891\n43.75823207\n47.46469421\n49.19263556\n41.51180016\n41.31194942\n40.85357956\n47.58316989\n47.33485848\n49.59316031\n42.28903185\n39.64341291\n38.87016507\n38.54474761\n39.2644644\n22.53431028\n14.83512394\n14.8427546\n14.83335587\n14.96251723\n22.55305943\n38.49686425\n41.72778782\n41.74891259\n34.28180516\n41.80651473\n42.55108656\n41.89868588\n34.37753492\n34.38589739\n34.37260077\n41.81035663\n41.80704228\n42.8458982\n38.64693271\n38.60442519\n38.51526915\n38.39264709\n39.16181253\n22.42083912\n14.73367199\n14.74823501\n14.7538058\n14.89715965\n22.50314821\n38.46564529\n42.77064696\n41.73953267\n34.28826857\n41.8104006\n42.55618768\n41.91524056\n34.39306535\n34.3939267\n34.38158339\n41.81194888\n41.81429861\n42.84667142\n38.64867635\n38.59802122\n38.50614063\n38.39091255\n39.15270524\n22.41287092\n14.72080493\n14.74380695\n14.75570377\n15.41725539\n23.02514488\n38.69703197\n42.76613441\n41.73808765\n34.29333119\n41.82156419\n42.58036679\n41.94777031\n34.41645464\n34.42628126\n34.41439323\n41.84153113\n41.84030948\n42.88630058\n38.50392894\n38.48685197\n38.43409286\n38.41286961\n39.17151604\n22.44264893\n14.75803947\n14.77336239\n14.77960058\n14.93042456\n22.53762506\n38.50755408\n42.81326808\n41.77068619\n34.30985119\n41.82968589\n42.56043625\n41.92680212\n34.43608042\n34.46079858\n34.42974976\n41.82597586\n41.81962529\n42.87901046\n38.70326491\n38.67813545\n38.59041217\n38.46596849\n39.21099636\n22.47589203\n14.77510792\n14.79102512\n14.79197454\n14.92236925\n22.51383298\n38.453903\n42.76072782\n41.73672026\n34.28931993\n41.79442298\n42.5260038\n41.86692459\n34.34659265\n34.35070508\n34.33982612\n41.75908166\n41.74435664\n43.85617618\n38.60672506\n38.575281\n38.49669642\n38.38251553\n39.15412152\n22.41803019\n14.73152465\n14.75681125\n14.76700493\n15.41964765\n23.02893053\n38.7033303\n42.77322046\n41.73798628\n34.27078232\n41.76499278\n42.50018097\n41.819689\n34.29885036\n34.30808957\n34.30132708\n41.7251639\n41.7271086\n43.8494052\n38.45007361\n38.42601897\n38.37683001\n38.37587074\n39.15823318\n22.42105484\n14.72315354\n14.74948686\n14.77098049\n14.9249667\n22.54028016\n38.50997719\n42.80149235\n41.74774059\n34.27199069\n41.76982335\n42.4961071\n41.8069664\n34.28308929\n34.27917459\n34.26047318\n41.68932355\n41.67959108\n43.80327203\n38.56048476\n38.53661587\n38.46004555\n38.3536852\n39.15082976\n22.41337961\n14.73034567\n14.76044557\n14.76993099\n14.91685754\n22.52417153\n38.48588497\n42.77632289\n41.72049768\n34.22880499\n41.74074245\n42.48231915\n41.78696214\n34.26689752\n34.26951993\n34.26051866\n41.70217411\n41.70173834\n43.82145863\n38.58382106\n38.56558984\n38.49218498\n38.37998496\n39.15971837\n22.42695836\n14.73948233\n14.75535757\n14.75978939\n14.90453507\n22.50745542\n38.46055678\n42.7502534\n41.70658815\n34.22630773\n41.74159019\n42.49927802\n41.8233911\n34.32582054\n34.34247403\n34.33681613\n41.76890724\n41.75628665\n43.86520378\n38.62035567\n38.59499503\n38.50917433\n38.40321213\n39.17641909\n22.45579679\n14.7644753\n14.78467589\n14.79847451\n15.45579367\n23.06708949\n38.74922537\n42.81885216\n41.76602442\n34.29700746\n41.78332637\n42.49089839\n41.79153372\n34.25320257\n34.22631418\n34.19629584\n41.62946196\n41.6384136\n43.76587317\n38.38550884\n38.3808164\n38.34131442\n38.33284917\n39.13204722\n22.38462117\n14.69774021\n14.72197296\n14.73553982\n14.88402806\n22.48664652\n38.44771125\n42.76309438\n41.7269145\n34.24416334\n41.7412093\n42.48233067\n41.79241202\n34.26630051\n34.26377392\n34.24769052\n41.686784\n41.69004102\n43.81535825\n38.57178751\n38.5510269\n38.47242974\n38.35437287\n39.13984088\n22.39011783\n14.6967463\n14.71390042\n14.72241946\n14.87726035\n22.49178671\n38.45102182\n42.74727138\n41.69657007\n34.23022208\n41.73677594\n42.49239013\n41.8263235\n34.30772693\n34.31174334\n34.29754286\n41.73191025\n41.72807212\n43.84450811\n38.57651782\n38.54884645\n38.47107825\n38.35542416\n39.13756673\n22.38416718\n14.68956567\n14.71130762\n14.71745634\n15.37733158\n22.98907025\n38.66644418\n42.74034635\n41.70995196\n34.26145788\n41.79798193\n42.57977029\n42.11268697\n34.59735734\n34.48475432\n34.47216524\n42.45693862\n42.53154547\n45.5359664\n38.53871113\n38.48855936\n38.44238079\n38.44224236\n39.18896782\n22.46853119\n14.77937235\n14.80432961\n14.81086767\n14.95802316\n22.56887417\n38.54243065\n43.89817148\n41.79504945\n34.33692619\n41.84929497\n42.59108903\n41.95805447\n34.43463354\n34.4269242\n34.39617427\n41.8173437\n41.7981338\n44.96848842\n38.67189166\n38.63047819\n38.53873269\n38.41695903\n39.17326748\n22.44620471\n14.75433471\n14.7740405\n14.77796302\n14.92451443\n22.52718601\n38.47772417\n43.82126642\n41.71014357\n34.23253771\n41.74575424\n42.49372651\n41.81512201\n34.29974054\n34.29988871\n34.28084283\n41.7065071\n41.70509883\n44.87766072\n38.5689291\n38.53505222\n38.45755276\n38.33735194\n39.12455519\n22.36793239\n14.68222534\n14.69952421\n14.70904393\n14.85923799\n22.47017017\n38.43328673\n43.78698773\n41.6811306\n34.22885964\n41.75463343\n42.50853785\n41.86447098\n34.3575618\n34.36265139\n34.34394411\n41.76876926\n41.76476459\n44.9144453\n38.59657527\n38.57028911\n38.49349374\n38.3779915\n39.1506996\n22.4128775\n14.73746899\n14.76534528\n14.76106358\n15.43775719\n23.06224293\n38.73750781\n43.86205209\n41.76930568\n34.31360137\n41.82504635\n42.55951828\n41.91133406\n34.38538116\n34.37225898\n34.33663244\n41.75293933\n41.75366276\n44.93901358\n38.49159562\n38.49222094\n38.43844789\n38.42535494\n39.18621549\n22.46516311\n14.78055022\n14.8059783\n14.81870752\n14.97134758\n22.58274372\n38.55073622\n43.90665518\n41.78033674\n34.28637418\n41.78514897\n42.50588906\n41.83588164\n34.31688161\n34.32562575\n34.32882568\n41.7712835\n41.77273506\n44.93993432\n38.61261688\n38.58182928\n38.50345968\n38.37800886\n39.15204541\n22.40174247\n14.71257568\n14.72809175\n14.73688663\n14.8767414\n22.47911601\n38.4467914\n43.80403887\n41.69745242\n34.25027052\n41.77677513\n42.53122351\n41.89476991\n34.38658829\n34.39407555\n34.38286591\n41.82276121\n41.7989128\n44.94201333\n38.62361203\n38.58765027\n38.50268687\n38.40009961\n39.16499174\n22.4249771\n14.74397644\n14.77558216\n14.78119228\n15.44028433\n23.05490106\n38.73411514\n43.8613224\n41.76701634\n34.32936327\n41.87438084\n42.63850108\n43.63121162\n36.68019727\n36.050751\n35.93738395\n44.10197727\n43.45664211\n46.16566399\n38.67261196\n38.55104403\n38.47410308\n38.45889687\n39.20911281\n22.47648847\n14.78202938\n14.81048651\n14.8215311\n14.95961954\n22.56360871\n38.52246872\n43.85895844\n41.76366401\n34.30847057\n41.82803034\n42.58375402\n41.96833622\n34.43774471\n34.42501865\n34.43192319\n41.87352785\n41.84235446\n45.01640401\n38.71172223\n38.67018071\n38.56552634\n38.42670535\n39.16583459\n22.43179663\n14.74467913\n14.75971686\n14.75769347\n14.90006608\n22.4988862\n38.44623981\n43.78995902\n41.69118608\n34.22307639\n41.73964276\n42.48902593\n41.82041145\n34.29645208\n34.30465846\n34.30175235\n41.72542103\n41.71623434\n45.94654824\n38.57982262\n38.55062109\n38.48052179\n38.36962765\n39.14586019\n22.41359745\n14.72570096\n14.74400146\n14.74854573\n14.89517428\n22.5112238\n38.48483551\n43.84307688\n41.72535448\n34.2440132\n41.74616397\n42.4888991\n41.81529871\n34.29933247\n34.30307442\n34.29372829\n41.73327546\n41.73022578\n45.97445958\n38.61521843\n38.59149021\n38.51553254\n38.40089919\n39.1755379\n22.45303713\n14.77226832\n14.80163918\n14.81560762\n15.47943811\n23.09777612\n38.78492044\n43.91555516\n41.79441244\n34.30288292\n41.80534235\n42.52091946\n41.85304971\n34.33553433\n34.33779655\n34.32010606\n41.75721224\n41.75452048\n45.99987127\n38.49854487\n38.48969927\n38.44607061\n38.4383066\n39.19857432\n22.4831858\n14.80173953\n14.82794674\n14.83805614\n14.98053721\n22.58944403\n38.5617536\n44.9800274\n41.79902553\n34.31136301\n41.81477204\n42.52375735\n41.86719691\n34.36054559\n34.36245189\n34.34611527\n41.77637062\n41.76623621\n45.99653422\n38.62496986\n38.59200896\n38.51508345\n38.40679664\n39.17793356\n22.44747773\n14.75925453\n14.78686779\n14.79563383\n14.93837748\n22.53764171\n38.49734639\n44.91552868\n41.74767873\n34.29518904\n41.82879445\n42.58423609\n42.00618179\n34.46161945\n34.46941164\n34.44988862\n41.87647595\n41.84461972\n46.03508111\n38.65084423\n38.62633269\n38.54530023\n38.42657053\n39.20370211\n22.49301375\n14.80674427\n14.83325607\n14.84657245\n15.5091718\n23.12776549\n38.83093679\n45.01858433\n41.82299726\n34.34117063\n41.87243146\n42.64844468\n42.77990653\n35.19868289\n34.72883496\n34.50900849\n42.7248651\n42.43034112\n46.58957926\n38.53532698\n38.47306992\n38.40799303\n38.39333335\n39.15841436\n22.42687134\n14.75129227\n14.76685058\n14.7634036\n14.90241624\n22.50819049\n38.48596794\n44.90469095\n41.74482495\n34.28910334\n41.81971031\n42.58685437\n41.96181025\n34.43402325\n34.43683379\n34.42143024\n41.83335643\n41.81623854\n46.04213638\n38.66530729\n38.62388161\n38.53682975\n38.41895236\n39.17721763\n22.45752266\n14.76956402\n14.78681797\n14.80099685\n14.95463032\n22.56265738\n38.52531633\n44.93756937\n41.76763264\n34.29057462\n41.82603886\n42.58003095\n41.95420587\n34.43451893\n34.43604836\n34.42287229\n41.84041313\n41.81479454\n46.04022955\n38.68867408\n38.66883313\n38.58121676\n38.45030818\n39.19826758\n22.48361961\n14.79126008\n14.80021653\n14.80282614\n14.95167754\n22.56331771\n38.53079309\n44.94965111\n41.77187578\n34.28494095\n41.78943207\n42.52369488\n41.87300755\n34.36321272\n34.37367729\n34.36041344\n41.79727859\n41.7918458\n46.03035987\n38.67241458\n38.65040796\n38.56831068\n38.43436005\n39.18892629\n22.46750005\n14.7802472\n14.81011897\n14.82818964\n15.49349918\n23.11109304\n38.80143011\n44.99000652\n41.81160664\n34.32152208\n41.82653116\n42.57241727\n41.93230424\n34.42373959\n34.43648681\n34.41223763\n41.82897614\n42.85775009\n46.02187177\n38.50251097\n38.48918476\n38.44015971\n38.41478895\n39.17010327\n22.42215967\n14.72515576\n14.73264456\n14.7256331\n14.86655519\n22.46868654\n38.42500372\n44.84077267\n41.66822163\n34.17914124\n41.67261458\n42.44422143\n41.72810208\n34.20858475\n34.20857489\n34.19638901\n41.62754367\n42.69434699\n45.87990668\n38.52108589\n38.50372259\n38.43572032\n38.32675564\n39.12401216\n22.37511303\n14.68734596\n14.71408007\n14.72801578\n14.87954205\n22.49048231\n38.45251523\n44.86820353\n41.69383306\n34.20673939\n41.70131768\n42.46378764\n41.77622723\n34.25635447\n34.25853699\n34.24366213\n41.66773262\n42.72806032\n45.90727158\n38.5437189\n38.5211529\n38.44762303\n38.33670446\n39.12585093\n22.37335697\n14.68331273\n14.70328802\n14.70709479\n15.36725083\n22.97746265\n38.65440669\n44.84271217\n41.66994192\n34.18217439\n41.68006244\n42.44191903\n41.7264202\n34.20401417\n34.20293785\n34.18917789\n41.62889414\n42.69418113\n45.87950679\n38.37807251\n38.36937141\n38.33148547\n38.32133209\n39.12280734\n22.36463724\n14.6761439\n14.7014342\n14.71470048\n14.86613165\n22.47995556\n38.44645599\n44.85601643\n41.68403345\n34.20003123\n41.70003083\n42.45493865\n41.74161944\n34.21645689\n34.21725612\n34.20620056\n41.64090137\n42.6962423\n45.88055311\n38.51972481\n38.49968492\n38.42587986\n38.31077128\n39.11512218\n22.34975164\n14.66036002\n14.6852119\n14.69780357\n14.848081\n22.45953164\n38.42291905\n45.8890961\n41.66059325\n34.16886087\n41.67372259\n42.43333023\n41.71106683\n34.18754504\n34.18578232\n34.17158941\n41.60677656\n42.66701232\n45.8497489\n38.49077344\n38.47054597\n38.39843366\n38.28872375\n39.09798389\n22.33916659\n22.30389545\n14.63013959\n14.65171962\n14.66475399\n14.81572911\n22.44615574\n38.40702299\n41.63877333\n41.64674353\n34.16546077\n41.65828033\n42.43153621\n41.7137378\n34.19650121\n34.19845383\n34.17959449\n42.66292569\n45.84608169\n45.85388943\n38.49498463\n38.4745827\n38.40291631\n38.29146777\n39.10068201\n22.34095725\n14.64307382\n14.66520586\n14.67781399\n15.34349017\n22.96343986\n38.64070641\n41.64620539\n41.64951577\n34.16279984\n41.65220428\n42.42306012\n41.70335278\n34.17721439\n34.17787761\n34.16552889\n42.64895303\n45.83305087\n45.84052975\n38.33943716\n38.32976311\n38.29115336\n38.28548913\n39.09549582\n22.33601961\n14.63076211\n14.65028495\n14.66382145\n14.81504694\n22.44635719\n38.40839572\n41.63949842\n41.64627367\n34.16243556\n41.65216092\n42.42426003\n41.70387627\n34.1780504\n34.17923986\n34.16742912\n42.6524662\n45.83777823\n45.84524198\n38.48595581\n38.46694079\n38.39711675\n38.2884052\n39.09798033\n22.33896245\n14.6366497\n14.65787372\n14.67084614\n14.82141799\n22.44907447\n38.41039963\n41.64468899\n41.65337959\n34.17302006\n41.6738987\n42.45100278\n41.7638787\n34.24856799\n34.25299737\n34.2448655\n42.72972227\n45.8963742\n45.89962408\n38.53844578\n38.51670264\n38.44409798\n38.32995413\n39.12323198\n22.37802778\n14.68955261\n14.71896839\n14.7348476\n15.40073339\n23.0144403\n38.69914718\n41.71102245\n41.71114524\n34.22723247\n41.72680113\n42.4766635\n41.78872215\n34.26333527\n34.25688405\n34.2405084\n42.74177082\n45.91728966\n45.92509326\n38.42473772\n38.42133016\n38.3830547\n38.37998452\n39.16166746\n22.43315752\n14.75478765\n14.78251523\n14.79261984\n14.93471619\n22.53272229\n38.48709885\n41.71426989\n41.72252912\n34.24723033\n41.76604508\n42.51404112\n41.87238759\n34.36913205\n34.37958395\n34.3642804\n42.82388484\n45.97130953\n45.95871403\n38.58584694\n38.56201687\n38.48633477\n38.36412303\n39.14029108\n22.40286883\n14.72510004\n14.7509714\n14.76473185\n14.90649072\n22.51707402\n38.48157196\n41.70668733\n41.71018905\n34.22723046\n41.71910664\n42.45663229\n41.73673536\n34.21273952\n34.22164729\n34.20819909\n43.74859586\n45.85823725\n45.8566631\n38.49829898\n38.47922843\n38.40804787\n38.29607961\n39.10486184\n22.34528406\n14.65665937\n14.6816269\n14.69392751\n14.84351596\n22.4558133\n38.41813624\n41.65311033\n41.66156211\n34.17656368\n41.66757284\n42.43586938\n41.71773649\n34.20261776\n34.20728407\n34.19575174\n43.73875523\n45.85997709\n45.86245386\n38.50107959\n38.48209727\n38.40841034\n38.29532804\n39.10637227\n22.35248162\n14.66140989\n14.68306533\n14.69509453\n15.36167284\n22.97624516\n38.66129211\n41.67944615\n41.69323598\n34.22100677\n41.72633647\n42.47976119\n41.80034228\n34.27744668\n34.28186817\n34.26000983\n43.80525143\n45.92399471\n45.93343624\n38.42770476\n38.41657335\n38.37541815\n38.36654559\n39.14625679\n22.40585835\n14.71965186\n14.74587751\n14.75661786\n14.90645796\n22.51906684\n38.48577411\n41.73167262\n41.73419503\n34.2484519\n41.74891974\n42.48299936\n41.79214554\n34.2707101\n34.27146095\n34.25720611\n43.80970633\n45.92706129\n45.93814884\n38.58250807\n38.56697807\n38.49364265\n38.38287058\n39.16201656\n22.42803574\n14.74295353\n14.76888958\n14.78251783\n14.93464232\n22.54888265\n38.51778571\n42.81894135\n41.75704531\n34.26908375\n41.75772781\n42.48025574\n41.78325501\n34.26662822\n34.26666568\n34.25577236\n43.81110275\n45.92663665\n45.93569753\n38.57621885\n38.55954776\n38.48257105\n38.36811109\n39.15298464\n22.41818814\n14.73141219\n14.75481303\n14.76784711\n15.43523799\n23.05276646\n38.74069909\n42.81851938\n41.76418989\n34.2896127\n41.80521903\n42.53175287\n41.86764496\n34.34428845\n34.34546349\n34.32687855\n43.87697791\n45.98740671\n45.99021806\n38.48478957\n38.48068596\n38.44166305\n38.43556886\n39.19909519\n22.48640839\n14.80048368\n14.82646147\n14.83986554\n14.99149323\n22.60009722\n38.55049031\n42.81259424\n41.74280383\n34.26605723\n41.77629465\n42.50801753\n41.83167901\n34.31102328\n34.31375851\n34.29849927\n43.82909274\n45.93864069\n45.93792808\n38.57394133\n38.5469251\n38.46783064\n38.3520942\n39.13490122\n22.37479982\n14.68728747\n14.71771781\n14.72960429\n14.88170939\n22.50053817\n38.46938036\n42.77176637\n41.73949232\n34.26472093\n41.77436542\n42.50405307\n41.8330845\n34.31562854\n34.31845273\n34.29680628\n43.83009369\n45.94620695\n45.94611561\n38.57735666\n38.55010091\n38.47518486\n38.35553625\n39.14868232\n22.40879566\n14.71112847\n14.74411752\n14.77204441\n14.935609\n22.56890703\n38.53854778\n42.83461152\n41.77855778\n34.29855545\n41.80716212\n42.53808806\n41.8741032\n34.34804712\n34.33754709\n34.30010885\n43.82822055\n45.93223265\n45.91869431\n38.54462395\n38.51423794\n38.43695329\n38.32213052\n39.11447627\n22.35072024\n14.6606672\n14.68547204\n14.69799169\n15.36256741\n22.97321848\n38.64961703\n42.71889559\n41.66624536\n34.18034181\n41.67157642\n42.437258\n41.71800551\n34.19420703\n34.19207632\n34.18059359\n43.72911867\n45.85007189\n45.86024902\n38.36245091\n38.35107474\n38.30787279\n38.29941858\n39.10607005\n22.34719982\n14.65640873\n14.68100786\n14.69461537\n14.84644285\n22.46021457\n38.42550868\n42.72470219\n41.66623377\n34.18443456\n41.68098345\n42.44272687\n41.72840489\n34.20467813\n34.20409663\n34.18989086\n43.7350768\n45.85966748\n45.86814117\n38.50902126\n38.49079216\n38.41842298\n38.30684261\n39.11252508\n22.35116346\n14.66219496\n14.68597105\n14.69909475\n14.85079157\n22.46621572\n38.43396483\n42.72528723\n41.66655286\n34.17654681\n41.67316366\n42.43738659\n41.71411766\n34.1882282\n34.18319584\n34.16792332\n43.71854099\n45.84073121\n45.84391431\n38.48620457\n38.46664012\n38.39579668\n38.28688481\n39.09646587\n22.33613602\n14.63561049\n14.65657829\n14.66987826\n15.33558127\n22.96080739\n38.63646411\n42.70076791\n41.64655705\n34.16029326\n41.65098436\n42.4224611\n41.70209099\n34.17667041\n34.1762416\n34.16365021\n43.70752148\n45.83248126\n45.83922038\n38.33825067\n38.32833829\n38.29014908\n38.28485811\n39.09493362\n22.33570591\n14.63417808\n14.65672228\n14.67169297\n14.82543345\n22.45672348\n38.41733862\n42.70448023\n41.65859178\n34.18012107\n41.68294912\n42.44692968\n41.74012903\n34.21393814\n34.21235807\n34.19803433\n43.73896087\n45.85403936\n45.86090942\n38.50234902\n38.48307041\n38.41046615\n38.29989973\n39.10545584\n22.34506138\n14.64916956\n14.67024329\n14.68176442\n14.83154426\n22.45486397\n38.41291757\n42.69699895\n41.6510912\n34.16379481\n41.66364295\n42.43707226\n41.7237887\n34.20853044\n34.21434967\n34.20239842\n43.75102237\n45.86582876\n45.87236032\n38.51508606\n38.49054855\n38.41788818\n38.31185992\n39.11858851\n22.35809056\n14.66580282\n14.69060031\n14.70291915\n14.85365614\n22.4667109\n38.43180424\n43.78986261\n41.67322289\n34.18103128\n41.67119989\n42.4396391\n41.71945355\n34.19475452\n34.19287158\n34.1795513\n43.72460136\n45.84793294\n45.85706677\n38.49576557\n38.47742075\n38.40647086\n38.29521225\n39.10243178\n22.3427845\n14.65042825\n14.67491576\n14.68784108\n15.35296021\n22.96829258\n38.64584434\n43.77353919\n41.66008862\n34.17066369\n41.66553419\n42.42916236\n41.71069663\n34.18720732\n34.18476183\n34.16877568\n44.77616254\n45.84186579\n45.84970052\n38.34863808\n38.33869317\n38.29839381\n38.28982213\n39.09834973\n22.33795927\n14.64138169\n14.66216134\n14.67354806\n14.82283251\n22.44878606\n38.41034255\n43.7613801\n41.65394571\n34.16895168\n41.66243105\n42.43163115\n41.7125952\n34.19438748\n34.19951642\n34.19165932\n44.80585562\n45.86826885\n45.87144778\n38.50737087\n38.49048254\n38.42173755\n38.30718047\n39.11092155\n22.34968908\n14.65890696\n14.68382375\n14.69664589\n14.84723521\n22.46116158\n38.42687137\n43.78521152\n41.68867136\n34.22603734\n41.73646199\n42.48120792\n41.79510196\n34.27043107\n34.26302266\n34.23804153\n44.82945013\n45.88341694\n45.88155209\n38.51576081\n38.48576501\n38.40906566\n38.29757223\n39.10519902\n22.34545893\n14.65649156\n14.68126736\n14.69441764\n15.35995519\n22.97198082\n38.64894869\n43.77714324\n41.66396448\n34.17313266\n41.66513049\n42.43233186\n41.7129614\n34.18714579\n34.18522116\n34.17165609\n44.77678876\n45.84630963\n45.85296962\n38.35058416\n38.3423949\n38.30068377\n38.29291872\n39.10185324\n22.34318456\n14.64896142\n14.67266177\n14.68613444\n14.83789991\n22.45894009\n38.42036695\n43.77051849\n41.66014912\n34.19220159\n41.70599957\n42.46599559\n41.778646\n34.25738355\n34.25893516\n34.23915369\n44.83525886\n45.89011481\n45.88328594\n38.52178827\n38.501211\n38.42967048\n38.31455376\n39.11335669\n22.35248135\n14.66194779\n14.68562873\n14.69750374\n14.84720041\n22.46244646\n38.41848581\n43.76487896\n41.65937616\n34.18250065\n41.70762374\n42.46978657\n41.77675781\n34.25371375\n34.24021708\n34.2097115\n44.81242795\n45.86447744\n45.85727053\n38.49636798\n38.47531288\n38.40003454\n38.28882975\n39.09797572\n22.33766091\n14.64158325\n14.66273629\n14.67449246\n14.82493894\n22.44986923\n38.41075864\n43.76370881\n41.65431392\n34.16873429\n41.66241244\n42.4310871\n41.71383993\n34.19044311\n34.19380493\n34.18302205\n44.80134893\n45.87100111\n45.88377502\n38.52588566\n38.50893198\n38.43883311\n38.33161347\n39.12638163\n22.37164101\n14.67366202\n14.70667959\n14.73030098\n15.36880065\n22.97090444\n38.64091289\n43.76674178\n41.6540522\n34.16594347\n41.65499607\n42.42433591\n41.70300879\n34.17929731\n34.17950319\n34.16715247\n44.76984413\n45.83405973\n45.84275081\n38.34163151\n38.3326829\n38.29397439\n38.28827301\n39.09786182\n22.33825177\n14.63327191\n14.65234295\n14.66513836\n14.81585946\n22.44687723\n38.40851594\n43.75993387\n41.64707342\n34.16102535\n41.65056555\n42.42141537\n41.70002437\n34.17614327\n34.17720628\n34.16514707\n44.7678082\n45.83198059\n45.83886193\n38.4822638\n38.46414695\n38.39464628\n38.28590025\n39.09564652\n22.33553175\n14.62794351\n14.64499571\n14.65662795\n14.80672839\n22.44223746\n38.40315622\n43.7546364\n41.64225524\n34.15672762\n41.64662145\n42.42035402\n41.70076032\n34.17507256\n34.17566794\n34.16379145\n44.76536337\n45.83247595\n45.83899721\n38.48086306\n38.462568\n38.39362147\n38.2859136\n39.0963765\n22.3377234\n14.63460381\n14.65585753\n14.67033978\n15.33839182\n22.96499924\n38.64309052\n43.77395127\n41.66192981\n34.17367078\n41.66976592\n42.43227798\n41.7146028\n34.18158024\n34.17000542\n34.15505598\n44.75763708\n45.81973344\n45.82624237\n38.32667427\n38.3171655\n38.27890635\n38.27319118\n39.08367387\n22.32078786\n14.60593734\n14.62030689\n14.63317326\n14.78389258\n22.4299859\n38.39209423\n43.73495462\n41.62293853\n34.14394983\n41.63782033\n42.40529162\n41.68184789\n34.15969311\n34.16214928\n34.1506646\n44.75437157\n45.81625193\n45.82395669\n38.46691689\n38.44868137\n38.38071941\n38.27264388\n39.08375116\n22.32341705\n14.60630129\n14.61872597\n14.63174602\n14.78226858\n22.43261122\n38.39127579\n43.73410573\n41.62247626\n34.13686681\n41.63379027\n42.40758372\n41.68204657\n34.15943598\n34.16124008\n34.14867369\n44.75061554\n45.81498179\n45.819768\n38.46404278\n38.44569147\n38.37732156\n38.26909441\n39.07990369\n22.31831788\n14.60029333\n14.61434726\n14.62769783\n14.77841133\n22.42537148\n38.39050044\n44.8011964\n41.6304629\n34.14270419\n41.63165924\n42.40431683\n41.68034589\n34.15776136\n34.15857857\n34.14562896\n44.74846272\n45.81337822\n45.82261144\n38.46562285\n38.44819163\n38.37982646\n38.27170182\n39.08251405\n22.32113516\n14.60503548\n14.6201832\n14.63361548\n15.30129383\n22.94054024\n38.62247661\n44.80454443\n41.63298826\n34.14644128\n41.63572246\n42.40748404\n41.68392715\n34.16149147\n34.16257782\n34.14948568\n44.7558018\n45.82008447\n45.82794661\n38.32840921\n38.32060139\n38.28315921\n38.27819714\n39.08891778\n22.32941507\n14.62016537\n14.63847423\n14.65221471\n14.80439075\n22.4430303\n38.40495304\n44.81789394\n41.64684125\n34.15967519\n41.65428219\n42.42043161\n41.70209859\n34.17974724\n34.18146363\n34.16782413\n44.7800623\n45.84960911\n45.85755917\n38.5001984\n38.48347395\n38.41242933\n38.30227862\n39.10842238\n22.346945\n14.65378831\n14.67804212\n14.69182737\n14.8437477\n22.46258365\n38.42801288\n44.84290709\n41.66811016\n34.17706207\n41.66971787\n42.43863664\n41.72401043\n34.20622446\n34.20630344\n34.19104738\n44.78622633\n45.84812337\n45.85238216\n38.49105203\n38.47062219\n38.39806909\n38.28751397\n39.09652056\n22.33446498\n14.63193494\n14.65156122\n14.6633899\n15.32817351\n22.95722864\n38.63336968\n44.81458863\n41.64119716\n34.15665384\n41.64660183\n42.41940963\n41.69989595\n34.17382818\n34.17440147\n34.16252601\n44.76438537\n45.83103712\n45.83865473\n38.33691815\n38.32719297\n38.28875444\n38.28301201\n39.0928189\n22.33328991\n14.62682471\n14.64584734\n14.65886522\n14.80997134\n22.44763383\n38.40569726\n44.8073301\n41.63663269\n34.15580119\n41.64936579\n42.4218105\n41.70152106\n34.17652559\n34.17849969\n34.16718595\n44.77293752\n45.83650339\n45.84333556\n38.48714718\n38.46855915\n38.3979336\n38.28868533\n39.09808765\n22.33981495\n14.63972064\n14.65979094\n14.67295168\n14.82380971\n22.45388472\n38.41107455\n44.81666759\n41.64508342\n34.15881823\n41.66387892\n42.43145569\n41.71261443\n34.18717951\n34.18777447\n34.1751282\n44.78224802\n45.84638788\n45.85145318\n38.49496031\n38.47555093\n38.40314971\n38.29104888\n39.09928606\n22.34084659\n14.64822143\n14.67132369\n14.68458483\n14.83583177\n22.45379721\n38.41706925\n44.83370445\n41.66237927\n34.17311228\n41.66749172\n42.43676122\n41.71664288\n34.19484866\n34.19306805\n34.17881063\n44.78893288\n45.85142735\n45.86034194\n38.50212165\n38.48411893\n38.41244329\n38.30139897\n39.10827249\n22.34646425\n14.65511413\n14.67933094\n14.69298378\n15.35889075\n22.9742132\n38.6548279\n44.84397844\n41.67059739\n34.18074124\n41.67577389\n42.43681097\n41.72129661\n34.1969157\n34.19777297\n34.17904836\n44.7852326\n45.85003896\n45.85778146\n38.35568199\n38.3435235\n38.29976241\n38.29052443\n39.09896491\n22.3381664\n14.64017211\n14.66168812\n14.67463502\n14.82505703\n22.4505116\n38.40634452\n44.81970349\n41.64765535\n34.16143959\n41.65308249\n42.4244213\n41.70432886\n34.17912553\n34.17734559\n34.16484409\n44.76937279\n45.83547771\n45.84365896\n38.48536227\n38.46647524\n38.39515433\n38.28609571\n39.09573325\n22.33560375\n14.63249885\n14.65307583\n14.66652459\n14.81783386\n22.448088\n38.40999741\n44.82151583\n41.65004682\n34.16192544\n41.65578007\n42.42894209\n41.70887657\n34.18239846\n34.18076974\n34.16583872\n44.77101356\n45.83744033\n45.8460066\n38.48664917\n38.46797421\n38.39650564\n38.28667725\n39.09585786\n22.33528619\n14.63598598\n14.65569647\n14.66590966\n15.33104042\n22.96038604\n38.63692453\n44.82249251\n41.65203127\n34.16408807\n41.65933444\n42.42713749\n41.70726442\n34.18468549\n34.18314735\n34.1681385\n44.77717166\n45.84109376\n45.85019476\n38.34908459\n38.33893313\n38.29778544\n38.29008\n39.09845676\n22.33922216\n14.64270839\n14.66464628\n14.67766568\n14.82906834\n22.45702714\n38.41356019\n44.82033385\n41.6509227\n34.16943584\n41.66442295\n42.42777167\n41.70713134\n34.18363779\n34.18392367\n34.17140929\n44.77908235\n45.84110756\n45.84853084\n38.49188276\n38.47279896\n38.40095325\n38.29039547\n39.09836961\n22.34162472\n14.651081\n14.67241159\n14.68364195\n14.83372549\n22.45907614\n38.41542493\n44.82288241\n41.65345271\n34.16262651\n41.6664594\n42.43127852\n41.70884009\n34.18308395\n34.18244321\n34.16752518\n44.77686402\n45.84119234\n45.84388614\n38.48807016\n38.46978153\n38.39776811\n38.28760502\n39.09673416\n22.33707098\n14.63669724\n14.65572406\n14.66805859\n14.81871837\n22.45130968\n38.40862216\n44.81171636\n41.64179577\n34.1534189\n41.65258688\n42.42356182\n41.7032446\n34.17601161\n34.17618163\n34.16385196\n44.76826949\n45.83246884\n45.83724522\n38.48133648\n38.46338799\n38.39422382\n38.28601609\n39.09635569\n22.33871375\n14.64717672\n14.67063512\n14.68430163\n15.35032595\n22.96869074\n38.64624139\n44.8335597\n41.6606723\n34.17190405\n41.66609497\n42.4342325\n41.71433051\n34.19149533\n34.1892633\n34.17547038\n43.72543004\n45.84572706\n45.85340167\n38.35110742\n38.34110118\n38.3005836\n38.29133079\n39.10007656\n22.34012729\n14.6424909\n14.66407194\n14.67685776\n14.82711772\n22.44937353\n38.41205992\n44.82420138\n41.65254745\n34.16330098\n41.6552508\n42.43030344\n41.71020783\n34.18156968\n34.17960204\n34.16715837\n43.71191143\n45.83700996\n45.84390338\n38.48538779\n38.46682161\n38.395444\n38.28501023\n39.09432704\n22.33357902\n14.62912383\n14.64762489\n14.65971198\n14.80970858\n22.44334359\n38.40434424\n44.81589878\n41.64511172\n34.158759\n41.65187626\n42.42690421\n41.70983228\n34.18353412\n34.18070669\n34.16808141\n43.71698563\n45.84177742\n45.84917864\n38.4907256\n38.47049925\n38.39814307\n38.28717755\n39.09642019\n22.33714098\n14.63792224\n14.65927047\n14.67212898\n15.33875939\n22.96486377\n38.64186755\n44.82981601\n41.65851577\n34.16939678\n41.66479221\n42.42916749\n41.71278551\n34.19025514\n34.19010317\n34.1759763\n43.72856333\n45.85065158\n45.85981055\n38.35942891\n38.35093095\n38.30985595\n38.30002855\n39.10541628\n22.34314122\n14.64767804\n14.66967625\n14.68157172\n14.83263339\n22.45911849\n38.41712247\n44.82506488\n41.65555758\n34.17269686\n41.67042569\n42.4366027\n41.71952505\n34.19614908\n34.19669658\n34.18536684\n43.73859611\n45.85466458\n45.86512287\n38.50845139\n38.48995051\n38.41819279\n38.30806284\n39.11446226\n22.35234497\n14.6604214\n14.68408404\n14.69731079\n14.84854855\n22.46770139\n38.42900517\n44.83740826\n41.66680045\n34.17678228\n41.67910053\n42.44088535\n41.72006966\n34.19687075\n34.19635206\n34.18210215\n43.73517952\n45.85521548\n45.85782508\n38.50237531\n38.48472454\n38.41258484\n38.30111631\n39.10793002"
  },
  {
    "path": "src/pymgrid/data/load/RefBldgHospitalNew2004_7.1_5.0_3C_USA_CA_SAN_FRANCISCO.csv",
    "content": "Electricity:Facility [kW](Hourly)\n778.0079691\n776.2417501\n779.3573377\n778.7371961\n787.835835\n786.1813539\n853.5088811\n859.1351385\n928.7459153\n918.674958\n933.6863985\n939.7496526\n942.3993169\n939.0273826\n944.3362001\n956.8007646\n920.947656\n880.4900035\n865.2484589\n859.6448838\n824.9100224\n826.6410027\n808.700256\n801.4081714\n789.0006741\n802.3976527\n803.6917375\n804.3349092\n884.6315368\n880.8147014\n1117.444028\n1227.432053\n1271.237363\n1314.401195\n1333.06337\n1334.068821\n1284.421526\n1313.550931\n1310.689264\n1311.521763\n1319.707497\n1329.130873\n1065.303118\n1073.79061\n923.863202\n872.9060841\n805.6027106\n814.4186568\n796.4557717\n801.2412201\n817.274789\n835.6164297\n924.5554603\n919.0004369\n1139.190858\n1253.684909\n1297.395817\n1337.990155\n1331.617106\n1333.490652\n1289.229174\n1326.016604\n1328.473203\n1326.545447\n1350.650254\n1371.851479\n1101.319154\n1071.97701\n938.4177261\n874.8785992\n803.950683\n806.3745778\n793.2196687\n792.0848226\n789.5617739\n792.3282725\n885.4484497\n876.6354365\n1103.625422\n1222.251313\n1256.63806\n1295.670031\n1307.70588\n1312.044676\n1272.029279\n1307.366175\n1306.272234\n1309.427797\n1322.673202\n1333.640008\n1056.903742\n1047.882589\n912.5736848\n872.6849786\n807.7064913\n802.5732598\n789.5389177\n790.1920982\n795.7037198\n794.6316543\n875.5770692\n876.9499487\n1099.790545\n1217.504001\n1254.785073\n1292.183866\n1303.213776\n1310.184174\n1272.226891\n1305.495014\n1311.086854\n1313.940405\n1323.285281\n1333.364355\n1054.588461\n1048.89899\n916.7443926\n869.918696\n803.3485684\n803.9361974\n792.2492551\n792.0030422\n790.4929056\n790.0078913\n879.9105511\n884.493141\n1112.459072\n1226.653061\n1260.058319\n1295.066074\n1308.373768\n1313.270676\n1272.48234\n1309.166465\n1305.612141\n1306.769427\n1313.180317\n1326.541864\n1051.94669\n1047.116161\n912.1543003\n870.4109671\n798.262162\n806.9879829\n796.1007382\n797.4453195\n793.7773245\n789.7573338\n795.227457\n796.51889\n872.8420352\n988.7171463\n992.6751319\n1102.43134\n1109.389585\n1107.38007\n1075.127544\n1069.183883\n1071.704725\n996.3685694\n1002.202259\n972.8475107\n931.4151355\n921.4875201\n807.5414407\n805.7530869\n796.8282286\n797.9289118\n773.1777658\n774.0821616\n773.2096159\n772.198682\n781.3999958\n780.9822479\n849.6803565\n846.2162948\n918.1183645\n923.9478714\n949.9851787\n941.5311781\n960.3509284\n954.8999817\n968.7856604\n976.4237994\n921.2748835\n896.9217738\n865.8075413\n841.4447263\n809.3307314\n807.6687615\n811.0441722\n814.5203937\n814.5233733\n807.1603372\n814.5468363\n815.0228312\n885.7687649\n884.0976832\n1111.50787\n1225.814478\n1260.748019\n1299.934282\n1311.210785\n1303.328853\n1264.393529\n1302.38183\n1305.856602\n1306.445568\n1308.345166\n1324.55209\n1055.581168\n1058.594687\n922.549449\n883.1369246\n810.2436704\n808.5805492\n793.6149826\n795.0435406\n795.3174916\n793.7276111\n887.9124583\n890.4191347\n1117.346868\n1224.38591\n1262.151809\n1299.915922\n1309.619874\n1307.163279\n1269.308002\n1308.286333\n1310.388304\n1305.119755\n1309.016683\n1331.242769\n1060.007869\n1054.02429\n915.2985502\n869.8336594\n806.8356073\n805.9793451\n797.3007963\n794.7815564\n796.1601394\n796.6706079\n883.6213843\n884.0186077\n1104.740567\n1219.86677\n1263.339839\n1295.634232\n1301.826436\n1305.99049\n1267.425588\n1304.04822\n1307.314492\n1302.412635\n1313.084844\n1329.928211\n1056.609499\n1052.083185\n918.9666395\n880.1671819\n813.5210201\n814.3312721\n801.1184427\n800.8164921\n798.6576504\n794.1363589\n880.4043403\n878.7169072\n1107.958835\n1223.294143\n1262.07383\n1296.510143\n1307.047899\n1312.817125\n1278.128698\n1314.37706\n1316.449551\n1319.620128\n1323.481095\n1335.841551\n1058.542705\n1051.402452\n917.4468731\n878.9361456\n812.7208594\n813.3783743\n800.1874317\n799.2713854\n799.3794235\n799.6937826\n892.7086797\n893.6310158\n1122.138148\n1234.823245\n1269.985699\n1303.065076\n1315.846284\n1324.602537\n1286.266639\n1320.524664\n1317.69836\n1316.429494\n1320.122798\n1335.412151\n1060.256548\n1052.742269\n917.0925029\n875.0439915\n804.4276442\n802.8275945\n790.5328877\n791.9426026\n793.5025211\n791.9375506\n803.89061\n805.110867\n876.0326876\n983.4991724\n987.3739247\n1094.523412\n1103.876863\n1108.651572\n1082.044399\n1077.144527\n1077.585577\n1000.923461\n1010.535503\n982.8975591\n942.9369509\n936.227305\n824.6523464\n824.3830895\n815.0976612\n815.8848701\n791.5999094\n791.254832\n790.6418256\n789.262549\n799.3286178\n801.5075653\n876.0946575\n871.7090183\n946.4649667\n938.4521542\n949.2617428\n956.073492\n955.8455888\n947.8914547\n949.4452445\n953.5832792\n927.8737794\n900.1376664\n858.0677469\n842.3752356\n815.2624153\n805.5185841\n790.5864359\n792.4603717\n783.294213\n785.2963892\n788.7226541\n790.2923165\n809.5894464\n813.4797067\n892.9595792\n883.9700963\n956.4120572\n956.6230227\n953.5180235\n942.718081\n945.4820204\n948.0181688\n958.1348643\n955.1695588\n927.8879833\n895.3944534\n863.2371417\n854.4276398\n822.4951039\n823.5561618\n813.8745725\n814.3015739\n812.9173436\n812.1199406\n811.1490207\n810.8981297\n903.9249335\n904.8521079\n1134.195871\n1245.447498\n1285.287875\n1303.857015\n1290.697354\n1284.020476\n1245.388894\n1281.283656\n1283.904906\n1291.419794\n1309.128027\n1339.638888\n1077.568107\n1065.811465\n934.4226883\n895.833649\n820.9219467\n819.8359363\n802.4138917\n800.786259\n797.4959188\n795.6850758\n886.2108477\n887.4466196\n1129.175094\n1237.711493\n1275.220063\n1305.886625\n1307.303189\n1310.259655\n1284.689501\n1319.629235\n1306.529429\n1303.890008\n1324.236158\n1346.415755\n1079.067388\n1067.888987\n926.6150115\n881.0455009\n813.7363249\n819.2444399\n808.5431791\n812.3776143\n805.9658784\n802.0613512\n898.3807382\n899.4405295\n1139.794094\n1256.960066\n1295.077375\n1303.031344\n1293.624742\n1306.831024\n1244.041497\n1274.609389\n1279.373356\n1282.170071\n1291.94472\n1315.72082\n1053.980759\n1055.624295\n911.354738\n861.5095025\n799.1100734\n806.5670172\n792.2690853\n784.1160926\n790.7962002\n800.741864\n901.1016295\n902.9035072\n1135.838606\n1253.9304\n1287.358153\n1312.08053\n1314.69079\n1333.249415\n1296.315968\n1328.921113\n1329.156617\n1315.741173\n1322.306217\n1346.635905\n1080.757116\n1070.358765\n933.9036576\n893.2261257\n825.0044228\n825.55142\n812.4348883\n811.5933323\n811.3666557\n810.4330213\n819.4004553\n818.3302691\n888.5544225\n995.6400887\n1002.732722\n1114.400389\n1125.033981\n1128.261788\n1096.474454\n1088.604228\n1088.473667\n1011.373154\n1019.104777\n987.1464145\n949.4894194\n940.5094596\n826.2736031\n824.4967162\n816.702504\n818.215458\n793.2257128\n793.284538\n792.9852559\n792.547842\n800.5716027\n800.2005016\n873.6031779\n869.6426173\n947.1968741\n942.5075383\n952.595203\n954.6862219\n952.9852123\n945.0714273\n944.6056457\n945.3396727\n921.3204589\n888.9300236\n867.478317\n863.0684259\n820.9721924\n812.6666203\n796.6610594\n796.4722767\n820.0046876\n817.4679992\n812.7542373\n808.4889216\n895.5085279\n893.6077194\n1119.983455\n1231.408277\n1267.893495\n1299.923394\n1306.430827\n1308.483904\n1267.069626\n1302.901827\n1303.967555\n1303.990898\n1313.178559\n1325.16446\n1070.423192\n1068.931634\n935.5871942\n892.9595232\n824.9409656\n830.8194553\n819.03846\n816.8630838\n814.5345365\n803.7496815\n901.9454906\n892.0865931\n1116.99983\n1234.699674\n1276.101342\n1318.034151\n1325.479974\n1327.700087\n1290.315735\n1328.309367\n1333.109027\n1333.194396\n1339.671943\n1345.356116\n1081.475824\n1067.428362\n925.2953807\n886.4668687\n825.065726\n820.4929337\n814.1451444\n810.0481529\n799.1381772\n796.7441296\n885.0803829\n905.0836439\n1132.810622\n1239.850601\n1287.940948\n1327.842544\n1315.109802\n1323.294195\n1287.938286\n1312.614685\n1312.415608\n1313.008643\n1320.988445\n1329.203841\n1057.164794\n1048.142769\n917.7833435\n879.6565474\n809.6761577\n811.2044404\n796.1352765\n793.3345587\n798.3926132\n800.115063\n887.1473379\n888.0531551\n1109.937348\n1223.583297\n1263.581965\n1294.895824\n1303.96497\n1306.24981\n1265.523524\n1303.76712\n1308.526125\n1310.173478\n1314.74126\n1328.032669\n1059.370436\n1051.185938\n914.4462426\n874.6079259\n813.334115\n820.335908\n807.2731503\n801.768757\n791.7885655\n791.9951699\n881.0077675\n879.5698141\n1104.288799\n1224.479386\n1257.525967\n1308.234804\n1328.841396\n1330.545693\n1294.989672\n1341.040705\n1337.968382\n1341.180038\n1347.021886\n1343.787861\n1057.848655\n1044.224669\n910.9255399\n881.6293926\n828.5706802\n830.7087102\n811.2479803\n809.3546642\n806.7544951\n802.461589\n807.8042381\n806.0660451\n866.6387442\n975.5056614\n983.2647937\n1099.158938\n1112.27969\n1116.184759\n1085.363668\n1080.649513\n1081.920493\n1004.662816\n1006.172372\n973.048365\n936.8678581\n928.4013621\n815.5996169\n814.3642676\n802.8530457\n803.2765929\n778.9707739\n780.6214003\n778.3543561\n777.1929156\n782.9820153\n783.2807763\n852.1667835\n847.8872117\n923.4678683\n917.0289489\n927.2374591\n930.9939332\n934.9457157\n931.4403745\n934.6592611\n936.497668\n912.366201\n879.2505662\n851.3524284\n836.1282118\n805.78808\n806.3906428\n796.2215004\n795.3319297\n789.0276545\n788.9056113\n789.7042676\n789.1461144\n873.8706352\n874.5332212\n1100.21343\n1213.411143\n1252.809635\n1289.391403\n1298.500704\n1300.40833\n1262.679078\n1302.375036\n1309.705879\n1318.376802\n1327.667529\n1336.1071\n1065.625905\n1057.323056\n920.6369805\n881.4356496\n813.3145327\n811.7796755\n796.9489388\n797.9195026\n799.2421094\n797.6043216\n888.6716659\n890.4474008\n1118.343718\n1228.978478\n1269.297595\n1303.846663\n1312.085927\n1315.356432\n1275.329956\n1312.613273\n1313.267226\n1314.859375\n1324.682778\n1338.450591\n1067.462168\n1058.164801\n923.1077473\n881.716498\n815.3356549\n814.1120821\n792.282707\n791.5364256\n793.3357939\n794.4248283\n880.1576542\n878.05898\n1108.215037\n1224.57255\n1264.725382\n1300.656046\n1312.194528\n1322.417313\n1292.889709\n1326.522339\n1321.861415\n1317.827822\n1328.64526\n1338.36077\n1062.208679\n1053.454614\n919.5170634\n880.3062271\n810.8231498\n811.226871\n798.8546999\n796.4778781\n794.8869054\n793.8488724\n880.2268165\n882.3807009\n1111.285571\n1227.215655\n1268.833902\n1306.123662\n1315.958768\n1320.248302\n1282.12241\n1318.622823\n1320.994417\n1322.86814\n1329.093061\n1340.112583\n1068.5652\n1057.736312\n920.254499\n877.2682774\n809.8838737\n810.5848587\n798.2459185\n799.7772087\n800.147958\n800.3596846\n889.2687303\n888.4362517\n1114.134593\n1227.817094\n1268.639641\n1305.046136\n1313.571098\n1318.234328\n1281.499331\n1319.275324\n1322.949448\n1324.849581\n1333.726876\n1343.457224\n1069.233655\n1058.998466\n921.5040821\n880.443563\n815.5500448\n817.7164145\n805.6411497\n803.4509172\n800.5071974\n798.0514596\n806.3582304\n808.2857664\n879.644921\n985.4163025\n987.5632293\n1095.751284\n1106.218468\n1112.28463\n1086.766292\n1080.89875\n1074.236193\n990.2808011\n1005.750387\n985.2367725\n956.7468978\n948.9061401\n836.9827282\n838.8314658\n828.5180206\n825.2674903\n797.7670262\n794.2537124\n792.3619584\n791.2692155\n799.292868\n800.9192134\n872.6831761\n862.0620074\n931.4899981\n926.0628967\n941.2555726\n947.4102477\n950.319138\n945.8300808\n948.316309\n950.6716879\n926.0271992\n884.4177921\n858.0189122\n849.0650422\n818.2351428\n819.485471\n811.1324628\n813.8019881\n814.0781417\n813.9528895\n811.8226659\n809.1293561\n897.7599505\n899.5026223\n1129.333602\n1237.995787\n1278.976331\n1311.844066\n1320.184339\n1323.625913\n1282.670242\n1309.339254\n1304.168306\n1296.354262\n1313.144689\n1338.982865\n1076.547394\n1064.232219\n926.1990879\n882.9948429\n812.5253139\n812.3056805\n799.3576579\n797.4844974\n797.4864895\n798.2699252\n884.0081033\n880.3076557\n1111.085698\n1222.151093\n1266.172925\n1301.683068\n1313.590978\n1324.040151\n1279.960637\n1307.113816\n1306.696177\n1305.653853\n1319.8706\n1339.59838\n1074.198741\n1062.879481\n927.0699192\n887.3288042\n819.0142368\n820.7301349\n810.5885494\n812.3161143\n812.8635106\n813.0032765\n901.8881373\n900.0168955\n1125.800451\n1234.684066\n1281.393483\n1320.94836\n1328.370027\n1327.416347\n1282.5975\n1320.865196\n1329.39995\n1330.711563\n1335.638457\n1342.266882\n1073.615018\n1065.144425\n929.4305839\n888.1209103\n818.3781188\n817.2270994\n802.8217996\n800.3428839\n797.5806575\n794.5852662\n881.7926999\n881.5147964\n1110.11616\n1219.804444\n1268.89196\n1313.010346\n1328.344104\n1332.063418\n1291.399447\n1325.635439\n1319.929964\n1313.478324\n1325.000766\n1342.829666\n1074.101634\n1064.27167\n929.0491808\n888.7351826\n820.5564135\n821.3763946\n808.9032346\n807.0705606\n802.8727974\n798.3480977\n887.3172724\n886.0438258\n1113.611915\n1222.040905\n1266.091413\n1303.00889\n1315.021812\n1321.50895\n1285.556781\n1324.613489\n1310.292377\n1288.80188\n1303.711916\n1335.079556\n1078.290981\n1065.487147\n930.6005956\n891.418712\n823.8700462\n823.4046612\n809.4280814\n806.060334\n801.0877321\n796.2339032\n801.8850193\n801.2945871\n875.1830044\n982.4664468\n993.0197735\n1101.437701\n1112.198784\n1121.866389\n1094.221743\n1076.668134\n1065.469161\n979.9720713\n996.3378029\n980.1399931\n962.1501256\n950.9647211\n836.6723672\n834.4716507\n822.7466275\n822.9681777\n798.7460022\n798.3574118\n798.6446777\n799.1248105\n808.5553815\n805.8807689\n875.9429749\n865.916165\n945.636952\n939.2431771\n948.9732262\n953.7594179\n956.5127293\n952.1092276\n937.097142\n922.6199391\n905.5961795\n886.8970765\n870.2351399\n858.0419012\n823.3670231\n820.3176772\n807.8854568\n807.0873335\n804.0473034\n801.9467813\n799.3699886\n796.6832389\n884.705627\n885.3866038\n1114.240884\n1223.37059\n1267.487822\n1304.431438\n1318.272154\n1324.256813\n1264.353866\n1282.753482\n1274.384091\n1265.121904\n1277.886078\n1299.576443\n1053.346184\n1059.125945\n937.6643487\n896.4888225\n824.7646227\n822.6333185\n807.5223638\n804.2446686\n800.4065103\n796.7463376\n886.0828254\n885.7533712\n1113.861017\n1224.667369\n1277.173297\n1306.867895\n1293.21431\n1272.914855\n1216.967002\n1245.619761\n1256.79015\n1265.838669\n1284.504506\n1299.27532\n1044.976622\n1051.767761\n931.7850083\n887.3422114\n815.1907839\n812.5353033\n797.0055895\n794.1669781\n794.0555557\n794.7943139\n881.4842302\n882.5852859\n1114.580213\n1230.025523\n1281.537316\n1313.498953\n1300.976457\n1285.746455\n1230.692447\n1253.907775\n1244.916298\n1236.249257\n1239.156956\n1257.927986\n1027.723168\n1034.637138\n910.6888639\n880.0465621\n819.7005351\n828.5984179\n815.6941234\n811.9435687\n808.0324838\n803.7745781\n891.5094438\n893.0670889\n1124.62956\n1238.411415\n1287.074066\n1319.121981\n1308.211965\n1292.180703\n1236.679805\n1266.8996\n1269.199099\n1270.533906\n1289.060383\n1317.026684\n1076.070149\n1073.173179\n935.5473295\n892.9172162\n822.8241039\n821.6385309\n807.2297388\n805.4034847\n804.2149806\n803.2591912\n893.3344557\n891.3879418\n1124.127679\n1225.43882\n1268.646708\n1315.5172\n1310.497432\n1292.303174\n1234.820665\n1261.418824\n1256.376732\n1252.037436\n1263.167206\n1276.940889\n1036.465936\n1042.028816\n915.9946318\n886.9393026\n824.6244733\n821.0521102\n806.9106851\n804.2533391\n803.4909127\n804.2971304\n808.570848\n804.2366362\n872.1753655\n978.6792051\n998.8078616\n1113.95223\n1109.339577\n1098.601411\n1054.625486\n1043.531905\n1042.878743\n960.9024166\n987.5826656\n983.6208277\n957.5866218\n941.4589852\n826.134571\n823.7204753\n812.2314986\n812.3999433\n787.9720611\n787.3733789\n787.1710361\n787.1043804\n796.4540861\n794.2189725\n860.7781172\n855.5331198\n937.6373716\n934.3015087\n947.2045274\n954.3689231\n956.4276393\n949.4910076\n952.7781519\n953.0636407\n924.9725684\n878.1260939\n854.6745901\n843.9674193\n809.8766915\n807.3658748\n795.5227057\n796.8205017\n785.1479789\n785.5882958\n785.519758\n785.5667209\n792.1589628\n791.9084553\n860.17128\n859.3947556\n942.4034654\n938.2997392\n948.4585615\n951.1723406\n951.3868146\n944.4981116\n944.2935534\n943.9217926\n918.094779\n875.0854927\n856.1732047\n850.0874772\n820.1868079\n821.401014\n813.4098708\n816.4772902\n817.1504247\n815.8991655\n799.2382172\n785.7846893\n885.6321514\n905.7694797\n1140.91109\n1248.265485\n1286.534251\n1317.219065\n1322.83653\n1323.249957\n1281.128792\n1314.306687\n1314.915984\n1315.869272\n1323.000101\n1326.359552\n1068.608604\n1060.246002\n926.5137546\n887.5661428\n819.3507088\n816.8302283\n800.6234004\n799.7168032\n799.2793856\n798.1043647\n883.5361509\n883.8007961\n1107.597768\n1219.21898\n1263.955361\n1304.819705\n1317.688619\n1320.543336\n1282.606234\n1321.525389\n1325.247426\n1329.83564\n1339.965542\n1343.060931\n1081.687838\n1073.570765\n936.2470646\n895.1453274\n826.977562\n821.6122079\n804.9166076\n801.0985693\n797.1275666\n793.2806157\n881.2448301\n887.5148226\n1119.93884\n1237.535255\n1279.707358\n1313.124135\n1323.900307\n1330.601006\n1287.514853\n1327.911848\n1337.07616\n1339.653229\n1346.440054\n1350.001879\n1086.827948\n1077.683491\n941.8997992\n900.9903887\n834.2257865\n832.063418\n817.5866453\n816.2083424\n814.6560941\n812.5564463\n904.7480299\n908.9828415\n1135.901722\n1247.472376\n1285.397798\n1317.439905\n1327.933688\n1334.297989\n1297.265227\n1331.748164\n1331.797931\n1328.032809\n1337.440609\n1341.999683\n1078.553204\n1066.177885\n924.5383815\n881.0835727\n819.1031997\n825.6633759\n818.033658\n816.7384439\n813.9633657\n810.6861975\n816.644912\n817.0121171\n883.8343392\n988.2288033\n993.6726753\n1101.83178\n1119.186816\n1134.65748\n1117.546516\n1112.024783\n1108.651553\n1024.736693\n1026.204663\n980.4001578\n949.6887309\n939.2728743\n825.9737706\n824.2838912\n816.0991848\n817.6166857\n794.6350124\n794.9172165\n795.7198413\n795.2429799\n801.4314037\n800.269621\n866.5642035\n856.8733464\n933.3902566\n927.2516078\n941.071958\n947.9628781\n951.5504517\n942.3043258\n937.6391866\n934.3739097\n916.3536263\n882.8084533\n861.7336692\n852.4061639\n819.7895715\n818.5785338\n806.8801381\n805.1939436\n800.7612724\n797.5849504\n797.4426257\n797.0918905\n884.02322\n884.681065\n1107.642392\n1216.541234\n1258.922265\n1300.672805\n1316.491478\n1321.192797\n1264.613928\n1289.710856\n1287.716028\n1285.21772\n1302.445351\n1324.742611\n1074.654284\n1063.662275\n928.1365704\n887.6599102\n819.6462925\n820.8680777\n808.953204\n809.0660297\n808.5185784\n807.7576786\n900.0733588\n900.4262627\n1124.762692\n1235.181769\n1275.074402\n1306.797922\n1314.31719\n1319.723047\n1287.712765\n1328.027831\n1333.692745\n1337.976154\n1342.427206\n1341.685234\n1075.311438\n1070.113899\n939.0390864\n901.9454334\n838.5186942\n839.1330345\n790.961297\n796.1068292\n801.2971449\n803.217094\n895.5383728\n898.4501862\n1123.47917\n1237.949444\n1282.13258\n1316.796688\n1325.365964\n1331.601127\n1258.916341\n1266.118867\n1244.960643\n1234.060484\n1251.533984\n1287.513589\n1072.174934\n1069.828853\n939.534668\n898.6403792\n828.9027517\n829.2417361\n814.263167\n811.5821107\n812.505719\n812.1933507\n898.7386073\n897.802972\n1127.804321\n1247.729539\n1269.682396\n1281.180291\n1278.092501\n1268.180625\n1227.695413\n1252.542789\n1238.24145\n1227.253533\n1232.355626\n1236.671605\n1005.772064\n1057.933711\n938.8335056\n901.1051376\n832.4076072\n832.9449623\n818.1782938\n814.3529445\n812.0219777\n809.2424116\n898.562984\n896.3610312\n1117.284558\n1240.116466\n1269.396114\n1282.872118\n1289.86647\n1278.228938\n1228.474739\n1256.6781\n1262.568915\n1274.352781\n1286.524897\n1288.041301\n1037.479558\n1036.418481\n911.6210445\n880.037399\n814.3654595\n819.2703668\n808.6739565\n818.3154811\n822.3722048\n811.1863283\n826.9181979\n831.6067109\n896.1032366\n1009.486928\n1009.702443\n1102.297659\n1098.554691\n1094.001637\n1044.01135\n1030.41795\n1037.649031\n960.8176958\n989.1030884\n950.7843286\n929.2225291\n919.2169371\n804.5394851\n807.7302392\n796.11874\n795.3529691\n775.1946291\n773.5345718\n793.4323431\n795.2464311\n803.8547314\n811.2119535\n882.9001969\n879.1301193\n963.4667831\n948.8579849\n962.5054298\n961.9417655\n956.4273923\n954.6896776\n952.9179765\n953.2836997\n928.692528\n881.9105424\n864.8129392\n855.7134189\n823.5259711\n822.6527315\n811.7643211\n810.275195\n805.2857416\n803.2828607\n802.9220114\n803.7784335\n895.8898549\n898.0291968\n1118.46125\n1235.79961\n1283.077784\n1311.465979\n1304.232607\n1296.913162\n1233.303786\n1255.524346\n1259.071068\n1268.639088\n1285.187348\n1297.28399\n1055.846664\n1056.771791\n926.6067641\n892.4181398\n827.1685354\n828.2131682\n815.2663704\n816.3818319\n814.854924\n811.7101163\n902.8349674\n900.8741797\n1120.106883\n1237.093588\n1279.162548\n1286.515777\n1284.984083\n1275.280139\n1251.790993\n1278.383484\n1245.342897\n1257.19963\n1288.79403\n1315.76659\n1079.113331\n1065.129671\n928.0223002\n886.1745864\n816.5122511\n815.0377201\n800.5975051\n800.8980479\n799.8797667\n796.9004823\n884.3139271\n882.7248753\n1102.429301\n1222.738967\n1272.888355\n1317.999267\n1331.656416\n1319.62314\n1248.946798\n1273.427912\n1280.375521\n1293.979549\n1309.980869\n1336.398256\n1076.547572\n1064.208015\n926.7995992\n884.883983\n817.0202701\n818.8893727\n804.7869277\n801.4335346\n800.069241\n799.4371867\n890.2496935\n894.1061168\n1117.417278\n1238.899985\n1285.065283\n1323.072782\n1328.86433\n1314.967848\n1268.927045\n1299.306858\n1297.150479\n1318.72182\n1340.52659\n1339.496085\n1074.830411\n1066.877712\n932.0622793\n890.8965011\n820.6114322\n820.7652094\n806.9931379\n805.552097\n802.1816708\n800.7640296\n899.9267959\n906.1630519\n1131.430791\n1251.464695\n1282.475066\n1307.61207\n1319.874876\n1294.318559\n1245.052337\n1289.731573\n1283.794509\n1291.580617\n1305.204661\n1321.951127\n1082.7583\n1071.008434\n932.4709265\n888.3132218\n818.0945535\n817.4089752\n802.9222057\n801.35799\n800.2830777\n798.8345748\n806.8101091\n805.4628089\n871.9585244\n990.5215202\n1007.999065\n1118.528313\n1125.483905\n1107.173679\n1058.357054\n1055.528032\n1060.25467\n983.6116407\n997.9483156\n967.729714\n952.0599688\n951.421667\n839.3527076\n825.5344401\n806.5954255\n809.5159851\n812.7633437\n821.2007282\n813.7914936\n816.590691\n818.9845474\n888.1397372\n897.9306027\n957.6610239\n928.5795455\n916.7145781\n923.3226864\n920.2872043\n911.6179274\n919.7466639\n925.5833415\n898.0057719\n840.6522613\n819.2464158\n809.0351382\n788.6613123\n811.7205707\n816.1572344\n809.7753487\n805.3224369\n817.2019763\n810.8214335\n803.900395\n893.8401792\n889.0160801\n1111.214561\n1224.76117\n1265.117515\n1289.925449\n1300.11607\n1295.062432\n1241.091835\n1256.556284\n1248.227423\n1240.609082\n1260.656068\n1281.28996\n1013.91432\n1036.139676\n910.0020068\n872.6946537\n816.1973471\n830.0541354\n809.7284125\n811.8379025\n808.8965869\n822.6174399\n890.7253366\n895.7536586\n1121.711478\n1229.556528\n1268.909522\n1310.498239\n1296.209829\n1291.189425\n1237.76585\n1267.298403\n1256.642695\n1248.632557\n1280.612696\n1293.849973\n1043.519655\n1082.826547\n955.9258409\n896.7635242\n822.3593871\n820.6933658\n802.035455\n800.1412498\n808.9661207\n815.9825719\n882.7910563\n888.1508963\n1124.616836\n1240.131743\n1281.512163\n1322.182784\n1328.614572\n1311.38291\n1257.455044\n1285.425409\n1287.921462\n1282.288029\n1290.629035\n1297.417961\n1044.825868\n1061.940332\n935.5710704\n898.9452272\n830.890227\n830.7563635\n819.3131694\n815.1827893\n810.3229421\n807.4389359\n892.9365806\n904.0505496\n1145.082818\n1252.080021\n1277.654858\n1317.319322\n1328.179788\n1332.396528\n1286.336869\n1318.717476\n1319.305075\n1319.59149\n1321.708245\n1328.077487\n1056.904427\n1061.743873\n923.8689395\n881.4365181\n813.0040934\n813.3845706\n800.2469823\n800.4809282\n799.1043432\n795.952127\n886.5969244\n884.9808701\n1109.726669\n1221.382827\n1266.670011\n1313.080784\n1328.610941\n1326.047402\n1278.111912\n1298.258711\n1290.370937\n1275.901743\n1302.780068\n1325.03063\n1057.689542\n1062.273366\n927.3323298\n888.4888371\n820.6507708\n821.3724447\n808.8687447\n808.8155111\n807.6273873\n807.0000233\n818.4180379\n817.5878061\n889.4507312\n1000.805182\n1009.440099\n1121.352388\n1131.486071\n1131.066662\n1091.394926\n1086.560613\n1074.990376\n988.0628858\n1003.516271\n973.5867731\n943.2155465\n947.7096213\n832.1575724\n831.9074417\n824.3021645\n826.1216439\n811.8904324\n797.7801562\n793.7380376\n789.6535779\n798.5156107\n800.9690123\n874.7948175\n878.6851595\n961.3546769\n954.5353777\n960.8799258\n963.9912147\n959.0973117\n945.1063478\n931.0030744\n928.6250585\n914.134717\n879.2900558\n845.4694884\n843.160678\n812.3701848\n811.0706854\n800.5204457\n803.0696256\n791.8775817\n801.5298111\n799.6838497\n798.5948467\n885.5355203\n881.4031975\n1108.694359\n1222.30168\n1264.747169\n1308.443455\n1317.512949\n1316.642804\n1271.446386\n1298.619729\n1301.545725\n1309.125433\n1326.957568\n1329.980664\n1053.427509\n1054.256545\n920.8246063\n879.98773\n813.1167786\n815.2391599\n802.638333\n803.4782407\n807.1777276\n807.6765622\n900.732564\n900.3199043\n1126.90854\n1240.847306\n1284.901796\n1324.122211\n1327.20694\n1320.481011\n1267.785585\n1298.188046\n1304.82561\n1327.145859\n1331.910126\n1327.614829\n1046.690347\n1049.83745\n922.7200007\n885.7601971\n825.1244469\n839.0847091\n819.2443586\n818.7283711\n825.1937268\n825.2721547\n908.4824124\n906.6868347\n1133.45298\n1234.640881\n1268.376101\n1297.204059\n1308.342488\n1317.851385\n1280.422153\n1321.099394\n1332.418619\n1331.413815\n1351.003232\n1348.053843\n1069.489343\n1073.656452\n938.0367861\n894.5141641\n827.8490648\n822.8994119\n803.3813824\n801.4819794\n801.6995599\n801.0723367\n887.9982804\n887.6501297\n1110.400623\n1219.460989\n1266.294814\n1307.659475\n1319.504914\n1321.857167\n1284.714528\n1326.778707\n1329.746407\n1331.114573\n1331.480539\n1332.523857\n1055.647357\n1058.149009\n925.5927939\n882.3729139\n814.1725926\n814.5507818\n809.345128\n815.8996809\n812.4608992\n814.7071297\n913.9816157\n912.5548815\n1134.116999\n1236.241299\n1273.332266\n1309.418488\n1327.934277\n1330.398596\n1284.04034\n1314.330895\n1315.381277\n1322.297745\n1329.833958\n1327.74681\n1048.998411\n1050.70922\n918.1443883\n876.5473885\n808.398395\n808.2624299\n795.4172995\n795.2691747\n794.7003453\n793.6656453\n803.5405996\n802.9290345\n874.0328671\n978.265562\n989.3748743\n1100.353959\n1110.91019\n1119.099199\n1091.354034\n1083.140407\n1085.791843\n1004.415329\n1015.873384\n972.5755361\n931.632184\n933.6851679\n825.1084098\n825.6010587\n817.3513162\n819.0772\n806.7967036\n796.094834\n797.2168127\n797.5117905\n807.7113492\n806.9829705\n879.8736333\n872.9013471\n954.295449\n950.3705723\n948.6593898\n942.7006137\n927.2575667\n914.6581355\n908.6014794\n919.5810779\n901.3301526\n871.5528262\n855.1614369\n854.2584705\n821.8725032\n818.192349\n805.7839422\n806.1891215\n793.5615068\n804.6575833\n805.3921819\n806.4088927\n895.6063505\n895.1153681\n1123.563477\n1231.64156\n1273.771586\n1311.016936\n1325.189209\n1324.261756\n1258.690938\n1273.301795\n1265.478617\n1256.447924\n1262.213802\n1282.708744\n1047.466203\n1071.940521\n936.9229494\n894.216004\n825.0216013\n825.5113157\n810.8028619\n807.2136867\n804.2530183\n802.221913\n895.8450641\n898.7780139\n1128.523856\n1235.963615\n1279.551484\n1318.534295\n1325.116356\n1311.459893\n1264.131797\n1274.871294\n1272.976459\n1277.576055\n1284.592166\n1286.796044\n1048.523204\n1062.587218\n927.0332427\n887.1418983\n819.4364866\n820.2155256\n806.8928906\n805.4706882\n803.3298644\n800.8093222\n888.0659277\n887.4041537\n1120.513812\n1230.801127\n1279.410807\n1318.340249\n1314.921995\n1309.294305\n1256.399708\n1259.927133\n1253.490348\n1249.538362\n1261.832339\n1282.363039\n1023.13863\n1044.088836\n931.9615295\n895.6699426\n821.8579307\n827.9888304\n823.017826\n819.854899\n816.2925625\n814.5842686\n903.0696507\n903.4057851\n1133.082604\n1244.328623\n1289.935063\n1314.697062\n1313.908702\n1308.508078\n1255.031932\n1285.61304\n1291.2913\n1298.56037\n1318.040136\n1326.682326\n1060.52745\n1061.484019\n927.8089243\n886.9120134\n818.0961258\n818.0302104\n804.8661991\n802.5330346\n800.555476\n799.0477936\n887.4738438\n885.4628291\n1115.649535\n1226.04542\n1276.795245\n1316.554374\n1313.62712\n1297.355956\n1246.476047\n1264.400808\n1263.076749\n1272.253406\n1287.257124\n1301.669271\n1045.43673\n1062.714536\n930.6929638\n890.5845996\n826.2589233\n829.5953787\n799.5361973\n826.7621442\n818.4434952\n846.92291\n832.9142422\n809.9880094\n870.0759185\n954.681177\n959.2366353\n1067.965501\n1062.400855\n1065.900101\n1033.094416\n1014.398986\n1015.635356\n945.7650002\n953.8455929\n902.8859678\n882.6909548\n902.0551034\n795.7459523\n796.5579884\n796.5410558\n802.6891103\n796.2301191\n800.9962844\n804.2470718\n796.8765663\n798.3430098\n810.8091297\n877.3153393\n868.6302891\n927.5624045\n909.3193947\n910.216346\n904.9991549\n891.6370878\n870.6606434\n857.2168504\n856.418413\n833.4035701\n788.5311912\n771.0376214\n791.6501821\n772.7229746\n773.3173819\n768.5202963\n772.234716\n768.5564163\n786.4664578\n814.9980648\n821.5053008\n908.2692631\n908.6647362\n1133.079882\n1245.199486\n1285.585579\n1298.867281\n1284.897962\n1269.9424\n1219.707557\n1251.790118\n1247.424494\n1239.650729\n1249.297928\n1267.982243\n1021.350099\n1050.636616\n931.0825396\n896.7408228\n830.5823269\n828.7693428\n814.4647206\n814.6551577\n813.6661418\n811.9739692\n903.1472204\n902.6392153\n1128.559837\n1241.763221\n1286.130079\n1321.749112\n1325.992184\n1316.157848\n1262.128992\n1292.577588\n1297.087393\n1299.41697\n1310.328018\n1322.022382\n1060.699773\n1061.826764\n929.2821068\n888.1749573\n818.9629961\n818.3339323\n805.4516451\n805.2901984\n805.2364539\n804.5356974\n894.0015218\n896.1773987\n1123.68369\n1237.524965\n1280.231048\n1316.678417\n1327.212822\n1324.209511\n1271.505306\n1299.079161\n1297.319798\n1297.787648\n1314.340778\n1324.185566\n1059.138769\n1053.349336\n922.7825804\n880.3613929\n811.2431754\n811.7367546\n799.5725773\n801.6293826\n804.0560859\n804.3309396\n892.6538521\n892.2174185\n1117.632167\n1231.801299\n1275.563407\n1311.624343\n1324.870071\n1320.928227\n1270.094509\n1297.022594\n1300.238844\n1303.528048\n1315.815402\n1328.895678\n1056.152307\n1051.756128\n922.6029305\n881.8138009\n813.6752652\n813.6289732\n800.8774845\n800.1415654\n797.9126753\n795.3315532\n887.9878763\n890.2137049\n1117.517157\n1231.529403\n1277.522486\n1317.886225\n1332.296165\n1328.862876\n1273.2329\n1286.575503\n1261.388044\n1281.128406\n1304.938901\n1327.111156\n1063.914767\n1058.859001\n929.2396457\n885.6811517\n815.5256998\n815.8616803\n801.5916121\n800.9724228\n800.7819175\n801.1374206\n812.1313731\n812.3888351\n881.2490273\n991.5621064\n1002.941585\n1112.346351\n1121.828765\n1126.898726\n1097.834465\n1090.471057\n1089.921224\n1010.522085\n1016.711425\n972.8222123\n932.1038858\n931.8565506\n828.095649\n828.0985396\n817.9332741\n819.7405979\n808.0261985\n796.4861638\n795.2016395\n795.0906438\n803.8464094\n802.0816075\n870.4297636\n867.517958\n947.6294073\n941.9424448\n953.0111783\n951.9032145\n938.0883993\n926.4423143\n926.7282378\n926.7304993\n901.7569788\n869.4897772\n849.094199\n846.4330337\n819.1491561\n816.6706231\n803.6934102\n802.74198\n789.1927356\n799.0851522\n798.2227968\n798.2599785\n887.2486151\n887.8295505\n1114.52424\n1228.811164\n1272.406118\n1310.841712\n1319.186829\n1311.709983\n1269.282786\n1295.386857\n1295.717515\n1298.308267\n1313.803186\n1327.851223\n1061.24345\n1058.373608\n929.6090578\n888.5384385\n820.5114059\n820.6038273\n807.2266789\n806.9455921\n806.8605423\n806.0284401\n896.7814745\n896.5843795\n1122.928867\n1237.307291\n1283.794277\n1321.289601\n1320.615708\n1293.148455\n1254.937086\n1298.730454\n1275.428181\n1264.973695\n1262.540245\n1260.871942\n1029.408958\n1061.35793\n922.3727992\n886.5905243\n822.9779342\n831.293689\n817.1348824\n815.1004644\n813.5361853\n814.1488744\n905.6703979\n909.2504097\n1132.805093\n1240.599972\n1258.338399\n1278.64913\n1272.041168\n1268.808053\n1223.582816\n1278.567768\n1261.071055\n1260.754767\n1265.844556\n1268.702023\n1005.321955\n1018.232525\n894.4520837\n856.4022609\n809.9739896\n808.6267038\n794.2936618\n788.1324209\n789.3620143\n784.2478675\n873.3478492\n876.1274601\n1112.021232\n1219.223208\n1253.698422\n1282.00768\n1287.078755\n1268.414187\n1224.532348\n1267.160062\n1268.191089\n1277.619051\n1287.874666\n1300.461236\n1042.024022\n1052.847357\n927.9049823\n890.0742564\n824.2866125\n831.6298015\n818.4567492\n816.1066801\n816.1829545\n816.2677542\n908.5787802\n909.2922434\n1131.013028\n1249.214748\n1294.125054\n1328.278703\n1321.66183\n1317.06911\n1281.698374\n1299.198721\n1300.341375\n1296.42424\n1298.097797\n1307.301275\n1056.694928\n1066.157873\n937.240555\n896.3774305\n828.3062301\n827.3598354\n813.5364705\n813.1260168\n813.503802\n814.3874059\n824.8639101\n825.4420442\n890.715922\n1003.683897\n1014.855098\n1123.690218\n1123.957145\n1109.746482\n1066.30873\n1060.402085\n1072.046404\n1003.221977\n1013.628309\n961.0423841\n926.5880944\n936.7185046\n837.5926257\n836.4574264\n825.7574878\n826.2638332\n812.055659\n800.604128\n799.4220652\n799.1630786\n812.4231815\n812.1707435\n877.1426772\n876.3090139\n955.2867131\n938.0423329\n937.5343569\n929.8271256\n930.113509\n925.6832506\n919.973299\n921.1230701\n902.6048143\n857.5940837\n831.6977804\n836.9762465\n810.8448341\n815.6636402\n813.5993732\n820.9447554\n810.9871776\n821.1012163\n819.3009339\n814.6190293\n902.6879489\n903.4197761\n1123.355472\n1239.495966\n1281.225969\n1317.418176\n1325.443962\n1311.085904\n1261.801057\n1293.743596\n1286.754897\n1277.095134\n1293.786871\n1301.32351\n1043.356691\n1054.834841\n930.1888705\n889.8508973\n820.7375439\n822.3054904\n806.3200872\n803.3968129\n805.218999\n808.8782289\n900.1191634\n896.3178277\n1112.868375\n1231.458571\n1280.950314\n1320.268903\n1330.678498\n1324.080757\n1264.142977\n1282.83072\n1281.261725\n1284.910011\n1292.337547\n1297.090338\n1041.289984\n1057.771374\n933.973799\n893.758641\n825.8394328\n825.9017752\n811.8847974\n809.699895\n809.0424982\n807.6921855\n892.743678\n887.385848\n1107.18582\n1231.685731\n1285.245524\n1317.810671\n1310.467944\n1296.077071\n1246.751316\n1278.604486\n1278.110537\n1280.37185\n1290.846707\n1305.651123\n1051.316824\n1061.357067\n934.2610284\n894.9576575\n827.9865492\n828.4995664\n815.2121998\n814.2992277\n811.1233701\n809.3043294\n902.2778664\n904.0142286\n1127.377938\n1248.443778\n1288.072278\n1312.965504\n1309.345509\n1303.290472\n1240.623046\n1266.195329\n1270.222079\n1274.216809\n1287.137006\n1293.313698\n1033.381825\n1052.350495\n938.1761332\n898.9605183\n829.9532691\n829.6188034\n816.8655832\n816.1099108\n815.2434099\n815.0187116\n908.6717671\n910.1000802\n1132.002466\n1249.732461\n1292.791073\n1326.171289\n1320.771555\n1320.609248\n1269.714386\n1307.85539\n1314.474633\n1322.625499\n1334.748933\n1338.294456\n1058.483819\n1056.225376\n928.7919075\n888.5110862\n821.1423117\n821.5033569\n808.6005062\n810.2701025\n813.1935812\n817.0897712\n819.4057956\n816.4586537\n877.683853\n989.4201441\n993.0966624\n1087.89175\n1112.133882\n1103.911705\n1082.982315\n1071.829816\n1066.015239\n992.1295805\n1003.619833\n971.072095\n937.3191142\n929.2732559\n826.6782795\n824.8393842\n814.1197601\n815.52584\n802.4346254\n790.0916811\n787.8249165\n788.3146741\n798.280474\n796.9643563\n858.7432487\n864.3236941\n946.656965\n942.5127955\n948.1757387\n942.1564269\n924.7579517\n917.3881969\n920.2401372\n920.7966193\n899.6515701\n863.3298313\n846.1352947\n840.7210997\n818.6058136\n816.9650734\n805.768331\n806.5780319\n792.7970239\n800.4452334\n797.8676087\n796.5782063\n885.4311852\n885.2111039\n1103.343027\n1228.928472\n1278.575672\n1316.261768\n1318.378962\n1305.873327\n1250.671908\n1277.246128\n1283.005429\n1293.349777\n1307.621983\n1313.695266\n1050.850598\n1051.494625\n925.2717086\n882.815926\n815.3972246\n816.9407034\n804.6071527\n806.878518\n807.5473286\n801.2610215\n893.9294038\n896.3527257\n1115.506723\n1239.038198\n1286.356755\n1312.187629\n1303.430204\n1288.400281\n1255.421702\n1273.557076\n1268.492591\n1273.105278\n1282.652505\n1297.329629\n1048.885402\n1063.326363\n938.4159964\n894.4187286\n822.6304869\n821.4812533\n807.1505773\n805.1547142\n802.5089914\n802.08104\n892.6045417\n892.092539\n1112.874733\n1239.737394\n1265.981758\n1283.427223\n1284.680833\n1271.985305\n1215.498938\n1238.199791\n1227.305151\n1231.693724\n1262.842417\n1268.022279\n1016.697543\n1041.449225\n924.3692947\n894.4404474\n826.0180102\n823.9209217\n811.3125063\n806.6767608\n807.7413468\n809.7263004\n901.546605\n904.6953573\n1125.829648\n1249.999519\n1276.23812\n1296.591264\n1284.97841\n1272.694288\n1232.393568\n1273.984142\n1305.441673\n1305.858483\n1316.213765\n1321.325142\n1058.260616\n1054.468647\n926.5275584\n885.6728326\n821.0067308\n818.3334736\n809.0538728\n810.5383672\n807.3849178\n805.4016761\n893.5030914\n901.9809873\n1122.639444\n1240.405391\n1287.14899\n1327.443297\n1333.27002\n1323.906348\n1272.900685\n1302.361261\n1303.022336\n1299.342034\n1315.412808\n1325.805213\n1056.208656\n1050.162608\n921.485929\n878.0718471\n810.7788071\n812.203403\n798.1060594\n797.6741124\n797.2332416\n797.4022899\n802.3362184\n800.1816317\n861.6654745\n983.2135127\n1001.53838\n1110.309519\n1098.360264\n1097.093437\n1056.599373\n1034.819043\n1046.816427\n977.2351865\n988.6981971\n957.2774763\n931.6693813\n934.714257\n830.1228053\n827.5414182\n817.2068192\n817.959093\n804.4683654\n793.2200843\n791.5773343\n790.5086711\n800.6462469\n798.8009602\n859.2084106\n866.3485868\n951.8660917\n945.1731104\n938.7151032\n929.6551897\n920.2117331\n912.4493891\n919.4067615\n924.5291212\n904.1694029\n866.944282\n844.4624048\n843.450721\n819.2921242\n816.6778772\n808.2939364\n813.7797824\n802.617394\n816.4529575\n805.6103635\n800.977628\n877.2946138\n891.3225914\n1110.019671\n1196.043401\n1212.625072\n1241.505335\n1246.344939\n1242.255164\n1190.950908\n1216.51693\n1217.770719\n1227.145513\n1244.142738\n1249.596486\n992.2667126\n1005.077177\n897.3707956\n860.2715129\n799.2258163\n815.8330441\n809.630669\n808.5266102\n816.1165525\n818.2488128\n908.3693706\n910.2502666\n1125.542544\n1216.304317\n1227.271399\n1249.649624\n1252.21731\n1246.706646\n1200.626308\n1238.695097\n1244.786832\n1249.148936\n1275.948829\n1300.882176\n1038.137174\n1036.676162\n915.4887716\n876.1282403\n816.6584043\n824.9958769\n811.2334216\n808.7608038\n807.1890388\n805.3897824\n892.7992922\n890.9983711\n1110.2724\n1235.038767\n1281.450385\n1308.690559\n1301.191964\n1291.40469\n1248.76378\n1290.208885\n1294.535121\n1299.571785\n1310.50438\n1323.995105\n1055.547187\n1049.664698\n928.3080908\n886.399236\n820.8739108\n813.2620182\n795.5692852\n796.8580887\n795.253758\n794.0972737\n883.0177276\n884.7431712\n1105.022141\n1233.194462\n1280.662495\n1302.482451\n1303.496429\n1294.619274\n1238.380636\n1266.55278\n1262.44916\n1262.237768\n1288.206231\n1308.549912\n1050.747461\n1051.548233\n926.8959661\n886.12028\n817.9278084\n817.9837543\n805.1287554\n805.0564656\n803.7190494\n801.6277513\n892.3652664\n891.6197058\n1112.092933\n1238.754684\n1284.643477\n1302.28125\n1298.136011\n1302.270945\n1253.322734\n1287.740805\n1294.385655\n1290.110708\n1293.593493\n1310.867012\n1053.532993\n1055.301606\n928.1407623\n885.7714414\n817.418125\n817.6229193\n804.6505498\n802.8712029\n801.7690407\n802.1697308\n812.4971155\n812.5020198\n870.1758359\n994.9592876\n1010.806421\n1115.848466\n1115.50387\n1110.926466\n1077.262083\n1066.577145\n1064.695412\n991.2515284\n1017.56651\n979.7402702\n941.9228974\n935.2832646\n833.5919439\n831.9303038\n820.6001664\n820.8953377\n807.4596051\n795.9201755\n795.8105455\n795.0883148\n802.9784319\n800.6077113\n857.5308757\n867.0628417\n951.4406866\n937.9354344\n934.1846152\n929.7327637\n923.2561758\n918.5487889\n921.7205659\n925.8530137\n905.9471132\n868.0577127\n845.9599256\n840.0892044\n815.5820824\n813.8049946\n803.5367556\n804.6056527\n792.1442311\n802.3721581\n801.1414648\n800.7738373\n890.9979185\n892.4815183\n1106.15982\n1231.862503\n1278.663691\n1312.391845\n1306.416232\n1296.589417\n1252.095822\n1285.06749\n1284.863294\n1285.416555\n1304.515158\n1324.790177\n1057.433885\n1046.2478\n923.3545139\n881.0492111\n812.0206062\n812.0895294\n799.6255608\n800.3291571\n800.5803394\n800.6447413\n892.9827971\n892.507131\n1105.416789\n1231.114555\n1277.133007\n1311.546739\n1310.170088\n1298.476552\n1240.994382\n1265.797218\n1268.110448\n1281.826311\n1306.990648\n1322.775512\n1059.357618\n1047.779338\n924.6713422\n882.2858796\n813.4051161\n813.0627489\n799.5524081\n798.5096513\n796.860505\n795.2152533\n884.7256857\n887.2453274\n1103.344842\n1231.073025\n1280.415595\n1313.883653\n1311.857786\n1299.199716\n1246.540295\n1261.323481\n1251.782416\n1259.011936\n1275.91928\n1297.717937\n1034.836765\n1036.962951\n929.1994623\n887.6871566\n818.6885401\n819.1963084\n806.9929881\n806.4888381\n806.4889406\n806.0298063\n896.4909392\n901.3797665\n1118.629002\n1233.398787\n1238.333503\n1255.992187\n1247.559566\n1237.549743\n1194.675289\n1229.237934\n1236.143067\n1238.981549\n1253.48647\n1250.86065\n968.6883423\n1013.432193\n910.4467804\n872.3484174\n809.0471087\n809.4758888\n802.1786295\n809.7693227\n815.5790861\n814.7421377\n908.0647608\n908.895386\n1123.791487\n1224.706022\n1233.13986\n1256.022596\n1256.429131\n1243.174134\n1194.816194\n1231.332632\n1231.636473\n1230.475183\n1258.849966\n1280.244456\n1015.726584\n1017.06078\n908.0432089\n874.4197384\n806.6305745\n812.3008275\n802.3073866\n796.9526592\n799.3206098\n805.9157041\n829.3064851\n833.4056427\n874.0509272\n984.044693\n984.9698966\n1068.829681\n1050.124524\n1037.765764\n1000.188931\n994.2154942\n996.1644294\n916.5734704\n922.5621987\n879.4558182\n839.2075236\n829.6095508\n766.3847091\n775.8618903\n765.01852\n772.0401679\n765.1372957\n773.4275407\n779.2534044\n765.1488679\n757.962393\n752.7010013\n802.2595091\n798.7319142\n862.0976157\n853.8215636\n867.5879881\n866.3885062\n864.5667131\n857.8469174\n861.1378172\n864.2682455\n842.8114525\n795.833437\n765.1142014\n756.0896945\n724.1811197\n726.994426\n736.6269398\n735.7095439\n720.2639056\n745.3012172\n760.4928478\n763.795915\n851.2657423\n851.1105992\n1055.887752\n1173.53042\n1210.183428\n1235.38517\n1234.432254\n1226.916143\n1182.844072\n1216.851789\n1215.774178\n1228.540224\n1236.951789\n1226.87099\n960.2578243\n960.2028148\n851.2715444\n803.297142\n729.3718818\n730.1620635\n720.4169757\n724.6858795\n725.5134485\n738.0813182\n848.2146373\n846.4299895\n1054.23588\n1171.15372\n1201.729958\n1227.941546\n1228.826975\n1226.947117\n1187.908906\n1227.843317\n1228.763421\n1227.952974\n1234.959456\n1232.861223\n960.9579324\n972.402886\n867.2906461\n833.5191611\n761.2289971\n759.8041228\n751.1277947\n748.9914622\n752.4330534\n759.4024493\n855.3484295\n862.104536\n1072.725378\n1190.755554\n1228.181129\n1257.134478\n1266.000222\n1260.173372\n1211.920889\n1240.649083\n1230.582335\n1223.080277\n1230.400543\n1230.89117\n960.4877336\n970.8513612\n858.5930569\n818.3653414\n757.4891828\n763.0546746\n754.0140091\n755.9321946\n771.4750177\n775.4901548\n866.9275188\n878.9566317\n1087.302578\n1200.909736\n1234.915403\n1261.337752\n1267.092415\n1264.309487\n1223.742141\n1256.717449\n1252.874584\n1253.976843\n1269.228663\n1274.35632\n1012.909648\n1011.319518\n900.7730299\n869.3202639\n803.5991355\n807.3782651\n805.5022849\n816.9196631\n822.39737\n822.5410835\n904.3446501\n913.5170304\n1130.354858\n1230.512625\n1262.058533\n1281.898761\n1291.117213\n1293.016902\n1243.613843\n1264.528429\n1269.4942\n1274.619813\n1287.436552\n1294.278091\n1037.957489\n1047.015692\n935.5164916\n894.2099502\n826.2362783\n827.1798026\n816.1545412\n815.9577597\n814.5421407\n813.9735037\n824.0575474\n823.2757345\n881.5257832\n1005.696075\n1014.233124\n1106.548025\n1098.334143\n1095.527743\n1059.287783\n1056.613703\n1060.281239\n982.4317395\n994.2238461\n965.8505947\n936.9501759\n936.0118185\n840.0733997\n837.9531555\n826.5963819\n827.3562851\n814.229002\n802.806313\n802.8740234\n803.9366992\n816.3225118\n814.9494027\n869.9679599\n872.3564661\n942.5910574\n914.1965512\n894.829896\n873.416567\n855.0582328\n849.1745571\n851.3887409\n850.8948563\n821.9730165\n779.4001049\n787.0964963\n791.6241433\n787.0347314\n806.2079704\n815.3089644\n824.8917589\n808.2488092\n816.7215728\n815.9935783\n815.2714692\n904.0302194\n904.1790426\n1117.42068\n1243.937516\n1282.219149\n1297.41119\n1292.838915\n1289.290118\n1246.947366\n1276.407406\n1272.565917\n1280.061924\n1289.511079\n1292.027188\n1034.885289\n1045.709947\n936.2827659\n893.455934\n824.8457653\n824.9254873\n810.7850339\n809.3403101\n808.24152\n806.7527662\n896.9571929\n891.5484847\n1110.331048\n1240.510694\n1274.401403\n1291.736045\n1285.799546\n1276.60193\n1231.523573\n1265.539174\n1269.536865\n1278.277734\n1284.132342\n1285.258254\n1035.697601\n1046.883451\n936.3719125\n895.6816696\n828.8359354\n829.0581103\n814.9876534\n787.382768\n776.6462444\n791.6358314\n872.1761928\n867.0464629\n1082.025106\n1198.469702\n1231.100313\n1255.209355\n1255.616165\n1251.416499\n1207.382115\n1238.430011\n1237.831357\n1241.427541\n1265.186716\n1266.506976\n1006.821778\n1021.864166\n925.8444141\n898.5992558\n831.1487914\n826.4289584\n818.4940384\n819.7229065\n819.2312659\n818.8155161\n903.9124206\n906.5195294\n1092.483587\n1177.573599\n1209.34442\n1237.614205\n1240.507068\n1235.890244\n1193.883625\n1233.354816\n1239.199899\n1236.17395\n1242.143584\n1241.718249\n962.8159263\n996.9584006\n911.9251505\n877.8505155\n812.2203484\n818.9559979\n813.0911742\n815.223857\n814.9548761\n820.1794692\n915.0394485\n911.7894947\n1122.824207\n1228.682984\n1269.509587\n1306.872155\n1308.698445\n1303.654499\n1274.551593\n1307.802805\n1309.286282\n1323.812739\n1334.058482\n1340.208819\n1061.988142\n1053.774622\n930.5116842\n893.9037817\n825.3936928\n824.5123923\n810.6884977\n808.8467432\n807.563407\n807.6176638\n817.8826455\n813.3501379\n874.6941499\n999.1866183\n1012.612195\n1114.332098\n1097.952905\n1083.538843\n1050.92974\n1032.567168\n1033.123509\n971.408199\n989.8000766\n956.7899644\n929.7910784\n934.4153807\n832.4672704\n832.2311178\n821.1847853\n821.1657715\n806.3509513\n793.0326153\n792.377813\n791.2597762\n800.1438719\n795.8698679\n858.1473123\n868.848044\n950.5491192\n931.093243\n928.3569621\n927.253236\n935.4599172\n935.9814354\n937.6267756\n941.3728093\n917.8985966\n874.4133814\n847.2420077\n835.5990645\n813.704876\n816.2902682\n806.1188137\n806.5629906\n793.9564858\n792.4931885\n790.3753677\n789.7023069\n799.6660889\n795.7149292\n858.0992978\n866.6647602\n946.6901907\n941.1823602\n952.6631321\n945.8076285\n934.0964389\n923.7802831\n928.2894801\n934.8168191\n915.7993563\n879.287872\n849.2727245\n839.1047906\n816.0513902\n817.7788092\n807.2700852\n807.5736237\n794.2309574\n804.2045348\n802.4455612\n801.2017683\n893.1325162\n889.2908613\n1105.711528\n1231.568556\n1278.268539\n1308.717124\n1306.906411\n1297.925893\n1257.088486\n1288.834515\n1294.148413\n1294.62446\n1306.868355\n1310.915476\n1055.640741\n1049.976308\n924.0020374\n886.9221078\n819.3739444\n819.3323656\n805.4947478\n805.1460147\n805.1066052\n805.0845158\n895.4244251\n892.8898985\n1111.795485\n1239.014623\n1285.126276\n1303.902217\n1291.966399\n1277.761831\n1225.360677\n1263.039069\n1266.896861\n1265.918556\n1270.636186\n1276.357772\n1022.929163\n1027.567362\n919.5204882\n895.518126\n829.7534793\n834.8207256\n820.8585866\n817.8509219\n813.7899826\n810.5770753\n898.9640823\n896.0778539\n1116.199391\n1237.30139\n1240.107014\n1253.298901\n1252.974389\n1236.715139\n1192.212143\n1231.505862\n1246.568238\n1252.988776\n1250.688848\n1235.37246\n995.7508518\n1007.956892\n915.4067785\n900.7533314\n833.4252795\n832.2931415\n816.7483542\n800.2429569\n815.1650438\n822.0909869\n908.3539023\n893.9050905\n1085.795206\n1168.528391\n1187.713915\n1228.092962\n1238.185716\n1248.605525\n1216.288007\n1252.696658\n1259.812681\n1278.629222\n1296.983196\n1291.074366\n975.5622484\n954.1696192\n837.5998516\n846.2307464\n794.5455579\n804.5668575\n792.3177408\n812.9428158\n823.6497905\n821.1550912\n828.9749641\n824.4845497\n887.6639311\n988.3685229\n957.9591941\n1042.541225\n1041.286182\n1034.320407\n999.7456151\n991.8860875\n989.7502308\n919.1775694\n939.120137\n906.965533\n881.9025744\n894.0586748\n811.5184665\n824.8122439\n819.4878004\n827.7201828\n822.2291023\n810.8406099\n809.317483\n806.4854039\n815.1746139\n809.13797\n871.488852\n876.1044828\n937.113039\n917.5751439\n909.3720007\n905.0215338\n898.5820993\n894.8552748\n894.7921454\n890.058063\n875.7064026\n841.7843478\n825.3017156\n830.8170696\n823.7967907\n831.5628345\n818.9324181\n818.4720481\n805.6566672\n815.5008743\n814.3513621\n813.5279108\n904.7524173\n905.7410181\n1107.032286\n1192.079489\n1209.399524\n1225.006758\n1224.840558\n1230.834805\n1200.777691\n1244.970029\n1248.019853\n1248.857796\n1253.148119\n1237.451708\n992.2848436\n1029.131936\n920.0718375\n892.8884707\n833.5217302\n833.3964535\n821.3678725\n819.6946442\n817.5025527\n816.279921\n908.335466\n905.0541703\n1124.189972\n1212.07137\n1230.504153\n1248.540302\n1241.922587\n1231.191848\n1194.912232\n1240.345628\n1250.996711\n1249.335928\n1243.851428\n1237.274041\n1009.478089\n1026.04725\n920.6345508\n888.6235861\n823.5035751\n825.6863415\n812.8125338\n818.7161465\n819.3290937\n818.3038616\n907.5039333\n904.9788285\n1125.086812\n1229.717412\n1255.267094\n1278.246102\n1281.205653\n1274.249236\n1228.890241\n1268.70067\n1271.281814\n1270.686807\n1281.634844\n1285.291002\n1030.825515\n1041.547235\n932.8871428\n897.7773713\n827.3899416\n827.5557461\n814.3183112\n813.4341037\n813.7039184\n813.1387005\n900.9488684\n897.4244229\n1118.958451\n1245.407529\n1263.422122\n1282.509257\n1283.518932\n1272.559487\n1220.691826\n1248.134215\n1250.369983\n1255.266437\n1264.488985\n1275.806543\n1019.275824\n1025.256065\n917.9710792\n891.8294218\n828.4820331\n828.3113019\n814.6025676\n813.4162425\n813.0858752\n812.3858998\n904.6178624\n901.888233\n1122.62424\n1242.328509\n1257.03184\n1273.698599\n1275.357344\n1275.431559\n1230.892384\n1255.558808\n1255.220487\n1260.918608\n1272.670079\n1285.068353\n1028.951901\n1039.58809\n930.6877816\n895.1752022\n827.0760297\n826.4869512\n811.4093827\n810.005221\n809.6190384\n808.1816714\n816.7227741\n813.0901941\n876.0796129\n1001.450115\n1009.800732\n1103.305758\n1100.010311\n1098.451207\n1059.78622\n1049.100989\n1047.310025\n968.4194725\n979.1705773\n949.1757012\n916.4334198\n920.6959178\n835.2949946\n840.581052\n828.696767\n828.0927242\n813.8396473\n802.096728\n801.0582358\n798.6228147\n807.1305366\n803.0244202\n865.868955\n872.8438297\n930.339371\n907.6313274\n906.9912346\n899.7002849\n893.6899258\n884.2977538\n883.9736198\n891.3559488\n878.4905451\n836.6645622\n817.6200695\n828.7573584\n824.0462559\n831.6637141\n819.8512157\n820.4984184\n807.0895347\n817.0795057\n816.1293059\n815.212472\n903.8924292\n899.3084127\n1118.609988\n1237.952085\n1257.05937\n1278.75425\n1276.901076\n1270.244515\n1227.631063\n1268.920405\n1286.837526\n1293.098921\n1306.221404\n1319.796652\n1061.698929\n1058.165766\n933.5384466\n896.4131357\n828.4197021\n829.2149507\n816.1221379\n816.8505512\n817.208781\n816.453414\n907.9127742\n901.8396485\n1119.436298\n1243.993129\n1287.704605\n1323.687491\n1312.397724\n1297.120311\n1257.300555\n1289.172994\n1283.400629\n1285.364392\n1294.113248\n1301.889387\n1040.977035\n1047.881836\n934.1962384\n894.4698557\n826.3770467\n826.0561179\n811.6095446\n810.6187247\n807.9323401\n806.3492332\n896.2560989\n894.0123427\n1115.381595\n1244.119705\n1266.923458\n1294.779447\n1298.069838\n1284.700441\n1240.826029\n1271.821071\n1275.961399\n1283.417865\n1291.670625\n1308.236686\n1053.977608\n1057.350022\n931.5716702\n893.8878536\n825.7566939\n824.5205148\n810.2633447\n810.4452738\n810.0534278\n809.6505926\n900.6126006\n897.5712206\n1115.339999\n1240.764718\n1283.97368\n1319.233115\n1329.168924\n1326.667815\n1261.5257\n1287.729742\n1287.199886\n1287.545848\n1302.018217\n1316.683823\n1060.055725\n1054.613808\n928.3882894\n891.0926087\n823.0481117\n824.3242463\n812.7720245\n813.0181003\n813.07706\n813.0830232\n905.2207318\n900.7024556\n1117.924159\n1242.591363\n1284.200153\n1318.573146\n1329.610269\n1333.44809\n1293.46702\n1327.250232\n1318.485161\n1323.700118\n1334.003213\n1333.658861\n1062.215102\n1053.381683\n928.450386\n890.2999693\n820.8347471\n820.1140402\n806.0837235\n803.248181\n801.4445578\n800.9022332\n810.8976428\n806.951691\n869.330743\n994.4717666\n1009.063032\n1119.543051\n1108.620009\n1098.627126\n1058.779604\n1052.280104\n1046.541229\n971.9842685\n979.2489349\n941.6238887\n913.9629926\n918.7911948\n828.9031709\n831.185334\n818.8443881\n819.2942402\n806.1368389\n796.2349731\n797.6706431\n797.2660223\n804.753713\n796.1050901\n857.6936962\n869.8242517\n927.9685686\n904.6423063\n902.4678188\n901.417742\n894.5738895\n887.1529049\n894.5716701\n895.1688698\n875.0551472\n836.4816139\n816.5864959\n822.1675294\n814.8252592\n821.8786067\n808.6717757\n807.6561635\n794.7300807\n806.2564386\n806.2741174\n805.4315022\n894.8746594\n890.642052\n1109.660031\n1238.507201\n1255.525502\n1268.565096\n1270.230206\n1257.011202\n1214.129642\n1253.290231\n1267.751446\n1266.556111\n1277.675534\n1289.863806\n1034.541334\n1044.455283\n935.3430107\n899.3688316\n830.1066286\n829.6711263\n816.2546748\n815.2971119\n814.4904996\n813.5021124\n906.2302517\n902.2787379\n1119.492261\n1243.964047\n1287.357019\n1323.399501\n1332.16025\n1316.543943\n1272.428612\n1300.762743\n1292.103467\n1294.641334\n1307.967981\n1315.060904\n1059.147905\n1056.979671\n931.8826046\n895.684192\n827.7304196\n827.19479\n813.626599\n811.8896727\n809.6822652\n809.021125\n899.1926331\n897.0203406\n1115.975208\n1242.512599\n1286.43433\n1322.723921\n1322.037981\n1309.130233\n1260.24717\n1292.861701\n1293.268527\n1296.774067\n1310.730458\n1318.770324\n1059.090992\n1054.972158\n929.3350573\n891.3447082\n823.1148589\n822.9798644\n808.8346538\n806.8851969\n805.5836881\n803.208337\n891.5222955\n890.3001458\n1111.755242\n1242.959174\n1276.933839\n1297.725674\n1294.131514\n1281.285161\n1223.46129\n1249.255482\n1257.056528\n1264.527663\n1275.143882\n1285.648032\n1029.71594\n1040.080816\n929.9942778\n890.6760949\n820.8156261\n819.7338338\n805.8345184\n805.3905806\n803.9906258\n802.5087583\n897.1368129\n894.773138\n1114.573983\n1230.16228\n1241.328348\n1260.288708\n1259.110879\n1255.414564\n1214.285145\n1242.882605\n1232.439886\n1240.862461\n1256.649971\n1268.407956\n1013.865999\n1030.427031\n917.9437017\n881.0031129\n813.9006404\n818.5646348\n807.8779152\n819.1035631\n811.9960538\n820.9128868\n829.3829844\n825.2928103\n887.4472567\n1009.152633\n1011.876953\n1104.957062\n1098.882374\n1091.784921\n1050.453577\n1037.896064\n1040.681112\n972.9381979\n987.054218\n947.3373782\n918.1063045\n919.8209455\n835.1053923\n838.2763051\n830.9787308\n834.2829891\n821.5323088\n809.5864402\n809.4062423\n808.2785763\n817.2938795\n814.0111675\n875.6732227\n883.4777482\n958.554862\n943.1811889\n944.338022\n943.755383\n947.3717863\n925.7687802\n912.7064679\n910.3490829\n888.9240799\n852.5666226\n828.6831023\n833.4637477\n820.2656377\n830.3497818\n822.2377005\n817.5248691\n808.7764821\n821.1768685\n820.6754176\n820.422592\n909.8225571\n907.3679118\n1124.055192\n1247.42082\n1283.934565\n1315.743836\n1315.105128\n1307.929633\n1264.383369\n1298.126648\n1298.398901\n1294.265691\n1298.758865\n1303.424746\n1042.226079\n1042.337391\n922.6359074\n892.0712727\n825.1899642\n823.3925574\n809.1769946\n796.3380844\n799.4043131\n808.2175211\n897.9057218\n892.6048492\n1109.530929\n1227.668036\n1257.474969\n1278.830788\n1285.067787\n1267.999272\n1226.584724\n1253.513467\n1252.349827\n1260.41125\n1265.041851\n1273.737121\n1015.79803\n1025.25868\n924.4900169\n900.743138\n832.4936975\n830.2430709\n818.5602303\n821.1661628\n821.75304\n820.265791\n910.2367333\n909.5257297\n1123.826993\n1235.999933\n1251.352602\n1276.106463\n1277.36975\n1266.435737\n1206.780516\n1228.743469\n1229.650691\n1230.239343\n1237.081962\n1238.295239\n983.2007241\n1003.894158\n889.4289035\n872.8195004\n815.4179999\n816.7391241\n809.637175\n814.2410468\n811.9995369\n809.6411273\n908.8619874\n909.2363549\n1112.552516\n1190.021476\n1206.633776\n1223.921271\n1235.217412\n1241.799914\n1213.862712\n1258.281101\n1263.020742\n1263.958823\n1269.259659\n1266.948303\n952.9923159\n960.5892265\n876.835516\n863.3976596\n801.8689018\n812.3160196\n803.8370779\n803.1590819\n802.7785989\n811.6845672\n902.4428862\n891.4508941\n1088.106173\n1173.355215\n1190.932327\n1231.390829\n1246.313675\n1256.168861\n1222.205718\n1264.071105\n1283.076416\n1296.115974\n1301.530764\n1298.53338\n975.6151799\n960.9285144\n822.1379608\n823.4232331\n776.5454845\n792.3233019\n795.8570024\n809.9833892\n819.9928128\n816.2203814\n819.8639375\n812.6352451\n875.6118031\n1000.666342\n1003.294382\n1093.350771\n1085.064575\n1083.076955\n1053.468191\n1048.003475\n1048.667689\n971.5868012\n979.4205029\n945.46472\n920.2566784\n927.6971828\n831.4221264\n839.0709291\n827.0984306\n826.7114744\n813.4129\n801.4995384\n800.5853903\n799.3628151\n808.2521626\n804.5514691\n868.3553982\n871.1838492\n937.3779812\n914.8521271\n908.5274781\n903.1036022\n900.0485389\n890.3695832\n893.4870572\n901.8606475\n882.664772\n844.8082627\n825.4222267\n831.8314478\n820.1624614\n831.4182963\n818.4481783\n817.458168\n804.8772892\n816.4440944\n817.1108424\n817.8145706\n908.9383638\n906.9495218\n1124.668273\n1248.502975\n1284.491137\n1311.139538\n1311.815166\n1305.621413\n1256.738319\n1283.738256\n1283.11843\n1285.096168\n1293.472118\n1299.302123\n1041.994812\n1045.216966\n930.0647779\n898.9772039\n832.670774\n831.5430696\n817.5682473\n804.9263477\n804.3980178\n805.2579042\n816.7717664\n814.2109662\n872.5002422\n873.9951977\n936.1891911\n911.5616531\n903.3298695\n893.9262823\n886.024353\n877.6278012\n875.8653022\n873.189595\n847.3349645\n811.7742412\n792.9363993\n797.0415386\n782.532103\n787.5194454\n779.6383126\n789.4617951\n794.1183456\n820.5909101\n821.7700246\n819.2556379\n907.7803277\n904.8638048\n1124.209443\n1246.110127\n1275.073144\n1295.714507\n1292.358876\n1287.834438\n1242.805207\n1273.021702\n1273.000687\n1274.662315\n1282.333518\n1288.223431\n1029.221301\n1030.25105\n911.500762\n878.3793184\n813.4089126\n819.1691249\n812.7598381\n818.9364433\n819.4177307\n817.8816275\n906.8557655\n904.4210454\n1119.360948\n1235.738688\n1266.735799\n1288.962017\n1286.623287\n1276.238309\n1223.625494\n1247.89361\n1243.27437\n1243.163229\n1252.223021\n1258.063886\n1007.40073\n1013.567043\n896.0235788\n861.5939698\n795.7935422\n803.0928403\n797.9281532\n806.9549585\n816.8998109\n822.5711554\n912.5733111\n908.9003175\n1125.405495\n1239.355333\n1272.75591\n1299.407863\n1301.021813\n1290.661374\n1237.731991\n1260.95247\n1257.150439\n1254.797363\n1259.661549\n1262.505541\n1005.289008\n1007.237743\n887.4510171\n851.522869\n784.5305575\n789.3831789\n783.090864\n789.2791875\n792.4661757\n792.7288642\n804.258554\n797.7873857\n856.100912\n973.6679515\n977.0647445\n1078.208001\n1079.707455\n1067.539484\n1021.973817\n995.1607324\n989.8472623\n910.8243829\n917.9562118\n875.6923998\n835.5032961\n829.3988975\n755.8041539\n785.5146001\n788.2601096\n798.2161537\n793.4977873\n790.956869\n796.8053436\n800.920439\n815.1326113\n812.2104372\n864.5496889\n867.3978717\n939.5457176\n920.9425737\n920.2872976\n915.6704725\n906.7867784\n894.3673356\n894.504908\n895.0443617\n871.13479\n830.0256415\n810.8201299\n813.9734096\n802.4582565\n811.602598\n807.5132669\n813.0753755\n803.8918699\n818.162007\n817.1246718\n815.6607457\n904.5737278\n906.3238397\n1117.999085\n1231.377211\n1255.45933\n1271.108137\n1263.124721\n1261.300722\n1222.631487\n1258.088832\n1259.202674\n1259.986432\n1267.150474\n1273.954649\n1017.049839\n1017.589175\n898.8723955\n868.22252\n806.0260557\n811.2738453\n802.6531269\n807.1350972\n811.1424488\n814.6558002\n911.3646505\n906.1364056\n1107.770616\n1219.869933\n1245.372658\n1260.644003\n1254.794533\n1244.112371\n1190.511163\n1224.888533\n1232.321496\n1236.540865\n1246.704129\n1245.915368\n962.3019262\n997.4941016\n891.9881725\n868.669314\n813.569897\n815.4062649\n797.7686948\n795.0032561\n793.1298002\n792.464119\n881.3204516\n884.5340446\n1103.117444\n1231.028808\n1258.510675\n1274.510012\n1267.372661\n1246.038379\n1193.018413\n1240.979632\n1256.26299\n1258.088971\n1262.41426\n1250.874127\n979.9532245\n1016.821157\n906.3384245\n877.2144968\n818.5502226\n825.8210747\n818.80202\n817.5330393\n815.3905646\n813.8258339\n902.7765349\n905.4409602\n1115.054654\n1225.913647\n1251.750143\n1272.792218\n1267.469175\n1260.186577\n1215.507865\n1242.067053\n1236.66041\n1243.190616\n1263.900101\n1274.686268\n1020.891304\n1028.144253\n915.6659012\n889.1399977\n830.4743333\n832.5489094\n818.76311\n817.8280763\n816.5717993\n814.911935\n906.2075332\n907.9933633\n1121.708601\n1231.150035\n1253.674137\n1271.756465\n1264.622701\n1255.699208\n1201.437319\n1229.662226\n1234.940452\n1239.397557\n1246.508335\n1246.280125\n980.111412\n1011.777026\n900.7961536\n875.6682056\n821.0434815\n827.371151\n817.5251799\n819.7690222\n820.687922\n820.1986742\n830.0220536\n826.6866974\n879.7324222\n995.8250501\n995.0369008\n1089.709755\n1085.544403\n1071.986154\n1027.716605\n1010.764134\n1004.226691\n935.1856172\n952.3397441\n921.9144736\n894.7825944\n900.8727975\n809.4311269\n820.1946263\n817.3392113\n823.4051575\n814.8256228\n808.0430858\n807.5068086\n803.6895096\n811.1587654\n805.4598294\n853.6015334\n854.2432314\n923.7830906\n904.9484868\n902.3991167\n896.9094511\n894.2514802\n884.1300243\n884.6350962\n883.7778809\n863.7961786\n823.5915602\n803.2641577\n806.8163367\n790.8823169\n794.1046838\n785.3137909\n790.0192668\n781.5898972\n796.6824628\n795.7353499\n793.3024667\n881.4727463\n880.9572697\n1092.76539\n1214.183275\n1252.316429\n1281.682343\n1285.903029\n1280.021776\n1230.65895\n1256.963051\n1251.772276\n1247.431015\n1248.163874\n1249.385431\n1010.816516\n1024.597927\n908.3607749\n873.7105872\n808.2184989\n816.9383351\n813.3559241\n820.2742442\n821.2384875\n820.206291\n912.7725714\n912.6311313\n1125.178697\n1248.100946\n1289.739427\n1325.018125\n1333.149976\n1322.913471\n1266.599707\n1287.102541\n1286.359937\n1290.326233\n1300.075583\n1305.609999\n1042.742125\n1043.383928\n926.2342862\n893.9971168\n830.0174575\n830.2662007\n817.3599876\n817.128045\n817.0540562\n817.0413086\n907.4202691\n908.9347145\n1124.132488\n1249.655756\n1287.803074\n1307.758227\n1302.978651\n1296.178067\n1250.349546\n1278.238978\n1276.686189\n1278.83424\n1286.151759\n1291.611384\n1030.899231\n1032.359036\n916.6583863\n889.185657\n830.0620735\n832.4974898\n819.4123999\n819.1636939\n818.7888897\n818.1062069\n907.7171258\n909.8473809\n1125.665214\n1243.089721\n1272.516328\n1290.063771\n1285.865874\n1278.317934\n1229.273048\n1255.5945\n1254.270727\n1257.293999\n1265.407188\n1275.189473\n1024.953366\n1032.714651\n916.8590825\n885.5990744\n823.8736381\n829.4919456\n814.8867613\n812.3528773\n810.9092731\n811.0433742\n904.7884642\n906.5700467\n1117.587987\n1236.427645\n1273.294528\n1302.853713\n1306.553688\n1301.90745\n1252.385886\n1278.809529\n1278.374839\n1281.271774\n1290.107711\n1296.166009\n1033.480913\n1036.394993\n920.4507288\n890.40471\n828.4001988\n828.1361193\n814.3142783\n813.1997425\n811.5918024\n809.5667806\n817.4986048\n817.2590566\n877.9364448\n1001.694314\n998.5026482\n1088.679667\n1077.989271\n1062.386655\n1021.932955\n1007.503933\n1001.643834\n931.0099243\n947.9392591\n910.8662156\n883.6875232\n891.0449695\n799.1046892\n808.5523804\n806.5899368\n814.4931407\n806.2446962\n800.3314499\n801.629546\n801.1273779\n811.0140622\n807.9271959\n863.0777231\n866.9684419\n933.9335533\n912.4663267\n908.413894\n898.719148\n892.6228364\n880.9605941\n881.4533741\n882.502177\n858.7135915\n814.6966929\n795.9877187\n800.0086904\n789.2396763\n801.8854641\n802.2194697\n809.2393491\n800.71548\n816.4184513\n821.5619241\n820.4730527\n908.8700158\n909.3767278\n1124.008638\n1249.148409\n1272.018721\n1283.79151\n1273.748338\n1263.582754\n1215.845911\n1242.384964\n1234.960094\n1239.070235\n1256.874132\n1269.093527\n1019.623899\n1030.393149\n918.8308134\n894.2694305\n833.4554857\n832.4544601\n819.3841413\n819.1843244\n818.8327884\n818.1424784\n910.4529693\n911.9588889\n1119.838201\n1232.212633\n1254.533508\n1269.546782\n1260.852722\n1252.013148\n1195.747671\n1225.149059\n1227.55768\n1231.834867\n1238.265032\n1238.045832\n1007.777436\n1033.852414\n922.2171202\n893.5864198\n832.6544673\n833.9232689\n819.7138557\n818.1096096\n816.809066\n816.3136747\n906.4954797\n909.534184\n1113.050149\n1220.576391\n1245.947005\n1263.3661\n1258.816445\n1245.998068\n1192.925334\n1233.330306\n1242.182487\n1249.458818\n1244.894958\n1242.329018\n1014.775613\n1035.653972\n922.2949263\n893.8522645\n832.5403804\n834.5555681\n821.6801794\n821.5306862\n821.4736556\n821.4503928\n911.8272237\n903.6011412\n1101.814087\n1213.423756\n1236.46414\n1253.916159\n1247.751499\n1234.171917\n1198.218305\n1235.582959\n1240.013793\n1242.070973\n1241.131764\n1239.144631\n995.244286\n1007.145953\n889.7223382\n863.1593392\n805.8190911\n815.3055727\n809.4910221\n815.9553697\n817.1115626\n816.5068452\n909.3178714\n904.2967105\n1110.130486\n1225.754872\n1260.607258\n1289.443532\n1292.116816\n1286.18433\n1240.397535\n1268.433021\n1267.39139\n1268.979754\n1277.082717\n1284.649987\n1030.157437\n1036.854059\n920.9090695\n889.4385683\n827.1996361\n831.1804954\n819.3135634\n821.2094303\n821.6414571\n821.4848605\n831.6300445\n827.8927487\n876.4729351\n991.770237\n984.775946\n1073.919393\n1065.597851\n1057.82865\n1017.104398\n1007.249236\n1006.805914\n934.4031253\n945.1911799\n899.1978938\n869.6361139\n883.7353945\n790.2972422\n796.4460299\n789.7139344\n796.5005969\n790.2023048\n785.0694269\n787.4985426\n789.1412938\n801.2331474\n795.4742053\n850.0756083\n846.9235852\n917.2577596\n899.3330514\n898.4821154\n895.3416404\n890.058661\n880.7551819\n881.5770296\n882.4450592\n858.4497895\n812.9095712\n791.1531793\n791.9316281\n778.8707936\n792.1617736\n790.309858\n790.1422514\n774.6649285\n782.7799165\n782.9769544\n783.6359586\n875.2399487\n876.9295731\n1094.158195\n1213.630065\n1249.255901\n1271.811651\n1271.302701\n1268.083515\n1222.446788\n1252.413821\n1248.649696\n1245.188714\n1247.002748\n1244.648029\n993.7691535\n1000.866696\n884.6316873\n852.6375583\n785.6575676\n789.1680801\n779.3106425\n773.1257442\n767.5543751\n769.3019974\n870.0403258\n872.9145717\n1084.795984\n1198.760969\n1235.326755\n1260.864796\n1260.396649\n1254.102768\n1201.020482\n1225.971428\n1223.251966\n1226.314433\n1234.947362\n1235.265449\n968.4419316\n991.7143784\n881.5823063\n845.5486664\n783.0959127\n789.8972207\n779.2466529\n786.2524354\n799.5858425\n803.7448584\n896.7207537\n882.0331849\n1099.579346\n1192.185204\n1202.917568\n1223.093728\n1238.176234\n1245.058999\n1210.510089\n1254.46106\n1261.210116\n1264.734768\n1271.634397\n1269.133923\n955.8724383\n952.2589386\n874.4513119\n849.125208\n782.2290028\n789.4667287\n793.8515828\n788.2921231\n783.252607\n784.0969064\n882.323793\n883.7375733\n1090.69407\n1173.271494\n1190.444795\n1231.988002\n1253.590643\n1264.685645\n1227.213773\n1263.875782\n1269.061315\n1274.629908\n1284.93176\n1282.653035\n964.5108383\n951.8833161\n872.4165738\n848.8443744\n784.7354415\n792.1985986\n787.6143536\n784.6192174\n782.0519283\n791.5515207\n889.2708122\n888.9428911\n1113.697612\n1214.072633\n1225.658948\n1241.110642\n1233.641872\n1240.425749\n1210.747795\n1254.881697\n1256.513698\n1257.200982\n1260.812599\n1248.331042\n970.4370181\n1002.387138\n898.2071183\n863.5528916\n796.7654975\n801.7820361\n805.7048423\n794.8686413\n796.6022273\n799.036547\n810.2464665\n806.4729247\n871.5043046\n974.1986871\n979.6739519\n1072.243228\n1072.891155\n1077.125424\n1035.83115\n1020.940821\n1025.978597\n955.7656398\n966.5034475\n930.5041053\n905.170224\n904.0903223\n811.1016129\n812.7577233\n802.4638399\n806.4542503\n783.5154785\n783.5181209\n797.4654403\n798.7010822\n815.3265823\n820.5272361\n878.1925224\n854.813234\n915.8198425\n896.4019228\n894.3612055\n886.9560357\n883.6694075\n876.6605744\n879.3569813\n881.8214699\n859.8203394\n827.1299735\n804.4700569\n808.865793\n786.7773971\n786.487877\n783.1042518\n786.2776699\n786.5070117\n802.8708773\n802.4355645\n811.7718054\n911.6055418\n912.872514\n1128.827541\n1225.300499\n1247.033133\n1267.382388\n1262.05322\n1257.076349\n1211.975145\n1239.664395\n1233.68841\n1229.545445\n1246.348199\n1259.859412\n1006.187072\n1022.625561\n912.9156581\n874.7287585\n812.8999202\n829.9095353\n814.3376542\n815.9077433\n820.311793\n820.013235\n913.4191317\n909.1566887\n1129.97965\n1240.764244\n1257.415936\n1270.252648\n1260.73027\n1251.991278\n1194.328531\n1225.41906\n1227.910297\n1227.771137\n1232.896654\n1231.856752\n976.1647993\n997.3306458\n892.4025926\n861.6530281\n804.9361102\n808.9643087\n816.8986573\n810.7072544\n816.2864773\n814.5679008\n908.8602852\n907.5232754\n1112.735346\n1188.427891\n1199.833268\n1224.123815\n1239.014177\n1248.964544\n1216.539516\n1252.950924\n1256.170979\n1261.690305\n1268.013199\n1264.967896\n953.404101\n969.2022771\n885.8223077\n866.50762\n810.9841632\n818.243007\n813.3294942\n820.8955109\n821.2090948\n817.8781193\n908.0139108\n911.2464058\n1132.511058\n1227.874884\n1241.016209\n1268.626983\n1259.083064\n1239.272501\n1195.494991\n1235.864894\n1241.796528\n1248.906668\n1252.345807\n1245.138397\n970.0701565\n995.0916958\n895.415967\n864.6795874\n801.0042559\n802.7355455\n814.447759\n805.8403201\n816.9087919\n813.1052389\n907.1504808\n915.8259916\n1130.377543\n1229.05865\n1260.755035\n1270.49954\n1265.479184\n1255.514829\n1196.027181\n1231.764415\n1238.098826\n1241.168129\n1250.799259\n1251.838847\n962.6446753\n991.2993073\n897.6544453\n862.1792443\n796.0379677\n798.1881169\n803.3873999\n794.9938242\n793.4826494\n805.8080818\n825.653369\n827.4712672\n875.9734892\n977.3214172\n969.2017799\n1061.847083\n1060.588417\n1059.199668\n1021.96505\n1009.925282\n1007.47221\n933.9029518\n948.0671278\n912.2428031\n891.4425489\n898.1383333\n811.7426983\n808.484662\n800.2701574\n803.9816328\n801.1444905\n782.4227214\n779.0336482\n779.8879927\n795.3787444\n796.3332421\n861.5516098\n858.2818635\n926.1642553\n905.304471\n902.3608825\n897.5616995\n894.4968123\n886.6899007\n885.7413636\n886.0599983\n862.9646944\n819.2021194\n792.888187\n793.6604524\n785.5385183\n789.1097882\n785.0321901\n791.2871468\n794.7929324\n800.4070336\n799.5932019\n807.3130576\n894.3264952\n897.8956365\n1107.342426\n1215.253874\n1258.307566\n1290.012478\n1290.086161\n1282.52186\n1230.222993\n1263.227256\n1264.315899\n1263.637202\n1272.389531\n1276.212481\n1023.397361\n1031.322368\n911.3909317\n869.6612704\n802.2129951\n806.0974675\n800.6215222\n796.8340784\n794.4991125\n794.7726563\n898.2657798\n902.6957077\n1118.344177\n1231.030853\n1265.230852\n1296.253841\n1295.98572\n1284.929815\n1233.849692\n1260.084827\n1257.184917\n1253.419399\n1263.473512\n1270.463958\n1017.473468\n1028.040322\n911.9122977\n870.6034281\n804.5140322\n812.4057843\n815.9013159\n804.8312811\n799.1616674\n800.4844249\n890.5465826\n892.21325\n1109.731609\n1224.416108\n1259.623576\n1282.120204\n1279.245857\n1274.112489\n1222.631201\n1254.558054\n1249.79096\n1248.31569\n1265.366801\n1273.033344\n1017.143473\n1022.901749\n903.5008142\n864.7940426\n800.5814895\n803.5213998\n798.72332\n791.3337667\n794.7921295\n796.8861567\n886.6800427\n882.5153096\n1102.531713\n1219.587235\n1254.686099\n1287.544351\n1288.542613\n1286.130753\n1237.007952\n1260.15578\n1254.102764\n1252.725096\n1261.279318\n1266.140692\n1008.216552\n1020.387901\n907.6373725\n869.4287712\n802.5657371\n811.8494907\n803.5300283\n802.0930257\n805.9199059\n818.8574426\n911.3533018\n909.898742\n1130.971036\n1215.947079\n1237.06659\n1254.063974\n1254.689756\n1252.411688\n1208.083248\n1240.971087\n1238.647162\n1235.96991\n1242.948542\n1239.798686\n967.5221413\n975.5034637\n856.3500757\n813.3593702\n772.1456884\n773.0191555\n752.0559293\n762.5280083\n767.8472582\n775.5114122\n794.80211\n800.1695422\n867.0818578\n962.271153\n957.5170975\n1057.995211\n1062.87968\n1063.627731\n1031.688017\n1020.380087\n1013.938605\n936.8323292\n950.839063\n918.499498\n887.0506858\n888.6428985\n789.2577874\n792.4081678\n788.8741644\n791.8289957\n788.9064587\n780.1174203\n779.8657863\n782.6614908\n786.5495541\n787.6110014\n862.9010453\n849.1479798\n911.1763298\n888.3951271\n886.1597637\n891.8131395\n892.9810813\n886.5582092\n887.7965014\n889.6517785\n869.1465198\n827.0319666\n801.4645158\n812.7364546\n796.303554\n798.5730502\n791.3807379\n792.3888316\n779.8837819\n791.0610551\n793.9436388\n795.6072334\n891.0700795\n898.9522878\n1117.004529\n1226.603762\n1257.968437\n1285.098889\n1291.623771\n1292.953944\n1251.092646\n1260.36001\n1252.921804\n1253.804085\n1263.634995\n1271.140238\n1021.536854\n1030.443878\n915.033963\n871.9557683\n816.3966758\n822.2717147\n809.5734252\n819.0076101\n822.0664392\n820.1561103\n912.7537622\n912.0463677\n1132.769959\n1233.397733\n1266.661354\n1288.331867\n1278.921203\n1266.099739\n1217.842063\n1244.748181\n1235.056019\n1232.845433\n1245.813335\n1263.198533\n1018.763864\n1024.857599\n907.8906192\n873.2193465\n807.4740481\n813.2648082\n803.2290416\n806.4276079\n819.5246428\n823.1498842\n907.0606678\n911.2100384\n1136.14861\n1235.769584\n1251.979346\n1263.782117\n1260.17558\n1261.942201\n1215.871193\n1238.240618\n1228.699242\n1230.409719\n1238.671513\n1236.010422\n1000.909455\n1024.181506\n900.636349\n858.2045071\n794.562453\n797.6631166\n795.1605401\n787.1632982\n786.5821367\n788.8034712\n892.2268667\n895.867644\n1114.543799\n1217.006508\n1240.81103\n1260.181384\n1261.097425\n1251.27204\n1194.683235\n1226.297755\n1230.693871\n1236.551103\n1251.817516\n1250.457186\n957.3957468\n989.8371436\n884.5961884\n850.1947401\n791.6031049\n795.9351542\n782.8575726\n779.7059962\n781.1323277\n782.851031\n875.6382585\n880.3889225\n1102.57616\n1215.159012\n1256.539018\n1290.398189\n1285.5326\n1274.364054\n1220.82065\n1248.652192\n1240.056167\n1229.128384\n1237.229267\n1260.924734\n1013.562558\n1029.615263\n909.8990353\n862.9494214\n790.8442255\n793.6290332\n786.4722544\n788.1000535\n793.8050387\n796.4883153\n808.163406\n809.132278\n872.1635111\n984.5429064\n989.8843744\n1091.754309\n1093.776028\n1083.566982\n1043.920919\n1030.000939\n1027.607152\n951.582488\n959.3015227\n922.1500132\n892.6977588\n902.6486308\n812.287394\n813.3245716\n802.8419731\n806.7880853\n801.5686789\n797.19169\n806.2641455\n809.8316506\n820.5447319\n820.1861438\n884.2135442\n882.746733\n949.4176126\n928.4808826\n930.564498\n925.567405\n914.5414073\n900.372258\n896.7322873\n895.5754735\n877.7189834\n834.1061403\n814.1397262\n831.7422998\n819.2545979\n829.8199824\n820.112314\n821.1078528\n810.0955767\n821.2548022\n818.7530814\n819.5674947\n911.62021\n909.3496795\n1126.801536\n1243.482694\n1265.046242\n1275.30202\n1271.555426\n1262.892566\n1215.540689\n1245.936993\n1241.448879\n1242.614704\n1258.690438\n1271.554632\n1024.300863\n1043.59061\n926.2489115\n894.3570998\n831.7796975\n833.714344\n820.9756272\n821.2759374\n819.9927127\n819.6563164\n911.6277527\n912.0856729\n1134.489542\n1248.177764\n1270.590639\n1281.128345\n1276.65851\n1278.839805\n1244.350598\n1285.940902\n1294.763786\n1297.252057\n1306.494244\n1302.017062\n1034.448655\n1043.068875\n919.6118561\n881.4027376\n818.9177567\n823.6959176\n809.0458847\n806.9413428\n807.0112684\n809.2815766\n899.0779702\n893.0385524\n1112.172353\n1216.635322\n1241.629825\n1241.108689\n1228.09249\n1230.798879\n1190.711079\n1220.098145\n1222.199096\n1224.811455\n1236.29962\n1243.42631\n999.1933608\n1023.975041\n907.5365896\n877.5909248\n813.3588494\n817.3059777\n807.928371\n808.0407008\n817.0686475\n821.5915863\n911.0913101\n911.6984539\n1136.845991\n1233.65222\n1235.954863\n1244.994476\n1234.363495\n1237.584548\n1203.917401\n1246.186762\n1247.486339\n1240.366766\n1238.700998\n1232.196463\n984.8111511\n1023.645139\n905.5245532\n864.8213311\n798.2015636\n802.9951368\n796.3000867\n775.810329\n773.5185003\n783.9180635\n885.9600364\n888.7113932\n1105.370126\n1213.347592\n1245.976062\n1269.473162\n1271.178165\n1262.314598\n1215.901223\n1250.602832\n1257.354676\n1262.44878\n1269.781413\n1276.380801\n1024.374306\n1034.919901\n911.0888741\n873.8967741\n808.6696259\n814.9239673\n798.2589787\n801.8590166\n811.7964803\n815.6736442\n821.3415669\n827.9296608\n892.3912489\n994.1332617\n993.7655776\n1082.128432\n1079.897847\n1077.858142\n1044.734026\n1031.059701\n1027.99469\n952.0287878\n959.7914345\n923.7340481\n889.1116346\n894.4633361\n787.4653355\n785.1547239\n772.5495747\n774.4923365\n763.3572917\n752.1183186\n754.40405\n751.5469188\n759.4889445\n762.282675\n834.3571626\n828.3481187\n892.2229856\n874.9672978\n873.3503733\n878.0612013\n881.2408357\n875.1239873\n873.7548861\n875.2331055\n853.2758338\n805.5799592\n774.9132212\n789.0993296\n768.5084817\n779.4497393\n780.2156776\n789.8851169\n775.4815244\n780.7300571\n784.4968257\n788.8787284\n812.7403103\n816.3860215\n876.8336686\n853.1092783\n895.653931\n867.0775974\n871.1361331\n873.0240722\n865.519823\n853.58585\n855.1598163\n855.4555801\n826.1236648\n779.2625934\n766.847009\n787.3598188\n779.9832474\n782.2701165\n781.6021327\n786.8825198\n773.7799895\n792.594076\n801.1704986\n797.8836803\n904.2127395\n905.961741\n1138.337215\n1239.547531\n1251.236976\n1259.945903\n1256.683673\n1251.194973\n1198.31161\n1229.895936\n1228.140326\n1222.752934\n1227.773109\n1227.056098\n987.6421364\n1018.251014\n900.6523933\n868.8177927\n803.4623437\n812.2375125\n807.3988879\n808.5747137\n815.7630826\n821.9890619\n912.8813505\n912.0707229\n1136.374259\n1247.840949\n1260.023651\n1274.084914\n1265.746628\n1266.329666\n1215.14743\n1239.583583\n1245.919437\n1256.739091\n1273.834346\n1293.355038\n1046.282736\n1063.602416\n928.0981342\n886.2366859\n830.5302761\n835.4968474\n822.305878\n820.4599927\n817.6427189\n815.9551663\n905.6832581\n908.6386704\n1137.635926\n1251.624362\n1287.10922\n1300.617505\n1284.567983\n1265.502467\n1211.721379\n1250.624675\n1263.772992\n1267.938496\n1280.545959\n1282.813396\n1014.453093\n1021.936116\n894.000312\n854.5821914\n793.062927\n795.1236608\n788.1487465\n791.6588993\n786.2281762\n775.431307\n864.8667366\n870.0432439\n1091.736215\n1195.049171\n1222.354013\n1248.448432\n1240.380063\n1237.281789\n1200.757568\n1238.690008\n1243.49709\n1255.480582\n1271.862572\n1278.152241\n971.9337769\n961.6949918\n835.992091\n817.8659381\n758.4863738\n765.9265871\n768.4378095\n774.1971588\n768.9616818\n766.6257964\n785.3219222\n785.3298297\n868.3753978\n960.938892\n954.2256858\n1056.808157\n1058.245396\n1051.192896\n1007.298199\n989.3890262\n989.8230862\n916.1172786\n937.2042686\n905.7084027\n885.2709079\n900.371961\n797.0097287\n797.1344833\n790.2163276\n796.778778\n789.4583737\n780.2259894\n782.7559662\n781.0189688\n789.6504756\n789.6659546\n852.6688353\n842.6851864\n919.1371486\n903.9099853\n897.7331544\n894.3634961\n890.9531187\n883.2470803\n882.0532292\n882.0733615\n859.5939374\n820.8311671\n796.5148629\n806.0299982\n779.9118687\n787.6686422\n781.626699\n775.999016\n760.7982896\n772.2643426\n772.3345202\n772.3562427\n862.6723849\n872.3599052\n1101.553633\n1210.181539\n1241.755991\n1272.869698\n1269.99984\n1266.169969\n1222.130385\n1251.895065\n1250.437565\n1253.292999\n1262.143011\n1267.711094\n1015.364521\n1031.53827\n904.0762075\n863.2251689\n795.9086324\n796.9156754\n781.7192649\n780.2794254\n783.6974075\n789.0429907\n884.1651839\n884.1038678\n1113.120218\n1216.08104\n1253.745707\n1279.949203\n1270.567596\n1259.988878\n1210.629256\n1231.144668\n1226.309281\n1231.384053\n1239.681727\n1236.625492\n999.4413567\n1030.565917\n896.2409145\n869.3283864\n815.1176866\n822.5051337\n810.3894636\n809.6752076\n813.3225624\n820.6663413\n911.5137286\n910.7807179\n1137.525243\n1224.874983\n1251.400889\n1268.650119\n1269.936867\n1264.650938\n1215.375067\n1236.548789\n1228.888565\n1230.64569\n1238.902964\n1260.711901\n1022.323789\n1048.679747\n927.9191735\n889.124416\n821.3598998\n822.2360589\n815.412683\n817.862574\n821.877728\n822.0370563\n912.350845\n913.1359193\n1136.732339\n1233.938636\n1262.354536\n1273.109517\n1266.324459\n1256.938695\n1198.273963\n1230.184275\n1232.314584\n1233.830485\n1240.965604\n1245.43285\n1011.970718\n1042.936289\n925.8806161\n900.2327238\n830.9031937\n825.8127742\n809.0454835\n818.8819741\n819.7641324\n816.6819396\n914.8721832\n914.5752415\n1141.513097\n1223.87408\n1224.473871\n1235.204924\n1234.901911\n1247.221525\n1217.823131\n1261.206191\n1268.665177\n1278.896878\n1286.408859\n1276.667995\n956.0129548\n958.9336927\n854.7136908\n829.5982798\n753.7421114\n766.3640873\n764.9957416\n773.4945856\n778.5369466\n783.0126829\n791.651513\n796.8560888\n870.4781336\n967.7706111\n943.3929073\n1025.094122\n1031.430303\n1038.41718\n1013.624372\n1014.235682\n1016.136371\n919.1544916\n921.463314\n874.752539\n856.0307546\n911.696041\n806.8048983\n813.342505\n811.592343\n814.7183174\n805.6949684\n803.9611069\n805.9913773\n809.4200807\n820.5748692\n818.3568071\n885.3897467\n883.6891977\n932.0040418\n903.6889533\n898.6794546\n888.1639791\n887.490317\n876.3166184\n875.7451096\n876.5953807\n855.027445\n808.7393054\n784.158517\n808.75405\n785.4773464\n797.3343263\n792.5261395\n795.6824612\n776.7900727\n781.6816696\n776.7240216\n786.0620845\n882.3159927\n882.5893169\n1107.436867\n1211.751191\n1245.40768\n1265.364022\n1261.777328\n1251.315589\n1205.175891\n1255.733255\n1259.359183\n1259.29919\n1268.3216\n1278.618766\n1025.381238\n1044.982345\n914.3553779\n874.1784855\n807.2019679\n808.038755\n804.1202164\n808.2396718\n802.1926147\n800.1049661\n898.4385202\n900.9344464\n1128.924538\n1233.563067\n1261.997316\n1284.23594\n1266.443617\n1258.107672\n1209.741498\n1227.394244\n1226.955164\n1229.430391\n1235.756412\n1236.439446\n1000.392781\n1024.24454\n894.7045697\n866.2765862\n803.1337173\n803.3565775\n793.9164397\n792.3552421\n790.4186206\n790.9023627\n876.0539255\n870.2927346\n1089.263142\n1198.821529\n1225.23515\n1248.661239\n1242.692062\n1233.313183\n1198.804345\n1238.992121\n1240.288675\n1239.183428\n1240.058141\n1238.142138\n997.222218\n1024.742203\n895.1990218\n857.4361474\n789.5239506\n793.3608719\n782.4087516\n782.2074511\n782.1453946\n782.1213766\n869.3915522\n864.3326317\n1090.251239\n1195.899977\n1225.137908\n1252.649459\n1251.994095\n1236.940594\n1198.997593\n1243.783615\n1254.074802\n1253.245395\n1256.043104\n1249.724032\n965.8669909\n1015.680262\n884.5965022\n839.917481\n773.618132\n768.2882718\n759.3449542\n763.7020243\n763.2839967\n765.4905717\n868.1400239\n872.3465461\n1090.740611\n1203.070909\n1236.933864\n1258.651992\n1255.191503\n1239.893887\n1195.532133\n1230.494083\n1234.594184\n1236.604884\n1240.873032\n1238.833357\n985.6079077\n1020.807983\n890.0321229\n849.1540054\n778.5950759\n778.9192316\n764.1600822\n763.0938436\n763.1215507\n763.1277438\n773.1503167\n770.7804809\n837.2725457\n942.5143802\n947.2681958\n1043.197939\n1031.506611\n1028.943596\n1004.420612\n1010.534299\n1012.176191\n931.1596614\n938.7869303\n891.8271439\n842.0726553\n850.5778954\n735.406653\n732.3595927\n721.1904037\n734.740183\n733.4675605\n725.5501497\n723.934412\n730.1445148\n748.1780991\n757.8530611\n839.35959\n810.4855559\n869.533934\n849.1255328\n857.4081405\n860.8903175\n860.702547\n855.2055133\n856.9357249\n855.5039657\n828.1034977\n780.4736455\n748.4732501\n755.1215913\n721.9352597\n719.8567143\n715.6440505\n730.4007037\n731.0687679\n747.5544917\n745.6189774\n745.1499065\n837.6794147\n838.6646217\n1067.389099\n1175.278316\n1214.248312\n1243.861887\n1247.01574\n1236.557329\n1187.763421\n1226.09914\n1242.31815\n1245.576234\n1251.456792\n1243.919487\n969.7265974\n1016.63981\n889.9518275\n854.7825986\n792.5738245\n798.7335023\n787.6069905\n787.2912426\n787.3499757\n787.1956921\n880.2007762\n876.1612449\n1101.750779\n1212.841801\n1256.096379\n1281.102786\n1266.441408\n1256.105925\n1208.509421\n1235.927205\n1231.115749\n1227.34563\n1235.695461\n1243.995124\n1007.553741\n1028.566829\n897.006109\n852.802529\n786.5045939\n789.2583171\n773.4644407\n774.9262577\n776.6373141\n780.7345878\n868.8181998\n867.1676924\n1096.085708\n1200.372628\n1237.275093\n1262.564427\n1263.778184\n1255.896348\n1199.026387\n1225.150181\n1228.043451\n1229.502662\n1235.322366\n1234.724722\n988.2787787\n1013.568524\n878.8368792\n839.149766\n773.7042086\n775.8015834\n757.72857\n755.1129525\n755.4604311\n755.5339313\n851.3280351\n854.7962349\n1082.819081\n1190.503237\n1228.248004\n1249.433742\n1247.204661\n1241.134355\n1192.770512\n1228.343081\n1231.573612\n1235.203492\n1239.829582\n1239.287669\n974.3030652\n1003.147796\n871.5246448\n831.7567588\n760.3624303\n759.4408148\n747.2004332\n747.3106812\n753.2131439\n759.3737102\n853.8507971\n853.6053874\n1082.823094\n1189.92301\n1221.71981\n1245.598615\n1238.159636\n1238.273522\n1201.298615\n1236.266517\n1238.017818\n1247.579571\n1257.280328\n1245.749356\n989.3433469\n1022.52829\n883.0549735\n843.6910426\n777.9733825\n782.8448728\n772.4253405\n772.0355375\n779.1385128\n796.9270931\n811.9057133\n806.7724046\n886.1523155\n981.221071\n964.0712208\n1054.232837\n1049.796314\n1033.1591\n998.6848161\n993.6051713\n992.3825356\n920.2631418\n958.2509371\n921.9504799\n898.5790186\n915.0443428\n804.5119784\n809.2530446\n795.9602529\n788.2553501\n778.7583695\n776.0153904\n779.7500879\n779.9017633\n789.923238\n792.8452331\n874.2736599\n860.9746014\n934.8133788\n926.1856498\n933.9030411\n927.5816401\n926.4630218\n920.7907442\n916.7050875\n918.3782646\n896.5737081\n851.9740351\n838.7452668\n841.2526572\n802.0551968\n800.4846195\n790.9670967\n792.2601223\n779.860229\n786.1563452\n784.2663681\n784.4886454\n875.0099739\n875.9835901\n1104.813033\n1203.94626\n1231.972112\n1256.037125\n1269.243414\n1291.980458\n1246.767202\n1273.916471\n1280.272669\n1282.050174\n1292.981272\n1299.039212\n1043.605693\n1057.55836\n930.2825022\n888.9115553\n824.2859762\n831.0669745\n820.5111382\n820.7857832\n816.2071448\n820.7792975\n912.9150035\n913.2676261\n1140.750165\n1248.01927\n1275.101749\n1301.42311\n1303.270765\n1297.734577\n1245.684133\n1275.61589\n1277.580248\n1276.578067\n1290.931459\n1300.432457\n1044.711197\n1058.678452\n927.0064356\n889.5803363\n824.3090573\n830.6473172\n821.3097998\n821.3370841\n820.6532971\n817.5486001\n904.229309\n903.2294043\n1131.306806\n1243.165239\n1287.140034\n1303.344347\n1299.400811\n1287.816438\n1235.460564\n1254.805143\n1248.10557\n1250.13313\n1267.709108\n1279.84538\n1030.914448\n1045.161049\n914.6517729\n882.2072362\n820.5455484\n822.135562\n811.9597231\n819.8608356\n817.3649782\n815.4437096\n904.5961274\n901.9442446\n1132.026326\n1244.127716\n1273.53159\n1264.358272\n1271.961738\n1258.589114\n1211.939382\n1241.149623\n1234.559467\n1231.002989\n1238.040848\n1239.797021\n974.1513576\n999.9470302\n874.8699083\n846.5954944\n784.3703441\n795.7860854\n784.4681002\n788.5217008\n802.630525\n811.0666538\n902.9523888\n904.8634352\n1140.734395\n1241.356437\n1241.432603\n1250.624265\n1252.523545\n1248.054976\n1198.36131\n1227.844036\n1232.590736\n1240.520177\n1243.752378\n1246.340449\n987.6588003\n1018.868023\n891.8817599\n864.1411006\n795.4421446\n802.4444271\n793.3249236\n793.1435634\n779.8803059\n787.1141834\n824.9115901\n826.4845817\n890.1181762\n980.390338\n978.0745522\n1069.904002\n1068.739251\n1064.884475\n1026.610558\n1012.420544\n1003.535322\n934.0061663\n952.1111447\n913.7263871\n893.0098597\n903.6932804\n797.301686\n803.2477633\n784.5957775\n782.1173371\n767.0703458\n748.2199785\n744.454221\n744.6580177\n762.446088\n758.017542\n825.2784453\n813.3035067\n891.5844558\n879.3241826\n879.5569615\n877.0621856\n870.998267\n864.1411275\n874.845821\n889.025062\n872.0691797\n835.330465\n827.9721833\n838.9175214\n812.4957603\n812.789209\n803.8245159\n809.7783883\n799.4102087\n802.8378852\n809.9139442\n810.6086555\n820.3871811\n820.2447628\n892.4958558\n887.9059492\n952.5671226\n924.6363495\n919.8967078\n911.3187566\n902.619946\n894.0102047\n896.9468803\n904.4620659\n885.3071284\n846.4912372\n841.9830036\n845.7931559\n817.2440034\n821.4165493\n813.1230423\n819.4538253\n809.2815474\n819.0724418\n818.6815011\n818.0077781\n910.0451742\n909.0580049\n1133.22103\n1242.648051\n1282.133387\n1300.864645\n1300.097478\n1299.545299\n1248.489213\n1276.323914\n1268.561344\n1270.136321\n1281.243848\n1297.521779\n1055.130319\n1069.099285\n937.7651238\n897.6194864\n829.7059875\n827.3619031\n813.2320192\n813.5870446\n807.5127342\n800.9609399\n888.7314613\n887.2497045\n1115.737271\n1230.191618\n1276.728326\n1300.351836\n1299.298082\n1294.478316\n1237.595153\n1265.152922\n1264.203419\n1272.706418\n1283.480775\n1288.924006\n1045.009885\n1054.099062\n927.5918763\n888.1444581\n822.07156\n826.1708626\n807.6709082\n813.8827436\n817.1557663\n820.7553681\n907.3351225\n910.0928701\n1141.753759\n1243.920547\n1268.525842\n1284.739407\n1286.923301\n1283.502698\n1238.49853\n1260.908963\n1256.380324\n1255.637089\n1265.558196\n1262.737441\n1005.203625\n1011.135813\n880.7909367\n842.761749\n779.3158391\n778.0702685\n757.8562895\n759.1429296\n773.7205497\n775.7745945\n865.9877082\n861.8904883\n1083.276882\n1187.524268\n1226.551174\n1262.027726\n1263.066874\n1260.130376\n1216.839474\n1252.134748\n1254.500507\n1268.716444\n1268.397357\n1268.135785\n1022.564747\n1034.512272\n908.3145407\n873.3084308\n807.3247993\n813.0004062\n802.9936058\n802.6547055\n806.0742776\n804.0059353\n811.9681545\n823.180798\n904.7859837\n1011.049729\n1005.545046\n1103.847601\n1096.469167\n1097.855908\n1065.223062\n1055.324022\n1052.478812\n978.6854137\n996.6925996\n958.16575\n934.9582993\n945.0158226\n834.7413303\n835.181273\n831.0911952\n834.4046942\n819.8547462\n805.1357193\n801.9054173\n799.321833\n808.7894628\n808.573689\n880.3875425\n876.2400723\n956.1137567\n939.1518293\n938.7947744\n935.2904878\n921.9588024\n905.4299901\n903.6560917\n906.3149538\n887.7304583\n853.5295057\n849.075774\n854.2932225\n824.1683367\n827.6969298\n818.5308523\n817.5748186\n802.6012496\n812.0394704\n809.9662919\n808.2680447\n903.2173702\n899.4504928\n1115.276399\n1222.011438\n1258.304414\n1292.253918\n1295.10129\n1283.591597\n1244.325397\n1274.730389\n1266.811563\n1270.556374\n1276.341629\n1279.741681\n1038.510054\n1045.749519\n903.5652157\n881.3251233\n811.5858223\n798.9516051\n803.7287137\n809.5087719\n846.7032862\n862.5477967\n938.2498457\n924.1871071\n1144.16258\n1256.475722\n1267.790872\n1297.813392\n1311.574895\n1298.455801\n1253.645689\n1280.829194\n1256.968238\n1261.50157\n1278.257592\n1284.108971\n1047.896384\n1053.441747\n918.7983783\n893.8272854\n829.9447674\n829.6095591\n816.2060581\n814.7281863\n811.54855\n806.3835356\n898.0595819\n888.9488136\n1121.23315\n1235.129033\n1277.513948\n1306.229437\n1302.78821\n1292.395442\n1237.290547\n1259.632576\n1253.15066\n1260.441594\n1283.980888\n1311.877928\n1072.131678\n1072.665432\n938.2914672\n899.2542567\n831.2933353\n831.4312182\n815.1030917\n811.1457239\n808.7049405\n805.8499321\n892.7296746\n890.6419937\n1122.637638\n1241.880922\n1281.462794\n1294.295589\n1281.12079\n1275.437728\n1233.111857\n1242.645189\n1233.365221\n1228.705135\n1240.815533\n1246.311557\n1021.579129\n1028.537597\n882.1408621\n855.560332\n801.7724588\n804.422748\n799.9691248\n801.4614166\n809.6169908\n816.7080098\n901.156937\n901.0785244\n1130.564791\n1247.039907\n1269.15283\n1276.742737\n1267.87214\n1275.235406\n1240.977746\n1256.972618\n1246.380163\n1234.137141\n1252.553352\n1273.414656\n1017.001496\n1027.861085\n894.1970166\n854.1105587\n792.0764918\n797.0461192\n797.9631645\n797.7389651\n815.3542104\n811.9509099\n818.2915259\n825.7517861\n897.2957373\n1005.681203\n989.4860502\n1076.440028\n1067.156661\n1052.179854\n1000.816558\n990.0936343\n990.0391984\n917.5468771\n942.4753923\n916.3532902\n910.1330372\n925.3000721\n830.1928311\n841.3303568\n830.0949658\n829.0279782\n815.3729754\n801.7343245\n798.6045715\n797.2427568\n805.4906687\n802.4815424\n872.8612689\n870.9606675\n952.5061729\n949.6032244\n960.0337193\n955.6310814\n946.3603614\n931.4204563\n925.6151265\n928.1799385\n909.2873402\n873.3804463\n865.5335635\n861.0464458\n827.7564973\n826.2910747\n815.3053133\n816.1638326\n801.6077341\n810.4472472\n808.8495946\n804.1804312\n894.1158589\n900.5803461\n1131.940375\n1246.258346\n1286.189427\n1322.429595\n1327.022277\n1317.528513\n1263.969448\n1294.650839\n1285.486094\n1288.399371\n1297.147164\n1301.735853\n1059.336504\n1056.688409\n923.9322347\n886.7141589\n818.8564001\n820.1209733\n807.6898899\n802.8619119\n800.5092585\n800.7247942\n893.8096583\n894.2846566\n1117.737689\n1225.101625\n1248.079363\n1276.95644\n1277.877385\n1273.742874\n1235.88715\n1266.182639\n1263.007982\n1266.259048\n1266.155206\n1269.672693\n1027.593367\n1039.216831\n915.5011193\n877.0561296\n819.7848077\n822.33379\n804.0464288\n819.8269108\n820.1661267\n820.7252483\n910.9531846\n909.7325569\n1137.54829\n1255.698035\n1288.280965\n1310.972756\n1304.625153\n1293.727479\n1245.683858\n1275.130388\n1270.294528\n1269.246891\n1283.87448\n1294.698755\n1048.922559\n1055.654645\n922.5096965\n882.3696869\n814.66344\n820.4384557\n820.6623489\n820.8926285\n816.7750658\n810.5789964\n897.7029077\n896.9331621\n1127.09206\n1247.900703\n1284.335965\n1299.863837\n1291.783319\n1283.798799\n1231.606538\n1252.521144\n1245.347744\n1243.078653\n1254.243441\n1271.1817\n1028.31744\n1040.706464\n908.5347274\n877.7302476\n817.4670747\n824.3927365\n820.3411307\n818.5564322\n811.7429362\n818.9538347\n909.2246904\n909.6334109\n1139.08505\n1256.490931\n1291.166723\n1317.517302\n1313.931411\n1297.622198\n1250.184506\n1284.874394\n1278.312956\n1277.689472\n1294.077428\n1300.631384\n1049.978765\n1047.808519\n920.9709416\n882.7973683\n815.267574\n811.5854684\n796.9014911\n797.229214\n796.652925\n800.2841602\n824.4681207\n828.0797886\n898.7884597\n1006.424349\n1004.249544\n1105.160492\n1105.406679\n1101.01969\n1076.346935\n1073.437784\n1073.413874\n990.9268128\n996.8898912\n968.8090977\n950.7088764\n946.7919943\n831.6554523\n835.4186586\n822.6873284\n826.928346\n817.0070039\n809.5191788\n809.6241429\n807.310208\n816.9248244\n815.7391033\n887.4573172\n885.9218974\n958.9345787\n950.2744344\n952.8729082\n947.5365119\n934.9992961\n927.3039995\n926.1731344\n924.3611145\n902.9948929\n870.6870843\n866.7584687\n859.1717274\n825.8853168\n823.6178261\n811.5479509\n810.581584\n796.2291303\n806.788583\n806.1357244\n804.0387457\n894.1162107\n896.5110062\n1126.591262\n1242.829883\n1278.564835\n1315.707184\n1313.017475\n1311.414471\n1266.920005\n1282.601687\n1277.343283\n1279.593075\n1294.492567\n1316.47235\n1076.005808\n1067.490574\n931.6280397\n890.7153085\n821.9956704\n821.7126983\n807.781848\n804.832076\n800.3452962\n797.1204563\n888.8115085\n887.2936152\n1113.446636\n1232.854491\n1272.434014\n1316.292284\n1317.804312\n1313.142436\n1271.544089\n1288.806786\n1291.805387\n1312.175714\n1330.717754\n1326.395813\n1066.557986\n1056.043861\n919.4823387\n889.5692313\n833.5330928\n830.9496552\n816.678793\n823.6845793\n821.2944629\n816.3015431\n897.416318\n901.229525\n1128.658518\n1251.478321\n1274.154545\n1306.885258\n1295.852488\n1301.024638\n1269.052534\n1285.406386\n1277.9019\n1287.283333\n1294.959929\n1278.951002\n1044.860993\n1056.653428\n923.2863722\n897.1550326\n845.6923803\n844.5956696\n808.8805741\n818.0307123\n824.5400534\n815.4649157\n898.5958635\n889.7444328\n1118.829647\n1240.750685\n1282.824919\n1319.92753\n1314.369787\n1305.232575\n1255.778054\n1278.533449\n1270.797834\n1266.812932\n1269.560355\n1276.679294\n1031.392215\n1049.893979\n931.3952708\n889.4808661\n805.4178244\n791.0869819\n776.7792359\n769.0636259\n770.4339437\n786.9874829\n889.7112201\n907.1393195\n1145.462074\n1262.304416\n1293.073091\n1325.236971\n1326.956371\n1325.755607\n1279.924748\n1314.601696\n1317.485303\n1317.747336\n1333.974254\n1336.092584\n1068.274717\n1059.520603\n924.5724608\n885.8351136\n820.4159228\n821.3903338\n808.9200422\n808.5990511\n808.3072039\n807.237992\n817.0539968\n814.9361593\n884.6230852\n998.5068804\n1003.299882\n1113.193433\n1122.696748\n1125.826898\n1095.368163\n1089.771344\n1089.186785\n1010.086089\n1017.710193\n977.9934016\n952.3055457\n945.2350381\n834.3175823\n833.6993151\n823.2931833\n824.5644055\n812.2081578\n801.0210961\n796.1154241\n789.7445825\n798.4836876\n796.6982861\n866.1679398\n867.8121743\n944.3919761\n942.2188209\n954.4916307\n952.7240165\n943.5452827\n933.6971792\n921.9687082\n910.3964273\n895.0351581\n855.7694516\n857.1177125\n853.660923\n822.7466039\n829.7264012\n818.4002148\n815.5020546\n799.3400468\n804.3559641\n800.3910957\n794.9491317\n794.4375678\n885.2968676\n885.2833239\n1108.966893\n1228.580436\n1274.227474\n1300.277139\n1305.362433\n1312.161609\n1262.995495\n1289.872406\n1294.884193\n1312.007926\n1334.284353\n1349.881107\n1076.763763\n1067.357915\n932.0340532\n889.9998381\n819.5472115\n820.8834348\n811.3737378\n813.9335678\n814.639397\n814.2786779\n906.9738266\n908.639479\n1129.273478\n1244.729488\n1287.173093\n1322.754694\n1331.32521\n1325.928974\n1268.489027\n1288.85844\n1285.886779\n1295.007748\n1309.106376\n1332.937982\n1063.478015\n1064.145808\n934.221299\n899.4107236\n831.6559007\n830.2459015\n820.6382737\n819.5611935\n818.1749811\n817.3273338\n909.8026417\n913.9996634\n1139.364586\n1245.697763\n1275.249001\n1310.051373\n1318.011455\n1314.113522\n1271.712013\n1297.736027\n1302.004221\n1310.852159\n1313.682148\n1332.456072\n1068.377044\n1073.124871\n939.8064373\n898.8264743\n831.349793\n831.4090127\n816.8931265\n819.3135995\n816.1260755\n813.7942504\n904.5547416\n905.5638305\n1131.119902\n1238.751587\n1279.280547\n1309.542061\n1309.31068\n1312.51374\n1265.675554\n1294.127154\n1294.617178\n1292.317842\n1299.806672\n1330.643957\n1065.584771\n1061.410206\n927.0445851\n878.4747265\n817.3432568\n822.1603684\n808.9187924\n815.2626371\n818.0069383\n817.5914708\n902.7587851\n905.0183698\n1131.996065\n1233.07561\n1269.600569\n1297.150865\n1289.919196\n1277.952061\n1226.03102\n1258.642409\n1260.068885\n1259.467928\n1281.532546\n1299.205722\n1037.71724\n1033.50077\n901.7289832\n868.3679175\n799.0210152\n788.5324054\n765.2650156\n770.9087095\n768.1454014\n765.6382983\n779.2950805\n781.073924\n849.9973113\n845.5579085\n916.0849584\n901.2774251\n907.8480946\n898.7528481\n892.8364064\n889.7215619\n887.9339205\n901.3764151\n892.4068105\n858.4420365\n830.5133276\n828.6787115\n798.7491136\n830.9942338\n818.4444106\n816.9226348\n802.3869803\n803.125733\n803.4215607\n792.5626878\n787.8249352\n792.5556248\n863.8347345\n859.5306721\n931.0698658\n911.3390021\n915.1034907\n919.1815485\n920.3107738\n911.6945984\n918.1234923\n924.8781896\n905.3971234\n870.3153426\n839.9086405\n836.3252618\n803.2168451\n803.9202056\n802.9392854\n795.48608\n790.502448\n799.4029313\n803.2779122\n806.3893497\n909.7460515\n914.2976499\n1135.912606\n1241.208496\n1262.788164\n1284.125451\n1283.309602\n1275.580134\n1237.79268\n1269.140455\n1258.785102\n1264.84533\n1280.56803\n1303.126721\n1047.621646\n1044.685655\n912.8467498\n886.3257425\n828.4944904\n835.206596\n818.9836588\n815.9974312\n813.7031205\n813.1266964\n903.9449739\n902.8157188\n1129.10574\n1242.002759\n1261.787327\n1286.109507\n1294.470171\n1292.56669\n1228.107285\n1259.341979\n1267.343333\n1271.340062\n1281.420684\n1291.735462\n1036.041196\n1027.83777\n894.7585758\n870.3024275\n796.2040832\n799.8074472\n804.4224979\n821.1254395\n823.2788752\n821.53662\n910.7093797\n911.256396\n1137.340323\n1241.482549\n1263.248056\n1282.653971\n1288.520349\n1284.663085\n1237.370403\n1265.044901\n1262.880656\n1257.518986\n1274.969182\n1290.065285\n1035.142686\n1041.763385\n919.1068995\n886.7248967\n824.8033098\n827.455536\n804.7171556\n819.8193755\n816.5370148\n810.2209028\n896.4861396\n897.2138669\n1127.936386\n1245.212288\n1278.291981\n1300.116672\n1306.921368\n1306.772518\n1251.980074\n1271.859868\n1264.818323\n1263.17185\n1280.509221\n1303.56109\n1042.447053\n1049.615347\n931.908906\n902.7235213\n830.3920466\n821.634251\n821.1629394\n816.5610792\n812.1154294\n807.7528484\n895.722568\n892.5840736\n1118.547794\n1235.917769\n1283.71738\n1321.946585\n1297.439667\n1276.172132\n1232.716245\n1265.217633\n1255.228136\n1263.719296\n1288.996891\n1304.888152\n1039.36981\n1047.5559\n929.2252329\n902.0161421\n830.265422\n826.3258766\n812.9480438\n812.1299165\n808.3694384\n805.7782522\n817.6766819\n824.1130395\n900.626467\n1010.597189\n1020.974797\n1128.67221\n1131.751148\n1114.065921\n1059.237309\n1043.159402\n1043.336903\n970.5710347\n990.8231142\n972.0215917\n932.9267296\n927.479684\n822.0042436\n829.6324332\n823.0791484\n831.591249\n811.6192089\n809.8439995\n808.5962171\n808.2934438\n816.857321\n814.0082464\n881.8985248\n877.0856115\n958.1801327\n945.9732736\n950.168088\n955.8201019\n952.5176663\n937.6175374\n930.8923486\n934.6913953\n928.0662428\n897.3164846\n864.470186\n856.865293\n824.6719418\n822.611856\n808.5999686\n805.3168585\n801.2929961\n798.9455737\n807.569455\n815.9072161\n909.4623691\n914.3073904\n1121.919056\n1247.538281\n1305.872994\n1339.484264\n1355.739952\n1358.589432\n1308.661353\n1324.770969\n1291.433065\n1275.508458\n1285.385975\n1305.190411\n1054.516225\n1055.943259\n931.1396439\n903.2934232\n841.8211288\n845.647101\n844.3810589\n848.5652702\n843.6576391\n840.5350211\n926.9609195\n926.3381252\n1159.498388\n1276.151525\n1313.557684\n1353.775878\n1349.715607\n1331.846505\n1284.401503\n1311.557319\n1300.313726\n1302.767814\n1315.49546\n1328.564788\n1072.825903\n1077.235745\n980.9419799\n942.1805806\n878.3140405\n867.3143339\n849.5897844\n850.127347\n845.812952\n809.5500311\n912.1825296\n923.0429916\n1133.19898\n1243.601215\n1296.267674\n1344.411937\n1333.064629\n1341.484296\n1278.10993\n1295.907551\n1302.121763\n1292.315334\n1316.216712\n1346.772343\n1080.245917\n1070.707308\n933.3893359\n889.4844085\n819.8075934\n818.6265204\n788.1820347\n784.3853235\n782.8017844\n779.0682663\n790.1034519\n788.5558283\n862.7587769\n860.2519181\n946.8508499\n945.5424337\n955.8605755\n958.5163464\n958.6584566\n947.8366637\n930.8815805\n931.8108901\n928.220324\n900.5767309\n868.3802051\n856.707646\n819.9023955\n816.591208\n803.0215687\n801.3098561\n797.8312026\n795.7266973\n794.9047455\n791.9297107\n881.0285968\n878.8517387\n1111.200037\n1224.340655\n1270.101927\n1308.741177\n1321.471547\n1328.138332\n1285.02038\n1299.108306\n1290.506908\n1298.730874\n1318.912573\n1334.286635\n1061.477703\n1051.493145\n927.6434147\n894.7373197\n833.4433358\n830.0465187\n813.407376\n813.7655267\n815.415358\n816.0500748\n826.229644\n826.3651045\n899.1094579\n1005.202324\n1015.31142\n1125.719795\n1130.43657\n1119.98102\n1080.643994\n1076.173978\n1075.445569\n1003.7529\n1015.308584\n985.4246831\n944.5145766\n932.704096\n826.8313721\n829.0690006\n819.2332652\n825.7063239\n811.5403025\n809.3147762\n806.9341156\n804.415719\n814.6373464\n814.1475638\n885.695542\n877.737563\n958.3342067\n953.2155228\n957.2268182\n956.6135151\n951.3751986\n928.8478709\n924.8559922\n929.9359771\n917.3016955\n876.7932253\n849.1610465\n845.1966951\n817.0008911\n818.3768619\n809.9024977\n810.9754157\n820.459809\n821.6455092\n821.8661785\n809.7771837\n883.4503917\n858.3513124\n1110.474631\n1251.893745\n1291.189722\n1320.935834\n1327.339349\n1328.069379\n1277.855068\n1305.200063\n1303.396692\n1312.239814\n1332.407678\n1345.271795\n1071.953254\n1065.524416\n947.8773941\n914.0827845\n847.9779056\n854.4906303\n849.4401398\n846.7180481\n844.5281737\n843.8857097\n933.9535882\n933.5579803\n1162.814855\n1266.574673\n1307.048821\n1345.987114\n1351.305159\n1355.0784\n1317.845838\n1355.541851\n1347.065143\n1345.635298\n1354.735078\n1381.666293\n1105.579592\n1095.091607\n966.1638233\n917.6455593\n854.056278\n853.0942973\n842.1157593\n843.6939195\n848.5918\n838.8535783\n920.3383067\n925.8384612\n1159.699844\n1274.340289\n1315.883875\n1348.217508\n1360.918156\n1367.135592\n1329.74873\n1365.186465\n1362.211738\n1353.862219\n1358.824471\n1366.595391\n1103.659939\n1088.165155\n944.388387\n893.9992337\n823.611771\n822.9551358\n810.3091302\n806.7091894\n800.4021846\n803.3761261\n884.0200711\n881.7234602\n1108.26357\n1215.829256\n1261.882046\n1306.355867\n1313.787765\n1319.644149\n1282.98531\n1314.936178\n1325.376786\n1325.330106\n1331.973362\n1343.668045\n1066.666291\n1062.50515\n917.9628894\n872.8026275\n807.5970703\n809.4506786\n792.3736249\n794.4023895\n793.0916432\n791.5619561\n882.8472777\n886.7170904\n1121.016441\n1232.865134\n1280.516541\n1319.989116\n1331.97326\n1328.260492\n1280.650172\n1312.071504\n1303.012879\n1296.109802\n1318.917954\n1345.958561\n1075.734734\n1065.720604\n927.7205135\n882.7617501\n813.2874669\n812.346388\n796.9061441\n793.5245272\n790.3624917\n788.5927765\n796.3830249\n795.7926903\n870.72211\n983.3116962\n999.2356184\n1108.959921\n1117.787242\n1123.410918\n1096.66974\n1090.670331\n1091.53007\n1015.04368\n1027.332018\n997.7100557\n958.2581036\n950.3507597\n838.4756445\n838.0486856\n827.9972356\n828.458794\n804.0340449\n803.7909793\n803.7199958\n803.6956007\n813.8773696\n813.8422914\n886.9243249\n878.8052875\n958.8947066\n953.3987482\n957.192814\n943.5708145\n939.0708326\n921.9700297\n922.8526835\n923.5134115\n900.8916158\n862.4194905\n836.6209575\n836.2277993\n806.2196576\n810.4087665\n802.5412235\n798.2580925\n794.4586814\n794.7401914\n794.8340787\n805.1059154\n910.4726183\n914.4075407\n1136.566757\n1249.904931\n1290.663505\n1318.972246\n1322.949805\n1315.546485\n1263.630745\n1291.939785\n1291.218868\n1291.809547\n1296.977636\n1311.415392\n1048.384447\n1044.580876\n917.4523301\n876.9701538\n804.471431\n818.1667622\n805.6259927\n800.3318095\n798.5483317\n795.134172\n891.3673914\n894.0847969\n1121.588092\n1223.376671\n1264.416932\n1297.855067\n1296.794339\n1291.059774\n1251.777217\n1280.050263\n1281.442673\n1280.62921\n1291.393089\n1316.012243\n1056.249846\n1046.501779\n924.9393239\n892.8808091\n826.8087306\n821.9421134\n813.5022515\n815.3885982\n815.1241607\n821.1011573\n912.1706252\n913.2403052\n1142.347943\n1250.771965\n1286.244326\n1312.056479\n1317.60109\n1313.373223\n1261.20751\n1290.845591\n1281.850375\n1286.642321\n1302.663056\n1313.788167\n1051.654903\n1052.742455\n916.9189218\n881.5812042\n816.0690739\n817.6374542\n806.1593603\n787.5138608\n760.201572\n753.0889047\n848.5010384\n859.620818\n1088.026799\n1200.577213\n1235.520017\n1268.295462\n1301.539115\n1331.37426\n1269.434094\n1305.859009\n1322.324876\n1329.060972\n1333.009236\n1341.583069\n1063.607059\n1056.982151\n922.1747272\n881.6669621\n811.4453454\n809.3965007\n799.9504606\n799.4833358\n800.1479816\n799.4450686\n893.6144567\n892.6084187\n1121.383073\n1231.566508\n1268.847172\n1306.324672\n1319.256996\n1322.063351\n1278.466934\n1312.495419\n1313.80074\n1313.82884\n1324.771295\n1330.773762\n1055.778844\n1049.760245\n915.8432432\n874.7281367\n809.5129967\n807.9440618\n795.05493\n796.6648653\n795.577339\n793.9610471\n803.8278344\n803.4108651\n868.2641935\n975.752982\n983.2689428\n1095.825986\n1111.429253\n1128.982614\n1095.908741\n1086.057185\n1084.39725\n1005.322241\n1026.443241\n985.1170872\n942.5815416\n930.3101471\n815.5445383\n813.2230687\n806.8653672\n814.0780238\n792.7356909\n795.5029559\n795.1563106\n786.2664752\n786.4937974\n785.8386103\n866.8281745\n866.4770342\n940.5480425\n936.4795837\n944.9759855\n956.5301227\n958.7609595\n943.5449544\n944.851007\n951.0286237\n922.3909011\n889.9157505\n858.986746\n848.9808519\n822.7382737\n828.3124629\n817.7122263\n821.8222782\n804.6906873\n805.981122\n810.2297413\n811.223842\n906.2557547\n900.103016\n1128.509305\n1240.185183\n1279.810243\n1319.747729\n1336.161596\n1339.735655\n1283.339659\n1308.799522\n1308.489969\n1318.531834\n1336.065219\n1347.134957\n1064.486227\n1061.174514\n927.3040672\n876.9003521\n814.090878\n817.3818293\n800.1801286\n791.4793651\n786.7874073\n790.7865505\n883.8277108\n879.5515468\n1102.066076\n1214.971839\n1257.597327\n1293.807143\n1304.42904\n1308.997694\n1270.402539\n1306.408215\n1310.931878\n1312.137081\n1323.057771\n1333.935553\n1058.595289\n1050.551469\n913.7351731\n870.8538136\n808.7906653\n808.7654911\n795.9569328\n795.8438947\n801.5064929\n799.5090632\n889.2125115\n885.6455144\n1107.349054\n1223.840232\n1267.713726\n1306.169612\n1318.918091\n1311.556443\n1270.183703\n1309.076127\n1309.907243\n1306.653698\n1317.127215\n1331.536021\n1054.976931\n1045.070243\n913.8824569\n875.6674662\n815.0762515\n824.1313664\n819.2931458\n821.0078573\n818.6425074\n816.4081514\n904.5367101\n907.5976308\n1139.888788\n1254.421314\n1292.884636\n1325.293824\n1324.904612\n1324.705206\n1265.718517\n1277.549456\n1285.923185\n1315.148802\n1338.319605\n1353.033104\n1076.837914\n1065.338627\n928.0424867\n884.6504926\n814.1787347\n812.9770404\n796.5184324\n793.2169401\n789.5936555\n787.6967301\n876.2809803\n877.9815393\n1107.237518\n1221.337685\n1263.074805\n1302.936769\n1319.537326\n1325.884336\n1285.897229\n1321.087512\n1320.997616\n1319.732822\n1327.397684\n1339.13223\n1063.217288\n1050.94815\n913.5346903\n873.8347447\n808.6387063\n811.7813005\n799.4212927\n797.0534735\n796.361937\n794.5787073\n803.5624267\n804.1511511\n876.1588862\n985.4133871\n992.0902513\n1103.103778\n1115.53992\n1118.587095\n1087.225711\n1083.514731\n1086.222831\n1009.850864\n1021.520733\n990.5944425\n951.5266823\n944.0389539\n832.0444909\n829.230449\n818.4459787\n819.8123302\n796.5519438\n797.1013957\n798.6619662\n799.1203397\n810.0520956\n809.8792881\n881.2630226\n876.5000519\n951.9481094\n945.7768035\n955.6003743\n957.339458\n957.4767381\n952.7998731\n954.072565\n953.7864056\n928.8112032\n888.8231015\n856.4049873\n848.5400504\n816.484007\n815.7612895\n804.1935979\n803.8478334\n802.1163422\n802.4718173\n802.3386844\n802.1997937\n892.8167888\n895.1953082\n1124.52786\n1236.803156\n1275.829604\n1312.890499\n1321.909247\n1323.619105\n1281.410388\n1315.882457\n1304.846292\n1302.825791\n1321.778601\n1340.425477\n1080.401976\n1085.479994\n953.8274009\n908.1221467\n844.2826065\n846.208327\n854.7951409\n849.5094695\n838.0337148\n831.1158167\n928.639018\n923.2059107\n1146.580367\n1253.024254\n1291.119359\n1345.790565\n1377.845364\n1387.76735\n1333.7602\n1345.850955\n1314.849055\n1325.810235\n1367.783501\n1388.981796\n1080.986584\n1062.674619\n938.1781218\n901.5565479\n833.8172801\n839.3712535\n812.3355703\n800.6744386\n800.201569\n813.5792184\n896.8626088\n890.6377565\n1110.028151\n1222.930965\n1265.291041\n1301.738299\n1310.52271\n1313.919102\n1266.225527\n1315.892084\n1320.90434\n1324.43366\n1338.554162\n1346.909346\n1066.040163\n1052.887917\n915.5480768\n875.078349\n810.8826114\n815.6658117\n803.4874208\n806.4846203\n799.5411968\n795.1677511\n883.4843327\n886.1115876\n1114.717397\n1226.930103\n1265.457293\n1301.285838\n1314.598397\n1337.356615\n1314.986425\n1349.297213\n1350.283186\n1348.328139\n1357.314485\n1365.431459\n1091.403984\n1098.251912\n960.0646707\n919.8576496\n853.3456763\n848.4174561\n836.0471337\n843.9272569\n842.8462847\n838.903246\n932.8303604\n935.6574804\n1159.688694\n1271.423174\n1313.647975\n1352.677191\n1365.757501\n1366.563579\n1325.713803\n1348.695763\n1349.261465\n1351.40059\n1341.434526\n1368.54083\n1108.064464\n1104.094742\n953.6976783\n914.2817516\n843.335054\n850.6161443\n823.6181162\n812.1386117\n806.4213867\n801.9367669\n812.360991\n824.9238772\n892.2709386\n990.9620633\n991.4585963\n1101.781767\n1107.813094\n1110.895284\n1084.236538\n1089.180558\n1102.54227\n1002.70159\n1019.333697\n995.2356094\n953.9275341\n939.2664896\n824.2614927\n824.2805567\n816.3366296\n813.7165419\n797.0618677\n811.1880323\n809.321111\n811.3216821\n817.8712937\n815.4574191\n872.0716412\n869.2606084\n936.6694907\n929.8475419\n948.295706\n955.3750261\n959.9308405\n968.1950583\n981.5956522\n972.6854328\n943.5170517\n899.3791676\n874.2139764\n873.2146235\n842.7377392\n830.7445036\n827.6704887\n832.4777842\n823.5314982\n825.6033442\n826.6962875\n827.2476896\n829.2595968\n834.8324059\n903.6991616\n892.9829065\n970.5781128\n963.7832362\n969.8948661\n973.7883614\n972.0214809\n962.1694137\n958.2938989\n960.5864382\n937.6210251\n884.5918637\n866.211026\n871.3029182\n837.2115578\n843.9199303\n839.8228193\n840.6747187\n825.5932241\n823.5861141\n821.1794475\n812.5042126\n892.6740345\n891.6522769\n1115.893434\n1224.295389\n1257.899722\n1298.374335\n1315.738279\n1328.898016\n1292.989608\n1337.287808\n1347.204107\n1339.61618\n1334.584684\n1350.371653\n1062.004175\n1059.104679\n940.2866159\n899.4219227\n827.4035066\n823.5059446\n809.5770093\n809.0439119\n803.2611914\n796.1219715\n887.2762676\n886.0050482\n1106.092137\n1224.667269\n1259.462465\n1293.066553\n1305.171241\n1309.237635\n1272.955561\n1305.233334\n1305.606668\n1314.250299\n1340.367494\n1339.272663\n1063.372674\n1060.590506\n925.8986335\n885.2303688\n809.4989928\n810.9498516\n800.0816977\n795.1157432\n797.1027051\n790.3715791\n883.3201544\n884.8372083\n1109.192993\n1227.128609\n1261.638311\n1307.102031\n1330.97708\n1329.486824\n1284.881649\n1321.532152\n1318.400664\n1314.17055\n1328.254411\n1343.885912\n1078.89665\n1071.979357\n928.8984588\n881.7677738\n820.4100941\n816.1499971\n799.9407536\n799.7647687\n797.0083093\n792.0411482\n884.2567664\n886.6702856\n1115.129262\n1225.655371\n1265.72743\n1302.242149\n1315.720141\n1321.273861\n1294.133075\n1334.637419\n1319.552583\n1306.320916\n1323.346653\n1343.531156\n1064.777676\n1055.95096\n920.9145812\n879.9289174\n811.0499396\n811.6483553\n797.3448067\n800.1970234\n792.465614\n791.3403216\n805.9931251\n800.443718\n870.051648\n980.1873918\n994.328352\n1108.434719\n1124.041185\n1129.444609\n1090.775945\n1086.221589\n1087.829986\n1009.817805\n1019.18002\n987.7957646\n946.7885187\n942.4191353\n830.1274514\n826.3457555\n816.1606232\n817.016735\n791.9738489\n789.026179\n786.7916654\n787.5827873\n797.3047787\n794.181446\n867.1487372\n863.9774062\n943.68905\n939.4662388\n950.4260857\n953.9334838\n955.9637376\n950.1688428\n950.6045756\n950.6076805\n926.8563139\n883.7266039\n850.2164286\n845.5630806\n827.5305211\n829.2562997\n813.9372051\n815.5885836"
  },
  {
    "path": "src/pymgrid/data/load/RefBldgLargeHotelNew2004_v1.3_7.1_4A_USA_MD_BALTIMORE.csv",
    "content": "Electricity:Facility [kW](Hourly)\n148.1716309\n148.5637443\n130.6879266\n130.6690805\n139.2221808\n153.8726234\n256.4756964\n320.7084781\n357.9570079\n315.1836593\n268.6060494\n263.7456677\n269.1206335\n249.5530441\n247.0542057\n236.5507521\n250.3809745\n271.1830729\n341.1280501\n356.4264103\n383.8722985\n355.3177966\n297.2660023\n214.9469398\n134.6953429\n125.141486\n116.1815521\n115.2941118\n123.1371643\n157.5403401\n279.9277184\n361.1296496\n300.2770814\n278.63365\n235.5504206\n264.397363\n275.4186452\n260.8347152\n251.6045419\n229.3334553\n243.1714289\n272.7789763\n346.6804962\n361.2140493\n390.9236009\n383.3154841\n307.9105671\n220.1212552\n131.7218588\n125.0893895\n117.8189457\n118.3867877\n128.0770467\n164.0614184\n302.3230665\n380.9936849\n311.016585\n273.4157539\n210.5435897\n200.5159283\n194.4766399\n184.0817423\n183.7762829\n183.163297\n220.5701638\n267.6722337\n338.2920305\n353.1688105\n382.6822695\n368.5722034\n299.6644298\n215.1903253\n127.6733016\n123.0320022\n116.0404341\n116.3519194\n124.9488217\n160.4158554\n322.089835\n314.0778704\n272.604271\n267.3309902\n213.3065688\n216.6131607\n224.0304121\n212.0379213\n205.8452652\n197.8326387\n227.3263266\n260.8357985\n326.5251945\n334.6842755\n357.7260634\n346.9965397\n272.7627112\n188.4189235\n137.1347337\n124.8741692\n114.4074416\n113.0436572\n120.5502011\n155.5443722\n280.0199479\n359.2948048\n288.9070876\n259.9462724\n208.8081778\n212.5813795\n216.020637\n207.9755842\n203.5978824\n193.3639349\n219.853817\n270.0470278\n341.6906458\n348.4532033\n379.7943361\n369.9097096\n284.4442267\n192.6835352\n138.928399\n125.7599559\n114.6122777\n112.7816614\n121.4256033\n157.6439739\n284.4818495\n363.3919947\n302.8980894\n278.9846489\n227.3845312\n242.8043337\n247.5756605\n245.3111965\n242.1420716\n220.5166083\n242.0021818\n270.0259755\n333.6935131\n346.4309795\n379.1025573\n359.5603459\n280.0494353\n196.6773554\n139.4477876\n136.6391873\n116.5859743\n115.563679\n123.9071888\n138.202167\n228.4317739\n332.1763516\n385.3632645\n339.7697008\n250.3638471\n219.4184272\n207.1406791\n191.2234336\n190.0064763\n186.6471739\n221.7562454\n258.0779117\n334.9152276\n341.905268\n364.3716072\n362.3437876\n309.5616635\n223.8899808\n136.4437771\n138.0971394\n129.2777826\n135.8626113\n143.2729392\n157.4014997\n270.4802421\n301.7232122\n350.415934\n296.4560057\n229.3215719\n211.4528553\n197.9424049\n177.0375512\n177.6800784\n176.20659\n206.9727756\n233.8515175\n303.3511554\n318.8364397\n349.9675335\n326.4991203\n274.3897899\n192.9590824\n133.5583725\n119.9889467\n108.9976773\n106.9804915\n114.6261805\n149.865624\n274.2698026\n350.0627522\n287.597988\n262.1258767\n213.3451678\n214.7780375\n213.7450746\n198.804748\n188.5707233\n182.8745543\n210.6481464\n265.0297849\n335.8670627\n341.674721\n372.7384202\n362.5799024\n276.9758062\n185.3564565\n132.5369282\n118.8580983\n108.1342134\n107.0163595\n114.5756281\n149.7006654\n276.3724097\n353.5378806\n292.6270765\n267.7815595\n218.9343514\n222.6872728\n225.8261958\n216.9478137\n215.4924545\n205.635357\n222.862534\n273.0405826\n343.5716324\n349.7697746\n381.4352855\n371.7449227\n285.9699894\n194.3212477\n141.1895932\n127.8854098\n117.2419884\n115.3581541\n123.3794862\n159.9198563\n285.9853485\n364.7269754\n287.5361592\n248.4661688\n187.5125459\n182.6548729\n182.7614487\n203.1395621\n232.9707368\n215.2002837\n232.0276408\n269.9234971\n334.8155193\n343.7579733\n372.774043\n350.55545\n271.6881308\n179.6317423\n126.9384165\n117.747519\n108.8939974\n108.5239346\n116.661015\n151.2524125\n273.155248\n353.9513878\n287.6605897\n317.5892938\n261.0052249\n242.4882351\n223.6611798\n199.7740769\n189.7416935\n185.1937715\n215.7574789\n257.447329\n320.9340432\n332.6915495\n358.9830204\n347.1172921\n268.5520243\n185.2391642\n136.0087904\n124.5169648\n114.6420084\n114.0294951\n122.2850604\n157.1987683\n281.6810668\n361.1367295\n290.2441689\n281.9308828\n253.3187677\n266.1989999\n233.7789462\n201.9673766\n198.1391922\n198.3712028\n228.0915855\n274.7073374\n345.7601658\n361.9310711\n401.12787\n390.552883\n310.1911584\n218.9646898\n128.1115482\n137.2077919\n123.9561769\n126.7859983\n136.0803204\n150.0688135\n278.1985062\n308.2857704\n362.5177065\n319.3764602\n261.9820333\n258.4487428\n258.2351375\n243.0583085\n247.3794081\n239.6192148\n255.5904457\n282.9973868\n355.2389786\n358.1516109\n377.1375997\n369.9381922\n313.271727\n224.4053318\n141.4433927\n142.6895522\n125.7091192\n125.9613927\n134.4643516\n149.2299553\n263.4394751\n290.1227902\n342.0251505\n290.1681223\n237.4409941\n233.8349491\n234.0769354\n212.356951\n215.6789854\n213.5722665\n233.1278231\n255.6763679\n318.9624957\n325.578309\n356.2141187\n336.1478731\n286.9443418\n206.0361811\n158.0260841\n152.3164169\n131.6212263\n129.9674313\n137.5220018\n151.6374694\n232.7026776\n341.8212701\n397.9468001\n358.2726254\n263.5787341\n229.5765737\n217.0132681\n189.0881991\n186.5574561\n185.7866489\n219.6676402\n259.433294\n331.9821565\n346.3814881\n377.2242827\n355.1572027\n301.6408234\n223.3033625\n123.4874721\n118.0339914\n111.2563235\n111.8121787\n120.7017565\n154.6279686\n286.6649073\n317.8483253\n270.3857421\n243.0955644\n200.1091953\n207.7490067\n213.3334485\n201.7084012\n187.1834799\n179.5664576\n210.2900474\n266.0212188\n337.3885123\n343.8342788\n375.1636594\n363.8621424\n278.061013\n186.6456464\n132.5630437\n118.024987\n106.4293583\n105.1972918\n111.7500961\n145.3367401\n270.7582877\n346.4437697\n284.6332418\n260.0714376\n211.2422098\n215.5333093\n219.9495304\n213.9133933\n211.4739878\n201.2704251\n216.5292177\n266.3755192\n336.1585153\n342.2185028\n373.0244289\n361.8988783\n275.1915589\n182.5759246\n129.7889803\n118.2859724\n108.5356756\n107.499956\n114.3260519\n145.6442805\n268.9008857\n345.0318505\n284.2845645\n262.4807375\n215.6084866\n220.0195686\n225.6212497\n219.0945664\n217.685645\n207.9752606\n222.0356022\n273.0619824\n343.2253795\n349.6912803\n381.3179727\n371.5656591\n285.2831774\n192.8751173\n139.5969319\n125.9456267\n114.9335067\n113.6586711\n122.9117095\n159.5792718\n286.7883426\n365.4602011\n293.4033179\n295.5395301\n213.4904843\n200.5225563\n200.3800208\n179.2503756\n178.2330421\n179.737034\n213.4235485\n252.3800406\n309.3245568\n320.1539641\n355.664838\n348.7743783\n271.7457821\n186.2271772\n138.0525556\n134.1934133\n113.5295017\n112.2675812\n120.716845\n135.5577632\n226.3847669\n311.0408109\n353.4471266\n330.3087845\n265.2306714\n232.9544355\n211.3789761\n191.5031654\n186.2930687\n184.0119622\n214.4063131\n254.5778164\n330.1807003\n336.3143274\n354.4111228\n349.3094025\n293.9859997\n208.7852096\n138.9481977\n137.3614551\n118.9444852\n118.4389725\n126.0757683\n139.5426748\n218.2931116\n291.22177\n342.461407\n283.4336637\n227.1025846\n221.3949033\n217.6306699\n199.6624149\n197.8163651\n187.6202566\n209.5438403\n253.2774404\n323.0817298\n337.8083468\n364.6531023\n334.9813947\n278.1389287\n190.0060491\n127.1468703\n114.0872243\n104.3714772\n102.9970504\n109.5789305\n140.8294449\n262.5082137\n335.5389052\n270.4071125\n236.0876971\n180.2256549\n177.9040716\n178.9155615\n167.2432679\n174.7552426\n174.159988\n197.1127973\n251.1683206\n324.4020103\n332.8949026\n365.6669656\n356.1292168\n271.1315827\n180.0866162\n128.997761\n116.7407004\n107.0359297\n105.9023585\n113.4210417\n145.8912198\n272.8597513\n345.79675\n275.309446\n235.2659698\n174.2289238\n168.8150855\n167.6655963\n158.5793525\n158.1439173\n157.9859714\n189.969268\n251.0240319\n324.6559742\n332.3833051\n365.1632752\n355.846385\n271.7465716\n181.4547884\n130.0908687\n117.1859781\n106.2794361\n104.5046491\n112.2015218\n148.5580366\n275.5477489\n351.5365716\n286.5008409\n251.2316345\n193.0666404\n195.8162077\n252.3184025\n234.3907318\n204.0558047\n189.6411951\n214.4183355\n256.1538433\n327.1630592\n342.6093385\n378.9937938\n367.096835\n291.6295536\n212.2558745\n124.4800386\n116.8682775\n109.1617604\n109.4806718\n120.4192921\n170.2168463\n298.4762114\n396.3606445\n305.7109736\n265.6145774\n200.2577739\n198.4191163\n208.8090089\n197.0525875\n199.1780409\n195.3251792\n225.3284372\n280.5537673\n352.796034\n364.9332058\n395.5347961\n384.8383853\n309.126531\n218.9728433\n124.7344799\n125.043321\n121.4341786\n124.1049285\n135.8137706\n173.7272505\n340.466437\n384.1668403\n322.7246776\n277.3312885\n216.407922\n208.5634045\n205.1478507\n195.3752933\n193.294031\n182.1287178\n216.0961043\n273.9712999\n344.7607561\n358.6718041\n388.4890838\n377.8071225\n303.9067391\n215.9014731\n130.0022777\n134.6506363\n119.3522867\n120.9660686\n130.7595506\n146.4917783\n269.22978\n293.9977034\n352.9168434\n307.7712658\n236.5547681\n228.0203947\n227.6301958\n206.4840653\n202.3244888\n198.6373286\n227.1291712\n265.7588028\n337.7695599\n338.2908705\n359.5841201\n357.5093537\n306.2071301\n219.6147419\n144.7241612\n144.0336727\n126.1238977\n126.3542226\n135.1079419\n150.3008083\n245.2102792\n320.7227159\n359.9727809\n306.4842502\n244.6520789\n227.6974183\n216.5639219\n194.0502815\n192.0499355\n190.8546594\n217.601334\n261.9119537\n333.6981972\n349.2257456\n380.7162813\n356.3000988\n297.8763996\n219.5936328\n123.6405172\n117.6612787\n110.6642499\n111.3134157\n119.8842306\n154.329703\n294.7034857\n312.5423743\n267.0790453\n261.937275\n211.1728868\n210.224648\n203.6596052\n189.6715239\n186.470162\n182.3491249\n208.1819364\n257.2972462\n325.0795276\n339.6963507\n367.1949744\n346.5918538\n270.3977939\n183.0345796\n132.9654059\n122.2091956\n112.390141\n111.0837684\n119.3731775\n154.3633988\n277.8123731\n355.6795781\n294.2962495\n269.9150427\n218.5542044\n215.2641064\n227.1800531\n238.9506707\n230.3511619\n210.4509851\n228.4498879\n271.6712911\n337.0772974\n353.9802893\n388.1211542\n381.6554266\n312.0703346\n223.7252461\n122.3369403\n118.6830986\n113.9869992\n120.6551326\n147.115346\n182.6268281\n318.7730945\n395.3478702\n324.9925681\n282.8848957\n230.8382298\n238.6016351\n254.6639064\n257.4141202\n271.3089083\n270.2315432\n270.0945456\n301.5777886\n369.168748\n379.8028658\n410.2732698\n400.4575522\n319.5789443\n228.1254857\n127.850537\n130.04018\n127.0251293\n130.59291\n143.0785269\n216.8046701\n327.4870119\n421.7003421\n356.2486111\n317.1967406\n251.7161158\n249.3712666\n255.7897678\n236.2567029\n211.6559512\n200.6220494\n227.0627898\n269.8006745\n347.3933924\n363.0192407\n393.7302078\n379.3871566\n302.6446263\n216.1725929\n130.1515742\n125.968022\n119.951073\n121.4267299\n131.3245652\n167.927223\n324.5050616\n328.8514683\n290.2449693\n288.9936761\n239.2520249\n227.8847222\n223.8905446\n210.9269861\n203.2586917\n193.6798409\n218.2999907\n269.092602\n345.0434853\n360.5839771\n389.1660606\n373.1063528\n300.2624599\n219.3327912\n129.5173359\n131.7190749\n115.3605908\n116.4541022\n140.5935503\n161.2234354\n277.6030973\n289.7090248\n353.2194252\n306.7760995\n234.5121182\n213.2870837\n206.9244595\n194.8148071\n190.3289008\n193.1100307\n220.9613714\n259.6160658\n331.986129\n322.5744282\n331.6371515\n328.9683144\n281.6493292\n194.6801381\n148.344487\n143.6103255\n123.0508823\n121.1176226\n128.9986097\n142.2967504\n221.9118271\n288.4284595\n354.8118864\n296.0733246\n241.2900976\n234.0578558\n239.4435912\n248.4750622\n226.2222468\n206.0921033\n224.9434362\n247.0997237\n320.2617725\n336.9892955\n367.3233829\n341.6657424\n288.4913236\n203.7405242\n140.8884312\n125.6527986\n113.6738576\n111.3654166\n118.3280132\n153.6903322\n278.8921971\n349.9024363\n291.6003741\n265.3863021\n215.5941621\n218.2874781\n223.5895216\n216.5054432\n213.6570488\n204.9048041\n218.8593705\n269.3431232\n340.7218431\n347.0012124\n378.9811043\n367.4927146\n281.0853526\n187.8833422\n134.0975674\n119.8566263\n109.3053748\n108.1152909\n115.7287498\n148.2334678\n274.3794449\n346.0214207\n288.1985877\n263.1760307\n214.1170683\n215.3385071\n217.0918191\n208.8417872\n200.7083131\n189.2051406\n212.0107285\n267.8978521\n341.6776565\n348.3474925\n379.9156771\n369.7764342\n285.2055058\n193.8491888\n140.1741109\n127.2343997\n116.659726\n115.609565\n124.4274835\n160.5036157\n286.6989698\n361.5832279\n328.4138517\n338.0806562\n261.7680182\n247.8907693\n240.7240821\n228.4246024\n227.0649281\n210.7266278\n225.4521588\n268.3933292\n336.153863\n346.8767018\n379.1023226\n364.3622639\n281.3840849\n194.8577533\n137.1681931\n126.849509\n116.7066323\n114.98199\n122.9194109\n158.1826279\n281.7604467\n357.0025721\n296.0552006\n309.7171208\n268.3817849\n260.2243274\n247.7852849\n217.8081413\n205.7946642\n200.5666964\n224.818592\n270.8324423\n341.9887301\n358.3902034\n388.7184775\n376.2580748\n301.5077875\n216.059554\n125.362911\n120.2260338\n113.8450869\n115.0726715\n124.539286\n159.5498788\n314.5564199\n340.8242128\n311.6480443\n281.5939506\n230.361498\n228.8966898\n231.1396807\n221.8469705\n220.6941938\n216.7911855\n234.849403\n274.916342\n345.0517531\n357.565715\n387.7437842\n373.8602037\n297.0918278\n207.6326994\n132.0028449\n132.2175012\n114.1399281\n113.9745314\n122.3529399\n136.7876613\n225.8735302\n288.0179572\n355.1848707\n357.7976699\n287.1375993\n262.9731722\n241.8353273\n213.2878049\n209.8321344\n211.7155499\n230.5583064\n265.6382139\n344.865484\n350.9948082\n377.6248955\n372.0154732\n312.9385857\n223.9179236\n138.184486\n140.0251312\n123.3729774\n124.2662909\n133.4064597\n167.7530118\n266.2489237\n305.1012619\n352.6964686\n296.6595368\n233.3796216\n216.5463078\n208.7001866\n186.6971256\n188.5180611\n186.5104269\n212.2179462\n251.2368519\n326.9896005\n349.7938421\n378.6453355\n352.0818952\n288.0540295\n203.4811551\n135.2331835\n124.6838042\n114.9399622\n113.7339599\n120.9805768\n151.7362616\n255.986837\n330.9334384\n279.5539107\n248.7533251\n196.4366947\n194.7002319\n192.3819456\n183.8245084\n182.6144683\n181.084178\n207.7835915\n261.8278717\n337.9232025\n344.9433887\n376.5411952\n366.2245012\n281.2332849\n191.5819027\n138.1660647\n125.1621731\n114.60242\n113.2281419\n122.1060797\n158.5496848\n282.9920323\n359.6961013\n291.0406471\n305.3917042\n257.5712431\n245.7949398\n238.6230782\n222.6012209\n213.9260362\n208.0105571\n225.6960333\n262.6522254\n331.8437544\n346.8698243\n375.4024717\n368.4360037\n293.1401736\n206.9568507\n129.9738091\n122.1753146\n114.1922573\n114.5034125\n123.200024\n158.634751\n284.280901\n400.7005938\n330.5955573\n287.2373924\n224.7645659\n219.5945109\n212.969514\n200.4864795\n198.2262872\n202.097608\n230.1099674\n278.6396706\n357.4454089\n368.5955947\n398.2624719\n388.8162267\n310.1212099\n220.0093502\n126.0763636\n126.1937231\n122.0734193\n124.3200524\n134.5336142\n171.7608114\n327.5707581\n366.8838282\n304.569585\n274.5110541\n228.0584378\n233.0362946\n243.0060071\n238.545152\n238.5481241\n234.8230002\n244.5042015\n281.2506932\n350.3483809\n362.1583567\n392.8264911\n378.8068084\n305.0948034\n216.4119647\n130.0378931\n124.0971269\n117.2452735\n118.3888716\n127.8810946\n163.3941755\n315.2021061\n341.423738\n320.2034084\n293.3038859\n240.0834682\n246.5844678\n251.9035149\n243.1879912\n236.5821424\n229.3406301\n243.8844887\n285.0906598\n358.4802299\n374.8926194\n402.6983399\n390.2206405\n315.7548287\n223.6200774\n127.9183513\n133.2425201\n118.6992569\n141.5693188\n147.5600005\n160.3711088\n280.4789125\n305.3159259\n376.9264015\n345.0747657\n279.3001655\n277.2041093\n280.7163768\n272.1981484\n271.9188608\n264.2070391\n277.6891845\n299.8355035\n374.3879733\n376.8885579\n397.0530855\n389.6918115\n332.57372\n234.7156509\n142.6750502\n146.7270405\n131.0234894\n132.6003704\n142.1959145\n163.3696343\n287.8457991\n301.3500592\n369.1301014\n300.4042456\n254.2542397\n238.2602181\n226.8743371\n203.0679323\n205.0374435\n199.9784602\n223.1882952\n262.143313\n340.5741117\n358.7852961\n389.6596275\n370.9222814\n314.4770037\n233.122066\n145.2715856\n152.7892896\n138.3191704\n140.3387188\n149.860097\n164.992384\n289.2709073\n323.3527986\n378.5086461\n307.7789077\n250.5838312\n238.9204941\n228.8905673\n206.9927362\n205.5315217\n203.5663459\n230.4553353\n268.2870403\n348.3909829\n366.0505241\n397.9052922\n373.5951129\n316.8871427\n233.1470012\n132.0068422\n130.5466087\n125.2291959\n126.1570775\n135.6727504\n172.3361887\n323.4563789\n337.1197496\n301.9334691\n264.8435528\n202.151993\n183.8028987\n181.4245613\n186.0805645\n209.8344433\n203.9771595\n211.0046592\n258.9649682\n336.4687175\n344.7557285\n378.2081933\n369.2550119\n286.1559025\n196.4513853\n143.9620613\n130.6119905\n119.4907775\n117.6225748\n125.5560722\n161.90806\n282.7945018\n361.5499002\n302.3347634\n343.0133469\n275.7647158\n249.6860887\n239.0352059\n226.6873415\n223.8612419\n211.3424372\n232.0183674\n273.9510555\n350.5358371\n363.8436658\n394.8098081\n384.1872744\n307.536937\n219.1390271\n123.0873407\n120.0833754\n115.4664923\n117.8624247\n127.8951338\n163.8713974\n320.9552298\n377.211453\n323.1368661\n304.6723207\n259.8705239\n276.735813\n299.7926065\n294.6072019\n260.8811696\n217.7249334\n237.1670796\n282.0812839\n360.1476287\n375.8382865\n411.6320879\n396.5163772\n316.3949974\n225.0552806\n133.6353354\n133.0553903\n128.5056684\n129.6643159\n139.2168126\n175.1608294\n331.4198941\n350.6715516\n319.653132\n286.4498017\n221.0066673\n228.2254111\n222.5215444\n204.7507313\n205.6623099\n204.1269903\n227.3572176\n267.6246283\n342.1642132\n355.0024348\n387.0633061\n372.7623664\n299.9529525\n216.4101613\n132.0821799\n133.3650941\n116.1369787\n116.1689091\n124.5797269\n139.3957034\n238.0221692\n270.5154258\n354.1446662\n348.5475272\n273.7693236\n245.8145598\n232.6461215\n217.1574079\n214.3755901\n205.5415411\n228.3457812\n255.0303061\n336.5900844\n344.2633117\n361.9803276\n348.7863304\n287.7647295\n199.2015046\n154.3800522\n149.720016\n129.4307617\n127.758943\n135.0742043\n149.0713083\n223.6008111\n300.5076675\n359.9226919\n315.3608869\n302.604409\n296.8023188\n268.4727786\n242.5140253\n239.3365549\n227.2299099\n239.6316247\n262.7836411\n336.6170636\n350.9367728\n382.951132\n359.8380636\n306.9085687\n229.1321239\n134.1773448\n126.5496068\n118.7501123\n119.1100844\n127.8964688\n163.3931916\n294.4416938\n347.3457629\n310.2075109\n284.7099036\n217.4201346\n202.1708402\n197.2345321\n187.8678963\n187.4595235\n186.6815106\n214.038992\n256.9521169\n331.0180972\n341.5311519\n373.5656067\n364.1075112\n291.9529473\n209.0984243\n129.7441288\n121.4272712\n112.9037509\n112.8347171\n121.831705\n172.9793511\n305.6729224\n333.6841564\n302.0459427\n307.2554482\n243.9462992\n235.8278053\n238.6316039\n230.3789001\n227.3755886\n224.1963142\n241.8538366\n274.2777349\n348.5197775\n361.8237369\n393.9675455\n378.058675\n299.5083774\n210.2105561\n128.2803367\n121.5931368\n113.6936094\n113.4500072\n121.3631093\n155.5995447\n287.7655276\n308.4942376\n274.7042775\n279.4650913\n262.4778586\n263.4830094\n254.9522937\n241.10493\n238.7757657\n228.3295902\n244.5364914\n279.3993195\n355.9444536\n369.6885167\n396.4077282\n381.3794279\n305.8458405\n217.4592122\n125.9497987\n121.2022744\n114.8347313\n116.015973\n124.9461566\n160.3540651\n315.203518\n341.4226928\n317.0779931\n301.2333367\n246.1374193\n239.5672579\n226.3196775\n209.7197983\n205.9716764\n205.8920834\n232.0915099\n275.990762\n358.3637745\n373.5482056\n402.0781633\n389.8955588\n315.052013\n223.7068385\n131.793207\n133.0876362\n127.6156285\n129.4336429\n139.8148601\n176.3285622\n327.6251998\n381.1658191\n310.338741\n279.4642038\n220.9740138\n216.0314233\n216.3905897\n212.2596501\n220.8203736\n224.7272966\n245.6980698\n280.6526808\n361.87596\n379.0801342\n406.3369664\n390.6114742\n310.46578\n221.2472043\n135.2628321\n140.3227089\n123.5703578\n123.3334195\n131.1367997\n135.7470648\n256.3674329\n249.5450369\n322.9743937\n291.6041905\n242.472945\n261.7836008\n278.0798007\n271.0599328\n262.1510358\n243.0117528\n252.8973572\n269.9686685\n348.991056\n348.7730958\n365.4090242\n353.7855639\n300.7620472\n214.2373749\n155.3800617\n151.9803\n131.7101497\n129.8390932\n137.8807322\n152.7026032\n222.2960805\n303.4946836\n354.7187597\n309.4914955\n271.2746724\n281.4338213\n270.306043\n228.352335\n210.7904519\n198.6368812\n222.0670579\n252.2418802\n334.6283044\n353.0292201\n381.3768856\n354.1301805\n301.4622372\n225.6851165\n129.3890049\n122.5599954\n115.5525834\n116.2158612\n124.9444964\n160.2876627\n288.3965358\n357.3588238\n283.8879653\n264.6353109\n206.9564793\n193.0233681\n181.0901434\n169.326917\n178.7357808\n189.988311\n223.9037976\n251.1698819\n318.433501\n326.2543573\n361.510377\n353.9367101\n274.9610316\n188.2722267\n135.7396109\n121.6466966\n110.258563\n107.8201474\n115.4139594\n150.3439998\n264.9336913\n348.157679\n289.7233948\n262.3644054\n212.142534\n215.3745461\n223.9575497\n249.0361747\n253.1035147\n242.071977\n247.5630227\n269.7364247\n343.956944\n349.9886739\n379.1817478\n363.4206764\n280.2767737\n194.3699014\n135.8380871\n125.6181176\n116.2298427\n115.1464561\n123.0074069\n158.1686037\n281.171262\n320.0239892\n297.7905392\n310.0379385\n254.0110531\n255.6895028\n251.1102861\n240.5756126\n238.8576463\n230.6397605\n243.7524691\n276.4019343\n350.0368237\n369.4901964\n400.0596988\n380.845985\n306.8331366\n221.372997\n126.1647802\n121.9040099\n115.8762528\n117.0957339\n126.2200137\n161.7197877\n299.9740084\n359.1543184\n325.6940987\n287.1847514\n222.6026909\n215.1824245\n210.3405967\n199.7234848\n199.53416\n198.2479709\n226.6386344\n266.896304\n351.1562921\n368.3248146\n399.5952036\n386.9600209\n311.6305688\n221.5869797\n123.4947387\n126.2440037\n130.0999146\n129.6834982\n138.9287229\n175.2344978\n323.4252754\n365.1555908\n314.183073\n279.4309517\n218.3693558\n213.9634962\n213.4441066\n206.7020565\n206.6686741\n209.0467409\n236.6388586\n274.2439813\n356.2811028\n370.8991612\n401.2056171\n391.6850424\n314.2516662\n224.577946\n133.5056802\n141.9244082\n128.1742878\n130.5897111\n140.9338422\n157.0569719\n302.310747\n314.3745593\n380.3076258\n327.8631859\n255.0235566\n249.0959379\n270.9512996\n298.3146043\n300.9085399\n301.2751227\n331.5577788\n360.2710913\n429.0323657\n429.4483225\n443.8752347\n427.3400633\n358.135702\n254.1922363\n144.1045362\n138.0078673\n144.2620228\n156.4009661\n173.2741648\n311.2568159\n332.1296147\n392.2062869\n311.5248254\n254.2194876\n255.1009736\n261.9053245\n234.6910956\n239.0970783\n234.062463\n263.1055544\n288.7333504\n358.0334678\n382.6214351\n411.0349151\n385.9854587\n327.8057182\n243.0042973\n149.3816623\n137.2646738\n131.9813747\n133.3218227\n142.9407397\n180.1166329\n338.4310754\n385.0928337\n335.6014223\n303.4174692\n298.9930244\n309.1386741\n306.9213079\n297.6342698\n297.9520516\n297.7114493\n328.4734574\n364.7431953\n417.8721848\n438.5320854\n462.3937456\n436.3448249\n371.8708492\n305.4046671\n188.6739419\n137.5074445\n182.7744583\n138.6935501\n164.5694308\n213.3983271\n328.0448292\n398.8067125\n344.8220584\n308.9831811\n258.9671098\n266.0933359\n254.4657911\n254.1542258\n263.5902378\n258.1751083\n275.5096936\n304.9837659\n374.3696652\n397.063563\n425.0500753\n418.0119823\n335.5248988\n231.7673749\n133.2000658\n135.3618235\n131.9681058\n134.2915053\n144.5654348\n224.6246334\n319.9661898\n386.5930531\n332.3079195\n298.2751808\n251.4141029\n275.6313737\n305.6926278\n294.9791312\n296.151\n296.0264356\n325.4138504\n359.4006587\n414.3668364\n435.7205522\n460.5407124\n435.7479366\n371.2248932\n305.3902952\n179.9042187\n149.9673067\n164.9400893\n137.2525667\n182.4922021\n213.2711355\n322.7891257\n417.0675179\n365.7660537\n352.6198443\n304.0800404\n303.0185213\n301.2237396\n291.0112199\n292.3491827\n294.0018988\n323.7124442\n356.4943572\n411.4135782\n433.9674488\n458.6467938\n433.9985292\n369.9814152\n304.5970779\n185.8875713\n139.252871\n175.4278378\n178.5778934\n185.547924\n201.8266346\n323.3702001\n424.5175283\n364.9889892\n341.5378256\n304.6641023\n307.1905103\n305.5938498\n295.4961347\n294.2593715\n294.4346106\n321.9127112\n355.6073791\n412.3684021\n433.7416635\n457.4228098\n431.270444\n368.6948173\n268.2463228\n135.0676766\n165.5324547\n155.5901432\n176.4880805\n141.3822169\n174.4301081\n313.4507877\n329.7664457\n401.6522808\n347.0134992\n270.382601\n253.3128238\n269.4367631\n267.4183248\n286.3733695\n297.7310758\n326.8628192\n348.4796291\n411.6721404\n414.8191278\n426.1440022\n414.7635911\n355.9330204\n258.0950221\n146.7599263\n167.0773468\n152.4631789\n153.1257808\n161.9310336\n176.4779153\n312.2741451\n324.5409397\n390.4323771\n339.5560552\n285.4583753\n274.1785749\n279.7523903\n265.9611755\n268.6062234\n252.0113132\n267.9472872\n293.8120393\n365.1219077\n397.932056\n430.4398397\n396.1113011\n342.2071983\n249.3916669\n153.7842498\n142.7225626\n137.9241581\n140.4286077\n149.3631157\n200.3499459\n335.7086195\n392.9197301\n334.8468502\n294.4076853\n230.1644422\n221.7893187\n218.1147922\n208.1261398\n206.6444635\n193.1223441\n231.912418\n272.558142\n345.1027689\n373.4600571\n402.1049908\n391.5023867\n313.1733082\n222.5661582\n131.6595585\n130.2570667\n124.7401672\n126.5342966\n137.2815483\n174.4534278\n339.569145\n362.3036008\n312.9883565\n282.3148864\n229.3407667\n232.4828279\n242.2593191\n236.7001614\n244.9036858\n246.836384\n270.5376588\n306.0851695\n374.2368968\n394.8881996\n419.1103042\n406.9216071\n325.7098029\n232.7256397\n126.227392\n129.2187042\n141.1196561\n139.5698365\n146.51114\n181.8507696\n346.0127956\n375.3503168\n327.8372996\n297.9842655\n244.5516793\n252.2543367\n260.6693687\n258.9798606\n262.1004845\n266.0608543\n283.7266288\n312.5032965\n378.3865777\n400.7507806\n426.9779442\n420.3585325\n334.7832668\n237.67834\n138.6433866\n141.560698\n137.8706687\n139.5956791\n177.9488144\n174.1074614\n343.6011593\n408.9680775\n337.1860191\n330.8376119\n303.8885645\n305.1220356\n303.6700598\n293.4206179\n293.060578\n293.4539625\n299.5545389\n312.7195185\n377.7917394\n396.7657782\n423.3809159\n410.3410351\n323.9788351\n228.6566245\n137.9639548\n136.6169409\n131.2583942\n132.5657469\n142.4808544\n179.2943607\n346.9686558\n343.353044\n310.9469234\n282.7705682\n224.563025\n216.7676952\n210.4256708\n197.8740049\n199.6104004\n200.3147858\n229.098546\n265.8667791\n335.2265662\n366.6469502\n396.7570991\n384.4907701\n310.5655803\n222.8853668\n125.6033696\n132.0011607\n116.7026072\n118.470888\n128.2997885\n144.3722281\n262.5897789\n300.676039\n361.2256046\n324.3983601\n257.8407822\n240.9179155\n236.0667094\n220.805784\n217.1847681\n219.8766219\n250.5763311\n279.1309991\n355.0763497\n372.5035923\n392.8048029\n386.7045945\n326.958832\n236.9167949\n128.6574548\n143.256249\n128.6599528\n130.7962088\n140.6022081\n156.3789303\n294.6282334\n308.6852878\n367.8330577\n319.8325873\n262.7690333\n257.9187351\n261.8784916\n246.6661356\n251.2504121\n248.5854315\n268.9727317\n289.0897776\n354.1303453\n379.9995818\n404.1363752\n375.6993857\n316.8712246\n232.8537263\n140.8429469\n124.5846519\n118.1481551\n118.8864492\n127.7703201\n163.3922262\n307.3970123\n317.5432101\n280.3570308\n291.6032291\n243.9882673\n239.9964095\n242.7985421\n232.2930044\n231.5707398\n230.4014278\n255.1318807\n287.0196069\n353.8923747\n376.8154238\n401.5045225\n386.3218639\n311.4806109\n221.8122552\n126.75987\n122.5303015\n116.6012904\n118.1192625\n128.2532407\n164.1521957\n307.7490088\n352.4055776\n318.8575018\n289.851814\n231.6308179\n230.4589316\n236.4533129\n236.952836\n239.5803062\n239.7219181\n265.9423453\n303.2593562\n369.1009133\n391.1245252\n420.9221044\n409.7291052\n330.9225061\n234.0460561\n125.753807\n124.7362539\n120.0544398\n122.1628333\n132.1182499\n168.0859205\n335.9055688\n354.6001357\n322.2655307\n292.0082566\n234.9001033\n233.2026148\n239.8737673\n234.4144282\n241.0268396\n238.0175982\n261.7261087\n294.9205726\n360.3207604\n385.1737645\n414.7008103\n402.444999\n324.5932987\n229.307937\n126.3865688\n124.5379112\n119.999175\n122.423159\n156.2502511\n188.5003088\n342.1436874\n358.9093478\n311.437676\n276.5456679\n214.9899718\n206.9106605\n202.4242816\n192.1877938\n193.1887982\n190.5015065\n223.9729563\n263.0466442\n333.7922661\n360.598138\n391.9973432\n379.325301\n305.7731023\n217.6512303\n129.6602937\n127.0321312\n121.6897252\n123.4819797\n134.189586\n171.1893825\n319.3124212\n369.74406\n308.5630866\n275.9020826\n217.5151231\n210.6627148\n209.2339433\n199.881131\n201.1951134\n202.6887085\n233.5544247\n273.4693519\n343.8548531\n367.7526266\n399.8572259\n397.2640361\n320.2008653\n222.9423208\n126.6042933\n137.8288716\n124.3072797\n126.7045539\n136.9135662\n152.9675939\n302.3517851\n308.0402241\n370.6841452\n311.9634289\n247.1392116\n229.5032962\n224.4157424\n213.280157\n213.7397243\n213.8939974\n240.752937\n269.9849311\n346.1284505\n366.6583061\n391.6282675\n385.2734402\n328.7910465\n237.1857162\n136.1119938\n152.637281\n138.2590641\n140.339091\n150.2781621\n166.0431697\n300.5320717\n321.8967775\n379.6635\n319.7130465\n253.3404731\n241.2338042\n236.0606516\n216.1290491\n216.4352628\n216.0661132\n243.9434508\n274.7624964\n346.8437686\n377.997947\n409.5949794\n384.3429979\n326.5371937\n241.8633709\n142.0201544\n132.2324931\n127.9930823\n129.5605421\n139.6627351\n176.7532116\n342.4101561\n374.5093612\n324.2480856\n267.1656455\n216.160342\n210.0706664\n206.6764732\n198.6093473\n200.1494815\n210.7115237\n230.2660646\n271.0676126\n343.2824945\n369.2210281\n401.8707322\n391.5160923\n312.7245451\n222.0603972\n125.934902\n126.543654\n122.6670438\n125.4650029\n136.6174985\n174.021825\n337.4535153\n379.3470501\n306.0152625\n278.3891298\n219.1189101\n213.6104559\n211.8832703\n202.8788197\n202.7856977\n203.4651999\n231.0504708\n270.3047757\n340.3425541\n365.6229309\n398.2270882\n387.5856691\n310.5993749\n221.8334997\n130.8568019\n130.3220667\n125.9557082\n127.8313031\n138.0781857\n175.4285554\n338.6213302\n371.3905177\n318.1360307\n280.8977557\n224.9589581\n218.4794503\n216.6537784\n215.7652738\n226.9608066\n230.7322366\n263.9860962\n313.2228828\n384.2771864\n399.3413279\n423.9074862\n411.9461983\n327.411774\n236.0549304\n137.0667638\n140.3622244\n136.4224197\n137.8281969\n180.9782692\n195.2255828\n322.2033421\n395.4177258\n322.9952312\n287.7941525\n227.615909\n220.9926147\n221.2731941\n214.1087592\n213.1379908\n214.9240571\n241.9912222\n283.4726428\n356.0305174\n379.4956498\n411.0157587\n402.6670519\n321.0826283\n226.017145\n134.3769679\n133.8751396\n128.1670979\n128.5513971\n137.819884\n174.3398054\n344.9305632\n351.8189272\n306.3470933\n279.8045373\n222.8523767\n220.5166309\n226.6839349\n224.5156673\n225.1971178\n224.8532842\n254.1825595\n293.1052397\n362.9464987\n381.2147335\n412.0697814\n398.8674779\n320.2142223\n226.0886809\n124.8864598\n132.4551526\n117.6622158\n119.8027673\n129.5898759\n145.4320423\n284.233627\n292.2245657\n368.6109439\n328.9622397\n254.1266047\n238.3167584\n230.3558303\n217.7134821\n221.9867118\n226.9532055\n252.8483866\n281.379915\n358.6694668\n372.842621\n396.8859158\n390.1415182\n332.9061463\n239.8007595\n128.7612922\n143.953615\n129.4998596\n131.8200662\n141.7571718\n157.7105565\n288.0425049\n321.4732961\n385.8091056\n330.509197\n268.4854624\n259.3492683\n261.940896\n266.2706859\n275.4858446\n265.0123554\n285.8070659\n311.4227425\n383.1763067\n403.2586882\n426.4928247\n397.825632\n338.1911346\n258.0753847\n153.1474793\n144.1676003\n140.0812706\n141.69467\n179.9514164\n176.0060238\n339.8968367\n408.3205236\n342.5737944\n309.9741626\n273.8343131\n300.6860028\n308.099929\n298.22472\n297.5160034\n296.5845667\n325.8409349\n360.0279998\n411.696578\n430.0185532\n459.5732996\n432.3100982\n352.8638084\n275.4707341\n139.0855448\n151.2064434\n177.2687558\n180.172873\n164.6542216\n202.8814397\n323.1074851\n420.9984789\n362.0422245\n316.1559579\n241.3146734\n252.5875946\n257.7129581\n253.0530429\n254.7425332\n247.9919671\n272.4433886\n310.5288312\n376.0683854\n392.2003171\n424.2993445\n411.2192088\n328.055277\n232.8094625\n136.6274386\n137.5958877\n133.3804648\n135.1499527\n144.6096631\n202.2025098\n319.8614704\n371.8525854\n321.9366397\n286.2967088\n224.5516486\n224.3195417\n235.0642602\n232.9741428\n232.4144492\n230.2152949\n255.0023729\n291.9843084\n361.0791225\n381.7242863\n414.1023466\n400.3989465\n321.0198601\n227.5112392\n125.6166765\n123.2114068\n118.2467685\n120.2931073\n130.0116858\n166.1593881\n328.2146958\n353.9908556\n324.1698068\n291.5393952\n231.6060099\n230.1484975\n235.6257723\n232.7305021\n236.8475319\n237.5211986\n264.1504146\n300.9407301\n364.3057749\n381.510754\n413.960839\n401.6158167\n323.306485\n230.2403693\n125.801349\n124.1864957\n119.7783305\n122.3428217\n150.6858853\n202.9186597\n346.1600441\n379.8386036\n329.6756755\n296.637327\n238.799624\n235.2186314\n241.6921381\n236.286801\n238.5897368\n236.8635063\n259.8289787\n312.056333\n379.757629\n389.9751796\n425.9580352\n416.2606564\n332.8336905\n235.5840707\n132.9681284\n147.2951425\n134.7625791\n137.4129785\n178.6796033\n157.0986827\n309.2537421\n332.0033882\n399.2450089\n340.5358818\n267.6852223\n265.3227\n278.732856\n278.641842\n295.8112305\n300.6193746\n329.8594828\n356.3762245\n419.1993994\n406.5563186\n422.7462889\n414.8759822\n355.9981096\n259.4606138\n140.1692316\n162.6613879\n150.0837415\n153.0987089\n162.8454995\n203.6793717\n295.4908409\n351.0384587\n396.052713\n347.0319822\n285.9854281\n298.7740008\n313.6321074\n294.2899183\n294.3665074\n294.408045\n323.7419526\n351.2658106\n411.3146519\n422.6137156\n451.0697765\n422.5021623\n360.1781539\n268.0904581\n157.3185053\n177.57211\n130.1978853\n181.8201243\n127.0359659\n211.1386303\n328.7835606\n410.6380539\n352.7034371\n338.8632932\n306.4211999\n308.097759\n307.3149715\n297.0167881\n293.827988\n242.9037478\n251.5416538\n292.5945067\n348.6490958\n380.286884\n419.3258434\n407.4996343\n323.9638371\n228.1714255\n132.7770091\n132.6113478\n127.840499\n129.647289\n139.9738358\n176.8887792\n339.9903481\n366.2846647\n327.4123265\n290.5948288\n231.4871468\n228.7343798\n229.9680255\n226.762494\n228.4581365\n228.198009\n259.4842751\n303.2549106\n372.6141887\n387.2408941\n419.9877086\n405.9905184\n326.0880698\n231.5242945\n126.368871\n125.5444331\n121.0984354\n123.4876536\n133.7536281\n199.0776057\n313.9159035\n390.8818467\n340.268165\n300.3546898\n241.6044776\n241.9727604\n257.2851359\n262.7693213\n264.5406081\n256.3050566\n275.6041985\n317.4540983\n382.2383675\n393.94763\n429.1379338\n417.2966225\n341.5621729\n238.9991762\n138.390872\n141.3254467\n136.7620129\n152.1478627\n163.3113159\n215.9897582\n305.9750961\n400.889829\n341.8133585\n302.3318077\n244.7685565\n257.4874695\n297.5334093\n296.9219909\n296.4144151\n296.3977427\n325.2278638\n359.1132301\n411.3800649\n427.3797767\n460.6575795\n435.9174764\n371.093541\n297.6789434\n141.5481689\n160.3526473\n157.6585961\n177.8234137\n163.3133722\n192.158011\n338.2435384\n413.5410472\n348.9777709\n315.4719929\n259.5018877\n252.9317074\n261.8329725\n273.0614664\n293.1683833\n294.4564648\n321.7176199\n351.4383666\n411.0439101\n426.1700734\n459.4041163\n432.1750647\n340.344059\n246.6227846\n133.3111391\n148.7913227\n184.2522835\n113.0803075\n181.4114109\n174.5014611\n280.5161354\n344.97997\n411.4160632\n371.3985238\n319.5315035\n311.9623286\n311.0222587\n296.5544672\n301.5041358\n302.5252044\n329.1927894\n357.0323774\n420.8374799\n423.9698786\n442.917332\n433.1971531\n380.1845077\n294.1330819\n200.4941087\n154.5759761\n153.6823894\n170.9672861\n175.4762498\n193.9862353\n288.2157499\n385.9932352\n416.4532842\n361.7767287\n319.1771661\n316.6177886\n315.8393709\n294.7758233\n298.0381451\n298.4018971\n328.7646541\n354.6418694\n414.6367803\n425.7357625\n453.2276901\n423.9207831\n368.4626783\n293.6088668\n210.3015432\n144.4676546\n180.1260663\n161.6927866\n146.3332172\n212.1716689\n325.7752286\n411.6797105\n364.3125433\n327.3193257\n268.3995324\n287.9953234\n301.8926276\n294.0722295\n293.5525595\n293.3382158\n322.6256419\n356.3459853\n409.334485\n413.9636708\n449.3825233\n433.1585264\n351.8824947\n264.2039892\n139.33957\n148.1857402\n175.6538967\n161.4856729\n145.5259206\n202.516949\n326.6125971\n413.4962021\n354.7401706\n306.4814161\n238.9563369\n231.935528\n232.3989203\n229.1115026\n249.2961062\n282.7890993\n324.8057686\n358.8964307\n411.1383126\n426.5583903\n457.1954962\n432.6708178\n346.2090165\n248.1927215\n135.1720298\n140.9213129\n151.0897298\n154.5539744\n185.1017161\n152.3397438\n331.5817527\n406.0486774\n356.8969479\n339.3694689\n306.2319037\n307.6152491\n306.8232733\n296.6952304\n296.231572\n296.0059866\n324.97653\n358.7321267\n410.8736555\n423.5242325\n459.8043881\n435.0152298\n370.0222993\n273.7388761\n194.6579303\n130.0103526\n183.3730654\n117.0015208\n180.8214319\n200.0840134\n320.78273\n414.5166887\n374.2188017\n353.01454\n305.7359656\n307.5459268\n308.276226\n297.9833865\n297.2087647\n298.0314139\n327.7902362\n362.5345681\n415.0737685\n428.3739234\n464.3954931\n439.4481603\n374.2209999\n308.0451\n250.3553506\n242.8211363\n233.1109723\n215.043481\n203.6003613\n228.5323988\n340.8517331\n418.2561492\n376.8861782\n348.8368899\n301.2793634\n301.7295536\n300.4584072\n291.1636087\n290.3567741\n288.0022862\n316.3141663\n352.2099971\n405.6551083\n419.4648546\n455.6909031\n430.3195761\n366.3021214\n301.8283076\n218.5491735\n207.256208\n178.8266509\n169.6502749\n182.6543761\n187.7350529\n300.6235944\n349.9145135\n412.3799988\n363.5030257\n287.4009975\n272.3574805\n266.2612612\n256.1344121\n254.6144345\n249.0418709\n275.0628098\n306.4743837\n382.2930213\n392.413464\n426.1388291\n416.5629127\n358.8438994\n261.3611517\n140.9688339\n164.0567779\n151.9090401\n154.426667\n164.8162092\n202.6821753\n281.5338175\n349.3327183\n402.9909194\n347.1237089\n279.0362745\n265.6863336\n259.4451993\n239.2725656\n239.6836447\n239.9130749\n265.7007514\n294.6167623\n368.8563369\n390.8799238\n433.4718057\n412.9945337\n350.8272047\n258.1914417\n148.8194364\n141.3537435\n137.8925323\n180.474975\n121.5474924\n210.42897\n310.1768718\n395.2591925\n342.1941313\n308.4122888\n247.5637077\n252.5438716\n280.3859186\n294.0819072\n295.6984185\n295.4433458\n324.3892485\n358.5108984\n410.9013495\n424.0148765\n460.1367412\n435.3509947\n370.3362997\n293.2860216\n163.0640944\n171.9106664\n149.459249\n159.1489131\n187.5323403\n212.6600783\n309.2357738\n420.7780066\n348.9874884\n343.4473931\n304.4098292\n306.4584523\n304.298316\n293.4288457\n295.0774561\n288.6276177\n310.6170729\n356.2595003\n411.9779205\n424.4331215\n460.0053408\n435.6859611\n346.9421416\n248.3299514\n136.321493\n142.4539369\n186.3894711\n115.8018982\n182.4003499\n190.3741059\n315.8512877\n409.4542367\n347.5622323\n312.9994901\n242.4172947\n235.9746858\n239.1441637\n231.9886961\n242.1020525\n245.8503249\n262.3419103\n294.7767801\n365.5399111\n384.4865631\n426.8053851\n416.2229909\n334.0726944\n238.0115888\n132.1104388\n135.5207962\n132.3631321\n148.0552289\n160.1593448\n209.9058247\n300.969129\n393.9751169\n339.2172045\n296.5969154\n230.4365639\n222.3477088\n219.8082855\n209.5887035\n210.6729188\n211.4430372\n239.3113338\n282.1814824\n355.3088348\n370.7290607\n413.2602744\n402.2654153\n320.3393646\n226.6868657\n126.791696\n128.473698\n125.3157248\n128.3382259\n139.4202348\n218.667126\n298.0286661\n385.3985935\n332.0445113\n291.1879606\n223.3205316\n219.4627761\n222.0104808\n214.8088059\n227.1343315\n218.757014\n247.2593356\n290.221427\n362.6008801\n374.3741004\n417.7329316\n407.186757\n324.6146798\n231.6739114\n129.6804471\n143.0061991\n130.2823257\n133.206634\n181.7876307\n132.8572416\n301.0847544\n322.1919253\n396.6428493\n344.229404\n269.6834616\n258.0755196\n258.1358248\n257.2302528\n264.1759593\n273.6943845\n315.6123169\n353.2846409\n422.8718674\n418.5898329\n439.8925769\n423.2142391\n357.1721606\n254.4316633\n137.3084761\n158.9368063\n145.9231484\n148.4597923\n158.6874364\n171.874871\n293.5619028\n361.2017468\n417.0988828\n362.5847017\n320.6849566\n317.5288115\n317.9870747\n299.6239216\n299.0214517\n298.7147493\n327.3046926\n354.0407045\n414.228442\n419.7829528\n453.2586227\n424.9569552\n371.7274242\n305.9064335\n195.2019709\n160.0077372\n161.4005788\n177.8955505\n184.9629411\n200.2547046\n327.1114856\n418.4924751\n359.3377519\n324.8579258\n282.6540632\n297.0912712\n306.1451249\n295.9405363\n296.3898314\n296.7429752\n325.4757401\n358.7559483\n410.287427\n419.6868765\n452.4180967\n433.7307772\n350.7161293\n254.1129294\n140.0364835\n176.6637992\n138.5591502\n178.6058326\n143.5351878\n191.5094167\n329.6932974\n416.6213097\n372.4602574\n352.8756763\n306.3045209\n309.0768734\n307.8902075\n298.2815375\n298.0519781\n298.0216737\n327.5072198\n361.7185098\n413.7363327\n423.2198846\n461.6046939\n436.6690544\n371.8458103\n305.783006\n207.5136339\n208.7756009\n190.2379559\n187.7935388\n191.3461693\n197.5694001\n322.5220537\n420.6356303\n380.9666718\n354.0673951\n307.3596783\n307.6398222\n304.4041743\n294.1184687\n293.3655959\n292.480608\n320.9818263\n356.3736076\n410.1230937\n421.6951615\n460.9135298\n436.4814712\n370.9587556\n304.5810784\n212.398506\n195.6689431\n192.2804333\n189.9352676\n174.5639282\n203.158882\n330.6627574\n420.1630252\n379.8000665\n353.5776316\n306.515201\n307.7929156\n306.8898448\n296.9779719\n296.406161\n295.8728385\n325.1416362\n359.2905665\n411.0629275\n421.1424926\n459.640673\n434.4403938\n369.4345449\n304.06067\n193.4470047\n175.8909306\n159.0312208\n168.6435187\n177.8063668\n219.1969808\n327.8914421\n417.0097649\n377.6151092\n348.1784354\n298.654081\n299.0062588\n297.7100926\n287.9229601\n286.3140125\n285.7905739\n319.9041621\n358.4824326\n409.9310261\n419.9466804\n458.9124232\n434.085294\n369.5496657\n304.2351281\n196.9107194\n207.1542127\n170.5745999\n168.5931553\n174.3198906\n180.4625965\n273.1862213\n362.9769563\n415.399602\n369.7923032\n317.96916\n310.4824551\n309.9602161\n300.4422819\n300.7214582\n300.3244709\n328.9742249\n355.7647616\n421.002098\n411.2399224\n436.7657219\n425.8658045\n364.4573829\n265.6074886\n148.7137567\n170.5276011\n155.8892778\n156.8610317\n165.306068\n200.9303867\n290.9842701\n349.8060903\n411.9091677\n360.9542189\n318.4198276\n315.6081021\n314.6539929\n295.1326451\n295.1993401\n295.2316677\n323.8127443\n350.6816467\n411.3592452\n417.0517384\n451.390566\n423.6301733\n370.9932579\n279.9070359\n206.3211014\n133.343519\n186.8052072\n140.7468524\n167.075332\n207.9604947\n333.0579779\n415.8429739\n375.3723791\n347.2392228\n298.1212566\n297.6204227\n295.4241353\n284.8679718\n284.2061804\n287.7618434\n323.9727389\n360.517268\n411.4701882\n421.0540468\n460.2200274\n435.8248602\n371.096424\n295.8955942\n195.8734656\n132.3952823\n177.7637154\n158.7668751\n144.3344216\n206.2804419\n330.5641861\n413.8696263\n364.7369296\n326.2552875\n258.5089128\n289.6643222\n305.3014116\n295.8427573\n297.3830627\n297.3141295\n326.2691433\n359.9536056\n410.8217497\n417.7179416\n459.5281592\n435.1385325\n370.3933669\n305.0610931\n190.2727243\n159.594214\n161.8913946\n178.4286505\n185.4578375\n198.2151377\n332.2795267\n420.6739139\n379.8803399\n353.2487818\n305.8691129\n308.3880197\n307.7213747\n296.9135726\n294.4745142\n292.5300041\n320.5883548\n354.9559205\n407.6944591\n415.9022898\n457.8344198\n433.276421\n368.2202422\n302.0363058\n247.7043245\n237.2324185\n225.6817513\n214.4202562\n186.3593154\n212.75035\n338.3176411\n415.6825405\n375.8033065\n349.1748099\n301.7085015\n302.5394551\n301.0824049\n290.1809626\n288.7174069\n291.2951462\n324.4495862\n358.7789881\n408.6187389\n416.2225699\n457.8103362\n432.8251355\n369.1353598\n278.6927841\n183.5237635\n152.4319515\n158.5488302\n176.2827143\n172.8328065\n195.8882565\n325.1821098\n418.6551549\n357.7578007\n316.9700792\n258.1386762\n256.397562\n261.0582456\n258.9096022\n260.8418547\n259.9204474\n286.1693376\n327.2261883\n400.5097174\n412.2765641\n459.5667832\n436.1331017\n362.7347986\n262.6949422\n136.1392623\n169.3167139\n158.8081495\n179.024151\n163.8727013\n148.8975789\n300.9543903\n344.2280119\n410.6420443\n354.6951017\n274.4835382\n254.2592332\n245.966088\n234.2577816\n233.6394984\n231.5375215\n259.7967694\n293.6731107\n375.3771673\n381.9108778\n419.932964\n412.1337769\n353.9905891\n257.8526662\n138.0758882\n160.1268585\n148.4277367\n151.6250081\n162.2356947\n208.3123339\n276.5397081\n352.8828578\n410.8344155\n361.8213686\n316.7425006\n315.5863576\n313.7063666\n294.5027386\n292.2931541\n291.6519081\n321.9271119\n349.0401749\n408.7184538\n412.0401871\n449.0083123\n420.7233464\n368.0231699\n305.8352988\n207.8614352\n131.7049212\n184.1355478\n135.2897977\n163.9240026\n192.9023401\n328.6499783\n416.6948406\n375.0906098\n346.3476508\n297.6361836\n297.7478178\n296.0720102\n285.5528285\n284.2408912\n284.0225398\n313.3857433\n348.8100686\n401.9424137\n409.9646677\n452.1056014\n426.6787581\n359.7167971\n292.2230808\n231.4740067\n222.5094146\n199.8677428\n208.2884624\n219.9972115\n241.2458949\n336.0598537\n409.2947647\n367.9358315\n337.737827\n288.2485085\n287.5855496\n285.1862768\n275.2928099\n275.3590069\n274.6881542\n305.3113152\n342.1466485\n396.2013751\n405.6620363\n451.6607507\n429.6669985\n366.6267857\n301.8912047\n183.359721\n169.5103775\n166.7313634\n165.7660286\n172.4612766\n203.0692924\n315.680137\n419.0169896\n379.6827104\n352.4502221\n303.2735877\n301.9721655\n299.6816397\n289.9375082\n289.6170015\n289.1555693\n320.0989327\n355.2255998\n408.6007691\n416.8587521\n459.0312709\n435.0157936\n370.2064306\n286.7607967\n183.4750355\n150.9325979\n158.1637285\n176.2321912\n172.1123894\n192.6123968\n325.0283811\n418.852484\n370.4576185\n349.9528126\n304.834801\n306.029814\n305.1007808\n295.5585049\n295.2739314\n295.4111238\n324.7100321\n358.3587129\n410.7187928\n418.1925203\n459.9638948\n435.5625483\n360.2792479\n264.0259504\n138.8019544\n184.4019521\n161.5843216\n137.5455687\n183.0289148\n204.1735366\n327.4216303\n421.0838387\n380.6721645\n353.658101\n306.3593136\n307.4079047\n306.2129605\n296.6252698\n296.4261101\n296.333685\n325.5161952\n359.3073839\n411.2401236\n418.1456048\n459.90987\n435.6784834\n371.2212045\n284.271174\n175.9000853\n161.0814702\n181.479641\n158.5817215\n163.5917701\n178.827594\n302.6246722\n361.5490188\n416.0232655\n359.5562893\n275.8147766\n256.1050562\n256.3595549\n260.2549055\n267.2568043\n270.1922312\n314.8769607\n354.9728325\n421.7301662\n415.3992068\n439.8754573\n433.2398465\n380.6467893\n288.4985546\n142.2838432\n202.9913144\n139.3536169\n150.2125293\n188.6716622\n181.4334597\n284.5156417\n381.9475325\n411.3513758\n354.618269\n309.6511354\n305.4172248\n303.365477\n283.593553\n280.5736401\n279.1555141\n308.1980585\n336.0683257\n396.4451666\n399.1501747\n432.6703311\n406.432006\n353.8807802\n292.1363009\n274.0917475\n260.8113433\n241.0685785\n243.0150356\n241.3722485\n245.4497708\n323.9128891\n370.882552\n400.0272364\n343.7144862\n298.9288575\n294.8751617\n294.5971848\n277.3022104\n279.0741308\n278.6434058\n304.8796688\n341.7863638\n405.0484484\n404.4748828\n436.4202156\n410.4002199\n359.7335644\n294.3842319\n284.5373029\n244.5159621\n240.5415011\n235.4687098\n247.1447163\n261.98447\n370.3458635\n412.3426771\n370.0239734\n338.1191378\n284.9264619\n286.8884375\n288.7448009\n280.5937049\n279.7711711\n278.0715059\n309.2594686\n344.1163242\n396.4167564\n400.0643615\n444.1865582\n420.4596103\n353.3641012\n281.6029181\n278.3339417\n272.459523\n260.9162421\n261.5752751\n264.0619678\n285.7594377\n375.0579935\n408.9987277\n365.9996755\n336.4642791\n285.8935748\n286.8712958\n289.0800855\n281.3388099\n279.7317569\n276.314288\n304.7180149\n339.0403988\n391.8396704\n397.2478376\n439.4931241\n421.2738033\n357.0094688\n293.2492643\n272.3003411\n246.2719937\n223.0417806\n224.9197092\n215.2295455\n241.7170236\n348.5577604\n394.821751\n374.0474882\n366.0691372\n316.6566028\n317.9535996\n317.0081041\n309.0176965\n308.2741191\n307.4584621\n333.3191174\n371.1751476\n425.5329276\n432.809338\n472.3138208\n451.0163946\n384.8760692\n317.099838\n243.9104503\n244.3965783\n204.5282794\n222.6653223\n227.8495772\n251.2754956\n350.8298493\n434.7672151\n390.534736\n357.1555663\n303.9353135\n301.9128059\n298.4285094\n286.7236945\n285.533347\n283.4722341\n313.4602148\n352.3109272\n407.4346794\n415.5285983\n455.6165144\n435.7037503\n368.1328716\n301.9017743\n268.7543139\n268.2351502\n252.7572191\n246.2087946\n248.3753497\n251.5114261\n327.7250738\n380.4847596\n420.438225\n371.3450839\n316.8536021\n309.6581568\n306.477634\n295.6600973\n296.4113269\n295.6825927\n321.8498755\n348.6480106\n416.8720775\n414.677333\n442.6924567\n434.5576448\n379.7303638\n306.088598\n267.2624893\n277.3187912\n253.0886803\n256.6557349\n252.3093254\n262.4547944\n326.3007209\n384.8890934\n420.9217601\n366.5475227\n323.0208325\n322.2777028\n323.5152515\n307.2912059\n291.0188652\n272.4217298\n325.5335767\n357.1670467\n392.4557217\n372.5713018\n390.298776\n355.5892071\n291.5922839\n199.136403\n245.2127903\n209.0588456\n225.1813512\n222.2557359\n219.2706135\n240.3179615\n328.0640003\n394.747098\n357.4549898\n332.2638416\n285.2651298\n288.3772826\n289.2960752\n281.070367\n282.516592\n283.5914292\n313.8731517\n349.1270857\n402.1130085\n410.2553939\n449.6498019\n427.7112284\n366.1673117\n297.8348991\n217.9085187\n226.2446811\n191.8624052\n187.2829847\n198.9365034\n216.9491259\n320.776077\n417.7099055\n377.8337678\n350.6669887\n303.672678\n305.65512\n304.3949657\n294.4108053\n294.6977372\n294.3777799\n322.5688483\n356.6385053\n407.8189755\n414.7794912\n453.8047953\n431.0943542\n366.1849848\n300.4667453\n202.4315578\n205.4600532\n176.8943846\n177.7696099\n195.668538\n227.439319\n324.5177966\n410.5456465\n369.6721262\n340.7006265\n293.9106489\n296.8282661\n295.5149189\n287.9453725\n294.1507743\n298.1316546\n327.6488816\n361.7798206\n413.2773153\n420.1560029\n458.9386109\n436.8181486\n371.8369219\n305.917946\n222.8761385\n208.139725\n203.1224736\n200.7459359\n186.331814\n204.7062057\n338.1279773\n419.6842013\n379.0443856\n352.502073\n305.2430488\n307.4421354\n306.8093868\n296.6517044\n296.8456434\n295.4732621\n323.9832193\n358.1482046\n410.7223282\n416.6516645\n453.0296744\n430.2216136\n364.8063232\n298.615378\n194.8576962\n196.016852\n168.1674895\n171.697491\n194.0249767\n222.9822264\n324.0727715\n412.1439553\n371.4328194\n339.3537423\n290.200659\n290.9721424\n287.9066966\n277.9617921\n278.0817303\n278.2399525\n310.5279219\n350.19955\n401.8870373\n406.928083\n442.8907683\n423.3905448\n359.4212965\n294.0213527\n262.2544788\n260.9224226\n233.4569666\n238.1920772\n232.8001588\n237.4669\n308.165714\n367.2312393\n406.8062205\n361.3913902\n311.5669638\n308.051061\n310.6323722\n301.4415059\n300.582427\n300.3149657\n330.5244348\n358.5188745\n421.1118222\n412.0542193\n435.1604168\n432.2904412\n380.0025538\n308.2211551\n211.4961788\n207.6351288\n202.9837748\n184.7253112\n172.7129298\n201.50639\n302.2735318\n386.2309648\n415.1879489\n359.9563554\n317.5009831\n314.3179285\n313.5826792\n294.7449069\n294.5190232\n293.8976241\n323.6425052\n350.6884275\n411.9057104\n414.2870632\n445.0873266\n422.5566209\n369.7348129\n307.6402137\n199.9290395\n142.9969956\n184.7071342\n160.6805908\n165.4611693\n203.6868188\n336.9894823\n419.8139363\n379.3552258\n352.6028428\n305.3533045\n306.94944\n307.5280857\n298.2999624\n298.7946684\n298.4532963\n327.651523\n362.4025618\n414.5079804\n419.8858527\n453.8502197\n434.9159321\n370.3084173\n304.772836\n196.5313734\n196.5003966\n171.1954899\n169.6841022\n176.6844487\n190.0680911\n321.9506757\n420.7745674\n379.8294613\n352.6280982\n306.4302937\n309.396706\n309.6765537\n300.4197678\n299.8042311\n299.4017157\n327.4102776\n361.1416211\n413.0626637\n419.2830692\n454.6757329\n436.2462781\n371.7188068\n306.0900691\n220.7417764\n197.1336248\n199.2806674\n199.3064603\n183.580556\n202.6254824\n338.4566548\n418.9620963\n379.148027\n351.4133966\n303.0257763\n303.8923823\n302.2951656\n290.0467378\n288.2005065\n289.1558023\n318.6323063\n353.4723095\n406.4028081\n413.2604099\n449.2828151\n429.6246133\n365.2183338\n300.54201\n184.0581092\n177.4263099\n170.502767\n179.5053029\n185.0369433\n215.3232063\n308.3682709\n414.9855036\n375.4263961\n349.1672231\n303.0019547\n305.1535919\n304.629314\n294.3746673\n291.8742091\n290.4110115\n319.654732\n352.933544\n403.4594813\n410.2492396\n446.4395188\n428.0246341\n363.5847644\n298.0050625\n202.8533055\n192.4528167\n181.6649066\n181.1081494\n186.1538301\n188.9232484\n329.7594187\n415.9291835\n373.9799796\n344.902003\n296.8765931\n298.0569018\n297.091106\n286.4969448\n285.7007894\n285.9998849\n315.4403358\n349.5639925\n400.8817836\n408.053035\n445.7216333\n428.2386992\n364.7568012\n298.9619701\n217.192662\n215.0361829\n189.2234118\n195.7500246\n201.3783853\n187.0568408\n291.1370097\n369.1376007\n406.8960803\n360.6351134\n308.6838865\n303.4376548\n304.5470056\n295.4963346\n295.931298\n297.1730744\n328.4862605\n353.8788361\n414.2494173\n405.8993377\n427.0314266\n423.323338\n370.7531397\n299.3538842\n215.3261293\n214.3117297\n208.3818421\n191.8072555\n180.0673297\n206.0488037\n303.3897698\n377.4328644\n406.7066234\n351.2440443\n306.4356259\n302.9863664\n301.2260116\n282.1232579\n282.7092886\n282.5130894\n312.4783386\n341.3992012\n400.7836882\n400.1036546\n430.3282504\n408.582066\n356.692248\n295.3095996\n244.0359592\n222.0085331\n215.1152978\n213.9475883\n211.9430078\n233.668469\n346.7339578\n410.5425373\n369.591086\n340.6854499\n291.6905086\n292.0496427\n291.277239\n281.5324269\n280.1816113\n280.0664243\n310.0160234\n346.8168221\n401.346232\n408.7043477\n444.3863798\n423.2306524\n357.4897035\n293.3270638\n215.60393\n207.2289219\n202.7301957\n203.608162\n209.2071013\n205.6855432\n330.2683687\n415.9843414\n375.3816404\n346.1369526\n297.2471816\n298.4559668\n296.8545762\n287.1280379\n287.6516338\n287.8729715\n318.6189559\n353.4959458\n405.8205235\n412.6737123\n448.4235217\n429.1691768\n363.8822344\n299.3863505\n252.1051377\n239.9979\n221.3314452\n231.9785701\n219.1915949\n250.1866566\n336.655405\n415.3608736\n374.7551622\n346.0570015\n297.558392\n298.359133\n298.2906604\n289.3263472\n288.3014727\n287.0137045\n315.9063622\n349.9823492\n399.7181297\n406.0072175\n442.2756306\n423.1152785\n357.680357\n291.1153758\n240.806744\n231.617751\n223.2647018\n220.2652121\n204.4727913\n228.5920449\n344.9696478\n408.841675\n372.0842048\n352.9807506\n307.0475801\n305.2554536\n305.8908866\n297.0425882\n295.5917218\n297.1676001\n327.0016581\n362.2216598\n413.9160031\n420.0131593\n448.7631922\n424.3663936\n357.1124459\n289.4319945\n259.4254185\n244.5576502\n233.7502506\n225.5358555\n236.7637128\n253.7023945\n353.3280075\n406.4395383\n366.2539614\n337.017619\n288.0189903\n288.4468618\n285.748749\n275.5839144\n278.8515521\n282.5208657\n309.1942649\n341.8098092\n402.7398171\n419.3520953\n456.3168459\n437.2480543\n371.2622236\n305.3181279\n256.5901028\n253.9578642\n233.5616455\n221.5580555\n227.9253343\n226.7213407\n315.729922\n376.3280785\n414.822815\n369.8611145\n317.7583206\n309.0772728\n308.2163207\n299.3536859\n298.8369468\n299.3800735\n330.0198339\n358.0422755\n422.5276823\n416.5343844\n438.4699453\n434.3824134\n380.996026\n309.1308945\n238.1012124\n238.8217669\n188.0974752\n194.0165867\n206.7785668\n211.4064432\n306.472911\n384.7276361\n415.2634891\n359.5519756\n316.6982897\n314.8133044\n314.6015114\n296.4787259\n296.6221224\n296.8140328\n326.3225361\n353.6561387\n414.0068136\n416.2295563\n446.2508443\n423.3760876\n371.0753729\n308.2651238\n236.9236253\n209.9818625\n205.8638386\n204.3010543\n209.6836476\n209.9551531\n331.5979679\n416.6312173\n377.4367498\n351.6991273\n304.536546\n306.258137\n306.3170718\n296.3415192\n292.8774419\n289.6932251\n318.3161382\n351.7755792\n402.8933558\n410.6170334\n445.635118\n426.267148\n363.743009\n300.8706683\n250.3714952\n241.327934\n213.8357415\n227.8414551\n214.8518776\n255.5003079\n344.7699523\n418.1005993\n375.7796365\n344.6082396\n295.5037685\n296.5025052\n294.5596631\n283.533977\n280.8233622\n278.2420067\n305.7167807\n340.834696\n393.2230066\n399.9460216\n436.7511976\n419.0170202\n354.709362\n288.6073704\n262.5915736\n249.0124914\n241.5534788\n235.547808\n234.0245353\n248.3012224\n353.2578082\n411.4951275\n373.7250702\n348.3038408\n300.9120373\n304.4135032\n304.1589805\n294.3001387\n293.3024019\n292.7480531\n320.7829545\n352.9145022\n402.4700046\n408.1317511\n444.8446011\n424.0293606\n354.7955695\n288.9784726\n262.7757188\n246.1313655\n236.4632448\n226.0598488\n231.6165374\n245.3044068\n344.4760599\n413.8562259\n375.7545888\n348.7625389\n302.4001406\n302.7894282\n300.1461205\n289.8857913\n288.8226911\n284.1217021\n309.6861806\n344.2503722\n394.527457\n401.6660874\n439.284369\n420.9231323\n351.40038\n284.0339902\n256.1050353\n243.0915082\n237.2177017\n234.3633103\n244.7892904\n265.3324925\n360.7590463\n407.6002074\n367.286061\n339.4546059\n293.2123501\n295.8757329\n295.6819882\n286.9960348\n287.4554017\n286.7917289\n315.573323\n351.6777689\n404.9643077\n408.2925887\n441.7126466\n420.1114722\n351.5148741\n283.2188\n258.774834\n254.0452335\n234.8648153\n232.879942\n243.4002228\n243.4074166\n321.3973266\n366.3052163\n403.9608247\n356.8564319\n305.915617\n300.4369821\n301.098016\n293.0515066\n293.1023727\n294.027983\n326.2490803\n353.4991025\n416.2773542\n406.7947317\n425.9217462\n419.6968401\n367.1315045\n297.3586109\n231.7091268\n238.1356132\n206.3641941\n200.5530377\n206.0154206\n209.398549\n308.1649774\n381.548023\n410.5636535\n354.1485405\n309.9259185\n305.563129\n304.7115807\n286.9721161\n286.3486279\n284.4345491\n313.9016746\n341.5050507\n401.9977813\n405.6640206\n437.2381544\n414.7369802\n361.957674\n300.3497042\n212.5409158\n195.022732\n180.7312595\n193.4414914\n183.9198408\n210.7655965\n337.5640588\n413.6085582\n372.9121766\n344.5904684\n295.857702\n295.3648044\n292.873972\n281.2249596\n280.7492929\n285.1389004\n317.0445208\n352.3020206\n404.9567738\n412.5848766\n449.0891977\n430.4556295\n365.2761131\n299.6323076\n260.5834527\n267.7384348\n247.2717825\n244.6884269\n248.4141281\n256.7332617\n325.0031641\n371.9617541\n400.3622262\n343.5501248\n299.3050491\n297.302906\n298.6229521\n281.5885968\n283.3344218\n284.1097576\n313.0551985\n342.326707\n403.3410883\n406.3408027\n436.375104\n412.6323021\n358.1451684\n300.3337514\n272.3079438\n243.2820649\n214.3993792\n205.9902908\n221.0763048\n243.9835158\n330.3495727\n416.4415384\n377.3522635\n349.0934889\n299.7467978\n301.314767\n301.3707847\n291.1898474\n291.2839194\n293.1251822\n320.4707014\n354.8976295\n408.5828371\n416.9461479\n454.9031467\n434.8445975\n368.5285113\n301.839835\n234.0800977\n225.2742481\n198.5037476\n195.0152264\n214.8119737\n238.1522838\n322.2176705\n414.5885936\n374.7744178\n348.1573703\n300.2680804\n300.5687227\n304.0550029\n297.4561554\n296.7245344\n296.2356795\n325.5623958\n359.7043844\n411.3022858\n418.3636627\n453.2426382\n433.5723958\n368.6434954\n303.0359483\n205.3262084\n197.5433368\n188.4422015\n200.485922\n208.9000081\n209.5887106\n331.6184447\n417.4672875\n376.9138926\n348.2161164\n300.5123933\n301.4790003\n299.6465998\n289.7567406\n290.2915888\n290.2141553\n319.68975\n354.6727613\n406.6490727\n413.1503259\n448.4310934\n428.1299583\n362.8835183\n297.3744004\n228.2165935\n229.2116171\n217.2601118\n219.5300403\n213.8553617\n219.4982363\n314.6389301\n365.1501163\n403.3661445\n356.9217766\n304.5951666\n296.6411738\n295.3710598\n285.4929408\n284.77207\n284.2470406\n312.4392804\n341.2092621\n407.0681408\n401.6236331\n422.5874739\n417.2781881\n364.6882454\n293.3867956\n260.0832666\n265.7067063\n246.4199285\n245.5686473\n248.5546816\n254.5268267\n323.7063634\n370.734925\n400.0768027\n343.7791094\n297.842456\n294.3387924\n293.9019321\n276.8975567\n275.2805167\n274.5194123\n305.7077814\n332.9602413\n394.0390359\n398.109347\n431.0086865\n408.1711045\n354.3530004\n292.7266735\n275.9587956\n253.7210822\n239.2858405\n240.615142\n241.1697924\n266.1697614\n358.8888613\n404.8626345\n364.1658956\n335.8162647\n287.2617009\n287.3439544\n287.1195559\n279.9245611\n280.5445445\n279.9897519\n310.4230257\n347.4958889\n398.8735173\n403.4976517\n436.6886292\n418.2523954\n354.6714582\n288.0623705\n265.2249061\n256.2843675\n245.3024951\n240.8486702\n249.1990906\n268.2115829\n362.3370022\n405.3753644\n362.4122602\n333.7658934\n286.1443417\n286.9535884\n284.1873746\n275.3250123\n274.5035383\n274.5126956\n308.2200265\n344.5277917\n394.6780505\n394.8388907\n430.0058887\n410.9929495\n343.9109261\n278.229949\n262.1462424\n255.5473007\n247.347484\n246.835233\n252.4908234\n272.5896172\n358.9494328\n397.3837972\n354.2441325\n325.1183013\n278.1168645\n285.6440307\n287.6847473\n277.3828392\n276.3836718\n275.2713213\n301.9790569\n339.531179\n392.3922895\n397.7656949\n434.9106727\n416.7293665\n352.4378997\n286.2206924\n269.8701455\n257.843513\n245.545212\n248.2954215\n248.2611835\n273.9845332\n366.5648964\n413.4728376\n368.319254\n334.6244825\n283.9717174\n288.1614478\n286.4810369\n272.1866975\n272.9413304\n272.7286499\n301.129947\n333.5645666\n387.2111875\n393.4915748\n430.9983433\n413.5487171\n347.2042178\n279.7540955\n271.7123343\n260.8090963\n249.1041192\n251.9604759\n255.1382574\n283.0150188\n370.1126369\n402.2919315\n357.6510632\n326.1353963\n276.2103599\n277.5699365\n279.922216\n270.4861803\n271.8180978\n268.8330268\n297.9889324\n339.9493711\n393.695858\n399.077558\n435.5073984\n427.1434923\n372.1994134\n306.610104\n240.6083701\n229.5294625\n225.3685327\n224.1994298\n222.6377458\n213.8967586\n319.9852727\n355.1737108\n407.1706053\n381.2774731\n327.5212394\n316.5036529\n316.0777785\n306.7375388\n305.9289762\n307.2311804\n340.0608583\n369.3004371\n435.220913\n430.0187509\n452.777137\n448.6825381\n395.4882043\n316.911736\n238.4484584\n264.8498562\n218.0335968\n236.9836414\n213.0166373\n240.0154366\n326.8331854\n362.3921508\n400.9380261\n373.3603169\n330.7223905\n326.8902358\n325.9076027\n306.958169\n307.1483438\n307.1066219\n336.5982523\n365.3266604\n426.7961067\n430.697308\n461.955043\n439.2198855\n386.0962838\n314.7605579\n247.4144143\n245.8303326\n208.8946297\n226.7968897\n221.3027337\n232.7212926\n360.5246175\n434.2172265\n394.8090562\n366.475468\n317.0090026\n317.6146417\n316.6058476\n306.2922564\n306.1140847\n306.9492788\n335.4775923\n372.0911113\n425.427239\n432.9839235\n468.6539111\n446.0210817\n376.8655279\n313.3731451\n266.8300959\n255.7922413\n250.8070302\n241.2870596\n249.4300819\n272.4201243\n364.3895648\n432.6781131\n386.5969628\n350.4663843\n297.6503599\n296.077799\n297.3164787\n286.5851391\n285.0504131\n287.6112652\n315.5005999\n349.0285164\n401.8398852\n408.9360547\n448.8475241\n426.9799088\n360.2301596\n294.5769593\n278.870117\n270.3191087\n261.7074361\n258.7052304\n266.3285214\n285.8340112\n374.2646182\n411.5744756\n365.97436\n335.346294\n281.5318636\n282.2072663\n282.2335138\n274.1478268\n274.4791764\n273.065671\n300.8708738\n331.375124\n382.8849457\n390.1331045\n427.7517749\n410.3918873\n343.7394349\n280.4442906\n267.4632498\n261.4263116\n254.2532565\n252.8543139\n261.7398975\n282.0788048\n369.1960716\n408.5115398\n363.4262949\n331.3890152\n280.2994455\n276.8389867\n271.9244635\n262.6684339\n266.3283571\n269.7384397\n300.2808855\n334.0141726\n389.2334926\n397.8114029\n435.864384\n413.5934382\n343.9165244\n273.5480666\n263.2208248\n265.6236438\n260.7176283\n259.0186967\n265.7950214\n285.5060706\n373.2681793\n413.8795516\n367.0659812\n333.7311979\n279.1168347\n280.6842578\n282.3630537\n274.1025147\n275.5457769\n277.3206046\n307.9732026\n341.2605339\n394.1276746\n400.0147286\n436.6846036\n414.6089596\n347.1685978\n275.9756696\n268.5299175\n275.4456052\n257.3635277\n254.3609771\n260.8609893\n265.6814322\n336.2928264\n354.8908553\n393.151922\n341.7679496\n289.8908975\n284.4026298\n285.8222601\n277.7808394\n278.9474898\n279.6352204\n308.387594\n334.2595264\n399.5859625\n392.160337\n415.22914\n406.9764172\n353.6422898\n279.7908962\n266.7369605\n282.159348\n265.0286082\n263.7152832\n271.4615596\n276.3530588\n337.7531527\n366.8569849\n394.1070468\n330.3809784\n289.4908613\n288.9686853\n289.6943151\n272.017505\n272.2120806\n271.7006075\n301.5099736\n327.2785619\n386.7789094\n388.7249575\n420.9462128\n394.8063705\n341.272624\n276.7722897\n273.2300988\n264.6025357\n256.8986579\n256.630539\n263.2521589\n284.1502262\n370.6659924\n395.8744531\n351.5883038\n327.2427292\n283.0142279\n287.9903855\n291.4436371\n282.1653642\n283.3416064\n283.7470058\n320.1410433\n348.5276199\n397.7448318\n403.0160975\n441.7483776\n419.7392397\n348.9607578\n278.0603729\n259.3300078\n268.154936\n259.1238933\n258.495499\n266.3914657\n287.6569528\n373.6918491\n398.3980244\n355.2060232\n329.5687067\n285.5966181\n290.7035188\n292.2945767\n279.856351\n280.442934\n283.9244656\n314.729752\n342.9864182\n395.2532998\n398.9381327\n436.1401213\n417.2065573\n351.1751938\n281.4007915\n264.2475365\n271.6893395\n258.489258\n255.0554486\n261.9334859\n285.8072066\n369.8280901\n399.0148107\n351.6414431\n327.2233998\n279.1895868\n277.4295255\n272.0008763\n276.2402528\n273.4103351\n264.3551687\n293.2766846\n328.7645974\n384.3265206\n391.6106276\n429.3734576\n407.6444187\n342.7328744\n275.854184\n267.2929221\n264.0763325\n256.2031651\n254.6439479\n260.8365853\n280.2000505\n366.5635005\n425.227497\n381.5791183\n349.5481949\n304.2748528\n309.188585\n311.0223278\n303.7095881\n300.7216536\n299.1320519\n325.131201\n361.9192939\n417.5933885\n425.2645464\n455.9985292\n425.9509309\n357.1801516\n289.8411481\n268.381452\n261.0705914\n254.2078933\n250.739703\n259.9249032\n281.4964177\n368.165243\n421.4382412\n380.9484249\n351.1502258\n303.0289495\n305.4537548\n305.2599979\n298.9834001\n303.1799207\n301.2877834\n326.2946042\n360.8502896\n411.7161072\n411.3665029\n451.916909\n438.5632702\n370.4240041\n303.193798\n269.5020708\n265.6417398\n248.871374\n240.9207223\n249.6387791\n251.2471179\n323.8003839\n387.0149837\n429.8958572\n383.1593311\n325.0667534\n311.0637795\n313.9868706\n310.5889267\n311.4116467\n311.7112102\n340.6286732\n366.1874257\n428.7496102\n422.2181766\n445.6848758\n436.0515925\n382.611033\n308.2018274\n268.294352\n273.8324788\n259.1361741\n255.6903682\n265.7909826\n271.7162296\n332.609974\n387.5579071\n424.2517382\n370.628231\n323.5042337\n317.8846526\n312.3639161\n292.2537916\n293.1394203\n292.0730387\n314.004198\n338.3354232\n398.3267521\n402.3037773\n438.5543345\n414.7973163\n361.7626269\n297.8879029\n282.8340898\n262.4419689\n255.8130492\n252.982273\n260.3817311\n284.1483568\n369.0581047\n413.9863639\n374.5846402\n346.0964038\n297.2301168\n299.619754\n301.2411399\n290.670215\n288.2170939\n287.5528768\n314.7127725\n350.127197\n402.6659764\n409.8945311\n453.8841876\n429.0015905\n361.001988\n292.7785464\n267.1399544\n258.091321\n251.7031326\n246.5174333\n255.5243965\n272.0650437\n359.550537\n425.2069863\n390.4109355\n356.6667564\n308.5327805\n311.26224\n311.5697281\n301.5193272\n294.1844234\n288.2434454\n316.5609289\n349.6563489\n402.1183283\n413.8407929\n458.6600055\n433.3481847\n366.2091355\n297.4470313\n269.3041419\n260.9531767\n255.1148536\n252.13814\n260.3715531\n282.9228141\n368.3801779\n413.0803761\n369.4723493\n338.2247745\n287.1320708\n286.2599634\n287.6986701\n280.3452396\n278.6364154\n277.4395549\n308.0678592\n349.0163739\n402.6675957\n408.378938\n452.4036081\n424.4113042\n349.6509869\n279.5899693\n268.3742373\n262.5582683\n255.1144927\n254.6287751\n262.2149669\n285.3946744\n368.7403906\n394.0673942\n348.7012907\n319.7844281\n272.7569528\n276.9804995\n278.7471113\n271.0996789\n274.5747405\n275.3032459\n305.0003048\n338.9723265\n392.0918425\n398.1063345\n437.0684068\n411.4352177\n343.179765\n273.6062235\n269.4865018\n265.6800298\n257.4424565\n256.0843022\n263.4382842\n286.5297014\n371.6853784\n405.4836935\n361.3931218\n330.0232955\n278.8121099\n280.5298817\n281.6690231\n274.0475804\n275.5581641\n275.8308032\n306.798898\n341.7306351\n393.3189349\n397.3020707\n436.6765929\n412.0889009\n345.2324227\n275.8712934\n263.7713628\n275.2851212\n256.6434784\n255.8836022\n262.1744474\n273.3250971\n338.7689488\n354.5162491\n389.6908766\n343.4689996\n289.4631825\n282.8000901\n283.2690364\n272.7993846\n271.139607\n267.3997367\n293.6731817\n324.3427342\n396.2056841\n398.9803691\n427.5932075\n416.3620749\n363.1225246\n292.6462872\n267.8208395\n273.510073\n258.1086112\n253.9461621\n262.5580651\n270.1845525\n328.7765706\n387.1191921\n415.3310609\n352.8700969\n306.5716579\n302.6372594\n302.691216\n284.383167\n284.0127503\n286.1279021\n317.117733\n346.0981591\n405.4567552\n414.1724164\n458.9389847\n428.6783692\n371.0983074\n304.3059388\n277.0430103\n259.0965206\n241.4557522\n247.6201932\n246.0783459\n278.6509617\n359.0700332\n421.332808\n376.3346663\n343.9129518\n293.5059228\n297.72291\n301.1352121\n289.7206932\n284.7896708\n282.0499217\n309.9250327\n346.213966\n398.9220642\n404.4001706\n447.4340298\n425.1383783\n358.4961707\n290.9783228\n269.268475\n260.2375777\n246.3161624\n249.3838394\n251.5229496\n284.3798332\n365.2346567\n411.5184315\n363.0751753\n325.8967939\n274.5538197\n277.4711561\n278.2873304\n270.150736\n272.5023077\n274.2368504\n303.5060678\n336.4844539\n387.6059705\n393.6325644\n434.602388\n410.3959339\n342.9610582\n278.8703144\n274.4540791\n267.357157\n259.6270536\n256.3736724\n262.9524925\n287.0020005\n368.9815683\n420.6844913\n376.0169725\n343.4730653\n292.5476971\n290.2000956\n286.4811613\n276.3161268\n277.501691\n275.432468\n307.5522699\n349.5306305\n399.4741288\n404.9569625\n441.148407\n418.090416\n355.2961307\n291.939094\n264.969927\n256.9435496\n241.2961461\n245.8567255\n243.079714\n278.3138907\n361.2811463\n411.170153\n369.1170128\n338.7738581\n285.9697204\n284.4215978\n284.3220465\n274.1160221\n273.6233555\n276.8259375\n308.6018099\n347.6694051\n403.6498754\n412.3628053\n452.5795512\n435.4696668\n372.073447\n305.0116707\n245.7729197\n243.1623473\n208.5264418\n225.5160026\n227.418254\n243.0352785\n334.488554\n429.7089671\n387.50396\n356.7458727\n305.6403403\n303.5163664\n302.0893814\n292.2856514\n289.0333255\n287.74724\n316.6965915\n352.4875813\n405.2703512\n414.3761964\n452.7558717\n426.7260343\n360.0329614\n300.5942284\n266.3907807\n263.5416905\n244.8124832\n231.2359335\n227.775951\n237.0314751\n307.057259\n341.980407\n408.896291\n382.3363669\n325.7319157\n314.3319355\n313.6397907\n308.6733443\n311.5079443\n311.5568037\n338.5161845\n361.8762087\n424.5495555\n424.1565417\n452.8265787\n443.9747354\n389.8029438\n314.156343\n261.8789706\n275.6386527\n246.5506391\n252.2624392\n238.2390704\n265.8315381\n314.7400484\n389.0752915\n421.5637187\n364.0051972\n319.0779929\n315.5077549\n310.1856175\n291.3508659\n291.0973458\n290.4579874\n320.171822\n350.7426836\n413.4372638\n421.1676743\n455.5974256\n426.960548\n373.514448\n308.5025392\n269.5816956\n255.0475499\n232.9619856\n238.1006962\n225.8693923\n267.5514683\n347.2007422\n423.7760634\n380.1279379\n348.8282206\n298.3254056\n297.8836135\n295.4809722\n290.7441941\n299.2034075\n293.9277632\n313.1122131\n348.7510668\n401.7552596\n409.6478406\n447.4884067\n421.708104\n353.4323168\n285.8481231\n268.7672704\n261.4379417\n254.3724867\n252.7216749\n260.5403445\n285.217319\n367.9458522\n413.4744019\n367.1101105\n333.7052094\n281.5916032\n279.1683312\n281.5185938\n270.0964695\n271.0689925\n270.5467363\n298.3662382\n331.6074956\n386.0018841\n400.3959815\n437.3449166\n406.5719719\n344.1755399\n285.3142669\n272.8525739\n264.4805678\n256.2276876\n253.172895\n260.9596198\n286.0614795\n371.8794879\n407.5037275\n362.44365\n332.8533714\n281.5495583\n279.4581699\n280.3118113\n271.833136\n272.1207683\n271.1050318\n299.9047856\n333.1798668\n386.1111525\n398.8485926\n434.5153407\n411.4532942\n345.4083928\n276.3676159\n259.2830201\n264.6008147\n257.0130092\n256.4808986\n263.0342607\n289.8216071\n373.9844488\n396.0113779\n353.2954647\n329.5468221\n285.2247837\n289.5033869\n292.3384995\n282.8190871\n282.4362873\n283.0536891\n316.2112784\n341.0576964\n393.2298837\n405.8170375\n441.0100588\n417.7840878\n351.707687\n281.8368233\n248.7495368\n265.0705772\n259.217295\n258.755482\n265.7614822\n292.2139166\n375.463053\n397.8681383\n353.4657297\n326.2551755\n279.843985\n282.0223873\n283.3686245\n275.2443563\n276.1899923\n276.0869832\n305.1297111\n351.6073663\n408.0634663\n420.9840928\n458.2364201\n433.7317181\n367.7744299\n301.1068969\n273.6628648\n273.4909971\n256.8360224\n253.026273\n260.8411873\n268.1079095\n338.0350929\n379.7727482\n420.2604188\n370.9647501\n316.1198978\n307.2170415\n302.3233167\n288.4657773\n288.5890787\n288.5061784\n309.7040666\n335.3824486\n398.6372685\n395.6667527\n416.084063\n406.1094789\n353.4416258\n279.5576494\n268.5097164\n279.1968919\n262.4905103\n259.853287\n268.6648777\n278.7283342\n338.1600526\n374.6069902\n406.0749252\n348.3983659\n306.8285441\n308.6968911\n308.3080529\n293.1485071\n294.1180366\n297.6650193\n329.7378217\n360.2513125\n422.533656\n431.9667205\n461.4677334\n434.2505044\n385.570627\n321.9156433\n280.3980374\n253.0787605\n248.0455139\n241.0640768\n252.0931654\n273.005795\n362.5303394\n418.7942963\n393.572857\n366.5247644\n316.5417324\n316.3335542\n315.5786525\n293.6323926\n293.4220995\n304.2360811\n332.8845658\n364.8818638\n416.5850845\n431.1874608\n469.8558649\n445.1167305\n373.3414546\n303.4580027\n271.5281863\n261.100154\n254.2464146\n250.5352688\n261.0042359\n287.1646713\n373.534091\n419.134526\n368.9571781\n333.1261006\n285.0196751\n283.3991815\n281.5879526\n272.9694773\n272.6065489\n269.3393607\n298.8393153\n331.7256469\n384.3551379\n399.0322388\n433.5278097\n412.845571\n347.7705365\n284.0094348\n272.8859438\n266.3542674\n256.9198087\n250.4212528\n257.1071417\n277.6293792\n363.5290886\n420.8873732\n370.810474\n364.1528244\n316.9915286\n317.7855912\n316.8061639\n306.8317464\n306.6389637\n306.5398837\n335.310592\n371.4675345\n424.8412092\n441.0582727\n475.177728\n449.871722\n365.3408198\n282.2210022\n235.0453915\n226.5777266\n226.5195797\n231.2568504\n233.5801326\n260.5938808\n344.8729294\n350.2580034\n311.4744033\n314.1725859\n295.6932781\n313.6838377\n314.9024251\n307.1375845\n307.1127997\n306.5831548\n336.4684121\n372.2236938\n425.9247852\n441.6720205\n475.3905089\n448.9258069\n377.5554501\n290.6321706\n211.2105709\n231.5263012\n189.8598327\n203.0559975\n229.4330582\n251.3879783\n349.2183327\n369.5623663\n339.3410652\n342.71238\n311.1759205\n314.8877761\n316.7049616\n306.9713333\n306.5694961\n306.2875991\n334.9454875\n371.8489596\n425.3503104\n440.7351784\n474.8685702\n451.2023171\n385.1063911\n305.0649966\n220.3817853\n239.7968493\n212.7997224\n199.029202\n187.5488937\n208.7223768\n309.8474054\n319.0624707\n380.2331145\n382.8666369\n315.5780908\n321.8451729\n321.3884705\n311.5075542\n310.6870666\n310.3304711\n340.1148044\n368.943402\n435.0985998\n438.8563435\n458.8564004\n449.0667458\n395.6187632\n322.2619726\n251.5383067\n272.0494496\n233.7678658\n246.5978945\n231.2423996\n250.9202503\n332.1956948\n386.4163079\n412.1951977\n367.6415564\n321.2523415\n318.4904423\n317.4715701\n296.8807989\n295.0193779\n294.1051551\n324.6646931\n354.3440915\n416.083334\n428.3556492\n457.386402\n429.7157714\n377.2775565\n312.975554\n222.1461751\n125.970534\n192.4314765\n180.1800888\n195.2360536\n235.7122016\n348.2128055\n426.1455241\n384.6530978\n356.7112794\n305.8984088\n306.4336376\n304.6361944\n293.5610288\n294.5305646\n295.7203741\n324.3945688\n358.6924446\n412.8034205\n430.7325642\n466.0430856\n442.4424376\n376.80015\n308.0032605\n202.4888657\n143.0809404\n195.1873396\n193.0951175\n196.7919591\n237.4338069\n342.3959628\n420.488491\n373.5185107\n356.7262832\n303.612589\n299.0652144\n299.9068311\n294.2672871\n294.8108388\n296.5256716\n324.7365347\n361.6420192\n417.6290883\n435.0776896\n469.8304697\n446.0999064\n380.592556\n299.2442743\n222.0956317\n177.6973916\n189.9986779\n215.997815\n223.7546487\n256.0333719\n349.1932068\n367.3971548\n323.7471495\n321.4281487\n308.733319\n318.216298\n316.5890564\n306.367515\n306.1076251\n306.3159903\n335.258603\n371.7559174\n425.8402248\n444.3727912\n474.0933878\n449.2459636\n382.4624064\n313.1998174\n225.837117\n196.8837647\n191.1795152\n194.7621743\n200.5710533\n218.0127638\n355.2505291\n407.33284\n381.4241647\n361.1819849\n314.302416\n313.2183705\n308.4122558\n296.9633362\n297.4282993\n297.0919107\n325.0848561\n360.0632428\n411.8931708\n430.0320785\n461.1454088\n437.8678289\n371.3810801\n302.0599386\n256.7217088\n249.9326171\n231.5413714\n218.5720822\n228.6411022\n261.592672\n370.167864\n422.8736617\n380.5071272\n354.5154321\n311.3049047\n314.009962\n310.1831865\n297.4272821\n295.6859095\n295.7686807\n324.9104511\n361.5997981\n414.6366502\n432.2846868\n462.8292864\n437.8739051\n370.5164722\n302.1770592\n264.792593\n267.2932099\n240.6655714\n245.1636241\n234.6694088\n259.6169769\n325.065599\n384.6704307\n425.7242848\n372.5786213\n311.4241258\n298.2014174\n294.39095\n282.3326437\n280.8535207\n280.6980134\n310.5655637\n340.3139552\n405.5724423\n412.4209666\n429.2283804\n418.0853963\n364.2535282\n291.2586768\n274.3100407\n282.737666\n265.0068242\n263.0229582\n267.9636462\n281.6755702\n343.0212845\n368.5345166\n399.2428429\n340.7131735\n293.5637834\n289.085296\n285.6427352\n267.874832\n268.6405969\n268.4237057\n299.9667905\n336.0300664\n398.2444463\n412.9608447\n439.2286871\n409.1020442\n355.0181231\n291.4050128\n287.1217731\n286.1621512\n269.060569\n266.1703176\n266.4406805\n281.1372116\n341.4776583\n381.1817954\n413.797537\n356.8821878\n311.5910756\n307.9758859\n304.9339008\n284.4675919\n283.5161427\n283.834534\n313.7012748\n342.0431659\n402.3614556\n416.3706683\n441.9451495\n413.2460309\n360.5594262\n297.2115582\n284.7104162\n264.2467616\n257.8569993\n256.0775004\n265.3938197\n291.4616515\n382.5578595\n418.1318925\n372.4783947\n335.146568\n279.1490757\n277.3118718\n277.4592205\n268.3168183\n268.2149912\n267.5759922\n296.0459286\n330.4937933\n383.6491578\n403.5274635\n431.1159905\n406.9564293\n340.6690948\n273.429868\n269.9489068\n266.3349704\n258.1645917\n257.4765848\n264.0565109\n290.5929888\n378.9905728\n394.5937479\n348.2221836\n319.3304608\n270.4039885\n272.2551572\n273.2015249\n265.2123218\n267.4024322\n270.7417597\n306.5567874\n350.5929436\n403.4617741\n424.1389505\n451.5132438\n426.1694294\n358.4661555\n290.4287006\n274.9308319\n266.0550378\n258.1585453\n252.0035623\n256.306278\n283.3429094\n375.1094573\n418.5971243\n375.7223625\n346.3154174\n297.3212467\n298.3549265\n298.3046919\n289.9735588\n291.7266748\n294.650913\n326.8585884\n365.3607479\n419.9957025\n442.0440287\n470.8873704\n448.4378149\n383.3500338\n315.8637538\n262.2929701\n253.9440613\n248.9694679\n242.5418444\n245.5017783\n270.7473443\n365.2493795\n403.3812311\n351.4404259\n335.2488544\n293.6720074\n305.6494084\n316.1454244\n305.4004954\n305.5536564\n306.7845415\n336.6209249\n372.1758245\n425.9744524\n440.5905751\n454.7913468\n419.9427286\n342.4338664\n256.9339506\n201.1228223\n243.7222126\n210.7824144\n215.5492471\n225.2124655\n239.4755734\n319.9166174\n268.5613284\n296.1974695\n276.9273393\n256.8274777\n278.7174112\n302.2609575\n310.950753\n311.7882005\n311.8134356\n341.318916\n369.2295436\n435.112085\n427.7000249\n425.2711613\n407.4602008\n345.0623943\n260.3274556\n208.8324883\n213.7645502\n185.7590976\n224.83135\n228.2714822\n242.0464916\n306.1455976\n360.0946678\n392.4780787\n338.8243734\n296.0064396\n294.3796449\n296.8148328\n279.6257266\n281.0054393\n281.8373472\n312.3680099\n341.249337\n403.3221499\n421.2923196\n444.2561337\n415.3108715\n361.8821632\n299.6421736\n233.149055\n214.9821781\n212.1510277\n196.5269843\n211.0931965\n228.4277507\n340.4353758\n414.1652929\n374.0160283\n346.3845675\n298.3701074\n299.3837749\n299.1012244\n290.2262124\n292.0064083\n293.4973036\n323.0391165\n358.0223871\n410.1189558\n433.9838178\n458.7512544\n433.3697761\n368.955649\n303.99778\n197.4220608\n188.1579604\n173.3995804\n171.0584425\n177.8077425\n216.2289394\n327.8595794\n419.0303225\n379.1457823\n351.4083791\n303.3488397\n303.958365\n302.8447902\n292.9313929\n292.9515552\n292.9982044\n323.0085734\n358.0545272\n410.7029131\n434.5132916\n459.2805669\n434.2162735\n369.1375611\n303.0973456\n194.8836855\n186.595055\n174.944912\n173.2508525\n179.3401229\n223.9392174\n320.161597\n419.535458\n379.6183435\n351.7878339\n303.6143439\n303.1562902\n300.2101352\n288.7752063\n287.9249231\n288.7129199\n318.8939526\n353.7184251\n405.6751368\n429.3332698\n453.2962423\n427.675942\n361.867595\n295.0972115\n236.8011247\n239.5102159\n234.7728007\n234.7011531\n243.4251019\n267.7181828\n366.5093503\n403.4859539\n362.0029897\n333.4711798\n285.5543641\n286.4634123\n285.390442\n275.8766076\n275.3116668\n274.4387757\n303.9004525\n339.5388653\n391.7904947\n415.5603309\n441.4814446\n420.0094896\n358.4035654\n295.8050174\n217.9386692\n213.9603304\n183.8832979\n185.3749605\n195.9431827\n230.5288157\n319.6776057\n421.2349832\n380.5500292\n352.6171332\n304.3020321\n305.3923346\n304.9067478\n294.8238491\n294.5793269\n294.4818071\n324.0381891\n358.6104561\n411.1149861\n434.9752345\n459.788794\n435.0117458\n370.4612557\n304.8794096\n191.6860213\n170.6190054\n162.7840533\n178.2503293\n185.0541153\n198.1223916\n289.628928\n376.6858983\n415.4344332\n369.3316544\n316.8019147\n308.819455\n308.2160669\n298.3636066\n298.4264962\n298.8236456\n329.0208555\n356.7475298\n421.9906435\n432.178967\n442.4303293\n432.3316751\n379.3753509\n307.9381813\n205.0230365\n222.5510646\n147.9864272\n190.7134903\n165.7240294\n203.132048\n308.2278619\n386.1376723\n415.0280975\n359.3179781\n315.7194351\n312.5674566\n312.8333596\n294.2382171\n294.5015965\n294.388892\n324.1084075\n352.1682891\n415.9236799\n432.7854893\n452.0572846\n423.2723191\n370.2232447\n307.9393404\n215.3154725\n205.0873247\n153.4709784\n175.4889066\n188.137572\n224.6986265\n332.6313569\n419.0456878\n379.7974145\n352.1359545\n302.6068457\n302.5138819\n300.8702377\n291.0670948\n290.2978233\n290.7344412\n320.9713287\n356.0819714\n411.0083805\n432.1683603\n456.6287417\n431.1327046\n365.7040352\n299.9214044\n214.5450649\n213.0319917\n193.8638285\n179.8446403\n189.3365943\n231.8866936\n351.4074624\n418.9472975\n378.9028157\n351.1366369\n303.7889433\n304.4687277\n302.4794858\n292.0021698\n292.093148\n292.7598423\n323.1398806\n358.067048\n413.2166741\n432.8314609\n457.7585931\n433.3750323\n363.7209114\n264.1925088\n147.8006912\n156.0481354\n176.0722757\n163.1728079\n145.33936\n212.6895881\n326.5379542\n407.1099743\n353.4936798\n324.0022456\n282.9433122\n302.0277107\n302.4887468\n292.3289837\n292.213665\n292.5446903\n321.6474239\n358.694239\n414.4715571\n436.067495\n460.7192235\n435.79119\n370.6997467\n305.0006408\n200.510958\n142.2340603\n193.5250073\n142.8023847\n169.4375411\n216.788956\n347.0654953\n420.9049533\n380.2954296\n352.0643601\n302.6418692\n302.0269539\n300.1284135\n289.4795006\n288.775862\n288.1765999\n317.6251526\n352.387396\n407.3435877\n428.5614235\n452.709498\n426.8716401\n360.7471216\n294.5589445\n220.0242265\n195.083184\n200.0997922\n204.0774583\n212.491039\n230.7026056\n346.3564064\n411.7430935\n371.2777239\n343.0130053\n295.8798324\n297.589351\n297.7025609\n289.0351328\n289.5980612\n289.5994843\n319.19154\n354.9282123\n411.8496649\n434.2112497\n460.2016887\n435.5983326\n370.8397886\n304.8736592\n196.9383268\n142.5560373\n177.8924363\n179.6125156\n162.1931172\n185.1648062\n289.34191\n363.7483368\n415.2239979\n370.570031\n317.6921288\n309.3247661\n308.5620877\n298.996993\n299.7803593\n297.5365436\n326.8620874\n354.0816012\n427.8599149\n432.6649445\n442.8308892\n432.8128376\n380.1088748\n292.1830893\n147.5781829\n208.9688909\n140.9928061\n152.3339873\n166.1608666\n213.01078\n297.1456108\n357.1544474\n413.6494913\n361.1737768\n317.2406039\n313.2645043\n312.5533666\n293.4865128\n293.5988761\n293.7515182\n323.4785325\n350.8678567\n417.5202091\n431.9935195\n451.8403049\n423.5192465\n370.5252464\n300.9013294\n191.6807934\n154.6073084\n142.9991549\n179.1599335\n167.8602221\n194.195118\n346.0488644\n419.4382759\n366.0553959\n339.3045217\n294.6656298\n305.951419\n304.6737074\n293.8551728\n293.9103193\n294.6098455\n324.3399946\n358.6783987\n416.8899762\n435.5916441\n460.5538502\n435.728772\n370.7383501\n304.9976245\n177.1388515\n150.4067589\n166.5219096\n139.1030097\n183.865548\n213.2682205\n337.3969918\n421.9757253\n381.4567159\n352.9937088\n304.6328773\n304.8737552\n303.9228996\n294.3725493\n295.3568829\n296.1363149\n325.8252149\n360.6425199\n418.5216651\n436.5553087\n460.8241653\n435.535479\n370.7438042\n304.8408699\n192.3341271\n183.7189593\n172.2116798\n170.345383\n176.593793\n221.4583065\n322.6107352\n420.1435473\n379.3143475\n352.3927125\n304.8468824\n305.8177577\n304.9304923\n294.7568071\n295.0537621\n295.5481288\n325.0890558\n359.7004461\n416.9999003\n435.4691579\n460.37488\n435.4894351\n370.276077\n304.5044458\n190.4522994\n146.4896276\n178.3036735\n181.4604736\n187.2515344\n203.5641261\n321.828536\n419.4336545\n378.7043748\n349.8025878\n300.6813241\n299.581434\n298.2825218\n287.7612516\n286.4919034\n285.748899\n315.0717227\n349.9385168\n406.9987701\n424.5788567\n449.2435353\n424.6761918\n359.9191194\n295.0618799\n227.5927375\n230.2103402\n204.7112178\n213.3342449\n230.9420638\n265.6672687\n364.1619776\n407.6114198\n367.3743578\n338.0983803\n290.2240896\n291.5166859\n290.5364342\n280.7735525\n281.4891033\n282.5996846\n314.024744\n350.4612491\n411.5377098\n427.1074181\n452.3352396\n428.3416537\n364.5565177\n298.9085369\n214.6967167\n220.949866\n187.1854268\n199.3830155\n210.7944178\n222.4200204\n295.8125803\n370.4323271\n409.1559057\n363.1509713\n311.3389662\n303.7197274\n303.4323385\n293.9760347\n293.5990012\n292.9276665\n322.1880282\n350.0998661\n424.5868289\n427.4317707\n438.2008184\n428.2400643\n375.4541972\n304.0162971\n202.5409821\n158.1270036\n158.3829571\n190.0165539\n164.3694213\n190.2767541\n311.713251\n383.7284762\n413.1853215\n357.4153579\n314.4276591\n310.1113436\n308.120566\n288.6736257\n288.5566854\n289.8228122\n320.6918995\n348.5349767\n416.796102\n427.3115442\n447.2762424\n419.9060057\n368.2556209\n305.7451473\n202.5860749\n160.0577608\n180.0157825\n182.8246428\n180.6448269\n218.6659488\n345.9561845\n413.3869827\n372.8267388\n345.228495\n297.1971643\n298.3124453\n297.8983733\n288.4343648\n288.4943763\n287.8468884\n316.8751752\n352.2315922\n413.1437153\n428.9400484\n454.1220092\n430.3341658\n366.5741017\n301.8516148\n194.6192856\n131.2140955\n176.6038996\n178.5279523\n162.3772167\n202.2031113\n329.8589459\n419.5302451\n380.4006795\n353.2943788\n304.85949\n307.0895226\n306.0405147\n296.0010089\n295.4277802\n295.701825\n325.1311337\n359.1860559\n419.5417703\n434.3696405\n459.2631228\n435.1216623\n369.5184408\n274.2702613\n136.6557188\n157.7128235\n156.3488793\n177.1254552\n162.288195\n200.6959032\n329.1458155\n418.109509\n363.2280824\n343.8923628\n303.1903845\n304.5427999\n302.995955\n292.8175042\n293.3938146\n293.990285\n324.3579503\n358.8128498\n420.0677171\n436.4795226\n461.2643946\n436.5194827\n367.928052\n268.1668894\n138.6093576\n148.9383661\n179.8896518\n160.4587877\n145.6458062\n202.2457188\n344.046258\n416.931827\n361.7740958\n340.5434577\n298.9856431\n307.2000453\n305.9634789\n290.9425353\n294.1865859\n294.3099026\n323.4437264\n357.7982742\n421.7999693\n434.9570639\n459.7283312\n434.3628315\n371.4143665\n273.2386045\n139.226103\n148.9058215\n180.4004478\n160.7590534\n146.4465906\n203.1921891\n347.7339112\n416.6751382\n354.7667897\n317.6815864\n273.615863\n296.0630458\n305.5483096\n291.3663628\n293.0051892\n293.1944363\n322.7280291\n357.2220791\n421.4009198\n434.1648404\n459.0930809\n434.9305942\n371.5075903\n272.3457015\n139.2414153\n159.7464664\n180.4727437\n141.9573811\n165.6161103\n198.5625151\n294.6572611\n344.8893104\n411.4013582\n360.4386164\n283.7383343\n297.713647\n307.6344077\n297.6847615\n297.3282281\n297.2638695\n327.488742\n355.0139357\n434.1340896\n432.8517742\n442.9629836\n432.9694095\n380.1677601\n294.2520963\n148.0881015\n174.3282019\n161.7276059\n163.1127589\n188.7250497\n157.3132553\n312.3001524\n350.3089289\n411.3745905\n360.6259726\n316.5024928\n312.6800782\n312.0295499\n293.2656204\n293.9572446\n294.7040137\n325.2582726\n353.5625841\n425.7121232\n434.141127\n453.4616013\n424.6709784\n371.4015652\n308.9556175\n206.07114\n170.874046\n164.0940998\n176.027633\n176.3044028\n195.2304415\n301.2070598\n386.0494444\n415.4271967\n359.0251382\n314.9665959\n311.2260841\n310.6902892\n292.1775274\n292.7919175\n293.3863061\n321.3393714\n349.4917371\n421.9277726\n430.4662152\n450.0061992\n421.757458\n368.9366559\n276.0845915\n163.0561805\n159.0683516\n179.9612053\n141.6521613\n192.548331\n159.1406731\n351.0242946\n404.2582617\n343.7103171\n324.5797347\n278.7527542\n285.5438924\n295.3308595\n292.1065025\n292.0494182\n292.3328316\n313.1281841\n339.7129483\n415.487015\n423.8363009\n452.2495084\n434.5317612\n357.0654167\n265.0537103\n142.7040788\n152.1080015\n184.2488523\n159.3188181\n148.914491\n216.8394395\n352.3199329\n412.7369994\n371.7656333\n344.4615339\n297.3626638\n298.6365167\n297.7187991\n288.0417046\n289.2558266\n291.7799119\n324.1896519\n359.9570577\n426.418973\n436.4197487\n461.1090861\n436.2657899\n364.8558411\n273.0102085\n136.491451\n143.1698412\n177.1840277\n157.1906796\n142.4745424\n199.9321039\n346.1063906\n410.0686354\n353.78793\n325.8984186\n277.9999962\n292.2274447\n304.1494745\n291.6167046\n288.4111183\n290.2696605\n326.2660584\n356.4944302\n423.7642865\n420.6657616\n443.2999527\n431.797756\n345.9049872\n248.1194406\n134.6959815\n141.5403855\n139.2984508\n182.179116\n124.5653797\n200.6912099\n339.6901541\n400.9144191\n327.1779679\n311.1748222\n261.0802933\n259.6963138\n262.4237498\n250.7739946\n251.2234977\n251.6833302\n273.1727749\n305.9871532\n384.5142838\n394.1568598\n423.7669202\n412.7565867\n330.5220562\n235.4929071\n137.7071281\n150.190734\n135.9766145\n137.3815296\n146.8163079\n208.5903649\n282.1545506\n311.0521342\n383.7164466\n345.6800194\n278.7838902\n271.835355\n273.6100139\n273.4882379\n279.0827322\n279.1900123\n310.0765734\n328.2429528\n401.1164406\n401.3800888\n422.2139465\n420.6465413\n356.2319011\n259.055166\n147.9492097\n170.2902275\n156.3881128\n157.7030814\n167.1044877\n182.0942474\n314.6103425\n339.0306451\n395.8194042\n337.3219974\n273.7101455\n261.3459681\n256.0008534\n235.4484852\n248.1234402\n258.1869556\n289.4821983\n312.8511386\n393.4592527\n405.629481\n431.1059209\n404.1251886\n346.0739766\n258.8673549\n150.0577159\n144.6997486\n142.1527756\n156.2771825\n163.2689401\n212.8332904\n326.7941402\n406.7008376\n348.1990763\n323.8090184\n296.4434055\n304.6630074\n303.1471984\n292.8101835\n292.2276382\n292.2856416\n322.5495411\n357.9863353\n424.8142333\n435.1050678\n460.4138286\n436.3126058\n371.4641791\n305.6736223\n194.0599091\n153.2433791\n186.1316543\n187.7657992\n180.3135769\n217.8090346\n326.6406097\n424.3487075\n380.5654179\n350.9129353\n301.3701938\n301.6834501\n300.4578185\n291.0582837\n290.0804481\n288.2066314\n317.2874666\n353.1457352\n420.4772619\n430.6087435\n455.0645592\n429.6075336\n364.3101867\n298.3657299\n196.7447138\n173.3779035\n174.3967612\n188.6097513\n194.8246779\n237.3005518\n344.7281227\n413.7363367\n371.4265909\n342.8292007\n294.2471337\n295.0946012\n294.6571675\n285.3580529\n284.6631959\n283.5116001\n312.5752928\n348.663391\n419.8943709\n429.0145281\n455.1394092\n431.182877\n367.0388405\n302.050475\n197.198559\n135.00124\n179.1219697\n178.7061286\n173.3739872\n212.0466691\n331.2907059\n422.5207648\n380.3687692\n352.8995529\n303.3550094\n303.5599271\n302.6623947\n293.1527584\n293.2414033\n293.4413632\n323.7354294\n358.7187928\n428.3186671\n435.8532205\n460.540528\n435.9323368\n371.5241861\n306.3113011\n198.4492427\n139.2943794\n189.8954336\n121.5495864\n183.3433967\n202.7934703\n339.9033039\n416.9114243\n346.7974121\n326.2805321\n277.2987415\n285.5008903\n294.626915\n292.7481711\n291.1745858\n291.7130385\n316.3230252\n343.7369554\n419.5269564\n420.7017849\n443.4400342\n429.2371487\n343.5777099\n246.9811779\n141.8676192\n157.7620019\n144.9359118\n184.7288556\n127.6395177\n196.7097032\n298.9411238\n340.3262789\n405.379988\n351.2637522\n282.0513011\n270.3133093\n275.4595042\n288.8652255\n302.5601226\n302.4141002\n331.7613006\n357.2591017\n439.6288583\n433.657959\n443.9651474\n434.0038261\n371.9482667\n268.9489745\n139.6176562\n163.2263371\n150.6900047\n152.825693\n162.4395273\n177.5232295\n311.2758906\n337.9028157\n389.3689719\n347.8167063\n290.4223089\n289.1157648\n290.4267555\n269.6495027\n268.8626128\n269.1610909\n291.2091002\n307.9688543\n387.2798199\n400.9340882\n430.3814857\n403.0124871\n342.613013\n254.0645501\n153.5695016\n143.8706264\n138.806031\n139.717633\n148.5457141\n210.6674608\n331.0090307\n390.2414761\n333.1325487\n309.8141417\n262.8689527\n268.6144034\n275.3991636\n265.9636357\n268.4901699\n264.7455969\n284.8542274\n312.4413996\n391.0993396\n400.5870159\n427.8373237\n413.5458402\n332.0668659\n237.5992354\n128.7330331\n132.7581981\n144.9874598\n142.0552425\n149.6331286\n185.069311\n349.9443808\n377.6773789\n324.1550495\n294.6981959\n248.3136131\n247.3341395\n242.1802073\n231.26734\n234.3381636\n232.5321732\n268.8971505\n300.7860414\n379.8584023\n385.2570479\n422.7016815\n412.6153636\n330.9458606\n248.9865076\n131.526155\n136.3220574\n133.8142488\n136.8024149\n159.7575166\n192.422906\n342.4470085\n400.042175\n333.515824\n291.0993121\n227.5707686\n232.6765803\n277.0327352\n294.2877592\n292.4108463\n292.1558115\n321.6869991\n359.9337906\n427.8653357\n436.5285186\n443.7329229\n411.3125692\n329.1420895\n232.2323635\n126.118333\n128.3036712\n125.3897899\n128.293651\n152.5973511\n189.5140825\n339.3970869\n374.8423921\n320.0336011\n286.7598863\n228.8334913\n222.9108763\n218.82363\n211.6607656\n208.129426\n206.0876184\n233.8097699\n276.5262259\n361.6685514\n374.899663\n404.9258011\n393.8327742\n313.2579319\n221.3962149\n130.624777\n130.0202659\n125.5175815\n127.9223415\n139.0728088\n176.2742252\n345.1813444\n373.694257\n318.1096487\n286.9345341\n237.2464044\n242.5838847\n245.3337519\n237.2222403\n246.3018775\n249.3884698\n272.7501444\n302.8542888\n378.9053258\n388.8845372\n418.0467718\n406.8725231\n332.7480958\n233.5563184\n136.1614425\n148.7497115\n134.9136768\n136.8343958\n146.7774359\n202.4419571\n290.4964505\n324.0904501\n385.0739867\n331.4930898\n252.7283214\n235.1983853\n230.5578064\n219.1029412\n219.4217103\n219.45793\n246.2562033\n280.2086503\n372.434285\n381.1130141\n404.4330294\n391.0796523\n325.235779\n238.0287301\n134.4986465\n151.0357748\n136.3654418\n138.1171531\n147.905981\n163.7303823\n300.6344769\n311.2215081\n368.0090992\n321.6496881\n267.1486053\n259.3189799\n256.8436453\n237.3328066\n242.6101113\n244.2462414\n261.854003\n283.2304396\n363.8156655\n378.5926288\n408.9449147\n383.1729813\n324.9963841\n239.7760386\n148.245754\n136.3446975\n131.324886\n132.7859703\n142.2220962\n179.0251767\n336.1082084\n375.941454\n320.7455401\n285.4707157\n224.639496\n225.4969947\n237.5115616\n239.8490551\n233.2650928\n232.520293\n260.7967419\n295.8016\n372.4313114\n383.3136656\n418.3533992\n402.2664826\n320.5602965\n227.1409287\n134.4731979\n134.5905737\n129.7714719\n131.3129966\n141.3415275\n178.1901805\n334.0344401\n375.2103238\n323.1586321\n299.2371718\n254.8000585\n262.4903492\n271.8524581\n269.2164731\n266.7819213\n273.6557113\n300.7020123\n332.1167655\n404.1603421\n408.9417203\n433.0742083\n421.7386811\n341.2660315\n242.7310845\n139.7411626\n144.3450818\n140.6037906\n142.7299438\n197.4027829\n156.0134668\n347.4942824\n412.472902\n334.2347798\n317.7975389\n281.1060317\n300.8065549\n302.0838417\n291.8363837\n291.7462742\n292.1268201\n321.6831756\n354.8737288\n407.279714\n413.4117487\n442.442994\n429.916246\n343.533089\n248.7853515\n143.0933866\n148.7948509\n144.2731602\n144.7014792\n181.5451039\n175.77212\n340.9445288\n393.6945128\n343.6074107\n329.1044669\n291.6613845\n303.1754659\n301.5961239\n291.5132875\n291.474247\n291.0559606\n320.7687657\n361.9808947\n426.7165514\n434.1950768\n459.1197715\n434.2241645\n361.571117\n262.317173\n148.0397083\n154.8044552\n150.7983787\n187.5061676\n131.6724575\n204.5780266\n341.6819556\n409.0908365\n347.9442592\n331.6238095\n301.4723956\n302.9855427\n301.5651626\n291.4144688\n291.5283695\n291.377591\n321.5345563\n361.467326\n422.8067545\n428.2386335\n458.8769667\n435.0516544\n353.0718649\n253.9776694\n139.9680682\n159.0059093\n146.6583834\n174.9037577\n145.4535985\n201.7808811\n285.5684597\n343.7758583\n402.905235\n348.0026896\n268.3123489\n247.9319991\n242.0407427\n232.6711685\n232.5006762\n229.2127202\n255.9981745\n290.8864619\n378.8697573\n389.7673137\n412.570712\n405.8524123\n349.5152923\n253.5182403\n136.5015745\n158.6448622\n146.9968474\n150.0017278\n160.6546735\n176.8280214\n310.2269797\n347.3615272\n399.9852609\n342.1740333\n295.4251705\n310.7997771\n314.1466432\n294.4556779\n294.4424362\n295.502745\n324.751119\n337.191406\n401.3743184\n414.3330929\n446.6542404\n416.8034998\n353.6785345\n262.6934639\n149.0989293\n153.0947956\n150.1407529\n144.1174691\n181.3979723\n123.5056797\n199.2941192\n329.3324541\n406.8694007\n370.5945162\n350.7171533\n302.0115182\n303.1205458\n302.0062972\n292.5744959\n293.0013499\n293.5203532\n328.8107719\n367.3841117\n426.5550337\n435.5554706\n460.4081919\n435.9158911\n370.1035681\n270.3899381\n138.4063102\n146.4919138\n144.1327359\n177.5275586\n145.9951844\n194.6018355\n338.0282142\n412.5819697\n370.6442178\n342.4116921\n301.638436\n306.2868667\n305.6594305\n296.7777261\n291.1806127\n282.6538241\n301.9420902\n324.9713298\n395.7113042\n405.8393858\n433.6931009\n421.7563056\n339.1032858\n243.9043283\n138.1712095\n142.4866622\n139.0879807\n188.0087099\n121.5173639\n213.7713183\n319.2894176\n402.7124823\n338.7157203\n277.9572616\n228.9511028\n222.6184542\n219.5866748\n209.1236423\n208.5332956\n206.6723979\n239.4856789\n292.3958523\n365.2314369\n379.797172\n411.2754258\n401.2290119\n321.5039842\n227.6344974\n131.925767\n132.3538823\n128.0706124\n130.4518748\n140.064628\n176.8490262\n337.5016941\n390.0291314\n344.6256317\n328.8424567\n280.7191485\n288.7712821\n301.959116\n292.5275131\n292.4145731\n293.223975\n318.9849701\n350.2479873\n417.5997852\n417.1905192\n439.849332\n426.1897956\n340.698722\n242.8618532\n140.1282387\n143.958627\n139.3692749\n141.0768619\n151.1421039\n210.9638441\n328.4164196\n403.2625303\n355.2175578\n345.0087982\n302.4012459\n302.6855448\n301.4918592\n294.0870759\n294.0555624\n295.2641636\n316.3804209\n356.7810485\n405.6072392\n419.3200161\n439.870364\n429.1703087\n344.8834712\n249.7545632\n149.0554508\n164.5712923\n152.4519785\n155.4782745\n166.2915017\n182.0372866\n305.3917131\n350.0591777\n407.201652\n342.0809969\n272.5707569\n259.6152333\n258.0208125\n253.7900608\n277.4460037\n291.5209392\n303.7657506\n319.5069805\n379.9102575\n394.0570268\n429.0022567\n403.9898267\n345.4623505\n257.3894713\n144.595762\n158.3986995\n146.5083305\n149.6371485\n160.3537589\n176.1251827\n302.7968091\n343.446944\n396.3609205\n339.918387\n278.1730731\n258.0629151\n243.7339493\n217.0396767\n218.9459228\n216.4181442\n247.1641624\n284.0206723\n358.5536287\n378.0931986\n409.3386012\n384.5822338\n324.9798228\n240.5228325\n136.0853117\n136.222347\n131.8459256\n133.5135565\n143.078582\n180.3030363\n342.3547185\n374.9503596\n321.793459\n284.0215511\n221.7715771\n216.1001997\n211.4779174\n202.7453425\n202.3557141\n201.1602817\n237.1642827\n286.2253912\n360.06247\n377.4684161\n409.4625968\n405.9813022\n322.590519\n230.129071\n132.3051122\n134.4922024\n131.4592269\n134.5817173\n176.1913885\n174.1875852\n342.6054944\n411.9064226\n347.1700602\n320.7202628\n296.3246699\n307.5416286\n306.6077322\n297.717084\n297.6087511\n297.5990063\n335.7446883\n378.6924901\n430.9204057\n437.6872709\n462.0571877\n437.1754725\n372.242416\n306.1656971\n142.7285871\n147.8046106\n176.1084254\n181.4177652\n141.5277469\n194.0025854\n345.1554236\n407.6954097\n347.0073137\n320.928335\n262.5272003\n274.0845727\n279.8874782\n263.8980419\n256.9979474\n243.8395481\n267.9424438\n314.3504569\n387.7326206\n400.6472682\n428.1219447\n414.5206265\n332.575622\n237.2061484\n138.3279602\n139.618784\n135.0162066\n136.3320235\n145.7985163\n214.2132871\n324.3391785\n380.4762946\n323.5627437\n287.0342919\n227.3815361\n241.0482298\n252.0131821\n240.5936223\n228.525273\n220.7310873\n249.5899147\n294.090755\n364.5543937\n378.6250483\n409.1662932\n398.3909584\n321.2820965\n231.608747\n135.2327591\n136.5197938\n132.4914425\n134.6041766\n145.0651849\n182.1290193\n345.2734626\n382.8846887\n326.311105\n288.2520105\n225.2183066\n213.9719461\n215.6691747\n204.8175148\n201.1633412\n199.5781749\n237.8804123\n297.2416985\n394.0062327\n433.8077842\n460.9301359\n435.0032139\n370.2117289\n304.5134211\n135.7834487\n146.2524799\n133.6080321\n175.787076\n164.3757144\n158.4172778\n317.8465035\n376.1866082\n415.8796539\n369.8372593\n315.9871443\n308.001169\n307.0134803\n297.7516668\n298.0855676\n296.8476282\n312.6862535\n317.6699168\n390.6418298\n397.1825189\n417.9034357\n408.9388713\n350.1384378\n254.6038035\n152.20274\n162.57139\n148.2957519\n149.6359796\n159.4253256\n174.6664265\n307.6468599\n330.483306\n398.0063102\n340.2545139\n273.3243552\n271.5488613\n279.8973599\n262.4284668\n262.6229835\n254.7075088\n270.6845545\n299.7753839\n372.6285329\n390.8895838\n421.1858148\n394.1498904\n333.1687908\n246.4241328\n138.2429293\n138.6891903\n133.6850884\n135.1215491\n144.5369296\n181.1606033\n337.4632062\n375.7934315\n350.5338499\n331.3052206\n280.2660938\n278.681846\n278.1002101\n270.9552428\n268.4045316\n253.4970625\n271.3395719\n306.4125611\n373.8583588\n389.8498534\n413.6320438\n399.4504924\n322.2308544\n231.1962498\n130.9782066\n141.6896244\n134.2432025\n134.794878\n144.4962747\n181.1132862\n329.3076906\n365.3015262\n310.8765823\n280.3419107\n220.3362503\n209.4882048\n203.4813868\n191.984689\n192.2518622\n190.1336817\n228.219781\n271.5601519\n342.3122648\n356.4356655\n384.7264341\n373.5646765\n303.155391\n214.9622733\n125.093261\n133.0123225\n124.5190601\n124.3425451\n132.7829304\n169.1765067\n330.2776423\n342.4809476\n304.0461874\n272.5037983\n207.5241565\n203.6276682\n198.6734201\n186.9513156\n185.6728544\n184.6044678\n223.2294776\n266.752155\n337.022307\n353.4949833\n383.627974\n368.9201268\n292.8498912\n208.7318729\n135.0708334\n140.3859577\n132.7853334\n132.3610064\n141.0546582\n155.9912589\n282.3051845\n297.4703929\n357.5377647\n302.4454326\n237.0905848\n219.7850866\n212.5688488\n189.8165098\n188.9806083\n189.103902\n227.9119974\n274.002615\n341.9669474\n359.0817714\n390.3608093\n364.9107632\n312.5837593\n232.5708736\n126.8924762\n127.2107013\n123.4612775\n126.5237484\n137.6800608\n174.7131512\n329.2093481\n382.0463207\n326.8024563\n287.7001044\n234.4334201\n237.1966435\n233.0293653\n223.0925394\n224.3355191\n215.4145905\n247.1122807\n290.4186355\n361.4117277\n375.0000126\n404.235273\n393.5287053\n316.054811\n223.7394385\n133.321112\n141.4392483\n127.4746662\n129.6845203\n139.629454\n155.3176367\n295.0743864\n297.0515493\n375.3668248\n330.6947365\n259.9272364\n247.3318539\n237.3841883\n219.2895935\n218.8432158\n216.171994\n247.0219254\n273.2248106\n346.9609795\n353.5701331\n374.063072\n366.1575037\n310.4071183\n221.3281858\n141.8984747\n142.8323445\n125.6816506\n126.0018029\n134.1761969\n148.6824098\n240.6581063\n271.4783973\n340.9362492\n323.6091157\n286.4318949\n285.1797569\n268.9829267\n243.2247355\n232.9183932\n218.3748956\n239.1581621\n261.0501908\n329.3649313\n343.4093715\n368.7136086\n335.9104751\n283.6051709\n205.4708943\n147.0250612\n133.9080645\n123.1519051\n121.6648303\n129.6898248\n165.684677\n290.8083108\n361.8882783\n290.6281457\n269.159549\n229.1236918\n227.6615544\n218.8574156\n196.0926956\n191.9688444\n187.4575148\n223.2100578\n266.2173991\n336.6312539\n348.3614833\n379.6862637\n368.751521\n294.5920816\n208.0040231\n121.8892294\n116.1153582\n113.7816321\n122.8126473\n132.1747921\n168.6877013\n324.1933324\n353.8007703\n300.3323321\n266.7021911\n205.6899721\n199.358307\n195.1648948\n185.0404236\n185.8577141\n184.420153\n224.1082254\n267.5542681\n335.2957211\n351.080959\n381.0449851\n375.4382587\n297.6274443\n208.191736\n126.2294969\n121.8940327\n115.5512998\n116.3978862\n125.6208731\n162.0024351\n329.1094233\n343.6414228\n305.2022696\n278.1951214\n219.6582557\n212.4552173\n213.956179\n203.9823918\n200.9453996\n196.2511406\n232.117386\n276.2674204\n348.5041471\n362.8981478\n391.5086444\n379.776072\n304.1293041\n217.4697891\n125.8125188\n130.8229324\n124.3488277\n125.0101603\n134.2093537\n170.5707705\n319.6649263\n369.6041512\n312.7759969\n284.6741378\n227.8511416\n219.6938501\n212.2388291\n203.1553008\n199.3952019\n195.599466\n233.4523165\n278.4758906\n350.7386184\n366.0983924\n395.7853276\n390.5680857\n309.8116834\n219.2100451\n129.8027624\n128.9470161\n124.1633176\n126.0588223\n136.5661406\n173.9797588\n334.5127366\n378.5820117\n321.389086\n277.1441107\n214.5940063\n206.7117478\n203.0732835\n193.2786691\n192.7508175\n192.794429\n232.8421168\n280.6945387\n354.2597655\n366.6164622\n397.1095237\n387.0114426\n311.9375861\n212.4439074\n128.0124124\n135.0174315\n121.0416134\n123.8564999\n134.5517704\n150.8306103\n288.3796783\n301.4625298\n364.2022043\n316.3694709\n242.5080296\n227.4051201\n222.591039\n211.4882958\n210.5059635\n207.1434558\n242.3731817\n276.8382131\n354.4722231\n362.2423295\n384.0861143\n377.621058\n320.7596566\n230.8655808\n143.9199324\n150.2897706\n134.4810515\n135.9307725\n145.6135361\n161.0604976\n290.7503995\n307.8373344\n368.7252434\n316.9567227\n256.8035988\n249.5990105\n237.7089164\n208.4488089\n204.0370087\n199.479483\n235.9355905\n271.9973184\n345.3806554\n362.4261915\n396.5684651\n368.8008052\n311.7069396\n229.2666088\n133.0984998\n130.4517685\n124.3454682\n125.2027328\n134.4962707\n171.4716278\n319.3010678\n355.9921571\n318.7285403\n286.7589003\n247.4413373\n248.1579429\n246.1292689\n236.320156\n227.758947\n216.3500473\n246.8372388\n283.9050259\n351.1317692\n366.6598344\n397.114168\n382.8938184\n309.4192927\n222.4279194\n125.5962801\n121.8664931\n116.292245\n117.8265273\n127.8721563\n163.6798572\n309.5000313\n356.142772\n308.3405376\n274.7975806\n211.096707\n202.1794511\n198.2337718\n187.9717625\n184.9122491\n183.5342546\n224.0778028\n268.2430117\n338.4148824\n354.1487694\n384.0601451\n373.4067999\n301.4265901\n214.7310851\n128.1510235\n124.6125606\n118.4250116\n119.7407549\n129.4308641\n166.1506128\n322.1043698\n358.2120369\n305.1397748\n267.7383482\n206.1055318\n198.5878555\n193.307287\n182.8787887\n179.9903125\n176.9319415\n215.3994456\n257.5786248\n327.0771032\n340.1449898\n366.7400284\n350.144014\n278.4060044\n198.6522861\n127.7860454\n118.2193259\n109.2331926\n108.6895214\n116.2998653\n150.3983613\n272.2664326\n351.9955866\n284.3051824\n254.0545729\n219.7151487\n219.9566491\n199.3916631\n180.7368172\n190.365756\n192.3768978\n224.2854559\n251.8573742\n320.2302309\n331.9434287\n366.1193613\n357.3792903\n276.9336664\n189.0247518\n137.0512092\n124.2184428\n113.6593817\n112.0255609\n120.317024\n156.4373373\n282.7533967\n360.9830857\n296.8444744\n270.8307284\n240.6207502\n270.2531255\n259.6466593\n238.9405425\n231.5029703\n211.4532266\n235.9237336\n270.0190249\n337.3997647\n346.9376554\n377.5812322\n367.1973171\n300.4486381\n217.752625\n131.7331105\n132.6882237\n115.9910017\n117.1241107\n126.6773654\n141.5603895\n230.6086833\n351.78126\n369.7419058\n314.3961371\n237.9174679\n215.8224057\n207.367059\n192.7126916\n191.8001291\n192.8266459\n231.0301574\n260.8903523\n333.5839043\n325.3724357\n329.962666\n324.2210799\n277.4412973\n191.8508951\n145.6420133\n140.6025069\n119.9923181\n118.0348244\n125.5658604\n139.6014534\n220.0320458\n289.8004908\n351.9653335\n290.6278543\n235.8359844\n231.5037747\n224.7813824\n206.8885895\n206.4324256\n208.1980872\n221.4240412\n251.8737458\n323.4925734\n338.922646\n367.782294\n340.658977\n286.4099629\n199.6990557\n137.5817028\n122.7957467\n111.3280786\n109.2477486\n116.7741388\n152.2881483\n278.0491805\n352.9467081\n295.9358904\n273.2755472\n223.1351211\n226.5234092\n230.1196473\n221.0118717\n213.1862861\n199.0017445\n223.2223236\n269.5113109\n340.5158654\n346.3677259\n378.0010046\n367.3526696\n281.2650976\n189.510244\n136.4161092\n122.6465943\n111.5131565\n110.1715852\n118.0404614\n154.3477492\n280.9585374\n355.4611442\n290.5909775\n261.4716518\n200.3970045\n186.3718463\n181.8408344\n170.1891281\n167.8163777\n167.9320194\n225.1824212\n260.3224164\n330.990018\n339.4713957\n402.6432824\n406.1349719\n311.2775931\n215.1327786\n125.72236\n117.9645778\n110.0905142\n110.6830758\n119.4297567\n154.6904684\n277.0960803\n405.0655793\n315.4816288\n268.9264882\n205.1375338\n197.4762246\n190.182206\n175.5768668\n173.1559511\n173.1125728\n213.6230536\n257.0789293\n326.8048913\n343.7772097\n374.8133099\n362.1976768\n299.0152968\n209.8996766\n120.4288305\n114.4325402\n111.1537576\n118.0060996\n125.9890158\n162.1118096\n313.062592\n353.3798234\n298.5501983\n265.4189311\n204.0044016\n195.0497416\n190.7042065\n180.9495658\n181.7629043\n192.2964633\n226.3192636\n276.2661947\n349.7850483\n362.720104\n394.2361124\n388.9512702\n311.1927523\n218.6353189\n124.2253431\n124.7400208\n121.8880331\n124.8036455\n135.139331\n171.8103277\n340.5286297\n377.0151988\n322.8944471\n288.4427925\n226.902012\n227.4044353\n234.4751371\n229.1911022\n223.2882828\n211.6575109\n241.3940647\n285.0831875\n357.5944488\n368.7680052\n398.9942334\n386.4177659\n310.2163053\n220.8561414\n133.9234977\n140.5093976\n125.5847797\n127.0658272\n136.0339653\n151.665241\n281.5360857\n301.2666338\n369.217184\n340.0084545\n280.8081275\n263.6952056\n263.4318861\n253.2777817\n252.1862764\n247.8839172\n266.4978573\n290.1871442\n364.5102621\n369.5227044\n391.3343795\n382.7016955\n336.2733507\n237.112383\n149.0921966\n154.5707214\n138.6199492\n139.3828533\n148.4821172\n163.7810575\n283.3712878\n310.8299943\n370.2934023\n327.5405118\n280.1057742\n267.7872486\n272.9424555\n240.4247853\n228.3025886\n219.4373325\n248.5489202\n277.1070885\n346.7231114\n361.3236636\n392.9432571\n372.8182215\n317.3757503\n237.1630425\n127.1930758\n123.2258435\n117.5873124\n119.213254\n128.4585121\n164.0568989\n309.6123439\n360.0975901\n307.7712356\n273.2817139\n211.4210187\n201.8029284\n196.5792486\n184.3113893\n179.7022599\n177.0821887\n219.0077204\n262.2985498\n334.152633\n353.0027201\n385.4643777\n369.3005346\n294.175096\n212.0481393\n128.2582992\n125.8765593\n118.797109\n119.3817891\n128.9116646\n165.1457378\n320.9953248\n362.2958861\n302.2371425\n267.7725366\n205.623465\n198.6582611\n195.2071857\n184.6962503\n182.5410612\n181.1433037\n222.9894511\n267.6162062\n339.1064845\n352.1379771\n383.1541649\n371.8347265\n298.8186339\n214.6174917\n127.9181446\n124.054491\n117.8905601\n119.0311563\n128.2372751\n164.3761486\n314.790754\n356.4654423\n301.3185024\n266.5198996\n204.1734322\n197.1453699\n194.4315162\n185.6425156\n183.8628603\n182.3227033\n222.1853632\n268.2955049\n338.7159082\n352.8095298\n382.703043\n377.4513249\n301.5065787\n211.5110198\n126.3044713\n123.2098369\n117.9647646\n119.9346159\n129.785673\n166.6246153\n314.1224852\n387.1637026\n314.9874608\n271.9892595\n208.2515933\n202.0692207\n199.9596891\n191.3573146\n192.6473564\n193.2112388\n233.7541757\n274.4693416\n340.5920407\n357.3399858\n388.0333093\n373.6495041\n299.6597773\n212.9767583\n126.3153717\n122.954449\n117.4731604\n118.868483\n128.6354208\n164.8186711\n309.7728127\n356.3510562\n300.8467885\n273.7674944\n213.2311133\n207.2904353\n204.3875459\n197.3923287\n197.9697246\n193.2657505\n228.5444685\n266.0303077\n333.9910926\n347.9312537\n378.9327261\n368.2761941\n297.4160143\n212.8767232\n126.6591037\n128.1724749\n111.3788487\n112.1159586\n120.9234483\n136.0566155\n225.1539504\n345.0169601\n376.6326999\n327.0519442\n246.9381792\n230.1018588\n231.0781346\n221.5260742\n222.4477452\n214.7567808\n243.8189971\n274.1334336\n350.7085807\n356.2369181\n376.7598834\n371.592911\n316.2848559\n229.7391414\n145.9861354\n150.3274089\n134.4707524\n135.3875552\n144.3124698\n159.2021627\n276.6386941\n309.8121046\n373.8656044\n337.4402291\n285.0147239\n280.0621669\n276.6675628\n257.0614189\n246.3039946\n230.7598866\n255.8026343\n282.0266985\n351.9385968\n375.3103291\n400.4396361\n374.774256\n320.9190913\n239.3139917\n148.4529555\n155.5143417\n140.6212469\n142.3996941\n152.6354538\n168.4064546\n299.5984282\n336.9378722\n380.7493877\n312.8960369\n246.7786463\n233.4234707\n226.7240598\n208.5011907\n193.193798\n197.1813604\n235.5415693\n269.6254189\n341.6056741\n355.6715218\n383.7918227\n361.0996017\n306.272391\n224.6911387\n134.1451838\n128.6771621\n121.6567561\n121.2183202\n129.811066\n165.3848631\n317.3189224\n309.0449412\n271.4370364\n257.1744821\n217.9273527\n227.6402137\n239.3022504\n241.791069\n233.6359894\n220.8388898\n230.3181358\n274.3504933\n344.1101764\n350.7304319\n382.3063108\n371.7002408\n287.1190509\n195.9648881\n141.5078858\n127.0578779\n115.5489718\n113.4414011\n120.5876616\n155.8810844\n282.0322143\n359.1350554\n295.1788594\n269.9154793\n221.4268135\n223.8847948\n226.5141344\n216.6896783\n209.462591\n193.2265413\n222.910191\n272.2830072\n344.0421655\n350.8406315\n382.2245854\n371.8181733\n287.0528198\n195.3448678\n141.548587\n127.2594069\n115.6964696\n113.3055501\n120.7975271\n156.7579992\n282.3966582\n359.2952248\n294.8135426\n268.7747219\n217.1572181\n214.590908\n211.1323458\n216.6439291\n217.104537\n187.1543713\n218.4708532\n267.4412286\n339.3768947\n346.7456353\n379.3580591\n367.7785553\n282.1329995\n189.7474391\n136.075293\n122.8528353\n112.1072284\n110.3277699\n118.4273664\n154.2910823\n280.6092548\n357.1208796\n293.0204211\n267.1876325\n217.8746555\n220.1146418\n223.7841488\n242.3440951\n229.5920942\n208.6638108\n235.1293997\n261.7859716\n322.5952367\n331.6476802\n373.1303953\n388.6937426\n318.7618092\n212.6215285\n132.8783621\n131.7368286\n112.8739921\n112.1602436\n120.7620377\n135.6270395\n224.345663\n316.5306649\n382.4805954\n353.5525378\n286.9989585\n265.9278139\n260.0965177\n245.4889152\n243.5211541\n235.2447602\n252.0157292\n279.6890905\n356.1013287\n362.5476389\n381.1131452\n377.6594291\n320.4605484\n229.9785806\n138.4982424\n142.4884046\n127.0395079\n128.6585891\n159.5056564\n170.2520702\n285.6974736\n314.0970301\n364.4282456\n309.9590995\n252.3435616\n241.9927125\n232.7428731\n215.7117725\n215.4603366\n210.9969736\n239.4515203\n266.9633219\n335.6164448\n349.5370964\n378.1382471\n355.8221342\n296.9441734\n214.3529583"
  },
  {
    "path": "src/pymgrid/data/load/RefBldgLargeOfficeNew2004_v1.3_7.1_5A_USA_IL_CHICAGO-OHARE.csv",
    "content": "Electricity:Facility [kW](Hourly)\n259.5994047\n254.9422169\n259.2125219\n254.9498296\n271.4424828\n291.6203295\n344.7845507\n322.2421466\n317.9351637\n276.94954\n232.2942368\n228.0401559\n232.2662149\n228.0199412\n232.2298104\n228.0062132\n323.8808254\n364.8792133\n369.1616801\n340.4861823\n346.480453\n317.5687737\n297.8285541\n268.7398949\n311.0618492\n306.3809705\n311.1240833\n306.4254368\n323.3813646\n368.0434289\n431.5481955\n516.2074327\n1053.540619\n1014.946697\n964.9972808\n964.4292017\n914.1750608\n963.5501266\n963.4153792\n963.4543642\n1055.123382\n950.86865\n751.6148668\n727.166011\n577.6894554\n553.1536711\n349.3569381\n299.992179\n287.7699824\n287.7699824\n289.7004496\n289.3154446\n301.9257744\n350.9054012\n428.2393602\n509.482735\n1048.670372\n1011.858038\n962.8811242\n962.8405962\n913.0077851\n962.7377781\n962.6910859\n962.6796406\n1054.266419\n949.9364175\n750.6277116\n726.2003692\n576.8023843\n552.3823696\n349.3569398\n299.9921804\n287.769984\n287.7699841\n287.7699844\n287.7699842\n301.1503997\n351.2904512\n427.9569492\n509.1222121\n1048.482367\n1011.895757\n962.9785445\n962.9038736\n913.0568989\n963.2448444\n962.7442347\n962.7568188\n1054.501823\n950.3846074\n751.269862\n727.0026012\n577.7602871\n553.5919157\n349.3569411\n299.9921819\n289.7029281\n289.320647\n289.7193189\n304.6754992\n321.1627222\n366.32651\n428.5224174\n513.497888\n1052.471728\n1015.160055\n965.5764727\n965.8399753\n916.3575218\n966.1774958\n964.9833779\n963.7202758\n1055.526321\n951.5631376\n752.5877409\n728.5151853\n579.5036691\n555.359684\n349.3569424\n301.5402292\n289.7124757\n289.3455098\n300.4690873\n308.5606183\n317.3577172\n370.2278788\n428.5828244\n514.5071878\n1052.096156\n1013.849036\n964.0378715\n963.6940877\n914.0858042\n964.2142091\n963.0369131\n962.9412877\n1045.998924\n950.2738971\n751.0290555\n726.6440682\n577.231234\n552.8469548\n349.3569439\n299.992185\n237.9292618\n239.8605186\n239.4762096\n239.8655992\n251.7010065\n276.5371332\n427.9218751\n409.6374308\n649.9567547\n613.0918804\n564.0550324\n563.9587664\n563.9371931\n563.9021886\n314.8822524\n314.9264605\n398.0145126\n377.0699502\n347.9300494\n323.4856535\n323.4856536\n299.0422658\n274.5958551\n250.1514593\n237.9287588\n237.9287588\n239.0865988\n239.8606083\n251.6976195\n276.5321745\n325.0327236\n307.1474915\n298.2159629\n261.9373907\n212.6595298\n213.0479719\n212.6600672\n213.050459\n212.6627843\n213.0559821\n295.7340576\n349.8890865\n357.1756627\n340.8232553\n344.2931006\n316.4453108\n295.4628502\n267.6118201\n308.6869477\n305.2736909\n309.7780431\n306.8311184\n322.897662\n368.4804718\n429.7887411\n516.7804901\n1054.697878\n1015.897229\n965.6363591\n964.5532114\n914.1603925\n963.5860029\n963.4870778\n963.5981093\n1046.757276\n951.1351306\n751.9403712\n727.6425327\n578.4356745\n554.2492657\n349.3569485\n301.1510939\n289.7091608\n289.3259471\n301.2342419\n308.5368953\n317.3438682\n370.1795383\n428.6979831\n512.8074765\n1051.530562\n1014.070507\n964.4015112\n964.8044982\n914.8687254\n965.0960303\n963.8954175\n963.482398\n1046.663108\n951.1244462\n751.9397729\n727.8757959\n579.3612776\n556.0722545\n349.3569496\n301.9271964\n289.3260356\n301.248049\n308.556895\n305.1689466\n320.8679143\n366.8420861\n428.8732507\n516.3353606\n1055.424937\n1017.548049\n966.6842815\n965.9117692\n915.5695754\n964.8107559\n964.6143037\n964.4586981\n1047.181711\n951.1906255\n751.7553605\n727.2060761\n577.8766945\n553.9224991\n349.3569508\n300.7654386\n289.3186071\n289.7174608\n297.0061899\n305.0905869\n320.7842598\n366.739019\n428.6918189\n513.0936296\n1052.210135\n1015.315736\n966.0740737\n965.423429\n915.2755029\n964.6711984\n964.2482975\n964.2703727\n1047.555015\n951.9204225\n752.6669935\n728.271114\n579.0539803\n555.0180229\n349.3569521\n301.1529673\n289.7146807\n289.3304969\n298.18069\n304.7298786\n321.2265978\n366.3591409\n428.6097231\n514.0614485\n1051.807134\n1013.998422\n964.0444406\n963.7260565\n914.2887571\n963.8218464\n962.8611028\n962.8322717\n1045.827289\n950.0544777\n750.7572228\n726.2786095\n576.7719234\n552.3301061\n349.3569538\n299.9921944\n237.9292706\n237.9292707\n237.929271\n237.9292706\n250.1514683\n274.5973811\n427.4272514\n409.0386784\n649.4535035\n612.7407216\n564.1771968\n564.5280232\n565.7548252\n564.9561983\n315.206337\n314.7202042\n397.8701476\n377.0102687\n347.9300624\n323.4856665\n323.4856664\n299.0422823\n274.5958644\n251.3083206\n239.4729559\n239.8610006\n239.477664\n239.8656868\n251.7040871\n276.5380943\n325.0428852\n307.1529723\n298.2195457\n261.9355547\n212.6648445\n213.0494181\n212.6669871\n213.0512243\n212.6658769\n213.0505514\n287.1950756\n360.6015861\n364.0648649\n344.6217025\n340.4254815\n320.2066089\n291.5687216\n271.3574262\n254.9308133\n259.1553688\n254.9582044\n259.1858886\n267.2004954\n295.8724432\n340.5534836\n326.4970889\n313.717822\n281.2358627\n228.0894208\n232.2807482\n228.0445601\n220.7502067\n225.7245881\n232.2533752\n302.5615476\n369.0829994\n364.8610591\n344.6346588\n340.4165338\n320.1999037\n291.5367136\n271.3254244\n304.7279719\n308.9625533\n304.7541541\n308.9838579\n316.9921746\n370.5846294\n429.8354984\n510.6697233\n1049.691524\n1012.854179\n963.9507417\n963.7701008\n913.9173443\n963.5112744\n963.4102656\n963.5928624\n1038.533156\n951.8184331\n753.1786488\n729.2712087\n580.3740965\n556.5101601\n349.3569582\n301.5421428\n301.2197512\n308.5638876\n305.1448924\n308.6866258\n318.2772757\n371.7978924\n429.1632472\n516.6280684\n1055.602739\n1018.739666\n969.7554536\n969.2338023\n917.6926036\n966.6625091\n965.6067523\n964.8831837\n1039.852769\n954.0683388\n756.7082468\n733.313642\n583.960772\n559.5836919\n350.3236455\n309.2250615\n305.0950371\n308.6289822\n305.2034528\n308.7405054\n318.6146371\n372.2732544\n429.0839727\n516.5989693\n1055.556491\n1018.488494\n966.9723507\n965.5006251\n915.6529814\n965.4322372\n964.4516829\n963.6410542\n1038.194449\n951.1453122\n751.9678839\n727.6652462\n578.2359654\n553.7739615\n349.35696\n300.3788071\n289.7031172\n289.3230818\n289.712843\n289.3341967\n301.9418725\n364.7247119\n428.2632542\n509.817145\n1048.987084\n1012.085666\n962.9471882\n962.8519569\n913.0309954\n962.8416331\n962.8742858\n962.8984895\n1037.419529\n950.2199226\n750.9596354\n726.5951317\n577.2131342\n552.8858929\n349.3569615\n299.9922018\n237.9292779\n239.861657\n239.4772899\n239.8680757\n251.7049026\n276.5473475\n428.1295594\n410.4617166\n650.512545\n613.3922394\n564.2339595\n564.1424315\n564.1186942\n564.0593558\n315.0167079\n315.0690186\n389.6253148\n377.2544598\n347.9300724\n323.4856768\n323.485677\n299.0422953\n275.3676288\n251.6961276\n239.8626497\n239.4770587\n239.8669805\n239.4798683\n252.0936367\n276.151912\n325.432968\n306.7677003\n298.6169748\n261.5539848\n213.0584342\n212.6663885\n217.6600321\n227.9911407\n232.2216006\n228.0106809\n306.8302142\n365.2281928\n371.1186655\n342.0649188\n346.882324\n317.7694509\n298.2045096\n269.0297989\n311.54975\n306.7605112\n311.6950005\n306.843092\n323.9930371\n368.4824158\n430.9867187\n517.6694407\n1056.151964\n1019.073192\n969.9913064\n969.8791255\n919.9381166\n968.5992391\n967.2095489\n966.2867286\n1041.287931\n954.6743695\n756.0164784\n732.3808477\n583.2986749\n558.8710126\n350.1306972\n301.5460849\n308.1558068\n304.7260517\n309.0299261\n304.7889749\n321.336155\n367.4599431\n429.1027171\n516.4574584\n1055.499024\n1017.863819\n968.4536449\n967.8194676\n917.2030381\n966.375799\n966.0897037\n965.7687833\n1031.504121\n952.6512377\n753.271821\n728.8821064\n579.5060147\n555.312617\n349.3569649\n301.5416971\n289.7123998\n291.6403945\n308.9109673\n304.7173285\n321.1786099\n366.3569508\n428.6569442\n511.7444534\n1050.200776\n1012.884082\n963.6898522\n963.4864269\n913.4649489\n963.114324\n963.024287\n963.0119531\n1029.008808\n950.3851238\n751.0863285\n726.5382167\n577.0326928\n552.5869613\n349.3569657\n299.9922061\n287.7700092\n287.7700094\n287.7700092\n288.1562911\n301.5365636\n350.903103\n427.7864619\n500.4204225\n1048.312345\n1011.570295\n962.6443652\n962.5957424\n912.7647833\n962.5606366\n962.5397708\n962.5364881\n1028.530459\n949.883382\n750.5660467\n726.1335596\n576.670129\n552.2421335\n349.3569661\n299.992207\n287.7700103\n287.77001\n287.7700098\n287.77001\n299.9922079\n349.3584911\n427.2649827\n500.0669413\n1048.123891\n1011.42588\n982.6396434\n989.5058296\n947.4634393\n969.3150261\n962.4735319\n962.4743876\n1028.457758\n949.7976426\n750.4727801\n747.5741803\n604.7659837\n552.1044524\n349.3569668\n299.9922079\n237.9292835\n237.9292833\n237.9292837\n237.9292836\n250.1514812\n274.5974017\n427.230501\n400.3853242\n649.4920438\n612.8092832\n563.8939361\n563.8983806\n563.8782623\n563.8376007\n314.7489973\n314.7568989\n380.8516643\n377.1031315\n347.93008\n323.4856844\n323.4856847\n299.0423052\n274.595877\n252.0825486\n239.4751297\n239.8640472\n239.4777884\n239.8677204\n251.7025337\n276.5392281\n325.0379365\n298.6115358\n298.2197988\n261.9391197\n212.6571723\n213.043445\n212.6561403\n213.0431738\n212.6555982\n213.0425932\n278.6341668\n349.8653867\n349.4794363\n325.425285\n325.0378401\n300.9856023\n276.1513813\n252.0993783\n289.3276781\n289.7212587\n289.3326443\n289.7313401\n301.5611982\n351.3293274\n428.3674559\n501.0691627\n1048.765682\n1011.875036\n962.8587698\n962.8037524\n912.9730795\n962.7414436\n962.6979547\n962.763549\n1028.800873\n950.1880288\n750.9180825\n726.5292929\n577.1418683\n552.8583634\n349.356969\n299.9922096\n288.1562121\n289.7022666\n289.3206293\n289.710764\n301.5553593\n351.3112665\n428.1356029\n502.6041183\n1049.992619\n1012.730891\n963.5808252\n964.7375099\n915.1371711\n964.4532846\n963.0957686\n962.8807003\n1020.303088\n950.1611828\n750.8537505\n726.4384338\n576.9823465\n552.6409384\n349.3569692\n299.9922103\n287.7700127\n289.7014076\n289.318949\n289.7156418\n301.5532434\n358.2209975\n428.1412898\n502.9610317\n1050.490369\n1013.291417\n963.7796778\n964.050932\n913.6128517\n962.9752073\n962.9906527\n962.9648835\n1020.424599\n950.4723496\n751.3275701\n727.0230317\n577.8736729\n553.9192562\n349.3569696\n301.1512262\n289.321871\n289.713905\n289.3410885\n293.5693733\n320.7719484\n366.7245423\n428.4427549\n504.8550539\n1051.81444\n1014.444953\n965.0875383\n965.6258585\n916.326893\n966.340042\n965.1782431\n963.5781474\n1020.489206\n950.4638727\n751.2887563\n726.9924679\n577.6791118\n553.4345608\n349.35697\n299.9922111\n289.7021024\n289.319483\n289.7153818\n289.3278144\n301.9514466\n350.9256468\n428.0530723\n501.7412896\n1049.427321\n1012.422349\n963.1670275\n962.9125364\n913.007018\n962.7404277\n962.6727106\n962.6853439\n1020.121422\n949.9988076\n750.6959691\n726.294367\n576.8494128\n552.4494808\n349.3569704\n299.9922115\n237.9292872\n238.3156069\n239.8612199\n239.4773624\n252.087852\n276.1498694\n427.8705757\n401.1897842\n650.1007695\n613.3007056\n564.3090488\n564.2051344\n564.1307699\n564.031222\n314.8539644\n314.895579\n372.4427545\n377.1993758\n347.930085\n323.4856894\n323.4856897\n299.0423118\n274.9817583\n252.081316\n239.4752298\n239.8634923\n239.4801365\n239.8690995\n251.7096854\n276.5418239\n316.5046528\n298.615428\n298.2341923\n261.9487918\n212.6766428\n213.0595813\n212.6726235\n213.0585338\n212.6735177\n213.0588384\n270.1085568\n349.8825073\n349.4994904\n325.4451208\n325.0670229\n312.5140152\n295.3694211\n267.4850634\n308.564419\n305.1136173\n308.5978479\n305.1659336\n320.8882799\n366.7955889\n420.7298143\n503.2513608\n1050.631594\n1013.833708\n964.6007606\n964.2764574\n914.7108477\n964.7136552\n963.8791594\n963.4176409\n1021.156284\n951.2501297\n752.2274514\n728.1492523\n579.0771922\n554.8397452\n349.3569717\n301.151134\n289.7099705\n289.3269695\n289.7309124\n308.5078227\n317.3200883\n370.1473782\n419.99585\n503.0497194\n1050.705161\n1013.76231\n964.5729071\n964.2879616\n914.8440084\n965.0340419\n964.307374\n963.1969833\n1020.570243\n950.5581347\n751.3940511\n727.0990121\n577.8929461\n553.7544444\n349.356972\n300.3785625\n289.7030773\n289.3249365\n289.7152041\n289.339824\n317.2868689\n370.131354\n419.8608719\n502.9173676\n1050.275751\n1013.030299\n963.7987962\n964.8749327\n915.826314\n966.1053817\n965.2309897\n963.3739253\n1011.591318\n950.1186523\n750.8894282\n726.5473908\n577.1730678\n552.8468225\n349.3569724\n299.992213\n287.7700156\n289.3141404\n289.7037877\n289.3221711\n301.9327605\n350.9192166\n419.4118289\n501.7902506\n1049.42059\n1012.264351\n963.106771\n963.5808646\n913.2091929\n962.6539477\n962.5652556\n962.5324706\n1011.465273\n949.9664073\n750.7492191\n726.3536629\n576.8948091\n552.4400113\n349.3569724\n299.9922134\n287.770016\n287.7700157\n287.7700156\n287.7700159\n301.1500513\n351.2899118\n419.037699\n500.3423057\n1048.433797\n1011.625162\n963.5007106\n963.7498514\n914.7976046\n965.0474325\n965.7909552\n964.2072714\n1011.417067\n949.782511\n750.4778216\n726.0719753\n576.6535412\n552.2481906\n349.3569726\n299.9922137\n237.9292887\n237.9292886\n237.929289\n237.9292888\n252.0812252\n276.1432756\n419.0415847\n400.9703559\n649.9367362\n612.9475668\n563.8879115\n563.856964\n564.0274008\n564.554751\n314.6402779\n314.6627213\n363.5987327\n376.8931699\n347.9300877\n323.4856916\n323.4856917\n299.0423148\n274.5958822\n250.1514864\n237.9287796\n237.9287796\n237.9287797\n237.9287796\n250.9224253\n276.1404879\n316.4849233\n298.594562\n297.8234196\n261.1560583\n211.1111752\n211.1121934\n211.112194\n211.1137213\n211.1121937\n211.1111752\n259.9999665\n349.0847421\n349.8566792\n325.0272039\n325.4147841\n300.586959\n276.5296436\n251.699101\n289.7065324\n289.3192222\n289.7083514\n289.3211612\n301.9349021\n350.9131381\n410.7166485\n500.4752668\n1048.383112\n1011.633532\n962.6536311\n962.603996\n912.7882519\n962.5805604\n962.5419594\n962.5309526\n1011.443464\n949.8955539\n750.5762989\n726.1295184\n576.6448563\n552.2073392\n349.3569729\n299.9922136\n287.7700161\n287.7700161\n287.7700158\n287.770016\n299.992214\n350.5165974\n410.482658\n500.2270591\n1048.153446\n1011.392797\n962.4913433\n962.7944832\n915.6028846\n966.4322599\n965.693005\n964.0532036\n1011.381573\n949.7624308\n750.4503275\n726.03264\n576.585551\n552.1550138\n349.3569726\n299.9922139\n287.7700159\n287.7700158\n287.7700159\n287.7700161\n299.9922135\n349.3585006\n410.2920924\n500.1837718\n1048.276388\n1011.572508\n962.6735458\n962.631681\n912.7904612\n962.5653366\n962.5336606\n962.5328584\n1011.416907\n941.3737552\n750.743482\n726.3903479\n576.9996125\n552.6713381\n349.3569729\n299.9922136\n287.7700156\n288.9289168\n289.3181986\n289.7081381\n301.5492691\n351.3042121\n410.7945742\n501.8194314\n1049.550117\n1012.530988\n963.5839902\n964.8856798\n916.0510386\n966.3911131\n965.5946796\n963.7313969\n1011.767087\n941.7536962\n751.153182\n726.9281204\n577.75031\n553.5986301\n349.3569728\n299.9922135\n289.7009874\n289.3198197\n289.7224807\n289.3422459\n311.1872628\n366.3107129\n411.1892834\n507.1945628\n1053.539246\n1015.168118\n965.416577\n965.9114847\n916.3965824\n966.3094205\n965.2869282\n963.6930958\n1012.238316\n942.1860135\n751.5659522\n727.242252\n577.894402\n553.6814025\n349.3569724\n300.7640221\n239.4759586\n239.8728032\n239.4879325\n239.8958135\n251.7296488\n288.08677\n411.0927993\n402.9256036\n651.5072067\n614.1038055\n564.6744988\n565.604806\n566.584966\n566.5546689\n316.0325771\n314.9977367\n364.0445212\n369.0286255\n347.9300868\n323.4856914\n323.4856913\n300.9707968\n276.1406915\n252.0877596\n239.4802527\n239.8748885\n239.4872031\n239.8917676\n262.4443028\n288.0643031\n323.2973101\n302.4716614\n298.2401911\n261.9667174\n212.6734289\n213.060592\n212.6662115\n213.0555509\n212.6649079\n213.0549377\n261.5558996\n341.3330514\n349.4869714\n325.4359076\n325.0472753\n301.003492\n276.1657505\n252.1217521\n239.5045316\n258.326886\n254.8656155\n259.1105855\n267.1003694\n295.8073718\n314.8135779\n317.8700934\n313.5934916\n261.9894646\n212.6861933\n213.0774273\n212.6785658\n213.0726694\n212.675696\n213.0687738\n261.565605\n350.5494608\n364.0809063\n344.6440605\n340.421104\n320.2152187\n291.5482751\n271.3422978\n304.7272027\n308.9669465\n304.7399451\n308.9775012\n316.9667783\n370.5672471\n403.8155192\n501.5654741\n1049.070068\n1012.165202\n963.1852286\n963.3702074\n913.4678435\n962.8989266\n962.8152653\n962.7840967\n1011.740548\n941.7468588\n751.1591907\n726.8595502\n577.6070242\n553.4257194\n349.3569715\n299.9922127\n289.314042\n289.7045922\n289.3254984\n299.6821845\n316.9075282\n370.5169557\n402.8964999\n503.4382732\n1050.261347\n1012.875195\n963.4235854\n963.0747817\n913.082149\n962.7622735\n962.6765372\n962.6138714\n1011.497465\n941.4518623\n750.742408\n726.3136732\n576.9015973\n552.5371633\n349.3569714\n299.9922126\n287.7700142\n287.770014\n287.7700143\n287.7700143\n301.5374961\n351.2915388\n402.1781298\n500.6472565\n1048.436879\n1011.534095\n962.564934\n962.5570858\n912.7481921\n962.5852985\n962.6019658\n962.6106617\n1011.52114\n932.8779348\n750.6647341\n726.236086\n576.7678609\n552.3717408\n349.356971\n299.9922122\n287.7700138\n287.7700136\n287.770014\n287.7700139\n301.1503073\n350.9038561\n402.0265526\n500.3979669\n1048.431793\n1011.748868\n962.8210876\n962.7688957\n912.9302787\n962.6965783\n962.6546007\n962.633515\n1011.516461\n932.8425998\n750.6093602\n726.1614981\n576.6688696\n552.2206842\n349.3569706\n299.9922118\n237.9292863\n237.9292861\n237.9292865\n237.9292864\n250.151484\n274.5974062\n401.8752065\n400.5268142\n649.5397338\n612.7950825\n563.8500084\n563.8241968\n563.814438\n563.804974\n314.686908\n314.7480124\n363.6898841\n359.85777\n347.9300838\n323.4856883\n323.4856884\n299.0423105\n274.5958799\n250.151484\n237.9287772\n237.9287771\n237.9287772\n237.9287772\n250.150975\n275.7545982\n299.010911\n297.8227807\n296.6665574\n259.999964\n211.1111729\n211.1121901\n211.11219\n211.1137163\n211.1121898\n211.1111728\n259.999964\n330.8412241\n349.4685956\n325.4104553\n325.026522\n300.9696489\n276.1395903\n252.082902\n289.3170992\n289.7038093\n289.3186366\n289.7065066\n301.5440038\n351.2973973\n393.6085384\n500.3456707\n1048.197826\n1011.509383\n962.5853113\n962.5584777\n912.7431009\n962.5424208\n962.5181129\n962.523614\n1011.435263\n932.7879127\n750.5677973\n726.1221932\n576.6343979\n552.192038\n349.3569693\n299.9922102\n287.7700122\n287.7700119\n287.7700117\n287.770012\n299.9922098\n349.3584943\n393.2040923\n500.0858982\n1048.105125\n1011.374004\n962.7719177\n964.505573\n915.7454535\n966.0745736\n965.3466168\n963.4226825\n1011.319043\n932.6768415\n750.4747122\n726.0849087\n576.6619502\n552.2327403\n349.3569691\n299.9922096\n287.7700112\n287.7700116\n287.7700113\n287.7700111\n299.9922092\n349.3584934\n393.1566271\n499.9879486\n1048.069045\n1011.395426\n962.4800827\n962.4601046\n912.7078827\n963.710583\n963.6612165\n962.7219419\n1011.30164\n932.6469806\n750.4308679\n726.0040446\n576.5406129\n552.1213475\n349.3569681\n299.9922093\n287.7700107\n287.7700105\n287.7700108\n287.7700108\n299.9922083\n349.3584922\n393.1664665\n500.0502374\n1048.090726\n1011.354613\n962.4633855\n962.4526327\n912.6260456\n962.4486228\n962.4390833\n962.4478297\n1011.348271\n932.6910646\n750.4658335\n726.0394955\n576.5745056\n552.1486374\n349.3569677\n299.9922083\n287.77001\n287.7700102\n287.7700099\n287.7700098\n299.992208\n350.5164588\n393.2932089\n500.2706512\n1048.193403\n1011.437855\n963.2670424\n965.0671958\n915.1007078\n965.1940941\n964.6119705\n963.1102594\n1011.387123\n924.2983086\n750.7218189\n726.4124875\n577.0221457\n552.6648234\n349.3569667\n299.9922078\n237.9292824\n239.0869142\n239.86274\n239.4786593\n252.0937519\n276.1530486\n393.6188072\n401.7163682\n650.3178662\n613.2805209\n564.2750882\n565.5039582\n566.7091796\n566.8983177\n316.127989\n314.6818953\n363.5629596\n351.211992\n347.9300783\n323.4856828\n323.4856828\n299.042303\n274.5958754\n250.1514801\n239.0854687\n239.4726383\n239.8609485\n239.4777665\n252.0881843\n276.151015\n282.7068413\n298.2198156\n298.5986844\n261.5451814\n213.0398671\n212.6555873\n213.041276\n212.6566226\n213.0401805\n212.6551288\n261.932597\n323.8472817\n349.8669615\n325.0393371\n325.429261\n300.6030618\n276.5455062\n251.7163177\n289.7210073\n289.3363171\n289.7236089\n289.3390004\n301.9478876\n350.9287016\n385.3107448\n500.6270629\n1048.516321\n1011.724318\n962.7529052\n962.6943572\n912.8490157\n962.6567127\n962.6468907\n962.6164624\n1011.481882\n924.2816809\n750.6327416\n726.2170625\n576.7452102\n552.3376031\n349.356965\n299.9922056\n287.7700068\n287.7700072\n287.7700071\n287.7700068\n300.7643974\n350.9032928\n384.8811701\n500.3423662\n1048.361061\n1011.631042\n962.6865224\n962.6490127\n912.7986312\n962.60025\n962.5845791\n962.5892888\n1011.505146\n924.3084685\n750.6347202\n726.1796903\n576.7140428\n552.3004356\n349.356964\n299.9922048\n287.7700059\n287.7700061\n287.7700063\n287.7700059\n299.9922038\n350.9026913\n384.8332828\n500.2798519\n1048.314315\n1011.58169\n962.6514394\n962.5763774\n912.7468438\n962.5530906\n962.5336259\n962.5578833\n1011.478686\n924.2900271\n750.6253052\n726.1983736\n576.754776\n552.3188169\n349.3569629\n299.9922041\n287.7700052\n287.770005\n287.7700053\n287.7700054\n299.9922028\n349.3584835\n384.778999\n500.2078574\n1048.195572\n1011.461881\n962.5323018\n962.501807\n912.6601651\n962.4580955\n962.4632762\n962.4706912\n1011.373257\n924.181411\n750.5041566\n726.0742774\n576.6042209\n552.1747063\n349.3569623\n299.9922029\n287.7700045\n287.7700044\n287.7700042\n287.7700043\n299.9922023\n349.3584819\n384.6686697\n500.0457569\n1048.123237\n1011.422017\n962.4928361\n962.467333\n912.6409417\n962.4609739\n962.4511059\n962.4489668\n1011.357656\n924.1708025\n750.489668\n726.0578424\n576.5857511\n552.1626029\n349.3569611\n299.9922022\n237.929276\n237.929276\n237.9292764\n237.9292762\n250.1514739\n274.9835717\n376.2203116\n400.4768628\n649.5188539\n612.8059235\n563.8836937\n563.8778042\n563.8691667\n563.8515353\n314.7270882\n314.7765933\n363.7009722\n351.3149462\n347.9300701\n323.4856745\n323.4856743\n299.0422922\n274.5958695\n250.1514739\n238.7013199\n239.4744642\n239.8637669\n251.7001473\n276.5361972\n325.0357224\n298.6071569\n298.2168815\n261.9345494\n212.6533995\n213.0394519\n212.6537528\n212.2699117\n211.4976444\n212.6529546\n261.541882\n298.593979\n315.2977128\n325.4181401\n325.0321914\n300.9782636\n276.1459438\n252.0919831\n239.4827651\n289.7137443\n289.3256656\n289.7180645\n301.5511079\n351.3101927\n427.9932082\n500.5673031\n1048.316411\n1011.460468\n962.5032907\n963.0474192\n914.4079678\n1004.758176\n988.7831266\n1002.910478\n1037.601501\n898.4700033\n716.2530321\n726.0052328\n576.5380068\n564.7378207\n349.3569583\n299.992199\n287.7700014\n287.7700004\n287.77\n287.7700001\n299.9921982\n349.3584755\n427.3711992\n500.2730326\n1048.390704\n1011.536766\n962.5264769\n962.5030732\n912.7812722\n962.7808434\n962.6196531\n962.6249312\n1011.571768\n898.7681502\n716.604924\n726.4422298\n577.1119646\n552.876889\n349.3569574\n299.9921978\n287.7700001\n288.541812\n289.3148872\n289.7041896\n301.5409207\n351.2973307\n427.7364231\n500.8198762\n1048.517026\n1011.480177\n962.4951248\n963.0744662\n914.7556877\n966.0995379\n966.275512\n965.187771\n1012.235209\n898.4343006\n716.1997113\n725.9667066\n576.491447\n552.0685248\n349.3569558\n299.9921969\n287.769999\n287.7699977\n287.769998\n287.769998\n299.9921955\n349.3584718\n427.2459221\n500.0278332\n1048.11645\n1011.401298\n962.4677462\n962.4501985\n912.612992\n962.4366529\n962.4310762\n962.4405447\n1011.33754\n898.5072108\n716.3470438\n726.1723233\n576.7306501\n552.3918245\n349.356955\n299.9921957\n287.769998\n287.769997\n287.7699967\n289.702209\n301.5405675\n351.2994836\n419.2346985\n501.8411316\n1049.312408\n1012.127193\n962.9575857\n963.007275\n914.3256192\n965.5777965\n965.7004143\n964.5992791\n1011.710732\n898.4684528\n716.2322995\n726.0210386\n576.5995151\n552.213712\n349.3569534\n299.9921945\n287.7699969\n238.3150423\n239.8603179\n239.4786505\n252.0914795\n276.158405\n419.3072495\n401.9336741\n650.6512283\n613.5458486\n564.3674592\n564.1867672\n564.1761807\n564.8044928\n315.2410659\n314.6967687\n363.5863451\n325.6101525\n313.7553923\n323.4856635\n323.4856634\n299.0422782\n275.7520315\n252.0814052\n239.4759367\n239.866775\n239.4815067\n239.8785947\n251.7134998\n276.5677648\n324.9450885\n308.6059808\n298.2476837\n261.9707117\n212.6720475\n213.0589679\n212.6605518\n213.0468288\n212.6570075\n213.039802\n261.5428909\n298.5967278\n315.3007807\n325.4257408\n325.0398053\n300.9936059\n276.1606241\n252.1173246\n239.5020839\n289.7476912\n289.3504961\n289.7579926\n301.5819113\n358.250614\n419.7820957\n501.182098\n1048.744797\n1011.746743\n962.7652647\n962.6999318\n912.7697181\n962.5428232\n962.5419172\n962.5907121\n1011.515738\n898.717923\n708.0108309\n726.3656374\n576.9615155\n552.525935\n349.3569501\n299.9921906\n287.7699927\n287.7699917\n287.7699917\n288.9283167\n301.5380179\n351.2916734\n419.1434219\n500.6581981\n1048.570448\n1011.762469\n962.7415487\n962.6711929\n912.8174827\n962.611133\n962.5293902\n962.5047115\n1011.392228\n898.5663773\n707.8278997\n726.1275224\n576.6515091\n552.2295974\n349.3569483\n299.9921894\n287.7699918\n287.76999\n287.76999\n287.7699904\n299.9921881\n349.7447454\n419.0235689\n500.306512\n1048.208825\n1011.406723\n962.4682764\n962.5649996\n913.5062963\n964.4657855\n964.4670505\n963.4415851\n1011.330261\n898.4619265\n707.6935311\n726.025297\n576.5903656\n552.183656\n349.3569471\n299.9921881\n287.76999\n287.7699885\n287.7699889\n287.7699889\n299.9921863\n349.3584571\n410.3282745\n500.3558796\n1048.302204\n1011.44451\n962.476697\n962.4672552\n912.6365473\n962.6594965\n962.4294665\n962.4083911\n1011.302352\n898.4665777\n707.7317561\n726.08574\n576.669533\n552.2683346\n349.3569458\n299.9921867\n287.7699886\n287.7699871\n287.7699875\n287.7699874\n299.9921849\n349.3584548\n410.3418959\n500.2357017\n1048.196655\n1011.392127\n962.4586145\n963.2783925\n914.7092801\n965.7195118\n965.565238\n964.2780176\n1011.605427\n898.4402906\n707.6710021\n725.9838393\n576.5114598\n552.0880113\n349.3569441\n299.9921853\n287.7699873\n237.9292585\n237.9292587\n237.9292589\n250.1514565\n274.5973622\n410.2085467\n400.4586189\n649.4610354\n612.7346708\n563.8447589\n563.8252484\n563.8541385\n563.9130896\n314.8114366\n314.7994068\n363.704475\n325.7143093\n305.2117121\n323.4856497\n323.4856498\n299.0422608\n274.5958523\n250.1514566\n237.9292585\n239.4740477\n239.8619599\n239.4778103\n252.0866104\n276.1473855\n308.3346871\n298.2171521\n298.5992441\n261.542839\n211.8813453\n211.1121559\n211.1121559\n211.1136645\n211.112156\n211.1111499\n259.9999411\n296.6665345\n305.2102011\n323.4841389\n323.4841389\n300.1967205\n276.1372808\n252.0800702\n239.4743113\n289.702507\n289.3181401\n289.7048953\n301.5416577\n351.2943118\n410.5294609\n500.2541091\n1048.261069\n1011.530381\n962.5914853\n962.5632987\n912.7356956\n962.5308562\n962.5108148\n962.502273\n1011.375491\n898.5454035\n707.7932473\n726.0867868\n576.6089266\n552.1708453\n349.3569394\n299.9921807\n287.7699829\n287.769981\n287.769981\n287.7699813\n299.9921791\n349.3584448\n401.8683125\n500.2449043\n1048.149587\n1011.387307\n962.4591912\n962.5756109\n913.7406445\n964.7538184\n964.3230801\n963.2627931\n1011.308244\n898.4305612\n707.6441921\n725.9541259\n576.4784906\n552.0589846\n349.3569378\n299.9921789\n287.7699813\n287.7699795\n287.7699793\n287.7699795\n299.9921775\n349.3584424\n401.5312514\n499.9677305\n1048.080697\n1011.361589\n970.7245259\n1112.52435\n1289.676295\n1401.469159\n1439.37685\n1452.688234\n1503.603125\n1384.499023\n1162.29986\n1164.493467\n1004.336523\n974.2146681\n349.3569367\n299.9921772\n287.7699793\n287.7699779\n287.7699781\n287.7699777\n299.9921754\n349.3584399\n489.8752791\n574.7210692\n1231.80947\n1408.769493\n1414.938644\n1441.025168\n1413.731027\n1469.071767\n1445.618497\n1432.736437\n1476.379777\n1282.682854\n908.2498219\n811.9116624\n639.5074598\n657.1855751\n349.3569345\n299.9921755\n287.769978\n287.7699761\n287.7699759\n287.769976\n299.9921742\n349.358437\n503.5762941\n651.4360903\n1249.681066\n1318.892875\n1390.232792\n1410.304163\n1373.187766\n1428.490164\n1431.699977\n1426.487546\n1467.320228\n1346.259207\n1135.97818\n932.6099412\n576.385303\n577.1921656\n349.3569329\n299.992174\n287.7699763\n237.9292473\n237.9292471\n237.9292473\n250.1514453\n274.5973435\n402.3161403\n400.2885123\n649.4081159\n612.7066834\n563.792053\n563.7710457\n563.7516058\n563.7431911\n314.5801143\n314.546201\n363.4641521\n325.4327396\n296.6680299\n323.4856337\n323.4856337\n299.0422402\n274.5958409\n250.1514452\n237.9292471\n237.9287449\n237.9287449\n237.9287449\n250.1509427\n274.5968405\n299.0106111\n296.6665252\n296.6665252\n259.9999317\n211.1111405\n211.1121415\n211.112142\n211.1136436\n211.1121415\n211.1111405\n259.9999318\n296.6665252\n297.4383214\n325.0282808\n325.4157129\n300.5867728\n276.5283766\n251.6974777\n239.8631885\n289.3174277\n289.7058434\n289.3187217\n301.9295146\n350.9081581\n393.4058481\n500.1903352\n1048.22542\n1011.51543\n962.5965433\n962.5732867\n912.7458465\n962.5367355\n962.5186549\n962.5132263\n1011.413231\n898.5875584\n699.2840793\n726.1160297\n576.6393058\n552.1946284\n349.3569275\n299.9921685\n287.769971\n287.769969\n287.7699687\n287.7699688\n299.9921669\n349.3584253\n393.141287\n500.047418\n1048.125632\n1011.390045\n962.458319\n962.4625234\n912.6380001\n962.4486995\n962.4328174\n962.4316142\n1011.330351\n898.4900342\n699.1918339\n726.0367997\n576.566365\n552.1315864\n349.3569257\n299.9921667\n287.7699692\n287.7699671\n287.7699669\n287.7699669\n299.992165\n349.3584223\n393.0770422\n499.9778644\n1048.056931\n1011.334717\n962.4208026\n962.4401407\n912.7452974\n1008.772067\n990.7331184\n962.3848547\n1011.269995\n898.4173791\n699.072005\n725.9347799\n576.4660091\n552.0491221\n349.3569241\n299.9921648\n287.769967\n287.7699654\n287.7699653\n287.769965\n299.9921628\n349.3584197\n392.994114\n499.9612889\n1048.054841\n1011.324301\n962.431408\n962.4210105\n912.5939078\n962.4157919\n962.3904069\n962.3974369\n1011.300969\n898.4553482\n699.121502\n725.9591686\n576.491211\n552.0696384\n349.3569219\n299.9921631\n287.7699652\n287.769963\n287.769963\n287.7699632\n299.9921612\n349.3584162\n393.111432\n500.2752971\n1048.385684\n1011.615108\n962.5995501\n962.5653421\n912.6761457\n962.5204691\n962.6169652\n962.4097024\n1011.29749\n898.4412614\n699.1065587\n717.4248132\n576.5122904\n552.097792\n349.3569203\n299.9921612\n287.7699631\n237.929234\n237.9292341\n237.9292343\n250.1514319\n274.5973225\n393.2224033\n400.4943791\n649.5029331\n612.7435737\n563.7933352\n563.7891204\n563.7648058\n563.7568656\n314.5946214\n314.6180513\n363.499946\n338.1123148\n296.6680108\n314.9419491\n323.4856154\n299.0422164\n274.5958276\n250.1514319\n237.9292341\n237.9287343\n237.9287342\n237.9287342\n251.3088357\n276.528188\n282.3108468\n298.595333\n297.0519692\n259.999921\n211.1111298\n211.1121256\n211.1121257\n211.1136193\n211.1121256\n211.1111299\n259.999921\n296.6665145\n296.6665145\n314.9404522\n323.4841188\n299.0412169\n274.5953275\n250.150932\n237.9287342\n287.7699571\n287.7699574\n287.7699572\n299.9921548\n349.3584068\n384.5187382\n499.9933324\n1048.080766\n1017.903384\n962.4569418\n993.5908491\n1049.246104\n1210.620958\n1247.244321\n1306.975491\n1352.741419\n1194.351576\n893.7514502\n883.5861911\n764.0512138\n751.7944008\n349.356914\n299.9921548\n287.7699572\n287.7699553\n287.7699551\n287.7699549\n299.9921528\n349.3584036\n467.8685116\n499.8771372\n1120.63707\n1159.646041\n1109.071224\n1120.32931\n1059.248534\n1088.607861\n1018.826421\n962.3779029\n1011.27503\n898.4329877\n699.1060534\n717.3990532\n576.4804837\n552.0622317\n349.356912\n299.9921528\n287.7699551\n287.7699531\n287.769953\n287.7699528\n299.9921506\n349.3584002\n384.5487131\n499.969561\n1048.063288\n1011.344571\n962.4273562\n962.4233019\n912.988504\n963.6850033\n963.170727\n962.4857947\n1011.277115\n898.4283051\n699.0870099\n717.3944795\n576.4952532\n552.0868039\n349.3569101\n299.9921508\n287.7699528\n287.7699507\n287.7699509\n287.769951\n299.9921486\n349.3583967\n384.7379005\n500.0756337\n1048.111897\n1011.371853\n962.4357362\n962.4206875\n912.7477664\n963.4674814\n963.0995492\n962.4148012\n1011.606701\n898.9963837\n699.0952099\n717.3869574\n576.4831079\n552.0743401\n349.3569076\n299.9921485\n287.7699508\n287.7699488\n287.7699487\n287.7699485\n299.9921463\n349.3583933\n384.7738239\n512.6006729\n1048.049679\n1011.326877\n962.4131882\n962.5633891\n913.6772927\n1035.693337\n1019.431679\n962.930349\n1011.301534\n898.4129886\n699.0685252\n717.3828374\n576.4610696\n552.0417861\n349.3569053\n299.9921463\n287.7699487\n237.9292195\n237.9292193\n237.9292192\n250.151417\n274.5972991\n375.9982393\n400.27668\n649.419889\n619.2766297\n563.8232861\n563.7994372\n563.7774407\n563.7583557\n334.226289\n321.1595703\n363.5190087\n332.0030615\n296.6679904\n314.9419278\n323.4855946\n299.04219\n274.5958127\n250.1514173\n237.9292194\n237.9287222\n237.9287222\n237.9287222\n250.15092\n274.5968001\n272.2221068\n296.6665024\n296.6665024\n271.0283703\n253.7178005\n211.112108\n211.1121073\n211.1135926\n211.1121079\n259.9073302\n556.76552\n597.8438202\n426.0478922\n306.3967735\n323.4841068\n299.0411957\n274.5953155\n250.1509199\n237.9287222\n287.7699418\n287.7699421\n287.7699421\n299.9921397\n349.3583824\n375.8808107\n499.9463334\n1048.037414\n1011.33226\n962.4347331\n962.4331136\n912.5953748\n962.4163237\n962.4009255\n996.1146762\n1011.307217\n898.469791\n699.1572413\n708.915346\n576.5310854\n552.0996219\n349.356899\n299.9921397\n287.7699418\n287.7699397\n287.7699399\n287.7699398\n299.9921374\n349.3583789\n376.0362282\n499.9975279\n1048.074754\n1011.352626\n962.4281238\n962.4210165\n912.5847308\n962.4113379\n962.3941844\n962.3775447\n1011.275586\n898.4244586\n699.0880496\n708.8724008\n576.5172855\n552.1016355\n349.3568968\n299.9921376\n287.7699396\n287.7699372\n287.7699373\n287.7699376\n299.9921353\n349.3583747\n378.5295883\n499.9699001\n1048.043962\n1011.328131\n962.4187004\n962.416392\n912.7640774\n963.2818355\n962.8620663\n962.3844118\n1051.205784\n931.6941208\n699.0663625\n708.8176137\n576.4467561\n552.0349677\n349.3568941\n299.992135\n287.7699373\n287.7699352\n287.7699352\n287.7699349\n299.9921326\n349.3583712\n376.1439119\n499.8866424\n1047.994521\n1011.301029\n962.403679\n1102.265637\n1130.505316\n1209.128516\n1173.53354\n1136.66366\n1182.050462\n1046.826806\n780.8422644\n708.8115844\n576.4167686\n564.6135144\n349.3568917\n299.9921326\n287.769935\n287.7699327\n287.7699326\n287.7699325\n299.9921303\n340.8147009\n376.4490948\n499.8602858\n1048.000966\n1011.321487\n962.4207189\n962.4178334\n912.5854573\n962.4100515\n1012.003148\n1028.241889\n1044.112268\n898.4424689\n699.1076145\n708.8487713\n576.4558663\n552.0275017\n349.3568896\n299.9921303\n287.7699325\n237.9292032\n237.9292034\n237.9292034\n250.1514009\n266.0536065\n376.0207182\n400.1585163\n649.2957511\n612.5980579\n563.6886785\n563.684028\n563.6840449\n563.6832974\n314.4888835\n314.4833769\n363.3835138\n325.312896\n296.6679679\n306.3982383\n323.4855724\n299.0421609\n274.5957963\n250.1514007\n237.9292031\n237.928709\n237.9287091\n237.9287091\n250.1509069\n266.0531109\n272.2220937\n296.6664893\n309.2224367\n309.4566188\n280.9438235\n211.1120876\n211.1120881\n211.1135632\n211.112088\n214.9298212\n279.2880495\n307.7125569\n306.2132774\n306.3967603\n323.4840937\n299.0411728\n274.5953025\n250.1509069\n237.9287091\n287.7699253\n287.7699255\n287.7699255\n299.9921231\n340.8146894\n375.8380372\n499.861316\n1048.034604\n1011.482743\n962.4169702\n962.4008838\n912.5655705\n962.4010674\n962.4529904\n962.3735246\n1011.268015\n898.4082905\n699.0605411\n708.8037042\n576.4244642\n552.0066408\n349.3568825\n299.9921233\n287.7699253\n287.7699227\n287.7699228\n287.7699229\n299.9921208\n340.814685\n376.2487421\n499.900014\n1048.011013\n1011.322283\n962.427094\n962.4227257\n912.5967174\n962.4210368\n962.4111786\n962.4128623\n1011.303272\n898.4558681\n699.1236868\n700.3338292\n576.492216\n552.0597651\n349.3568796\n299.9921205\n287.7699228\n287.7699204\n287.7699204\n287.7699203\n299.992118\n340.8146813\n376.2061131\n499.8982425\n1048.010947\n1011.320446\n962.4152601\n962.4023657\n1065.150485\n1136.739922\n1127.453386\n1065.485917\n1011.608502\n899.4386678\n831.1640935\n802.0557913\n771.9761524\n797.831135\n349.356877\n299.992118\n287.7699203\n287.769918\n287.7699179\n287.7699177\n299.9921154\n340.8146773\n376.4979992\n682.8410549\n1450.274101\n1504.030689\n1526.329813\n1544.65632\n1484.723969\n1532.370224\n1533.902616\n1529.565333\n1576.722126\n1474.464884\n1286.645784\n1294.813358\n1167.753661\n1131.386402\n349.356875\n299.9921156\n287.7699177\n287.7699151\n287.7699152\n287.7699154\n299.9921132\n332.2710061\n891.2149628\n1033.457837\n1618.544718\n1583.337151\n1527.724961\n1523.869543\n1480.504242\n1538.627406\n1477.935189\n1291.059373\n1058.198544\n902.1831518\n699.2400214\n700.2745268\n576.3556308\n551.925592\n349.3568719\n299.9921129\n287.7699152\n237.9291857\n237.9291857\n237.9291856\n250.1513833\n257.5099117\n377.8641667\n400.1621442\n649.3200033\n612.6405297\n563.7316199\n563.7262507\n563.7210908\n563.7238413\n314.5672908\n314.589625\n363.5022562\n325.4460148\n296.6679435\n297.8545472\n323.4855476\n299.0421293\n274.5957788\n250.1513832\n237.9291856\n237.9286949\n237.9286949\n237.9286949\n250.1508928\n257.5094195\n272.2220796\n296.6664751\n296.6664751\n259.9998817\n211.1110905\n211.1120668\n211.1120664\n211.1135313\n211.1120667\n211.1110905\n259.9998816\n296.6664751\n296.6664751\n297.8530795\n323.4840795\n299.0411487\n274.5952883\n250.1508927\n237.9286948\n287.7699074\n288.5420693\n289.3143295\n301.9244413\n333.8173086\n437.1668619\n500.0038763\n1048.077836\n1011.397638\n962.4382817\n962.4279481\n912.5922893\n1027.616288\n1068.47199\n989.6808551\n1011.26934\n898.4112688\n699.0738468\n700.2955894\n576.4849458\n552.0670576\n349.3568646\n299.9921054\n287.7699074\n287.7699046\n287.7699046\n287.7699047\n299.9921027\n332.2709891\n376.0768518\n499.8982834\n1048.018805\n1011.449402\n962.4224462\n962.4081807\n972.8507978\n1114.27591\n1217.756819\n1312.973597\n1396.699866\n1273.382199\n1014.307651\n899.3196196\n670.5705362\n577.205866\n349.3568619\n299.9921027\n287.7699048\n287.769902\n287.7699019\n287.7699019\n299.9920998\n332.2709853\n376.4674153\n499.8411018\n1047.96619\n1011.287856\n962.3903912\n1061.556841\n1075.713755\n1206.313296\n1207.159443\n1130.71353\n1062.430207\n898.4040046\n699.0605773\n700.2649772\n576.4027752\n551.9752742\n349.3568587\n299.9920996\n287.769902\n287.7698994\n287.7698994\n287.7698995\n299.9920971\n332.2709809\n376.7128003\n499.8201081\n1048.602538\n1012.298208\n962.6709224\n962.3986312\n912.5646281\n962.7823982\n963.0975202\n963.4763916\n1012.784254\n898.4027219\n699.0455699\n691.7060779\n576.3919616\n551.9626595\n349.3568561\n299.992097\n287.7698995\n287.7698967\n287.7698967\n287.7698966\n299.9920943\n332.2709767\n377.0630669\n499.8621348\n1048.011113\n1011.328928\n962.4322697\n962.4300996\n912.6016212\n962.4260828\n962.4360003\n962.7157434\n1011.890428\n898.4611824\n699.1264296\n691.7877879\n576.48502\n552.0518966\n349.3568532\n299.9920942\n287.7698965\n237.9291667\n237.9291669\n237.9291669\n250.1513646\n248.9662146\n376.1616069\n400.2029321\n649.2974926\n695.4393447\n747.3420649\n788.2477777\n837.9546973\n885.156261\n659.555762\n640.7322704\n671.8596515\n631.1973357\n296.6679171\n289.3108542\n323.4855216\n299.0420951\n274.5957603\n250.1513646\n237.9291668\n237.9286798\n237.9286798\n237.9286798\n250.1508776\n248.9657258\n272.2220644\n296.66646\n296.66646\n316.8902837\n331.9451707\n211.1120437\n211.1120444\n211.1134968\n211.112044\n392.3053299\n629.5786147\n618.214989\n606.6285796\n371.5988682\n323.4840643\n299.0411217\n274.5952731\n250.1508775\n237.9286797\n287.7698882\n287.7698882\n287.7698881\n299.9920861\n323.7272966\n375.8790967\n573.561169\n1269.654794\n1344.026844\n1392.274025\n1413.490372\n1353.025986\n1408.673833\n1403.973369\n1396.03403\n1445.073442\n1316.680845\n1116.895148\n1082.011841\n794.5076656\n716.144414\n349.3568452\n299.9920861\n287.7698885\n287.7698856\n287.7698856\n287.7698855\n299.9920832\n323.7272922\n491.7564671\n680.7751192\n1322.362098\n1424.674755\n1437.192794\n1439.086976\n1385.501842\n1437.975574\n1440.807847\n1441.92357\n1489.252967\n1371.726658\n1138.746506\n1046.251439\n879.5478955\n802.3678304\n349.3568427\n299.9920836\n287.7698855\n287.7698826\n287.7698826\n287.7698826\n299.9920805\n323.7272876\n597.679734\n815.0939468\n1470.303611\n1455.7296\n1416.405338\n1406.380081\n1355.110095\n1408.365828\n1413.14006\n1414.687624\n1469.312504\n1348.078353\n1132.419699\n1113.467627\n990.7564919\n911.6561212\n349.3568398\n299.9920806\n287.7698826\n287.7698798\n287.7698797\n287.7698797\n299.9920776\n323.7272831\n448.0888734\n643.4996129\n1261.766538\n1293.855872\n1332.611277\n1355.461674\n1284.478987\n1376.578515\n1408.175896\n1418.034422\n1463.949707\n1346.833488\n1148.449466\n1120.347308\n979.4985298\n826.1971557\n349.3568367\n299.9920776\n287.7698798\n287.7698771\n287.7698771\n287.769877\n299.9920747\n323.7272782\n378.5122513\n619.4649477\n1301.899398\n1420.910828\n1422.330381\n1442.402931\n1387.807465\n1440.992092\n1460.289148\n1457.817916\n1519.997238\n1404.216252\n1164.221208\n1134.258804\n1002.85158\n914.3757608\n349.356834\n299.9920749\n287.7698771\n237.9291471\n237.9291469\n237.9291469\n250.1513447\n248.9661834\n378.1198323\n400.0381301\n649.2189089\n764.2183238\n809.1152735\n847.1912263\n904.2580834\n960.2430462\n766.5955203\n789.3555555\n854.7765149\n820.7353158\n549.88859\n280.7671598\n323.4854934\n299.0420598\n274.5957402\n250.1513447\n237.9291468\n237.9286638\n237.9286639\n237.9286638\n250.1508617\n240.4220311\n272.2220484\n296.6664441\n296.6664441\n259.9998507\n211.1110595\n211.1120199\n211.1120201\n211.1134607\n211.1120203\n211.1110593\n259.9998505\n296.6664439\n296.666444\n280.7657151\n323.4840485\n299.041094\n274.5952572\n250.1508616\n237.9286638\n287.7698684\n287.7698684\n287.7698684\n299.9920661\n315.1835975\n377.9662992\n499.8468231\n1047.995741\n1011.316339\n962.5613817\n963.0270004\n912.5864783\n963.4031351\n963.7669273\n964.0087954\n1013.088685\n898.454505\n699.110695\n683.2190511\n576.4535787\n552.0235585\n349.3568251\n299.992066\n287.7698684\n287.7698654\n287.7698654\n287.7698654\n299.9920631\n315.183593\n377.0825243\n499.8703065\n1048.007262\n1011.324811\n962.4260357\n962.419353\n912.5902487\n962.4159124\n962.5079708\n962.8398696\n1012.008621\n898.4545107\n699.1155926\n683.2215866\n576.458044\n552.0237555\n349.356822\n299.992063\n287.7698652\n287.7698623\n287.7698624\n287.7698625\n299.9920603\n315.1835879\n379.2751485\n499.850661\n1047.997315\n1023.935446\n1051.00813\n1093.237135\n1131.119603\n1250.811507\n1253.829428\n1191.146331\n1171.861438\n963.6335573\n699.0619928\n683.1763938\n576.4040201\n551.9738902\n349.3568194\n299.9920603\n287.7698625\n287.7698595\n287.7698595\n287.7698594\n299.9920572\n315.1835836\n376.9085706\n512.4635883\n1047.985182\n1011.295977\n962.3930099\n962.3882438\n1000.175721\n990.7361079\n962.5516112\n962.9733345\n1012.218531\n898.4207602\n711.7043695\n758.9225009\n663.448092\n657.455317\n349.3568164\n299.9920574\n287.7698596\n287.7698565\n287.7698565\n287.7698564\n299.9920542\n315.1835788\n376.9866846\n568.4966074\n1246.753173\n1425.79768\n1453.434294\n1481.774896\n1435.823799\n1476.063797\n1467.282207\n1472.203781\n1537.2403\n1429.174299\n1222.328793\n1212.005548\n1105.345433\n1062.474796\n349.3568132\n299.9920541\n287.7698563\n237.9291264\n237.9291263\n237.9291265\n250.1513243\n240.4224832\n815.1549767\n889.0646065\n1186.147732\n1189.816133\n1158.648189\n1156.406549\n1155.2619\n1159.391009\n894.5553217\n894.3494174\n960.4662748\n923.0347461\n296.6678599\n280.7671313\n323.4854642\n299.0420224\n274.5957198\n250.1513242\n237.9291265\n237.9286471\n237.9286473\n237.9286473\n250.1508451\n240.4220027\n272.2220318\n296.6664275\n608.3377403\n716.0883847\n716.8070085\n407.8207123\n343.7344696\n532.2633064\n352.6442374\n574.7979219\n691.3288907\n625.4805267\n689.3495604\n583.7874677\n323.484032\n299.0410646\n274.5952407\n250.1508451\n237.9286474\n287.7698474\n287.7698475\n287.7698475\n299.9920453\n315.1835646\n604.6652197\n758.526073\n1419.773992\n1421.455224\n1387.239934\n1406.77913\n1381.034236\n1455.40235\n1466.736093\n1483.566798\n1545.302552\n1427.378088\n1218.884148\n1187.169386\n1063.54287\n1021.143992\n349.3568045\n299.9920454\n287.7698476\n287.7698445\n287.7698445\n287.7698444\n299.9920423\n315.1835594\n781.1510015\n919.4956661\n1504.973207\n1493.759599\n1467.883789\n1493.952889\n1458.408824\n1528.500309\n1528.643649\n1529.227511\n1587.004201\n1480.340391\n1258.898937\n1201.247345\n1077.883392\n1042.779341\n349.3568016\n299.9920424\n287.7698446\n287.7698414\n287.7698414\n287.7698414\n299.9920392\n315.183555\n760.0440663\n929.6846557\n1502.41048\n1463.397604\n1437.259829\n1474.720024\n1446.228464\n1512.681152\n1507.495608\n1503.134642\n1544.915556\n1420.389967\n1217.802121\n1186.463584\n1083.571126\n1056.838599\n349.3567984\n299.9920393\n287.7698415\n287.7698385\n287.7698385\n287.7698385\n299.9920362\n306.639883\n659.3629134\n713.3607302\n1303.409284\n1343.029701\n1265.831889\n1234.338465\n1213.310233\n1338.439595\n1342.534912\n1391.238144\n1481.725633\n1371.627532\n1178.94367\n1159.387403\n1057.97484\n1025.072273\n349.3567953\n299.9920362\n287.7698384\n287.7698353\n287.7698353\n287.7698353\n299.9920331\n306.6398789\n691.301441\n775.9409697\n1455.796243\n1490.832874\n1465.307059\n1482.809545\n1414.042928\n1446.989148\n1445.418157\n1442.070223\n1476.736351\n1301.042989\n1080.76728\n946.046141\n742.0747207\n674.3199863\n349.3567922\n299.9920331\n287.7698353\n237.9291051\n237.9291052\n237.9291052\n250.151303\n231.8787835\n483.5912404\n504.29909\n782.0444645\n759.74649\n705.1696186\n705.5308127\n809.3824723\n997.7737412\n783.9989243\n778.0581797\n826.0160996\n743.3811729\n296.6678302\n272.2234352\n323.4854351\n299.0419847\n274.5956986\n250.1513031\n237.9291052\n237.9286304\n237.9286303\n237.9286301\n250.1508279\n231.8783063\n272.2220149\n584.1209887\n735.3617683\n643.8868987\n687.0382592\n211.1119699\n211.11197\n310.8704316\n421.0782754\n573.2713548\n754.4333932\n836.6219486\n794.2625233\n347.64666\n323.4840151\n299.0410349\n274.5952238\n250.1508283\n237.9286305\n237.928628\n237.9286279\n237.9286277\n250.1508255\n231.878302\n272.2220125\n296.666408\n805.5019614\n659.1614855\n699.2025046\n416.3552225\n538.5600173\n594.5452844\n615.0336488\n813.8020227\n828.8509518\n909.1527986\n848.3495174\n863.1797036\n505.9231208\n299.0410306\n274.5952213\n250.1508258\n237.928628\n287.7698231\n287.7698232\n287.7698231\n299.9920209\n306.6398593\n952.4353889\n1079.38794\n1623.309902\n1569.670099\n1508.557447\n1503.41526\n1455.443252\n1496.979502\n1506.636997\n1518.798089\n1568.282029\n1457.665095\n1252.721086\n1233.623775\n1143.544337\n1132.70648\n349.3567802\n299.992021\n287.7698233\n287.7698202\n287.7698202\n287.7698202\n299.992018\n306.6398537\n889.8632256\n979.5848856\n1530.375294\n1507.651348\n1464.28628\n1457.412102\n1403.718969\n1466.455623\n1482.756524\n1486.404021\n1530.973204\n1406.438781\n1183.346208\n1105.847438\n1008.469256\n975.7452437\n349.3567771\n299.9920181\n287.7698202\n287.769817\n287.769817\n287.7698171\n299.9920149\n306.639849\n856.6109648\n980.8794498\n1538.229951\n1527.61861\n1500.281162\n1518.571806\n1482.475587\n1532.223625\n1527.452798\n1526.650741\n1575.400461\n1458.856174\n1261.850247\n1228.377551\n1115.285525\n1075.056147\n349.3567744\n299.9920151\n287.7698172\n287.7698141\n287.7698141\n287.7698141\n299.9920118\n306.639844\n863.0315829\n966.2892785\n1528.638979\n1524.846217\n1501.597129\n1509.270817\n1452.356237\n1500.336769\n1478.724709\n1468.81454\n1513.336081\n1369.313452\n1135.290684\n1094.183605\n984.2717437\n928.2101057\n349.3567709\n299.9920119\n287.769814\n237.9290838\n237.9290839\n237.9290839\n250.1512817\n231.8787493\n378.6755062\n504.34866\n819.5164053\n859.2127656\n915.9822292\n956.3924533\n968.0774962\n980.3929941\n737.4532565\n749.314525\n805.8966676\n761.790433\n635.4610173\n393.229642\n323.4854049\n299.0419463\n274.5956772\n250.1512817\n237.9290839\n237.9286132\n237.928613\n237.9286129\n250.1508109\n231.8782768\n272.2219976\n373.8969639\n510.5512303\n469.488137\n368.1285181\n211.111944\n211.1119442\n211.1133473\n211.111944\n444.5970631\n656.9704626\n642.9642295\n452.4885126\n272.2219977\n314.9403309\n299.0410053\n274.5952066\n250.1508108\n237.928613\n287.7698049\n287.7698049\n287.7698049\n299.9920027\n306.6398296\n805.7216163\n958.8726189\n1530.258532\n1523.866829\n1504.878845\n1521.828953\n1481.363804\n1541.028748\n1531.328116\n1522.172397\n1556.022432\n1444.063763\n1249.478545\n1228.596362\n1130.672216\n1115.291556\n349.3567616\n299.9920025\n287.7698048\n287.7698018\n287.7698018\n287.7698018\n299.9919996\n306.6398248\n936.8550685\n1058.302278\n1603.93633\n1557.718282\n1516.007819\n1531.252791\n1409.03679\n1425.180514\n1330.669751\n1212.697256\n1189.159173\n1025.174805\n806.0130985\n780.3493877\n650.7841095\n638.825305\n349.3567588\n299.9919996\n287.7698018\n287.7697987\n287.7697988\n287.7697988\n299.9919966\n306.6398203\n463.5133847\n631.5792034\n1168.254401\n1115.624107\n990.5231766\n962.7109261\n912.5916303\n963.1127659\n963.5856195\n1075.823102\n1208.917903\n1079.609486\n842.3399244\n796.6176587\n596.2403994\n551.9794373\n349.3567557\n299.9919966\n287.7697989\n287.7697958\n287.7697959\n287.7697958\n299.9919936\n306.6398147\n377.376805\n539.5903109\n1169.80442\n1158.324779\n1149.947527\n1181.43027\n1209.855959\n1344.935095\n1386.368574\n1397.3133\n1447.825564\n1308.990795\n1055.997001\n1022.417819\n897.9231486\n834.5755172\n349.3567528\n299.9919937\n287.7697959\n287.7697928\n287.7697928\n287.7697928\n299.9919906\n306.6398106\n490.1056621\n684.049617\n1374.704712\n1457.977682\n1435.384012\n1484.719901\n1472.339943\n1542.754496\n1537.362824\n1528.79369\n1573.081637\n1468.107169\n1280.374896\n1263.483956\n1161.114332\n1150.595487\n349.3567496\n299.9919905\n287.7697927\n237.9290626\n237.9290627\n237.9290627\n250.1512605\n231.8787153\n870.9963313\n848.9155188\n1102.126268\n1077.400482\n1034.691158\n1032.571675\n1020.367764\n1015.556045\n793.2256454\n818.5104643\n872.8307261\n825.8955248\n296.6677707\n272.2233757\n314.9417089\n299.0419081\n274.5956562\n250.1512606\n237.9290628\n237.9285961\n237.928596\n237.9285963\n250.1507943\n231.8782468\n272.2219809\n296.6663767\n296.6663768\n605.3416911\n701.9126698\n470.9229608\n638.6268488\n528.6222043\n686.4068851\n841.0227305\n791.2629325\n476.1227959\n296.6663766\n272.2219811\n314.9403144\n299.0409755\n274.5951899\n250.1507943\n237.9285964\n287.7697838\n287.7697838\n287.7697838\n299.9919816\n306.6397956\n406.2211757\n575.4606228\n1124.257447\n1119.692175\n1069.613242\n1090.803695\n1033.443851\n1068.676426\n1068.966947\n1022.194188\n1013.5788\n898.5310554\n699.0898336\n674.6552459\n567.8768652\n551.9871461\n349.3567407\n299.9919816\n287.7697838\n287.7697808\n287.7697808\n287.7697809\n299.9919787\n306.639791\n380.1171618\n499.8069474\n1047.981166\n1099.243908\n1067.909266\n1067.087583\n1060.117508\n1168.330804\n1256.024343\n1356.808298\n1414.969467\n1200.392213\n936.5558471\n910.2712588\n949.4192214\n1021.826573\n349.356738\n299.9919787\n287.7697809\n287.7697779\n287.7697779\n287.7697779\n299.9919757\n306.6397866\n488.1730755\n628.250424\n1311.272574\n1425.193048\n1396.153846\n1291.994372\n1151.640485\n1180.630214\n1132.428739\n1111.853387\n1160.708707\n1021.144886\n804.2730655\n744.9492593\n593.1090476\n602.4586616\n349.356735\n299.9919758\n287.769778\n287.769775\n287.769775\n287.769775\n299.9919728\n306.6397814\n377.4794772\n499.8447294\n1048.007398\n1011.32857\n962.4310703\n1056.415751\n1023.320584\n1067.295763\n1067.86115\n1021.137737\n1012.58686\n898.4427961\n699.102574\n674.6672488\n567.9015549\n552.0190068\n349.356732\n299.9919728\n287.769775\n287.7697721\n287.7697721\n287.7697721\n299.9919699\n306.6397768\n376.9363835\n512.4529491\n1056.407768\n1011.314448\n962.421681\n962.4197077\n912.5867962\n1056.334288\n1129.625953\n1149.425409\n1199.883955\n1041.80068\n803.7312411\n744.5706517\n654.3731427\n674.7377077\n349.3567289\n299.9919698\n287.769772\n237.929042\n237.929042\n237.929042\n250.1512398\n231.8786815\n605.7904363\n722.2088033\n1108.758078\n1108.367037\n1077.802194\n1082.387964\n1089.240653\n1092.585862\n841.1106251\n846.0580152\n899.1138065\n860.4608059\n665.6742788\n455.7828669\n314.94168\n299.0418704\n274.5956354\n250.1512398\n237.929042\n237.92858\n237.92858\n237.9285797\n250.1507773\n231.8782183\n272.2219642\n557.8905833\n658.9031576\n704.0904493\n537.8976488\n462.0504545\n211.111894\n211.1132727\n529.5256965\n572.6094278\n618.0895662\n718.9716074\n778.5090991\n644.1900851\n314.940298\n299.0409466\n274.5951734\n250.1507779\n237.9285798\n287.7697633\n287.7697633\n287.7697633\n299.9919611\n306.6397631\n851.3493784\n981.3956064\n1543.05383\n1507.458093\n1446.400965\n1441.01569\n1400.154353\n1467.508712\n1483.794651\n1488.763929\n1539.867001\n1420.748538\n1214.471402\n1173.926044\n1054.929253\n1032.692422\n349.3567203\n299.9919611\n287.7697634\n287.7697605\n287.7697605\n287.7697606\n299.9919583\n306.6397592\n854.4957641\n989.7219175\n1557.275371\n1530.128613\n1491.398178\n1515.511575\n1484.243236\n1540.869616\n1544.870041\n1544.258302\n1590.711047\n1480.383946\n1261.527353\n1241.21193\n1132.913605\n1076.216698\n349.3567174\n299.9919583\n287.7697606\n287.7697577\n287.7697577\n287.7697577\n299.9919555\n306.6397537\n856.8861007\n985.827887\n1572.180857\n1580.758936\n1531.553681\n1526.271935\n1477.721929\n1522.645618\n1521.367691\n1516.929135\n1563.89807\n1455.768866\n1272.051666\n1254.684968\n1134.235313\n1130.567868\n349.3567147\n299.9919555\n287.7697577\n287.7697549\n287.769755\n287.7697549\n299.9919527\n306.6397495\n940.6120708\n1062.905856\n1607.815796\n1559.689184\n1515.509428\n1515.381484\n1470.867013\n1517.027745\n1492.379867\n1485.494251\n1540.997118\n1444.38148\n1283.892195\n1260.077945\n1133.280798\n1099.42299\n349.3567116\n299.9919525\n287.7697548\n287.769752\n287.7697521\n287.7697521\n299.9919499\n306.6397448\n904.619676\n1013.73885\n1573.342157\n1579.492228\n1525.825285\n1504.01948\n1444.963237\n1485.543884\n1494.15214\n1498.768334\n1542.722712\n1439.432704\n1243.480525\n1236.782327\n1137.992999\n1130.37203\n349.356709\n299.9919499\n287.7697521\n237.9290222\n237.9290222\n237.9290222\n250.15122\n231.8786504\n941.1859393\n996.8950834\n1246.064135\n1185.918373\n1106.164678\n1102.287095\n1112.059668\n1120.321215\n865.4365342\n861.9259758\n916.3710228\n881.3154724\n713.820193\n639.8983052\n570.063095\n299.0418352\n274.5956157\n250.1512201\n237.9290222\n237.9285642\n237.9285639\n237.9285638\n250.150762\n231.8781905\n398.5199785\n623.4790737\n726.9289937\n614.0110679\n653.7976312\n572.7617128\n509.7106494\n452.6925324\n554.3233535\n729.6790009\n699.8687858\n813.6901335\n746.6695235\n784.6934752\n434.5589717\n299.0409198\n274.5951573\n250.1507621\n237.9285644\n287.769744\n287.769744\n287.769744\n299.9919418\n306.6397317\n929.6987905\n1050.420046\n1600.877611\n1569.858668\n1516.695164\n1519.567585\n1472.451536\n1524.86254\n1523.404328\n1523.153168\n1574.472934\n1458.809859\n1260.736327\n1236.955949\n1131.94229\n1119.884836\n349.3567008\n299.9919417\n287.769744\n466.755514\n287.7697411\n287.7697411\n470.5780365\n306.6397278\n975.4962125\n1067.169037\n1607.40359\n1572.223535\n1523.546923\n1526.332562\n1473.27689\n1525.339951\n1525.330693\n1530.092118\n1579.540932\n1458.662723\n1258.29145\n1201.341995\n1092.765709\n1082.240019\n349.3566983\n299.9919392\n287.7697413\n287.7697386\n287.7697386\n287.7697387\n299.9919365\n306.6397235\n910.0407644\n1022.657513\n1575.529424\n1546.894888\n1513.111255\n1516.796342\n1467.729936\n1518.082445\n1516.658233\n1515.176934\n1560.089017\n1427.24277\n1227.699497\n1209.51394\n1110.927657\n1098.35435\n349.3566954\n299.9919364\n287.7697385\n287.7697359\n287.769736\n287.769736\n299.9919338\n306.6397197\n956.678566\n1066.771963\n1604.861758\n1546.993979\n1506.031946\n1527.332357\n1487.976448\n1527.075485\n1529.501993\n1522.618165\n1556.244\n1441.286263\n1267.897082\n1266.027801\n1151.454526\n1123.355544\n349.356693\n299.9919338\n287.7697361\n287.7697334\n287.7697334\n287.7697335\n299.9919313\n306.6397152\n953.5795423\n1084.3189\n1602.217132\n1543.709746\n1485.312149\n1485.120785\n1455.746088\n1516.605339\n1516.305053\n1514.319824\n1564.013794\n1452.947883\n1262.789138\n1245.310786\n1123.698089\n1110.35666\n349.3566903\n299.9919311\n287.7697333\n237.9290037\n237.9290038\n237.9290036\n250.1512014\n231.8786204\n906.0282404\n902.3960151\n1166.408383\n1160.16705\n1134.355609\n1143.580749\n1155.440267\n1152.654769\n892.0913924\n889.7011957\n932.9708496\n889.2002635\n296.6676882\n272.2232932\n314.9416264\n299.0418014\n274.5955972\n250.1512016\n237.9290038\n237.9285497\n237.9285498\n237.9285496\n250.1507469\n231.8781651\n272.2219338\n296.6663295\n296.6663299\n259.9997366\n211.1109451\n211.1118486\n211.1118485\n211.1132035\n211.1118488\n539.4031557\n259.9997365\n296.6663301\n296.6663299\n272.2219339\n314.9402673\n299.0408942\n274.5951427\n250.1507475\n237.9285499\n287.769726\n287.7697259\n287.7697259\n299.9919237\n306.6397027\n935.5104332\n1066.017061\n1624.26249\n1577.161142\n1517.461284\n1506.368979\n1455.798056\n1496.967524\n1496.346507\n1503.754502\n1557.978748\n1448.513213\n1259.02964\n1228.603138\n1129.790244\n1088.88226\n349.3566827\n299.9919236\n287.7697258\n237.9285453\n237.9285453\n237.9285457\n250.1507436\n231.8781577\n272.2219305\n296.6663259\n296.6663254\n599.6140248\n576.8936021\n583.5307466\n786.6311549\n685.5987121\n375.2526153\n530.1203668\n455.3431046\n445.7604665\n296.6663259\n272.2219304\n314.9402636\n299.0408867\n274.595139\n250.150743\n237.9285453\n287.769721\n287.769721\n287.769721\n299.9919189\n306.6396955\n951.5812981\n1063.596135\n1582.16202\n1534.998953\n1492.276034\n1496.654823\n1452.822291\n1514.64591\n1531.052124\n1510.145613\n1557.108279\n1436.518288\n1224.671118\n1193.125518\n1089.588451\n1077.110612\n349.3566779\n299.9919187\n287.7697209\n287.7697185\n287.7697185\n287.7697185\n299.9919164\n306.6396922\n915.3434092\n1034.106874\n1574.708571\n1534.974044\n1505.820637\n1516.682061\n1467.546332\n1518.335735\n1515.751158\n1517.899677\n1570.108416\n1453.090383\n1255.473859\n1237.011605\n1136.834368\n1121.997396\n349.3566755\n416.4353664\n342.7350107\n287.7697161\n287.7697162\n443.2711944\n299.991914\n306.6396881\n910.1364411\n1051.007539\n1603.137195\n1566.540238\n1520.795631\n1523.078371\n1471.479415\n1525.41353\n1524.368411\n1523.639894\n1572.542409\n1454.651519\n1258.788104\n1245.308651\n1151.425458\n1142.589722\n393.1330103\n649.5171699\n374.3799528\n237.9289869\n237.9289868\n237.9289869\n250.1511848\n231.8785943\n927.5029181\n977.2998225\n1214.64888\n1171.540053\n1122.59498\n1123.247963\n1122.274541\n1121.82325\n874.4463524\n874.8331388\n924.4827834\n886.758204\n820.1411534\n733.4407712\n790.1877239\n725.0717902\n552.7673272\n510.9506219\n416.0921868\n453.0391919\n350.998544\n237.9285361\n250.1507338\n439.4232887\n778.2873778\n891.2679498\n824.5035748\n866.6954731\n754.851773\n831.1359377\n758.1777277\n830.6340114\n761.0469517\n835.9059625\n814.6821106\n920.5755688\n851.3285454\n896.6635288\n855.9108964\n781.7903168\n676.5295159\n341.2369347\n364.0623949\n374.7148386\n331.2185342\n420.7831438\n299.9919074\n315.1833442\n949.7399508\n1076.404172\n1614.062574\n1568.734305\n1516.310961\n1516.256104\n1470.663839\n1516.554679\n1514.944598\n1514.167578\n1562.385725\n1450.086642\n1264.097348\n1252.479326\n1157.170105\n1147.118732\n349.3566664\n299.9919073\n329.7186964\n368.6885141\n287.7697073\n287.7697073\n338.865574\n389.0042217\n950.92573\n1083.166977\n1607.568471\n1561.345394\n1511.715799\n1512.889212\n1467.967815\n1512.3818\n1510.730105\n1512.459378\n1560.431649\n1450.123465\n1263.406823\n1253.153977\n1159.238034\n1144.504314\n392.1586446\n477.5451394\n561.0830122\n287.7697051\n287.7697052\n378.5305117\n299.9919031\n315.1833377\n924.5197301\n1054.849608\n1624.794618\n1579.820307\n1518.166924\n1517.976406\n1471.71078\n1515.173838\n1516.830713\n1513.218714\n1558.608807\n1448.028941\n1263.443871\n1256.447325\n1162.636907\n1127.974269\n349.3566623\n299.9919031\n287.7697053\n335.055821\n378.9514103\n287.7697034\n299.9919012\n448.3148647\n910.7991501\n1038.42767\n1573.59482\n1543.233833\n1512.656555\n1517.754311\n1467.262135\n1515.592376\n1514.995384\n1515.592453\n1547.351823\n1430.930988\n1244.735414\n1226.526221\n1143.693946\n1137.993018\n349.3566605\n299.9919014\n287.7697034\n287.7697015\n287.7697013\n287.7697014\n299.991899\n315.1833304\n948.6814014\n1066.870803\n1587.438923\n1545.261029\n1501.233455\n1520.388307\n1480.750455\n1520.881469\n1519.690518\n1517.061295\n1562.236925\n1459.242419\n1284.004472\n1252.252833\n1134.928399\n1115.692685\n349.3566582\n299.9918991\n287.7697013\n237.9289723\n237.9289724\n237.9289724\n250.1511702\n240.4222364\n888.1978424\n908.0721168\n1179.817909\n1158.241674\n1123.501881\n1131.477391\n1142.19544\n1147.678816\n896.2320656\n891.0703648\n949.6453979\n914.3923834\n739.608719\n669.5843974\n637.5762317\n299.0417448\n274.5955656\n250.1511701\n237.9289723\n237.9285251\n237.9285251\n237.9285246\n250.1507223\n240.4217886\n272.2219093\n570.9160323\n745.0140931\n643.2604161\n697.3289078\n598.502235\n648.2594202\n572.0946211\n617.2374343\n649.2654352\n762.9970573\n744.3774325\n816.0097884\n625.9451298\n314.9402428\n299.0408504\n274.5951182\n250.1507221\n237.9285247\n287.7696956\n287.7696956\n287.7696957\n299.9918935\n315.183321\n928.9743743\n1065.020895\n1626.225687\n1575.791084\n1522.118497\n1525.127412\n1479.299425\n1519.291175\n1508.827076\n1505.007445\n1563.363852\n1447.238616\n1244.200697\n1216.523644\n1125.272014\n1128.738915\n349.3566526\n299.9918934\n287.7696957\n287.7696938\n287.7696938\n287.7696938\n299.9918915\n315.1833183\n936.5866531\n1054.88258\n1580.457461\n1561.929008\n1515.229098\n1515.465565\n1467.471037\n1516.569558\n1515.545401\n1515.613789\n1564.374611\n1435.903822\n1242.108699\n1228.232526\n1133.160526\n1115.393396\n349.3566506\n299.9918914\n287.7696935\n287.7696918\n287.7696918\n287.769692\n299.9918898\n315.1833163\n956.2964688\n1071.705833\n1586.363772\n1534.356637\n1483.599972\n1484.203434\n1433.793735\n1514.300481\n1497.508943\n1496.059719\n1547.271686\n1422.395483\n1224.343462\n1227.154451\n1129.133332\n1114.638419\n349.356649\n299.9918899\n287.7696921\n287.7696904\n287.7696905\n287.7696903\n299.9918881\n315.1833126\n910.0542424\n1025.053329\n1576.9523\n1553.967343\n1514.194374\n1511.892991\n1460.369883\n1518.576486\n1518.80463\n1513.120623\n1550.358674\n1422.486311\n1219.285496\n1224.945656\n1125.541439\n1093.12845\n349.3566472\n299.9918881\n287.7696904\n287.7696888\n287.7696888\n287.7696889\n299.9918866\n323.7269767\n972.7388414\n1067.490697\n1607.781233\n1570.702792\n1522.927837\n1525.914986\n1474.662338\n1530.954376\n1538.78676\n1548.230445\n1577.168934\n1452.720056\n1259.129858\n1235.575715\n1130.898743\n1117.338089\n349.3566455\n299.9918864\n287.7696886\n237.9289601\n237.9289601\n237.9289602\n250.151158\n248.9658839\n946.0514345\n966.2599856\n1215.343456\n1177.677994\n1122.13559\n1115.803813\n1110.448622\n1104.062302\n864.0753399\n874.9332379\n924.3288131\n880.2415829\n499.8517879\n375.6451544\n323.4852321\n299.0417232\n274.5955535\n250.1511578\n237.92896\n237.928515\n237.928515\n237.9285156\n250.1507134\n248.965438\n321.3217706\n758.5442532\n681.8847954\n736.5786016\n631.2264289\n685.9216251\n544.9189652\n532.8058085\n509.4248311\n667.826395\n683.4402256\n773.5697758\n700.1269698\n686.9346557\n409.5114541\n299.0408338\n274.5951091\n250.1507134\n237.928515\n287.7696839\n287.7696841\n287.7696841\n299.991882\n323.72697\n849.0953703\n965.6112926\n1527.951089\n1509.048645\n1474.821639\n1481.923606\n1445.210709\n1519.588047\n1516.322771\n1516.775135\n1577.957123\n1456.177305\n1249.766207\n1221.418811\n1108.39388\n1079.453417\n349.3566409\n299.9918819\n287.7696842\n287.7696828\n287.7696829\n287.7696828\n299.9918806\n323.726967\n921.3392979\n1053.319089\n1621.846623\n1572.315937\n1505.604539\n1502.893178\n1457.895268\n1500.131872\n1498.778844\n1500.931118\n1555.233789\n1469.746761\n1290.608574\n1248.532582\n1123.454408\n1104.604342\n349.3566398\n299.9918806\n287.7696828\n287.7696812\n287.7696812\n287.7696812\n299.9918791\n323.726966\n926.1031705\n1045.90564\n1614.225611\n1561.412599\n1499.405546\n1514.410922\n1477.448472\n1521.162\n1518.700706\n1516.556066\n1562.765974\n1461.566305\n1285.821502\n1252.000826\n1154.709864\n1132.050915\n349.3566382\n299.9918791\n287.7696814\n287.7696802\n287.7696801\n287.7696801\n299.9918779\n323.7269628\n975.0095364\n1067.540076\n1607.087791\n1566.568765\n1517.563072\n1517.178561\n1467.841894\n1519.195242\n1518.340325\n1516.335959\n1565.127141\n1460.896549\n1270.055921\n1228.365483\n1117.83789\n1083.576294\n349.3566369\n299.9918777\n287.7696799\n287.7696789\n287.7696789\n287.769679\n299.9918769\n323.726961\n857.9416072\n975.6239226\n1543.420228\n1525.969872\n1495.045325\n1514.390247\n1476.724425\n1544.770696\n1537.40302\n1535.588627\n1591.535272\n1467.981159\n1248.393392\n1215.241484\n1102.976053\n1075.323098\n349.3566357\n299.9918764\n287.7696786\n237.9289504\n237.9289505\n237.9289506\n250.1511486\n248.9658691\n912.6035862\n935.9471685\n1173.565429\n1138.071434\n1109.52709\n1111.904051\n1113.700879\n1134.22145\n904.0664431\n874.1352131\n894.0972461\n841.5402532\n296.6676141\n272.2232182\n323.4852182\n299.0417069\n274.595544\n250.1511482\n237.9289504\n237.928508\n237.9285085\n237.9285083\n250.1507055\n248.9654259\n272.2218923\n296.6662884\n296.6662887\n259.999695\n211.1109032\n211.1117866\n481.400368\n540.7003776\n546.1166247\n525.1665371\n736.7068161\n736.4019549\n797.4890588\n558.251627\n323.4838925\n299.0408214\n274.595101\n250.1507056\n237.9285083\n287.7696756\n287.7696756\n287.7696756\n299.9918731\n323.7269559\n880.6927538\n1007.121017\n1587.060779\n1586.42212\n1535.065786\n1531.101448\n1486.108132\n1527.263199\n1525.017263\n1522.775918\n1569.4532\n1465.004302\n1286.687583\n1266.064785\n1162.55557\n1139.753481\n349.3566327\n299.9918735\n287.7696758\n287.7696746\n287.7696745\n287.7696744\n299.9918722\n332.2706216\n960.1798502\n1078.173078\n1624.571784\n1595.465684\n1527.762933\n1512.427672\n1462.269563\n1503.634535\n1504.276836\n1507.442674\n1557.10287\n1458.551681\n1288.735208\n1256.302394\n1149.751816\n1118.933086\n349.3566315\n299.9918724\n287.7696743\n287.7696734\n287.7696734\n287.7696737\n299.9918715\n332.27062\n914.0116924\n1048.128378\n1615.260126\n1556.765494\n1499.09414\n1495.038378\n1465.739446\n1509.386869\n1509.988958\n1514.612756\n1555.199206\n1474.105465\n1282.614747\n1259.887078\n1143.488392\n1112.58799\n349.3566305\n299.9918714\n287.7696738\n287.769673\n287.769673\n287.769673\n299.9918708\n332.270618\n925.8273452\n1049.534951\n1581.085903\n1561.601691\n1515.156061\n1515.32454\n1466.991181\n1516.205581\n1514.150073\n1511.834739\n1546.140292\n1424.813374\n1219.756276\n1219.766614\n1116.635659\n1088.74906\n349.3566299\n299.9918708\n287.769673\n287.769672\n287.7696719\n287.7696718\n299.9918696\n332.2706176\n913.7296058\n1027.539851\n1605.705289\n1569.60682\n1528.761578\n1536.056312\n1480.719026\n1542.874558\n1547.836225\n1540.329905\n1587.276401\n1462.749809\n1259.440793\n1245.766103\n1141.257488\n1118.779193\n349.3566288\n299.9918696\n287.7696719\n237.9289442\n237.9289444\n237.9289444\n250.1511422\n257.5095249\n978.0189177\n970.6431837\n1213.814308\n1173.871868\n1124.937053\n1124.651587\n1125.113405\n1125.06905\n875.7642392\n876.834845\n926.7503949\n888.7730764\n711.7135133\n781.1891681\n323.4852096\n299.0416942\n274.5955376\n250.1511421\n237.9289444\n237.9285035\n237.9285029\n237.9285032\n250.1507015\n257.5090839\n272.2218883\n296.6662836\n296.6662831\n389.1868054\n631.5881751\n724.477055\n742.9298033\n833.5100201\n764.6382032\n840.7014365\n814.9316037\n924.2433293\n799.9625763\n867.2649356\n416.8397339\n299.0408129\n409.0691118\n250.1507012\n237.9285029\n287.7696701\n287.7696701\n287.7696702\n299.991868\n332.2706136\n966.2644428\n1070.262675\n1607.916283\n1566.499118\n1515.223209\n1516.302962\n1467.147452\n1518.805073\n1518.030064\n1517.468831\n1562.30528\n1423.328497\n1219.436001\n1213.02224\n1098.305825\n1081.014292\n349.3566272\n299.991868\n287.7696702\n287.7696694\n287.7696693\n287.7696694\n299.9918674\n332.2706138\n929.2561337\n1000.789428\n1550.544742\n1533.515023\n1495.081856\n1500.460538\n1447.743976\n1508.957277\n1521.576109\n1530.130038\n1571.397593\n1436.283053\n1210.815549\n1180.091732\n1061.978753\n1030.871849\n349.3566264\n299.9918674\n287.7696697\n287.7696692\n287.7696691\n287.769669\n299.9918667\n332.2706125\n761.5655009\n939.7971146\n1514.504993\n1500.007628\n1476.091059\n1495.189789\n1445.30325\n1507.745098\n1509.591273\n1512.872646\n1568.695284\n1454.065342\n1247.779698\n1220.970158\n1097.658127\n1059.225181\n349.356626\n299.991867\n287.7696692\n287.7696689\n287.769669\n287.7696689\n299.9918666\n332.2706113\n857.9588231\n984.9252504\n1566.306295\n1573.835949\n1541.312849\n1541.097378\n1498.830553\n1540.428654\n1542.38793\n1544.834817\n1594.257511\n1481.515059\n1271.798132\n1243.53287\n1117.16121\n1098.01026\n349.3566254\n299.9918662\n287.7696685\n287.7696683\n287.7696684\n287.7696685\n299.9918664\n340.8142776\n948.644293\n1069.673566\n1579.965819\n1510.56661\n1454.294748\n1461.281181\n1411.861498\n1461.013639\n1457.724189\n1457.291592\n1509.119619\n1398.714204\n1199.577737\n1198.266026\n1101.473384\n1096.389471\n349.3566254\n299.9918662\n287.7696682\n237.9289409\n237.9289409\n237.9289411\n250.1511391\n266.0531872\n947.1623459\n979.9401269\n1236.247202\n1195.071272\n1142.93946\n1139.110125\n1126.355637\n1112.005929\n861.8372281\n857.4778681\n890.8022296\n860.8641804\n296.667601\n289.3105388\n323.485205\n299.0416885\n274.5955346\n250.151139\n237.9289413\n237.9285016\n237.928501\n237.9285009\n250.1506994\n266.0527468\n272.2218862\n296.6662817\n296.666281\n259.999688\n505.8867225\n211.1117762\n211.1117762\n211.1130956\n211.1117764\n211.1108966\n259.9996884\n296.6662819\n296.6662813\n289.309219\n323.4838862\n299.0408091\n274.595095\n250.1506992\n237.9285008\n287.7696678\n287.7696679\n287.769668\n299.9918659\n340.8142768\n937.230243\n1069.97774\n1608.195794\n1569.850164\n1523.662574\n1527.045634\n1475.182226\n1527.505714\n1523.578017\n1524.234281\n1575.22233\n1458.390934\n1260.698286\n1257.278594\n1143.376025\n1121.67537\n349.3566248\n299.9918656\n287.7696677\n287.7696676\n287.7696677\n287.7696678\n299.9918658\n340.8142772\n913.8897148\n1033.362715\n1609.103923\n1566.820684\n1520.83688\n1522.216095\n1470.951394\n1523.906051\n1524.372376\n1523.740076\n1570.285369\n1455.907526\n1259.943048\n1256.738837\n1144.644163\n1122.245154\n349.356625\n299.9918657\n287.7696678\n287.7696677\n287.7696677\n287.7696678\n299.9918657\n340.8142775\n911.1036941\n1021.366861\n1589.870904\n1567.296269\n1521.448213\n1523.618475\n1472.106841\n1525.402213\n1523.407456\n1523.186364\n1570.948393\n1454.462432\n1260.897426\n1219.119346\n1099.079475\n1073.757708\n349.356625\n299.9918659\n287.7696679\n287.7696679\n287.7696678\n287.7696678\n299.9918657\n340.8142779\n963.2511484\n1093.085415\n1619.535863\n1559.707926\n1497.807465\n1497.17048\n1452.647101\n1495.515687\n1489.680053\n1489.865624\n1547.933673\n1442.426019\n1267.892071\n1280.960054\n1167.882397\n1139.222599\n349.356625\n299.9918659\n287.7696681\n287.7696681\n287.769668\n287.7696679\n299.9918657\n340.8142779\n887.2646163\n986.5039211\n1554.699801\n1548.734488\n1520.198378\n1537.562544\n1493.66712\n1539.667722\n1531.328128\n1528.783674\n1575.379154\n1476.931824\n1281.729913\n1276.832006\n1141.418145\n1118.013247\n349.3566251\n299.991866\n287.7696683\n237.9289414\n237.9289413\n237.9289413\n250.1511389\n266.0531872\n938.0228798\n961.858101\n1223.678549\n1195.556091\n1135.493157\n1135.207372\n1134.264052\n1131.863748\n885.3605225\n887.6028161\n941.4935425\n902.6313888\n296.6676009\n297.8542052\n323.4852053\n299.0416899\n274.5955346\n250.1511389\n237.928941\n237.9285016\n237.9285021\n237.928502\n250.1506992\n274.5964148\n272.2218859\n296.6662821\n296.6662824\n259.9996886\n211.1108969\n557.7592839\n750.7673823\n739.0608629\n810.786836\n723.7552131\n856.8697554\n818.6228636\n886.0988392\n490.2785201\n323.4838859\n299.0408103\n274.5950947\n250.1506997\n237.9285021\n287.7696691\n287.769669\n287.7696689\n299.9918666\n349.3579461\n917.0866099\n1032.05308\n1609.127129\n1566.065768\n1517.632049\n1519.298285\n1468.126253\n1519.875241\n1520.85242\n1520.430432\n1561.860165\n1436.66173\n1258.812666\n1265.856343\n1145.045973\n1119.778597\n349.3566259\n299.9918669\n287.7696691\n287.7696696\n287.7696696\n287.7696695\n299.9918672\n349.3579461\n946.418046\n1057.481441\n1582.409758\n1555.400809\n1515.164874\n1515.283931\n1467.053577\n1514.858671\n1514.142176\n1513.678205\n1562.118698\n1451.366422\n1273.015467\n1283.310801\n1157.003961\n1138.262596\n349.3566262\n299.991867\n287.7696693\n287.76967\n287.7696701\n287.7696701\n299.9918679\n349.3579467\n952.7494202\n1068.557142\n1591.084839\n1540.317919\n1514.351644\n1515.868265\n1468.084713\n1517.343441\n1515.799255\n1516.896734\n1564.74027\n1454.317722\n1247.154364\n1245.47329\n1142.092276\n1134.642971\n349.3566271\n299.9918678\n287.7696699\n287.7696704\n287.7696703\n287.7696704\n299.9918683\n349.3579484\n902.010592\n1003.407872\n1580.594199\n1581.316138\n1536.234815\n1536.996892\n1478.960935\n1521.522521\n1524.888957\n1524.880608\n1568.451168\n1466.956107\n1260.354056\n1234.150714\n1072.829832\n1020.935284\n349.3566274\n299.9918684\n287.7696707\n287.7696712\n287.7696712\n287.7696712\n299.9918687\n349.3579489\n516.9925733\n663.7599867\n1327.833925\n1417.39437\n1375.549982\n1378.982911\n1329.832148\n1397.179942\n1414.703502\n1431.139046\n1490.746091\n1371.693101\n1152.911593\n1146.468602\n1005.925346\n980.3870636\n349.3566278\n299.9918687\n287.7696709\n237.9289447\n237.9289448\n237.9289449\n250.1511428\n274.5968593\n717.3538203\n768.9757966\n1067.068554\n1044.684374\n1006.327053\n1012.273989\n1019.383365\n1035.857185\n790.7356004\n797.9724642\n854.3689058\n807.4978922\n517.3199453\n306.3978773\n323.4852102\n299.0416951\n274.5955382\n250.1511427\n237.928945\n237.9285053\n237.9285048\n237.9285046\n250.150703\n274.59642\n272.2218899\n324.8209919\n624.5089919\n586.8554764\n595.7419202\n328.6013001\n512.4468525\n629.3056421\n548.835759\n538.4561362\n643.1961297\n415.9540713\n296.6662852\n306.3965558\n323.4838898\n299.0408158\n274.5950987\n250.1507031\n237.9285047\n287.7696732\n287.7696733\n287.7696734\n299.9918714\n349.3579529\n737.8423485\n946.0224416\n1533.365882\n1521.91172\n1499.21919\n1527.686245\n1493.360959\n1517.061624\n1519.960387\n1528.473318\n1568.839821\n1472.132049\n1280.096277\n1259.112243\n1089.142422\n1040.673241\n349.3566303\n299.9918713\n287.7696736\n287.7696745\n287.7696746\n287.7696745\n299.9918722\n349.3579536\n870.7705299\n1002.780384\n1568.266516\n1557.591448\n1538.536227\n1539.70562\n1481.55139\n1512.919917\n1511.992522\n1503.049497\n1544.357394\n1438.968406\n1247.396661\n1256.878984\n1131.414249\n1110.742629\n349.3566314\n299.9918723\n287.7696744\n287.7696753\n287.7696753\n287.7696751\n299.9918729\n349.3579558\n949.1428117\n1063.638268\n1595.051332\n1540.003689\n1496.997402\n1516.666532\n1469.264959\n1524.089276\n1520.656434\n1519.381632\n1564.299316\n1456.937694\n1280.563203\n1312.040575\n1156.089629\n1116.050146\n349.3566324\n299.9918733\n287.7696754\n287.7696762\n287.7696762\n287.7696762\n299.9918741\n349.3579579\n887.6651332\n985.66877\n1543.107955\n1520.764402\n1483.673485\n1494.491132\n1452.84592\n1519.399669\n1519.257219\n1520.578604\n1565.227956\n1456.902193\n1234.887731\n1237.224446\n1089.038819\n1051.68608\n349.3566334\n299.9918742\n287.7696762\n287.7696773\n287.7696772\n287.7696773\n299.9918752\n349.3579594\n846.9899782\n987.5994606\n1573.375621\n1585.196118\n1538.503445\n1535.25376\n1485.443674\n1524.10329\n1519.571946\n1521.261647\n1568.611414\n1449.381529\n1259.943899\n1280.71901\n1144.855968\n1123.285628\n349.3566345\n299.9918752\n287.7696773\n237.9289514\n237.9289513\n237.9289514\n250.1511493\n274.5968707\n955.0934434\n986.5117318\n1219.899652\n1144.736031\n1104.529361\n1094.368479\n1081.500928\n1069.673957\n805.6429079\n797.2275832\n844.3307379\n799.9849038\n296.6676151\n314.9415527\n323.4852197\n299.0417079\n274.595545\n250.1511493\n237.9289514\n237.9285103\n237.9285108\n237.928511\n250.1507084\n274.5964301\n280.7655617\n296.6662905\n323.7288105\n436.4202687\n405.1264484\n211.1117902\n211.1117903\n475.2950779\n457.6986626\n517.8504141\n709.3537798\n688.2491103\n561.7566126\n314.9402289\n323.4838955\n299.0408257\n274.5951042\n250.150708\n237.9285106\n237.928512\n237.9285118\n237.9285112\n250.1507095\n274.596432\n280.7655631\n296.6662924\n363.5862447\n621.4647692\n211.1109074\n344.8385282\n641.5338454\n716.1174308\n600.2485791\n211.1109072\n259.9996981\n296.6662921\n296.6662922\n314.9402295\n323.4838959\n299.040828\n274.5951049\n250.1507098\n237.9285121\n287.7696825\n287.7696823\n287.7696823\n299.9918801\n349.3579675\n953.0307732\n1077.121294\n1631.549703\n1585.854534\n1528.049508\n1519.855253\n1475.406041\n1513.381086\n1505.801484\n1493.083265\n1550.346971\n1473.969198\n1283.658811\n1269.629548\n1084.914621\n1038.55535\n349.3566393\n299.9918801\n287.7696825\n287.7696839\n287.769684\n287.769684\n299.9918817\n349.3579689\n520.0808528\n663.6178469\n1312.411491\n1387.117748\n1366.137555\n1395.317634\n1357.346598\n1424.203178\n1431.9998\n1429.810305\n1479.395612\n1354.522126\n1131.355955\n1147.495195\n994.0277003\n948.7060371\n349.3566408\n299.9918817\n287.7696839\n287.7696854\n287.7696853\n287.7696852\n299.9918829\n349.3579715\n465.1124608\n644.0012403\n1333.659085\n1418.732478\n1390.659954\n1405.160549\n1370.43287\n1446.456089\n1463.018733\n1467.73663\n1518.305626\n1404.594219\n1200.432232\n1224.25122\n1073.122688\n1045.68665\n349.3566423\n299.9918831\n287.7696853\n287.7696866\n287.7696866\n287.7696866\n299.9918845\n349.3579746\n661.6008343\n854.959573\n1525.576862\n1521.767217\n1491.381423\n1503.736256\n1447.48638\n1510.431689\n1500.762721\n1465.83642\n1501.989386\n1376.534783\n1148.822959\n1112.462934\n900.4877977\n847.5284806\n349.3566437\n299.9918845\n287.7696866\n237.9289611\n237.9289611\n237.9289611\n250.1511591\n274.5968863\n398.532536\n543.2432716\n973.3462284\n1080.394343\n1056.717183\n1062.809594\n1063.202777\n1065.232435\n817.5571987\n835.0791932\n886.6274141\n849.9097051\n536.0139575\n323.4852338\n323.4852336\n299.0417248\n274.5955546\n250.1511592\n237.9289613\n237.9285191\n237.9285186\n237.9285184\n250.1507168\n274.5964443\n289.309237\n296.6662994\n296.6662989\n259.9997053\n501.3350676\n413.0027643\n311.8500981\n211.1131355\n211.1118025\n211.1109143\n259.9997052\n296.6662992\n296.6662993\n323.4839033\n323.483903\n299.0408404\n274.5951119\n250.1507169\n237.9285192\n287.7696918\n287.7696917\n287.7696915\n299.9918893\n349.3579819\n902.9602066\n972.705729\n1498.688452\n1473.341653\n1431.506013\n1422.146119\n1386.440842\n1479.763456\n1487.727159\n1490.446854\n1533.023798\n1395.704564\n1181.15238\n1184.739127\n1027.928823\n985.5225294\n349.3566485\n299.9918894\n287.7696917\n287.7696935\n287.7696935\n287.7696936\n299.9918913\n349.3579842\n556.4356505\n667.60727\n1319.429032\n1432.649892\n1416.491246\n1438.743704\n1402.432022\n1469.882475\n1482.224557\n1493.437838\n1544.920816\n1422.220369\n1211.562324\n1211.636466\n1049.493184\n1017.41988\n349.3566505\n299.9918913\n287.7696935\n287.7696952\n287.7696951\n287.7696951\n299.9918928\n349.3579876\n691.7133109\n898.5824921\n1529.299914\n1525.073322\n1508.655399\n1533.775454\n1485.734508\n1530.114038\n1520.629284\n1517.643779\n1565.799144\n1462.570371\n1291.17132\n1303.760193\n1141.682909\n1132.968643\n349.356652\n299.9918927\n287.769695\n287.7696968\n287.7696968\n287.769697\n299.9918948\n349.3579907\n933.006667\n1016.734696\n1602.210601\n1568.874918\n1519.65207\n1517.217459\n1469.387974\n1516.605498\n1514.718767\n1514.792023\n1564.428204\n1454.319643\n1281.78349\n1296.875394\n1148.769467\n1132.023015\n349.3566538\n299.9918947\n287.7696969\n287.7696988\n287.769699\n287.7696989\n299.9918968\n349.3579937\n948.2572524\n1046.577702\n1620.680546\n1585.432712\n1505.676965\n1507.948761\n1473.473257\n1518.33505\n1515.827345\n1519.565638\n1570.779451\n1465.116354\n1277.209624\n1291.978515\n1145.90208\n1122.95884\n349.3566557\n299.9918966\n287.7696987\n237.9289736\n237.9289736\n237.9289737\n250.1511716\n274.5969064\n967.5142551\n966.0000718\n1234.500541\n1187.084498\n1129.609998\n1126.923385\n1138.496484\n1154.072505\n905.2800405\n905.0864999\n928.8582445\n856.4685881\n313.7549799\n323.4852505\n323.4852506\n299.0417484\n274.5955671\n250.1511716\n237.9289736\n237.9285287\n237.9285292\n237.9285295\n250.1507271\n274.5964623\n289.3092471\n296.6663088\n296.6663092\n259.9997162\n211.1109249\n211.1118179\n211.111818\n211.1131577\n211.1118183\n211.1109246\n259.9997162\n296.6663097\n313.7536427\n323.4839134\n323.4839139\n299.0408582\n274.5951227\n250.1507273\n237.9285293\n287.7697048\n287.7697048\n287.7697048\n299.9919026\n349.3580036\n962.1696118\n1079.333081\n1609.025687\n1551.677915\n1489.377758\n1492.765376\n1470.565548\n1518.775006\n1516.403074\n1515.442271\n1565.339689\n1449.288434\n1267.73318\n1293.114772\n1148.090865\n1129.720031\n349.3566619\n299.9919027\n287.7697049\n287.7697071\n287.769707\n287.7697072\n299.9919049\n349.3580066\n958.72282\n1034.871761\n1612.46705\n1580.522425\n1516.396292\n1502.179187\n1457.273214\n1517.591231\n1515.789911\n1517.802165\n1566.396763\n1460.9046\n1293.132659\n1314.644738\n1167.460815\n1139.586637\n349.3566638\n299.9919047\n287.769707\n287.7697092\n287.7697092\n287.7697092\n299.9919071\n349.3580096\n912.4816997\n982.6694803\n1544.263784\n1559.63115\n1520.830593\n1507.801525\n1469.747318\n1515.553746\n1515.050551\n1516.349264\n1566.312961\n1466.389417\n1293.805206\n1303.451516\n1156.685417\n1135.871683\n349.3566661\n299.9919069\n287.7697091\n287.7697114\n287.7697114\n287.7697114\n299.9919092\n349.3580136\n983.4232468\n1078.925712\n1626.98009\n1580.053927\n1517.135006\n1514.369927\n1471.324851\n1518.594966\n1532.765705\n1537.57344\n1551.831116\n1408.872378\n1207.347698\n1212.026802\n1056.384201\n1022.244994\n349.3566681\n299.991909\n287.7697112\n287.7697135\n287.7697134\n287.7697134\n299.9919112\n349.3580168\n404.634967\n620.6468584\n1313.389413\n1366.822419\n1387.470703\n1419.000222\n1379.024206\n1435.916055\n1436.817627\n1436.765682\n1474.324324\n1340.115529\n1151.869917\n1144.52604\n995.9584253\n888.0009078\n349.3566704\n299.9919112\n287.7697135\n237.9289887\n237.9289888\n237.9289888\n250.1511866\n274.59693\n404.1262448\n412.6772636\n739.1339117\n833.2550706\n865.8469892\n960.4756233\n985.6265982\n1006.877936\n776.5634357\n798.5588676\n845.7652675\n799.5218848\n322.2986672\n323.4852719\n323.4852722\n299.0417742\n274.5955822\n250.1511866\n237.9289888\n237.9285416\n237.9285413\n237.9285409\n250.1507392\n274.596484\n297.852926\n296.6663219\n296.6663218\n259.999728\n211.1109367\n232.5689949\n539.6086468\n538.2905273\n586.5338448\n440.8304653\n438.9187994\n296.6663213\n322.2973212\n323.4839261\n323.4839262\n299.0408792\n274.595135\n250.1507392\n237.9285409\n287.7697203\n287.7697204\n287.7697204\n299.9919183\n349.3580283\n403.4675272\n512.4097784\n1065.986408\n1201.054239\n1241.061959\n1366.894322\n1325.191235\n1387.881235\n1399.883075\n1408.226184\n1453.971891\n1328.11339\n1139.628016\n1132.888202\n894.7750052\n715.9082736\n349.3566773\n299.9919181\n287.7697204\n287.7697228\n287.7697227\n287.7697228\n299.9919206\n349.3580317\n416.6689363\n554.3563026\n1225.397882\n1236.371952\n1283.388858\n1422.386122\n1397.491751\n1466.054877\n1474.276514\n1456.373347\n1487.583865\n1359.871707\n1164.143351\n1158.3898\n1045.375146\n1029.304359\n349.3566797\n299.9919205\n287.7697228\n287.7697254\n287.7697253\n287.7697253\n299.9919232\n349.3580356\n972.5047547\n1079.823057\n1616.907196\n1563.114193\n1506.304098\n1506.606511\n1460.710281\n1501.035412\n1499.405359\n1499.128877\n1551.50326\n1448.224065\n1277.492648\n1281.548838\n1159.469649\n1108.619713\n349.3566825\n299.9919233\n287.7697255\n287.7697279\n287.7697279\n287.7697279\n299.9919256\n349.3580392\n578.1662838\n647.7518893\n1219.806789\n1305.00124\n1406.950593\n1418.1483\n1365.59454\n1421.437312\n1410.866973\n1406.70872\n1442.851157\n1314.946805\n1073.667735\n942.452325\n710.5519791\n621.6069488\n349.3566849\n299.9919257\n287.7697279\n287.7697304\n287.7697304\n287.7697304\n299.9919281\n349.3580433\n412.7117605\n499.7651694\n1047.976546\n1012.395645\n1090.189593\n1221.704565\n1301.106552\n1383.403261\n1393.507031\n1397.96656\n1449.286638\n1329.806919\n1147.138038\n1076.321115\n842.2357254\n752.7346699\n349.3566871\n299.991928\n287.7697302\n237.9290057\n237.9290058\n237.9290058\n250.1512036\n274.5969574\n424.4742637\n485.8019943\n876.3256445\n991.3006499\n1009.373566\n1024.775003\n1026.504789\n1030.087864\n789.1220267\n790.4127846\n831.3668206\n785.3235942\n330.842358\n323.4852952\n323.4852957\n299.0418054\n274.5955991\n250.1512035\n237.9290058\n237.9285552\n237.9285548\n237.928555\n250.1507532\n274.5965078\n306.3966066\n378.7981831\n846.2411039\n711.7090307\n710.7445491\n627.0281061\n715.1512042\n605.6659854\n698.921113\n594.5317315\n726.4676438\n598.3828606\n330.8410016\n323.4839398\n323.48394\n299.0409034\n274.5951488\n250.1507532\n237.9285552\n287.7697379\n287.7697379\n287.769738\n299.9919357\n349.358056\n847.9453159\n897.7661846\n1444.853786\n1447.774322\n1427.61618\n1432.694896\n1386.036639\n1439.192236\n1444.655851\n1456.956517\n1508.679651\n1386.449446\n1102.183052\n973.1162268\n834.0688448\n762.975224\n349.3566949\n299.9919358\n287.7697381\n287.7697406\n287.7697406\n287.7697406\n299.9919384\n349.3580602\n411.9492817\n543.3625662\n1203.24354\n1252.102547\n1282.174462\n1346.799408\n1291.371706\n1325.776189\n1296.842849\n1239.023073\n1332.778241\n1328.317567\n1212.199377\n1169.432962\n1027.333225\n1029.978978\n349.3566977\n299.9919385\n287.7697407\n287.7697435\n287.7697434\n287.7697434\n299.9919412\n349.3580642\n917.838552\n1016.015075\n1558.804271\n1521.662883\n1499.897804\n1527.91816\n1473.835262\n1517.262955\n1508.844083\n1511.118471\n1569.526256\n1479.339759\n1327.520236\n1291.534689\n1131.421362\n1076.942313\n349.3567002\n299.9919411\n287.7697434\n287.769746\n287.7697459\n287.7697459\n299.9919438\n349.3580688\n493.6057845\n612.3570573\n1180.527381\n1184.505957\n1228.86204\n1252.129463\n1144.583801\n1173.977672\n1233.211107\n1240.364832\n1260.337114\n1116.855397\n933.1917542\n899.1436017\n707.3293676\n633.9420753\n349.356703\n299.9919438\n287.769746\n287.7697487\n287.7697488\n287.7697488\n299.9919465\n349.3580732\n420.2670191\n499.8257821\n1047.969519\n1011.289556\n1061.913899\n1111.0393\n1078.495896\n1133.995766\n1136.15831\n1113.380124\n1095.284229\n898.6734726\n741.8080647\n725.9248497\n576.4361597\n552.0120823\n349.3567057\n299.9919466\n287.7697487\n237.9290244\n237.9290244\n237.9290245\n250.1512223\n274.5969864\n419.3095986\n400.2781342\n649.34386\n612.6288615\n563.8105118\n565.4572089\n567.2282141\n568.0722538\n372.871185\n414.5229009\n461.0942629\n381.1794591\n339.3860504\n323.4853219\n323.4853221\n299.0418386\n274.5956178\n250.1512222\n237.9290245\n237.9285704\n237.9285706\n237.9285705\n250.1507679\n274.5965344\n314.9402882\n296.6663501\n296.6663502\n259.9997572\n263.5065845\n427.8812515\n568.6603379\n531.8875227\n588.8402054\n541.3866215\n569.9059021\n368.9568586\n339.3846838\n323.4839551\n323.4839551\n299.0409297\n274.5951639\n250.1507682\n237.9285701\n237.9285722\n237.9285726\n237.9285727\n250.1507705\n274.596538\n314.9402907\n296.6663528\n296.6663524\n259.9997591\n359.6715967\n630.3549893\n724.5493776\n664.5397726\n712.0711574\n610.4551023\n527.7434493\n296.6663527\n347.9283524\n323.483957\n323.4839573\n299.040934\n274.595166\n250.1507705\n237.9285728\n287.76976\n287.7697599\n287.7697599\n299.9919577\n349.3580906\n493.8663582\n528.7932866\n1048.013953\n1011.314115\n963.1585879\n965.4227996\n916.5907505\n966.994773\n967.1641091\n965.6900809\n1012.421431\n898.4311241\n750.3647235\n725.9463043\n576.4597635\n552.025952\n349.3567169\n299.9919578\n287.76976\n287.7697629\n287.7697628\n287.7697628\n299.9919606\n349.3580958\n419.1490589\n499.9734943\n1048.06519\n1011.336041\n962.422608\n962.4252788\n912.7590435\n964.7828203\n964.560667\n963.4335692\n1011.564065\n898.4311083\n750.3662718\n725.9414793\n576.4544296\n558.5623959\n349.3567196\n299.9919605\n287.7697627\n287.7697656\n287.7697657\n287.7697657\n299.9919635\n349.3580997\n419.1904966\n499.9188747\n1048.029998\n1011.334418\n962.4333744\n962.4230527\n912.5871499\n982.0279145\n1007.834894\n1002.060727\n1011.281664\n898.444261\n776.5340982\n765.1747268\n576.4466938\n552.0148354\n349.3567224\n299.9919633\n287.7697656\n287.7697685\n287.7697685\n287.7697685\n299.9919663\n349.3581044\n419.1683394\n545.8621813\n1160.746541\n1192.076494\n1318.940425\n1434.505587\n1413.285413\n1477.821801\n1478.444952\n1478.276609\n1528.064084\n1403.977298\n1244.779796\n1217.974012\n1073.588022\n1057.216217\n349.3567256\n299.9919664\n287.7697685\n237.9290444\n237.9290444\n237.9290444\n250.1512422\n274.5970194\n918.1680218\n894.3090278\n1149.203807\n1108.260764\n1059.235478\n1089.3384\n1125.855507\n1115.156995\n866.0380428\n870.0073636\n923.2827368\n884.5660505\n347.9297455\n323.4853497\n323.4853493\n299.0418751\n274.5956377\n250.1512421\n237.9290443\n237.9285863\n237.9285861\n237.9285861\n250.1507842\n274.5965627\n323.4839709\n296.6663667\n296.6663668\n259.9997733\n237.0540886\n395.8799594\n397.1700793\n336.138806\n377.0531705\n418.4004786\n329.7430614\n305.2100331\n347.9283667\n323.4839711\n323.483971\n299.0409578\n274.5951799\n250.1507842\n237.9285861\n287.7697773\n287.7697773\n287.7697773\n299.9919751\n349.3581187\n427.104179\n499.918426\n1048.003195\n1011.3052\n963.6016868\n964.7219436\n1017.10281\n1097.535094\n1134.508316\n1145.700398\n1178.574104\n1051.111996\n861.6653176\n807.3891766\n614.2978325\n564.6212288\n349.3567342\n299.9919751\n287.7697773\n287.7697803\n287.7697803\n287.7697802\n299.991978\n349.3581231\n427.5311804\n499.893499\n1047.987224\n1011.302327\n962.4206684\n962.4330203\n912.6072199\n962.422055\n962.4135329\n962.4137171\n1011.313285\n907.0157968\n750.4065593\n725.9807079\n576.5028363\n552.0746494\n349.3567373\n299.9919781\n287.7697802\n287.7697832\n287.7697832\n287.7697832\n299.991981\n349.3581283\n427.4931427\n499.9636159\n1048.027442\n1011.320686\n962.4202247\n963.0156785\n913.5456734\n963.3462174\n962.4975185\n962.4017154\n1011.287313\n906.993445\n750.4011437\n725.9741268\n576.4963955\n552.0675225\n349.3567403\n299.9919811\n287.7697833\n287.7697863\n287.7697862\n287.7697862\n299.991984\n349.3581331\n427.5192411\n500.0161711\n1048.047093\n1011.327139\n963.0946984\n964.0894024\n912.9446259\n1034.659997\n1107.688556\n1154.774803\n1230.468984\n1141.578998\n963.1400619\n865.8060991\n709.6776142\n624.2953187\n349.356743\n299.9919839\n287.7697861\n287.7697891\n287.7697891\n287.7697891\n299.9919869\n349.3581374\n427.6843053\n499.8837076\n1047.983394\n1017.752065\n1029.493584\n1108.952217\n1102.069786\n1104.152607\n1077.85993\n1038.036708\n1013.961735\n907.0677393\n750.3469147\n725.9218791\n576.4364302\n552.0061747\n349.3567462\n299.991987\n287.7697892\n237.9290651\n237.9290651\n237.9290652\n250.151263\n274.5970521\n427.4900205\n400.2318884\n649.3465651\n630.1748385\n707.3983813\n907.3089841\n1005.632433\n1020.426052\n756.9382459\n756.2743415\n802.4530259\n763.9695744\n347.9297746\n323.4853788\n323.4853783\n299.0419123\n274.5956585\n250.1512629\n237.929065\n237.9286031\n237.928603\n237.9286028\n250.1508005\n274.5965921\n323.4839875\n296.6663829\n296.6663831\n259.9997899\n500.8285874\n522.36231\n567.8812549\n552.938389\n615.7162277\n563.6511506\n665.4815467\n389.8803928\n347.9283832\n323.4839873\n323.4839874\n299.0409878\n274.5951962\n250.1508006\n237.928603\n287.7697982\n287.7697982\n287.7697982\n299.991996\n349.3581527\n427.0539235\n629.8883119\n1281.781625\n1354.062648\n1415.640243\n1445.637874\n1423.197719\n1492.693905\n1497.052645\n1493.017526\n1535.837419\n1413.556593\n1230.237162\n1196.051037\n1036.587129\n987.0560237\n349.356755\n299.9919959\n287.7697982\n287.7698012\n287.7698011\n287.7698011\n299.9919989\n349.3581573\n427.8811369\n508.3932374\n1047.974804\n1011.520063\n964.8575147\n967.4304802\n918.84405\n1067.726927\n1115.699415\n1115.674328\n1129.1515\n929.5282666\n750.3498815\n725.920267\n576.4372018\n552.0075858\n349.3567579\n299.9919989\n287.7698012\n287.7698042\n287.7698041\n287.7698041\n299.992002\n349.3581621\n430.6684362\n508.5027294\n1048.015855\n1011.436657\n964.2805448\n966.4424666\n917.5297015\n1091.478295\n1179.117863\n1245.101543\n1262.346369\n1097.479341\n824.0878977\n725.9195477\n576.43135\n551.9964436\n349.356761\n299.9920019\n287.7698042\n287.7698072\n287.7698072\n287.7698072\n299.9920051\n349.358167\n428.2944822\n508.4205675\n1060.63898\n1011.33533\n962.4422633\n962.4400379\n912.6092994\n962.4306901\n962.4113711\n962.5261098\n1011.693204\n915.5597193\n750.4026974\n725.9766091\n576.4931911\n552.0547031\n349.356764\n299.992005\n287.7698071\n287.7698102\n287.7698102\n287.7698103\n299.9920081\n349.3581718\n427.7915711\n508.4625504\n1054.588466\n1011.352314\n962.4418345\n962.4336918\n912.6006223\n962.422978\n962.4105203\n962.4123342\n1011.311931\n915.5548043\n750.3935353\n725.9624938\n576.4831005\n552.049416\n349.3567671\n299.992008\n287.7698102\n237.9290862\n237.9290863\n237.9290862\n250.151284\n274.5970862\n427.2479369\n434.939205\n668.9928969\n612.6756084\n659.1971544\n816.5496375\n949.7757193\n961.1276997\n766.7929901\n776.4663318\n821.0887453\n806.2404984\n347.9298035\n323.4854085\n323.4854084\n299.0419505\n274.5956796\n250.1512841\n237.9290862\n237.92862\n237.9286199\n237.9286197\n250.1508176\n274.596622\n323.4840044\n305.2100666\n296.6664001\n259.9998069\n235.8447923\n577.3985118\n561.4572204\n635.9374717\n581.9883318\n629.5671078\n496.6801851\n322.2974004\n347.9284003\n323.4840047\n323.4840045\n299.0410169\n274.5952134\n250.1508177\n237.9286198\n287.7698194\n287.7698195\n287.7698195\n299.9920172\n349.3581859\n575.0482473\n641.9397718\n1241.196149\n1331.770897\n1394.507489\n1380.638815\n1341.348052\n1391.206905\n1378.174475\n1362.710336\n1373.952292\n1078.541591\n750.3517998\n725.9317499\n576.4540191\n552.0277181\n349.3567765\n299.9920174\n287.7698196\n287.7698225\n287.7698225\n287.7698225\n299.9920203\n349.3581911\n427.4068714\n508.6346824\n1048.073777\n1011.410593\n964.2119114\n965.8600999\n917.4168587\n968.5744132\n968.2001852\n966.4568317\n1012.834701\n924.1032804\n750.4156359\n725.9859215\n576.4976233\n552.0715364\n349.3567794\n299.9920202\n287.7698225\n287.7698256\n287.7698255\n287.7698256\n299.9920235\n349.3581961\n427.5122598\n517.0304733\n1048.020608\n1011.316184\n962.4211917\n963.0815168\n915.4378544\n966.7771001\n966.4750815\n965.086266\n1012.104465\n924.0799567\n750.4011013\n725.969927\n576.482746\n552.0555227\n349.3567822\n299.9920232\n287.7698255\n287.7698285\n287.7698285\n287.7698286\n299.9920264\n349.3582014\n427.583981\n517.0559022\n1048.021439\n1011.530471\n964.8967336\n1088.947522\n1201.842269\n1329.745389\n1338.780666\n1341.920829\n1390.562959\n1288.337163\n1004.675786\n920.6414492\n766.1448731\n704.8147111\n349.3567855\n299.9920264\n287.7698286\n287.7698316\n287.7698317\n287.7698317\n299.9920295\n349.3582057\n427.9949994\n516.9829213\n1047.996655\n1011.350922\n1052.306265\n1156.777301\n1114.906894\n1152.713675\n1127.613482\n1106.690363\n1110.565102\n924.0918721\n750.3672819\n725.9338752\n576.4450336\n552.0131981\n349.3567887\n299.9920295\n287.7698316\n237.9291077\n237.9291076\n237.9291076\n250.1513054\n274.5971203\n427.5813224\n417.3539719\n649.3968734\n612.7162068\n563.8050118\n563.7762598\n563.7452959\n563.7419206\n314.5906569\n327.235804\n376.6028883\n351.099478\n347.9298335\n323.4854385\n323.4854384\n299.041989\n274.595701\n250.1513053\n237.9291075\n237.9286371\n237.9286371\n237.9286369\n250.1508347\n274.5966513\n323.4840217\n313.7537506\n296.6664171\n259.9998236\n211.1110325\n211.1119802\n211.11198\n211.1134006\n211.1119799\n211.1110327\n259.9998238\n330.8410838\n347.9284171\n323.4840216\n323.4840217\n299.0410471\n274.5952304\n250.1508348\n237.9286371\n287.7698408\n287.7698408\n287.7698409\n287.7698409\n299.9920387\n349.3582201\n393.0775177\n499.9742831\n1048.034389\n1011.948902\n965.2767715\n1038.318634\n1074.892537\n1090.309177\n1170.262856\n1358.113841\n1476.147363\n1255.224883\n1036.52111\n1004.326084\n787.3153651\n714.3399091\n349.3567976\n299.9920385\n287.7698437\n287.7698437\n287.7698437\n287.7698437\n299.9920416\n349.3582256\n393.066519\n512.4329754\n1160.754977\n1205.019868\n1212.862431\n1185.331054\n1076.487247\n1105.00061\n1046.616976\n962.4096741\n1045.485653\n949.7248829\n750.3802882\n725.9441046\n576.4607514\n552.0342034\n349.3568006\n299.9920415\n287.7698467\n287.7698468\n287.7698467\n287.7698468\n299.9920446\n349.3582303\n393.3222255\n499.9285518\n1048.052061\n1011.344292\n962.4444324\n962.4406867\n912.6095668\n962.4377975\n962.4302551\n962.4344703\n1045.508894\n949.7484749\n750.4318914\n725.9996975\n576.5177242\n552.084411\n349.3568037\n299.9920446\n287.7698499\n287.7698499\n287.7698499\n287.7698499\n299.9920477\n349.3582346\n401.7492605\n499.9084119\n1048.003705\n1011.991439\n965.4669493\n1076.589669\n1148.238763\n1331.993112\n1352.920442\n1353.964262\n1367.390304\n1134.014201\n881.4425197\n854.2258045\n703.5971377\n644.7104978\n349.3568065\n299.9920475\n287.7698527\n287.7698528\n287.7698528\n287.7698529\n299.9920507\n349.3582393\n404.5512276\n499.8637513\n1047.980353\n1042.765322\n1066.150458\n1118.990755\n1067.86513\n1117.971494\n1093.717299\n994.0338685\n1046.556256\n949.7111231\n750.3764882\n725.9414646\n576.4489219\n552.0130605\n349.3568096\n299.9920505\n237.9286515\n237.9286515\n237.9286516\n237.9286516\n250.1508493\n274.5966762\n297.8530362\n296.6664318\n296.6664318\n259.9998383\n211.1110471\n211.1120014\n211.1120013\n211.1134335\n211.1120014\n211.1110471\n294.174505\n347.9284318\n347.9284318\n323.4840362\n323.4840361\n299.0410718\n274.5952449\n250.1508494\n237.9286539\n237.9286539\n237.9286539\n237.9286537\n250.1508515\n274.5966807\n297.8530385\n296.666434\n296.666434\n259.9998405\n211.1110493\n211.1120054\n211.1120049\n211.1134389\n211.1120048\n211.1110495\n294.1745074\n347.9284342\n349.4705901\n325.4129857\n325.0286691\n300.9723775\n276.1423673\n252.0857178\n289.3200357\n289.707605\n289.3234131\n289.711442\n301.5501473\n351.3030577\n444.0330126\n500.3630362\n1048.336574\n1011.53353\n962.5636876\n962.537169\n912.7112526\n962.5149917\n962.4952492\n962.4837712\n1045.583286\n949.8548251\n750.5434812\n726.1066932\n576.6248259\n552.1761255\n349.3568185\n299.9920594\n287.7698645\n287.7698646\n287.7698646\n287.7698648\n299.9920626\n349.3582583\n401.617412\n499.9972468\n1048.081895\n1074.182193\n1136.567274\n1316.642392\n1367.262336\n1428.740174\n1428.924179\n1421.980887\n1483.531661\n1319.056231\n1009.154173\n965.2390351\n889.667996\n892.6058374\n349.3568218\n299.9920627\n287.7698677\n287.7698676\n287.7698675\n287.7698676\n299.9920653\n349.3582637\n401.6849926\n499.8511899\n1047.977515\n1011.995334\n965.3117323\n967.0517754\n917.2458199\n1050.407471\n1060.855698\n976.3063999\n1054.027142\n949.7276337\n750.3911218\n725.9581812\n576.467345\n552.0332151\n349.3568248\n299.9920656\n287.7698706\n287.7698706\n287.7698704\n287.7698705\n299.9920682\n349.3582683\n410.4761834\n499.9147994\n1048.003919\n1011.591592\n964.8545992\n966.5209522\n916.8425281\n966.3427795\n965.2518381\n963.193633\n1054.08053\n949.7459541\n750.4188094\n725.9860344\n576.5052133\n552.0909054\n349.3568272\n299.9920682\n287.7698733\n287.7698734\n287.7698734\n287.7698736\n299.9920713\n349.3582723\n410.5225937\n500.0252011\n1048.087267\n1011.378692\n962.4697521\n962.4639576\n912.6372784\n962.4586696\n962.4500627\n962.4556527\n1054.072766\n949.7821579\n750.4633302\n726.0271985\n576.5478704\n552.1011744\n349.3568306\n299.9920712\n237.9291493\n237.9291492\n237.9291492\n237.9291493\n250.1513471\n274.5971868\n774.5497531\n930.3869329\n1211.165903\n1184.718358\n1133.140921\n1103.14634\n1072.143092\n1050.601759\n742.4638469\n608.8267348\n497.472488\n376.6681962\n347.9298919\n323.4854968\n323.4854962\n299.0420635\n274.5957427\n250.1513472\n237.9286702\n237.9286702\n237.9286702\n237.9286703\n250.1508681\n274.5967096\n306.3967215\n296.6664504\n296.6664504\n262.092515\n232.0646199\n228.9965532\n234.1150997\n248.8729906\n231.4084167\n260.4302514\n302.7181904\n347.9284504\n347.9284505\n323.4840547\n323.4840547\n299.041105\n274.5952635\n250.150868\n287.7698819\n287.7698819\n288.9258624\n289.3121254\n301.9203766\n350.9018373\n410.3513766\n500.0688184\n1048.110926\n1012.651331\n966.3147968\n968.2435837\n918.6756384\n967.61893\n964.9908656\n963.093301\n1054.080785\n949.7985934\n750.4808146\n726.0593273\n576.5996329\n552.1769842\n349.3568393\n299.9920801\n287.7698849\n287.7698848\n287.7698849\n287.7698848\n300.7636231\n350.9020113\n410.3933811\n500.5646665\n1048.618647\n1011.883601\n962.9582698\n962.8960851\n913.0168867\n962.7918039\n962.8110847\n962.8391448\n1054.460353\n950.1774924\n750.9197726\n726.5267629\n577.0686152\n552.6450673\n349.3568417\n299.9920826\n287.7698877\n287.7698876\n289.7013246\n289.316595\n301.9278112\n350.9073898\n410.5933092\n500.5988571\n1048.658069\n1011.939825\n963.0055808\n962.9333391\n913.0908369\n962.8848855\n962.8711089\n962.8764316\n1054.465657\n950.1614187\n750.8627857\n726.4365563\n576.9697896\n552.542893\n349.3568447\n299.9920856\n237.9286792\n238.3149287\n239.8602563\n239.4764872\n252.0867082\n276.1482033\n308.3357033\n298.2206377\n298.6059177\n261.5527342\n213.0476875\n212.6623164\n213.0467955\n212.6623725\n213.0477038\n212.6624393\n304.6579263\n349.4835447\n349.8722722\n325.0433113\n325.4321504\n300.6030092\n276.5453634\n251.7144625\n289.719285\n289.3317673\n289.7186874\n289.329005\n301.9387488\n350.9151934\n410.7982576\n500.3696972\n1048.295012\n1011.558799\n962.6280188\n962.6031656\n912.7770287\n975.2076253\n962.5923578\n962.586957\n1054.189318\n949.8960673\n750.5761002\n726.1345806\n576.6533166\n552.2124518\n349.3568503\n299.9920912\n237.9291692\n237.9291689\n237.9291688\n237.9291689\n250.1513667\n274.9835402\n419.0715572\n400.6654182\n649.6682427\n612.9446841\n563.9988215\n563.9668763\n563.9579672\n563.933441\n314.8101855\n314.8536887\n406.592898\n377.187818\n347.9299194\n323.4855246\n323.4855239\n299.4279624\n276.5263875\n251.6998154\n239.8669425\n239.4858247\n239.8743303\n242.5648856\n271.2878029\n291.5468584\n336.1257603\n313.6030319\n317.7939225\n276.9057319\n232.2169455\n225.7064676\n229.9122056\n224.1558688\n222.6192326\n231.8059937\n319.9910722\n368.6812998\n365.2487144\n344.2956389\n340.8526955\n319.9135813\n292.0296249\n271.0973146\n305.23924\n308.7368166\n305.2618871\n308.7614199\n326.0738401\n399.7851396\n440.5407331\n503.9378122\n1051.190525\n1013.936152\n964.7772372\n964.6722866\n914.5856995\n963.9903858\n963.787098\n963.4628449\n1063.455148\n950.62374\n751.328696\n726.7248418\n577.2178163\n552.7796295\n349.3568587\n299.9920993\n287.7699041\n287.7699041\n288.9286298\n289.7054956\n301.5426976\n351.3006611\n419.6521332\n501.5321638\n1049.364073\n1012.608061\n963.6415434\n963.5913106\n913.756416\n963.2392882\n962.8930024\n962.7184407\n1062.831884\n949.983494\n750.6634725\n726.2294941\n576.8034617\n552.4010943\n349.3568613\n299.9921021\n287.7699068\n287.7699067\n287.7699068\n288.5423156\n301.5374009\n351.291687\n419.2829808\n500.4643469\n1048.286547\n1011.548971\n964.3699337\n966.4655106\n916.8988642\n966.0422072\n963.8718491\n962.4910383\n1062.67515\n949.8328108\n750.5130909\n726.0947151\n576.6169632\n552.1767328\n349.356864\n299.9921046\n287.7699094\n287.7699094\n287.7699095\n287.7699095\n299.9921074\n349.3583301\n418.8472252\n506.6447722\n1048.138108\n1011.415175\n963.6025062\n965.3794659\n915.4093731\n964.4843683\n962.8038338\n962.4569991\n1062.631448\n949.791345\n750.4613908\n726.032936\n576.566129\n552.1318512\n349.3568661\n299.9921072\n287.7699123\n287.7699122\n287.769912\n287.769912\n299.9921098\n349.3583347\n418.6819999\n500.0137481\n1048.125923\n1011.430663\n962.5103308\n962.8350456\n914.2553855\n964.4030152\n963.5223239\n962.4635087\n1062.631085\n949.7975073\n750.481445\n726.0694857\n576.6109123\n552.2019947\n349.3568687\n299.9921096\n237.9291876\n237.9291878\n237.9291878\n237.9291875\n251.3090192\n276.5284501\n419.0218067\n400.9593125\n649.8202285\n613.0226455\n564.3415217\n564.4005445\n564.4630408\n564.3976371\n315.2174538\n315.5586958\n416.0823101\n378.2485299\n347.9299464\n324.6448783\n325.0361155\n300.9847621\n276.1643524\n255.9477969\n258.7087468\n255.2896345\n258.7802704\n255.3488371\n271.052916\n292.0703482\n344.433262\n314.1604787\n317.5135831\n277.3687188\n238.4464872\n228.4341736\n231.8554349\n228.3874172\n250.1296854\n228.3839597\n338.5584289\n375.7315873\n368.7282561\n340.8515449\n344.3264695\n316.4558336\n295.4776085\n267.6029302\n308.6772865\n305.2441435\n308.7011419\n305.2632953\n320.9386632\n366.8489631\n429.676304\n502.4118598\n1049.444609\n1012.344685\n963.2448332\n963.0684167\n913.221039\n962.9103959\n962.8845463\n962.9903605\n1063.268293\n950.4721662\n751.2870307\n726.9418835\n577.6250761\n553.2998266\n349.3568769\n299.9921177\n289.3162186\n289.7066196\n289.328408\n298.1527839\n320.7533424\n366.6839825\n428.627134\n503.0415708\n1050.183816\n1012.885842\n963.5900513\n963.3681554\n913.3819397\n963.1053281\n963.0595599\n963.0064273\n1063.063222\n950.1862492\n750.9225897\n726.5189786\n577.0935177\n552.6787354\n349.3568792\n299.99212\n287.7699247\n288.3491901\n289.3143447\n289.7018356\n301.5388344\n351.2939076\n427.9425664\n500.6979712\n1049.023682\n1012.647951\n963.6929251\n963.6310969\n913.7512567\n963.4456409\n963.3064046\n962.9982885\n1062.992435\n950.3236324\n751.3079147\n727.0068437\n577.546946\n553.1173125\n349.3568819\n299.9921228\n288.9289317\n289.7045414\n289.3189026\n289.7094935\n301.5447103\n351.302548\n428.0912044\n501.2310356\n1049.089398\n1012.276621\n963.2382376\n963.0795068\n913.3263721\n963.1730919\n963.0977798\n963.0758208\n1063.336016\n950.5559836\n751.2671398\n726.8454083\n577.3361972\n552.8783134\n349.3568844\n299.9921252\n287.7699297\n289.3156298\n289.7044753\n289.3211656\n301.9321538\n350.9156365\n428.0188574\n501.1846383\n1048.856937\n1011.943878\n963.0095123\n963.0815893\n914.4131191\n964.7130195\n963.6871433\n962.5831286\n1062.791798\n950.0077038\n750.7693131\n726.4097547\n577.0128425\n552.6210255\n349.3568867\n299.9921274\n237.929205\n238.7012514\n239.4746349\n239.8650757\n251.7024488\n276.5426297\n427.8992317\n401.6690485\n650.336038\n613.3403783\n564.2122965\n564.1467463\n565.0968687\n565.2847952\n315.083526\n315.0592687\n415.2676253\n377.2600753\n347.9299703\n323.4855743\n323.4855747\n299.0421639\n274.5957983\n252.0798069\n239.4726052\n239.861331\n239.4755921\n239.8651293\n251.7009613\n276.535761\n325.035107\n298.607188\n298.2164847\n261.9393846\n212.6618643\n213.0519811\n212.6627602\n213.052839\n212.6632086\n213.0498615\n312.8157139\n349.8733725\n349.484415\n325.4311782\n325.0420458\n300.9902706\n276.1544662\n252.1017535\n289.3278815\n289.7177658\n289.3278696\n289.7182644\n301.5498763\n351.3053042\n428.0871889\n500.510924\n1048.299517\n1011.594305\n962.6760417\n962.66202\n912.8602593\n969.1770602\n962.6095215\n962.5903822\n1062.735637\n949.8879627\n750.5692966\n726.1315952\n576.6585035\n558.7699531\n349.3568938\n299.9921347\n287.7699391\n287.769939\n287.769939\n287.7699392\n299.9921371\n349.3583778\n466.8983475\n500.3577274\n1048.220491\n1011.46237\n963.3719006\n964.4458387\n915.4075099\n965.3797662\n964.1086745\n962.6074045\n1062.670703\n949.8459365\n750.5554851\n726.1753232\n576.7576219\n552.3836964\n349.3568958\n299.9921368\n287.7699415\n287.7699416\n287.7699414\n288.9277801\n301.5379845\n351.2924282\n427.7066913\n500.8137185\n1048.714528\n1011.949566\n963.1790132\n963.4738956\n914.7641064\n965.1505204\n963.9530813\n962.8447825\n1063.077548\n950.3687572\n751.2218512\n726.9172735\n577.5206019\n553.2008754\n349.3568981\n299.992139\n288.9292261\n289.3195771\n289.7101178\n289.335857\n301.9496977\n350.9453742\n428.0191001\n511.3705022\n1050.459828\n1013.207982\n963.8724164\n963.5677208\n913.4757744\n962.9950209\n962.8714778\n962.8333597\n1063.027921\n950.2236517\n750.8950399\n726.4425326\n576.91919\n552.4271067\n349.3569005\n299.9921416\n287.769946\n287.7699458\n287.7699457\n287.7699459\n301.9228144\n350.9027778\n427.5987164\n508.9155158\n1048.536471\n1011.867858\n962.932338\n962.8011138\n912.9399466\n962.739443\n962.7083808\n962.7440843\n1062.971707\n950.1819315\n750.9128439\n726.5217479\n577.0873729\n552.6649157\n349.3569026\n299.9921435\n237.9292211\n239.088148\n239.4765529\n239.8649645\n251.7031226\n276.537407\n427.890395\n409.8015374\n650.0071756\n613.1434127\n564.1105232\n563.9601843\n564.6334348\n565.0615956\n314.8212774\n314.7281863\n414.9747765\n377.0251257\n347.9299928\n323.4855971\n323.4855968\n299.042193\n274.5958146\n250.5372102\n239.8582478\n239.474411\n239.8613618\n239.4761367\n252.0844612\n276.144839\n325.4188397\n306.7585002\n298.5955622\n261.5427891\n212.6543374\n212.2690368\n211.4975638\n211.1136035\n211.4979398\n212.6542387\n312.8056875\n349.0864194\n349.0862892\n325.0283207\n325.0278508\n300.5853477\n275.7533979\n252.0833548\n289.317798\n289.7073165\n289.3215385\n289.7127328\n301.5480538\n351.3065132\n441.1398514\n509.2405312\n1048.387903\n1011.561528\n962.6138502\n962.8040597\n913.8256034\n963.8142346\n962.6639551\n962.510887\n1062.704296\n949.8796236\n750.6057032\n726.1960611\n576.7520016\n552.3740022\n349.3569096\n299.9921504\n287.7699544\n287.7699544\n287.7699546\n289.700553\n301.538022\n351.2929699\n427.722172\n509.2510371\n1048.502805\n1011.670625\n963.4337758\n964.8853023\n916.0711799\n966.0278824\n964.7160532\n962.8786995\n1062.666002\n949.8387197\n750.5182031\n726.1322552\n576.7274929\n552.322959\n349.3569116\n299.9921525\n287.7699566\n287.7699565\n287.7699566\n287.7699569\n301.1494913\n351.2890242\n427.547848\n509.0761808\n1048.408632\n1011.582089\n963.4916461\n964.27904\n913.2466205\n962.5346636\n962.5366932\n962.5356679\n1062.701144\n949.8846234\n750.6278539\n726.2816214\n576.8985621\n552.5368484\n349.3569138\n299.9921545\n287.7699586\n287.7699587\n289.7006778\n289.3169571\n301.9309695\n350.9120894\n427.8333411\n509.9605136\n1049.147223\n1012.061682\n962.9709102\n962.7909992\n912.9314526\n962.645519\n962.6336367\n962.6256558\n1062.798223\n949.977905\n750.7060923\n726.272325\n576.7584037\n552.3151736\n349.3569155\n299.9921565\n287.7699609\n287.7699608\n287.7699606\n287.7699606\n301.9220985\n350.9030218\n427.5405106\n508.7722531\n1048.160556\n1011.439789\n962.851072\n962.493203\n912.6620214\n963.3503009\n962.9120842\n962.443352\n1062.624428\n949.7877757\n750.4635235\n726.0408778\n576.5673446\n552.1317599\n349.3569177\n299.9921584\n237.9292357\n237.9292359\n237.9292357\n237.9292355\n250.1514334\n274.5973252\n427.312306\n408.9272096\n649.4942677\n612.8051404\n563.8882855\n563.8256859\n564.0166047\n571.5980745\n314.8983961\n314.600109\n421.3856869\n376.8605117\n347.9300135\n323.4856173\n323.4856175\n299.0422194\n274.595829\n250.1514336\n237.9287386\n237.9287386\n237.9287386\n237.9287386\n250.1509364\n274.5968289\n323.4841232\n305.2101855\n296.6665188\n259.9999254\n211.1111342\n211.1121324\n211.112132\n211.1136293\n211.1121324\n211.1111343\n311.2619255\n347.9285189\n347.9285188\n323.4841232\n323.4841232\n299.0412248\n274.5953321\n250.1509365\n237.9287402\n237.9287402\n237.9287402\n237.9287402\n250.150938\n274.5968316\n323.4841248\n305.210187\n296.6665204\n259.999927\n211.1111358\n211.1121348\n211.1121343\n211.1136329\n211.1121347\n211.1111358\n302.7182603\n349.0848616\n349.8579093\n325.0289737\n325.4176512\n300.5890994\n276.5325095\n251.7011079\n289.7094473\n289.3216705\n289.7125563\n289.3253689\n301.9421337\n350.9181576\n467.1674213\n509.1165114\n1048.376483\n1011.572252\n962.6676408\n962.5960712\n912.7758172\n962.5837104\n962.5602214\n962.5371408\n1054.172418\n949.8906655\n750.5755323\n726.1372174\n576.6669591\n552.2490212\n349.3569252\n299.9921664\n287.7699704\n287.7699701\n287.7699702\n287.7699705\n300.7642585\n350.9030881\n427.5891875\n508.882231\n1048.218765\n1011.446264\n963.8102003\n965.8918043\n916.9312706\n966.7630741\n965.2550026\n963.1735644\n1054.086988\n949.8052305\n750.4837669\n726.0592385\n576.6053459\n552.2056955\n349.3569275\n299.9921683\n287.769972\n287.769972\n287.7699723\n287.7699725\n299.9921699\n351.2878695\n427.5028223\n508.9403381\n1048.256125\n1011.595636\n964.8557082\n967.205446\n918.1859383\n967.8744633\n966.2865541\n963.9453219\n1054.073355\n949.773318\n750.4451329\n726.0128108\n576.5357597\n552.1125538\n349.3569289\n299.9921698\n287.7699742\n287.7699742\n287.7699738\n287.7699738\n299.9921719\n349.3584334\n427.3272162\n508.6205266\n1048.08233\n1011.799443\n965.5037594\n967.8414232\n962.6939414\n1126.18499\n1129.241354\n1046.574049\n1054.118681\n949.7462813\n750.4188905\n725.9837441\n576.4996957\n564.6978764\n349.3569311\n299.9921717\n237.9292486\n237.9292489\n237.9292489\n237.9292485\n250.1514463\n274.597346\n427.2068674\n408.8561021\n649.411493\n612.6872316\n563.7978351\n570.3368474\n563.8006252\n563.7634241\n314.5985415\n314.6235865\n406.3022769\n376.8476607\n347.930031\n323.4856355\n323.4856359\n299.0422424\n274.5958419\n250.1514466\n237.9287489\n237.9287489\n237.9287488\n237.9287488\n251.308784\n275.7554332\n325.4163424\n306.7563042\n298.5974739\n261.5425488\n212.2676926\n212.6548618\n211.8829805\n211.1136524\n211.1121476\n212.8438977\n304.2598994\n349.8584796\n349.4740253\n325.4172701\n325.0308971\n300.9768731\n276.1437096\n252.0873912"
  },
  {
    "path": "src/pymgrid/data/load/RefBldgPrimarySchoolNew2004_v1.3_7.1_2A_USA_TX_HOUSTON.csv",
    "content": "Electricity:Facility [kW](Hourly)\n55.42814107\n55.42067783\n55.41204556\n55.40128446\n55.60842111\n59.33672134\n60.56892065\n53.37843759\n49.72861549\n47.07702636\n47.11429235\n47.82046622\n47.15738108\n47.22037269\n47.23848711\n47.22973326\n47.12139647\n52.79723525\n55.59601688\n55.77826581\n55.75749681\n55.62477271\n55.45760894\n56.16341275\n55.44239159\n55.42910173\n55.4184364\n55.41601286\n55.62028635\n56.24950117\n65.14944714\n123.9782357\n166.303517\n165.8878803\n169.7195258\n170.4021292\n171.8674425\n169.17181\n170.4161619\n168.0622573\n164.455359\n126.031362\n128.8995442\n129.1218782\n129.1093843\n55.6697378\n55.54964598\n56.28156732\n55.56986085\n55.56624293\n55.57242122\n55.58160734\n56.73188805\n56.57165547\n73.18792457\n133.5867454\n175.1946867\n168.8562641\n169.9774977\n173.7485234\n173.9210782\n166.9036987\n166.4152219\n164.3404991\n163.6347633\n126.0903734\n128.9596707\n128.9545809\n128.9516433\n55.44317849\n55.4836478\n56.22882979\n55.50110718\n55.50114896\n55.48494147\n55.47340453\n55.68206381\n55.65440869\n65.01320134\n123.9548114\n166.3163576\n166.3420888\n170.151262\n171.0115971\n170.7033938\n167.1451641\n167.5354952\n165.7019196\n164.1768358\n126.1456105\n129.3764602\n129.7452795\n129.7299741\n55.53782512\n55.43024228\n56.19898936\n55.44486862\n55.42915044\n55.41701606\n55.41024244\n55.61522508\n56.51601725\n65.16506905\n123.9796009\n166.3217478\n166.1827819\n170.0678466\n171.4593692\n171.7341476\n172.0129157\n175.1044989\n175.0681151\n168.8004172\n124.8250267\n128.8937191\n129.1335992\n129.1371492\n55.61479375\n55.48652843\n56.22550779\n55.50239655\n55.51732839\n55.52057291\n55.5155834\n56.5676543\n56.39660113\n64.7196825\n123.3847277\n165.7288635\n165.9614969\n176.8592037\n186.7385962\n194.8723612\n195.4615943\n200.7033209\n197.7002253\n188.3696231\n143.4106722\n143.5057726\n139.6734614\n137.9473267\n55.59572977\n55.61511986\n56.32849933\n55.6148438\n55.60775101\n55.60282607\n55.59857514\n55.8217289\n55.80370926\n55.81244723\n50.03238361\n47.18167835\n47.21483018\n47.23746099\n47.92735692\n47.26091733\n47.31963412\n47.34030434\n47.33210908\n47.22567372\n51.50080408\n55.77818638\n56.02548786\n55.9936552\n55.84132132\n55.65369041\n56.33450507\n55.6357233\n55.62081924\n55.60985377\n55.60392593\n55.83372267\n55.82205343\n55.83444689\n50.04778799\n47.19005799\n47.21019816\n47.21002764\n47.89716271\n47.20931569\n47.2563686\n47.2795953\n47.26993646\n47.17410784\n51.4509655\n55.72933663\n55.96374914\n55.93394632\n55.79717188\n55.61905411\n56.30081293\n55.61120676\n55.6097347\n55.60807627\n55.60223385\n55.83541329\n55.83003622\n74.17749884\n135.8140315\n181.5536325\n175.6662572\n172.9242389\n172.356877\n173.113856\n170.4513401\n169.7579357\n170.8959275\n168.049702\n124.9408469\n128.8907248\n129.1426578\n129.1804137\n55.59908201\n55.47937856\n56.22860776\n55.50334148\n55.49947759\n55.49001652\n55.48223431\n56.54305016\n56.37599962\n64.91061587\n123.617165\n165.8649266\n165.8250268\n169.812715\n170.486396\n169.7247604\n165.9080704\n166.138298\n164.1683041\n163.555827\n124.5807631\n128.9113982\n128.9339876\n129.0123945\n55.38956694\n55.41742221\n56.19605239\n55.44530484\n55.43415259\n55.41949466\n55.40625649\n55.60902969\n56.45959617\n65.17659768\n123.9771944\n166.286105\n166.3143933\n170.3413626\n171.3166108\n170.798786\n166.8435797\n167.2347283\n165.3014126\n163.974693\n124.6512621\n129.4273618\n129.7244423\n129.7142872\n55.51201123\n55.40092885\n56.18353129\n55.42200785\n55.41341461\n55.40464151\n55.39729244\n55.60292971\n59.92469399\n65.18455187\n123.9843008\n166.2796119\n165.8576287\n169.7017031\n170.653565\n172.3440869\n171.4266793\n172.4716655\n169.1680911\n165.6593267\n124.687655\n128.8781552\n129.10176\n129.09088\n55.61737258\n55.50540038\n56.24730877\n55.53293133\n55.53666231\n55.53160379\n55.52891252\n56.58992136\n56.42234962\n64.61690893\n123.2945032\n165.6894986\n165.711909\n169.7174824\n170.4404325\n169.7941458\n166.0080132\n166.7621532\n165.9372595\n164.7655773\n124.9365325\n128.8999072\n128.9034082\n128.905196\n55.50185579\n55.53512351\n56.26787557\n55.55841197\n55.55374007\n55.54444371\n55.54201935\n55.75965756\n55.74290127\n55.75444748\n49.97881435\n47.12904232\n47.15118176\n47.15059965\n47.83907184\n47.1600154\n47.21524217\n47.23972214\n47.2315067\n47.13629028\n51.41855308\n55.70077732\n55.93638941\n55.91893946\n55.78839419\n55.61077292\n56.29305553\n55.60338363\n55.59749047\n55.59265932\n55.58610139\n55.81021253\n55.79407649\n55.8042545\n50.01963331\n47.16097718\n47.18091644\n47.17558544\n47.84579693\n47.16911964\n47.22373449\n47.23819265\n47.22479942\n47.1232271\n51.40139524\n55.67799999\n55.90073489\n55.88311531\n55.75630392\n55.58896291\n56.26959079\n55.57672112\n55.57463478\n55.57262377\n55.57084003\n55.7964359\n55.78073951\n55.79673473\n50.01639351\n47.17090093\n47.1986189\n47.1929986\n47.87125911\n47.18714733\n47.2284177\n47.24896709\n47.23822507\n47.13904326\n51.42081733\n55.70285651\n55.9311346\n55.90842227\n55.77899836\n55.60828495\n56.29420451\n55.60071444\n55.59121201\n55.5813526\n55.57647441\n56.69883415\n56.5117616\n64.60006627\n123.3070904\n165.718204\n165.7403997\n169.7494385\n170.4637822\n169.9032748\n166.1273918\n166.3807594\n164.4879421\n163.623287\n123.20257\n128.9207658\n128.9226262\n129.6071032\n55.54216588\n55.57034003\n56.29584262\n55.58786129\n55.55155784\n55.51703036\n55.49760524\n55.69796827\n55.67631443\n64.96719403\n123.9511107\n166.3322425\n166.3481219\n170.3454716\n171.0804818\n170.3587438\n166.4949134\n166.5784232\n164.5506138\n163.7441118\n123.6456152\n129.5163846\n129.7310975\n129.7186872\n55.50789379\n55.40130877\n56.17806361\n55.41933521\n55.4118515\n55.40043852\n55.39412466\n58.30366708\n60.29811769\n65.23370818\n123.9897784\n166.2981936\n166.3287399\n170.0619006\n170.9320122\n170.5067518\n166.5604072\n166.481313\n164.3439789\n163.5762458\n123.1727743\n129.1746781\n129.5345901\n129.6874215\n55.54148393\n55.41949777\n56.19102786\n55.43353932\n55.43823396\n55.4336021\n55.42889956\n56.4890095\n56.31711191\n65.4400144\n123.9706789\n166.311204\n166.3395906\n170.1253469\n170.5614134\n169.7676891\n165.7933786\n165.8286738\n163.8163617\n163.7015738\n123.35202\n129.1060035\n129.1926417\n129.2594251\n55.39951579\n55.44549929\n56.20859646\n55.47286777\n55.47107199\n55.4567789\n55.45037815\n55.66291155\n55.64265869\n55.65147717\n49.86996711\n47.01252417\n47.02711297\n47.01924619\n47.72198519\n47.00953725\n47.05156214\n47.07201154\n47.06500479\n46.96818811\n49.8256888\n55.52986823\n55.73724774\n55.71253286\n55.58233821\n55.41438527\n56.13037193\n55.3992459\n55.39970947\n59.15141646\n58.86050215\n60.72908314\n61.80929434\n60.49706761\n54.73177764\n48.22575093\n47.03614243\n47.04564823\n47.74270391\n47.0502727\n47.09426485\n47.11564864\n47.10598218\n47.00393022\n49.84718957\n55.53894048\n55.72268903\n55.68772698\n55.55761771\n55.39198201\n56.12179858\n59.41161171\n61.74236913\n60.25478291\n61.31851002\n61.35507794\n62.84747979\n65.48818245\n124.0578991\n166.3150515\n166.0248981\n169.7487217\n171.3181337\n174.3312453\n174.7800092\n177.721579\n176.6688217\n171.5574926\n127.5104964\n130.9201844\n129.202593\n129.0855897\n55.63568642\n55.52468692\n56.27092973\n55.55847551\n55.55838316\n55.55926025\n55.56398808\n56.69918257\n56.53892921\n67.45524099\n127.2047813\n171.2223436\n173.8981778\n185.8020301\n197.2230629\n201.1985763\n200.9791493\n205.5223038\n209.8430731\n200.7059001\n148.021241\n147.7961664\n142.9569626\n140.2366682\n55.61185656\n55.63539255\n56.34113406\n55.59871608\n55.54540581\n55.50568679\n55.47664183\n55.67127847\n55.64317117\n64.97520672\n122.4962739\n166.2994657\n166.3383293\n170.0001969\n170.9324231\n170.8303027\n170.1661391\n177.0770956\n178.6622572\n173.1271777\n126.887821\n128.9324785\n129.1192749\n129.1673698\n55.5813006\n55.45285333\n56.21446511\n55.46365631\n55.45213156\n55.44826621\n55.44335892\n55.64542431\n55.62310845\n65.06756359\n122.5330756\n166.2149336\n165.7717539\n170.2503353\n175.740371\n182.708542\n188.2243467\n197.2147262\n198.1687701\n182.9489053\n132.9501144\n131.7160594\n129.1198059\n129.1737906\n55.6010416\n55.47753377\n56.23365626\n55.49033643\n55.47476747\n55.46149895\n55.45106606\n56.51041978\n56.34619818\n65.37112418\n122.2609155\n165.7600695\n167.2789136\n179.9432529\n189.96295\n199.8762692\n206.0640347\n214.674482\n216.5676173\n201.844621\n147.1259982\n144.780611\n137.9392154\n136.9446203\n55.59340531\n55.60928069\n56.31796362\n55.58684851\n55.56432812\n55.55083197\n55.55263137\n55.79150041\n55.7803272\n55.79727147\n48.59211439\n47.17195934\n47.2039626\n47.22970955\n47.97697834\n47.3274018\n47.38649467\n47.40894426\n47.39800051\n47.29052379\n48.70376\n55.82524916\n56.06535172\n56.02703906\n55.87061042\n55.68378627\n56.3671369\n55.68300766\n55.67983837\n55.67476286\n55.66778792\n55.91006467\n55.88677952\n55.88232283\n48.66053379\n47.26196072\n47.32081957\n47.34279309\n48.02638266\n47.34911458\n47.40939747\n55.50182366\n62.46018357\n51.03071385\n48.74287222\n55.85581255\n56.0870359\n56.04190644\n55.88353655\n55.68573176\n56.36669963\n55.67908115\n55.67207677\n55.65114218\n55.63183418\n55.84647154\n55.81311245\n64.24697305\n121.8149941\n167.7312096\n175.2121165\n187.7414265\n203.289431\n216.6015514\n219.4816412\n226.5763176\n226.9592219\n211.063299\n144.6949396\n138.1749063\n130.8319107\n129.0902266\n55.64788046\n55.53101804\n56.27543212\n55.53920762\n55.52932109\n55.5237521\n55.51516854\n56.56296345\n56.39350783\n64.87359302\n121.9774345\n165.6885511\n168.5540426\n181.7306001\n189.2232242\n193.454355\n194.4147863\n197.5285533\n191.0344957\n181.4676158\n134.0427452\n138.6010669\n135.89392\n133.9428722\n55.57283954\n55.62656719\n56.38201528\n55.68322383\n55.69572676\n55.70731967\n55.71985545\n55.98930698\n55.88314877\n64.34839868\n121.8482321\n165.7178286\n165.7584611\n169.8681829\n170.934582\n170.6995565\n170.3515238\n176.3090359\n177.5390105\n169.1050737\n122.1004821\n128.8821493\n129.181733\n129.3429247\n55.5599645\n55.44616426\n56.21424604\n55.47311281\n55.46431731\n55.44563976\n55.42703511\n55.62661041\n55.6003828\n65.07819748\n122.5110064\n166.2877048\n166.3071746\n170.052819\n171.0971599\n170.6005549\n166.8898365\n167.0586785\n164.9331582\n163.7961796\n121.7617201\n129.2888889\n129.7146655\n129.6980128\n55.4866422\n55.37741851\n56.17483342\n55.40567538\n55.40356881\n55.3954658\n59.4327652\n62.83624013\n61.1592037\n65.67433155\n122.5744383\n166.2986098\n166.1952457\n169.7750158\n170.7916224\n171.0122682\n168.2936616\n168.6581755\n165.5379985\n163.8662965\n121.7312395\n128.9186249\n128.9566204\n128.9749384\n55.4326072\n55.47797453\n56.23476613\n55.50914864\n55.50930073\n55.50461657\n55.49684178\n55.70445781\n55.69080035\n55.70504561\n48.50191797\n47.07619169\n47.08884693\n47.08893595\n47.77647194\n47.09766456\n47.15082101\n47.17463045\n47.16346813\n47.05407976\n48.46535958\n55.59643104\n55.80089319\n55.77868164\n55.65487004\n55.49501044\n56.19172908\n55.48641757\n55.48473467\n55.48171881\n55.47737806\n55.6897984\n55.67433446\n55.68380621\n48.47180716\n47.04258517\n47.05308701\n47.03604527\n47.72771685\n47.01589199\n47.05130045\n47.06419278\n47.05184326\n46.95059367\n48.37613627\n55.51612669\n55.72516144\n55.70869878\n55.59180506\n55.43490348\n56.14865017\n55.43483833\n55.43673823\n55.43550738\n55.43423924\n55.64728487\n55.63248018\n65.06014168\n122.4883623\n166.2509573\n166.0672371\n169.9527327\n170.6258285\n169.7956842\n165.7482591\n165.7604006\n163.7800157\n163.5940669\n121.7502937\n128.8996552\n129.1247342\n129.1117955\n55.64565036\n55.52574776\n56.25249344\n55.54162434\n55.53744057\n55.53351222\n55.53022711\n56.58494733\n56.41451255\n64.65183502\n121.8963204\n165.7166978\n165.7355291\n170.1468094\n174.2240816\n180.2009025\n183.8096472\n189.5126601\n190.6934653\n185.5528486\n140.1465899\n142.1501488\n137.3959978\n133.6752192\n55.55394269\n55.57427562\n56.29387531\n55.57493166\n55.55536217\n55.53876745\n55.51462914\n55.71288585\n55.68296518\n64.60548495\n121.9363274\n165.7348408\n165.7268103\n170.7889969\n177.4971099\n183.9156735\n188.0182427\n194.5270003\n194.1275993\n179.8450637\n129.2590513\n131.5412192\n129.2570768\n129.1100774\n55.65841669\n55.53001488\n56.25590436\n55.52531629\n55.50965012\n55.50309821\n55.50641251\n55.72372531\n55.71845796\n64.28506888\n121.8784218\n165.7077351\n169.3190665\n178.3693687\n185.103924\n195.7682814\n196.1248728\n197.0784361\n195.8008964\n186.4880064\n139.2993616\n146.4570153\n146.9154178\n148.8784815\n55.84284835\n55.6902559\n56.41167638\n55.69982174\n55.70610399\n55.7190597\n55.72105966\n56.91233934\n56.64582174\n74.00589471\n131.2262045\n179.4088409\n188.5619988\n209.4258948\n231.0604128\n235.6787082\n232.6451385\n238.3192563\n234.0535516\n208.9051525\n136.0597109\n129.6495868\n129.0076828\n129.4487843\n55.38850613\n55.41714131\n56.19870646\n55.43651413\n55.43414519\n55.42248773\n55.4117773\n61.9845516\n60.73412759\n61.72780579\n51.76508103\n53.14487465\n52.0977941\n53.78768644\n49.10583687\n46.97026308\n47.02019126\n47.04565664\n47.03998785\n46.94153468\n46.92933443\n55.48159268\n55.68483848\n55.66387458\n56.61990262\n62.01204248\n61.16343249\n61.47026813\n60.63957376\n62.81891302\n61.38127405\n63.59401035\n62.69165458\n64.2268491\n53.2756045\n53.82899466\n51.2039825\n49.3398523\n47.6908461\n46.98740221\n47.03918368\n47.0633039\n47.05870308\n46.9602636\n46.95116773\n55.51018845\n55.70697507\n55.68360387\n55.56730629\n55.40410165\n56.12487276\n60.10710556\n61.51205376\n60.18467637\n61.32247142\n60.30841206\n61.39906648\n65.41238569\n121.1499182\n166.3092148\n166.2445888\n169.8533122\n170.414509\n169.6571404\n165.6780618\n166.7001069\n165.0813291\n163.7654343\n120.2643118\n128.8723705\n129.2206751\n129.6128284\n55.52459867\n55.41220563\n56.19491231\n55.44384287\n55.44496656\n55.4357517\n55.42771026\n56.48519777\n56.30608216\n65.47661525\n121.109146\n166.2570145\n165.8329589\n169.6971028\n170.7878228\n174.5262577\n174.4402645\n177.6397646\n179.3474686\n172.9410017\n124.7994464\n129.1057469\n128.9971562\n129.3682557\n55.39469768\n55.43217353\n56.20580487\n55.438808\n55.42580613\n55.41365307\n55.4028554\n55.60950611\n57.86484323\n65.16822929\n121.1078055\n166.2139093\n165.7288689\n169.7000806\n173.3707339\n176.1818104\n177.5187172\n182.9469496\n181.9432082\n178.3024857\n132.0999228\n136.6020299\n132.3765782\n130.4548773\n55.70398533\n55.57684349\n56.30843038\n55.6044469\n55.59929468\n55.58271849\n55.57617692\n55.80020132\n55.77736391\n64.23189296\n120.4386168\n166.8443659\n173.4302288\n185.1512556\n192.1306879\n197.6462139\n200.510888\n205.6180424\n205.7799937\n196.1359924\n142.003243\n142.9338685\n135.4697938\n131.1429612\n55.70475946\n55.57723701\n56.31772243\n55.60486642\n55.58605029\n55.56720421\n55.5501145\n56.59557687\n56.41434222\n64.79593457\n120.6418468\n165.7525452\n169.5296305\n187.1122028\n199.5219561\n209.3815629\n211.1064751\n219.778089\n224.8698487\n211.6296187\n150.7919267\n149.8615149\n143.1477959\n140.0252146\n55.61237271\n55.6372955\n56.35556549\n55.64710095\n55.64895714\n55.63643434\n55.62900652\n55.85990374\n55.85292503\n55.86140414\n47.21384113\n47.22463042\n47.28305399\n47.31417002\n48.0156241\n47.34310377\n47.38832592\n47.40963749\n47.3936117\n47.27965868\n47.26700567\n55.82004503\n56.06046884\n56.01250718\n55.84704802\n55.66314099\n56.34576578\n55.65480272\n55.6512356\n55.65352481\n55.65515323\n55.89887884\n55.8816764\n55.88814138\n47.24552515\n47.25572491\n47.28513082\n47.29996943\n48.00073\n47.34683609\n47.41732251\n53.09745271\n59.30053291\n47.37401245\n47.33798236\n55.87896071\n56.12124107\n56.07844045\n55.9184429\n55.70948671\n56.37357437\n55.67066987\n55.65448296\n55.65114557\n55.64649543\n55.88016082\n55.86191758\n55.8687501\n47.22731873\n47.23654852\n47.27009172\n47.28334303\n47.98276686\n47.3227921\n47.38849826\n47.41950789\n47.41631394\n47.32309966\n47.32543592\n55.89030569\n56.14548855\n56.08152028\n55.91136577\n55.72258618\n56.40476607\n55.7173542\n55.72078224\n55.72274992\n55.72112635\n57.01233217\n56.81485012\n91.68134736\n147.531626\n198.135508\n207.9608517\n217.8781859\n226.8119003\n232.7860793\n241.9925186\n241.0560506\n234.7884027\n218.8780837\n160.7023612\n164.921475\n163.6308403\n164.9794445\n55.78184812\n55.74683355\n56.42065069\n55.70231287\n55.67529098\n55.65119449\n55.64482222\n55.86701257\n55.8352397\n63.07610522\n120.391459\n166.0025332\n169.936001\n180.9146461\n190.6102865\n199.199465\n203.3128495\n211.4475405\n211.4557221\n193.4077149\n135.857925\n134.5307237\n130.3359832\n129.1017654\n55.61721007\n55.5046317\n56.26029097\n55.53530256\n55.53971522\n55.53526164\n55.53084505\n55.73543034\n55.69719955\n63.1471909\n120.4501264\n166.7707981\n175.3307273\n190.9793828\n207.6126316\n223.4897628\n229.1575948\n239.4300065\n243.7405269\n226.4893843\n155.0416245\n145.4692905\n140.318626\n141.9652105\n55.78834609\n55.61543111\n56.345869\n55.62940213\n55.61134845\n55.58575085\n55.56583853\n56.61297126\n56.43468551\n63.28910846\n120.4541839\n170.5500949\n181.6330004\n194.5918054\n206.253261\n217.7693715\n225.6052078\n236.2824545\n231.4635569\n213.1864102\n153.3997347\n154.251359\n150.4721317\n147.7118456\n55.67246133\n55.69609235\n56.41478999\n55.70038346\n55.69645441\n55.69463583\n55.69793635\n55.94165962\n55.91704876\n54.49193061\n47.26612567\n47.25418228\n47.2569845\n47.24185554\n47.91476889\n47.22730041\n47.25978741\n47.26897928\n47.25690883\n47.1529539\n47.14712985\n54.29585517\n55.96634326\n55.94790969\n55.8142203\n55.63876439\n56.32298889\n55.63304107\n55.62543567\n55.62422881\n55.6262143\n55.86478793\n55.85358592\n54.43599009\n47.22430081\n47.24106853\n47.2704232\n47.29513421\n47.99151028\n47.31164357\n47.35441289\n47.37128422\n47.3627555\n47.26197933\n47.24795218\n54.37417155\n56.03539275\n55.99859538\n55.84223225\n55.65561144\n56.34584945\n55.65883458\n55.66124798\n55.65829175\n55.65776793\n55.90755031\n55.89051258\n80.08175237\n138.0952846\n186.0988076\n197.1506744\n212.9075002\n223.6161372\n230.3613434\n228.6091987\n232.9462403\n232.275009\n214.8709242\n154.815388\n156.0348015\n154.242\n151.6476071\n55.88397253\n55.73384578\n56.44910717\n55.74325071\n55.73616259\n55.73289276\n55.73226155\n57.00617379\n56.81087821\n87.6951342\n145.8451927\n197.2770408\n207.0638011\n218.3515338\n228.9975558\n232.0284451\n233.5098535\n235.260766\n235.1688423\n228.678393\n166.3452965\n166.100574\n162.6484766\n160.0137826\n55.7537391\n55.77226771\n56.48050942\n55.76214251\n55.74761514\n55.73595106\n55.72427332\n55.96733688\n55.94030609\n82.05129182\n141.1440361\n191.1296893\n199.285015\n210.9962852\n227.1737815\n227.5706072\n228.6350582\n233.1182377\n226.929438\n207.9935014\n149.0771657\n150.6541289\n150.441354\n149.8417915\n55.86646177\n55.72112875\n56.43845678\n55.73042048\n55.7248666\n55.72066989\n55.71263478\n55.95665766\n55.94312566\n83.92516059\n142.9959977\n192.9365659\n197.7952325\n203.497893\n207.0764744\n209.020452\n207.2870659\n209.1226082\n204.1572866\n189.9786291\n140.7213211\n148.5614981\n149.0334363\n148.2251711\n55.84731582\n55.68598628\n56.38095092\n55.67183586\n55.67557745\n55.67834445\n55.66975085\n56.8759945\n56.65441105\n64.9192774\n120.4226595\n165.7155598\n165.7579072\n170.084837\n173.9243695\n174.7493023\n172.2140918\n174.0926935\n172.4003018\n170.2132606\n128.1623829\n132.4887591\n130.6057783\n128.8967453\n55.47385812\n55.50459577\n56.24757805\n55.51949219\n55.51067815\n55.49830554\n55.48957886\n55.69805002\n55.67913186\n52.83093367\n47.05578814\n47.06435717\n47.10385796\n47.12135488\n47.81885204\n47.15909688\n47.21406875\n47.2383734\n47.2499661\n47.15850705\n47.13979391\n54.2518243\n55.87372506\n55.83987762\n55.71820629\n55.55064249\n56.22570793\n55.51969976\n55.51264248\n55.50549514\n55.49914519\n55.70587599\n55.68566108\n52.83580157\n47.08048959\n47.13386733\n47.21115363\n47.2517953\n47.94756294\n47.27972845\n47.34536202\n51.99628681\n54.77230794\n56.8520103\n55.67044702\n54.39746382\n56.037511\n55.9885948\n55.81594089\n55.61696934\n56.29239717\n55.59277907\n55.57475261\n55.55277268\n55.54929622\n55.75676789\n55.72899711\n61.46174467\n120.4689628\n166.313117\n174.1167431\n187.8743652\n198.1971671\n211.7454851\n215.5657117\n225.984707\n232.2612574\n220.3186281\n159.4527292\n148.8445588\n143.1872208\n141.6119639\n55.79437743\n55.62779204\n56.33853629\n55.61128447\n55.61162461\n55.61861943\n55.61019501\n56.65157571\n56.4497848\n61.73529467\n120.4425987\n165.7250847\n170.0514987\n185.4317668\n200.7303515\n209.5496273\n204.5941874\n206.2813022\n205.911782\n196.9864268\n146.7541096\n152.5887632\n153.9162411\n154.2577184\n55.70677774\n55.73315218\n56.44969487\n55.74129782\n55.73647388\n55.73317094\n55.73555822\n55.99857535\n55.97982593\n91.86509517\n151.9069038\n205.9921488\n217.284089\n228.8468281\n247.8652135\n231.2826682\n215.178786\n221.642964\n219.3550076\n204.8377899\n149.9402389\n148.7532452\n147.8186947\n144.4296761\n55.81513354\n55.66821466\n56.38247363\n55.67644084\n55.66689506\n55.65225535\n55.63795643\n55.85235595\n55.82177015\n61.32609021\n120.3770595\n167.9811857\n175.0124316\n185.368782\n194.8617038\n203.644216\n207.1595478\n214.9909695\n215.1490834\n199.289942\n141.4916713\n136.602387\n132.4713437\n129.088238\n55.66315915\n55.54463731\n56.28082503\n55.54356889\n55.53566356\n55.52050413\n55.50735452\n56.55687937\n56.38000254\n62.43369314\n120.6983689\n168.5011695\n178.3140431\n192.7319083\n211.2678483\n226.7225937\n234.2249472\n242.3726361\n242.7090114\n227.2888337\n162.4574177\n156.1362032\n151.6922237\n148.3631367\n55.67360703\n55.69906389\n56.42728395\n55.71020479\n55.70163746\n55.68960467\n55.67959601\n55.91669543\n55.89606686\n53.04236451\n47.28541386\n47.32926375\n47.39198764\n47.41565455\n48.09313376\n47.41111409\n47.45232101\n47.45335091\n47.43848888\n47.34425583\n47.31592204\n53.01954087\n56.12981508\n56.09632562\n55.94865547\n55.75474515\n56.4391439\n55.74833305\n55.74698133\n55.7432802\n55.99879372\n55.96751574\n55.96704018\n51.58394993\n47.30158005\n47.34462053\n47.36567652\n48.05589819\n47.3894102\n50.30585777\n63.63316535\n68.0228091\n63.21145611\n55.55819101\n52.66311367\n53.2859654\n56.07667886\n55.90375988\n55.69626526\n56.35243674\n55.64304385\n55.62386766\n55.60374917\n55.58062375\n55.77767959\n55.74810637\n64.2601371\n124.754933\n165.7287656\n165.758335\n171.784622\n178.1297651\n184.7959583\n192.0178362\n203.8438099\n213.363685\n204.0071489\n148.6017949\n142.009145\n138.9127631\n135.9381486\n55.71327638\n55.56871667\n56.2938249\n55.56175244\n55.54854522\n55.53032737\n55.51487999\n56.55681076\n56.37435936\n65.24798323\n125.3241804\n166.2877749\n166.3054879\n169.8764238\n170.7528439\n170.4912548\n167.1317903\n169.5331335\n173.0814445\n169.0218225\n123.678378\n121.9781834\n125.9966614\n128.9058663\n55.41957509\n55.45753704\n56.23550372\n55.4821189\n55.4660619\n55.44813593\n55.43690842\n55.64332559\n55.61542699\n65.02614633\n125.3717297\n166.1836198\n165.7300717\n170.146151\n174.8428491\n179.6113011\n182.2516604\n187.1718826\n189.7767743\n179.697024\n129.885741\n126.2432912\n128.5407981\n130.0081799\n55.68510637\n55.56640654\n56.30665911\n55.59049815\n55.59606585\n55.59268949\n55.58260186\n55.79348357\n55.77517153\n64.19708609\n124.6827004\n165.6799328\n165.7074188\n169.7315174\n173.4776816\n175.81445\n174.8137609\n176.0702385\n172.9746059\n170.4877727\n126.1210487\n124.4280874\n129.1223809\n130.7149346\n55.69019052\n55.564264\n56.29579533\n55.57946115\n55.58099585\n55.58040756\n55.58110469\n56.70412333\n56.54795896\n68.87413754\n130.7251942\n173.3701678\n177.2392091\n186.2072258\n189.9414824\n191.5401216\n187.7629969\n187.7913145\n186.6093949\n180.4666573\n137.0158946\n131.5857767\n134.690267\n138.4507739\n55.59906697\n55.61325471\n56.31187789\n55.58992522\n55.56628703\n55.54747741\n55.52996507\n55.73347144\n55.71429961\n55.72127279\n51.36335576\n47.07023155\n47.0820534\n47.07101501\n47.76418405\n47.06144979\n47.10494149\n47.13028141\n47.13122749\n47.03902018\n47.04086999\n47.04070163\n52.95937119\n55.78297328\n55.64805936\n55.47933837\n56.18394292\n55.44844159\n55.4349709\n55.42236001\n55.41163038\n55.61687742\n55.59527962\n57.9236219\n52.6299583\n46.99833422\n47.06374558\n47.09447008\n47.79581038\n47.11871278\n47.17425047\n47.21585315\n47.23977561\n47.15769151\n47.16681806\n47.16492325\n53.07309801\n55.8647482\n55.7126971\n55.54374186\n56.22828416\n55.51756133\n55.51787008\n55.51101775\n55.49741493\n55.70135643\n55.67771009\n64.86808473\n125.1860403\n165.7734766\n166.9949167\n177.576396\n185.3924546\n190.5232249\n194.5562668\n205.7901157\n212.8172685\n205.0891771\n150.5199969\n144.7269389\n143.9610194\n140.7094505\n55.78409971\n55.63808955\n56.35116137\n55.62602032\n55.62289522\n55.6060067\n55.59687493\n56.64554177\n56.44752272\n64.69192709\n123.4141973\n165.7266337\n172.1765011\n185.2138362\n193.9463021\n202.9545842\n206.3751895\n217.0330012\n226.4622058\n218.9000922\n165.6438498\n160.3322241\n156.6117811\n149.8492338\n55.67538566\n55.69343885\n56.40706895\n55.68632455\n55.67986039\n55.67030909\n55.65484162\n55.8704769\n55.82014205\n64.21378433\n123.2837724\n169.4566199\n179.8001334\n193.0263428\n202.5231043\n208.4102582\n208.5554817\n211.7881188\n217.7713284\n204.2302144\n150.2264086\n147.207916\n148.0851395\n146.3689851\n55.84430872\n55.70174148\n56.42525157\n55.71520354\n55.70817676\n55.70299281\n55.6985304\n55.94228477\n55.92972305\n84.35472587\n143.7688305\n188.1694408\n195.8586113\n207.3586105\n218.0505396\n226.7777723\n225.5930147\n232.625034\n235.4773768\n224.4388066\n166.4255591\n160.3758188\n158.7069922\n158.3383989\n55.92907871\n55.7661501\n56.46618453\n55.75389734\n55.75159661\n55.74992166\n55.74570273\n57.03218615\n56.84584846\n96.91656207\n157.4473049\n208.6994289\n215.6621009\n226.2157883\n247.3457803\n262.6522119\n258.3114452\n262.0716023\n262.0525279\n249.2020639\n187.0250529\n178.4512654\n175.9316897\n174.100777\n55.80591902\n55.82116566\n56.52213707\n55.80687857\n55.80086279\n55.79904262\n55.794541\n56.06035574\n56.03954764\n56.03255648\n50.22980869\n47.37992571\n47.42357318\n47.44552655\n48.13270831\n47.47060261\n57.88580421\n57.36692817\n54.17670394\n62.93878989\n64.96998742\n60.72559505\n63.88474289\n56.21912639\n56.03919478\n55.81396489\n56.47211957\n55.77198786\n55.76218895\n55.76235614\n55.75671064\n56.01070969\n55.99083839\n55.99274395\n50.20289295\n47.35255793\n47.38108351\n47.39124253\n48.09323483\n47.43920452\n61.04692131\n73.60883386\n71.80040048\n72.93229316\n71.07864975\n65.52136333\n57.44787384\n61.43346836\n56.05360881\n55.82031939\n56.46416816\n55.76575644\n55.75511145\n55.74064721\n55.72088161\n55.94265645\n55.8991595\n72.49241146\n131.7843814\n178.1073085\n186.9665536\n202.6481778\n217.517261\n231.2337416\n240.1670059\n248.3449043\n251.6039664\n237.3747823\n177.0384347\n169.2100977\n161.4743743\n158.4456634\n55.93493645\n55.77952002\n56.49865383\n55.78395214\n55.77679273\n55.77113611\n55.77148129\n57.06238698\n56.86861893\n95.85446495\n153.9905413\n205.9215533\n213.2714441\n225.3552367\n242.3492874\n246.9385046\n244.4762804\n254.1263641\n259.2768271\n243.2331607\n184.0434781\n176.2069246\n175.4599173\n176.9095441\n55.81583984\n55.83561221\n56.53521188\n55.82206633\n55.81118872\n55.80727765\n55.80606901\n56.06854117\n56.04322323\n98.97460169\n156.4531911\n213.9055855\n222.5442626\n236.1967473\n254.3080984\n268.9769605\n259.6343091\n259.3306999\n210.5694688\n167.9095017\n120.4596146\n120.3488563\n124.8491138\n129.1160887\n55.68102528\n55.56429943\n56.28631302\n55.57955443\n55.5759692\n55.56645501\n55.55809868\n55.76707252\n55.74558084\n64.26609922\n121.8867141\n165.7509477\n165.7920553\n169.7925219\n170.4978587\n169.900102\n166.2059057\n166.4136772\n164.4802329\n163.6258141\n120.3448795\n120.3429617\n124.8564118\n129.1341629\n55.71417464\n55.5911376\n56.32571964\n55.62000564\n55.61588432\n55.61306228\n55.61483293\n56.78965868\n56.63878691\n82.14428551\n143.5113319\n188.0743452\n192.906062\n203.9855777\n213.2134137\n218.1130334\n218.0415428\n222.6079754\n221.6066777\n209.6239138\n154.0678917\n151.0804253\n155.0435398\n158.0088197\n55.73523095\n55.75786371\n56.46461179\n55.75144763\n55.73928823\n55.73015221\n55.72365669\n55.96886952\n55.95405718\n55.95053562\n48.72852704\n47.31219308\n47.344538\n47.36518233\n48.05079099\n47.38119466\n47.4319686\n47.44149245\n47.44631974\n47.39118476\n47.3465457\n47.33148109\n51.87975432\n56.14160526\n55.98403704\n55.78682783\n56.46123298\n55.76561511\n55.75400109\n55.7474743\n55.74443714\n55.99091891\n55.97385716\n55.98223721\n48.76107903\n47.33667409\n47.36066926\n47.37457343\n48.0979427\n47.43957703\n57.55247592\n59.32821222\n67.89189438\n65.95195045\n63.56633042\n64.38558328\n55.46845148\n56.16778814\n55.98593352\n55.77444948\n56.43345065\n55.73182631\n55.71272003\n55.68483375\n55.65799555\n55.85912426\n55.82286495\n64.17515494\n121.8140641\n166.5258073\n172.3680112\n182.9458189\n193.4205806\n204.6909208\n210.4052961\n223.4069459\n230.1014959\n222.4288798\n166.2832432\n157.5366071\n148.2146405\n142.2051245\n55.80706144\n55.6732681\n56.39087463\n55.65713044\n55.65031446\n55.63614973\n55.62181468\n56.72156959\n56.55738586\n64.90984415\n123.1895529\n170.9450138\n181.7223274\n195.6615452\n210.1983323\n222.6573346\n229.6093447\n241.5233608\n247.7331612\n236.5466651\n180.0251271\n172.3049812\n169.1518783\n164.4418678\n55.75109385\n55.76304508\n56.47087118\n55.75243165\n55.74111545\n55.72484128\n55.71904742\n55.94256878\n55.91375041\n76.44528584\n135.9610994\n187.9175104\n204.8827919\n222.7235659\n238.6935886\n251.8304091\n260.08401\n273.5101951\n278.3941677\n265.3046214\n201.0692756\n188.5997484\n177.1011321\n171.2702181\n55.96952446\n55.8048569\n56.52629894\n55.82046356\n55.81670353\n55.80692913\n55.79889069\n56.02656974\n55.98204259\n84.37928205\n138.9863051\n191.7100019\n188.913772\n183.796205\n179.3208544\n179.7847012\n178.0005862\n179.314183\n179.4695402\n171.6790844\n123.9183717\n122.2431332\n126.1531652\n129.2460563\n55.68612609\n55.55964312\n56.28483228\n55.56799711\n55.55602095\n55.54379244\n55.53701581\n56.58804327\n56.41447248\n65.07136299\n120.7838956\n165.7899216\n165.8143931\n170.8548099\n176.3609848\n180.0440475\n180.2799767\n186.3595969\n192.3524853\n185.5527424\n136.0160982\n133.4617125\n134.3718265\n131.8650376\n55.53515168\n55.57542309\n56.32744911\n55.5939523\n55.57537663\n55.56466717\n55.56138964\n55.77523537\n55.75840129\n55.76861654\n47.1388267\n47.15501217\n47.18712906\n47.21197545\n47.9160843\n47.2568623\n47.31534865\n47.33382596\n47.33265331\n47.23902452\n47.23912492\n47.23006477\n51.75256441\n56.01670109\n55.87793866\n55.69323088\n56.37420672\n55.68531351\n55.68332234\n55.67625925\n55.67574003\n55.93612154\n55.9278517\n55.92715942\n47.27587375\n47.2936077\n47.34182953\n47.35694784\n48.04479598\n47.37876845\n47.4354476\n47.44202159\n47.43516199\n47.34328624\n47.33891519\n47.3368815\n50.45615145\n56.13635801\n55.98032037\n55.78628961\n56.46807159\n55.78115107\n55.77955616\n55.78345681\n55.78591769\n56.04765789\n56.03114786\n104.482707\n159.8516341\n222.7576401\n230.6769153\n240.9651902\n255.8335161\n281.0025999\n291.8925162\n291.3610557\n263.842817\n230.1598708\n165.5372181\n153.4383504\n147.2284051\n147.4738433\n55.85351861\n55.71175932\n56.4227237\n55.71546762\n55.69562073\n55.67728912\n55.65843585\n56.75334295\n56.56283991\n64.54692854\n120.408113\n166.8197893\n172.0879193\n182.7141284\n190.9862211\n201.0124351\n205.4944695\n214.8876477\n221.1892062\n213.3602966\n159.7069628\n154.8757887\n147.9697511\n141.9062285\n55.62508933\n55.65731378\n56.38496716\n55.67193214\n55.65781226\n55.64239729\n55.63484674\n55.84674307\n55.80350937\n64.21118916\n120.4126106\n166.4542144\n175.1502586\n187.3428043\n196.2331097\n205.4485871\n206.5382553\n213.9051064\n214.5366035\n202.9884537\n149.9314129\n144.4492587\n141.0978349\n142.8006121\n55.80854135\n55.65972296\n56.38095367\n55.66704936\n55.65896884\n55.64872241\n55.65626398\n55.9097593\n55.89386411\n72.09384031\n128.8376972\n178.2522463\n186.5072994\n200.4097608\n210.5294731\n216.4228261\n216.109632\n218.8789148\n217.4974798\n205.3304733\n152.1743069\n150.0814575\n150.2434541\n154.5126109\n55.90692897\n55.74964167\n56.46767722\n55.76453361\n55.7583893\n55.74620781\n55.74414672\n56.99553498\n56.80881277\n89.89360511\n145.7074037\n185.5351057\n179.7513579\n185.2270808\n188.4091927\n194.9708324\n208.9163437\n226.5070395\n237.4960554\n231.8307027\n178.1726847\n170.7876887\n159.8808204\n152.9812891\n55.69111282\n55.71368702\n56.41251284\n55.69769931\n55.67810545\n55.65790676\n55.641735\n55.85488547\n55.83387325\n54.40583897\n47.2172919\n47.28539213\n47.36318264\n47.39453573\n48.09480658\n47.42557391\n47.46082212\n52.72050048\n53.1067336\n63.14301944\n58.93311641\n58.44361302\n50.51245274\n56.16765487\n55.99256206\n55.78408419\n56.44325966\n55.74673162\n55.73525921\n55.72571552\n55.72080684\n55.96404972\n55.93810323\n54.51401452\n47.30058726\n47.33620519\n47.39978908\n47.43264466\n48.14031056\n47.47605484\n59.6077667\n70.17861412\n69.00443286\n68.95725872\n65.27190108\n63.00878561\n50.53888247\n56.18767449\n56.01493389\n55.80885493\n56.47588014\n55.77722653\n55.7727235\n55.77126906\n55.76703588\n56.02180049\n56.00873115\n90.71909537\n147.6276024\n206.5557115\n214.3210342\n228.4653075\n248.8134754\n265.5878752\n274.1008329\n289.7989\n299.7413806\n288.4551164\n224.7940713\n218.0099182\n213.0301793\n204.1889967\n56.04850371\n55.85417485\n56.55511833\n55.84191222\n55.81947267\n55.79662687\n55.77260421\n56.97924942\n56.78442336\n78.38580504\n133.2418285\n183.1578346\n185.8735584\n192.52484\n202.5329616\n217.3791141\n219.556675\n235.8712681\n240.265492\n227.3575916\n172.1729266\n164.5517387\n160.3515426\n161.5887285\n55.7481993\n55.77373361\n56.49234355\n55.78808239\n55.77585444\n55.76357258\n55.74414956\n55.97674852\n55.95638375\n83.18988376\n144.1110944\n199.7759665\n209.7788201\n215.9421446\n234.4838229\n252.6972343\n254.8524064\n262.4855116\n261.8125662\n245.2799229\n184.2092305\n176.2207019\n173.6416124\n175.4089277\n55.99934992\n55.82406721\n56.53389628\n55.81926804\n55.80901042\n55.80424241\n55.79995566\n56.05712894\n56.03798328\n98.72453925\n157.329787\n225.8942389\n236.6952193\n249.4011542\n267.9054362\n282.4635601\n283.2782548\n293.1709241\n300.8992777\n274.0532634\n211.0057673\n203.9944378\n193.9407813\n187.698415\n56.01683873\n55.83967085\n56.53812624\n55.82452037\n55.8166192\n55.80594431\n55.79702707\n57.08215454\n56.85615569\n88.46925437\n147.1923671\n216.4107194\n237.3034144\n256.8917158\n274.9500912\n287.9282382\n291.6995858\n300.8347568\n302.8538259\n282.6220001\n215.9643725\n209.2093204\n201.619165\n192.4473026\n55.82361613\n55.84031447\n56.54257566\n55.83308357\n55.82870255\n55.82206685\n55.81146716\n56.05679017\n56.02617016\n54.59076963\n47.37717013\n47.41133557\n47.444508\n47.4725391\n48.19084047\n57.28554446\n65.2129419\n67.57903739\n69.55057835\n71.13800303\n67.81560283\n62.1476227\n57.77350357\n56.266859\n56.0590706\n55.85167292\n56.52247983\n55.82658624\n55.81797981\n55.80343722\n55.7960687\n56.05628139\n56.03121219\n54.60226896\n47.39113472\n47.41911295\n47.44468397\n47.4675893\n48.17602788\n47.49938086\n59.02142168\n68.35665968\n71.21373254\n68.31134866\n71.85588117\n63.42782147\n60.43583862\n56.22599297\n56.04315961\n55.83696831\n56.50433331\n55.8113907\n55.80161091\n55.79331741\n55.79296394\n56.05897932\n56.04511343\n100.7466595\n158.8915892\n228.038438\n239.6337464\n256.9404265\n271.7043277\n280.3823468\n279.6975187\n279.4839574\n277.4986398\n259.9178944\n199.9110079\n190.8326355\n187.30753\n188.8150781\n56.02848059\n55.85400942\n56.56648234\n55.85758107\n55.8474168\n55.839724\n55.83579112\n57.18830021\n56.97472342\n104.7188419\n163.3482459\n234.4066442\n249.96892\n266.1219519\n273.8225905\n281.6812609\n279.7098669\n285.4792619\n288.4075311\n269.8444722\n210.7758112\n200.6953471\n192.5577642\n194.7909471\n55.86429977\n55.86981118\n56.57745552\n55.8695839\n55.86361496\n55.8538258\n55.84595886\n56.11964535\n56.09820113\n105.5447003\n162.9402391\n235.9265155\n250.8965929\n266.809937\n283.2986822\n285.936481\n279.7294174\n240.9447679\n212.2265108\n196.9159\n143.5780895\n142.1461585\n143.076713\n148.5834507\n55.86356966\n55.72430737\n56.43121368\n55.72219132\n55.71621639\n55.7160813\n55.72042456\n55.97161487\n55.95240392\n83.90649133\n145.3081159\n202.0298405\n215.4630182\n232.835041\n253.8646794\n270.5479612\n273.1006055\n287.2850734\n293.0234797\n277.0748168\n219.2548537\n214.913663\n205.6557347\n200.5875446\n56.00551374\n55.8034549\n56.49766225\n55.77216675\n55.73598372\n55.70774553\n55.68569518\n56.79109043\n56.6092669\n63.27120299\n125.2283302\n179.1701276\n192.0223609\n206.7177236\n222.7561613\n240.255979\n248.3344142\n262.3471246\n270.4708288\n258.5537343\n203.6804637\n201.6269241\n200.5040384\n197.9320079\n55.83982111\n55.86643235\n56.58562859\n55.86751815\n55.86026332\n55.85015071\n55.83677103\n56.10036835\n56.07267255\n53.21408662\n47.42483297\n47.43990598\n47.46558853\n54.00809803\n65.15272159\n74.6567897\n79.17929734\n86.47500294\n81.65375027\n85.42929947\n79.24823571\n81.70552115\n71.31993914\n72.60112164\n57.99126961\n55.9465414\n56.61826881\n55.93346253\n55.93315698\n55.92862647\n55.87029156\n56.13430084\n56.11066352\n53.23907312\n47.43999578\n47.45776774\n47.48210623\n52.69959151\n71.97925262\n72.63411169\n73.86101424\n85.24247469\n79.81930497\n84.7769001\n78.00252504\n78.38894366\n72.7665527\n63.38064927\n63.25042064\n55.94295893\n56.60922699\n55.91462118\n55.89575297\n55.82654407\n55.80791401\n56.04730066\n56.01804248\n88.12744079\n146.1015642\n212.2408586\n218.3985775\n229.5788102\n243.5773654\n238.0245264\n225.9389699\n229.8229159\n233.7989754\n225.8468159\n171.9726475\n168.7081926\n166.4374343\n169.8316924\n55.96339049\n55.79130781\n56.50555906\n55.80019416\n55.79424279\n55.7846185\n55.77685551\n57.04844795\n56.85756696\n90.11087173\n148.8927353\n210.8998651\n220.3059751\n235.0956774\n247.2472681\n251.0339252\n241.2110371\n241.9122633\n237.003082\n221.0346329\n164.6084621\n160.1031671\n156.4350293\n160.5939169\n55.75236849\n55.77817711\n56.48386545\n55.77293452\n55.75341921\n55.73666751\n55.72316119\n55.95696973\n55.93107575\n70.50458714\n131.3221879\n184.307661\n192.8786413\n207.0922838\n224.2765999\n236.9174689\n242.5636827\n254.6666992\n261.6531328\n247.356326\n190.1011052\n187.4858421\n177.8904916\n171.4800961\n55.97078009\n55.78941699\n56.4966312\n55.77367114\n55.74967595\n55.73424831\n55.72672585\n55.94982982\n55.91206381\n68.03959537\n129.8389696\n185.4901367\n198.9176419\n219.2972615\n245.8661613\n262.3272075\n268.8473843\n284.4623076\n288.6619413\n272.5903579\n211.6609841\n202.5812678\n189.7952126\n182.6514023\n56.00025664\n55.82682501\n56.5419345\n55.8327395\n55.82991584\n55.83231705\n55.83081757\n57.1679865\n56.95834292\n99.33467643\n160.4145958\n236.4285904\n253.803327\n275.2494174\n293.7422634\n305.0630954\n304.2811632\n311.8967832\n307.5818857\n287.1000391\n222.3423749\n210.1539919\n201.7512166\n200.9193663\n55.85144545\n55.87224434\n56.58338583\n55.8701134\n55.85443554\n55.84440778\n55.83938285\n56.10691577\n56.07921418\n51.78646388\n47.41721495\n47.43202549\n47.46686462\n53.8980654\n66.49083377\n71.3282445\n76.90252788\n79.05275132\n82.95450525\n77.55360647\n79.78301788\n72.40557611\n73.39239996\n68.63600352\n56.14248366\n55.93410375\n56.61094995\n55.92616757\n55.92588545\n55.92988581\n55.91599118\n56.16453883\n56.14391747\n51.8538104\n47.46624018\n47.47773077\n53.92034836\n71.76687359\n76.00072631\n76.62382507\n78.90181766\n79.61169564\n82.89486323\n79.17689788\n77.63460032\n70.90656387\n68.21547702\n67.66007137\n60.94589494\n55.94290002\n56.62493248\n55.94235065\n55.93705491\n55.93322938\n55.93812996\n56.22723444\n56.15772967\n122.904931\n184.3381831\n273.5202337\n288.2660585\n303.642925\n320.5704066\n330.0247114\n320.766724\n319.4332926\n319.2885007\n304.6470592\n238.2410001\n232.7235133\n227.6287836\n221.0033269\n56.15450943\n55.91806291\n56.61371092\n55.89916129\n55.88918814\n55.88428805\n55.87578242\n57.24987407\n57.04620298\n120.5371369\n176.2914854\n253.2454649\n269.8133667\n295.035585\n319.4624311\n329.4334917\n330.2983868\n331.2282049\n329.2749847\n317.4709655\n242.6148411\n229.7186396\n219.6771835\n218.4162487\n55.94134419\n55.92363655\n56.6115537\n55.90075007\n55.89012158\n55.87662586\n55.86808191\n56.14129879\n56.12649662\n118.214994\n180.4142742\n272.8342886\n285.1104634\n293.9662361\n296.4603276\n269.9724116\n239.3200665\n235.3554161\n238.6229857\n226.6119717\n170.1824723\n168.1445448\n169.0460573\n170.5717657\n55.95387753\n55.77976441\n56.4834558\n55.76932954\n55.75278055\n55.75153851\n55.75250381\n55.98771558\n55.95176125\n73.49514264\n137.2869595\n195.1097034\n209.0722525\n231.2364913\n260.0478037\n278.4396512\n286.7828646\n301.3196461\n312.5244881\n300.4237135\n246.7990285\n247.2123097\n238.5041979\n229.2306904\n56.08228493\n55.89704144\n56.59427802\n55.87434553\n55.85292476\n55.84827182\n55.84961212\n57.19990461\n56.99860795\n106.1017406\n166.9479842\n253.6762158\n276.2734165\n298.7216607\n316.0000983\n324.7481073\n327.3219525\n333.2487711\n333.9358441\n327.1441825\n260.5277786\n265.2999701\n256.7653609\n243.7806787\n60.71396996\n55.94180903\n56.62098575\n55.89602954\n55.87284204\n55.85283788\n55.83665145\n56.08662684\n56.03947127\n51.73127774\n47.37313065\n47.42806284\n47.47539583\n54.38224579\n61.97778088\n76.83211333\n77.10067519\n82.64078809\n82.73590233\n85.76458306\n83.41676782\n82.61324679\n77.05090636\n78.73900417\n63.44600178\n59.37158706\n56.60486411\n55.91785981\n55.8987176\n55.88490512\n55.87004056\n56.12472848\n56.11121748\n51.76699647\n47.41781373\n47.44536677\n47.48362537\n49.64031427\n66.7851149\n69.39620843\n76.86228523\n73.78839868\n74.72790292\n80.55115917\n81.2928095\n75.52646947\n71.36192901\n69.51026843\n59.73092781\n55.95152833\n56.63319743\n55.94593319\n55.93277612\n55.87249622\n55.84787262\n56.10645382\n56.09358732\n109.3537956\n174.7747896\n259.7295539\n259.1453754\n263.751576\n268.855898\n279.1980314\n285.1243263\n300.892373\n299.6044886\n279.9473455\n221.5518098\n219.9856937\n212.2680582\n212.4451089\n56.15416793\n55.90793802\n56.61310887\n55.90106636\n55.89188326\n55.88784712\n55.88435694\n57.27466225\n57.05940786\n117.6742766\n176.7993003\n265.2070164\n278.2760047\n298.0507916\n312.2939794\n320.9014841\n314.6622049\n315.2723695\n313.6411558\n293.0928519\n230.5543115\n223.8776413\n217.7103745\n219.7676011\n55.94216603\n55.94183286\n56.6277998\n55.90128743\n55.89593547\n55.89683417\n55.89736863\n56.17589187\n56.14277031\n120.9688685\n186.860673\n282.2184757\n292.9238236\n310.2977196\n336.2121008\n343.713437\n335.1090834\n330.9098129\n270.9674272\n217.2955342\n158.7476219\n152.8094757\n146.6412849\n153.0066743\n55.89362168\n55.75184549\n56.46537359\n55.7599705\n55.75427\n55.74960336\n55.74961633\n55.9967828\n55.97872099\n81.38265768\n141.5220218\n193.8974728\n196.4413011\n205.0293207\n221.6480118\n232.6392264\n234.8028074\n241.2584659\n240.0994962\n225.5150035\n167.3176884\n162.349499\n157.6169087\n158.8912977\n55.89964035\n55.73727918\n56.44792982\n55.73265144\n55.71684899\n55.70020781\n55.68493269\n56.82088706\n56.63314509\n63.59882447\n128.2696046\n184.509868\n198.7931495\n213.6522579\n230.1186262\n244.5987949\n246.0391091\n251.763353\n253.6357418\n242.3148927\n186.8818825\n182.942659\n173.2575341\n164.459463\n55.73124128\n55.75012094\n56.46696267\n55.7458423\n55.71902654\n55.70198889\n55.68434324\n55.90596607\n55.88267618\n50.17437978\n47.29603171\n47.35487199\n47.40772594\n47.44722684\n48.16639132\n47.48165908\n49.76430649\n65.08945077\n72.50144667\n76.93288828\n77.16827942\n79.31880666\n73.12950638\n76.19167982\n58.17424775\n55.892258\n56.57989907\n55.87932156\n55.7993804\n55.76488566\n55.74614005\n55.97466606\n55.941814\n50.22541909\n47.32997437\n47.38597343\n47.43986314\n52.82887013\n53.21984637\n50.83445957\n68.51229541\n75.17056429\n78.35122003\n80.18732783\n77.28607624\n79.01220428\n74.01461183\n74.43429897\n58.32196153\n55.91388872\n56.58177919\n55.89392765\n55.88845399\n55.86617963\n55.81619798\n56.07793682\n56.05634244\n91.43135447\n157.5437814\n238.5957455\n256.0092489\n278.2115464\n297.6689492\n308.8522579\n309.1446236\n317.9486089\n321.790484\n301.252709\n236.4807334\n228.0130116\n216.7256712\n209.8408801\n56.06636429\n55.88187854\n56.59741262\n55.88389369\n55.87219076\n55.86592737\n55.86039094\n57.22240113\n57.01936342\n111.2931462\n177.251852\n271.8416862\n292.7470563\n309.4177586\n325.3831955\n340.8694096\n342.6892177\n346.7809256\n348.17596\n343.8994075\n285.4854063\n278.6822061\n257.7358784\n243.464342\n55.96060325\n55.95360525\n56.65672806\n55.95206983\n55.92030403\n55.91189157\n55.90163978\n56.17184222\n56.14438111\n126.3130854\n196.2835592\n290.1461858\n302.1797276\n319.3889807\n337.3555079\n347.1612339\n348.7230529\n349.7522104\n347.7859284\n347.2927719\n289.4497598\n277.7785882\n260.8123062\n250.7214791\n56.18575055\n55.9335518\n56.60352267\n55.89946297\n55.9072246\n55.87475626\n55.83778987\n56.08922147\n56.06657071\n93.4953248\n153.11411\n233.1996524\n254.4403138\n287.6774959\n322.0665071\n336.5421905\n338.4566191\n315.9020346\n282.955877\n259.6186626\n202.0159906\n197.1568133\n190.7582324\n193.754461\n56.05458455\n55.85219807\n56.55998628\n55.84782391\n55.8331807\n55.81969181\n55.81098721\n57.09549741\n56.89246309\n90.70756508\n151.4794824\n223.8888244\n244.5941142\n266.6868171\n284.5941888\n297.7179513\n299.5744235\n302.9843261\n298.8947575\n280.216914\n218.3886316\n212.7205345\n207.5009806\n206.0578782\n55.86845427\n55.86748747\n56.56165983\n55.85177831\n55.84719207\n55.83669002\n55.8283691\n56.09378102\n56.07270715\n50.35554959\n47.41161629\n47.41617369\n47.42007481\n47.4423064\n48.1652502\n47.46940109\n53.15414584\n62.61319235\n65.7495001\n64.22673996\n67.19117393\n68.6874943\n64.82268879\n57.7607672\n56.04951682\n55.84494513\n56.52395364\n55.83108688\n55.81818477\n55.80532082\n55.79766368\n56.05797452\n56.02346298\n50.30548326\n47.39408868\n47.41957845\n51.37649187\n54.14772542\n57.29029574\n64.2304359\n74.37435756\n72.88419687\n79.66006628\n80.93296131\n80.22748548\n78.76686387\n74.84443851\n73.59152015\n58.98340532\n55.91412246\n56.58202347\n55.889042\n55.88497913\n55.88034319\n55.86888359\n56.05658557\n56.02741475\n50.30148243\n47.39280877\n47.43444251\n53.32087506\n56.56765737\n59.17150978\n77.38727538\n80.46187238\n79.58171238\n86.25386121\n83.02389242\n88.41764238\n82.43709808\n84.45196791\n81.13058947\n77.99793698\n72.19843481\n56.64274538\n55.93527244\n55.9136428\n55.91025249\n55.90991303\n57.26452624\n57.06775726\n109.7616244\n172.5578592\n267.4428641\n290.672885\n314.8464466\n332.5579268\n339.4661515\n332.1192389\n335.9751287\n323.100805\n286.5275284\n216.9365825\n211.2054773\n204.8793861\n204.7373995\n55.91391503\n55.91692602\n56.61839734\n55.91277206\n55.86453739\n55.86318437\n55.85917488\n56.12736768\n56.10225086\n110.9406445\n171.8648094\n253.131617\n265.8900371\n294.7794064\n321.2442191\n328.4017771\n326.5930573\n323.2417465\n319.5059725\n299.1852295\n237.7142545\n233.3284125\n224.1741289\n219.3575515\n56.15793104\n55.94421391\n56.63528282\n55.89044006\n55.86824023\n55.85083735\n55.83463997\n56.0844111\n56.06168886\n103.1125898\n178.7844815\n283.2040265\n299.6349567\n315.1582301\n333.5322697\n346.0382075\n347.3528895\n350.9924326\n346.8446359\n341.967421\n282.5629084\n268.2193606\n247.1312567\n231.3107161\n56.15787907\n55.94014234\n56.62595609\n55.91843994\n55.88661563\n55.84751831\n55.83506321\n57.13886696\n56.93194245\n96.28585726\n167.1365825\n269.7133018\n293.4897899\n311.497975\n327.430502\n337.8397876\n340.4253415\n344.7889492\n351.0320527\n351.2590432\n286.1743312\n271.169479\n256.7735498\n252.7498288\n55.97436906\n55.97435716\n56.6726832\n55.96819077\n55.96276903\n55.94179417\n55.9157463\n56.18306493\n56.150543\n50.42015493\n47.47978353\n47.49814731\n69.4335772\n63.50276031\n79.97094427\n74.37339832\n89.1176235\n81.70988989\n90.20782363\n79.46036016\n86.41194105\n71.04790186\n77.15531375\n73.52463138\n70.0363492\n55.95851769\n56.63350113\n55.94616467\n55.93713926\n55.92386081\n55.92199523\n56.21143004\n56.18222481\n50.42476446\n47.47193045\n47.48662822\n47.49944975\n71.17056886\n71.79174323\n66.89160464\n66.58227111\n71.96302301\n80.19834629\n77.73288737\n76.34065296\n72.49646778\n65.42777909\n62.16494524\n60.07839141\n55.95848019\n56.63441892\n55.95076932\n55.90146326\n55.87172004\n55.85695853\n56.12504108\n56.08644124\n104.6013221\n171.1209809\n264.9331973\n278.7118637\n287.0663798\n297.1832597\n299.8592709\n298.7715926\n302.4078609\n303.3650143\n285.6478267\n230.3836099\n226.0112065\n217.4229406\n214.1285623\n56.11852463\n55.90343758\n56.592207\n55.84116449\n55.82198164\n55.80702173\n55.79709276\n57.08044801\n56.88662038\n93.5330691\n156.5170407\n231.5257422\n247.3902595\n263.6996687\n281.6117697\n294.6332737\n300.8662278\n308.7890844\n315.3305397\n303.9538025\n239.6361618\n232.0760499\n217.5490058\n202.6555222\n55.82541049\n55.83889256\n56.54149372\n55.82480593\n55.80134057\n55.77582436\n55.7604607\n55.99498139\n55.96123544\n72.78533865\n138.0016703\n200.8040861\n218.3864725\n244.2199527\n260.9739039\n267.6035531\n273.5110919\n289.9442053\n304.1887958\n298.3216333\n239.5890717\n234.559047\n224.2396437\n214.1851752\n56.06838724\n55.88701009\n56.59769692\n55.87610373\n55.85103148\n55.8365149\n55.82527506\n56.08010311\n56.05055068\n95.33265032\n157.4658059\n234.8581325\n253.7274347\n275.9529813\n296.1523793\n316.1973772\n314.603594\n307.4730776\n300.2934625\n276.7118765\n221.1492135\n221.9433169\n219.4031829\n223.0397309\n56.13775695\n55.91521731\n56.61059289\n55.8939501\n55.88011055\n55.87313243\n55.87286611\n57.26458523\n57.05879937\n124.366817\n185.5225478\n288.558753\n310.3865716\n319.4366865\n304.170811\n307.9949519\n314.3562816\n318.4601855\n319.3228188\n300.8256519\n238.8772206\n217.0959684\n203.2533596\n196.1024469\n55.90500512\n55.91074125\n56.60861149\n55.90703898\n55.85383367\n55.85236348\n55.84869275\n56.12966706\n56.10342796\n50.38055962\n47.44792497\n47.47169118\n47.49948942\n47.51690196\n72.98990238\n72.97198273\n77.19794066\n83.6893459\n71.56295854\n79.83964552\n77.72834491\n72.90872171\n65.38167744\n64.15610863\n56.17246205\n55.95844488\n56.63438004\n55.93288659\n55.88245605\n55.87957429\n55.87965997\n56.15525934\n56.12917015\n50.41122621\n47.46861378\n52.55801085\n65.02215812\n75.94048436\n75.57142908\n70.17825342\n48.13733591\n56.72877142\n73.95204367\n72.2746246\n68.8416795\n66.42266171\n53.31596244\n62.29659286\n56.16687386\n55.94577115\n56.61764666\n55.91263664\n55.85535286\n55.84427905\n55.84011454\n56.11132347\n56.09587673\n116.8939678\n190.2085239\n294.1643556\n308.6296669\n325.4754735\n344.8398045\n350.3186721\n347.3694678\n350.3894236\n347.3883983\n343.9708504\n288.0596271\n279.3893451\n258.6543152\n246.8937388\n56.16312619\n55.93658478\n56.62418138\n55.91438207\n55.90146706\n55.8931102\n55.83859855\n57.13061719\n56.93669942\n102.0389865\n177.105663\n284.505409\n301.9282403\n316.9448921\n330.6403872\n347.1119254\n336.4580969\n332.0209713\n338.3810307\n332.486588\n269.8799219\n263.4523103\n254.1601003\n247.7364117\n55.96087715\n55.95384432\n56.65620627\n55.94726474\n55.93810797\n55.91913602\n55.88745426\n56.1588559\n56.13571022\n123.5098054\n194.9795163\n293.1851888\n306.8782525\n321.7761156\n335.7523419\n344.7178208\n340.9255442\n342.8098845\n342.177727\n336.4756779\n272.0838381\n261.9309696\n248.8870363\n241.2114395\n56.17420237\n55.96157639\n56.65783535\n55.94207472\n55.93146986\n55.89083331\n55.88105864\n56.15553385\n56.11960507\n115.1849402\n191.1573293\n293.5251025\n305.6584221\n325.5561626\n342.4765573\n345.6657116\n340.6918416\n347.9022085\n352.7449597\n345.7805777\n282.7571382\n270.575297\n259.0787624\n247.2538581\n62.20650933\n56.70120156\n56.65872401\n55.95239431\n55.9468792\n55.93331978\n55.892819\n57.27946774\n57.05226941\n122.4678151\n197.1022876\n294.5641595\n316.186877\n336.4372709\n343.7477025\n351.6102512\n350.5642362\n354.3047163\n351.1153827\n348.9650722\n291.9078478\n279.3652728\n267.9082187\n256.856178\n56.44734343\n56.72436977\n62.92787236\n55.96325561\n55.95920024\n55.95883736\n55.9555546\n56.19223597\n56.16005739\n50.43083075\n47.48894433\n52.48837625\n72.89111984\n77.40074431\n73.37905699\n76.71487635\n54.25923329\n47.43036763\n47.44919319\n53.48792112\n47.48931176\n58.61780909\n47.77646513\n54.88676088\n56.14758124\n55.9367061\n56.61553248\n55.92331129\n55.88162284\n55.83895821\n55.83498411\n56.10648281\n56.08574174\n50.36821636\n47.43909036\n47.45142429\n47.46675285\n47.45936773\n48.14893359\n71.16277329\n70.95675901\n77.34539175\n90.84966033\n82.31079866\n88.74766456\n80.97410509\n86.24450984\n77.86717222\n77.11435127\n75.75166411\n60.77915442\n57.93301689\n55.91185026\n55.89981277\n55.88664533\n56.15560567\n56.14181434\n136.520666\n214.4219228\n313.1871024\n331.3114459\n346.5266451\n354.0394867\n352.3218279\n332.2764838\n332.8664353\n340.552554\n338.2703521\n272.0927634\n263.7688127\n255.5456606\n249.0507938\n56.18379584\n55.97003766\n56.66761178\n55.96276857\n55.95455353\n55.95122277\n55.94519195\n57.32088848\n57.11155266\n135.0790371\n208.6407019\n310.2847328\n321.216747\n332.2390849\n351.1331529\n359.3676772\n358.226953\n361.3351867\n353.5165826\n346.0447479\n299.1920741\n292.8850336\n270.9528412\n256.3499197\n68.18642401\n62.62112317\n57.0193638\n55.95549232\n55.95202826\n55.95166568\n55.95132852\n56.23604359\n56.16483943\n130.3277323\n206.0498268\n305.5261681\n319.5837252\n341.617939\n355.3469394\n357.3610702\n355.4321132\n358.3095001\n356.8415227\n353.4299486\n299.9204776\n293.2513524\n277.1731671\n258.6495037\n71.69748515\n61.52789795\n56.65802834\n55.94755606\n55.94342438\n55.94301247\n55.93754623\n56.20424663\n56.1462049\n123.6709624\n197.0875252\n295.9970643\n310.9931342\n324.3843096\n341.3680388\n350.192913\n348.587061\n356.2410067\n351.8215558\n351.8488537\n306.0222032\n303.4351836\n290.8244608\n271.0490895\n72.33673053\n65.99806139\n61.62194365\n55.95577591\n55.95227573\n55.9467974\n55.94279724\n57.33028399\n57.08677296\n126.4891411\n194.3697833\n293.8795149\n314.6463067\n334.5227174\n349.2153304\n356.7799932\n355.3892402\n356.5943934\n353.6309648\n354.8128426\n302.8192379\n289.6203068\n270.3149725\n243.2903305\n61.85395743\n68.7375241\n56.65165519\n55.94388609\n55.93401871\n55.92687253\n55.89745023\n56.1584255\n56.12798159\n50.40632274\n47.46637632\n54.20147804\n59.86154698\n77.70181079\n79.5273298\n81.99483936\n84.44811942\n87.09189283\n90.75304885\n91.96728091\n93.2939742\n91.81277735\n87.98239792\n88.06802068\n84.76937234\n77.57831773\n67.24490232\n55.94716074\n55.94314306\n55.93770277\n55.93882699\n56.2210596\n56.19230929\n50.40460173\n47.46708956\n56.30847583\n78.07610646\n77.22855706\n80.30253285\n85.4107491\n87.73038752\n89.06565928\n87.78454722\n89.93805856\n91.88405441\n90.68173802\n86.56858796\n88.49892126\n83.03167473\n77.87304556\n68.88322667\n59.48915611\n55.93940581\n55.94271408\n55.94239005\n56.22771521\n56.20251195\n127.1466631\n203.7213886\n304.3502522\n317.2518809\n332.7538235\n350.0103421\n355.0495299\n352.7832827\n359.8259331\n343.7501095\n322.8417446\n263.446804\n261.9865816\n249.0845532\n237.0161946\n56.15856063\n55.95075447\n56.64867489\n55.93392879\n55.92678377\n55.9212919\n55.92238495\n57.29324333\n57.08530565\n119.6163135\n194.1212016\n296.1842665\n306.4872513\n321.6382347\n340.4455769\n350.1289576\n351.0867771\n359.5489283\n358.3353494\n354.5379541\n297.8206242\n285.3535162\n270.0606954\n256.7133859\n65.10194194\n69.3740188\n59.45939676\n55.97168816\n55.96319941\n55.95498989\n55.94144896\n56.22337357\n56.20297918\n125.1634472\n200.2577258\n298.0173614\n318.1579951\n335.0092784\n347.320141\n351.5481808\n349.5428392\n356.3973578\n353.8682372\n350.089907\n299.3456457\n284.1713763\n265.1555238\n254.9204011\n62.10854456\n61.01768192\n56.67234316\n55.9634703\n55.95009914\n55.93795928\n55.93903895\n56.22123974\n56.19801319\n122.5042977\n192.9838503\n287.3038413\n302.2732128\n321.2508968\n336.5872164\n344.3640781\n341.5569392\n349.194513\n351.1560783\n349.9152885\n301.0732521\n293.933458\n282.8878559\n266.6513405\n77.36511992\n64.11765907\n60.00169955\n55.94781571\n55.9488026\n55.94696429\n55.9378657\n57.33891894\n57.10019581\n126.3654093\n200.812523\n300.6044735\n312.9561014\n333.1080989\n344.7482984\n347.6744875\n345.014504\n351.0351676\n358.0752259\n359.2777262\n302.9707959\n296.1560712\n277.8303176\n266.2895886\n72.20951234\n66.70417806\n61.62233845\n55.97090083\n48.75030544\n48.74180535\n48.73356423\n48.98931933\n48.92469508\n43.19424952\n40.25464648\n49.9529643\n53.66555599\n74.33920792\n72.61774068\n77.132392\n79.79423604\n81.66778661\n86.54331181\n87.42625183\n88.24474506\n85.17700494\n79.571602\n74.70100308\n67.8971574\n53.67262577\n49.38840151\n48.69900935\n48.69866811\n48.69834713\n48.69804305\n48.96605756\n48.95019522\n43.17868631\n40.23487772\n40.26868912\n50.22141799\n72.1470242\n71.98687897\n79.5211294\n75.68595027\n81.21370384\n81.98083954\n82.37960604\n75.60976691\n73.85679882\n66.00138377\n67.5889311\n61.67641629\n50.0107986\n49.4069552\n48.71788625\n48.71453869\n48.71427421\n48.71400474\n48.9997998\n48.97996896\n103.1898977\n113.0914849\n185.4800733\n202.7744754\n219.7818356\n232.9293434\n246.6844741\n250.3007874\n264.7042012\n265.4770251\n234.0459227\n189.9792706\n139.7563833\n146.8004073\n123.8507982\n48.95931182\n48.75281704\n49.44883193\n48.74289334\n48.74363647\n48.74206661\n48.73365813\n49.01535798\n48.99016506\n43.21372985\n40.26524389\n40.27302871\n40.28404172\n55.38251591\n72.84887898\n74.23932015\n75.26325381\n82.53085011\n76.94426822\n83.84126603\n77.34611799\n83.31558593\n73.2574195\n72.64245384\n64.70843828\n57.78026793\n49.82667435\n48.73092828\n48.72552679\n48.7173515\n48.71402698\n48.98737967\n48.96452472\n99.84366012\n108.0686999\n180.1134463\n198.3935599\n210.0567515\n222.7336827\n235.2666303\n245.2611746\n258.7932357\n258.9372219\n267.4615105\n239.1761519\n160.2711829\n157.2008891\n129.4744834\n66.30552794\n58.06417066\n49.46625353\n48.74988414\n48.73976603\n48.7343179\n48.73032623\n49.01563793\n48.99041772\n108.3001935\n120.0019813\n187.4539305\n208.9978139\n228.0527204\n242.1744394\n253.2830083\n262.6804899\n267.2576565\n246.3360725\n241.4244892\n211.5361904\n150.0046467\n148.3267483\n117.7791963\n48.93903611\n48.73849785\n49.43196764\n48.71232804\n48.7028669\n48.70469702\n48.70230415\n50.11795169\n49.87689239\n110.0372654\n118.2222355\n175.9823624\n182.4133302\n190.9020594\n211.8953785\n217.7420109\n221.3479645\n233.8855423\n239.2354132\n237.9023978\n211.8942854\n148.5411769\n146.545234\n120.7935096\n48.72543864\n48.73230169\n49.42686924\n48.71451073\n48.70358433\n48.69201476\n48.68272961\n48.97033413\n48.95835944\n44.6618535\n40.25911132\n40.26551254\n40.28961941\n62.11671866\n71.77053569\n71.65253062\n77.59810243\n74.8832989\n84.01853451\n79.17453901\n78.79936054\n65.28294592\n63.02065298\n61.09633647\n59.9776144\n48.75592876\n49.43676509\n48.74597642\n48.74829774\n48.7453869\n48.7384967\n49.03231612\n49.01200789\n44.65184913\n40.27093904\n40.29287768\n50.29597309\n70.46605333\n77.47867976\n78.18449807\n78.92657832\n83.18901999\n83.62617562\n84.26927198\n83.75603816\n82.46821969\n79.31369022\n81.30050322\n71.27790395\n66.62167345\n55.74467037\n48.75069695\n48.74674994\n48.73206141\n48.72142383\n49.00389278\n48.97995758\n105.0704353\n117.7019545\n192.1417588\n206.3986081\n222.3301021\n234.7011584\n237.7043164\n243.7081173\n259.6585739\n267.2071717\n275.7992542\n249.5762926\n164.3144861\n162.9984392\n133.6092572\n67.03407823\n59.58115182\n51.09019226\n48.77205695\n48.76661371\n48.75341554\n48.75151802\n50.19983762\n49.98044879\n114.1962296\n128.5427649\n202.1450864\n214.6651943\n231.2849645\n239.3977545\n253.2941698\n251.7269092\n238.6565683\n250.720226\n261.6246702\n226.3061257\n154.1646615\n150.0688145\n121.9468806\n51.18471239\n48.76463858\n49.45786989\n48.75090915\n48.72022469\n48.69453828\n48.67389836\n48.93442138\n48.90519132\n100.2780467\n108.2967056\n183.0341843\n203.2244745\n214.9358291\n234.4078589\n247.8213041\n250.9720688\n264.5862323\n277.5487524\n277.1737817\n246.5578844\n165.2343815\n162.336109\n131.3834634\n71.42107866\n51.09076061\n49.44797912\n48.7362367\n48.71881958\n48.69968324\n48.68413179\n48.95112992\n48.91621571\n99.99408413\n111.2531841\n184.4222172\n202.1785738\n212.2859595\n226.8382671\n238.1635413\n244.6606069\n253.0443387\n254.0934753\n264.9947599\n244.8199837\n164.029164\n165.9873557\n140.4624418\n72.60695981\n63.17205154\n61.41669079\n48.7507571\n48.72014549\n48.69902637\n48.6871567\n50.08246562\n49.87231978\n106.0522761\n114.5751914\n185.2529305\n200.9232473\n215.8764594\n229.241169\n241.1111964\n251.8871991\n261.3770505\n266.0067001\n276.6584012\n245.5198415\n162.4110158\n166.1666161\n140.9774522\n73.54278726\n71.90326151\n61.98078013\n48.74440436\n48.71553441\n48.69545419\n48.68446029\n48.94789159\n48.91438232\n44.62334834\n40.25478883\n50.03372266\n54.6780591\n70.04891789\n72.33578748\n76.80284426\n76.97055303\n84.57704622\n85.12790584\n89.07340284\n87.92968635\n88.34142861\n84.23694467\n84.90856094\n74.71236256\n73.16500173\n71.05490304\n56.9266378\n48.76666264\n48.75854683\n48.74597716\n49.01404182\n48.99265794\n44.65943368\n40.27928733\n40.29429096\n62.56600272\n73.43477885\n74.38089922\n81.42546743\n72.12490684\n73.10770992\n69.46560732\n74.25674156\n67.38220302\n71.00558712\n62.26349324\n59.8283897\n49.35003249\n48.72596834\n49.39253842\n48.70559538\n48.7010347\n48.69257021\n48.68861535\n48.96053923\n48.94956056\n96.0349714\n96.90565808\n162.1346735\n182.45033\n195.9632591\n207.3375269\n219.3671005\n228.170462\n229.2562381\n238.7172167\n252.7242661\n218.8417934\n147.5778767\n147.8796226\n115.7545705\n68.84148751\n50.72751197\n49.44032073\n48.70463346\n48.68467135\n48.66729273\n48.6573492\n50.00915146\n49.7992171\n98.76437395\n107.3197119\n177.9141322\n193.2316193\n209.91822\n224.5776259\n231.2621928\n231.1146413\n233.9667302\n242.1669665\n248.5322585\n219.5757973\n150.4808969\n144.5937304\n117.6823875\n51.06886701\n48.75591286\n49.45461922\n48.73787341\n48.7174062\n48.70380542\n48.68742193\n48.95085136\n48.91623267\n100.790605\n111.5416886\n177.5571683\n196.8067287\n216.2232422\n229.2181364\n239.025853\n245.404702\n250.9854828\n256.9715997\n258.3332949\n226.0506832\n156.1620908\n156.3614087\n130.405793\n64.30914667\n60.1679163\n49.46454053\n48.74315468\n48.72866168\n48.7224495\n48.71169273\n48.99352413\n48.96457512\n109.7017122\n119.3005229\n185.8661184\n204.070212\n229.5386639\n246.077374\n259.3310469\n257.203292\n258.7493693\n250.6315837\n248.5092228\n226.8688881\n154.2059193\n151.859719\n130.3472082\n67.07852178\n53.39266153\n49.4648271\n48.74850075\n48.74272609\n48.73566712\n48.72689167\n50.15459351\n49.90598893\n110.442406\n118.9807615\n191.0325986\n210.6072378\n214.7763991\n215.6034673\n240.5195246\n253.0185084\n230.1334904\n219.4028279\n233.5696616\n202.4563105\n145.5559085\n138.6577825\n111.2649109\n48.70315197\n48.70710499\n49.38720787\n48.67590813\n48.65958071\n48.64897728\n48.64316371\n48.91547116\n48.89296552\n44.61430888\n40.2489537\n40.25903241\n40.28972012\n40.31888776\n68.78363539\n68.11082283\n66.29939405\n69.61357266\n81.47646579\n72.45964707\n81.96558443\n64.11163957\n62.13142054\n49.68595398\n49.57040771\n48.7460355\n49.42100876\n48.73877544\n48.73850127\n48.72385958\n48.67740159\n48.91946705\n48.89189912\n44.60332977\n40.24236404\n40.28123128\n40.31597983\n66.04796171\n69.06668859\n71.58820765\n65.94129723\n66.13916066\n69.02952143\n64.30243897\n69.32028513\n63.97603116\n62.6597865\n57.99400074\n54.03017647\n48.73441567\n49.41279151\n48.7301692\n48.72057658\n48.70853652\n48.70462996\n48.93391506\n48.89902724\n102.9569953\n107.6919144\n164.5141233\n184.8426992\n208.820617\n219.2612903\n208.8526422\n212.9914967\n231.2364333\n229.216499\n215.6329379\n189.3358031\n150.5882558\n153.1007311\n126.2659456\n48.94144515\n48.73331786\n49.4103351\n48.7025016\n48.69048787\n48.68113444\n48.67112268\n50.04446105\n49.82011972\n102.6373313\n107.7794157\n170.2423232\n188.4154467\n207.0321517\n213.8912094\n224.5022379\n234.0853207\n242.2987559\n241.9288252\n235.9967847\n212.6410991\n149.1705962\n145.0186226\n123.1405083\n48.73966107\n48.7563213\n49.44786133\n48.72775463\n48.71365933\n48.69299693\n48.67629649\n48.95358381\n48.93062606\n107.7747302\n112.238432\n181.0751836\n203.0871456\n215.8572087\n230.2354688\n240.0086608\n245.5268649\n260.5424439\n264.7243369\n262.7231157\n235.4395648\n160.8468393\n161.5072595\n136.6947345\n52.48222469\n49.17336711\n49.46071518\n48.75182062\n48.73528056\n48.70751205\n48.68531129\n48.95238804\n48.92993153\n108.6736084\n114.1558436\n184.1001426\n208.0197476\n221.5637041\n239.367875\n252.7426681\n217.5640353\n216.9765408\n218.2685904\n201.304514\n169.8194512\n139.6548915\n144.7106861\n122.7685252\n48.93871639\n48.71810431\n49.39768217\n48.70108865\n48.69727581\n48.68888258\n48.67371765\n50.05449371\n49.84809264\n106.6766691\n110.8624571\n175.664143\n194.0054028\n213.7829686\n230.4799547\n244.8839023\n253.5605307\n263.2616784\n266.6792814\n273.3166314\n245.1128117\n163.6803057\n158.9615212\n132.6197796\n52.49158832\n56.5159883\n49.45515984\n48.73537764\n48.71584456\n48.7053017\n48.70324322\n48.97906974\n48.94619071\n46.07674799\n40.2607985\n40.28064159\n50.48675096\n46.04362129\n72.9789306\n77.30114038\n74.81693591\n77.66492294\n78.83119477\n72.7111271\n64.94186592\n65.57570611\n57.6066744\n59.13557315\n50.66418451\n48.73248467\n49.40455276\n48.71733615\n48.70891071\n48.70496939\n48.70043523\n48.96542779\n48.93677992\n46.01667966\n40.22433545\n40.25746697\n40.30003627\n54.39688211\n76.41172608\n79.1877118\n82.35238676\n88.21178483\n88.0722799\n91.23989578\n87.4116894\n84.06466836\n77.45801365\n76.83779377\n72.86630837\n67.83928358\n56.78682494\n48.74708864\n48.73745729\n48.73556493\n48.7338146\n49.00877577\n48.9922196\n109.8105065\n122.1387342\n196.3719399\n217.9356368\n238.0729638\n261.912451\n281.8915207\n279.9042816\n286.6481958\n293.604334\n292.1628271\n262.9647129\n163.0420781\n153.97608\n126.3648519\n57.550829\n65.39240279\n51.70665775\n48.75090576\n48.73969667\n48.72826894\n48.71708975\n50.02664841\n49.79499472\n107.6156155\n119.6132287\n180.5031487\n195.9029085\n208.4758439\n224.0024411\n236.5498228\n242.6068043\n258.4228919\n281.1800993\n298.4439997\n265.818145\n171.2001168\n163.6759207\n137.9220144\n74.71851514\n74.15145319\n72.95547662\n48.76356301\n48.74296502\n48.7194856\n48.69517995\n48.95777477\n48.92231061\n105.1233177\n114.837788\n186.4003922\n207.5967509\n220.247875\n238.8049665\n262.9573341\n274.7570793\n290.2867313\n303.1278533\n309.5572034\n289.6399808\n182.2290077\n174.193132\n153.2512281\n83.85809469\n81.5058937\n68.80157618\n67.29779345\n48.76074176\n48.75371407\n48.74509652\n49.01387309\n48.97768564\n114.2053487\n125.6413649\n198.3066699\n213.4826429\n234.8052975\n258.9649919\n275.947268\n292.6378218\n303.7412581\n306.6625257\n279.5690727\n213.4061472\n148.768964\n156.2178263\n136.7142523\n52.64498297\n52.84183756\n52.05829168\n48.76288054\n48.73530399\n48.7172165\n48.70460701\n50.13002162\n49.91803892\n114.2330738\n125.1421206\n199.7399353\n219.6534223\n239.9446258\n262.4485284\n271.9697747\n276.2095337\n294.7421717\n300.3094216\n303.0450601\n282.7570066\n181.5102254\n174.2835366\n145.8092522\n76.62721125\n72.92338238\n57.53404916\n60.21400197\n48.76017624\n48.73234035\n48.71825287\n48.98030118\n48.93666633\n46.05736144\n40.24893941\n46.78858321\n55.46694323\n74.13866307\n82.81647038\n82.12738106\n83.62592945\n86.38328141\n91.92969426\n90.88600653\n79.64404195\n68.21095873\n66.46346514\n71.70055354\n60.59948545\n60.16734513\n49.42585194\n48.72158537\n48.71458167\n48.71427436\n48.70888309\n48.97678607\n48.94815795\n46.0323087\n40.24584967\n40.28672747\n52.22158776\n74.168993\n69.05225039\n73.42024382\n75.87068074\n81.03454207\n80.2246993\n84.59071466\n81.60349364\n81.67906303\n73.8588162\n75.21692029\n68.68649494\n67.38689124\n49.42903281\n48.74709416\n48.74261622\n48.73934501\n48.73910641\n49.02736024\n49.00208564\n111.7371839\n102.5878106\n147.0981758\n153.9768761\n164.3779157\n171.3628211\n177.4414052\n189.7205666\n203.0499312\n206.0544933\n212.5985741\n185.2521919\n141.3384952\n139.4968549\n113.3835267\n48.94766386\n48.73908963\n49.42461372\n48.72160526\n48.72121161\n48.72599653\n48.72430356\n50.05330221\n49.8087288\n106.5737566\n113.6908281\n179.9170523\n198.4904697\n217.659649\n239.6149732\n245.1413007\n245.4980428\n263.7342804\n273.7089591\n283.271221\n261.3987816\n173.3259327\n169.0755603\n138.7826129\n68.92607545\n55.29484519\n49.45360242\n48.7438654\n48.73173512\n48.7169225\n48.70707925\n48.97302484\n48.93547867\n110.0377913\n121.4852139\n192.1309299\n210.0407057\n221.8551639\n240.8574019\n260.1684627\n267.2594687\n277.8935646\n286.6226693\n293.4622774\n251.4500348\n163.6451169\n164.5137794\n142.4132309\n58.24057116\n63.63241562\n49.45767816\n48.73674484\n48.72674654\n48.71416122\n48.6858543\n48.94883415\n48.92470022\n107.0828905\n116.6483839\n187.1534223\n205.3173212\n221.977378\n240.2444274\n258.0769584\n268.9343817\n284.651492\n295.5329229\n294.3687527\n241.9277736\n161.4419974\n163.78651\n136.8057382\n52.27188518\n51.42114787\n49.46364201\n48.74762161\n48.71769221\n48.69176001\n48.68657652\n50.07708224\n49.83943087\n107.9867015\n119.075759\n189.9669199\n208.0594045\n221.8292095\n240.6892878\n258.9595745\n271.1616303\n276.0273139\n275.5172328\n288.5256967\n261.4027989\n174.8892513\n175.332261\n145.5730211\n73.93685719\n63.39370782\n61.33929639\n48.75522443\n48.7403365\n48.72912119\n48.69993437\n48.9490137\n48.93470276\n47.49971798\n40.26212522\n40.30113931\n56.15216451\n74.65656342\n75.25506929\n83.22639561\n83.79316855\n88.89204115\n89.6640363\n94.34537507\n92.89419344\n91.62999789\n80.4629313\n82.08790925\n71.67961846\n66.01699113\n66.47730188\n62.72861029\n56.05683019\n48.76640005\n48.75832827\n49.05197856\n49.03196891\n47.53059165\n40.29035668\n50.74738634\n67.44245637\n69.86860831\n83.8463553\n81.29834723\n90.80958781\n83.71833849\n84.29669557\n73.34402426\n71.61614711\n65.3195488\n60.01080815\n64.95021633\n48.9353068\n48.71815805\n49.39774105\n48.70934736\n48.70540338\n48.70512284\n48.70483572\n48.98887469\n48.97555343\n107.9968619\n109.5689989\n170.0373633\n184.9431298\n200.3088995\n213.1970636\n185.8647813\n166.5923735\n168.4039806\n171.5736106\n179.5567833\n157.3975571\n137.3617436\n137.3489325\n114.3347322\n48.92317979\n48.71442615\n49.40262091\n48.70490158\n48.7003367\n48.67708049\n48.64342021\n50.00392814\n49.8016593\n106.4803911\n103.278366\n160.3720434\n175.7802915\n191.6988181\n201.8518728\n217.136968\n226.3509384\n241.3283234\n251.1547237\n254.8898653\n227.3675042\n158.4042202\n161.4940549\n135.3611587\n50.76585588\n60.45849478\n49.43795052\n48.72043667\n48.69441681\n48.67106085\n48.6559358\n48.9144299\n48.89266979\n101.2099974\n105.5044732\n177.1530814\n199.8048885\n215.470968\n234.7987393\n245.0993804\n250.5148148\n264.179995\n263.1212233\n263.0537252\n231.4263524\n158.8087969\n158.6925914\n130.5122586\n52.05597293\n50.77008854\n49.44163886\n48.71838771\n48.69361962\n48.67381948\n48.66278184\n48.93371423\n48.90987301\n104.9210028\n114.1839488\n188.0415337\n207.0670724\n223.3923911\n248.4346426\n262.5127518\n204.731983\n171.3158898\n169.1493378\n174.7123234\n151.1786887\n135.6506135\n136.4249562\n111.7025316\n48.86662263\n48.67274007\n49.36095747\n48.65982457\n48.65507159\n48.65162851\n48.64872331\n50.02774538\n49.82417479\n111.6034849\n110.7353524\n167.0745038\n187.9292918\n217.1076867\n241.4572726\n256.1404078\n232.225887\n210.318609\n212.8471927\n224.0102926\n196.4025237\n147.2694469\n146.1278377\n117.0766889\n48.70292641\n48.71161808\n49.39735354\n48.68414132\n48.6729693\n48.6610301\n48.6512826\n48.92322418\n48.90018206\n47.46742662\n40.23212005\n40.26407841\n46.9509393\n56.08400372\n74.88553095\n80.28239526\n78.44862496\n84.86437499\n83.44236691\n87.63014095\n85.32799427\n80.40999509\n71.10651317\n76.39162746\n60.52161454\n59.90318269\n49.39990979\n48.71918324\n48.72185218\n48.71726306\n48.70878614\n48.98234458\n48.96429395\n47.46965789\n40.24493949\n40.27544858\n46.31624848\n61.98927996\n75.22165582\n80.47019785\n84.88965037\n84.41180231\n86.14529719\n85.44133056\n73.60222516\n56.61348026\n60.32393657\n50.245408\n48.91895016\n48.71114513\n49.39743045\n48.71417651\n48.70881904\n48.70068309\n48.70166502\n48.98199811\n48.96402894\n104.9375771\n102.6473326\n156.70904\n177.1942771\n203.200478\n219.3289421\n225.8264006\n225.1922132\n221.24443\n214.7054069\n187.9130399\n142.8559318\n129.0695722\n131.5376166\n110.2382713\n48.91973922\n48.72124382\n49.40657115\n48.66422057\n48.66019706\n48.65751183\n48.65507911\n50.04630194\n49.84126713\n113.0193776\n115.0326878\n164.5500054\n169.3268452\n174.4594966\n176.6432856\n175.9381387\n169.1031256\n168.1041075\n171.504657\n180.8534624\n161.0815252\n145.758851\n141.5095455\n116.6046699\n48.68356048\n48.67753902\n49.36131338\n48.65923553\n48.65129356\n48.64785247\n48.64480561\n48.92222108\n48.90190599\n112.0658613\n114.8132336\n170.2877494\n179.6474211\n200.5715815\n197.5934402\n192.6170466\n202.6927927\n219.2911219\n234.4213691\n239.5618914\n211.5064969\n153.0977373\n151.7583227\n122.7185697\n48.92631225\n48.71472043\n49.38497273\n48.6762147\n48.66083668\n48.65146063\n48.64365856\n48.91076207\n48.88884652\n105.5506689\n104.9070104\n168.6549777\n191.204688\n214.1257218\n229.3175028\n229.6086604\n231.810546\n256.4493589\n276.7059532\n278.4684367\n247.1429025\n164.4688818\n158.2989746\n132.3629174\n51.25244127\n48.74950023\n49.42671895\n48.71587144\n48.70305906\n48.68314424\n48.66969284\n50.04425337\n49.83926684\n113.8301464\n117.5673905\n182.8215365\n208.9586033\n224.8408514\n240.2309898\n255.7062085\n270.3071934\n273.7892868\n274.9767591\n249.5982776\n215.7518958\n165.8691058\n166.7540066\n134.0197815\n48.76508292\n48.75421526\n49.43266733\n48.70148054\n48.68201591\n48.67086039\n48.66172367\n48.92988432\n48.90217167\n47.48134266\n40.25031933\n40.27648039\n47.48781905\n62.00330941\n81.70971308\n76.0064959\n87.27382362\n83.97729645\n89.50871793\n85.99518337\n88.30308535\n81.45365253\n82.9974078\n76.18812782\n72.89422597\n55.8309806\n58.70346463\n48.74795496\n48.72130052\n48.71423271\n48.71389694\n48.9996294\n48.97309142\n47.48130222\n40.24162536\n40.27281402\n51.63334729\n70.58710839\n76.77851671\n84.30448133\n80.83776138\n89.3054198\n84.39564889\n93.87956617\n86.3774593\n90.59802111\n81.28745125\n85.32538668\n78.45855393\n72.9871947\n64.01535884\n54.3574213\n48.74946918\n48.72930812\n48.72167435\n48.99170417\n48.96473337\n109.2280095\n114.0924287\n180.3948637\n195.7028171\n215.4523749\n243.1364828\n260.6190872\n273.7195286\n291.154211\n293.5777247\n293.8910139\n273.8986557\n171.5690131\n166.9729377\n135.9702874\n70.34890744\n54.96762609\n51.20714553\n48.77508595\n48.76664075\n48.75847305\n48.75514035\n50.19983762\n49.95950824\n114.0069669\n119.0851918\n181.9315348\n202.5611555\n230.7702616\n262.0798921\n279.0940014\n289.4337067\n301.4656777\n304.6363759\n301.605526\n274.5753656\n173.5654081\n171.2551694\n138.0589789\n70.46728515\n54.27848018\n50.75243652\n48.74038177\n48.73483356\n48.73078896\n48.73043565\n49.00336213\n48.95703564\n101.8856748\n101.2959089\n163.2221225\n183.8034635\n207.5219041\n232.3083378\n249.0342463\n261.6982575\n275.899497\n278.6355052\n281.7330317\n249.9129908\n147.2479304\n132.985363\n108.1154087\n48.87952322\n48.68220752\n49.37608299\n48.66881869\n48.6623401\n48.65706133\n48.6520491\n48.92520445\n48.90339971\n105.448035\n98.21817276\n150.2474544\n156.5769515\n169.4682189\n181.6326173\n201.661317\n222.9447782\n234.4548247\n236.9573695\n244.3946801\n224.4836736\n165.1607318\n155.516325\n109.4468228\n48.86340209\n48.67680246\n49.37607671\n48.66994716\n48.66291184\n48.65775697\n48.65407925\n50.03141518\n49.82861978\n112.0100324\n108.3581845\n161.7763245\n178.5220732\n201.6210381\n218.6854937\n240.1328986\n245.9994054\n243.4356228\n235.9478142\n229.0912226\n197.0122109\n146.0056366\n148.8384159\n122.7646951\n48.71801145\n48.72446478\n49.41254308\n48.70398845\n55.90949214\n55.89907225\n55.88549505\n56.16037217\n56.13902306\n56.13063627\n47.44879923\n47.45337518\n47.46247941\n47.47236459\n48.16850431\n47.49533311\n72.55681227\n75.35845653\n78.9258738\n74.39990936\n68.46020211\n51.56768958\n52.6050601\n56.31642066\n56.13931766\n55.88726514\n56.55716137\n55.8692396\n55.86615246\n55.86346646\n55.8610404\n56.13921393\n56.11928049\n56.11150482\n47.43817127\n47.44388686\n47.45307318\n47.46826147\n71.93795683\n67.75994583\n69.86227103\n76.59538028\n76.01018448\n73.65548137\n67.97990836\n65.46827398\n61.11373228\n56.29828444\n56.12183081\n55.88487329\n56.54013058\n55.85018354\n55.84546221\n55.83599385\n55.83373185\n56.10963887\n56.08943864\n56.09442106\n47.43761564\n47.44903541\n47.47372785\n55.0709876\n81.34069755\n83.54285476\n83.9773123\n86.9217915\n86.69834533\n86.61574215\n85.66974659\n82.44566199\n78.7135385\n75.26666876\n59.42148067\n55.90461571\n56.56628862\n55.8676088\n55.85050975\n55.83917731\n55.79177483\n56.9800242\n56.77518606\n78.70040548\n137.6465623\n204.9906282\n224.4855427\n253.6925365\n279.3766395\n291.7644077\n299.5218133\n313.3001439\n320.2764421\n317.2871079\n252.5702783\n234.6263312\n216.0614195\n201.1010861\n55.85669404\n55.86967543\n56.56828251\n55.83801968\n55.81373334\n55.78293576\n55.75916278\n55.98660719\n55.97102688\n79.51853062\n137.6616712\n204.5440979\n235.7938702\n265.6517392\n280.3788833\n291.6163275\n298.85431\n314.6445057\n321.4202317\n311.677744\n243.2958604\n230.04209\n217.9661905\n205.2418329\n56.06124526\n55.86624181\n56.55484312\n55.83191352\n55.81422166\n55.79768952\n55.78169116\n56.02414709\n55.98914537\n81.25383117\n137.9458562\n199.1814251\n212.4337312\n233.6620784\n256.1646619\n274.4930021\n288.63787\n306.2343321\n312.6209269\n307.170482\n241.8169598\n223.4903633\n210.8501843\n200.4392805\n56.03574115\n55.84643413\n56.55730587\n55.83940261\n55.81787278\n55.78806348\n55.76049259\n56.93129024\n56.72128402\n72.59468799\n130.6733561\n189.7224715\n206.4440009\n230.1208837\n253.2393005\n271.2745598\n283.931162\n303.2316972\n314.0004088\n311.6451044\n248.283198\n228.5225788\n209.3800614\n196.5862182\n55.82135122\n55.8237979\n56.54438829\n55.80835303\n55.77691658\n55.75391731\n55.7340653\n55.9757987\n55.94979763\n55.9432923\n47.31468763\n47.37197676\n47.44552976\n47.49828447\n52.14854125\n72.00925517\n75.10283476\n86.70594671\n84.56594264\n91.70232741\n84.78781478\n86.69093631\n82.56073438\n73.87302762\n61.78307535\n55.89950288\n56.57003072\n55.88091043\n55.86720202\n55.78922075\n55.76817089\n56.00328853\n55.95582148\n55.94795652\n47.3098588\n47.37312054\n47.45968989\n47.52018245\n65.35062687\n77.35376091\n82.7308142\n90.11611359\n89.14134143\n92.91116401\n88.01199287\n88.92184728\n84.65387376\n80.23551326\n76.06863928\n72.4333411\n59.75470843\n55.94130822\n55.92948212\n55.92104682\n55.89125722\n56.08524932\n56.06384456\n103.6132378\n161.859505\n249.5805542\n275.3072374\n302.8903203\n331.2013447\n346.546929\n347.0628184\n349.7851194\n350.1497908\n350.5813451\n292.9364195\n270.8406024\n253.345745\n239.3467197\n56.17114104\n55.9434606\n56.62863749\n55.90042807\n55.881282\n55.8742858\n55.86798855\n57.21760706\n57.00810607\n120.1802638\n181.1802159\n258.8371433\n289.4862424\n339.5928415\n357.354224\n355.3681716\n353.8823857\n339.0221791\n316.4788448\n311.9309283\n273.131206\n270.7420802\n262.996198\n252.9467928\n55.97110754\n55.96520725\n56.65822179\n55.94962751\n55.94259919\n55.93721552\n55.88785991\n56.15188689\n56.12348634\n126.9533197\n184.7359481\n276.6801704\n295.8301866\n326.9235296\n350.7964866\n357.2625834\n356.7253641\n363.4291859\n360.08455\n356.6517911\n307.0611847\n296.1505005\n277.7272237\n260.2150628\n56.19762925\n68.84356636\n56.66572326\n55.95017329\n55.93797451\n55.92460601\n55.91329807\n56.12743982\n56.09823708\n114.2967445\n172.0194469\n270.800117\n302.9217308\n332.3358466\n346.1624693\n355.062292\n356.4528771\n361.7110437\n360.5537181\n356.4133911\n302.2874552\n287.9104046\n274.9783834\n260.4995103\n68.74999481\n61.17770276\n56.66253772\n55.93798341\n55.92400568\n55.88940811\n55.87305305\n57.21413663\n57.01268257\n114.9437613\n171.7380947\n259.5379732\n288.3531451\n325.1902473\n348.863325\n351.8659722\n345.063492\n350.2155699\n332.3940147\n303.4927716\n249.3412668\n233.8499418\n221.810396\n218.9608582\n55.92633911\n55.92615825\n56.63286932\n55.9179295\n55.89168199\n55.89119212\n55.88795638\n56.17771603\n56.15525275\n56.14077375\n47.46274872\n47.47233504\n47.47649363\n47.4872867\n71.83205868\n69.16647006\n77.89209496\n81.00031031\n82.26856878\n81.77242715\n77.9101471\n77.49808589\n72.61509967\n62.19432982\n62.18637224\n55.9543098\n56.63845994\n55.94717954\n55.90561543\n55.90592344\n55.90347034\n56.19216432\n56.17167696\n56.17294981\n48.92351552\n47.50463025\n71.21679122\n72.26387222\n77.76259125\n89.22043865\n86.4370006\n92.91120178\n86.75905277\n91.05333112\n83.30213987\n83.52823335\n81.10971971\n78.02011084\n74.21666806\n66.54809254\n56.64994917\n55.96705463\n55.96180598\n55.9630572\n55.96648108\n56.20862762\n56.18423545\n154.6979778\n214.4955898\n310.6662477\n320.782607\n333.9328975\n350.8293246\n355.0438608\n353.0505406\n358.4065321\n357.7446347\n353.6156255\n296.0084946\n275.8357831\n261.1974692\n256.8713632\n56.19795516\n55.97785825\n56.67070304\n55.96279008\n55.95881968\n55.95853213\n55.93570903\n57.33065021\n57.10214933\n138.0645079\n197.7319539\n292.3351084\n305.5927516\n330.7521597\n351.4055497\n358.8675043\n357.6554807\n361.4662477\n360.7507151\n355.3170551\n300.8161932\n284.2278551\n263.0917906\n252.9539185\n55.97673025\n60.11732192\n56.665472\n55.95516369\n55.95172774\n55.92836714\n55.8936569\n56.17441529\n56.15668872\n132.0316266\n190.9805779\n289.5913185\n308.8444929\n335.0128019\n349.0180857\n357.4166596\n359.2437196\n362.2295263\n360.3442818\n362.0186582\n307.7800953\n285.600414\n264.9959297\n250.7734594\n56.18239921\n60.05789951\n56.65779009\n55.94700955\n55.94294143\n55.90820195\n55.85746576\n56.11389715\n56.08667406\n107.2992021\n164.6861219\n265.6202628\n302.6996077\n333.4596611\n349.049467\n355.9596691\n354.1191913\n357.7109931\n356.6511108\n352.6612607\n299.00114\n284.6107794\n265.3565958\n248.5653552\n56.1875879\n55.96968122\n56.66418255\n55.94060137\n55.9268251\n55.88648816\n55.8646329\n57.19681059\n56.97762675\n110.0218984\n170.8314656\n275.0811612\n307.5709755\n337.0601632\n355.4875736\n360.6347868\n361.598794\n365.4242414\n364.6131686\n360.2958069\n306.2661743\n294.7524017\n276.6209514\n260.327743\n55.98203775\n68.60785226\n56.66447423\n55.9552015\n55.95172785\n55.94627698\n55.90062853\n56.16573821\n56.13012388\n56.12807882\n48.8818248\n47.48193803\n56.3201161\n80.53811968\n87.86568326\n86.08913575\n92.49033808\n92.22040101\n94.32969071\n91.48643217\n91.70804263\n85.27211568\n90.29639024\n79.28318882\n79.16519465\n66.10118935\n57.88261164\n55.95461517\n55.9512985\n55.94086308\n55.92907532\n56.20618556\n56.1813357\n56.11639923\n48.87394988\n47.47628594\n50.56716084\n70.42008985\n78.55696658\n79.22519726\n83.46626122\n75.24683779\n85.08034795\n76.1505588\n81.1622211\n72.60527413\n74.96067342\n71.04951258\n60.6333985\n55.95433661\n56.61437913\n55.92094448\n55.91278999\n55.90012486\n55.88803018\n56.14528165\n56.04276143\n95.57554839\n149.7676337\n221.7287988\n243.7815045\n274.7539652\n304.2914732\n318.0268057\n322.2483117\n333.1060837\n339.686375\n329.5915814\n263.5212278\n245.4897887\n218.112316\n193.2106118\n56.00865695\n55.82184268\n56.54995264\n55.83590894\n55.82711568\n55.79923216\n55.7725638\n56.99836677\n56.8108429\n83.45452506\n141.8712266\n204.52387\n230.0000211\n269.0819\n311.5115074\n321.6086356\n319.1617602\n337.7283622\n342.3450558\n330.8995717\n270.4105043\n248.6915681\n231.6958034\n217.2685161\n55.89407784\n55.90450453\n56.59684942\n55.87277553\n55.85278607\n55.84203797\n55.83005207\n56.08106102\n56.04720352\n98.66866322\n154.6755137\n228.1436257\n261.6091892\n298.8533515\n329.1626083\n336.3616969\n334.4256843\n339.0747738\n338.7654109\n329.6675059\n265.4291607\n245.841654\n234.7783099\n219.740744\n56.09245464\n55.90317879\n56.60542881\n55.87686974\n55.84787207\n55.82360516\n55.79961827\n56.04160637\n56.01857324\n90.58458986\n148.4285351\n229.038261\n269.5665754\n301.7208893\n319.1911279\n324.7412782\n325.290726\n337.2523255\n340.5280808\n329.3047178\n268.4412078\n247.9064015\n233.3825347\n218.9525093\n56.09680443\n55.90563487\n56.61886039\n55.90398148\n55.88328409\n55.87015791\n55.85508194\n57.18349486\n56.96242245\n106.3826914\n168.2969405\n268.0684998\n301.2391926\n317.9782529\n340.1846394\n345.2309696\n325.6199044\n316.6360175\n313.497413\n299.2759308\n232.8594691\n219.5453249\n219.6003362\n216.6356689\n55.93944356\n55.90309165\n56.56407406\n55.85237396\n55.83537493\n55.81701301\n55.81322202\n56.07679099\n56.05551381\n56.05540161\n48.82295847\n47.40394628\n47.41661897\n47.42621294\n48.12411056\n47.44471898\n47.45950365\n63.19785708\n61.47316454\n65.45437515\n68.60113373\n56.46111133\n57.83465626\n56.22781145\n56.04950876\n55.85242573\n56.53977758\n55.85907031\n55.86347713\n55.86836371\n55.87248597\n56.1670138\n56.13846224\n56.12690879\n48.89389278\n47.49705734\n54.27906398\n75.02672956\n78.92916755\n80.89038358\n84.51536802\n91.73524518\n86.24418332\n91.55890952\n81.25292042\n83.94115882\n81.45176777\n71.16297072\n62.1985995\n55.96515479\n56.63441782\n55.94564751\n55.92764944\n55.87979669\n55.87946394\n56.14850655\n56.11741517\n120.5185497\n176.7197335\n282.2747265\n307.0244645\n339.728684\n354.5388269\n337.2708313\n305.1644717\n316.5286515\n327.7914813\n301.4645795\n222.6945922\n204.4999517\n200.8022153\n188.8382232\n56.0871618\n55.89228035\n56.55598824\n55.8399884\n55.82380321\n55.80061701\n55.78312715\n57.02359072\n56.80384338\n79.30301753\n134.2500395\n185.3462094\n194.8824668\n209.5359907\n223.392778\n235.7603714\n239.3362748\n247.214003\n248.9481005\n237.3368006\n172.5936189\n159.6095807\n153.5621137\n144.8110691\n55.65490121\n55.69299083\n56.40954686\n55.6922654\n55.67281953\n55.65408996\n55.64223794\n55.8540428\n55.83347378\n64.20094396\n121.8513559\n170.408348\n182.1954441\n199.2281635\n214.8665877\n229.970061\n234.0807264\n241.5820212\n249.4409515\n240.6918258\n177.2459254\n161.82693\n154.8522791\n143.8163032\n55.81692326\n55.67994814\n56.40265998\n55.68429186\n55.6710488\n55.65515752\n55.6399132\n55.86446619\n55.85323505\n65.63807519\n126.7017229\n177.7564739\n191.9398836\n213.9873351\n242.8355114\n263.5395107\n267.1894033\n277.7702482\n283.2144371\n270.9878786\n206.9348629\n192.407701\n184.706476\n174.8041697\n55.98778698\n55.81679445\n56.53270373\n55.80846347\n55.78590629\n55.76695065\n55.7393651\n56.93278832\n56.75921934\n79.48632179\n139.3651753\n189.8429507\n196.4399829\n209.961377\n241.5456083\n262.6202911\n268.2845512\n280.9654422\n287.1145588\n271.2616196\n202.1002276\n186.4955725\n173.7672407\n164.7024841\n55.74975292\n55.76954951\n56.4882088\n55.77205077\n55.75995658\n55.74722937\n55.73255708\n55.96886725\n55.94762454\n55.96797396\n50.19927244\n47.37988604\n47.43581055\n47.47565941\n48.15972621\n47.46257003\n47.47931546\n50.40320664\n62.78723341\n50.59223315\n56.70591795\n48.86086392\n56.28576657\n56.24807462\n56.0733795\n55.85838684\n56.52814638\n55.83946273\n55.83631542\n55.8289661\n55.82290931\n56.10107626\n56.09209758\n56.09569177\n50.29625589\n47.46546938\n47.49857097\n56.80639897\n76.30446785\n83.30584024\n82.68368094\n92.01781256\n84.74790268\n89.54951788\n82.56791893\n80.69128286\n78.59033934\n71.90101446\n57.36840486\n55.95114115\n56.56822387\n55.86363421\n55.84169002\n55.81438129\n55.79269292\n56.02921707\n55.98576432\n55.97326624\n50.18045781\n47.33752353\n47.34805731\n47.39095767\n48.11606416\n58.03698028\n68.74509326\n73.90600623\n72.22788376\n72.77255842\n60.96991203\n59.60958397\n56.20414933\n56.1065692\n55.95554844\n55.77038922\n56.4212056\n55.71396261\n55.70878459\n55.72096433\n55.73177304\n56.98093876\n56.79085239\n79.15858355\n137.2550202\n186.1723236\n193.2204049\n203.1466764\n208.0026649\n218.2800976\n230.034636\n243.1223506\n237.2217935\n219.6305165\n162.2807981\n157.3607557\n159.6502648\n157.368217\n55.73181254\n55.75974325\n56.47646499\n55.77555855\n55.77411318\n55.77072539\n55.76771528\n56.01783772\n55.99460506\n88.28319196\n145.8097097\n193.9863047\n194.0816082\n200.886765\n210.6240004\n206.5986615\n201.0361188\n210.3592067\n220.8494322\n209.9625697\n151.9898568\n146.0601585\n145.7930546\n139.465017\n55.78442015\n55.64720765\n56.34905363\n55.62649203\n55.61505053\n55.60052539\n55.5876492\n55.79303947\n55.76291654\n64.41377038\n123.4504049\n165.7428299\n167.6509089\n180.2567615\n191.0992771\n203.0743754\n212.4663038\n222.051392\n223.4385497\n212.0506177\n150.7689052\n137.8006007\n132.5120021\n129.1491794\n55.65103987\n55.53737324\n56.2896427\n55.54985493\n55.5433729\n55.52874201\n55.51497352\n56.56130929\n56.39001062\n65.24690877\n123.9249926\n166.047435\n168.7582459\n186.8805857\n203.4130829\n220.0135699\n225.4112228\n235.9724705\n241.3627721\n237.8395199\n171.9925713\n147.3393124\n134.5369578\n129.0425267\n55.56058084\n55.58605551\n56.31466914\n55.58717881\n55.57858561\n55.56030199\n55.54413549\n55.7484698\n55.72766795\n55.73222871\n49.95427589\n47.14556311\n47.25694988\n47.34558796\n48.08022794\n47.41328517\n62.16765592\n70.76404231\n69.70530141\n70.91166002\n63.72974438\n60.33075573\n57.27606879\n56.02198703\n55.84134616\n55.6587322\n56.32812134\n55.62230488\n55.60666348\n55.58920056\n55.57741932\n55.78172417\n55.75936619\n55.76859973\n50.00506584\n47.22393166\n47.33634553\n47.39622373\n48.10431031\n47.43172006\n57.74046926\n69.94580303\n67.77313398\n68.18912913\n58.50161946\n59.37296931\n56.15368947\n56.14170385\n55.99888986\n55.78482883\n56.43880998\n55.73657837\n55.70876161\n55.67497348\n55.64892151\n55.84799696\n55.80694992\n64.22369282\n123.3244377\n165.8275336\n172.2091587\n187.2035729\n200.9959723\n213.9894523\n219.2202599\n232.1361494\n240.1181542\n236.0063984\n173.0458077\n146.8267334\n133.762101\n129.2547618\n55.68618878\n55.57076039\n56.30888907\n55.57753312\n55.5677793\n55.55798157\n55.54915234\n56.59826264\n56.42800334\n65.12381973\n123.6271526\n165.739484\n174.7233658\n196.6941596\n216.7116166\n229.3014101\n233.9548989\n244.3255006\n253.107159\n243.958324\n174.8719099\n161.1895234\n155.0901669\n144.2702054\n55.63378704\n55.65547019\n56.37869389\n55.66763554\n55.6527052\n55.64281584\n55.63023305\n55.83658335\n55.81135075\n64.21211741\n123.2807545\n171.2674011\n197.1239979\n231.6433225\n260.4344378\n275.7267701\n280.1183738\n292.1683779\n299.2217707\n286.4218822\n220.9371694\n198.5917289\n183.56443\n167.9132015\n55.93336896\n55.75675797\n56.44936809\n55.73404027\n55.71980582\n55.69861352\n55.68403814\n55.89667417\n55.85951261\n64.21092224\n123.9657867\n178.2820829\n205.0203991\n243.6460317\n277.6564955\n291.4558381\n289.8698211\n300.896881\n305.7339128\n287.8891593\n216.3831333\n196.415056\n181.2362141\n168.3292416\n55.95466974\n55.7707319\n56.45353237\n55.73680804\n55.72334807\n55.70643782\n55.69085094\n56.8018145\n56.6113538\n66.11486495\n129.4713395\n180.4261308\n204.8619546\n237.8758993\n266.9948481\n283.0705824\n283.0484304\n293.2189599\n292.7103682\n272.9735506\n198.5362132\n182.5284032\n178.9813337\n175.7791201\n55.80039544\n55.82684835\n56.53919645\n55.82276747\n55.81539232\n55.80545514\n55.78687608\n56.03308459\n56.01226439\n56.0135148\n51.65481639\n47.37214623\n47.41362182\n47.45306907\n48.16891706\n62.29273725\n76.12240249\n73.54743094\n73.12620937\n67.36596501\n62.71864443\n53.7085566\n56.22064284\n56.18211318\n56.02075246\n55.816912\n56.47333363\n55.7773261\n55.77257971\n55.77874387\n55.78285134\n56.03737366\n56.01284639\n56.0083955\n51.62945688\n47.36568831\n47.41400245\n47.43921855\n48.12404694\n47.41503428\n47.42364253\n47.40926491\n47.39712008\n47.39154043\n47.32602669\n50.18286821\n56.1573569\n56.0980228\n55.92856838\n55.74391515\n56.41874006\n55.72171669\n55.71471596\n55.70588587\n55.69819784\n55.9371577\n55.91843952\n77.85178758\n139.4313704\n187.7043928\n200.8350112\n227.2343935\n266.4006603\n282.8930919\n283.4648401\n294.5228205\n301.3886182\n284.6485628\n212.1885828\n201.3012796\n193.9763384\n185.2273537\n56.00404993\n55.83107478\n56.53244225\n55.81297491\n55.8022804\n55.80255028\n55.80212385\n57.10183711\n56.90739044\n99.36228832\n158.7798624\n218.7953175\n224.9155969\n237.1179462\n255.3994175\n262.8693546\n259.7621892\n260.0375378\n257.6331553\n244.5353616\n181.8704962\n178.8348437\n179.4491083\n172.543772\n55.79278045\n55.8156204\n56.5161316\n55.79726431\n55.76915007\n55.75330718\n55.74798002\n55.99987972\n55.98404986\n86.8649097\n147.3572535\n197.3977893\n203.8239765\n216.4301669\n240.0135453\n261.0437591\n268.065084\n273.6739881\n274.9881136\n257.3078795\n190.8094219\n178.5863441\n172.3505714\n165.3056238\n55.92991988\n55.75351974\n56.44379943\n55.72872784\n55.71523134\n55.69897134\n55.6840327\n55.89990615\n55.88644388\n70.40405551\n130.1627702\n177.7108069\n194.6756439\n228.4628119\n261.9705864\n278.0834079\n281.8780734\n288.4649705\n292.7059686\n281.9367006\n216.4136254\n189.9681391\n167.3468\n153.4564443\n55.8737911\n55.73436743\n56.44538958\n55.72440307\n55.70367539\n55.69222282\n55.67142398\n56.78633658\n56.61029704\n65.00336724\n126.4077805\n177.9807207\n198.6821269\n229.2792712\n256.2073587\n268.965329\n273.8884601\n281.5231987\n278.9194332\n261.7210386\n186.0037478\n171.9695579\n169.2737717\n166.1643294\n55.76860218\n55.79415288\n56.50099082\n55.79195612\n55.78851358\n55.78305189\n55.77871516\n56.03341631\n56.02016804\n56.02662248\n51.66158333\n47.3895753\n47.41491233\n47.45613579\n48.18188124\n66.97048296\n78.36476079\n76.87373059\n78.30418397\n76.45252471\n76.42797737\n67.43993034\n66.1046173\n56.18367128\n56.03023889\n55.79068902\n56.42833726\n55.73009472\n55.71852468\n55.70867099\n55.7024316\n55.91748015\n55.88272198\n55.89358725\n51.54056148\n47.27772683\n47.36921787\n47.44783103\n61.05378008\n77.34072177\n72.99534128\n81.66890399\n74.77700724\n81.06796936\n72.28150039\n73.3284124\n66.85570784\n59.71864463\n56.02690938\n55.80565506\n56.47360847\n55.76871256\n55.74819265\n55.72994372\n55.71329568\n55.94536025\n55.91845318\n75.22075633\n136.4850919\n189.1020001\n215.7594694\n248.6265648\n273.1273613\n288.5748029\n288.0821082\n291.7055714\n294.0971172\n276.4596108\n205.7913478\n192.4317247\n184.8939086\n182.0352999\n56.00986851\n55.83529158\n56.55236382\n55.84202178\n55.83649647\n55.82252525\n55.80172519\n57.05465926\n56.8470099\n88.69941903\n147.1158373\n211.5036108\n246.4949105\n277.5959367\n298.1336765\n310.0669341\n308.0656737\n316.564808\n319.461976\n306.3916304\n241.3459703\n219.0196235\n204.8726265\n195.4243079\n55.83139277\n55.83557334\n56.51795118\n55.78366024\n55.74763703\n55.71127004\n55.67391458\n55.85490911\n55.80048207\n64.25798074\n124.71866\n166.3272203\n179.7001041\n217.6714048\n248.7720988\n255.4939544\n259.0412946\n269.0347637\n274.0232461\n268.5456074\n202.7767305\n182.1090258\n170.986347\n162.3730112\n55.92536762\n55.7585936\n56.46221066\n55.74294279\n55.73048345\n55.72361751\n55.71327308\n55.95000793\n55.92236377\n78.7289389\n139.0198736\n184.7316823\n200.3219701\n217.6035052\n243.5724927\n269.6919125\n270.1171618\n273.8730723\n264.3007146\n240.5674721\n170.9873943\n167.3608064\n169.314942\n167.575681\n55.97602712\n55.80440033\n56.50717512\n55.80447272\n55.80276565\n55.79886243\n55.79565163\n57.10990596\n56.88004763\n96.8915888\n161.2227235\n217.0316996\n234.4957239\n253.9266213\n269.8957732\n279.0378697\n281.4810344\n287.4452558\n288.6932284\n267.5500553\n198.3034791\n190.0526275\n187.4667312\n183.7698844\n55.82179682\n55.84113248\n56.54562631\n55.83623428\n55.82948269\n55.81909679\n55.8012511\n56.05091417\n56.03140315\n56.0417442\n53.10637183\n47.39207274\n47.42557136\n47.44926269\n47.9865227\n47.23543983\n47.25377058\n47.26409699\n47.25472947\n47.16873612\n47.16854282\n52.86159593\n55.90793285\n55.8671603\n55.738029\n55.57826595\n56.26140112\n55.5582718\n55.54443457\n55.53075482\n55.52009796\n55.72349388\n55.69910527\n55.69954961\n52.76835291\n47.07161633\n47.1202277\n47.14115972\n47.85966512\n47.18631438\n47.24302204\n47.27843259\n53.30731356\n52.38295529\n50.57322835\n52.87239523\n55.8942673\n55.84410854\n55.7112507\n55.54064208\n56.22883169\n55.50667649\n55.4982312\n55.48919544\n55.48093955\n55.4722137\n55.67882043\n55.66032657\n62.11566769\n120.6005961\n165.7046295\n170.3469701\n182.9877844\n190.8344497\n199.5981308\n203.7503917\n208.3905836\n205.6786169\n189.6798313\n141.3860053\n139.722029\n136.9438667\n135.4997376\n55.7522999\n55.6093416\n56.34583694\n55.64156266\n55.63815972\n55.6342333\n55.63096007\n56.7760602\n56.59907278\n66.31703344\n125.8117304\n172.6316704\n179.3899327\n190.9487208\n202.6898448\n214.3544168\n214.1352592\n219.4969414\n218.4299016\n199.7765389\n147.4163809\n143.2207526\n137.8120549\n136.154027\n55.59010117\n55.62458842\n56.35805801\n55.64900306\n55.64407725\n55.63512049\n55.62612751\n55.84602975\n55.8037733\n61.34944453\n120.4147133\n165.7081208\n165.7584739\n170.031451\n171.2341723\n171.648821\n168.8245628\n168.7851977\n165.4700108\n163.6368655\n126.065037\n128.926549\n129.1518298\n129.1335983\n55.68850904\n55.55747312\n56.27606576\n55.57135484\n55.57094475\n55.56183786\n55.5545433\n55.76571566\n55.74912509\n61.37771226\n120.4261111\n165.6998525\n165.7338896\n169.8804325\n172.6471032\n175.1303644\n172.1680291\n174.6493808\n174.376156\n170.0640631\n128.1359387\n128.9052761\n129.1301293\n129.1412073\n55.62468241\n55.5068784\n56.24576535\n55.51539742\n55.5174142\n55.51618756\n55.49537017\n56.54164715\n56.36223177\n62.45699797\n120.9025742\n165.7302276\n170.1249473\n182.4776075\n190.4237862\n201.0927948\n206.4136896\n212.1817711\n213.6411644\n196.4809123\n138.2265286\n131.0435602\n128.9077503\n128.9280023\n55.48485557\n55.51961708\n56.26474171\n55.52924427\n55.52176496\n55.50774335\n55.495932\n55.70375453\n55.68432061\n52.83200428\n47.07897091\n47.13821558\n47.23256594\n47.27951678\n47.98246866\n47.30848885\n58.16096587\n63.75015885\n59.58179152\n55.64940752\n52.97787333\n55.80285406\n56.01486399\n55.95863685\n55.78016714\n55.58516476\n56.25776996\n55.54934738\n55.53338815\n55.51897828\n55.51369823\n55.72182292\n55.69714101\n52.84588851\n47.09475579\n47.16066929\n47.25765092\n47.30472849\n48.00748414\n48.68040445\n61.21842285\n63.51992771\n64.03174485\n56.58203036\n52.96890972\n55.76920472\n55.97919775\n55.93342514\n55.7879172\n55.59945746\n56.26314799\n55.56073602\n55.54593004\n55.5322743\n55.52456988\n55.73018301\n55.71260308\n61.50644034\n120.4572377\n168.1848092\n183.4681673\n202.7060332\n217.7874542\n225.6760473\n226.7726856\n232.7574643\n232.8074594\n215.6077409\n154.4866039\n145.2974501\n141.7587392\n135.8881643\n55.72723694\n55.58862091\n56.30635253\n55.58741994\n55.57229815\n55.55618569\n55.54639195\n56.59246203\n56.41887659\n61.85732257\n120.4534894\n167.812262\n180.603179\n200.0183268\n221.5560107\n235.5118468\n237.7572468\n242.0891963\n240.7765776\n218.7769582\n160.6581949\n151.5709188\n143.0783564\n142.1673813\n55.61418734\n55.62544517\n56.33721619\n55.62455856\n55.60884002\n55.59468822\n55.58809404\n55.79907439\n55.79731604\n62.79310657\n120.7871684\n175.3499822\n193.8479705\n219.0170578\n235.3720993\n236.6474132\n238.1003448\n248.7609206\n244.8173184\n224.4204153\n164.3954016\n158.3171048\n154.4275521\n154.2434919\n55.8959265\n55.73723591\n56.44639981\n55.73660439\n55.73434425\n55.73052405\n55.72731873\n55.97769438\n55.95317902\n84.43316348\n142.3883211\n194.8433258\n203.0124946\n224.1511612\n240.5274482\n255.8773956\n262.3079678\n269.0972891\n263.0158441\n240.8057945\n175.6944974\n165.5583939\n156.1030394\n150.0462498\n55.85609848\n55.69368932\n56.39947884\n55.69708571\n55.68646513\n55.67800499\n55.67085489\n56.84801853\n56.66264543\n72.94774357\n131.5821915\n182.1373892\n188.0362655\n206.4073228\n226.9505346\n239.3587482\n243.9575738\n248.4545784\n244.3895754\n219.2716774\n158.064613\n149.991394\n149.82048\n148.4978401\n55.66411474\n55.695277\n56.41777125\n55.70822667\n55.69621516\n55.68309949\n55.67538088\n55.90499533\n55.87437978\n54.44175328\n47.22449769\n47.24252579\n47.31481447\n47.361968\n48.06321377\n52.16873489\n47.44001482\n55.26555672\n47.43061182\n47.32773081\n53.0162257\n55.85162363\n56.0909486\n56.06505248\n55.90720171\n55.70889384\n56.38712334\n55.69692391\n55.68911895\n55.68700252\n55.69705383\n55.94938344\n55.92036159\n54.49175502\n47.29240562\n47.33154665\n47.37906639\n47.387612\n48.08188705\n47.41309033\n50.27554717\n53.7943517\n56.27145984\n47.37512771\n53.06569828\n55.89943207\n56.15422234\n56.12835752\n55.97557971\n55.77904862\n56.46036532\n55.76917533\n55.76354393\n55.75194673\n55.74794534\n56.00719444\n55.99031819\n93.3695493\n151.6357696\n215.2765314\n235.4310478\n247.0638246\n256.4293989\n265.4762535\n260.6196562\n256.0947748\n246.7595559\n223.808837\n168.277863\n164.770907\n162.9369563\n160.6601887\n55.93202838\n55.7614545\n56.46094386\n55.74763969\n55.74092576\n55.73575798\n55.73144361\n56.99135199\n56.79723971\n88.68277005\n148.5712752\n209.8081303\n234.246336\n256.4549109\n271.2250154\n274.4619372\n268.7015936\n269.2640467\n258.3450936\n238.3075066\n183.4300187\n179.6461283\n174.4172403\n169.6930389\n55.79253184\n55.80343392\n56.50325477\n55.79695261\n55.78902691\n55.78049389\n55.77059596\n56.02423554\n56.00404578\n97.20399833\n158.2856847\n224.4027655\n240.9112604\n255.2820288\n270.1148573\n274.3378306\n272.1444384\n255.8849707\n245.6196595\n216.6385718\n155.6731673\n152.4404288\n151.7656748\n152.3973347\n55.88829364\n55.73612855\n56.44687553\n55.74063851\n55.73050089\n55.72315652\n55.71952347\n55.96705785\n55.94807492\n54.5165384\n47.2928057\n47.30501276\n47.33202419\n47.335814\n48.01749436\n47.34356624\n47.39722846\n47.41365958\n55.7278181\n47.26443082\n54.35207775\n55.73773491\n55.92991402\n55.89078307\n55.74760222\n55.57473192\n56.25621145\n55.54940263\n55.54040496\n55.52536727\n55.51445063\n56.56979461\n56.39446039\n63.84453352\n120.7322406\n166.7353146\n176.6650783\n191.7116068\n206.5842335\n219.173841\n222.3516534\n230.321223\n231.2740737\n212.6933957\n157.8405035\n153.6786961\n152.1838248\n151.6286249\n55.69495605\n55.72272032\n56.44971518\n55.73220084\n55.7212623\n55.72304351\n55.7309635\n56.00412249\n55.98864099\n54.56937819\n47.35886427\n47.36780904\n47.39758117\n47.40938791\n48.09951435\n47.43381317\n47.48322546\n47.49456003\n57.83026233\n47.40478608\n54.52270184\n55.93726716\n56.20763972\n56.17537912\n56.02045276\n55.82222996\n56.50374973\n55.81942425\n55.81273361\n55.80748705\n55.80582478\n56.08176998\n56.06258154\n54.63314595\n47.40472403\n47.41610246\n47.45013899\n47.45717957\n55.68435276\n66.18266048\n57.4703439\n48.85277568\n52.67222755\n47.43881728\n54.5283884\n55.94532471\n56.22114344\n56.2003365\n56.04108982\n55.83655136\n56.5118519\n55.82609903\n55.81972825\n55.81424662\n55.81778645\n56.10064919\n56.08155394\n113.4886838\n171.7718046\n245.2571663\n255.5852657\n266.8145514\n281.1905239\n291.508698\n280.9165036\n280.7569765\n276.8425722\n261.6387835\n206.7290849\n202.5261823\n199.2686981\n193.9942387\n56.11742319\n55.85758561\n56.52879087\n55.80259049\n55.78474074\n55.76937835\n55.74673446\n56.94658126\n56.72161242\n75.92120499\n128.0812304\n171.799627\n173.1426536\n183.6571507\n194.7778593\n202.9600414\n202.4559426\n201.7787479\n199.1078181\n183.0361279\n136.2951378\n133.707619\n131.0638324\n129.181197\n55.52145884\n55.55973985\n56.29191133\n55.58492441\n55.58721328\n55.57000266\n55.55569709\n55.76255433\n55.73736117\n64.29677112\n120.4384809\n165.6794662\n165.870929\n172.3745901\n178.9717169\n185.5852062\n186.3765674\n185.9949858\n182.0704044\n172.5784442\n129.5335745\n128.8630768\n129.1099516\n129.1918782\n55.58154216\n55.4678286\n56.2320066\n55.47727192\n55.47962484\n55.46512774\n55.45125906\n55.65139834\n55.62652093\n65.00663734\n121.0771045\n166.2609666\n165.76788\n170.2039825\n174.9143272\n178.0773047\n178.7913979\n183.3944218\n180.728527\n171.1516771\n130.1035376\n129.1775967\n129.1052622\n129.0934096\n55.65068091\n55.54135712\n56.28927803\n55.58275978\n55.58766405\n55.58681033\n55.58672921\n56.70868331\n56.53248227\n68.33843126\n130.7076395\n184.6943638\n192.3240544\n205.4528598\n222.7108206\n230.5801322\n230.2188286\n233.8851095\n230.1776003\n212.5398707\n163.9175207\n161.7135197\n160.3608575\n159.2695747\n55.74467443\n55.75537319\n56.45110853\n55.72873725\n55.72175844\n55.71905271\n55.69022534\n55.90773762\n55.89302863\n55.90793917\n47.27797067\n47.2815567\n47.26927969\n47.22655833\n47.91897784\n47.25048366\n47.30184712\n54.51032297\n47.28722152\n47.15170548\n54.25450325\n55.64834539\n55.84382331\n55.82075949\n55.70025867\n55.54264681\n56.23450679\n55.53995043\n55.53632473\n55.53317527\n55.53010744\n55.74171611\n55.72553681\n55.73783915\n47.10707665\n47.13753891\n47.17783046\n47.17637995\n47.85880785\n47.18040294\n47.24596764\n47.28201763\n47.27725316\n47.15743068\n54.2635448\n55.66477733\n55.89115127\n55.86876426\n55.72840432\n55.55633404\n56.24606523\n55.56541347\n55.57540176\n55.57731539\n55.58143495\n55.81681615\n55.80147544\n68.46507793\n125.0154286\n172.0534414\n175.0258904\n183.1096114\n187.1911055\n189.5037258\n189.2242629\n193.9269551\n195.1426825\n188.6331778\n150.370129\n151.6681234\n152.2382247\n152.2159684\n55.86543616\n55.70543501\n56.41636531\n55.70852687\n55.70421497\n55.70135164\n55.69879925\n56.94834777\n56.7565112\n85.53425246\n140.2252554\n190.7147358\n204.2775414\n220.5682887\n230.6436528\n238.5384764\n249.1747952\n254.2484275\n242.9439459\n216.3179078\n159.9641597\n155.3333019\n152.8910382\n150.5128286\n55.68070185\n55.7022957\n56.41419261\n55.70180872\n55.69522052\n55.6946072\n55.69356097\n55.93789867\n55.91884581\n83.55932801\n142.0345444\n190.1584023\n196.6226779\n207.8188094\n225.228841\n234.1116767\n240.9646042\n246.418705\n236.6740297\n214.2942632\n163.8284854\n162.2980429\n162.8265544\n163.2560639\n55.95707885\n55.78143675\n56.48435722\n55.77405404\n55.76327224\n55.75521488\n55.75142803\n56.00947738\n55.98955028\n94.42209728\n150.665719\n205.18957\n213.9353729\n225.6638732\n240.1490902\n250.0147486\n254.6077079\n255.2121425\n246.642029\n225.59333\n173.0781356\n169.5048853\n166.4959952\n164.1601309\n55.96142703\n55.78952545\n56.50089972\n55.79441662\n55.79293296\n55.79735057\n55.79814396\n57.15338524\n56.94837724\n103.2007304\n160.3544931\n220.7151845\n230.1308881\n240.1469036\n251.183995\n253.7207721\n248.8050101\n251.8041419\n248.858577\n228.9555636\n177.2693047\n161.5175962\n145.4176272\n138.0670416\n55.61506971\n55.64276822\n56.35075988\n55.63723902\n55.61079531\n55.5880635\n55.57359108\n55.77559758\n55.74980332\n55.75560473\n47.11568385\n47.11269313\n47.12417195\n47.11840821\n47.79927799\n47.11267519\n47.15394617\n47.16671502\n47.15463838\n47.04988553\n54.18511221\n55.60502037\n55.80936905\n55.78556882\n55.66315\n55.50498402\n56.20558477\n55.49985422\n55.49017548\n55.48040872\n55.47073487\n55.67571032\n55.65255673\n55.66095996\n48.45233723\n47.0279254\n47.05032809\n47.05719627\n47.75745702\n47.09440387\n47.15122449\n47.16244861\n47.13952208\n47.0313973\n54.1562964\n55.56602975\n55.76502648\n55.73873189\n55.60638825\n55.43589533\n56.15032285\n55.41442657\n55.40449565\n55.39094165\n60.14855257\n62.45591981\n60.8121525\n65.39704356\n122.5833271\n166.3062766\n165.8857221\n169.8656017\n171.5628961\n174.1740283\n175.4095048\n181.2421809\n180.1955655\n170.7644801\n128.1034718\n128.8855997\n129.2094506\n129.5817701\n55.55662808\n55.4434336\n56.2084753\n55.45532367\n55.44525728\n55.43224066\n55.41937095\n56.4725008\n56.29617006\n65.45645206\n122.5385268\n166.1111066\n166.0649049\n175.2384549\n182.4410384\n187.4540898\n185.9632483\n187.8990688\n187.0233133\n176.7399219\n130.9409415\n128.8766959\n128.8813079\n128.8831156\n55.50378989\n55.51907561\n56.25154163\n55.5310512\n55.52886048\n55.52023332\n55.50892535\n55.71242722\n55.69471224\n64.42500578\n121.9334516\n165.7023699\n166.7781236\n174.4449665\n182.6829125\n193.2151326\n196.0154275\n201.2621221\n199.1949043\n188.2296825\n145.6570936\n144.3340995\n143.8962872\n143.1673205\n55.80226454\n55.65190319\n56.34676563\n55.62989347\n55.61380687\n55.59671753\n55.58787174\n55.8102505\n55.78292693\n64.23617247\n121.8674667\n165.9950819\n167.7828143\n177.6835812\n184.4116667\n185.7608359\n183.584462\n184.9211269\n185.8464872\n177.0103465\n133.3443799\n129.5171047\n129.1294507\n129.1141033\n55.69007536\n55.5706093\n56.30409891\n55.59568501\n55.59740101\n55.59710883\n55.58843931\n56.69105744\n56.51765961\n64.58114806\n122.4787335\n169.83488\n174.3456776\n183.0371198\n189.3415562\n189.3278632\n180.7278129\n175.3020113\n171.5592511\n169.1110811\n132.952069\n135.432625\n136.1918392\n137.4692854\n55.60523098\n55.63920779\n56.35590538\n55.63370923\n55.60620852\n55.58654238\n55.56409659\n55.7624655\n55.73010154\n55.73223197\n48.53488469\n47.15739235\n47.24506659\n47.30283028\n48.01411083\n51.28449185\n61.65725082\n63.9196015\n65.7756064\n55.02309133\n56.82519585\n55.77775056\n55.99263912\n55.9508115\n55.77323356\n55.5676455\n56.23761215\n55.5400029\n55.52470078\n55.50294919\n55.49485472\n55.70018961\n55.6719012\n55.68300105\n48.48773847\n47.10676738\n47.18409527\n47.21338914\n47.91260799\n47.24519229\n55.1388575\n57.15807735\n58.10910355\n53.76974097\n54.34646843\n55.72914578\n55.93006936\n55.8940648\n55.76045735\n55.5920337\n56.27618468\n55.57408934\n55.56359905\n55.54086968\n55.51760974\n55.72617096\n55.70449061\n64.34478266\n121.8783872\n170.0026332\n186.1924276\n205.6245013\n224.9786632\n236.9322484\n240.1463976\n250.3644503\n249.6014237\n226.4982075\n165.8858735\n159.7943918\n157.1052005\n154.3908893\n55.89067129\n55.7256366\n56.43641518\n55.70955241\n55.67026142\n55.64551895\n55.62960118\n56.77407838\n56.61890552\n71.96224841\n130.4757701\n170.5134338\n166.2103885\n170.6420998\n173.2289296\n172.5531725\n168.9041254\n167.3740364\n164.6470226\n163.5921451\n126.0548058\n128.9684188\n129.0310854\n129.0960986\n55.42820367\n55.46603973\n56.22429324\n55.49135472\n55.48621605\n55.47788571\n55.46890549\n55.67568909\n55.65758355\n64.99084591\n122.4962493\n166.2925546\n166.3151781\n170.322561\n170.9333665\n170.0479534\n165.979636\n165.8825542\n163.9236548\n163.9416134\n126.640133\n129.5078843\n129.7316778\n129.7235645\n55.51980685\n55.41608784\n56.19179818\n55.44132228\n55.4411278\n55.43523394\n55.43060953\n55.63710522\n55.61651823\n65.09186773\n122.5189408\n166.2803854\n166.2939541\n170.3027974\n171.0528817\n170.3151561\n166.1096427\n165.8713454\n163.8219498\n163.7503253\n126.3050862\n129.3238181\n129.617565\n129.6068745\n55.529076\n55.42103164\n56.19725007\n55.45695873\n55.46355137\n55.4610156\n55.45708084\n56.51585997\n56.34203223\n65.3925804\n122.5002334\n166.0956376\n165.9665245\n169.8281209\n170.4592971\n169.739818\n165.7635575\n165.7961116\n163.837458\n163.5766764\n126.0187324\n128.8892137\n128.9097873\n128.917836\n55.4495987\n55.49648043\n56.24638068\n55.53514354\n55.54066867\n55.54111397\n55.54258071\n55.76932813\n55.76368216\n55.78507635\n48.59325469\n47.21044063\n47.28122614\n47.30819161\n47.9921015\n47.32342159\n47.37868654\n47.40617805\n47.41428498\n47.31237721\n53.00857668\n55.84425125\n56.07335372\n56.01427747\n55.84878406\n55.65586908\n56.33045914\n55.63839767\n55.63066085\n55.61919965\n55.61304269\n55.83973027\n55.81191748\n55.82284689\n48.59190376\n47.15123183\n47.17854863\n47.18822695\n47.87365332\n47.19350947\n47.24235294\n47.25613598\n47.23098266\n47.11013042\n52.79275509\n55.61860475\n55.8129362\n55.78150663\n55.6506514\n55.48114699\n56.18370282\n55.45488586\n55.43687677\n55.4204279\n55.40579659\n55.60588138\n55.5840693\n60.32993253\n51.47431816\n50.63559514\n47.01476143\n47.02805368\n47.73781699\n47.03148315\n47.08663834\n47.11692021\n47.11268987\n47.01248336\n52.70807312\n55.54863042\n55.75626013\n55.73715707\n55.61298623\n55.4441795\n56.1533008\n55.41420448\n55.39582013\n57.66150786\n60.71746407\n61.61026334\n62.52005146\n65.63718243\n122.5783727\n166.3157842\n166.2074199\n169.7474219\n173.7438764\n180.2254651\n183.0204857\n189.454456\n189.5008352\n178.6415856\n131.0732815\n128.9015151\n128.9404565\n129.0551166\n55.43952667\n55.47142311\n56.22336935\n55.48209341\n55.4641452\n55.45889508\n55.45775247\n55.65966606\n55.64210052\n65.05091519\n122.5373326\n166.3213847\n166.3370905\n169.8460824\n170.9755963\n176.7445949\n181.4578093\n188.3227976\n187.7729436\n177.3996149\n130.1746679\n128.8870516\n129.1455718\n129.1413547\n55.60692814\n55.48547061\n56.2259269\n55.4869706\n55.47606403\n55.46381334\n55.45704874\n55.6583485\n55.63363142\n65.03935945\n123.965244\n166.1058421\n165.7505757\n169.9845382\n174.7379422\n179.4357801\n183.2586966\n190.9593488\n192.2525129\n177.9252139\n130.3800673\n128.8854644\n129.1438938\n129.1605313\n55.61029631\n55.48762005\n56.2317009\n55.49535372\n55.48403974\n55.46448558\n55.44934774\n56.49859552\n56.32338097\n65.38058609\n123.9595596\n166.0363628\n165.9068033\n179.0258922\n186.9869287\n190.9439983\n190.187165\n188.8739211\n185.6410553\n177.9277498\n138.5286679\n138.8175017\n134.9760165\n132.3427178\n55.54313198\n55.57333484\n56.29552477\n55.57229808\n55.55121023\n55.53313592\n55.51496373\n55.7111056\n55.68220308\n55.68802118\n49.90429432\n47.071079\n47.12703407\n47.15304131\n47.85811397\n47.19523788\n47.25546293\n47.28663011\n53.34961841\n53.08310173\n52.83312325\n55.62972432\n55.80857477\n55.77473486\n55.64085703\n55.47025783\n56.17935472\n55.44002639\n55.42516099\n55.41637473\n55.40656928\n55.61227365\n55.59319196\n57.77279022\n50.39867544\n47.04785625\n47.12951185\n47.18602969\n47.90123207\n47.23795031\n47.30306329\n51.28161409\n55.72714679\n52.41387655\n52.89307788\n55.67253075\n55.85385811\n55.81632973\n55.67122134\n55.49796223\n56.19716448"
  },
  {
    "path": "src/pymgrid/data/load/__init__.py",
    "content": ""
  },
  {
    "path": "src/pymgrid/data/pv/Houston_722430TYA.csv",
    "content": "GH illum (lx)\n0\n0\n0\n0\n0\n0\n0\n28\n171\n359\n509\n574\n634\n569\n468\n281\n115\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n147\n243\n333\n372\n402\n292\n457\n237\n79\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n48\n165\n395\n580\n285\n266\n203\n174\n72\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n104\n267\n463\n520\n575\n593\n491\n368\n168\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n192\n387\n549\n650\n680\n644\n536\n370\n171\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n56\n144\n216\n335\n483\n306\n338\n199\n92\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n85\n139\n210\n249\n296\n348\n253\n184\n76\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n94\n196\n227\n297\n303\n329\n272\n205\n112\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n74\n140\n165\n281\n259\n388\n379\n310\n151\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n85\n153\n243\n303\n283\n407\n382\n241\n127\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n171\n376\n520\n648\n633\n501\n507\n352\n160\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n137\n302\n402\n416\n399\n353\n462\n196\n73\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n107\n195\n239\n322\n189\n188\n278\n195\n99\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n93\n150\n233\n304\n299\n328\n257\n220\n115\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n41\n164\n239\n282\n355\n328\n265\n204\n107\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n102\n154\n210\n369\n301\n327\n247\n193\n106\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n69\n131\n174\n201\n350\n221\n280\n215\n109\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n97\n208\n283\n320\n440\n607\n506\n337\n110\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n176\n370\n507\n625\n584\n497\n357\n204\n150\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n125\n156\n252\n260\n308\n395\n367\n211\n91\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n64\n143\n157\n331\n365\n356\n290\n240\n103\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n188\n398\n573\n684\n719\n688\n586\n424\n211\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n216\n428\n599\n710\n745\n705\n538\n389\n190\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n108\n228\n346\n440\n424\n464\n275\n293\n215\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n84\n135\n456\n651\n713\n677\n568\n411\n204\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n218\n428\n600\n708\n750\n718\n619\n453\n222\n42\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n210\n406\n582\n697\n738\n709\n609\n447\n242\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n72\n170\n242\n480\n386\n421\n465\n310\n118\n50\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n170\n288\n342\n384\n506\n615\n487\n409\n146\n45\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n203\n429\n577\n714\n759\n727\n626\n461\n249\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n172\n295\n527\n374\n456\n683\n572\n296\n184\n44\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n78\n149\n191\n376\n473\n739\n623\n477\n264\n59\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n213\n418\n612\n688\n660\n651\n557\n352\n203\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n188\n397\n552\n681\n725\n706\n583\n419\n193\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n74\n104\n158\n231\n225\n353\n209\n146\n145\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n72\n135\n189\n348\n238\n227\n206\n159\n91\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n77\n230\n331\n242\n372\n379\n314\n249\n141\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n131\n215\n308\n392\n372\n368\n309\n216\n158\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n86\n168\n582\n671\n762\n703\n644\n478\n207\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n116\n202\n284\n329\n357\n331\n285\n241\n135\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n172\n255\n612\n721\n781\n754\n616\n486\n265\n70\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n264\n490\n668\n787\n832\n802\n697\n527\n312\n82\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n160\n358\n341\n630\n665\n706\n610\n343\n158\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n108\n211\n281\n611\n358\n283\n406\n212\n171\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n198\n304\n535\n656\n744\n702\n627\n486\n274\n77\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n252\n269\n304\n299\n304\n669\n426\n286\n288\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n135\n263\n466\n601\n573\n655\n505\n413\n279\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n210\n467\n636\n712\n764\n733\n672\n520\n286\n81\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n62\n120\n420\n290\n340\n331\n348\n294\n178\n188\n55\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n136\n204\n257\n321\n644\n417\n590\n460\n197\n68\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n45\n105\n192\n292\n428\n337\n385\n445\n414\n211\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n122\n188\n305\n397\n414\n657\n258\n267\n126\n52\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n62\n263\n476\n696\n822\n864\n837\n733\n565\n344\n109\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n79\n310\n535\n713\n831\n877\n845\n741\n572\n318\n109\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n65\n225\n475\n600\n618\n580\n568\n543\n393\n202\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n82\n147\n213\n248\n244\n263\n228\n178\n119\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n47\n166\n261\n361\n349\n306\n364\n282\n265\n146\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n62\n223\n173\n539\n385\n404\n329\n311\n428\n269\n79\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n166\n294\n361\n401\n308\n343\n270\n282\n329\n77\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n168\n213\n291\n613\n346\n581\n525\n381\n231\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n51\n142\n160\n220\n247\n273\n259\n225\n311\n196\n44\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n115\n233\n335\n402\n444\n406\n360\n304\n113\n96\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n70\n179\n403\n423\n645\n356\n518\n448\n295\n197\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n116\n353\n463\n710\n730\n910\n879\n779\n603\n385\n134\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n130\n367\n541\n695\n792\n834\n738\n700\n589\n367\n154\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n51\n178\n201\n452\n337\n415\n313\n330\n220\n154\n96\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n66\n162\n376\n408\n686\n361\n768\n636\n261\n170\n80\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n67\n355\n586\n526\n813\n843\n918\n804\n637\n413\n166\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n142\n385\n613\n790\n906\n941\n906\n797\n615\n400\n157\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n140\n365\n576\n715\n776\n545\n483\n341\n275\n139\n42\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n70\n198\n508\n616\n869\n683\n837\n768\n480\n301\n124\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n145\n396\n616\n794\n909\n947\n915\n804\n627\n407\n134\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n147\n332\n554\n760\n813\n933\n865\n802\n634\n407\n160\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n143\n386\n618\n811\n931\n940\n934\n813\n621\n395\n139\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n68\n105\n251\n239\n253\n324\n311\n251\n231\n185\n103\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n95\n162\n259\n401\n492\n305\n276\n243\n181\n119\n57\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n87\n203\n314\n387\n675\n579\n727\n548\n515\n362\n108\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n166\n407\n648\n813\n923\n959\n924\n813\n646\n404\n163\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n157\n402\n642\n812\n933\n976\n930\n807\n638\n397\n152\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n161\n394\n630\n795\n913\n956\n913\n792\n624\n387\n154\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n93\n304\n398\n641\n381\n626\n287\n580\n283\n206\n105\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n72\n191\n301\n465\n491\n410\n430\n403\n274\n348\n114\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n62\n188\n262\n381\n457\n449\n419\n381\n339\n217\n87\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n95\n271\n478\n437\n443\n873\n326\n334\n523\n305\n175\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n81\n205\n281\n528\n838\n938\n918\n774\n617\n362\n116\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n125\n368\n585\n568\n864\n906\n819\n646\n638\n427\n170\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n56\n233\n296\n422\n388\n508\n530\n598\n416\n331\n96\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n42\n213\n273\n469\n659\n270\n237\n188\n302\n115\n75\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n68\n239\n240\n270\n296\n314\n313\n265\n216\n152\n74\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n73\n254\n208\n444\n502\n725\n413\n290\n306\n118\n52\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n67\n201\n282\n470\n452\n410\n492\n408\n341\n147\n106\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n108\n230\n368\n736\n601\n580\n648\n549\n434\n329\n135\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n204\n431\n624\n694\n895\n863\n807\n685\n605\n379\n173\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n133\n229\n654\n792\n865\n955\n905\n853\n659\n432\n184\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n243\n329\n631\n829\n952\n922\n908\n809\n645\n361\n174\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n81\n218\n347\n355\n420\n478\n429\n412\n355\n223\n107\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n272\n521\n746\n907\n1009\n1032\n907\n763\n619\n425\n150\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n72\n213\n279\n387\n423\n478\n419\n381\n336\n220\n104\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n129\n186\n384\n382\n407\n470\n429\n395\n320\n259\n129\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n87\n153\n229\n598\n784\n634\n367\n247\n179\n259\n83\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n51\n244\n496\n727\n883\n994\n1021\n975\n845\n678\n437\n196\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n232\n475\n660\n716\n908\n697\n912\n782\n623\n427\n176\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n47\n116\n251\n460\n383\n357\n400\n446\n351\n308\n189\n98\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n83\n174\n393\n682\n716\n849\n905\n788\n627\n360\n167\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n277\n516\n653\n798\n775\n773\n692\n353\n527\n299\n179\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n235\n396\n655\n822\n921\n947\n764\n772\n347\n281\n154\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n157\n223\n326\n637\n903\n1010\n909\n816\n604\n395\n195\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n226\n199\n355\n415\n851\n856\n487\n299\n360\n366\n170\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n157\n199\n331\n422\n494\n600\n371\n457\n375\n224\n104\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n166\n218\n418\n566\n678\n728\n671\n713\n414\n284\n213\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n265\n314\n565\n618\n746\n705\n615\n424\n634\n367\n201\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n66\n207\n374\n580\n573\n597\n871\n445\n349\n360\n315\n150\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n71\n254\n334\n485\n773\n491\n650\n690\n558\n534\n398\n174\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n112\n250\n341\n448\n616\n770\n515\n634\n285\n284\n154\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n121\n411\n414\n231\n415\n432\n410\n719\n527\n329\n105\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n45\n109\n321\n531\n759\n319\n345\n226\n239\n206\n151\n110\n44\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n120\n228\n325\n529\n908\n748\n741\n763\n534\n306\n154\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n99\n310\n563\n728\n886\n957\n1015\n979\n821\n608\n439\n200\n45\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n232\n564\n769\n919\n1038\n1059\n1009\n876\n614\n403\n177\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n71\n145\n386\n687\n810\n970\n814\n832\n656\n479\n346\n155\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n83\n118\n264\n291\n240\n275\n331\n482\n433\n253\n211\n131\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n124\n249\n375\n299\n432\n292\n501\n467\n234\n161\n124\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n114\n342\n467\n748\n938\n956\n955\n926\n813\n694\n395\n240\n53\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n84\n287\n491\n701\n868\n972\n994\n941\n806\n646\n431\n197\n42\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n96\n201\n375\n703\n590\n908\n1005\n1000\n373\n399\n285\n116\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n111\n293\n423\n678\n774\n918\n937\n723\n620\n365\n280\n185\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n47\n282\n448\n643\n901\n938\n619\n534\n500\n459\n299\n152\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n52\n136\n391\n638\n811\n713\n630\n668\n416\n476\n279\n84\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n69\n175\n446\n568\n861\n934\n1003\n946\n750\n577\n302\n119\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n53\n214\n331\n332\n227\n282\n360\n340\n380\n486\n297\n122\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n60\n202\n284\n520\n837\n660\n994\n913\n847\n697\n503\n249\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n125\n287\n612\n563\n870\n854\n980\n958\n791\n688\n484\n253\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n112\n347\n485\n645\n829\n983\n952\n859\n696\n664\n408\n218\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n92\n281\n401\n528\n727\n890\n747\n452\n409\n658\n461\n171\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n64\n77\n190\n522\n201\n493\n453\n535\n368\n389\n163\n157\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n80\n175\n213\n416\n404\n462\n460\n474\n459\n367\n223\n98\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n134\n302\n549\n625\n650\n726\n634\n416\n202\n305\n124\n83\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n95\n218\n331\n414\n628\n855\n817\n944\n719\n659\n460\n259\n64\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n155\n395\n618\n654\n755\n841\n861\n976\n855\n738\n528\n294\n77\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n158\n398\n621\n816\n962\n985\n1054\n1016\n903\n738\n529\n297\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n147\n381\n612\n772\n912\n991\n976\n968\n843\n738\n509\n281\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n146\n368\n348\n578\n755\n897\n718\n813\n831\n610\n491\n255\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n110\n281\n444\n483\n752\n933\n984\n820\n737\n616\n438\n219\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n77\n142\n352\n526\n560\n478\n914\n1005\n766\n624\n363\n214\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n89\n180\n445\n541\n787\n583\n530\n488\n349\n225\n148\n143\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n103\n245\n358\n540\n666\n498\n619\n614\n396\n320\n239\n152\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n82\n109\n261\n630\n458\n287\n285\n443\n400\n354\n338\n202\n78\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n152\n373\n572\n748\n903\n758\n1006\n770\n623\n713\n343\n159\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n144\n361\n602\n785\n804\n916\n710\n916\n738\n719\n485\n177\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n103\n248\n344\n507\n453\n604\n980\n802\n401\n389\n122\n74\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n81\n179\n288\n390\n480\n549\n582\n315\n442\n244\n256\n157\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n149\n344\n576\n661\n893\n966\n948\n872\n762\n491\n465\n276\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n149\n362\n543\n714\n913\n1017\n563\n535\n473\n392\n293\n170\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n99\n218\n334\n428\n501\n546\n557\n535\n473\n392\n293\n170\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n99\n218\n334\n428\n501\n546\n557\n535\n480\n392\n293\n176\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n117\n354\n484\n240\n387\n308\n399\n244\n340\n287\n239\n170\n57\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n108\n333\n556\n767\n910\n932\n954\n944\n808\n698\n514\n271\n90\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n159\n364\n570\n756\n901\n1021\n1004\n959\n873\n702\n404\n281\n90\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n149\n343\n475\n737\n856\n480\n412\n244\n309\n250\n162\n73\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n159\n348\n356\n666\n195\n346\n207\n361\n372\n231\n138\n90\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n90\n218\n232\n574\n820\n615\n459\n671\n288\n238\n222\n204\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n159\n308\n306\n614\n521\n560\n200\n438\n416\n343\n268\n154\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n176\n366\n581\n759\n898\n518\n658\n810\n832\n710\n291\n291\n96\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n168\n361\n562\n666\n876\n980\n267\n465\n872\n704\n467\n301\n97\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n158\n346\n520\n518\n841\n888\n1045\n752\n467\n387\n496\n289\n102\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n167\n352\n551\n707\n916\n1025\n1005\n984\n848\n666\n346\n129\n79\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n158\n241\n520\n604\n392\n972\n963\n643\n804\n549\n495\n254\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n143\n299\n404\n720\n812\n927\n432\n189\n169\n135\n162\n124\n59\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n43\n186\n331\n344\n447\n679\n1031\n984\n824\n677\n524\n200\n101\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n150\n345\n563\n695\n426\n406\n359\n458\n499\n577\n416\n295\n102\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n151\n354\n497\n538\n494\n386\n924\n845\n688\n614\n522\n300\n99\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n150\n329\n554\n701\n612\n1000\n862\n975\n867\n706\n401\n281\n103\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n151\n348\n543\n756\n887\n991\n1001\n873\n806\n685\n506\n291\n104\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n81\n349\n508\n715\n869\n997\n1010\n953\n839\n662\n447\n215\n101\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n151\n339\n545\n757\n902\n1025\n998\n970\n853\n713\n498\n282\n104\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n142\n339\n547\n757\n892\n819\n994\n706\n835\n669\n455\n301\n104\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n152\n349\n566\n567\n677\n727\n901\n930\n340\n156\n419\n294\n103\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n152\n335\n404\n693\n885\n952\n989\n929\n854\n700\n499\n157\n47\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n143\n321\n461\n684\n744\n876\n1002\n886\n874\n655\n258\n134\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n143\n332\n518\n683\n831\n977\n997\n880\n831\n699\n507\n290\n108\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n2\n130\n314\n439\n728\n800\n1013\n971\n953\n796\n709\n217\n216\n106\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n138\n351\n586\n773\n917\n966\n878\n869\n812\n671\n543\n225\n68\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n106\n337\n422\n705\n683\n957\n777\n775\n704\n753\n340\n168\n68\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n137\n347\n496\n798\n617\n771\n964\n632\n716\n517\n393\n191\n64\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n110\n238\n316\n737\n741\n864\n730\n767\n739\n707\n531\n258\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n127\n326\n449\n683\n829\n905\n910\n923\n687\n619\n399\n271\n106\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n116\n265\n368\n722\n713\n1059\n698\n732\n550\n507\n371\n244\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n102\n212\n473\n508\n519\n761\n950\n860\n838\n543\n415\n147\n95\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n129\n217\n299\n643\n834\n936\n992\n862\n850\n655\n298\n169\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n89\n161\n476\n670\n873\n955\n918\n974\n846\n688\n529\n289\n95\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n110\n281\n427\n780\n825\n901\n924\n984\n799\n720\n469\n285\n91\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n114\n290\n410\n691\n722\n998\n483\n844\n689\n705\n479\n285\n90\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n126\n338\n563\n660\n804\n852\n972\n748\n828\n589\n507\n310\n107\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n113\n326\n460\n555\n882\n995\n975\n855\n657\n661\n535\n243\n97\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n126\n349\n530\n771\n839\n970\n992\n746\n891\n728\n445\n297\n105\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n130\n348\n540\n735\n720\n927\n923\n1038\n844\n683\n462\n271\n83\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n75\n232\n406\n638\n783\n932\n356\n358\n527\n415\n262\n251\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n116\n324\n567\n780\n741\n848\n993\n982\n945\n669\n508\n323\n104\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n128\n326\n441\n648\n853\n892\n762\n878\n845\n771\n514\n174\n52\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n99\n246\n481\n675\n572\n993\n1044\n900\n694\n649\n515\n210\n82\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n103\n255\n396\n631\n778\n880\n663\n848\n731\n740\n466\n302\n83\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n74\n201\n405\n340\n407\n596\n504\n707\n430\n433\n376\n232\n75\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n74\n230\n457\n500\n645\n910\n690\n895\n511\n454\n391\n226\n70\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n85\n245\n437\n557\n569\n582\n546\n343\n713\n393\n395\n252\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n137\n400\n620\n683\n861\n438\n422\n532\n518\n399\n301\n88\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n68\n185\n384\n499\n447\n359\n831\n794\n618\n458\n338\n192\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n88\n249\n514\n691\n909\n920\n870\n803\n772\n602\n418\n131\n85\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n87\n261\n451\n616\n725\n872\n548\n534\n516\n426\n204\n118\n57\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n99\n275\n227\n555\n782\n859\n949\n826\n886\n610\n471\n121\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n62\n268\n497\n249\n442\n625\n698\n586\n458\n279\n217\n142\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n86\n263\n472\n717\n897\n954\n1045\n927\n756\n638\n290\n243\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n102\n317\n547\n734\n888\n832\n680\n776\n830\n611\n374\n233\n72\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n99\n263\n507\n723\n862\n992\n1006\n942\n859\n691\n499\n275\n81\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n100\n288\n505\n711\n868\n961\n1005\n950\n855\n691\n490\n278\n70\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n88\n265\n500\n704\n870\n979\n863\n879\n778\n423\n227\n55\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n77\n284\n498\n612\n657\n792\n919\n915\n788\n641\n492\n264\n69\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n101\n290\n493\n676\n836\n930\n893\n773\n802\n621\n149\n98\n44\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n102\n273\n489\n617\n703\n393\n692\n808\n672\n650\n408\n222\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n63\n92\n159\n210\n208\n479\n535\n460\n488\n277\n151\n46\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n92\n288\n373\n382\n760\n829\n865\n616\n822\n680\n462\n266\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n95\n284\n500\n665\n830\n957\n971\n903\n825\n623\n125\n114\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n95\n294\n456\n685\n857\n954\n1000\n959\n801\n347\n408\n250\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n96\n284\n459\n663\n849\n947\n993\n921\n592\n487\n448\n249\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n97\n285\n452\n675\n829\n916\n947\n906\n833\n618\n423\n244\n52\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n86\n278\n255\n606\n781\n809\n896\n857\n694\n173\n87\n54\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n73\n145\n153\n160\n684\n194\n206\n181\n228\n197\n182\n160\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n106\n466\n663\n762\n841\n729\n864\n777\n644\n375\n253\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n89\n279\n489\n660\n755\n771\n795\n765\n700\n568\n283\n159\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n90\n247\n487\n655\n817\n780\n242\n181\n160\n159\n92\n53\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n92\n271\n489\n668\n691\n777\n452\n310\n459\n542\n442\n234\n45\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n79\n281\n491\n704\n840\n859\n907\n830\n790\n668\n454\n168\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n260\n443\n679\n832\n911\n781\n803\n705\n593\n87\n46\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n83\n64\n297\n657\n735\n434\n316\n263\n207\n126\n86\n109\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n73\n153\n136\n158\n180\n184\n186\n260\n302\n175\n93\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n68\n130\n197\n551\n434\n433\n644\n560\n420\n453\n390\n214\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n71\n265\n473\n593\n681\n320\n821\n938\n795\n502\n358\n206\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n72\n265\n486\n557\n585\n626\n573\n852\n751\n407\n432\n209\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n74\n267\n475\n581\n742\n888\n970\n923\n808\n648\n422\n199\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n75\n258\n466\n689\n845\n863\n920\n850\n642\n611\n415\n179\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n258\n476\n679\n816\n955\n824\n715\n730\n558\n418\n188\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n59\n193\n443\n675\n818\n915\n947\n764\n726\n554\n394\n191\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n256\n442\n648\n715\n567\n590\n566\n482\n412\n328\n127\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n156\n226\n330\n307\n399\n860\n764\n672\n438\n301\n146\n4\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n163\n438\n591\n552\n854\n617\n462\n356\n449\n275\n103\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n123\n134\n200\n225\n258\n477\n436\n377\n214\n136\n60\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n139\n273\n352\n469\n484\n502\n607\n432\n257\n187\n118\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n192\n365\n603\n841\n939\n970\n924\n844\n651\n430\n181\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n263\n523\n710\n867\n968\n988\n946\n803\n626\n414\n176\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n219\n452\n667\n748\n900\n914\n796\n707\n572\n337\n136\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n256\n506\n710\n861\n959\n983\n935\n817\n659\n420\n178\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n230\n462\n690\n866\n971\n996\n940\n807\n610\n372\n146\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n223\n469\n691\n866\n938\n969\n908\n813\n616\n381\n151\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n211\n454\n662\n835\n942\n896\n833\n771\n544\n264\n93\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n243\n476\n698\n814\n884\n921\n886\n682\n512\n360\n149\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n140\n319\n488\n631\n386\n518\n397\n386\n467\n247\n79\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n81\n236\n523\n714\n702\n877\n811\n632\n508\n291\n129\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n225\n469\n655\n775\n835\n889\n764\n762\n526\n348\n129\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n200\n423\n566\n428\n355\n390\n476\n235\n168\n204\n57\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n115\n150\n340\n411\n512\n481\n447\n421\n257\n172\n60\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n100\n263\n409\n500\n586\n808\n780\n628\n419\n268\n109\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n139\n283\n341\n496\n601\n728\n646\n632\n379\n212\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n202\n372\n483\n746\n821\n804\n696\n705\n463\n313\n101\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n161\n230\n527\n689\n733\n756\n763\n612\n502\n296\n73\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n204\n424\n594\n666\n739\n845\n830\n401\n352\n268\n96\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n229\n427\n557\n792\n602\n698\n825\n671\n321\n282\n108\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n40\n217\n416\n496\n702\n664\n912\n776\n499\n470\n260\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n40\n196\n322\n413\n442\n622\n513\n386\n406\n171\n141\n64\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n215\n447\n666\n832\n893\n908\n856\n752\n554\n322\n93\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n89\n384\n668\n776\n839\n785\n857\n730\n532\n307\n84\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n179\n419\n604\n704\n834\n811\n817\n627\n426\n265\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n214\n424\n596\n622\n841\n802\n806\n655\n485\n299\n84\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n182\n363\n389\n462\n395\n677\n501\n511\n381\n135\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n59\n223\n301\n396\n227\n353\n356\n268\n337\n225\n45\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n187\n374\n462\n574\n444\n525\n481\n425\n426\n238\n59\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n191\n149\n409\n665\n293\n375\n535\n349\n229\n127\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n182\n408\n644\n713\n843\n830\n745\n435\n433\n259\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n183\n401\n621\n789\n856\n870\n831\n688\n487\n262\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n138\n253\n489\n669\n797\n715\n782\n657\n468\n265\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n99\n148\n253\n723\n749\n770\n748\n617\n454\n217\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n144\n183\n422\n280\n179\n365\n340\n421\n203\n123\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n144\n262\n528\n698\n776\n787\n672\n346\n320\n204\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n154\n354\n563\n481\n543\n890\n745\n541\n344\n123\n57\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n90\n105\n196\n324\n366\n478\n393\n302\n220\n109\n46\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n84\n159\n251\n330\n379\n397\n394\n555\n443\n132\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n194\n430\n632\n788\n867\n881\n815\n683\n492\n259\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n187\n425\n624\n780\n863\n869\n805\n671\n489\n246\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n182\n410\n624\n759\n843\n851\n789\n655\n466\n233\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n166\n352\n602\n706\n578\n589\n670\n448\n308\n159\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n133\n373\n586\n763\n853\n855\n791\n645\n456\n220\n42\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n152\n366\n578\n738\n830\n838\n770\n618\n415\n199\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n179\n403\n600\n746\n820\n777\n685\n631\n408\n213\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n135\n344\n533\n690\n779\n790\n716\n576\n342\n151\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n147\n347\n490\n608\n771\n671\n674\n595\n406\n186\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n109\n195\n408\n426\n691\n582\n661\n371\n330\n128\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n138\n328\n174\n285\n412\n342\n185\n192\n213\n89\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n65\n190\n336\n669\n541\n717\n682\n546\n356\n113\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n48\n167\n266\n330\n188\n223\n202\n169\n193\n98\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n83\n213\n291\n463\n561\n618\n419\n393\n312\n131\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n53\n225\n561\n705\n740\n755\n715\n531\n384\n158\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n95\n296\n486\n618\n622\n627\n585\n426\n313\n101\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n76\n171\n348\n297\n647\n752\n708\n527\n326\n164\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n126\n323\n532\n661\n724\n731\n653\n507\n350\n155\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n102\n292\n405\n532\n751\n596\n426\n393\n268\n111\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n135\n352\n494\n635\n733\n757\n704\n537\n371\n159\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n102\n333\n541\n559\n673\n720\n618\n530\n362\n167\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n290\n318\n437\n687\n479\n438\n228\n164\n71\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n76\n266\n292\n501\n618\n517\n367\n435\n195\n103\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n170\n225\n177\n209\n211\n337\n261\n222\n89\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n113\n326\n516\n674\n760\n764\n694\n550\n364\n145\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n107\n310\n513\n649\n734\n739\n665\n541\n342\n115\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n63\n163\n307\n445\n667\n751\n679\n542\n340\n135\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n91\n149\n202\n400\n399\n346\n164\n111\n51\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n59\n154\n255\n346\n392\n379\n316\n274\n186\n114\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n106\n320\n511\n659\n741\n744\n682\n548\n363\n143\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n94\n296\n485\n636\n722\n730\n661\n519\n338\n128\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n101\n263\n416\n576\n678\n678\n619\n483\n327\n129\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n96\n298\n498\n629\n708\n718\n657\n536\n342\n134\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n95\n298\n499\n628\n704\n713\n649\n495\n288\n127\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n210\n454\n529\n515\n378\n348\n418\n222\n121\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n132\n189\n610\n413\n676\n600\n372\n236\n122\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n214\n286\n556\n632\n627\n538\n293\n233\n97\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n226\n409\n528\n558\n568\n346\n350\n120\n106\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n58\n201\n217\n290\n678\n427\n303\n291\n214\n79\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n191\n411\n304\n256\n467\n385\n212\n133\n70\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n63\n234\n370\n501\n517\n399\n315\n270\n144\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n63\n194\n214\n318\n395\n251\n268\n142\n165\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n171\n348\n416\n424\n286\n486\n286\n243\n92\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n68\n230\n443\n593\n667\n680\n624\n499\n313\n104\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n90\n207\n286\n370\n325\n257\n282\n231\n69\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n105\n178\n354\n506\n552\n295\n203\n176\n77\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n97\n244\n203\n279\n344\n217\n214\n161\n81\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n123\n225\n441\n550\n607\n533\n327\n232\n98\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n55\n185\n309\n440\n603\n599\n528\n314\n211\n93\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n192\n358\n504\n589\n606\n546\n433\n267\n95\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n134\n165\n265\n390\n332\n342\n260\n195\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n61\n150\n207\n599\n636\n579\n449\n274\n95\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n209\n176\n229\n308\n244\n539\n459\n283\n101\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n92\n195\n232\n281\n307\n255\n232\n150\n68\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n189\n337\n472\n397\n368\n529\n397\n217\n89\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n55\n161\n204\n414\n325\n374\n291\n204\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n103\n218\n272\n268\n302\n447\n212\n169\n70\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n112\n168\n224\n292\n320\n279\n243\n166\n45\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n121\n216\n266\n347\n345\n308\n251\n172\n64\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n117\n173\n318\n421\n608\n336\n335\n186\n72\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n201\n387\n543\n637\n654\n601\n473\n297\n108\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n182\n253\n440\n573\n553\n452\n396\n262\n90\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n91\n183\n248\n333\n476\n469\n319\n214\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n141\n229\n398\n349\n293\n305\n211\n264\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n66\n139\n217\n240\n308\n180\n161\n144\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n210\n398\n545\n634\n654\n605\n493\n324\n129\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n194\n390\n536\n626\n648\n597\n482\n314\n117\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n187\n376\n531\n611\n634\n585\n479\n305\n117\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n82\n216\n244\n274\n337\n288\n220\n160\n76\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n97\n202\n285\n231\n222\n342\n279\n182\n103\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n88\n166\n293\n301\n285\n250\n244\n149\n68\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n112\n196\n287\n313\n355\n318\n267\n170\n87\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n106\n163\n243\n268\n261\n265\n293\n202\n72\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n82\n135\n340\n442\n548\n380\n416\n230\n92\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n183\n374\n538\n624\n650\n613\n496\n281\n107\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n112\n233\n550\n518\n616\n618\n501\n341\n148\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n80\n205\n373\n596\n630\n582\n479\n310\n120\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n172\n359\n368\n639\n615\n550\n477\n351\n136\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n163\n330\n466\n435\n365\n258\n235\n163\n65\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n178\n370\n527\n622\n653\n613\n507\n342\n140\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n194\n389\n546\n646\n674\n633\n523\n358\n157\n19\n0\n0\n0\n0\n0\n0"
  },
  {
    "path": "src/pymgrid/data/pv/Minneapolis_726580TYA.csv",
    "content": "GH illum (lx)\n0\n0\n0\n0\n0\n0\n0\n0\n0\n77\n126\n102\n105\n82\n108\n61\n4\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n181\n250\n198\n284\n82\n123\n37\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n207\n310\n376\n396\n353\n258\n128\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n131\n205\n247\n264\n235\n256\n80\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n207\n307\n365\n395\n360\n265\n134\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n206\n311\n229\n383\n247\n169\n118\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n206\n310\n389\n402\n367\n271\n141\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n115\n113\n250\n297\n213\n132\n99\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n185\n207\n284\n317\n266\n257\n124\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n82\n189\n293\n356\n380\n346\n258\n135\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n80\n188\n293\n365\n379\n345\n258\n141\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n80\n188\n300\n360\n170\n132\n128\n99\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n220\n325\n406\n424\n388\n294\n164\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n60\n120\n406\n429\n342\n302\n166\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n191\n113\n277\n86\n171\n296\n169\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n56\n203\n270\n206\n315\n348\n256\n112\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n55\n44\n70\n130\n145\n349\n310\n177\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n228\n338\n419\n443\n408\n314\n183\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n121\n180\n222\n209\n235\n298\n185\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n201\n271\n400\n382\n234\n165\n102\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n235\n249\n83\n442\n421\n327\n189\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n63\n240\n349\n420\n464\n427\n329\n165\n44\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n128\n85\n97\n87\n146\n78\n119\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n72\n142\n365\n446\n469\n247\n341\n210\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n91\n365\n453\n474\n185\n347\n209\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n245\n113\n452\n481\n283\n267\n217\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n89\n119\n382\n460\n481\n198\n359\n221\n70\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n59\n252\n135\n465\n484\n455\n366\n228\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n114\n127\n135\n274\n395\n362\n323\n226\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n93\n217\n275\n273\n331\n339\n334\n172\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n90\n78\n91\n95\n85\n86\n129\n68\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n67\n228\n373\n496\n489\n446\n381\n218\n84\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n56\n192\n166\n238\n203\n229\n171\n109\n63\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n92\n150\n267\n338\n338\n369\n237\n165\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n74\n214\n329\n496\n511\n481\n385\n255\n95\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n122\n292\n432\n524\n551\n513\n419\n279\n109\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n139\n310\n452\n536\n565\n530\n435\n292\n121\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n54\n89\n306\n362\n382\n214\n187\n112\n77\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n128\n286\n435\n530\n562\n496\n400\n277\n113\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n124\n294\n453\n537\n566\n527\n437\n299\n131\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n132\n287\n398\n504\n533\n513\n419\n286\n122\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n131\n285\n417\n498\n496\n448\n274\n168\n115\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n46\n154\n196\n257\n262\n277\n246\n176\n91\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n79\n138\n359\n421\n334\n503\n401\n268\n113\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n122\n266\n328\n410\n550\n515\n462\n309\n138\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n155\n324\n469\n563\n595\n558\n458\n309\n141\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n127\n201\n221\n259\n343\n458\n335\n136\n83\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n71\n232\n347\n365\n369\n325\n258\n268\n126\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n88\n240\n221\n256\n256\n310\n210\n118\n148\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n161\n141\n271\n402\n377\n328\n269\n154\n73\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n154\n283\n489\n551\n533\n570\n508\n364\n169\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n143\n322\n337\n345\n445\n494\n497\n351\n176\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n178\n321\n446\n507\n491\n471\n269\n200\n111\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n105\n212\n176\n266\n302\n168\n146\n122\n69\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n70\n133\n262\n315\n336\n324\n265\n198\n109\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n136\n298\n288\n244\n527\n228\n373\n141\n105\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n198\n338\n490\n547\n529\n574\n431\n170\n138\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n106\n317\n385\n381\n606\n461\n511\n357\n169\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n248\n437\n581\n668\n698\n662\n560\n338\n193\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n62\n236\n419\n556\n647\n670\n633\n509\n325\n185\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n61\n145\n400\n515\n652\n681\n608\n548\n403\n217\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n55\n142\n298\n505\n596\n629\n594\n521\n385\n174\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n81\n229\n446\n578\n670\n695\n665\n569\n422\n239\n59\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n114\n413\n521\n606\n644\n539\n532\n386\n216\n50\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n76\n262\n440\n582\n664\n693\n655\n557\n412\n187\n53\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n40\n88\n187\n288\n343\n177\n176\n157\n140\n133\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n101\n250\n333\n376\n347\n368\n312\n140\n86\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n58\n152\n243\n207\n238\n233\n360\n305\n232\n151\n46\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n149\n271\n397\n630\n466\n282\n268\n207\n111\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n102\n272\n310\n370\n360\n349\n308\n159\n93\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n203\n293\n419\n657\n453\n591\n528\n378\n219\n73\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n68\n229\n431\n435\n404\n423\n356\n158\n133\n71\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n65\n161\n232\n329\n353\n408\n342\n191\n144\n87\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n58\n120\n180\n347\n250\n242\n351\n327\n265\n150\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n86\n183\n259\n339\n399\n402\n371\n346\n228\n137\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n72\n157\n179\n290\n349\n371\n317\n315\n205\n129\n67\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n68\n243\n260\n483\n738\n447\n357\n281\n181\n157\n53\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n160\n284\n520\n703\n785\n790\n763\n660\n506\n317\n116\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n144\n298\n474\n647\n628\n697\n654\n487\n235\n158\n63\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n109\n192\n500\n664\n693\n730\n621\n573\n441\n256\n75\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n59\n148\n339\n574\n626\n768\n655\n627\n481\n229\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n198\n402\n586\n720\n720\n766\n732\n626\n484\n330\n125\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n187\n370\n547\n676\n814\n838\n796\n691\n534\n343\n137\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n209\n414\n595\n733\n819\n761\n684\n639\n500\n313\n136\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n206\n417\n600\n732\n809\n833\n690\n686\n530\n338\n132\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n141\n229\n364\n640\n732\n714\n624\n520\n403\n236\n113\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n104\n213\n427\n576\n642\n651\n603\n623\n359\n168\n87\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n157\n315\n375\n715\n787\n489\n328\n290\n237\n156\n73\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n217\n415\n601\n721\n798\n822\n778\n639\n487\n329\n135\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n55\n246\n210\n293\n318\n474\n327\n352\n268\n401\n209\n62\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n85\n112\n136\n126\n139\n159\n157\n146\n128\n121\n127\n33\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n66\n112\n91\n147\n217\n330\n403\n239\n167\n157\n230\n103\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n90\n184\n312\n430\n509\n504\n267\n764\n691\n541\n362\n165\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n100\n180\n245\n308\n419\n592\n603\n634\n590\n508\n331\n165\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n80\n239\n392\n529\n632\n745\n786\n753\n720\n567\n368\n172\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n99\n282\n463\n630\n631\n857\n885\n722\n711\n470\n371\n109\n3\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n89\n126\n120\n169\n162\n229\n397\n331\n325\n201\n139\n34\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n110\n155\n185\n261\n327\n574\n538\n608\n577\n452\n384\n184\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n112\n293\n484\n651\n792\n882\n867\n841\n730\n570\n389\n185\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n126\n140\n171\n126\n273\n364\n885\n828\n723\n575\n141\n34\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n123\n132\n98\n177\n176\n195\n179\n168\n226\n148\n129\n65\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n125\n313\n504\n671\n795\n864\n880\n862\n745\n593\n402\n198\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n132\n319\n512\n672\n812\n900\n898\n456\n201\n136\n136\n40\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n140\n139\n256\n690\n820\n876\n892\n847\n752\n594\n367\n134\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n143\n147\n321\n676\n829\n802\n900\n846\n760\n602\n408\n210\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n145\n333\n380\n526\n661\n730\n544\n533\n393\n259\n405\n116\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n152\n338\n531\n700\n841\n888\n904\n859\n766\n604\n422\n216\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n150\n346\n538\n703\n744\n839\n906\n872\n774\n602\n422\n217\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n72\n239\n156\n219\n714\n749\n922\n736\n745\n351\n424\n217\n46\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n165\n352\n534\n693\n837\n893\n916\n864\n779\n566\n312\n157\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n70\n100\n157\n177\n162\n210\n201\n169\n176\n180\n131\n47\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n150\n123\n275\n586\n363\n444\n235\n906\n801\n642\n443\n245\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n187\n387\n571\n752\n854\n919\n928\n877\n763\n615\n440\n231\n57\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n104\n160\n325\n177\n220\n410\n909\n364\n438\n617\n442\n243\n59\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n183\n378\n569\n735\n877\n910\n914\n900\n794\n630\n449\n243\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n191\n386\n568\n743\n863\n928\n798\n513\n456\n588\n445\n140\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n68\n115\n113\n156\n198\n218\n228\n176\n151\n117\n86\n47\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n118\n130\n220\n297\n343\n280\n323\n309\n255\n200\n174\n47\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n204\n399\n591\n754\n897\n936\n960\n409\n275\n486\n405\n255\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n203\n398\n579\n672\n599\n376\n429\n297\n576\n470\n382\n228\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n182\n393\n591\n771\n908\n945\n954\n906\n823\n656\n466\n250\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n207\n412\n608\n773\n894\n958\n967\n918\n810\n660\n452\n221\n78\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n194\n393\n598\n726\n879\n958\n965\n917\n796\n470\n312\n114\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n144\n274\n430\n596\n544\n763\n759\n471\n699\n460\n286\n70\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n147\n247\n466\n608\n691\n740\n776\n834\n703\n587\n408\n232\n69\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n173\n299\n558\n707\n840\n922\n884\n767\n678\n591\n347\n222\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n144\n213\n394\n450\n670\n741\n491\n316\n343\n290\n258\n123\n45\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n111\n226\n199\n394\n418\n285\n443\n581\n321\n205\n115\n65\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n117\n208\n295\n384\n455\n492\n486\n464\n370\n296\n332\n157\n92\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n221\n418\n580\n721\n740\n816\n872\n874\n677\n600\n436\n276\n83\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n192\n330\n557\n642\n886\n940\n966\n887\n765\n600\n441\n198\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n45\n177\n265\n466\n350\n396\n469\n248\n233\n278\n176\n142\n87\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n95\n364\n527\n735\n817\n831\n666\n845\n828\n685\n490\n285\n105\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n66\n216\n332\n571\n744\n866\n925\n987\n764\n641\n630\n466\n266\n115\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n118\n289\n356\n726\n707\n528\n881\n785\n434\n522\n413\n247\n91\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n59\n215\n418\n618\n769\n895\n900\n961\n784\n632\n556\n411\n280\n93\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n63\n246\n456\n631\n774\n849\n914\n788\n708\n701\n650\n482\n310\n118\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n63\n219\n422\n623\n771\n901\n945\n971\n905\n792\n679\n484\n278\n105\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n121\n393\n566\n734\n867\n868\n904\n830\n789\n693\n502\n307\n111\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n76\n203\n297\n359\n415\n746\n854\n886\n817\n707\n528\n329\n136\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n83\n269\n469\n659\n817\n925\n987\n996\n947\n848\n702\n527\n302\n121\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n70\n229\n449\n646\n796\n742\n907\n911\n920\n832\n645\n405\n273\n112\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n81\n168\n285\n524\n726\n830\n779\n427\n394\n357\n337\n325\n299\n128\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n60\n155\n327\n499\n569\n667\n815\n875\n864\n772\n630\n359\n211\n101\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n55\n218\n375\n462\n606\n817\n885\n836\n827\n548\n451\n254\n266\n111\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n77\n171\n437\n563\n784\n851\n855\n861\n814\n250\n366\n417\n177\n49\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n51\n233\n316\n402\n700\n827\n712\n316\n260\n208\n200\n144\n88\n75\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n118\n109\n239\n405\n397\n652\n595\n508\n754\n326\n192\n92\n60\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n45\n149\n155\n340\n468\n599\n721\n771\n658\n405\n302\n147\n105\n72\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n56\n124\n198\n296\n414\n418\n476\n510\n494\n438\n393\n403\n281\n120\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n129\n275\n272\n391\n476\n369\n409\n220\n219\n402\n193\n92\n54\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n77\n230\n441\n579\n626\n808\n695\n915\n794\n784\n570\n474\n286\n115\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n73\n197\n405\n572\n530\n603\n648\n647\n813\n786\n649\n467\n267\n107\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n88\n265\n374\n348\n338\n708\n783\n945\n832\n729\n681\n488\n335\n155\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n94\n273\n469\n668\n806\n922\n986\n1003\n958\n862\n733\n545\n351\n152\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n96\n274\n470\n653\n756\n858\n702\n330\n399\n535\n622\n401\n241\n96\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n98\n273\n474\n645\n789\n906\n968\n979\n912\n854\n697\n543\n350\n161\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n75\n120\n375\n556\n765\n776\n449\n257\n438\n359\n500\n265\n156\n106\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n76\n209\n311\n399\n442\n515\n510\n480\n446\n372\n305\n187\n104\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n58\n133\n231\n325\n313\n641\n649\n759\n805\n815\n666\n528\n325\n155\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n93\n257\n463\n644\n754\n839\n957\n1033\n983\n816\n687\n538\n334\n155\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n91\n252\n339\n425\n784\n870\n903\n624\n859\n335\n248\n238\n167\n66\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n80\n229\n319\n406\n280\n480\n787\n596\n592\n370\n346\n227\n71\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n102\n274\n352\n336\n528\n585\n438\n529\n464\n441\n323\n316\n312\n116\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n64\n120\n298\n394\n485\n463\n547\n491\n442\n377\n487\n285\n157\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n93\n262\n415\n664\n788\n918\n944\n1029\n848\n681\n548\n467\n292\n147\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n79\n263\n401\n651\n807\n796\n929\n931\n943\n839\n666\n546\n354\n164\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n90\n232\n409\n491\n710\n854\n902\n915\n884\n722\n554\n316\n248\n120\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n168\n220\n354\n317\n702\n961\n995\n897\n777\n686\n485\n343\n168\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n94\n224\n452\n518\n795\n904\n975\n990\n944\n858\n721\n567\n366\n178\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n73\n240\n345\n544\n696\n836\n914\n907\n915\n829\n711\n525\n331\n145\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n67\n116\n374\n313\n503\n520\n532\n771\n736\n604\n591\n455\n283\n139\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n100\n198\n298\n330\n391\n618\n520\n467\n495\n280\n218\n214\n73\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n79\n187\n356\n562\n741\n877\n918\n935\n893\n730\n627\n519\n336\n124\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n94\n246\n455\n621\n594\n878\n936\n818\n771\n468\n309\n168\n82\n65\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n80\n148\n204\n352\n426\n506\n842\n788\n763\n724\n460\n259\n159\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n101\n222\n534\n570\n654\n499\n628\n892\n644\n610\n484\n314\n149\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n96\n268\n472\n655\n791\n910\n977\n989\n954\n864\n729\n574\n372\n181\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n87\n238\n383\n593\n755\n880\n957\n907\n934\n807\n723\n545\n340\n162\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n77\n216\n400\n445\n630\n837\n909\n959\n882\n809\n674\n519\n234\n140\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n48\n210\n540\n657\n739\n239\n850\n849\n607\n566\n354\n104\n61\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n76\n232\n418\n613\n755\n801\n929\n876\n672\n625\n600\n462\n304\n137\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n82\n240\n412\n628\n782\n911\n984\n995\n952\n856\n724\n471\n286\n109\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n146\n362\n615\n511\n720\n751\n873\n789\n798\n542\n436\n309\n147\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n76\n137\n110\n463\n646\n832\n633\n785\n318\n750\n586\n499\n342\n181\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n74\n183\n368\n625\n778\n890\n963\n971\n934\n848\n719\n554\n370\n185\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n71\n215\n392\n189\n238\n441\n402\n463\n263\n240\n225\n421\n181\n106\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n77\n225\n390\n522\n704\n830\n920\n985\n657\n743\n646\n442\n214\n117\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n75\n208\n396\n594\n654\n865\n953\n950\n712\n842\n504\n464\n298\n173\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n77\n235\n417\n569\n726\n831\n849\n980\n867\n770\n612\n418\n212\n133\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n93\n205\n288\n327\n418\n508\n391\n368\n455\n396\n230\n216\n160\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n197\n402\n586\n733\n780\n840\n476\n651\n652\n719\n527\n375\n184\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n61\n194\n302\n450\n622\n717\n867\n917\n930\n824\n677\n485\n293\n130\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n68\n213\n383\n579\n714\n644\n949\n829\n907\n847\n705\n544\n344\n154\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n61\n212\n402\n576\n720\n754\n853\n758\n273\n394\n310\n292\n165\n114\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n59\n201\n338\n561\n722\n838\n890\n931\n855\n822\n694\n507\n245\n82\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n130\n270\n543\n736\n593\n866\n754\n834\n584\n299\n216\n123\n79\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n61\n125\n176\n224\n362\n521\n408\n471\n483\n544\n395\n280\n238\n143\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n208\n407\n564\n717\n803\n933\n940\n910\n822\n687\n525\n340\n154\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n62\n179\n320\n557\n623\n773\n741\n740\n645\n765\n641\n508\n236\n145\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n74\n163\n202\n206\n274\n268\n502\n485\n404\n399\n350\n149\n87\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n60\n191\n392\n577\n770\n895\n957\n982\n936\n859\n723\n549\n356\n164\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n206\n406\n586\n762\n895\n973\n774\n699\n482\n612\n490\n328\n140\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n101\n194\n188\n348\n387\n257\n327\n321\n267\n214\n238\n230\n55\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n168\n140\n211\n411\n374\n901\n913\n775\n836\n369\n286\n128\n96\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n212\n412\n541\n726\n812\n898\n885\n859\n770\n685\n538\n339\n146\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n119\n155\n339\n485\n583\n784\n770\n712\n736\n508\n227\n177\n57\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n142\n172\n407\n631\n676\n847\n639\n370\n300\n349\n212\n157\n84\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n45\n112\n188\n351\n273\n533\n826\n730\n890\n619\n609\n474\n215\n122\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n180\n371\n580\n736\n800\n860\n832\n826\n708\n510\n473\n275\n104\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n96\n182\n227\n269\n245\n261\n288\n244\n230\n197\n205\n233\n118\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n186\n257\n330\n293\n401\n826\n856\n849\n669\n608\n456\n251\n130\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n173\n374\n523\n626\n826\n376\n526\n518\n320\n193\n349\n194\n85\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n167\n350\n542\n717\n854\n903\n924\n826\n705\n656\n474\n277\n107\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n77\n93\n447\n224\n394\n708\n445\n869\n742\n606\n402\n219\n102\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n166\n323\n143\n292\n343\n433\n415\n637\n411\n397\n269\n226\n102\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n167\n349\n551\n678\n830\n878\n878\n831\n647\n528\n421\n267\n93\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n157\n294\n546\n593\n408\n543\n467\n704\n724\n587\n503\n301\n116\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n146\n349\n446\n623\n724\n700\n818\n682\n616\n542\n244\n120\n89\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n75\n176\n221\n196\n366\n422\n277\n282\n286\n209\n156\n113\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n165\n368\n552\n708\n835\n905\n922\n838\n779\n645\n477\n273\n103\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n153\n338\n538\n714\n806\n810\n870\n854\n732\n549\n435\n252\n83\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n124\n250\n504\n686\n842\n796\n810\n648\n585\n569\n446\n253\n87\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n46\n174\n233\n379\n433\n289\n431\n417\n415\n326\n236\n140\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n126\n190\n277\n450\n540\n630\n665\n375\n540\n437\n219\n233\n88\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n39\n73\n201\n353\n278\n265\n290\n422\n386\n346\n231\n147\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n101\n187\n481\n422\n727\n783\n917\n647\n673\n580\n421\n234\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n68\n205\n476\n628\n584\n323\n507\n455\n771\n562\n423\n241\n77\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n137\n329\n478\n581\n790\n887\n812\n801\n656\n549\n326\n221\n67\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n142\n326\n486\n704\n821\n839\n870\n593\n681\n617\n419\n213\n75\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n128\n319\n491\n675\n777\n845\n871\n780\n687\n478\n407\n215\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n138\n298\n502\n641\n765\n827\n834\n846\n706\n548\n317\n225\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n65\n221\n303\n397\n213\n343\n391\n271\n311\n313\n287\n154\n52\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n115\n290\n423\n626\n592\n699\n763\n833\n597\n539\n306\n195\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n133\n339\n527\n632\n732\n841\n833\n848\n741\n577\n377\n230\n57\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n111\n202\n470\n569\n729\n881\n901\n775\n708\n560\n241\n107\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n52\n209\n179\n422\n645\n661\n446\n390\n347\n278\n204\n114\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n69\n182\n295\n377\n437\n470\n471\n440\n375\n341\n218\n137\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n66\n162\n259\n346\n393\n446\n359\n693\n499\n410\n182\n71\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n47\n141\n245\n343\n441\n622\n725\n648\n532\n555\n349\n181\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n106\n247\n428\n566\n530\n637\n767\n681\n542\n506\n365\n186\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n98\n268\n472\n389\n504\n689\n611\n685\n384\n365\n343\n163\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n103\n297\n494\n610\n777\n800\n821\n762\n693\n563\n380\n157\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n98\n241\n446\n624\n721\n804\n789\n682\n690\n556\n345\n160\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n243\n460\n583\n751\n787\n799\n734\n636\n450\n307\n123\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n73\n249\n443\n586\n494\n647\n713\n645\n476\n444\n321\n119\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n89\n249\n394\n611\n757\n826\n800\n772\n666\n541\n363\n156\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n69\n103\n222\n361\n306\n633\n578\n583\n275\n211\n133\n59\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n77\n262\n152\n177\n543\n802\n792\n627\n476\n467\n318\n97\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n83\n148\n524\n625\n749\n686\n699\n641\n416\n304\n129\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n69\n241\n435\n613\n744\n793\n811\n755\n640\n501\n304\n126\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n66\n267\n471\n528\n631\n818\n781\n731\n543\n349\n292\n126\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n67\n235\n435\n624\n730\n712\n330\n470\n531\n252\n159\n108\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n75\n223\n418\n580\n681\n705\n799\n727\n612\n418\n167\n67\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n52\n234\n260\n499\n738\n739\n693\n536\n535\n329\n112\n118\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n56\n217\n397\n571\n702\n776\n786\n731\n615\n430\n267\n93\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n66\n210\n328\n402\n525\n752\n691\n718\n608\n487\n290\n108\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n71\n158\n186\n228\n292\n686\n622\n528\n358\n103\n73\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n205\n377\n575\n661\n675\n584\n677\n590\n240\n277\n94\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n58\n231\n430\n580\n662\n802\n754\n434\n589\n407\n171\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n157\n314\n488\n642\n604\n482\n292\n246\n179\n104\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n49\n88\n152\n188\n208\n210\n194\n161\n115\n76\n55\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n184\n344\n408\n279\n307\n310\n287\n241\n175\n125\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n137\n247\n191\n232\n254\n255\n238\n200\n181\n186\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n45\n199\n209\n534\n524\n533\n548\n685\n515\n369\n220\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n72\n231\n288\n600\n622\n399\n268\n228\n162\n71\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n108\n114\n161\n195\n214\n181\n199\n197\n144\n82\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n50\n94\n466\n591\n662\n525\n552\n364\n172\n96\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n183\n374\n520\n664\n700\n699\n638\n574\n407\n216\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n193\n387\n551\n664\n672\n726\n678\n555\n393\n212\n47\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n122\n307\n498\n533\n661\n631\n637\n498\n398\n212\n47\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n61\n123\n177\n266\n238\n239\n219\n181\n108\n58\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n56\n115\n170\n210\n381\n362\n404\n354\n181\n93\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n135\n329\n492\n590\n658\n583\n564\n474\n264\n150\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n179\n370\n534\n650\n675\n694\n656\n538\n378\n190\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n166\n347\n518\n643\n711\n711\n647\n524\n357\n176\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n105\n162\n294\n298\n373\n344\n570\n262\n93\n46\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n144\n318\n485\n611\n676\n649\n592\n454\n301\n131\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n116\n199\n300\n515\n311\n285\n440\n457\n270\n143\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n30\n68\n148\n165\n196\n212\n166\n145\n107\n51\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n53\n113\n154\n206\n336\n232\n198\n157\n118\n59\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n145\n157\n424\n479\n423\n606\n492\n456\n271\n96\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n53\n161\n206\n143\n208\n162\n252\n203\n139\n74\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n82\n180\n236\n302\n328\n344\n316\n241\n176\n80\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n100\n179\n246\n425\n564\n494\n454\n382\n270\n135\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n118\n290\n449\n557\n619\n620\n555\n446\n282\n111\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n115\n283\n394\n496\n549\n571\n439\n313\n197\n83\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n123\n299\n428\n513\n521\n556\n343\n367\n221\n103\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n118\n294\n449\n560\n622\n620\n558\n442\n285\n109\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n116\n295\n451\n562\n588\n502\n286\n240\n117\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n138\n154\n238\n283\n266\n324\n288\n212\n75\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n105\n272\n431\n551\n598\n597\n541\n418\n256\n92\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n84\n226\n294\n434\n474\n391\n399\n329\n214\n78\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n82\n177\n281\n498\n483\n499\n347\n326\n209\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n75\n190\n269\n259\n502\n399\n417\n354\n200\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n59\n160\n259\n253\n316\n249\n235\n164\n104\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n79\n139\n161\n286\n285\n160\n132\n84\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n129\n198\n253\n283\n297\n275\n195\n125\n44\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n75\n234\n382\n494\n551\n551\n486\n365\n216\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n204\n380\n495\n543\n558\n498\n384\n231\n64\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n83\n220\n350\n461\n462\n383\n371\n274\n155\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n52\n186\n284\n426\n452\n489\n415\n300\n172\n42\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n76\n197\n263\n278\n228\n232\n168\n120\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n87\n200\n374\n443\n266\n317\n307\n206\n46\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n116\n311\n291\n249\n442\n286\n160\n72\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n45\n80\n315\n492\n450\n245\n259\n127\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n94\n72\n92\n111\n128\n90\n84\n46\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n184\n198\n92\n103\n114\n103\n95\n77\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n71\n130\n98\n163\n139\n146\n152\n148\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n185\n320\n409\n492\n476\n380\n189\n161\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n126\n322\n419\n469\n482\n406\n298\n157\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n170\n272\n429\n495\n488\n362\n314\n162\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n156\n321\n425\n442\n478\n416\n211\n164\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n72\n65\n106\n123\n113\n193\n105\n34\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n185\n318\n423\n482\n473\n411\n300\n151\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n181\n58\n78\n89\n86\n174\n210\n152\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n179\n312\n410\n468\n467\n405\n287\n145\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n175\n292\n269\n279\n451\n259\n82\n71\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n58\n77\n88\n86\n76\n250\n53\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n73\n77\n88\n125\n107\n168\n85\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n273\n276\n215\n106\n76\n52\n28\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n159\n293\n391\n442\n439\n378\n268\n131\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n152\n286\n384\n435\n433\n371\n268\n127\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n119\n80\n304\n263\n275\n142\n140\n46\n3\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n114\n205\n290\n136\n119\n124\n108\n60\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n77\n73\n173\n81\n168\n93\n85\n32\n3\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n95\n66\n310\n402\n79\n74\n253\n119\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n133\n267\n356\n415\n413\n359\n249\n118\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n97\n252\n159\n229\n413\n337\n247\n96\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n126\n261\n350\n402\n320\n232\n171\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n246\n351\n401\n400\n293\n218\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n80\n70\n88\n85\n106\n122\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n63\n138\n223\n154\n98\n74\n50\n67\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n116\n241\n341\n347\n394\n323\n236\n107\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n81\n193\n334\n391\n392\n338\n234\n101\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n163\n153\n274\n306\n276\n84\n108\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n82\n209\n308\n367\n370\n123\n71\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n60\n101\n204\n214\n175\n112\n78\n92\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n94\n228\n336\n396\n400\n347\n244\n110\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n83\n211\n322\n384\n388\n333\n227\n96\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n77\n202\n310\n372\n376\n304\n209\n93\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n54\n82\n99\n100\n101\n59\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n74\n109\n128\n329\n298\n209\n90\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n181\n269\n321\n310\n312\n199\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n76\n288\n247\n132\n115\n178\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n67\n68\n219\n121\n183\n108\n65\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n47\n88\n107\n109\n94\n205\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n195\n312\n374\n381\n332\n235\n76\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n179\n204\n357\n365\n316\n217\n92\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n142\n261\n324\n341\n244\n199\n96\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n163\n151\n269\n186\n241\n184\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n58\n283\n206\n115\n100\n60\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n73\n108\n128\n222\n236\n187\n92\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n59\n144\n272\n320\n326\n300\n200\n97\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n66\n153\n345\n125\n236\n137\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n44\n71\n87\n90\n78\n64\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n45\n70\n100\n103\n91\n145\n85\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n71\n107\n211\n132\n118\n87\n45\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n139\n191\n327\n350\n305\n208\n34\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n58\n239\n113\n117\n103\n175\n36\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n65\n245\n365\n340\n309\n210\n98\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n69\n290\n375\n389\n345\n252\n123\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n54\n85\n104\n107\n97\n71\n43\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n63\n99\n121\n125\n112\n70\n31\n4\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n145\n247\n101\n105\n93\n82\n41\n5\n0\n0\n0\n0\n0\n0\n0"
  },
  {
    "path": "src/pymgrid/data/pv/NewYork_744860TYA.csv",
    "content": "GH illum (lx)\n0\n0\n0\n0\n0\n0\n0\n9\n133\n274\n358\n286\n407\n88\n217\n78\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n151\n209\n331\n399\n349\n240\n97\n84\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n31\n58\n77\n83\n93\n76\n52\n61\n4\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n112\n290\n391\n407\n332\n373\n270\n123\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n144\n273\n386\n459\n424\n378\n257\n129\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n132\n274\n358\n263\n176\n119\n63\n57\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n103\n298\n410\n436\n439\n402\n300\n135\n4\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n59\n182\n113\n96\n93\n76\n58\n33\n3\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n86\n154\n160\n241\n170\n225\n87\n38\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n160\n260\n182\n463\n446\n392\n283\n157\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n156\n273\n211\n203\n339\n418\n308\n153\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n59\n174\n270\n247\n337\n283\n183\n147\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n76\n153\n174\n196\n209\n102\n140\n74\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n95\n125\n78\n90\n100\n83\n59\n54\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n40\n58\n78\n90\n228\n188\n140\n164\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n166\n224\n211\n429\n313\n426\n313\n176\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n162\n284\n424\n462\n495\n422\n320\n178\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n50\n58\n92\n171\n153\n84\n65\n35\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n173\n318\n437\n431\n464\n419\n319\n179\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n145\n282\n385\n313\n273\n280\n317\n189\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n135\n181\n230\n377\n205\n84\n142\n57\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n30\n95\n85\n111\n101\n128\n78\n52\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n66\n176\n132\n114\n84\n108\n68\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n88\n93\n138\n108\n91\n67\n41\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n66\n111\n169\n139\n108\n91\n72\n57\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n182\n346\n462\n516\n249\n437\n127\n160\n53\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n186\n329\n449\n225\n237\n331\n322\n203\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n66\n85\n245\n180\n313\n211\n85\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n115\n117\n463\n532\n503\n477\n365\n209\n64\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n196\n351\n475\n547\n516\n471\n223\n116\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n196\n372\n473\n547\n544\n505\n389\n241\n69\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n148\n249\n426\n277\n431\n289\n277\n178\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n159\n316\n452\n535\n534\n487\n408\n250\n77\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n189\n359\n494\n559\n568\n462\n364\n107\n46\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n44\n81\n131\n152\n131\n118\n92\n66\n67\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n176\n317\n471\n535\n510\n464\n308\n123\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n40\n195\n371\n484\n406\n552\n287\n273\n155\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n182\n332\n448\n497\n472\n393\n316\n218\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n184\n353\n476\n547\n536\n534\n427\n260\n87\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n227\n403\n534\n609\n559\n477\n330\n228\n77\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n165\n321\n307\n545\n559\n472\n412\n194\n50\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n188\n322\n470\n582\n594\n434\n327\n155\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n47\n195\n370\n494\n573\n585\n527\n406\n253\n89\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n190\n369\n437\n501\n497\n494\n414\n266\n98\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n69\n219\n291\n383\n545\n529\n555\n487\n321\n129\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n61\n170\n241\n214\n245\n202\n184\n147\n94\n28\n3\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n99\n259\n433\n422\n252\n339\n171\n108\n57\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n75\n202\n396\n458\n583\n596\n528\n470\n272\n121\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n73\n228\n301\n301\n381\n361\n519\n434\n263\n110\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n75\n244\n405\n504\n540\n612\n515\n402\n291\n114\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n69\n238\n253\n368\n367\n668\n579\n412\n307\n75\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n82\n111\n147\n169\n203\n184\n145\n93\n55\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n76\n276\n458\n599\n680\n658\n595\n469\n333\n144\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n86\n144\n187\n213\n215\n197\n158\n104\n47\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n40\n101\n284\n391\n479\n497\n454\n423\n355\n78\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n114\n307\n496\n586\n656\n656\n609\n438\n348\n150\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n88\n161\n204\n229\n231\n262\n214\n148\n59\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n98\n132\n143\n160\n163\n149\n122\n81\n38\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n32\n66\n107\n138\n185\n160\n145\n116\n77\n38\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n143\n333\n504\n635\n720\n707\n665\n548\n302\n116\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n114\n168\n380\n396\n610\n606\n547\n239\n59\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n158\n346\n517\n648\n734\n720\n679\n562\n266\n192\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n2\n99\n68\n96\n123\n136\n147\n129\n129\n153\n90\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n52\n68\n169\n131\n143\n140\n208\n129\n142\n108\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n41\n68\n104\n124\n143\n161\n130\n105\n383\n55\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n184\n364\n543\n684\n739\n748\n684\n577\n405\n203\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n60\n137\n204\n249\n232\n261\n214\n186\n159\n136\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n200\n307\n562\n672\n376\n288\n143\n111\n161\n92\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n197\n173\n217\n324\n779\n727\n518\n594\n357\n145\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n204\n396\n569\n712\n764\n776\n704\n604\n425\n225\n42\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n93\n179\n564\n483\n737\n148\n137\n181\n127\n173\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n218\n410\n586\n723\n777\n790\n717\n610\n438\n232\n46\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n224\n417\n541\n600\n598\n794\n417\n218\n298\n158\n42\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n231\n423\n599\n737\n792\n804\n730\n623\n445\n244\n50\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n74\n90\n111\n154\n172\n162\n138\n118\n92\n64\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n108\n230\n464\n167\n370\n155\n740\n637\n447\n58\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n244\n445\n461\n755\n592\n813\n744\n287\n454\n251\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n114\n150\n184\n305\n517\n355\n145\n622\n464\n256\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n258\n443\n487\n714\n819\n830\n757\n651\n464\n247\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n58\n247\n456\n148\n711\n469\n716\n211\n288\n436\n263\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n85\n272\n470\n650\n761\n840\n844\n773\n638\n477\n269\n70\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n83\n279\n477\n658\n769\n849\n852\n781\n645\n482\n270\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n80\n286\n484\n665\n775\n854\n857\n778\n659\n460\n277\n76\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n47\n219\n106\n127\n147\n215\n264\n172\n133\n117\n211\n79\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n85\n297\n487\n149\n176\n725\n851\n528\n492\n387\n285\n77\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n111\n99\n141\n189\n413\n858\n682\n183\n495\n290\n82\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n179\n157\n495\n787\n800\n864\n469\n338\n258\n195\n79\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n109\n318\n509\n694\n800\n883\n885\n806\n671\n511\n296\n88\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n52\n126\n158\n148\n294\n385\n403\n417\n327\n237\n188\n95\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n62\n78\n193\n219\n314\n378\n267\n192\n159\n118\n55\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n82\n87\n151\n211\n255\n236\n277\n254\n178\n305\n136\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n104\n207\n246\n539\n695\n507\n604\n609\n555\n282\n276\n94\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n109\n315\n534\n724\n827\n807\n890\n823\n717\n525\n305\n101\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n86\n252\n457\n678\n788\n863\n861\n783\n648\n479\n261\n88\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n71\n261\n421\n680\n780\n361\n293\n271\n230\n172\n105\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n128\n338\n543\n661\n789\n806\n795\n754\n665\n435\n272\n98\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n127\n302\n526\n708\n840\n897\n886\n694\n696\n525\n270\n98\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n107\n303\n445\n420\n774\n882\n813\n774\n537\n449\n239\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n113\n199\n546\n287\n500\n544\n582\n736\n460\n490\n324\n107\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n76\n222\n454\n625\n618\n686\n717\n815\n699\n533\n316\n122\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n131\n333\n552\n740\n846\n912\n908\n834\n721\n528\n309\n111\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n159\n378\n585\n756\n876\n935\n930\n862\n723\n570\n339\n122\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n81\n136\n213\n286\n493\n364\n294\n270\n225\n165\n104\n56\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n50\n120\n363\n697\n790\n778\n875\n816\n623\n445\n238\n102\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n50\n115\n183\n203\n201\n216\n214\n198\n166\n124\n75\n32\n4\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n166\n385\n589\n771\n865\n887\n899\n688\n535\n551\n301\n124\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n82\n234\n194\n250\n376\n308\n306\n283\n241\n184\n98\n41\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n50\n108\n165\n250\n289\n309\n307\n284\n241\n184\n115\n49\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n130\n293\n504\n648\n823\n776\n897\n796\n550\n521\n223\n66\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n57\n124\n192\n248\n288\n308\n305\n282\n238\n180\n111\n47\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n55\n100\n158\n244\n242\n305\n256\n235\n199\n147\n90\n58\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n65\n110\n188\n247\n288\n308\n805\n483\n285\n175\n253\n66\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n203\n418\n634\n803\n818\n926\n883\n872\n719\n566\n370\n160\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n80\n165\n481\n518\n295\n313\n312\n287\n246\n188\n119\n53\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n191\n399\n563\n795\n893\n954\n946\n863\n529\n528\n332\n148\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n170\n336\n551\n688\n855\n840\n753\n768\n686\n507\n320\n125\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n70\n138\n328\n523\n526\n633\n581\n463\n721\n558\n350\n159\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n211\n429\n632\n762\n857\n933\n895\n803\n707\n430\n242\n54\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n68\n166\n397\n259\n297\n316\n313\n289\n246\n187\n119\n54\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n49\n96\n144\n184\n212\n226\n224\n207\n175\n156\n301\n110\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n55\n231\n435\n602\n750\n887\n929\n699\n645\n554\n433\n295\n144\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n70\n244\n439\n607\n786\n871\n908\n902\n772\n723\n548\n366\n156\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n121\n173\n243\n193\n262\n288\n263\n316\n247\n191\n197\n117\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n46\n114\n129\n171\n242\n241\n256\n197\n190\n276\n158\n110\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n47\n120\n144\n236\n264\n415\n961\n435\n324\n521\n270\n379\n191\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n75\n55\n166\n194\n277\n401\n438\n539\n432\n471\n179\n170\n85\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n87\n97\n224\n136\n172\n179\n184\n181\n176\n157\n110\n90\n91\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n85\n47\n106\n244\n236\n298\n324\n244\n355\n235\n179\n204\n71\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n219\n343\n486\n803\n910\n939\n885\n590\n559\n306\n287\n140\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n92\n262\n448\n626\n777\n880\n952\n976\n889\n753\n582\n397\n202\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n79\n261\n461\n632\n771\n886\n977\n982\n905\n784\n590\n402\n210\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n88\n264\n450\n646\n778\n879\n935\n945\n887\n748\n584\n409\n194\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n51\n135\n216\n251\n244\n728\n930\n940\n869\n759\n590\n397\n208\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n97\n270\n466\n639\n783\n931\n944\n943\n872\n783\n591\n396\n172\n42\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n95\n259\n455\n652\n802\n889\n904\n906\n841\n724\n519\n388\n167\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n106\n278\n407\n684\n677\n765\n864\n886\n785\n715\n530\n416\n215\n47\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n105\n276\n479\n635\n784\n885\n942\n960\n902\n754\n570\n402\n210\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n82\n210\n421\n603\n307\n354\n269\n312\n205\n268\n254\n173\n94\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n93\n154\n173\n285\n208\n292\n515\n346\n350\n152\n118\n79\n128\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n101\n201\n356\n690\n844\n909\n991\n974\n892\n783\n628\n424\n213\n53\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n107\n282\n479\n644\n806\n922\n968\n978\n906\n730\n584\n307\n195\n42\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n79\n209\n331\n445\n529\n596\n626\n624\n582\n506\n406\n289\n160\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n213\n341\n271\n335\n313\n331\n326\n305\n171\n441\n323\n177\n45\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n177\n230\n165\n186\n179\n192\n189\n219\n158\n125\n92\n42\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n118\n281\n487\n666\n798\n414\n562\n941\n916\n750\n389\n104\n207\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n98\n286\n508\n690\n803\n809\n958\n298\n550\n406\n341\n283\n127\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n56\n267\n493\n597\n725\n804\n608\n976\n948\n804\n602\n436\n232\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n112\n297\n478\n680\n780\n897\n962\n927\n767\n771\n482\n313\n157\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n121\n296\n493\n681\n836\n934\n1006\n998\n886\n621\n269\n322\n118\n72\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n124\n286\n485\n640\n802\n919\n993\n985\n930\n785\n608\n432\n237\n70\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n121\n304\n499\n671\n785\n928\n970\n1007\n929\n783\n601\n401\n226\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n95\n293\n294\n224\n759\n761\n935\n962\n892\n763\n605\n372\n178\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n87\n293\n486\n671\n855\n960\n1010\n1003\n905\n739\n501\n454\n232\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n105\n286\n501\n705\n848\n966\n1024\n1017\n944\n815\n662\n453\n241\n73\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n92\n264\n465\n668\n811\n939\n997\n990\n910\n782\n581\n427\n198\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n103\n281\n493\n692\n773\n899\n964\n936\n756\n637\n260\n178\n180\n55\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n87\n275\n165\n230\n282\n319\n337\n334\n312\n453\n480\n186\n84\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n55\n201\n158\n223\n590\n845\n953\n865\n875\n766\n562\n391\n210\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n56\n175\n160\n277\n342\n846\n581\n820\n810\n483\n624\n363\n125\n50\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n95\n270\n446\n633\n827\n897\n934\n950\n926\n763\n620\n425\n219\n75\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n98\n234\n437\n625\n776\n856\n910\n949\n908\n746\n507\n345\n212\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n101\n201\n302\n497\n575\n645\n413\n354\n385\n273\n267\n187\n85\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n42\n95\n164\n228\n281\n318\n577\n357\n313\n524\n446\n273\n85\n50\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n37\n215\n193\n189\n236\n268\n284\n995\n898\n783\n640\n434\n244\n78\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n70\n218\n158\n385\n785\n953\n899\n827\n878\n775\n593\n362\n180\n72\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n100\n220\n424\n642\n806\n873\n937\n844\n700\n612\n516\n414\n164\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n29\n71\n120\n196\n240\n271\n338\n823\n916\n796\n644\n443\n76\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n39\n86\n113\n189\n236\n775\n999\n994\n926\n793\n646\n442\n235\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n28\n70\n119\n164\n655\n922\n967\n939\n782\n781\n662\n455\n252\n76\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n111\n228\n397\n649\n757\n916\n985\n989\n940\n701\n432\n406\n257\n67\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n89\n267\n460\n642\n794\n845\n922\n884\n856\n733\n627\n435\n242\n89\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n31\n66\n135\n190\n236\n388\n335\n334\n313\n273\n218\n471\n180\n84\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n109\n278\n441\n659\n861\n981\n969\n834\n843\n696\n637\n421\n260\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n75\n248\n449\n616\n734\n570\n618\n737\n787\n759\n625\n416\n243\n86\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n48\n117\n244\n230\n649\n816\n940\n674\n597\n281\n226\n125\n82\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n28\n220\n336\n698\n772\n318\n883\n868\n869\n687\n447\n423\n92\n82\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n110\n298\n499\n698\n804\n917\n929\n986\n867\n850\n645\n456\n265\n97\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n76\n200\n338\n497\n621\n875\n921\n964\n882\n235\n486\n196\n78\n45\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n96\n217\n197\n438\n798\n916\n913\n997\n802\n542\n471\n380\n209\n89\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n29\n65\n114\n274\n199\n227\n240\n334\n314\n338\n271\n416\n272\n69\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n58\n152\n339\n269\n336\n384\n670\n548\n774\n554\n609\n314\n84\n45\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n98\n273\n482\n684\n773\n822\n820\n931\n889\n772\n678\n475\n266\n91\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n101\n280\n491\n676\n844\n965\n978\n977\n963\n793\n671\n449\n203\n53\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n101\n243\n374\n299\n541\n412\n406\n720\n381\n332\n410\n150\n103\n100\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n225\n403\n579\n764\n841\n977\n899\n916\n792\n648\n441\n235\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n92\n136\n190\n603\n691\n598\n696\n520\n767\n644\n449\n268\n89\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n62\n125\n429\n639\n777\n911\n933\n985\n898\n783\n655\n454\n259\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n62\n148\n182\n263\n707\n910\n955\n929\n874\n775\n528\n327\n226\n84\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n61\n218\n399\n581\n774\n853\n948\n833\n385\n273\n216\n190\n126\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n76\n232\n430\n635\n781\n904\n951\n924\n905\n771\n588\n352\n178\n64\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n55\n114\n309\n596\n724\n849\n976\n911\n893\n664\n545\n375\n226\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n77\n244\n458\n609\n684\n877\n957\n965\n827\n739\n640\n432\n240\n79\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n75\n167\n454\n509\n798\n923\n939\n935\n883\n819\n687\n485\n280\n94\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n75\n216\n376\n617\n760\n889\n985\n949\n926\n803\n633\n451\n236\n79\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n80\n273\n476\n638\n811\n383\n408\n392\n317\n338\n274\n135\n77\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n57\n103\n178\n226\n259\n278\n609\n523\n678\n480\n338\n247\n83\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n71\n105\n355\n305\n632\n665\n696\n405\n310\n515\n219\n224\n198\n64\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n59\n244\n470\n649\n642\n831\n689\n986\n813\n737\n477\n370\n158\n64\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n47\n77\n143\n177\n190\n219\n276\n326\n306\n266\n211\n245\n79\n57\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n139\n280\n517\n695\n876\n860\n937\n881\n756\n568\n391\n203\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n62\n173\n370\n395\n717\n763\n840\n948\n827\n772\n602\n396\n203\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n55\n87\n317\n183\n640\n839\n838\n888\n754\n772\n569\n387\n195\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n165\n242\n205\n261\n303\n777\n767\n870\n789\n619\n371\n215\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n82\n150\n215\n269\n307\n403\n963\n309\n271\n218\n154\n85\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n53\n124\n274\n734\n754\n762\n893\n867\n785\n600\n404\n236\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n52\n188\n365\n566\n742\n763\n902\n825\n743\n564\n469\n221\n129\n52\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n124\n366\n428\n632\n830\n926\n915\n831\n639\n261\n147\n79\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n63\n404\n574\n659\n863\n645\n801\n374\n604\n258\n178\n95\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n40\n213\n167\n203\n533\n297\n890\n862\n300\n625\n436\n284\n73\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n179\n304\n432\n270\n369\n394\n755\n761\n712\n567\n338\n138\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n122\n135\n392\n581\n733\n928\n826\n810\n736\n519\n249\n216\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n86\n136\n249\n318\n367\n702\n506\n524\n629\n253\n339\n87\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n208\n407\n614\n791\n888\n954\n955\n891\n797\n622\n416\n217\n52\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n204\n407\n619\n747\n766\n910\n880\n862\n812\n625\n331\n220\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n177\n374\n573\n722\n297\n577\n832\n854\n668\n557\n342\n197\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n191\n353\n571\n737\n811\n869\n847\n816\n765\n503\n272\n176\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n131\n351\n196\n718\n295\n317\n354\n737\n446\n244\n113\n48\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n47\n95\n143\n216\n251\n269\n317\n296\n257\n201\n133\n57\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n67\n135\n475\n630\n722\n494\n654\n668\n684\n581\n333\n205\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n187\n263\n589\n732\n850\n913\n908\n828\n736\n543\n307\n180\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n169\n246\n562\n590\n738\n839\n856\n825\n667\n562\n366\n169\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n181\n410\n625\n723\n650\n940\n790\n814\n678\n588\n419\n211\n42\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n168\n373\n458\n712\n681\n910\n829\n810\n711\n542\n345\n149\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n115\n308\n449\n456\n763\n699\n778\n350\n541\n429\n282\n147\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n150\n348\n545\n728\n861\n896\n896\n859\n725\n541\n343\n149\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n158\n355\n562\n716\n809\n834\n891\n781\n681\n437\n341\n151\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n126\n320\n460\n544\n565\n854\n858\n858\n744\n599\n392\n188\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n53\n89\n418\n701\n715\n895\n934\n724\n692\n491\n341\n139\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n131\n243\n287\n363\n649\n527\n671\n782\n529\n356\n220\n107\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n173\n381\n582\n654\n856\n942\n941\n824\n713\n534\n343\n121\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n148\n344\n556\n712\n841\n907\n906\n837\n706\n548\n334\n140\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n141\n334\n545\n701\n829\n897\n894\n824\n693\n466\n321\n131\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n154\n302\n576\n753\n880\n904\n903\n770\n743\n564\n365\n157\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n170\n382\n580\n756\n794\n853\n874\n783\n703\n529\n368\n157\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n121\n268\n505\n673\n750\n865\n823\n796\n657\n453\n303\n126\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n133\n322\n479\n690\n817\n883\n727\n791\n666\n458\n273\n109\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n138\n341\n533\n712\n840\n906\n903\n830\n696\n515\n320\n124\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n136\n315\n526\n624\n546\n867\n612\n649\n537\n370\n258\n124\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n65\n176\n480\n683\n762\n846\n810\n543\n230\n414\n282\n82\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n113\n333\n521\n615\n812\n854\n834\n763\n716\n535\n334\n129\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n134\n312\n460\n656\n764\n833\n858\n832\n697\n512\n303\n113\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n136\n331\n539\n719\n847\n882\n876\n832\n695\n510\n300\n109\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n118\n295\n181\n679\n820\n830\n870\n837\n673\n519\n318\n113\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n133\n310\n497\n586\n738\n823\n853\n764\n646\n295\n249\n72\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n124\n224\n372\n521\n350\n175\n560\n511\n461\n459\n242\n105\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n121\n322\n516\n695\n791\n847\n812\n702\n657\n427\n269\n91\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n127\n323\n532\n711\n812\n837\n806\n768\n647\n369\n256\n89\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n114\n300\n523\n701\n800\n862\n854\n780\n576\n381\n179\n82\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n133\n333\n540\n716\n804\n791\n677\n660\n676\n469\n286\n93\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n135\n167\n483\n648\n514\n860\n852\n777\n625\n469\n241\n75\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n92\n253\n434\n513\n630\n718\n469\n254\n208\n148\n85\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n41\n103\n171\n532\n550\n286\n546\n258\n462\n154\n87\n68\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n126\n331\n541\n694\n806\n861\n803\n731\n654\n488\n273\n79\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n101\n290\n483\n659\n784\n845\n835\n755\n615\n428\n231\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n94\n242\n379\n592\n746\n693\n772\n678\n541\n325\n150\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n51\n108\n175\n228\n426\n351\n347\n518\n425\n216\n176\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n47\n126\n207\n608\n609\n730\n804\n652\n526\n356\n223\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n89\n271\n480\n637\n742\n500\n581\n668\n566\n391\n197\n44\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n56\n165\n325\n598\n518\n674\n654\n558\n242\n168\n86\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n74\n129\n177\n211\n227\n380\n236\n191\n177\n100\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n66\n227\n193\n612\n543\n780\n747\n567\n504\n249\n161\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n83\n272\n464\n338\n594\n538\n588\n436\n574\n370\n179\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n98\n183\n338\n650\n735\n777\n515\n612\n437\n329\n90\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n90\n156\n211\n249\n267\n263\n237\n191\n371\n172\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n40\n83\n147\n203\n206\n221\n217\n229\n155\n121\n52\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n121\n200\n266\n312\n333\n327\n296\n241\n168\n85\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n81\n279\n399\n583\n639\n662\n333\n704\n249\n126\n61\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n93\n158\n212\n687\n536\n405\n430\n190\n130\n64\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n82\n124\n201\n239\n316\n252\n224\n178\n117\n55\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n71\n125\n328\n740\n794\n777\n692\n547\n369\n165\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n65\n240\n427\n584\n656\n783\n767\n682\n537\n360\n158\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n249\n453\n610\n728\n677\n733\n599\n465\n331\n152\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n72\n248\n427\n585\n684\n771\n754\n675\n540\n363\n158\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n55\n112\n154\n131\n143\n180\n199\n176\n171\n87\n3\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n51\n252\n443\n565\n658\n680\n700\n626\n466\n318\n143\n3\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n82\n227\n436\n604\n674\n721\n703\n591\n485\n316\n131\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n71\n229\n423\n567\n710\n758\n688\n629\n515\n331\n125\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n240\n419\n569\n638\n723\n682\n579\n458\n302\n129\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n47\n83\n111\n130\n136\n626\n618\n477\n274\n91\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n223\n416\n587\n683\n649\n638\n596\n463\n274\n73\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n184\n416\n538\n615\n715\n643\n568\n452\n294\n113\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n145\n418\n565\n566\n629\n612\n584\n464\n261\n106\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n202\n386\n524\n619\n664\n680\n532\n446\n283\n93\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n189\n385\n548\n644\n670\n624\n582\n427\n276\n103\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n202\n404\n563\n661\n600\n652\n535\n400\n267\n98\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n180\n404\n564\n453\n690\n666\n503\n447\n214\n92\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n56\n207\n304\n458\n492\n567\n477\n452\n260\n84\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n174\n397\n545\n616\n615\n618\n500\n424\n264\n79\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n218\n340\n491\n327\n487\n382\n538\n440\n257\n72\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n179\n358\n530\n547\n545\n617\n528\n411\n224\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n184\n363\n492\n584\n596\n601\n523\n401\n226\n69\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n184\n366\n518\n578\n607\n591\n552\n393\n246\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n93\n355\n523\n520\n593\n620\n483\n411\n239\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n177\n346\n486\n511\n608\n581\n515\n402\n222\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n191\n315\n473\n560\n545\n607\n264\n202\n155\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n85\n120\n152\n271\n253\n322\n253\n197\n111\n52\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n174\n339\n478\n512\n607\n586\n462\n394\n206\n46\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n167\n334\n495\n594\n193\n162\n422\n392\n214\n44\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n143\n286\n490\n593\n610\n611\n508\n309\n117\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n140\n337\n486\n582\n565\n246\n449\n373\n203\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n162\n328\n442\n517\n526\n581\n462\n338\n187\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n139\n338\n446\n496\n515\n532\n468\n334\n197\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n154\n300\n415\n472\n598\n587\n502\n355\n168\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n2\n80\n264\n221\n121\n179\n230\n129\n66\n55\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n140\n296\n449\n507\n508\n528\n443\n305\n157\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n141\n294\n439\n544\n583\n559\n476\n337\n132\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n118\n281\n414\n474\n419\n459\n408\n292\n162\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n116\n275\n289\n467\n536\n534\n368\n187\n83\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n121\n276\n410\n479\n105\n166\n102\n162\n106\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n122\n276\n403\n489\n566\n546\n451\n291\n145\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n104\n260\n382\n478\n449\n277\n370\n218\n110\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n105\n276\n364\n393\n372\n480\n407\n248\n121\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n105\n173\n165\n181\n268\n356\n279\n161\n76\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n47\n114\n407\n366\n118\n222\n223\n133\n128\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n80\n229\n297\n336\n378\n367\n309\n217\n102\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n60\n144\n130\n188\n183\n253\n248\n203\n99\n4\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n99\n150\n153\n137\n93\n162\n76\n98\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n96\n60\n108\n134\n242\n145\n155\n92\n60\n3\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n84\n188\n300\n459\n518\n264\n204\n109\n37\n1\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n65\n192\n341\n248\n463\n336\n328\n145\n50\n1\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n208\n315\n423\n474\n415\n331\n221\n46\n1\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n68\n232\n375\n467\n511\n483\n191\n97\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n179\n333\n352\n371\n283\n113\n97\n86\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n68\n225\n363\n446\n495\n449\n235\n161\n72\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n59\n225\n349\n404\n492\n343\n367\n221\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n73\n226\n346\n397\n392\n428\n180\n214\n106\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n218\n280\n394\n482\n466\n367\n236\n98\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n203\n334\n346\n419\n405\n303\n232\n109\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n62\n189\n276\n312\n283\n222\n96\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n45\n191\n132\n155\n150\n118\n79\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n126\n334\n429\n227\n193\n243\n101\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n126\n169\n77\n181\n92\n87\n101\n57\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n134\n316\n404\n464\n425\n362\n203\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n37\n183\n173\n329\n99\n179\n231\n98\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n129\n268\n283\n375\n248\n193\n142\n95\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n175\n319\n365\n430\n466\n390\n265\n108\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n172\n315\n420\n467\n434\n370\n246\n94\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n49\n74\n98\n108\n124\n312\n116\n64\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n61\n135\n140\n154\n149\n126\n113\n47\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n65\n109\n134\n250\n262\n197\n97\n69\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n151\n296\n315\n326\n150\n276\n118\n75\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n85\n272\n306\n314\n381\n321\n248\n104\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n143\n215\n382\n300\n270\n146\n161\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n53\n98\n162\n146\n143\n120\n69\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n40\n73\n118\n114\n130\n107\n70\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n55\n59\n81\n92\n124\n87\n111\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n155\n286\n341\n373\n315\n201\n49\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n146\n283\n370\n413\n390\n274\n233\n85\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n140\n274\n400\n453\n442\n370\n246\n99\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n116\n248\n340\n391\n381\n324\n207\n81\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n148\n293\n386\n417\n419\n357\n252\n103\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n140\n284\n394\n432\n374\n259\n242\n104\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n155\n279\n180\n299\n367\n251\n208\n69\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n142\n290\n363\n313\n252\n229\n89\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n136\n264\n272\n409\n436\n367\n246\n105\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n121\n210\n341\n326\n166\n139\n171\n100\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n140\n74\n122\n140\n138\n117\n80\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n85\n191\n158\n123\n347\n211\n152\n91\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n34\n67\n93\n105\n123\n245\n180\n112\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n122\n266\n348\n298\n223\n258\n145\n79\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n42\n69\n98\n96\n112\n95\n65\n33\n4\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n124\n279\n326\n408\n400\n329\n253\n114\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n79\n101\n136\n155\n153\n133\n97\n42\n4\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n34\n69\n98\n134\n143\n114\n78\n40\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n79\n217\n340\n261\n364\n349\n214\n112\n10\n0\n0\n0\n0\n0\n0\n0"
  },
  {
    "path": "src/pymgrid/data/pv/Raleigh_723060TYA.csv",
    "content": "GH illum (lx)\n0\n0\n0\n0\n0\n0\n0\n16\n58\n89\n120\n257\n314\n252\n213\n160\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n33\n82\n115\n133\n156\n144\n123\n132\n50\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n148\n320\n466\n551\n574\n529\n423\n264\n83\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n150\n326\n411\n549\n527\n529\n420\n263\n76\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n105\n284\n431\n511\n534\n459\n273\n150\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n73\n150\n214\n303\n272\n244\n204\n83\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n77\n170\n246\n269\n193\n162\n139\n96\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n50\n164\n231\n277\n281\n284\n234\n150\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n123\n297\n447\n525\n550\n510\n412\n250\n76\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n134\n286\n440\n528\n481\n441\n326\n235\n93\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n93\n211\n260\n508\n529\n487\n403\n234\n83\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n32\n63\n112\n144\n149\n146\n123\n90\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n57\n111\n152\n195\n190\n179\n147\n104\n45\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n77\n174\n223\n272\n327\n373\n198\n143\n53\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n139\n292\n462\n505\n559\n524\n420\n248\n112\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n131\n248\n331\n412\n392\n512\n411\n259\n95\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n68\n161\n422\n311\n392\n329\n186\n213\n102\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n135\n325\n452\n524\n566\n528\n436\n283\n109\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n137\n283\n235\n285\n197\n246\n192\n88\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n55\n103\n171\n187\n212\n179\n147\n101\n44\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n112\n259\n351\n274\n340\n309\n185\n132\n65\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n163\n346\n429\n542\n558\n572\n485\n328\n143\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n110\n241\n389\n247\n327\n327\n351\n201\n99\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n57\n179\n293\n448\n544\n500\n305\n296\n132\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n160\n349\n502\n535\n456\n557\n412\n317\n137\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n153\n325\n483\n498\n532\n566\n468\n299\n132\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n151\n318\n357\n364\n564\n525\n413\n287\n104\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n144\n293\n499\n549\n628\n530\n387\n293\n130\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n164\n346\n507\n611\n649\n611\n502\n338\n152\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n179\n374\n527\n626\n659\n625\n522\n364\n169\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n126\n206\n236\n326\n333\n560\n347\n243\n80\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n97\n173\n252\n309\n316\n194\n171\n120\n54\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n62\n204\n183\n196\n207\n211\n164\n120\n61\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n88\n191\n256\n595\n592\n573\n488\n227\n114\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n167\n390\n525\n626\n678\n609\n517\n362\n170\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n61\n110\n194\n175\n198\n203\n300\n131\n67\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n125\n203\n295\n443\n468\n310\n220\n342\n173\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n124\n335\n481\n560\n579\n497\n522\n361\n173\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n203\n409\n570\n668\n705\n673\n567\n409\n202\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n175\n369\n552\n621\n678\n600\n339\n320\n185\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n217\n341\n592\n660\n692\n538\n493\n202\n181\n42\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n207\n429\n541\n337\n229\n427\n252\n223\n95\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n119\n197\n277\n326\n367\n343\n310\n237\n160\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n45\n185\n378\n567\n616\n674\n670\n410\n216\n177\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n237\n338\n460\n612\n397\n384\n457\n235\n148\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n212\n419\n572\n700\n765\n647\n540\n388\n211\n44\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n236\n444\n603\n709\n744\n588\n599\n440\n231\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n91\n199\n287\n637\n624\n651\n500\n272\n105\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n40\n128\n394\n384\n565\n443\n699\n572\n426\n219\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n88\n141\n182\n203\n432\n458\n268\n175\n76\n47\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n126\n190\n341\n709\n754\n717\n625\n451\n242\n53\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n65\n273\n479\n632\n706\n779\n737\n634\n472\n260\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n148\n330\n451\n638\n513\n411\n350\n390\n224\n55\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n175\n338\n469\n384\n403\n495\n389\n295\n103\n50\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n63\n223\n462\n472\n584\n686\n663\n595\n381\n187\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n126\n251\n338\n558\n420\n489\n141\n251\n117\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n132\n271\n447\n477\n370\n503\n258\n320\n84\n47\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n131\n414\n588\n525\n518\n437\n262\n236\n120\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n82\n288\n493\n663\n771\n810\n770\n659\n481\n274\n72\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n106\n317\n518\n681\n775\n802\n765\n660\n506\n292\n84\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n106\n320\n519\n683\n777\n803\n767\n661\n498\n294\n82\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n67\n199\n168\n146\n153\n254\n131\n138\n167\n128\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n66\n142\n234\n199\n120\n108\n154\n221\n135\n53\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n82\n144\n205\n169\n159\n223\n192\n128\n93\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n68\n153\n205\n296\n392\n296\n246\n266\n234\n75\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n128\n333\n540\n698\n798\n830\n797\n686\n506\n301\n91\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n128\n316\n528\n672\n723\n807\n683\n513\n353\n165\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n69\n147\n211\n261\n140\n240\n216\n281\n41\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n19\n58\n291\n235\n258\n274\n271\n227\n295\n90\n63\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n148\n372\n580\n742\n839\n862\n838\n704\n551\n329\n113\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n164\n384\n574\n755\n846\n838\n793\n635\n543\n325\n89\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n47\n76\n118\n466\n820\n843\n839\n733\n495\n332\n113\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n120\n211\n280\n358\n565\n578\n332\n310\n286\n280\n57\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n179\n400\n595\n704\n625\n742\n518\n506\n422\n266\n77\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n181\n396\n606\n760\n877\n910\n852\n739\n565\n339\n119\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n177\n397\n627\n769\n868\n882\n851\n755\n579\n350\n128\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n156\n224\n270\n329\n275\n176\n122\n111\n93\n46\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n83\n73\n163\n191\n268\n291\n597\n522\n407\n342\n121\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n198\n417\n632\n800\n858\n950\n692\n641\n542\n313\n128\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n166\n394\n486\n612\n851\n901\n859\n741\n549\n341\n126\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n144\n405\n554\n760\n864\n903\n847\n744\n556\n346\n131\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n89\n245\n362\n466\n423\n486\n562\n494\n459\n307\n67\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n104\n239\n350\n439\n544\n612\n758\n664\n538\n364\n131\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n161\n386\n503\n606\n628\n637\n639\n691\n457\n291\n121\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n36\n145\n144\n188\n200\n365\n356\n445\n554\n356\n145\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n56\n228\n447\n691\n836\n884\n933\n900\n802\n627\n412\n159\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n55\n248\n480\n689\n838\n911\n943\n896\n785\n608\n392\n178\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n242\n469\n669\n830\n919\n948\n892\n781\n608\n365\n102\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n230\n467\n662\n821\n882\n909\n779\n622\n584\n307\n89\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n40\n156\n393\n619\n679\n838\n738\n564\n634\n585\n362\n145\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n127\n252\n333\n680\n846\n809\n831\n623\n575\n371\n93\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n45\n206\n445\n490\n821\n811\n709\n693\n622\n542\n329\n111\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n144\n460\n672\n791\n763\n763\n542\n359\n219\n187\n71\n3\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n260\n400\n702\n902\n835\n977\n876\n747\n530\n297\n158\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n251\n394\n644\n830\n906\n924\n885\n763\n587\n375\n151\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n63\n254\n479\n634\n794\n856\n738\n360\n419\n99\n59\n37\n1\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n60\n257\n513\n724\n881\n961\n979\n929\n805\n629\n413\n177\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n79\n297\n529\n730\n836\n972\n996\n940\n809\n623\n409\n175\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n80\n300\n522\n755\n783\n914\n1000\n905\n790\n646\n404\n174\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n224\n177\n343\n473\n268\n342\n250\n217\n132\n235\n69\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n211\n297\n287\n169\n235\n244\n370\n430\n496\n359\n177\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n93\n310\n538\n715\n893\n864\n804\n857\n774\n605\n402\n183\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n94\n304\n524\n713\n895\n932\n973\n927\n759\n600\n394\n161\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n118\n159\n205\n379\n562\n812\n663\n379\n368\n189\n105\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n72\n132\n173\n410\n572\n785\n621\n443\n488\n329\n172\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n152\n319\n464\n855\n746\n683\n418\n494\n432\n298\n182\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n47\n239\n537\n716\n887\n971\n977\n862\n725\n535\n142\n48\n3\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n117\n353\n579\n779\n907\n1003\n1020\n956\n835\n653\n422\n188\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n121\n356\n575\n781\n926\n1007\n1001\n890\n730\n620\n367\n179\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n83\n177\n300\n643\n637\n945\n941\n818\n679\n209\n109\n48\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n113\n307\n527\n663\n464\n463\n436\n525\n182\n106\n146\n48\n1\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n78\n262\n302\n459\n915\n726\n852\n742\n742\n547\n418\n194\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n129\n347\n565\n773\n891\n966\n967\n947\n810\n630\n411\n189\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n126\n343\n571\n740\n873\n971\n993\n913\n744\n599\n361\n145\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n124\n264\n424\n724\n840\n949\n966\n751\n566\n429\n382\n170\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n123\n308\n472\n509\n840\n941\n948\n898\n785\n596\n363\n161\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n121\n321\n528\n695\n835\n913\n626\n682\n695\n576\n387\n171\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n152\n325\n583\n703\n709\n951\n715\n765\n372\n219\n151\n55\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n121\n325\n434\n798\n786\n574\n397\n720\n398\n621\n398\n138\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n87\n150\n191\n435\n782\n907\n710\n651\n418\n338\n140\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n85\n302\n332\n645\n378\n582\n417\n795\n778\n274\n151\n94\n44\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n35\n84\n139\n185\n260\n333\n338\n821\n681\n602\n404\n75\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n50\n218\n279\n295\n721\n789\n784\n695\n464\n318\n149\n75\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n156\n369\n583\n810\n862\n935\n1064\n812\n815\n521\n339\n181\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n116\n192\n420\n770\n471\n818\n327\n856\n817\n595\n386\n218\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n167\n389\n621\n796\n932\n1009\n967\n929\n837\n530\n377\n140\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n145\n306\n367\n661\n929\n1006\n1027\n975\n861\n695\n493\n256\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n150\n366\n555\n783\n897\n983\n1033\n977\n845\n636\n439\n210\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n60\n294\n429\n631\n633\n566\n949\n707\n792\n535\n201\n108\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n70\n199\n379\n505\n314\n419\n359\n467\n353\n318\n435\n203\n52\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n165\n301\n230\n742\n867\n757\n994\n869\n788\n474\n232\n118\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n159\n348\n533\n409\n851\n975\n814\n678\n360\n507\n376\n208\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n107\n356\n567\n752\n900\n847\n344\n400\n349\n275\n186\n113\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n53\n115\n150\n230\n317\n422\n694\n645\n794\n509\n170\n180\n59\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n86\n258\n414\n593\n693\n985\n945\n846\n812\n654\n451\n235\n67\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n105\n209\n482\n745\n853\n923\n695\n956\n814\n549\n445\n254\n47\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n57\n119\n180\n233\n320\n346\n350\n847\n571\n274\n386\n257\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n173\n361\n591\n537\n788\n752\n1026\n951\n560\n413\n331\n249\n55\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n70\n144\n215\n276\n395\n347\n713\n781\n295\n241\n405\n85\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n194\n424\n638\n836\n940\n1014\n1026\n976\n901\n720\n516\n277\n82\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n164\n383\n589\n760\n866\n781\n1012\n839\n740\n560\n413\n242\n73\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n164\n355\n615\n822\n938\n1021\n983\n932\n678\n449\n359\n183\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n126\n304\n625\n773\n939\n1022\n974\n927\n712\n688\n491\n264\n79\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n206\n433\n544\n813\n931\n1016\n958\n931\n866\n710\n527\n296\n94\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n178\n336\n561\n770\n949\n1032\n1045\n964\n703\n665\n461\n247\n77\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n189\n394\n581\n721\n846\n1007\n974\n834\n532\n471\n206\n115\n46\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n60\n120\n148\n195\n230\n251\n299\n284\n249\n168\n139\n108\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n51\n93\n147\n192\n227\n246\n250\n237\n208\n167\n116\n64\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n50\n144\n254\n707\n544\n633\n976\n925\n781\n627\n380\n146\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n108\n329\n514\n736\n801\n769\n820\n610\n627\n694\n383\n257\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n159\n384\n636\n746\n926\n1023\n916\n930\n761\n649\n458\n272\n98\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n194\n362\n608\n747\n962\n1024\n944\n824\n851\n557\n329\n143\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n200\n364\n568\n357\n625\n796\n781\n953\n864\n595\n389\n153\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n183\n415\n619\n788\n639\n757\n890\n864\n843\n656\n429\n265\n91\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n154\n372\n632\n827\n899\n978\n776\n783\n893\n666\n480\n261\n76\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n206\n430\n629\n707\n920\n930\n955\n869\n697\n415\n470\n256\n107\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n203\n415\n639\n789\n629\n764\n815\n856\n704\n466\n479\n278\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n200\n411\n633\n825\n950\n354\n727\n851\n635\n337\n487\n227\n95\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n182\n394\n622\n792\n916\n951\n968\n971\n534\n652\n455\n222\n85\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n195\n403\n625\n821\n746\n992\n1054\n857\n763\n687\n499\n208\n100\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n45\n226\n436\n614\n773\n960\n1009\n948\n979\n866\n697\n399\n297\n116\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n169\n262\n546\n549\n823\n890\n831\n931\n838\n519\n285\n303\n52\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n92\n195\n267\n278\n329\n358\n363\n683\n539\n455\n425\n241\n88\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n177\n302\n595\n758\n903\n947\n981\n999\n867\n447\n393\n244\n93\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n53\n105\n184\n557\n707\n869\n880\n519\n816\n667\n391\n207\n68\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n63\n218\n555\n689\n873\n971\n949\n925\n869\n661\n453\n227\n81\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n105\n401\n624\n800\n920\n887\n814\n875\n743\n699\n440\n179\n44\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n195\n313\n588\n767\n883\n900\n873\n861\n722\n676\n310\n156\n57\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n159\n222\n452\n727\n320\n347\n434\n736\n697\n727\n472\n252\n84\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n55\n95\n147\n228\n269\n565\n783\n779\n297\n429\n145\n102\n55\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n48\n112\n175\n269\n317\n736\n351\n335\n298\n243\n239\n265\n102\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n113\n392\n497\n591\n713\n985\n920\n660\n638\n247\n382\n219\n90\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n48\n353\n417\n761\n772\n961\n907\n832\n934\n658\n496\n154\n96\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n46\n97\n175\n269\n482\n545\n351\n335\n299\n244\n176\n103\n48\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n198\n366\n499\n665\n884\n983\n1005\n952\n867\n585\n495\n281\n122\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n186\n395\n545\n723\n701\n823\n964\n885\n844\n670\n520\n303\n107\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n189\n374\n403\n537\n637\n948\n861\n926\n764\n580\n302\n241\n87\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n173\n360\n586\n696\n841\n906\n959\n947\n828\n632\n458\n302\n107\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n203\n399\n627\n711\n833\n899\n1070\n918\n816\n706\n527\n322\n121\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n129\n360\n584\n780\n887\n968\n990\n964\n752\n702\n484\n253\n105\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n153\n377\n312\n266\n786\n943\n745\n955\n819\n576\n506\n309\n117\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n187\n372\n569\n771\n874\n927\n839\n852\n692\n631\n182\n261\n68\n1\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n187\n356\n571\n766\n868\n982\n954\n888\n785\n683\n471\n276\n113\n1\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n165\n347\n422\n738\n877\n946\n962\n882\n774\n606\n425\n264\n112\n1\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n171\n355\n386\n690\n752\n848\n909\n730\n712\n393\n370\n234\n68\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n200\n394\n588\n767\n880\n938\n972\n922\n831\n690\n517\n314\n126\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n198\n399\n579\n769\n895\n975\n999\n922\n786\n684\n490\n292\n115\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n181\n359\n555\n736\n835\n984\n982\n962\n837\n675\n490\n288\n111\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n144\n206\n480\n665\n542\n386\n300\n903\n719\n443\n144\n57\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n144\n350\n480\n690\n827\n883\n922\n733\n316\n258\n377\n272\n70\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n94\n213\n360\n607\n731\n905\n830\n903\n814\n652\n466\n276\n104\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n173\n334\n332\n619\n636\n898\n874\n962\n808\n640\n452\n281\n108\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n154\n294\n473\n697\n542\n385\n637\n614\n711\n557\n347\n180\n97\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n144\n328\n496\n569\n655\n712\n742\n784\n810\n660\n473\n275\n107\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n175\n354\n539\n696\n865\n954\n971\n931\n830\n679\n466\n280\n98\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n167\n372\n560\n720\n857\n899\n894\n855\n785\n530\n217\n197\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n159\n262\n466\n507\n452\n465\n626\n898\n587\n534\n101\n62\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n59\n266\n415\n412\n295\n362\n248\n508\n845\n656\n294\n118\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n155\n337\n524\n728\n864\n967\n991\n954\n826\n649\n430\n249\n103\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n160\n332\n522\n717\n863\n877\n802\n912\n808\n656\n448\n207\n77\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n152\n339\n532\n735\n861\n739\n954\n950\n852\n636\n456\n238\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n141\n305\n535\n724\n868\n969\n1010\n937\n839\n699\n481\n268\n100\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n154\n340\n548\n735\n864\n975\n946\n751\n750\n412\n114\n102\n77\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n155\n340\n493\n641\n757\n828\n850\n811\n568\n478\n449\n266\n97\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n155\n325\n467\n714\n857\n945\n881\n595\n690\n566\n393\n118\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n98\n207\n298\n593\n637\n656\n700\n629\n202\n312\n114\n123\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n61\n185\n452\n584\n569\n796\n811\n555\n523\n466\n339\n248\n89\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n133\n169\n267\n258\n321\n376\n212\n316\n228\n167\n107\n79\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n71\n207\n309\n412\n432\n653\n868\n856\n744\n642\n446\n259\n87\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n140\n234\n505\n667\n852\n862\n855\n919\n840\n680\n467\n266\n84\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n2\n100\n218\n334\n316\n760\n179\n184\n354\n766\n629\n436\n255\n84\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n82\n178\n466\n516\n743\n453\n643\n711\n390\n224\n196\n153\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n112\n290\n500\n687\n810\n885\n913\n823\n736\n587\n413\n188\n57\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n102\n298\n502\n694\n826\n858\n888\n856\n754\n623\n438\n247\n84\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n96\n277\n294\n485\n656\n789\n860\n731\n763\n563\n329\n229\n68\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n96\n287\n498\n698\n771\n750\n727\n492\n744\n589\n417\n227\n68\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n107\n273\n485\n656\n792\n856\n850\n855\n534\n586\n479\n197\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n102\n283\n505\n679\n802\n891\n920\n868\n711\n627\n444\n221\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n100\n283\n495\n693\n847\n788\n883\n852\n743\n581\n441\n218\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n87\n279\n503\n689\n823\n939\n985\n936\n817\n638\n420\n215\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n96\n222\n451\n562\n748\n846\n419\n442\n687\n506\n391\n206\n59\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n100\n281\n485\n658\n791\n902\n928\n747\n776\n520\n374\n215\n50\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n81\n273\n484\n655\n798\n893\n897\n834\n673\n579\n400\n127\n47\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n71\n171\n180\n352\n242\n324\n276\n269\n393\n358\n242\n72\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n121\n339\n559\n765\n871\n663\n906\n949\n843\n702\n474\n194\n55\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n118\n331\n540\n729\n888\n917\n766\n697\n783\n620\n445\n202\n55\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n72\n259\n251\n458\n493\n670\n809\n833\n733\n592\n450\n222\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n105\n308\n538\n748\n878\n973\n997\n948\n831\n646\n465\n219\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n108\n313\n547\n734\n891\n973\n942\n893\n733\n650\n432\n207\n50\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n72\n239\n457\n580\n798\n902\n970\n915\n792\n609\n405\n186\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n51\n149\n411\n686\n825\n748\n848\n733\n636\n514\n329\n120\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n89\n256\n520\n658\n779\n824\n869\n733\n665\n471\n364\n174\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n71\n239\n504\n615\n711\n781\n492\n488\n711\n489\n227\n117\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n153\n271\n334\n408\n535\n493\n534\n433\n546\n286\n103\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n104\n253\n343\n605\n455\n542\n645\n438\n239\n229\n65\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n61\n134\n210\n312\n420\n649\n501\n533\n548\n448\n270\n155\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n88\n121\n252\n354\n482\n595\n547\n541\n646\n478\n323\n193\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n68\n288\n515\n516\n799\n963\n583\n829\n579\n553\n300\n159\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n109\n457\n588\n562\n578\n468\n693\n596\n327\n340\n128\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n56\n189\n373\n444\n560\n589\n615\n474\n600\n468\n137\n48\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n59\n135\n227\n270\n473\n477\n585\n640\n495\n357\n131\n120\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n72\n264\n491\n671\n799\n727\n609\n883\n709\n447\n371\n121\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n80\n280\n490\n703\n853\n938\n788\n805\n747\n564\n369\n61\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n211\n198\n230\n538\n611\n510\n760\n598\n455\n222\n140\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n145\n145\n633\n467\n600\n887\n766\n473\n362\n307\n138\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n130\n345\n316\n636\n555\n332\n381\n476\n334\n226\n129\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n237\n438\n513\n477\n451\n340\n415\n418\n297\n176\n79\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n72\n154\n241\n311\n269\n292\n428\n250\n192\n199\n96\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n128\n221\n378\n394\n448\n516\n444\n336\n528\n305\n123\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n61\n235\n442\n641\n779\n857\n678\n701\n696\n567\n311\n131\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n118\n221\n166\n388\n402\n498\n472\n335\n317\n128\n110\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n52\n79\n219\n337\n406\n409\n463\n419\n394\n330\n218\n95\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n146\n192\n336\n380\n726\n497\n547\n617\n518\n344\n127\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n255\n289\n440\n507\n814\n535\n757\n689\n351\n257\n132\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n47\n100\n214\n213\n415\n441\n475\n570\n615\n371\n190\n93\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n207\n417\n621\n765\n851\n849\n782\n566\n496\n288\n97\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n222\n449\n637\n789\n879\n894\n832\n700\n510\n303\n100\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n55\n248\n443\n555\n542\n842\n875\n713\n706\n474\n175\n97\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n90\n373\n367\n637\n698\n840\n801\n687\n505\n292\n98\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n224\n435\n632\n775\n672\n892\n806\n727\n537\n313\n104\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n228\n444\n644\n654\n392\n589\n790\n672\n444\n226\n70\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n104\n305\n342\n729\n739\n878\n853\n515\n297\n162\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n40\n223\n449\n611\n768\n852\n833\n669\n547\n454\n271\n89\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n192\n408\n609\n770\n868\n811\n753\n619\n441\n234\n70\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n142\n200\n310\n384\n397\n471\n500\n459\n466\n240\n86\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n111\n199\n255\n703\n817\n824\n762\n596\n428\n235\n68\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n40\n185\n368\n577\n460\n687\n795\n720\n336\n195\n200\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n208\n415\n609\n759\n814\n818\n705\n604\n437\n246\n64\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n213\n434\n616\n760\n841\n799\n752\n651\n462\n248\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n227\n451\n588\n709\n692\n769\n735\n504\n453\n161\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n86\n144\n187\n311\n435\n374\n522\n551\n381\n139\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n197\n403\n594\n594\n751\n792\n671\n524\n383\n234\n46\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n69\n183\n587\n694\n710\n766\n424\n571\n435\n223\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n218\n415\n605\n741\n806\n816\n748\n615\n445\n235\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n223\n404\n611\n732\n809\n816\n779\n634\n435\n236\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n213\n210\n355\n460\n382\n369\n468\n391\n354\n199\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n210\n284\n275\n490\n382\n554\n294\n262\n126\n67\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n67\n76\n530\n447\n696\n600\n300\n162\n347\n72\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n193\n405\n590\n702\n783\n802\n727\n598\n428\n205\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n210\n411\n574\n703\n784\n737\n662\n280\n376\n153\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n198\n393\n593\n704\n768\n756\n711\n587\n407\n198\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n104\n292\n527\n484\n688\n565\n248\n271\n232\n127\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n51\n159\n356\n519\n275\n302\n176\n111\n84\n89\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n78\n159\n104\n132\n145\n148\n292\n551\n244\n166\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n114\n221\n422\n469\n476\n646\n616\n531\n250\n121\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n97\n137\n111\n168\n172\n155\n129\n104\n355\n39\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n178\n375\n564\n678\n746\n745\n675\n546\n389\n178\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n179\n375\n546\n681\n748\n735\n681\n541\n369\n104\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n108\n238\n521\n664\n383\n439\n657\n347\n178\n76\n4\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n43\n68\n104\n124\n137\n140\n123\n103\n65\n51\n3\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n165\n362\n535\n655\n712\n680\n648\n511\n358\n149\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n170\n355\n425\n503\n395\n305\n263\n177\n323\n137\n1\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n92\n96\n138\n137\n133\n154\n177\n70\n46\n1\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n182\n509\n610\n699\n718\n653\n513\n336\n136\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n161\n348\n511\n642\n728\n721\n644\n520\n330\n135\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n152\n349\n492\n634\n713\n721\n554\n288\n322\n130\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n158\n342\n500\n508\n252\n610\n381\n337\n323\n129\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n137\n335\n506\n641\n693\n668\n621\n483\n304\n115\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n139\n336\n491\n624\n684\n667\n589\n487\n319\n120\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n141\n323\n483\n614\n669\n663\n626\n477\n291\n111\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n130\n313\n473\n586\n668\n666\n608\n449\n300\n111\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n126\n309\n455\n600\n682\n657\n592\n464\n280\n97\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n107\n302\n469\n590\n665\n650\n583\n431\n283\n106\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n116\n302\n456\n597\n636\n640\n578\n458\n283\n102\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n90\n276\n446\n563\n641\n613\n367\n264\n177\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n171\n162\n244\n59\n72\n148\n119\n76\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n62\n237\n493\n607\n613\n440\n432\n205\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n71\n182\n293\n398\n495\n541\n407\n203\n68\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n80\n246\n418\n545\n607\n600\n545\n425\n250\n73\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n152\n233\n349\n278\n335\n309\n214\n111\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n74\n114\n172\n368\n584\n441\n280\n248\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n67\n138\n121\n203\n216\n202\n131\n60\n1\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n122\n149\n275\n201\n563\n525\n355\n220\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n74\n264\n438\n563\n626\n611\n547\n391\n130\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n75\n258\n421\n539\n603\n566\n519\n402\n224\n62\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n69\n236\n411\n545\n616\n614\n541\n408\n232\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n222\n383\n505\n567\n564\n462\n372\n210\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n102\n159\n431\n568\n555\n457\n244\n121\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n166\n297\n353\n224\n210\n196\n100\n77\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n47\n267\n431\n620\n613\n552\n375\n246\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n59\n244\n417\n539\n604\n610\n531\n385\n175\n35\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n206\n159\n380\n527\n571\n516\n399\n143\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n167\n228\n296\n285\n417\n521\n385\n219\n50\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n235\n335\n462\n519\n561\n434\n323\n163\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n51\n228\n400\n527\n589\n587\n518\n392\n220\n47\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n58\n103\n230\n167\n140\n79\n36\n73\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n184\n207\n344\n275\n229\n188\n237\n149\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n218\n390\n517\n589\n587\n508\n308\n99\n22\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n45\n173\n266\n492\n542\n551\n399\n162\n102\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n71\n160\n270\n319\n248\n253\n209\n130\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n75\n141\n138\n260\n240\n121\n87\n124\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n36\n84\n87\n90\n74\n134\n100\n70\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n83\n160\n341\n508\n451\n333\n363\n210\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n195\n340\n497\n556\n557\n504\n385\n209\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n115\n182\n256\n320\n319\n264\n207\n84\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n74\n130\n167\n286\n174\n160\n122\n134\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n113\n338\n421\n500\n520\n375\n263\n163\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n180\n279\n479\n512\n561\n507\n370\n220\n53\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n113\n312\n477\n565\n451\n448\n340\n208\n53\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n174\n348\n482\n549\n556\n498\n380\n211\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n177\n308\n443\n224\n209\n446\n252\n173\n46\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n71\n115\n142\n275\n168\n146\n129\n67\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n108\n210\n295\n308\n292\n292\n321\n133\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n73\n192\n331\n375\n469\n358\n346\n90\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n55\n98\n138\n186\n161\n165\n114\n76\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n54\n154\n148\n162\n165\n146\n203\n105\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n176\n348\n484\n560\n567\n512\n397\n234\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n164\n339\n471\n547\n558\n503\n364\n199\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n107\n267\n407\n500\n511\n469\n359\n204\n53\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n118\n269\n422\n514\n380\n432\n230\n165\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n77\n158\n324\n203\n258\n215\n275\n82\n44\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n86\n122\n343\n163\n225\n174\n117\n66\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n151\n321\n456\n533\n546\n493\n383\n206\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n140\n305\n435\n517\n532\n441\n330\n196\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n139\n302\n440\n519\n503\n481\n363\n198\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n146\n316\n428\n515\n547\n460\n358\n229\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n60\n144\n115\n300\n228\n205\n172\n126\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n54\n98\n146\n173\n190\n171\n213\n81\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n80\n158\n231\n279\n285\n262\n190\n187\n42\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n137\n292\n327\n242\n270\n235\n249\n124\n46\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n77\n188\n290\n277\n361\n316\n275\n177\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n139\n312\n448\n530\n549\n503\n396\n237\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n147\n319\n459\n542\n561\n512\n403\n247\n72\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n150\n323\n461\n547\n532\n485\n221\n184\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n150\n321\n463\n548\n570\n525\n414\n231\n71\n0\n0\n0\n0\n0\n0\n0"
  },
  {
    "path": "src/pymgrid/data/pv/SanFrancisco_724940TYA.csv",
    "content": "GH illum (lx)\n0\n0\n0\n0\n0\n0\n0\n5\n126\n287\n403\n442\n442\n418\n358\n208\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n117\n278\n367\n468\n487\n393\n328\n205\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n113\n257\n369\n402\n441\n408\n298\n176\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n99\n172\n265\n427\n382\n423\n246\n171\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n105\n215\n387\n448\n500\n478\n364\n223\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n116\n266\n314\n268\n467\n421\n348\n234\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n55\n118\n230\n105\n226\n353\n253\n230\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n125\n292\n422\n506\n529\n438\n379\n211\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n121\n266\n392\n469\n519\n412\n348\n154\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n121\n264\n363\n430\n460\n418\n376\n224\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n109\n205\n403\n508\n412\n491\n374\n253\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n118\n278\n426\n512\n541\n456\n365\n110\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n56\n94\n120\n304\n464\n416\n331\n261\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n69\n163\n276\n398\n405\n445\n196\n266\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n60\n289\n78\n267\n232\n312\n168\n108\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n56\n211\n284\n237\n167\n96\n89\n127\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n2\n77\n120\n155\n317\n186\n155\n167\n146\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n26\n58\n85\n131\n340\n141\n167\n239\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n33\n140\n178\n237\n199\n96\n190\n56\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n30\n58\n85\n99\n105\n97\n97\n124\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n128\n261\n212\n440\n344\n476\n299\n171\n92\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n91\n199\n213\n200\n259\n191\n255\n133\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n35\n74\n133\n169\n112\n507\n307\n300\n135\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n153\n313\n448\n502\n571\n521\n411\n301\n128\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n95\n152\n393\n220\n234\n513\n87\n296\n100\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n44\n70\n191\n201\n267\n496\n421\n306\n121\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n155\n339\n472\n563\n591\n496\n405\n306\n134\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n157\n312\n437\n499\n545\n561\n466\n313\n89\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n165\n338\n448\n516\n525\n560\n464\n320\n146\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n4\n118\n277\n354\n367\n306\n316\n211\n181\n140\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n135\n164\n128\n215\n497\n502\n408\n324\n168\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n122\n339\n473\n586\n620\n576\n466\n305\n127\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n130\n320\n488\n548\n582\n509\n437\n278\n112\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n129\n326\n469\n560\n370\n547\n410\n303\n118\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n162\n304\n394\n410\n406\n347\n249\n162\n70\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n165\n316\n434\n452\n436\n309\n258\n162\n104\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n95\n143\n289\n523\n578\n559\n436\n317\n137\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n81\n158\n208\n303\n266\n259\n249\n168\n91\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n117\n137\n331\n184\n133\n303\n285\n249\n97\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n157\n310\n438\n413\n284\n372\n339\n250\n111\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n75\n126\n433\n541\n613\n467\n486\n315\n144\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n119\n178\n345\n522\n593\n577\n470\n323\n149\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n91\n228\n335\n537\n595\n562\n465\n340\n154\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n121\n168\n317\n482\n575\n392\n431\n273\n112\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n207\n406\n559\n664\n689\n645\n536\n368\n180\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n201\n392\n529\n610\n642\n616\n512\n363\n181\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n180\n373\n484\n602\n589\n502\n477\n231\n112\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n121\n252\n394\n467\n567\n576\n445\n302\n142\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n61\n234\n430\n556\n691\n705\n675\n573\n413\n216\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n102\n171\n398\n477\n523\n600\n512\n399\n190\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n123\n192\n270\n244\n200\n324\n249\n104\n94\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n124\n137\n299\n377\n227\n441\n399\n245\n130\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n67\n233\n427\n581\n496\n751\n537\n508\n283\n107\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n61\n162\n286\n392\n516\n544\n625\n544\n386\n189\n45\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n74\n254\n383\n567\n533\n396\n473\n353\n279\n160\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n74\n259\n456\n609\n719\n747\n684\n558\n395\n183\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n89\n294\n488\n608\n589\n659\n561\n514\n403\n196\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n85\n273\n447\n621\n745\n743\n674\n540\n355\n215\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n67\n193\n183\n453\n458\n684\n600\n547\n426\n225\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n63\n108\n251\n733\n728\n708\n597\n400\n192\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n93\n262\n440\n525\n711\n735\n688\n578\n393\n196\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n103\n179\n313\n553\n635\n739\n661\n442\n430\n193\n48\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n79\n314\n425\n671\n674\n629\n270\n329\n118\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n61\n218\n164\n214\n420\n252\n502\n424\n358\n202\n43\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n114\n260\n498\n652\n694\n755\n735\n636\n471\n261\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n131\n343\n537\n698\n794\n786\n728\n604\n461\n253\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n100\n206\n488\n657\n732\n758\n709\n583\n388\n206\n60\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n64\n107\n172\n399\n685\n574\n576\n542\n273\n244\n72\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n39\n96\n150\n226\n256\n265\n249\n213\n157\n77\n50\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n111\n300\n501\n667\n739\n766\n687\n589\n412\n223\n67\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n154\n369\n579\n743\n821\n841\n773\n645\n512\n291\n83\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n155\n372\n577\n694\n751\n656\n707\n682\n495\n290\n81\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n135\n330\n516\n657\n753\n594\n717\n617\n468\n221\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n118\n352\n534\n679\n773\n541\n579\n390\n291\n267\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n95\n223\n160\n481\n500\n396\n555\n578\n307\n237\n87\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n160\n354\n557\n680\n815\n783\n725\n626\n266\n117\n59\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n147\n227\n432\n359\n532\n430\n598\n532\n484\n322\n99\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n177\n401\n598\n730\n683\n828\n754\n699\n518\n311\n100\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n200\n421\n630\n762\n848\n868\n813\n695\n545\n324\n111\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n65\n122\n423\n414\n753\n778\n745\n657\n452\n200\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n155\n294\n498\n563\n448\n689\n764\n454\n536\n300\n104\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n76\n157\n238\n299\n335\n711\n509\n274\n248\n116\n59\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n93\n303\n295\n298\n335\n279\n261\n273\n163\n95\n50\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n37\n183\n285\n555\n632\n703\n848\n418\n374\n425\n311\n102\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n176\n346\n525\n733\n826\n845\n789\n688\n499\n282\n97\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n66\n112\n636\n763\n857\n876\n819\n692\n508\n304\n104\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n220\n386\n438\n623\n786\n866\n816\n656\n502\n343\n131\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n187\n316\n552\n632\n445\n614\n559\n292\n180\n111\n43\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n249\n478\n664\n807\n745\n799\n840\n692\n576\n354\n131\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n243\n473\n662\n818\n903\n867\n791\n729\n499\n312\n126\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n55\n243\n460\n641\n803\n872\n904\n849\n730\n486\n397\n186\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n271\n478\n664\n827\n924\n856\n880\n738\n565\n393\n182\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n47\n264\n461\n640\n745\n845\n818\n809\n730\n346\n273\n199\n4\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n89\n147\n211\n332\n766\n860\n789\n672\n443\n247\n162\n3\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n98\n228\n373\n406\n534\n447\n422\n388\n376\n237\n208\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n139\n322\n420\n590\n900\n844\n801\n683\n458\n409\n193\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n262\n495\n656\n693\n899\n939\n821\n586\n305\n264\n169\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n100\n148\n290\n272\n365\n296\n313\n272\n473\n253\n166\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n133\n262\n529\n815\n898\n955\n911\n773\n622\n406\n198\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n84\n259\n528\n721\n831\n697\n548\n684\n615\n618\n378\n213\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n83\n275\n304\n489\n399\n489\n687\n651\n718\n398\n284\n182\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n73\n310\n184\n453\n617\n897\n573\n404\n271\n260\n218\n143\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n288\n541\n682\n488\n871\n977\n840\n743\n502\n309\n224\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n115\n335\n540\n701\n691\n904\n931\n917\n795\n635\n415\n211\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n156\n374\n563\n568\n610\n414\n710\n442\n389\n146\n121\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n60\n95\n130\n568\n250\n186\n185\n191\n189\n132\n145\n163\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n172\n548\n742\n868\n942\n993\n940\n814\n636\n441\n216\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n136\n355\n566\n749\n902\n966\n1001\n900\n764\n600\n427\n227\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n111\n323\n526\n771\n888\n992\n959\n946\n810\n641\n431\n224\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n142\n362\n559\n767\n896\n972\n981\n948\n809\n642\n447\n165\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n61\n126\n264\n344\n503\n542\n548\n520\n278\n220\n153\n139\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n3\n47\n113\n154\n520\n810\n932\n980\n954\n830\n656\n423\n229\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n7\n154\n351\n576\n734\n873\n911\n921\n925\n757\n613\n411\n253\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n160\n383\n603\n780\n860\n930\n929\n955\n725\n530\n399\n251\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n95\n348\n283\n451\n516\n747\n527\n469\n330\n351\n186\n168\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n163\n364\n567\n717\n854\n937\n937\n943\n832\n659\n456\n254\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n5\n119\n164\n246\n370\n492\n270\n464\n470\n402\n408\n333\n262\n36\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n173\n397\n608\n781\n915\n1020\n920\n875\n779\n587\n445\n261\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n179\n402\n587\n786\n912\n1021\n924\n929\n794\n635\n433\n258\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n179\n404\n609\n795\n934\n1023\n938\n972\n823\n647\n455\n250\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n143\n340\n555\n717\n877\n940\n946\n906\n776\n619\n395\n185\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n141\n389\n594\n754\n881\n939\n988\n929\n803\n645\n422\n212\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n185\n408\n636\n782\n885\n810\n995\n954\n803\n672\n441\n205\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n183\n410\n612\n813\n949\n968\n1018\n972\n842\n622\n431\n221\n44\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n112\n303\n570\n679\n726\n829\n939\n870\n762\n508\n374\n149\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n128\n332\n578\n729\n890\n936\n849\n853\n674\n520\n325\n171\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n199\n393\n624\n747\n898\n960\n947\n913\n838\n565\n393\n220\n53\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n71\n209\n512\n652\n497\n932\n840\n893\n779\n692\n412\n229\n52\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n123\n424\n649\n825\n941\n1021\n1027\n970\n856\n689\n494\n259\n63\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n142\n350\n567\n735\n901\n986\n992\n871\n798\n636\n413\n200\n47\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n156\n193\n539\n748\n656\n862\n952\n871\n798\n631\n396\n221\n54\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n188\n398\n620\n812\n921\n996\n1003\n900\n824\n628\n436\n234\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n195\n320\n491\n692\n811\n930\n813\n919\n676\n570\n355\n158\n69\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n67\n130\n201\n262\n575\n594\n332\n262\n328\n214\n144\n75\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n87\n148\n204\n266\n313\n338\n340\n320\n278\n218\n160\n100\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n85\n141\n202\n264\n687\n535\n338\n317\n276\n255\n152\n96\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n69\n139\n209\n268\n310\n333\n336\n316\n278\n221\n153\n82\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n66\n136\n206\n453\n589\n725\n644\n751\n593\n509\n369\n190\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n191\n415\n599\n775\n912\n972\n974\n836\n814\n612\n424\n246\n67\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n180\n382\n548\n766\n877\n945\n930\n891\n800\n634\n369\n171\n55\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n69\n138\n208\n267\n779\n774\n336\n894\n559\n375\n153\n82\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n160\n398\n589\n790\n872\n972\n978\n934\n596\n634\n457\n266\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n239\n460\n683\n834\n959\n1025\n1033\n979\n867\n705\n511\n282\n87\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n188\n395\n619\n789\n896\n1000\n1007\n943\n793\n660\n442\n231\n68\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n217\n388\n603\n806\n942\n1004\n1027\n965\n872\n691\n417\n247\n73\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n111\n224\n536\n666\n655\n570\n541\n321\n283\n228\n161\n90\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n48\n203\n420\n607\n787\n919\n940\n1011\n988\n862\n683\n470\n260\n78\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n45\n197\n426\n494\n576\n719\n662\n861\n758\n690\n672\n488\n240\n86\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n79\n150\n218\n789\n906\n970\n914\n931\n821\n707\n495\n279\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n163\n414\n649\n838\n944\n1020\n1028\n968\n877\n665\n418\n225\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n46\n213\n443\n663\n827\n964\n1040\n1047\n987\n865\n713\n475\n273\n87\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n61\n217\n436\n657\n780\n816\n962\n941\n885\n783\n561\n322\n268\n92\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n246\n470\n665\n833\n954\n1021\n1029\n977\n870\n712\n528\n302\n104\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n55\n226\n434\n652\n840\n932\n1009\n1017\n960\n871\n699\n486\n272\n90\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n52\n208\n427\n625\n812\n950\n1028\n1038\n977\n854\n679\n488\n263\n85\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n223\n441\n658\n820\n955\n1032\n1041\n983\n862\n713\n501\n281\n96\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n52\n203\n415\n612\n800\n941\n1018\n1029\n970\n847\n672\n483\n261\n85\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n51\n199\n399\n611\n764\n900\n774\n811\n957\n816\n668\n458\n250\n84\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n55\n206\n398\n645\n834\n938\n1015\n1025\n967\n881\n705\n494\n285\n94\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n56\n226\n434\n652\n841\n948\n1025\n1035\n978\n889\n712\n501\n291\n96\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n218\n424\n641\n829\n935\n1049\n1059\n1001\n878\n676\n468\n283\n94\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n59\n230\n451\n670\n834\n972\n1050\n1060\n1003\n883\n711\n521\n296\n106\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n186\n367\n615\n809\n906\n996\n978\n952\n785\n522\n397\n156\n72\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n81\n129\n418\n692\n776\n878\n701\n918\n826\n619\n451\n250\n86\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n56\n230\n419\n640\n809\n893\n1006\n1016\n941\n854\n680\n449\n267\n100\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n74\n116\n176\n228\n778\n972\n1007\n908\n815\n650\n423\n177\n80\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n63\n122\n349\n230\n267\n287\n290\n276\n245\n234\n169\n191\n52\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n212\n386\n616\n732\n941\n1048\n952\n857\n833\n683\n498\n290\n101\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n62\n245\n460\n677\n827\n951\n1021\n1031\n983\n877\n748\n539\n324\n120\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n64\n205\n421\n627\n730\n839\n984\n959\n935\n794\n631\n494\n289\n95\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n64\n123\n181\n230\n314\n464\n937\n883\n850\n549\n459\n195\n59\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n104\n315\n388\n550\n851\n962\n885\n910\n773\n699\n306\n249\n107\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n228\n423\n661\n831\n955\n1024\n1036\n989\n885\n733\n555\n330\n127\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n225\n446\n644\n823\n968\n958\n963\n969\n875\n557\n493\n306\n94\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n74\n212\n501\n714\n866\n866\n891\n892\n447\n429\n395\n213\n83\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n71\n139\n208\n267\n311\n336\n788\n990\n840\n604\n308\n187\n72\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n31\n62\n114\n204\n265\n309\n335\n339\n322\n285\n231\n165\n94\n50\n6\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n117\n371\n461\n683\n711\n832\n886\n965\n872\n673\n545\n291\n117\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n66\n218\n466\n660\n830\n954\n1025\n1038\n992\n889\n738\n546\n336\n131\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n179\n377\n594\n788\n902\n984\n995\n877\n856\n684\n473\n265\n94\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n53\n223\n443\n644\n833\n929\n1000\n1013\n967\n902\n732\n528\n307\n114\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n47\n204\n410\n628\n822\n966\n1050\n1028\n1014\n895\n720\n511\n300\n106\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n210\n428\n646\n814\n953\n1034\n1051\n996\n880\n736\n516\n289\n102\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n118\n197\n281\n550\n763\n695\n399\n825\n599\n502\n326\n197\n66\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n179\n292\n528\n806\n879\n962\n1030\n965\n864\n695\n510\n272\n90\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n49\n229\n390\n646\n793\n892\n1000\n1017\n974\n875\n686\n548\n314\n122\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n197\n427\n639\n826\n964\n1047\n1069\n1014\n896\n725\n484\n280\n96\n10\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n87\n195\n385\n342\n657\n783\n935\n887\n781\n613\n382\n223\n33\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n65\n238\n378\n631\n838\n960\n993\n959\n823\n689\n521\n314\n114\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n102\n250\n436\n528\n779\n744\n873\n970\n870\n723\n546\n324\n123\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n45\n224\n442\n664\n818\n948\n1023\n1037\n993\n888\n736\n554\n327\n123\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n122\n226\n286\n517\n782\n847\n926\n875\n784\n615\n452\n198\n66\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n119\n330\n541\n756\n882\n1049\n1055\n1006\n890\n723\n535\n310\n113\n16\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n204\n424\n631\n822\n923\n998\n1013\n968\n905\n734\n525\n314\n112\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n172\n393\n608\n800\n914\n1003\n1023\n967\n886\n717\n508\n297\n100\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n78\n266\n467\n652\n824\n959\n945\n931\n846\n608\n427\n223\n55\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n151\n278\n307\n305\n716\n997\n876\n942\n818\n649\n484\n264\n62\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n120\n167\n323\n297\n548\n894\n735\n905\n827\n647\n489\n280\n98\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n56\n161\n305\n271\n383\n637\n555\n631\n560\n498\n353\n209\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n56\n215\n230\n446\n870\n955\n1037\n985\n873\n705\n494\n283\n93\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n63\n273\n535\n745\n860\n929\n1007\n972\n853\n714\n531\n309\n110\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n39\n202\n420\n644\n802\n932\n1008\n1023\n979\n875\n720\n538\n311\n109\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n199\n416\n641\n801\n934\n1010\n1026\n984\n881\n725\n533\n293\n100\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n153\n322\n474\n772\n882\n926\n951\n903\n857\n726\n511\n303\n101\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n76\n336\n573\n792\n922\n996\n1011\n972\n867\n716\n528\n285\n97\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n195\n416\n623\n796\n933\n1010\n1026\n981\n879\n725\n531\n313\n107\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n100\n241\n542\n776\n935\n932\n984\n933\n857\n686\n505\n263\n87\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n144\n351\n541\n762\n906\n946\n953\n907\n823\n641\n461\n253\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n113\n167\n456\n308\n352\n777\n929\n881\n838\n672\n478\n201\n91\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n59\n249\n515\n742\n850\n856\n953\n935\n792\n593\n440\n228\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n152\n328\n576\n641\n844\n882\n1003\n947\n794\n660\n478\n258\n78\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n66\n171\n253\n341\n377\n470\n473\n430\n608\n391\n276\n95\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n59\n156\n376\n648\n703\n828\n910\n837\n721\n564\n419\n260\n75\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n141\n346\n551\n746\n898\n988\n1009\n954\n837\n664\n470\n243\n71\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n173\n391\n618\n782\n916\n993\n1011\n964\n860\n703\n514\n282\n84\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n133\n334\n594\n777\n909\n979\n998\n952\n855\n698\n513\n283\n84\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n169\n350\n573\n755\n908\n983\n990\n951\n796\n635\n385\n198\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n147\n370\n592\n757\n891\n973\n984\n938\n836\n700\n371\n198\n67\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n133\n342\n547\n711\n815\n942\n974\n940\n831\n653\n409\n222\n58\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n102\n290\n529\n732\n854\n943\n965\n909\n775\n610\n393\n210\n46\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n144\n315\n511\n585\n804\n790\n709\n630\n816\n634\n470\n250\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n117\n329\n556\n729\n885\n975\n974\n930\n821\n668\n452\n240\n57\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n140\n306\n580\n765\n898\n977\n996\n946\n836\n682\n482\n262\n66\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n19\n128\n327\n544\n750\n895\n947\n970\n919\n826\n653\n438\n227\n51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n74\n156\n378\n707\n893\n949\n961\n908\n823\n649\n433\n222\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n65\n156\n261\n494\n483\n879\n908\n850\n776\n647\n433\n195\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n86\n144\n155\n252\n370\n529\n684\n682\n757\n486\n208\n131\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n42\n106\n223\n356\n408\n652\n761\n606\n634\n510\n283\n192\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n49\n121\n223\n348\n358\n434\n679\n824\n766\n610\n446\n216\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n121\n324\n548\n747\n871\n960\n975\n871\n739\n598\n422\n204\n42\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n98\n242\n486\n560\n458\n680\n628\n854\n781\n623\n236\n123\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n92\n300\n552\n691\n881\n954\n976\n925\n812\n648\n452\n222\n46\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n96\n295\n485\n673\n757\n898\n859\n865\n732\n622\n407\n199\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n24\n133\n488\n750\n864\n946\n958\n905\n740\n435\n374\n160\n39\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n55\n116\n536\n689\n778\n912\n821\n800\n725\n479\n299\n142\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n81\n256\n457\n630\n804\n860\n867\n845\n733\n558\n350\n151\n25\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n58\n131\n229\n317\n519\n709\n881\n756\n655\n568\n368\n166\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n45\n140\n375\n508\n760\n881\n903\n912\n781\n603\n403\n180\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n70\n220\n453\n682\n805\n875\n903\n856\n726\n566\n347\n146\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n101\n258\n462\n727\n882\n928\n939\n887\n795\n609\n402\n175\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n83\n247\n404\n602\n701\n390\n602\n252\n333\n164\n180\n68\n21\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n82\n263\n367\n599\n737\n816\n684\n686\n547\n492\n275\n126\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n91\n275\n482\n704\n821\n819\n885\n838\n754\n553\n326\n137\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n70\n234\n456\n646\n786\n879\n860\n836\n734\n549\n345\n134\n13\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n83\n233\n441\n667\n728\n861\n879\n766\n746\n582\n360\n142\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n81\n283\n494\n694\n844\n928\n904\n874\n742\n556\n336\n132\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n88\n286\n511\n690\n836\n918\n929\n866\n737\n571\n350\n139\n11\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n73\n204\n282\n512\n742\n844\n861\n804\n696\n510\n330\n118\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n71\n233\n448\n659\n807\n892\n901\n837\n704\n536\n311\n111\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n28\n80\n416\n598\n767\n661\n817\n781\n693\n501\n300\n131\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n169\n280\n660\n828\n904\n912\n854\n734\n575\n333\n91\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n81\n276\n472\n663\n777\n830\n849\n793\n645\n546\n333\n126\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n76\n281\n501\n639\n806\n890\n897\n839\n717\n553\n331\n119\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n78\n280\n449\n598\n829\n878\n877\n818\n682\n439\n325\n110\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n51\n195\n310\n663\n821\n901\n909\n842\n707\n535\n311\n105\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n165\n168\n227\n783\n881\n887\n820\n683\n494\n287\n88\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n261\n440\n665\n809\n888\n895\n827\n692\n520\n296\n94\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n60\n246\n454\n651\n797\n878\n884\n814\n677\n486\n280\n82\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n69\n270\n487\n644\n711\n766\n771\n784\n504\n463\n244\n65\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n51\n238\n439\n514\n731\n869\n873\n805\n670\n498\n277\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n26\n203\n299\n594\n543\n711\n798\n722\n444\n357\n120\n64\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n169\n446\n661\n792\n861\n864\n755\n643\n484\n235\n80\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n21\n72\n133\n592\n760\n850\n853\n790\n684\n493\n273\n74\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n66\n315\n524\n734\n837\n812\n752\n648\n475\n255\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n145\n342\n634\n752\n817\n736\n672\n603\n411\n213\n50\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n86\n184\n211\n522\n710\n559\n609\n462\n251\n106\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n52\n234\n441\n637\n778\n842\n808\n736\n557\n424\n142\n59\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n71\n115\n168\n208\n827\n799\n726\n589\n415\n203\n44\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n53\n104\n248\n763\n837\n838\n765\n626\n450\n231\n45\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n67\n149\n451\n619\n757\n688\n656\n560\n274\n194\n47\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n161\n248\n343\n399\n766\n613\n610\n572\n376\n210\n38\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n146\n330\n610\n727\n799\n799\n727\n608\n417\n204\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n222\n413\n578\n745\n775\n802\n760\n619\n428\n219\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n39\n77\n112\n154\n169\n211\n219\n199\n183\n121\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n141\n239\n311\n686\n795\n824\n729\n583\n392\n240\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n214\n422\n599\n687\n731\n782\n733\n628\n443\n241\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n213\n407\n571\n665\n710\n704\n651\n573\n414\n233\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n208\n408\n572\n659\n760\n762\n689\n555\n385\n217\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n27\n172\n367\n340\n615\n634\n762\n706\n565\n378\n218\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n95\n217\n217\n386\n587\n473\n433\n312\n374\n122\n7\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n125\n217\n200\n469\n471\n724\n643\n557\n400\n213\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n23\n193\n394\n572\n708\n772\n732\n656\n507\n397\n212\n12\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n178\n382\n531\n642\n690\n687\n632\n512\n358\n202\n9\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n155\n384\n539\n637\n685\n765\n688\n532\n357\n191\n8\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n65\n308\n227\n398\n335\n695\n633\n512\n155\n107\n3\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n8\n84\n163\n204\n221\n306\n679\n627\n374\n326\n204\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n171\n353\n528\n622\n662\n726\n667\n515\n369\n180\n5\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n165\n349\n527\n607\n671\n734\n652\n537\n363\n169\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n169\n352\n548\n651\n696\n720\n652\n472\n355\n156\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n163\n364\n535\n658\n728\n725\n637\n532\n359\n162\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n84\n206\n285\n392\n406\n568\n632\n473\n195\n154\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n157\n354\n525\n645\n712\n685\n611\n457\n325\n121\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n148\n336\n484\n582\n608\n591\n564\n452\n316\n148\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n142\n299\n448\n549\n579\n585\n478\n412\n274\n150\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n52\n109\n155\n256\n460\n400\n435\n486\n286\n112\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n1\n58\n139\n404\n599\n600\n608\n374\n414\n278\n90\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n61\n128\n138\n311\n315\n654\n562\n468\n239\n131\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n135\n313\n443\n569\n638\n589\n577\n455\n309\n102\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n126\n314\n453\n546\n620\n558\n569\n433\n276\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n100\n274\n165\n137\n232\n588\n346\n211\n109\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n127\n136\n506\n334\n269\n233\n354\n189\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n119\n308\n451\n525\n565\n557\n576\n421\n281\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n117\n308\n475\n573\n640\n634\n580\n450\n289\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n99\n218\n465\n359\n453\n339\n145\n180\n90\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n112\n294\n458\n577\n623\n635\n556\n427\n262\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n106\n274\n472\n582\n645\n634\n561\n432\n278\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n102\n269\n89\n481\n347\n117\n282\n356\n61\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n32\n109\n319\n371\n360\n387\n424\n241\n125\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n79\n278\n320\n493\n611\n565\n551\n426\n264\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n56\n140\n227\n467\n509\n361\n366\n165\n126\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n75\n107\n433\n513\n549\n490\n247\n321\n206\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n83\n82\n103\n117\n108\n99\n74\n85\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n57\n134\n82\n171\n116\n418\n409\n182\n151\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n49\n154\n153\n311\n305\n396\n336\n212\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n38\n128\n132\n122\n215\n267\n253\n158\n142\n26\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n63\n237\n376\n474\n558\n492\n511\n158\n109\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n62\n95\n360\n468\n491\n489\n511\n391\n217\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n63\n221\n315\n367\n444\n461\n434\n307\n169\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n43\n152\n202\n330\n372\n360\n411\n230\n175\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n34\n102\n200\n380\n428\n460\n376\n192\n148\n23\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n44\n213\n371\n471\n476\n493\n483\n343\n211\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n54\n180\n362\n461\n513\n473\n362\n197\n159\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n52\n221\n380\n488\n543\n465\n486\n360\n202\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n50\n215\n351\n454\n485\n501\n487\n354\n222\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n42\n198\n365\n472\n542\n501\n434\n337\n210\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n41\n188\n295\n473\n540\n529\n470\n273\n222\n30\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n40\n189\n337\n419\n458\n480\n408\n320\n217\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n40\n207\n355\n410\n456\n450\n443\n308\n202\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n6\n101\n164\n347\n420\n252\n174\n119\n149\n20\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n180\n328\n413\n443\n381\n324\n225\n118\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n36\n108\n337\n429\n509\n441\n408\n318\n183\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n33\n170\n324\n397\n513\n445\n465\n351\n207\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n30\n184\n319\n398\n425\n425\n326\n310\n156\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n29\n177\n336\n404\n497\n430\n422\n333\n155\n18\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n35\n182\n328\n459\n524\n527\n463\n342\n179\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n143\n265\n364\n436\n478\n309\n132\n116\n32\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n136\n144\n252\n170\n170\n148\n108\n57\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n25\n125\n292\n202\n229\n269\n258\n102\n122\n15\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n98\n173\n183\n171\n213\n201\n259\n78\n17\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n74\n165\n140\n263\n231\n242\n175\n105\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n59\n111\n150\n231\n338\n331\n194\n120\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n75\n181\n263\n274\n386\n323\n256\n119\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n22\n153\n296\n434\n475\n470\n437\n316\n165\n27\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n24\n158\n278\n448\n514\n517\n441\n338\n175\n31\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n148\n305\n430\n499\n502\n440\n318\n167\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n18\n122\n227\n387\n428\n472\n362\n274\n143\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n126\n253\n360\n420\n413\n388\n118\n101\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n49\n98\n138\n294\n292\n328\n158\n123\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n20\n149\n278\n342\n474\n451\n403\n304\n133\n24\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n17\n51\n278\n319\n343\n338\n396\n308\n156\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n52\n182\n198\n306\n170\n151\n96\n63\n14\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n62\n209\n386\n420\n443\n350\n300\n152\n28\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n137\n289\n422\n495\n481\n444\n326\n176\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n81\n164\n191\n165\n282\n285\n164\n103\n19\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n111\n239\n355\n349\n424\n378\n279\n127\n29\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n141\n307\n433\n496\n435\n435\n338\n167\n37\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n16\n141\n308\n435\n508\n518\n463\n337\n191\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n120\n275\n381\n450\n488\n439\n322\n169\n34\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n15\n138\n305\n435\n509\n520\n466\n353\n194\n41\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n10\n115\n262\n392\n470\n481\n425\n312\n169\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n14\n115\n271\n327\n422\n491\n444\n317\n184\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n9\n102\n238\n374\n431\n448\n400\n302\n156\n33\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n12\n127\n269\n393\n441\n486\n413\n317\n183\n40\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n13\n101\n165\n290\n437\n216\n196\n152\n185\n49\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n11\n115\n119\n254\n397\n329\n291\n250\n125\n26\n0\n0\n0\n0\n0\n0\n0"
  },
  {
    "path": "src/pymgrid/data/pv/__init__.py",
    "content": ""
  },
  {
    "path": "src/pymgrid/data/scenario/__init__.py",
    "content": "\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_0/microgrid_0.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 1452\n      max_charge: 363\n      max_discharge: 363\n      min_capacity: 290.40000000000003\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 290.40000000000003\n      soc: 0.2\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 1920\n      max_import: 1920\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_1/microgrid_1.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 60363.0\n      running_min_production: 3353.5\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 91274\n      max_charge: 22819\n      max_discharge: 22819\n      min_capacity: 18254.8\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 18254.8\n      soc: 0.19999999999999998\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 120726\n      max_import: 120726\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_10/microgrid_10.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 60144.3\n      running_min_production: 3341.3500000000004\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 219201\n      max_charge: 54801\n      max_discharge: 54801\n      min_capacity: 43840.200000000004\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 43840.200000000004\n      soc: 0.2\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 120288\n      max_import: 120288\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_11/microgrid_11.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 1\n      initial_step: 0\n      max_capacity: 69594\n      max_charge: 17399\n      max_discharge: 17399\n      min_capacity: 13918.800000000001\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 69594\n      soc: 1.0\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 55230\n      max_import: 55230\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_12/microgrid_12.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 143726\n      max_charge: 35932\n      max_discharge: 35932\n      min_capacity: 28745.2\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 28745.2\n      soc: 0.2\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 96428\n      max_import: 96428\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_13/microgrid_13.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 19941.3\n      running_min_production: 1107.8500000000001\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 47556\n      max_charge: 11889\n      max_discharge: 11889\n      min_capacity: 9511.2\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 9511.2\n      soc: 0.2\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 39882\n      max_import: 39882\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_14/microgrid_14.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 162570\n      max_charge: 40643\n      max_discharge: 40643\n      min_capacity: 32514.0\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 32514.0\n      soc: 0.2\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 197286\n      max_import: 197286\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_15/microgrid_15.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 17296.2\n      running_min_production: 960.9000000000001\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 1\n      initial_step: 0\n      max_capacity: 26153\n      max_charge: 6539\n      max_discharge: 6539\n      min_capacity: 5230.6\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 26153\n      soc: 1.0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_16/microgrid_16.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.534118811938557\n      initial_step: 0\n      max_capacity: 60099\n      max_charge: 15025\n      max_discharge: 15025\n      min_capacity: 12019.800000000001\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 32100.00647869534\n      soc: 0.534118811938557\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 97244\n      max_import: 97244\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_17/microgrid_17.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 31257.0\n      running_min_production: 1736.5\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 38636\n      max_charge: 9659\n      max_discharge: 9659\n      min_capacity: 7727.200000000001\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 7727.200000000001\n      soc: 0.2\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_18/microgrid_18.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 34418.700000000004\n      running_min_production: 1912.15\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 1\n      initial_step: 0\n      max_capacity: 82080\n      max_charge: 20520\n      max_discharge: 20520\n      min_capacity: 16416.0\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 82080\n      soc: 1.0\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 68836\n      max_import: 68836\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_19/microgrid_19.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 1529.1000000000001\n      running_min_production: 84.95\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 2506\n      max_charge: 627\n      max_discharge: 627\n      min_capacity: 501.20000000000005\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 501.20000000000005\n      soc: 0.2\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_2/microgrid_2.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 43725.6\n      running_min_production: 2429.2000000000003\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 66116\n      max_charge: 16529\n      max_discharge: 16529\n      min_capacity: 13223.2\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 13223.2\n      soc: 0.2\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_20/microgrid_20.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 79186.5\n      running_min_production: 4399.25\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 129765\n      max_charge: 32442\n      max_discharge: 32442\n      min_capacity: 25953.0\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 25953.0\n      soc: 0.2\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_21/microgrid_21.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 95435.1\n      running_min_production: 5301.950000000001\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 170694\n      max_charge: 42674\n      max_discharge: 42674\n      min_capacity: 34138.8\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 34138.8\n      soc: 0.2\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_22/microgrid_22.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 80372.7\n      running_min_production: 4465.150000000001\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 292924\n      max_charge: 73231\n      max_discharge: 73231\n      min_capacity: 58584.8\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 58584.8\n      soc: 0.2\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 160744\n      max_import: 160744\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_23/microgrid_23.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 9453.6\n      running_min_production: 525.2\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 14294\n      max_charge: 3574\n      max_discharge: 3574\n      min_capacity: 2858.8\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 2858.8\n      soc: 0.2\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_24/microgrid_24.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 50157.0\n      running_min_production: 2786.5\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 103328\n      max_charge: 25832\n      max_discharge: 25832\n      min_capacity: 20665.600000000002\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 20665.600000000002\n      soc: 0.2\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 100314\n      max_import: 100314\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_3/microgrid_3.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 78147.0\n      running_min_production: 4341.5\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 102450\n      max_charge: 25613\n      max_discharge: 25613\n      min_capacity: 20490.0\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 20490.0\n      soc: 0.2\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_4/microgrid_4.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 65305\n      max_charge: 16327\n      max_discharge: 16327\n      min_capacity: 13061.0\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 13061.0\n      soc: 0.2\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 99625\n      max_import: 99625\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_5/microgrid_5.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 28560.600000000002\n      running_min_production: 1586.7\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 1\n      initial_step: 0\n      max_capacity: 57581\n      max_charge: 14396\n      max_discharge: 14396\n      min_capacity: 11516.2\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 57581\n      soc: 1.0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_6/microgrid_6.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.960305168086668\n      initial_step: 0\n      max_capacity: 179373\n      max_charge: 44844\n      max_discharge: 44844\n      min_capacity: 35874.6\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 172252.8189152099\n      soc: 0.960305168086668\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 98432\n      max_import: 98432\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_7/microgrid_7.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 11798.1\n      running_min_production: 655.45\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 1\n      initial_step: 0\n      max_capacity: 19334\n      max_charge: 4834\n      max_discharge: 4834\n      min_capacity: 3866.8\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 19334\n      soc: 1.0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_8/microgrid_8.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 64065.6\n      running_min_production: 3559.2000000000003\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.2\n      initial_step: 0\n      max_capacity: 105583\n      max_charge: 26396\n      max_discharge: 26396\n      min_capacity: 21116.600000000002\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 21116.600000000002\n      soc: 0.2\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 128130\n      max_import: 128130\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/data/scenario/pymgrid25/microgrid_9/microgrid_9.yaml",
    "content": "!Microgrid\nfinal_step: 8759\ninitial_step: 0\nmodules:\n- - load\n  - !LoadModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/LoadModule/time_series.csv.gz'\n    name:\n    - load\n    - 0\n    state:\n      _current_step: 0\n- - pv\n  - !RenewableModule\n    cls_params:\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      provided_energy_name: renewable_used\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/RenewableModule/time_series.csv.gz'\n    name:\n    - pv\n    - 0\n    state:\n      _current_step: 0\n- - unbalanced_energy\n  - !UnbalancedEnergyModule\n    cls_params:\n      initial_step: 0\n      loss_load_cost: 10\n      overgeneration_cost: 1\n      raise_errors: false\n    name:\n    - unbalanced_energy\n    - 0\n    state:\n      _current_step: 0\n- - genset\n  - !Genset\n    cls_params:\n      allow_abortion: true\n      co2_per_unit: 2\n      cost_per_unit_co2: 0.1\n      genset_cost: 0.4\n      init_start_up: true\n      initial_step: 0\n      provided_energy_name: genset_production\n      raise_errors: false\n      running_max_production: 98996.40000000001\n      running_min_production: 5499.8\n      start_up_time: 0\n      wind_down_time: 0\n    name:\n    - genset\n    - 0\n    state:\n      _current_status: true\n      _current_step: 0\n      _goal_status: true\n      _steps_until_down: 0\n      _steps_until_up: 0\n- - battery\n  - !BatteryModule\n    cls_params:\n      battery_cost_cycle: 0.02\n      battery_transition_model: null\n      efficiency: 0.9\n      init_charge: null\n      init_soc: 0.5374787046064285\n      initial_step: 0\n      max_capacity: 199587\n      max_charge: 49897\n      max_discharge: 49897\n      min_capacity: 39917.4\n      raise_errors: false\n    name:\n    - battery\n    - 0\n    state:\n      _current_step: 0\n      current_charge: 107273.76221628326\n      soc: 0.5374787046064285\n- - grid\n  - !GridModule\n    cls_params:\n      cost_per_unit_co2: 0.1\n      final_step: 8759\n      forecast_horizon: 23\n      forecaster: oracle\n      forecaster_increase_uncertainty: false\n      forecaster_relative_noise: false\n      initial_step: 0\n      max_export: 197992\n      max_import: 197992\n      raise_errors: false\n      time_series: !NDArray 'data/cls_params/GridModule/time_series.csv.gz'\n    name:\n    - grid\n    - 0\n    state:\n      _current_step: 0\ntrajectory_func: null\n"
  },
  {
    "path": "src/pymgrid/envs/__init__.py",
    "content": "from .discrete.discrete import DiscreteMicrogridEnv\nfrom .continuous.continuous import ContinuousMicrogridEnv\n"
  },
  {
    "path": "src/pymgrid/envs/base/__init__.py",
    "content": "from .base import BaseMicrogridEnv\n"
  },
  {
    "path": "src/pymgrid/envs/base/base.py",
    "content": "import pandas as pd\n\nfrom gym import Env\nfrom gym.spaces import Box, Dict, Tuple, flatten_space, flatten\nfrom abc import abstractmethod\n\nfrom pymgrid import NonModularMicrogrid, Microgrid\nfrom pymgrid.envs.base.skip_init import skip_init\n\n\nclass BaseMicrogridEnv(Microgrid, Env):\n    \"\"\"\n    Base class for all microgrid environments.\n\n    Implements the `OpenAI Gym API <https://www.gymlibrary.dev//>`_ for a microgrid;\n    inherits from both :class:`.Microgrid` and :class:`gym.Env`.\n\n    Parameters\n    ----------\n    modules : list, Microgrid, NonModularMicrogrid, or int.\n        The constructor can be called in three ways:\n\n        1. Passing a list of microgrid modules. This is identical to the :class:`.Microgrid` constructor.\n\n        2. Passing a :class:`.Microgrid` or :class:`.NonModularMicrogrid` instance.\n           This will effectively wrap the microgrid instance with the Gym API.\n\n        3. Passing an integer in [0, 25).\n           This will be result in loading the corresponding `pymgrid25` benchmark microgrids.\n\n    add_unbalanced_module : bool, default True.\n        Whether to add an unbalanced energy module to your microgrid. Such a module computes and attributes\n        costs to any excess supply or demand.\n        Set to True unless ``modules`` contains an :class:`.UnbalancedEnergyModule`.\n\n    loss_load_cost : float, default 10.0\n        Cost per unit of unmet demand. Ignored if ``add_unbalanced_module=False``.\n\n    overgeneration_cost : float, default 2.0\n        Cost per unit of excess generation.  Ignored if ``add_unbalanced_module=False``.\n\n    flat_spaces : bool, default True\n        Whether the environment's spaces should be flat.\n\n        If True, all continuous spaces are :class:`gym:gym.spaces.Box`.\n\n        Otherwise, they are nested :class:`gym:gym.spaces.Dict` of :class:`gym:gym.spaces.Tuple`\n        of :class:`gym:gym.spaces.Box`, corresponding to the structure of the ``control`` arg of :meth:`.Microgrid.run`.\n\n    trajectory_func : callable or None, default None\n        Callable that sets an initial and final step for an episode. ``trajectory_func`` must take two inputs:\n        :attr:`.initial_step` and :attr:`.final_step`, and return two integers: the initial and final step for\n        that particular episode, respectively. This function will be called every time :meth:`.reset` is called.\n\n        If None, :attr:`.initial_step` and :attr:`.final_step` are used to define every episode.\n\n    \"\"\"\n\n    action_space = None\n    'Space object corresponding to valid actions.'\n\n    observation_space = None\n    'Space object corresponding to valid observations.'\n\n    def __new__(cls, modules, *args, **kwargs):\n        if isinstance(modules, (NonModularMicrogrid, Microgrid)):\n            import warnings\n            warnings.warn('Initializing an environment with a microgrid will be deprecated in a future version.'\n                          'Use from_microgrid() instead.', category=FutureWarning)\n\n            instance = cls.from_microgrid(modules, **kwargs)\n\n        elif isinstance(modules, int):\n            import warnings\n            warnings.warn('Initializing an environment with a scenario integer will be deprecated in a future version.'\n                          'Use from_scenario() instead.', category=FutureWarning)\n            instance = cls.from_scenario(modules, **kwargs)\n\n        else:\n            return super().__new__(cls)\n\n        cls.__init__ = skip_init(cls, cls.__init__)\n        return instance\n\n    def __init__(self,\n                 modules,\n                 add_unbalanced_module=True,\n                 loss_load_cost=10,\n                 overgeneration_cost=2,\n                 reward_shaping_func=None,\n                 trajectory_func=None,\n                 flat_spaces=True,\n                 observation_keys=()\n                 ):\n\n        super().__init__(modules,\n                         add_unbalanced_module=add_unbalanced_module,\n                         loss_load_cost=loss_load_cost,\n                         overgeneration_cost=overgeneration_cost,\n                         reward_shaping_func=reward_shaping_func,\n                         trajectory_func=trajectory_func)\n\n        self._flat_spaces = flat_spaces\n        self.observation_keys = self._validate_observation_keys(observation_keys)\n\n        self.action_space = self._get_action_space()\n        self.observation_space, self._nested_observation_space = self._get_observation_space()\n\n    def _validate_observation_keys(self, keys):\n        if not keys:\n            return keys\n\n        if isinstance(keys, str):\n            keys = [keys]\n\n        possible_keys = self.state_series().index.get_level_values(-1).unique()\n        bad_keys = [key for key in keys if key not in possible_keys]\n\n        if bad_keys:\n            raise NameError(f'Keys {bad_keys} not found in state.')\n\n        return keys\n\n    @abstractmethod\n    def _get_action_space(self, remove_redundant_actions=False):\n        pass\n\n    def _get_observation_space(self):\n        obs_space = {}\n\n        state_series = self.state_series()\n\n        for name, module_list in self.modules.iterdict():\n            tup = []\n            for module_num, module in enumerate(module_list):\n                normalized_space = module.observation_space['normalized']\n\n                if not self.observation_keys:\n                    tup.append(normalized_space)\n                else:\n                    try:\n                        relevant_state_idx = state_series.loc[pd.IndexSlice[name, module_num]].index\n                    except KeyError:\n                        continue\n\n                    locs = [\n                        relevant_state_idx.get_loc(key) for key in self.observation_keys if key in relevant_state_idx\n                    ]\n                    if locs:\n                        box_slice = Box(\n                            normalized_space.low[locs],\n                            normalized_space.high[locs],\n                            shape=(len(locs), ),\n                            dtype=normalized_space.dtype\n                        )\n\n                        tup.append(box_slice)\n            if tup:\n                obs_space[name] = Tuple(tup)\n\n        obs_space = Dict(obs_space)\n\n        return (flatten_space(obs_space) if self._flat_spaces else obs_space), obs_space\n\n    def reset(self):\n        obs = super().reset()\n        return self._get_obs(obs)\n\n    def step(self, action, normalized=True):\n        \"\"\"\n        Run one timestep of the environment's dynamics.\n\n        When the end of the episode is reached, you are responsible for calling `reset()`\n        to reset the environment's state.\n\n        Accepts an action and returns a tuple (observation, reward, done, info).\n\n        Parameters\n        ----------\n        action : dict[str, list[float]]\n            An action provided by the agent.\n\n        normalized : bool, default True\n            Whether the passed action is normalized or not.\n\n        Returns\n        -------\n        observation : dict[str, list[float]] or np.ndarray, shape self.observation_space.shape\n            Observations of each module after using the passed ``action``.\n            ``observation`` is a nested dict if :attr:`~.flat_spaces` is True and a one-dimensional numpy array\n            otherwise.\n\n        reward : float\n            Reward/cost of running the microgrid. A positive value implies revenue while a negative\n            value is a cost.\n\n        done : bool\n            Whether the microgrid terminates.\n\n        info : dict\n            Additional information from this step.\n\n        \"\"\"\n\n        obs, reward, done, info = self.run(action, normalized=normalized)\n\n        obs = self._get_obs(obs)\n\n        return obs, reward, done, info\n\n    def _get_obs(self, obs):\n        if self.observation_keys:\n            obs = self.state_series(normalized=True).loc[pd.IndexSlice[:, :, self.observation_keys]]\n\n            if self._flat_spaces:\n                obs = obs.values\n            else:\n                obs = obs.to_frame().unstack(level=1).T.droplevel(level=1, axis=1).to_dict(orient='list')\n\n        elif self._flat_spaces:\n            obs = flatten(self._nested_observation_space, obs)\n\n        return obs\n\n    def render(self, mode=\"human\"):\n        \"\"\":meta private:\"\"\"\n        raise NotImplementedError\n\n    @property\n    def unwrapped(self):\n        \"\"\":meta private:\"\"\"\n        return super().unwrapped\n\n    @property\n    def flat_spaces(self):\n        \"\"\"\n        Whether the environment's spaces are flat.\n\n        If True, all continuous spaces are :class:`gym:gym.spaces.Box`.\n\n        Otherwise, they are nested :class:`gym:gym.spaces.Dict` of :class:`gym:gym.spaces.Tuple`\n        of :class:`gym:gym.spaces.Box`, corresponding to the structure of the ``control`` arg of :meth:`Microgrid.run`.\n\n        Returns\n        -------\n        flat_spaces : bool\n            Whether the environment's spaces are flat.\n\n        \"\"\"\n        return self._flat_spaces\n\n    @classmethod\n    def from_microgrid(cls, microgrid, **kwargs):\n        \"\"\"\n        Construct an RL environment from a microgrid.\n\n        Effectively wraps the microgrid with the environment API.\n\n        .. warning::\n            Any logs contained in the microgrid will not be ported over to the environment.\n\n        Parameters\n        ----------\n        microgrid : :class:`pymgrid.Microgrid`\n            Microgrid to wrap.\n\n        Returns\n        -------\n        env\n            The environment, suitable for reinforcement learning.\n\n        \"\"\"\n        try:\n            modules = microgrid.modules\n        except AttributeError:\n            assert isinstance(microgrid, NonModularMicrogrid)\n            return cls.from_nonmodular(microgrid, **kwargs)\n\n        kwargs = kwargs.copy()\n\n        kwargs['add_unbalanced_module'] = kwargs.pop('add_unbalanced_module', False)\n        kwargs['reward_shaping_func'] = kwargs.pop('reward_shaping_func', microgrid.reward_shaping_func)\n        kwargs['trajectory_func'] = kwargs.pop('trajectory_func', microgrid.trajectory_func)\n\n        return cls(modules.to_tuples(), **kwargs)\n\n    @classmethod\n    def from_nonmodular(cls, nonmodular, **kwargs):\n        microgrid = super().from_nonmodular(nonmodular)\n        return cls.from_microgrid(microgrid, **kwargs)\n\n    @classmethod\n    def from_scenario(cls, microgrid_number=0, **kwargs):\n        env = super().from_scenario(microgrid_number=microgrid_number)\n\n        if kwargs:\n            return cls.from_microgrid(env, **kwargs)\n\n        return env\n\n    @classmethod\n    def load(cls, stream):\n        return cls(super().load(stream))\n"
  },
  {
    "path": "src/pymgrid/envs/base/skip_init.py",
    "content": "def skip_init(cls, init):\n    \"\"\"\n    Skip init once on cls, and then revert to original init.\n\n    Parameters\n    ----------\n    cls : Type\n        Class to skip init on.\n    init : callable\n        Original init.\n\n    Returns\n    -------\n    skip_init : callable\n        Callable that skips init once.\n\n    \"\"\"\n    def reset_init(*args, **kwargs):\n        cls.__init__ = init\n    return reset_init\n"
  },
  {
    "path": "src/pymgrid/envs/continuous/__init__.py",
    "content": ""
  },
  {
    "path": "src/pymgrid/envs/continuous/continuous.py",
    "content": "from gym.spaces import Dict, Tuple, flatten_space\nfrom warnings import warn\n\nfrom pymgrid.envs.base import BaseMicrogridEnv\n\n\nclass ContinuousMicrogridEnv(BaseMicrogridEnv):\n    \"\"\"\n    Microgrid environment with a continuous action space.\n\n    Implements the `OpenAI Gym API <https://www.gymlibrary.dev//>`_ for a microgrid;\n    inherits from both :class:`.Microgrid` and :class:`gym.Env`.\n\n    Parameters\n    ----------\n    modules : list, Microgrid, NonModularMicrogrid, or int.\n        The constructor can be called in three ways:\n\n        1. Passing a list of microgrid modules. This is identical to the :class:`.Microgrid` constructor.\n\n        2. Passing a :class:`.Microgrid` or :class:`.NonModularMicrogrid` instance.\n           This will effectively wrap the microgrid instance with the Gym API.\n\n        3. Passing an integer in [0, 25).\n           This will be result in loading the corresponding `pymgrid25` benchmark microgrids.\n\n    add_unbalanced_module : bool, default True.\n        Whether to add an unbalanced energy module to your microgrid. Such a module computes and attributes\n        costs to any excess supply or demand.\n        Set to True unless ``modules`` contains an :class:`.UnbalancedEnergyModule`.\n\n    loss_load_cost : float, default 10.0\n        Cost per unit of unmet demand. Ignored if ``add_unbalanced_module=False``.\n\n    overgeneration_cost : float, default 2.0\n        Cost per unit of excess generation.  Ignored if ``add_unbalanced_module=False``.\n\n    flat_spaces : bool, default True\n        Whether the environment's spaces should be flat.\n\n        If True, all continuous spaces are :class:`gym:gym.spaces.Box`.\n\n        Otherwise, they are nested :class:`gym:gym.spaces.Dict` of :class:`gym:gym.spaces.Tuple`\n        of :class:`gym:gym.spaces.Box`, corresponding to the structure of the ``control`` arg of :meth:`.Microgrid.run`.\n\n    trajectory_func : callable or None, default None\n        Callable that sets an initial and final step for an episode. ``trajectory_func`` must take two inputs:\n        :attr:`.initial_step` and :attr:`.final_step`, and return two integers: the initial and final step for\n        that particular episode, respectively. This function will be called every time :meth:`.reset` is called.\n\n        If None, :attr:`.initial_step` and :attr:`.final_step` are used to define every episode.\n\n    \"\"\"\n    _nested_action_space = None\n\n    def _get_nested_action_space(self):\n        return Dict({name: Tuple([module.action_space['normalized'] for module in modules_list])\n                                 for name, modules_list in self.fixed.iterdict() if modules_list[0].is_source})\n\n    def _get_action_space(self):\n        self._nested_action_space = self._get_nested_action_space()\n        return flatten_space(self._nested_action_space) if self._flat_spaces else self._nested_action_space\n\n    def _get_action(self, action):\n        # Action does not have fixed sinks (loads); add those values.\n        assert action in self._nested_action_space, 'Action is not in action space.'\n        action = action.copy()\n        for name, module_list in self.fixed.sinks.iterdict():\n            action[name] = [module.to_normalized(-1 * module.max_consumption, act=True) for module in module_list]\n        return action\n\n    def step(self, action):\n        action = self._get_action(action)\n        return super().run(action)\n\n    def run(self, action, normalized=True):\n        warn('run() should not be called directly in environments.')\n        return super().run(action, normalized=normalized)\n"
  },
  {
    "path": "src/pymgrid/envs/discrete/__init__.py",
    "content": ""
  },
  {
    "path": "src/pymgrid/envs/discrete/discrete.py",
    "content": "import yaml\n\nfrom gym.spaces import Discrete\nfrom warnings import warn\n\nfrom pymgrid.algos.priority_list import PriorityListAlgo\nfrom pymgrid.envs.base import BaseMicrogridEnv\n\n\nclass DiscreteMicrogridEnv(BaseMicrogridEnv, PriorityListAlgo):\n    \"\"\"\n        A discrete env that implements priority lists as actions on a microgrid.\n\n        The environment deploys fixed controllable modules to the extent necessary to zero out the net load (load minus\n        renewable generation).\n    \"\"\"\n\n    actions_list: list\n    \"\"\"\n    List of priority lists.\n    \n    Each element in this list corresponds to an action in the environment's action space, and defines an order \n    in which to deploy fixed controllable modules. Specifically, each action corresponds to a unique priority list, \n    itself containing :class:`PriorityListElements<.PriorityListElement>` that represents a particular module's position\n    in the deployment order.\n    \n    Returns\n    -------\n    actions_list : list of list of :class:`.PriorityListElement`\n        List of all priority lists.\n        \n    \"\"\"\n\n    yaml_tag = u\"!DiscreteMicrogridEnv\"\n    yaml_loader = yaml.SafeLoader\n    yaml_dumper = yaml.SafeDumper\n\n    def __init__(self,\n                 modules,\n                 add_unbalanced_module=True,\n                 loss_load_cost=10,\n                 overgeneration_cost=2,\n                 reward_shaping_func=None,\n                 trajectory_func=None,\n                 flat_spaces=True,\n                 observation_keys=None,\n                 remove_redundant_gensets=True\n                 ):\n        super().__init__(modules,\n                         add_unbalanced_module=add_unbalanced_module,\n                         loss_load_cost=loss_load_cost,\n                         overgeneration_cost=overgeneration_cost,\n                         reward_shaping_func=reward_shaping_func,\n                         trajectory_func=trajectory_func,\n                         flat_spaces=flat_spaces,\n                         observation_keys=observation_keys)\n\n        self.action_space, self.actions_list = self._get_action_space(remove_redundant_gensets)\n\n    def _get_action_space(self, remove_redundant_gensets=False):\n        \"\"\"\n        An action here is a priority list - in what order to deploy controllable source modules.\n        Compute the total expected load\n        It exhausts the entire production of the 0th source module before moving on to the second and the third, etc.\n\n        If there are n fixed source modules, then there are 2^{n-1} actions.\n        :return:\n        \"\"\"\n\n        priority_lists = self.get_priority_lists(remove_redundant_gensets)\n\n        n_actions = len(priority_lists)\n\n        if n_actions > 1000:\n            warn(f'Microgrid with {len(priority_lists[0])} fixed source modules defines large action space with '\n                 f'{n_actions} elements.')\n\n        space = Discrete(n_actions)\n\n        return space, priority_lists\n\n    def _get_action(self, action_num):\n        if action_num not in self.action_space:\n            raise ValueError(f\" Action {action_num} not in action space {self.action_space}\")\n\n        priority_list = list(self.actions_list[action_num])\n\n        return self._populate_action(priority_list)\n\n    def remove_action(self, action_number):\n        \"\"\"\n        Remove an action from the action space.\n\n        Useful if two actions happen to be redundant in a particular use case.\n\n        Parameters\n        ----------\n        action_number : int\n            Index of the action to remove.\n\n        \"\"\"\n\n        if action_number not in self.action_space:\n            raise ValueError('Cannot remove action that is not in the action space!')\n\n        self.actions_list.pop(action_number)\n        self.action_space = Discrete(self.action_space.n - 1)\n\n    def step(self, action):\n        \"\"\"\n        Run one timestep of the environment's dynamics.\n\n        When the end of the episode is reached, you are responsible for calling `reset()`\n        to reset the environment's state.\n\n        Accepts an action and returns a tuple (observation, reward, done, info).\n\n        Parameters\n        ----------\n        action : int\n            An action provided by the agent.\n\n        Returns\n        -------\n        observation : dict[str, list[float]] or np.ndarray, shape self.observation_space.shape\n            Observations of each module after using the passed ``action``.\n            ``observation`` is a nested dict if :attr:`~.flat_spaces` is True and a one-dimensional numpy array\n            otherwise.\n\n        reward : float\n            Reward/cost of running the microgrid. A positive value implies revenue while a negative\n            value is a cost.\n\n        done : bool\n            Whether the microgrid terminates.\n\n        info : dict\n            Additional information from this step.\n\n        \"\"\"\n        self._microgrid_logger.log(action=action)\n        microgrid_action = self._get_action(action)\n        return super().step(microgrid_action, normalized=False)\n\n    def sample_action(self, strict_bound=False, sample_flex_modules=False):\n        return self.action_space.sample()\n\n    def __repr__(self):\n        return f\"DiscreteMicrogridEnv({super().__repr__()}\"\n\n    def __str__(self):\n        return self.__repr__()\n"
  },
  {
    "path": "src/pymgrid/forecast/__init__.py",
    "content": "from .forecaster import get_forecaster, OracleForecaster, GaussianNoiseForecaster, UserDefinedForecaster, NoForecaster\n"
  },
  {
    "path": "src/pymgrid/forecast/forecaster.py",
    "content": "import numpy as np\nfrom abc import abstractmethod\n\nfrom pandas.api.types import is_number, is_numeric_dtype\n\nfrom pymgrid.utils.ray import ray_decorator\nfrom pymgrid.utils.space import ModuleSpace\n\n\ndef get_forecaster(forecaster,\n                   observation_space,\n                   forecast_shape,\n                   time_series=None,\n                   increase_uncertainty=False,\n                   relative_noise=False):\n    \"\"\"\n    Get the forecasting function for the time series module.\n\n    Parameters\n    ----------\n    forecaster : callable, float, \"oracle\", or None, default None.\n        Function that gives a forecast n-steps ahead.\n\n        * If ``callable``, must take as arguments ``(val_c: float, val_{c+n}: float, n: int)``, where\n\n          * ``val_c`` is the current value in the time series: ``self.time_series[self.current_step]``\n\n          * ``val_{c+n}`` is the value in the time series n steps in the future\n\n          * n is the number of steps in the future at which we are forecasting.\n\n          The output ``forecast = forecaster(val_c, val_{c+n}, n)`` must have the same sign\n          as the inputs ``val_c`` and ``val_{c+n}``.\n\n        * If ``float``, serves as a standard deviation for a mean-zero gaussian noise function\n          that is added to the true value.\n\n        * If ``\"oracle\"``, gives a perfect forecast.\n\n        * If ``None``, no forecast.\n\n    forecast_shape : int or tuple of int\n        Expected shape of forecasts. If an integer, will return forecasts of shape (shape, 1).\n\n    observation_space : :class:`ModuleSpace <pymgrid.utils.space.ModuleSpace>`\n        Observation space; used to determine values to pad missing forecasts when we are forecasting past the\n        end of the time series.\n\n    time_series: ndarray[float] or None, default None.\n        The underlying time series.\n\n        * If ``callable(forecaster)``, used to validate :class:`.UserDefinedForecaster`.\n        * If ``forecaster`` is numeric and ``relative_noise`` is true, the noise standard deviation\n          will be defined relative to the mean of the time series.\n\n    increase_uncertainty : bool, default False\n       Whether to increase uncertainty for farther-out dates if using\n       :class:`.GaussianNoiseForecaster`. Ignored otherwise.\n\n    relative_noise : bool, default False\n       Whether to define noise standard deviation relative to mean of time series if using\n       :class:`.GaussianNoiseForecaster`. Ignored otherwise.\n\n\n    Returns\n    -------\n    forecaster : :class:`.Forecaster`\n        The forecasting function.\n\n    \"\"\"\n\n    if forecaster is None:\n        return NoForecaster(observation_space, forecast_shape)\n    elif isinstance(forecaster, (UserDefinedForecaster, OracleForecaster, GaussianNoiseForecaster)):\n        return forecaster\n    elif callable(forecaster):\n        return UserDefinedForecaster(forecaster, observation_space, forecast_shape, time_series)\n    elif forecaster == \"oracle\":\n        return OracleForecaster(observation_space, forecast_shape)\n    elif is_number(forecaster):\n        return GaussianNoiseForecaster(forecaster,\n                                       observation_space,\n                                       forecast_shape,\n                                       time_series=time_series,\n                                       increase_uncertainty=increase_uncertainty,\n                                       relative_noise=relative_noise)\n    else:\n        raise ValueError(f\"Unable to parse forecaster of type {type(forecaster)}\")\n\n\nclass Forecaster:\n    def __init__(self, observation_space, forecast_shape):\n        self._observation_space = observation_space\n        self._forecast_shaped_space = self._get_forecast_shaped_space(forecast_shape)\n        self._fill_arr = (self._observation_space.unnormalized.high + self._observation_space.unnormalized.low) / 2\n\n    def _get_forecast_shaped_space(self, shape):\n        if len(shape) == 1:\n            shape = (*shape, 1)\n        elif len(shape) > 2:\n            raise ValueError(f'shape must be one- or two-dimensional.')\n\n        n_in_forecast = shape[0]*shape[1]\n\n        if n_in_forecast:\n            unnormalized_low = self._observation_space.unnormalized.low[-n_in_forecast:]\n            unnormalized_high = self._observation_space.unnormalized.high[-n_in_forecast:]\n        else:\n            unnormalized_low = np.array([])\n            unnormalized_high = np.array([])\n\n        return ModuleSpace(unnormalized_low=unnormalized_low.reshape(shape),\n                           unnormalized_high=unnormalized_high.reshape(shape),\n                           shape=shape)\n\n    @abstractmethod\n    def _forecast(self, val_c, val_c_n, n):\n        pass\n\n    def _pad(self, forecast, n):\n        if forecast.shape[0] == n:\n            return forecast\n        else:\n            pad_amount = n - forecast.shape[0]\n            pad = self._fill_arr.reshape((-1, forecast.shape[1]))[-pad_amount:]\n\n            if pad.shape[0] < pad_amount:\n                raise RuntimeError(\"Attempting to pad a forecast to a value larger than the module's observation space \"\n                                   \"implies.\")\n\n            return np.concatenate((forecast, pad))\n\n    def full_pad(self, shape, forecast_horizon):\n        if forecast_horizon is None:\n            return None\n        empty_forecast = np.array([]).reshape((0, shape[1]))\n        return self._pad(empty_forecast, forecast_horizon)\n\n    @ray_decorator\n    def _clip(self, forecast):\n        lb = self._forecast_shaped_space.unnormalized.low[-forecast.shape[0]:]\n        ub = self._forecast_shaped_space.unnormalized.high[-forecast.shape[0]:]\n        lt_lb = forecast < lb\n        gt_ub = forecast > ub\n\n        forecast[lt_lb] = lb[lt_lb]\n        forecast[gt_ub] = ub[gt_ub]\n\n        return forecast\n\n    @property\n    def observation_space(self):\n        return self._observation_space\n\n    @observation_space.setter\n    def observation_space(self, value):\n        self._observation_space = value\n        self._fill_arr = (self._observation_space.unnormalized.high + self._observation_space.unnormalized.low) / 2\n        new_shape = (\n            int((value.shape[0] - self._forecast_shaped_space.shape[1]) / self._forecast_shaped_space.shape[1]),\n            self._forecast_shaped_space.shape[1]\n        )\n        self._forecast_shaped_space = self._get_forecast_shaped_space(new_shape)\n\n    def __eq__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n\n        return (self._fill_arr == other._fill_arr).all() and \\\n               all(v == other.__dict__[k] for k, v in self.__dict__.items() if k != '_fill_arr')\n\n    def __call__(self, val_c, val_c_n, n):\n        if len(val_c_n.shape) == 1:\n            val_c_n = val_c_n.reshape((-1, 1))\n\n        if val_c_n.shape[0] > self._forecast_shaped_space.shape[0]:\n            raise RuntimeError(f'val_c_n shape {val_c_n.shape} is too large for space {self._forecast_shaped_space.shape}')\n\n        forecast = self._forecast(val_c, val_c_n, n)\n\n        if forecast is None:\n            return None\n        else:\n            forecast = self._pad(forecast, n)\n            forecast = self._clip(forecast)\n            assert forecast.shape == (n, val_c_n.shape[1])\n            return forecast\n\n    def __repr__(self):\n        return self.__class__.__name__\n\n\nclass UserDefinedForecaster(Forecaster):\n    def __init__(self, forecaster_function, observation_space, forecast_shape, time_series):\n        self.is_vectorized_forecaster, self.cast_to_arr = \\\n            _validate_callable_forecaster(forecaster_function, time_series)\n\n        if not self.is_vectorized_forecaster:\n            forecaster_function = vectorize_scalar_forecaster(forecaster_function)\n\n        self._forecaster = forecaster_function\n\n        super().__init__(observation_space, forecast_shape)\n\n    def _cast_to_arr(self, forecast, val_c_n):\n        if self.cast_to_arr:\n            return np.array(forecast.reshape(val_c_n.shape))\n        return forecast\n\n    def _forecast(self, val_c, val_c_n, n):\n        forecast = self._forecaster(val_c, val_c_n, n)\n        return self._cast_to_arr(forecast, val_c_n)\n\n\nclass OracleForecaster(Forecaster):\n    def _forecast(self, val_c, val_c_n, n):\n        return val_c_n\n\n\nclass GaussianNoiseForecaster(Forecaster):\n    def __init__(self,\n                 noise_std,\n                 observation_space,\n                 forecast_shape,\n                 time_series=None,\n                 increase_uncertainty=False,\n                 relative_noise=False):\n        super().__init__(observation_space, forecast_shape)\n\n        self.input_noise_std = noise_std\n        self.increase_uncertainty = increase_uncertainty\n        self.relative_noise = relative_noise\n\n        self._noise_size = self._forecast_shaped_space.shape\n        self._noise_std = self._get_noise_std(time_series)\n\n    def _get_noise_std(self, time_series):\n        scalar_val = self.input_noise_std\n        if self.relative_noise:\n            if time_series is None:\n                raise ValueError('Must pass time_series if relative_noise is True.')\n            scalar_val *= np.abs(time_series.mean())\n\n        if self.increase_uncertainty:\n            return scalar_val * np.outer(\n                1 + np.log(1 + np.arange(self._noise_size[0])),\n                np.ones(self._noise_size[-1])\n            )\n        else:\n            return scalar_val\n\n    def _get_noise(self, size):\n        try:\n            return np.random.normal(scale=self._noise_std, size=size)\n        except ValueError:\n            noise_std = self._noise_std[:size[0], :]\n            if noise_std.shape != size:\n                raise RuntimeError(f'Cannot broadcast shapes {self._noise_std.shape} and {size}.')\n\n            return np.random.normal(scale=noise_std, size=size)\n\n    def _forecast(self, val_c, val_c_n, n):\n        return val_c_n + self._get_noise(val_c_n.shape).reshape(val_c_n.shape)\n\n    @property\n    def noise_std(self):\n        return self._noise_std\n\n    @noise_std.setter\n    def noise_std(self, value):\n        pass\n\n    def __repr__(self):\n        return f'GaussianNoiseForecaster(noise_std={self.input_noise_std}, ' \\\n               f'increase_uncertainty={self.increase_uncertainty})'\n\n\nclass NoForecaster(Forecaster):\n    def _forecast(self, val_c, val_c_n, n):\n        return None\n\n\ndef _validate_callable_forecaster(forecaster, time_series):\n    val_c = time_series[0]\n    n = np.random.randint(2, len(time_series))\n    vector_true_forecast = time_series[:n]\n    try:\n        cast_to_arr = _validate_vectorized_forecaster(forecaster, val_c, vector_true_forecast, n)\n        is_vectorized_forecaster = True\n    except NotImplementedError:\n        scalar_true_forecast = vector_true_forecast[-1]\n        _validate_scalar_forecaster(forecaster, val_c, scalar_true_forecast, n)\n        is_vectorized_forecaster = False\n        cast_to_arr = False\n\n    return is_vectorized_forecaster, cast_to_arr\n\n\ndef _validate_vectorized_forecaster(forecaster, val_c, vector_true_forecast, n):\n    try:\n        vectorized_forecast = forecaster(val_c, vector_true_forecast, n)\n    except Exception as e:\n        raise NotImplementedError(\"Unable to call forecaster with vector inputs. \"\n                                  f\"\\nFunc call forecaster(val_c={val_c}, val_c_n={vector_true_forecast}, n={n})\"\n                                  f\"\\nraised {type(e).__name__}: {e}\") from e\n    else:\n        # vectorized function call succeeded\n        if not hasattr(vectorized_forecast, 'size'):\n            vectorized_forecast = np.array(vectorized_forecast)\n            cast_to_arr = True\n        else:\n            cast_to_arr = False\n        try:\n            vectorized_forecast = vectorized_forecast.reshape(vector_true_forecast.shape)\n        except ValueError:\n            raise ValueError(f\"Forecaster output of shape {vectorized_forecast.shape} cannot be casted to \"\n                             f\"necessary forecast shape {vector_true_forecast.shape}\")\n\n        for i, (forecast, true_forecast) in enumerate(zip(vectorized_forecast, vector_true_forecast)):\n            try:\n                _validate_forecasted_value(forecast, true_forecast, val_c, n)\n            except Exception as e:\n                raise type(e)(f\"Failed validating forecast at position {i} due to exception {e}\") from e\n\n        return cast_to_arr\n\n\ndef _validate_scalar_forecaster(forecaster, val_c, scalar_true_forecast, n):\n    try:\n        scalar_forecast = forecaster(val_c, scalar_true_forecast, n)\n    except Exception as e_scalar:\n        raise ValueError(\"Unable to call forecaster with scalar inputs. \"\n                         f\"\\nFunc call forecaster(val_c={val_c}, val_c_plus_n={scalar_true_forecast}, n={n})\"\n                         f\"\\nraised {type(e_scalar).__name__}: {e_scalar}\") from e_scalar\n    else:  # scalar function call succeeded\n        # check shape\n        try:\n            assert is_number(scalar_forecast)\n            scalar_forecast_item = scalar_forecast\n        except AssertionError:\n            try:\n                scalar_forecast_item = scalar_forecast.item()\n            except (ValueError, AttributeError):\n                raise ValueError(\"Unable to validate forecaster. Forecaster must return scalar output with scalar \"\n                                 f\"input but returned {scalar_forecast}\")\n\n        _validate_forecasted_value(scalar_forecast_item, scalar_true_forecast, val_c, n)\n\n\ndef _validate_forecasted_value(forecaster_output, true_forecast, val_c, n):\n    if not is_numeric_dtype(np.array(forecaster_output)):\n        raise TypeError(\n            \"Unable to validate forecaster. Forecaster must return numeric np.ndarray or number but returned \"\n            f\"output of type {np.array(forecaster_output).dtype}: {forecaster_output}\")\n    elif not (forecaster_output * true_forecast >= 0):\n        raise ValueError(\n            \"Unable to validate forecaster. Forecaster must return output of same sign (or zero) as \"\n            f\"input but returned output {forecaster_output} with inputs \"\n            f\"val_c={val_c}, val_c_plus_n={true_forecast}, n={n}\")\n\n\ndef vectorize_scalar_forecaster(forecaster):\n    def vectorized(val_c, val_c_n, n):\n        if n != len(val_c_n):\n            raise ValueError(f\"Incompatible true values length ({val_c_n}) to forecast {n}-steps ahead.\")\n        vectorized_output = np.array([forecaster(val_c, val_c_n_i, n_i) for n_i, val_c_n_i in enumerate(val_c_n)])\n        try:\n            shape = (-1, vectorized_output.shape[1])\n        except IndexError:\n            shape = (-1, 1)\n        return vectorized_output.reshape(shape)\n\n    return vectorized\n"
  },
  {
    "path": "src/pymgrid/microgrid/__init__.py",
    "content": "DEFAULT_HORIZON = 23\n\nfrom .microgrid import Microgrid\n"
  },
  {
    "path": "src/pymgrid/microgrid/microgrid.py",
    "content": "import numpy as np\nimport pandas as pd\nimport yaml\n\nfrom copy import deepcopy\nfrom warnings import warn\n\nfrom pymgrid.microgrid import DEFAULT_HORIZON\nfrom pymgrid.modules import ModuleContainer, UnbalancedEnergyModule\nfrom pymgrid.utils.logger import ModularLogger\nfrom pymgrid.microgrid.utils.step import MicrogridStep\nfrom pymgrid.utils.serialize import add_numpy_pandas_representers, add_numpy_pandas_constructors, dump_data\nfrom pymgrid.utils.space import MicrogridSpace\n\nclass Microgrid(yaml.YAMLObject):\n    \"\"\"\n    Microgrid class, used to define and simulate an environment with a variety of modules.\n\n    Parameters\n    ----------\n    modules : List[Union[Tuple[str, BaseMicrogridModule], BaseMicrogridModule]]\n        List of modules that define the microgrid. The list can contain either/both microgrid modules -- subclasses of\n        ``BaseMicrogridModule`` -- and tuples of length two, which must contain a string defining the name of the module\n        followed by the module.\n\n        ``Microgrid`` groups modules into lists based on their names. If no name is given (e.g. an element in ``modules``\n        is a subclass of ``BaseMicrogridModule`` and not a tuple, then the name is defined to be\n        ``module.__class__.name[0]``. Modules are then exposed (within lists) by name as attributes to the microgrid.\n        See below for an example.\n\n        .. note::\n        The constructor copies modules passed to it.\n\n    add_unbalanced_module : bool, default True.\n        Whether to add an unbalanced energy module to your microgrid. Such a module computes and attributes\n        costs to any excess supply or demand.\n        Set to True unless ``modules`` contains an ``UnbalancedEnergyModule``.\n\n    loss_load_cost : float, default 10.0\n        Cost per unit of unmet demand. Ignored if ``add_unbalanced_module=False``.\n\n    overgeneration_cost : float, default 2.0\n        Cost per unit of excess generation.  Ignored if ``add_unbalanced_module=False``.\n\n    reward_shaping_func : callable or None, default None\n        Function that allows for custom definition of the microgrid's reward/cost.\n        If None, the cost of each step is simply the total cost of all modules.\n        For example, you may define a function that defines the cost as only being the loss load, or only\n        the pv curtailment.\n\n    trajectory_func : callable or None, default None\n        Callable that sets an initial and final step for an episode. ``trajectory_func`` must take two inputs:\n        :attr:`.initial_step` and :attr:`.final_step`, and return two integers: the initial and final step for\n        that particular episode, respectively. This function will be called every time :meth:`.reset` is called.\n\n        If None, :attr:`.initial_step` and :attr:`.final_step` are used to define every episode.\n\n\n    Examples\n    --------\n    >>> from pymgrid import Microgrid\n    >>> from pymgrid.modules import LoadModule, RenewableModule, GridModule, BatteryModule\n    >>> timesteps = 10\n    >>> load = LoadModule(10*np.random.rand(timesteps), loss_load_cost=10.)\n    >>> pv = RenewableModule(10*np.random.rand(timesteps))\n    >>> grid = GridModule(max_import=100, max_export=10, time_series=np.random.rand(timesteps, 3))\n    >>> battery_0 = BatteryModule(min_capacity=0, \\\n                                  max_capacity=100, \\\n                                  max_charge=1,\\\n                                  max_discharge=10, \\\n                                  efficiency=0.9, \\\n                                  init_soc=0.5)\n    >>> battery_1 = BatteryModule(min_capacity=1, \\\n                                  max_capacity=20, \\\n                                  max_charge=5, \\\n                                  max_discharge=10, \\\n                                  efficiency=0.9, \\\n                                  init_soc=0.5)\n\n    >>> microgrid = Microgrid(modules=[load, ('pv', pv), grid, battery_0, battery_1])\n    >>> # The modules are now available as attributes. The exception to this is `load`, which is an exposed method.\n    >>> print(microgrid.pv)\n    [RenewableModule(time_series=<class 'numpy.ndarray'>, raise_errors=False, forecaster=NoForecaster, forecast_horizon=0, forecaster_increase_uncertainty=False, provided_energy_name=renewable_used)]\n    >>> print(microgrid.grid)\n    [GridModule(max_import=100, max_export=10)]\n    >>> print(microgrid.grid.item()) # Return the module instead of a list containing the module, if list has one item.\n    GridModule(max_import=100, max_export=10)\n    >>> for j, battery in enumerate(microgrid.battery):\n    >>>     print(f\"Battery {j}: {battery}\")\n    Battery 0: BatteryModule(min_capacity=0, max_capacity=100, max_charge=1, max_discharge=10, efficiency=0.9, battery_cost_cycle=0.0, battery_transition_model=None, init_charge=None, init_soc=0.5, raise_errors=False)\n    Battery 1: BatteryModule(min_capacity=1, max_capacity=20, max_charge=5, max_discharge=10, efficiency=0.9, battery_cost_cycle=0.0, battery_transition_model=None, init_charge=None, init_soc=0.5, raise_errors=False)\n\n    \"\"\"\n\n    yaml_tag = u\"!Microgrid\"\n    \"\"\"Tag used for yaml serialization.\"\"\"\n    yaml_dumper = yaml.SafeDumper\n    yaml_loader = yaml.SafeLoader\n\n    def __init__(self,\n                 modules,\n                 add_unbalanced_module=True,\n                 loss_load_cost=10.,\n                 overgeneration_cost=2.,\n                 reward_shaping_func=None,\n                 trajectory_func=None):\n\n        self._modules = self._get_module_container(modules,\n                                                   add_unbalanced_module,\n                                                   loss_load_cost,\n                                                   overgeneration_cost)\n\n        # TODO (ahalev) transform envs to wrappers, and remove microgrid from attr names)\n        self.microgrid_action_space = MicrogridSpace(\n            self._modules.get_attrs('action_space', 'module_type', as_pandas=False), 'act'\n        )\n        self.microgrid_observation_space = MicrogridSpace(\n            self._modules.get_attrs('observation_space', as_pandas=False), 'obs'\n        )\n\n        self._initial_step = self._get_module_initial_step()\n        self._final_step = self._get_module_final_step()\n\n        self.reward_shaping_func = reward_shaping_func\n        self.trajectory_func = self._check_trajectory_func(trajectory_func)\n\n        self._balance_logger = ModularLogger()\n        self._microgrid_logger = ModularLogger()  # log additional information.\n\n    def _get_unbalanced_energy_module(self,\n                                      loss_load_cost,\n                                      overgeneration_cost):\n\n        return UnbalancedEnergyModule(raise_errors=False,\n                                      loss_load_cost=loss_load_cost,\n                                      overgeneration_cost=overgeneration_cost\n                                      )\n\n    def _get_module_container(self, modules, add_unbalanced_module, loss_load_cost, overgeneration_cost):\n        \"\"\"\n        Types of _modules:\n        Fixed source: provides energy to the microgrid.\n            When queried, the microgrid must absorb said energy.\n            Example: battery (when discharging), grid (when importing from)\n\n        Flex source: provides energy to the microgrid.\n            Can retain excess energy and not send to microgrid.\n            Queried last, in the hopes of balancing other _modules.\n            Example: pv with ability to curtail pv\n\n        Fixed sink: absorbs energy from the microgrid.\n            When queried, the microgrid must send it said energy.\n            Example: load, grid (when exporting to)\n\n        Flexible sink: absorbs energy from the microgrid.\n            Can absorb excess energy from the microgrid.\n            Queried last, in the hopes of balancing other _modules.\n            Example: dispatchable load\n\n        Note that _modules can act as both sources and sinks (batteries, grid), but cannot be both\n            fixed and flexible.\n\n        :return:\n        \"\"\"\n        modules = deepcopy(modules)\n\n        if not pd.api.types.is_list_like(modules):\n            raise TypeError(\"modules must be list-like of modules.\")\n\n        if add_unbalanced_module:\n            modules.append(self._get_unbalanced_energy_module(loss_load_cost, overgeneration_cost))\n\n        return ModuleContainer(modules)\n\n    def _check_trajectory_func(self, trajectory_func):\n        if trajectory_func is None:\n            return trajectory_func\n\n        if not callable(trajectory_func):\n            raise TypeError('trajectory_func must be callable.')\n\n        output = trajectory_func(self._initial_step, self._final_step)\n\n        try:\n            initial_step, final_step = output\n            if not (isinstance(initial_step, int) and isinstance(final_step, int)):\n                raise ValueError\n        except (TypeError, ValueError):\n            raise TypeError(f'trajectory func must return two integer values, not {output}')\n\n        if initial_step < self._initial_step:\n            raise ValueError(f'trajectory_func returned initial_step value ({initial_step}) less than env\\'s initial '\n                             f'step: ({self._initial_step})')\n\n        if final_step > self._final_step:\n            raise ValueError(f'trajectory_func returned final_step value ({final_step}) greater than env\\'s final step:'\n                             f' ({self._final_step})')\n\n        if initial_step >= final_step:\n            raise ValueError(f'trajectory_func returned values ({initial_step}, {final_step}) such that initial_step'\n                             f'was greater than or equal to final_step.')\n\n        return trajectory_func\n\n    def reset(self):\n        \"\"\"\n        Reset the microgrid and flush the log.\n\n        Returns\n        -------\n        dict[str, list[float]]\n            Observations from resetting the modules as well as the flushed balance log.\n        \"\"\"\n        self._set_trajectory()\n        return {\n            **{name: [module.reset() for module in module_list] for name, module_list in self.modules.iterdict()},\n            **{\"balance\": self._balance_logger.flush(),\n               \"other\": self._microgrid_logger.flush()}\n        }\n\n    def _set_trajectory(self):\n        if self.trajectory_func is not None:\n            initial_step, final_step = self.trajectory_func(self._initial_step, self._final_step)\n            self._set_initial_step(initial_step, modules_only=True)\n            self._set_final_step(final_step, modules_only=True)\n\n    def run(self, control, normalized=True):\n        \"\"\"\n\n        Run the microgrid for a single step.\n\n        Parameters\n        ----------\n        control : dict[str, list[float]]\n            Actions to pass to each fixed module.\n        normalized : bool, default True\n            Whether ``control`` is a normalized value or not. If not, each module de-normalizes its respective action.\n\n        Returns\n        -------\n        observation : dict[str, list[float]]\n            Observations of each module after using the passed ``control``.\n        reward : float\n            Reward/cost of running the microgrid. A positive value implies revenue while a negative\n            value is a cost.\n        done : bool\n            Whether the microgrid terminates.\n        info : dict\n            Additional information from this step.\n\n        \"\"\"\n        control_copy = control.copy()\n        microgrid_step = MicrogridStep(reward_shaping_func=self.reward_shaping_func, cost_info=self.get_cost_info())\n\n        for name, modules in self.fixed.iterdict():\n            for module in modules:\n                microgrid_step.append(name, *module.step(0.0, normalized=False))\n\n        fixed_provided, fixed_consumed, _, _ = microgrid_step.balance()\n        log_dict = self._get_log_dict(fixed_provided, fixed_consumed, prefix='fixed')\n\n        for name, modules in self.controllable.iterdict():\n            try:\n                module_controls = control_copy.pop(name)\n            except KeyError:\n                raise ValueError(f'Control for module \"{name}\" not found. Available controls:\\n\\t{control.keys()}')\n            else:\n                try:\n                    _zip = zip(modules, module_controls)\n                except TypeError:\n                    _zip = zip(modules, [module_controls])\n\n            for module, _control in _zip:\n                module_step = module.step(_control, normalized=normalized)  # obs, reward, done, info.\n                microgrid_step.append(name, *module_step)\n\n        provided, consumed, _, _ = microgrid_step.balance()\n        difference = provided - consumed                # if difference > 0, have an excess. Try to use flex sinks to dissapate\n                                                        # otherwise, insufficient. Use flex sources to make up\n\n        log_dict = self._get_log_dict(provided-fixed_provided, consumed-fixed_consumed, log_dict=log_dict, prefix='controllable')\n\n        if len(control_copy) > 0:\n            warn(f'\\nIgnoring the following keys in passed control:\\n {list(control_copy.keys())}')\n\n        if difference > 0:\n            energy_excess = difference\n            for name, modules in self.flex.iterdict():\n                for module in modules:\n                    if not module.is_sink:\n                        sink_amt = 0.0\n                    elif module.max_consumption < energy_excess: # module cannot dissapate all excess energy\n                        sink_amt = -1.0*module.max_consumption\n                    else:\n                        sink_amt = -1.0 * energy_excess\n\n                    module_step = module.step(sink_amt, normalized=False)\n                    microgrid_step.append(name, *module_step)\n                    energy_excess += sink_amt\n\n        else:\n            energy_needed = - difference\n            for name, modules in self.flex.iterdict():\n                for module in modules:\n                    if not module.is_source:\n                        source_amt = 0.0\n                    elif module.max_production < energy_needed: # module cannot provide sufficient energy\n                        source_amt = module.max_production\n                    else:\n                        source_amt = energy_needed\n\n                    module_step = module.step(source_amt, normalized=False)\n                    microgrid_step.append(name, *module_step)\n                    energy_needed -= source_amt\n\n        provided, consumed, reward, shaped_reward = microgrid_step.balance()\n        log_dict = self._get_log_dict(provided, consumed, log_dict=log_dict, prefix='overall')\n\n        self._balance_logger.log(reward=reward, shaped_reward=shaped_reward, **log_dict)\n\n        if not np.isclose(provided, consumed):\n            raise RuntimeError('Microgrid modules unable to balance energy production with consumption.\\n'\n                               '')\n\n        return microgrid_step.output()\n\n    def _get_log_dict(self, provided_energy, absorbed_energy, log_dict=None, prefix=None):\n        _log_dict = dict(provided_to_microgrid=provided_energy, absorbed_from_microgrid=absorbed_energy)\n        _log_dict = {(prefix + '_' + k if prefix is not None else k): v for k, v in _log_dict.items()}\n        if log_dict:\n            _log_dict.update(log_dict)\n        return _log_dict\n\n    def get_cost_info(self):\n        return self._modules.get_attrs('production_marginal_cost', 'absorption_marginal_cost', as_pandas=False)\n\n    def sample_action(self, strict_bound=False, sample_flex_modules=False):\n        \"\"\"\n        Get a random action within the microgrid's action space.\n\n        Parameters\n        ----------\n        strict_bound : bool, default False\n            If True, choose actions that is guaranteed to satisfy self.max_consumption and\n            self.max_production bounds. Otherwise selects action from min_act and min_act, which may not satisfy\n            instantaneous bounds.\n        sample_flex_modules : bool, default false\n            Whether to sample the flex modules in the microgrid.\n            ``run`` does not expect actions for flex modules.\n\n        Returns\n        -------\n\n        dict[str, list[float]]\n            Random action in the action space.\n\n        \"\"\"\n\n        module_iterator = self._modules.to_dict() if sample_flex_modules else self._modules.controllable.to_dict()\n        return {module_name: [module.sample_action(strict_bound=strict_bound) for module in module_list]\n                for module_name, module_list in module_iterator.items()\n                if module_list[0].action_space.shape[0]}\n\n    def get_empty_action(self, sample_flex_modules=False):\n        \"\"\"\n        Get an action for the microgrid with no values set.\n\n        Values are all ``None``; every ``None`` value should be replaced before passing an action to ``run``.\n\n        Parameters\n        ----------\n        sample_flex_modules : bool, default false\n            Whether to sample the flex modules in the microgrid.\n            ``run`` does not expect actions for flex modules.\n\n        Returns\n        -------\n\n        dict[str, list[None]]\n            Empty action.\n\n        \"\"\"\n        module_iterator = self._modules.to_dict() if sample_flex_modules else self._modules.controllable.to_dict()\n\n        return {module_name: [None]*len(module_list) for module_name, module_list in module_iterator.items()\n                if module_list[0].action_space.shape[0]}\n\n    def to_normalized(self, data_dict, act=False, obs=False):\n        \"\"\"\n        Normalize an action or observation.\n\n        Parameters\n        ----------\n        data_dict : dict[str, list[int]]\n            Action or observation to normalize. Dictionary keys are names of the modules while dictionary values\n            are lists containing an action corresponding to all modules with that name.\n        act : bool, default False\n            Set to True if you are normalizing an action.\n        obs : bool, default False\n            Set to True if you are normalizing an observation.\n\n        Returns\n        -------\n        dict[str, list[float]]\n            Normalized action.\n        \"\"\"\n        assert act + obs == 1, 'One of act or obs must be True but not both.'\n        return {module_name: [module.to_normalized(value, act=act, obs=obs) for module, value in zip(module_list, data_dict[module_name])]\n                for module_name, module_list in self._modules.iterdict() if module_name in data_dict}\n\n    def from_normalized(self, data_dict, act=False, obs=False):\n        \"\"\"\n        De-normalize an action or observation.\n\n        Parameters\n        ----------\n        data_dict : dict[str, list[int]]\n            Action or observation to de-normalize. Dictionary keys are names of the modules while dictionary values\n            are lists containing an action corresponding to all modules with that name.\n        act : bool, default False\n            Set to True if you are de-normalizing an action.\n        obs : bool, default False\n            Set to True if you are de-normalizing an observation.\n\n        Returns\n        -------\n        dict[str, list[float]]\n            De-normalized action.\n        \"\"\"\n        assert act + obs == 1, 'One of act or obs must be True but not both.'\n        return {module_name: [module.from_normalized(value, act=act, obs=obs) for module, value in zip(module_list, data_dict[module_name])]\n                for module_name, module_list in self._modules.iterdict() if module_name in data_dict}\n\n    def get_log(self, as_frame=True, drop_singleton_key=False):\n        \"\"\"\n\n        Collect a log of controls and responses of the microgrid.\n\n        Parameters\n        ----------\n        as_frame : bool, default True\n            Whether to return the log as a pd.DataFrame. If False, returns a nested dict.\n        drop_singleton_key : bool, default False\n            Whether to drop index level enumerating the modules by name if each module name has only one module.\n            Ignored otherwise.\n\n        Returns\n        -------\n        pd.DataFrame or dict\n\n        \"\"\"\n        _log_dict = dict()\n        for name, modules in self._modules.iterdict():\n            for j, module in enumerate(modules):\n                for key, value in module.log_dict().items():\n                    _log_dict[(name, j, key)] = value\n\n        for key, value in self._balance_logger.to_dict().items():\n            _log_dict[('balance', 0, key)] = value\n\n        for key, value in self._microgrid_logger.items():\n            _log_dict[(key, 0, '')] = value\n\n        col_names = ['module_name', 'module_number', 'field']\n\n        df = pd.DataFrame(_log_dict, index=pd.RangeIndex(start=self.initial_step, stop=self.current_step))\n        df.columns = pd.MultiIndex.from_tuples(df.columns.to_list(), names=col_names)\n\n        if drop_singleton_key:\n            df.columns = df.columns.remove_unused_levels()\n\n        if as_frame:\n            return df\n\n        return df.to_dict()\n\n    def set_forecaster(self,\n                       forecaster,\n                       forecast_horizon=DEFAULT_HORIZON,\n                       forecaster_increase_uncertainty=False,\n                       forecaster_relative_noise=False):\n        \"\"\"\n        Set the forecaster for timeseries modules in the microgrid.\n\n        You may either pass in a single value for ``forecaster`` to apply the same forecasting logic to all timeseries\n        modules, or pass key-value pairs in a ``dict`` to set the forecaster for specific modules. In the latter case,\n        you may also set different forecasters for each named module. See :meth:`.get_forecaster` for additional details\n        on setting forecasters.\n\n        forecaster : callable, float, \"oracle\", None, or dict.\n            Function that gives a forecast n-steps ahead.\n\n            * If ``callable``, must take as arguments ``(val_c: float, val_{c+n}: float, n: int)``, where\n\n              * ``val_c`` is the current value in the time series: ``self.time_series[self.current_step]``\n\n              * ``val_{c+n}`` is the value in the time series n steps in the future\n\n              * n is the number of steps in the future at which we are forecasting.\n\n              The output ``forecast = forecaster(val_c, val_{c+n}, n)`` must have the same sign\n              as the inputs ``val_c`` and ``val_{c+n}``.\n\n            * If ``float``, serves as a standard deviation for a mean-zero gaussian noise function\n              that is added to the true value.\n\n            * If ``\"oracle\"``, gives a perfect forecast.\n\n            * If ``None``, no forecast.\n\n            * If ``dict``, must contain key-value pairs of the form ``module_name: forecaster``.\n              Will set the forecaster of the module corresponding to ``module_name`` using the logic above.\n\n\n        forecast_horizon : int\n            Number of steps in the future to forecast. If forecaster is None, this parameter is ignored and the resultant\n            horizon will be zero.\n\n        forecaster_increase_uncertainty : bool, default False\n            Whether to increase uncertainty for farther-out dates if using a GaussianNoiseForecaster. Ignored otherwise.\n\n        forecaster_relative_noise : bool, default False\n            Whether to define noise standard deviation relative to mean of time series if using\n            :class:`.GaussianNoiseForecaster`. Ignored otherwise.\n\n        \"\"\"\n        if isinstance(forecaster, dict):\n            for module_name, _forecaster in forecaster.items():\n                if module_name not in self._modules.names():\n                    raise NameError(f'Unrecognized module {module_name}.')\n\n                try:\n                    self._modules[module_name].set_forecaster(\n                        _forecaster,\n                        forcast_horizon=forecast_horizon,\n                        forecaster_increase_uncertainty=forecaster_increase_uncertainty,\n                        forecaster_relative_noise=forecaster_relative_noise\n                    )\n                except AttributeError:\n                    pass\n        else:\n            for module in self._modules.iterlist():\n                try:\n                    module.set_forecaster(\n                        forecaster,\n                        forecast_horizon=forecast_horizon,\n                        forecaster_increase_uncertainty=forecaster_increase_uncertainty,\n                        forecaster_relative_noise=forecaster_relative_noise\n                    )\n                except AttributeError:\n                    pass\n\n    def get_forecast_horizon(self):\n        \"\"\"\n        Get the forecast horizon of timeseries modules contained in the microgrid.\n\n        Returns\n        -------\n        int\n            The forecast horizon.\n\n        Raises\n        ------\n        ValueError\n            If horizons between modules are inconsistent.\n\n        \"\"\"\n        horizons = []\n        for module in self._modules.iterlist():\n            try:\n                horizons.append(module.forecast_horizon)\n            except AttributeError:\n                pass\n\n        if len(horizons) == 0:\n            warn(f\"No forecast horizon found in microgrid.modules. Using default horizon {DEFAULT_HORIZON}\")\n            return DEFAULT_HORIZON\n        elif not np.min(horizons) == np.max(horizons):\n            raise ValueError(f\"Mismatched forecast_horizons found: {horizons}\")\n\n        return horizons[0]\n\n    def set_module_attr(self, attr_name, value):\n        \"\"\"\n        Set the value of an attribute in all modules containing that attribute.\n\n        Does nothing in modules not already containing the attribute.\n\n        Parameters\n        ----------\n        attr_name : str\n            Name of the module attribute.\n        value : any\n            Value to set the attribute to.\n\n        Raises\n        ------\n        AttributeError\n            If no module has the attribute.\n\n        \"\"\"\n        set_at_least_one = False\n\n        for module in self._modules.iterlist():\n            if not hasattr(module, attr_name):\n                continue\n\n            setattr(module, attr_name, value)\n            set_at_least_one = True\n\n        if not set_at_least_one:\n            raise AttributeError(f\"No module has attribute '{attr_name}'.\")\n\n    @property\n    def current_step(self):\n        \"\"\"\n        Current step of underlying modules.\n\n        Returns\n        -------\n        current_step : int\n            Current step.\n        \"\"\"\n        return self._modules.get_attrs('current_step', unique=True).item()\n\n    @property\n    def initial_step(self):\n        \"\"\"\n        Initial step at which to start underlying timeseries data.\n\n        The step to which :attr:`.current_step` is reset to when calling :meth:`.reset`.\n\n        Returns\n        -------\n        initial_step : int\n            Initial step.\n        \"\"\"\n        return self._initial_step\n\n    def _get_module_initial_step(self):\n        initial_step = self.modules.get_attrs('initial_step', unique=True)\n        try:\n            return initial_step.item()\n        except ValueError:\n            if initial_step.empty:\n                return 0\n\n    @initial_step.setter\n    def initial_step(self, value):\n        self._set_initial_step(value)\n\n    def _set_initial_step(self, value, modules_only=False):\n        self.set_module_attr('initial_step', value)\n        if not modules_only:\n            self._initial_step = self._get_module_initial_step()\n\n    @property\n    def final_step(self):\n        \"\"\"\n        Final step of underlying timeseries data.\n\n        Returns\n        -------\n        final_step : int\n            Final step.\n        \"\"\"\n        return self._final_step\n\n    def _get_module_final_step(self):\n        final_step = self.modules.get_attrs('final_step', unique=True)\n        try:\n            return final_step.item()\n        except ValueError:\n            if final_step.empty:\n                return np.inf\n\n    @final_step.setter\n    def final_step(self, value):\n        self._set_final_step(value)\n\n    def _set_final_step(self, value, modules_only=False):\n        self.set_module_attr('final_step', value)\n        if not modules_only:\n            self._final_step = self._get_module_final_step()\n\n    @property\n    def modules(self):\n        \"\"\"\n        View of the module container.\n\n        Returns\n        -------\n        modules : :class:`pymgrid.modules.module_container.ModuleContainer`\n            View of the container.\n\n        \"\"\"\n        return self._modules\n\n    def state_dict(self, normalized=False):\n        \"\"\"\n        State of the microgrid as a dict.\n\n        Keys are module names and values are lists of state dicts for all modules with said name.\n\n        Parameters\n        ----------\n        normalized : bool, default False\n            Whether to return a dict of normalized values.\n\n        Returns\n        -------\n        state_dict : dict[str, list[dict]]\n            State of the microgrid as a nested dict.\n\n        \"\"\"\n        return {name: [\n            module.state_dict(normalized=normalized) for module in modules\n        ] for name, modules in self._modules.iterdict()}\n\n    @property\n    def log(self):\n        \"\"\"\n        Microgrid's log as a DataFrame.\n\n        This is equivalent to `:meth:`get_log`.\n\n        Returns\n        -------\n        log : pd.DataFrame\n            The log of the microgrid.\n\n        \"\"\"\n        return self.get_log()\n\n    def state_series(self, normalized=False):\n        \"\"\"\n        State of the microgrid as a pandas Series.\n\n        Three are three levels in the MultiIndex: ``microgrid_name``, ``microgrid_number``\n        (relative to each ``microgrid_name``) and state key name.\n\n        Parameters\n        ----------\n        normalized : bool, default False\n            Whether to return a Series of normalized values.\n\n        Returns\n        -------\n        state : pd.Series\n            State of the microgrid as a pandas Series..\n\n        \"\"\"\n        return pd.Series(\n            {\n                (name, num, key): value\n                for name, sd_list in self.state_dict(normalized=normalized).items()\n                for num, sd in enumerate(sd_list)\n                for key, value in sd.items()\n            }\n        )\n\n    @property\n    def fixed(self):\n        \"\"\"\n        List of all fixed modules in the microgrid.\n\n        Returns\n        -------\n        list of modules\n        \"\"\"\n        return self._modules.fixed\n\n    @property\n    def flex(self):\n        \"\"\"\n        List of all flex modules in the microgrid.\n\n        Returns\n        -------\n        list\n            The list of modules\n        \"\"\"\n        return self._modules.flex\n\n    @property\n    def controllable(self):\n        \"\"\"\n        List of all controllable modules in the microgrid.\n\n        Returns\n        -------\n        list of modules\n        \"\"\"\n        return self._modules.controllable\n\n    @property\n    def module_list(self):\n        \"\"\"\n        List of all modules in the microgrid.\n\n        Returns\n        -------\n        list\n            The list of modules\n\n        \"\"\"\n        return self._modules.to_list()\n\n    @property\n    def n_modules(self):\n        \"\"\"\n        Number of modules in the microgrid.\n\n        Returns\n        -------\n        int\n        \"\"\"\n        return len(self._modules)\n\n    def dump(self, stream=None):\n        \"\"\"\n        Save a microgrid to a YAML buffer.\n\n        Supports both strings of YAML or storing YAML in a path-like object.\n\n        Parameters\n        ----------\n        stream : file-like object or None, default None\n            Stream to save the YAML document. If None, returns the document instead.\n\n        Returns\n        -------\n        str or None :\n            Returns the YAMl document as a string if ``stream=None``. Returns None otherwise\n\n        .. note::\n\n            ``dump`` handles the serialization of array-like objects (e.g. time series and logs) differently depending\n            on the value of ``stream``.  If ``stream is None``, array-like objects are serialized inline. If ``stream`` is\n            a stream to a file-like object, however, array-like objects will be serialized as `.csv.gz` files in a\n            directory relative to ``stream``, and the relative locations stored inline in the YAML file. For an example of\n            this behavior, see `data/scenario/pymgrid25/microgrid_0`.\n\n        \"\"\"\n        return yaml.safe_dump(self, stream=stream)\n\n    @classmethod\n    def load(cls, stream):\n        \"\"\"\n        Load a microgrid from a yaml buffer.\n\n        Supports both strings of YAML or YAML stored in a path-like object.\n\n        Parameters\n        ----------\n        stream : str or file-like object\n            YAML document. Can be either a string of loaded YAML or a stream to a local file containing a YAML document.\n\n        Returns\n        -------\n        Microgrid : the loaded microgrid.\n\n        \"\"\"\n        return yaml.safe_load(stream)\n\n    @classmethod\n    def to_yaml(cls, dumper, data):\n        \"\"\"\n        :meta private:\n        \"\"\"\n        add_numpy_pandas_representers()\n        return dumper.represent_mapping(cls.yaml_tag, data.serialize(dumper.stream), flow_style=cls.yaml_flow_style)\n\n    @classmethod\n    def from_yaml(cls, loader, node):\n        \"\"\"\n        :meta private:\n        \"\"\"\n        add_numpy_pandas_constructors()\n        mapping = loader.construct_mapping(node, deep=True)\n\n        if 'scenario' in mapping:\n            microgrid_number = mapping.pop('scenario')\n            if len(mapping):\n                warn(f'Ignoring keys {mapping.keys()} when loading from scenario.')\n            return cls.from_scenario(microgrid_number)\n\n        instance = cls(mapping[\"modules\"], add_unbalanced_module=False)\n        instance._balance_logger = instance._balance_logger.from_raw(mapping.get(\"balance_log\"))\n        instance.trajectory_func = mapping.get('trajectory_func', None)\n        instance._initial_step = mapping.get('initial_step', instance.initial_step)\n        instance._final_step = mapping.get('final_step', instance.final_step)\n        return instance\n\n    def serialize(self, dumper_stream):\n        \"\"\"\n        :meta private:\n        \"\"\"\n        return dump_data(self._serialization_data(), dumper_stream, self.yaml_tag)\n\n    def _serialization_data(self):\n        return {\n            \"modules\": self._modules.to_tuples(),\n            'trajectory_func': self.trajectory_func,\n            'initial_step': self.initial_step,\n            'final_step': self.final_step,\n            **self._balance_logger.serialize(\"balance_log\")\n        }\n\n    @classmethod\n    def from_nonmodular(cls, nonmodular):\n        \"\"\"\n        Convert to Microgrid from old-style NonModularMicrogrid.\n\n        Parameters\n        ----------\n        nonmodular : pymgrid.NonModularMicrogrid\n            Non-modular (old-style) microgrid to be converted.\n\n        Returns\n        -------\n        converted : pymgrid.Microgrid\n            New-style modular microgrid.\n\n        See Also\n        --------\n        pymgrid.Microgrid.to_nonmodular : Converter from new-style to old-style.\n\n        .. warning::\n\n            Any logs that have accumulated will be lost in conversion.\n\n        \"\"\"\n        from pymgrid.convert.convert import to_modular\n        return to_modular(nonmodular)\n\n    def to_nonmodular(self):\n        \"\"\"\n        Convert Microgrid to old-style NonModularMicrogrid.\n\n        Returns\n        -------\n        converted : pymgrid.NonModularMicrogrid\n            Old-style microgrid.\n\n        See Also\n        --------\n        :meth:`Microgrid.to_modular` : Converter from old-style to new-style.\n\n        .. warning::\n\n            Any logs that have accumulated will be lost in conversion.\n\n        \"\"\"\n        from pymgrid.convert.convert import to_nonmodular\n        return to_nonmodular(self)\n\n    @classmethod\n    def from_scenario(cls, microgrid_number=0):\n        \"\"\"\n        Load one of the *pymgrid25* benchmark microgrids.\n\n        Parameters\n        ----------\n        microgrid_number : int, default 0\n            Number of the microgrid to return. ``0<=microgrid_number<25``.\n\n        Returns\n        -------\n        scenario : pymgrid.Microgrid\n            The loaded microgrid.\n        \"\"\"\n        from pymgrid import PROJECT_PATH\n        n = microgrid_number\n\n        if n not in np.arange(25):\n            raise TypeError(f'Invalid microgrid_number {n}, must be an integer in the range [0, 25).')\n\n        with open(PROJECT_PATH / f\"data/scenario/pymgrid25/microgrid_{n}/microgrid_{n}.yaml\", \"r\") as f:\n            return cls.load(f)\n\n    def _dir_additions(self):\n        return {\n            x for x in dir(self._modules) if\n            not x.startswith('_') and not callable(getattr(self._modules, x)) and x in self._modules\n        }\n\n    def __dir__(self):\n        rv = set(super().__dir__())\n        rv = rv | self._dir_additions()\n        return sorted(rv)\n\n    def __getnewargs__(self):\n        return (self.modules.to_tuples(), )\n\n    def __len__(self):\n        \"\"\"\n        Length of available underlying data.\n        \"\"\"\n        l = []\n        for module in self.modules.iterlist():\n            try:\n                l.append(len(module))\n            except TypeError:\n                pass\n\n        return min(l)\n\n    def __eq__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n\n        return all([\n            self.modules == other.modules,\n            self._balance_logger == other._balance_logger,\n            self.trajectory_func == other.trajectory_func])\n\n    def __repr__(self):\n        module_str = [name + ' x ' + str(len(modules)) for name, modules in self._modules.iterdict()]\n        module_str = ', '.join(module_str)\n        return f'Microgrid([{module_str}])'\n\n    def __getattr__(self, item):\n        if item.startswith(\"__\") or item == \"_modules\":\n            raise AttributeError\n\n        if item in self._modules:\n            return self._modules[item]\n\n        return object.__getattribute__(self, item)\n"
  },
  {
    "path": "src/pymgrid/microgrid/reward_shaping/__init__.py",
    "content": "from .pv_curtailment_shaper import PVCurtailmentShaper\nfrom .battery_discharge_shaper import BatteryDischargeShaper\n"
  },
  {
    "path": "src/pymgrid/microgrid/reward_shaping/base.py",
    "content": "import yaml\n\nfrom abc import abstractmethod\n\n\nclass BaseRewardShaper(yaml.YAMLObject):\n    yaml_dumper = yaml.SafeDumper\n    yaml_loader = yaml.SafeLoader\n\n    @staticmethod\n    def sum_module_val(info, module_name, module_attr):\n        try:\n            module_info = info[module_name]\n            return sum([d[module_attr] for d in module_info])\n        except KeyError:\n            return 0.0\n\n    @abstractmethod\n    def __call__(self, step_info, cost_info):\n        pass\n\n    def __repr__(self):\n        return f'{self.__class__.__name__}()'\n"
  },
  {
    "path": "src/pymgrid/microgrid/reward_shaping/battery_discharge_shaper.py",
    "content": "import numpy as np\n\nfrom pymgrid.microgrid.reward_shaping.base import BaseRewardShaper\n\n\nclass BatteryDischargeShaper(BaseRewardShaper):\n    \"\"\"\n    Reward is the percentage of load that is met by battery discharging.\n\n     Return a value in [-1, 1]. Value of -1 implies that all load was loss load. Value of 1 implies all load\n     was met by battery.\n\n    Use in a config with\n\n    microgrid:\n        attributes:\n            reward_shaping_func: !BatteryDischargeShaper {}\n\n    \"\"\"\n    yaml_tag = u\"!BatteryDischargeShaper\"\n\n    def __call__(self, step_info, cost_info):\n        battery_discharge = self.sum_module_val(step_info, 'battery', 'provided_energy')\n        load = self.sum_module_val(step_info, 'load', 'absorbed_energy')\n        loss_load = self.sum_module_val(step_info, 'unbalanced_energy', 'provided_energy')\n\n        # battery_discharge is in [0, load-loss_load]; loss_load is in [0, load].\n        try:\n            percent_battery = (battery_discharge - loss_load) / load\n        except ZeroDivisionError:\n            return 0.0\n\n        assert -1 <= percent_battery <= 1 or np.isclose(percent_battery, 1) or np.isclose(percent_battery, 0)\n        return percent_battery\n"
  },
  {
    "path": "src/pymgrid/microgrid/reward_shaping/pv_curtailment_shaper.py",
    "content": "from pymgrid.microgrid.reward_shaping.base import BaseRewardShaper\n\n\nclass PVCurtailmentShaper(BaseRewardShaper):\n    \"\"\"\n    Use in a config with \n    \n    microgrid:\n        attributes:\n            reward_shaping_func: !PVCurtailmentShaper {}\n    \"\"\"\n\n    yaml_tag = u\"!PVCurtailmentShaper\"\n\n    def __call__(self, step_info, cost_info):\n        pv_curtailment = self.sum_module_val(step_info, 'pv', 'curtailment')\n        return -1.0 * pv_curtailment\n"
  },
  {
    "path": "src/pymgrid/microgrid/trajectory/__init__.py",
    "content": "from .deterministic import DeterministicTrajectory\nfrom .stochastic import StochasticTrajectory, FixedLengthStochasticTrajectory\n"
  },
  {
    "path": "src/pymgrid/microgrid/trajectory/base.py",
    "content": "import inspect\nimport yaml\n\nfrom abc import abstractmethod\n\n\nclass BaseTrajectory(yaml.YAMLObject):\n    yaml_dumper = yaml.SafeDumper\n    yaml_loader = yaml.SafeLoader\n\n    @abstractmethod\n    def __call__(self, initial_step, final_step):\n        pass\n\n    def __repr__(self):\n        params = inspect.signature(self.__init__).parameters\n        formatted_params = ', '.join([f'{p}={getattr(self, p)}' for p in params])\n        return f'{self.__class__.__name__}({formatted_params})'\n\n    def __eq__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n        return repr(self) == repr(other)\n"
  },
  {
    "path": "src/pymgrid/microgrid/trajectory/deterministic.py",
    "content": "from pymgrid.microgrid.trajectory.base import BaseTrajectory\n\n\nclass DeterministicTrajectory(BaseTrajectory):\n    yaml_tag = u\"!DeterministicTrajectory\"\n\n    def __init__(self, initial_step, final_step):\n        self.initial_step = initial_step\n        self.final_step = final_step\n\n    def __call__(self, initial_step, final_step):\n        return self.initial_step, self.final_step\n"
  },
  {
    "path": "src/pymgrid/microgrid/trajectory/stochastic.py",
    "content": "import numpy as np\n\nfrom pymgrid.microgrid.trajectory.base import BaseTrajectory\n\n\nclass StochasticTrajectory(BaseTrajectory):\n    yaml_tag = u\"!StochasticTrajectory\"\n\n    def __call__(self, initial_step, final_step):\n\n        initial = np.random.randint(initial_step, final_step-2)\n        final = np.random.randint(initial, final_step)\n\n        return initial, final\n\n\nclass FixedLengthStochasticTrajectory(BaseTrajectory):\n    yaml_tag = u\"!FixedLengthStochasticTrajectory\"\n\n    def __init__(self, trajectory_length):\n        self.trajectory_length = trajectory_length\n\n    def __call__(self, initial_step, final_step):\n        if final_step - initial_step < self.trajectory_length:\n            raise ValueError(f'Cannot create a trajectory of length {self.trajectory_length}'\n                             f'between initial_step ({initial_step}) and final_step ({final_step})')\n\n        initial = np.random.randint(initial_step, final_step-self.trajectory_length)\n\n        return initial, initial + self.trajectory_length\n"
  },
  {
    "path": "src/pymgrid/microgrid/utils/__init__.py",
    "content": ""
  },
  {
    "path": "src/pymgrid/microgrid/utils/step.py",
    "content": "import numpy as np\n\n\nclass MicrogridStep:\n    def __init__(self, reward_shaping_func=None, cost_info=None):\n        self._reward_shaping_func = reward_shaping_func\n        self.cost_info = cost_info\n        self._obs = dict()\n        self._reward = 0.0\n        self._done = False\n        self._info = dict(absorbed_energy=[], provided_energy=[])\n\n    def append(self, module_name, obs, reward, done, info):\n        try:\n            self._obs[module_name].append(obs)\n        except KeyError:\n            self._obs[module_name] = [obs]\n        self._reward += reward\n        if done:\n            self._done = True\n\n        try:\n            self._info[module_name].append(info)\n        except KeyError:\n            self._info[module_name] = [info]\n\n        for key, value in info.items():\n            try:\n                self._info[key].append(value)\n            except KeyError:\n                pass\n\n    def balance(self):\n        provided_energy = np.sum(self._info['provided_energy'])\n        absorbed_energy = np.sum(self._info['absorbed_energy'])\n        return provided_energy, absorbed_energy, self._reward, self.shaped_reward()\n\n    def output(self):\n        return self._obs, self.shaped_reward(), self._done, self._output_info()\n\n    def shaped_reward(self):\n        if self._reward_shaping_func is not None:\n            assert isinstance(self.cost_info, dict)\n            return self._reward_shaping_func(self._output_info(), self.cost_info)\n\n        return self._reward\n\n    def _output_info(self):\n        return {k: v for k, v in self._info.items() if k not in ('absorbed_energy', 'provided_energy')}\n\n    @property\n    def obs(self):\n        return self._obs\n\n    @property\n    def reward(self):\n        return self._reward\n\n    @property\n    def done(self):\n        return self._done\n\n    @property\n    def info(self):\n        return self._info"
  },
  {
    "path": "src/pymgrid/modules/__init__.py",
    "content": "from .battery_module import BatteryModule\nfrom .genset_module import GensetModule\nfrom .grid_module import GridModule\nfrom .load_module import LoadModule\nfrom .renewable_module import RenewableModule\nfrom .unbalanced_energy_module import UnbalancedEnergyModule\n\nfrom .module_container import ModuleContainer\n"
  },
  {
    "path": "src/pymgrid/modules/base/__init__.py",
    "content": "from .base_module import BaseMicrogridModule\nfrom .timeseries.base_timeseries_module import BaseTimeSeriesMicrogridModule\n"
  },
  {
    "path": "src/pymgrid/modules/base/base_module.py",
    "content": "from abc import abstractmethod\nimport inspect\nimport logging\nimport yaml\nimport numpy as np\n\nfrom warnings import warn\n\nfrom pymgrid.utils.logger import ModularLogger\nfrom pymgrid.utils.space import ModuleSpace\nfrom pymgrid.utils.serialize import add_numpy_pandas_representers, add_numpy_pandas_constructors, dump_data\n\n\nscript_logger = logging.getLogger(__name__)\n\n\nclass BaseMicrogridModule(yaml.YAMLObject):\n    \"\"\"\n    Base class for all microgrid _modules.\n    All values passed to step(self) that result in non-negative\n    \"\"\"\n    module_type = None\n    \"\"\"\n    Type of the module.\n\n    Returns : tuple[str, {'fixed', 'flex', 'controllable'}]\n        length-two tuple denoting the name of the module class and whether it is a fixed, flex, or controllable module.\n\n    \"\"\"\n    yaml_tag = None\n    \"\"\"\n    Tag used for yaml serialization.\n    \"\"\"\n\n    _energy_pos = 0\n\n    def __init__(self,\n                 raise_errors,\n                 initial_step=0,\n                 provided_energy_name='provided_energy',\n                 absorbed_energy_name='absorbed_energy'\n                 ):\n\n        self.raise_errors = raise_errors\n        self.initial_step = initial_step\n        self._current_step = initial_step\n        self._action_space = self._get_action_spaces()\n        self._observation_space = self._get_observation_spaces()\n        self.provided_energy_name, self.absorbed_energy_name = provided_energy_name, absorbed_energy_name\n        self._logger = ModularLogger()\n        self.name = (None, None)  # set by ModularMicrogrid\n\n    def _get_action_spaces(self):\n        unnormalized_low = self.min_act if isinstance(self.min_act, np.ndarray) else np.array([self.min_act])\n        unnormalized_high = self.max_act if isinstance(self.max_act, np.ndarray) else np.array([self.max_act])\n        return ModuleSpace(unnormalized_low=unnormalized_low,\n                           unnormalized_high=unnormalized_high)\n\n    def _get_observation_spaces(self):\n        unnormalized_low = self.min_obs if isinstance(self.min_obs, np.ndarray) else np.array([self.min_obs])\n        unnormalized_high = self.max_obs if isinstance(self.max_obs, np.ndarray) else np.array([self.max_obs])\n        return ModuleSpace(unnormalized_low=unnormalized_low,\n                           unnormalized_high=unnormalized_high)\n\n    def reset(self):\n        \"\"\"\n        Reset the module to step zero and flush the log.\n\n        Returns\n        -------\n        np.ndarray\n            Normalized observation after resetting.\n\n        \"\"\"\n        self._update_step(reset=True)\n        self._logger.flush()\n        return self.to_normalized(self.state, obs=True)\n\n    def _raise_error(self, ask_value, available_value, as_source=False, as_sink=False, lower_bound=False):\n        assert as_source + as_sink == 1, 'Must act as either source or sink but not both or neither.'\n        name = self.__class__.__name__\n        ask_v = round(ask_value, 2)\n        available_v = round(available_value, 2)\n\n        if as_source:\n            if lower_bound:\n                raise ValueError(f'Module {name} unable to supply requested value {ask_v} as a source. '\n                             f'Must supply at least: {available_v}.')\n            raise ValueError(f'Module {name} unable to supply requested value {ask_v} as a source. '\n                             f'Max currently available: {available_v}.')\n        else:\n            raise ValueError(f'Module {name} unable to absorb requested value {ask_v} as a sink. '\n                             f'Max currently capable of absorbing: {available_v}.')\n\n    def step(self, action, normalized=True):\n        \"\"\"\n        Take one step in the module, attempting to draw or send ``action`` amount of energy.\n\n        Parameters\n        ----------\n        action : float or np.ndarray, shape (1,)\n            The amount of energy to draw or send.\n\n            If ``normalized``, the action is assumed to be normalized and is un-normalized into the range\n            [:attr:`.BaseModule.min_act`, :attr:`.BaseModule.max_act`].\n\n            If the **unnormalized** action is positive, the module acts as a source and provides energy to the\n            microgrid. Otherwise, the module acts as a sink and absorbs energy.\n\n            If the unnormalized action implies acting as a sink and ``is_sink`` is False -- or the converse -- an\n            ``AssertionError`` is raised.\n\n        normalized : bool, default True\n            Whether ``action`` is normalized. If True, action is assumed to be normalized and is un-normalized into the\n            range [:attr:`.BaseModule.min_act`, :attr:`.BaseModule.max_act`].\n\n        Raises\n        ------\n        AssertionError\n            If action implies acting as a source and module is not a source. Likewise if action implies acting as a\n            sink and module is not a sink.\n\n        Returns\n        -------\n        observation : np.ndarray\n            State of the module after taking action ``action``.\n        reward : float\n            Reward/cost after taking the action.\n        done : bool\n            Whether the module terminates.\n        info : dict\n            Additional information from this step.\n            Will include either``provided_energy`` or ``absorbed_energy`` as a key, denoting the amount of energy\n            this module provided to or absorbed from the microgrid.\n\n        \"\"\"\n\n        denormalized_action = self._action_space.denormalize(action) if normalized else action\n\n        try:\n            denormalized_action = denormalized_action[self._energy_pos]\n        except (IndexError, TypeError):\n            if not isinstance(denormalized_action, (float, int)):\n                try:\n                    flat_dim = np.product(denormalized_action.shape)\n                    assert flat_dim == 0\n                except (AttributeError, AssertionError):\n                    raise ValueError(f'Bad action {denormalized_action}')\n                else:\n                    denormalized_action = 0.0\n\n        state_dict = self.state_dict()\n        reward, done, info = self._unnormalized_step(denormalized_action)\n        self._log(state_dict, reward=reward, **info)\n        self._update_step()\n\n        obs = self.to_normalized(self.state, obs=True)\n\n        return obs, reward, done, info\n\n    def _unnormalized_step(self, unnormalized_action):\n        if unnormalized_action > 0:\n            return self.as_source(unnormalized_action)\n        elif unnormalized_action < 0:\n            return self.as_sink(-1.0*unnormalized_action)\n        else:\n            if self.is_source:\n                return self.as_source(unnormalized_action)\n            else:\n                assert self.is_sink\n                return self.as_sink(-1.0 * unnormalized_action)\n\n    def as_source(self, energy_demand):\n        \"\"\"\n        Act as an energy source to the microgrid.\n\n        Microgrid will attempt to provide ``energy_demand`` amount of energy.\n        Examples of this include discharging a battery, importing from a grid, or using renewables.\n\n        It is assumed that ``energy_demand>=0``.\n\n        Parameters\n        ----------\n        energy_demand : float\n            Amount of energy that the microgrid is requesting. Must be non-negative.\n\n        Returns\n        -------\n        reward : float\n            Reward/cost after attempting the satisfy the energy demand.\n        done : bool\n            Whether the module terminates.\n        info : dict\n            Additional information from this step.\n            Will include``provided_energy`` as a key, denoting the amount of energy\n            this module provided to the microgrid.\n\n        Raises\n        ------\n        AssertionError\n            If ``energy_demand<0`` or the module is not a source.\n\n        \"\"\"\n\n        assert energy_demand >= 0\n        assert self.is_source, f'step() was called with positive energy (source) for module {self} but ' \\\n                               f'module is not a source and ' \\\n                               f'can only be called with negative energy.'\n\n        if self.module_type[-1] == 'fixed':\n            return self.update(None, as_source=True)\n\n        if energy_demand > self.max_production:\n            if self.raise_errors:\n                self._raise_error(energy_demand, self.max_production, as_source=True)\n            provided_energy = self.max_production\n\n        elif energy_demand < self.min_production:\n            if self.raise_errors:\n                self._raise_error(energy_demand, self.min_production, as_source=True, lower_bound=True)\n            provided_energy = self.min_production\n\n        else:\n            provided_energy = energy_demand\n\n        return self.update(provided_energy, as_source=True)\n\n    def as_sink(self, energy_excess):\n        \"\"\"\n        Act as an energy sink to the microgrid.\n\n        Microgrid will attempt to provide ``energy_excess`` amount of energy.\n        Examples of this include charging a battery, exporting from a grid, or meeting a load.\n\n        It is assumed that ``energy_excess>=0``.\n\n        Parameters\n        ----------\n        energy_excess : float\n            Amount of energy that the microgrid is attempting to dissipate. Must be non-negative.\n\n        Returns\n        -------\n        reward : float\n            Reward/cost after attempting the absorb the energy excess.\n        done : bool\n            Whether the module terminates.\n        info : dict\n            Additional information from this step.\n            Will include``absorbed_energy`` as a key, denoting the amount of energy\n            this module provided to the microgrid.\n\n        Raises\n        ------\n        AssertionError\n            If ``energy_excess<0`` or the module is not a sink.\n\n        \"\"\"\n\n        assert energy_excess >= 0\n\n        if self.module_type[-1] == 'fixed':\n            return self.update(None, as_sink=True)\n\n        if energy_excess > self.max_consumption:\n            if self.raise_errors:\n                self._raise_error(energy_excess, self.max_consumption, as_sink=True)\n            absorbed_energy = self.max_consumption\n        else:\n            absorbed_energy = energy_excess\n\n        assert absorbed_energy >= 0\n\n        return self.update(absorbed_energy, as_sink=True)\n\n    def _log(self, state_dict_pre_step, provided_energy=None, absorbed_energy=None, **info):\n        _info = info.copy()\n\n        if self.provided_energy_name is not None:\n            _info[self.provided_energy_name] = provided_energy if provided_energy is not None else 0.0\n        else:\n            assert provided_energy is None, 'Cannot log provided_energy with NoneType provided_energy_name.'\n\n        if self.absorbed_energy_name is not None:\n            _info[self.absorbed_energy_name] = absorbed_energy if absorbed_energy is not None else 0.0\n        else:\n            assert absorbed_energy is None, 'Cannot log absorbed_energy with NoneType absorbed_energy_name.'\n\n        _info.update(state_dict_pre_step)\n        self._logger.log(**_info)\n\n    def _update_step(self, reset=False):\n        if reset:\n            self._current_step = self.initial_step\n        else:\n            self._current_step += 1\n\n    @abstractmethod\n    def update(self, external_energy_change, as_source=False, as_sink=False):\n        \"\"\"\n        Update the state of the module given an energy request.\n\n        Parameters\n        ----------\n        external_energy_change : float or None\n            Amount of energy to provide or absorb.\n        as_source : bool\n            Whether the module is acting as a source.\n        as_sink\n            Whether the module is acting as a sink.\n\n        Returns\n        -------\n        reward : float\n            Reward/cost after attempting the absorb the energy excess.\n        done : bool\n            Whether the module terminates.\n        info : dict\n            Additional information from this step.\n            Will include``absorbed_energy`` as a key, denoting the amount of energy\n            this module provided to the microgrid.\n        \"\"\"\n\n        pass\n\n    def sample_action(self, strict_bound=False):\n        \"\"\"\n        Sample an action from the module's action space.\n\n        Parameters\n        ----------\n        strict_bound : bool, default False\n            If True, choose action that is guaranteed to satisfy self.max_consumption and\n            self.max_production bounds. Otherwise select action from min_act and min_act, which may not satisfy\n            instantaneous bounds.\n\n        Returns\n        -------\n        float\n            An action within the action space for this module.\n\n        \"\"\"\n\n        min_bound, max_bound = 0, 1\n\n        if strict_bound:\n            if self.is_sink:\n                min_bound = self._action_space.normalize(-1 * self.max_consumption)\n                if np.isnan(min_bound):\n                    min_bound = 0\n\n            if self.is_source:\n                max_bound = self._action_space.normalize(self.max_production)\n                if np.isnan(max_bound):\n                    max_bound = 0\n        return np.random.rand()*(max_bound-min_bound) + min_bound\n\n    def to_normalized(self, value, act=False, obs=False):\n        \"\"\"\n        Normalize an action or observation.\n\n        Parameters\n        ----------\n        value : scalar or array-like\n            Action or observation to normalize.\n        act : bool, default False\n            Set to True if you are normalizing an action.\n        obs : bool, default False\n            Set to True if you are normalizing an observation.\n\n        Returns\n        -------\n        np.ndarray\n            Normalized action.\n\n        \"\"\"\n        assert act + obs == 1, 'One of act or obs must be True but not both.'\n        if act:\n            return self._action_space.normalize(value)\n        else:\n            return self._observation_space.normalize(value)\n\n    def from_normalized(self, value, act=False, obs=False):\n        \"\"\"\n        Un-normalize an action or observation.\n\n        Parameters\n        ----------\n        value : scalar or array-like\n            Action or observation to un-normalize.\n        act : bool, default False\n            Set to True if you are un-normalizing an action.\n        obs : bool, default False\n            Set to True if you are un-normalizing an observation.\n\n        Returns\n        -------\n        np.ndarray\n            Un-normalized action.\n\n        \"\"\"\n        assert act + obs == 1, 'One of act or obs must be True but not both.'\n        if act:\n            return self._action_space.denormalize(value)\n        if obs:\n            return self._observation_space.denormalize(value)\n\n    def log_dict(self):\n        \"\"\"\n        Module's log as a dict.\n\n        Returns\n        -------\n        dict\n\n        \"\"\"\n        return self._logger.to_dict()\n\n    def log_frame(self):\n        \"\"\"\n        Module's log as a DataFrame.\n\n        Returns\n        -------\n        log : pd.DataFrame\n\n        \"\"\"\n        return self._logger.to_frame()\n\n    @property\n    def log(self):\n        \"\"\"\n        Module's log as a DataFrame.\n\n        Equivalent to :meth:`log_frame`.\n\n        Returns\n        -------\n        log : pd.DataFrame\n\n        \"\"\"\n        return self.log_frame()\n\n    @property\n    def logger(self):\n        \"\"\"\n        The module's logger.\n\n        Returns\n        -------\n        logger : ModularLogger\n\n        \"\"\"\n        return self._logger\n\n    @property\n    def logger_last(self):\n        \"\"\"\n        The most recent entry in the log.\n\n        Returns\n        -------\n        entry : dict\n\n        \"\"\"\n        return {k: v[-1] for k, v in self._logger}\n\n    @logger.setter\n    def logger(self, logger):\n        assert isinstance(logger, ModularLogger)\n        self._logger = logger\n\n    def state_dict(self, normalized=False):\n        \"\"\"\n        Current state of the module as a dictionary.\n\n        Parameters\n        ----------\n        normalized : bool, default False\n            Whether to return a dict of normalized values.\n\n        Returns\n        -------\n        state_dict : dict\n\n        \"\"\"\n        if normalized:\n            return dict(zip(self.state_dict().keys(), self._observation_space.normalize(self.state)))\n\n        return self._state_dict()\n\n    @abstractmethod\n    def _state_dict(self):\n        \"\"\"\n        Unnormalized state_dict.\n\n        Returns\n        -------\n        state_dict : dict\n            The return value of :meth:`.state_dict` if ``normalized=False``.\n\n        \"\"\"\n        pass\n\n    @property\n    def state(self):\n        \"\"\"\n        Current state of the module as a vector.\n\n        Equivalent to the values of ``state_dict``.\n\n        Returns\n        -------\n        np.ndarray\n\n        \"\"\"\n        return np.array([*self.state_dict().values()])\n\n    @property\n    def current_step(self):\n        \"\"\"\n        Current step of the module.\n\n        Returns\n        -------\n        int\n\n        \"\"\"\n        return self._current_step\n\n    @current_step.setter\n    def current_step(self, value):\n        self._current_step = value\n\n    @property\n    @abstractmethod\n    def min_obs(self):\n        \"\"\"\n        Minimum observation that the module gives.\n\n        Used in normalization and to define observation spaces.\n\n        Returns\n        -------\n        float or np.ndarray\n            Scalar or vector minimum observation.\n\n        \"\"\"\n        raise NotImplementedError('Must define min_obs (along with the other three bounds) '\n                                  'before calling super().__init__().')\n\n    @property\n    @abstractmethod\n    def max_obs(self):\n        \"\"\"\n        Maximum observation that the module gives.\n\n        Used in normalization and to define observation spaces.\n\n        Returns\n        -------\n        float or np.ndarray\n            Scalar or vector maximum observation.\n\n        \"\"\"\n        raise NotImplementedError('Must define max_obs (along with the other three bounds) '\n                                  'before calling super().__init__().')\n\n    @property\n    @abstractmethod\n    def min_act(self):\n        \"\"\"\n        Minimum action that the module allows.\n\n        Used in normalization and to define action spaces.\n\n        Returns\n        -------\n        float or np.ndarray\n            Scalar or vector minimum action.\n\n        \"\"\"\n        raise NotImplementedError('Must define min_act (along with the other three bounds) '\n                                  'before calling super().__init__().')\n\n    @property\n    @abstractmethod\n    def max_act(self):\n        \"\"\"\n        Maximum action that the module allows.\n\n        Used in normalization and to define action spaces.\n\n        Returns\n        -------\n        float or np.ndarray\n            Scalar or vector maximum action.\n\n        \"\"\"\n        raise NotImplementedError('Must define max_act (along with the other three bounds) '\n                                  'before calling super().__init__().')\n\n    @property\n    def min_production(self):\n        \"\"\"\n        Minimum amount of production at the current time step.\n\n        In general, this value is zero. Some modules, such as ``GensetModule``,\n        must produce a minimum amount of energy in some cases, and this value will be positive.\n\n        Must be defined in any child class that is a source.\n        If the module is not a source, this value is irrelevant.\n\n        Returns\n        -------\n        float\n\n        \"\"\"\n        return 0\n\n    @property\n    def max_production(self):\n        \"\"\"\n        Maximum amount of production at the current time step.\n\n        Must be defined in any child class that is a source.\n        If the module is not a source, this value is irrelevant.\n\n        Returns\n        -------\n        float\n\n        \"\"\"\n        return NotImplemented\n\n    @property\n    def max_consumption(self):\n        \"\"\"\n        Maximum amount of consumption at the current time step.\n\n        Must be defined in any child class that is a sink.\n        If the module is not a sink, this value is irrelevant.\n\n        Returns\n        -------\n        float\n\n        \"\"\"\n        return NotImplemented\n\n    @property\n    def marginal_cost(self):\n        \"\"\"\n        Average marginal cost of producing with the module.\n\n        Returns\n        -------\n        marginal_cost : float\n            Average marginal cost.\n\n        \"\"\"\n        return self.production_marginal_cost\n\n    @property\n    def production_marginal_cost(self):\n        return 0.0\n\n    @property\n    def absorption_marginal_cost(self):\n        return 0.0\n\n    @property\n    def action_space(self):\n        \"\"\"\n        Action spaces of the module.\n\n        Contains both normalized and un-normalized action space.\n\n        Returns\n        -------\n        action_space : :class:`ModuleSpace <pymgrid.utils.space.ModuleSpace>`\n            The action space.\n        \"\"\"\n        return self._action_space\n\n    @property\n    def observation_space(self):\n        \"\"\"\n        Observation space of the module.\n\n        Contains both normalized and un-normalized observation spaces.\n\n        Returns\n        -------\n        observation_space : :class:`ModuleSpace <pymgrid.utils.space.ModuleSpace>`\n            The observation space.\n        \"\"\"\n        return self._observation_space\n\n    @property\n    def is_source(self):\n        \"\"\"\n        Whether the module is a source.\n\n        Returns\n        -------\n        bool\n\n        \"\"\"\n        return False\n\n    @property\n    def is_sink(self):\n        \"\"\"\n        Whether the module is a sink.\n\n        Returns\n        -------\n        bool\n\n        \"\"\"\n        return False\n\n    def dump(self, stream=None):\n        \"\"\"\n        Save a module to a YAML buffer.\n\n        Supports both strings of YAML or storing YAML in a path-like object.\n\n        Parameters\n        ----------\n        stream : file-like object or None, default None\n            Stream to save the YAML document. If None, returns the document instead.\n\n        Returns\n        -------\n        str or None :\n            Returns the YAMl document as a string if ``stream=None``. Otherwise, returns None.\n\n        .. note::\n\n            ``dump`` handles the serialization of array-like objects (e.g. time series and logs) differently depending\n            on the value of ``stream``.  If ``stream is None``, array-like objects are serialized inline. If ``stream`` is\n            a stream to a file-like object, however, array-like objects will be serialized as `.csv.gz` files in a\n            directory relative to ``stream``, and the relative locations stored inline in the YAML file. For an example of\n            this behavior, see `data/scenario/pymgrid25/microgrid_0`.\n\n        \"\"\"\n        return yaml.safe_dump(self, stream=stream)\n\n    @classmethod\n    def load(cls, stream):\n        \"\"\"\n        Load a module from yaml representation.\n\n        Equivalent to ``yaml.safe_load(stream)``.\n\n        Parameters\n        ----------\n        stream : str or file-like object\n            Stream from which to read yaml representation of a module.\n\n        Returns\n        -------\n        BaseMicrogridModule or child class of BaseMicrogridModule\n            Deserialized module, populated with the state it possessed upon serialization.\n\n        \"\"\"\n        return yaml.safe_load(stream)\n\n    @classmethod\n    def from_yaml(cls, loader, node):\n        \"\"\"\n        Convert a yaml representation of a module to a module.\n\n        Part of the ``load`` and equivalently the ``yaml.safe_load`` procedures.\n        Should not be called directly.\n\n        :meta private:\n\n        Parameters\n        ----------\n        loader : yaml.SafeLoader\n            The yaml loader.\n        node : yaml.node.MappingNode\n            yaml node representation of the module.\n\n        Returns\n        -------\n        BaseMicrogridModule or child class of BaseMicrogridModule\n            Deserialized module, populated with the state it possessed upon serialization.\n\n        \"\"\"\n        add_numpy_pandas_constructors()\n        mapping = loader.construct_mapping(node, deep=True)\n        instance = cls.deserialize_instance(mapping[\"cls_params\"])\n        instance.logger = instance.logger.from_raw(mapping.get(\"log\"))\n        instance.name = tuple(mapping[\"name\"])\n        return instance.deserialize(mapping[\"state\"])\n\n    @classmethod\n    def to_yaml(cls, dumper, data):\n        \"\"\"\n        Convert a module to a yaml representation node.\n\n        Part of the ``dump`` and equivalently the ``yaml.safe_dump`` procedures.\n        Should not be called directly.\n\n        :meta private:\n\n        Parameters\n        ----------\n        dumper : yaml.SafeDumper\n            The yaml dumper.\n        data : BaseMicrogridModule or child class of BaseMicrogridModule\n            Module to be serialized\n\n        Returns\n        -------\n        yaml.node.MappingNode\n\n        \"\"\"\n        add_numpy_pandas_representers()\n        return dumper.represent_mapping(cls.yaml_tag, data.serialize(dumper.stream), flow_style=cls.yaml_flow_style)\n\n    def serialize(self, dumper_stream):\n        \"\"\"\n        Serialize module. The result is passed to a YAML dumper.\n\n        :meta private:\n\n        Parameters\n        ----------\n        dumper_stream : file-like object or None.\n            The stream that the object will be dumped to.\n\n        Returns\n        -------\n        dict\n            The serialized module.\n\n        \"\"\"\n        data = {\n            \"name\": self.name,\n            \"cls_params\": self._serialize_cls_params(),\n            \"state\": self._serialize_state_attributes(),\n            **self._logger.serialize(\"log\")\n        }\n\n        return dump_data(data, dumper_stream, self.yaml_tag)\n\n    def serializable_state_attributes(self):\n        \"\"\"\n\n        Return the attributes of the module that represent the module's current state for serialization.\n\n        :meta private:\n\n        Returns\n        -------\n        list[str]\n            List of attribute names.\n\n        \"\"\"\n        return [\"_current_step\", *self.state_dict().keys()]\n\n    def _serialize_state_attributes(self):\n        return {attr_name: getattr(self, attr_name) for attr_name in self.serializable_state_attributes()}\n\n    def _serialize_cls_params(self):\n        serialized_args = {}\n        cls_params = inspect.signature(self.__init__).parameters\n\n        for p_name in cls_params.keys():\n            try:\n                serialized_args[p_name] = (getattr(self, p_name))\n            except AttributeError:\n                raise AttributeError(f\"Module {self.__class__.__name__} must have attribute/property '{p_name}' corresponding to \"\n                                     f\"class parameter of the same name.\")\n\n        return serialized_args\n\n    @classmethod\n    def deserialize_instance(cls, param_dict):\n        \"\"\"\n        Generate an instance of this module with the arguments in param_dict.\n\n        Part of the ``load`` and ``yaml.safe_load`` methods. Should not be called directly.\n\n        :meta private:\n\n        Parameters\n        ----------\n        param_dict : dict\n            Class arguments.\n\n        Returns\n        -------\n        BaseMicrogridModule or child class of BaseMicrogridModule\n            The module instance.\n\n        \"\"\"\n        param_dict = param_dict.copy()\n        cls_params = inspect.signature(cls).parameters\n\n        cls_kwargs = {}\n        missing_params, default_params = [], []\n\n        for p_name, p_value in cls_params.items():\n            try:\n                cls_kwargs[p_name] = param_dict.pop(p_name)\n            except KeyError:\n                if p_value.default is p_value.empty:\n                    missing_params.append(p_name)\n                else:\n                    cls_kwargs[p_name] = p_value.default\n                    default_params.append(p_name)\n\n        if len(default_params):\n            warn(f'Missing parameter values {default_params} for {cls}. Using available default values.')\n\n        if len(missing_params):\n            raise KeyError(f\"Missing parameter values {missing_params} for {cls} with no default values available.\")\n\n        return cls(**cls_kwargs)\n\n    def deserialize(self, serialized_dict):\n        \"\"\"\n        Populate the attributes in ``self.serializable_state_attributes``.\n\n        Part of the ``load`` and ``yaml.safe_load`` methods. Should not be called directly.\n\n        :meta private:\n\n        Parameters\n        ----------\n        serialized_dict : dict\n            Serialized state attributes\n\n        Returns\n        -------\n        BaseMicrogridModule or child of BaseMicrogridModule\n            The module instance.\n\n        \"\"\"\n        serialized_dict = serialized_dict.copy()\n        for attr_name in self.serializable_state_attributes():\n            if not hasattr(self, attr_name):\n                raise ValueError(f\"Key {attr_name} is not an attribute of module {self} and cannot be set.\")\n            try:\n                setattr(self, attr_name, serialized_dict.pop(attr_name))\n            except KeyError:\n                raise KeyError(f\"Missing key {attr_name} in deserialized dict.\")\n\n        if len(serialized_dict):\n            warn(f\"Unused keys in serialized_dict: {list(serialized_dict.keys())}\")\n        return self\n\n    def __eq__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n\n        diff = [(k1, v1, v2) for (k1, v1), (k2, v2) in zip(self.__dict__.items(), other.__dict__.items()) if\n                ((hasattr(v1, \"any\") and not np.allclose(v1, v2)) or (not hasattr(v1, \"any\") and v1 != v2))]\n\n        return len(diff) == 0\n\n    def __repr__(self):\n        param_repr = {p: getattr(self, p) for p in inspect.signature(self.__init__).parameters}\n        param_repr = [f'{p}={type(v) if hasattr(v, \"__len__\") and not isinstance(v, str) else v}' for p, v in param_repr.items()]\n        param_repr = ', '.join(param_repr)\n        return f'{self.__class__.__name__}(' \\\n               f'{param_repr})'\n"
  },
  {
    "path": "src/pymgrid/modules/base/timeseries/__init__.py",
    "content": ""
  },
  {
    "path": "src/pymgrid/modules/base/timeseries/base_timeseries_module.py",
    "content": "import numpy as np\n\nfrom pymgrid.microgrid import DEFAULT_HORIZON\nfrom pymgrid.modules.base import BaseMicrogridModule\nfrom pymgrid.forecast.forecaster import get_forecaster, OracleForecaster, NoForecaster\n\n\nclass BaseTimeSeriesMicrogridModule(BaseMicrogridModule):\n\n    state_components = None\n    \"\"\"\n    Labels of the components of each entry in the module's time series.\n\n    Column labels of self.time_series.\n\n    Returns\n    -------\n    state_components : np.ndarray[str], shape (self.time_series.shape[1], )\n        The state components.\n    \"\"\"\n\n    def __init__(self,\n                 time_series,\n                 raise_errors,\n                 forecaster=None,\n                 forecast_horizon=DEFAULT_HORIZON,\n                 forecaster_increase_uncertainty=False,\n                 forecaster_relative_noise=False,\n                 initial_step=0,\n                 final_step=-1,\n                 provided_energy_name='provided_energy',\n                 absorbed_energy_name='absorbed_energy',\n                 normalize_pos=...):\n\n        self._time_series = self._set_time_series(time_series)\n        self._min_obs, self._max_obs, self._min_act, self._max_act = self._get_bounds()\n\n        self.final_step = final_step\n\n        self._forecast_param = forecaster\n        self._forecast_horizon = forecast_horizon * (forecaster is not None)\n        self._forecaster = get_forecaster(forecaster,\n                                          self._get_observation_spaces(),\n                                          forecast_shape=(self.forecast_horizon, len(self.state_components)),\n                                          time_series=self.time_series[initial_step:self.final_step, :],\n                                          increase_uncertainty=forecaster_increase_uncertainty,\n                                          relative_noise=forecaster_relative_noise)\n\n        self._state_dict_keys = self._set_state_dict_keys()\n\n        super().__init__(raise_errors,\n                         initial_step=initial_step,\n                         provided_energy_name=provided_energy_name,\n                         absorbed_energy_name=absorbed_energy_name)\n\n        self._current_forecast = self.forecast()\n\n    def _set_time_series(self, time_series):\n        _time_series = np.array(time_series)\n        try:\n            shape = (-1, _time_series.shape[1])\n        except IndexError:\n            shape = (-1, 1)\n        _time_series = _time_series.reshape(shape)\n        assert len(_time_series) == len(time_series)\n        return self._sign_check(_time_series)\n\n    def _sign_check(self, time_series):\n        if self.is_source and self.is_sink:\n            return time_series\n\n        if not ((np.sign(time_series) <= 0).all() or (np.sign(time_series) >= 0).all()):\n            raise ValueError('time_series cannot contain both positive and negative values unless it is both '\n                             'a source and a sink.')\n\n        if self.is_source:\n            return np.abs(time_series)\n        else:\n            return -np.abs(time_series)\n\n    def _get_bounds(self):\n        _min, _max = np.min(self._time_series), np.max(self._time_series)\n        if _min > 0:\n            _min = 0\n        elif _max < 0:\n            _max = 0\n\n        return _min, _max, _min, _max\n\n    def _set_state_dict_keys(self):\n        return {\n            \"current\": [f\"{component}_current\" for component in self.state_components],\n            \"forecast\": [\n                f\"{component}_forecast_{j}\"\n                for j in range(self._forecast_horizon) for component in self.state_components\n            ]\n        }\n\n    def _update_step(self, reset=False):\n        super()._update_step(reset=reset)\n        self._current_forecast = self.forecast()\n\n    def forecast(self):\n        \"\"\"\n        Forecast the module's time series from the current state.\n\n        Returns\n        -------\n        forecast : None or np.ndarray, shape (n, len(self.state_components))\n            The forecasted time series.\n        \"\"\"\n        val_c_n = self.time_series[1+self.current_step:1+self.current_step+self.forecast_horizon, :]\n        try:\n            val_c = self.time_series[self.current_step, :]\n        except IndexError:\n            forecast = self._forecaster.full_pad(self.time_series.shape, self._forecast_horizon)\n        else:\n            forecast = self._forecaster(val_c=val_c,\n                                        val_c_n=val_c_n,\n                                        n=self.forecast_horizon)\n\n        return None if forecast is None else forecast\n\n    def _done(self):\n        return self._current_step >= self._final_step - 1\n\n    @property\n    def current_obs(self):\n        \"\"\"\n        Current observation.\n\n        Returns\n        -------\n        obs : np.ndarray, shape (len(self.state_components), )\n            The observation.\n        \"\"\"\n        try:\n            return self.time_series[self.current_step, :]\n        except IndexError:\n            return self._forecaster.full_pad(self.time_series.shape, 1).reshape(-1)\n\n    @property\n    def time_series(self):\n        \"\"\"\n        View of the module's time series.\n\n        Returns\n        -------\n        time_series : np.ndarray, shape (len(self), len(self.state_components))\n            The underlying time series.\n\n        \"\"\"\n        return self._time_series\n\n    @time_series.setter\n    def time_series(self, value):\n        self._time_series = self._set_time_series(value)\n        self._min_obs, self._max_obs, self._min_act, self._max_act = self._get_bounds()\n        self._action_space = self._get_action_spaces()\n        self._observation_space = self._get_observation_spaces()\n\n    @property\n    def min_obs(self):\n        # TODO find a better solution\n        return np.repeat(np.array(self._min_obs).reshape((-1, 1)), 1+self._forecast_horizon, axis=1).T.reshape(-1)\n\n    @property\n    def max_obs(self):\n        # TODO find a better solution\n        return np.repeat(np.array(self._max_obs).reshape((-1, 1)), 1+self._forecast_horizon, axis=1).T.reshape(-1)\n\n    @property\n    def min_act(self):\n        return self._min_act\n\n    @property\n    def max_act(self):\n        return self._max_act\n\n    @property\n    def forecaster(self):\n        \"\"\"\n        View of the forecaster.\n\n        Returns\n        -------\n        forecaster : :class:`.Forecaster`\n            The module's forecaster.\n\n        \"\"\"\n        return self._forecaster\n\n    def set_forecaster(self,\n                       forecaster,\n                       forecast_horizon=DEFAULT_HORIZON,\n                       forecaster_increase_uncertainty=False,\n                       forecaster_relative_noise=False):\n        \"\"\"\n        Set the forecaster for this module.\n\n        Sets the forecaster with the same logic as upon initialization.\n\n        forecaster : callable, float, \"oracle\", or None, default None.\n            Function that gives a forecast n-steps ahead.\n\n            * If ``callable``, must take as arguments ``(val_c: float, val_{c+n}: float, n: int)``, where\n\n              * ``val_c`` is the current value in the time series: ``self.time_series[self.current_step]``\n\n              * ``val_{c+n}`` is the value in the time series n steps in the future\n\n              * n is the number of steps in the future at which we are forecasting.\n\n              The output ``forecast = forecaster(val_c, val_{c+n}, n)`` must have the same sign\n              as the inputs ``val_c`` and ``val_{c+n}``.\n\n            * If ``float``, serves as a standard deviation for a mean-zero gaussian noise function\n              that is added to the true value.\n\n            * If ``\"oracle\"``, gives a perfect forecast.\n\n            * If ``None``, no forecast.\n\n        forecast_horizon : int\n            Number of steps in the future to forecast. If forecaster is None, this parameter is ignored and the resultant\n            horizon will be zero.\n\n        forecaster_increase_uncertainty : bool, default False\n            Whether to increase uncertainty for farther-out dates if using a GaussianNoiseForecaster. Ignored otherwise.\n\n        forecaster_relative_noise : bool, default False\n            Whether to define noise standard deviation relative to mean of time series if using\n            :class:`.GaussianNoiseForecaster`. Ignored otherwise.\n\n        \"\"\"\n\n        self.forecast_horizon = forecast_horizon * (forecaster is not None)\n\n        self._forecaster = get_forecaster(forecaster,\n                                          self._observation_space,\n                                          (self.forecast_horizon, len(self.state_components)),\n                                          self.time_series[self.initial_step:self._final_step, :],\n                                          increase_uncertainty=forecaster_increase_uncertainty,\n                                          relative_noise=forecaster_relative_noise)\n\n    @property\n    def forecast_horizon(self):\n        \"\"\"\n        The number of steps until which the module forecasts.\n\n        Returns\n        -------\n        forecast_horizon : int\n            The forecast horizon.\n\n        \"\"\"\n        return self._forecast_horizon\n\n    @forecast_horizon.setter\n    def forecast_horizon(self, value):\n\n        self._forecast_horizon = value\n        self._state_dict_keys = self._set_state_dict_keys()\n        self._observation_space = self._get_observation_spaces()\n\n        if value > 0 and isinstance(self._forecaster, NoForecaster):\n            from warnings import warn\n            warn(\"Setting forecast_horizon requires a non-null forecaster. Implementing OracleForecaster.\")\n            self._forecaster = OracleForecaster(self._observation_space,\n                                                forecast_shape=(value, len(self.state_components))\n                                                )\n\n        self._forecaster.observation_space = self._observation_space\n\n    @property\n    def forecaster_increase_uncertainty(self):\n        \"\"\"\n        View of :class:`pymgrid.forecast.GaussianNoiseForecaster``.increase_uncertainty`.\n\n        Required for serialization as a mirror to the class parameter.\n        Will only ever be True if ``self.forecaster`` is a ``GaussianNoiseForecaster``.\n\n        Returns\n        -------\n        forecaster_increase_uncertainty : bool\n            Associated attribute of ``self.forecaster``.\n\n        \"\"\"\n        try:\n            return self._forecaster.increase_uncertainty\n        except AttributeError:\n            return False\n\n    @property\n    def forecaster_relative_noise(self):\n        \"\"\"\n        View of :class:`pymgrid.forecast.GaussianNoiseForecaster``.forecaster_relative_noise`.\n\n        Required for serialization as a mirror to the class parameter.\n        Will only ever be True if ``self.forecaster`` is a ``GaussianNoiseForecaster``.\n\n        Returns\n        -------\n        forecaster_relative_noise : bool\n            Associated attribute of ``self.forecaster``.\n\n        \"\"\"\n        try:\n            return self._forecaster.relative_noise\n        except AttributeError:\n            return False\n\n    @property\n    def final_step(self):\n        return self._final_step\n\n    @final_step.setter\n    def final_step(self, value):\n        if not value // 1 == value:\n            raise ValueError('final_step value must be an integer.')\n\n        if value <= 0:\n            self._final_step = len(self)\n        else:\n            self._final_step = value\n        try:\n            if self._final_step <= self.initial_step:\n                raise ValueError('final_step value must be greater than initial_step')\n        except AttributeError:\n            pass\n\n    def _state_dict(self):\n        state_dict = dict(zip(self._state_dict_keys['current'], self.current_obs))\n\n        if self._current_forecast is not None:\n            state_dict.update(zip(self._state_dict_keys['forecast'], self._current_forecast.reshape(-1)))\n\n        return state_dict\n\n    def serialize(self, dumper_stream):\n        data = super().serialize(dumper_stream)\n        data[\"cls_params\"][\"forecaster\"] = self._forecast_param\n        return data\n\n    def serializable_state_attributes(self):\n        return [\"_current_step\"]\n\n    def __len__(self):\n        return self._time_series.shape[0]\n"
  },
  {
    "path": "src/pymgrid/modules/battery_module.py",
    "content": "from pymgrid.modules.base import BaseMicrogridModule\nimport numpy as np\nimport yaml\nfrom warnings import warn\n\n\nclass BatteryModule(BaseMicrogridModule):\n    \"\"\"\n    A battery module.\n\n    Battery modules are fixed: when calling ``Microgrid.run``, you must pass a control for batteries.\n\n    Parameters\n    ----------\n    min_capacity : float\n        Minimum energy that must be contained in the battery.\n\n    max_capacity : float\n        Maximum energy that can be contained in the battery.\n        If ``soc=1``, capacity is at this maximum.\n\n    max_charge : float\n        Maximum amount the battery can be charged in one step.\n\n    max_discharge : float\n        Maximum amount the battery can be discharged in one step.\n\n    efficiency : float\n        Efficiency of the battery.\n        See :meth:`BatteryModule.model_transition` for details.\n\n    battery_cost_cycle : float, default 0.0\n        Marginal cost of charging and discharging.\n\n    battery_transition_model : callable or None, default None\n        Function to model the battery's transition.\n        If None, :meth:`BatteryModule.default_transition_model` is used.\n\n        .. note::\n            If you define a battery_transition_model, it must be YAML-serializable if you plan to serialize\n            your battery module or any microgrid containing your battery.\n\n            For example, you can define it as a class with a ``__call__`` method and ``yaml.YAMLObject`` as its metaclass.\n            See the `PyYAML documentation <https://pyyaml.org/wiki/PyYAMLDocumentation>`_ for details.\n\n    init_charge : float or None, default None\n        Initial charge of the battery.\n        One of ``init_charge`` or ``init_soc`` must be passed, else an exception is raised.\n        If both are passed, ``init_soc`` is ignored and ``init_charge`` is used.\n\n    init_soc : float or None, default None\n        Initial state of charge of the battery.\n        One of ``init_charge`` or ``init_soc`` must be passed, else an exception is raised.\n        If both are passed, ``init_soc`` is ignored and ``init_charge`` is used.\n\n    raise_errors : bool, default False\n        Whether to raise errors if bounds are exceeded in an action.\n        If False, actions are clipped to the limit possible.\n\n    \"\"\"\n    module_type = ('battery', 'controllable')\n    yaml_tag = f\"!BatteryModule\"\n    yaml_dumper = yaml.SafeDumper\n    yaml_loader = yaml.SafeLoader\n\n    def __init__(self,\n                 min_capacity,\n                 max_capacity,\n                 max_charge,\n                 max_discharge,\n                 efficiency,\n                 battery_cost_cycle=0.0,\n                 battery_transition_model=None,\n                 init_charge=None,\n                 init_soc=None,\n                 initial_step=0,\n                 raise_errors=False):\n        assert 0 < efficiency <= 1\n        self.min_capacity = min_capacity\n        self.max_capacity = max_capacity\n        self.max_charge = max_charge\n        self.max_discharge = max_discharge\n        self.efficiency = efficiency\n        self.battery_transition_model = battery_transition_model\n        self.battery_cost_cycle = battery_cost_cycle\n\n        self.min_soc, self.max_soc = min_capacity/max_capacity, 1\n        self.init_charge, self.init_soc = init_charge, init_soc\n        self._current_charge, self._soc = self._init_battery(init_charge, init_soc)\n        self.name = ('battery', None)\n        super().__init__(raise_errors,\n                         initial_step=initial_step,\n                         provided_energy_name='discharge_amount',\n                         absorbed_energy_name='charge_amount')\n\n    def _init_battery(self, init_charge, init_soc):\n        if init_charge is not None:\n            if init_soc is not None:\n                warn('Passed both init_capacity and init_soc. Using init_charge and ignoring init_soc')\n            init_soc = init_charge / self.max_capacity\n        elif init_soc is not None:\n            init_charge = init_soc * self.max_capacity\n        else:\n            raise ValueError(\"Must set one of init_charge and init_soc.\")\n\n        return init_charge, init_soc\n\n    def update(self, external_energy_change, as_source=False, as_sink=False):\n        assert as_source + as_sink == 1, 'Must act as either source or sink but not both or neither.'\n\n        if as_source:\n            info_key = 'provided_energy'\n            internal_energy_change = self.model_transition(-1.0 * external_energy_change)\n            assert internal_energy_change <= 0\n        else:\n            info_key = 'absorbed_energy'\n            internal_energy_change = self.model_transition(external_energy_change)\n            assert internal_energy_change >= 0\n\n        self._update_state(internal_energy_change)\n        reward = -1.0 * self.get_cost(internal_energy_change)\n        info = {info_key: external_energy_change}\n        return reward, False, info\n\n    def _update_state(self, energy_change):\n        self._current_charge += energy_change\n        if self._current_charge < self.min_capacity:\n            assert np.isclose(self._current_charge, self.min_capacity)\n            self._current_charge = self.min_capacity\n        self._soc = self._current_charge/self.max_capacity\n\n    def get_cost(self, energy_change):\n        \"\"\"\n        Get the cost of charging or discharging.\n\n        Parameters\n        ----------\n        energy_change : float\n            Internal energy change.\n\n        Returns\n        -------\n        cost : float\n            Cost of charging or discharging.\n\n        \"\"\"\n        return np.abs(energy_change)*self.battery_cost_cycle\n\n    def model_transition(self, energy):\n        \"\"\"\n        Convert an external energy request to a change in internal energy.\n\n        This function uses the class argument ``battery_transition_model`` if one was passed.\n\n        ``battery_transition_model`` must use the following api:\n\n        .. code-block:: bash\n\n            internal_energy_change = battery_transition_model(\n                external_energy_change,\n                min_capacity,\n                max_capacity,\n                max_charge,\n                max_discharge,\n                efficiency,\n                battery_cost_cycle,\n                max_production,\n                max_consumption,\n               state_dict\n            )\n\n        The return value ``internal_energy_change``  must be a float.\n        See :meth:`transition_kwargs` and :meth:`battery_transition_model` for details on these parameters;\n        all parameters are passed as keyword arguments.\n\n        Parameters\n        ----------\n        energy : float\n            External energy change.\n\n        Returns\n        -------\n        internal_energy : float\n            Amount of energy that the battery must use or will retain given the external amount of energy.\n\n        \"\"\"\n        if self.battery_transition_model is None:\n            return self.default_transition_model(external_energy_change=energy, **self.transition_kwargs())\n        return self.battery_transition_model(external_energy_change=energy, **self.transition_kwargs())\n\n    def transition_kwargs(self):\n        \"\"\"\n        Values passed to transition models.\n\n        Keys\n        ----\n        min_capacity : float\n            Minimum energy that must be contained in the battery.\n\n        max_capacity : float\n            Maximum energy that can be contained in the battery.\n            If ``soc=1``, capacity is at this maximum.\n\n        max_charge : float\n            Maximum amount the battery can be charged in one step.\n\n        max_discharge : float\n            Maximum amount the battery can be discharged in one step.\n\n        efficiency : float\n            Efficiency of the battery.\n\n        battery_cost_cycle : float\n            Marginal cost of charging and discharging.\n\n        max_production : float\n            Maximum amount of production, which is the lower of the maximum discharge and the discharge that would\n            send the battery to ``min_capacity``.\n\n        max_consumption : float\n            Maximum amount of consumption, which is the lower of the maximum charge and the charge that would send\n            the battery to ``max_capacity``.\n\n        state_dict : dict\n            State dictionary, with state of charge and current capacity information.\n\n        Returns\n        -------\n        kwargs : dict\n            Transition keyword arguments.\n\n        \"\"\"\n        return dict(min_capacity=self.min_capacity,\n                    max_capacity=self.max_capacity,\n                    max_charge=self.max_charge,\n                    max_discharge=self.max_discharge,\n                    efficiency=self.efficiency,\n                    battery_cost_cycle=self.battery_cost_cycle,\n                    max_production=self.max_production,\n                    max_consumption=self.max_consumption,\n                    state_dict=self.state_dict()\n                    )\n\n    @staticmethod\n    def default_transition_model(external_energy_change, efficiency, **transition_kwargs):\n        \"\"\"\n        A simple battery transition model.\n\n        In this model, the amount of energy retained is given by ``efficiency``.\n\n        For example, if a microgrid requests 100 kWh of energy and ``efficiency=0.5``, the battery must use\n        200 kWh of energy. Alternatively, if a microgrid sends a battery 100 kWh of energy and ``efficiency=0.5``,\n        the battery's charge will increase by 50 kWh.\n\n        Parameters\n        ----------\n        external_energy_change : float\n            Amount of energy that is being requested externally.\n            If ``energy > 0``, it is energy that is absorbed by the battery -- a charge.\n            If ``energy < 0``, it is energy provided by the battery: a discharge.\n\n        efficiency : float\n            Battery efficiency.\n\n        transition_kwargs : dict\n            State transition values given by :meth:`BatteryModule.transition_kwargs`.\n\n        Returns\n        -------\n        internal_energy : float\n            Amount of energy that the battery must use or will retain given the external amount of energy.\n\n        \"\"\"\n\n        if external_energy_change < 0:\n            return external_energy_change / efficiency\n        else:\n            return external_energy_change * efficiency\n\n    def _state_dict(self):\n        return dict(zip(('soc', 'current_charge'), [self._soc, self._current_charge]))\n\n    @property\n    def max_production(self):\n        # Max discharge\n        return min(self.max_discharge, self._current_charge-self.min_capacity) * self.efficiency\n\n    @property\n    def max_consumption(self):\n        # Max charge\n        return min(self.max_charge, self.max_capacity - self._current_charge) / self.efficiency\n\n    @property\n    def current_charge(self):\n        \"\"\"\n        Battery charge.\n\n        Level of charge of the battery.\n\n        Returns\n        -------\n        current_charge : float\n            Charge.\n\n        \"\"\"\n        return self._current_charge\n\n    @property\n    def soc(self):\n        \"\"\"\n        Battery state of charge.\n\n        Level of charge of the battery relative to its capacity.\n\n        Returns\n        -------\n        soc : float\n            State of charge. In the range [0, 1].\n\n        \"\"\"\n        return self._soc\n\n    @property\n    def min_obs(self):\n        # Min charge amount, min soc\n        return np.array([self.min_soc, self.min_capacity])\n\n    @property\n    def max_obs(self):\n        return np.array([self.max_soc, self.max_capacity])\n\n    @property\n    def min_act(self):\n        return -self.max_discharge / self.efficiency\n\n    @property\n    def max_act(self):\n        return self.max_charge * self.efficiency\n\n    @property\n    def production_marginal_cost(self):\n        return self.battery_cost_cycle\n\n    @property\n    def absorption_marginal_cost(self):\n        return self.battery_cost_cycle\n\n    @property\n    def is_source(self):\n        return True\n\n    @property\n    def is_sink(self):\n        return True\n\n    @soc.setter\n    def soc(self, value):\n        self._current_charge, self._soc = self._init_battery(None, value)\n\n    @current_charge.setter\n    def current_charge(self, value):\n        self._current_charge, self._soc = self._init_battery(value, None)\n"
  },
  {
    "path": "src/pymgrid/modules/genset_module.py",
    "content": "import yaml\nimport numpy as np\nfrom warnings import warn\n\nfrom pymgrid.modules.base import BaseMicrogridModule\n\n\nclass GensetModule(BaseMicrogridModule):\n    \"\"\"\n    A genset/generator module.\n\n    This module is a controllable source module; when used as a module in a microgrid, you must pass it an energy production\n    request.\n\n    Parameters\n    ----------\n    running_min_production : float\n        Minimum production of the genset when it is running.\n\n    running_max_production : float\n        Maximum production of the genset when it is running.\n\n    genset_cost : float or callable\n       * If float, the marginal cost of running the genset: ``total_cost = genset_cost * production``.\n\n       * If callable, a function that takes the genset production as an argument and returns the genset cost.\n\n    co2_per_unit : float, default 0.0\n        Carbon dioxide production per unit energy production.\n\n    cost_per_unit_co2 : float, default 0.0\n        Carbon dioxide cost per unit carbon dioxide production.\n\n    start_up_time : int, default 0\n        Number of steps it takes to turn on the genset.\n\n    wind_down_time : int, default 0\n        Number of steps it takes to turn off the genset.\n\n    allow_abortion : bool, default True\n        Whether the genset is able to remain shut down while in the process of starting up and vice versa.\n\n    init_start_up : bool, default True\n        Whether the genset is running upon reset.\n\n    raise_errors : bool, default False\n        Whether to raise errors if bounds are exceeded in an action.\n        If False, actions are clipped to the limit possible.\n\n    provided_energy_name : str, default \"genset_production\"\n        Name of the energy provided by this module, to be used in logging.\n\n    \"\"\"\n    module_type = 'genset', 'controllable'\n    yaml_tag = f\"!Genset\"\n    yaml_dumper = yaml.SafeDumper\n    yaml_loader = yaml.SafeLoader\n\n    _energy_pos = 1\n\n    def __init__(self,\n                 running_min_production,\n                 running_max_production,\n                 genset_cost,\n                 co2_per_unit=0.0,\n                 cost_per_unit_co2=0.0,\n                 start_up_time=0,\n                 wind_down_time=0,\n                 allow_abortion=True,\n                 init_start_up=True,\n                 initial_step=0,\n                 raise_errors=False,\n                 provided_energy_name='genset_production'):\n\n        if running_min_production > running_max_production:\n            raise ValueError('parameter min_production must not be greater than parameter max_production.')\n\n        if not allow_abortion:\n            warn('Gensets that do not allow abortions are not fully tested, setting allow_abortion=False '\n                 'may lead to unexpected behavior.')\n\n        self.running_min_production, self.running_max_production = running_min_production, running_max_production\n        self.co2_per_unit, self.cost_per_unit_co2 = co2_per_unit, cost_per_unit_co2\n\n        self.genset_cost = genset_cost\n        self.start_up_time = start_up_time\n        self.wind_down_time = wind_down_time\n        self.allow_abortion = allow_abortion\n        self.init_start_up = init_start_up\n\n        self._current_status, self._goal_status = int(init_start_up), int(init_start_up)\n        self._steps_until_up, self._steps_until_down = self._reset_up_down_times()\n        self.name = ('genset', None)\n\n        super().__init__(raise_errors,\n                         initial_step=initial_step,\n                         provided_energy_name=provided_energy_name,\n                         absorbed_energy_name=None)\n\n    def step(self, action, normalized=True):\n        \"\"\"\n        Take one step in the module, attempting to draw a certain amount of energy from the genset.\n\n        Parameters\n        ----------\n        action : float or np.ndarray, shape (2,)\n            Two-dimensional vector containing two values. The first value is used to passed to\n            :meth:`.GensetModule.update_status` while the second is the amount of energy to draw from the genset.\n\n            If ``normalized``, the amount of energy is assumed to be normalized and is un-normalized into the range\n            [:attr:`.GensetModule.min_act`, :attr:`.GensetModule.max_act`].\n\n            If the **unnormalized** action is positive, the module acts as a source and provides energy to the\n            microgrid. Otherwise, the module acts as a sink and absorbs energy.\n\n            If the unnormalized action implies acting as a sink and ``is_sink`` is False -- or the converse -- an\n            ``AssertionError`` is raised.\n\n            .. warning::\n               The first element in ``action`` is not denormalized before being passed to\n               :meth:`.GensetModule.update_status`, regardless of the value of ``normalized``.\n\n        normalized : bool, default True\n            Whether ``action`` is normalized. If True, action is assumed to be normalized and is un-normalized into the\n            range [:attr:`.GensetModule.min_act`, :attr:`.GensetModule.max_act`].\n\n        Raises\n        ------\n        AssertionError\n            If action implies acting as a sink, or ``action[0]`` in outside of ``[0, 1]``.\n\n        Returns\n        -------\n        observation : np.ndarray\n            State of the module after taking action ``action``.\n        reward : float\n            Reward/cost after taking the action.\n        done : bool\n            Whether the module terminates.\n        info : dict\n            Additional information from this step.\n            Will include either `provided_energy` or `absorbed_energy` as a key, denoting the amount of energy\n            this module provided to or absorbed from the microgrid.\n\n        \"\"\"\n        goal_status = action[0]\n        assert 0 <= goal_status <= 1\n        self.update_status(goal_status)\n        return super().step(action, normalized=normalized)\n\n    def get_co2(self, production):\n        \"\"\"\n        Carbon dioxide emissions of energy production.\n\n        Parameters\n        ----------\n        production : float\n            Energy production.\n        Returns\n        -------\n        co2 : float\n            Carbon dioxide production.\n\n        \"\"\"\n        return self.co2_per_unit*production\n\n    def get_co2_cost(self, production):\n        \"\"\"\n        Carbon dioxide production cost.\n\n        Parameters\n        ----------\n        production : float\n            Energy production.\n        Returns\n        -------\n        co2_cost : float\n            Carbon dioxide cost.\n\n        \"\"\"\n        return self.cost_per_unit_co2 * self.get_co2(production)\n\n    def _get_fuel_cost(self, production):\n        if callable(self.genset_cost):\n            return self.genset_cost(production)\n        return self.genset_cost*production\n\n    def get_cost(self, production):\n        \"\"\"\n        Total cost of energy production.\n\n        Includes both fuel and carbon dioxide costs.\n\n        Parameters\n        ----------\n        production : float\n            Energy production.\n\n        Returns\n        -------\n        cost : float\n            Total cost.\n\n        \"\"\"\n        return self._get_fuel_cost(production) + self.get_co2_cost(production)\n\n    def update(self, external_energy_change, as_source=False, as_sink=False):\n        assert as_source, 'This module may only act as a source.'\n\n        reward = -1.0 * self.get_cost(external_energy_change)\n        info = {'provided_energy': external_energy_change,\n                'co2_production': self.get_co2(external_energy_change)}\n\n        return reward, False, info\n\n    def _reset_up_down_times(self):\n        if self._goal_status != self._current_status:\n            raise RuntimeError('Attempting to reset up and down times with status change in progress.')\n\n        if self._current_status:\n            self._steps_until_up = 0\n            self._steps_until_down = self.wind_down_time\n        else:\n            self._steps_until_down = 0\n            self._steps_until_up = self.start_up_time\n\n        return self._steps_until_up, self._steps_until_down\n\n    def _update_up_down_times(self):\n        if self._goal_status == 0: # Turning it off\n            self._steps_until_down -= 1\n        else:\n            self._steps_until_up -= 1\n\n    def update_status(self, goal_status):\n        \"\"\"\n        Update the status of the microgrid.\n\n        The status and goal status are updated, taking into account any in-progress status change as well as\n        ``goal_status``. This method updates the internal properties ``self.current_status``, ``self.goal_status``,\n        ``self.steps_until_up``, and ``self.steps_until_down`` as follows:\n\n        1. If ``steps_until_up == 0`` or ``steps_until_down == 0``, the status is changed to on and off, respectively.\n           The following steps are then executed.\n        \n        2. If ``goal_status == self.current_status == self.goal_status``, the genset is in equilibrium and its status\n           does not change.\n\n           In this case, one of ``self.steps_until_up``/``self.steps_until_down`` should be zero -- the former\n           if ``self.current_status`` and the latter if not -- and the other should be\n           ``self.start_up_time``/``self.wind_down_time``, respectively.\n\n        3. If ``goal_status == self.current_status != self.goal_status``, we are trying to abort a status change.\n\n           * If ``self.allow_abortion``, the abortion can succeed. ``self.goal_status`` changes to ``goal_status``\n             and ``steps_until_up``/``steps_until_down`` are reset (one to zero, one to\n             the corresponding ``self.start_up_time``/``self.wind_down_time``).\n\n           * Otherwise, we proceed with an in-progress status change, and the corresponding\n             ``steps_until_up``/``steps_until_down`` is incremented. This is identical to the case below.\n\n        4. If ``goal_status == self.goal_status != self.current_status``, a previously requested status change is\n           being continued, and the corresponding ``steps_until_up``/``steps_until_down`` is incremented.\n\n        .. note::\n            Steps 2, 3, and 4 are mutually exclusive, while step 1 is not and will be executed before the relevant\n            step 2, 3 or 4.\n\n        Parameters\n        ----------\n        goal_status : float in [0, 1].\n            Goal status as defined by an external action.\n\n            Will be rounded to 0 or 1 to define the goal status.\n        \"\"\"\n        assert self._steps_until_down >= 0 and self._steps_until_up >= 0\n\n        if not 0 <= goal_status <= 1:\n            raise ValueError(f\"Invalid goal_status value {goal_status}, must be in [0, 1].\")\n\n        goal_status = round(goal_status)\n        next_prediction = self.next_status(goal_status)\n\n        if goal_status == self._current_status == self._goal_status:\n            # Everything is hunky-dory\n            assert self._steps_until_down == 0 or self._steps_until_up == 0\n            return\n\n        instant_up = self.start_up_time == 0 and goal_status == 1\n        instant_down = self.wind_down_time == 0 and goal_status == 0\n        if goal_status != self._goal_status and (self.allow_abortion or instant_up or instant_down):\n            self._goal_status = goal_status\n\n        finished_change = self._finish_in_progress_change()\n\n        if not finished_change:\n            self._non_instantaneous_update(goal_status)\n\n        if not self._current_status == next_prediction:\n            raise ValueError('self.next_status working incorrectly.')\n\n    def _finish_in_progress_change(self):\n        if self._steps_until_up == 0 and self._goal_status == 1:\n            self._current_status = 1\n            self._reset_up_down_times()\n            return True\n        elif self._steps_until_down == 0 and self._goal_status == 0:\n            self._current_status = 0\n            self._reset_up_down_times()\n            return True\n        return False\n\n    def _instant_up(self):\n        self._goal_status = 1\n\n        if not self._current_status:\n            self._current_status = 1\n            self._reset_up_down_times()\n\n    def _instant_down(self):\n        self._goal_status = 0\n\n        if self._current_status:\n            self._current_status = 0\n            self._reset_up_down_times()\n\n    def _non_instantaneous_update(self, goal_status):\n        if (goal_status == self._current_status != self._goal_status) and self.allow_abortion:\n            # First case: aborting an in-progress status change\n            self._goal_status = goal_status\n            self._reset_up_down_times()\n        elif self._current_status == self._goal_status != goal_status:\n            # Second case: new status change request\n            self._reset_up_down_times()\n            self._goal_status = goal_status\n\n        if self._goal_status != self._current_status:\n            \"\"\"\n            Current status is not equal to status goal; thus a status change is in progress and the relevant\n            incrementer should be positive.\n            \"\"\"\n            if self._goal_status:\n                assert self._steps_until_up > 0\n            else:\n                assert self._steps_until_down > 0\n            self._update_up_down_times()\n\n    def sample_action(self, strict_bound=False, **kwargs):\n        return np.array([np.random.rand(), super().sample_action(strict_bound=strict_bound)])\n\n    def _raise_error(self, ask_value, available_value, as_source=False, as_sink=False, lower_bound=False):\n        try:\n            super()._raise_error(ask_value, available_value, as_source=as_source, as_sink=as_sink, lower_bound=lower_bound)\n        except ValueError as e:\n            if not self._current_status:\n                raise ValueError(f'{e}\\n This may be because this genset module is not currently running.') from e\n            else:\n                raise ValueError(f'{e}\\n This is despite the fact this genset module is currently running.') from e\n\n    def next_status(self, goal_status):\n        \"\"\"\n        Predict the next status of the genset given a goal status.\n\n        Does not modify the genset in any way.\n\n        Parameters\n        ----------\n        goal_status : {0, 1}\n            Goal status.\n\n        Returns\n        -------\n        next_status : {0, 1}\n            The next status given the current status and the goal status.\n\n        \"\"\"\n        if goal_status:\n            if self._current_status:\n                return 1\n            elif self._steps_until_up == 0:\n                return 1\n            else:\n                return 0\n        else:\n            if not self._current_status:\n                return 0\n            elif self._steps_until_down == 0:\n                return 0\n            else:\n                return 1\n\n    def next_max_production(self, goal_status):\n        \"\"\"\n        Maximum production given a goal status.\n\n        Parameters\n        ----------\n        goal_status : {0, 1}\n            A goal status.\n\n        Returns\n        -------\n        next_max_production : float\n            Maximum production given a goal status.\n\n        \"\"\"\n        return self.next_status(goal_status) * self.running_max_production\n\n    def next_min_production(self, goal_status):\n        \"\"\"\n        Minimum production given a goal status.\n\n        Parameters\n        ----------\n        goal_status : {0, 1}\n            A goal status.\n\n        Returns\n        -------\n        next_min_production : float\n            Minimum production given a goal status.\n\n        \"\"\"\n        return self.next_status(goal_status) * self.running_min_production\n\n    def serializable_state_attributes(self):\n        return [\"_current_step\"] + [f\"_{key}\" for key in self.state_dict().keys()]\n\n    def _state_dict(self):\n        return {'current_status': self._current_status,\n                'goal_status': self._goal_status,\n                'steps_until_up': self._steps_until_up,\n                'steps_until_down': self._steps_until_down}\n\n    @property\n    def current_status(self):\n        \"\"\"\n        Status of the genset.\n\n        On or off.\n\n        Returns\n        -------\n        status : {0, 1}\n            Integer value denoting the genset's current status.\n\n        \"\"\"\n        return self._current_status\n\n    @property\n    def goal_status(self):\n        \"\"\"\n        Goal of the genset.\n\n        Whether the genset is trying to turn -- or keep -- itself on or off.\n\n        Returns\n        -------\n        status : {0, 1}\n            Integer value denoting the genset's goal status.\n\n        \"\"\"\n        return self._goal_status\n\n    @property\n    def max_production(self):\n        \"\"\"\n        Maximum amount of production at the current time step.\n\n        .. warning::\n            This value is aware of the genset's current status, but does not know if you're planning on turning\n            it off at this step.\n\n            This consideration is only relevant if ``start_up_time==0`` or ``wind_down_time==0``.\n\n        Returns\n        -------\n        max_production : float\n            Current maximum production.\n\n        \"\"\"\n        return self._current_status * self.running_max_production\n\n    @property\n    def min_production(self):\n        \"\"\"\n        Minimum amount of production at the current time step.\n\n        .. warning::\n            This value is aware of the genset's current status, but does not know if you're planning on turning\n            it off at this step.\n\n            This consideration is only relevant if ``start_up_time==0`` or ``wind_down_time==0``.\n\n        Returns\n        -------\n        min_production : float\n            Current minimum production.\n\n        \"\"\"\n        return self._current_status * self.running_min_production\n\n    @property\n    def min_obs(self):\n        return np.array([0, 0, 0, 0])\n\n    @property\n    def max_obs(self):\n        return np.array([1, 1, self.start_up_time, self.wind_down_time])\n\n    @property\n    def min_act(self):\n        return np.array([0, 0])\n\n    @property\n    def max_act(self):\n        return np.array([1, self.running_max_production])\n\n    @property\n    def production_marginal_cost(self):\n        return self.get_cost(1.0)\n\n    @property\n    def is_source(self):\n        return True\n"
  },
  {
    "path": "src/pymgrid/modules/grid_module.py",
    "content": "import numpy as np\nimport yaml\n\nfrom pymgrid.microgrid import DEFAULT_HORIZON\nfrom pymgrid.modules.base import BaseTimeSeriesMicrogridModule\n\n\nclass GridModule(BaseTimeSeriesMicrogridModule):\n    \"\"\"\n    An electrical grid module.\n\n    By default, ``GridModule`` is a *fixed* module; it can be transformed to a flex module with ``GridModule.as_flex``.\n    ``GridModule`` is the only built-in module that can be both a fixed and flex module.\n\n    Parameters\n    ----------\n    max_import : float\n        Maximum import at any time step.\n\n    max_export : float\n        Maximum export at any time step.\n\n    time_series : array-like, shape (n_features, n_steps), n_features = {3, 4}\n        If n_features=3, time series of ``(import_price, export_price, co2_per_kwH)`` in each column, respectively.\n        Grid is assumed to have no outages.\n        If n_features=4, time series of ``(import_price, export_price, co2_per_kwH, grid_status)``\n        in each column, respectively. ``time_series[:, -1]`` -- the grid status -- must be binary.\n\n    forecaster : callable, float, \"oracle\", or None, default None.\n        Function that gives a forecast n-steps ahead.\n\n        * If ``callable``, must take as arguments ``(val_c: float, val_{c+n}: float, n: int)``, where\n\n          * ``val_c`` is the current value in the time series: ``self.time_series[self.current_step]``\n\n          * ``val_{c+n}`` is the value in the time series n steps in the future\n\n          * n is the number of steps in the future at which we are forecasting.\n\n          The output ``forecast = forecaster(val_c, val_{c+n}, n)`` must have the same sign\n          as the inputs ``val_c`` and ``val_{c+n}``.\n\n        * If ``float``, serves as a standard deviation for a mean-zero gaussian noise function\n          that is added to the true value.\n\n        * If ``\"oracle\"``, gives a perfect forecast.\n\n        * If ``None``, no forecast.\n\n    forecast_horizon : int.\n        Number of steps in the future to forecast. If forecaster is None, ignored and 0 is returned.\n\n    forecaster_increase_uncertainty : bool, default False\n        Whether to increase uncertainty for farther-out dates if using a GaussianNoiseForecaster. Ignored otherwise.\n\n    cost_per_unit_co2 : float, default 0.0\n        Marginal cost of grid co2 production.\n\n    raise_errors : bool, default False\n        Whether to raise errors if bounds are exceeded in an action.\n        If False, actions are clipped to the limit possible.\n\n    \"\"\"\n\n    module_type = ('grid', 'controllable')\n\n    yaml_tag = u\"!GridModule\"\n    yaml_loader = yaml.SafeLoader\n    yaml_dumper = yaml.SafeDumper\n\n    state_components = np.array(['import_price', 'export_price', 'co2_per_kwh', 'grid_status'], dtype=object)\n\n    def __init__(self,\n                 max_import,\n                 max_export,\n                 time_series,\n                 forecaster=None,\n                 forecast_horizon=DEFAULT_HORIZON,\n                 forecaster_increase_uncertainty=False,\n                 forecaster_relative_noise=False,\n                 initial_step=0,\n                 final_step=-1,\n                 cost_per_unit_co2=0.0,\n                 raise_errors=False):\n\n        time_series = self._check_params(max_import, max_export, time_series)\n        self.max_import, self.max_export = max_import, max_export\n        self.cost_per_unit_co2 = cost_per_unit_co2\n        self.name = ('grid', None)\n        super().__init__(\n            time_series,\n            raise_errors,\n            forecaster=forecaster,\n            forecast_horizon=forecast_horizon,\n            forecaster_increase_uncertainty=forecaster_increase_uncertainty,\n            forecaster_relative_noise=forecaster_relative_noise,\n            initial_step=initial_step,\n            final_step=final_step,\n            provided_energy_name='grid_import',\n            absorbed_energy_name='grid_export'\n        )\n\n    def _check_params(self, max_import, max_export, time_series):\n        if max_import < 0:\n            raise ValueError('parameter max_import must be non-negative.')\n        if max_export < 0:\n            raise ValueError('parameter max_export must be non-negative.')\n        if time_series.shape[1] not in [3, 4]:\n            raise ValueError('Time series must be two dimensional with three or four columns.'\n                             'See docstring for details.')\n\n        if time_series.shape[1] == 4:\n            if not ((np.array(time_series)[:, -1] == 0) | (np.array(time_series)[:, -1] == 1)).all():\n                raise ValueError(\"Last column (grid status) must contain binary values.\")\n        else:\n            new_ts = np.ones((time_series.shape[0], 4))\n            new_ts[:, :3] = time_series\n            time_series = new_ts\n\n        if (time_series < 0).any().any():\n            raise ValueError('Time series must be non-negative.')\n\n        return time_series\n\n    def _get_bounds(self):\n        min_obs = self._time_series.min(axis=0)\n        max_obs = self._time_series.max(axis=0)\n        assert len(min_obs) in (3, 4)\n\n        min_act, max_act = -1 * self.max_export, self.max_import\n\n        return min_obs, max_obs, min_act, max_act\n\n    def update(self, external_energy_change, as_source=False, as_sink=False):\n        assert as_source + as_sink == 1, 'Must act as either source or sink but not both or neither.'\n        reward = self.get_cost(external_energy_change, as_source, as_sink)\n        info_key = 'provided_energy' if as_source else 'absorbed_energy'\n        info = {info_key: external_energy_change,\n                'co2_production': self.get_co2_production(external_energy_change, as_source, as_sink)}\n\n        return reward, self._done(), info\n\n    def get_cost(self, import_export, as_source, as_sink):\n        \"\"\"\n        Current cost of the grid's usage.\n\n        Includes both the cost of importing/exporting as well as the cost of carbon dioxide production.\n        Note that the \"cost\" of exporting may be negative as the module may receive revenue in exchange for\n        energy export.\n        If the module is exporting to the grid, co2 production cost will be zero.\n\n        Parameters\n        ----------\n        import_export : float\n            Amount of energy that is imported or exported.\n        as_source : bool\n            Whether the grid is acting as a source.\n        as_sink : bool\n            Whether the grid is acting as a sink.\n\n        Returns\n        -------\n        cost : float\n            Cost of using the grid.\n\n        \"\"\"\n        if as_source:  # Import\n            import_cost = self._time_series[self.current_step, 0]\n            return -1 * import_cost*import_export + self.get_co2_cost(import_export, as_source, as_sink)\n        elif as_sink:  # Export\n            export_cost = self._time_series[self.current_step, 1]\n            return export_cost * import_export + self.get_co2_cost(import_export, as_source, as_sink)\n        else:\n            raise RuntimeError\n\n    def get_co2_cost(self, import_export, as_source, as_sink):\n        \"\"\"\n        Current cost of the carbon dioxide production of the grid's usage.\n\n        If the module is exporting to the grid, co2 production cost will be zero.\n\n        Parameters\n        ----------\n        import_export : float\n            Amount of energy that is imported or exported.\n        as_source : bool\n            Whether the grid is acting as a source.\n        as_sink : bool\n            Whether the grid is acting as a sink.\n\n        Returns\n        -------\n        co2_cost : float\n            Cost of carbon dioxide production.\n\n        \"\"\"\n        return -1.0 * self.cost_per_unit_co2*self.get_co2_production(import_export, as_source, as_sink)\n\n    def get_co2_production(self, import_export, as_source, as_sink):\n        \"\"\"\n\n        Current carbon dioxide production of the grid's usage.\n\n        If the module is exporting to the grid, co2 production will be zero.\n\n        Parameters\n        ----------\n        import_export : float\n            Amount of energy that is imported or exported.\n        as_source : bool\n            Whether the grid is acting as a source.\n        as_sink : bool\n            Whether the grid is acting as a sink.\n\n        Returns\n        -------\n        co2_production : float\n            Carbon dioxide production.\n\n        \"\"\"\n        if as_source:  # Import\n            co2_prod_per_kWh = self._time_series[self.current_step, 2]\n            co2 = import_export*co2_prod_per_kWh\n            return co2\n        elif as_sink:  # Export\n            return 0.0\n        else:\n            raise RuntimeError\n\n    def as_flex(self):\n        \"\"\"\n        Convert the module to a flex module.\n\n        Flex modules do not require a control to be passed, and are deployed as necessary to balance load and demand.\n\n        \"\"\"\n        self.__class__.module_type = (self.__class__.module_type[0], 'flex')\n\n    def as_fixed(self):\n        \"\"\"\n        Convert the module to a fixed module.\n\n        Flex modules require a control to be passed.\n\n        \"\"\"\n        self.__class__.module_type = (self.__class__.module_type[0], 'fixed')\n\n    @property\n    def import_price(self):\n        \"\"\"\n        Current and forecasted import prices.\n\n        Returns\n        -------\n        prices : np.ndarray, shape (forecast_horizon, )\n            prices[0] gives the current import price while prices[1:] gives forecasted import prices.\n\n        \"\"\"\n        return self.state[::4]\n\n    @property\n    def export_price(self):\n        \"\"\"\n        Current and forecasted export prices.\n\n        Returns\n        -------\n        prices : np.ndarray, shape (forecast_horizon, )\n            prices[0] gives the current export price while prices[1:] gives forecasted export prices.\n\n        \"\"\"\n        return self.state[1::4]\n\n    @property\n    def co2_per_kwh(self):\n        \"\"\"\n        Current and forecasted carbon dioxide production per kWh.\n\n        Returns\n        -------\n        marginal_production : np.ndarray, shape (forecast_horizon, )\n            marginal_production[0] gives the current production per kWh while\n            marginal_production[1:] gives forecasted production per kWh.\n\n        \"\"\"\n        return self.state[2::4]\n\n    @property\n    def grid_status(self):\n        \"\"\"\n        Current and forecasted grid status.\n\n        Returns\n        -------\n        status : np.ndarray, shape (forecast_horizon, )\n            status[0] gives the current status of the grid while  status[1:] gives forecasted status.\n\n        \"\"\"\n        return self.state[3::4]\n\n    @property\n    def current_status(self):\n        \"\"\"\n        Current status of the grid.\n\n        Returns\n        -------\n        status : {0, 1}\n            Current status.\n\n        \"\"\"\n        return self.grid_status[0]\n\n    @property\n    def max_production(self):\n        return self.max_import * self.current_status\n\n    @property\n    def max_consumption(self):\n        return self.max_export * self.current_status\n\n    @property\n    def production_marginal_cost(self):\n        return self.import_price[0]\n\n    @property\n    def absorption_marginal_cost(self):\n        return self.export_price[0]\n\n    @property\n    def is_source(self):\n        return True\n\n    @property\n    def is_sink(self):\n        return True\n\n    @property\n    def weak_grid(self):\n        \"\"\"\n        Whether the grid has outages or not.\n\n        Returns\n        -------\n        weak_grid : bool\n            True if the grid has outages.\n\n        \"\"\"\n        return self._time_series[:, -1].min() < 1\n\n    def __repr__(self):\n        return f'GridModule(max_import={self.max_import}, max_export={self.max_export})'\n"
  },
  {
    "path": "src/pymgrid/modules/load_module.py",
    "content": "import numpy as np\nimport yaml\n\nfrom pymgrid.microgrid import DEFAULT_HORIZON\nfrom pymgrid.modules.base import BaseTimeSeriesMicrogridModule\n\n\nclass LoadModule(BaseTimeSeriesMicrogridModule):\n    \"\"\"\n    A renewable energy module.\n\n    The classic examples of renewables are photovoltaics (PV) and wind turbines.\n\n    Parameters\n    ----------\n    time_series : array-like, shape (n_steps, )\n        Time series of load demand.\n\n    forecaster : callable, float, \"oracle\", or None, default None.\n        Function that gives a forecast n-steps ahead.\n\n        * If ``callable``, must take as arguments ``(val_c: float, val_{c+n}: float, n: int)``, where\n\n          * ``val_c`` is the current value in the time series: ``self.time_series[self.current_step]``\n\n          * ``val_{c+n}`` is the value in the time series n steps in the future\n\n          * n is the number of steps in the future at which we are forecasting.\n\n          The output ``forecast = forecaster(val_c, val_{c+n}, n)`` must have the same sign\n          as the inputs ``val_c`` and ``val_{c+n}``.\n\n        * If ``float``, serves as a standard deviation for a mean-zero gaussian noise function\n          that is added to the true value.\n\n        * If ``\"oracle\"``, gives a perfect forecast.\n\n        * If ``None``, no forecast.\n\n    forecast_horizon : int.\n        Number of steps in the future to forecast. If forecaster is None, ignored and 0 is returned.\n\n    forecaster_increase_uncertainty : bool, default False\n        Whether to increase uncertainty for farther-out dates if using a GaussianNoiseForecaster. Ignored otherwise..\n\n    raise_errors : bool, default False\n        Whether to raise errors if bounds are exceeded in an action.\n        If False, actions are clipped to the limit possible.\n\n    \"\"\"\n    module_type = ('load', 'fixed')\n    yaml_tag = u\"!LoadModule\"\n    yaml_dumper = yaml.SafeDumper\n    yaml_loader = yaml.SafeLoader\n\n    state_components = np.array([\"load\"], dtype=object)\n\n    def __init__(self,\n                 time_series,\n                 forecaster=None,\n                 forecast_horizon=DEFAULT_HORIZON,\n                 forecaster_increase_uncertainty=False,\n                 forecaster_relative_noise=False,\n                 initial_step=0,\n                 final_step=-1,\n                 raise_errors=False):\n        super().__init__(\n            time_series,\n            raise_errors=raise_errors,\n            forecaster=forecaster,\n            forecast_horizon=forecast_horizon,\n            forecaster_increase_uncertainty=forecaster_increase_uncertainty,\n            forecaster_relative_noise=forecaster_relative_noise,\n            initial_step=initial_step,\n            final_step=final_step,\n            provided_energy_name=None,\n            absorbed_energy_name='load_met'\n        )\n\n        self.name = ('load', None)\n\n    def _get_bounds(self):\n        _min_obs, _max_obs, _, _ = super()._get_bounds()\n        return _min_obs, _max_obs, np.array([]), np.array([])\n\n    def update(self, external_energy_change, as_source=False, as_sink=False):\n        assert as_sink, f'Class {self.__class__.__name__} is a sink.'\n\n        info = {'absorbed_energy': self.current_load}\n\n        return 0.0, self._done(), info\n\n    def sample_action(self, strict_bound=False):\n        return np.array([])\n\n    @property\n    def max_consumption(self):\n        return self.current_load\n\n    @property\n    def current_load(self):\n        \"\"\"\n        Current load.\n\n        Returns\n        -------\n        load : float\n            Current load demand.\n\n        \"\"\"\n        return -1 * self._time_series[self._current_step].item()\n\n    @property\n    def is_sink(self):\n        return True\n"
  },
  {
    "path": "src/pymgrid/modules/module_container.py",
    "content": "import json\nimport pandas as pd\n\nfrom collections import UserDict, UserList\nfrom pymgrid.modules.base import BaseMicrogridModule\n\n\nclass Container(UserDict):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.dir_additions = self.dir_additions()\n\n    @property\n    def containers(self):\n        \"\"\"\n        View of this container's containers.\n\n        Returns\n        -------\n        containers : dict-like\n            View of containers.\n        \"\"\"\n        return self\n\n    def to_list(self):\n        \"\"\"\n        Get the modules as a list.\n\n        Returns\n        -------\n        l : list of modules\n            List of modules\n\n        \"\"\"\n        l = []\n        for _, raw_container in self.containers.items():\n            l.extend(raw_container.to_list())\n        return l\n\n    def to_dict(self):\n        \"\"\"\n        Get the modules as a dictionary.\n\n        Returns\n        -------\n        d : dict[str, list[module]]\n            Dictionary with module names as keys, modules as values.\n\n        \"\"\"\n        d = dict()\n        for k, raw_container in self.containers.items():\n            d.update(raw_container)\n        return d\n\n    def to_tuples(self):\n        \"\"\"\n        Get the modules in (name, module) pairs.\n\n        Returns\n        -------\n        tups : list of tuples: (name, module)\n            Module names and modules.\n\n        \"\"\"\n        l = []\n        for name, modules in self.iterdict():\n            tups = list(zip([name] * len(modules), modules))\n            l.extend(tups)\n        return l\n\n    def iterlist(self):\n        \"\"\"\n        Iterable of the container's modules as a list.\n\n        Returns\n        -------\n        iter : generator\n            Iterator of modules.\n\n        \"\"\"\n        for module in self.to_list():\n            yield module\n\n    def iterdict(self):\n        \"\"\"\n        Iterable of the container's modules as a dict.\n\n        Returns\n        -------\n        iter : generator\n            Iterator of (name, module) pairs.\n\n        \"\"\"\n        for name, modules in self.to_dict().items():\n            yield name, modules\n\n    def get_attrs(self, *attrs, unique=False, as_pandas=True):\n        \"\"\"\n        Get module attributes as a dictionary or pandas object.\n\n        If ``unique``, checks that the value is unique for all modules and returns only the unique value.\n        Otherwise, returns the values for all modules.\n\n        If ``as_pandas``, returns either a pd.Series (if ``unique``) or pd.DataFrame of attributes.\n\n        Parameters\n        ----------\n        attrs : str\n            Names of module attributes to return.\n\n        unique : bool, default False\n            Whether to check for and return a single, unique value for an attribute.\n            If different modules have different values, a ``ValueError`` will be raised.\n\n        as_pandas : bool, default True\n            Whether to return either a pd.Series or pd.DataFrame.\n            If True, the return value will be a pd.Series if ``unique`` and a pd.DataFrame otherwise.\n            If False, returns a dict.\n\n        .. note::\n            If only some modules have a particular attribute, ``get_attrs`` will not raise an error.\n\n            If ``unique``, the unique value of the modules containing the value will be returned.\n            Otherwise, ``NotImplemented`` will fill in missing values.\n\n        Returns\n        -------\n        d : dict or pd.DataFrame or pd.Series\n            * Returns dict if ``as_pandas`` is False.\n\n            * Otherwise, returns a pd.Series if ``unique`` and a pd.DataFrame otherwise.\n\n        Raises\n        ------\n        ValueError\n            * If ``attrs`` is empty, or\n            * ``unique`` is True and non-unique values are found.\n\n        AttributeError\n            If no module has the particular attribute.\n\n            .. warning::\n            This check is not performed if both ``unique`` and ``as_pandas`` are False.\n\n        \"\"\"\n        if not attrs:\n            raise ValueError('Missing attrs to get.')\n\n        d = dict()\n        for k, raw_container in self.containers.items():\n            d.update({\n                name: [{attr: getattr(module, attr, NotImplemented) for attr in attrs} for module in module_list]\n                for name, module_list in raw_container.items()\n            })\n\n        if not (unique or as_pandas):\n            return d\n\n        d_df = pd.DataFrame({(name, num): subdict for name, module_list in d.items()\n                            for num, subdict in enumerate(module_list)}).T\n\n        bad_keys = []\n        uniques, nonuniques = {}, []\n\n        for k, v in d_df.items():\n            not_notimplemented = v[v != NotImplemented]\n            unique_items = not_notimplemented.drop_duplicates().values\n\n            try:\n                unique_item = unique_items.item()\n            except ValueError:\n                if len(unique_items) == 0:\n                    # Only values were NotImplemented\n                    bad_keys.append(k)\n                else:\n                    nonuniques.append(k)\n            else:\n                uniques[k] = unique_item\n\n        if len(bad_keys):\n            raise AttributeError(f'No values found for key(s) {bad_keys}')\n\n        if unique:\n            if len(nonuniques):\n                raise ValueError(f\"Attribute(s) {nonuniques} have non-unique values, cannot return single unique value.\")\n\n            if not as_pandas:\n                return uniques\n\n            return pd.Series(uniques, dtype=None if len(uniques) else float)\n\n        if as_pandas:\n            return d_df\n\n        return d\n\n    def dir_additions(self):\n        \"\"\"\n        :meta private:\n        \"\"\"\n        additions = set(self.keys())\n        for x in self.values():\n            try:\n                additions.update(x.dir_additions)\n            except AttributeError:\n                pass\n        return additions\n\n    def __getitem__(self, item):\n        if item == 'data' or item == 'module_dict':\n            raise KeyError(item)\n        try:\n            return self.data[item]\n        except KeyError:\n            try:\n                return self.to_dict()[item]\n            except KeyError:\n                raise KeyError(item)\n\n    def __getattr__(self, item):\n        if item == 'data' or item.startswith('__') or item not in dir(self):\n            raise AttributeError(item)\n        try:\n            return self[item]\n        except KeyError:\n            raise AttributeError(item)\n\n    def __len__(self):\n        return sum(len(v) for k, v in self.containers.items())\n\n    def __repr__(self):\n        try:\n            return json.dumps(self.to_dict(), indent=2, default=str)\n        except TypeError:\n            return super().__repr__()\n\n    def __dir__(self):\n        rv = set(super().__dir__())\n        rv = rv | self.dir_additions\n        return sorted(rv)\n\n    def __contains__(self, item):\n        return item in self.data.keys() or item in self.dir_additions\n\n\nclass ModuleContainer(Container):\n    \"\"\"\n    Container of modules.\n\n    Allows for indexing and viewing of a microgrids module's in various ways.\n    \"\"\"\n    \"\"\"\n    Container of modules. Allows for indexing/getting of the modules in various ways.\n    Modules are stored at the lowest level: self._containers[('fixed', 'source')] = [Genset, Grid], for example.\n    These modules, however, can be accessed in many different ways:\n\n        container.fixed\n            All fixed modules\n        container.flex\n            All flex modules\n        container.sources\n             ll source modules\n        container.sinks\n             All sink modules\n        container.fixed.sources\n            All fixed source modules\n        container.sources.fixed\n            Same as above\n        container.fixed.sinks\n            All fixed sink modules\n        container.sinks.fixed\n            Same as above\n\n        Modules can also be accessed directly:\n        container.genset\n            All modules named genset\n\n        container.big_battery\n            Modules passed with custom name big_battery\n\n        Each level can be iterated on, both by calling .items() or by iterating through the modules directly with .iterlist()\n        For example, container.sinks.iterlist() returns an iterator of all the sinks, without their names.\n\n    \"\"\"\n    def __init__(self, modules):\n        \"\"\"\n\n        :param modules: list-like. List of _modules or tuples. Latter case: tup(str, Module); str to define name of module\n            and second element is the module.\n\n        \"\"\"\n        self._containers = get_subcontainers(modules)\n        midlevels = self._set_midlevel()\n        self._types_by_name = self._get_types_by_name()\n        super().__init__(**midlevels)\n\n    def _get_types_by_name(self):\n        return {name: container_type for container_type, container in self._containers.items() for name in container}\n\n    def _set_midlevel(self):\n        midlevels = dict()\n        for key, subcontainer in self._containers.items():\n            fixed_or_flex, source_sink_both = key\n\n            if fixed_or_flex in midlevels:\n                midlevels[fixed_or_flex][source_sink_both] = subcontainer\n            else:\n                midlevels[fixed_or_flex] = {source_sink_both: subcontainer}\n\n            if source_sink_both in midlevels:\n                midlevels[source_sink_both][fixed_or_flex] = subcontainer\n            else:\n                midlevels[source_sink_both] = {fixed_or_flex: subcontainer}\n        midlevels = {k: Container(**v) for k, v in midlevels.items()}\n        return midlevels\n\n    def names(self):\n        return list(self._types_by_name.keys())\n\n    @property\n    def containers(self):\n        return self._containers\n\n\nclass ModuleList(UserList):\n    def item(self):\n        \"\"\"\n        Get the value of a singleton list.\n\n        Returns\n        -------\n        module : BaseMicrogridModule\n            Item in a singleton list.\n\n        Raises\n        ------\n        ValueError :\n            If there is more than one item in the list.\n\n        \"\"\"\n        if len(self) != 1:\n            raise ValueError(\"Can only convert a ModuleList of length one to a scalar\")\n        return self[0]\n\n    def to_list(self):\n        \"\"\"\n        :meta private:\n\n        Function to be compatible with Container API.\n\n        \"\"\"\n        return self\n\n\ndef get_subcontainers(modules):\n    \"\"\"\n    :meta private:\n    \"\"\"\n    source_sink_keys = ('sources', 'sinks', 'source_and_sinks')\n    fixed = {k: dict() for k in source_sink_keys}\n    flex = {k: dict() for k in source_sink_keys}\n    controllable = {k: dict() for k in source_sink_keys}\n\n    module_names = dict()\n\n    for module in modules:\n        try:  # module is a tuple\n            module_name, module = module\n            fixed_flex_controllable = module.__class__.module_type[1]\n        except TypeError:  # module is a module\n            try:\n                module_name, fixed_flex_controllable = module.__class__.module_type\n            except TypeError:\n                raise NotImplementedError(\n                    f'Must define the class attribute module_type for class {module.__class__.__name__}')\n\n        assert isinstance(module, BaseMicrogridModule), 'Module must inherit from BaseMicrogridModule.'\n        assert module.is_sink or module.is_source, 'Module must be sink or source (or both).'\n\n        source_sink_both = 'source_and_sinks' if module.is_sink and module.is_source else \\\n            'sources' if module.is_source else 'sinks'\n\n        if fixed_flex_controllable == 'fixed':\n            d = fixed\n        elif fixed_flex_controllable == 'flex':\n            d = flex\n        elif fixed_flex_controllable == 'controllable':\n            d = controllable\n        else:\n            raise TypeError(f'Cannot parse fixed_flex_controllable from module type {module.__class__.module_type}')\n\n        try:\n            module_names[module_name] = (fixed_flex_controllable, source_sink_both)\n        except KeyError:\n            raise NameError(\n                f'Attempted to add module {module_name} of type {(fixed_flex_controllable, source_sink_both)}, '\n                f'but there is an identically named module of type {module_names[module_name]}.')\n\n        try:\n            d[source_sink_both][module_name].append(module)\n        except KeyError:\n            d[source_sink_both][module_name] = ModuleList([module])\n        module.name = (module_name, len(d[source_sink_both][module_name]) - 1)\n\n    modules_dict = dict(fixed=fixed,\n                        flex=flex,\n                        controllable=controllable)\n\n    containers = {(ffs, source_sink_both): Container(modules_dict[ffs][source_sink_both])\n                  for ffs in ('fixed', 'flex', 'controllable')\n                  for source_sink_both in source_sink_keys}\n\n    return containers\n"
  },
  {
    "path": "src/pymgrid/modules/renewable_module.py",
    "content": "import numpy as np\nimport yaml\n\nfrom pymgrid.microgrid import DEFAULT_HORIZON\nfrom pymgrid.modules.base import BaseTimeSeriesMicrogridModule\n\n\nclass RenewableModule(BaseTimeSeriesMicrogridModule):\n    \"\"\"\n    A renewable energy module.\n\n    The classic examples of renewables are photovoltaics (PV) and wind turbines.\n\n    Parameters\n    ----------\n    time_series : array-like, shape (n_steps, )\n        Time series of renewable production.\n\n    forecaster : callable, float, \"oracle\", or None, default None.\n        Function that gives a forecast n-steps ahead.\n\n        * If ``callable``, must take as arguments ``(val_c: float, val_{c+n}: float, n: int)``, where\n\n          * ``val_c`` is the current value in the time series: ``self.time_series[self.current_step]``\n\n          * ``val_{c+n}`` is the value in the time series n steps in the future\n\n          * n is the number of steps in the future at which we are forecasting.\n\n          The output ``forecast = forecaster(val_c, val_{c+n}, n)`` must have the same sign\n          as the inputs ``val_c`` and ``val_{c+n}``.\n\n        * If ``float``, serves as a standard deviation for a mean-zero gaussian noise function\n          that is added to the true value.\n\n        * If ``\"oracle\"``, gives a perfect forecast.\n\n        * If ``None``, no forecast.\n\n    forecast_horizon : int.\n        Number of steps in the future to forecast. If forecaster is None, ignored and 0 is returned.\n\n    forecaster_increase_uncertainty : bool, default False\n        Whether to increase uncertainty for farther-out dates if using a GaussianNoiseForecaster. Ignored otherwise.\n\n    provided_energy_name: str, default \"renewable_used\"\n        Name of the energy provided by this module, to be used in logging.\n\n    raise_errors : bool, default False\n        Whether to raise errors if bounds are exceeded in an action.\n        If False, actions are clipped to the limit possible.\n\n    \"\"\"\n    module_type = ('renewable', 'flex')\n    yaml_tag = u\"!RenewableModule\"\n    yaml_loader = yaml.SafeLoader\n    yaml_dumper = yaml.SafeDumper\n\n    state_components = np.array([\"renewable\"], dtype=object)\n\n    def __init__(self,\n                 time_series,\n                 raise_errors=False,\n                 forecaster=None,\n                 forecast_horizon=DEFAULT_HORIZON,\n                 forecaster_increase_uncertainty=False,\n                 forecaster_relative_noise=False,\n                 initial_step=0,\n                 final_step=-1,\n                 provided_energy_name='renewable_used'):\n        super().__init__(\n            time_series,\n            raise_errors,\n            forecaster=forecaster,\n            forecast_horizon=forecast_horizon,\n            forecaster_increase_uncertainty=forecaster_increase_uncertainty,\n            forecaster_relative_noise=forecaster_relative_noise,\n            initial_step=initial_step,\n            final_step=final_step,\n            provided_energy_name=provided_energy_name,\n            absorbed_energy_name=None\n        )\n\n        self.name = ('renewable', None)\n\n    def update(self, external_energy_change, as_source=False, as_sink=False):\n        assert as_source, f'Class {self.__class__.__name__} can only be used as a source.'\n        assert external_energy_change <= self.current_renewable, f'Cannot provide more than {self.current_renewable}'\n\n        info = {'provided_energy': external_energy_change,\n                'curtailment': self.current_renewable-external_energy_change}\n\n        return 0.0, self._done(), info\n\n    @property\n    def max_production(self):\n        return self.current_renewable\n\n    @property\n    def current_renewable(self):\n        \"\"\"\n        Current renewable production.\n\n        Returns\n        -------\n        renewable : float\n            Renewable production.\n\n        \"\"\"\n        return self._time_series[self._current_step].item()\n\n    @property\n    def is_source(self):\n        return True\n"
  },
  {
    "path": "src/pymgrid/modules/unbalanced_energy_module.py",
    "content": "import numpy as np\nimport yaml\n\nfrom pymgrid.modules.base import BaseMicrogridModule\n\n\nclass UnbalancedEnergyModule(BaseMicrogridModule):\n    module_type = ('balancing', 'flex')\n    yaml_tag = u\"!UnbalancedEnergyModule\"\n    yaml_dumper = yaml.SafeDumper\n    yaml_loader = yaml.SafeLoader\n\n    def __init__(self,\n                 raise_errors,\n                 initial_step=0,\n                 loss_load_cost=10,\n                 overgeneration_cost=2.0\n                 ):\n\n        super().__init__(raise_errors,\n                         initial_step=initial_step,\n                         provided_energy_name='loss_load',\n                         absorbed_energy_name='overgeneration')\n\n        self.loss_load_cost, self.overgeneration_cost = loss_load_cost, overgeneration_cost\n        self.name = ('unbalanced_energy', None)\n\n    def update(self, external_energy_change, as_source=False, as_sink=False):\n        assert as_source + as_sink == 1, 'Must act as either source or sink but not both or neither.'\n\n        info_key = 'provided_energy' if as_source else 'absorbed_energy'\n        reward = -1.0 * self.get_cost(external_energy_change, as_source, as_sink)\n        assert reward <= 0\n        info = {info_key: external_energy_change}\n\n        return reward, False, info\n\n    def get_cost(self, energy_amount, as_source, as_sink):\n        \"\"\"\n        Get the cost of unmet load or excess production.\n\n        Parameters\n        ----------\n        energy_amount : float>=0\n            Amount of unmet load or excess production.\n\n        as_source : bool\n            Whether the energy is unmet load.\n\n        as_sink : bool\n            Whether the energy is excess production.\n\n        Returns\n        -------\n        cost : float\n\n        Raises\n        ------\n        TypeError\n            If both as_source and as_sink are True or neither are.\n\n        \"\"\"\n        if as_source and as_sink:\n            raise TypeError(\"as_source and as_sink cannot both be True.\")\n        if as_source:  # loss load\n            return self.loss_load_cost*energy_amount\n        elif as_sink:\n            return self.overgeneration_cost*energy_amount\n        else:\n            raise TypeError(\"One of as_source or as_sink must be True.\")\n\n    def _state_dict(self):\n        return dict()\n\n    @property\n    def state(self):\n        return np.array([])\n\n    @property\n    def min_obs(self):\n        return np.array([])\n\n    @property\n    def max_obs(self):\n        return np.array([])\n\n    @property\n    def min_act(self):\n        return -np.inf\n\n    @property\n    def max_act(self):\n        return np.inf\n\n    @property\n    def max_production(self):\n        return np.inf\n\n    @property\n    def max_consumption(self):\n        return np.inf\n\n    @property\n    def is_source(self):\n        return True\n\n    @property\n    def is_sink(self):\n        return True\n\n    @property\n    def production_marginal_cost(self):\n        return self.loss_load_cost\n\n    @property\n    def absorption_marginal_cost(self):\n        return self.overgeneration_cost\n"
  },
  {
    "path": "src/pymgrid/utils/DataGenerator.py",
    "content": "\"\"\"\nCopyright 2020 Total S.A.\nAuthors:Gonzague Henri <gonzague.henri@total.com>, Avishai Halev <>\nPermission to use, modify, and distribute this software is given under the\nterms of the pymgrid License.\nNO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.\n$Date: 2020/08/27 08:04 $\nGonzague Henri\n\"\"\"\n\"\"\"\n<pymgrid is a Python library to simulate microgrids>\nCopyright (C) <2020> <Total S.A.>\n\nThis program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.\n\nYou should have received a copy of the GNU Lesser General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.\n\n\"\"\"\nimport sys\nimport unittest\nimport pandas as pd\nimport numpy as np\nfrom matplotlib import pyplot as plt\nfrom scipy.interpolate import interp1d\nimport statsmodels.regression.quantile_regression as quantile_regression\nfrom IPython.display import display\n\ndef return_underlying_data(microgrid):\n    \"\"\"\n    Returns the pv, load, and grid data from the  microgrid in the same format as samples.\n    :param microgrid, pymgrid.Microgrid.Microgrid\n        microgrid to reformat underlying data for\n    :return:\n        data: pd.DataFrame, shape (8760,3)\n            DataFrame with columns 'pv', 'load', 'grid', values of these respectively at each timestep.\n    \"\"\"\n    pv_data = microgrid._pv_ts\n    load_data = microgrid._load_ts\n\n    pv_data = pv_data[pv_data.columns[0]]\n    load_data = load_data[load_data.columns[0]]\n    pv_data.name = 'pv'\n    load_data.name = 'load'\n\n    if microgrid.architecture['grid'] != 0:\n        grid_data = microgrid._grid_status_ts\n        if isinstance(grid_data, pd.DataFrame):\n            grid_data = grid_data[grid_data.columns[0]]\n            grid_data.name = 'grid'\n        elif isinstance(grid_data, pd.Series):\n            grid_data.name = 'grid'\n        else:\n            raise RuntimeError('Unable to handle microgrid._grid_status_ts of type {}.'.format(type(grid_data)))\n    else:\n        grid_data = pd.Series(data=[0] * len(microgrid._load_ts), index=pv_data.index, name='grid')\n\n    return pd.concat([pv_data, load_data, grid_data], axis=1)\n\n\n\nclass NoisyPVData:\n    def __init__(self, pv_data = None,file_name = None):\n        if pv_data is not None:\n            if isinstance(pv_data,pd.Series):\n                self.unmunged_data = pv_data.to_frame()\n                self.data = pv_data.to_frame()\n            elif not isinstance(pv_data, pd.DataFrame):\n                raise TypeError('known_data must be of type pd.DataFrame or pd.Series, is ({})'.format(type(pv_data)))\n            else:\n                self.unmunged_data = pv_data.copy()\n                self.data = pv_data.copy()\n\n        elif file_name is not None:\n            self.data, self.unmunged_data = self.import_file(file_name)\n\n        else:\n            raise RuntimeError('Unable to initialize data')\n\n        self.num_hours = len(self.data)\n        self.munged = False\n        self.interpolated = False\n        self.daily_maxes = None\n        self.feature_functions = None\n        self.feature_names = None\n        self.interpolated_coef = None\n        self.parabolic_baseline = None\n        self.distribution_bounds = None\n\n    def import_file(self,file_name):\n        return pd.read_csv(file_name), pd.read_csv(file_name)\n\n    def data_munge(self, verbose=False):\n\n        # Get column name of pv values\n        if len(self.data.columns.values)!=1:\n            print('Warning multiple columns in pv_data, attempting to use \\'GH illum (lx)\\' as column name')\n            col_name = 'GH illum (lx)'\n        else:\n            col_name = self.data.columns[0]\n\n        hours = [j % 24 for j in range(self.num_hours)]\n        day = [int(np.floor(j / 24)) for j in range(self.num_hours)]\n\n        self.data['hour'] = pd.Series(data=hours)\n        self.data['day'] = pd.Series(data=day)\n        self.data = self.data.pivot(index='hour', columns='day', values=col_name)\n\n        indices_of_max = self.data.idxmax(axis=0)\n        maxes = self.data.max(axis=0)\n        indices_of_max.name = 'time_of_max'\n        maxes.name = 'max_GHI'\n        self.daily_maxes = pd.concat([indices_of_max, maxes], axis=1)\n        self.daily_maxes['cumulative_hr'] = self.daily_maxes['time_of_max'] + self.daily_maxes.index.values * 24\n\n        self.munged = True\n\n        if verbose:\n            print('Munging completed.')\n            print(self.data.describe())\n            print(self.daily_maxes.describe())\n\n    def _add_feature_columns(self, num_feature_functions=1, period_scale=1., ):\n        feature_names = []\n        feature_funcs = {}\n\n        if not self.munged:\n            raise RuntimeError('Data must be munged before adding feature columns or curve interpolation. '\n                               'Call data_munge first')\n        name = 'ones'\n        self.daily_maxes[name] = pd.Series(data = [1.0]*len(self.daily_maxes['cumulative_hr']))\n\n        def f(x):\n            if isinstance(x, int) or isinstance(x, float):\n                return 1.0\n            else:\n                return pd.Series(data=[1.0] * len(x))\n\n        feature_names.append(name)\n        feature_funcs[name] = f\n\n        for k in range(num_feature_functions):\n            if k % 2 == 0:\n                num = int(np.floor((k + 2) / 2))\n                name = 'cos' + str(num) + 'x'\n                self.daily_maxes[name] = np.cos(\n                    2 * num * np.pi / 8760. * period_scale * (self.daily_maxes['cumulative_hr'] - 173 * 24))\n\n                def f(x):\n                    return np.cos(2 * num * np.pi / 8760. * period_scale * (x - 173 * 24))\n\n                assert all((f(self.daily_maxes['cumulative_hr']) == self.daily_maxes[name])), \\\n                    'Function declaration failed'\n\n            elif k % 2 == 1:\n                num = int(np.floor((k + 1) / 2))\n                name = 'sin' + str(num) + 'x'\n                self.daily_maxes[name] = np.sin(\n                    2 * num * np.pi / 8760. * period_scale * (self.daily_maxes['cumulative_hr'] - 173 * 24))\n\n                def f(x):\n                    return np.sin(2 * num * np.pi / 8760. * period_scale * (x - 173 * 24))\n\n            else:\n                raise RuntimeError('Should not be here')\n\n            feature_funcs[name] = f\n            feature_names.append(name)\n\n        for name in feature_names:\n            assert all((feature_funcs[name](self.daily_maxes['cumulative_hr']) == self.daily_maxes[name])), \\\n                'Something wrong with feature functions'\n\n        self.feature_functions = feature_funcs\n        self.feature_names = feature_names\n\n    def max_min_curve_interpolate(self, num_feature_functions=1,\n                                  percentile=0.8,\n                                  plot_curve=False,\n                                  use_preset_params = True,\n                                    params = 'sf'):\n        \"\"\"\n        Interpolates the upper bound curve using cos/sin features so that at least\n            percentile points are below the curve\n        \"\"\"\n        sf_presets = {'period_scale': 0.8,\n                      'q_max': 0.9,\n                      'q_min': 0.25}\n        houston_presets = {'period_scale':0.8,\n             'q_max': 0.9,\n             'q_min':0.05}\n\n        presets = {'sf' : sf_presets, 'houston' : houston_presets}\n\n        if use_preset_params:\n            if params in presets.keys():\n                parameters = presets[params]\n                period_scale = parameters['period_scale']\n                q_max = parameters['q_max']\n                q_min = parameters['q_min']\n            else:\n                raise NameError('If use_preset_params is True, params must be one of {\\'sf\\',\\'houston\\' '\n                                'denoting preset parameters')\n        else:\n            if not isinstance(params,dict):\n                raise TypeError('params must be a dict of parameters, not ({})'.format(params))\n            period_scale = params['period_scale']\n            q_max = params['q_max']\n            q_min = params['q_min']\n\n        if not (1.0 >= percentile >= 0.0):\n            raise ValueError('percentile must be in [0,1], is ({})'.format(percentile))\n\n        self._add_feature_columns(num_feature_functions=num_feature_functions, period_scale=period_scale)\n\n        x_vars = self.daily_maxes[self.feature_names]\n\n        quantile_reg_model = quantile_regression.QuantReg(self.daily_maxes['max_GHI'], x_vars)\n        results = quantile_reg_model.fit(q=q_max)\n        max_coef = results.params\n        max_curve = max_coef['ones']*x_vars['ones']\n\n        for p_name in self.feature_names:\n            if p_name == 'ones':\n                continue\n            else:\n                max_curve+=max_coef[p_name]*x_vars[p_name]\n\n        results = quantile_reg_model.fit(q=q_min)\n        min_coef = results.params\n        min_curve = min_coef['ones'] * x_vars['ones']\n\n        for p_name in self.feature_names:\n            if p_name == 'ones':\n                continue\n            else:\n                min_curve += min_coef[p_name] * x_vars[p_name]\n\n        if plot_curve:\n            plt.scatter(self.daily_maxes['cumulative_hr']/24, self.daily_maxes['max_GHI'], color='r', marker='.')\n            plt.plot(self.daily_maxes['cumulative_hr']/24, max_curve, label='{}th percentile'.format(int(100 * q_max)))\n            plt.plot(self.daily_maxes['cumulative_hr']/24,\n                     min_curve, color='k', label='{}th percentile'.format(int(100 * q_min)))\n            plt.xlabel('Day')\n            plt.legend()\n            plt.title('Maximum daily PV upper/lower bounds')\n            plt.show()\n\n        self.interpolated_coef = {'max': max_coef, 'min': min_coef}\n        self.interpolated = True\n\n    def most_light_curve_eval(self, max_min, cumulative_hours=None, day_hour_pairs=None):\n        \"\"\"\n        Evaluates the interpolated upper bound curve at the time values in val\n        \"\"\"\n        to_return = []\n        if max_min =='max':\n            interpolated_coef = self.interpolated_coef['max']\n        elif max_min == 'min':\n            interpolated_coef = self.interpolated_coef['min']\n        else:\n            raise ValueError('max_min must be one of \\'max\\' or \\'min\\', is {}',format(max_min))\n\n        if cumulative_hours is not None:\n            try:\n                cumul_times = pd.Series(data=cumulative_hours)\n                y = pd.Series(data=[0] * len(cumul_times), name='Upper Bound Values')\n            except TypeError:\n                cumul_times = cumulative_hours\n                y = interpolated_coef['ones']\n\n            for j, name in enumerate(self.feature_names):\n                feature_function = self.feature_functions[name]\n                y += interpolated_coef[name] * feature_function(cumul_times)\n\n            if len(y) == 1:\n                y = y[0]\n            to_return.append(y)\n\n        if day_hour_pairs is not None:\n            cumul_times = []\n            for pair in day_hour_pairs:\n                if len(pair) != 2:\n                    raise ValueError('pairs must be array-like of length two, containing days and hours')\n                if pair[1] < 0 or pair[1] >= 24:\n                    raise ValueError('hour must be in [0,23], is ({})'.format(pair[1]))\n\n                cumul_times.append(pair[0] * 24 + pair[1])\n\n            x = pd.Series(data=cumul_times)\n            y_pairs = pd.Series(data=[0] * len(cumul_times), name='Upper Bound Values')\n            for j, name in enumerate(self.feature_names):\n                feature_function = self.feature_functions[name]\n                y_pairs += interpolated_coef[name] * feature_function(x)\n\n            if len(y_pairs) == 1:\n                y_pairs = y_pairs[0]\n\n            to_return.append(y_pairs)\n\n        if len(to_return) == 1:\n            to_return = to_return[0]\n\n        return to_return\n\n    def _sample_parabola(self,noise_type, noise_parameters, verbose, push_peak_val=False, push_peak_ratio=0.5):\n        noisy_data = self.data.copy()  # Columns are days, index is hours\n\n        # Need three points for interpolation: two zeros\n        # Get points for each day:\n\n        lower_distribution_bounds = []\n        upper_distribution_bounds = []\n\n        for day in noisy_data.columns:\n            if noisy_data[day][0] != 0:\n                raise RuntimeError('It appears that it is sunny at midnight of day ({}). No good.'.format(day))\n            if noisy_data[day][23] != 0:\n                raise RuntimeError('It appears that it is sunny at 11PM of day ({}). No good.'.format(day))\n\n            night_hours = np.where(noisy_data[day] == 0)[0]\n            next_night_hours = np.roll(night_hours, -1)\n            index_of_dawn = np.where(night_hours + 1 != next_night_hours)[0][0]\n            dawn_time = night_hours[index_of_dawn]  # Gives a zero: (dawn_time,0)\n            dusk_time = night_hours[index_of_dawn + 1]  # Another zero: (dusk_time,0)\n\n            # time_of_most_light = self.daily_maxes.loc[day, 'time_of_max']\n            time_of_most_light = (dawn_time + dusk_time) / 2.0\n            interpolated_least_light = self.most_light_curve_eval(max_min='min',\n                                                                  day_hour_pairs=((day, time_of_most_light),))\n            interpolated_most_light = self.most_light_curve_eval(max_min='max',\n                                                                 day_hour_pairs=((day, time_of_most_light),))\n\n            # Check if these bounds are negative.\n            if interpolated_least_light<0:\n                if interpolated_most_light<0: # This is dumb, but it flips the negative bounds\n                    most_light = -min(interpolated_least_light, interpolated_most_light)\n                    least_light = -max(interpolated_least_light, interpolated_most_light)\n                    interpolated_most_light = most_light\n                    interpolated_least_light = least_light\n                else:\n                    interpolated_least_light = 0\n\n            lower_b = interpolated_least_light\n            upper_b = interpolated_most_light\n            spread = upper_b - lower_b\n\n            if noise_type == 'uniform':\n                low = lower_b + noise_parameters['lower'] * spread\n                high = upper_b + (noise_parameters['upper'] - 1) * spread\n                lower_distribution_bounds.append(low)\n                upper_distribution_bounds.append(high)\n                peak_val = np.random.uniform(low=low, high=high)\n\n                if verbose:\n                    print('Day {}'.format(day))\n                    print('Using uniform distribution between {} and {}'.format(round(low, 1),\n                                                                                round(high, 1)))\n                    print('Unscaled bounds: [{},{}]'.format(round(lower_b, 1), round(upper_b, 1)))\n                    print('Selected daily peak value {}'.format(peak_val))\n\n            elif noise_type == 'triangular':\n                low = lower_b + noise_parameters['lower'] * spread\n                high = upper_b + (noise_parameters['upper'] - 1) * spread\n                if 'mode' in noise_parameters.keys():\n                    mode_param = noise_parameters['mode']\n                    if not 0 <= mode_param <= 1:\n                        raise ValueError(\n                            'mode parameter ({}) invalid, must be scale value in [0,1]'.format(mode_param))\n                    mode = spread * mode_param + lower_b\n                    assert high >= mode >= low, 'mode computation did not work'\n                else:\n                    mode = 0.5 * (lower_b + upper_b)\n\n                lower_distribution_bounds.append(low)\n                upper_distribution_bounds.append(high)\n\n                peak_val = np.random.triangular(left=low, mode=mode, right=high)\n\n                if verbose:\n                    print('Day {}'.format(day))\n                    print('using triangular distribution with low {}, mode {}, high {}'.format(\n                        round(low, 1), round(mode, 1), round(high, 1)))\n                    print('Unscaled bounds: [{},{}]'.format(round(lower_b, 1), round(upper_b, 1)))\n                    print('Selected daily peak value {}'.format(peak_val))\n\n            else:\n                raise RuntimeError('Fell through in noise_types, unable to recognize ({})'.format(noise_type))\n\n            if push_peak_val:\n                peak_val = peak_val+push_peak_ratio*(self.daily_maxes.loc[day, 'max_GHI']-peak_val)\n\n            daytime_x = np.array([dawn_time, time_of_most_light, dusk_time])\n            daytime_y = np.array([0, peak_val, 0])\n            if any(np.diff(daytime_x) <= 0):\n                raise RuntimeError('Something is wrong in interpolating daily curves, '\n                                   'have dawn/peak/dusk times as ({}), not in order'.format(daytime_x))\n\n            # Interpolate that\n            f = interp1d(daytime_x, daytime_y, kind='quadratic', bounds_error=False, fill_value=0)\n            noisy_data[day] = f(noisy_data.index)\n\n        self.parabolic_baseline = noisy_data.copy()\n        self.distribution_bounds = (lower_distribution_bounds, upper_distribution_bounds)\n\n        return noisy_data, lower_distribution_bounds, upper_distribution_bounds\n\n    def sample(self,\n               noise_types=('uniform', 'gaussian'),\n               noise_params=({'lower': 0, 'upper': 1}, {'std_ratio': 0.05}),\n               return_stacked_data = True,\n               plot_noisy=False,\n               days_to_plot=(0, 10),\n               verbose=False,\n               push_peak_val=False,\n               push_peak_ratio=0.5,\n               push_individual_vals=False,\n               push_individual_ratio=0.5,\n               **kwargs\n               ):\n\n        # TODO add param to push peak toward actual peak\n\n        potential_noises = {0: (None, 'uniform', 'triangular'),\n                            1: (None, 'gaussian')}\n\n        noise_parameters = ({'lower': 0, 'upper': 1, 'mode':0.5}, {'std_ratio': 0.05})\n\n        for j, noise in enumerate(noise_types):\n            if noise not in potential_noises[j]:\n                raise ValueError('Noise ({}) not recognized in position ({}), must be one of {}'.format(\n                    noise, j, potential_noises[j]))\n\n        if not self.munged:\n            self.data_munge()\n\n        if not self.interpolated:\n            self.max_min_curve_interpolate()\n\n        if not self.interpolated:\n            raise RuntimeError('Must have an interpolating curve before adding noise. '\n                               'Call max_min_curve_interpolate first.')\n        if len(noise_params) != 2:\n            raise TypeError('Unable to parse noise_params, must be array-like length 2')\n\n        for j, v in enumerate(noise_params):\n            if v is not None and not isinstance(v, dict):\n                raise TypeError('Element ({}) in noise_params must be None or dict, is {}'.format(j, type(v)))\n            elif v is not None:\n                for key in noise_parameters[j].keys():\n                    if key in v.keys():\n                        noise_parameters[j][key] = v[key]\n\n        if noise_types[0] is None:\n            if self.parabolic_baseline is None:\n                raise ValueError('noise_types[0] is None, but there is no stored baseline')\n            else:\n                noisy_data = self.parabolic_baseline.copy()\n                lower_distribution_bounds, upper_distribution_bounds = self.distribution_bounds\n        else:\n            noisy_data, lower_distribution_bounds, \\\n                upper_distribution_bounds = self._sample_parabola(noise_types[0], noise_parameters[0], verbose,\n                                                                  push_peak_val=push_peak_val, push_peak_ratio=push_peak_ratio)\n\n        if noise_types[1] == 'gaussian':\n            noisy_data += np.random.normal(scale=noise_parameters[1]['std_ratio'] * noisy_data)\n\n        if plot_noisy or return_stacked_data:\n            stacked_data = noisy_data.transpose().stack()\n            stacked_data = stacked_data.reset_index()\n            stacked_data = stacked_data.drop(columns=['hour', 'day'])\n\n            assert len(stacked_data.columns)==1, 'stacked data should only have one column here'\n\n            for name in stacked_data.columns:\n                stacked_data.rename(columns={name:'pv'},inplace=True)\n\n        if plot_noisy:\n\n            if 'plot_ub_lb' in kwargs.keys() and kwargs['plot_ub_lb']:\n                plot_upper_lower_bounds=True\n            else:\n                plot_upper_lower_bounds=False\n\n            if 'plot_points_of_dist' in kwargs.keys() and kwargs['plot_points_of_dist']:\n                plot_points_of_distribution = True\n            else:\n                plot_points_of_distribution = False\n\n            self.plot(stacked_data, days_to_plot=days_to_plot, plot_original=True,\n                      plot_upper_lower_bounds=plot_upper_lower_bounds,\n                      plot_points_of_distribution=plot_points_of_distribution)\n\n        if return_stacked_data:\n            stacked_data = self._check_sample(stacked_data, verbose=verbose)\n\n            if push_individual_vals:\n                stacked_data['pv'] += push_individual_ratio*(self.unmunged_data['GH illum (lx)']-stacked_data['pv'])\n\n            return stacked_data\n\n        return noisy_data\n\n    def _check_sample(self, stacked_data, verbose=False):\n        temp_data = stacked_data.copy()\n        temp_data = temp_data.squeeze()\n        if not isinstance(temp_data, pd.Series):\n            raise ValueError('stacked_data needs to be a series or a single column DataFrame, has shape {}'.format(\n                stacked_data.shape))\n\n        negative_indices = temp_data < 0\n\n        if negative_indices.sum() > 0 and verbose:\n            print('Found {} negative values in pv_data sample, forcing them to be 0'.format(\n                negative_indices.sum()))\n\n        value = 0\n\n        temp_data.loc[negative_indices] = value\n\n        assert (temp_data >= 0).all(), 'There are still negative numbers in temp_data when checking sample of pv_data'\n\n        if isinstance(stacked_data, pd.Series):\n            return temp_data\n\n        elif isinstance(stacked_data, pd.DataFrame):\n            new_stacked_data = stacked_data.copy()\n            new_stacked_data[new_stacked_data.columns[0]] = temp_data\n            return new_stacked_data\n\n    def plot(self, stacked_data, days_to_plot=(0,10),\n             plot_sample=True, plot_original=True, plot_upper_lower_bounds=True, plot_points_of_distribution=False,\n             plot_daily_maxes=False, plot_parabolas=False, month_xticks=False):\n\n        if isinstance(stacked_data, pd.DataFrame):\n            stacked_data = stacked_data.squeeze()\n\n        if not isinstance(stacked_data, pd.Series):\n            if plot_sample:\n                print('Warning: stacked_data is an arbitrary sample. Must be pd.Series to plot passed stacked_data, is '\n                      '{}'.format((type(stacked_data))))\n            stacked_data = self.sample()\n\n        indices = slice(24 * days_to_plot[0], 24 * days_to_plot[1])\n        daily_slice = slice(*days_to_plot)\n        if plot_sample:\n            plt.plot(stacked_data[indices].index, stacked_data[indices].values, label='Sample')\n\n        if plot_original:\n            plt.plot(stacked_data[indices].index, self.unmunged_data[indices].values, label='Original')\n\n        if plot_upper_lower_bounds:\n            plt.plot(stacked_data[indices].index,\n                     self.most_light_curve_eval('max', cumulative_hours=stacked_data[indices].index), color='k',\n                     label='Parabola distribution UB')\n\n            plt.plot(stacked_data[indices].index,\n                     self.most_light_curve_eval('min', cumulative_hours=stacked_data[indices].index), color='c',\n                     label='Parabola distribution LB')\n\n        if plot_points_of_distribution:\n            if self.distribution_bounds is None:\n                raise RuntimeError('Could not find distribution bounds, must call \\'sample\\' at least once to plot')\n            else:\n                lower_distribution_bounds, upper_distribution_bounds = self.distribution_bounds\n\n            plt.scatter(self.daily_maxes['cumulative_hr'].iloc[daily_slice], lower_distribution_bounds[daily_slice],\n                        marker='.', color='r')\n            plt.scatter(self.daily_maxes['cumulative_hr'].iloc[daily_slice], upper_distribution_bounds[daily_slice],\n                        marker='.', color='r')\n\n        if plot_daily_maxes:\n            plt.scatter(self.daily_maxes['cumulative_hr'].iloc[daily_slice],self.daily_maxes['max_GHI'].iloc[daily_slice],\n                        marker='.', color='r', label='Underlying daily max pv')\n        if plot_parabolas:\n            parabolas = self.parabolic_baseline.transpose().stack().squeeze()\n            print(parabolas)\n            plt.plot(stacked_data[indices].index, parabolas.iloc[indices],color='c',label='Parabolic Baseline')\n        if month_xticks:\n            print(plt.xticks())\n            locs = [j*30*24 for j in range(13) if j*12>=days_to_plot[0] and j*12<=days_to_plot[1]]\n            ticks = [j for j in range(13) if j*12>=days_to_plot[0] and j*12<=days_to_plot[1]]\n            print(locs)\n            print(ticks)\n            plt.xticks(locs, ticks)\n\n        plt.xlabel('Month')\n        plt.ylabel('PV')\n        plt.legend(loc='lower right')\n        plt.savefig('daily max distribution.png', bbox_inches='tight')\n        plt.show()\n\n\nclass NoisyLoadData:\n    def __init__(self, load_data=None, file_name=None):\n        if load_data is not None:\n            if isinstance(load_data,pd.Series):\n                self.unmunged_data = load_data.to_frame()\n                self.data = load_data.to_frame()\n\n            elif not isinstance(load_data, pd.DataFrame):\n                raise TypeError('known_data must be of type pd.DataFrame or pd.Series, is ({})'.format(type(load_data)))\n            else:\n                self.unmunged_data = load_data.copy()\n                self.data = load_data.copy()\n\n        elif file_name is not None:\n            self.data, self.unmunged_data = self._import_file(file_name)\n\n        else:\n            raise RuntimeError('Unable to initialize data, either load_data or file_name must not be None')\n\n        # Cut load data to the correct size\n        self.data = self.data.iloc[:8760]\n        self.unmunged_data = self.unmunged_data.iloc[:8760]\n\n        self.num_hours = len(load_data)\n        self.munged = False\n        self.interpolated = False\n\n    def _import_file(self, file_name):\n        return pd.read_csv(file_name), pd.read_csv(file_name)\n\n    def data_munge(self, verbose=False):\n\n        # Get column name of pv values\n        if len(self.data.columns.values)!=1:\n            print('Warning multiple columns in load_data, attempting to use \\'Electricity:Facility [kW](Hourly)\\' as column name')\n            col_name = 'Electricity:Facility [kW](Hourly)'\n        else:\n            col_name = self.data.columns[0]\n\n        hours = [j % 24 for j in range(self.num_hours)]\n        day = [int(np.floor(j / 24)) for j in range(self.num_hours)]\n\n        self.data['hour'] = pd.Series(data=hours)\n        self.data['day'] = pd.Series(data=day)\n        self.data = self.data.pivot(index='day', columns='hour', values=col_name)\n        self.data['day_of_week'] = self.data.index % 7\n\n        self.load_mean = self.data.groupby(['day_of_week']).mean()\n        self.load_std = self.data.groupby(['day_of_week']).std().fillna(value=0)\n\n        self.munged = True\n\n    def sample(self, distribution='gaussian', load_variance_scale=1., return_stacked = True, verbose=False, **kwargs):\n\n        if not self.munged:\n            self.data_munge()\n\n        possible_distributions = ('gaussian',)\n        if distribution not in possible_distributions:\n            raise ValueError(\n                'distribution {} not recognized, must be one of ({})'.format(distribution, possible_distributions))\n\n        if distribution == 'gaussian':\n            copied_mean = self.data.copy()\n            copied_mean = copied_mean.set_index([copied_mean.index, 'day_of_week'])\n            copied_std = copied_mean.copy()\n\n\n\n            for ind in copied_mean.index:\n                copied_mean.loc[ind] = self.load_mean.loc[ind[1]]\n                copied_std.loc[ind] = self.load_std.loc[ind[1]]\n\n        else:\n            raise RuntimeError('Unsupported')\n\n        data_sample = pd.DataFrame(data=np.random.normal(loc=copied_mean, scale=load_variance_scale * copied_std),\n                                   index=self.data.index,\n                                   columns=self.data.columns[:-1])\n        if return_stacked:\n            stacked_data = data_sample.stack()\n            stacked_data = stacked_data.reset_index()\n            stacked_data = stacked_data.drop(columns=['day', 'hour'])\n\n            assert len(stacked_data.columns) == 1, 'stacked data should only have one column here'\n\n            for name in stacked_data.columns:\n                stacked_data.rename(columns={name: 'load'}, inplace=True)\n\n            stacked_data = self._check_sample(stacked_data, verbose=verbose)\n\n            return stacked_data\n\n        return data_sample\n\n    def _check_sample(self,stacked_data,verbose=False):\n        temp_data = stacked_data.copy()\n        temp_data = temp_data.squeeze()\n        if not isinstance(temp_data,pd.Series):\n            raise ValueError('stacked_data needs to be a series or a single column DataFrame, has shape {}'.format(stacked_data.shape))\n\n        negative_indices = temp_data < 0\n\n        if negative_indices.sum() > 0 and verbose:\n            print('Found {} negative values in load_data, forcing them to be min of underlying data'.format(negative_indices.sum()))\n\n        value = self.unmunged_data.min().squeeze()\n\n        temp_data.loc[negative_indices] = value\n\n        assert (temp_data>=0).all(), 'There are still negative numbers in temp_data when checking load_data sample'\n\n        if isinstance(stacked_data, pd.Series):\n            return temp_data\n\n        elif isinstance(stacked_data, pd.DataFrame):\n            new_stacked_data = stacked_data.copy()\n            new_stacked_data[new_stacked_data.columns[0]] = temp_data\n            return new_stacked_data\n\n    def plot(self, sample, days_to_plot=(0, 10)):\n\n        if not sample.shape[1]==1:\n            raise ValueError('sample must be in stacked form')\n\n        plt.plot(sample[24 * days_to_plot[0]:24 * days_to_plot[1]].values, label='sample')\n        plt.plot(self.unmunged_data[24 * days_to_plot[0]:24 * days_to_plot[1]].values, label='original')\n        plt.title('Load Sample')\n        plt.legend()\n        plt.show()\n\n\nclass NoisyGridData:\n    def __init__(self,grid_data,dist_type = 'markov'):\n\n        if not (isinstance(grid_data,pd.DataFrame) or isinstance(grid_data,pd.Series)):\n            raise TypeError('grid_data must be of type pd.DataFrame, is {}'.format(type(grid_data)))\n\n        if not ((grid_data==1) | (grid_data==0)).all().item():\n            raise ValueError('Non-binary values found in grid_data')\n\n        possible_dist_types = ('naive','markov')\n        if dist_type not in possible_dist_types:\n            raise TypeError('dist type ({}) not recognized, must be one of {}'.format(dist_type, possible_dist_types))\n\n        self.dist_type = dist_type\n        self.data = grid_data.copy()\n        self.unmunged_data = grid_data.copy()\n        self.has_distribution = False\n        self.transition_prob_matrix = None\n        self.occurrences = None\n\n    def learn_distribution(self):\n\n        if self.dist_type == 'naive':\n            transition_prob_matrix = np.zeros(2)\n            probability_of_one = self.data.mean()\n            transition_prob_matrix[0] = 1-probability_of_one\n            transition_prob_matrix[1] = probability_of_one\n\n        elif self.dist_type == 'markov':\n            grid_vals = self.data.values\n            transition_prob_matrix = np.zeros((2, 2))\n            occurrences = np.zeros(2)\n            for j, val in enumerate(grid_vals):\n                if j < len(grid_vals) - 1: # One less than length b/c we are counting transitions\n                    transition_prob_matrix[int(val), int(grid_vals[j + 1])] += 1\n                    occurrences[int(val)] += 1\n\n            if occurrences[0] > 0:\n                transition_prob_matrix[0, :] /= occurrences[0]\n            else:\n                transition_prob_matrix[0, 0] = 1\n\n            if occurrences[1] > 0:\n                transition_prob_matrix[1, :] /= occurrences[1]\n            else:\n                transition_prob_matrix[1, 1] = 1\n\n            self.occurrences = occurrences\n\n            assert all([np.sum(transition_prob_matrix[j, :]) == 1 for j in range(2)]), \\\n                'transition prob matrix invalid: {}'.format(transition_prob_matrix)\n\n        else:\n            raise RuntimeError('Should not be here')\n\n        self.transition_prob_matrix = transition_prob_matrix\n        self.has_distribution = True\n\n    def sample(self):\n\n        if not self.has_distribution:\n            self.learn_distribution()\n\n        if self.dist_type =='naive':\n            generated_sample = np.random.choice([0, 1], size = len(self.data), p=self.transition_prob_matrix)\n            generated_sample = pd.Series(data=generated_sample, name='grid')\n\n        elif self.dist_type == 'markov':\n            generated_sample = np.zeros(len(self.data))\n\n            probs = self.occurrences/np.sum(self.occurrences)\n            generated_sample[0] = np.random.choice([0,1], p=probs)\n\n            for j in range(1,len(self.data)):\n                probs = self.transition_prob_matrix[int(generated_sample[j-1]),:]\n                generated_sample[j] = np.random.choice([0,1], p=probs)\n\n            generated_sample = pd.Series(data=generated_sample, name='grid')\n\n        else:\n            raise RuntimeError('Should not be here')\n\n        return generated_sample\n\nclass SampleGenerator:\n    def __init__(self, microgrid, **forecast_args):\n        self.microgrid = microgrid\n        self.NPV = NoisyPVData(pv_data=self.microgrid._pv_ts)\n        self.NL = NoisyLoadData(load_data=self.microgrid._load_ts)\n\n        if self.microgrid.architecture['grid'] != 0:\n            self.NG = NoisyGridData(grid_data=self.microgrid._grid_status_ts)\n        else:\n            self.NG = None\n\n        self.underlying_data = return_underlying_data(self.microgrid)\n        self.forecasts = self.create_forecasts(**forecast_args)\n        self.samples = None\n\n    def create_forecasts(self, pv_args=None, load_args=None, preset_to_use=None, print_mape=False, **forecast_args):\n        \"\"\"\n        Creates pv, load, and grid forecasts that are then used to create samples.\n\n        :return:\n            df, pd.DataFrame,  shape (8760,3)\n                DataFrame with columns of 'pv', 'load', and 'grid', containing values for each at all 8760 timesteps\n        \"\"\"\n        if pv_args is None and load_args is None and preset_to_use is not None:\n            print('Using preset forecast arguments')\n            args = ForecastArgSet(preset_to_use=preset_to_use)\n            pv_args = args['pv_args']\n            load_args = args['load_args']\n        else:\n            if pv_args is None:\n                pv_args = dict()\n            if load_args is None:\n                load_args = dict()\n\n        pv_forecast = self.NPV.sample(**pv_args)\n        load_forecast = self.NL.sample(**load_args)\n\n        if self.microgrid.architecture['grid'] != 0:\n            grid_forecast = self.NG.sample()\n        else:\n            grid_forecast = pd.Series(data=[0] * len(self.microgrid._load_ts), name='grid')\n\n        forecast = pd.concat([pv_forecast, load_forecast, grid_forecast], axis=1)\n\n        if print_mape:\n            mape = self.validate_forecasts(forecasts=forecast, aggregate=True)\n            print('MAPE: {}'.format(mape))\n\n        if hasattr(self, 'forecasts'):\n            self.forecasts = forecast\n        else:\n            return forecast\n\n    def test_args(self, iters_per_set = 3):\n        num_pv_noise_params_0 = 3\n        num_pv_std_ratio = 3\n        num_load_variance_scale = 3\n        max_load_var_scale = 2.\n        max_pv_std_ratio = 0.5\n        num_push_peak_ratio = 3\n        num_push_individual_ratio = 3\n\n        forecast_args = ForecastArgs(num_pv_noise_params_0, num_pv_std_ratio, num_load_variance_scale,\n                                     num_push_peak_ratio, num_push_individual_ratio,\n                                     max_load_var_scale=max_load_var_scale, max_pv_std_ratio=max_pv_std_ratio)\n\n        for j, arg_set in enumerate(forecast_args.param_sets):\n            for k in range(iters_per_set):\n                print('iter {}.{}'.format(j, k))\n                forecasts = self.create_forecasts(**arg_set)\n                mape = self.validate_forecasts(forecasts, aggregate=True)\n                arg_set.update_with_mape(mape)\n\n        return forecast_args\n\n    def validate_forecasts(self, forecasts=None, aggregate=False):\n\n        if forecasts is None:\n            forecasts = self.forecasts\n\n        mape_vals = dict()\n\n        for col in ('pv', 'load'):\n            mape_vals[col] = self.mape(self.underlying_data[col], forecasts[col])\n\n        if aggregate:\n            return np.sqrt(np.mean(np.array(list(mape_vals.values()))**2))\n        return mape_vals\n\n    def mape(self, actual_vals, forecast_vals):\n        if isinstance(actual_vals.squeeze(), pd.Series):\n            actual_vals = actual_vals.to_numpy()\n        elif isinstance(actual_vals, np.ndarray):\n            pass\n        else:\n            raise TypeError('actual_vals must be squeezable to single column, has shape {}'.format(actual_vals.shape))\n        if isinstance(forecast_vals.squeeze(), pd.Series):\n            forecast_vals = forecast_vals.to_numpy()\n        elif isinstance(forecast_vals, np.ndarray):\n            pass\n        else:\n            raise TypeError('forecast_vals must be squeezable to single column, has shape {}'.format(forecast_vals.shape))\n\n        ratios = np.abs(((actual_vals-forecast_vals)/actual_vals))\n        mape = np.mean(ratios[~np.isnan(ratios)])\n\n        return mape\n\n    def sample_from_forecasts(self, n_samples=10, **sampling_args):\n        \"\"\"\n            Generates samples of load, grid, pv data by sampling from the distributions defined by using self.forecasts\n                as a baseline in NoisyLoadData, NoisyPVData, NoisyGridData.\n\n        :param n_samples: int, default 100\n            Number of samples to generate\n        :param sampling_args: dict\n            Sampling arguments to be passed to NPV.sample() and NL.sample()\n        :return:\n            samples: list of pd.DataFrame of shape (8760,3)\n            list of samples created from sampling from distributions defined in forecasts.\n        \"\"\"\n        NPV = self.NPV\n        NL = NoisyLoadData(load_data=self.forecasts['load'])\n        NG = NoisyGridData(grid_data=self.forecasts['grid'])\n\n        samples = []\n\n        if 'noise_types' not in sampling_args.keys():\n            sampling_args['noise_types'] = (None, 'gaussian')\n\n        for j in range(n_samples):\n            print('Creating sample {}'.format(j))\n            pv_forecast = NPV.sample(**sampling_args)\n            load_forecast = NL.sample(**sampling_args)\n\n            grid_forecast = NG.sample()\n\n            sample = pd.concat([pv_forecast, load_forecast, grid_forecast], axis=1)\n\n            truncated_index = min(len(NPV.unmunged_data), len(NL.unmunged_data), len(NG.unmunged_data))\n            sample = sample.iloc[:truncated_index]\n            samples.append(sample)\n\n        self.samples = samples\n        return samples\n\n    def plot(self, var='load', days_to_plot=(0, 10), original=True, forecast=True, samples=True):\n        \"\"\"\n        Function to plot the load, pv, or grid data versus the forecast or original data\n        :param var: str, default 'load'\n            one of 'load', 'pv', 'grid', which variable to plot\n        :param days_to_plot: tuple, len 2. default (0,10)\n            defines the days to plot. Plots all hours from days_to_plot[0] to days_to_plot[1]\n        :param original: bool, default True\n            whether to plot the underlying microgrid data\n        :param forecast: bool, default True\n            whether to plot the forecast stored in self.forecast\n        :param samples: bool, default True\n            whether to plot the samples stored in self.samples\n        :return:\n            None\n        \"\"\"\n\n        if var not in self.forecasts.columns:\n            raise ValueError('Cound not find var {} in self.forecasts, should be one of {}'.format(var, self.forecasts.columns))\n\n        indices = slice(24 * days_to_plot[0], 24 * days_to_plot[1])\n\n        if original:\n            plt.plot(self.underlying_data.loc[indices, var].index, self.underlying_data.loc[indices, var].values,\n                     label='original', color='b')\n        if forecast:\n            plt.plot(self.forecasts.loc[indices, var].index, self.forecasts.loc[indices, var].values, label='forecast',\n                     color='r')\n        if samples:\n            for sample in self.samples:\n                plt.plot(sample.loc[indices, var].index, sample.loc[indices, var].values, color='k')\n\n        plt.legend()\n        plt.show()\n\n\nclass ForecastArgSet(dict):\n    def __init__(self, pv_param_set=None, load_param_set=None, preset_to_use=None):\n\n        if pv_param_set is None and load_param_set is None and preset_to_use is not None:\n            saved_dict = self.get_preset(preset_to_use)\n            super(ForecastArgSet, self).__init__(saved_dict)\n\n        elif pv_param_set is not None and load_param_set is not None and preset_to_use is None:\n            super(ForecastArgSet, self).__init__(pv_args=pv_param_set, load_args=load_param_set)\n\n        else:\n            raise KeyError('Unable to parse inputs')\n\n        self.mape_vals = []\n        self.mape_mean = None\n        self.mape_std = None\n\n    def update_with_mape(self, mape):\n\n        self.mape_vals.append(mape)\n        self.mape_mean = np.mean(self.mape_vals)\n        self.mape_std = np.std(self.mape_vals)\n\n    def get_preset(self,forecast_accuracy=50):\n        potential_forecast_accuracies = (50, 70, 85)\n        if forecast_accuracy not in potential_forecast_accuracies:\n            raise ValueError('do not have relevant sampling parameters for forecast accuracy {}, must be one of {}'.format(\n                forecast_accuracy, potential_forecast_accuracies))\n\n        if forecast_accuracy == 50:\n             return {'pv_args': {'noise_params': ({'lower': 0.0, 'upper': 0.5},\n                        {'std_ratio': 0.25}),\n                         'push_peak_val': True,\n                         'push_peak_ratio': 0.0,\n                         'push_individual_vals': True,\n                         'push_individual_ratio': 0.5},\n             'load_args': {'load_variance_scale': 2.0}}\n\n        if forecast_accuracy == 70:\n            return {'pv_args': {'noise_params': ({'lower': 0.0, 'upper': 0.5},\n                        {'std_ratio': 0.25}),\n                         'push_peak_val': True,\n                         'push_peak_ratio': 0.0,\n                         'push_individual_vals': True,\n                         'push_individual_ratio': 0.65},\n             'load_args': {'load_variance_scale': 2.0}}\n\n        elif forecast_accuracy == 85:\n            return {'pv_args': {'noise_params': ({'lower': 0.0, 'upper': 0.5},\n                       {'std_ratio': 0.25}),\n                      'push_peak_val': True,\n                      'push_peak_ratio': 0.0,\n                      'push_individual_vals': True,\n                      'push_individual_ratio': 1.0},\n                     'load_args': {'load_variance_scale': 2.0}}\n\n\n    def __eq__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n\n        return self.mape_mean == other.mape_mean\n\n    def __lt__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n\n        return self.mape_mean < other.mape_mean\n\n    def __gt__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n\n        return self.mape_mean > other.mape_mean\n\nclass ForecastArgs:\n    def __init__(self, num_pv_noise_params_0, num_pv_std_ratio, num_load_variance_scale, num_push_peak_ratio,\n                 num_push_individual_ratio, max_load_var_scale=2., max_pv_std_ratio=0.5):\n\n        pv_params = self.pv_parameters(num_pv_noise_params_0, num_pv_std_ratio, num_push_peak_ratio, num_push_individual_ratio,\n                                       max_std_ratio=max_pv_std_ratio)\n        load_params = self.load_parameters(num_load_variance_scale, max_load_var_scale=max_load_var_scale)\n\n        self.param_sets = self.combine_sets(pv_params, load_params)\n\n    def pv_parameters(self,num_noise_params_0, num_std_ratio, num_push_peak_ratio,  num_push_individual_ratio,\n                      max_std_ratio=0.5):\n\n        pv_params = []\n        for individual_ratio in np.linspace(0,1,num_push_individual_ratio):\n            for peak_ratio in np.linspace(0,1,num_push_peak_ratio):\n                for std_ratio in np.linspace(0,max_std_ratio, num_std_ratio):\n                    for lower in np.linspace(0,1,num_noise_params_0):\n                        for upper in np.linspace(1,lower,num_noise_params_0):\n                            if upper >= lower:\n                                pv_params.append(dict(noise_params=(dict(lower=lower, upper=upper), dict(std_ratio=std_ratio)),\n                                                      push_peak_val=True, push_peak_ratio=peak_ratio,\n                                                      push_individual_vals=True, push_individual_ratio=individual_ratio))\n                            else:\n                                print('upper not geq lower')\n\n        return pv_params\n\n    def load_parameters(self,num_load_variance_scale, max_load_var_scale=2.):\n        load_params = []\n        for var_scale in np.linspace(0,max_load_var_scale,num_load_variance_scale):\n            load_params.append(dict(load_variance_scale=var_scale))\n\n        return load_params\n\n    def combine_sets(self, pv_params, load_params):\n\n        sets = []\n\n        for pv_param in pv_params:\n            for load_param in load_params:\n                sets.append(ForecastArgSet(pv_param_set = pv_param, load_param_set = load_param))\n\n        return sets\n"
  },
  {
    "path": "src/pymgrid/utils/__init__.py",
    "content": "from .serialize import add_pymgrid_yaml_representers\n"
  },
  {
    "path": "src/pymgrid/utils/logger.py",
    "content": "from collections import UserDict\n\nimport numpy as np\nimport pandas as pd\n\n\nclass ModularLogger(UserDict):\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._log_length = max(len(v) for _, v in self.items()) if len(self.data) else 0\n\n    def flush(self):\n        d = self.data.copy()\n        self.clear()\n        self._log_length = 0\n        return d\n\n    def log(self, **log_dict):\n        for key, value in log_dict.items():\n            try:\n                self[key].append(value.item())\n            except AttributeError:\n                self[key].append(value)\n            except KeyError:\n                self[key] = [np.nan]*self._log_length\n                self[key].append(value)\n\n        self._log_length += 1\n\n    def to_dict(self):\n        return self.data.copy()\n\n    def raw(self):\n        return {k: list(map(float, v)) for k, v in self.data.items()}\n\n    def to_frame(self):\n        return pd.DataFrame(self.data)\n\n    def serialize(self, key):\n        return {key: self.to_frame()} if len(self) > 0 else {}\n\n    def __len__(self):\n        return self._log_length\n\n    @classmethod\n    def from_raw(cls, raw):\n        if raw is None:\n            return cls()\n        elif isinstance(raw, str):\n            raw = pd.read_csv(raw).to_dict()\n        return cls(raw)\n"
  },
  {
    "path": "src/pymgrid/utils/ray.py",
    "content": "import functools\nfrom copy import copy\n\n\ndef ray_decorator(func):\n    \"\"\"\n    ray raises an error when assigning values after ray.get to variables defined before ray.get.\n    Easiest solution is to copy the values and try again.\n\n    :meta private:\n\n    \"\"\"\n    @functools.wraps(func)\n    def wrapper(*args, **kwargs):\n        try:\n            return func(*args, **kwargs)\n        except ValueError as e:\n            if 'assignment destination is read-only' not in e.args[0]:\n                raise\n            else:\n                return func(*(copy(a) for a in args), **{k: copy(v) for k, v in kwargs.items()})\n    return wrapper\n"
  },
  {
    "path": "src/pymgrid/utils/serialize.py",
    "content": "import numpy as np\nimport pandas as pd\nimport yaml\n\nfrom pathlib import Path\n\nTO_CSV_TYPES = np.ndarray, pd.core.generic.NDFrame\n\n\ndef add_pymgrid_yaml_representers():\n    add_numpy_pandas_representers()\n    from pymgrid.microgrid.trajectory import (\n        DeterministicTrajectory,\n        StochasticTrajectory,\n        FixedLengthStochasticTrajectory\n    )\n\n    from pymgrid.microgrid.reward_shaping import (\n        PVCurtailmentShaper,\n        BatteryDischargeShaper\n    )\n\n\ndef dump_data(data_dict, stream, yaml_tag):\n    if not hasattr(stream, \"name\"):\n        return data_dict\n\n    path = Path(stream.name).parent / \"data\"\n    return add_path_to_arr_like(data_dict, path, yaml_tag)\n\n\ndef add_path_to_arr_like(data_dict, path, yaml_tag):\n    for key, value in data_dict.items():\n        if isinstance(value, dict):\n            data_dict[key] = add_path_to_arr_like(value, path / key, yaml_tag)\n        elif isinstance(value, TO_CSV_TYPES):\n            if isinstance(value, np.ndarray):\n                value = NDArraySubclass(value)\n            value.path = path / f'{yaml_tag.lstrip(\"!\")}/{key}.csv.gz'\n            data_dict[key] = value\n\n    return data_dict\n\n\ndef add_numpy_pandas_representers():\n    yaml.SafeDumper.add_representer(pd.DataFrame, _pandas_df_representer)\n    yaml.SafeDumper.add_multi_representer(np.ndarray, _numpy_arr_representer)\n    yaml.SafeDumper.add_multi_representer(np.floating, _numpy_represent_floating)\n    yaml.SafeDumper.add_multi_representer(np.integer, _numpy_represent_int)\n\n\ndef add_numpy_pandas_constructors():\n    yaml.SafeLoader.add_constructor('!NDArray', _numpy_arr_constructor)\n    yaml.SafeLoader.add_constructor('!DataFrame', _pandas_df_constructor)\n\n\ndef _numpy_represent_floating(dumper, data):\n    return dumper.represent_float(data.item())\n\n\ndef _numpy_represent_int(dumper, data):\n    return dumper.represent_int(data.item())\n\n\ndef _numpy_arr_representer(dumper, data):\n    return _arr_representer(dumper, data, 'NDArray')\n\n\ndef _pandas_df_representer(dumper, data):\n    return _arr_representer(dumper, data, 'DataFrame')\n\n\ndef _arr_representer(dumper, data, r_type):\n    if hasattr(data, \"path\"):\n        rel_path = _dump_representation(data, data.path, Path(dumper.stream.name).parent)\n        return dumper.represent_scalar(f'!{r_type}', rel_path)\n\n    try:\n        return dumper.represent_mapping(f'!{r_type}', data.to_dict())\n    except AttributeError:\n        return dumper.represent_sequence(f'!{r_type}', data.tolist())\n\n\ndef _dump_representation(data, path, stream_loc):\n    if not path.exists():\n        path.parent.mkdir(parents=True, exist_ok=True)\n    pd.DataFrame(data).to_csv(path)\n    return str(path.relative_to(stream_loc))\n\n\ndef _pandas_df_constructor(loader, node):\n    if isinstance(node, yaml.MappingNode):\n        return pd.DataFrame(loader.construct_mapping(node))\n\n    data_path = Path(loader.construct_scalar(node))\n\n    if not data_path.is_absolute():\n        try:\n            stream_name = loader.stream.name\n        except AttributeError:\n            raise ValueError(f\"Path {data_path} must be absolute if yaml stream has no 'name'.\")\n\n        data_path = Path(stream_name).parent / data_path\n\n    return pd.read_csv(data_path, index_col=0)\n\n\ndef _numpy_arr_constructor(loader, node):\n    if isinstance(node, yaml.SequenceNode):\n        return np.array(loader.construct_sequence(node))\n\n    return _pandas_df_constructor(loader, node).values\n\n\nclass NDArraySubclass(np.ndarray):\n    \"\"\"\n    A simple python class that allows a 'path' attribute for serialization.\n    `path` may be lost if object is manipulated.\n    \"\"\"\n    def __new__(cls, input_array, path=None):\n        obj = np.asarray(input_array).view(cls)\n        obj.path = path\n        return obj\n\n    def __array_finalize__(self, obj):\n        if obj is None:\n            return\n        self.path = getattr(obj, 'path', None)\n"
  },
  {
    "path": "src/pymgrid/utils/space.py",
    "content": "import operator\nimport numpy as np\nimport warnings\n\nfrom abc import abstractmethod\nfrom gym.spaces import Box, Dict, Space, Tuple\nfrom typing import Union\n\n\nclass _PymgridDict(Dict):\n    def __init__(self, d, act_or_obs, normalized=False, seed=None):\n        builtins = self._extract_builtins(d, act_or_obs=act_or_obs, normalized=normalized)\n        try:\n            super().__init__(builtins, seed=seed)\n        except AssertionError:\n            import gym\n            warnings.warn(f\"gym.Space does not accept argument 'seed' in version {gym.__version__}; this argument will \"\n                          f\"be ignored. Upgrade your gym version with 'pip install -U gym' to use this functionality.\")\n\n            super().__init__(builtins.spaces)\n\n    def _extract_builtins(self, d, act_or_obs='act', normalized=False):\n        if act_or_obs == 'act':\n            spaces = self._extract_action_spaces(d)\n        elif act_or_obs == 'obs':\n            spaces = self._extract_observation_spaces(d)\n        else:\n            raise NameError(act_or_obs)\n\n        return self._transform_builtins(spaces, normalized=normalized)\n\n    def _extract_action_spaces(self, d):\n        controllable = {}\n        for module_name, module_list in d.items():\n            controllable_spaces = [v['action_space'] for v in module_list if 'controllable' in v['module_type']]\n            if controllable_spaces:\n                controllable[module_name] = controllable_spaces\n\n        return controllable\n\n    def _extract_observation_spaces(self, d):\n        obs_spaces = {}\n        for module_name, module_list in d.items():\n            spaces = [v['observation_space'] for v in module_list]\n            if spaces:\n                obs_spaces[module_name] = spaces\n\n        return obs_spaces\n\n    def _transform_builtins(self, d, normalized=False):\n        space_key = 'normalized' if normalized else 'unnormalized'\n\n        transformed = {}\n\n        if isinstance(d, dict):\n            transformed = {}\n            for k, v in d.items():\n                if isinstance(v, Space):\n                    transformed[k] = v[space_key]\n                else:\n                    transformed[k] = self._transform_builtins(v, normalized=normalized)\n\n            transformed = Dict(transformed)\n\n        elif isinstance(d, list):\n            transformed = []\n            for v in d:\n                if isinstance(v, Space):\n                    transformed.append(v[space_key])\n                else:\n                    transformed.append(self._transform_builtins(v, normalized=normalized))\n\n            transformed = Tuple(transformed)\n\n        return transformed\n\n    def get_attr(self, attr):\n        return {k: [getattr(v, attr) for v in tup] for k, tup in self.items()}\n\n    @property\n    def low(self):\n        return self.get_attr('low')\n\n    @property\n    def high(self):\n        return self.get_attr('high')\n\n    @property\n    def shape(self):\n        return self.get_attr('shape')\n\n    @shape.setter\n    def shape(self, value):\n        \"\"\"\n        Necessary for compatability with gym<0.21.\n        \"\"\"\n        assert value is None\n\n    def __getattr__(self, item):\n        \"\"\"\n        Necessary for compatability with gym<0.21, where gym.spaces.Dict did not inherit from collections.Mapping.\n        \"\"\"\n        if item == 'spaces':\n            raise AttributeError('spaces')\n        try:\n            return getattr(self.spaces, item)\n        except AttributeError:\n            raise AttributeError(item)\n\n\nclass _PymgridSpace(Space):\n    _unnormalized: Union[Box, _PymgridDict]\n    _normalized: Union[Box, _PymgridDict]\n    _spread: Union[np.ndarray, dict]\n\n    def contains(self, x):\n        \"\"\"\n        Check if `x` is a valid member of the space.\n\n        .. note::\n            This method checks if `x` is a valid member of the space. Use :meth:`.ModuleSpace.normalized.contains` to\n            check if a value is a member of the normalized space.\n\n        Parameters\n        ----------\n        x : scalar or array-like\n            Value to check membership.\n\n        Returns\n        -------\n        containment : bool\n            Whether `x` is a valid member of the space.\n\n        \"\"\"\n        return x in self._unnormalized\n\n    def sample(self, normalized=False):\n        if normalized:\n            return self._normalized.sample()\n        return self._unnormalized.sample()\n\n    def _shape_check(self, val, func):\n        low = self._unnormalized.low\n        if hasattr(val, '__len__') and len(val) != len(low):\n            raise TypeError(f'Unable to {func} value of length {len(val)}, expected {len(low)}')\n        elif isinstance(val, (int, float)) and len(low) != 1:\n            raise TypeError(f'Unable to {func} scalar value, expected array-like of shape {len(low)}')\n\n    @abstractmethod\n    def normalize(self, val):\n        pass\n\n    @abstractmethod\n    def denormalize(self, val):\n        pass\n\n    @property\n    def normalized(self):\n        return self._normalized\n\n    @property\n    def unnormalized(self):\n        return self._unnormalized\n\n    def __getitem__(self, item):\n        if item == 'normalized':\n            return self._normalized\n        elif item == 'unnormalized':\n            return self._unnormalized\n\n        raise KeyError(item)\n\n    def __repr__(self):\n        return f'ModuleSpace{repr(self._unnormalized).replace(\"Box\", \"\")}'\n\n    def __eq__(self, other):\n        if type(self) != type(other):\n            return NotImplemented\n\n        return self.unnormalized == other.unnormalized\n\n\nclass ModuleSpace(_PymgridSpace):\n    def __init__(self, unnormalized_low, unnormalized_high, shape=None, dtype=np.float64, seed=None):\n\n        low = np.float64(unnormalized_low) if np.isscalar(unnormalized_low) else unnormalized_low.astype(np.float64)\n        high = np.float64(unnormalized_high) if np.isscalar(unnormalized_high) else unnormalized_high.astype(np.float64)\n\n        self._unnormalized = Box(low=low,\n                                 high=high,\n                                 shape=shape,\n                                 dtype=dtype)\n\n        self._normalized = Box(low=0, high=1, shape=self._unnormalized.shape, dtype=dtype)\n\n        try:\n            super().__init__(shape=self._unnormalized.shape, dtype=self._unnormalized.dtype, seed=seed)\n        except TypeError:\n            super().__init__(shape=self._unnormalized.shape, dtype=self._unnormalized.dtype)\n            import gym\n            warnings.warn(f\"gym.Space does not accept argument 'seed' in version {gym.__version__}; this argument will \"\n                          f\"be ignored. Upgrade your gym version with 'pip install -U gym' to use this functionality.\")\n\n        self._spread = self._unnormalized.high - self._unnormalized.low\n        self._spread[self._spread == 0] = 1\n\n    def normalize(self, val):\n        low, high = self._unnormalized.low, self._unnormalized.high\n\n        self._shape_check(val, 'normalize')\n        self._bounds_check(val, low, high)\n\n        normalized = (val - low) / self._spread\n\n        try:\n            return normalized.item()\n        except (AttributeError, ValueError):\n            return normalized\n\n    def denormalize(self, val):\n        low, high = self._unnormalized.low, self._unnormalized.high\n\n        self._shape_check(val, 'denormalize')\n        self._bounds_check(val, 0, 1)\n\n        denormalized = low + self._spread * val\n\n        try:\n            return denormalized.item()\n        except (AttributeError, ValueError):\n            return denormalized\n\n    def _bounds_check(self, val, low, high):\n        array_like_check = hasattr(val, '__len__') and \\\n                           not (all((low <= val) & (val <= high)) or np.allclose(val, low) or np.allclose(val, high))\n        scalar_check = not hasattr(val, '__len__') and not low <= val <= high\n\n        if array_like_check or scalar_check:\n            warnings.warn(f'Value {val} resides out of expected bounds of value to be normalized: [{low}, {high}].')\n\n\nclass MicrogridSpace(_PymgridSpace):\n    def __init__(self, module_space_dict, act_or_obs, seed=None):\n\n        self._unnormalized = _PymgridDict(module_space_dict, act_or_obs)\n        self._normalized = _PymgridDict(module_space_dict, act_or_obs, normalized=True)\n\n        try:\n            super().__init__(shape=None, seed=seed)\n\n        except TypeError:\n            super().__init__(shape=None)\n            import gym\n            warnings.warn(f\"gym.Space does not accept argument 'seed' in version {gym.__version__}; this argument will \"\n                          f\"be ignored. Upgrade your gym version with 'pip install -U gym' to use this functionality.\")\n\n        self._spread = self._get_spread()\n\n    def _get_spread(self):\n        spread = {}\n\n        for k, high_list in self._unnormalized.high.items():\n            low_list = self._unnormalized.low[k]\n            s = [h-l for h, l in zip(high_list, low_list)]\n            for s_val in s:\n                s_val[s_val == 0] = 1\n\n            spread[k] = s\n\n        return spread\n\n    def normalize(self, val):\n        low, high = self._unnormalized.low, self._unnormalized.high\n\n        self._shape_check(val, 'normalize')\n        val_minus_low = self.dict_op(val, low, operator.sub)\n        normalized = self.dict_op(val_minus_low, self._spread, operator.truediv)\n\n        # normalized = (val - low) / self._spread\n\n        return normalized\n\n    def denormalize(self, val):\n        low, high = self._unnormalized.low, self._unnormalized.high\n\n        self._shape_check(val, 'denormalize')\n\n        val_times_spread = self.dict_op(val, self._spread, operator.mul)\n        denormalized = self.dict_op(val_times_spread, low, operator.add)\n\n        return denormalized\n\n    @staticmethod\n    def dict_op(first, second, op):\n        out = {}\n        for k, first_list in first.items():\n            second_list = second[k]\n            out[k] = [op(f, s) for f, s in zip(first_list, second_list)]\n        return out\n"
  },
  {
    "path": "src/pymgrid/version.py",
    "content": "__version__ = '1.2.2'\n"
  },
  {
    "path": "tests/__init__.py",
    "content": ""
  },
  {
    "path": "tests/conftest.py",
    "content": ""
  },
  {
    "path": "tests/control/__init__.py",
    "content": ""
  },
  {
    "path": "tests/control/data_generation/__init__.py",
    "content": ""
  },
  {
    "path": "tests/control/data_generation/test_data_generator.py",
    "content": "import unittest\nfrom pymgrid.utils.DataGenerator import *\nfrom pandas import Series\nfrom pandas.testing import assert_frame_equal, assert_series_equal\nfrom numpy.testing import assert_array_equal, assert_array_almost_equal\nfrom matplotlib import pyplot as plt\n\ndef create_pv_test_set():\n    test_set = np.zeros(48)\n    test_set[7:20] = np.arange(7,20)\n    test_set[7:20] = -20*(test_set[7:20]-13)**2  + 30*-1**(np.arange(7,20) % 2) + 5*(np.arange(6,19) %5)\n    test_set[7:20] += -1*np.min(test_set[7:20])\n\n    n = 24\n    test_set[7+n:20+n] = np.arange(7,20)\n    test_set[7+n:20+n] = -20*(test_set[7+n:20+n]-13)**2  + 20*-1**(np.arange(6,19) % 2) + 4*(np.arange(6,19) %3)\n    test_set[7+n:20+n] += -1*np.min(test_set[7+n:20+n])\n\n    return test_set/10\n\n\nclass TestNoisyPV(unittest.TestCase):\n    def setUp(self):\n\n        self.test_data = create_pv_test_set()\n        self.test_series = Series(data = self.test_data)\n\n\n    def test_init(self):\n        NPV = NoisyPVData(pv_data = self.test_series)\n        df = pd.DataFrame(self.test_data)\n        assert_frame_equal(NPV.unmunged_data, df)\n        assert_frame_equal(NPV.data, df)\n\n    def test_data_munge(self):\n        NPV = NoisyPVData(pv_data=self.test_series)\n        NPV.data_munge()\n\n        # Assertions:\n        assert_array_equal(NPV.data.values[:,0],self.test_data[:24])\n        assert_array_equal(NPV.data.values[:,1],self.test_data[24:])\n        assert_array_equal(NPV.daily_maxes['time_of_max'].values, np.array([13,13]))\n        assert_array_equal(NPV.daily_maxes['cumulative_hr'], np.array([13, 37]))\n        self.assertTrue(NPV.munged)\n\n    def test_add_feature_columns(self):\n        NPV = NoisyPVData(pv_data=self.test_series)\n        NPV.data_munge()\n\n        num_feature_functions = 1\n        period_scale = 0.8\n\n        NPV._add_feature_columns(num_feature_functions=num_feature_functions, period_scale=period_scale)\n\n        self.assertIn('ones', NPV.daily_maxes.columns.values)\n        self.assertIn('cos1x', NPV.daily_maxes.columns.values)\n        assert_array_equal(NPV.daily_maxes['ones'], np.array([1,1]))\n        cos1x = np.cos(\n                    2  * np.pi / 8760. * period_scale * (NPV.daily_maxes['cumulative_hr'] - 173 * 24))\n        assert_array_equal(NPV.daily_maxes['cos1x'], cos1x)\n\n        self.assertListEqual(NPV.feature_names, ['ones', 'cos1x'])\n\n        for name in NPV.feature_names:\n             assert_array_equal(NPV.feature_functions[name](NPV.daily_maxes['cumulative_hr']).values, NPV.daily_maxes[name].values)\n\n\nclass TestNoisyGrid(unittest.TestCase):\n\n    def setUp(self) -> None:\n        always_on = np.ones(48)\n        self.always_on = pd.Series(always_on)\n        self.with_outages = self.always_on.copy()\n        self.with_outages.iloc[3:6] = 0\n        self.with_outages.iloc[40:47] = 0\n        self.with_outages_data = dict(naive_probabilities = np.array([10/48, 38/48]),\n                                      occurences=np.array([10,37]),\n                                      transition_prob_matrix = np.array([\n                                                                [8 / 10, 2 / 10],\n                                                                [2/37, 35/37]\n                                                                ]))\n        self.dist_types = ('naive', 'markov')\n\n    def test_init(self):\n\n        for dist_type in self.dist_types:\n            for data in self.always_on, self.with_outages:\n                NGD = NoisyGridData(data,dist_type=dist_type)\n                assert_series_equal(data, NGD.data)\n                assert_series_equal(data, NGD.unmunged_data)\n\n    def test_bad_grid_data(self):\n        grid_data = self.with_outages.copy()\n        grid_data[5] = -3\n        try:\n            NoisyGridData(grid_data)\n        except ValueError:\n            pass\n        except Exception:\n            self.fail('unexpected exception raised')\n        else:\n            self.fail('ValueError not raised')\n        grid_data[5] = 1.1\n        try:\n            NoisyGridData(grid_data)\n        except ValueError:\n            pass\n        except Exception:\n            self.fail('unexpected exception raised')\n        else:\n            self.fail('ValueError not raised')\n\n    def test_learn_distribution_always_on_naive(self):\n        NGD = NoisyGridData(self.always_on, dist_type='naive')\n        self.assertFalse(NGD.has_distribution)\n        NGD.learn_distribution()\n        self.assertTrue(NGD.has_distribution)\n\n        assert_array_equal(NGD.transition_prob_matrix, np.array([0, 1]))\n\n    def test_learn_distribution_always_on_markov(self):\n        NGD = NoisyGridData(self.always_on, dist_type='markov')\n        self.assertFalse(NGD.has_distribution)\n        NGD.learn_distribution()\n        self.assertTrue(NGD.has_distribution)\n\n        assert_array_equal(NGD.occurrences, np.array([0, 47]))\n        assert_array_equal(NGD.transition_prob_matrix, np.array([[1,0],[0,1]]))\n\n    def test_learn_distribution_with_outages_naive(self):\n        NGD = NoisyGridData(self.with_outages, dist_type='naive')\n        self.assertFalse(NGD.has_distribution)\n        NGD.learn_distribution()\n        self.assertTrue(NGD.has_distribution)\n\n        assert_array_almost_equal(NGD.transition_prob_matrix, self.with_outages_data['naive_probabilities'])\n\n    def test_learn_distribution_with_outages_markov(self):\n        NGD = NoisyGridData(self.with_outages, dist_type='markov')\n        self.assertFalse(NGD.has_distribution)\n        NGD.learn_distribution()\n        self.assertTrue(NGD.has_distribution)\n\n        assert_array_almost_equal(NGD.occurrences, self.with_outages_data['occurences'])\n        assert_array_almost_equal(NGD.transition_prob_matrix, self.with_outages_data['transition_prob_matrix'])\n\n    def test_sample_always_on_naive(self):\n        NGD = NoisyGridData(self.always_on, dist_type='naive')\n        NGD.learn_distribution()\n        sample = NGD.sample()\n        assert_array_equal(sample, np.ones(48))\n\n    def test_sample_always_on_markov(self):\n        NGD = NoisyGridData(self.always_on, dist_type='markov')\n        NGD.learn_distribution()\n        sample = NGD.sample()\n        assert_array_equal(sample, np.ones(48))\n\n    def test_sample_with_outages_naive(self):\n        # This is a ridiculous unit test All it does is check that the data generated from the probability distribution\n        #             matches the distribution. Thus, can fail randomly.\n        np.random.seed(0)\n        num_tests = 50\n\n        NGD = NoisyGridData(self.with_outages, dist_type='naive')\n        NGD.learn_distribution()\n\n        probs_list = []\n        for j in range(num_tests):\n            sample = NGD.sample()\n            new_NGD = NoisyGridData(sample, dist_type='naive')\n            new_NGD.learn_distribution()\n            probs_list.append(new_NGD.transition_prob_matrix)\n\n        transition_prob_mean = np.mean(np.array(probs_list), axis=0)\n        assert_array_almost_equal(self.with_outages_data['naive_probabilities'], transition_prob_mean, decimal=2)\n\n    def test_sample_with_outages_markov(self):\n        \"\"\"\n        This is also a ridiculous unit test. All it does is check that the data generated from the probability distribution\n            matches the distribution. Thus, can fail randomly.\n        :return:\n        \"\"\"\n\n        np.random.seed(0)\n        num_tests = 50\n\n        NGD = NoisyGridData(self.with_outages, dist_type='markov')\n        NGD.learn_distribution()\n\n        probs_list = []\n        for j in range(num_tests):\n            sample = NGD.sample()\n            new_NGD = NoisyGridData(sample, dist_type='markov')\n            new_NGD.learn_distribution()\n            probs_list.append(new_NGD.transition_prob_matrix)\n\n        transition_prob_mean = np.mean(np.array(probs_list), axis=0)\n        assert_array_almost_equal(self.with_outages_data['transition_prob_matrix'], transition_prob_mean, decimal=1)\n\n\nclass TestNoisyLoad(unittest.TestCase):\n    def setUp(self) -> None:\n        self.n_days = 12\n\n        load_data = np.array([304, 205, 200, 200, 202, 306, 524, 611, 569, 466, 571, 579, 569, 470, 466, 465, 597, 625, 620, 525, 521, 524, 522, 531, 305, 200, 199, 200, 202, 306, 524, 611, 568, 466, 568, 579, 569, 467, 467, 466, 597, 626, 626, 525, 525, 524, 522, 533])\n        load_data = np.concatenate([load_data + j % 5 for j in range(int(self.n_days/2))])\n\n        self.load_data = pd.Series(data = load_data)\n\n    def test_init(self):\n        NLD = NoisyLoadData(load_data=self.load_data)\n        assert_frame_equal(NLD.data, self.load_data.to_frame())\n        assert_frame_equal(NLD.unmunged_data, self.load_data.to_frame())\n\n    def test_data_munge(self):\n        NLD = NoisyLoadData(load_data=self.load_data)\n\n        self.assertFalse(NLD.munged)\n        NLD.data_munge()\n        self.assertTrue(NLD.munged)\n\n        self.assertTupleEqual(NLD.load_mean.shape, (7,24))\n        self.assertTupleEqual(NLD.load_std.shape, (7,24))\n\n        self.assertEqual(NLD.data.shape[0], self.n_days)\n        self.assertFalse(np.isnan(NLD.load_mean).any(axis=None))\n        self.assertFalse(np.isnan(NLD.load_std).any(axis=None))\n\n        for j in range(7):\n            NLD_computed_avg = NLD.load_mean.iloc[j,:].values\n            NLD_computed_std = NLD.load_std.iloc[j,:].values\n\n\n            slice = self.load_data[24*j:24*(j+1)].values\n\n            for k in range(1, (self.n_days-j) // 7 + 1):\n                if (j+k*7) >= self.n_days:\n                    continue\n                slice = np.stack((slice,self.load_data[24*(j+k*7):24*(j+k*7+1)]))\n\n            if len(slice.shape) == 1:\n                slice = slice.reshape((1, 24))\n                assert_array_almost_equal(NLD_computed_avg, np.mean(slice, axis=0))\n            else:\n                assert_array_almost_equal(NLD_computed_avg, np.mean(slice, axis=0))\n                assert_array_almost_equal(NLD_computed_std, np.std(slice, axis=0, ddof=1))\n\nif __name__ == '__main__':\n    unittest.main()\n\n"
  },
  {
    "path": "tests/control/test_control.py",
    "content": "import unittest\n\n"
  },
  {
    "path": "tests/control/test_mpc.py",
    "content": "import numpy as np\n\nfrom tests.helpers.test_case import TestCase\nfrom tests.helpers.modular_microgrid import get_modular_microgrid\n\nfrom pymgrid.algos import ModelPredictiveControl\n\n\nclass TestMPC(TestCase):\n    def test_init(self):\n        microgrid = get_modular_microgrid()\n        mpc = ModelPredictiveControl(microgrid)\n        self.assertTrue(mpc.is_modular)\n        self.assertEqual(mpc.horizon, 1)\n\n    def test_run_with_load_pv_battery_grid(self):\n        from pymgrid.modules import RenewableModule, LoadModule\n\n        max_steps = 10\n        pv_const = 50\n        load_const = 60\n        pv = RenewableModule(time_series=pv_const*np.ones(100))\n        load = LoadModule(time_series=load_const*np.ones(100))\n\n        microgrid = get_modular_microgrid(remove_modules=[\"renewable\", \"load\", \"genset\"], additional_modules=[pv, load])\n\n        mpc = ModelPredictiveControl(microgrid)\n        mpc_output = mpc.run(max_steps=max_steps)\n        self.assertEqual(mpc_output.shape[0], max_steps)\n        self.assertEqual(mpc_output[(\"grid\", 0, \"grid_import\")].values +\n                        mpc_output[(\"battery\", 0, \"discharge_amount\")].values +\n                        mpc_output[(\"renewable\", 0, \"renewable_used\")].values,\n                         [load_const] * mpc_output.shape[0]\n                        )\n\n    def test_run_with_load_pv_battery_genset(self):\n        from pymgrid.modules import RenewableModule, LoadModule\n\n        max_steps = 10\n        pv_const = 50\n        load_const = 60\n        pv = RenewableModule(time_series=pv_const*np.ones(100))\n        load = LoadModule(time_series=load_const*np.ones(100))\n\n        microgrid = get_modular_microgrid(remove_modules=[\"renewable\", \"load\", \"grid\"], additional_modules=[pv, load])\n\n        mpc = ModelPredictiveControl(microgrid)\n        mpc_output = mpc.run(max_steps=max_steps)\n        self.assertEqual(mpc_output.shape[0], max_steps)\n\n        self.assertEqual(mpc_output[(\"load\", 0, \"load_met\")].values, [60.]*mpc_output.shape[0])\n        self.assertEqual(mpc_output[(\"genset\", 0, \"genset_production\")].values +\n                            mpc_output[(\"battery\", 0, \"discharge_amount\")].values,\n                         [10.] * mpc_output.shape[0])\n\n    def test_run_twice_with_load_pv_battery_genset(self):\n        from pymgrid.modules import RenewableModule, LoadModule\n\n        max_steps = 10\n        pv_const = 50\n        load_const = 60\n        pv = RenewableModule(time_series=pv_const*np.ones(100))\n        load = LoadModule(time_series=load_const*np.ones(100))\n\n        microgrid = get_modular_microgrid(remove_modules=[\"renewable\", \"load\", \"grid\"], additional_modules=[pv, load])\n\n        mpc = ModelPredictiveControl(microgrid)\n        mpc_output = mpc.run(max_steps=max_steps)\n\n        self.assertEqual(mpc_output.shape[0], max_steps)\n        self.assertEqual(mpc_output[(\"load\", 0, \"load_met\")].values, [60.] * mpc_output.shape[0])\n        self.assertEqual(mpc_output[(\"genset\", 0, \"genset_production\")].values +\n                            mpc_output[(\"battery\", 0, \"discharge_amount\")].values,\n                         [10.] * mpc_output.shape[0])\n\n        mpc_output = mpc.run(max_steps=max_steps)\n\n        self.assertEqual(mpc_output.shape[0], max_steps)\n        self.assertEqual(mpc_output[(\"load\", 0, \"load_met\")].values, [60.] * mpc_output.shape[0])\n        self.assertEqual(mpc_output[(\"genset\", 0, \"genset_production\")].values, [10.] * mpc_output.shape[0])\n\n    def test_run_with_load_pv_battery_grid_different_names(self):\n        from pymgrid.modules import RenewableModule, LoadModule\n\n        max_steps = 10\n        pv_const = 50\n        load_const = 60\n        pv = RenewableModule(time_series=pv_const*np.ones(100))\n        load = LoadModule(time_series=load_const*np.ones(100))\n\n        microgrid = get_modular_microgrid(remove_modules=[\"renewable\", \"load\", \"genset\"],\n                                          additional_modules=[(\"pv_with_name\", pv), (\"load_with_name\", load)])\n\n        mpc = ModelPredictiveControl(microgrid)\n        mpc_output = mpc.run(max_steps=max_steps)\n        self.assertEqual(mpc_output.shape[0], max_steps)\n        self.assertEqual(mpc_output[(\"load_with_name\", 0, \"load_met\")].values, [load_const]*mpc_output.shape[0])\n        self.assertEqual(mpc_output[(\"grid\", 0, \"grid_import\")].values +\n                        mpc_output[(\"battery\", 0, \"discharge_amount\")].values +\n                        mpc_output[(\"pv_with_name\", 0, \"renewable_used\")].values,\n                         [load_const] * mpc_output.shape[0]\n                        )\n        self.assertEqual(mpc_output[(\"load_with_name\", 0, \"load_met\")].values, [load_const]*mpc_output.shape[0])"
  },
  {
    "path": "tests/control/test_rbc.py",
    "content": "from copy import deepcopy\n\nfrom tests.helpers.test_case import TestCase\nfrom tests.helpers.modular_microgrid import get_modular_microgrid\n\nfrom pymgrid.algos import RuleBasedControl\n\n\nclass TestRBC(TestCase):\n    def setUp(self) -> None:\n        self.rbc = RuleBasedControl(get_modular_microgrid())\n\n    def test_init(self):\n        microgrid = get_modular_microgrid()\n        self.assertEqual(microgrid, self.rbc.microgrid)\n        self.assertEqual(microgrid, deepcopy(self.rbc).microgrid)\n\n    def test_priority_list(self):\n        rbc = deepcopy(self.rbc)\n\n        for j, (element_1, element_2) in enumerate(zip(rbc.priority_list[:-1], rbc.priority_list[1:])):\n            with self.subTest(testing=f'element_{j}<=element_{j+1}'):\n                self.assertLessEqual(element_1.marginal_cost, element_2.marginal_cost)\n\n    def test_run_once(self):\n        rbc = deepcopy(self.rbc)\n\n        self.assertEqual(len(rbc.microgrid.log), 0)\n\n        n_steps = 10\n\n        log = rbc.run(n_steps)\n\n        self.assertEqual(len(log), n_steps)\n        self.assertEqual(log, rbc.microgrid.log)\n        return rbc\n\n    def test_reset_after_run(self):\n        rbc = self.test_run_once()\n        rbc.reset()\n        self.assertEqual(len(rbc.microgrid.log), 0)"
  },
  {
    "path": "tests/envs/__init__.py",
    "content": ""
  },
  {
    "path": "tests/envs/test_discrete.py",
    "content": "from copy import deepcopy\nfrom math import factorial\n\nfrom tests.helpers.test_case import TestCase\nfrom tests.helpers.modular_microgrid import get_modular_microgrid\n\nfrom pymgrid.envs import DiscreteMicrogridEnv\n\n\nclass TestDiscreteEnv(TestCase):\n\n    def test_init_from_microgrid(self):\n        microgrid = get_modular_microgrid()\n        env = DiscreteMicrogridEnv(microgrid)\n\n        self.assertEqual(env.modules, microgrid.modules)\n        self.assertIsNot(env.modules.to_tuples(), microgrid.modules.to_tuples())\n\n        n_obs = sum([x.observation_space['normalized'].shape[0] for x in microgrid.modules.to_list()])\n\n        self.assertEqual(env.observation_space.shape, (n_obs,))\n\n    def test_init_from_modules(self):\n        microgrid = get_modular_microgrid()\n        env = DiscreteMicrogridEnv(microgrid.modules.to_tuples(), add_unbalanced_module=False)\n\n        self.assertEqual(env.modules, microgrid.modules)\n        self.assertIsNot(env.modules.to_tuples(), microgrid.modules.to_tuples())\n\n        n_obs = sum([x.observation_space['normalized'].shape[0] for x in microgrid.modules.to_list()])\n\n        self.assertEqual(env.observation_space.shape, (n_obs,))\n\n\nclass TestDiscreteEnvScenario(TestCase):\n    microgrid_number = 0\n\n    def setUp(self) -> None:\n        self.env = DiscreteMicrogridEnv.from_scenario(microgrid_number=self.microgrid_number)\n\n    def test_run_once(self):\n        env = deepcopy(self.env)\n        # sample environment then get log\n        self.assertEqual(len(env.log), 0)\n        for j in range(10):\n            with self.subTest(step=j):\n                action = env.sample_action(strict_bound=True)\n                env.step(action)\n                self.assertEqual(len(env.log), j+1)\n\n    def test_reset_after_run(self):\n        env = deepcopy(self.env)\n        env.step(env.sample_action(strict_bound=True))\n        env.reset()\n        self.assertEqual(len(env.log), 0)\n\n    def test_run_again_after_reset(self):\n        env = deepcopy(self.env)\n        env.step(env.sample_action(strict_bound=True))\n\n        self.assertEqual(len(env.log), 1)\n\n        env.reset()\n\n        self.assertEqual(len(env.log), 0)\n\n        for j in range(10):\n            with self.subTest(step=j):\n                action = env.sample_action(strict_bound=True)\n                env.step(action)\n                self.assertEqual(len(env.log), j+1)\n\n    def test_action_space(self):\n        env = deepcopy(self.env)\n\n        n_action_modules = len(env.modules.controllable.sources) + len(env.modules.controllable.source_and_sinks)\n        genset_modules = len(env.modules.genset) if hasattr(env.modules, 'genset') else 0\n\n        n_actions = factorial(n_action_modules) * (2 ** genset_modules)\n        self.assertEqual(env.action_space.n, n_actions)\n\n    def test_simple_observation_keys(self):\n        keys_in_all_scenarios = ['load_current', 'renewable_current']\n\n        env = DiscreteMicrogridEnv.from_scenario(microgrid_number=self.microgrid_number,\n                                                 observation_keys=keys_in_all_scenarios)\n\n        obs, _, _, _ = env.step(env.action_space.sample())\n\n        expected_obs = [\n            env.modules['load'].item().state_dict(normalized=True)['load_current'],\n            env.modules['pv'].item().state_dict(normalized=True)['renewable_current']\n        ]\n\n        self.assertEqual(obs.tolist(), expected_obs)\n\n\nclass TestDiscreteEnvScenario1(TestDiscreteEnvScenario):\n    microgrid_number = 1\n\n\nclass TestDiscreteEnvScenario2(TestDiscreteEnvScenario):\n    microgrid_number = 2\n\n\nclass TestDiscreteEnvScenario3(TestDiscreteEnvScenario):\n    microgrid_number = 3\n\n\nclass TestDiscreteEnvScenario4(TestDiscreteEnvScenario):\n    microgrid_number = 4\n\n\nclass TestDiscreteEnvScenario5(TestDiscreteEnvScenario):\n    microgrid_number = 5\n\n\nclass TestDiscreteEnvScenario6(TestDiscreteEnvScenario):\n    microgrid_number = 6\n\n\nclass TestDiscreteEnvScenario47(TestDiscreteEnvScenario):\n    microgrid_number = 7\n\n\nclass TestDiscreteEnvScenario8(TestDiscreteEnvScenario):\n    microgrid_number = 8\n\n\nclass TestDiscreteEnvScenario9(TestDiscreteEnvScenario):\n    microgrid_number = 9\n\n\nclass TestDiscreteEnvScenario10(TestDiscreteEnvScenario):\n    microgrid_number = 10\n\n\nclass TestDiscreteEnvScenario11(TestDiscreteEnvScenario):\n    microgrid_number = 11\n\n\nclass TestDiscreteEnvScenario12(TestDiscreteEnvScenario):\n    microgrid_number = 12\n\n\nclass TestDiscreteEnvScenario13(TestDiscreteEnvScenario):\n    microgrid_number = 13\n\n\nclass TestDiscreteEnvScenario14(TestDiscreteEnvScenario):\n    microgrid_number = 14\n    \n    \nclass TestDiscreteEnvScenario15(TestDiscreteEnvScenario):\n    microgrid_number = 15\n    \n\nclass TestDiscreteEnvScenario16(TestDiscreteEnvScenario):\n    microgrid_number = 16\n    \n\nclass TestDiscreteEnvScenario17(TestDiscreteEnvScenario):\n    microgrid_number = 17\n    \n\nclass TestDiscreteEnvScenario18(TestDiscreteEnvScenario):\n    microgrid_number = 18\n    \n\nclass TestDiscreteEnvScenario19(TestDiscreteEnvScenario):\n    microgrid_number = 19\n    \n\nclass TestDiscreteEnvScenario20(TestDiscreteEnvScenario):\n    microgrid_number = 20\n\n\nclass TestDiscreteEnvScenario21(TestDiscreteEnvScenario):\n    microgrid_number = 21\n\n\nclass TestDiscreteEnvScenario22(TestDiscreteEnvScenario):\n    microgrid_number = 22\n\n\nclass TestDiscreteEnvScenario23(TestDiscreteEnvScenario):\n    microgrid_number = 23\n\n\nclass TestDiscreteEnvScenario24(TestDiscreteEnvScenario):\n    microgrid_number = 24\n"
  },
  {
    "path": "tests/envs/test_trajectory.py",
    "content": "import numpy as np\n\nfrom tests.helpers.test_case import TestCase\nfrom tests.helpers.modular_microgrid import get_modular_microgrid\n\nfrom pymgrid.envs import DiscreteMicrogridEnv\n\n\nclass TestTrajectory(TestCase):\n\n    def check_initial_final_steps(self,\n                                  env,\n                                  expected_env_initial,\n                                  expected_env_final,\n                                  expected_module_initial,\n                                  expected_module_final):\n\n        self.assertEqual(env.initial_step, expected_env_initial)\n        self.assertEqual(env.final_step, expected_env_final)\n\n        env.reset()\n\n        self.assertEqual(env.initial_step, expected_env_initial)\n        self.assertEqual(env.final_step, expected_env_final)\n\n        self.assertEqual(env.modules.get_attrs('initial_step', unique=True).item(), expected_module_initial)\n        self.assertEqual(env.modules.get_attrs('final_step', unique=True).item(), expected_module_final)\n\n    def test_none_trajectory(self):\n        timeseries_length = 100\n        modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True)\n        env = DiscreteMicrogridEnv(modules, trajectory_func=None)\n        self.check_initial_final_steps(env, 0, timeseries_length, 0, timeseries_length)\n\n    def test_deterministic_trajectory(self):\n        deterministic_initial, deterministic_final = 10, 20\n\n        def trajectory_func(initial_step, final_step):\n            return deterministic_initial, deterministic_final\n\n        timeseries_length = 100\n        modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True)\n        env = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func)\n\n        self.check_initial_final_steps(env, 0, timeseries_length, deterministic_initial, deterministic_final)\n\n    def test_stochastic_trajectory(self):\n        def trajectory_func(initial_step, final_step):\n            initial = np.random.randint(low=initial_step+1, high=final_step-2)\n            final = np.random.randint(low=initial, high=final_step)\n            return initial, final\n\n        timeseries_length = 100\n        modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True)\n        env = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func)\n\n        self.assertEqual(env.initial_step, 0)\n        self.assertEqual(env.final_step, timeseries_length)\n\n        env.reset()\n\n        self.assertEqual(env.initial_step, 0)\n        self.assertEqual(env.final_step, timeseries_length)\n\n        self.assertGreater(env.modules.get_attrs('initial_step', unique=True).item(), 0)\n        self.assertLess(env.modules.get_attrs('initial_step', unique=True).item(), timeseries_length)\n\n        self.assertGreater(env.modules.get_attrs('final_step', unique=True).item(), 0)\n        self.assertLess(env.modules.get_attrs('final_step', unique=True).item(), timeseries_length)\n\n        self.assertLess(env.modules.get_attrs('initial_step', unique=True).item(),\n                        env.modules.get_attrs('final_step', unique=True).item())\n\n    def test_bad_trajectory_out_of_range(self):\n        def trajectory_func(initial_step, final_step):\n            return 10, 110\n\n        timeseries_length = 100\n        modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True)\n\n        with self.assertRaises(ValueError):\n            _ = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func)\n\n    def test_bad_trajectory_bad_signature(self):\n        def trajectory_func(initial_step):\n            return 10, 110\n\n        timeseries_length = 100\n        modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True)\n\n        with self.assertRaises(TypeError):\n            _ = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func)\n\n    def test_bad_trajectory_initial_gt_final(self):\n        def trajectory_func(initial_step, final_step):\n            return 20, 10\n\n        timeseries_length = 100\n        modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True)\n\n        with self.assertRaises(ValueError):\n            _ = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func)\n\n    def test_bad_trajectory_scalar_output(self):\n        def trajectory_func(initial_step, final_step):\n            return 20\n\n        timeseries_length = 100\n        modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True)\n\n        with self.assertRaises(TypeError):\n            _ = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func)\n\n    def test_bad_trajectory_too_many_outputs(self):\n        def trajectory_func(initial_step, final_step):\n            return 10, 20, 30\n\n        timeseries_length = 100\n        modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True)\n\n        with self.assertRaises(TypeError):\n            _ = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func)\n\n    def test_bad_trajectory_wrong_output_types(self):\n        def trajectory_func(initial_step, final_step):\n            return 'abc', 10.0\n\n        timeseries_length = 100\n        modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True)\n\n        with self.assertRaises(TypeError):\n            _ = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func)\n\n    def test_correct_trajectory_length(self):\n\n        def trajectory_func(initial_step, final_step):\n            trajectory_func.n_resets += 1\n            return 10, 11+trajectory_func.n_resets\n\n        trajectory_func.n_resets = 0\n\n        timeseries_length = 100\n        modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True)\n        env = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func)\n\n        for correct_trajectory_length in range(3, 7):\n            with self.subTest(correct_trajectory_length=correct_trajectory_length):\n                env.reset()\n                n_steps = 0\n                done = False\n\n                while not done:\n                    _, _, done, _ = env.step(env.action_space.sample())\n                    n_steps += 1\n\n                self.assertEqual(n_steps, correct_trajectory_length)\n\n    def test_trajectory_serialization(self):\n        import yaml\n        from pymgrid.microgrid.trajectory import DeterministicTrajectory\n\n        trajectory_func = DeterministicTrajectory(10, 20)\n\n        timeseries_length = 100\n        modules = get_modular_microgrid(timeseries_length=timeseries_length, modules_only=True)\n\n        env = DiscreteMicrogridEnv(modules, trajectory_func=trajectory_func)\n        env.reset()\n        loaded_env = yaml.safe_load(yaml.safe_dump(env))\n\n        self.assertIsNotNone(env.trajectory_func)\n        self.assertEqual(env, loaded_env)\n"
  },
  {
    "path": "tests/helpers/__init__.py",
    "content": ""
  },
  {
    "path": "tests/helpers/genset_module_testing_utils.py",
    "content": "from pymgrid.modules import GensetModule\n\n\ndefault_params = dict(running_min_production=10,\n                              running_max_production=100,\n                              genset_cost=1,\n                              start_up_time=0,\n                              wind_down_time=0,\n                              allow_abortion=True,\n                              init_start_up=True,\n                              raise_errors=True)\n\n\ndef get_genset(default_parameters=None, **new_params):\n    params = default_parameters.copy() if default_parameters is not None else default_params.copy()\n    params.update(new_params)\n    return GensetModule(**params), params\n\n\ndef normalize_production(production, max_production=None):\n    max_production = max_production if max_production else default_params['running_max_production']\n    return production/max_production\n"
  },
  {
    "path": "tests/helpers/modular_microgrid.py",
    "content": "import numpy as np\n\nfrom pymgrid import Microgrid\n\nfrom pymgrid.modules import (\n    BatteryModule,\n    GensetModule,\n    GridModule,\n    LoadModule,\n    RenewableModule\n)\n\n\ndef get_modular_microgrid(remove_modules=(),\n                          retain_only=None,\n                          additional_modules=None,\n                          add_unbalanced_module=True,\n                          timeseries_length=100,\n                          modules_only=False):\n\n    modules = dict(\n        genset=GensetModule(running_min_production=10, running_max_production=50, genset_cost=0.5),\n\n        battery=BatteryModule(min_capacity=0,\n                              max_capacity=100,\n                              max_charge=50,\n                              max_discharge=50,\n                              efficiency=1.0,\n                              init_soc=0.5),\n\n        renewable=RenewableModule(time_series=50*np.ones(timeseries_length)),\n\n        load=LoadModule(time_series=60*np.ones(timeseries_length)),\n\n        grid=GridModule(max_import=100, max_export=0, time_series=np.ones((timeseries_length, 3)), raise_errors=True)\n        )\n\n    if retain_only is not None:\n        modules = {k: v for k, v in modules.items() if k in retain_only}\n        if remove_modules:\n            raise RuntimeError('Can pass either remove_modules or retain_only, but not both.')\n    else:\n        for module in remove_modules:\n            try:\n                modules.pop(module)\n            except KeyError:\n                raise NameError(f\"Module {module} not one of default modules {list(modules.keys())}.\")\n\n    modules = list(modules.values())\n    modules.extend(additional_modules if additional_modules else [])\n\n    if modules_only:\n        return modules\n\n    return Microgrid(modules, add_unbalanced_module=add_unbalanced_module)\n"
  },
  {
    "path": "tests/helpers/test_case.py",
    "content": "import unittest\nimport numpy as np\nfrom warnings import warn\n\n\nclass TestCase(unittest.TestCase):\n    def assertEqual(self, first, second, msg=None) -> None:\n        try:\n            super().assertEqual(first, second, msg=msg)\n        except (ValueError, AssertionError):\n            # array-like or pandas obj\n            try:\n                # convert pandas obj\n                first, second = first.values, second.values\n            except AttributeError:\n                # not a pandas obj\n                pass\n\n            try:\n                np.testing.assert_equal(first, second, err_msg=msg if msg else '')\n            except AssertionError as e:\n                try:\n                    np.testing.assert_allclose(first, second, rtol=1e-7, atol=1e-10, err_msg=msg if msg else '')\n                except TypeError:\n                    raise e\n"
  },
  {
    "path": "tests/microgrid/__init__.py",
    "content": ""
  },
  {
    "path": "tests/microgrid/modules/__init__.py",
    "content": ""
  },
  {
    "path": "tests/microgrid/modules/container_tests/__init__.py",
    "content": ""
  },
  {
    "path": "tests/microgrid/modules/container_tests/test_container.py",
    "content": "from tests.helpers.modular_microgrid import get_modular_microgrid\nfrom tests.helpers.test_case import TestCase\n\n\nclass TestContainer(TestCase):\n    def test_container_init(self):\n        microgrid = get_modular_microgrid()\n        self.assertTrue(len(microgrid.controllable.sources))\n        self.assertTrue(len(microgrid.controllable.source_and_sinks))\n        action = microgrid.sample_action()\n"
  },
  {
    "path": "tests/microgrid/modules/conversion_test/__init__.py",
    "content": ""
  },
  {
    "path": "tests/microgrid/modules/conversion_test/test_modular_conversion.py",
    "content": "import numpy as np\n\nfrom tests.helpers.test_case import TestCase\n\n\nclass TestToModular(TestCase):\n    def setUp(self) -> None:\n        from pymgrid.MicrogridGenerator import MicrogridGenerator\n        mgen = MicrogridGenerator()\n        mgen.generate_microgrid(modular=False)\n        self.weak_grids = [microgrid for microgrid in mgen.microgrids if self.is_weak_grid(microgrid)]\n        self.genset_only = [microgrid for microgrid in mgen.microgrids if not microgrid.architecture[\"grid\"]]\n        self.strong_grid_only = [microgrid for microgrid in mgen.microgrids if\n                                 (not microgrid.architecture[\"genset\"]) and self.is_strong_grid(microgrid)]\n        self.strong_grid_and_genset = [microgrid for microgrid in mgen.microgrids if\n                                       microgrid.architecture[\"genset\"] and self.is_strong_grid(microgrid)]\n\n    @staticmethod\n    def is_weak_grid(microgrid):\n        return microgrid.architecture[\"grid\"] and microgrid._grid_status_ts.min().item() < 1\n\n    @staticmethod\n    def is_strong_grid(microgrid):\n        return microgrid.architecture[\"grid\"] and microgrid._grid_status_ts.min().item() == 1\n\n    def test_weak_grid_conversion_success(self):\n        for microgrid in self.weak_grids:\n            modular_microgrid = microgrid.to_modular()\n            self.assertTrue(modular_microgrid.grid.item().weak_grid)\n\n    def test_genset_only(self):\n        for microgrid in self.genset_only:\n            modular = microgrid.to_modular()\n            self.assertTrue(len(modular.genset) == 1)\n\n            genset_module = modular.genset[0]\n            self.assertEqual(microgrid.genset.fuel_cost, genset_module.genset_cost)\n            self.assertEqual(microgrid.genset.co2, genset_module.co2_per_unit)\n            self.assertEqual(microgrid.genset.rated_power*microgrid.genset.p_max, genset_module.max_production)\n\n            with self.assertRaises(AttributeError):\n                _ = modular.grid"
  },
  {
    "path": "tests/microgrid/modules/forecaster_tests/__init__.py",
    "content": ""
  },
  {
    "path": "tests/microgrid/modules/forecaster_tests/test_forecaster.py",
    "content": "import numpy as np\nfrom tests.helpers.test_case import TestCase\nfrom pymgrid.forecast import (\n    get_forecaster, OracleForecaster, GaussianNoiseForecaster, UserDefinedForecaster, NoForecaster)\nfrom pymgrid.utils.space import ModuleSpace\n\nSTATE_COMPONENTS = np.random.randint(low=1, high=10)\nFORECAST_HORIZON = np.random.randint(low=2, high=10)\n\nPOSITIVE_OBSERVATION_SPACE = ModuleSpace(\n        unnormalized_low=0,\n        unnormalized_high=10,\n        shape=(STATE_COMPONENTS*(FORECAST_HORIZON+1),)\n    )\n\nNEGATIVE_OBSERVATION_SPACE = ModuleSpace(\n        unnormalized_low=-10,\n        unnormalized_high=0,\n        shape=(STATE_COMPONENTS*(FORECAST_HORIZON+1),)\n    )\n\n\ndef get_test_inputs(n=None, state_components=None, negative=False):\n    state_components = state_components if state_components else STATE_COMPONENTS\n    n = n if n else FORECAST_HORIZON\n    val_c_n = POSITIVE_OBSERVATION_SPACE.unnormalized.high[0] * np.random.rand(n, state_components)\n    val_c = val_c_n[0, :]\n    # val_c_n = val_c_n.reshape((FORECAST_HORIZON, STATE_COMPONENTS))\n    if negative:\n        return -val_c, -val_c_n, n\n    else:\n        return val_c, val_c_n, n\n\n\nclass TestOracleForecaster(TestCase):\n    def setUp(self) -> None:\n        self.forecaster = OracleForecaster(observation_space=POSITIVE_OBSERVATION_SPACE,\n                                           forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS))\n\n    def test_positive_inputs(self):\n        val_c, val_c_n, n = get_test_inputs()\n        forecast = self.forecaster(val_c, val_c_n, n)\n        self.assertEqual(forecast, val_c_n)\n\n    def test_negative_inputs(self):\n        val_c, val_c_n, n = get_test_inputs(negative=True)\n        forecast = self.forecaster(val_c, val_c_n, n)\n        self.assertEqual(forecast, val_c_n)\n\n\nclass TestGaussianNoiseForecaster(TestCase):\n    def test_single_forecast_positive(self):\n        noise_std = 1\n        forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=POSITIVE_OBSERVATION_SPACE,\n                                             forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                             increase_uncertainty=False)\n        val_c, val_c_n, n = get_test_inputs()\n        forecast = forecaster(val_c, val_c_n, n)\n        self.assertEqual(noise_std, forecaster.noise_std)\n        self.assertTrue((forecast >= 0).all())\n\n    def test_single_forecast_positive_high_std(self):\n        noise_std = 100\n        forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=POSITIVE_OBSERVATION_SPACE,\n                                             forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                             increase_uncertainty=False)\n        val_c, val_c_n, n = get_test_inputs()\n        forecast = forecaster(val_c, val_c_n, n)\n        self.assertEqual(noise_std, forecaster.noise_std)\n        self.assertTrue((forecast >= 0).all())\n\n    def test_single_forecast_negative(self):\n        noise_std = 1\n        forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=NEGATIVE_OBSERVATION_SPACE,\n                                             forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                             increase_uncertainty=False)\n        val_c, val_c_n, n = get_test_inputs(negative=True)\n        forecast = forecaster(val_c, val_c_n, n)\n        self.assertEqual(noise_std, forecaster.noise_std)\n        self.assertTrue((forecast <= 0).all())\n\n    def test_single_forecast_negative_high_std(self):\n        noise_std = 100\n        forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=NEGATIVE_OBSERVATION_SPACE,\n                                             forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                             increase_uncertainty=False)\n        val_c, val_c_n, n = get_test_inputs(negative=True)\n        forecast = forecaster(val_c, val_c_n, n)\n        self.assertEqual(noise_std, forecaster.noise_std)\n        self.assertTrue((forecast <= 0).all())\n\n    def test_multiple_forecast_positive(self):\n        noise_std = 1\n        forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=POSITIVE_OBSERVATION_SPACE,\n                                             forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                             increase_uncertainty=False)\n        n = None\n        for _ in range(2):\n            val_c, val_c_n, n = get_test_inputs(n=n)\n            forecast = forecaster(val_c, val_c_n, n)\n            self.assertEqual(noise_std, forecaster.noise_std)\n            self.assertTrue((forecast >= 0).all())\n\n    def test_multiple_forecast_positive_high_std(self):\n        noise_std = 100\n        forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=POSITIVE_OBSERVATION_SPACE,\n                                             forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                             increase_uncertainty=False)\n        n = None\n        for _ in range(2):\n            val_c, val_c_n, n = get_test_inputs(n=n)\n            forecast = forecaster(val_c, val_c_n, n)\n            self.assertEqual(noise_std, forecaster.noise_std)\n            self.assertTrue((forecast >= 0).all())\n\n    def test_multiple_forecast_negative(self):\n        noise_std = 1\n        forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=NEGATIVE_OBSERVATION_SPACE,\n                                             forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                             increase_uncertainty=False)\n        n = None\n        for _ in range(2):\n            val_c, val_c_n, n = get_test_inputs(n=n, negative=True)\n            forecast = forecaster(val_c, val_c_n, n)\n            self.assertEqual(noise_std, forecaster.noise_std)\n            self.assertTrue((forecast <= 0).all())\n\n    def test_multiple_forecast_negative_high_std(self):\n        noise_std = 100\n        forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=NEGATIVE_OBSERVATION_SPACE,\n                                             forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                             increase_uncertainty=False)\n        n = None\n        for _ in range(2):\n            val_c, val_c_n, n = get_test_inputs(n=n, negative=True)\n            forecast = forecaster(val_c, val_c_n, n)\n            self.assertEqual(noise_std, forecaster.noise_std)\n            self.assertTrue((forecast <= 0).all())\n\n    def test_increasing_uncertainty_positive(self):\n        noise_std = 1\n        forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=POSITIVE_OBSERVATION_SPACE,\n                                             forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                             increase_uncertainty=True)\n        val_c, val_c_n, n = get_test_inputs()\n        expected_noise_std = np.outer(noise_std*(1+np.log(1+np.arange(len(val_c_n)))), np.ones(STATE_COMPONENTS))\n\n        forecast = forecaster(val_c, val_c_n, n)\n        self.assertTrue((noise_std != forecaster.noise_std).any())\n        self.assertEqual(expected_noise_std, forecaster.noise_std)\n        self.assertTrue((forecast >= 0).all())\n\n    def test_increasing_uncertainty_negative(self):\n        noise_std = 1\n        forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=NEGATIVE_OBSERVATION_SPACE,\n                                             forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                             increase_uncertainty=True)\n\n        val_c, val_c_n, n = get_test_inputs(negative=True)\n        expected_noise_std = np.outer(noise_std*(1+np.log(1+np.arange(len(val_c_n)))), np.ones(STATE_COMPONENTS))\n\n        forecast = forecaster(val_c, val_c_n, n)\n        self.assertTrue((noise_std != forecaster.noise_std).any())\n        self.assertEqual(expected_noise_std, forecaster.noise_std)\n        self.assertTrue((forecast <= 0).all())\n\n    def test_bad_shape(self):\n        noise_std = 1\n        forecaster = GaussianNoiseForecaster(noise_std=noise_std, observation_space=POSITIVE_OBSERVATION_SPACE,\n                                             forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                             increase_uncertainty=False)\n\n        n = np.random.randint(FORECAST_HORIZON, 2*FORECAST_HORIZON)\n        val_c, val_c_n, n = get_test_inputs(n=n)\n        with self.assertRaises(RuntimeError):\n            _ = forecaster(val_c, val_c_n, n)\n        # self.assertEqual(noise_std, forecaster.noise_std)\n        # val_c, val_c_n, n = get_test_inputs(n=n_vals[1])\n        # with self.assertRaises(ValueError):\n        #     _ = forecaster(val_c, val_c_n, n)\n\n\nclass TestUserDefinedForecaster(TestCase):\n    def setUp(self) -> None:\n        self.simple_time_series = np.arange(FORECAST_HORIZON).reshape((-1, 1))\n\n    @staticmethod\n    def oracle_scalar_forecaster(val_c, val_c_n, n):\n        return val_c_n.item()\n\n    def get_oracle_forecaster(self, negative=False):\n        return OracleForecaster(observation_space=self.get_obs_space(negative=negative),\n                                forecast_shape=(FORECAST_HORIZON,))\n\n    def get_obs_space(self, negative=False):\n        if negative:\n            low = -10\n            high = 0\n        else:\n            low = 0\n            high = 10\n\n        return ModuleSpace(unnormalized_low=low, unnormalized_high=high, shape=(10, ))\n\n    def test_user_defined_oracle_positive(self):\n        forecaster = UserDefinedForecaster(forecaster_function=self.get_oracle_forecaster(),\n                                           observation_space=self.get_obs_space(), forecast_shape=(FORECAST_HORIZON,),\n                                           time_series=self.simple_time_series)\n        val_c, val_c_n, n = get_test_inputs(state_components=1)\n        forecast = forecaster(val_c, val_c_n, n)\n        self.assertEqual(forecast, val_c_n)\n\n    def test_user_defined_oracle_negative(self):\n        forecaster = UserDefinedForecaster(forecaster_function=self.get_oracle_forecaster(negative=True),\n                                           observation_space=self.get_obs_space(negative=True),\n                                           forecast_shape=(FORECAST_HORIZON,), time_series=self.simple_time_series)\n        val_c, val_c_n, n = get_test_inputs(state_components=1, negative=True)\n        forecast = forecaster(val_c, val_c_n, n)\n        self.assertEqual(forecast, val_c_n)\n\n    def test_scalar_forecaster(self):\n        forecaster = UserDefinedForecaster(forecaster_function=self.oracle_scalar_forecaster,\n                                           observation_space=self.get_obs_space(negative=True),\n                                           forecast_shape=(FORECAST_HORIZON,), time_series=self.simple_time_series)\n        val_c, val_c_n, n = get_test_inputs(state_components=1, negative=True)\n        forecast = forecaster(val_c, val_c_n, n)\n        self.assertEqual(forecast, val_c_n)\n\n    def test_vectorized_forecaster_bad_output_shape(self):\n        bad_output_shape_forecaster = lambda val_c, val_c_n, n: np.append(val_c_n, [0])\n        with self.assertRaisesRegex(ValueError, \"Forecaster output of shape (.*) \"\n                                                \"cannot be casted to necessary forecast shape (.*, 1)\"):\n            _ = UserDefinedForecaster(forecaster_function=bad_output_shape_forecaster,\n                                      observation_space=POSITIVE_OBSERVATION_SPACE,\n                                      forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                      time_series=self.simple_time_series)\n\n    def test_vectorized_forecaster_bad_output_type(self):\n        bad_output_type_forecaster = lambda val_c, val_c_n, n: np.array([str(x) for x in val_c_n]).reshape((-1, 1))\n        with self.assertRaisesRegex(TypeError, \"Forecaster must return numeric np.ndarray or number but returned \"\n                                               \"output of type\"):\n            _ = UserDefinedForecaster(forecaster_function=bad_output_type_forecaster,\n                                      observation_space=POSITIVE_OBSERVATION_SPACE, forecast_shape=(FORECAST_HORIZON,),\n                                      time_series=self.simple_time_series)\n\n    def test_vectorized_forecaster_bad_output_signs(self):\n        def bad_output_type_forecaster(val_c, val_c_n, n):\n            out = val_c_n.copy()\n            pos = np.random.randint(low=1, high=len(out))\n            out[pos] *= -1\n            return out\n\n        with self.assertRaisesRegex(ValueError, \"Forecaster must return output of same \"\n                                                \"sign \\(or zero\\) as input but returned output\"):\n            _ = UserDefinedForecaster(forecaster_function=bad_output_type_forecaster,\n                                      observation_space=POSITIVE_OBSERVATION_SPACE,\n                                      forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                      time_series=self.simple_time_series)\n\n    def test_bad_forecaster(self):\n        bad_forecaster = lambda val_c, val_c_n, n: 0/0\n\n        with self.assertRaisesRegex(ValueError, \"Unable to call forecaster with scalar inputs.\"):\n            _ = UserDefinedForecaster(forecaster_function=bad_forecaster, observation_space=POSITIVE_OBSERVATION_SPACE,\n                                      forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                      time_series=self.simple_time_series)\n\n    def test_scalar_forecaster_bad_output_shape(self):\n        def bad_output_shape_forecaster(val_c, val_c_n, n):\n            if hasattr(val_c_n, '__len__') and len(val_c_n) > 1:\n                raise RuntimeError\n            return [val_c_n]*2\n\n        with self.assertRaisesRegex(ValueError, \"Forecaster must return scalar output with scalar input but returned.\"):\n            _ = UserDefinedForecaster(forecaster_function=bad_output_shape_forecaster,\n                                      observation_space=POSITIVE_OBSERVATION_SPACE,\n                                      forecast_shape=(FORECAST_HORIZON, STATE_COMPONENTS),\n                                      time_series=self.simple_time_series)\n\n\nclass TestGetForecaster(TestCase):\n    def setUp(self) -> None:\n        self.simple_time_series = np.arange(10).reshape((-1, 1))\n        self.forecaster_horizon = 24\n\n    def test_user_defined_forecaster(self):\n        user_defined_forecaster = lambda val_c, val_c_n, n: val_c_n\n        forecaster = get_forecaster(user_defined_forecaster,\n                                    POSITIVE_OBSERVATION_SPACE,\n                                    (FORECAST_HORIZON, STATE_COMPONENTS),\n                                    time_series=self.simple_time_series)\n        self.assertIsInstance(forecaster, UserDefinedForecaster)\n\n    def test_oracle_forecaster(self):\n        forecaster = get_forecaster(\"oracle\", POSITIVE_OBSERVATION_SPACE, (FORECAST_HORIZON, STATE_COMPONENTS))\n        self.assertIsInstance(forecaster, OracleForecaster)\n\n    def test_no_forecaster(self):\n        forecaster = get_forecaster(None, POSITIVE_OBSERVATION_SPACE, (FORECAST_HORIZON, STATE_COMPONENTS))\n        self.assertIsInstance(forecaster, NoForecaster)\n\n    def test_gaussian_noise_forecaster_init(self):\n        noise_std = 0.5\n        forecaster = get_forecaster(noise_std, POSITIVE_OBSERVATION_SPACE, (FORECAST_HORIZON, STATE_COMPONENTS))\n        self.assertIsInstance(forecaster, GaussianNoiseForecaster)\n        self.assertEqual(forecaster.input_noise_std, noise_std)\n\n    def test_gaussian_noise_forecaster_increase_uncertainty_init(self):\n        noise_std = 0.5\n        forecaster = get_forecaster(noise_std, POSITIVE_OBSERVATION_SPACE, (FORECAST_HORIZON, STATE_COMPONENTS), increase_uncertainty=True)\n        self.assertIsInstance(forecaster, GaussianNoiseForecaster)\n        self.assertEqual(forecaster.input_noise_std, noise_std)\n        self.assertTrue((forecaster.noise_std != noise_std).any())\n\n    def test_gaussian_noise_forecaster_correct_size(self):\n        noise_std = 0.5\n        forecaster = get_forecaster(noise_std, POSITIVE_OBSERVATION_SPACE, (FORECAST_HORIZON, STATE_COMPONENTS))\n\n        val_c, val_c_n, n = get_test_inputs()\n        forecast = forecaster(val_c, val_c_n, n)\n\n        self.assertEqual(forecast.shape, val_c_n.shape)\n        self.assertEqual(forecast.shape, (FORECAST_HORIZON, STATE_COMPONENTS))\n        self.assertTrue((forecast.reshape(-1) >= 0).all())\n\n    def test_gaussian_noise_forecaster_insufficient_true_vals(self):\n        noise_std = 0.5\n        forecaster = get_forecaster(noise_std, POSITIVE_OBSERVATION_SPACE, (FORECAST_HORIZON, STATE_COMPONENTS))\n\n        val_c, val_c_n, _ = get_test_inputs(n=FORECAST_HORIZON-2)\n        forecast = forecaster(val_c, val_c_n, FORECAST_HORIZON)\n\n        self.assertEqual(forecast.shape, (FORECAST_HORIZON, STATE_COMPONENTS))\n        self.assertTrue((forecast.reshape(-1) >= 0).all())\n\n    def test_gaussian_noise_forecaster_insufficient_true_vals_increasing_uncertainty(self):\n        noise_std = 0.5\n        forecaster = get_forecaster(noise_std,\n                                    POSITIVE_OBSERVATION_SPACE,\n                                    (FORECAST_HORIZON, STATE_COMPONENTS),\n                                    increase_uncertainty=True)\n\n        val_c, val_c_n, _ = get_test_inputs(n=FORECAST_HORIZON-2)\n        forecast = forecaster(val_c, val_c_n, FORECAST_HORIZON)\n\n        self.assertEqual(forecast.shape, (FORECAST_HORIZON, STATE_COMPONENTS))\n        self.assertTrue((forecast.reshape(-1) >= 0).all())"
  },
  {
    "path": "tests/microgrid/modules/module_tests/test_genset_long_status_changes.py",
    "content": "from tests.helpers.genset_module_testing_utils import get_genset, normalize_production\nfrom tests.helpers.test_case import TestCase\nimport numpy as np\nfrom copy import deepcopy\nfrom itertools import product\n\n\nclass TestGensetStartUp2WindDown3OnAtStartUp(TestCase):\n    def setUp(self) -> None:\n        self.genset, self.default_params = get_genset(init_start_up=True, start_up_time=2, wind_down_time=3)\n\n    def get_genset(self, **new_params):\n        if len(new_params) == 0:\n            return deepcopy(self.genset), self.default_params\n        return get_genset(default_parameters=self.default_params, **new_params)\n\n    def turn_on(self, genset, unnormalized_production=0.):\n        # Take a step, ask genset to turn on.\n        action = np.array([1.0, normalize_production(unnormalized_production)])\n        obs, reward, done, info = genset.step(action)\n        return obs, reward, done, info\n\n    def turn_off(self, genset, unnormalized_production=50.):\n        # Take a step, ask genset to turn on.\n        action = np.array([0.0, normalize_production(unnormalized_production)])\n        obs, reward, done, info = genset.step(action)\n        return obs, reward, done, info\n\n    def test_on_at_start_up(self):\n        genset, _ = self.get_genset()\n        self.assertTrue(genset.current_status)\n        self.assertEqual(genset.goal_status, 1)\n        self.assertEqual(genset.state, np.array([1, 1, 0, 3]))\n\n    def test_turn_off_step_1(self):\n        genset, params = self.get_genset()\n        unnormalized_production = 50.\n        obs, reward, done, info = self.turn_off(genset, unnormalized_production)\n        self.assertEqual(reward, -1.0*params['genset_cost']*unnormalized_production)\n        self.assertTrue(genset.current_status)\n        self.assertEqual(genset.goal_status, 0)\n        self.assertEqual(genset.state, np.array([1, 0, 0, 2]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], unnormalized_production)\n\n    def test_turn_off_step_2(self):\n        genset, params = self.get_genset()\n        unnormalized_production = 50.\n\n        for j in range(2):\n            obs, reward, done, info = self.turn_off(genset, unnormalized_production)\n\n        self.assertEqual(reward, -1.0*params['genset_cost']*unnormalized_production)\n        self.assertTrue(genset.current_status)\n        self.assertEqual(genset.goal_status, 0)\n        self.assertEqual(genset.state, np.array([1, 0, 0, 1]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], unnormalized_production)\n\n    def test_turn_off_step_3(self):\n        genset, params = self.get_genset()\n        unnormalized_production = 50.\n\n        for j in range(3):\n            obs, reward, done, info = self.turn_off(genset, unnormalized_production)\n\n        self.assertEqual(reward, -1.0*params['genset_cost']*unnormalized_production)\n        self.assertTrue(genset.current_status)\n        self.assertEqual(genset.goal_status, 0)\n        self.assertEqual(genset.state, np.array([1, 0, 0, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], unnormalized_production)\n\n    def test_turn_off_step_4_final(self):\n        genset, params = self.get_genset()\n        unnormalized_production = 50.\n\n        for j in range(3):\n            self.turn_off(genset, unnormalized_production)\n\n        unnormalized_production = 0\n        obs, reward, done, info = self.turn_off(genset, unnormalized_production)\n\n        self.assertEqual(reward, 0)\n        self.assertFalse(genset.current_status)\n        self.assertEqual(genset.goal_status, 0)\n        self.assertEqual(genset.state, np.array([0, 0, 2, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], 0)\n\n    def test_turn_on_after_turn_off_step_1(self):\n        genset, params = self.get_genset()\n        unnormalized_production = 50.\n\n        for j in range(3):\n            self.turn_off(genset, unnormalized_production)\n\n        # Step 4, should be off.\n        unnormalized_production = 0\n        obs, reward, done, info = self.turn_off(genset, unnormalized_production)\n\n        self.assertEqual(reward, 0)\n        self.assertFalse(genset.current_status)\n        self.assertEqual(genset.goal_status, 0)\n        self.assertEqual(genset.state, np.array([0, 0, 2, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], 0)\n\n        unnormalized_production = 0\n        obs, reward, done, info = self.turn_on(genset, unnormalized_production)\n        self.assertEqual(reward, 0)\n        self.assertFalse(genset.current_status)\n        self.assertEqual(genset.goal_status, 1)\n        self.assertEqual(genset.state, np.array([0, 1, 1, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], 0)\n\n    def test_turn_on_after_turn_off_step_2(self):\n        genset, params = self.get_genset()\n        unnormalized_production = 50.\n\n        for j in range(3):\n            self.turn_off(genset, unnormalized_production)\n\n        # Step 4, should be off.\n        unnormalized_production = 0\n        obs, reward, done, info = self.turn_off(genset, unnormalized_production)\n\n        self.assertEqual(reward, 0)\n        self.assertFalse(genset.current_status)\n        self.assertEqual(genset.goal_status, 0)\n        self.assertEqual(genset.state, np.array([0, 0, 2, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], 0)\n\n        # Turning back on\n        unnormalized_production = 0\n        for j in range(2):\n            obs, reward, done, info = self.turn_on(genset, unnormalized_production)\n        self.assertEqual(reward, 0)\n        self.assertFalse(genset.current_status)\n        self.assertEqual(genset.goal_status, 1)\n        self.assertEqual(genset.state, np.array([0, 1, 0, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], 0)\n\n    def test_turn_on_after_turn_off_final(self):\n        genset, params = self.get_genset()\n        unnormalized_production = 50.\n\n        for j in range(3):\n            self.turn_off(genset, unnormalized_production)\n\n        # Step 4, should be off.\n        unnormalized_production = 0\n        obs, reward, done, info = self.turn_off(genset, unnormalized_production)\n\n        self.assertEqual(reward, 0)\n        self.assertFalse(genset.current_status)\n        self.assertEqual(genset.goal_status, 0)\n        self.assertEqual(genset.state, np.array([0, 0, 2, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], 0)\n\n        # Turning back on\n        unnormalized_production = 0\n        for j in range(2):\n            self.turn_on(genset, unnormalized_production)\n\n        unnormalized_production = 50.\n        obs, reward, done, info = self.turn_on(genset, unnormalized_production)\n\n        self.assertEqual(reward, -1.0*unnormalized_production*params['genset_cost'])\n        self.assertTrue(genset.current_status)\n        self.assertEqual(genset.goal_status, 1)\n        self.assertEqual(genset.state, np.array([1, 1, 0, 3]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], unnormalized_production)\n\n    def test_turn_off_abortion(self):\n        genset, params = self.get_genset()\n        unnormalized_production = 50.\n\n        for j in range(2):\n            self.turn_off(genset, unnormalized_production)\n\n        self.assertEqual(genset.state, np.array([1, 0, 0, 1]))\n\n        # Step 3: abort!\n        obs, reward, done, info = self.turn_on(genset, unnormalized_production)\n\n        self.assertEqual(reward, -1.0*unnormalized_production*params['genset_cost'])\n        self.assertTrue(genset.current_status)\n        self.assertEqual(genset.goal_status, 1)\n        self.assertEqual(genset.state, np.array([1, 1, 0, 3]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], unnormalized_production)\n\n    def test_turn_on_abortion(self):\n        genset, params = self.get_genset(init_start_up=False)\n        unnormalized_production = 0.\n\n        self.turn_on(genset, unnormalized_production)\n        self.assertEqual(genset.state, np.array([0, 1, 1, 0]))\n\n        # Step 3: abort!\n        obs, reward, done, info = self.turn_off(genset, unnormalized_production)\n\n        self.assertEqual(reward, 0)\n        self.assertFalse(genset.current_status)\n        self.assertEqual(genset.goal_status, 0)\n        self.assertEqual(genset.state, np.array([0, 0, 2, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], 0)\n\n\nclass TestManyStatusChanges(TestCase):\n\n    def test_many_status_changes(self):\n\n        n_steps = 5\n\n        def next_status(genset, goal_status):\n            if goal_status:\n                if genset.current_status:\n                    return 1\n                elif genset._steps_until_up == 0:\n                    return 1\n                else:\n                    return 0\n            else:\n                if not genset.current_status:\n                    return 0\n                elif genset._steps_until_down == 0:\n                    return 0\n                else:\n                    return 1\n\n        for _running in True, False:\n            for start_up_time in range(0, n_steps):\n                for wind_down_time in range(0, n_steps):\n                    for goal_status in 0, 1:\n\n                        intermediate_goal_statuses = product([0, 1], repeat=n_steps - 1)\n\n                        for steps in intermediate_goal_statuses:\n                            genset, _ = get_genset(init_start_up=_running,\n                                                   start_up_time=start_up_time,\n                                                   wind_down_time=wind_down_time)\n\n                            _s = (goal_status, *steps)\n                            for j, sub_goal_status in enumerate(_s):\n                                with self.subTest(_running=_running,\n                                                  _steps_until_up=start_up_time,\n                                                  _steps_until_down=wind_down_time,\n                                                  goal_status=goal_status,\n                                                  step_combination=_s,\n                                                  step=j,\n                                                  goal_status_at_step=sub_goal_status):\n                                    predicted_status = next_status(genset, sub_goal_status)\n                                    genset.update_status(goal_status=sub_goal_status)\n                                    self.assertEqual(predicted_status, genset.current_status)\n\n"
  },
  {
    "path": "tests/microgrid/modules/module_tests/test_genset_module.py",
    "content": "import numpy as np\n\nfrom tests.helpers.genset_module_testing_utils import default_params, get_genset, normalize_production\nfrom tests.helpers.test_case import TestCase\n\n\nclass TestGensetModule(TestCase):\n    def setUp(self) -> None:\n        np.random.seed(0)\n        self.default_params = default_params.copy()\n\n    def get_genset(self, **new_params):\n        return get_genset(**new_params)\n\n    def test_init_start_up(self):\n        genset, _ = self.get_genset()\n        self.assertTrue(genset.current_status)\n        genset, _ = self.get_genset(init_start_up=False)\n        self.assertFalse(genset.current_status)\n\n    def test_get_cost_linear(self):\n        genset_cost = np.random.rand()\n        genset, params = self.get_genset(genset_cost=genset_cost)\n\n        production = params['running_min_production'] + (params['running_max_production']-params['running_min_production'])*np.random.rand()\n        production_cost = production*genset_cost\n\n        self.assertEqual(genset.get_cost(production), production_cost)\n\n    def test_get_cost_callable(self):\n        genset_cost = lambda x: x**2\n        genset, params = self.get_genset(genset_cost=genset_cost)\n\n        production = params['running_min_production'] + (params['running_max_production']-params['running_min_production'])*np.random.rand()\n        production_cost = genset_cost(production)\n\n        self.assertEqual(genset.get_cost(production), production_cost)\n\n    def test_step_out_of_range_goal_status(self):\n        genset, _ = self.get_genset()\n        action = np.array([-0.5, 0.5])\n\n        with self.assertRaises(AssertionError):\n            genset.step(action)\n\n    def test_step_out_of_normalized_range_production(self):\n        genset, _ = self.get_genset()\n\n        with self.assertRaises(AssertionError):\n            action = np.array([-0.5, 2])\n            genset.step(action)\n\n    def test_step_incorrect_action_shape(self):\n        genset, _ = self.get_genset()\n\n        with self.assertRaises(TypeError):\n            action = 0.5\n            genset.step(action)\n\n        with self.assertRaises(TypeError):\n            action = np.ones(3)\n            genset.step(action)\n\n    def test_step_unnormalized_production(self):\n        genset, _ = self.get_genset()\n\n        action = np.array([1.0, 50])\n        # try:\n        obs, reward, done, info = genset.step(action, normalized=False)\n\n        self.assertEqual(reward, -1.0 * default_params['genset_cost']*action[1])\n        self.assertTrue(genset.current_status)\n        self.assertEqual(genset.goal_status, 1)\n        self.assertEqual(obs, np.array([1, 1, 0, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], action[1])\n\n    def test_step_normalized_production(self):\n        genset, params = self.get_genset()\n\n        unnormalized_production = 50\n        action = np.array([1.0, normalize_production(unnormalized_production)])\n        # try:\n        obs, reward, done, info = genset.step(action, normalized=True)\n\n        self.assertEqual(reward, -1.0 * params['genset_cost']*unnormalized_production)\n        self.assertTrue(genset.current_status)\n        self.assertEqual(genset.goal_status, 1)\n        self.assertEqual(obs, np.array([1, 1, 0, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], unnormalized_production)\n\n    def test_step_immediate_status_change(self):\n        genset, params = self.get_genset()\n\n        unnormalized_production = 0\n        action = np.array([0.0, normalize_production(unnormalized_production)])\n\n        self.assertTrue(genset.current_status)\n\n        obs, reward, done, info = genset.step(action, normalized=True)\n\n        self.assertEqual(reward, 0)\n        self.assertFalse(genset.current_status)\n        self.assertEqual(genset.goal_status, 0)\n        self.assertEqual(obs, np.array([0, 0, 0, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], unnormalized_production)\n\n    def test_step_genset_off_production_request_error_raise(self):\n        genset, _ = self.get_genset()\n\n        unnormalized_production = 50\n        action = np.array([0.0, normalize_production(unnormalized_production)])\n\n        # Genset starts on\n        self.assertTrue(genset.current_status)\n        self.assertEqual(genset.goal_status, 1)\n\n        # Turn genset off (wind_down_time=0), and then ask for production. (no-no).\n        with self.assertRaises(ValueError):\n            genset.step(action, normalized=True)\n\n    def test_step_genset_off_production_request_no_error_raise(self):\n        genset, _ = self.get_genset(raise_errors=False)\n\n        unnormalized_production = 50\n        action = np.array([0.0, normalize_production(unnormalized_production)])\n\n        obs, reward, done, info = genset.step(action)\n        self.assertEqual(reward, 0)\n        self.assertFalse(genset.current_status)\n        self.assertEqual(genset.goal_status, 0)\n        self.assertEqual(obs, np.array([0, 0, 0, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], 0)\n\n    def test_step_genset_production_request_out_of_range_no_error_raise(self):\n        genset, params = self.get_genset(raise_errors=False)\n\n        requested_possible_warn =  [(params['running_min_production']*np.random.rand(), params['running_min_production'], False),\n                               (params['running_max_production'] * (1+np.random.rand()), params['running_max_production'], True)]\n\n\n        # First requested value is below min_production, second is above max_production.\n        # Second should raise a warning.\n\n        for requested, possible, raises_warn in requested_possible_warn:\n            with self.subTest(requested_production=requested, possible_production=possible):\n                action = np.array([1.0, normalize_production(requested)])\n\n                if raises_warn:\n                    with self.assertWarns(Warning):\n                        obs, reward, done, info = genset.step(action)\n                else:\n                    obs, reward, done, info = genset.step(action)\n\n                self.assertEqual(reward, -1.0 * params['genset_cost']*possible)\n                self.assertTrue(genset.current_status)\n                self.assertEqual(genset.goal_status, 1)\n                self.assertEqual(obs, np.array([1, 1, 0, 0]))\n                self.assertFalse(done)\n                self.assertEqual(info['provided_energy'], possible)\n"
  },
  {
    "path": "tests/microgrid/modules/module_tests/test_genset_module_start_up_1_wind_down_1.py",
    "content": "from tests.helpers.genset_module_testing_utils import get_genset, normalize_production\nfrom tests.helpers.test_case import TestCase\nimport numpy as np\nfrom copy import deepcopy\n\n\nclass TestGensetStartUp1WindDown0OffAtStartUp(TestCase):\n    def setUp(self) -> None:\n        self.genset, self.default_params = get_genset(init_start_up=False, start_up_time=1)\n        self.warm_up(self.genset)\n\n    def get_genset(self, new=False, **new_params):\n        if len(new_params) == 0 and not new:\n            return deepcopy(self.genset), self.default_params\n\n        genset, params = get_genset(default_parameters=self.default_params, **new_params)\n        if not new:\n            self.warm_up(genset)\n        return genset, params\n\n\n    def warm_up(self, genset):\n        # Take a step, ask genset to turn on. Warm-up takes one step so genset is still off at this point.\n        unnormalized_production = 0\n        action = np.array([1.0, normalize_production(unnormalized_production)])\n        obs, reward, done, info = genset.step(action)\n        return obs, reward, done, info\n\n    def test_off_at_start_up(self):\n        genset, _ = self.get_genset(new=True)\n        self.assertFalse(genset.current_status)\n        self.assertEqual(genset.goal_status, 0)\n        self.assertEqual(genset.state, np.array([0, 0, 1, 0]))\n\n    def test_warm_up(self):\n        # Take a step, ask genset to turn on. Warm-up takes one step so genset is still off at this point.\n        genset,_ = self.get_genset(new=True)\n        obs, reward, done, info = self.warm_up(genset)\n        self.assertEqual(reward, 0)\n        self.assertFalse(genset.current_status)\n        self.assertEqual(genset.goal_status, 1)\n        self.assertEqual(obs, np.array([0, 1, 0, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], 0)\n\n    def test_step_start_up_1_exception(self):\n        # Assert that exception is thrown when production is requested while genset is off\n        genset, _ = self.get_genset(new=True)\n\n        self.assertFalse(genset.current_status)\n        self.assertEqual(genset.goal_status, 0)\n\n        unnormalized_production = 50\n        action = np.array([1.0, normalize_production(unnormalized_production)])\n\n        with self.assertRaises(ValueError) as e:\n            genset.step(action)\n        err_msg = e.exception.args[0]\n        self.assertTrue('This may be because this genset module is not currently running.' in err_msg)\n\n    def test_step_start_up_1_no_exception(self):\n        # Genset is on now. Should be able to request production.\n\n        genset, params = self.get_genset()\n\n        unnormalized_production = 50\n        action = np.array([1.0, normalize_production(unnormalized_production)])\n        obs, reward, done, info = genset.step(action)\n        self.assertEqual(reward, -1.0*params['genset_cost']*unnormalized_production)\n        self.assertTrue(genset.current_status)\n        self.assertEqual(genset.goal_status, 1)\n        self.assertEqual(obs, np.array([1, 1, 0, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], unnormalized_production)\n\n    def test_start_up_1_request_below_min_exception_raise(self):\n        genset, params = self.get_genset()\n\n        # Genset is on now. Requesting below min production.\n        unnormalized_production = params['running_min_production']*np.random.rand()\n        action = np.array([1.0, normalize_production(unnormalized_production)])\n        with self.assertRaises(ValueError):\n            genset.step(action)\n\n    def test_start_up_1_request_below_min_no_exception(self):\n        # Genset is on, requesting production less than the min should return min production.\n        genset, params = self.get_genset(raise_errors=False)\n\n        # Genset is on now. Requesting below min production.\n        unnormalized_production = params['running_min_production']*np.random.rand()\n        action = np.array([1.0, normalize_production(unnormalized_production)])\n        obs, reward, done, info = genset.step(action)\n        self.assertEqual(reward, -1.0*params['genset_cost']*params['running_min_production'])\n        self.assertTrue(genset.current_status)\n        self.assertEqual(genset.goal_status, 1)\n        self.assertEqual(obs, np.array([1, 1, 0, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], params['running_min_production'])\n\n    def test_start_up_1_then_shut_down_exception_raise(self):\n        # Genset is on, requesting production less than the min should return min production.\n        genset, params = self.get_genset()\n\n        # Genset is on now. Requesting below min production.\n        unnormalized_production = 50.\n        action = np.array([0.1, normalize_production(unnormalized_production)])\n        with self.assertRaises(ValueError):\n            genset.step(action)\n\n    def test_start_up_1_then_shut_down_no_exception(self):\n        # Genset is on, requesting production less than the min should return min production.\n        genset, params = self.get_genset(raise_errors=False)\n\n        # Genset is on now. Requesting below min production.\n        unnormalized_production = 50.\n        action = np.array([0.1, normalize_production(unnormalized_production)])\n        obs, reward, done, info = genset.step(action)\n        self.assertEqual(reward, 0.0)\n        self.assertFalse(genset.current_status)\n        self.assertEqual(genset.goal_status, 0)\n        self.assertEqual(obs, np.array([0, 0, params['start_up_time'], 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], 0.0)\n\n\nclass TestGensetStartUp1WindDown0OnAtStartUp(TestCase):\n    def setUp(self) -> None:\n        self.genset, self.default_params = get_genset(init_start_up=True, start_up_time=1)\n        self.warm_up(self.genset)\n\n    def get_genset(self, new=False, **new_params):\n        if len(new_params) == 0 and not new:\n            return deepcopy(self.genset), self.default_params\n\n        genset, params = get_genset(default_parameters=self.default_params, **new_params)\n        if not new:\n            self.warm_up(genset)\n        return genset, params\n\n    def warm_up(self, genset):\n        # Take a step, ask genset to turn on. Genset begins on so should be on at this point.\n        unnormalized_production = self.default_params['running_min_production']\n        action = np.array([1.0, normalize_production(unnormalized_production)])\n        obs, reward, done, info = genset.step(action)\n        return obs, reward, done, info\n\n    def test_on_at_start_up(self):\n        genset, _ = self.get_genset(new=True)\n        self.assertTrue(genset.current_status)\n        self.assertEqual(genset.goal_status, 1)\n        self.assertEqual(genset.state, np.array([1, 1, 0, 0]))\n\n    def test_warm_up(self):\n        # Take a step, ask genset to turn on.  Genset begins on so should be on at this point.\n        genset, params = self.get_genset(new=True)\n        obs, reward, done, info = self.warm_up(genset)\n        self.assertEqual(reward, -1.0*params['genset_cost']*params['running_min_production'])\n        self.assertTrue(genset.current_status)\n        self.assertEqual(genset.goal_status, 1)\n        self.assertEqual(obs, np.array([1, 1, 0, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], params['running_min_production'])\n\n    def test_shut_down(self):\n        genset, _ = self.get_genset()\n        unnormalized_production = 0\n        action = np.array([0.0, normalize_production(unnormalized_production)])\n        obs, reward, done, info = genset.step(action)\n        self.assertEqual(reward, 0)\n        self.assertFalse(genset.current_status)\n        self.assertEqual(genset.goal_status, 0)\n        self.assertEqual(obs, np.array([0, 0, 1, 0]))\n        self.assertFalse(done)\n        self.assertEqual(info['provided_energy'], 0)"
  },
  {
    "path": "tests/microgrid/modules/module_tests/test_load_module.py",
    "content": "import numpy as np\n\nfrom pymgrid.modules import LoadModule\n\nfrom tests.microgrid.modules.module_tests.timeseries_modules import (\n    TestTimeseriesModuleForecasting,\n    TestTimeseriesModuleNoForecasting,\n    TestTimeSeriesModuleForecastingNegativeVals,\n    TestTimeSeriesModuleNoForecastingNegativeVals\n)\n\n\nclass TestLoadModuleNoForecasting(TestTimeseriesModuleNoForecasting):\n    __test__ = True\n    negative_time_series = True\n    action_space_dim = 0\n\n\n    def get_module(self):\n        return LoadModule(self.module_time_series)\n\n    def test_init_current_load(self):\n        load_module = self.get_module()\n        self.assertEqual(load_module.current_load, -1 * self.time_series[0])\n\n    def test_step(self):\n        load_module = self.get_module()\n        self.assertEqual(load_module.current_load, -1 * self.time_series[0])\n\n        obs, reward, done, info = load_module.step(np.array([]))\n        obs = load_module.from_normalized(obs, obs=True)\n        self.assertEqual(obs, self.time_series[1])\n        self.assertEqual(reward, 0)\n        self.assertFalse(done)\n        self.assertEqual(info[\"absorbed_energy\"], -1 * self.time_series[0])\n\n\nclass TestLoadModuleForecasting(TestTimeseriesModuleForecasting):\n    __test__ = True\n    negative_time_series = True\n    action_space_dim = 0\n\n    def get_module(self):\n        return LoadModule(self.module_time_series, forecaster=\"oracle\", forecast_horizon=self.forecast_horizon)\n\n    def test_step(self):\n        load_module = self.get_module()\n        self.assertEqual(load_module.current_load, -1 * self.time_series[0])\n\n        action = load_module.to_normalized(np.array([]), act=True)\n        obs, reward, done, info = load_module.step(action)\n        obs = load_module.from_normalized(obs, obs=True)\n        self.assertEqual(obs, self.time_series[1:self.forecast_horizon+2])\n        self.assertEqual(reward, 0)\n        self.assertFalse(done)\n        self.assertEqual(info[\"absorbed_energy\"], -1 * self.time_series[0])\n\n\nclass TestLoadModuleForecastingNegativeVals(TestTimeSeriesModuleForecastingNegativeVals,\n                                            TestLoadModuleForecasting):\n    pass\n\n\nclass TestLoadModuleNoForecastingNegativeVals(TestTimeSeriesModuleNoForecastingNegativeVals,\n                                              TestLoadModuleNoForecasting):\n    pass\n\n"
  },
  {
    "path": "tests/microgrid/modules/module_tests/test_renewable_module.py",
    "content": "\nfrom pymgrid.modules import RenewableModule\n\nfrom tests.microgrid.modules.module_tests.timeseries_modules import (\n    TestTimeseriesModuleForecasting,\n    TestTimeseriesModuleNoForecasting,\n    TestTimeSeriesModuleForecastingNegativeVals,\n    TestTimeSeriesModuleNoForecastingNegativeVals\n)\n\n\nclass TestRenewableModuleNoForecasting(TestTimeseriesModuleNoForecasting):\n    __test__ = True\n    action_space_dim = 1\n\n    def get_module(self):\n        return RenewableModule(self.module_time_series)\n\n    def test_init_current_renewable(self):\n        renewable_module = self.get_module()\n        self.assertEqual(renewable_module.current_renewable, self.time_series[0])\n\n    def test_step(self):\n        renewable_module = self.get_module()\n        self.assertEqual(renewable_module.current_renewable, self.time_series[0])\n\n        unnormalized_action = 1\n        action = renewable_module.to_normalized(unnormalized_action, act=True)\n        obs, reward, done, info = renewable_module.step(action)\n        obs = renewable_module.from_normalized(obs, obs=True)\n        self.assertEqual(obs, self.time_series[1])\n        self.assertEqual(reward, 0)\n        self.assertFalse(done)\n        self.assertEqual(info[\"provided_energy\"], unnormalized_action)\n        self.assertEqual(info[\"curtailment\"], 0)\n\n\nclass TestRenewableModuleForecasting(TestTimeseriesModuleForecasting):\n    __test__ = True\n    action_space_dim = 1\n\n    def get_module(self):\n        return RenewableModule(self.module_time_series, forecaster=\"oracle\", forecast_horizon=self.forecast_horizon)\n\n    def test_step(self):\n        renewable_module = self.get_module()\n        self.assertEqual(renewable_module.current_renewable, self.time_series[0])\n\n        unnormalized_action = 1\n        action = renewable_module.to_normalized(unnormalized_action, act=True)\n        obs, reward, done, info = renewable_module.step(action)\n        obs = renewable_module.from_normalized(obs, obs=True)\n        self.assertEqual(obs, self.time_series[1:self.forecast_horizon+2])\n        self.assertEqual(reward, 0)\n        self.assertFalse(done)\n        self.assertEqual(info[\"provided_energy\"], unnormalized_action)\n        self.assertEqual(info[\"curtailment\"], 0)\n\n\nclass TestRenewableModuleForecastingNegativeVals(TestTimeSeriesModuleForecastingNegativeVals,\n                                                 TestRenewableModuleForecasting):\n    pass\n\n\nclass TestRenewableModuleNoForecastingNegativeVals(TestTimeSeriesModuleNoForecastingNegativeVals,\n                                                   TestRenewableModuleNoForecasting):\n    pass\n"
  },
  {
    "path": "tests/microgrid/modules/module_tests/timeseries_modules.py",
    "content": "import numpy as np\nfrom abc import abstractmethod\nfrom gym.spaces import Box\n\nfrom pymgrid.utils.space import ModuleSpace\n\nfrom tests.helpers.test_case import TestCase\n\n\nclass TestTimeseriesModule(TestCase):\n    __test__ = False\n    negative_time_series = False\n    forecast_horizon: int\n    action_space_dim: int\n\n    def setUp(self) -> None:\n        self.module_time_series = self._get_module_time_series()\n        self.time_series = self._get_time_series()\n\n    def _get_module_time_series(self):\n        return self._get_time_series()\n\n    def _get_time_series(self):\n        sign = -1 if self.negative_time_series else 1\n        return sign * (2 - np.cos(np.pi * np.arange(100) / 2))\n\n    @abstractmethod\n    def get_module(self):\n        return NotImplemented\n\n    def test_action_space(self):\n        module = self.get_module()\n        normalized_action_space = module.action_space[\"normalized\"]\n        unnormalized_action_space = module.action_space[\"unnormalized\"]\n\n        self.assertEqual(normalized_action_space, Box(low=0, high=1, shape=(self.action_space_dim, )))\n        self.assertEqual(unnormalized_action_space, Box(low=min(0, self.time_series.min()),\n                                                        high=max(0, self.time_series.max()),\n                                                        shape=(self.action_space_dim, )))\n\n    def test_observation_space(self):\n        module = self.get_module()\n        normalized_obs_space = module.observation_space[\"normalized\"]\n        unnormalized_obs_space = module.observation_space[\"unnormalized\"]\n\n        self.assertEqual(normalized_obs_space, Box(low=0, high=1, shape=(1+self.forecast_horizon,)))\n        self.assertEqual(unnormalized_obs_space, Box(low=min(0, self.time_series.min()),\n                                                     high=max(0, self.time_series.max()),\n                                                     shape=(1+self.forecast_horizon,)))\n\n\n    def test_observations_in_observation_space(self):\n        module = self.get_module()\n\n        observation_space = ModuleSpace(\n            unnormalized_low=min(0, self.time_series.min()),\n            unnormalized_high=max(0, self.time_series.max()),\n            shape=(1 + module.forecast_horizon,)\n        )\n\n        self.assertEqual(module.observation_space, observation_space)\n\n        done = False\n        while not done:\n            obs, reward, done, info = module.step(module.action_space.sample(), normalized=False)\n            if np.isscalar(obs):\n                obs = np.array([obs])\n            self.assertIn(obs, observation_space['normalized'])\n            self.assertIn(module.state, observation_space['unnormalized'])\n\n\nclass TestTimeseriesModuleNoForecasting(TestTimeseriesModule):\n    forecast_horizon = 0\n\n    def test_init(self):\n        module = self.get_module()\n        self.assertIsNone(module.forecast())\n        self.assertEqual(module.state, self.time_series[0])\n        self.assertEqual(len(module.state_dict()), 1+self.forecast_horizon)\n\n\nclass TestTimeseriesModuleForecasting(TestTimeseriesModule):\n    forecast_horizon = 24\n\n    def test_init(self):\n        module = self.get_module()\n        self.assertIsNotNone(module.forecast())\n        self.assertEqual(module.forecast(), self.time_series[1:1 + self.forecast_horizon].reshape((-1, 1)))\n        self.assertEqual(module.state, self.time_series[:1 + self.forecast_horizon])\n        self.assertEqual(len(module.state_dict()), 1 + self.forecast_horizon)\n\n\nclass TestTimeSeriesModuleNoForecastingNegativeVals(TestTimeseriesModuleNoForecasting):\n    def _get_module_time_series(self):\n        return -1 * self._get_time_series()\n\n\nclass TestTimeSeriesModuleForecastingNegativeVals(TestTimeseriesModuleForecasting):\n    def _get_module_time_series(self):\n        return -1 * self._get_time_series()\n"
  },
  {
    "path": "tests/microgrid/serialize/test_microgrid_serialization.py",
    "content": "import numpy as np\n\nfrom pymgrid import Microgrid\n\nfrom tests.helpers.modular_microgrid import get_modular_microgrid\nfrom tests.helpers.test_case import TestCase\n\n\nclass TestMicrogridSerialization(TestCase):\n    def test_serialize_no_modules(self):\n        microgrid = Microgrid([], add_unbalanced_module=False)\n        dump = microgrid.dump()\n        loaded = Microgrid.load(dump)\n\n        self.assertEqual(microgrid, loaded)\n\n    def test_serialize_with_renewable(self):\n        microgrid = get_modular_microgrid(remove_modules=[\"genset\", \"battery\", \"load\", \"grid\"],\n                                          add_unbalanced_module=False)\n\n        self.assertEqual(len(microgrid.modules), 1)\n        self.assertEqual(microgrid, Microgrid.load(microgrid.dump()))\n"
  },
  {
    "path": "tests/microgrid/test_microgrid.py",
    "content": "import numpy as np\nimport pandas as pd\n\n\nfrom pymgrid import Microgrid\nfrom pymgrid.modules import LoadModule, RenewableModule\n\nfrom tests.helpers.modular_microgrid import get_modular_microgrid\nfrom tests.helpers.test_case import TestCase\n\n\nclass TestMicrogrid(TestCase):\n    def test_from_scenario(self):\n        for j in range(25):\n            with self.subTest(microgrid_number=j):\n                microgrid = Microgrid.from_scenario(j)\n                self.assertTrue(hasattr(microgrid, \"load\"))\n                self.assertTrue(hasattr(microgrid, \"pv\"))\n                self.assertTrue(hasattr(microgrid, \"battery\"))\n                self.assertTrue(hasattr(microgrid, \"grid\") or hasattr(microgrid, \"genset\"))\n\n    def test_empty_action_without_load(self):\n        microgrid = get_modular_microgrid(remove_modules=('load', ))\n        action = microgrid.get_empty_action()\n\n        self.assertIn('battery', action)\n        self.assertIn('genset', action)\n        self.assertIn('grid', action)\n\n        self.assertTrue(all(v == [None] for v in action.values()))\n\n    def test_empty_action_with_load(self):\n        microgrid = get_modular_microgrid()\n        action = microgrid.get_empty_action()\n\n        self.assertIn('battery', action)\n        self.assertIn('genset', action)\n        self.assertIn('grid', action)\n        self.assertNotIn('load', action)\n\n        self.assertTrue(all(v == [None] for v in action.values()))\n\n    def test_action_space(self):\n        microgrid = get_modular_microgrid()\n        action = microgrid.microgrid_action_space.sample()\n\n        for module_name, module_list in microgrid.modules.iterdict():\n            for module_num, module in enumerate(module_list):\n                if 'controllable' in module.module_type:\n                    with self.subTest(module_name=module_name, module_num=module_num):\n                        self.assertIn(action[module_name][module_num], module.action_space)\n\n    def test_action_space_normalize(self):\n        microgrid = get_modular_microgrid()\n        action = microgrid.microgrid_action_space.sample()\n        normalized = microgrid.microgrid_action_space.normalize(action)\n\n        for module_name, module_list in microgrid.modules.iterdict():\n            for module_num, module in enumerate(module_list):\n                if 'controllable' in module.module_type:\n                    with self.subTest(module_name=module_name, module_num=module_num):\n                        self.assertIn(normalized[module_name][module_num], module.action_space.normalized)\n\n    def test_action_space_denormalize(self):\n        microgrid = get_modular_microgrid()\n        action = microgrid.microgrid_action_space.sample(normalized=True)\n        denormalized = microgrid.microgrid_action_space.denormalize(action)\n\n        for module_name, module_list in microgrid.modules.iterdict():\n            for module_num, module in enumerate(module_list):\n                if 'controllable' in module.module_type:\n                    with self.subTest(module_name=module_name, module_num=module_num):\n                        self.assertIn(denormalized[module_name][module_num], module.action_space.unnormalized)\n\n    def test_sample_action(self):\n        microgrid = get_modular_microgrid()\n        action = microgrid.sample_action()\n\n        for module_name, action_list in action.items():\n            for module_num, _act in enumerate(action_list):\n                with self.subTest(module_name=module_name, module_num=module_num):\n                    action_arr = np.array(_act)\n                    if not action_arr.shape:\n                        action_arr = np.array([_act])\n                    self.assertTrue(microgrid.modules[module_name][module_num].action_space.shape[0])\n                    self.assertIn(action_arr, microgrid.modules[module_name][module_num].action_space.normalized)\n\n    def test_sample_action_all_modules_populated(self):\n        microgrid = get_modular_microgrid()\n        action = microgrid.sample_action()\n\n        for module_name, module_list in microgrid.fixed.iterdict():\n            for module_num, module in enumerate(module_list):\n                with self.subTest(module_name=module_name, module_num=module_num):\n                    empty_action_space = module.action_space.shape == (0, )\n                    try:\n                        _ = action[module_name][module_num]\n                        has_corresponding_action = True\n                    except KeyError:\n                        has_corresponding_action = False\n\n                    self.assertTrue(empty_action_space != has_corresponding_action)  # XOR\n\n    def test_current_step(self):\n        microgrid = get_modular_microgrid()\n\n        self.assertEqual(microgrid.current_step, 0)\n\n        for j in range(4):\n            with self.subTest(step=j):\n                microgrid.run(microgrid.sample_action())\n                self.assertEqual(microgrid.current_step, j+1)\n\n    def test_current_step_after_reset(self):\n        microgrid = get_modular_microgrid()\n        self.assertEqual(microgrid.current_step, 0)\n\n        microgrid.run(microgrid.sample_action())\n        self.assertEqual(microgrid.current_step, 1)\n\n        microgrid.reset()\n        self.assertEqual(microgrid.current_step, 0)\n\n    def test_set_module_attr_forecast_horizon(self):\n        forecast_horizon = 50\n\n        microgrid = get_modular_microgrid()\n        microgrid.set_module_attr('forecast_horizon', forecast_horizon)\n\n        microgrid_fh = [module.forecast_horizon for module in microgrid.modules.iterlist()\n                        if hasattr(module, 'forecast_horizon')]\n\n        self.assertEqual(min(microgrid_fh), max(microgrid_fh))\n\n        self.assertEqual(min(microgrid_fh), forecast_horizon)\n\n    def test_set_module_attr_bad_attr_name(self):\n        microgrid = get_modular_microgrid()\n\n        with self.assertRaises(AttributeError):\n            microgrid.set_module_attr('blah', 'blah')\n\n    def test_get_cost_info(self):\n        modules = 'genset', 'battery', 'renewable', 'load', 'grid', 'balancing'\n\n        microgrid = get_modular_microgrid()\n        cost_info = microgrid.get_cost_info()\n\n        for module in modules:\n            with self.subTest(info_of_module=cost_info):\n                self.assertIn(module, cost_info.keys())\n                self.assertEqual(len(cost_info[module]), 1)\n                self.assertIsInstance(cost_info[module][0], dict)\n\n                self.assertIn('production_marginal_cost', cost_info[module][0])\n                self.assertIn('absorption_marginal_cost', cost_info[module][0])\n                self.assertEqual(len(cost_info[module][0]), 2)\n\n                self.assertTrue(pd.api.types.is_number(cost_info[module][0]['production_marginal_cost']))\n                self.assertTrue(pd.api.types.is_number(cost_info[module][0]['absorption_marginal_cost']))\n\n    def test_set_initial_step(self):\n        microgrid = get_modular_microgrid()\n\n        self.assertEqual(microgrid.initial_step, 0)\n\n        for module_name, module in microgrid.modules.iterdict():\n            with self.subTest(module_name=module_name):\n                try:\n                    initial_step = module.initial_step\n                except AttributeError:\n                    continue\n\n                self.assertEqual(initial_step, 0)\n\n        microgrid.initial_step = 1\n\n        for module_name, module in microgrid.modules.iterdict():\n            with self.subTest(module_name=module_name):\n                try:\n                    initial_step = module.initial_step\n                except AttributeError:\n                    continue\n\n                self.assertEqual(initial_step, 1)\n\n\nclass TestMicrogridLoadPV(TestCase):\n    def setUp(self):\n        self.load_ts, self.pv_ts = self.set_ts()\n        self.microgrid, self.n_loads, self.n_pvs = self.set_microgrid()\n        self.n_modules = 1 + self.n_loads + self.n_pvs\n\n    def set_ts(self):\n        ts = 10 * np.random.rand(100)\n        return ts, ts\n\n    def set_microgrid(self):\n        load = LoadModule(time_series=self.load_ts, raise_errors=True)\n        pv = RenewableModule(time_series=self.pv_ts, raise_errors=True)\n        return Microgrid([load, pv]), 1, 1\n\n    def test_populated_correctly(self):\n        self.assertTrue(hasattr(self.microgrid.modules, 'load'))\n        self.assertTrue(hasattr(self.microgrid.modules, 'renewable'))\n        self.assertEqual(len(self.microgrid.modules), self.n_modules)  # load, pv, unbalanced\n\n    def test_current_load_correct(self):\n        try:\n            current_load = self.microgrid.modules.load.item().current_load\n        except ValueError:\n            # More than one load module\n            current_load = sum(load.current_load for load in self.microgrid.modules.load)\n        self.assertEqual(current_load, self.load_ts[0])\n\n    def test_current_pv_correct(self):\n        try:\n            current_renewable = self.microgrid.modules.renewable.item().current_renewable\n        except ValueError:\n            # More than one load module\n            current_renewable = sum(renewable.current_renewable for renewable in self.microgrid.modules.renewable)\n        self.assertEqual(current_renewable, self.pv_ts[0])\n\n    def test_sample_action(self):\n        sampled_action = self.microgrid.sample_action()\n        self.assertEqual(len(sampled_action), 0)\n\n    def test_sample_action_with_flex(self):\n        sampled_action = self.microgrid.sample_action(sample_flex_modules=True)\n        self.assertEqual(len(sampled_action), 2)\n        self.assertIn('renewable', sampled_action)\n        self.assertIn('balancing', sampled_action)\n        self.assertEqual(len(sampled_action['renewable']), self.n_pvs)\n\n    def test_state_dict(self):\n        sd = self.microgrid.state_dict()\n        self.assertIn('load', sd)\n        self.assertIn('renewable', sd)\n        self.assertIn('balancing', sd)\n        self.assertEqual(len(sd['load']), self.n_loads)\n        self.assertEqual(len(sd['balancing']), 1)\n\n    def test_state_series(self):\n        ss = self.microgrid.state_series()\n        self.assertEqual({'load', 'renewable'}, set(ss.index.get_level_values(0)))\n        self.assertEqual(ss['load'].index.get_level_values(0).nunique(), self.n_loads)\n        self.assertEqual(ss['renewable'].index.get_level_values(0).nunique(), self.n_pvs)\n        self.assertEqual(ss['load'].index.get_level_values(0).nunique(), self.n_loads)\n\n    def test_to_nonmodular(self):\n        if self.n_pvs > 1 or self.n_loads > 1:\n            with self.assertRaises(ValueError) as e:\n                self.microgrid.to_nonmodular()\n                self.assertIn(\"Cannot convert modular microgrid with multiple modules of same type\", e)\n\n        else:\n            nonmodular = self.microgrid.to_nonmodular()\n            self.assertTrue(nonmodular.architecture['PV'])\n            self.assertFalse(nonmodular.architecture['battery'])\n            self.assertFalse(nonmodular.architecture['grid'])\n            self.assertFalse(nonmodular.architecture['genset'])\n\n    def check_step(self, microgrid, step_number=0):\n\n        control = microgrid.get_empty_action()\n        self.assertEqual(len(control), 0)\n\n        obs, reward, done, info = microgrid.run(control)\n        loss_load = self.load_ts[step_number]-self.pv_ts[step_number]\n        loss_load_cost = self.microgrid.modules.balancing[0].loss_load_cost * max(loss_load, 0)\n\n        self.assertEqual(loss_load_cost, -1*reward)\n\n        self.assertEqual(len(microgrid.log), step_number + 1)\n        self.assertTrue(all(module in microgrid.log for module in microgrid.modules.names()))\n\n        load_met = min(self.load_ts[step_number], self.pv_ts[step_number])\n        loss_load = max(self.load_ts[step_number] - load_met, 0)\n        pv_curtailment = max(self.pv_ts[step_number]-load_met, 0)\n\n        # Checking the log populated correctly.\n\n        log_row = microgrid.log.iloc[step_number]\n        log_entry = lambda module, entry: log_row.loc[pd.IndexSlice[module, :, entry]].sum()\n\n        # Check that there are log entries for all modules of each name\n        self.assertEqual(log_row['load'].index.get_level_values(0).nunique(), self.n_loads)\n\n        self.assertEqual(log_entry('load', 'load_current'), -1 * self.load_ts[step_number])\n        self.assertEqual(log_entry('load', 'load_met'), self.load_ts[step_number])\n\n        if loss_load == 0:\n            self.assertEqual(log_entry('load', 'load_met'), load_met)\n\n        self.assertEqual(log_entry('renewable',  'renewable_current'), self.pv_ts[step_number])\n        self.assertEqual(log_entry('renewable', 'renewable_used'), load_met)\n        self.assertEqual(log_entry('renewable', 'curtailment'), pv_curtailment)\n\n        self.assertEqual(log_entry('balancing', 'loss_load'), loss_load)\n\n        self.assertEqual(log_entry('balance', 'reward'), -1 * loss_load_cost)\n        self.assertEqual(log_entry('balance', 'overall_provided_to_microgrid'), self.load_ts[step_number])\n        self.assertEqual(log_entry('balance', 'overall_absorbed_from_microgrid'), self.load_ts[step_number])\n        self.assertEqual(log_entry('balance', 'fixed_provided_to_microgrid'), 0.0)\n        self.assertEqual(log_entry('balance', 'fixed_absorbed_from_microgrid'), self.load_ts[step_number])\n        self.assertEqual(log_entry('balance', 'controllable_absorbed_from_microgrid'), 0.0)\n        self.assertEqual(log_entry('balance', 'controllable_provided_to_microgrid'), 0.0)\n\n        return microgrid\n\n    def test_run_one_step(self):\n        microgrid = self.microgrid\n        self.check_step(microgrid=microgrid, step_number=0)\n\n    def test_run_n_steps(self):\n        microgrid = self.microgrid\n        for step in range(len(self.load_ts)):\n            with self.subTest(step=step):\n                microgrid = self.check_step(microgrid=microgrid, step_number=step)\n\n\nclass TestMicrogridLoadExcessPV(TestMicrogridLoadPV):\n    #  Same as above but pv is greater than load.\n    def set_ts(self):\n        load_ts = 10*np.random.rand(100)\n        pv_ts = load_ts + 5*np.random.rand(100)\n        return load_ts, pv_ts\n\n\nclass TestMicrogridPVExcessLoad(TestMicrogridLoadPV):\n    # Load greater than PV.\n    def set_ts(self):\n        pv_ts = 10 * np.random.rand(100)\n        load_ts = pv_ts + 5 * np.random.rand(100)\n        return load_ts, pv_ts\n\n\nclass TestMicrogridTwoLoads(TestMicrogridLoadPV):\n    def set_microgrid(self):\n        load_1_ts = self.load_ts*(1-np.random.rand(*self.load_ts.shape))\n        load_2_ts = self.load_ts - load_1_ts\n\n        assert all(load_1_ts > 0)\n        assert all(load_2_ts > 0)\n\n        load_1 = LoadModule(time_series=load_1_ts, raise_errors=True)\n        load_2 = LoadModule(time_series=load_2_ts, raise_errors=True)\n        pv = RenewableModule(time_series=self.pv_ts, raise_errors=True)\n        return Microgrid([load_1, load_2, pv]), 2, 1\n\n\nclass TestMicrogridTwoPV(TestMicrogridLoadPV):\n    def set_microgrid(self):\n        pv_1_ts = self.pv_ts*(1-np.random.rand(*self.pv_ts.shape))\n        pv_2_ts = self.pv_ts - pv_1_ts\n\n        assert all(pv_1_ts > 0)\n        assert all(pv_2_ts > 0)\n\n        load = LoadModule(time_series=self.load_ts, raise_errors=True)\n        pv_1 = RenewableModule(time_series=pv_1_ts, raise_errors=True)\n        pv_2 = RenewableModule(time_series=pv_2_ts)\n        return Microgrid([load, pv_1, pv_2]), 1, 2\n\n\nclass TestMicrogridTwoEach(TestMicrogridLoadPV):\n    def set_microgrid(self):\n        load_1_ts = self.load_ts*(1-np.random.rand(*self.load_ts.shape))\n        load_2_ts = self.load_ts - load_1_ts\n\n        pv_1_ts = self.pv_ts*(1-np.random.rand(*self.pv_ts.shape))\n        pv_2_ts = self.pv_ts - pv_1_ts\n\n        assert all(load_1_ts > 0)\n        assert all(load_2_ts > 0)\n        assert all(pv_1_ts > 0)\n        assert all(pv_2_ts > 0)\n\n        load_1 = LoadModule(time_series=load_1_ts, raise_errors=True)\n        load_2 = LoadModule(time_series=load_2_ts, raise_errors=True)\n        pv_1 = RenewableModule(time_series=pv_1_ts, raise_errors=True)\n        pv_2 = RenewableModule(time_series=pv_2_ts)\n\n        return Microgrid([load_1, load_2, pv_1, pv_2]), 2, 2\n\n\nclass TestMicrogridManyEach(TestMicrogridLoadPV):\n    def set_microgrid(self):\n        n_loads = np.random.randint(3, 10)\n        n_pvs = np.random.randint(3, 10)\n\n        load_ts = [self.load_ts * (1 - np.random.rand(*self.load_ts.shape))]\n        pv_ts = [self.pv_ts * (1 - np.random.rand(*self.pv_ts.shape))]\n\n        for ts_list, ts_sum, n_modules in zip(\n                [load_ts, pv_ts],\n                [self.load_ts, self.pv_ts],\n                [n_loads, n_pvs]\n        ):\n            remaining = ts_sum-ts_list[0]\n\n            for j in range(1, n_modules-1):\n                ts_list.append(remaining*(1-np.random.rand(*ts_sum.shape)))\n                assert all(ts_list[-1] > 0)\n                remaining -= ts_list[-1]\n\n            assert all(remaining > 0)\n            ts_list.append(remaining)\n\n        load_modules = [LoadModule(time_series=ts) for ts in load_ts]\n        pv_modules = [RenewableModule(time_series=ts) for ts in pv_ts]\n\n        return Microgrid([*load_modules, *pv_modules]), n_loads, n_pvs\n\n\nclass TestMicrogridManyEachExcessPV(TestMicrogridManyEach):\n    def set_ts(self):\n        load_ts = 10*np.random.rand(100)\n        pv_ts = load_ts + 5*np.random.rand(100)\n        return load_ts, pv_ts\n\n\nclass TestMicrogridManyEachExcessLoad(TestMicrogridManyEach):\n    def set_ts(self):\n        pv_ts = 10*np.random.rand(100)\n        load_ts = pv_ts + 5*np.random.rand(100)\n        return load_ts, pv_ts\n\n\nclass TestMicrogridRewardShaping(TestMicrogridLoadPV):\n    def set_microgrid(self):\n        original_microgrid, n_loads, n_pvs = super().set_microgrid()\n        new_microgrid = Microgrid(original_microgrid.modules.to_tuples(),\n                                  add_unbalanced_module=False,\n                                  reward_shaping_func=self.reward_shaping_func)\n\n        return new_microgrid, n_loads, n_pvs\n\n    @staticmethod\n    def reward_shaping_func(energy_info, cost_info):\n        total = 0\n        for module_name, info_list in energy_info.items():\n            for module_info in info_list:\n                for j, (energy_type, energy_amount) in enumerate(module_info.items()):\n                    if energy_type == 'absorbed_energy':\n                        marginal_cost = cost_info[module_name][j]['absorption_marginal_cost']\n                    elif energy_type == 'provided_energy':\n                        marginal_cost = cost_info[module_name][j]['production_marginal_cost']\n                    else:\n                        # Some other key\n                        continue\n                    total += energy_amount * marginal_cost\n\n        return total\n"
  },
  {
    "path": "tests/test_microgridgenerator.py",
    "content": "\"\"\"\nCopyright 2020 Total S.A.\nAuthors:Gonzague Henri <gonzague.henri@total.com>\nPermission to use, modify, and distribute this software is given under the\nterms of the pymgrid License.\nNO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.\n$Date: 2020/08/27 08:04 $\nGonzague Henri\n\"\"\"\n\nimport numpy as np\nimport pandas as pd\nfrom numpy.testing import assert_allclose\n\n\nimport os, sys\nsys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))\n\nfrom pymgrid.MicrogridGenerator import MicrogridGenerator\n\nimport unittest\n\n\nclass TestMicogridGenerator(unittest.TestCase):\n\n    def setUp(self):\n        self.mgen = MicrogridGenerator()\n\n    def test_get_random_file(self):\n        import inspect, pymgrid\n        from pathlib import Path\n\n        path = Path(inspect.getfile(pymgrid)).parent\n        path = path / 'data/pv'\n        data = self.mgen._get_random_file(path)\n\n        self.assertEqual(len(data), 8760)\n\n    def test_scale_ts(self):\n        ts = pd.DataFrame( [i for i in range(10)])\n        factor = 4\n        scaled = self.mgen._scale_ts(ts, factor)\n        assert_allclose(ts/ts.sum()*factor, scaled)\n\n    def test_get_genset(self):\n        genset = self.mgen._get_genset()\n        self.assertEqual (1000, genset['rated_power'])\n\n\n    def test_get_battery(self):\n        battery = self.mgen._get_battery()\n        self.assertEqual (1000, battery['capa'])\n\n    def test_get_grid_price_ts(self):\n        price = self.mgen._get_grid_price_ts(10, price=0.2)\n        self.assertTrue(all([p == 0.2 for p in price]))\n\n    def test_get_grid(self):\n        grid = self.mgen._get_grid()\n        self.assertEqual(1000, grid['grid_power_import'])\n\n    def test_size_mg(self):\n        ts = pd.DataFrame([i for i in range(10)])\n        mg = self.mgen._size_mg(ts, 10)\n\n        self.assertEqual(18, mg['grid'])\n\n    def test_size_genset(self):\n        self.assertEqual(int(np.ceil(10/0.9)), self.mgen._size_genset([10, 10, 10]))\n\n    def test_size_battery(self):\n        size = self.mgen._size_battery([10, 10, 10])\n        self.assertLessEqual(30, size)\n        self.assertGreaterEqual(50, size)\n\n    def test_generate_microgrid(self):\n        microgrids = self.mgen.generate_microgrid().microgrids\n\n        self.assertEqual(self.mgen.nb_microgrids, len(microgrids))\n\n    def test_create_microgrid(self):\n        mg = self.mgen._create_microgrid()\n\n        self.assertEqual(1, mg.architecture['battery'])\n\nif __name__ == '__main__':\n    unittest.main()\n"
  },
  {
    "path": "tests/test_nonmodular_microgrid.py",
    "content": "\"\"\"\nCopyright 2020 Total S.A.\nAuthors:Gonzague Henri <gonzague.henri@total.com>\nPermission to use, modify, and distribute this software is given under the\nterms of the pymgrid License.\nNO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.\n$Date: 2020/08/27 08:04 $\nGonzague Henri\n\"\"\"\nimport unittest\nimport numpy as np\n\nfrom pymgrid.MicrogridGenerator import MicrogridGenerator\n\n\nclass TestNonmodularMicrogrid(unittest.TestCase):\n    def setUp(self):\n        mgen = MicrogridGenerator()\n        self.mg = mgen._create_microgrid()\n\n    @staticmethod\n    def random_control():\n        return dict(pv_consummed=np.random.rand(),\n                    battery_charge=np.random.rand(),\n                    battery_discharge=np.random.rand(),\n                    grid_import=np.random.rand(),\n                    grid_export=np.random.rand()\n                    )\n\n    def test_set_horizon(self):\n        self.mg.set_horizon(25)\n        self.assertEqual(25, self.mg.horizon)\n\n    def test_get_updated_values(self):\n        mg_data = self.mg.get_updated_values()\n        self.assertEqual(0, mg_data['pv'])\n\n    def test_forecast_all(self):\n        self.mg.set_horizon(24)\n        forecast = self.mg.forecast_all()\n        self.assertEqual(24, len(forecast['load']))\n\n    def test_forecast_pv(self):\n        self.mg.set_horizon(24)\n        forecast = self.mg.forecast_pv()\n        self.assertEqual (24, len(forecast))\n\n    def test_forecast_load(self):\n        self.mg.set_horizon(24)\n        forecast = self.mg.forecast_load()\n        self.assertEqual (24, len(forecast))\n\n    def test_run(self):\n        pv1 = self.mg.forecast_pv()[1]\n        self.mg.run(self.random_control())\n        pv2 = self.mg.pv\n        self.assertEqual(pv1, pv2)\n\n    def test_train_test_split(self):\n        self.mg.train_test_split()\n        self.assertEqual('training',self.mg._data_set_to_use)\n\n    def test_reset(self):\n        self.mg.run(self.random_control())\n        self.mg.reset()\n        self.assertEqual (0, self.mg._tracking_timestep)\n\n\nif __name__ == '__main__':\n    unittest.main()\n"
  }
]