diff --git a/.devcontainer/Dockerfile.devcontainer b/.devcontainer/Dockerfile.devcontainer
new file mode 100644
index 00000000..bf6623aa
--- /dev/null
+++ b/.devcontainer/Dockerfile.devcontainer
@@ -0,0 +1,30 @@
+FROM python:3.12-slim AS base
+
+# Install any additional OS packages you want in addition to sudo, git and nano
+RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-cache \
+ --mount=type=cache,target=/var/lib/apt,sharing=locked,id=apt-lib \
+ apt-get update && \
+ apt-get install -y --no-install-recommends \
+ sudo git nano \
+# required
+ gcc g++ libxrender1 libxext6 libglib2.0-0
+
+ARG USERNAME=debian
+
+# add default user with no password and sudo privilege
+RUN useradd -m --shell /bin/bash $USERNAME && passwd -d ${USERNAME} && adduser ${USERNAME} sudo
+
+USER $USERNAME
+WORKDIR /home/${USERNAME}
+
+ENV PIP_CACHE_DIR=./.cache/pip
+ENV PIP_USER=1
+ENV PIP_NO_WARN_SCRIPT_LOCATION=1
+
+RUN mkdir -p ${PIP_CACHE_DIR}
+
+# to be replaced later by ADD git#branch if needed
+COPY pyproject.toml .
+
+RUN --mount=type=cache,target=${PIP_CACHE_DIR},sharing=locked,id=pip-cache \
+ touch README.md && pip install --upgrade pip && pip install .[dev] && rm -rf README.md pyproject.toml build *.egg-info
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 00000000..d21a3421
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,35 @@
+{
+ "name": "ChemSpectraApp",
+ "build": {
+ "dockerfile": "Dockerfile.devcontainer",
+ "context": ".."
+ },
+ // Use 'forwardPorts' to make a list of ports inside the container available locally.
+ "forwardPorts": [
+ 3007 // Port for the web server
+ ],
+ // Ensure the environment
+ "postStartCommand": "pip install --upgrade pip && pip install --upgrade .[dev] && pip freeze > dependencies.list",
+ "remoteUser": "debian",
+ "workspaceMount": "source=${localWorkspaceFolder},target=/home/debian/chem_spectra,type=bind",
+ "workspaceFolder": "/home/debian/chem_spectra",
+ // Configure tool-specific properties.
+ "customizations": {
+ // Configure properties specific to VS Code.
+ "vscode": {
+ "extensions": [
+ "ms-python.python",
+ "ms-python.autopep8",
+ "ms-python.vscode-pylance",
+ "github.vscode-github-actions"
+ ],
+ "settings": {
+ "[python]": {
+ "python.defaultInterpreterPath": "/usr/local/bin/python",
+ "editor.defaultFormatter": "ms-python.autopep8"
+ },
+ "editor.formatOnSave": true
+ }
+ }
+ }
+}
diff --git a/.github/workflows/unit_test.yml b/.github/workflows/unit_test.yml
index fe63855c..eb761edb 100644
--- a/.github/workflows/unit_test.yml
+++ b/.github/workflows/unit_test.yml
@@ -6,19 +6,28 @@ jobs:
run-unit-tests:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - name: Set up Python 3.8
- uses: actions/setup-python@v4
+ - uses: actions/checkout@v5
+ - uses: actions/setup-python@v6
with:
- python-version: 3.8
+ check-latest: true
+ cache: "pip"
+ python-version: "3.12"
- name: Install dependencies
- uses: conda-incubator/setup-miniconda@v3
- with:
- activate-environment: python-v38
- environment-file: environment.yml
- miniforge-version: latest
+ run: |
+ pip install --upgrade pip
+ pip install .[dev]
+ - name: Create tmp directory with permissions
+ run: |
+ mkdir -p chem_spectra/tmp
+ chmod -R 777 chem_spectra/tmp
+ - name: Start msconvert Docker container
+ run: |
+ docker run --detach --name msconvert_docker \
+ --rm -it \
+ -e WINEDEBUG=-all \
+ -v ${{ github.workspace }}/chem_spectra/tmp:/data \
+ proteowizard/pwiz-skyline-i-agree-to-the-vendor-licenses bash
- name: Test with pytest
shell: bash -el {0}
run: |
- conda activate python-v38
python -m pytest
diff --git a/.gitignore b/.gitignore
index cb0c7b0b..434ffd27 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
-venv/
+.venv/
+.cache/
*.pyc
__pycache__/
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 09b95c19..00000000
--- a/.travis.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-language: python
-python:
- - "3.5"
-install: "python setup.py install"
-# before_script:
-# - cp .env.example .env
-# - python manage.py migrate
-script:
- - flake8 cmdbox
- - coverage run manage.py test --settings=cmdbox.tests_settings
-after_success:
- - coveralls
diff --git a/Dockerfile.p2d b/Dockerfile.p2d
new file mode 100644
index 00000000..fdb7ce9b
--- /dev/null
+++ b/Dockerfile.p2d
@@ -0,0 +1,46 @@
+FROM python:3.12-slim AS base
+
+# Install any additional OS packages you want in addition to sudo, git and nano
+RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-cache \
+ --mount=type=cache,target=/var/lib/apt,sharing=locked,id=apt-lib \
+ apt-get update \
+ && apt-get install -y --no-install-recommends \
+ sudo git nano curl \
+ gcc g++ libxrender1 libxext6 libglib2.0-0 # required
+
+ADD --chmod=755 https://payload.chemserv.scc.kit.edu/fake-docker.py /bin/docker
+ADD https://payload.chemserv.scc.kit.edu/spectra_config.py /app/instance/config.py
+
+WORKDIR /app
+
+RUN mkdir -p /var/cache/pip
+
+ENV PIP_CACHE_DIR=/var/cache/pip \
+ PIP_ROOT_USER_ACTION=ignore
+
+COPY pyproject.toml .
+
+RUN --mount=type=cache,target=/var/cache/pip,sharing=locked,id=pip-cache \
+ pip install --upgrade pip && pip install .
+
+COPY ./chem_spectra /app/chem_spectra
+COPY ./server.py /app/server.py
+
+# Finalize app setup
+RUN mkdir -p /shared /app/instance && \
+ ln -s /shared /app/chem_spectra/tmp
+
+ENV FLASK_ENV=production \
+ FLASK_DEBUG=0 \
+ MSC_HOST=msconvert \
+ MSC_PORT=4000 \
+ MSC_VALIDATE=true \
+ SPECTRA_PORT=4000
+
+EXPOSE 4000
+
+CMD ["gunicorn", "--timeout", "600", "-w", "4", "-b", "0.0.0.0:4000", "server:app"]
+# i.e the command: gunicorn --timeout 600 -w 4 -b 0.0.0.0:4000 server:app
+
+HEALTHCHECK --interval=5s --timeout=3s --start-period=30s --retries=3 \
+ CMD curl --fail http://localhost:4000/ping || exit 1
\ No newline at end of file
diff --git a/INSTALL.md b/INSTALL.md
index a3694953..b9883341 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -4,86 +4,56 @@ This guidance is tested on Linux Ubuntu 18.04 & Ubuntu 20.04
## 1. Installation
-### 1.1. Install Anaconda & Docker
+### 1.1. Install Python
-Please refer to [https://www.anaconda.com/] & [https://docs.docker.com/install/].
+Use the file pyproject.toml to determine the version of Python required.
-You can follow [unofficial Anaconda & Docker installations for Dummies](INSTALL_BASIC.md) for a test installation.
+### 1.2. Clone repository and create env
-However, it is highly recommended to refer to official websites.
-
-### 1.2. Create env
-
-_Logout & login to load installations._
-
-```
-$ conda create --name chem-spectra python=3.8
-$ source activate chem-spectra
-```
-
-```
-$ sudo apt-get install gcc libxrender1 libxext-dev pkg-config g++
-```
-
-```
-$ git clone https://github.com/ComPlat/chem-spectra-app.git
-$ cd chem-spectra-app
-$ pip install -r requirements.txt
+```sh
+git clone https://github.com/ComPlat/chem-spectra-app.git
+cd chem-spectra-app
```
-The project is in `~/chem-spectra-app`.
-
-
-### 1.3. Use msconvert in Docker
+ALL the **FOLLOWING** commands are assumed to be executed while inside this
+`chem-spectra-app` folder.
```
-$ docker pull chambm/pwiz-skyline-i-agree-to-the-vendor-licenses
+python3 -m venv .venv && .venv/bin/pip install --upgrade pip
+source .venv/bin/activate
+pip install .
```
-__Make sure you are in the `chem-spectra-app` folder.__
-```
-$ cd ~/chem-spectra-app
-```
+### 1.3. Use docker to run a supporting service
-```
-$ mkdir chem_spectra/tmp
-$ sudo chmod -R 755 chem_spectra/tmp
-```
-To running docker for converting Mass spectrum, run this command:
-```
-$ docker run --detach --name msconvert_docker \
- --rm -it \
- -e WINEDEBUG=-all \
- -v [YOUR LOCATION TO chem-spectra-app]/chem_spectra/tmp:/data \
- chambm/pwiz-skyline-i-agree-to-the-vendor-licenses bash
-```
-
-For example, if your location of `chem-spectra-app` is `/home/ubuntu/chem-spectra-app`
-```
-$ docker run --detach --name msconvert_docker \
+```sh
+docker pull proteowizard/pwiz-skyline-i-agree-to-the-vendor-licenses
+mkdir -p chem_spectra/tmp
+chmod -R 755 chem_spectra/tmp
+docker run --detach --name msconvert_docker \
--rm -it \
-e WINEDEBUG=-all \
- -v /home/ubuntu/chem-spectra-app/chem_spectra/tmp:/data \
- chambm/pwiz-skyline-i-agree-to-the-vendor-licenses bash
+ -v ./chem_spectra/tmp:/data \
+ proteowizard/pwiz-skyline-i-agree-to-the-vendor-licenses bash
```
### 1.4. Add `config.py`
Generate a secret key.
-```
-$ python -c 'import os; print(os.urandom(16))'
+```sh
+python -c 'import os; print(os.urandom(16))'
>> b'T\x1d\xb3\xfe\xb6q\xef\xbf\x7f\xcaj\xcbZ\x84\x1ee'
```
Create `config.py`.
-```
-$ mkdir -p ./instance && touch ./instance/config.py
-$ vim ./instance/config.py
+```sh
+mkdir -p ./instance && touch ./instance/config.py
+nano ./instance/config.py
```
-Add content.
+Add the following content.
```python
# ./instance/config.py
@@ -99,23 +69,22 @@ MAX_ZIP_SIZE = 100 #maximum size of a zip file in MB to prevent zip bomb, defaul
Using only "one" of following commands.
-```
+```sh
# run on the production server
-$ gunicorn -w 4 -b 0.0.0.0:3007 server:app --daemon
+gunicorn -w 4 -b 0.0.0.0:3007 server:app --daemon
```
-
-```
+```sh
# for local development only
-$ export FLASK_APP=chem_spectra && export FLASK_DEBUG=true && flask run --host=0.0.0.0 --port=3007
+export FLASK_APP=chem_spectra && export FLASK_DEBUG=true && flask run --host=0.0.0.0 --port=3007
```
### 1.6 Quick test
You should receive `pong` when executing the following command from another machine.
-```
-$ curl xxx.xxx.xxx.xxx:3007/ping
+```sh
+curl xxx.xxx.xxx.xxx:3007/ping
```
## 2. Usage
@@ -130,25 +99,26 @@ body = { file: target.jdx }
```
### 2.1. Logging
-By default, the logging file is at
-```
-./instance/logging.log
-```
+
+By default, the logging file is at `./instance/logging.log`.
### 2.2. Implement a new log message
+
Import `logging` package at where you want to write your log message
+
```
import logging
```
Write log message as
+
```
logger = logging.getLogger(__name__)
logger.setLevel(logging.ERROR) //levels: DEBUG, INFO, ERROR, WARNING, CRITICAL
logger.error('message to log')
```
-Note: You need to use function as the same as your logger level, which named as lowercased of level's name, to write your log message to the logs file
+Note: You need to use function as the same as your logger level, which named as lowercased of level's name, to write your log message to the logs file
### 2.3. Automatic startup in crontab
@@ -156,37 +126,18 @@ To make sure ChemSpectra is started on reboot you can use this BASH script in yo
```sh
#!/bin/bash
-
-sudo -H -u production bash -c "cd /home/production/chem-spectra-app && \
- source /home/production/anaconda3/bin/activate chem-spectra && \
- gunicorn -w 4 -b 0.0.0.0:3007 server:app --daemon"
-
-# Remember to modify path according to your installation
+cd /path/to/chem-spectra-app
+source .venv/bin/activate
docker run --detach --name msconvert_docker \
--rm -it \
-e WINEDEBUG=-all \
- -v /home/production/chem-spectra-app/chem_spectra/tmp:/data chambm/pwiz-skyline-i-agree-to-the-vendor-licenses \
+ -v ./chem_spectra/tmp:/data proteowizard/pwiz-skyline-i-agree-to-the-vendor-licenses \
bash
+gunicorn -w 4 -b 0.0.0.0:3007 server:app --daemon
```
## 3. Run test
-```
-$ coverage run -m pytest --disable-pytest-warnings
-$ coverage report
-```
-
-## 4. Linting
-
-```
-$ flake8
-```
-
-
-## DEBUG
-
-### msconvert_docker
-
-```
-$ docker exec -it msconvert_docker wine msconvert --help
+```sh
+python -m pytest
```
diff --git a/INSTALL_BASIC.md b/INSTALL_BASIC.md
deleted file mode 100644
index fa94b795..00000000
--- a/INSTALL_BASIC.md
+++ /dev/null
@@ -1,48 +0,0 @@
-This page is only for debug purpose.
-
-For the latest installation, please refer to Anaconda & Docker website.
-
-## Anaconda for Linux
-
-Please refer to `https://www.anaconda.com/`.
-
-```
-$ cd /tmp
-$ curl -O https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh
-$ bash Anaconda3-2019.10-Linux-x86_64.sh
-```
-
-add `export PATH=~/anaconda3/bin:$PATH` to `~/.bashrc`
-
-
-## Docker for Ubuntu
-
-Please refer to `https://docs.docker.com/install/`.
-
-```
-$ sudo apt-get update
-$ sudo apt-get install \
- apt-transport-https \
- ca-certificates \
- curl \
- gnupg-agent \
- software-properties-common
-$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
-$ sudo add-apt-repository \
- "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
- $(lsb_release -cs) \
- stable"
-```
-
-```
-$ sudo apt-get update
-$ sudo apt-get install docker-ce docker-ce-cli containerd.io
-
-$ sudo docker run hello-world
-```
-
-assume the username is: `ubuntu`.
-
-```
-$ sudo usermod -a -G docker ubuntu
-```
diff --git a/LICENSE b/LICENSE
index dba13ed2..245710fd 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,661 +1,21 @@
- GNU AFFERO GENERAL PUBLIC LICENSE
- Version 3, 19 November 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU Affero General Public License is a free, copyleft license for
-software and other kinds of works, specifically designed to ensure
-cooperation with the community in the case of network server software.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-our General Public Licenses are intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- Developers that use our General Public Licenses protect your rights
-with two steps: (1) assert copyright on the software, and (2) offer
-you this License which gives you legal permission to copy, distribute
-and/or modify the software.
-
- A secondary benefit of defending all users' freedom is that
-improvements made in alternate versions of the program, if they
-receive widespread use, become available for other developers to
-incorporate. Many developers of free software are heartened and
-encouraged by the resulting cooperation. However, in the case of
-software used on network servers, this result may fail to come about.
-The GNU General Public License permits making a modified version and
-letting the public access it on a server without ever releasing its
-source code to the public.
-
- The GNU Affero General Public License is designed specifically to
-ensure that, in such cases, the modified source code becomes available
-to the community. It requires the operator of a network server to
-provide the source code of the modified version running there to the
-users of that server. Therefore, public use of a modified version, on
-a publicly accessible server, gives the public access to the source
-code of the modified version.
-
- An older license, called the Affero General Public License and
-published by Affero, was designed to accomplish similar goals. This is
-a different license, not a version of the Affero GPL, but Affero has
-released a new version of the Affero GPL which permits relicensing under
-this license.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU Affero General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Remote Network Interaction; Use with the GNU General Public License.
-
- Notwithstanding any other provision of this License, if you modify the
-Program, your modified version must prominently offer all users
-interacting with it remotely through a computer network (if your version
-supports such interaction) an opportunity to receive the Corresponding
-Source of your version by providing access to the Corresponding Source
-from a network server at no charge, through some standard or customary
-means of facilitating copying of software. This Corresponding Source
-shall include the Corresponding Source for any work covered by version 3
-of the GNU General Public License that is incorporated pursuant to the
-following paragraph.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the work with which it is combined will remain governed by version
-3 of the GNU General Public License.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU Affero General Public License from time to time. Such new versions
-will be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU Affero General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU Affero General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU Affero General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This 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 Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-
-Also add information on how to contact you by electronic and paper mail.
-
- If your software can interact with users remotely through a computer
-network, you should also make sure that it provides a way for users to
-get its source. For example, if your program is a web application, its
-interface could display a "Source" link that leads users to an archive
-of the code. There are many ways you could offer source, and different
-solutions will be better for different programs; see section 13 for the
-specific requirements.
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU AGPL, see
-.
+MIT License
+
+Copyright (c) 2016–2026 Nicole Jung - Karlsruhe Institute of Technology (KIT)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
index f5ad640f..da03a48c 100644
--- a/README.md
+++ b/README.md
@@ -1,47 +1,33 @@
-# chem-spectra-app
+# ChemSpectra App
This backend web service provides NMR/IR/MS processing for jcamp/RAW/mzML files.

-
+

+
-The frontend is provided by chem-spectra-client.
+The frontend is provided by [chem-spectra-client](https://github.com/ComPlat/chem-spectra-client).
-### Install
+## Documentation
-see [INSTALL.md][INSTALL]
+1. [Installation](INSTALL.md)
+2. [Demo & step-by-step manual](https://github.com/ComPlat/react-spectra-editor/blob/master/DEMO_MANUAL.md)
+3. Software's [Archicture](./docs/ARCHITECTURE.md)
+### Run test
-##### Run test
+```bash
+coverage run -m pytest --disable-pytest-warnings
+coverage report
+coverage run -m pytest --disable-pytest-warnings -k ./tests/test_spectra_im.py -k 'test_meta_1H' -vv
```
-$ coverage run -m pytest --disable-pytest-warnings
-$ coverage report
-
-$ coverage run -m pytest --disable-pytest-warnings -k ./tests/test_spectra_im.py -k 'test_meta_1H' -vv
-```
-
-### Demo & Manual
-
-[demo & step-by-step manual](https://github.com/ComPlat/react-spectra-editor/blob/master/DEMO_MANUAL.md)
-
-
-### Architecture
-To see archicture, you can view it at [ARCHITECTURE.md](./docs/ARCHITECTURE.md)
-
## Acknowledgments
-This project has been funded by the **[DFG]**.
-
-[![DFG Logo]][DFG]
+This project has been funded by the **[DFG](https://www.dfg.de/en/)**.
+
Funded by the [Deutsche Forschungsgemeinschaft (DFG, German Research Foundation)](https://www.dfg.de/) under the [National Research Data Infrastructure – NFDI4Chem](https://nfdi4chem.de/) – Projektnummer **441958208** since 2020.
-
-
-[DFG]: https://www.dfg.de/en/
-[DFG Logo]: https://chemotion.net/img/logos/DFG_logo.png
-[LICENSE]: LICENSE
-[INSTALL]: INSTALL.md
diff --git a/chem_spectra/controller/file_api.py b/chem_spectra/controller/file_api.py
index 93eb306f..4fbb9a83 100644
--- a/chem_spectra/controller/file_api.py
+++ b/chem_spectra/controller/file_api.py
@@ -8,6 +8,7 @@
from chem_spectra.controller.helper.share import (
to_zip_response, extract_params, to_zip_bag_it_response
)
+from chem_spectra.controller.helper.lcms import normalize_lcms_filename
from chem_spectra.model.transformer import TransformerModel as TraModel
from chem_spectra.model.molecule import MoleculeModel
from chem_spectra.lib.converter.bagit.base import BagItBaseConverter
@@ -47,6 +48,7 @@ def chemspectra_file_save():
request_files = request.files
molfile = FileContainer(request.files.get('molfile'))
filename = request.form.get('filename', default=None)
+ filename = normalize_lcms_filename(filename, src.name if src else None)
params = extract_params(request)
if 'dst_list' in request_files:
request_dst = request_files.getlist('dst_list')
diff --git a/chem_spectra/controller/helper/file_container.py b/chem_spectra/controller/helper/file_container.py
index e3671554..ed584199 100644
--- a/chem_spectra/controller/helper/file_container.py
+++ b/chem_spectra/controller/helper/file_container.py
@@ -3,7 +3,7 @@
from flask import current_app
import logging
-DEFAULT_MAX_ZIP_SIZE = 100 #100MB
+DEFAULT_MAX_ZIP_SIZE = 200 # MB; raised from 100 to accommodate BagIt LCMS archives
class FileContainer:
def __init__(self, src=False):
diff --git a/chem_spectra/controller/helper/lcms.py b/chem_spectra/controller/helper/lcms.py
new file mode 100644
index 00000000..e9d43903
--- /dev/null
+++ b/chem_spectra/controller/helper/lcms.py
@@ -0,0 +1,118 @@
+"""LCMS-specific request helpers.
+
+Keeps LCMS request parsing/normalisation out of the generic ``share.py``
+helpers so the original (pre-LCMS) request pipeline stays untouched.
+"""
+
+import os.path as os_path
+
+
+def _param_to_text(value):
+ """Normalise an arbitrary form/file param into a UTF-8 string (or None)."""
+ if value is None:
+ return None
+
+ if hasattr(value, 'read'):
+ try:
+ content = value.read()
+ except Exception:
+ return None
+ try:
+ value.seek(0)
+ except Exception:
+ pass
+ if isinstance(content, bytes):
+ return content.decode('utf-8', errors='ignore')
+ return str(content)
+
+ if isinstance(value, dict):
+ tmp_file = value.get('tempfile') or value.get(':tempfile')
+ if hasattr(tmp_file, 'read'):
+ try:
+ content = tmp_file.read()
+ except Exception:
+ return None
+ try:
+ tmp_file.seek(0)
+ except Exception:
+ pass
+ if isinstance(content, bytes):
+ return content.decode('utf-8', errors='ignore')
+ return str(content)
+
+ return value if isinstance(value, str) else str(value)
+
+
+def normalize_lcms_filename(filename, src_filename=None):
+ """Normalize an LCMS attachment filename for ELN grouping.
+
+ When the frontend posts both a source archive (``src_filename``) and a
+ derived ``filename`` (e.g. ``run_42.edit``), prefer the source basename so
+ files from the same dataset stay grouped.
+
+ Otherwise strip archive extensions and ``.edit`` suffixes from
+ ``filename``. Intended for LCMS save paths only — callers should not
+ invoke this helper for unrelated upload types.
+ """
+ if not filename and not src_filename:
+ return filename
+
+ def _strip_archive_suffix_simple(name):
+ lower = name.lower()
+ for suffix in (".tar.gz", ".tgz", ".tar.xz", ".tar", ".zip"):
+ if lower.endswith(suffix):
+ return name[: -len(suffix)]
+ return os_path.splitext(name)[0]
+
+ def _basename_no_ext(value):
+ if not value:
+ return None
+ base = os_path.basename(str(value))
+ return _strip_archive_suffix_simple(base)
+
+ def _strip_edit_suffix(value):
+ if not value:
+ return value
+ return value[:-5] if value.lower().endswith(".edit") else value
+
+ base = _basename_no_ext(filename)
+ src_base = _basename_no_ext(src_filename)
+
+ if src_base:
+ if not base:
+ return src_base
+ src_core = _strip_edit_suffix(src_base)
+ base_core = _strip_edit_suffix(base)
+ if base_core.lower().startswith(src_core.lower()):
+ return src_base
+
+ return base or filename
+
+
+LCMS_PARAM_KEYS = (
+ 'lcms_uvvis_wavelength',
+ 'lcms_mz_page',
+ 'lcms_mz_page_data',
+)
+
+
+def extract_lcms_params(request):
+ """Pull LCMS-specific form/file fields out of a Flask request.
+
+ Returns a flat dict callers can merge with their general params. All keys
+ default to ``None`` so non-LCMS requests stay untouched.
+ """
+ lcms_uvvis_wavelength = request.form.get('lcms_uvvis_wavelength', default=None)
+ lcms_mz_page = request.form.get('lcms_mz_page', default=None)
+
+ raw_mz_page_data = (
+ request.files.get('lcms_mz_page_data')
+ or request.form.get('lcms_mz_page_data', default=None)
+ )
+ lcms_mz_page_data = _param_to_text(raw_mz_page_data)
+
+ return {
+ 'lcms_uvvis_wavelength': lcms_uvvis_wavelength,
+ 'lcms_mz_page': lcms_mz_page,
+ 'lcms_mz_page_data': lcms_mz_page_data,
+ }
diff --git a/chem_spectra/controller/helper/lcms_response.py b/chem_spectra/controller/helper/lcms_response.py
new file mode 100644
index 00000000..0508963b
--- /dev/null
+++ b/chem_spectra/controller/helper/lcms_response.py
@@ -0,0 +1,70 @@
+import json
+from typing import Iterable, List, Optional
+
+from flask import Response, make_response, send_file
+
+from chem_spectra.controller.helper.file_container import FileContainer
+from chem_spectra.controller.helper.share import to_zip_flat_bagit_response
+from chem_spectra.lib.composer.lcms_converter_app import LCMSConverterAppComposer
+from chem_spectra.lib.converter.bagit.lcms_builder import classify_lcms_stems
+
+
+def _materialize_uploads(uploads: Iterable) -> List:
+ temp_files = []
+ for item in uploads:
+ container = FileContainer(item)
+ if container and container.bcore:
+ temp_files.append(container.temp_file())
+ return temp_files
+
+
+def _close_silently(handles: Iterable) -> None:
+ for handle in handles:
+ try:
+ handle.close()
+ except Exception:
+ pass
+
+
+def build_lcms_zip_response_from_uploads(
+ uploads: Iterable,
+ params: Optional[dict],
+ download_name: str = 'spectrum.zip',
+) -> Response:
+ upload_list = list(uploads)
+ temp_files = _materialize_uploads(upload_list)
+ try:
+ composer = LCMSConverterAppComposer(temp_files, None, params)
+ composer.tf_jcamp()
+ preview = composer.tf_img()
+
+ list_jcamps = composer.data or temp_files
+ entry_stems = classify_lcms_stems([f.name for f in list_jcamps])
+ if len(entry_stems) != len(list_jcamps):
+ entry_stems = [str(i) for i in range(len(list_jcamps))]
+
+ preview_idx = next(
+ (i for i, s in enumerate(entry_stems) if s == 'lcms_uvvis'),
+ 0,
+ )
+ dst_list = [[f] for f in list_jcamps]
+ if preview is not None and dst_list:
+ dst_list[preview_idx].append(preview)
+
+ archive_fname = next(
+ (getattr(u, 'filename', None) for u in upload_list if getattr(u, 'filename', None)),
+ None,
+ ) or 'spectrum'
+
+ memory = to_zip_flat_bagit_response(dst_list, archive_fname, entry_stems)
+ rsp = make_response(send_file(
+ memory,
+ download_name=download_name,
+ as_attachment=True,
+ ))
+ rsp.headers['X-Extra-Info-JSON'] = json.dumps(
+ {'spc_type': 'lcms', 'invalid_molfile': False}
+ )
+ return rsp
+ finally:
+ _close_silently(temp_files)
diff --git a/chem_spectra/controller/helper/share.py b/chem_spectra/controller/helper/share.py
index 3ae0ff55..18e3e0f1 100644
--- a/chem_spectra/controller/helper/share.py
+++ b/chem_spectra/controller/helper/share.py
@@ -1,11 +1,12 @@
import io
-from typing import Sequence
import zipfile
import math
import os.path as os_path
from os.path import basename
import collections.abc
+from chem_spectra.controller.helper.lcms import extract_lcms_params, LCMS_PARAM_KEYS
+
ALLOWED_EXTENSIONS = set(['dx', 'jdx', 'raw', 'mzml', 'mzxml', 'jcamp'])
@@ -40,6 +41,71 @@ def to_zip_response(src_tmp_arr, filename=False, src_idx=-1):
return memory
+def zip_base_stem_from_fname(fname):
+ """Stem of the uploaded file name (e.g. ``LCMS_OpenLab.zip`` → ``LCMS_OpenLab``)."""
+ if not fname:
+ return 'spectrum'
+ s = str(fname).replace('\\', '/').split('/')[-1]
+ parts = s.split('.')
+ if len(parts) > 2 and parts[-2] in ('edit', 'peak'):
+ base = '.'.join(parts[:-2])
+ elif len(parts) > 1:
+ base = '.'.join(parts[:-1])
+ else:
+ base = parts[0]
+ return base.replace(' ', '_')
+
+
+def to_zip_flat_bagit_response(dst_list, fname, entry_stems):
+ """Build a single-level zip (no ``curve_N/`` folders) for ELN clients.
+
+ Each spectrum row becomes files named ``{zip_base}_{entry_stem}.{ext}`` at
+ the archive root. Combined preview uses ``{zip_base}_combined.{ext}``.
+ """
+ base = zip_base_stem_from_fname(fname)
+ memory = io.BytesIO()
+ used = set()
+ curve_idx = 0
+ with zipfile.ZipFile(memory, 'w', zipfile.ZIP_DEFLATED) as zf:
+ for sub in dst_list:
+ if isinstance(sub, (list, tuple)):
+ stem = (
+ entry_stems[curve_idx]
+ if curve_idx < len(entry_stems)
+ else str(curve_idx)
+ )
+ curve_idx += 1
+ sub_list = [el for el in sub if el]
+ for tmp in sub_list:
+ abs_path = tmp.name
+ ext = basename(abs_path).split('.')[-1]
+ arc = f'{base}_{stem}.{ext}'.replace(' ', '_')
+ n = 0
+ while arc in used:
+ n += 1
+ arc = f'{base}_{stem}_{n}.{ext}'.replace(' ', '_')
+ used.add(arc)
+ zf.write(abs_path, arc)
+ for tmp in sub_list:
+ tmp.close()
+ else:
+ tmp = sub
+ if not tmp:
+ continue
+ abs_path = tmp.name
+ ext = basename(abs_path).split('.')[-1]
+ arc = f'{base}_combined.{ext}'.replace(' ', '_')
+ n = 0
+ while arc in used:
+ n += 1
+ arc = f'{base}_combined_{n}.{ext}'.replace(' ', '_')
+ used.add(arc)
+ zf.write(abs_path, arc)
+ tmp.close()
+ memory.seek(0)
+ return memory
+
+
def to_zip_bag_it_response(src_tmp_arr, filename=False, src_idx=-1):
tmp_arr = [el for el in src_tmp_arr if el]
memory = io.BytesIO()
@@ -108,6 +174,7 @@ def extract_params(request):
data_type_mapping = request.form.get('data_type_mapping', default='')
detector = request.form.get('detector', default=None)
dsc_meta_data = request.form.get('dsc_meta_data', default=None)
+ lcms_params = extract_lcms_params(request)
params = {
'peaks_str': request.form.get('peaks_str', default=None),
@@ -133,6 +200,7 @@ def extract_params(request):
'data_type_mapping': data_type_mapping,
'detector': detector,
'dsc_meta_data': dsc_meta_data,
+ **lcms_params,
}
has_params = (
params.get('peaks_str') or
@@ -149,7 +217,8 @@ def extract_params(request):
params.get('integration') or
params.get('multiplicity') or
params.get('fname') or
- params.get('simulatenmr')
+ params.get('simulatenmr') or
+ any(params.get(key) for key in LCMS_PARAM_KEYS)
)
if not has_params:
params = False
diff --git a/chem_spectra/controller/transform_api.py b/chem_spectra/controller/transform_api.py
index fecf0c3c..5ea13732 100644
--- a/chem_spectra/controller/transform_api.py
+++ b/chem_spectra/controller/transform_api.py
@@ -1,20 +1,21 @@
-from cmath import log
-from crypt import methods
-import json
import collections.abc
-from multiprocessing.dummy import Array
+import json
+
from flask import (
Blueprint, request, send_file, make_response, abort
)
# from chem_spectra.controller.helper.settings import get_ip_white_list
from chem_spectra.controller.helper.file_container import FileContainer
from chem_spectra.controller.helper.share import (
- to_zip_response, extract_params, to_zip_bag_it_response
+ to_zip_response, extract_params, to_zip_flat_bagit_response,
+)
+from chem_spectra.controller.helper.lcms_response import (
+ build_lcms_zip_response_from_uploads,
)
from chem_spectra.model.transformer import TransformerModel as TraModel
from chem_spectra.lib.converter.bagit.base import BagItBaseConverter
-from chem_spectra.model.molecule import MoleculeModel
+from chem_spectra.lib.composer.lcms_converter_app import LCMSConverterAppComposer
trans_api = Blueprint('transform_api', __name__)
@@ -30,6 +31,16 @@ def filter_remote_ip():
@trans_api.route('/zip_jcamp_n_img', methods=['POST'])
def zip_jcamp_n_img():
+ uploaded_lcms_files = (
+ request.files.getlist('files[]')
+ or request.files.getlist('files')
+ )
+ if uploaded_lcms_files:
+ return build_lcms_zip_response_from_uploads(
+ uploaded_lcms_files,
+ extract_params(request),
+ )
+
file = FileContainer(request.files['file'])
molfile = FileContainer(request.files.get('molfile'))
params = extract_params(request)
@@ -40,7 +51,7 @@ def zip_jcamp_n_img():
abort(403)
if isinstance(cmpsr, BagItBaseConverter):
- # check if composered model is in BagIt format
+ # Flat zip at root (no curve_N/ folders) so ELN keeps one attachment group.
list_jcamps, list_images, list_csv, combined_image = cmpsr.data, cmpsr.images, cmpsr.list_csv, cmpsr.combined_image
dst_list = []
for idx in range(len(list_jcamps)):
@@ -49,11 +60,16 @@ def zip_jcamp_n_img():
tf_csv = list_csv[idx]
tf_arr = [tf_jcamp, tf_img, tf_csv]
dst_list.append(tf_arr)
-
+
if combined_image is not None:
dst_list.append(combined_image)
- memory = to_zip_bag_it_response(dst_list)
+ archive_fname = getattr(file, 'name', None) or (
+ (params.get('fname') if isinstance(params, dict) else None) or 'spectrum'
+ )
+ memory = to_zip_flat_bagit_response(
+ dst_list, archive_fname, cmpsr.archive_entry_stems,
+ )
rsp = make_response(
send_file(
memory,
@@ -80,20 +96,31 @@ def zip_jcamp_n_img():
)
)
rsp.headers['X-Extra-Info-JSON'] = json.dumps({'spc_type': spc_type, 'invalid_molfile': invalid_molfile})
+ elif isinstance(cmpsr, LCMSConverterAppComposer):
+ tf_jcamp = cmpsr.tf_jcamp()
+ tf_img = cmpsr.tf_img()
+ tf_csv = cmpsr.tf_csv()
+ spc_type = 'hplc'
+ if (tf_csv is not None and tf_csv != False):
+ memory = to_zip_response([tf_jcamp, tf_img, tf_csv])
+ else:
+ memory = to_zip_response([tf_jcamp, tf_img])
+ rsp = make_response(
+ send_file(
+ memory,
+ download_name='spectrum.zip',
+ as_attachment=True
+ )
+ )
+ rsp.headers['X-Extra-Info-JSON'] = json.dumps(
+ {'spc_type': spc_type, 'invalid_molfile': invalid_molfile}
+ )
else:
tf_jcamp, tf_img, tf_csv = cmpsr.tf_jcamp(), cmpsr.tf_img(), cmpsr.tf_csv()
- tf_nmrium = None
- try:
- molecule_model = MoleculeModel(molfile, cmpsr.core.ncl, decorate=False)
- tf_nmrium = cmpsr.generate_nmrium(molfile_data=molecule_model.moltxt)
- except Exception:
- pass
spc_type = cmpsr.core.ncl if cmpsr.core.typ == 'NMR' else cmpsr.core.typ
if (tf_csv is not None and tf_csv != False):
memory = to_zip_response([tf_jcamp, tf_img, tf_csv])
- elif (tf_nmrium is not None):
- memory = to_zip_response([tf_jcamp, tf_img, tf_nmrium])
else:
memory = to_zip_response([tf_jcamp, tf_img])
rsp = make_response(
@@ -116,14 +143,16 @@ def zip_jcamp():
if file: # and allowed_file(file):
tf_jcamp = TraModel(file, molfile=molfile, params=params).convert2jcamp()
if isinstance(tf_jcamp, BagItBaseConverter):
- # check if composered model is in BagIt format
list_jcamps = tf_jcamp.data
dst_list = []
for jcamp in list_jcamps:
tf_arr = [jcamp]
dst_list.append(tf_arr)
- memory = to_zip_bag_it_response(dst_list)
+ archive_fname = getattr(file, 'name', None) or 'spectrum'
+ memory = to_zip_flat_bagit_response(
+ dst_list, archive_fname, tf_jcamp.archive_entry_stems,
+ )
else:
memory = to_zip_response([tf_jcamp])
return send_file(
@@ -141,14 +170,16 @@ def zip_image():
if file: # and allowed_file(file):
tf_img = TraModel(file, molfile=molfile, params=params).convert2img()
if isinstance(tf_img, BagItBaseConverter):
- # check if composered model is in BagIt format
list_images = tf_img.images
dst_list = []
for img in list_images:
tf_arr = [img]
dst_list.append(tf_arr)
- memory = to_zip_bag_it_response(dst_list)
+ archive_fname = getattr(file, 'name', None) or 'spectrum'
+ memory = to_zip_flat_bagit_response(
+ dst_list, archive_fname, tf_img.archive_entry_stems,
+ )
else:
memory = to_zip_response([tf_img])
return send_file(
diff --git a/chem_spectra/lib/composer/lcms_converter_app.py b/chem_spectra/lib/composer/lcms_converter_app.py
new file mode 100644
index 00000000..12e2db9a
--- /dev/null
+++ b/chem_spectra/lib/composer/lcms_converter_app.py
@@ -0,0 +1,288 @@
+import tempfile
+import json
+import logging
+from typing import List, Optional, Dict
+
+from chem_spectra.lib.external.chemotion_converter_lcms import (
+ lcms_preview_image_from_jdx_files,
+ lcms_df_from_peak_jdx,
+ lcms_df_from_uvvis_jdx,
+ lcms_uvvis_peak_jcamp_from_df,
+ lcms_uvvis_units_from_jdx,
+)
+
+logger = logging.getLogger(__name__)
+
+UVVIS_PEAK_MARKER = "CHEMSPECTRA UVVIS PEAK TABLE"
+
+_UVVIS_DATA_TYPE_TOKENS = (
+ "HPLC UV-VIS",
+ "HPLC UV/VIS",
+ "UV-VIS",
+ "UV/VIS",
+ "ULTRAVIOLET",
+)
+
+_MARKER_SCAN_CHUNK = 65536
+
+
+def has_uvvis_peak_marker(path: Optional[str]) -> bool:
+ if not path:
+ return False
+ try:
+ with open(path, 'r', encoding='utf-8', errors='ignore') as handle:
+ while True:
+ chunk = handle.read(_MARKER_SCAN_CHUNK)
+ if not chunk:
+ return False
+ if UVVIS_PEAK_MARKER in chunk:
+ return True
+ except OSError:
+ return False
+
+
+class LCMSConverterAppComposer:
+ def __init__(
+ self,
+ jcamp_files: List[tempfile.NamedTemporaryFile],
+ image: Optional[tempfile.NamedTemporaryFile] = None,
+ params: Optional[Dict] = None,
+ ):
+ self.data = jcamp_files
+ self._image = image
+ self.params = params
+ self._peaks_applied = False
+ self._ensure_uvvis_peak_file()
+
+ @staticmethod
+ def _has_lcms_edits(params: Optional[Dict]) -> bool:
+ if not params:
+ return False
+ peaks = params.get("peaks_str")
+ if peaks not in (None, "", [], {}):
+ return True
+
+ integration = params.get("integration")
+ if integration in (None, "", "{}", "[]", {}, []):
+ return False
+ if isinstance(integration, str):
+ try:
+ integration = json.loads(integration)
+ except Exception:
+ return True
+ if isinstance(integration, dict):
+ stack = integration.get("stack") if "stack" in integration else None
+ curves = integration.get("curves") or integration.get("byCurve") or integration.get("by_curve")
+ if stack:
+ return True
+ if isinstance(curves, list) and len(curves) > 0:
+ return True
+ # Wavelength keyed integrations: {"230": [[xL,xU,area,...]]}
+ for value in integration.values():
+ if isinstance(value, list) and len(value) > 0:
+ return True
+ return False
+ return bool(integration)
+
+ @staticmethod
+ def _requested_lcms_mz_page(params: Optional[Dict]) -> str:
+ if not params:
+ return ""
+ raw_value = params.get("lcms_mz_page")
+ if raw_value is None:
+ return ""
+ return " ".join(str(raw_value).splitlines()).strip()
+
+ @staticmethod
+ def _read_lcms_mz_page_from_file(jdx_file: Optional[tempfile.NamedTemporaryFile]) -> str:
+ if not jdx_file:
+ return ""
+ try:
+ with open(jdx_file.name, "r", encoding="utf-8", errors="ignore") as handle:
+ for line in handle:
+ if line.startswith("##$CSLCMSMZPAGE="):
+ return line.split("=", 1)[1].strip()
+ except Exception:
+ return ""
+ return ""
+
+ def _should_refresh_jcamp(self) -> bool:
+ if self._has_lcms_edits(self.params):
+ return True
+
+ requested_mz_page = self._requested_lcms_mz_page(self.params)
+ if not requested_mz_page:
+ return False
+
+ jdx_file = self._find_peak_or_edit_file()
+ if not jdx_file and self.data:
+ jdx_file = self.data[0]
+
+ current_mz_page = self._read_lcms_mz_page_from_file(jdx_file)
+ if current_mz_page != requested_mz_page:
+ return True
+ return False
+
+ def tf_img(self):
+ if self._should_refresh_jcamp() and not self._peaks_applied:
+ self.tf_jcamp()
+ if self._image is not None:
+ return self._image
+ if self.data:
+ preview = lcms_preview_image_from_jdx_files(self.data, self.params)
+ if preview:
+ self._image = preview
+ return self._image
+
+ def _find_peak_or_edit_file(self) -> Optional[tempfile.NamedTemporaryFile]:
+ for jdx_file in self.data:
+ if jdx_file.name.lower().endswith(('peak.jdx', 'edit.jdx')):
+ return jdx_file
+ return None
+
+ @staticmethod
+ def _is_uvvis_source(jdx_file) -> bool:
+ path = getattr(jdx_file, 'name', None) if jdx_file else None
+ if not path:
+ return False
+ try:
+ with open(path, 'r', encoding='utf-8', errors='ignore') as handle:
+ for _ in range(200):
+ raw = handle.readline()
+ if not raw:
+ break
+ line = raw.strip()
+ if not line.startswith('##'):
+ if line:
+ continue
+ break
+ if not line.upper().startswith('##DATA TYPE'):
+ continue
+ value = line.split('=', 1)[1].strip().upper() if '=' in line else ''
+ return any(token in value for token in _UVVIS_DATA_TYPE_TOKENS)
+ except OSError:
+ return False
+ return False
+
+ def _resolve_uvvis_title(self) -> str:
+ title = ''
+ if isinstance(self.params, dict):
+ title = self.params.get('fname') or ''
+ if title:
+ title = title.replace('.jdx', '').replace('.edit', '').replace('.peak', '')
+ return title or 'lc_ms_spectrum'
+
+ def _ensure_uvvis_peak_file(self) -> None:
+ if not self.data:
+ return
+
+ for jdx_file in self.data:
+ name = (getattr(jdx_file, 'name', '') or '').lower()
+ if name.endswith(('peak.jdx', 'edit.jdx')) and 'uvvis' in name:
+ return
+ if has_uvvis_peak_marker(getattr(jdx_file, 'name', None)):
+ return
+
+ for idx, jdx_file in enumerate(self.data):
+ path = getattr(jdx_file, 'name', None)
+ if not path or not self._is_uvvis_source(jdx_file):
+ continue
+ try:
+ lc_df = lcms_df_from_uvvis_jdx(path)
+ except Exception as err:
+ logger.debug("UVVIS peak prebake: parse failed on %s: %s", path, err)
+ continue
+ if lc_df is None or lc_df.empty:
+ continue
+
+ try:
+ x_units, y_units = lcms_uvvis_units_from_jdx(path)
+ new_file = lcms_uvvis_peak_jcamp_from_df(
+ lc_df,
+ self._resolve_uvvis_title(),
+ self.params,
+ x_units=x_units,
+ y_units=y_units,
+ )
+ except Exception as err:
+ logger.warning(
+ "UVVIS peak prebake: generator raised on %s: %s", path, err,
+ )
+ return
+
+ if new_file is None:
+ return
+
+ self.data.insert(idx + 1, new_file)
+ self._image = None
+ return
+
+ def tf_jcamp(self):
+ if not self.data:
+ return None
+
+ if self._should_refresh_jcamp() and not self._peaks_applied:
+ jdx_file = self._find_peak_or_edit_file()
+ if not jdx_file and self.data:
+ jdx_file = self.data[0]
+
+ if jdx_file:
+ lc_df = lcms_df_from_peak_jdx(jdx_file.name)
+ units_path = jdx_file.name
+ if lc_df is None or lc_df.empty:
+ lc_df = lcms_df_from_uvvis_jdx(jdx_file.name)
+ if (lc_df is None or lc_df.empty) and self.data:
+ for candidate in self.data:
+ if candidate is jdx_file:
+ continue
+ maybe_df = lcms_df_from_uvvis_jdx(candidate.name)
+ if maybe_df is not None and not maybe_df.empty:
+ lc_df = maybe_df
+ units_path = candidate.name
+ break
+ if lc_df is not None and not lc_df.empty:
+ title = self.params.get('fname', 'lc_ms_spectrum')
+ if title:
+ title = title.replace('.jdx', '').replace('.edit', '').replace('.peak', '')
+ else:
+ title = 'lc_ms_spectrum'
+ x_units, y_units = lcms_uvvis_units_from_jdx(units_path)
+ if not x_units or not y_units:
+ for candidate in self.data:
+ candidate_path = getattr(candidate, 'name', None)
+ if not candidate_path or candidate_path == units_path:
+ continue
+ if not self._is_uvvis_source(candidate):
+ continue
+ src_x, src_y = lcms_uvvis_units_from_jdx(candidate_path)
+ x_units = x_units or src_x
+ y_units = y_units or src_y
+ if x_units and y_units:
+ break
+ new_file = lcms_uvvis_peak_jcamp_from_df(
+ lc_df,
+ title,
+ self.params,
+ x_units=x_units,
+ y_units=y_units,
+ )
+ if new_file:
+ replaced = False
+ for idx, existing in enumerate(self.data):
+ if existing is jdx_file:
+ self.data[idx] = new_file
+ replaced = True
+ break
+ if not replaced:
+ self.data.insert(0, new_file)
+ preview = lcms_preview_image_from_jdx_files(self.data, self.params)
+ if preview:
+ self._image = preview
+ self._peaks_applied = True
+ return new_file
+ self._peaks_applied = True
+
+ return self.data[0] if self.data else None
+
+ def tf_csv(self):
+ return None
diff --git a/chem_spectra/lib/composer/ms.py b/chem_spectra/lib/composer/ms.py
index 00401eff..8af1f4db 100644
--- a/chem_spectra/lib/composer/ms.py
+++ b/chem_spectra/lib/composer/ms.py
@@ -74,7 +74,7 @@ def __gen_ms_spectra(self):
ms_tempfile.seek(0)
lines = ms_tempfile.readlines()
decoded_lines = [line.decode('utf-8').strip() for line in lines]
- msspcs = '\n'.join(decoded_lines)
+ msspcs = '\n'.join(decoded_lines) + '\n'
ms_tempfile.close()
return msspcs
@@ -115,6 +115,7 @@ def prism_peaks(self):
def tf_img(self):
plt.rcParams['figure.figsize'] = [16, 9]
+ plt.rcParams['figure.dpi'] = 200
plt.rcParams['font.size'] = 14
# PLOT data
blues_x, blues_y, greys_x, greys_y, _ = self.prism_peaks()
@@ -137,6 +138,3 @@ def tf_img(self):
def tf_csv(self):
return None
- def generate_nmrium(self):
- return None
-
\ No newline at end of file
diff --git a/chem_spectra/lib/composer/ni.py b/chem_spectra/lib/composer/ni.py
index adb592ce..6522a438 100644
--- a/chem_spectra/lib/composer/ni.py
+++ b/chem_spectra/lib/composer/ni.py
@@ -1,6 +1,4 @@
-import json
from operator import truediv
-import uuid
import matplotlib
matplotlib.use('Agg')
@@ -30,8 +28,73 @@ class NIComposer(BaseComposer):
def __init__(self, core):
super().__init__(core)
self.title = core.fname
+ self._cv_density_scale = 1.0
+ self._cv_axis_base = 1.0
+ self._cv_axis_exp = 0
+ self.__override_cv_density_label()
self.meta = self.__compose()
+ def __cv_display_info(self):
+ if not getattr(self.core, 'is_cyclic_volta', False):
+ return None
+
+ params = self.core.params if hasattr(self.core, 'params') else {}
+
+ cv_state = (
+ params.get('cyclicvoltaSt')
+ or params.get('cyclicvolta')
+ or params.get('cyclic_volta')
+ )
+ cv_state = cv_state or {}
+ if isinstance(cv_state, str):
+ try:
+ cv_state = json.loads(cv_state)
+ except Exception:
+ cv_state = {}
+
+ axis_display = cv_state.get('axisDisplay') or {}
+ cv_display = cv_state.get('cvDisplay', None)
+ if isinstance(cv_display, str):
+ try:
+ cv_display = json.loads(cv_display)
+ except Exception:
+ cv_display = None
+
+ return {
+ 'axis_display': axis_display,
+ 'cv_display': cv_display,
+ 'area_unit': cv_state.get('areaUnit'),
+ 'use_current_density': cv_state.get('useCurrentDensity'),
+ }
+
+ def __override_cv_density_label(self):
+ try:
+ info = self.__cv_display_info()
+ if not info:
+ return
+ axis_display = info.get('axis_display') or {}
+ cv_display = info.get('cv_display') or {}
+
+ x_label = axis_display.get('xLabel')
+ if x_label:
+ self.core.label['x'] = x_label
+
+ y_label = axis_display.get('yLabel')
+ if y_label:
+ mode = str(cv_display.get('mode') or '').lower()
+ use_density = bool(info.get('use_current_density')) or mode == 'density'
+ if use_density:
+ lowered = str(y_label).lower()
+ if 'density' in lowered or '/' in lowered:
+ self.core.label['y'] = y_label
+ else:
+ area_unit = info.get('area_unit') or 'cm²'
+ self.core.label['y'] = f"Current density ({y_label}/{area_unit})"
+ else:
+ self.core.label['y'] = y_label
+ except Exception:
+ pass
+
def __header_base(self):
return [
'\n',
@@ -58,26 +121,34 @@ def __get_nucleus(self):
return nucleus
def __header_nmr(self):
- return [
- '##.OBSERVE FREQUENCY={}\n'.format(
- extrac_dic(self.core, '.OBSERVEFREQUENCY')
- ),
- '##.OBSERVE NUCLEUS={}\n'.format(
- self.__get_nucleus()
- ),
- '##SPECTROMETER/DATA SYSTEM={}\n'.format(
- extrac_dic(self.core, 'SPECTROMETER/DATASYSTEM')
- ),
- '##.SHIFT REFERENCE={}\n'.format(
- extrac_dic(self.core, '.SHIFTREFERENCE')
- ),
- '##.SOLVENT NAME={}\n'.format(
- extrac_dic(self.core, '.SOLVENTNAME')
- ),
- '##.PULSE SEQUENCE={}\n'.format(
- extrac_dic(self.core, '.PULSESEQUENCE')
- ),
- ]
+ header_lines = []
+
+ # Append each line only if the extracted value is not empty
+ observe_frequency = extrac_dic(self.core, '.OBSERVEFREQUENCY')
+ if observe_frequency:
+ header_lines.append('##.OBSERVE FREQUENCY={}\n'.format(observe_frequency))
+
+ observe_nucleus = self.__get_nucleus()
+ if observe_nucleus:
+ header_lines.append('##.OBSERVE NUCLEUS={}\n'.format(observe_nucleus))
+
+ spectrometer_data_system = extrac_dic(self.core, 'SPECTROMETER/DATASYSTEM')
+ if spectrometer_data_system:
+ header_lines.append('##SPECTROMETER/DATA SYSTEM={}\n'.format(spectrometer_data_system))
+
+ shift_reference = extrac_dic(self.core, '.SHIFTREFERENCE')
+ if shift_reference:
+ header_lines.append('##.SHIFT REFERENCE={}\n'.format(shift_reference))
+
+ solvent_name = extrac_dic(self.core, '.SOLVENTNAME')
+ if solvent_name:
+ header_lines.append('##.SOLVENT NAME={}\n'.format(solvent_name))
+
+ pulse_sequence = extrac_dic(self.core, '.PULSESEQUENCE')
+ if pulse_sequence:
+ header_lines.append('##.PULSE SEQUENCE={}\n'.format(pulse_sequence))
+
+ return header_lines
def __header_params(self):
return [
@@ -167,15 +238,36 @@ def __get_xy_of_peak(self, peak):
return x, y
def __gen_cyclic_voltammetry_medadata(self):
+ meta = []
scan_rate = self.core.dic.get('SCANRATE', [0.1])[0]
x_values = self.core.xs
spectrum_direction = ''
if len(x_values) > 2:
spectrum_direction = 'NEGATIVE' if x_values[0] > x_values[1] else 'POSITIVE'
- return [
- f"##$CSSCANRATE={scan_rate}\n",
- f"##$CSSPECTRUMDIRECTION={spectrum_direction}\n"
- ]
+
+ cv_params = {}
+ if hasattr(self.core, 'params'):
+ cv_params = self.core.params.get('cyclicvolta', {}) or {}
+ if isinstance(cv_params, str):
+ cv_params = json.loads(cv_params)
+
+ area_value = cv_params.get('areaValue', '')
+ area_unit = cv_params.get('areaUnit', '')
+ use_current_density = cv_params.get('useCurrentDensity', False)
+
+ axis_length_unit = ''
+ if isinstance(area_unit, str):
+ if 'cm' in area_unit:
+ axis_length_unit = 'cm'
+ elif 'mm' in area_unit:
+ axis_length_unit = 'mm'
+
+ meta.append(f"##$CSSCANRATE={scan_rate}\n")
+ meta.append(f"##$CSSPECTRUMDIRECTION={spectrum_direction}\n")
+ meta.append(f"##$CSWEAREAVALUE={area_value}\n")
+ meta.append(f"##$CSWEAREAUNIT={area_unit}\n")
+ meta.append(f"##$CSCURRENTMODE={'DENSITY' if use_current_density else 'CURRENT'}\n")
+ return meta
def __gen_cyclic_voltammetry_data_peaks(self):
content = ['##$CSCYCLICVOLTAMMETRYDATA=\n']
@@ -287,18 +379,39 @@ def tf_img(self):
plt.rcParams['figure.dpi'] = 200
plt.rcParams['font.size'] = 14
+ cv_info = self.__cv_display_info() if self.core.is_cyclic_volta else None
+ self._cv_density_scale = 1.0
+ if cv_info:
+ cv_display = cv_info.get('cv_display') or {}
+ scale_val = cv_display.get('yScaleFactor', 1.0) if isinstance(cv_display, dict) else 1.0
+ try:
+ self._cv_density_scale = float(scale_val)
+ except Exception:
+ self._cv_density_scale = 1.0
+
# PLOT data
- plt.plot(self.core.xs, self.core.ys)
+ y_values = self.core.ys
+ if self.core.is_cyclic_volta and self._cv_density_scale != 1.0:
+ y_values = self.core.ys * self._cv_density_scale
+ plt.plot(self.core.xs, y_values)
x_max, x_min = self.core.boundary['x']['max'], self.core.boundary['x']['min'] # noqa: E501
xlim_left, xlim_right = [x_min, x_max] if (self.core.is_tga or self.core.is_gc or self.core.is_uv_vis or self.core.is_hplc_uv_vis or self.core.is_xrd or self.core.is_cyclic_volta or self.core.is_sec or self.core.is_cds or self.core.is_aif or self.core.is_emissions or self.core.is_dls_acf or self.core.is_dls_intensity) else [x_max, x_min] # noqa: E501
plt.xlim(xlim_left, xlim_right)
- y_max, y_min = np.max(self.core.ys), np.min(self.core.ys)
+ y_max, y_min = np.max(y_values), np.min(y_values)
h = y_max - y_min
w = x_max - x_min
y_boundary_min = y_min - h * 0.2
y_boundary_max = y_max + h * 0.5
+ if self.core.is_cyclic_volta:
+ ymax_abs = max(abs(y_min), abs(y_max))
+ if ymax_abs > 0:
+ self._cv_axis_exp = int(np.floor(np.log10(ymax_abs)))
+ else:
+ self._cv_axis_exp = 0
+ self._cv_axis_base = (10.0 ** self._cv_axis_exp) if self._cv_axis_exp != 0 else 1.0
+
# PLOT peaks
faktor = self.__fakto()
path_data = [
@@ -326,13 +439,9 @@ def tf_img(self):
y_peckers = []
x_peaks_ref, y_peaks_ref = [], []
if self.core.is_cyclic_volta:
+ display_scale = getattr(self, '_cv_density_scale', 1.0)
x_peaks = []
y_peaks = []
- formatter = ticker.ScalarFormatter(useMathText=True)
- formatter.set_scientific(True)
- formatter.set_powerlimits((-1, 1))
- plt.gca().yaxis.set_major_formatter(formatter)
-
listMaxMinPeaks = []
if self.core.params['list_max_min_peaks'] is not None:
listMaxMinPeaks = self.core.params['list_max_min_peaks']
@@ -372,6 +481,11 @@ def tf_img(self):
y_peckers.append(y_pecker)
# display x value of peak for cyclic voltammetry
+ if display_scale != 1.0:
+ y_peaks = [y * display_scale for y in y_peaks]
+ y_peckers = [y * display_scale for y in y_peckers]
+ y_peaks_ref = [y * display_scale for y in y_peaks_ref]
+
for i in range(len(x_peaks)):
x_pos = x_peaks[i]
y_pos = y_peaks[i] + h * 0.1
@@ -515,7 +629,7 @@ def tf_img(self):
self.__generate_info_box(plt)
- y_boundary_max = self.__draw_peaks(plt, x_peaks, y_peaks, h, w, y_boundary_max*1.5)
+ y_boundary_max = self.__draw_peaks(plt, x_peaks, y_peaks, h, w, y_boundary_max * (1.1 if self.core.is_ir else 1.5))
plt.ylim(
@@ -523,6 +637,35 @@ def tf_img(self):
y_boundary_max,
)
+ ax = plt.gca()
+ if self.core.is_cyclic_volta:
+ ymax_abs = max(abs(y_boundary_min), abs(y_boundary_max))
+ if ymax_abs > 0:
+ self._cv_axis_exp = int(np.floor(np.log10(ymax_abs)))
+ else:
+ self._cv_axis_exp = 0
+ print(f"[tf_img] ymax_abs={ymax_abs}, exp={self._cv_axis_exp}")
+ self._cv_axis_base = (10.0 ** self._cv_axis_exp) if self._cv_axis_exp != 0 else 1.0
+
+ ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda y, _:
+ f"{(y / self._cv_axis_base):.3g}"
+ ))
+ ax.yaxis.get_offset_text().set_visible(False)
+ if self._cv_axis_exp != 0:
+ ax.text(
+ 0.0, 1,
+ r"$\times 10^{%d}$" % self._cv_axis_exp,
+ transform=ax.transAxes,
+ ha='left', va='bottom',
+ fontsize=14,
+ clip_on=False
+ )
+ else:
+ fmt = ticker.ScalarFormatter(useMathText=True)
+ fmt.set_scientific(True)
+ fmt.set_powerlimits((-1, 1))
+ ax.yaxis.set_major_formatter(fmt)
+
# Save
tf_img = tempfile.NamedTemporaryFile(suffix='.png')
plt.savefig(tf_img, format='png')
@@ -806,224 +949,3 @@ def tf_csv(self):
})
return tf_csv
- def generate_nmrium(self, version=4, molfile_data=None):
- typ = self.core.typ
- if 'NMR' != typ:
- return None
-
- if version == 3:
- dic_data = self.__generate_nmrium_version_3(molfile_data=molfile_data)
- else:
- dic_data = self.__generate_nmrium_data(version=version, molfile_data=molfile_data)
-
- json_data = json.dumps(dic_data)
-
- tf_nmrium = tempfile.NamedTemporaryFile(suffix='.nmrium')
- tf_nmrium.write(bytes(json_data, 'UTF-8'))
- tf_nmrium.seek(0)
- return tf_nmrium
-
- def __generate_nmrium_version_3(self, molfile_data=None):
- dic_data = {'actionType': 'INITIATE', 'version': 3}
- spectra = self.__generate_nmrim_spectra()
- dic_data['spectra'] = spectra
- dic_data['molecules'] = self.__generate_molecules(molfile_data)
- return dic_data
-
- def __generate_nmrium_data(self, version, molfile_data=None):
- dic_data = {'version': version, 'data': {}, 'view': {}}
- spectra = self.__generate_nmrim_spectra()
- dic_data['data']['spectra'] = spectra
- dic_data['data']['molecules'] = self.__generate_molecules(molfile_data)
- return dic_data
-
- def __generate_nmrim_spectra(self):
- spectra = []
- spectra_id = str(uuid.uuid4())
-
- dic_spectra_data = {'id': spectra_id, 'source': {'jcampURL': None}}
- display_attr = {
- 'name': spectra_id,
- 'color':'#C10020',
- 'isVisible':True,
- 'isPeaksMarkersVisible':True,
- 'isRealSpectrumVisible':True,
- 'isVisibleInDomain':True}
- dic_spectra_data['display'] = display_attr
-
- spectra_info = {'nucleus':self.core.ncl, 'isFid':False, 'dimension':1, 'isFt':True, 'type': 'NMR SPECTRUM'}
- dic_spectra_data['info'] = spectra_info
- dic_spectra_data['meta'] = self.core.dic
-
- x_values = np.flip(self.core.xs)
- y_values = np.flip(self.core.ys)
- dic_data_points = {'x':x_values.tolist(), 're':y_values.tolist(), 'im':None}
- dic_spectra_data['data'] = dic_data_points
-
- peaks = self.__generate_nmrim_peaks()
- dic_spectra_data['peaks'] = peaks
-
- integrals = self.__generate_nmrim_integrals()
- dic_spectra_data['integrals'] = integrals
-
- ranges = self.__generate_nmrim_ranges()
- dic_spectra_data['ranges'] = ranges
-
- spectra = [dic_spectra_data]
-
- return spectra
-
- def __generate_nmrim_peaks(self):
- dic_peaks = {'values':[], 'options':{}}
-
- x_peaks = []
- y_peaks = []
- if self.core.edit_peaks:
- x_peaks = self.core.edit_peaks['x']
- y_peaks = self.core.edit_peaks['y']
- elif self.core.auto_peaks:
- x_peaks = self.core.auto_peaks['x']
- y_peaks = self.core.auto_peaks['y']
-
- if len(x_peaks) != len(y_peaks):
- return dic_peaks
-
- for idx in range(len(x_peaks)):
- x = x_peaks[idx]
- y = y_peaks[idx]
- peak_id = str(uuid.uuid4())
- peak = {'id':peak_id, 'x':x, 'y':y, 'originalX': x}
- dic_peaks['values'].append(peak)
-
- return dic_peaks
-
- def __generate_nmrim_integrals(self):
- dic_integrals = {'values':[], 'options':{'isSumConstant':True, 'sumAuto':True, 'sum':100}}
-
- refShift, refArea = self.refShift, self.refArea
- if (len(self.all_itgs) == 0 and len(self.core.itg_table) > 0 and not self.core.params['integration'].get('edited') and ('originStack' not in self.core.params['integration'])):
- core_itg_table = self.core.itg_table[0]
- itg_table = core_itg_table.split('\n')
- for itg in itg_table:
- clear_itg = itg.replace('(', '')
- clear_itg = clear_itg.replace(')', '')
- split_itg = clear_itg.split(',')
- if (len(split_itg) > 2):
- xLStr = split_itg[0].strip()
- xUStr = split_itg[1].strip()
- areaStr = split_itg[2].strip()
- self.all_itgs.append({'xL': float(xLStr), 'xU': float(xUStr), 'area': float(areaStr)}) # noqa: E501
- for itg in self.all_itgs:
- xL, xU, area = itg['xL'] - refShift, itg['xU'] - refShift, itg['area'] * refArea # noqa: E501
- iL, iU = get_curve_endpoint(self.core.xs, self.core.ys, xL, xU)
- cxs = self.core.xs[iL:iU]
- cys = self.core.ys[iL:iU]
-
- re_cxs = np.flip(cxs)
- re_cys = np.flip(cys)
-
- integral_id = str(uuid.uuid4())
-
- absolute_value = cal_xyIntegration(xs=re_cxs, ys=re_cys)
-
- integral = {'id':integral_id, 'originFrom':re_cxs[0], 'originTo':re_cxs[len(re_cxs)-1], 'from':re_cxs[0], 'to':re_cxs[len(re_cxs)-1], 'kind':'signal', 'absolute':absolute_value, 'integral':area*100}
-
- dic_integrals['values'].append(integral)
- return dic_integrals
-
- def __generate_nmrim_ranges(self):
- dic_ranges = {'values':[], 'options':{'isSumConstant':True, 'sumAuto':False, 'sum':100}}
-
- refShift, refArea = self.refShift, self.refArea
- if (len(self.mpys) == 0 and len(self.core.mpy_itg_table) > 0 and not self.core.params['integration'].get('edited') and ('originStack' not in self.core.params['integration'])):
- core_mpy_pks_table = self.core.mpy_pks_table[0]
- mpy_pks_table = core_mpy_pks_table.split('\n')
- tmp_dic_mpy_peaks = {}
- for peak in mpy_pks_table:
- clear_peak = peak.replace('(', '')
- clear_peak = clear_peak.replace(')', '')
- split_peak = clear_peak.split(',')
- idx_peakStr = split_peak[0].strip()
- xStr = split_peak[1].strip()
- yStr = split_peak[2].strip()
- if idx_peakStr not in tmp_dic_mpy_peaks:
- tmp_dic_mpy_peaks[idx_peakStr] = []
-
- tmp_dic_mpy_peaks[idx_peakStr].append({'x': float(xStr), 'y': float(yStr)})
-
- core_mpy_itg_table = self.core.mpy_itg_table[0]
- mpy_itg_table = core_mpy_itg_table.split('\n')
- for mpy in mpy_itg_table:
- clear_mpy = mpy.replace('(', '')
- clear_mpy = clear_mpy.replace(')', '')
- split_mpy = clear_mpy.split(',')
- mpy_item = { 'mpyType': '', 'xExtent': {'xL': 0.0, 'xU': 0.0}, 'yExtent': {'yL': 0.0, 'yU': 0.0}, 'peaks': [], 'area': 1.0 }
- if (len(split_mpy) > 7):
- idxStr = split_mpy[0].strip()
- xLStr = split_mpy[1].strip()
- xUStr = split_mpy[2].strip()
- mpy_item['xExtent']['xL'] = float(xLStr) + refShift
- mpy_item['xExtent']['xU'] = float(xUStr) + refShift
- yLStr = split_mpy[3].strip()
- yUStr = split_mpy[4].strip()
- mpy_item['yExtent']['yL'] = float(yLStr) + refShift
- mpy_item['yExtent']['yU'] = float(yUStr) + refShift
- areaStr = split_mpy[5].strip()
- mpy_item['area'] = float(areaStr)
- typeStr = split_mpy[6].strip()
- mpy_item['mpyType'] = typeStr
- mpy_item['peaks'] = tmp_dic_mpy_peaks[idxStr]
- self.mpys.append(mpy_item)
-
- total_integration_absolute = 0.0
- multiplicity_to_be_processed = self.mpys
-
- for mpy in multiplicity_to_be_processed:
- xL, xU, typ, peaks = mpy['xExtent']['xL'] - refShift, mpy['xExtent']['xU'] - refShift, mpy['mpyType'], mpy['peaks'] # noqa: E501
- iL, iU = get_curve_endpoint(self.core.xs, self.core.ys, xL, xU)
- cxs = self.core.xs[iL:iU]
- cys = self.core.ys[iL:iU]
-
- re_cxs = np.flip(cxs)
- re_cys = np.flip(cys)
-
- ranges_id = str(uuid.uuid4())
- mpy['ranges_id'] = ranges_id
-
- absolute_value = cal_xyIntegration(xs=re_cxs, ys=re_cys)
- mpy['absolute_value'] = absolute_value
- total_integration_absolute += absolute_value
-
- orgin_x_from, orgin_x_to = re_cxs[0], re_cxs[len(re_cxs)-1]
- mpy['orgin_x_from'] = orgin_x_from
- mpy['orgin_x_to'] = orgin_x_to
-
- for mpy in multiplicity_to_be_processed:
- typ, peaks = mpy['mpyType'], mpy['peaks'] # noqa: E501
- ranges_id, absolute_value = mpy['ranges_id'], mpy['absolute_value']
- orgin_x_from, orgin_x_to = mpy['orgin_x_from'], mpy['orgin_x_to']
-
- signal_id = str(uuid.uuid4())
- signal_delta = calc_mpy_center(mpy['peaks'], refShift, mpy['mpyType'])
-
- integration_value = (absolute_value / total_integration_absolute)*100
-
- signal_item = {'id':signal_id,'originDelta':signal_delta, 'delta':signal_delta, 'kind':'signal', 'integration':integration_value, 'multiplicity':typ, 'peaks':peaks}
-
- rang_item = {'id':ranges_id, 'originFrom':orgin_x_from, 'originTo':orgin_x_to, 'from':orgin_x_from, 'to':orgin_x_to, 'kind':'signal', 'absolute':absolute_value, 'integration':integration_value, 'signals':[signal_item]}
- dic_ranges['values'].append(rang_item)
-
- return dic_ranges
-
- def __generate_molecules(self, molfile_data):
- if molfile_data is None:
- return []
-
- molecule_id = str(uuid.uuid4())
- return [
- {
- 'id': molecule_id,
- 'label': 'P1',
- 'molfile': molfile_data
- }
- ]
diff --git a/chem_spectra/lib/converter/bagit/base.py b/chem_spectra/lib/converter/bagit/base.py
index 87d07138..f95a240b 100644
--- a/chem_spectra/lib/converter/bagit/base.py
+++ b/chem_spectra/lib/converter/bagit/base.py
@@ -1,30 +1,47 @@
import os
import base64
import tempfile
+import json
+import math
from chem_spectra.lib.converter.jcamp.base import JcampBaseConverter
from chem_spectra.lib.converter.jcamp.ni import JcampNIConverter
from chem_spectra.lib.converter.jcamp.ms import JcampMSConverter
from chem_spectra.lib.composer.ni import NIComposer
-from chem_spectra.lib.composer.ms import MSComposer
+from chem_spectra.lib.composer.lcms_converter_app import LCMSConverterAppComposer
from chem_spectra.lib.converter.share import parse_params
+from chem_spectra.lib.converter.bagit.lcms_builder import append_lcms_group
+import numpy as np # noqa: E402
import matplotlib.pyplot as plt # noqa: E402
+from matplotlib import ticker # noqa: E402
+
class BagItBaseConverter:
def __init__(self, target_dir, params=False, fname=''):
+ self.raw_params = params
self.params = parse_params(params)
+ self.archive_entry_stems = []
if target_dir is None:
self.data, self.images, self.list_csv, self.combined_image = None, None, None, None
else:
- self.data, self.images, self.list_csv, self.combined_image = self.__read(target_dir, fname)
+ ret = self.__read(target_dir, fname)
+ if ret is None:
+ self.data, self.images, self.list_csv, self.combined_image = None, None, None, None
+ else:
+ self.data, self.images, self.list_csv, self.combined_image = ret
def __read(self, target_dir, fname):
list_file_names = []
data_dir_path = os.path.join(target_dir, 'data')
+ flat_layout = not os.path.isdir(data_dir_path)
+ if flat_layout:
+ data_dir_path = target_dir
for (dirpath, dirnames, filenames) in os.walk(data_dir_path):
filenames.sort()
list_file_names.extend(filenames)
break
+ if flat_layout:
+ list_file_names = [n for n in list_file_names if n.lower().endswith('.jdx')]
if (len(list_file_names) == 0):
return None
@@ -32,21 +49,22 @@ def __read(self, target_dir, fname):
list_images = []
list_csv = []
list_composer = []
+ lcms_paths = []
+ archive_stems = []
for file_name in list_file_names:
jcamp_path = os.path.join(data_dir_path, file_name)
- base_cv = JcampBaseConverter(jcamp_path)
- if base_cv.typ == 'MS':
- mscv = JcampMSConverter(base_cv)
- mscp = MSComposer(mscv)
- list_composer.append(mscp)
- tf_jcamp = mscp.tf_jcamp()
- list_files.append(tf_jcamp)
- tf_img = mscp.tf_img()
- list_images.append(tf_img)
- tf_csv = mscp.tf_csv()
- list_csv.append(tf_csv)
+ stem = os.path.splitext(file_name)[0].replace('.', '_')
+ base_cv = JcampBaseConverter(jcamp_path, self.raw_params)
+ # BagIt / flat LCMS zips: keep all chromatogram and MS traces in one
+ # LCMSConverterAppComposer (incl. MASS SPECTRUM), not JcampMSConverter/ms.py.
+ if base_cv.typ in ('MS', 'LC/MS', 'UVVIS', 'HPLC UVVIS'):
+ lcms_paths.append(jcamp_path)
else:
- nicv = JcampNIConverter(base_cv)
+ try:
+ nicv = JcampNIConverter(base_cv)
+ except KeyError as err:
+ print(f"Skip empty JCAMP {file_name}: {err}")
+ continue
nicp = NIComposer(nicv)
list_composer.append(nicp)
tf_jcamp = nicp.tf_jcamp()
@@ -55,8 +73,16 @@ def __read(self, target_dir, fname):
list_images.append(tf_img)
tf_csv = nicp.tf_csv()
list_csv.append(tf_csv)
-
-
+ archive_stems.append(stem)
+
+ append_lcms_group(
+ lcms_paths, self.raw_params,
+ list_files, list_images, list_csv, list_composer,
+ archive_stems=archive_stems,
+ )
+
+ self.archive_entry_stems = archive_stems
+
combined_image = self.__combine_images(list_composer)
return list_files, list_images, list_csv, combined_image
@@ -73,18 +99,51 @@ def get_base64_data(self):
def __combine_images(self, list_composer, list_file_names = None):
if len(list_composer) <= 1:
return None
+ if any(isinstance(c, LCMSConverterAppComposer) for c in list_composer):
+ return None
if isinstance(list_composer[0].core, JcampMSConverter):
return None
plt.rcParams['figure.figsize'] = [16, 9]
plt.rcParams['font.size'] = 14
+ cv_mode = False
+ cv_abs_max = 0.0
for idx, composer in enumerate(list_composer):
filename = str(idx)
if (list_file_names is not None) and idx < len(list_file_names):
filename = list_file_names[idx]
xs, ys = composer.core.xs, composer.core.ys
+ y_values = ys
+ if composer.core.is_cyclic_volta:
+ cv_state = (
+ composer.core.params.get('cyclicvoltaSt')
+ or composer.core.params.get('cyclicvolta')
+ or composer.core.params.get('cyclic_volta')
+ ) or {}
+ if isinstance(cv_state, str):
+ try:
+ cv_state = json.loads(cv_state)
+ except Exception:
+ cv_state = {}
+ cv_display = cv_state.get('cvDisplay') or {}
+ if isinstance(cv_display, str):
+ try:
+ cv_display = json.loads(cv_display)
+ except Exception:
+ cv_display = {}
+ try:
+ scale = float(cv_display.get('yScaleFactor', 1.0))
+ except Exception:
+ scale = 1.0
+ if scale != 1.0:
+ y_values = ys * scale
+ cv_mode = True
+ try:
+ cv_abs_max = max(cv_abs_max, float(np.max(np.abs(y_values))))
+ except Exception:
+ pass
marker = ''
if composer.core.is_aif:
first_x, last_x = xs[0], xs[len(xs)-1]
@@ -95,7 +154,7 @@ def __combine_images(self, list_composer, list_file_names = None):
filename = 'DESORPTION'
marker = 'v'
- plt.plot(xs, ys, label=filename, marker=marker)
+ plt.plot(xs, y_values, label=filename, marker=marker)
# PLOT label
if (composer.core.is_xrd):
waveLength = composer.core.params['waveLength']
@@ -111,6 +170,24 @@ def __combine_images(self, list_composer, list_file_names = None):
else:
plt.ylabel("Y ({})".format(composer.core.label['y']), fontsize=18)
+ if cv_mode and cv_abs_max > 0:
+ exp = int(math.floor(math.log10(cv_abs_max))) if cv_abs_max > 0 else 0
+ base = (10.0 ** exp) if exp != 0 else 1.0
+ ax = plt.gca()
+ ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda y, _:
+ f"{(y / base):.3g}"
+ ))
+ ax.yaxis.get_offset_text().set_visible(False)
+ if exp != 0:
+ ax.text(
+ 0.0, 1,
+ r"$\times 10^{%d}$" % exp,
+ transform=ax.transAxes,
+ ha='left', va='bottom',
+ fontsize=14,
+ clip_on=False
+ )
+
plt.legend()
tf_img = tempfile.NamedTemporaryFile(suffix='.png')
plt.savefig(tf_img, format='png')
diff --git a/chem_spectra/lib/converter/bagit/lcms_builder.py b/chem_spectra/lib/converter/bagit/lcms_builder.py
new file mode 100644
index 00000000..b0198316
--- /dev/null
+++ b/chem_spectra/lib/converter/bagit/lcms_builder.py
@@ -0,0 +1,206 @@
+import logging
+import os
+import tempfile
+from typing import List, Optional, Tuple
+
+from chem_spectra.lib.composer.lcms_converter_app import (
+ LCMSConverterAppComposer,
+ has_uvvis_peak_marker,
+)
+from chem_spectra.lib.external.chemotion_converter_lcms import (
+ lcms_preview_image_from_jdx_files,
+)
+
+logger = logging.getLogger(__name__)
+
+_HEADER_SCAN_LINES = 200
+
+
+def _read_jcamp_header(path: str) -> Tuple[Optional[str], Optional[str]]:
+ data_type: Optional[str] = None
+ scan_mode: Optional[str] = None
+ try:
+ with open(path, 'r', encoding='utf-8', errors='ignore') as handle:
+ for _ in range(_HEADER_SCAN_LINES):
+ raw = handle.readline()
+ if not raw:
+ break
+ line = raw.strip()
+ if not line.startswith('##'):
+ if line:
+ continue
+ break
+ if '=' not in line:
+ continue
+ key, value = line[2:].split('=', 1)
+ key_norm = key.strip().lstrip('$').upper()
+ value_norm = value.strip()
+ if key_norm == 'DATA TYPE' and data_type is None:
+ data_type = value_norm
+ elif key_norm == 'SCAN_MODE' and scan_mode is None:
+ scan_mode = value_norm
+ if data_type and scan_mode:
+ break
+ except OSError:
+ return None, None
+ return data_type, scan_mode
+
+
+def _scan_mode_suffix(scan_mode: Optional[str]) -> Optional[str]:
+ if not scan_mode:
+ return None
+ lowered = scan_mode.lower()
+ if 'pos' in lowered:
+ return 'pos'
+ if 'neg' in lowered:
+ return 'neg'
+ return None
+
+
+def _semantic_stem_for(data_type: Optional[str], scan_mode: Optional[str]) -> Optional[str]:
+ if not data_type:
+ return None
+ dt = data_type.upper()
+ if 'UV-VIS' in dt or 'UV/VIS' in dt or 'ULTRAVIOLET' in dt:
+ return 'lcms_uvvis'
+ polarity = _scan_mode_suffix(scan_mode)
+ if 'MASS TIC' in dt or 'TOTAL ION CHROMATOGRAM' in dt or 'TOTAL ION CHROMATOGRAPHY' in dt:
+ return f'lcms_tic_{polarity}' if polarity else 'lcms_tic'
+ if 'MASS SPECTRUM' in dt:
+ return f'lcms_mz_{polarity}' if polarity else 'lcms_mz'
+ return None
+
+
+def classify_lcms_stems(jcamp_paths: List[str]) -> List[str]:
+ if not jcamp_paths:
+ return []
+
+ raw_stems = [os.path.splitext(os.path.basename(p))[0].replace('.', '_') for p in jcamp_paths]
+ semantic_stems: List[Optional[str]] = []
+ for path in jcamp_paths:
+ if has_uvvis_peak_marker(path):
+ semantic_stems.append('lcms_uvvis.peak')
+ continue
+ data_type, scan_mode = _read_jcamp_header(path)
+ semantic_stems.append(_semantic_stem_for(data_type, scan_mode))
+
+ counts: dict = {}
+ for stem in semantic_stems:
+ if stem:
+ counts[stem] = counts.get(stem, 0) + 1
+
+ resolved: List[str] = []
+ for raw, semantic in zip(raw_stems, semantic_stems):
+ if semantic and counts[semantic] == 1:
+ resolved.append(semantic)
+ else:
+ resolved.append(raw)
+ return resolved
+
+
+def _copy_to_named_tmp(path: str) -> tempfile.NamedTemporaryFile:
+ base = os.path.basename(path)
+ suffix = '_{}'.format(base) if base else (os.path.splitext(path)[1] or '')
+ tf = tempfile.NamedTemporaryFile(suffix=suffix)
+ with open(path, 'rb') as src:
+ tf.write(src.read())
+ tf.seek(0)
+ return tf
+
+
+def _close_silently(handles):
+ for handle in handles:
+ try:
+ handle.close()
+ except Exception:
+ pass
+
+
+def build_lcms_composer(
+ jcamp_paths,
+ params=None,
+) -> Optional[LCMSConverterAppComposer]:
+ if not jcamp_paths:
+ return None
+
+ ordered_paths: List[str] = sorted(jcamp_paths)
+
+ tmp_files: List[tempfile.NamedTemporaryFile] = []
+ try:
+ for path in ordered_paths:
+ tmp_files.append(_copy_to_named_tmp(path))
+ except Exception:
+ _close_silently(tmp_files)
+ return None
+
+ try:
+ preview = lcms_preview_image_from_jdx_files(tmp_files, params)
+ except Exception:
+ preview = None
+
+ return LCMSConverterAppComposer(tmp_files, preview, params)
+
+
+def append_lcms_group(
+ lcms_paths,
+ params,
+ list_files,
+ list_images,
+ list_csv,
+ list_composer,
+ archive_stems=None,
+):
+ if not lcms_paths:
+ return
+
+ try:
+ composer = build_lcms_composer(lcms_paths, params)
+ except Exception as err:
+ logger.warning(
+ "Skip LC/MS group (%d files): builder raised %s",
+ len(lcms_paths), err,
+ )
+ return
+
+ if composer is None or not composer.data:
+ logger.warning(
+ "Skip LC/MS group (%d files): no usable composer",
+ len(lcms_paths),
+ )
+ return
+
+ try:
+ composer.tf_jcamp()
+ except Exception as err:
+ logger.warning("LC/MS group: tf_jcamp failed (%s); using raw inputs", err)
+
+ try:
+ preview = composer.tf_img()
+ except Exception:
+ preview = None
+
+ try:
+ csv_file = composer.tf_csv()
+ except Exception:
+ csv_file = None
+
+ files = list(composer.data or [])
+ n = len(files)
+ if n == 0:
+ return
+
+ stems = classify_lcms_stems([f.name for f in files])
+ if archive_stems is not None:
+ archive_stems.extend(stems)
+
+ preview_idx = next(
+ (i for i, s in enumerate(stems) if s == 'lcms_uvvis'),
+ 0,
+ )
+ image_slots = [None] * n
+ image_slots[preview_idx] = preview
+
+ list_files.extend(files)
+ list_images.extend(image_slots)
+ list_csv.extend([csv_file] + [None] * (n - 1))
+ list_composer.extend([composer] * n)
diff --git a/chem_spectra/lib/converter/fid/base.py b/chem_spectra/lib/converter/fid/base.py
index 38494099..611c285b 100644
--- a/chem_spectra/lib/converter/fid/base.py
+++ b/chem_spectra/lib/converter/fid/base.py
@@ -35,7 +35,9 @@ def __read(self, target_dir, fname):
dic['XUNITS'] = ['PPM']
dic['YUNITS'] = ['ARBITRARY']
dic['TITLE'] = ['FID {}'.format('.'.join(fname.split('.')[:-1]))]
-
+ dic['$CSSOLVENTX'] = [f'{offset:.6f}']
+ dic['$CSSOLVENTVALUE'] = ['0.000000']
+ dic['$CSSOLVENTNAME'] = ['AUTO-OFFSET']
# process data (i.e. ys)
data = ng.bruker.remove_digital_filter(dic, data) # remove the digital filter # noqa: E501
data = ng.proc_base.zf_size(data, num_pts) # zero fill to 32768 points # noqa: E501
diff --git a/chem_spectra/lib/converter/fid/bruker.py b/chem_spectra/lib/converter/fid/bruker.py
index 41346dda..8d092284 100644
--- a/chem_spectra/lib/converter/fid/bruker.py
+++ b/chem_spectra/lib/converter/fid/bruker.py
@@ -46,7 +46,11 @@ def __read(self, target_dir, fname):
data.append(unprocessed_fid_conv)
for dir in processed_dirs:
- processed_dic, processed_data = ng.bruker.read_pdata(dir)
+ try:
+ processed_dic, processed_data = ng.bruker.read_pdata(dir)
+ except (OSError, FileNotFoundError):
+ # skip silently if no binaries like 1r/1i
+ continue
processed_dic = self.__process_dic(processed_dic, processed_data, fname)
@@ -78,7 +82,9 @@ def __process_dic(self, dic, data, fname):
processed_dic['XUNITS'] = ['PPM']
processed_dic['YUNITS'] = ['ARBITRARY']
processed_dic['TITLE'] = ['FID {}'.format('.'.join(fname.split('.')[:-1]))]
-
+ processed_dic['$CSSOLVENTX'] = [f'{offset:.6f}']
+ processed_dic['$CSSOLVENTVALUE'] = ['0.000000']
+ processed_dic['$CSSOLVENTNAME'] = ['AUTO-OFFSET']
return processed_dic
def __process_raw_data(self, dic, data):
@@ -102,4 +108,4 @@ def __process_raw_data(self, dic, data):
processed_data = ng.proc_base.di(processed_data) # discard the imaginaries
processed_data = ng.proc_base.rev(processed_data) # reverse the data
return processed_data
-
\ No newline at end of file
+
diff --git a/chem_spectra/lib/converter/jcamp/data_parse.py b/chem_spectra/lib/converter/jcamp/data_parse.py
index 0dff1ca6..f9701bd1 100644
--- a/chem_spectra/lib/converter/jcamp/data_parse.py
+++ b/chem_spectra/lib/converter/jcamp/data_parse.py
@@ -21,7 +21,7 @@ def __parse_xy_points(base):
def make_ni_data_ys(base, target_idx):
- if base.data is None and base.dic['XYPOINTS']:
+ if base.data is None and base.dic.get('XYPOINTS'):
base.data = __parse_xy_points(base)
elif base.data_format and base.data_format == '(XY..XY)':
base.data = __parse_xy_points(base)
@@ -54,8 +54,15 @@ def make_ni_data_xs(base):
def make_ms_data_xsys(base):
- if base.data is None and base.dic['XYPOINTS']:
- base.data = [__parse_xy_points(base)]
+ if base.data is None:
+ has_xy = bool(base.dic.get('XYPOINTS'))
+ has_xy_old = (
+ base.data_format
+ and base.data_format == '(XY..XY)'
+ and base.dic.get('XYDATA_OLD')
+ )
+ if has_xy or has_xy_old:
+ base.data = [__parse_xy_points(base)]
# base.data type is dict
if isinstance(base.data, dict):
diff --git a/chem_spectra/lib/converter/jcamp/data_type.json b/chem_spectra/lib/converter/jcamp/data_type.json
index 17f4a457..8a5dc5d2 100644
--- a/chem_spectra/lib/converter/jcamp/data_type.json
+++ b/chem_spectra/lib/converter/jcamp/data_type.json
@@ -16,6 +16,14 @@
"DLS ACF": ["DLS ACF"],
"DLS intensity": ["DLS INTENSITY", "DLS intensity"],
"DIFFERENTIAL SCANNING CALORIMETRY": ["DIFFERENTIAL SCANNING CALORIMETRY"],
- "GAS CHROMATOGRAPHY": ["GAS CHROMATOGRAPHY"]
+ "GAS CHROMATOGRAPHY": ["GAS CHROMATOGRAPHY"],
+ "LC/MS": [
+ "LC/MS",
+ "LCMS",
+ "LC-MS",
+ "MASS TIC",
+ "TOTAL ION CHROMATOGRAM",
+ "TOTAL ION CHROMATOGRAPHY"
+ ]
}
}
diff --git a/chem_spectra/lib/converter/jcamp/ms.py b/chem_spectra/lib/converter/jcamp/ms.py
index 1df71e68..1dac1786 100644
--- a/chem_spectra/lib/converter/jcamp/ms.py
+++ b/chem_spectra/lib/converter/jcamp/ms.py
@@ -1,5 +1,6 @@
from chem_spectra.lib.converter.jcamp.data_parse import make_ms_data_xsys
from chem_spectra.lib.converter.share import reduce_pts
+import numpy as np
MARGIN = 1
THRESHOLD_MS = 0.05
@@ -78,12 +79,19 @@ def __get_ratio(self, spc):
return ratio, noise_ratio
+ # Guarantees that the data passed to `reduce_pts` and subsequent operations
+ # conforms to the expected structure.
+ def __normalize_data(self, data):
+ if isinstance(data, np.ndarray) and data.ndim == 3 and data.shape[0] == 1:
+ return data[0]
+ return data
+
def __decode(self, runs):
spectra = []
best_ratio, best_idx, backup_ratio, backup_idx = 0, 0, 0, 0
for idx, data in enumerate(runs):
+ data = self.__normalize_data(data)
spectra.append(reduce_pts(data))
-
ratio, noise_ratio = self.__get_ratio(data)
if (best_ratio < ratio) and (noise_ratio <= 50.0):
best_idx = idx
@@ -117,4 +125,4 @@ def __set_datatables(self):
)
)
dts.append({'dt': dt, 'pts': pts})
- return dts
+ return dts
\ No newline at end of file
diff --git a/chem_spectra/lib/converter/ms.py b/chem_spectra/lib/converter/ms.py
index 6a1d7942..a6185699 100644
--- a/chem_spectra/lib/converter/ms.py
+++ b/chem_spectra/lib/converter/ms.py
@@ -90,6 +90,7 @@ def __build_cmd_msconvert(self):
'/data/{}/{}'.format(self.hash_str, self.tf.name.split('/')[-1]),
'-o',
'/data/{}'.format(self.hash_str),
+ '--simAsSpectra',
'--32',
'--zlib',
'--filter',
diff --git a/chem_spectra/lib/converter/nmrium/base.py b/chem_spectra/lib/converter/nmrium/base.py
index f32ee0ec..5340591b 100644
--- a/chem_spectra/lib/converter/nmrium/base.py
+++ b/chem_spectra/lib/converter/nmrium/base.py
@@ -32,6 +32,8 @@ def __init__(self, file=None):
self.__read_info(spectrum_data)
if (self.is_2d == False):
self.data = self.__parsing_xy_values(spectrum_data)
+ if self.data is None:
+ return
self.boundary = self.__find_boundary()
@@ -134,6 +136,8 @@ def __parsing_xy_values(self, spectrumData):
if spectrumData is None:
return None
x_values, y_values = self.__read_xy_values(spectrumData)
+ if x_values is None or y_values is None or len(x_values) == 0:
+ return None
self.xs = np.array(x_values)
self.xs = np.flip(self.xs)
@@ -167,9 +171,16 @@ def __read_xy_values(self, spectrum):
if spectrum is None:
return None, None
- data = spectrum['data']
- x_values = data['x']
- y_values = data['re']
+ try:
+ data = spectrum.get('data')
+ if not data:
+ return None, None
+ x_values = data.get('x')
+ y_values = data.get('re')
+ if x_values is None or y_values is None:
+ return None, None
+ except Exception:
+ return None, None
return x_values, y_values
diff --git a/chem_spectra/lib/converter/share.py b/chem_spectra/lib/converter/share.py
index e98563d4..69aadcc0 100644
--- a/chem_spectra/lib/converter/share.py
+++ b/chem_spectra/lib/converter/share.py
@@ -26,6 +26,9 @@ def parse_params(params):
'axesUnits': None,
'detector': None,
'dsc_meta_data': None,
+ 'lcms_uvvis_wavelength': None,
+ 'lcms_mz_page': None,
+ 'lcms_mz_page_data': None,
}
select_x = params.get('select_x', None)
@@ -71,6 +74,9 @@ def parse_params(params):
detector = json.loads(detector) if detector else None
dsc_meta_data = params.get('dsc_meta_data')
dsc_meta_data = json.loads(dsc_meta_data) if dsc_meta_data else None
+ lcms_uvvis_wavelength = params.get('lcms_uvvis_wavelength')
+ lcms_mz_page = params.get('lcms_mz_page')
+ lcms_mz_page_data = params.get('lcms_mz_page_data')
if (cyclicvolta is not None):
spectraList = cyclicvolta['spectraList']
if (len(spectraList) > 0):
@@ -105,6 +111,9 @@ def parse_params(params):
'user_data_type_mapping': user_data_type_mapping,
'detector': detector,
'dsc_meta_data': dsc_meta_data,
+ 'lcms_uvvis_wavelength': lcms_uvvis_wavelength,
+ 'lcms_mz_page': lcms_mz_page,
+ 'lcms_mz_page_data': lcms_mz_page_data,
}
diff --git a/chem_spectra/lib/external/__init__.py b/chem_spectra/lib/external/__init__.py
new file mode 100644
index 00000000..139597f9
--- /dev/null
+++ b/chem_spectra/lib/external/__init__.py
@@ -0,0 +1,2 @@
+
+
diff --git a/chem_spectra/lib/external/chemotion_converter_lcms.py b/chem_spectra/lib/external/chemotion_converter_lcms.py
new file mode 100644
index 00000000..2802112c
--- /dev/null
+++ b/chem_spectra/lib/external/chemotion_converter_lcms.py
@@ -0,0 +1,1299 @@
+import io
+import json
+import os
+import re
+import tempfile
+from pathlib import Path
+from typing import Dict, List, Optional, Tuple
+
+import pandas as pd
+
+
+def _strip_archive_suffix(name: str) -> str:
+ lower = name.lower()
+ for suffix in (".tar.gz", ".tgz", ".tar.xz", ".tar", ".zip"):
+ if lower.endswith(suffix):
+ return name[: -len(suffix)]
+ return Path(name).stem
+
+
+def _strip_lcms_tmp_prefix(name: str) -> str:
+ if not name:
+ return name
+ lowered = name.lower()
+ if lowered.startswith("tmp") and "_" in name:
+ candidate = name.split("_", 1)[1]
+ cand_lower = candidate.lower()
+ if any(token in cand_lower for token in ("uvvis", "tic", "mz", "lcms", "chemstation")):
+ return candidate
+ return name
+
+
+def _normalize_lcms_preview_base(name: str) -> Optional[str]:
+ if not name:
+ return None
+ raw = os.path.basename(str(name))
+ raw = _strip_lcms_tmp_prefix(raw)
+ base = _strip_archive_suffix(raw)
+ base = base.rstrip("_-")
+ return base or None
+
+
+def _lcms_preview_basename(paths: List[str], params: Optional[Dict]) -> Optional[str]:
+ candidates: List[str] = []
+ if isinstance(params, dict):
+ for key in ("fname", "filename", "name"):
+ value = params.get(key)
+ if value:
+ candidates.append(str(value))
+ for entry in paths:
+ candidates.append(entry)
+ if candidates:
+ normalized = [b for b in (_normalize_lcms_preview_base(c) for c in candidates) if b]
+ if normalized:
+ if len(normalized) > 1:
+ prefix = os.path.commonprefix(normalized)
+ if prefix:
+ return prefix.rstrip("_-")
+ return normalized[0]
+ return None
+
+
+class _NamedFile:
+ def __init__(self, fp, tmp_dir: tempfile.TemporaryDirectory):
+ self._fp = fp
+ self._tmp_dir = tmp_dir
+ self.name = fp.name
+
+ def __getattr__(self, name):
+ return getattr(self._fp, name)
+
+ def close(self):
+ try:
+ self._fp.close()
+ finally:
+ try:
+ self._tmp_dir.cleanup()
+ except Exception:
+ pass
+
+
+def _write_named_file(content: bytes, filename: str) -> _NamedFile:
+ tmp_dir = tempfile.TemporaryDirectory(prefix="chemotion_lcms_")
+ path = os.path.join(tmp_dir.name, filename)
+ fp = open(path, "w+b")
+ fp.write(content)
+ fp.seek(0)
+ return _NamedFile(fp, tmp_dir)
+
+
+def _as_float(value) -> Optional[float]:
+ try:
+ return float(value)
+ except (TypeError, ValueError):
+ return None
+
+
+_FLOAT_RE = re.compile(r"[-+]?(?:\d+\.\d*|\.\d+|\d+)(?:[eE][-+]?\d+)?")
+
+
+def _float_from_label(value) -> Optional[float]:
+ if value is None:
+ return None
+ text = str(value).strip().replace(",", ".")
+ direct = _as_float(text)
+ if direct is not None:
+ return direct
+ match = _FLOAT_RE.search(text)
+ if not match:
+ return None
+ return _as_float(match.group(0))
+
+
+def _format_number(value: Optional[float]) -> Optional[str]:
+ if value is None:
+ return None
+ try:
+ return f"{float(value):g}"
+ except (TypeError, ValueError):
+ return None
+
+
+def _format_wavelength_label(value) -> Optional[str]:
+ numeric = _float_from_label(value)
+ if numeric is not None:
+ return f"{_format_number(numeric)} nm"
+ if value is None:
+ return None
+ text = str(value).strip()
+ return f"{text} nm" if text else None
+
+
+def _format_ms_page_label(value) -> Optional[str]:
+ numeric = _float_from_label(value)
+ if numeric is not None:
+ return _format_number(numeric)
+ if value is None:
+ return None
+ text = str(value).strip()
+ return text if text else None
+
+
+def _format_rt_label(value) -> Optional[str]:
+ numeric = _float_from_label(value)
+ if numeric is None:
+ return None
+ return f"{_format_number(numeric)} min"
+
+
+def _extract_ms_peaks_from_param(value) -> List[Tuple[float, float]]:
+ if not value:
+ return []
+
+ data = value
+ if isinstance(data, str):
+ raw = data.strip()
+ if not raw:
+ return []
+ try:
+ data = json.loads(raw)
+ except Exception:
+ return []
+
+ if not isinstance(data, list):
+ return []
+
+ peaks: List[Tuple[float, float]] = []
+ for item in data:
+ if not isinstance(item, dict):
+ continue
+ mz = _as_float(item.get("x"))
+ intensity = _as_float(item.get("y"))
+ if mz is None or intensity is None:
+ continue
+ peaks.append((mz, intensity))
+ return peaks
+
+
+def _extract_xy_from_lines(lines: List[str], start_idx: int) -> Tuple[List[float], List[float]]:
+ xs: List[float] = []
+ ys: List[float] = []
+ for line in lines[start_idx:]:
+ stripped = line.strip()
+ if not stripped:
+ continue
+ upper = stripped.upper()
+ if upper.startswith("##") or upper.startswith("$$"):
+ break
+ numbers = _FLOAT_RE.findall(stripped.replace(";", " "))
+ if len(numbers) < 2:
+ continue
+ for idx in range(0, len(numbers) - 1, 2):
+ x_val = _as_float(numbers[idx])
+ y_val = _as_float(numbers[idx + 1])
+ if x_val is None or y_val is None:
+ continue
+ xs.append(x_val)
+ ys.append(y_val)
+ return xs, ys
+
+
+def _extract_xy_from_jdx_content(content: str) -> Tuple[List[float], List[float]]:
+ lines = content.splitlines()
+ data_start = None
+ for idx, line in enumerate(lines):
+ upper = line.upper()
+ if "##DATA TABLE" in upper or "##PEAK TABLE" in upper or "##XYDATA" in upper:
+ data_start = idx + 1
+ break
+ if data_start is None:
+ return [], []
+ return _extract_xy_from_lines(lines, data_start)
+
+
+def _extract_ms_page(
+ content: str,
+ target_page=None,
+ *,
+ first_page_only: bool = False,
+) -> Tuple[List[float], List[float], Optional[float], Optional[str]]:
+ """Parse MS JCAMP. If ``first_page_only`` and ``target_page`` is None, return after the first spectrum block."""
+ lines = content.splitlines()
+ threshold = None
+ for line in lines:
+ if line.upper().startswith("##$CSTHRESHOLD"):
+ _, _, raw = line.partition("=")
+ threshold = _as_float(raw.strip())
+ break
+ if threshold is not None and threshold > 1.0:
+ threshold = threshold / 100.0
+ pages: List[Tuple[str, List[float], List[float]]] = []
+ current_label = None
+ for idx, line in enumerate(lines):
+ stripped = line.strip()
+ upper = stripped.upper()
+ if upper.startswith("##PAGE="):
+ current_label = stripped.split("=", 1)[1].strip()
+ continue
+ if current_label and ("##DATA TABLE" in upper or "##PEAK TABLE" in upper or "##XYDATA" in upper):
+ xs, ys = _extract_xy_from_lines(lines, idx + 1)
+ if xs and ys:
+ if first_page_only and target_page is None:
+ return xs, ys, threshold, current_label
+ pages.append((current_label, xs, ys))
+ continue
+
+ if not pages:
+ xs, ys = _extract_xy_from_jdx_content(content)
+ return xs, ys, threshold, None
+
+ target_label = None
+ if target_page is not None:
+ target_val = _float_from_label(target_page)
+ if target_val is not None:
+ numeric_pages = [(label, _float_from_label(label), xs, ys) for label, xs, ys in pages]
+ numeric_only = [p for p in numeric_pages if p[1] is not None]
+ if numeric_only:
+ target_label = min(numeric_only, key=lambda p: abs(p[1] - target_val))[0]
+ if target_label is None:
+ target_str = str(target_page).strip()
+ for label, _xs, _ys in pages:
+ if str(label).strip() == target_str:
+ target_label = label
+ break
+
+ for label, xs, ys in pages:
+ if target_label is None or label == target_label:
+ return xs, ys, threshold, label
+ return pages[0][1], pages[0][2], threshold, pages[0][0]
+
+
+def _mz_page_param_explicit(mz_page) -> bool:
+ """True when the client asked for a specific MS page / RT (not default first page)."""
+ if mz_page is None:
+ return False
+ return bool(str(mz_page).strip())
+
+
+def _extract_ms_page_first_page_from_path(path: str) -> Tuple[List[float], List[float], Optional[float], Optional[str]]:
+ """Read MZ JCAMP line-by-line; stop after the first spectrum block (preview / fresh upload).
+
+ Avoids loading multi-hundred-MB files and parsing every ##PAGE block.
+ """
+ threshold: Optional[float] = None
+ lines: List[str] = []
+ current_label: Optional[str] = None
+ try:
+ with open(path, "r", encoding="utf-8", errors="ignore") as handle:
+ for raw in handle:
+ line = raw.rstrip("\n\r")
+ lines.append(line)
+ idx = len(lines) - 1
+ lu = line.upper()
+ if lu.startswith("##$CSTHRESHOLD"):
+ _, _, r = line.partition("=")
+ threshold = _as_float(r.strip())
+ continue
+ stripped = line.strip()
+ upper = stripped.upper()
+ if upper.startswith("##PAGE="):
+ current_label = stripped.split("=", 1)[1].strip()
+ continue
+ if current_label and (
+ "##DATA TABLE" in upper
+ or "##PEAK TABLE" in upper
+ or "##XYDATA" in upper
+ ):
+ xs, ys = _extract_xy_from_lines(lines, idx + 1)
+ if xs and ys:
+ thr = threshold
+ if thr is not None and thr > 1.0:
+ thr = thr / 100.0
+ return xs, ys, thr, current_label
+ except OSError:
+ pass
+
+ try:
+ with open(path, "r", encoding="utf-8", errors="ignore") as handle:
+ content = handle.read()
+ except OSError:
+ return [], [], None, None
+ return _extract_ms_page(content, None, first_page_only=True)
+
+
+def _extract_uvvis_from_peak_content(content: str, target_wavelength=None):
+ if "CHEMSPECTRA UVVIS PEAK TABLE" not in content:
+ return None
+ try:
+ import numpy as np # type: ignore
+ except Exception:
+ return None
+
+ data_by_wavelength = {}
+ peaks_by_wavelength = {}
+ integrations_by_wavelength = {}
+
+ sections = content.split("$$ === CHEMSPECTRA UVVIS PEAK TABLE ===")
+ for section in sections[1:]:
+ wavelength = None
+ for line in section.split("\n"):
+ if line.startswith("##PAGE="):
+ try:
+ wavelength = float(line.replace("##PAGE=", "").strip())
+ except (ValueError, AttributeError):
+ wavelength = line.replace("##PAGE=", "").strip()
+ break
+ if wavelength is None:
+ continue
+
+ xs = []
+ ys = []
+ in_data_section = False
+ for line in section.split("\n"):
+ if "##DATA TABLE=" in line.upper():
+ in_data_section = True
+ continue
+ if "##END=" in line or "$$" in line:
+ break
+ if in_data_section and line.strip() and not line.strip().startswith("##"):
+ cleaned = line.replace(";", "").strip()
+ if not cleaned:
+ continue
+ parts = cleaned.split(",")
+ if len(parts) >= 2:
+ x_val = _as_float(parts[0].strip())
+ y_val = _as_float(parts[1].strip())
+ if x_val is not None and y_val is not None:
+ xs.append(x_val)
+ ys.append(y_val)
+
+ if xs and ys:
+ data_by_wavelength[wavelength] = (xs, ys)
+
+ edit_sections = content.split("$$ === CHEMSPECTRA PEAK TABLE EDIT ===")
+ for section in edit_sections[1:]:
+ wavelength = None
+ for line in section.split("\n"):
+ if line.startswith("##PAGE="):
+ try:
+ wavelength = float(line.replace("##PAGE=", "").strip())
+ except (ValueError, AttributeError):
+ wavelength = line.replace("##PAGE=", "").strip()
+ break
+ if wavelength is None:
+ continue
+
+ peaks = []
+ in_peak_section = False
+ for line in section.split("\n"):
+ if "##PEAKTABLE=" in line.upper():
+ in_peak_section = True
+ continue
+ if "##END=" in line or "$$" in line:
+ break
+ if in_peak_section and line.strip() and not line.strip().startswith("##"):
+ parts = line.strip().split(",")
+ if len(parts) >= 2:
+ x_val = _as_float(parts[0].strip())
+ y_val = _as_float(parts[1].strip())
+ if x_val is not None and y_val is not None:
+ peaks.append({"x": x_val, "y": y_val})
+ if peaks:
+ peaks_by_wavelength[wavelength] = peaks
+
+ intg_sections = content.split("$$ === CHEMSPECTRA INTEGRALS AND MULTIPLETS ===")
+ for section in intg_sections[1:]:
+ wavelength = None
+ for line in section.split("\n"):
+ if line.startswith("##PAGE="):
+ try:
+ wavelength = float(line.replace("##PAGE=", "").strip())
+ except (ValueError, AttributeError):
+ wavelength = line.replace("##PAGE=", "").strip()
+ break
+ if wavelength is None:
+ continue
+
+ integrations = []
+ in_intg_section = False
+ for line in section.split("\n"):
+ if "##$OBSERVEDINTEGRALS=" in line.upper():
+ in_intg_section = True
+ continue
+ if "##END=" in line or "$$" in line:
+ break
+ if in_intg_section and line.strip() and not line.strip().startswith("##"):
+ cleaned = line.strip().replace("(", "").replace(")", "")
+ parts = cleaned.split(",")
+ if len(parts) >= 3:
+ x_left = _as_float(parts[0].strip())
+ x_right = _as_float(parts[1].strip())
+ area = _as_float(parts[2].strip())
+ if x_left is not None and x_right is not None and area is not None:
+ integrations.append({"xL": x_left, "xU": x_right, "area": area})
+ if integrations:
+ integrations_by_wavelength[wavelength] = integrations
+
+ if not data_by_wavelength:
+ return None
+
+ def _to_float_or_none(value):
+ try:
+ return float(value)
+ except Exception:
+ return None
+
+ numeric_pairs = [(wl, _to_float_or_none(wl)) for wl in data_by_wavelength.keys()]
+ numeric_only = [p for p in numeric_pairs if p[1] is not None]
+
+ wl_key = None
+ if target_wavelength is not None:
+ if target_wavelength in data_by_wavelength:
+ wl_key = target_wavelength
+ else:
+ target_val = _to_float_or_none(target_wavelength)
+ if target_val is not None and numeric_only:
+ wl_key = min(numeric_only, key=lambda p: abs(p[1] - target_val))[0]
+ if wl_key is None:
+ wl_key = min(numeric_only, key=lambda p: p[1])[0] if numeric_only else list(data_by_wavelength.keys())[0]
+
+ xs, ys = data_by_wavelength[wl_key]
+ xs = np.asarray(xs, float)
+ ys = np.asarray(ys, float)
+
+ edit_peaks = peaks_by_wavelength.get(wl_key, [])
+ integrations = integrations_by_wavelength.get(wl_key, [])
+ return xs, ys, edit_peaks, integrations, wl_key
+
+
+def _pick_jdx_path(paths: List[str], primary_token: str, fallback_token: Optional[str] = None) -> Optional[str]:
+ lowered = [(p, os.path.basename(p).lower()) for p in paths]
+ for p, name in lowered:
+ if primary_token in name:
+ return p
+ if fallback_token:
+ for p, name in lowered:
+ if fallback_token in name:
+ return p
+ return None
+
+
+def _header_from_content(content: str, limit: int = 200) -> Dict[str, str]:
+ header: Dict[str, str] = {}
+ for line in content.splitlines()[:limit]:
+ if not line.startswith("##"):
+ continue
+ if "=" not in line:
+ continue
+ key, value = line[2:].split("=", 1)
+ header[key.strip()] = value.strip()
+ return header
+
+
+def _classify_lcms_content(content: str) -> Optional[str]:
+ header = _header_from_content(content)
+ kind, _ = _classify_lcms_header(header)
+ return kind
+
+
+def _normalize_params(params: Optional[Dict]) -> Dict:
+ if not params:
+ return {}
+ if isinstance(params, dict):
+ integration = params.get("integration")
+ if isinstance(integration, dict):
+ return params
+ try:
+ from chem_spectra.lib.converter.share import parse_params # type: ignore
+ except Exception:
+ return params if isinstance(params, dict) else {}
+ try:
+ return parse_params(params)
+ except Exception:
+ return params if isinstance(params, dict) else {}
+
+
+def _extract_uvvis_pages(content: str) -> List[Tuple[Optional[float], List[float], List[float]]]:
+ lines = content.splitlines()
+ pages: List[Tuple[Optional[float], List[float], List[float]]] = []
+ current_page: Optional[float] = None
+ for idx, line in enumerate(lines):
+ stripped = line.strip()
+ upper = stripped.upper()
+ if upper.startswith("##PAGE="):
+ current_page = _float_from_label(stripped.split("=", 1)[1].strip())
+ continue
+ if "##DATA TABLE" in upper or "##PEAK TABLE" in upper or "##XYDATA" in upper:
+ xs, ys = _extract_xy_from_lines(lines, idx + 1)
+ if xs and ys:
+ pages.append((current_page, xs, ys))
+ if pages:
+ return pages
+
+ xs, ys = _extract_xy_from_jdx_content(content)
+ if not xs or not ys:
+ return []
+ return [(None, xs, ys)]
+
+
+def _uvvis_units_from_content(content: str) -> Tuple[Optional[str], Optional[str]]:
+ header = _header_from_content(content)
+ return _header_value(header, "XUNITS"), _header_value(header, "YUNITS")
+
+
+def lcms_uvvis_units_from_jdx(jdx_path: str) -> Tuple[Optional[str], Optional[str]]:
+ if not jdx_path or not os.path.exists(jdx_path):
+ return None, None
+ try:
+ with open(jdx_path, "r", encoding="utf-8", errors="ignore") as handle:
+ content = handle.read()
+ return _uvvis_units_from_content(content)
+ except Exception:
+ return None, None
+
+
+def _lc_df_from_uvvis_content(content: str) -> Optional[pd.DataFrame]:
+ pages = _extract_uvvis_pages(content)
+ if not pages:
+ return None
+ rows = []
+ for wavelength, xs, ys in pages:
+ page_wavelength = wavelength if wavelength is not None else 0.0
+ for x_val, y_val in zip(xs, ys):
+ rows.append(
+ {
+ "RetentionTime": x_val,
+ "DetectorSignal": y_val,
+ "wavelength": page_wavelength,
+ }
+ )
+ if not rows:
+ return None
+ return pd.DataFrame(rows, columns=["RetentionTime", "DetectorSignal", "wavelength"])
+
+
+def _header_value(header: Dict, key: str) -> Optional[str]:
+ for k, v in header.items():
+ if str(k).strip().lower() == key.lower():
+ return str(v)
+ return None
+
+
+def _classify_lcms_header(header: Dict) -> Tuple[Optional[str], Optional[str]]:
+ category = _header_value(header, "$CSCATEGORY") or _header_value(header, "CSCATEGORY")
+ ntuples_id = _header_value(header, "NTUPLES_ID")
+ data_type = _header_value(header, "DATA TYPE")
+ data_class = _header_value(header, "DATA CLASS")
+ x_units = _header_value(header, "XUNITS")
+ y_units = _header_value(header, "YUNITS")
+ scan_mode = _header_value(header, "SCAN_MODE") or _header_value(header, "$SCAN_MODE")
+ ion_mode = _header_value(header, "ION_MODE") or _header_value(header, "$ION_MODE")
+ mode = _header_value(header, "MODE") or _header_value(header, "$MODE")
+ polarity_header = _header_value(header, "POLARITY") or _header_value(header, "$POLARITY")
+ combined = " ".join([v for v in [category, ntuples_id, data_type] if v])
+ combined_upper = combined.upper()
+
+ kind: Optional[str] = None
+ if "UVVIS" in combined_upper or "UV/VIS" in combined_upper or "UV-VIS" in combined_upper or "UV VIS" in combined_upper:
+ kind = "uvvis"
+ elif "TIC" in combined_upper:
+ kind = "tic"
+ elif "MZ" in combined_upper or "M/Z" in combined_upper or "MASS SPECTRUM" in combined_upper:
+ kind = "mz"
+ if not kind and data_class and "XYPOINTS" in data_class.upper():
+ data_type_upper = data_type.upper() if data_type else ""
+ x_units_upper = x_units.upper() if x_units else ""
+ y_units_upper = y_units.upper() if y_units else ""
+ if "LC/MS" in data_type_upper or "MASS TIC" in data_type_upper or "TIC" in data_type_upper:
+ kind = "tic"
+ elif "MINUTE" in x_units_upper and "INTENS" in y_units_upper:
+ kind = "tic"
+ if not kind:
+ return None, None
+
+ polarity_combined_upper = " ".join(
+ [v for v in [combined, scan_mode, ion_mode, mode, polarity_header] if v]
+ ).upper()
+ polarity: Optional[str] = None
+ if "NEG" in polarity_combined_upper or "MINUS" in polarity_combined_upper:
+ polarity = "minus"
+ elif "POS" in polarity_combined_upper or "PLUS" in polarity_combined_upper:
+ polarity = "plus"
+ return kind, polarity
+
+
+def lcms_preview_image_from_jdx_files(
+ jdx_files: List,
+ params: Optional[Dict] = None,
+) -> Optional[tempfile.NamedTemporaryFile]:
+ """Build LC/MS preview PNG."""
+ if not jdx_files:
+ return None
+ paths: List[str] = []
+ for entry in jdx_files:
+ if isinstance(entry, str):
+ paths.append(entry)
+ else:
+ path = getattr(entry, "name", None)
+ if path:
+ paths.append(path)
+ if not paths:
+ return None
+
+ normalized_params = _normalize_params(params)
+ uvvis_wavelength = normalized_params.get("lcms_uvvis_wavelength")
+ mz_page = normalized_params.get("lcms_mz_page")
+ mz_page_data = normalized_params.get("lcms_mz_page_data")
+ ms_threshold_from_param = _as_float(normalized_params.get("thres"))
+ selected_ms_peaks = _extract_ms_peaks_from_param(mz_page_data)
+
+ peak_path = _pick_jdx_path(paths, "uvvis.peak", "peak.jdx")
+ mz_path = _pick_jdx_path(paths, "_mz", "mz")
+
+ if not peak_path:
+ for path in paths:
+ try:
+ with open(path, "r", encoding="utf-8", errors="ignore") as handle:
+ content = handle.read()
+ if "CHEMSPECTRA UVVIS PEAK TABLE" in content:
+ peak_path = path
+ break
+ except Exception:
+ continue
+
+ if not mz_path:
+ for path in paths:
+ if path == peak_path:
+ continue
+ try:
+ with open(path, "r", encoding="utf-8", errors="ignore") as handle:
+ content = handle.read()
+ kind = _classify_lcms_content(content)
+ if kind == "mz" and not mz_path:
+ mz_path = path
+ except Exception:
+ continue
+
+ uvvis_data = None
+ uvvis_label = None
+ uvvis_x_units = None
+ if peak_path:
+ try:
+ with open(peak_path, "r", encoding="utf-8", errors="ignore") as handle:
+ uvvis_content = handle.read()
+ uvvis_data = _extract_uvvis_from_peak_content(uvvis_content, uvvis_wavelength)
+ if uvvis_data:
+ uvvis_label = _format_wavelength_label(uvvis_data[4])
+ uvvis_x_units, _ = _uvvis_units_from_content(uvvis_content)
+ except Exception:
+ uvvis_data = None
+
+ ms_data = None
+ ms_threshold = None
+ ms_page_label = _format_ms_page_label(mz_page)
+ ms_rt = _float_from_label(mz_page)
+ ms_rt_label = _format_rt_label(ms_rt)
+ if mz_path:
+ try:
+ if selected_ms_peaks:
+ # Pics MS déjà fournis par l'ELN : inutile de lire tout le JCAMP MZ.
+ ms_data = None
+ elif _mz_page_param_explicit(mz_page):
+ with open(mz_path, "r", encoding="utf-8", errors="ignore") as handle:
+ mz_content = handle.read()
+ ms_data = _extract_ms_page(mz_content, mz_page, first_page_only=False)
+ else:
+ # Nouvel upload : uniquement la première page, lecture flux (arrêt après 1er spectre).
+ ms_data = _extract_ms_page_first_page_from_path(mz_path)
+
+ if ms_data and ms_data[0]:
+ ms_threshold = ms_data[2]
+ ms_page_label = _format_ms_page_label(ms_data[3]) or _format_ms_page_label(mz_page)
+ if ms_rt is None:
+ ms_rt = _float_from_label(ms_data[3])
+ ms_rt_label = _format_rt_label(ms_rt)
+ except Exception:
+ ms_data = None
+
+ active_ms_threshold = ms_threshold_from_param
+ if active_ms_threshold is None or active_ms_threshold <= 0.0:
+ active_ms_threshold = ms_threshold
+ if active_ms_threshold is not None and active_ms_threshold > 1.0:
+ active_ms_threshold = active_ms_threshold / 100.0
+ if active_ms_threshold is None or active_ms_threshold <= 0.0:
+ # Default to 5% when threshold is missing/uninitialized.
+ active_ms_threshold = 0.05
+ active_ms_threshold = max(0.0, min(1.0, active_ms_threshold))
+ has_uvvis = uvvis_data is not None
+ has_ms = (ms_data is not None and ms_data[0]) or bool(selected_ms_peaks)
+ if not (has_uvvis or has_ms):
+ return None
+
+ try:
+ import matplotlib.pyplot as plt # type: ignore
+ import matplotlib.path as mpath # type: ignore
+ from matplotlib.ticker import MultipleLocator # type: ignore
+ import numpy as np # type: ignore
+ from chem_spectra.lib.shared.calc import get_curve_endpoint, cal_slope
+ except Exception:
+ return None
+
+ plt.rcParams["figure.figsize"] = [16, 9]
+ plt.rcParams["figure.dpi"] = 200
+ plt.rcParams["font.size"] = 14
+
+ fig, axes = plt.subplots(2, 1)
+ uvvis_ax, ms_ax = axes
+
+ if has_uvvis:
+ xs, ys, edit_peaks, integrations, _wl = uvvis_data
+ x_scale = 1.0 if (uvvis_x_units and "MINUTE" in uvvis_x_units.upper()) else (1.0 / 60.0)
+ xs_min = xs * x_scale
+ uvvis_ax.plot(xs_min, ys)
+
+ if edit_peaks:
+ path_data = [
+ (mpath.Path.MOVETO, (0, 5)),
+ (mpath.Path.LINETO, (0, 20)),
+ ]
+ codes, verts = zip(*path_data)
+ marker = mpath.Path(verts, codes)
+ x_peaks = [p["x"] * x_scale for p in edit_peaks]
+ y_peaks = [p["y"] for p in edit_peaks]
+ uvvis_ax.plot(
+ x_peaks,
+ y_peaks,
+ "r",
+ ls="",
+ marker=marker,
+ markersize=50,
+ )
+
+ if integrations:
+ y_max = float(np.max(ys))
+ y_min = float(np.min(ys))
+ h = max(y_max - y_min, 1.0)
+ for itg in integrations:
+ x_left = itg["xL"] * x_scale
+ x_right = itg["xU"] * x_scale
+ i_left, i_right = get_curve_endpoint(xs_min, ys, x_left, x_right)
+ cxs = xs_min[i_left:i_right]
+ cys = ys[i_left:i_right]
+ if len(cxs) > 0 and len(cys) > 0:
+ slope = cal_slope(cxs[0], cys[0], cxs[len(cxs) - 1], cys[len(cys) - 1])
+ last_y = cys[0]
+ last_x = cxs[0]
+ aucys = [last_y]
+ for i in range(1, len(cys)):
+ curr_x = cxs[i]
+ curr_y = slope * (curr_x - last_x) + last_y
+ aucys.append(curr_y)
+ last_x = curr_x
+ last_y = curr_y
+ uvvis_ax.fill_between(cxs, y1=cys, y2=aucys, alpha=0.2, color="#FF0000")
+
+ uvvis_ax.set_xlabel("X (Retention Time, min)", fontsize=18)
+ uvvis_ax.set_ylabel("Y (Detector Signal)", fontsize=18)
+ uvvis_ax.grid(False)
+ if xs_min.size:
+ x_min, x_max = float(np.min(xs_min)), float(np.max(xs_min))
+ else:
+ x_min, x_max = 0.0, 1.0
+ if ys.size:
+ y_min, y_max = float(np.min(ys)), float(np.max(ys))
+ else:
+ y_min, y_max = 0.0, 1.0
+ h = max(y_max - y_min, 1.0)
+ uvvis_ax.set_xlim(x_min, x_max)
+ uvvis_ax.xaxis.set_major_locator(MultipleLocator(1.0))
+ uvvis_ax.set_ylim(y_min - h * 0.05, y_max + h * 0.15)
+ if uvvis_label:
+ uvvis_ax.text(
+ 0.98,
+ 0.98,
+ uvvis_label,
+ ha="right",
+ va="top",
+ transform=uvvis_ax.transAxes,
+ )
+ if ms_rt is not None:
+ uvvis_ax.axvline(ms_rt, color="#777777", linestyle="--", linewidth=1, alpha=0.7)
+ if ms_rt_label:
+ uvvis_ax.text(
+ 0.02,
+ 0.98,
+ f"MS RT {ms_rt_label}",
+ ha="left",
+ va="top",
+ transform=uvvis_ax.transAxes,
+ fontsize=12,
+ color="#555555",
+ )
+ else:
+ uvvis_ax.text(0.5, 0.5, "UVVIS unavailable", ha="center", va="center", transform=uvvis_ax.transAxes)
+ uvvis_ax.set_axis_off()
+
+ if has_ms:
+ ms_panel_xs: List[float] = []
+ if ms_data is not None and ms_data[0]:
+ ms_xs, ms_ys, _ms_threshold, _page = ms_data
+ if active_ms_threshold is not None and ms_ys:
+ cut = max(ms_ys) * active_ms_threshold
+ ms_xs_blue = []
+ ms_ys_blue = []
+ ms_xs_grey = []
+ ms_ys_grey = []
+ for ms_x, ms_y in zip(ms_xs, ms_ys):
+ if ms_y >= cut:
+ ms_xs_blue.append(ms_x)
+ ms_ys_blue.append(ms_y)
+ else:
+ ms_xs_grey.append(ms_x)
+ ms_ys_grey.append(ms_y)
+ if ms_xs_grey:
+ ms_ax.bar(ms_xs_grey, ms_ys_grey, width=0, edgecolor="#dddddd")
+ if ms_xs_blue:
+ ms_ax.bar(ms_xs_blue, ms_ys_blue, width=0, edgecolor="#1f77b4")
+ else:
+ ms_ax.bar(ms_xs, ms_ys, width=0, edgecolor="#dddddd")
+ ms_panel_xs.extend(ms_xs)
+
+ if selected_ms_peaks:
+ peak_xs = [mz for mz, _ in selected_ms_peaks]
+ peak_ys = [intensity for _, intensity in selected_ms_peaks]
+ if active_ms_threshold is not None and peak_ys:
+ cut = max(peak_ys) * active_ms_threshold
+ peak_xs_blue = []
+ peak_ys_blue = []
+ peak_xs_grey = []
+ peak_ys_grey = []
+ for peak_x, peak_y in zip(peak_xs, peak_ys):
+ if peak_y >= cut:
+ peak_xs_blue.append(peak_x)
+ peak_ys_blue.append(peak_y)
+ else:
+ peak_xs_grey.append(peak_x)
+ peak_ys_grey.append(peak_y)
+ if peak_xs_grey:
+ ms_ax.bar(peak_xs_grey, peak_ys_grey, width=0, edgecolor="#dddddd")
+ if peak_xs_blue:
+ ms_ax.bar(peak_xs_blue, peak_ys_blue, width=0, edgecolor="#1f77b4")
+ else:
+ ms_ax.bar(peak_xs, peak_ys, width=0, edgecolor="#1f77b4")
+ ms_panel_xs.extend(peak_xs)
+ ms_ax.set_xlabel("X (m/z)", fontsize=18)
+ ms_ax.set_ylabel("Y (Relative Abundance)", fontsize=18)
+ ms_ax.grid(False)
+ if ms_panel_xs:
+ ms_ax.set_xlim(min(ms_panel_xs), max(ms_panel_xs))
+ ms_ax.margins(x=0)
+ if ms_rt_label:
+ ms_ax.text(
+ 0.98,
+ 0.98,
+ f"RT {ms_rt_label}",
+ ha="right",
+ va="top",
+ transform=ms_ax.transAxes,
+ )
+ elif ms_page_label:
+ ms_ax.text(
+ 0.98,
+ 0.98,
+ f"page {ms_page_label}",
+ ha="right",
+ va="top",
+ transform=ms_ax.transAxes,
+ )
+ else:
+ ms_ax.text(0.5, 0.5, "MS unavailable", ha="center", va="center", transform=ms_ax.transAxes)
+ ms_ax.set_axis_off()
+
+ fig.tight_layout()
+ preview_base = _lcms_preview_basename(paths, params)
+ preview_name = f"{preview_base}.png" if preview_base else "lcms_preview.png"
+ buffer = io.BytesIO()
+ plt.savefig(buffer, format="png")
+ buffer.seek(0)
+ tf_img = _write_named_file(buffer.read(), preview_name)
+ buffer.close()
+ plt.clf()
+ plt.cla()
+ plt.close(fig)
+ return tf_img
+
+
+def lcms_df_from_peak_jdx(jdx_path: str) -> Optional[pd.DataFrame]:
+ import pandas as pd
+
+ if not jdx_path or not os.path.exists(jdx_path):
+ return None
+
+ try:
+ with open(jdx_path, 'r', encoding='utf-8', errors='ignore') as f:
+ content = f.read()
+
+ if 'CHEMSPECTRA UVVIS PEAK TABLE' not in content:
+ return None
+
+ rows = []
+ sections = content.split('$$ === CHEMSPECTRA UVVIS PEAK TABLE ===')
+ for section in sections[1:]:
+ wavelength = None
+ for line in section.split('\n'):
+ if line.startswith('##PAGE='):
+ try:
+ wavelength = float(line.replace('##PAGE=', '').strip())
+ except (ValueError, AttributeError):
+ wavelength = line.replace('##PAGE=', '').strip()
+ break
+
+ if wavelength is None:
+ continue
+
+ xs = []
+ ys = []
+ in_data_section = False
+ for line in section.split('\n'):
+ if '##DATA TABLE=' in line.upper():
+ in_data_section = True
+ continue
+ if '##END=' in line or '$$' in line:
+ break
+ if in_data_section and line.strip() and not line.strip().startswith('##'):
+ cleaned = line.replace(';', '').strip()
+ if not cleaned:
+ continue
+ parts = cleaned.split(',')
+ if len(parts) >= 2:
+ try:
+ x = _as_float(parts[0].strip())
+ y = _as_float(parts[1].strip())
+ if x is not None and y is not None:
+ xs.append(x)
+ ys.append(y)
+ except (ValueError, IndexError):
+ continue
+
+ for x, y in zip(xs, ys):
+ rows.append({
+ 'RetentionTime': x,
+ 'DetectorSignal': y,
+ 'wavelength': wavelength,
+ })
+
+ if rows:
+ df = pd.DataFrame(rows, columns=['RetentionTime', 'DetectorSignal', 'wavelength'])
+ return df
+ return None
+ except Exception as e:
+ return None
+
+
+def lcms_df_from_uvvis_jdx(jdx_path: str) -> Optional[pd.DataFrame]:
+ if not jdx_path or not os.path.exists(jdx_path):
+ return None
+ try:
+ with open(jdx_path, "r", encoding="utf-8", errors="ignore") as handle:
+ content = handle.read()
+ return _lc_df_from_uvvis_content(content)
+ except Exception:
+ return None
+
+def lcms_uvvis_peak_jcamp_from_df(
+ lc_df: pd.DataFrame,
+ title: str,
+ params: Optional[Dict] = None,
+ x_units: Optional[str] = None,
+ y_units: Optional[str] = None,
+) -> Optional[tempfile.NamedTemporaryFile]:
+ if lc_df is None or lc_df.empty or "wavelength" not in lc_df.columns:
+ return None
+
+ normalized_params = _normalize_params(params)
+ peaks_input = normalized_params.get("peaks_str") if normalized_params else None
+ integration_input = normalized_params.get("integration") if normalized_params else None
+ selected_page_idx = normalized_params.get("jcamp_idx", 0) if normalized_params else 0
+ lcms_mz_page_hdr = ""
+ if normalized_params:
+ _raw_mz_page = normalized_params.get("lcms_mz_page")
+ if _raw_mz_page is not None:
+ lcms_mz_page_hdr = " ".join(str(_raw_mz_page).splitlines()).strip()
+
+ def _to_float_or_none(val):
+ try:
+ return float(val)
+ except Exception:
+ return None
+
+ def _normalize_peaks_list(value) -> List[Dict[str, float]]:
+ if not value:
+ return []
+ if isinstance(value, dict):
+ if "x" in value and "y" in value:
+ xs = value.get("x") or []
+ ys = value.get("y") or []
+ return [{"x": x, "y": y} for x, y in zip(xs, ys)]
+ return []
+ if isinstance(value, list):
+ if all(isinstance(v, dict) and "x" in v and "y" in v for v in value):
+ return [{"x": v["x"], "y": v["y"]} for v in value]
+ peaks = []
+ for item in value:
+ if isinstance(item, (list, tuple)) and len(item) >= 2:
+ peaks.append({"x": item[0], "y": item[1]})
+ return peaks
+ if isinstance(value, str):
+ items = []
+ for p in value.split("#"):
+ parts = p.split(",")
+ if len(parts) < 2:
+ continue
+ x_val = _to_float_or_none(parts[0])
+ y_val = _to_float_or_none(parts[1])
+ if x_val is None or y_val is None:
+ continue
+ items.append({"x": x_val, "y": y_val})
+ return items
+ return []
+
+ def _parse_peaks_input(value):
+ if value is None:
+ return None
+ if isinstance(value, (dict, list)):
+ return value
+ if isinstance(value, str):
+ raw = value.strip()
+ if raw.startswith("{") or raw.startswith("["):
+ try:
+ return json.loads(raw)
+ except Exception:
+ return value
+ return value
+
+ def _key_matches_page(key, page_idx, wavelength_value) -> bool:
+ if key is None:
+ return False
+ if str(key) == str(page_idx):
+ return True
+ if str(key) == str(wavelength_value):
+ return True
+ key_num = _to_float_or_none(key)
+ wl_num = _to_float_or_none(wavelength_value)
+ return key_num is not None and wl_num is not None and key_num == wl_num
+
+ def _peaks_for_page(peaks_data, page_idx, wavelength_value) -> List[Dict[str, float]]:
+ if not peaks_data:
+ return []
+ peaks_data = _parse_peaks_input(peaks_data)
+ if isinstance(peaks_data, dict):
+ if "x" in peaks_data and "y" in peaks_data:
+ return _normalize_peaks_list(peaks_data) if page_idx == selected_page_idx else []
+ for key, value in peaks_data.items():
+ if _key_matches_page(key, page_idx, wavelength_value):
+ return _normalize_peaks_list(value)
+ return []
+ if isinstance(peaks_data, list):
+ if all(isinstance(v, dict) and "x" in v and "y" in v for v in peaks_data):
+ return peaks_data if page_idx == selected_page_idx else []
+ for item in peaks_data:
+ if not isinstance(item, dict):
+ continue
+ curve_idx = item.get("curveIdx") or item.get("curve_idx")
+ curve_wl = item.get("wavelength")
+ if curve_idx is not None and int(curve_idx) == int(page_idx):
+ return _normalize_peaks_list(item.get("peaks") or item.get("points") or item)
+ if curve_wl is not None and _key_matches_page(curve_wl, page_idx, wavelength_value):
+ return _normalize_peaks_list(item.get("peaks") or item.get("points") or item)
+ return []
+ if isinstance(peaks_data, str):
+ return _normalize_peaks_list(peaks_data) if page_idx == selected_page_idx else []
+ return []
+
+ def _integration_for_page(integration_data, page_idx, wavelength_value):
+ if not integration_data:
+ return None, []
+ if isinstance(integration_data, list):
+ for item in integration_data:
+ if not isinstance(item, dict):
+ continue
+ curve_idx = item.get("curveIdx") or item.get("curve_idx")
+ curve_wl = item.get("wavelength")
+ if curve_idx is not None and int(curve_idx) == int(page_idx):
+ return item, item.get("stack", []) or []
+ if curve_wl is not None and _key_matches_page(curve_wl, page_idx, wavelength_value):
+ return item, item.get("stack", []) or []
+ return None, []
+ if isinstance(integration_data, dict):
+ # Check if it's a dict with wavelength keys like {"230":[[xL, xU, area, absoluteArea]]}
+ for key, value in integration_data.items():
+ if _key_matches_page(key, page_idx, wavelength_value):
+ # Convert list format [[xL, xU, area, absoluteArea]] to dict format
+ stack = []
+ if isinstance(value, list):
+ for item in value:
+ if isinstance(item, (list, tuple)) and len(item) >= 3:
+ itg_dict = {
+ 'xL': item[0],
+ 'xU': item[1],
+ 'area': item[2],
+ 'absoluteArea': item[3] if len(item) >= 4 else 0
+ }
+ stack.append(itg_dict)
+ elif isinstance(item, dict):
+ stack.append(item)
+ return integration_data, stack
+
+ curves = integration_data.get("curves") or integration_data.get("byCurve") or integration_data.get("by_curve")
+ if isinstance(curves, list):
+ for curve in curves:
+ if not isinstance(curve, dict):
+ continue
+ curve_idx = curve.get("curveIdx") or curve.get("curve_idx")
+ curve_wl = curve.get("wavelength")
+ if curve_idx is not None and int(curve_idx) == int(page_idx):
+ return curve, curve.get("stack", []) or []
+ if curve_wl is not None and _key_matches_page(curve_wl, page_idx, wavelength_value):
+ return curve, curve.get("stack", []) or []
+ return None, []
+ if page_idx == selected_page_idx:
+ return integration_data, integration_data.get("stack", []) or []
+ return None, []
+
+ def _integration_lines(integration_meta, stack):
+ if not stack:
+ return []
+ ref_area = 1.0
+ ref_shift = 0.0
+ if isinstance(integration_meta, dict):
+ ref_area_raw = integration_meta.get("refArea") or 1
+ ref_factor_raw = integration_meta.get("refFactor") or 1
+ ref_shift = integration_meta.get("shift") or 0
+ try:
+ ref_area = float(ref_factor_raw) / float(ref_area_raw)
+ except Exception:
+ ref_area = 1.0
+ lines = []
+ for itg in stack:
+ if not isinstance(itg, dict):
+ continue
+ x_left = itg.get("xL")
+ x_right = itg.get("xU")
+ area = itg.get("area")
+ absolute_area = itg.get("absoluteArea", 0)
+ if x_left is None or x_right is None or area is None:
+ continue
+ try:
+ x_left = float(x_left)
+ x_right = float(x_right)
+ if not (resolved_x_units and "MINUTE" in resolved_x_units.upper()):
+ x_left *= 60.0
+ x_right *= 60.0
+ x_left -= float(ref_shift)
+ x_right -= float(ref_shift)
+ area = float(area) * ref_area
+ absolute_area = float(absolute_area)
+ except Exception:
+ continue
+ lines.append(f"({x_left}, {x_right}, {area}, {absolute_area})\n")
+ return lines
+
+ wavelength_values = lc_df["wavelength"].dropna().unique().tolist()
+ numeric_pairs = [(w, _to_float_or_none(w)) for w in wavelength_values]
+ numeric_only = [p for p in numeric_pairs if p[1] is not None]
+ if numeric_only:
+ ordered = [p[0] for p in sorted(numeric_only, key=lambda p: p[1])]
+ else:
+ ordered = sorted(wavelength_values)
+
+ resolved_x_units = x_units or "RETENTION TIME"
+ resolved_y_units = y_units or "DETECTOR SIGNAL"
+
+ content: List[str] = []
+ for page_idx, wl in enumerate(ordered):
+ group = lc_df[lc_df["wavelength"] == wl]
+ xs = group["RetentionTime"].tolist()
+ ys = group["DetectorSignal"].tolist()
+ if xs:
+ x_min, x_max = min(xs), max(xs)
+ else:
+ x_min, x_max = 0.0, 0.0
+ if ys:
+ y_min, y_max = min(ys), max(ys)
+ else:
+ y_min, y_max = 0.0, 0.0
+
+ edit_peaks = _peaks_for_page(peaks_input, page_idx, wl)
+ if not (resolved_x_units and "MINUTE" in resolved_x_units.upper()):
+ for peak in edit_peaks:
+ if 'x' in peak:
+ peak['x'] = peak['x'] * 60.0
+
+ integration_meta, integration_stack = _integration_for_page(integration_input, page_idx, wl)
+ integration_lines = _integration_lines(integration_meta or integration_input, integration_stack)
+
+ page_block = [
+ "\n",
+ "$$ === CHEMSPECTRA UVVIS PEAK TABLE ===\n",
+ f"##TITLE={title}\n",
+ "##JCAMP-DX=5.00\n",
+ "##DATA TYPE=LC/MS\n",
+ "##DATA CLASS=PEAK TABLE\n",
+ "##SYMBOL=X, Y\n",
+ "##ORIGIN=\n",
+ "##OWNER=\n",
+ f"##XUNITS={resolved_x_units}\n",
+ f"##YUNITS={resolved_y_units}\n",
+ "##$CSCATEGORY=UVVIS PEAK TABLE\n",
+ ]
+ if page_idx == 0 and lcms_mz_page_hdr:
+ page_block.append(f"##$CSLCMSMZPAGE={lcms_mz_page_hdr}\n")
+ page_block.extend([
+ f"##PAGE={wl}\n",
+ f"##NPOINTS={len(xs)}\n",
+ "##DATA TABLE= (XY..XY), PEAKS\n",
+ ])
+ for x, y in zip(xs, ys):
+ page_block.append(f"{x}, {y};\n")
+ page_block.append("##END=\n")
+ content.extend(page_block)
+
+ content.extend([
+ "\n",
+ "$$ === CHEMSPECTRA INTEGRALS AND MULTIPLETS ===\n",
+ f"##PAGE={wl}\n",
+ "##$OBSERVEDINTEGRALS= (X Y Z)\n",
+ ])
+ content.extend(integration_lines)
+ content.extend([
+ "##$OBSERVEDMULTIPLETS=\n",
+ "##$OBSERVEDMULTIPLETSPEAKS=\n",
+ "##END=\n",
+ ])
+
+ content.extend([
+ "\n",
+ "$$ === CHEMSPECTRA PEAK TABLE EDIT ===\n",
+ f"##TITLE={title}\n",
+ "##JCAMP-DX=5.00\n",
+ "##DATA TYPE=LC/MSPEAKTABLE\n",
+ "##DATA CLASS=PEAKTABLE\n",
+ "##$CSCATEGORY=EDIT_PEAK\n",
+ "##$CSTHRESHOLD=0.05\n",
+ f"##MAXX={x_max}\n",
+ f"##MAXY={y_max}\n",
+ f"##MINX={x_min}\n",
+ f"##MINY={y_min}\n",
+ f"##PAGE={wl}\n",
+ f"##NPOINTS={len(edit_peaks)}\n",
+ "##PEAKTABLE= (XY..XY)\n",
+ ])
+ for peak in edit_peaks:
+ content.append(f"{peak['x']}, {peak['y']}\n")
+ content.extend(["##END=\n"])
+
+ tf = tempfile.NamedTemporaryFile(suffix="_lcms_uvvis.peak.jdx")
+ tf.write(bytes("".join(content), "utf-8"))
+ tf.seek(0)
+ return tf
+
diff --git a/chem_spectra/model/inferencer.py b/chem_spectra/model/inferencer.py
index 88c839e7..d754e4f0 100644
--- a/chem_spectra/model/inferencer.py
+++ b/chem_spectra/model/inferencer.py
@@ -36,7 +36,7 @@ def simulate_nmr(
shift={'ref': {'label': False, 'name': '- - -', 'value': 0}, 'peak': False, 'enable': False} # noqa: E501
)
try:
- rsp = instance.__predict_nmr(timeout=20)
+ rsp = instance.__predict_nmr(timeout=120)
output = rsp.json()
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
@@ -116,6 +116,7 @@ def __predict_nmr(self, timeout=None):
headers=hdr_nsdb,
json=data,
timeout=timeout,
+ verify=False
)
return rsp
elif self.layout == '13C':
@@ -126,6 +127,7 @@ def __predict_nmr(self, timeout=None):
headers=hdr_nsdb,
json=data,
timeout=timeout,
+ verify=False
)
return rsp
elif self.layout == '19F':
@@ -136,6 +138,7 @@ def __predict_nmr(self, timeout=None):
headers=hdr_nsdb,
json=data,
timeout=timeout,
+ verify=False
)
return rsp
return False
diff --git a/chem_spectra/model/transformer.py b/chem_spectra/model/transformer.py
index ea2211e1..ae10d02d 100644
--- a/chem_spectra/model/transformer.py
+++ b/chem_spectra/model/transformer.py
@@ -13,6 +13,7 @@
from chem_spectra.lib.converter.fid.base import FidBaseConverter
from chem_spectra.lib.converter.fid.bruker import FidHasBruckerProcessed
from chem_spectra.lib.converter.bagit.base import BagItBaseConverter
+from chem_spectra.lib.converter.bagit.lcms_builder import build_lcms_composer
from chem_spectra.lib.converter.ms import MSConverter
from chem_spectra.lib.composer.ni import NIComposer
from chem_spectra.lib.composer.ms import MSComposer
@@ -21,6 +22,7 @@
import matplotlib.pyplot as plt # noqa: E402
import matplotlib.path as mpath # noqa: E402
import numpy as np # noqa: E402
+from matplotlib import ticker # noqa: E402
from chem_spectra.model.concern.property import decorate_sim_property
@@ -36,10 +38,10 @@ def search_brucker_binary(td):
try:
has_processed_files = search_processed_file(td)
target_dir = find_dir(td, 'fid')
- if not target_dir:
- target_dir = find_dir(td, 'ser')
- return target_dir, has_processed_files
- except: # noqa: E722
+ if target_dir:
+ return target_dir, has_processed_files
+ return False, has_processed_files
+ except Exception: # noqa: E722
return False, False
def search_processed_file(td):
@@ -64,6 +66,29 @@ def search_bag_it_file(td):
return False
+def search_jdx_dir(td):
+ try:
+ def _has_jdx(path):
+ try:
+ return any(
+ name.lower().endswith('.jdx')
+ for name in os.listdir(path)
+ if os.path.isfile(os.path.join(path, name))
+ )
+ except OSError:
+ return False
+
+ if _has_jdx(td):
+ return td
+ for entry in os.listdir(td):
+ sub = os.path.join(td, entry)
+ if os.path.isdir(sub) and _has_jdx(sub):
+ return sub
+ except OSError:
+ return False
+ return False
+
+
class TransformerModel:
def __init__(self, file, molfile=None, params=False, multiple_files=False):
self.file = file
@@ -73,12 +98,16 @@ def __init__(self, file, molfile=None, params=False, multiple_files=False):
def convert2jcamp(self):
cmpsr, _ = self.to_composer()
+ if not cmpsr:
+ return False
if isinstance(cmpsr, BagItBaseConverter):
return cmpsr
return cmpsr.tf_jcamp()
def convert2img(self):
cmpsr, _ = self.to_composer()
+ if not cmpsr:
+ return False
if isinstance(cmpsr, BagItBaseConverter):
return cmpsr
return cmpsr.tf_img()
@@ -123,7 +152,7 @@ def to_converter(self):
cv, _ = self.cdf2cvp()
return cv
if is_zip or is_zip_by_params:
- cv, _ = self.zip2cvp()
+ cv, _, _ = self.zip2cvp()
return cv
else:
cv, _ = self.jcamp2cvp()
@@ -144,7 +173,6 @@ def cdf2cvp(self):
return mscv, mscp
def zip2cvp(self):
- fbcv = False
with tempfile.TemporaryDirectory() as td:
tz = store_byte_in_tmp(self.file.bcore, suffix='.zip')
with zipfile.ZipFile(tz.name, 'r') as z:
@@ -154,35 +182,35 @@ def zip2cvp(self):
# NMR data
if (has_processed_files):
return self.zip2cv_with_processed_file(target_dir, self.params, self.file.name)
+ fbcv = FidBaseConverter(target_dir, self.params, self.file.name)
+ if not fbcv:
+ return False, False, False
+
+ isSimulateNMR = False
+ if self.params and 'simulatenmr' in self.params:
+ isSimulateNMR = self.params['simulatenmr']
+ decorated_jbcv = decorate_sim_property(fbcv, self.molfile, isSimulateNMR) # noqa: E501
+ invalid_molfile = False
+ if self.molfile is None:
+ invalid_molfile = True
+ if ((type(decorated_jbcv) is dict) and "invalid_molfile" in decorated_jbcv):
+ invalid_molfile = True
+ final_decorated_jbcv = decorated_jbcv['origin_jbcv']
else:
- fbcv = FidBaseConverter(target_dir, self.params, self.file.name)
- if not fbcv:
- return False, False, False
-
- isSimulateNMR = False
- if self.params and 'simulatenmr' in self.params:
- isSimulateNMR = self.params['simulatenmr']
- decorated_jbcv = decorate_sim_property(fbcv, self.molfile, isSimulateNMR) # noqa: E501
-
- # if ((type(decorated_jbcv) is dict) and "invalid_molfile" in decorated_jbcv):
- # # return if molfile is invalid
- # return None, decorated_jbcv
- invalid_molfile = False
- if self.molfile is None:
- invalid_molfile = True
- if ((type(decorated_jbcv) is dict) and "invalid_molfile" in decorated_jbcv):
- invalid_molfile = True
- final_decorated_jbcv = decorated_jbcv['origin_jbcv']
- else:
- final_decorated_jbcv = decorated_jbcv
- nicv = JcampNIConverter(final_decorated_jbcv)
- nicp = NIComposer(nicv)
- return nicv, nicp, invalid_molfile
- else:
- is_bagit = search_bag_it_file(td)
- if is_bagit:
- bagcv = BagItBaseConverter(td, self.params, self.file.name)
- return bagcv, bagcv, False
+ final_decorated_jbcv = decorated_jbcv
+ nicv = JcampNIConverter(final_decorated_jbcv)
+ nicp = NIComposer(nicv)
+ return nicv, nicp, invalid_molfile
+
+ is_bagit = search_bag_it_file(td)
+ if is_bagit:
+ bagcv = BagItBaseConverter(td, self.params, self.file.name)
+ return bagcv, bagcv, False
+
+ jdx_dir = search_jdx_dir(td)
+ if jdx_dir:
+ bagcv = BagItBaseConverter(jdx_dir, self.params, self.file.name)
+ return bagcv, bagcv, False
return False, False, False
@@ -228,28 +256,38 @@ def zip2cv_with_processed_file(self, target_dir, params, file_name):
def jcamp2cvp(self):
tf = store_str_in_tmp(self.file.core)
jbcv = JcampBaseConverter(tf.name, self.params)
- tf.close()
invalid_molfile = False
# conversion
if jbcv.typ == 'MS':
+ tf.close()
mscv = JcampMSConverter(jbcv)
mscp = MSComposer(mscv)
return mscv, mscp, invalid_molfile
+ if jbcv.typ in ('LC/MS', 'HPLC UVVIS'):
+ lcms_cp = build_lcms_composer([tf.name], self.params)
+ tf.close()
+ if lcms_cp is not None:
+ return lcms_cp, lcms_cp, invalid_molfile
+ tf = store_str_in_tmp(self.file.core)
+ jbcv = JcampBaseConverter(tf.name, self.params)
+ tf.close()
else:
- isSimulateNMR = False
- if self.params and 'simulatenmr' in self.params:
- isSimulateNMR = self.params['simulatenmr']
- decorated_jbcv = decorate_sim_property(jbcv, self.molfile, isSimulateNMR) # noqa: E501
-
- if ((type(decorated_jbcv) is dict) and "invalid_molfile" in decorated_jbcv):
- invalid_molfile = True
- final_decorated_jbcv = decorated_jbcv['origin_jbcv']
- else:
- final_decorated_jbcv = decorated_jbcv
+ tf.close()
+ # NI path (NMR & autres, ou repli si build LCMS seul fichier a échoué)
+ isSimulateNMR = False
+ if self.params and 'simulatenmr' in self.params:
+ isSimulateNMR = self.params['simulatenmr']
+ decorated_jbcv = decorate_sim_property(jbcv, self.molfile, isSimulateNMR) # noqa: E501
- nicv = JcampNIConverter(final_decorated_jbcv)
- nicp = NIComposer(nicv)
- return nicv, nicp, invalid_molfile
+ if ((type(decorated_jbcv) is dict) and "invalid_molfile" in decorated_jbcv):
+ invalid_molfile = True
+ final_decorated_jbcv = decorated_jbcv['origin_jbcv']
+ else:
+ final_decorated_jbcv = decorated_jbcv
+
+ nicv = JcampNIConverter(final_decorated_jbcv)
+ nicp = NIComposer(nicv)
+ return nicv, nicp, invalid_molfile
def tf_predict(self):
target = json.loads(self.params['predict'])
@@ -265,7 +303,7 @@ def tf_predict(self):
def tf_nmrium(self):
converter = NMRiumDataConverter(self.file)
- if converter.is_2d == True:
+ if converter.is_2d == True or converter.data is None:
return None
nicp = NIComposer(converter)
tf_jcamp = nicp.tf_jcamp()
@@ -315,6 +353,8 @@ def tf_combine(self, list_file_names=None, extraParams=None):
xlabel_set, ylabel_set = [], []
dic_x_label, dic_y_label = {}, {}
+ cv_mode = False
+ cv_abs_max = 0.0
for idx, file in enumerate(self.multiple_files):
if (list_file_names is not None) and idx < len(list_file_names):
file.name = list_file_names[idx]
@@ -334,6 +374,58 @@ def tf_combine(self, list_file_names=None, extraParams=None):
nicv = JcampNIConverter(jbcv)
nicp = NIComposer(nicv)
xs, ys = nicp.core.xs, nicp.core.ys
+ y_values = ys
+ if nicp.core.is_cyclic_volta:
+ cv_state = {}
+ if extraParams:
+ try:
+ extras_dict = json.loads(extraParams)
+ except Exception:
+ extras_dict = {}
+ cv_state = (
+ extras_dict.get('cyclicvoltaSt')
+ or extras_dict.get('cyclicvolta')
+ or extras_dict.get('cyclic_volta')
+ ) or {}
+ if not cv_state:
+ cv_state = (
+ nicp.core.params.get('cyclicvoltaSt')
+ or nicp.core.params.get('cyclicvolta')
+ or nicp.core.params.get('cyclic_volta')
+ ) or {}
+ if isinstance(cv_state, str):
+ try:
+ cv_state = json.loads(cv_state)
+ except Exception:
+ cv_state = {}
+ cv_display = cv_state.get('cvDisplay') or {}
+ if isinstance(cv_display, str):
+ try:
+ cv_display = json.loads(cv_display)
+ except Exception:
+ cv_display = {}
+ try:
+ scale = float(cv_display.get('yScaleFactor', 1.0))
+ except Exception:
+ scale = 1.0
+ print(
+ "[combined:tf_combine] file=", filename,
+ "cvDisplay=", cv_display,
+ "scale=", scale,
+ "y_max=", float(np.max(ys)) if len(ys) else None,
+ "cv_state_source=", "extras" if extraParams else "params",
+ )
+ if scale != 1.0:
+ y_values = ys * scale
+ print(
+ "[combined:tf_combine] file=", filename,
+ "scaled_y_max=", float(np.max(y_values)) if len(y_values) else None,
+ )
+ cv_mode = True
+ try:
+ cv_abs_max = max(cv_abs_max, float(np.max(np.abs(y_values))))
+ except Exception:
+ pass
marker = ''
if nicp.core.is_aif:
first_x, last_x = xs[0], xs[len(xs)-1]
@@ -343,13 +435,15 @@ def tf_combine(self, list_file_names=None, extraParams=None):
else:
filename = 'DESORPTION'
marker = 'v'
- plt.plot(xs, ys, label=filename, marker=marker)
+ plt.plot(xs, y_values, label=filename, marker=marker)
# PLOT label
core_label_x = nicp.core.label['x']
core_label_y = nicp.core.label['y']
if nicp.core.is_cyclic_volta:
x_peaks, y_peaks = self.__get_cyclic_volta_ref_peaks(curve_idx, extraParams)
+ if y_peaks and y_values is not ys:
+ y_peaks = [y * scale for y in y_peaks]
plt.plot(
x_peaks,
@@ -369,6 +463,9 @@ def tf_combine(self, list_file_names=None, extraParams=None):
if (idx == len(self.multiple_files) - 1):
xlabel = ', '.join(xlabel_set)
ylabel = ', '.join(ylabel_set)
+ elif (nicp.core.non_nmr == False):
+ xlabel = "Chemical shift ({})".format(core_label_x.lower())
+ ylabel = "Intensity ({})".format(core_label_y.lower())
else:
xlabel = "X ({})".format(core_label_x)
ylabel = "Y ({})".format(core_label_y)
@@ -377,6 +474,28 @@ def tf_combine(self, list_file_names=None, extraParams=None):
plt.xlabel(xlabel, fontsize=18)
plt.ylabel(ylabel, fontsize=18)
+ ax = plt.gca()
+ if cv_mode:
+ ymin, ymax = ax.get_ylim()
+ cv_abs_max = max(abs(ymin), abs(ymax))
+
+ if cv_mode and cv_abs_max > 0:
+ exp = int(np.floor(np.log10(cv_abs_max))) if cv_abs_max > 0 else 0
+ print(f"[tf_combine] cv_abs_max={cv_abs_max}, exp={exp}")
+ base = (10.0 ** exp) if exp != 0 else 1.0
+ ax.yaxis.set_major_formatter(ticker.FuncFormatter(lambda y, _:
+ f"{(y / base):.3g}"
+ ))
+ ax.yaxis.get_offset_text().set_visible(False)
+ if exp != 0:
+ ax.text(
+ 0.0, 1,
+ r"$\times 10^{%d}$" % exp,
+ transform=ax.transAxes,
+ ha='left', va='bottom',
+ fontsize=14,
+ clip_on=False
+ )
plt.legend()
tf_img = tempfile.NamedTemporaryFile(suffix='.png')
plt.savefig(tf_img, format='png')
diff --git a/dependencies.list b/dependencies.list
new file mode 100644
index 00000000..160ff445
--- /dev/null
+++ b/dependencies.list
@@ -0,0 +1,42 @@
+blinker==1.9.0
+certifi==2025.10.5
+cftime==1.6.5
+charset-normalizer==3.4.4
+chem-spectra-app @ file:///home/debian/chem_spectra
+click==8.3.0
+contourpy==1.3.3
+coverage==7.10.7
+cycler==0.12.1
+Flask==3.1.2
+fonttools==4.60.1
+gunicorn==23.0.0
+idna==3.11
+iniconfig==2.1.0
+itsdangerous==2.2.0
+Jinja2==3.1.6
+kiwisolver==1.4.9
+MarkupSafe==3.0.3
+matplotlib==3.10.7
+netCDF4==1.7.3
+nmrglue @ git+https://github.com/ComPlat/nmrglue.git@2e3893edff4892f5bc1645b3f0a7150cf9526109
+numpy==2.3.3
+packaging==25.0
+pandas==2.3.3
+pillow==11.3.0
+pluggy==1.6.0
+Pygments==2.19.2
+pymzml==2.5.11
+pyopenms==3.4.0
+pyparsing==3.2.5
+pytest==8.4.2
+python-dateutil==2.9.0.post0
+pytz==2025.2
+rdkit==2025.9.1
+regex==2025.9.18
+requests==2.32.5
+scipy==1.16.2
+setuptools==80.9.0
+six==1.17.0
+tzdata==2025.2
+urllib3==2.5.0
+Werkzeug==3.1.3
diff --git a/docker-compose.p2d.yml b/docker-compose.p2d.yml
new file mode 100644
index 00000000..e452d998
--- /dev/null
+++ b/docker-compose.p2d.yml
@@ -0,0 +1,30 @@
+services:
+ msconvert:
+ image: ptrxyz/chemotion:msconvert-2.0.1
+ restart: unless-stopped
+ hostname: msconvert
+ volumes:
+ - spectra:/shared:rw
+ networks:
+ - spectra-internal
+
+ app:
+ build:
+ context: .
+ dockerfile: Dockerfile.p2d
+ restart: unless-stopped
+ volumes:
+ - spectra:/shared:rw
+ depends_on:
+ msconvert:
+ condition: service_healthy
+ networks:
+ - spectra-internal
+ ports:
+ - 4000
+
+networks:
+ spectra-internal:
+
+volumes:
+ spectra:
\ No newline at end of file
diff --git a/environment.yml b/environment.yml
deleted file mode 100644
index 56fcac20..00000000
--- a/environment.yml
+++ /dev/null
@@ -1,92 +0,0 @@
-name: python-v38
-channels:
- - defaults
-dependencies:
- - _libgcc_mutex=0.1=main
- - _openmp_mutex=5.1=1_gnu
- - ca-certificates=2023.08.22=h06a4308_0
- - ld_impl_linux-64=2.38=h1181459_1
- - libffi=3.4.4=h6a678d5_0
- - libgcc-ng=11.2.0=h1234567_1
- - libgomp=11.2.0=h1234567_1
- - libstdcxx-ng=11.2.0=h1234567_1
- - ncurses=6.4=h6a678d5_0
- - openssl=3.0.11=h7f8727e_2
- - pip=23.3=py38h06a4308_0
- - python=3.8.18=h955ad1f_0
- - readline=8.2=h5eee18b_0
- - setuptools=68.0.0=py38h06a4308_0
- - sqlite=3.41.2=h5eee18b_0
- - tk=8.6.12=h1ccaba5_0
- - wheel=0.41.2=py38h06a4308_0
- - xz=5.4.2=h5eee18b_0
- - zlib=1.2.13=h5eee18b_0
- - pip:
- - adjusttext==1.1.1
- - astroid==2.15.8
- - atomicwrites==1.4.1
- - attrs==23.2.0
- - certifi==2024.7.4
- - cftime==1.6.3
- - chardet==5.2.0
- - charset-normalizer==3.3.2
- - click==8.1.7
- - contourpy==1.1.1
- - coverage==7.5.1
- - cycler==0.12.1
- - dill==0.3.7
- - entrypoints==0.3
- - exceptiongroup==1.1.3
- - flake8==3.7.9
- - flask==2.2.5
- - flask-jwt-extended==4.5.2
- - fonttools==4.43.1
- - gunicorn==22.0.0
- - idna==3.7
- - importlib-metadata==3.6.0
- - importlib-resources==5.1.3
- - iniconfig==2.0.0
- - isort==5.13.2
- - itsdangerous==2.0.0
- - jinja2==3.1.4
- - kiwisolver==1.4.5
- - lazy-object-proxy==1.10.0
- - markupsafe==2.1.2
- - matplotlib==3.7.3
- - mccabe==0.6.1
- - more-itertools==7.2.0
- - netcdf4==1.5.3
- - numpy==1.22.4
- - olefile==0.46
- - packaging==23.2
- - pandas==2.0.3
- - pathlib2==2.3.4
- - pillow==10.3.0
- - platformdirs==4.1.0
- - pluggy==0.12.0
- - py==1.11.0
- - pycodestyle==2.5.0
- - pyflakes==2.1.1
- - pyjwt==2.8.0
- - pylint==2.17.7
- - pymzml==2.5.2
- - pyopenms==2.6.0
- - pyparsing==2.4.2
- - pytest==7.2.0
- - python-dateutil==2.8.2
- - pytz==2023.3
- - rdkit==2023.9.1
- - regex==2019.4.9
- - requests==2.32.2
- - scipy==1.7.3
- - six==1.11.0
- - tomli==2.0.1
- - tomlkit==0.12.3
- - typing-extensions==4.9.0
- - tzdata==2023.3
- - urllib3==1.26.19
- - werkzeug==3.0.3
- - wrapt==1.16.0
- - zipp==3.19.2
- - -e git+https://github.com/ComPlat/nmrglue.git@e6e8a63b1848ae0525f07de0a6ec0cfdb900ba60#egg=nmrglue
-prefix: /home/eln/anaconda3/envs/python-v38
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 00000000..22f4c611
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,45 @@
+[build-system]
+requires = ["setuptools"]
+build-backend = "setuptools.build_meta"
+
+[project]
+name = "chem-spectra-app"
+version = "1.4.0"
+requires-python = ">= 3.12"
+description = "A backend service to process files obtained from chemical spectroscopy."
+license = "MIT"
+readme = "README.md"
+keywords = ["chemistry", "spectra", "analysis"]
+classifiers = [
+ "Programming Language :: Python :: 3",
+ "Operating System :: POSIX :: Linux"
+]
+dependencies = [
+ "flask==2.*",
+ "gunicorn==22.*",
+ "matplotlib==3.*",
+ "netCDF4==1.*",
+ "numpy==2.*",
+ "pymzml==2.*",
+ "requests==2.*",
+ "rdkit==2025.*",
+ "setuptools==80.*",
+ "werkzeug==3.*",
+ "scipy==1.*",
+ "pyopenms==3.*",
+ "nmrglue@git+https://github.com/ComPlat/nmrglue.git@2e3893edff4892f5bc1645b3f0a7150cf9526109",
+]
+
+[project.optional-dependencies]
+# prod is the production installation till https://github.com/pypa/pip/issues/11440 gets solved
+dev = [
+ "coverage",
+ "pytest"
+]
+
+[project.urls]
+homepage = "https://chemotion.net/docs/services/chemspectra"
+repository = "https://github.com/ComPlat/chem-spectra-app"
+
+[tool.setuptools]
+py-modules = []
diff --git a/requirements.txt b/requirements.txt
index 9e17f0e1..bcec1058 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,47 +1,40 @@
-rdkit==2023.9.1
-atomicwrites==1.4.1
-attrs==23.2.0
-certifi==2024.7.4
-chardet==5.2.0
-Click==8.1.7
-coverage==7.5.1
+blinker==1.9.0
+certifi==2025.8.3
+cftime==1.6.4.post1
+charset-normalizer==3.4.3
+click==8.3.0
+contourpy==1.3.3
cycler==0.12.1
-entrypoints==0.3
-flake8==3.7.9
-Flask==2.2.5
+Flask==2.*
+fonttools==4.60.1
gunicorn==22.0.0
-idna==3.7
-importlib-metadata==3.6.0
-itsdangerous==2.0
-Jinja2==3.1.4
-MarkupSafe==2.1.2
-matplotlib==3.7.3
-mccabe==0.6.1
-more-itertools==7.2.0
-# -e git+https://github.com/ComPlat/nmrglue.git@e6e8a63b1848ae0525f07de0a6ec0cfdb900ba60#egg=nmrglue
--e git+https://github.com/ComPlat/nmrglue.git@stable_version#egg=nmrglue
-netCDF4==1.5.3
-numpy==1.22.4
-olefile==0.46
-pandas==2.0.3
-pathlib2==2.3.4
-Pillow==10.3.0
-pluggy==0.12.0
-pycodestyle==2.5.0
-pyflakes==2.1.1
-pymzml==2.5.2
-pyparsing==2.4.2
-pytest==7.2.0
-python-dateutil==2.8.2
-pytz==2023.3
-regex==2019.4.9
-requests==2.32.2
-scipy==1.7.3
-six==1.11.0
-urllib3==1.26.19
-Werkzeug==3.0.3
-zipp==3.19.2
-pyopenms==2.6.0
-PyJWT==2.8.0
-flask-jwt-extended==4.5.2
-pylint==2.17.7
+idna==3.10
+iniconfig==2.1.0
+itsdangerous==2.2.0
+Jinja2==3.1.6
+kiwisolver==1.4.9
+MarkupSafe==3.0.3
+matplotlib==3.10.6
+netCDF4==1.7.2
+nmrglue @ git+https://github.com/ComPlat/nmrglue.git@2e3893edff4892f5bc1645b3f0a7150cf9526109
+numpy==2.3.3
+packaging==25.0
+pandas==2.3.3
+pillow==11.3.0
+pluggy==1.6.0
+Pygments==2.19.2
+pymzml==2.5.11
+pyopenms==3.4.0
+pyparsing==3.2.5
+pytest==8.4.2
+python-dateutil==2.9.0.post0
+pytz==2025.2
+rdkit==2025.3.6
+regex==2025.9.18
+requests==2.32.5
+scipy==1.16.2
+setuptools==80.9.0
+six==1.17.0
+tzdata==2025.2
+urllib3==2.5.0
+Werkzeug==3.1.3
diff --git a/setup.cfg b/setup.cfg
deleted file mode 100644
index 95c07975..00000000
--- a/setup.cfg
+++ /dev/null
@@ -1,11 +0,0 @@
-[tool:pytest]
-testpaths = tests
-
-[coverage:run]
-branch = True
-source =
- chem_spectra
-
-[flake8]
-exclude = .git,*migrations*,./instance/
-max-line-length = 80
diff --git a/setup.py b/setup.py
deleted file mode 100644
index 95a5a45e..00000000
--- a/setup.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import os
-from setuptools import find_packages, setup
-
-with open('requirements.txt') as f:
- required = f.read().splitlines()
-
-setup(
- name='chem-spectra-app',
- version='1.2.3',
- packages=find_packages(),
- include_package_data=True,
- zip_safe=False,
- install_requires=required,
-)
diff --git a/tests/fixtures/source/13C-CPD.dx b/tests/fixtures/source/13C-CPD.dx
index 308bbf1c..ffcaf18f 100644
--- a/tests/fixtures/source/13C-CPD.dx
+++ b/tests/fixtures/source/13C-CPD.dx
@@ -2358,7 +2358,7 @@ $$ --------------------------
##$XDIM= 0
##$YMAX_p= 0
##$YMIN_p= 0
-##$CURPLOT= <��* Ա* �* >
+##$CURPLOT= <* * * >
##$CURPRIN= <$1#1#0#1#1#1#1#1#0#-1#-1#1#-1>
##$DFORMAT=
##$LAYOUT= <+/1D_X.xwp>
@@ -9308,7 +9308,7 @@ $$ --------------------------
##$XDIM= 32768
##$YMAX_p= 398087641
##$YMIN_p= -1916407
-##$CURPLOT= <��* Ա* �* >
+##$CURPLOT= <* * * >
##$CURPRIN= <$1#1#0#1#1#1#1#1#0#-1#-1#1#-1>
##$DFORMAT=
##$LAYOUT= <+/1D_X.xwp>
diff --git a/tests/fixtures/source/13C-DEPT135.dx b/tests/fixtures/source/13C-DEPT135.dx
index 6a834abc..5a0b965a 100644
--- a/tests/fixtures/source/13C-DEPT135.dx
+++ b/tests/fixtures/source/13C-DEPT135.dx
@@ -6453,7 +6453,7 @@ $$ --------------------------
##$XDIM= 0
##$YMAX_p= 0
##$YMIN_p= 0
-##$CURPLOT= <��* Ա* �* >
+##$CURPLOT= <* * * >
##$CURPRIN= <$1#1#0#1#1#1#1#1#0#-1#-1#1#-1>
##$DFORMAT=
##$LAYOUT= <+/1D_X.xwp>
@@ -16933,7 +16933,7 @@ $$ --------------------------
##$XDIM= 32768
##$YMAX_p= 266635237
##$YMIN_p= -283555411
-##$CURPLOT= <��* Ա* �* >
+##$CURPLOT= <* * * >
##$CURPRIN= <$1#1#0#1#1#1#1#1#0#-1#-1#1#-1>
##$DFORMAT=
##$LAYOUT= <+/1D_X.xwp>
diff --git a/tests/fixtures/source/1H.dx b/tests/fixtures/source/1H.dx
index 7415a842..9a5dffac 100644
--- a/tests/fixtures/source/1H.dx
+++ b/tests/fixtures/source/1H.dx
@@ -2354,7 +2354,7 @@ $$ --------------------------
##$XDIM= 0
##$YMAX_p= 0
##$YMIN_p= 0
-##$CURPLOT= < ±* Ô±* à±* >
+##$CURPLOT= <* * * >
##$CURPRIN= <$1#1#0#1#1#1#1#1#0#-1#-1#1#-1>
##$DFORMAT=
##$LAYOUT= <+/1D_H.xwp>
@@ -8867,7 +8867,7 @@ $$ --------------------------
##$XDIM= 65536
##$YMAX_p= 370323795
##$YMIN_p= -18850
-##$CURPLOT= < ±* Ô±* à±* >
+##$CURPLOT= <* * * >
##$CURPRIN= <$1#1#0#1#1#1#1#1#0#-1#-1#1#-1>
##$DFORMAT=
##$LAYOUT= <+/1D_H.xwp>
diff --git a/tests/fixtures/source/1H_empty_headers.dx b/tests/fixtures/source/1H_empty_headers.dx
new file mode 100644
index 00000000..03233285
--- /dev/null
+++ b/tests/fixtures/source/1H_empty_headers.dx
@@ -0,0 +1,17313 @@
+##TITLE=1H_ns16 DMSO /opt/topspin3.5pl6/data/complat/nmr PH 44
+##JCAMPDX= 6.0 $$ Bruker NMR compound JCAMP-DX V2.0
+##DATA TYPE= LINK
+##BLOCKS= 2
+##TITLE=1H_ns16 DMSO /opt/topspin3.5pl6/data/complat/nmr PH 44
+##JCAMPDX= 6.0 $$ Bruker NMR JCAMP-DX V2.0
+##DATA TYPE= NMR FID
+##DATA CLASS= NTUPLES
+##ORIGIN= PH
+##OWNER= PH
+##LONG DATE= 2018/07/09 16:34:42+0000
+$$ 1.90.2.2 TopSpin 3.5 pl 6
+$$ 2018-07-09 18:34:43.552 +0200 nmr@ibg-4-babsi
+$$ Compression mode = diff/dup
+##.OBSERVE FREQUENCY= 400.13240078
+##.OBSERVE NUCLEUS= ^1H
+##.DELAY= (6.5, 6.5)
+##.ACQUISITION MODE= SIMULTANEOUS (DQD)
+##.ACQUISITION SCHEME= undefined
+##.AVERAGES= 16
+##.DIGITISER RES= 22
+##SPECTROMETER/DATA SYSTEM= spect
+##.PULSE SEQUENCE=
+##.SOLVENT NAME=
+##.SHIFT REFERENCE=
+##AUDIT TRAIL= $$ (NUMBER, WHEN, WHO, WHERE, PROCESS, VERSION, WHAT)
+$$ ##TITLE= Audit trail, TopSpin 3.5 pl 6
+$$ ##JCAMPDX= 5.01
+$$ ##ORIGIN= Bruker BioSpin GmbH
+$$ ##OWNER= nmr
+$$ $$ /opt/topspin3.5pl6/data/complat/nmr/data/PH/nmr/PH-771/30/audita.txt
+$$ ##AUDIT TRAIL= $$ (NUMBER, WHEN, WHO, WHERE, PROCESS, VERSION, WHAT)
+( 1,<2018-07-09 18:34:42.776 +0200>,,,,,
+ )
+( 2,<2018-07-09 18:34:42.811 +0200>,,,,,
+ )
+$$ ##END=
+$$
+$$ $$ hash MD5
+$$ $$ 4A F3 20 FB 88 DA F5 3C 84 61 C0 26 33 25 59 7E
+##$RELAX=
+##$BRUKER FILE EXP=format.temp
+$$ EDIT_PAR COMMAND FILE
+$$
+$$ DI_MODE LONG
+$$ ED_ENTRY ACQU
+$$ ORDER FILE
+$$
+$$
+$$ HEADER "F2 - Acquisition Parameters"
+$$ T_NAME Date_
+$$ TYPE R64
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 50000000
+$$ REL "Date_=itodate(DATE)"
+$$ INV_REL "DATE=datetoi(Date_,DATE)"
+$$ FORMAT "%14.0f"
+$$ TEXT " "
+$$ END
+$$ T_NAME Time
+$$ TYPE R32
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 1000000
+$$ REL "Time=itotime(DATE)"
+$$ INV_REL "DATE=timetoi(Time,DATE)"
+$$ FORMAT "%14.2f h"
+$$ TEXT " "
+$$ END
+$$ NAME INSTRUM
+$$ TEXT " "
+$$ END
+$$ NAME PROBHD
+$$ FORMAT "%14.14s"
+$$ TEXT " "
+$$ END
+$$ NAME PULPROG
+$$ TEXT " "
+$$ END
+$$ NAME TD
+$$ TEXT " "
+$$ END
+$$ NAME SOLVENT
+$$ TEXT " "
+$$ END
+$$ NAME NS
+$$ TEXT " "
+$$ END
+$$ NAME DS
+$$ TEXT " "
+$$ END
+$$ T_NAME SWH
+$$ TYPE R32
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 1e8
+$$ REL "SWH=SW*SFO1"
+$$ INV_REL "SW=SWH/SFO1"
+$$ UNIT "Hz"
+$$ FORMAT "%14.3f Hz"
+$$ TEXT " "
+$$ END
+$$ T_NAME FIDRES
+$$ TYPE R32
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 100000
+$$ REL "FIDRES=2*SW*SFO1/TD"
+$$ INV_REL "TD = nextpow(2*SW*SFO1/FIDRES)"
+$$ UNIT "Hz"
+$$ FORMAT "%14.6f Hz"
+$$ TEXT " "
+$$ END
+$$ T_NAME AQ
+$$ TYPE R32
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 1000
+$$ REL "AQ=aqcalc(SW,SFO1,TD,DIGTYP)"
+$$ INV_REL "TD=tdcalc(SW,SFO1,1.0e6*AQ,DIGTYP)"
+$$ UNIT "sec"
+$$ FORMAT "%14.7f sec"
+$$ TEXT " "
+$$ END
+$$ NAME RG
+$$ TEXT " "
+$$ END
+$$ T_NAME DW
+$$ TYPE R32
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 1000000
+$$ REL "DW=1/(2*SW*SFO1)"
+$$ INV_REL "SW=1000000/(2*(0.005+DW)*SFO1)"
+$$ UNIT "usec"
+$$ FORMAT "%14.3lf usec"
+$$ TEXT " "
+$$ END
+$$ NAME DE
+$$ FORMAT "%14.2f usec"
+$$ TEXT " "
+$$ END
+$$ NAME TE
+$$ FORMAT "%14.1f K"
+$$ TEXT " "
+$$ END
+$$ T_NAME D1
+$$ TYPE R32
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 1e38
+$$ REL "D1=D[1]"
+$$ INV_REL "D[1]=D1"
+$$ UNIT "sec"
+$$ FORMAT "%14.8f sec"
+$$ TEXT " "
+$$ END
+$$ NAME TD0
+$$ TEXT " "
+$$ END
+$$ NAME SFO1
+$$ FORMAT "%14.7f MHz"
+$$ TEXT " "
+$$ END
+$$ NAME NUC1
+$$ NONEDIT
+$$ TEXT " "
+$$ END
+$$ T_NAME P1
+$$ TYPE R32
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 1.0e10
+$$ REL "P1=P[1]"
+$$ INV_REL "P[1]=P1"
+$$ UNIT "usec"
+$$ FORMAT "%14.2f usec"
+$$ TEXT " "
+$$ END
+$$ T_NAME PLW1
+$$ TYPE R32
+$$ CLASS ACQU
+$$ REL "PLW1=PLW[1]"
+$$ INV_REL "PLW[1]=PLW1"
+$$ UNIT "W"
+$$ FORMAT "%14.8f W"
+$$ TEXT "power PLW1 "
+$$ END
+##$RELAX=
+##$BRUKER FILE EXP=fq1list
+$$ O 400.132401
+$$ -2000000
+$$ -1992172
+$$ -1984344
+$$ -1976517
+$$ -1968689
+$$ -1960861
+$$ -1953033
+$$ -1945205
+$$ -1937378
+$$ -1929550
+$$ -1921722
+$$ -1913894
+$$ -1906067
+$$ -1898239
+$$ -1890411
+$$ -1882583
+$$ -1874755
+$$ -1866928
+$$ -1859100
+$$ -1851272
+$$ -1843444
+$$ -1835616
+$$ -1827789
+$$ -1819961
+$$ -1812133
+$$ -1804305
+$$ -1796477
+$$ -1788650
+$$ -1780822
+$$ -1772994
+$$ -1765166
+$$ -1757339
+$$ -1749511
+$$ -1741683
+$$ -1733855
+$$ -1726027
+$$ -1718200
+$$ -1710372
+$$ -1702544
+$$ -1694716
+$$ -1686888
+$$ -1679061
+$$ -1671233
+$$ -1663405
+$$ -1655577
+$$ -1647750
+$$ -1639922
+$$ -1632094
+$$ -1624266
+$$ -1616438
+$$ -1608611
+$$ -1600783
+$$ -1592955
+$$ -1585127
+$$ -1577299
+$$ -1569472
+$$ -1561644
+$$ -1553816
+$$ -1545988
+$$ -1538160
+$$ -1530333
+$$ -1522505
+$$ -1514677
+$$ -1506849
+$$ -1499022
+$$ -1491194
+$$ -1483366
+$$ -1475538
+$$ -1467710
+$$ -1459883
+$$ -1452055
+$$ -1444227
+$$ -1436399
+$$ -1428571
+$$ -1420744
+$$ -1412916
+$$ -1405088
+$$ -1397260
+$$ -1389432
+$$ -1381605
+$$ -1373777
+$$ -1365949
+$$ -1358121
+$$ -1350294
+$$ -1342466
+$$ -1334638
+$$ -1326810
+$$ -1318982
+$$ -1311155
+$$ -1303327
+$$ -1295499
+$$ -1287671
+$$ -1279843
+$$ -1272016
+$$ -1264188
+$$ -1256360
+$$ -1248532
+$$ -1240705
+$$ -1232877
+$$ -1225049
+$$ -1217221
+$$ -1209393
+$$ -1201566
+$$ -1193738
+$$ -1185910
+$$ -1178082
+$$ -1170254
+$$ -1162427
+$$ -1154599
+$$ -1146771
+$$ -1138943
+$$ -1131115
+$$ -1123288
+$$ -1115460
+$$ -1107632
+$$ -1099804
+$$ -1091977
+$$ -1084149
+$$ -1076321
+$$ -1068493
+$$ -1060665
+$$ -1052838
+$$ -1045010
+$$ -1037182
+$$ -1029354
+$$ -1021526
+$$ -1013699
+$$ -1005871
+$$ -998043
+$$ -990215
+$$ -982387
+$$ -974560
+$$ -966732
+$$ -958904
+$$ -951076
+$$ -943249
+$$ -935421
+$$ -927593
+$$ -919765
+$$ -911937
+$$ -904110
+$$ -896282
+$$ -888454
+$$ -880626
+$$ -872798
+$$ -864971
+$$ -857143
+$$ -849315
+$$ -841487
+$$ -833659
+$$ -825832
+$$ -818004
+$$ -810176
+$$ -802348
+$$ -794521
+$$ -786693
+$$ -778865
+$$ -771037
+$$ -763209
+$$ -755382
+$$ -747554
+$$ -739726
+$$ -731898
+$$ -724070
+$$ -716243
+$$ -708415
+$$ -700587
+$$ -692759
+$$ -684932
+$$ -677104
+$$ -669276
+$$ -661448
+$$ -653620
+$$ -645793
+$$ -637965
+$$ -630137
+$$ -622309
+$$ -614481
+$$ -606654
+$$ -598826
+$$ -590998
+$$ -583170
+$$ -575342
+$$ -567515
+$$ -559687
+$$ -551859
+$$ -544031
+$$ -536204
+$$ -528376
+$$ -520548
+$$ -512720
+$$ -504892
+$$ -497065
+$$ -489237
+$$ -481409
+$$ -473581
+$$ -465753
+$$ -457926
+$$ -450098
+$$ -442270
+$$ -434442
+$$ -426614
+$$ -418787
+$$ -410959
+$$ -403131
+$$ -395303
+$$ -387476
+$$ -379648
+$$ -371820
+$$ -363992
+$$ -356164
+$$ -348337
+$$ -340509
+$$ -332681
+$$ -324853
+$$ -317025
+$$ -309198
+$$ -301370
+$$ -293542
+$$ -285714
+$$ -277886
+$$ -270059
+$$ -262231
+$$ -254403
+$$ -246575
+$$ -238748
+$$ -230920
+$$ -223092
+$$ -215264
+$$ -207436
+$$ -199609
+$$ -191781
+$$ -183953
+$$ -176125
+$$ -168297
+$$ -160470
+$$ -152642
+$$ -144814
+$$ -136986
+$$ -129159
+$$ -121331
+$$ -113503
+$$ -105675
+$$ -97847
+$$ -90020
+$$ -82192
+$$ -74364
+$$ -66536
+$$ -58708
+$$ -50881
+$$ -43053
+$$ -35225
+$$ -27397
+$$ -19569
+$$ -11742
+$$ -3914
+$$ 3914
+$$ 11742
+$$ 19569
+$$ 27397
+$$ 35225
+$$ 43053
+$$ 50881
+$$ 58708
+$$ 66536
+$$ 74364
+$$ 82192
+$$ 90020
+$$ 97847
+$$ 105675
+$$ 113503
+$$ 121331
+$$ 129159
+$$ 136986
+$$ 144814
+$$ 152642
+$$ 160470
+$$ 168297
+$$ 176125
+$$ 183953
+$$ 191781
+$$ 199609
+$$ 207436
+$$ 215264
+$$ 223092
+$$ 230920
+$$ 238748
+$$ 246575
+$$ 254403
+$$ 262231
+$$ 270059
+$$ 277886
+$$ 285714
+$$ 293542
+$$ 301370
+$$ 309198
+$$ 317025
+$$ 324853
+$$ 332681
+$$ 340509
+$$ 348337
+$$ 356164
+$$ 363992
+$$ 371820
+$$ 379648
+$$ 387476
+$$ 395303
+$$ 403131
+$$ 410959
+$$ 418787
+$$ 426614
+$$ 434442
+$$ 442270
+$$ 450098
+$$ 457926
+$$ 465753
+$$ 473581
+$$ 481409
+$$ 489237
+$$ 497065
+$$ 504892
+$$ 512720
+$$ 520548
+$$ 528376
+$$ 536204
+$$ 544031
+$$ 551859
+$$ 559687
+$$ 567515
+$$ 575342
+$$ 583170
+$$ 590998
+$$ 598826
+$$ 606654
+$$ 614481
+$$ 622309
+$$ 630137
+$$ 637965
+$$ 645793
+$$ 653620
+$$ 661448
+$$ 669276
+$$ 677104
+$$ 684932
+$$ 692759
+$$ 700587
+$$ 708415
+$$ 716243
+$$ 724070
+$$ 731898
+$$ 739726
+$$ 747554
+$$ 755382
+$$ 763209
+$$ 771037
+$$ 778865
+$$ 786693
+$$ 794521
+$$ 802348
+$$ 810176
+$$ 818004
+$$ 825832
+$$ 833659
+$$ 841487
+$$ 849315
+$$ 857143
+$$ 864971
+$$ 872798
+$$ 880626
+$$ 888454
+$$ 896282
+$$ 904110
+$$ 911937
+$$ 919765
+$$ 927593
+$$ 935421
+$$ 943249
+$$ 951076
+$$ 958904
+$$ 966732
+$$ 974560
+$$ 982387
+$$ 990215
+$$ 998043
+$$ 1005871
+$$ 1013699
+$$ 1021526
+$$ 1029354
+$$ 1037182
+$$ 1045010
+$$ 1052838
+$$ 1060665
+$$ 1068493
+$$ 1076321
+$$ 1084149
+$$ 1091977
+$$ 1099804
+$$ 1107632
+$$ 1115460
+$$ 1123288
+$$ 1131115
+$$ 1138943
+$$ 1146771
+$$ 1154599
+$$ 1162427
+$$ 1170254
+$$ 1178082
+$$ 1185910
+$$ 1193738
+$$ 1201566
+$$ 1209393
+$$ 1217221
+$$ 1225049
+$$ 1232877
+$$ 1240705
+$$ 1248532
+$$ 1256360
+$$ 1264188
+$$ 1272016
+$$ 1279843
+$$ 1287671
+$$ 1295499
+$$ 1303327
+$$ 1311155
+$$ 1318982
+$$ 1326810
+$$ 1334638
+$$ 1342466
+$$ 1350294
+$$ 1358121
+$$ 1365949
+$$ 1373777
+$$ 1381605
+$$ 1389432
+$$ 1397260
+$$ 1405088
+$$ 1412916
+$$ 1420744
+$$ 1428571
+$$ 1436399
+$$ 1444227
+$$ 1452055
+$$ 1459883
+$$ 1467710
+$$ 1475538
+$$ 1483366
+$$ 1491194
+$$ 1499022
+$$ 1506849
+$$ 1514677
+$$ 1522505
+$$ 1530333
+$$ 1538160
+$$ 1545988
+$$ 1553816
+$$ 1561644
+$$ 1569472
+$$ 1577299
+$$ 1585127
+$$ 1592955
+$$ 1600783
+$$ 1608611
+$$ 1616438
+$$ 1624266
+$$ 1632094
+$$ 1639922
+$$ 1647750
+$$ 1655577
+$$ 1663405
+$$ 1671233
+$$ 1679061
+$$ 1686888
+$$ 1694716
+$$ 1702544
+$$ 1710372
+$$ 1718200
+$$ 1726027
+$$ 1733855
+$$ 1741683
+$$ 1749511
+$$ 1757339
+$$ 1765166
+$$ 1772994
+$$ 1780822
+$$ 1788650
+$$ 1796477
+$$ 1804305
+$$ 1812133
+$$ 1819961
+$$ 1827789
+$$ 1835616
+$$ 1843444
+$$ 1851272
+$$ 1859100
+$$ 1866928
+$$ 1874755
+$$ 1882583
+$$ 1890411
+$$ 1898239
+$$ 1906067
+$$ 1913894
+$$ 1921722
+$$ 1929550
+$$ 1937378
+$$ 1945205
+$$ 1953033
+$$ 1960861
+$$ 1968689
+$$ 1976517
+$$ 1984344
+$$ 1992172
+$$ 2000000
+##$RELAX=
+##$BRUKER FILE EXP=scon2
+$$ ##TITLE= Parameter file, TopSpin 3.5 pl 6
+$$ ##JCAMPDX= 5.0
+$$ ##DATATYPE= Parameter Values
+$$ ##NPOINTS= 1 $$ modification sequence number
+$$ ##ORIGIN= Bruker BioSpin GmbH
+$$ ##OWNER= nmr
+$$ $$ 2018-07-09 18:33:07.958 +0200 nmr@ibg-4-babsi
+$$ $$ /opt/topspin3.5pl6/data/complat/nmr/data/PH/nmr/PH-771/30/scon2
+$$ $$ process /opt/topspin3.5pl6/prog/mod/go4
+$$ ##$BLKTR= (0..19)
+$$ 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+$$ ##$DE1= 4.5
+$$ ##$DEADC= 0.5
+$$ ##$DEPA= 4.5
+$$ ##$DERX= 1.5
+$$ ##$FILCOR= 0
+$$ ##$GRADCHAN= 0
+$$ ##$GRADPRE= (0..1)
+$$ 10 10
+$$ ##$HD_BLKTR= (0..19)
+$$ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+$$ ##$HD_DE1= 5
+$$ ##$HD_DEADC= 0
+$$ ##$HD_DEPA= 2.5
+$$ ##$HD_DERX= 0
+$$ ##END=
+##$RELAX=
+##$BRUKER FILE EXP=prosol_History
+##$RELAX=
+##$BRUKER FILE EXP=pulseprogram
+$$ # 1 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ ;zg30
+$$ ;avance-version (12/01/11)
+$$ ;1D sequence
+$$ ;using 30 degree flip angle
+$$ ;
+$$ ;$CLASS=HighRes
+$$ ;$DIM=1D
+$$ ;$TYPE=
+$$ ;$SUBTYPE=
+$$ ;$COMMENT=
+$$ ;$RECOMMEND=y
+$$
+$$
+$$ # 1 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/Avance.incl" 1
+$$ ;Avance3aqs.incl
+$$ ; for AV III with AQS IPSO
+$$ ;
+$$ ;avance-version (15/06/05)
+$$ ;
+$$ ;$CLASS=HighRes Incl
+$$ ;$COMMENT=
+$$ # 170 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/Avance.incl"
+$$ ;$Id: Avance3aqs.incl,v 1.1.8.3 2015/03/05 16:46:54 ber Exp $
+$$ # 14 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30" 2
+$$
+$$
+$$ # 17 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ "acqt0=-p1*0.66/3.1416"
+$$
+$$
+$$ # 1 "mc_line 20 file /opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30 exp. def. part of mc cmd. before ze"
+$$ ; dimension 1D; AQ_mode
+$$ define delay MCWRK
+$$ define delay MCREST
+$$ "MCREST = 30m - 30m"
+$$ "MCWRK = 0.333333*30m"
+$$
+$$ dccorr
+$$ # 20 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ 1 ze
+$$ # 1 "mc_line 20 file /opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30 exp. def. of mc cmd. after ze"
+$$ # 21 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ # 1 "mc_line 21 file /opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30 exp. start label for mc cmd."
+$$ 2 MCWRK * 2
+$$ LBLF0, MCWRK
+$$ MCREST
+$$ # 22 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ d1
+$$ p1*0.33 ph1
+$$ go=2 ph31
+$$ # 1 "mc_line 25 file /opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30 exp. mc cmd. in line"
+$$ MCWRK wr #0
+$$ MCWRK zd
+$$ lo to LBLF0 times td0
+$$
+$$ # 26 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ exit
+$$ # 29 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ ph1=0 2 2 0 1 3 3 1
+$$ ph31=0 2 2 0 1 3 3 1
+$$
+$$
+$$ ;pl1 : f1 channel - power level for pulse (default)
+$$ ;p1 : f1 channel - 90 degree high power pulse
+$$ ;d1 : relaxation delay; 1-5 * T1
+$$ ;ns: 1 * n, total number of scans: NS * TD0
+$$ # 40 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ ;$Id: zg30,v 1.12 2012/01/31 17:49:31 ber Exp $
+##$RELAX=
+##$BRUKER FILE EXP=shimvalues
+$$ # Mon Jul 9 18:34:42 2018
+$$ #$$PROBEIDENTIFIER=Z116098_0570
+$$ #$$PROBENAME=PA BBO 400S1 BBF-H-D-05 Z SP
+$$ #$$SHIMID=292722
+$$ #
+$$ # Active Shim Gradients
+$$ #
+$$ Z -10343
+$$ Z2 2172
+$$ Z3 -308
+$$ Z4 -1701
+$$ Z5 528
+$$ Z6 2192
+$$ Z7 -2289
+$$ Z8 -117
+$$ X 3251
+$$ XZ -698
+$$ XZ2 2438
+$$ XZ3 -169
+$$ XZ4 -555
+$$ XZ5 1731
+$$ Y 420
+$$ YZ -1082
+$$ YZ2 -180
+$$ YZ3 -929
+$$ YZ4 233
+$$ YZ5 3803
+$$ XY -1633
+$$ XYZ 1468
+$$ XYZ2 -417
+$$ XYZ3 494
+$$ XYZ4 263
+$$ XYZ5 0
+$$ (X2-Y2) -1669
+$$ (X2-Y2)Z -1275
+$$ (X2-Y2)Z2 976
+$$ (X2-Y2)Z3 361
+$$ (X2-Y2)Z4 -678
+$$ (X2-Y2)Z5 0
+$$ X3 2782
+$$ X3Z -52
+$$ Y3 -133
+$$ Y3Z 647
+$$ #
+$$ # Lock Parameter
+$$ #
+$$ FIELD 4932.190
+$$ LOCKPHASE 103.600
+$$ LOCKPOWER -20.000
+$$ LOCKGAIN 101.347
+$$ LOCKDC -75.000
+$$ LOCKSHIFT 2.490
+$$ LOOPGAIN 5.000
+$$ LOOPTIME 0.250
+$$ LOOPFILTER 500.000
+$$ #
+$$ IEEE64_VERSION_CODE 1
+$$ #
+$$ # Shim currents
+$$ #
+$$ SHIM_SETTING [1 ] -5308.19255181
+$$ SHIM_SETTING [2 ] 1516.76908859
+$$ SHIM_SETTING [3 ] 889.56803599
+$$ SHIM_SETTING [4 ] -1053.20310913
+$$ SHIM_SETTING [5 ] 148.52261207
+$$ SHIM_SETTING [6 ] -135.93500083
+$$ SHIM_SETTING [7 ] -497.12237849
+$$ SHIM_SETTING [8 ] 3136.94850686
+$$ SHIM_SETTING [9 ] 539.77849344
+$$ SHIM_SETTING [10] 651.25612282
+$$ SHIM_SETTING [11] 0.00000000
+$$ SHIM_SETTING [12] -780.18000000
+$$ SHIM_SETTING [13] 514.48700000
+$$ SHIM_SETTING [14] 1374.39300000
+$$ SHIM_SETTING [15] 4786.77300000
+$$ SHIM_SETTING [16] 5286.18300000
+$$ SHIM_SETTING [17] 2452.32300000
+$$ SHIM_SETTING [18] 2010.58600000
+$$ SHIM_SETTING [19] 1859.41700000
+$$ SHIM_SETTING [20] -1117.73500000
+$$ SHIM_SETTING [21] -1427.28500000
+$$ SHIM_SETTING [22] 589.75700000
+$$ SHIM_SETTING [23] -2832.90900000
+$$ SHIM_SETTING [24] -578.45200000
+$$ SHIM_SETTING [25] -1318.77900000
+$$ SHIM_SETTING [26] -1470.93100000
+$$ SHIM_SETTING [27] 1324.21400000
+$$ SHIM_SETTING [28] -260.35600000
+$$ SHIM_SETTING [29] 481.12800000
+$$ SHIM_SETTING [30] -1162.33700000
+$$ SHIM_SETTING [31] 1564.29600000
+$$ SHIM_SETTING [32] 943.47600000
+$$ SHIM_SETTING [33] 481.78100000
+$$ SHIM_SETTING [34] -3183.59300000
+$$ SHIM_SETTING [35] -867.66700000
+$$ SHIM_SETTING [36] -2313.08700000
+$$ SHIM_SETTING [37] -2521.56100000
+$$ SHIM_SETTING [38] 3387.33700000
+$$ SHIM_SETTING [39] -957.13500000
+$$ SHIM_SETTING [40] 0.00000000
+##$RELAX=
+##$BRUKER FILE EXP=uxnmr.par
+$$ ##TITLE= Parameter file, TopSpin 3.5 pl 6
+$$ ##JCAMPDX= 5.0
+$$ ##DATATYPE= Parameter Values
+$$ ##NPOINTS= 33 $$ modification sequence number
+$$ ##ORIGIN= Bruker BioSpin GmbH
+$$ ##OWNER= nmrsu
+$$ $$ 2017-08-18 15:18:49.179 +0200 nmr@ibg-4-babsi
+$$ $$ /opt/topspin3.5pl6/conf/instr/spect/uxnmr.par
+$$ $$ process /opt/topspin3.5pl6/prog/mod/cfserverav3
+$$ ##$ACB= 0
+$$ ##$ACBTAT= (0..23)
+$$ 0 66 66 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTBA= (0..23)
+$$ 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTBLK= (0..23)
+$$ 0 1 1 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTCTL= (0..23)
+$$ 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTDI= (0..23)
+$$ 0 102 102 -1779670252 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTDM= (0..23)
+$$ 0 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTFHI= (0..23)
+$$ 0 400 400 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTFL= (0..23)
+$$ 0 73 74 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTFLO= (0..23)
+$$ 0 9 9 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTINP= (0..23)
+$$ 0 1 2 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTOUT= (0..23)
+$$ 0 1 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTPO= (0..23)
+$$ 0 150000 60000 5000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTPW= (0..23)
+$$ 0 10 10 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTSB= (0..23)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTSDT= (0..23)
+$$ 0 -1 -1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTY=
+$$ ##$AMPDFLT= no
+$$ ##$AQSBDCH= (0..95)
+$$ 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255
+$$ ##$AQSBDHW= (0..95)
+$$ 5 1 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255
+$$ ##$AQSBDID= (0..95)
+$$ 82 88 83 83 65 86 86 86 66 66 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255
+$$ ##$AQSBDNO= (0..95)
+$$ 1 1 1 2 1 1 2 3 1 1 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255
+$$ ##$AQSBDSL= (0..95)
+$$ 2 3 4 4 8 12 14 15 255 1 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255
+$$ ##$AQSBDTY= (0..95)
+$$ 67 214 50 50 5 148 147 145 217 7 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255
+$$ ##$AQSBUAD= (0..95)
+$$ 16 52 36 37 54 160 161 162 32 32 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255
+$$ ##$AQSECL= (0..95)
+$$ 0 5 3 3 9 2 0 1 1 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255
+$$ ##$AQSECLS= (0..95)
+$$ 4 1 2 2 2 1 1 2 2 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255
+$$ ##$AQSETH1=
+$$ ##$AQSETH2=
+$$ ##$AQSSPLT= no
+$$ ##$ATT19F= (0..1)
+$$ 0 0
+$$ ##$ATT1H= (0..1)
+$$ 0 0
+$$ ##$ATT3H= (0..1)
+$$ 0 0
+$$ ##$ATTX= (0..1)
+$$ 0 0
+$$ ##$ATTY= (0..1)
+$$ 0 0
+$$ ##$ATTZ= (0..1)
+$$ 0 0
+$$ ##$BACSAIR= yes
+$$ ##$BACSCAP= 0
+$$ ##$BACSDEL= 1
+$$ ##$BACSFCM= no
+$$ ##$BACSOPT= <>
+$$ ##$BACSTY=
+$$ ##$BARPTY=
+$$ ##$BFREQ= 400.13
+$$ ##$BGAETH= (0..9)
+$$
+$$ ##$BIRDS= yes
+$$ ##$BMPC= 0
+$$ ##$BMPCTY=
+$$ ##$BPSUTY=
+$$ ##$BSMS= 2
+$$ ##$BSMS19FLock= no
+$$ ##$BSMSETH= <149.236.99.20>
+$$ ##$BSMSTY=
+$$ ##$BgaChFac2= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$BgaChMap= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$BgaChMaxv= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$BgaChRouting= (0..63)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$BgaChShimMap= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$BgaChShimMaxv= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$BlaEth= (0..9)
+$$ <149.236.99.20> <> <>
+$$ ##$BlaNam= (0..9)
+$$ <> <> <> <> <> <>
+$$ <> <>
+$$ ##$BlaPN= (0..9)
+$$ <> <> <> <> <> <> <> <>
+$$ ##$BlaSN= (0..9)
+$$ <5376> <02008> <> <> <> <> <> <> <> <>
+$$ ##$BsmsAuxEth=
+$$ ##$CFASMOD= (0..7)
+$$ 1 1 1 1 1 1 1 1
+$$ ##$CFASMUL= (0..7)
+$$ 1 1 1 1 1 1 1 1
+$$ ##$CNFTXDR= (0..7)
+$$ 6 6 0 0 0 0 0 0
+$$ ##$COMDIG2= 0
+$$ ##$CPDBTY=
+$$ ##$CRCOTY=
+$$ ##$CSW1= (0..31)
+$$ 1 1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$CSW2= (0..31)
+$$ 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$CSWNUM= (0..7)
+$$ 2 1 0 0 0 0 0 0
+$$ ##$ConsolePnSn= <>
+$$ ##$CryoProAccPnSn= <>
+$$ ##$Ctb1Eth=
+$$ ##$CubeEth= (0..7)
+$$
+$$ ##$CustRegisterNo= <>
+$$ ##$DATSTAT= no
+$$ ##$DIGI140= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$DIGIB12= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$DIGIB16= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$DIGIFA= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$DIGIFOURIER= 0
+$$ ##$DIGIHA= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$DIGIHAF= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$DIGIHRD= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$DIGIIA= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$DIGIO16= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$DIGISA= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$DIGISAF= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$DIGISL= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$DIGITYI= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$DIGITYP= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$DIGITZ= 0
+$$ ##$DPPFAC= 1
+$$ ##$DRMSETH=
+$$ ##$DRU= yes
+$$ ##$DRUETH= (0..33)
+$$ <149.236.99.89>
+$$
+$$
+$$ ##$Description=
+$$ ##$DppType= 0
+$$ ##$FCUMEM= (0..7)
+$$ 16777208 16777208 0 0 0 0 0 0
+$$ ##$FCUPAL= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$FGSVTY=
+$$ ##$FQMIX= 0
+$$ ##$FUNCMOD= <>
+$$ ##$FourPeriBdEth=
+$$ ##$FourShimBdEth=
+$$ ##$FourierPicsCon= no
+$$ ##$GCUTYPE= 10
+$$ ##$GCUTYPE2= 0
+$$ ##$GPREDEL= 0
+$$ ##$GPSCUTY=
+$$ ##$GRADRES= 5
+$$ ##$GTUTY=
+$$ ##$GcConn= (0..1)
+$$ 1 0
+$$ ##$GradAmpGain= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$GradAmpMaxCurX= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$GradAmpMaxCurY= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$GradAmpMaxCurZ= (0..7)
+$$ 9.99999904632568 0 0 0 0 0 0 0
+$$ ##$GradAmpName= (0..7)
+$$ <> <> <> <> <> <> <>
+$$ ##$GradAmpPN= (0..7)
+$$ <> <> <> <> <> <> <> <>
+$$ ##$GradAmpSN= (0..7)
+$$ <> <> <> <> <> <> <> <>
+$$ ##$GradAmpType= (0..7)
+$$ 2 0 0 0 0 0 0 0
+$$ ##$GradPowClkCtrl= 0
+$$ ##$GradPowClkTime= 0
+$$ ##$GradPowImax= 0
+$$ ##$GradPowType= 0
+$$ ##$GradPowVmax= 0
+$$ ##$HDIETH= (0..5)
+$$
+$$ ##$HFAC= 3
+$$ ##$HPCU= 0
+$$ ##$HPCUTY=
+$$ ##$HPTXLP= (0..3)
+$$ -1 -1 -1 -1
+$$ ##$HPTXPI= (0..3)
+$$ 0 0 0 0
+$$ ##$HPTXPO= (0..3)
+$$ 0 0 0 0
+$$ ##$HPTXTY= (0..3)
+$$ 0 0 0 0
+$$ ##$HpprCoverType= 0
+$$ ##$IF451= 0
+$$ ##$IFREQ= 1
+$$ ##$INJPTY=
+$$ ##$INTFPR= 0
+$$ ##$IPSOETH= <149.236.99.91>
+$$ ##$IPSOTYPE= 2
+$$ ##$LDUETH= (0..0)
+$$
+$$ ##$LOCKCONF=
+$$ ##$LOCKTY=
+$$ ##$LOCSWID= 0
+$$ ##$LOCSWIF= 0
+$$ ##$LVDSSPLITETH= (0..5)
+$$
+$$ ##$Location= <>
+$$ ##$M2FAC= 0
+$$ ##$MAS= 0
+$$ ##$MASETIME= 10
+$$ ##$MASITIME= 10
+$$ ##$MASTY=
+$$ ##$MAS_CT= 5
+$$ ##$MAS_SG= 0
+$$ ##$MAS_TO= 0
+$$ ##$MEMPRM= 0
+$$ ##$MHFAC= 0
+$$ ##$MXFAC= 0
+$$ ##$MagnCoilPnSn=
+$$ ##$MagnDewarPnSn=
+$$ ##$MasEth=
+$$ ##$NAMPD= (0..17)
+$$ <> <1H/2H 1H> <1H/2H 2H> <> <> <> <> <> <> <> <> <> <> <>
+$$ <> <> <>
+$$ ##$NFCU= 2
+$$ ##$NFRED= 0
+$$ ##$NMRCH= 2
+$$ ##$NMRMEM= 16384
+$$ ##$NPSGU= 0
+$$ ##$NRCU= 1
+$$ ##$NROUT= 1
+$$ ##$NSGU= 2
+$$ ##$OrderNo= <10237029>
+$$ ##$PAMPF1= (0..15)
+$$ 75 24 96 64 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PAMPF2= (0..15)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PAMPF3= (0..15)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PAMPF4= (0..15)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PAMPF5= (0..15)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PAMPF6= (0..15)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PAMPF7= (0..15)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PAMPF8= (0..15)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PH4= 0
+$$ ##$PHF4TY=
+$$ ##$POWCHK= yes
+$$ ##$PRAMD1= (0..7)
+$$ 2 0 0 536870912 0 0 0 0
+$$ ##$PRAMD10= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD11= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD12= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD13= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD14= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD15= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD16= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD17= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD18= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD19= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD2= (0..7)
+$$ 0 1048576 0 536870912 0 1048576 0 536870912
+$$ ##$PRAMD20= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD21= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD3= (0..7)
+$$ 2147483644 2131230719 2147483647 603979775 0 0 0 0
+$$ ##$PRAMD4= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD5= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD6= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD7= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD8= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMD9= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PRAMLED= (0..1)
+$$ 0 0
+$$ ##$PRAMP= (0..9)
+$$ <00000000> <00000000>
+$$ ##$PRAMPTP= 1
+$$ ##$PREEMPTYPE= 0
+$$ ##$PREPTY=
+$$ ##$PREREC= (0..15)
+$$ 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PRESHLD= 0
+$$ ##$PTS160= -1
+$$ ##$PTSA2X= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PTSF2X= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$PTSFMX= (0..19)
+$$ 649.9 649.9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PULCHK= no
+$$ ##$PerMagATempSens= no
+$$ ##$PerMagEth=
+$$ ##$PerMagFluxSens= no
+$$ ##$PerMagMTempSens= no
+$$ ##$PramDutyCycPerc= (0..15)
+$$ 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PramPeakPowerW= (0..15)
+$$ 150 300 500 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PramPowerSwitch= (0..15)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PramPulWidthMs= (0..15)
+$$ 0.02 0.1 0.1 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PreampModBisDat= (0..15)
+$$ 20160811 20160811 20160901 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$PreampModPN= (0..17)
+$$ <> <> <> <> <> <> <> <> <> <> <> <> <> <>
+$$ <>
+$$ ##$PreampModSN= (0..17)
+$$ <00930> <00930> <00926> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <>
+$$ ##$ProdigyEth=
+$$ ##$RCUCDS= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$RCUCFS= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$RCUCSS= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$RCUI2C1= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$RCUI2C2= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$RCUI2C3= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$RCUI2C4= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$RCUI2C5= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$RCUI2C6= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$RCUI2C7= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$RCUI2C8= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$RDCU= 0
+$$ ##$RFSINPUT= (0..1)
+$$ 0 0
+$$ ##$RFSVTY=
+$$ ##$RGTYPE= (0..31)
+$$ 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$RG_max= (0..31)
+$$ 203 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1
+$$ ##$RG_min= (0..31)
+$$ 0.25 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ ##$RG_tab1= (0..255)
+$$ 0.25 0.28 0.32 0.35 0.4 0.44 0.5 0.56 0.64 0.7 0.8 0.89 1 1.12 1.28 1.4
+$$ 1.6 1.78 2 2.25 2.56 2.8 3.2 3.56 4 4.5 5 5.6 6.35 7.12 8 9 10 11.3 12.7
+$$ 14.2 16 18 20.2 22.6 25.4 28.5 32 36 40.3 45.2 50.8 57 64 71.8 80.6 90.5
+$$ 101 114 128 144 161 181 203 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ ##$RG_tab2= (0..255)
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ ##$RG_tab3= (0..255)
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ ##$RG_tab4= (0..255)
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ ##$RG_tab5= (0..255)
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ ##$RG_tab6= (0..255)
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ ##$RG_tab7= (0..255)
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ ##$RG_tab8= (0..255)
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ ##$RG_tabA= (0..255)
+$$ 0.25 0.28 0.32 0.35 0.4 0.44 0.5 0.56 0.64 0.7 0.8 0.89 1 1.12 1.28 1.4
+$$ 1.6 1.78 2 2.25 2.56 2.8 3.2 3.56 4 4.5 5 5.6 6.35 7.12 8 9 10 11.3 12.7
+$$ 14.2 16 18 20.2 22.6 25.4 28.5 32 36 40.3 45.2 50.8 57 64 71.8 80.6 90.5
+$$ 101 114 128 144 161 181 203 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+$$ ##$ROBOTTY=
+$$ ##$ROUT14= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$ROUTER= 3
+$$ ##$RX22TY=
+$$ ##$RXFMAX= (0..7)
+$$ 647.5 -1 -1 -1 -1 -1 -1 -1
+$$ ##$RXFMIN= (0..7)
+$$ 5 -1 -1 -1 -1 -1 -1 -1
+$$ ##$RXINTLV= (0..7)
+$$ 1 0 0 0 0 0 0 0
+$$ ##$RXMSTY=
+$$ ##$RockSwitchEth=
+$$ ##$SCMTY=
+$$ ##$SGUC1= (0..15)
+$$ 17 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$SGUC2= (0..15)
+$$ 33 256 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$SLCBCONF=
+$$ ##$SPECTR= 10
+$$ ##$SY2FLAG= 0
+$$ ##$SYNCTRIG= 11
+$$ ##$SamChgEth= (0..3)
+$$ <149.236.99.52>
+$$ ##$ServiceNo= <>
+$$ ##$Sgu1PowerLevels= (0..7)
+$$ 90 74 58 42 26 10 0 0
+$$ ##$Sgu2PowerLevels= (0..7)
+$$ 90 74 58 42 26 10 0 0
+$$ ##$Sgu3PowerLevels= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$Sgu4PowerLevels= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$Sgu5PowerLevels= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$Sgu6PowerLevels= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$Sgu7PowerLevels= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$Sgu8PowerLevels= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$SguType= 3
+$$ ##$ShimMaxVal= 32760
+$$ ##$ShimPow1Ch2Sh= (0..38)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0
+$$ ##$ShimPow1Imax= (0..38)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0
+$$ ##$ShimPow1NChan= 0
+$$ ##$ShimPow1TotIMax= 0
+$$ ##$ShimPow1Vmax= (0..38)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0
+$$ ##$ShimPow2Ch2Sh= (0..38)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0
+$$ ##$ShimPow2Imax= (0..38)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0
+$$ ##$ShimPow2NChan= 0
+$$ ##$ShimPow2TotIMax= 0
+$$ ##$ShimPow2Vmax= (0..38)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0
+$$ ##$ShimPow3Ch2Sh= (0..38)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0
+$$ ##$ShimPow3Imax= (0..38)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0
+$$ ##$ShimPow3NChan= 0
+$$ ##$ShimPow3TotIMax= 0
+$$ ##$ShimPow3Vmax= (0..38)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0
+$$ ##$ShimPow4Ch2Sh= (0..38)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0
+$$ ##$ShimPow4Imax= (0..38)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0
+$$ ##$ShimPow4NChan= 0
+$$ ##$ShimPow4TotIMax= 0
+$$ ##$ShimPow4Vmax= (0..38)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0
+$$ ##$ShimPowMaxUA= (0..63)
+$$ 130000 130000 130000 130000 130000 130000 130000 130000 130000 130000 130000
+$$ 130000 130000 130000 130000 130000 130000 130000 130000 130000 130000 130000
+$$ 130000 130000 130000 130000 130000 130000 130000 130000 130000 130000 130000
+$$ 130000 130000 130000 130000 130000 130000 130000 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ShimPowMaxUC= (0..63)
+$$ 130000 130000 130000 130000 130000 130000 130000 130000 130000 130000 130000
+$$ 130000 130000 130000 130000 130000 130000 130000 130000 130000 130000 130000
+$$ 130000 130000 130000 130000 130000 130000 130000 130000 130000 130000 130000
+$$ 130000 130000 130000 130000 130000 130000 130000 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ShimPowMaxUG= (0..63)
+$$ 524287 524287 524287 524287 524287 524287 524287 524287 524287 524287 524287
+$$ 524287 524287 524287 524287 524287 524287 524287 524287 524287 524287 524287
+$$ 524287 524287 524287 524287 524287 524287 524287 524287 524287 524287 524287
+$$ 524287 524287 524287 524287 524287 524287 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0 0 0 0 0 0 0 0
+$$ ##$ShimPowNum= 0
+$$ ##$ShimPowRcbType= 3
+$$ ##$ShimPowRes= (0..63)
+$$ 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20
+$$ 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20
+$$ 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20 1e-20
+$$ 1e-20 1e-20 1e-20 1e-20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ShimPowRng0= (0..63)
+$$ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+$$ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ShimPowRng1= (0..63)
+$$ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+$$ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ShimPowRng2= (0..63)
+$$ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+$$ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ShimPowRng3= (0..63)
+$$ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+$$ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ShimPowType1= 0
+$$ ##$ShimPowType2= 0
+$$ ##$ShimPowType3= 0
+$$ ##$ShimPowType4= 0
+$$ ##$ShimSysAngle= <>
+$$ ##$ShimSysFunc= (0..63)
+$$ 1 2 3 4 5 6 7 8 9 10 0 37 38 35 16 15 14 13 12 11 28 27 26 25 24 23 36
+$$ 22 30 29 20 21 34 33 32 31 17 18 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0 0 0 0 0
+$$ ##$ShimSysMatId=
+$$ ##$ShimSysMatrix= 1
+$$ ##$ShimSysOffset= <35>
+$$ ##$ShimSysType= 4
+$$ ##$ShimUnit= 0
+$$ ##$TFXNUM= 0
+$$ ##$TOSITY=
+$$ ##$TRIPLO2= 0
+$$ ##$VTU= 2
+$$ ##$VTUETH= <149.236.99.20>
+$$ ##$VTUTY=
+$$ ##$WBREFAM= (0..15)
+$$ 131.6 89.2 100 100 100 100 100 100 100 100 100 100 100 100 100 100
+$$ ##$WBREFLM= (0..15)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$WBREFPH= (0..15)
+$$ 78.82 -69.31 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$WBSGU= (0..15)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$XFAC= 2
+$$ ##END=
+##$RELAX=
+##$BRUKER FILE PROC=intrng
+$$ P 0
+$$ 11.453732 10.692263
+$$ 7.939117 6.766051
+$$ 4.472171 3.823149
+$$ 3.695117 3.054041
+$$ 2.799199 2.210069
+$$ 1.583048 1.000029
+##$RELAX=
+##$BRUKER FILE PROC=parm.txt
+$$
+$$ Current Data Parameters
+$$ NAME PH-771
+$$ EXPNO 30
+$$ PROCNO 1
+$$
+$$ F2 - Acquisition Parameters
+$$ Date_ 20180709
+$$ Time 18.34 h
+$$ INSTRUM spect
+$$ PROBHD Z116098_0570 (
+$$ PULPROG zg30
+$$ TD 65536
+$$ SOLVENT DMSO
+$$ NS 16
+$$ DS 2
+$$ SWH 8012.820 Hz
+$$ FIDRES 0.244532 Hz
+$$ AQ 4.0894465 sec
+$$ RG 78.78
+$$ DW 62.400 usec
+$$ DE 6.50 usec
+$$ TE 298.0 K
+$$ D1 1.00000000 sec
+$$ TD0 1
+$$ SFO1 400.1324008 MHz
+$$ NUC1 1H
+$$ P1 10.00 usec
+$$ PLW1 15.16199970 W
+$$
+$$ F2 - Processing parameters
+$$ SI 65536
+$$ SF 400.1300000 MHz
+$$ WDW EM
+$$ SSB 0
+$$ LB 0.30 Hz
+$$ GB 0
+$$ PC 1.00
+##$RELAX=
+##$BRUKER FILE PROC=peaklist.xml
+$$
+$$
+$$
+$$
+$$ F1=16.012770ppm, F2=-4.012774ppm, MI=0.00cm, MAXI=10000.00cm, PC=1.000
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+$$
+##$RELAX=
+##$BRUKER FILE PROC=peakrng
+$$ P #regions in PPM
+$$ # 2018-07-09 18:34:43 +0200 nmr@ibg-4-babsi
+$$ # low field high field mi maxi
+$$ 16.0127696990967 -4.01277328148588 0.000 10000.000 # for region 1
+##$RELAX=
+$$ Bruker specific parameters
+$$ --------------------------
+##$DATPATH=
+##$EXPNO= 30
+##$NAME=
+##$PROCNO= 1
+##$ACQT0= -2.10084033613445
+##$AMP= (0..31)
+100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
+100 100 100 100 100 100 100 100 100 100 100 100 100 100
+##$AMPCOIL= (0..19)
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$ANAVPT= -1
+##$AQSEQ= 0
+##$AQ_mod= 3
+##$AUNM=
+##$AUTOPOS= <44 >
+##$BF1= 400.13
+##$BF2= 400.13
+##$BF3= 400.13
+##$BF4= 400.13
+##$BF5= 400.13
+##$BF6= 400.13
+##$BF7= 400.13
+##$BF8= 400.13
+##$BWFAC= (0..63)
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$BYTORDA= 0
+##$CAGPARS= (0..11)
+0 0 0 0 0 0 0 0 0 0 0 0
+##$CHEMSTR=
+##$CNST= (0..63)
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+##$CPDPRG= (0..8)
+<> <> <> <> <> <> <> <> <>
+##$D= (0..63)
+0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0002 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$DATE= 1531154082
+##$DE= 6.5
+##$DECBNUC=
+##$DECIM= 2496
+##$DECNUC=
+##$DECSTAT= 4
+##$DIGMOD= 1
+##$DIGTYP= 12
+##$DQDMODE= 0
+##$DR= 22
+##$DS= 2
+##$DSPFIRM= 0
+##$DSPFVS= 20
+##$DTYPA= 0
+##$EXP= <1H_ns16>
+##$FCUCHAN= (0..9)
+0 2 0 0 0 0 0 0 0 0
+##$FL1= 0
+##$FL2= 0
+##$FL3= 0
+##$FL4= 0
+##$FN_INDIRECT= (0..7)
+0 0 0 0 0 0 0 0
+##$FOV= 0
+##$FQ1LIST= <>
+##$FQ2LIST= <>
+##$FQ3LIST= <>
+##$FQ4LIST= <>
+##$FQ5LIST= <>
+##$FQ6LIST= <>
+##$FQ7LIST= <>
+##$FQ8LIST= <>
+##$FRQLO3= 14083.594999969
+##$FRQLO3N= 2
+##$FS= (0..7)
+83 83 83 83 83 83 83 83
+##$FTLPGN= 0
+##$FW= 4032000
+##$FnILOOP= 0
+##$FnMODE= 0
+##$FnTYPE= 0
+##$GPNAM= (0..31)
+<> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <>
+<> <> <> <> <> <> <> <>
+##$GPX= (0..31)
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$GPY= (0..31)
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$GPZ= (0..31)
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$GRDPROG= <>
+##$GRPDLY= 67.9842376708984
+##$HDDUTY= 20
+##$HDRATE= 1
+##$HGAIN= (0..3)
+0 0 0 0
+##$HL1= 0
+##$HL2= 0
+##$HL3= 0
+##$HL4= 0
+##$HOLDER= 44
+##$HPMOD= (0..7)
+0 0 0 0 0 0 0 0
+##$HPPRGN= 0
+##$IN= (0..63)
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$INF= (0..7)
+0 0 0 0 0 0 0 0
+##$INP= (0..63)
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$INSTRUM=
+##$INTEGFAC= (0..63)
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$L= (0..31)
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+##$LFILTER= 500
+##$LGAIN= 5
+##$LINPSTP= 0
+##$LOCKED= yes
+##$LOCKFLD= 4932
+##$LOCKGN= 101.347137451172
+##$LOCKPOW= -20
+##$LOCKPPM= 2.49000000953674
+##$LOCNUC= <2H>
+##$LOCPHAS= 103.6
+##$LOCSHFT= yes
+##$LOCSW= 0
+##$LTIME= 0.25
+##$MASR= 4200
+##$MASRLST=
+##$MULEXPNO= (0..15)
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$NBL= 1
+##$NC= -6
+##$NLOGCH= 1
+##$NOVFLW= 0
+##$NS= 16
+##$NUC1= <1H>
+##$NUC2=
+##$NUC3=
+##$NUC4=
+##$NUC5=
+##$NUC6=
+##$NUC7=
+##$NUC8=
+##$NUCLEUS=
+##$NUSLIST=
+##$NusAMOUNT= 25
+##$NusFPNZ= no
+##$NusJSP= 0
+##$NusSEED= 54321
+##$NusSPTYPE= 0
+##$NusT2= 1
+##$NusTD= 0
+##$O1= 2400.78
+##$O2= 2470.802
+##$O3= 2470.802
+##$O4= 2470.802
+##$O5= 2470.802
+##$O6= 2470.802
+##$O7= 2470.802
+##$O8= 2470.802
+##$OVERFLW= 0
+##$P= (0..63)
+10 10 20 0 0 19.8 30 60 20000 0 0 80000 80000 1000 0 0 1000 2500 100000
+600 0 0 0 0 0 126 100000 10 0 1000 0 0 20000 0 0 0 0 0 0 0 2000 0 0 0 300
+0 80000 46600 10000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$PACOIL= (0..15)
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$PAPS= 0
+##$PARMODE= 0
+##$PCPD= (0..9)
+0 90 0 0 0 0 0 0 0 0
+##$PEXSEL= (0..9)
+1 1 1 1 1 1 1 1 1 1
+##$PHCOR= (0..31)
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$PHLIST= <>
+##$PHP= 1
+##$PH_ref= 0
+##$PL= (0..63)
+120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+120 120 120 120 120 120 120 120 120 120
+##$PLSTEP= 0.1
+##$PLSTRT= -6
+##$PLW= (0..63)
+0 15.162 0 0 0 0 0 0 0 6.0648e-05 1.6847 0.089717 0 0 0 0 0 0 15.162 0.18719
+0 0 0 0 0 0 0 0.38201 0 1.6847 0 0 2.4259e-06 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$PLWMAX= (0..7)
+48.2 0 0 0 0 0 0 0
+##$PQPHASE= 0
+##$PQSCALE= 1
+##$PR= 1
+##$PRECHAN= (0..15)
+-1 2 0 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+##$PRGAIN= 0
+##$PROBHD=
+##$PULPROG=
+##$PW= 0
+##$PYNM= <>
+##$ProjAngle= 0
+##$QNP= 0
+##$RD= 0
+##$RECCHAN= (0..15)
+0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$RECPH= 0
+##$RECPRE= (0..15)
+-1 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+##$RECPRFX= (0..15)
+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$RECSEL= (0..15)
+0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$RG= 78.78
+##$RO= 0
+##$RSEL= (0..15)
+0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$S= (0..7)
+83 83 83 83 83 83 83 83
+##$SELREC= (0..9)
+0 0 0 0 0 0 0 0 0 0
+##$SFO1= 400.13240078
+##$SFO2= 400.132470802
+##$SFO3= 400.132470802
+##$SFO4= 400.132470802
+##$SFO5= 400.132470802
+##$SFO6= 400.132470802
+##$SFO7= 400.132470802
+##$SFO8= 400.132470802
+##$SOLVENT=
+##$SOLVOLD=
+##$SP= (0..63)
+120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+120 120 120 120 120 120 120 120 120 120
+##$SPECTR= 0
+##$SPINCNT= 0
+##$SPNAM= (0..63)
+<> <> <>
+<> <> <> <> <> <> <> <> <>
+ <> <> <> <> <> <>
+ <> <> <>
+<> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <>
+<> <> <> <> <> <> <>
+##$SPOAL= (0..63)
+0.5 1 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
+1 1 1 1 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
+0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
+0.5 0.5 0.5 0.5 0.5 0.5 0.5
+##$SPOFFS= (0..63)
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$SPPEX= (0..63)
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$SPW= (0..63)
+0 1.2587e-05 5.5942e-06 0 0 0.004372 6.0648e-05 0 1.5162e-07 0 0.004372
+0.004372 0 0 0 0 0 0 0 8.92981e-06 1.38811e-05 6.48149e-06 3.495414e-05
+0 0 0 0 0 0 0.057915 1.0782 0 0 0 6.1158e-05 5.5942e-06 0.00035803 0 0
+0 0 1.5162e-07 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$SUBNAM= (0..9)
+<> <> <> <> <> <> <> <> <> <>
+##$SW= 20.0254228280456
+##$SWIBOX= (0..19)
+0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$SW_h= 8012.82051282051
+##$SWfinal= 0
+##$SigLockShift= 0
+##$TD= 65536
+##$TD0= 1
+##$TD_INDIRECT= (0..7)
+0 0 0 0 0 0 0 0
+##$TDav= 1
+##$TE= 298.0045
+##$TE1= 297.9875
+##$TE2= 0
+##$TE3= 0
+##$TE4= 0
+##$TEG= 300
+##$TE_MAGNET= 0
+##$TE_PIDX= 1
+##$TE_STAB= (0..9)
+2 2 0 0 0 0 0 0 0 0
+##$TL= (0..7)
+120 120 120 120 120 120 120 120
+##$TOTROT= (0..63)
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+##$TUBE_TYPE= <>
+##$USERA1= <>
+##$USERA2= <>
+##$USERA3= <>
+##$USERA4= <>
+##$USERA5= <>
+##$V9= 5
+##$VALIDCODE= -1
+##$VALIST= <>
+##$VCLIST= <>
+##$VDLIST= <>
+##$VPLIST= <>
+##$VTLIST= <>
+##$WBST= 1024
+##$WBSW= 4
+##$XGAIN= (0..3)
+0 0 0 0
+##$XL= 0
+##$YL= 0
+##$YMAX_a= 3457969
+##$YMIN_a= -3715865
+##$ZGOPTNS= <>
+##$ZL1= 120
+##$ZL2= 120
+##$ZL3= 120
+##$ZL4= 120
+##$ABSF1= 10
+##$ABSF2= 0
+##$ABSG= 5
+##$ABSL= 3
+##$ALPHA= 0
+##$AQORDER= 0
+##$ASSFAC= 0
+##$ASSFACI= 0
+##$ASSFACX= 0
+##$ASSWID= 0
+##$AUNMP=
+##$AXLEFT= 0
+##$AXNAME= <>
+##$AXNUC=
+##$AXRIGHT= 0
+##$AXTYPE= 0
+##$AXUNIT= <>
+##$AZFE= 0.1
+##$AZFW= 0.1
+##$BCFW= 1
+##$BC_mod= 2
+##$BYTORDP= 0
+##$COROFFS= 0
+##$CY= 15
+##$DATMOD= 1
+##$DC= 2
+##$DFILT= <>
+##$DTYPP= 0
+##$ERETIC= no
+##$F1P= 0
+##$F2P= 0
+##$FCOR= 0.5
+##$FTSIZE= 0
+##$FT_mod= 6
+##$GAMMA= 1
+##$GB= 0
+##$INTBC= 1
+##$INTSCL= 1
+##$ISEN= 128
+##$LB= 0.3
+##$LEV0= 0
+##$LPBIN= 0
+##$MAXI= 10000
+##$MC2= 0
+##$MEAN= 0
+##$ME_mod= 0
+##$MI= 0
+##$MddCEXP= no
+##$MddCT_SP= no
+##$MddF180= no
+##$MddLAMBDA= 0
+##$MddMEMORY= 0
+##$MddMERGE= 0
+##$MddNCOMP= 0
+##$MddNITER= 0
+##$MddNOISE= 0
+##$MddPHASE= 0
+##$MddSEED= 0
+##$MddSRSIZE= 0
+##$Mdd_CsALG= 0
+##$Mdd_CsLAMBDA= 1
+##$Mdd_CsNITER= 0
+##$Mdd_CsNORM= 0
+##$Mdd_CsVE= yes
+##$Mdd_CsZF= 0
+##$Mdd_LrLAMBDA= 0
+##$Mdd_LrNITER= 0
+##$Mdd_LrRANK= 0
+##$Mdd_LrZF= 0
+##$Mdd_mod= 0
+##$NCOEF= 0
+##$NC_proc= 0
+##$NLEV= 6
+##$NOISF1= 0
+##$NOISF2= 0
+##$NSP= 1
+##$NTH_PI= 0
+##$NZP= 0
+##$OFFSET= 16.01277
+##$PC= 1
+##$PHC0= 232.4432
+##$PHC1= -19.88034
+##$PH_mod= 0
+##$PKNL= yes
+##$PPARMOD= 0
+##$PPDIAG= 0
+##$PPIPTYP= 0
+##$PPMPNUM= 2147483647
+##$PPRESOL= 1
+##$PSCAL= 4
+##$PSIGN= 0
+##$PYNMP=
+##$RDF1= 0
+##$RDF2= 0
+##$RDFWHM= 0
+##$RDINT= 0
+##$RDPOS= 0
+##$REVERSE= no
+##$SF= 400.13
+##$SI= 65536
+##$SIGF1= 0
+##$SIGF2= 0
+##$SINO= 0
+##$SIOLD= 65536
+##$SPECTYP= <>
+##$SREF_mod= 1
+##$SREGLST= <1H.DMSO>
+##$SSB= 0
+##$STSI= 0
+##$STSR= 0
+##$SW_p= 4000
+##$SYMM= 0
+##$S_DEV= 0
+##$TDeff= 0
+##$TDoff= 0
+##$TI= <1H_ns16 DMSO /opt/topspin3.5pl6/data/complat/nmr PH 44
+
+>
+##$TILT= no
+##$TM1= 0
+##$TM2= 0
+##$TOPLEV= 0
+##$USERP1= <>
+##$USERP2= <>
+##$USERP3= <>
+##$USERP4= <>
+##$USERP5= <>
+##$WDW= 1
+##$XDIM= 0
+##$YMAX_p= 0
+##$YMIN_p= 0
+##$CURPLOT= <* * * >
+##$CURPRIN= <$1#1#0#1#1#1#1#1#0#-1#-1#1#-1>
+##$DFORMAT=
+##$LAYOUT= <+/1D_H.xwp>
+##$LFORMAT=
+##$PFORMAT=
+$$ End of Bruker specific parameters
+$$ ---------------------------------
+##NTUPLES= NMR FID
+##VAR_NAME= TIME, FID/REAL, FID/IMAG
+##SYMBOL= X, R, I
+##VAR_TYPE= INDEPENDENT, DEPENDENT, DEPENDENT
+##VAR_FORM= AFFN, ASDF, ASDF
+##VAR_DIM= 32768, 32768, 32768
+##UNITS= SECONDS, ARBITRARY UNITS, ARBITRARY UNITS
+##FACTOR= 0.0001248, 1, 1
+##FIRST= 0, 0, 0
+##LAST= 4.0893216, 245, 440
+##MIN= 0, -3715865, -3715865
+##MAX= 4.0893216, 3457969, 3457969
+$$ Real data points
+##PAGE= N=1
+##DATA TABLE= (X++(R..R)), XYDATA
+0@@@@@A6a6A6c2C2f4F4h2A12a39A75b08B57c07C80d44E38f30G42h77A008a176
+27A362a557A791b048B324b647B989c374C797d255D767e326E937f607G336h136
+43I015i964A1014a2159A3411a4792A6309a7985A9848b1922B4238b6869B9844c3280
+57C7272d1980D7656e4616F3423g4962I0812a14079A51698b23016D07998b439614
+69c715865i93322G83331K076189N98449o10011A254453n06916j7248C63354f96564
+80i88576K00825j32421p33218o5484P13386B0801R35447Q49603l26392d01966
+91b298329K67148c3444A692459M39738l07970q76843c40649p81077M87055A52674
+102A03535b97733c6961B53916d60124j037955J37331a87059G14401J25109l50587
+112D88923c54483r97422J97925H19279K031914P5184A318923c14568r74623m97658
+122a786849J83283f65919A54471M5371D8355J53012E240h44039l27665a23014
+133A214936J72633E54850b71824m18826J98672G05159J507118J0621B27242a932207
+144b513526O23706P73356b18617I08631N92916l94144D43103F2663d28728n64551
+154i93279L28940E98703O15379B51015a070366j43746b37005I78785R04771K4520
+164A908076E29728a465949q08315R02253a06847D24031J34387J29132l09637d63166
+175a052207J06471M55532B17847J119688P61762p63398d59617q80034e40021F64625
+186A014328m83417d32007j180636n18484R99433F15209P68049n27055B14272c1654
+197e09220o97917R1133F1240J345316P52546P8092p95907b69285j484268J14512
+207a639041c79037B12370e47305j061698l49057M92638b15549A489559J119714
+216B609273l18449A132213C03986a53662o56943m73832N40638D23573N44125m73137
+226D94561d10262q83060m87769O32345F12700J326857n18012a93149q82982L30866
+236g45265d5677E10256L89826j46073a06375p58913J40196a32871A69227L18060
+246D87287P84363M47359G63189a120810j322311l5809R94144G9037J383168J56106
+256A618311D76329e03074a32545I58345M94353l50116D16612d19012q38710k72095
+266a529817N04526c68445B7649M80704N25122l41038g13989j081124N08993C26132
+277A718061N07265m90970C06102a238792l28416e44976C67369A32109e97010k46374
+287h43384J58283J77139i0716G15442O53676P3377l18447D84322f90289j176251
+297a866540O4171b79049A255240J82896D17717h37454p48802K36592f2277A352384
+308A648459q05034A01331c4170p3210k84277k2178f1183F9543b85014m36153k76611
+319i97778j06821N30351I75092J593368j8844G57036a195291p62618L78692f25632
+330D60443N77888m13803b05058j97147E3292K47479A39935K5626K57427k03955
+340B19033e87997o68827O2961d58613F90806J073268N7670D22120a339978n01739
+350a841717h37270E31659P64756p375F01448d54666o67177K00065c68945a42226
+361c5324C80023K76498A55409f45362n7295I9700Q70330L51414l43177a47692
+372a562444m17411g20644A117542P55579o24209A42660g75968n75543j6703O27257
+382g40957C2327M30226K26130K03418j80879G472d52183A4373Q54499J53258A95734
+394a033786r24556J3127f65252A186475R24535o77497H2798g42455j37698J85164
+404f94989b26675D46447L71323k07378A75748b20822n02050l77164M57026E82618
+415A341324n71999d45111o14946L72655B77113J006251L41139G26391i40984j061200
+425b002184K73502g44367A10535O30264M94514M3212n88170a12957n27011r6427
+435g36395c30149E06543N81134m91933g06786q19486M30710D3669Q81621J29167
+445A054457C67329g83534o97994N16678C47914R57572J50490k20139l98252b9994
+456a173779n93728L70428d77323D49800N95896j25592a3061q76413K61576E89295
+467A422914l74797h4150j027142m25443L90700g3130I76228K81887m26372B81704
+478a94375n33665l04900M46402D50331P88412m7921C64952h18967q76407J90835
+488a504539b33158I95278P9372B22600d72040L3286A07119P04447N21837j36063
+498A197340B87409g81250n74130j20301J04119N91374D56317J121771P698E20376
+509f38462m58574L90656B83808R46088L7319B21865i28119j93846d33612B99237
+520E80485j42013a8596n91559l21252J93252b19259D11638P26645N10620l80261
+530A268642a05717j401515l52558P98045A80541R31100J03630C87744f79552k46675
+540i26227a51543G11886J25286D07436e8073m16660l73277q724c26319C77213
+551H24376R5600l57229c66951j026421r8368c00969A244742O72115n24527B01683
+562i21379m46215M60436c2093D05159A47968b82329j38149Q6929a41291B77602
+573H65328L38317k17707B75785f86850q16487j6700d23523A034323N46366p61446
+583H19243d38403p91998J6323d98462E27998O51127k18431B13012b92323m9037
+593c41360M4734L7928B5492M09388k5441b24079p07401j82459N18888D67594J116612
+604A584206L37161r43011f37100j027825J78854e45127C82790M41514j85127C7098
+615d61422j6971a64884A47185K91998K99618k6863G2972g85750l19912M87323
+625f18339B89489P52854Q7277B88876a043517p10070O12630B43782J006461J25730
+635A375973m81355A68487e33022l22004K44610i8969B58654J32411l2965A2112
+646f21005l38336d52475F00907O95984k32226I0650i83534m46764N93075D26473
+657A362165q6920D18889d89714n26757n7985M09315C2818N87109J94493j60496
+667F53924B30970c56272l68042L45148E19050N48343m44738d65990q71563j01230
+677a438783g12452E01430R61126k7622D78177e21935l30791K46998a88381B66249
+688F77433N2667B32376e17831n13919K619d69698D52858P08043j48979F2182h30666
+700h79619a13871H13618M25328m06591b06718r71342k29391N35865h8307E46313
+711I43467K6293D66179c29764n11398J17162a27620E87451M30350k71799b43585
+722a207107j7310b76632G42021L05663m38310a64532o55857j13224c47047E37460
+733A070782o7314m55483a03775p55600n23409J80679c12053F81412M35134l21336
+743G95210E993f52698O3148B35407Q74238R8612D17814f59296p11724m5670N96495
+754h20195G2986O48023Q5026l11916A05559b42389j89781a64030F00729O74965
+764A275694j28780A79299i92481o99088J28285f54385D98540N72145l76775i3057
+775d53084a46371D31824M28676Q8632l49417a41038p97726m23713J43220e66903
+786C90168Q27863J35973F18503d55286n98187K46130A0380P63798J26214B44415
+797f83189m14799M01495A10045O37972K27524j92284B13515d80444l78658J71680
+807f87422a48720D32282L60123j38040a23895r89101l44657P09069D76918Q42318
+817A319236R769F57888b33869n62261J39917A5491N74231K3938A81988c57368
+828g81257j61741K67610g706F95746K85894l28192a18146p44376j31074b64028
+839H68477O75753k76385B85312g64340n45592K00086c75467C05872J39394A16307
+850b56642j60527N0987e3629E48315N75729K7253D77639d77716o67383j6403d77100
+862E59807O69866k81240h2547r34081j81678N31290A12347N76710R8248C91782
+873a87774l43768Q0338d4817D89746M15789k0034B83116f07886n89825J15658
+883a082053c30081E84217M50531l88936c18135p39506R6569a61805G21726M66591
+893A188317j18642D36151d12336n70147J9564M69348G3519M27325J44425k90737
+903C54532b54742l97919K87563D35012O23919q2115A86199h82007p31331J09868
+913a503470e52925F25415O79067p8423n63640B8516c71936k4048i7291B57199
+924C68151I5459d78751n88127j66051N60601C94231Q93140J34098o40083a59787
+935h20456J0780a65322E73042J81406B37896e16378m65065J2763M48372B51207
+946A038395L30006l70097A78169f01663l74624J67156b14112C78762N2568a64406
+957h77628j41958c87626F35509Q09925J39984n97355I311g84569k39323K91714
+967g32178a83349B90148J16841E7801e52131m46898O7263c04157F02773O77141
+977A279914j9613E30157c35197l12568b43167D46781M18500j48630A7351i03969
+988a502596J22908f56627A80976N53722J42833k68017D9084d33748L1707A94937
+999H95134K44452m29782a80193q49719k74315N04367A19640O56441l0303A47678
+1010e47126l44517J99507i1161E32678K86946j72061A38094d41754k88709K94027
+1020d36436C64400P87853K00369n46505a83651r09012l53632L87545b49735C23920
+1031B47884b58290l77030J00683A9243P79979O79444J83160n11567A79308g38605
+1042a201110J03259N42071I1976K95064G1787e92333m06185K67488A01302Q81296
+1052I82598L82867l44525A88299e89494k61668L39031A56750N78469J41378l95188
+1062D81409b10058n68244j40972L17861a6690D87005M0305a9453p58693l22020
+1072a100166M52925C18518R04394L65376l46746C66733e21000l62760K74767h8904
+1083B02747r9268b83622m68767k71543K20181e1125H65297N41913j46178E30052
+1094c67583n44388J25429a28534E33600J54791B35580d77045m54713J37476a32565
+1105F28585L91823j75206B36360d87068m72907O2282c06957D33368L84068j92360
+1115F25076B9560e74881k19748L76840C84858O64669j1783C44653e08295m59483
+1125i67778J34731b61428D03318L56431k08197i6776o40786k12967L29259E9066
+1136G44740L21130k60588I8334e79721j75571c22167C79623M35660j78486f3361
+1147h26991l23900L18717f4056G08361L27453l00855C5825e87086j87692K89312
+1157d85466G1217N17860J57746l69536c17527m84247J42641C7656P76980L70560
+1167A185196k70811I7176h40546n00664K22219d23002B09582K08213k03004a52786
+1178c72560J75531D11567P46430M07077k55530D46973f23570p70968j22009N10313
+1188a006234b51491B47192k7707a98762l73669R6109A64297Q22771M83457j55309
+1198A315216F25775b49432o47251j19196M50187A20924M26399j13256i1899n79766
+1208f71665k74876K38637a6943G20275K52144m27229b15388n21971N5586a08253
+1219F48646N07883p3209D36038c90821n08312M4280d03135A04869K28754A25060
+1230d03894m89672m5312c79912E37438P54124J37598n43278C1158f16929j06541
+1240g23470c14126B72645L19090k30308b94647o27721j70072L77129c2868E99110
+1251H70635k51063a6072n68553n2184a11507F22640M66151r0361C79041d60690
+1262a034204N2456c78144B99934K67348k75828b84015m76908n1003c50176D02311
+1273A012610R6189m72484a05895n59139n3256b68174C63660L75759j56412d6370
+1284g63722l16853L25718E97O71254J69259l73013a67704n08057n6803b55056
+1295D90232N15858o1715C67370c43268m51146J9775c14648C00276L24495k43990
+1305C80781b70388n59222m1922c49066D41229O16586Q5537n27211b21568o36573
+1315h58141o3920d51035A81596L83428p1050E7126d45922k08558K92043C04455
+1326I19252J14563n14238c27904o78290j47289M33252B4547O18652J16792C39570
+1337b56075k86685K38379B75023N38909J64189l61604a49718p68209k95926L52615
+1347h61238a24878E16378K02279k84076a17187m37363K2980a1258F53084L11123
+1357I64207k88288c1467o95524k74914K94156a1473F79372K68484l15174e8830
+1368f73781j57345L61685A35242M42292l735A25208d84870l44056K20376H9157
+1379H20281K86348l11393A05210e63112k84667K53718B9286N43289M8292A35644
+1390e33627m12741Q4919c13256D25134N22310k2938C76468b93864l15769K21717
+1400c87916A76201N08726J05410C78453c52753o19345j07844M74887A32989N19903
+1410F52892J3715B28139c44778l23151J68649A10690O94313L13848l04481G4358
+1421f39625k91344K36122a21089D30904J62866B38294c86839m09823J30804h0935
+1432E74699L41642j63039A61809e27877l44168K54478F8064O50853K03816l41728
+1442E81005h5909o06587j93940L39926A01096M99745J12A21502d78662l01779
+1452g80441K03458B4548O55535L15493k39777H8446e81096k39099L22060A25780
+1463F24809N9989B67891c91514m97417J0355c20610D34609M55511j09295B28724
+1474d02002l35394J57523a9666E81646K12393l36022a77964m91910l6832b90041
+1485C26646M38830m4516A63503e74055m27279J73390a80355E34487L74752j50084
+1495G59155A96761d32969k88547K46224A24372N09926N2574B58003c57874m19271
+1505g77145L6395b49259D19079M14678j37521I1529e68077k80768K53345A8553
+1516F30619K45068k98698i9518o08800j22843d00707B63049M70996J6135C14622
+1527c17647m39566N7264a73575D44616K69747k50254a11542n22675j41097L53162
+1537d22152B48670N82132J01089D62724b72094n28458j2190c40606C09447M35567
+1547G45014n0178A78041d77618l42578K03198b8585E36238J90448k74772a06758
+1558f03754r5680b85454C83679M56336q1884A94387d85949l96074J04330b24253
+1569D63150L92241j74138F6693e56282k21159K84727I0747N19792J37636l50365
+1579C97810b30948m83248O434b19328D00772L43828j35740H5284e14288k98755
+1589h13043K28921F2813O41267J99130l67570a47713n77799j52694L42990A05197
+1600F50720R2212C24081b90945l63177J22657b8575E26673K60146k19175c2718
+1611f51071k20358L35077A18499N34805Q7194C51379b70266m80267j9576b78950
+1622D23213M44368j02657B09533d23935l34365J39175i9731D80782K56945k57496
+1632D80231a17729n11074p1894c01044B88085M04889l4695A75733d84575m11012
+1642h95587J42193a30021E74080L53142j75238A87899d25769l03299J94755B4746
+1653E47147R8381B47459c58631m13495K9965b81336C57802M37267n6536B11911
+1664d18351k91355K28890H7781N36299J74025l08834a57358o01515j61446L95607
+1674e24712A56913N15928M8735C21033b57891l97557M4226a27952D80872L02108
+1684G82980k22084b1439n47804j75878K89289A29056N29000J27368C87996b87164
+1695g85272M713c01080C30671M05932m9238B04804d24221l62598J66178c4751
+1706E65267K22346k66414c4728m99546j39367L19040B24439M34407l8032A16541
+1717e12651l47793J44482a58575E11740L99240j29501A97858d50886k84351K31815
+1727e03422C1350M67451J04611B77789b90426m44965J3248b18031D53969L99102
+1737H53071j12142B16322c96904l52285J10100a34271D36875K34713k71908a80882
+1748f54996n0069b90867C52973N03608M1087D17192c02714n01776J4537c33757
+1759B24286L08748r9200H048d60418j57634b95718C30024N02842L2320C98984
+1770b91971n31122q6969M12663A74448N06711J0625B39444c23544k75348J70780
+1780d28112F0933M95941J75760k98909a92902n54115j11804L98679A80249M87918
+1790F68167P1858l60275a94419m20641L1319a02355D86386K65391k45816h4513
+1801f53478k15827K68457A5710O02467K00010l22675a04046m56590l4382b27488
+1812B95958L53230o2103A04450e00579l10976K09564a6533E60367K18752k56208
+1822E22911e4841n52269j64682L53585B20264M85602J4874B86537c01552l85759
+1832f87311L0275b25190C51996L47055j30683D6506d93380j89807K74995A43465
+1843F30861J13169l64590b72519n20414k9681c46207C07278M21920l1287B72021
+1854b83426l40971J07168b4866D97808J71929l00085a99477m84205j13684L45796
+1864d51570A83271N51220J06356m11017b00913m20134M1283a56535C46757K49861
+1874E96618j81082a14317n44107j77995L44697A70786N77524J65835l07732A3270
+1885e28604j79167K86613A09519L73315o4964b5481m88832j94395K52593A34917
+1896G39664K36649l15064b7788o22548j93153K87194a9090D43468J29790k74249
+1906B99009a95653l50225P9733A1984N45791K34415k45517e3243o27502k92159
+1916i72904K36851a03805E23355K34044k52952G918c66607j7463d6720D31336
+1927G18613j55719a5353o71942l48795J75925b85969C49044L69020p8329A88154
+1938c08072j60637a57614C85281L60146q6101A68988d50693m10508L9059c39446
+1949B88831L66802j14858F5616d32822k06172K10921I2493N26645J82789l09394
+1959D92533a17730m90857m8109b62155B94701L59199o4432A23491d67362l32828
+1969h00190J56499a02625D51638K13554k26854e8993m63876j44740K94853B17040
+1980G29991Q9228l90776a66095m08612O379a79925C24996K72652j96502a78443
+1991g62363j92697L21044f202E70901K46624j79957A68238b69966j00728f2624
+2002D07176K57553j81690g0251o29998l56710J38883c31657C68402L89652j25583
+2012F32471A52425b96129j11502a33906C23042L39309l0490A87788d29220m01459
+2022h30679P6098b60342C39066L63757o3674A83494c97980l30555J59610d0357
+2033D63778J26485B91997a96915l53166K2762i7306E05428L85899j09710B28763
+2044d27898l92910M5238c65832A59153L23401q3856b3653m27915p7652a66395
+2055D06300M11275j6977C41336c19667m78435k594c39528B66025L45010r4781
+2065E16254A00956c44079k04232J70985H4823M64429J24425C27890b77647m69246
+2075g46893m2752c86678B30002M81174N9750C75277a98610l43101J11074A2372
+2086D48098J23719k72821b27544m79234j28723L37118A18736N16477J11072l29263
+2096D17022a14393m05679l3084a80270C66925L44349j23542F3606d92527k16410
+2106g08937K35877C0285M51243J29826k87378b19288m45184l5975c02384B64717
+2117F45601p617B61778b67521l54155Q0354d6165E34645K58244k27616B0527d97792
+2129f92399K22175A5660M10897K7766F2014d68759k91757J41434a17916D83396
+2140H81058j6081m26340a30865l36576R6754C5315L70733L1634F0774e32268m64927
+2151i97195k7021M81450A88859N57255J01541l17188H1669a99879L5704A40473
+2162D90723R6507B65910c38394n26409j24388L52125a2643E48971J97073k77759
+2172D68285i1611m46442j2730a40687C77324K71477j31090I0628c66063j95947
+2182e62010K05433A37899M59135J00645l44661b37725m95800j31437K94559b1315
+2193D52749R6456B20260b56786k29959K12516B51195N03069J79209k75465D3602
+2204e86387k81915J98943a85356B26868R8427A01967b72647k67892O6257b5263
+2215E65935L41240j48302B19267c65637k90916J48426c2546D59386J61713l02618
+2225C18481b50038m50581m9558L50324A17854L89570N6286B65250a95725k96120
+2235d91845J03936F7226M92326J91564k42798c1701n35050k14421K47491B7576
+2246E21753Q1920B40970b86900l37970M8351a81224C37681L34135o2233A77701
+2257c34818k54319J56129I447M44138J64979k35902a33336m67378q6523c17066
+2268B53661L74713n5797A44571c74912k99437J08308a02277D39188K70410j75056
+2278E34542D5303d29630j75862K07007F0445M40031J41166k84019a74131m07235
+2288e81366O660a82658B98385K46197j47736f6866n05328k01818K75517A06715
+2299F65405J87814k41627A17281c58767k06499J78837D7637L60946m302B0403
+2310d66003k51562J56236g2744D77853K89298j65081H4768d28607j62203K67503
+2320c23307A57425L69174L8898B46167b54159l81500n3b30260C26698L44772p9837
+2331E91633A52580c82036l22013Q6138a68096C45592K23693k04563g4719l18552
+2341c93271L4268D369M70958K87688j08639A47349d95217m07675N5461d01555
+2352A47653L43674k6795A18242b96705j62938b11227C05958M28808L7355l84289
+2362C87832a76389m16205m9084L17927A37276K80240j09476a16587m34139j35606
+2372f86332K65309A04677N15937K31165k03687A06150d35782j85425K63429A29815
+2383D83941j834A34215c50966l13439Q5031a31013C75232K17734j87601b5585
+2394d18736j20584K36598A78313M32934Q2166C38968b25438m13430j4384b77523
+2405B57101L76621k4384A83439c68011l00333J38643h7180C34993J40741j92412
+2415B83322a00871l25912l0095a20781C90202L43724o8979B16855c52342l74378
+2425g26720K2385b94354B56173L31485j13106A1940d54277j45206K52540A30335
+2436E47510J08681k72809a03602l78949j7517a67895B64623K35900j10124h380
+2447d68248k34749J80064A162N43988K05919k59857d5535m64121j20488K75895
+2457c54249A44834M03584M4479B47104b45355l01942O9238a23215B86537K14959
+2467E01496j15762a5023m33248j48169K72479A96092M11894M1063B96357b48227
+2478f75225m0805c19263B69746L94009l8517B31348b28395k51507P9835e7216
+2489C28953J54567k16240a91978l83828m2564b86998B19965L84619L2853B85814
+2500b39490l44180Q3760d7932D48217K09191j99943b3109m88530k22648J81617
+2510e52670f7011D10234J65221k18214e0548l09570j9270i8945C15147K66598
+2520E81745j08394A2901e10628k27021K15173a5783D72896J90202k11885c7927
+2531d93937j19729K92494A73503L71420K8883B61788a95938l38162p564a98722
+2542B67225K62650j31119b0550m02142j09065K54742A91212L99320O3828C02242
+2553b64825m14447m233b99039B12004L45192K112B31320b30444k91298Q9539b3742
+2565D06214J55467k10720h5245l98337j11833K67390A62162L74781p949A46882
+2576c26796k51857J16196d6573D33319K61576j41006G0347d55622k36977J77635
+2586e14964f9435C56379J63321j83086f8228l52501k8613a11774C51425K53002
+2596F04427j33277C8682d31113k35161J43983g2463D10578J96751k16349g2659
+2607d66200q1385K70974A95511L97736P1267C31774b04631l87981K456b43696
+2618A84711K32626r4358b5786l66353j09442b34367B61472L95373L3575C38346
+2629a88759m10010p4358K99840A24412L75096K494A41615c12083k32548J32361
+2639d12270e799D34197K02939j77733d269m38271j18617K62680A28939K93411
+2649D22350j2106A05662c16539k71661R2775d9507D74946K61094j61090A06299
+2660c93948k57955J22886a02667C48937J64092k24599a36563l11016J1843a19199
+2671C04498K74297o3496A25104c56597k52027J42792c9881C81329J53958j96858
+2681C38429i6671m15385j19725K90106A95005M30669M7288l36312a48879l47199
+2691d96078k6679b31595A86284K52263r8830c7504l67733r5635K40917A71965
+2702E45281Q1876k93281a87077m20576m0974b94586B08805L37969j5775A94340
+2713b59541k83524Q5438e1272C97934J82396j96551c7440l76250j12770K09289
+2723c17171H5997L39500L3445A44265c03642k59802J15792c2259D42143K54610
+2733F96753j28327A09966d12942k51531J67388d9824C61856J31141j99765a03530
+2744d47535o3964b27561B22964L03041n1050A26423b71886j94852J28810D7302
+2755D59447J53924k50384a60277m62453j12129K87069D9001M21343J21645k36652
+2765C55337g8078l31003N670g5880C25916J97405j31817A1226c98471j93655J63672
+2776d28454D476M08468R7771B39423a96743l07436J0810a58139C22106L36764
+2786F58870m0259B01705c29314l07798Q1122a76463B53703K35587q5840E4045
+2797c16498j20842b15228A86295K82641l2822A02853c35592k82171O6662a39855
+2808C76197K86542j19940A15957c31433k02793J44220C197M02531J47436k30047
+2818C23117a43152l87874n8065K83072A16154L05856K0879A75750a99739k08872
+2828d08611J36674A33137L83993Q7721k79427a68883m44086j46171K52371H171
+2839D69020J24095k46650f6114k92090m169h4170B96249K29235j10960F303d37318
+2851f17777J88414a5063C58204J17637j98363a13650l20955j0137a03598C69116
+2862F52290r6863A37286c66956l18322M3943b56116B35024K85696q4129I0916
+2873b41757r9458a59470A80616K72580p833A08632c64226k89407R3293a47911
+2884C24673K68596p6307A45489c01939k33397J43789C0372M02580J09060k38133
+2894C03879a23264l58040q4663K52412A22284L36517J0019A61412b25892j96264
+2904d22156J14459C8551L63336J42415k08341a27696m27072j03115K85588A08885
+2915D95068Q5829k48835a06214l55570l3682a85428B46661K47941r1369F2881
+2926c08854j71717J35071B5339L69347R9088B38761a98800l20416K274a96003
+2937B57405L25140p997B19949b67904l01603P3171a25979B86380J98864j12091
+2947C73153A9954c52911j43955K03189A22740L32506J9895A83572b17391k66504
+2957d83895L0642a30605C01132K54685j12171C1178d04072j78091J79250A1624
+2968D23634J66814j87782b7348l89701r1357K48514A28034K64781j8783H7985
+2979b92525k24398J06892a1048D22066J77466j83765E491c72571j27970J93345
+2989c07196I3860L54045N1199A90717b75168l16107K8552b24999B14457K99659
+2999E14116r143B00454a91621k00492J29585H6552L05412M3834A82709b32822
+3010e74000l9794b91476B08709L57746j604B40047a79402k64262L5245a01038
+3021B83938J94180j49439g3223l71158r1577K39357A18136L51182Q7273k36893
+3031C19698a02327l29019j4892a51823B25107J92636j19698f0329l82020j63484
+3041f05833J94427E8563M59764J66687k07631E6521c14721j24533J66951F5897
+3052C35338j2243I982c86698j93132J46226c2088C89785K11220j19733I4893c14640
+3064d72759J95978A18818L12126J8582A70942b42812l02841j593b24940B28282
+3075E19194n1920A33562b42949j88514J05501F642L47747J22529k15748a60441
+3086d93102j3214b00309B25729K97969q43B17447b20094k94262M6830a22802B68657
+3098D46456j33159c1846l45615j28657J92766A05210L73492P4666k63449a20063
+3109d08281k263a41850B27431K27295r5232a7754m11763j62335J86990D946L90214
+3120C95160J60302j51765B1722c51597j11765K26470A57908K77252k2539A16886
+3131b65644k35232O6774h5318C24597J91917j59314c3054l51373j02047K00144
+3141b86330I8573L42369P8682k52851a61811l20269m049a90835B03217K54478
+3151D57695l4383A14653b77294k09886J32249C1266L64856R7099k18009a09225
+3162d25345o2901K36916A45249L00044n185A34208b60691k24222Q3218f0633C43724
+3174E71676j07468G2507c51841j72460J69548A0029L06095N9631A61996a92315
+3185d50962L6168g7312C40374K20492j07583A03660b84244k17072Q1728g6641
+3196C16992J66222j80215i1057l28254n3223b23436A73478L04171J4046A89368
+3207b34358k57051O7690a02393B45711J62493j05634f851l24516j13684K07580
+3217b37471A74364L41360M5422B79446a55691l46083o4639K57873A08078K93007
+3227D01085l2395E3539b91977j29431J65004I7766L33894J15775j86883c2335
+3238c88203r2886K12565I2154K67477O687A01735b80920k52273P3379g7275C70750
+3250E87216j38723F8000c04514j51725J41372B5912L14182P2717A90063a68405
+3261d09240L0546a05724B48566K28610m8413I2936c38385k39004J18114g0278
+3272C21686J52804j60771c8239l14864n8235a55741B49717K74548l6783A80271
+3283b04308k52229m14b12232A34848K12115q2171f3229l26480q2805K30042A69688
+3295E29348R2255k48061g3874l53238l1494a77975A86585J95349p8631A2246c21315
+3307e00548J03887e5359C08922J52961j48930b3492l07163q4720b05382A89106
+3318E09413J0281A91636b47239k50653P9168i3022B59862J68808j16321b2921
+3329c72180j32074J69673B1348L14571R4192j69235f6537k82561l7028a17054
+3340B91778K64189p6747A06936c10001k07249J08999g3413B66289J18133j85268
+3350A99154a61575k85465j9165b16332A51213K93205O9701k00416d8010k90556
+3360c38566n164e7621B99215J59559j56276h0028l83832j48501J89295e928C61281
+3372D40996B17308a17896k14869K1850g1095B58926K30879l2162A54529b38032
+3383d65683P1888h1941B66294J63152j44231i5785l65195p5440b60785A62912
+3394D42300k4479A45932a90053j99382N2746d7689C03576J88703r2493H9049b47824
+3406d18291R5484a5809C06089R6404A67170b56646l12768K3133b05055B29647
+3417E01715l0725A89939a47826j67963J06838H7294K72917O8414j80759h7894
+3428d15513j37488J50142c1971C17884Q1793A59084b11435k19037R5923A8548
+3439D09632J82320j52027D8878c26777j29067J62281A8075K57481P0760j52279
+3449A94037a08382k81615o4093K23806A41727K67920j9357A02314b63527j99537
+3459d63064J14957C5804M03250J33730k22959e3082l02417m0200a95644A01362
+3470C24989J2544A10754b38883k50249J0810b09307A60721K56442o676A39966
+3481b11816j61602J77286B01091L14619j210B01693b14669k80284p291K50398
+3491b51846I6085K28416k7749E1293b38121j53067P6086c7169C11558K12097q6263
+3502D37392G8666c06495j33490K04292A42253K68982k8969G9757b98707k06583
+3512e05290R9429g1847B71003J43383j15830A6915b69715j42139Q9168b0983C31665
+3524E00963j44523i491l25693n8382a53974B11286K33658p5442A7387c81682j67443
+3535e49125J66440b5463B74610Q3200j34529c4143k39470p6234J68347A60403
+3546D69913O6754k26964h5530l32407o0706b30512A54211K25511j18178a02503
+3557d24715m3178b24300A32886K66292M6923j87012e4251k51031l2876a39019
+3568A65934K27602J0706A63244b18782k85106K6496a30835B83485J76850j74711
+3578B85624h7095l00005l4630a85130A64201K31941k4067A28988a62815j57306
+3588c20121N0291d7233B40570J97307l2484A04599c05297k47275R5932h4633B90903
+3600D11416j98931a51854k64351K8702g9854B99779J94608r2626A18452a62304
+3611c00919M6516e5218A95220J40388r7454h0012l43425j30394J91862D6806L76369
+3622D23175R9071k44668a33600k73032O8484a965C29966J01349j57374a2133k52890
+3633b65023j01717R6830a8251B42016R9155j38502i8825k84987q3105K07257A41205
+3645D79731J9808A70495b54860k01250J48674E5682L13706P8903j81091d7060
+3656c09762o4135J48127B0910J95812M0796A15843a52849k46290l2766a59990
+3667B75505K93368o6630A28969b71554j56260J70572I5369K82217J4375A34535
+3678b15909k16921K0836K05990E7472K03357N5327j39141i5342k22679J7768a5027
+3690C49718J75993j54412b7212l87623j14675K36807A20762K90620l0642H9618
+3701b29129j45333P0904i0587A52795J65322q881A06632a84099j83634O6593h144
+3713C33974J54627j61208f9595l56526m3628a67547B39697K01957j27789b0644
+3724c27463j17018J13983f2029B18399J47971n5482I8334a47978j35294O8522
+3734b14750D9619L04655J03370B26261b10956l21528L8201a40198B55780J66289
+3744D22069j45265e0591k80871n5509a93394A10234K30652M9762j24143B7416
+3755b29979j40758R2075B5546L09820O4139A46181b42119k32320R5589b1372C43640
+3767D59456k14812a39418k72260J3518a42442A61737J89296J5797j38516a5022
+3778b56988r1914J46929A06428K50815l169F9796c12356k11511J28459a653C73067
+3790D53168A99263a62000j86915Q9825G923K61055J25927n8940A13570a82713
+3801d00803j8173K04148A01937K41586r78G4661b87002j69438J85207A45816L22676
+3812D68492j2428A44825b14462j63313J03702b614B51985Q7772j19400b4529k37801
+3823b62330j19382N5110i6592B20260K21506n8151D3397c41894j29289K30700
+3833b40483A62557K70611m9350G1840b64085j28839J57178G5012K39075J9899
+3843C33986A57921h2548j92396p4863Q0677b4532B77469J55430j35177f3188l35740
+3854c98928n6791a85269B30379K65101p8728E6430c08311j00920K02709A00166
+3865B75965l6853F3029a38109j44275k1025J42642A09993K53541O8514j98046
+3875B34002a31630l04322k3658a56619B71353K34470j45146c9163l33302l0668
+3885d03133a56500A47658J59332m7489F6622a48837j26786K3326h8955A36139
+3896C14462J5128A29391b12127k56567N5839c4454D01487J60826k28698i4178
+3907d03134l859a54248A48641J47207p9022d838k03841o7505P6216b8206A77923
+3919C36791k569A09551b29057k03646J19386F2716L55377O1845A95331b38275
+3930e19275N7840a21166B42360J43320j22365B6270a49741m9549N9319e002A67348
+3942B82477n6568b3879k94227j18970J77752A21019L30432K9895A66465b77429
+3953e19208J35096b10C27439O0090j83062e0367j74900l5221R6548A9394J86730
+3964B06124Q6026q2470b0397k48660j00074J62959A45128K88067l1969C4700c90277
+3976e39328K33409A13379L02549J3608B04253h6462j82478l171a31110E7736J42444
+3987B00180M5010q9399f1771k39562p6128a73200A98651K52550r0593a2126l66837
+3998c78963p8969b00228A99911K56026n4249I8013b29190j46083P7846a01673
+4009I3750J37241M1569r8647e7537k28836l5238i3940B44330J79881j37638h8745
+4021d27267m2858a73998B43417K24913j18675A5269b68377o8170J28898e517A77650
+4033B84131k0810I0956a67364j89096K3914h1454B46140J69631j37668h8106l18092
+4044d06198m21g3780C18495J41579j95587h4815k48535k0821J69884E5059J85671
+4055B40730O1210q2851B4984a99851j42497M7409c5507B91685J41979j90704a56423
+4067d42994O4271b1973C33999R2796k11528a21881k23407K2366a03677A50952
+4078B87727k0867j32084e7241j95667j10603Q9391B0097L20815R1112A96266a91198
+4090d26242J03062C9089L41118O4740A89150a84770k09667P7078f3271A60227
+4101B36844n1867F2616a02430j56393m2665a42193A67167K59668O247A48116b48686
+4113d74811J16902B2570L40772L0714A04559b49311j37539J43090B6304K03947
+4123B30251N1018q3006C4789a44321j22492J1644h3564A82251K03254k9398E8765
+4135c27622j79022J96056A18483L15617l6157G2432b62324j05539J52786E0544
+4146B44880K6520j21863c1375j48372o3833M8020b7485B13947J64797p7047b9873
+4158c92312j00055b31436A93178K63797q0494C5194b97425r1751J91308A03129
+4169B93122k3566A04864f5817j10112m3153M6260i482B17232J20475j29565a21040
+4181d14523j5005a27432B89320K28485j29818d942l52618n9796a81045A25818
+4192B70551o2747D4028a04497q5540r347R2252H0792J92021N8040j56998a37726
+4204c98508k510i9716C03367J82863j98899a36550l06091L4612a02745B15697
+4215C46728q4166G1021a04417r2159J1622h5931F8174J42754L1141I2620a93417
+4227d14982N7749f238C83424J14402B40562a75729k52928P7246c3526B76430J01679
+4238C78109j41129a3785j90752n4662N8862h4504F5014J39408L7456H9009a85865
+4250c63332J09680I8436L25839L7477A66159b44215k22232J17120B060L12843
+4260C14903N2830A67805i7514j51833o265Q5147c5357A29840J32602j1152E8164
+4272b03644j26260J33338A27116K78997L159A00398c07044j86677J78066F7856
+4283C45040j7083I0267a61879j17305L5494a06389G1287J64102P6392o6268C6249
+4295b14172j24834J23723I9499K60572l4722a2350l75009r7294b32591A60956
+4306C99346m9113I7147a60749j07745P0939b5137A41433R9008P759j02402f7363
+4318c02877q9679J75020A29533K52157o5624a9854l29260m6911a28085B46674
+4329D45112j06289B8851b49235p0546J27929a941A34597O2075r244H2169a22358
+4341c20522j8489a04583B41975J93016j16939c2480l20185m0346a23092B44174
+4352D13690j55190g1060k36398J876a29636F2885J23624L9288n0393B7819a76209
+4364c19087L9974c7512B72096J55256j41705h0573l15547K65g6345B89474J12514
+4375D01988A99583a20321j94482K9352i9668A03786J19692J755r7597c0234j62511
+4386a92745q9837O7161B2533K85943J06784k00414a73097k72034P0638b8432C14030
+4398C97288A85550a30794j87009N1981d8911A60458P7705n7668E7701h0186j27526
+4409b07712o0718R1845G8811K63304M8510A44420b29069k10612J19262C7094L23453
+4420C60547M6693A57297a86060j75685R2790b2398A72771L9825p3369B6295i1026
+4432a93071k0203h1883A63109J98905k1289G2024b80044j79371J41698E7052L20512
+4443C77564R898H9109b55904j16794J59171E3357J76327K1920r1030B2568a12985
+4455a99476J2792e4452A46378J47643m1479i056l24089j26130K13126A62441K82675
+4466D45116o0882E5026b66376q5574J67032H1283J77841j989A15804e3979j15375
+4477a69354l6555L9562c8099A50662J34803o2503d9650k92294n9695a44759B40623
+4489D58563j12776g16l13602o1660a69614A22732J62757m5796F5817i8663q9699
+4500a88362j5024N7758H15J87182R8620j05757i3230k43602k291g3340B77124
+4512D49805j46252f0872l02817k0425a28406A75093J25948r6135A2778a40467
+4523b09924R982R4877F4061J67674N0111j34368a10476k07365J2781d0330B96208
+4535D32145j99611a53775k60881N7065f4052B20244R0691j11177c328j67500n8544
+4546b29372N7394c9272A12681J15697J4178A07162a38319j91358M4836A0784L24288
+4557C35072P8008A67511b03498k15319R0195b7466B51014P0404j54362f9967j50937
+4568b20904K150J03921B1894J31726R7883q932G5741a83585j58220R2134D7880
+4580C22896K5047I1867b56088j74223J31304C3147K82877L4432A53807i3270j22671
+4591b15941L1837f7350F3771J12208N8028o2113b3249k32496j00331J31048G2866
+4603C25890R889G5685b57792j38555J77872A31958K42146l3957A00656a42359
+4614b48727M2890g8680F9254J09394J8106r8287h6540j74581m5745a48448A48025
+4626C80609l1010E2412b82918r6090a71006A57743J88356o8203C1674b08674q9971
+4637b98645Q6812b8957A31489P1986k1957H1554h0462j56355k6089h1936B13202
+4649C92655j04179c7899l02270m9996a64564A58124J79191q3159h000k32839m0204
+4660b81043a38114F0186J31510L5884m7570E4779a21843j41049J3909e0687B10637
+4672C31361j31888a09220k63300q578a12391B33758J67065j27894a7011k16563
+4682b33574m653h0671I5254R6779J285q5456d2397j68880r1018O6362a8700B25828
+4695C25648j35716a06518k29278L9752C677L28057R7168j94434g9466k06698L107
+4706b83057a27887E4723J02038j4537C3426a06197j05890j8041J04467H9533K25436
+4717C14969O8081j84865a27899k15097P2641B6630K71490L4917A16855a83750
+4728c63292M5355a03631A19469J00134m4037E7678f3414q6854j1852e5868A53773
+4740C30810j2226H0056b29836j61012J09437A1646K59510L0717H2037b11986j42447
+4751c54433J08740I287K11971N5099p9060E7694g9064r3464n4e0766A40158J26177
+4763B66335n5167b1207k66470j05765J54655H5423K59831m436H5025b07729j04338
+4774c12067J34281F3692J70971J7289j12159b6229j43454o0485N6425a8266A58011
+4786B55853o2007b2905k40204p5305a53766A72441K11168p5688A2525b68417p4015
+4797c42432J52881E8154J70926M938I7818g2747j06945J85h9276E7900J52875
+4808B10775P1941r7604f7616k38566l6033a29268A70120J51491j05597f2615k44432
+4819c07047l3093a42066A44153J74033l1398A14087f1687r0768L825f8724F2227
+4831A87122J9128E9218a86924j80581K8391i9335A97529J48293j06859c8399k24222
+4842b62621J1034a8196B49763J08526r8507E1700a39998j01559P008J06137B4934
+4854A38770q526f720j90215j07242Q2591D0908K88022J08775j63749c8083k23365
+4865b61448K5403a8112B01545N9717j28037h5744j82522n7207Q2644g1945A00891
+4877B01972j2669F5267a08248r7859Q8756A37035K36964K0328A57799a70976j90259
+4888c61235N3879g8966A41415O5638H3509a27865j41270J4009a09453G6724J50735
+4899B27459O5794n0848G3655a31717r7432R9976A00809J75442l0432A1540b75943
+4911d13180J10416a8169B35652N2833A31924h1848j12024L7851b2949A28491J10567
+4922B39058J7031j09811e8044j85278m3451J36364H3238J64539k8610b245k59913
+4933b62158r1603J61989A07003K15380j0510A18908a01788j13452L4828d1542
+4944A17020R1144k8525D3476a36941j26074J1681h8103A50063J56233n4869C854
+4956b50982n7376a26994A46037J57262n5468C7615a80315r5681P4250a9190A54700
+4968B25354n1278C5563a23435j02007L0413a7449B06011J01869j21837h1121k20663
+4979c01784j6105a24260A38608J50424n8965A2880a98220n3318J24616G2439J42996
+4990B15435K5213q4217C21a68915r1712O1451c808A96822N7736A14535a28768
+5002c04941K3978e7535B17906J29263j04428c189j97942k4802i5465G8112J14684
+5013A92796K792H5663i0427j50334l1803J17186D9772J75605L4602A19939a15320
+5025b76318N2015A9690K54728P1289j58796g1790j79382n497a17768F6235J13977
+5036A80212j6997C4163a27920r7500J9975f7801A29571J56793J412A03084a50571
+5048b90712Q5796C7052K08907K4528I9798a41195j53783K7691h1519A31502J04893
+5059B36395n1259C9302a08553p5775K8512b0907A60812J15289n5595C173b30287
+5071c16951J24021E0537J98143J5366H6098a57887j27909P5463B640J93125O0616
+5082B56381q0899A9419a32889p7293M5313h901A65228O7432r6501f9901j86087
+5093b55988l8287a40688A14899J92113j4313H1369a63977r8538R7852C6291J60029
+5104A96320K8412j07345f0744j51225l7731R8998B8532J57821M5317r5821e3834
+5116b22404j5760f4272A87050J38636q4514h76k27544o5730J14906B7388J64729
+5127A92117K2912I0325i1339j22039J0249g7314I3256J29479J8913A19011h9838
+5139b42226K0302b8539A97647Q9759j12588f0947k04824m0244J48848G6739J56139
+5150B32878j5184F2733a09502q5314L3963c1421A34609J16631j6575G2353a41799
+5162b64029N7492a4407A81319N9713A17734a14283j78427Q650h7433A56931J26091
+5173B83022n1134F6298a03462q3438L9175f063A52384P5751p0481b1568j82686
+5184b04254p6969Q4974F128J99322N2735A15873a19939j47775N5979e223B04746
+5196B85031q3396A7177a61033o9676P6603A3205J50661M0358q9853e6773j61948
+5207b18721m9743J13325F6279J81769Q059H4506a34699j05927P3647C1959J90780
+5218B22739N6695j15888e2030j73942k8210J16340C3477J28850K2581I2081g6205
+5230b20033j1575g9208A44773J42200m0764E6232a54659r4630Q2622C6250J80428
+5241B16678K2093I1841a19258j30336J8486i4415G9921J24116N570H4061a00188
+5253b19941L1239b2218A72889J00560o5476I308b02255p8028J15594E8845J61649
+5264B20494j2630D7677a37909r6379M3282c6277A43864J01296m0256D6087a32944
+5276b22128N0673i112A71944P8469r2847e8972j91343k1528a11681A09658J33741
+5287B43399k9559E2956a32775r3556N7574B121J67714N6417q3966b1149j51387
+5298a72536n6921P7066B9517J79900M8878j28716i2400j57305J2050g2235A35063
+5310B47409n3670A1092a77719o2555R9047D2509J46394K9698r3062c8186j46501
+5321a84687m0043J06531G4665J48287k856F5255a33967j20892M0796c3928A75972
+5333B72212q8316b3626j75228l1300a12420F2448J27576J2876I1246h1445j29582
+5344b11027N105f6754A16468J12413l0521D1242a56456j06641O5600H802K00076
+5355B08878N0461j22841f4792j40265l461g9852I9379J22330j6824E5094a31033
+5367b32861L7522e1549A17233R6603m2064G742a73746o4131J12240H5217J64128
+5378B49345P685A11273i7624j42795R349h0941A06533R6866n2232c189j50345
+5389a53534o1094O4318A0002J73459P7798q0279a4062j72632l6104a01814H5088
+5401B14061j7051C7981a64523j10985O0206b6398A61002P1400p1903F209a39922
+5413a92409P9983E6641J52970K5837A12687h1547j43578q218a03292H8641J26538
+5424B15179l3926F873a84201o4021J02470D5859J58762M1362r1229a9090j53444
+5435a72534l3424i5232G9250J19645j0623E4708a26117j22534J8479f7440A36361
+5447B37864o8572a0118j58274l5268i6889H4427J45437J3762A08804h8952j32250
+5458b21202R829h1093H0638J00914k0518B4230a51753r5299O4118G552J88521
+5469A96073O2498r5179a9989j52408k7126h2729I9045J21219k7503C5011a47577
+5481b41315M0570e3883A14625R5015m2934F139a59841n7219R4461F0866J53538
+5492B14404K9106j14626f4536j50850k970g2321A16000R5894n5841b960j57424
+5503a60384o6960O3059b348A65606O4646q4656c0140j47518k6445i6346H0570
+5515B21977P653H7857a14240j21810M0506c3077A33863O7348o7603b5321j57756
+5526a83077n2002R7137D9201J50440K2461j05497d5833j24922j0817f4049A17728
+5538B36362l8406B1717a70684q6790O5508b7242A39808O2529p9169d5355j35686
+5549a81041o470e9193A15125J16069p767I5929h6717j27829J0843f0569A13633
+5561A94765o3815c3101j55818m9371R3993D4523J68032L5299j16924e3208j25448
+5572a78656Q082d7584A05958R1719l3179A6765a57839q6931O1340a3624A54289
+5584B17375p6532b4332j51486l5971i6747I4582J33312j4314F9798a04733j00161
+5595b04894K6431d4350A17380Q5816n8079b1082j58354m5274R0814C3350J48378
+5606A81728M2797r2986d7300j41653q92e1469A24334R4137m6333A7132a57674
+5618b49247N4540b4486A46056N9965p6162a8414j22598k3358g0595I4470J29912
+5629B24382k859F9996a28647j17915K7768g4746I2304R1865m0803d253j51698
+5640a55951m2829i6192H6171J40275J7845j11840d4514j45062k6083a07480E7986
+5652A61827k7379d431j52234o5980O6925A6137J74975P1615q3713a906j54504
+5663a56410k9845h4104G0409J07366p681D4549a29534j14721K6450f4383A12674
+5675B02526m3853A8786a24102n6898P8130F5606J49566K2010A13643g1312j30362
+5686b01674p603i6998F3767J05488k0982D365a60292o6018P4039A3259J59506
+5697A72765O9728o0825B2733a36310n0532i1811G0308J08443j8996B5948a39620
+5709b42163K7288f2358A23498R8235m8766B3909a19067m9498O9166D9850J35871
+5720A85721L0996A04726h0492j36877j878i6107F8368J10494r625D3552a19235
+5732b02272O1208B3633J54227M3784q6558b6087j41938m0544R0400D7466J30518
+5743A77984N051E8780a07467r7949K7899c9132A28854R4466m1549B7965a33340
+5755a93556P5932C3606J24947J6572G3546i4190j30497l41i1584I4458J19749
+5766B14207j3828G8403f7624q1599L4915B1519J44140M5611j01045g6802j56364
+5777b33166l2890R8704a539A42037L4996H7981e4291q3286M5946E4685J48793
+5788B03478N9582o9285B0748a68957r7371N0969e9729H3595L5306C8396i1474
+5800a81805J8333b9417A59722J24339k2217A11589f3551r5589K7033a8405A03615
+5812A47694F5904a02336j43897k2599J14861B7895J41066K8865q7591c4396r7300
+5823a31696K6309C7331J60340O7494p0316B7397a43301q9114L7895f4161F5700
+5835I8690F160a40798r0340L6752c9988A53558J35675Q183j23598a00j11034J5838
+5847i5296A2649J03049J0666B3263a48281j45123k9992J16257e796A63115M7807
+5858B10922p3742A4892f2008J9856G2235J36257N6970q7362a4565j89293q1015
+5869b84873N7989h5313E5525N6956E4711g6915j01168K1606a4060A63198J03352
+5880B66550k0840A15215e0055j07310J7606a5068A19455L7796F7952i2513j33024
+5891b25537l0415R3094A0113J49366L4514r6574d8224q2910L2658B7334J41523
+5902A68857P1497n3897B5922a52110q5074N6436c5816I5186L4100E3918g8434
+5914a80084N145d7231A30850J11980k2482H1804h2190r4361K2944c1808A07299
+5926A70358o5975d4903j28130j8946i3585F1046J19874J2590H4974h0624j18498
+5937a99122J2460e5214A00260Q1413m0304A7091a16567n6117O4072D3953J40601
+5948A84554K9007j01893e3163j26377j7215R3612D3124J07669o666B1918a27554
+5960a98493N7617C521J45131O4551n5657A3256a31256l9478g9982G5380J10164
+5971A85544l679F8104i0533j14894p563a02409E1647Q7734l5943b2761j19761
+5982a42522k7048h3860H0512J52447N0128r1166A9606a26617l6461P2416B1933
+5994H9942l0497f5795j48926o9711P2641b9153A59239R6229k8911A11480a1861
+6006f5214a2508A03942Q2318l7088c292j83673j12853J5364J28314A5114J20867
+6017A35981M939D0753g6407l4137b9676A17116J20351K1964r8761a1606j51574
+6028a63180m1705Q4644A9121Q7648k3314c3460j33691o8476M7696c6028A33788
+6040B20489m6046D4664g0418k2218a4520A17258R9572n265H0734a10904j40050
+6051b50954j0515J06553a3852G4551r285b4965j01990k3969e0405A26538J47894
+6062B74432K8603r9775C2779a17281n9998N4744b540H3554k3360f1852j34675
+6073a96527n1325O8429b1730A49096R3996l4106G3248f5692m6739d2501H1104
+6085A66771j3312D1269a16538j10986O955i5806F2891Q9352k8363G842a17523
+6097a70603N9345C6199J46603M6834q4380h162j20387j8344f6047F0277Q3490
+6108A43767j7108G194a46111q1674M7649c5307A13123O8739m1740A8930a06072
+6120a49811g3169G2657J14472Q75G6155g8464j06983p11g9201F9864R0840k6757
+6132A33947A0188a20985m5413O0315B0469J18959L6564p5242d7623j24478q274
+6143a80375f9105H6730J03639m854G7536f8037r7609J4296c5077I7619N0906o5588
+6155H2937e0051j15677k5660Q2330D1930J30204K9192r2329c3780r7142P645b4566
+6168A00243P0713l7583d867j54558o6617O6532a0407A28449M4373o2366a5439
+6180a29217k4859f8455G1732R5392j3832D4204h6160o7783L4114i08A36216N9147
+6192A95363o7468c0536j45618m6682P2550i743A13921L6556p0666d6219q6796
+6203a33015K3940A3322J39304O6622m2798D5388a05427q9513K2327e5645F7823
+6215A06398C4132h7804q3809J5285c8310A26142J18940l386A15758e1078j03388
+6226a54466Q330e0446F1573N3356m1291d4614j16006k9610Q7400D5062J15160
+6237A60222J6535q4128d1780r9716p93c5235A11771Q1068m3641A3486a24296n9027
+6249a83323M7701a0804A15937M7872o6462d1755j16188j7100h6330D5453J00837
+6260A46290R731F8614e9607p7200L5565B4621J24352L8652p3691c3859j38299
+6271a72158n1699O8357h437A25927L1712G8735d3455q1751Q733b1728A08467Q2345
+6283A90812k4471D0938a07112p0147M3799a4675I7175L3590F5226f3636j03698
+6294a67334k626e8236I6026R9315j0865G5342f5496r3624O379d7247I0097P1147
+6306A61244m3832e354j14799l7755N9776B2043J07813J9537F1570g7334q9739
+6317a67073K3107b2787A14680P3593l1977C7579a04180p6161L9418a4958A11356
+6329A55427o1844b9007j08195k5776P7688E5055J05240k122E3147g7281p0026
+6340a47307L1276a0894A06399N5168n2901b5546j26341l2719Q2509C7195J14443
+6351A51638K4613p7953c9038j14211j4971g2139F6746Q6723k0509B9932h4809
+6363a41580M3290A7894J13170K6843G4088f3396j05537o348h4042E4246J07256
+6374A61502J2118G9502f2243q9988K0838a8099A04750N7447m2436e08j29496n3588
+6386a83592O1522H345J11463J7380E9109e2557p3051J3534a1600A17340P4716
+6397A92056l7649B0884a24352p2054L9648c7112I2324O2953m7760a8075j12771
+6408a30846j6653f0189G0541Q4258m620E9106f4485q1418J6120b2241I9069M9885
+6420A48954n4728b5550j10579l5841O7408C1676J24421K8492q8257e0661j05480
+6431a56141l884f8674E9191Q6660o236D1846g8183n5002M5676B3649R6236K0473
+6443A40358o8537e3756j10670k3977Q7846D7767J09772N055F7228e9589p6487
+6454a36076J7874a1018A17858O5552m8908B656a26327m8396N0911a3800H5716
+6466A15143E4550e5168p9562J6047a0281A20054P0677l2314C8981i9788p9393
+6477a79181L2546b0859A10804M5748o4801c0814j01461k2686O9110C3507R9050
+6488A32557J1374E7081f3986p1444K4891i749A02807N4693m1143c395j24021m2049
+6500a69465P2221D0518J08089J3135G6014e9344j06089j3914Q9077D7075R0743
+6511A37818o956D2179e7138m7232L2677B6753J05529L5629p1694d4427j17395
+6522a61822j9082Q1564B7121R3794L982C8322h6478p4508L3752d556A29167O5875
+6534A95042l6357D7189g8348o7865K9050a3195H5026J9538C3971g4481p2203J4573
+6546a32111c3473I6465Q0828k6282C0981a05824o1243M8047A336J17178M6862
+6557A65376m9136b739j17064l8387O4031B4347R1726O742D5871f4468p4791J6319
+6569a22940b2077I9831N8148m9513a0638j07674k7194O5572D1953J05539K2678
+6580A70170q2958e5718j07231q864h3470D0790Q9057N439E5269e8420p1220K5568
+6592a04072A334J03806K7642o4239d1197r0157r529e8120G4425R5101q984E2917
+6605g9579q2844J2199e6037F9223P8818j8906A9497a02555m9378N0580I179R8386
+6617A07565L0047n5903b6388q6012R12b2720I3526N4693m0817d074j18343n7836
+6629a80253M2796a4760A17673N6315n3878e761j16591l7112N8559A6311J03815
+6640A20126K7188o6705c0097p0146J7083E463R0267K9725n5558d5869j13116l7863
+6652a96848O8004I379J24527L1963o5592a3469r1982r954c5843H9648Q7182j6296
+6664A60534D7886h9325p9418J4666f7783B9991N0689k9571c3624o8863J1323C668
+6677A24649P1982k0411F6541h1442j09084j914h7841E4338Q1251j8545B5402g6274
+6690a21679L7825A7684R9340K3650p0231d5622q0411K62e0158E3528O8927j4017
+6702A08438A5105i7258m9386N3865C0172J15042L8681o2154a2347j33299n2769
+6713a98415O0942h535I9714K6108n4817a8347o1067O946a548H7829L9253n0023
+6725G7059c7531j04083k4158P3603C8928J14333L3589p2975a9455j13815k2302
+6736a55572P5255C2601P4259j0458A0269i6204o0442L1679a4653A07791N9513
+6747A67304l2191D5519c6266k7124b0310F0035N3335l2528d0690j43675p7486
+6758b61851M1761h3932G5925J08008J1276p9718F318e7078K4789E0452O8445L03
+6770A19200D5061f7487r3419j8144P2063H484P5279j5761a6326r0102l1209N6866
+6782h0771D5802J32078N7342n7064D2750h2829m4203M3031G360P6153P614A9014
+6795a00205q6586M019Q9438B1790P1071l193B9195c6894j0283B4574J19575Q8672
+6807B32821j1660A03613f2143j32608m2942N7147f4542C6255K2297H18h0331l4319
+6819a14650N1109D5339J10748N0424l6452F2394d9529m6177M2104C1225N4796
+6830H6021k4550c5363j13994o3807L0684f4004H0630Q9539j5867E7327e1450n3540
+6842a04990L1430B0280R9805M0272n0899a924r1802j6549e1844B8756M1770k8123
+6854D2403d9279j06243m5401O1274G28J38096O2735l6152F7561c7180m8568L4383
+6866e1365D0068P7105o578A8000a03145q1058M764Q5528B5725Q4717J166C8934
+6879d3341k3914a4086G5552O4243o439D5607h8104j02554p045i7214E0162J08787
+6891A58949J7053o9610e63q3672j1761c5791D0956K5344A2633h5572p2092L188
+6903a54476f6455F4043J07102K3856o9575I237g4288k445h909G1718L5714m7208
+6915F0224e3653j21198n2659N2695d1539I0869O1862k6785D6217b7582j8080C204
+6928H3375M9805l1088G54a10101m6448M0019a6065H6541M3627n0436d0434j15441
+6940a55875l6122O7434a049A08828M2756l7189C1819c6297j47C7038Q6993K8613
+6952A52644n9556b4235j15917o1993K2647h6532A4454M0681A2736f6519m3070
+6963a09589L7801D1029J37050R3633o667j09289c438j21106l1868M2409e0802
+6975b0952k6909o4814n4892J2194e6177H3050J07100J8535o8609C6149d2956q637
+6987e1593A2986Q9139L8539n3876d0281j30396n8349L7798h5631B8766O2507j8120
+6999G3153a31o5988R64A0148J03010O3388j1355q0142b0006o7678Q200g712F7259
+7013G5396d693j23884j02347j7709Q2405a3729A35643P3840k7713q5217B5208
+7025A2106L7355M6433R234D8459f5338j17373m7580N1310e9325E0347M6625l2258
+7037F4714a1138o3558N321A4340J16619P1558k4886F9091f0168q5887m548P4090
+7049g6513B8352O4321j8892h148q2042k3078M3858I027O4542O480B1003f8970
+7062a16790M0895D0742J24216N5390m1195E9429h0991r2567Q57Q0058D024M5202
+7074D9226B1404d5259n2595P285a7830H7685P5585l750G5846c2584o0736J7156
+7086g6164c800G1212K4937D4032f2488r6153j9538P9503C3331J07336K8484o1576
+7098A07575a719r4996l0848M9425A2606O4704m562A1892e0781j5036a5731G3173
+7111A47673L264F4862f9115j04563j6898P0762a0951G4789J7809C6271e4637n4015
+7123a08652L2026B9002J14137N4312l0625G1894c4632o6982J441d3557H205H91
+7136f5177p6899k5791N4947E216J32045P8073k0980H6453d1132p1915J7502a3310
+7149G4932L9992l4377a1407r0896l1587M8880a436E3374r486b0478p2915l3712
+7161a27105M1395B1607J16626N3628l8183E4363d0696l6940L6202C6781O5628
+7172A02409p142E383a26563r6579o494Q3843b1254H1811M1623k5037D5656B0559
+7185E4840O8591M3896k6814C7870i1121j00876k0672O8105b3584G5373J7582B7178
+7198f5794n2607K4059g097I9046O5852j3085G0490b2313l9885L0634C3463M7826
+7210H1289j2396c684j01794p1387P944h0130C1934O6204j0500A7756e9526l2393
+7222i1919d5207F2833J08177L9078o0130B8470h4610n0779K0111e3643C800Q373
+7234A2173c6524o8453k4898N3792C0311J01135M2977l6114D1563e8862m3053M1228
+7246f0687C4654P8071M690D4475f1454q3160j3838O4787A0904P5796K749B5061
+7259e0754l0613L1732B6280P2904K3669m7445a8122p8534n912b9765F9609O2960
+7271A32569j5179B9745h7482q2326K498Q2605B5283O4902p147B3732c7291j8530
+7283e5821a3462F9761P0540K925F7069d4325p9282q411N8314A0490N6003p500
+7295E8993a3775q5466l1230N6357C5084R7990L1606m7148A7238h1617m1839L9486
+7307h3970D572P1650Q887C3898c9828m4277J4597g18G7868K9698m9971d7376r0133
+7320a37509j9628O2781A6242J00796L8502m1307B0246e9763j4960a9660E4287
+7332I0133k6876a4556r1486n0627K7096c7265F3920M5124l1491B744e6797o741
+7344f3538e897H2028N7960j5726C2637g9022o7389J0649e7014C6875N8478r797
+7356H5556A3330g2070l5975M1138A9827P3646J5692m8609b1778o2576j311a9996
+7369G1960M9551l0595f53r3853m1490K9369b0294G2810M4576l5122f963q0042
+7381h7005k0461M9654B9066P0668J4370n5337b9961o0798J2170e838G1856K6428
+7393I8284m2287c0032q1184k7288M7993A1713R1394K5342n3184a3843o7913p856
+7405h9612c4293E0200O2285q478B5856g1349m9245K4280a9600E9326L1018l3484
+7417E6860b0357o7925o638c0727F0645N8321j0415C7330e5544o4347M874c7903
+7430F3401N9050k1266A7822g0291l9675K8230f853F8073K4822m6317c4404n5447
+7442h9851J2910g905G3316M3882k2741A5184h0673n1340K7425a5546G7598L9756
+7454A17354l4120A295h1570k8468M3205B3382P4140N352C7357d4199m7611J3593
+7466g8217a6579E8906L9118k6542h009p9913k2918M7831B5035P4421J8231n4043
+7478F3644c1634q1735j1885e7538D4325O6746n495D0968d1668m9763J3314a3820
+7491F0727K4709m0647c0274n8378k742c7196D5979O4802M192D4536e9552o6824
+7503a26376J3185c0743F7044N3393j9744B4306f6664m3910K8474e200F4264J6208
+7515H0472C9320b4907m8534L24a6266F6544N0667k0577A2812h1069m6251K4724
+7527a02596b0320G0308M3419l3657i596q2144j6070e1946C6440O3843P443n1640
+7539E6086b3063o2799o004c7477C5650L9757k1985a2252o5577j9250M6523D2263
+7552A23532J3662F6049d3491q0224q035O2438B0606O9990Q594D7361b9903m3223
+7564g3126J7211D984N9786K0021l3989b3741p4349k2712N0945B6620P4405M435
+7576A05460D0995d4432m9001J5697b337H4151M2701l4351B877h7551l9640K5427
+7588a01764c3210D3984M1222j9506H77e7702m491d974G0340M0417k5767B939h9157
+7602a37792L0173a5284G9462L4328l6772d38o7330j9420L5822B1852O3854J0537
+7614I6243D2912d2719o0265J498c9509D4439N4390r462B0187e8145k9083M3578
+7626d3650C6843N5973l946B5463f0432o5148j675f1724C6942P3582R323n3480
+7638F6367a0071n4365k031a5436E1374L0932l7673d2551p4133p524e9325C6688
+7651A06365P724n4344b1705n4429P722a0383E5622K9518k6433h912p7149l9818
+7663a25879K9627e249I0275L5620m0682A286f7988j4285c6977C4246M7418j5826
+7675F5838d924p6106k6179L9196H706P2482L1561k6791A0609g2142l5471L3284
+7687g4329B949O8871J4579C9603c8824n6133J0133h112H4941M1005l6065D730
+7700g5316l3407K2436b4816C9715K6736k6315a9386m5936N002b658G8249N5326
+7712A33575r729D3618f6026p2409P085e6222B8446L7599k4371a8749m7371K766
+7724f3354h660G0658N5984k929F0295b7205o7088j5686M0676A929N8512o74a981
+7738g4319k2960d7542D1655P0787R394F0676c1729p2132q240e2323C3319N6337
+7750H9656L074m4470a3078m8030m396b0893D0932K7924C0739e0673p1374j0607
+7762a32654O0684C2669R1923K4710n2950A0241d5962M717E208M4504R957B1907
+7775d9939p6308l2898L5178c3877F5035N7686r150E4831h425k4301B791O4904
+7787F7695L4062l7397b9574r0849l3595L7156c1660E5292M4523j6935B2529d1262
+7800f6691K5018A7752N3814J5808m1679c0662o5873j235b8690F6109M9965k5699
+7812I0375A1051f8092l0817K9209e094D9578O653A3302e1038m0652J0396b2035
+7825F1299O9994J7235n5947d061p9408j3267M8139A4735K5724H753e8386n3081
+7837a11467O262c3458F7427O6319k796n9091d322n7294j6302L0081A0065M6534
+7849E6599k692b024o8878k8851L4274B0434Q3917L1158n0000a5279q4782j5066
+7861a15127M7861f68C9912m962D68c7282j2543a5732E5984O9262K3116m2851A3051
+7875i0975o3652Q692g1506A3539L6908A9633c9632k6329c1216D8853P2969K4798
+7887A46620m1266B2375e9577m0937J4499c3211B4252K9743j5213a5487o2106j9848
+7899i7441M5541C2890O4021n342B0632f4900m2113L0051F603Q6386L9367k6761
+7911A05595C7878b4627k4119J2077f206A2640D786d0961o6856n0121J4745e3952
+7924F9406R1721J5782n3863C8150a5108P049C9953L4599k6910c2642q5639m8862
+7936a67143N347N4704b4771E1791L8715j8987B4009a2423c884D7327O3939K7920
+7948A39186m0116a904j03545l9967M2188a6631D5209K711B032e7207l3117J3379
+7960g6945b2544D3930M0215l005m0211h968l1141J2977C5062P4575K8007n4101
+7972H3543b5660r7451l0565M1364c7709A1324q43c2667m1004n29a9830F6634P7438
+7985A44072L2284k0267o6614A939f7278k2078K9577a6508P111m6120o9538l5309
+7997a60364L9625a5641A03616P0901j2521p5695A777d0846R020I63K6707L830
+8009C1500G647c6981m4731j1457M1046B5100O2653M915C1469e8002o3780P051
+8021a14731c7447E7017M7517k4636A8137b5478M585B1279M9879L0597j7446B0528
+8034f8229p1331k1325L5971d9353B8228M0217j9947a417k6456A0859Q0581N9422
+8046A50862j1604E6651d9575p3975q882M9737i795D5665Q455B4637b1605l5097
+8058e6702n032b5869C3240M4519q409E670f8144k4526d5703D3993P3820R375n7055
+8071G0133a4184n6472K923b1226B3084Q627b774n7515m9769j9860K7767b4860
+8084G4107P3666N213n7880A9178a7916f94D7443K7827l2379d5536r0043l5257
+8096a70836L9096d8417B3429L3573q944A6802a8137j1030g11F3308O1136J5359
+8108A39803m3376G914h0372l8818L3364i019D8766j0102b9056o4838j1513M5112
+8120f0295F360M8833P951k8664i087k5678J2725B9983O7359N1723L826n9817a7723
+8134a25846m4480L6044f1231a4902r826m2047k7049K7316A2997R8363O4913J748
+8146A78021n3711E1514d451k8235j616J5656d284j4758n4772o9920l3780M2615
+8158a34899b8317H8878O4834j7497E9996a5235k3242d852D8638K4310k1319F128
+8171c4568j6045R690a1201B3903J5784A0865e9243p4472k8688M7250i234A01982
+8184A61743k0776F4302A057g064C4280M2369k127B3663d8876o0402k7800J1920
+8196a25158M8703a6776B5101Q756A0502a9678k936B2128Q2231O3997r467F7033
+8209e2386p5886N568e8917I882L2970j4667a6571m2015r977K3261d383C1576J5785
+8222D7361j0800A951c5738o384G988P9914N2361k2252B8016g2946n4322K0854
+8234a06414c3351C6967J8367A3552d9554l9129L922L9077G137N0657L1408k218
+8246H6984l7278E989g537B2340M6517J4360C6212e8253q9632k8067N6446a4506
+8259G1477J9868m0326e781l1582O476B668M3202L0467L093l4598i189m5116q004
+8272f2309b4114C2150L2250k6285c6321p2139j0463e5997C2198M9209j6422C838
+8285e2021j5594L1419B7463O6775L5866j1002n1542f549o7385l0461K0192c5775
+8298f311j8519n0897l0680L7167B4575R7592M3015l0678E3453b8683l9334J5816
+8310e2201g428B9896Q932j8092b0510m7237l0748J4558b2750D9157L1739l2970
+8322D7926a8003m8191J2200A0162P2061K6749l7316d653n4936m324b1218B8047
+8335E5039p858I604d9131n5694j8688L5004i816G0593L4831k4771B0592b8113
+8348b3559C1746N4411J224B5135e9413m9275J1898d4430A2059L3204o59A1260
+8361c3769l4221J958b0929D8616N7971J0503n2041a9361n8791J1467e199E1028
+8374E1604a471o2423k8567K3369h591D8791K5499j7484I383c5387k2866P469i298
+8388E1049M5126o980B3857e9830m0198L0976E631N9759J317A3587e3433l0216
+8400h3649K3169e42D8879J0922k3057C67b7732j0654J5789B0512N3221K1306l6634
+8413E8405b3577p9655k5244M5816C102O9149J0419C0889c2092k2376b3714B8734
+8426F1477p885A8700b2249l1099n681K6097A7197M7099J2794l5815b8258o4683
+8438i2941j2380d9210D0306N8168j6770A1860e5620j4328c0987B4172L5490k012
+8450E7650B4857a7882l0299k097K3448A1519L0829N072A5042d3344m4637J1664
+8462g6317b591H5722L8054l7724a136p3619j6339L9845A0997M0200l606A3435
+8475b5407j5358N645a2266A7330K8400K369A2612d5097l2965K6389B1540P3759
+8487I5299J5683n3761c4036o9530m629d9897B4195M1116j1090A6140a7948j4135
+8499c2083M993d773B6451K2333o241A528d9087k3665K5952B0202O0465R872C3099
+8513e4051n3949K1644a0425F0336K3150k8687D032c9564j7182J1154a0299C2566
+8526E8454l924A9299b8001k7286J5265A1052M4973p862a5897p3342k1359N1579
+8538e9019C1092P2278J6995m0279A1990d6945k2961J5646b0606A2370J8849n143
+8550B6076c345m0285j5052b7305C7300M6409j2987D482f2846j8472d0198C0992
+8563H1930o485A8335d9721l4720J3504b7143B5105M0210J6187k1509D421e5148
+8576g9916K5931B025M1054m574h549m5854j559b464G2821L9873k9555G065f4710
+8590i3361J7897c1993A6893L4490M776B7415b1369l9695j598a9139D7621M1138
+8602H8759j3835A2167e3998j6994b8747C0327K2964B2078c4126l8522M128b5741
+8615C5406M8548J1129k9125I036e4479m0883n22d4245C0000M8589j1055I365d1196
+8629d3120D658N5219J1247C2359c3371m8158K82d0240A5220L4222K750k2803f700
+8643d2474j5960K4835B8839O2435J5183n2372c2556o4191o172e1411A6150L5569
+8655E1719j6280g513k7741J6011B3865L4811M028k5519e474m8064l3746K41d2159
+8669C1230O2725J1766m6835a9126n8154L505a7105D4463J5082A8239d0400k8869
+8681f9269J7357g097C4103K0062p038A9703a2470k1428N098E6M2448K4677j9617
+8694D7564a5695p6281l5085M0096D319Q2446K1936m0727E000c5444j091i438A4962
+8708A8234b068k8480j7357K799b2028A9744M8425K6369k2667A209g6530l1211
+8720a07741L9074G583N7566q45A4696d4210k4835K8325A7657M7495R397k3426
+8732E1123A3234b0075k2306m520J8527B715J9139D111d0132l2989J1799F759Q2665
+8745H9424M7730k2888B9269f1009m2245K2241c0023A1418J0939r460a813j2358
+8757a4171K16C294L1304K6449j364B1426c9850m8200m162c8841C8398M2704k1724
+8770E9378d802n2870L75g362E1041L2801j1664B4967c1688m0743j2381J8279b8727
+8784A4307K7250l429H154a9611i002D1850N2479J418C3562e7004o2812l74N6592
+8797f3598I499M7384K095k8883b848j6595L754E067K5796J8776m730F701e1004
+8811h7188J6287a1587E2770K1071l1887a5273l9032J3888A5080N2354P449C0708
+8824c5078m7380j1047K1607b8053B9160M7627J3732k8617A2694b1510l58A0684
+8837C9457r244b5461p0610k9037L8960c195G0157K4205k4083B6969h924j2557
+8849b1481i480A5596K1717M76A2156c2787m5239j5052K9451G121O4030J4880m2925
+8862D3106b0261l1419K2063B0266L1635j0677b988m8554k0709K1023a104E0037
+8875H4113J881l0741c426o3459l2154J8565b3628B6210O084c320l7369J118G542
+8889G4435L9366j3936C9738c0158m1511J847K5347a4971C923J680h607k9692k0598
+8902e8897J4979A1658O8876L7610k1210C0050d3323l3466K2804a644C3734r430
+8914B4304a7636l3720Q78a8090B0813K9769O690k1214h238m8868k6309J8424a1355
+8928E4841M0147j1746B6354c3570j5894a3645C6400J6372A9006c8157m6045p556
+8940i1758L0551a2700C1290J8491n564j8857D805a874A1484L6785L5715k537B3940
+8954f6193o6309o97N8440A0M7342O48A8570f873K381B5334L1225O588j8903D003
+8969c7579k9645n934K9018I799N1911J3400C6854b5057m2917R251g900D5473J3138
+8982E8611B2775c8552m0119Q859b2634C2995L2851P722j3655k6131B600a7251
+8995a3276E028O809a2895n1961n0524r243M8503A6658Q9497L3874l3090D1672
+9008g798j1493e013I535K26i334k8475k6610p297K0101h568C8286L0180m438A9873
+9023c7444k7244K6152B1778M5056n811A1116d3508k0709K4002A3566M9351J5981
+9035G8898k2233I992c7067l1491p025J7075b4923F246M559a0268k0824J4238C7579
+9049A03511L2694k7764C1771e2467m5230Q201M3248e923F493h491k3161j4429
+9061d6081N724a7099B3080M3047K0910j8781B0589b6785j1427h961C4412J9310
+9073E3722k4932c1759n3005q980M4316A2074L9808p79A8599b1049k7309l790K5773
+9086b6375A9458M3423J7369j7938B3921a4741j1661c455C1168Q593h90p0210m9481
+9099a20581O426N5182I799M7408Q413k0128A6546A072R253K7475K6722J0273j9033
+9112E5762H085e6877m8728k868M4722d094B7636j2677a7772j8669J7935B9194
+9125G7508J7424l1958F723d3730j6402J5871g410C1993K3283l090A4743c9241
+9138g5504N757b9904A3536J2232C51c9022j8720K8238C4953N9426K0855k7607
+9150H7627C4657a4535k3558q53J2670a1923J466k0444l5545k6935O301c5841C8456
+9164A03225J8096l2983B7547a9130n076D292K5383p594a4956m1258k1547J1689
+9176f6072b9610A7041L4455L997k6196a4696l6489r569K7017A9630M6212O641
+9188G2483C0286a9567k0082a5040C1172L2517p776A1892d3491l6557k857K9683
+9200e3222a4791A1247O371F730g574j0798e022C8206N2517K2719k8241A8102e2220
+9214h8992J3870c2707D597K471b1529l2957n508K8807A3169M2460J8988n874k9691
+9227C9052a248k9352J866A774L7359J0641B2329c0230m5361p303L7948A3987L8830
+9240E2817o984D064c8369j4828K0041D867L4878J8369n800B5216d943j3079f359
+9254B1537K3561m634A56f2293m6733J38N0921A0038M2866J10B4152a307k820A8109
+9269E2003K1328m671C0537a9928m1850j6566J4083b8272A0722J4664E089c5174
+9282e6931K0721A7018N0627J6183k6010H317c6723r692a8399B4026K5481n289
+9294D4218A5886b2201l0658j2720J6345a2346A9583K770e427l2861q056a5662
+9307D0921N0720J1324l6032F025d5028j1062K2120d223A1710B489b2596k8216
+9319e0812j3505J4593i142C8767K9909l835B9891a2101k1906J4568B2973L4766
+9331E7739p39A4290d0052l0058J0923b0117A8522J7225j0038f809l4570j3597
+9343e4976J6464A93M3052K2809q553B3346a5760j5922a2303B8373K4697j4937
+9355C8133i842n1468k2590J4899b5613A9858K2272j0886G34b3179j735a496C3300
+9369F5232P058k4415b379m7307j4620K4360a46B4712r727a9722l5477p645L0185
+9382c2659B1225M2265O011k6812D196b4859r022J6126A4094K7182J304A3002b9390
+9396e8874L555b0839B2723K3942j2492h339m1243q456b6492B1089L3728O75k5932
+9409B9560c555k2538J727d48C1088J6757j4790g522m5881k7399P965c0295B2204
+9423E1227j0320D926b4402L260A1664L6617J7201j4758A1531c4724k7524O439
+9435e5809b4406A1052J7409p597f364l1410j3574J9480A4373M4933J1521k9271
+9447D1556e328l4981n7a0752B6863J9025j5455g126l6923j2094J8889c222B7060
+9461C9445j1230d101l4445q807b1049B4330L4384R54B5706a9753k9458M856g197
+9475C2215J6126k0155a1975l3800o601J8339a920B8568J0316j6770i768k4304
+9487c4072L831A174L9822K5976q562A6021c7560l0399J0766a6064B2005J0724
+9499C2729A4198a6942k0894J023i597C0246K7339k621B5585a4702k7709j339a7906
+9513A9106K2963j0183e860l8548j0613K6107A6255L2954L753B2982a8756l1619
+9525e0375K237a6946B0625K3514m874A6230a5168j9393M657a345C3612J3106k2346
+9538B4372a9667l7575m180b9793A4722L4007K989B1512a9041j9527R723C440L0778
+9551C4218J2372j2843B14c6214j8452J3350b600C1761J0961j9965a3097k6949
+9563d0046j567a0681C1804K3344j2006C098c5546j3790J7416C580L2115J2565
+9575D8260j6526d750l4326r097J9458F234K8875M164A6180b1579k5208P139b257
+9589D0683J6563j6882I40c4882j1113J6919D563K9016L529A1477b4271k3588K925
+9602d4934a5124B3663K9856J515B4877a8952k6905P349e917B6687P834A5987a8388
+9616d4224O22a3839B8526K6835m521A9693a9034k6046q18b2475A4132K3530p425
+9629C0237d69l1825r185K0531A7804L3073O024k7196a5405l5212j705K6024H241
+9643B9977m655B697b2677j0401J5534A7084L4326R838k4024g702m1770j5869J7211
+9656d8130g574B9599J0340A8112a2080j5317J1868A6184K8109P072j8147g927
+9669d8339j6063J6316i450B4418J5167j1703E86b4101k822D86L6894J9363j3711
+9682D3032B008d4321k1052J0181b0758A8846K0333q816D648a9376K12D75K7456
+9695B7931J8724n579H862c5725l0436M334b4587B0949K5458l245A4491a6002j4394
+9708c0396J4349A4705K4997r31I718b8681k4972J954b4800A4202L1343M265B4113
+9722i229k0683P862D124K7644O129A6987b4390l5027l920L0707A4507L4087O451
+9735E5045j9740C719b1156k929d804B0886R925A4446a9329l0736q315K1264D775
+9749D4855J5817j8283C136b9474m418a1566A6855J5485p821e177l3588j3460J5261
+9762c6964I60L6976J5830j2256A0026b4775j6340J1598B019K5834L89B139b9865
+9776d5571J3450D277L8918J8499j2326A0381c0877j9717R798a2869A4872J0154
+9788B5026A2288a1600k0036J674f25C7904K0839p787A5885b6821k6028L309a9227
+9802A7376J4756j2712i493k0825K189f223B7622K3375L14B0469b2148l1361j229
+9815e4738K6989G442K4429P14A1664a7096j0274a0434B3192K4080l471A3360b7321
+9829e7064l934K6737F905L2148L499j9767e088j5922O616I559K5564Q317k0931
+9842B2509a9222l6820q598K3116I76L2395J0392j4441A218a8157K599H394K6571
+9855C4965N456j9457a6499l4452j3781J4980a0008C3179K0580j0176A1597a5482
+9868b0974d844A9495J3410j1541a1147l5077j5539J7756d027C5166J8298q241
+9880D5223A6878a3043j4779J0274G830K0094m634d180l4378j9555R504a3293C0586
+9894F1210l762B7285g673j7977M889a762A5044L67e066l1478k1226R065a2339
+9908C2585K9759J177k4511f7l1104m964a4291A1507P954D063b4668k1480J622
+9921d4526a8886B1428L2391M298k4454c685k7411l450a6282H853J5496p151h413
+9935c6512q463K2337A6792L2541P351k0741b098l6177j0259J6577a618B1530P81
+9948B2311C173a8332q466a2667A8452K9789Q877k1093e025l9884j5704J5245a2625
+9962A8008J0294A3264a0818j6598P771A1269L1600J1871j4149F935b9355k1505
+9974e0860O080a5354A6328J1312A3679a2894j7499J809c516B7822K2506n544A1477
+9988b7108k2460Q063a2489B0582J9207o584G574a9306j0161a4278A2380J6452
+10000B8832l982B8c2346k1618N689a6516B5775K8392k763B3507e670j4852N085
+10013a5437F093K0526J692C551c2754k6338J384K7943F845L0899P877j5982A578
+10027a6351M253I962K2307M572A5993a9326l1517o427K0945D701L3155Q642j8873
+10040B7625b727k3566l476a3723A1468J3441n031d415k7903n751a7607A9027L0678
+10053D9705Q496j9469I26c3118j4501J3207f759A1452j216a0283k2322o595J5833
+10066b3367A3185L7156K0207j3185B2444a3874j9062L199a0641H322J258a0019
+10079c8413j4386J5333a574C7269K0548m778B4019a2746k2443M457f026B0828
+10092B7087j2692i911j9429j442a0649B1042K0954p175D077c2847j7978N414a8182
+10106A7076K0788m685G229a4260l258I28K7062J9915k495A7823b2277l1771o968
+10119f1016K0652h231A2994K179C79a7447m161b256C0179K8849M217k6256c179
+10133c8502j0409J5520f082A7093K939A870b4092j5722R919a380B9277J2062r466
+10146C1873D508b2821j0228J4892A4332K5208L061B0272a0863k1406j297a4661
+10159A2079J5532r595a1625k9951j0693J4769c841C1661K0319o077B0325d676
+10172a1694B163K0442Q434j2846a2039l3287k0316R447b1895A7536K1807n255
+10184C4088A2324a0741q703h353A8554K1616L153A9489a6012k1932j20a7553A0054
+10198B9220m507a482k8800j2677J1876c255B3243R167j1419c806k0272j556a758
+10212C3430K1617m494B1648a6496k7207l775J7290e345A0485n206a4210j7925
+10224c2135K960e730B8916K5022L817k1046A93b8098o258J6381H033J4701o918
+10237A5816f978k6734j2854J2779b507B9245J1351j4149a572k2923l379a2134
+10250A4501K1595J551A6708a3932j7273P061a954B1617Q850j3127a1550l1941
+10262d3491j1697J8539b666B7378J1135j0484F683a2480j736F099K6463J0859
+10274D3421j4404e60l2441j7962N381a9858G788J4959q322a0311j7027K667a953
+10288B8637K1437J56B3806a1575k3910r43a4942I918J2656p135g257k3066o948
+10301c7271J6066H197K3653L792A5471a2921j9603J846i097B2097K1673l232A5395
+10315a4970j7055P538b997A7673O343H803a8410k3958m826K1279I675K6476N129
+10328D1280j5970A127a4038P42E642K3977O126j6905a4474k8021j0778J4374h043
+10342B1635J3080j3113c326j8800J002a541B3211J4064n721I884a8516j6934Q655
+10355b6795A37K4505N713j4835a2811k4227n070J7548G044K5070J468A4615i880
+10369b6064N499A65K6797J5056r857C011b6331j1117R937d801A6854M140G214
+10383a6391j8954L904e888B7579J7366n916A3955a4516j5991L181d308B1513R957
+10396C1470j3196i285k2408o347J5121B991K0420L616A0008a4878j4541Q763D773
+10410C1721J0244j0951C628b5985j3027J0031i03B3130O127A3393a3659j9139
+10422c2798j966a6556A1899K0064K17A1719a3453j0102R440H564K0371O582j7091
+10435A8426a2139k6239n782J9496C504K3067L157A4396a1509j8672N93e766B3175
+10449C8225p842H008a5740j2037Q228A215K1161K565F285b1409j5475M665a0817
+10463A7564J9387j801A0817a8682j7762P466b182B4630J2745q443D911b0926q705
+10476b9631J0550D704J6122l714g09k1796j0890P370a408B7102J4416q910C909
+10490b3652r632J0829D308K3856P580j4432g629k5522m828J6947D183J6606Q81
+10503B1670E594a3397r369J0110A0810K2269M064j7380i361k3471n375J5224F277
+10517C1971L477A4860a5797j9900J013a3560A1773J7693j717A0066a2413j0619
+10529b3032R564G785J5986J81H481a5992j6062J75h658B1547J7306o707E536b4837
+10544d0998M695a2172A8265J8210o264H367a4011m807Q820H164J4299j186D239
+10558b1127j4883O866d971B0855J2540r482H7b4688j0334J4130G385K7171Q083
+10571D2639j6718c480k3842p291J0862D55J8503K062F437a3413q498R751H814
+10585B6384M604A5073a1576k3839m618a9411A3259K4797J438j8011f945k1460
+10597b8405k340a5028I756J5685n138A643a9171p329Q288A509J9879O709j3429
+10610A4668i168j5928L203b186B2689J3510o001C928b8045j8138O806a1101A8945
+10624C4221m899A0507a1561j0483P447C327J7415l5C306a8763r814O582B74K4657
+10638B4931J2726j0754a89k7787j0669J3136C93K3688Q503j1090c920k2807m264
+10651c0991J5359I856J6853K76A1896i566j2465J862b643A9029N590A1151a3616
+10665c2928J608a3206A5910K2416K488B0341a0813k2551j547a6947G339J5502
+10677B2841J549H455a2444j0929Q020F826J7023J734A0088a3250j6621L25a1439
+10691A4963J7894l901E234a9731j3084O759c696B3029J2929o680E444a9855j0905
+10704c0760Q411a898A4732L986H028a0889j2577M062C669K2364R536j3152a906
+10718b5954j1172R499b541B3838J0623j2175b264k0997l943J3001G297J7221J033
+10731B5551H281a5987j3820N897c540A7690Q332q752b044j6595m199h135A6175
+10745C3715k968H882b0219j9904j340J8982G181K1511L157j5368c832j0225N493
+10758h564F727J3917Q29E687a7381j7773J610a1253A5375J6415n58A2721a1773
+10772b7740K526e027A8048J0221q756b678k0839p378J0651D637K1073P022j5184
+10785A7548e586j5677P28e724I385Q456o490i187k0725n483J6571A2206K5078
+10798C7284P207j2884C935b1932j1550R265a523A5762J738C309a4272q725O445
+10811a6552A839J9615Q624j1104d024j9475l255a3275I282J8665K932A4521a4671
+10825c4122J025a2108A4069J6047l247A0787a2227j3063L876c771A5289N659I665
+10839g379j3045J884b911A9826J3916n205E292b2598j4795M510a0072A4851J4431
+10852B9282m110C192a9575p612J0275F169J7700M793j1807a938j6375k276h406
+10866I560R816r077i911j7841l492J4932A0908K5406P567j5828b573k5603r685
+10879c7861J1564d173A5974P434r271b522j0677K611D301J4415K729H250a3174
+10893c1975l570J6788G890K3009M349j6347f042j6920r27g153A5148J3455l105
+10906B5498E096b1012j2129M367a0473A0559J2162m399D269i183k890A470J6643
+10919A8113O196q531h425k2929j1240J0200d104B7061J7404o817A3593a2873j5197
+10932b8070J208a1806E486P984o215g120q840M444E417J7864O612r611a846k3184
+10946b5030j0043J1531A370K2852O431j3443f260k0449n625J2929F229K1026M087
+10959C1342j2589b566j4910k098h889F158P986m905i371j4544J160f250A8623
+10973C3095k838A1248a5828j9574K78a5438A2900J8448K80A5792f881j6730j052
+10986b4663i174A0271R107p625c154j1694p5i47A4818Q306o450c394k4282j0050
+11000c7726J2202A095K7530J4621o697A3312a4881j8563K502a3239E731P829n385
+11013H175c353r132J901D026J7301P961r336c099k0847q190J0874d94B0631Q768
+11027B9399j2139e048k0992l862a3818A0520J8851K763j3055e636j7916m543J2570
+11040a5525B492J1718k897a302r498O0H75J7831J1975n434B442b5843j7837L060
+11054d0620a8133A2085K3434M141j4005G34a7306q39f773D669M060B205a1153
+11068b2115J545d940A7639J4669n435G730a4196j2010J837e428A6872J1730o331
+11081B2271a460k1668p943R123a207A9943R394q883F23a6904k340h720F212Q084
+11095A4296l392b615j5046m656J0174A0413J9104L991j6539i251k0948o119J2723
+11108b3595B883K1920O058j0812a276j4527j723g771G132P828m152c383j4918
+11121a8301k241g955A2295J3687j22H666a3808j8578P08a2686A3974J7698k63
+11134C1409A3695g972j3773J409h324H390P716p032f077j4218P89f001A2343J2062
+11148B4405P70I628a2100j2954K397c061A6584P205p714c344j9012q348R970C131
+11163B5281N787r684A151a5609o035P419a59A2045k008b144j4397k754g628A4046
+11178B9926L607j4683i013k4148o805J3451b673A8341P558p447B412a1511j987
+11191a3498b907A2736N726p419g452j5854l007J0959E114J8129N389j2598d933
+11205b1891l10g152A1541J1910m183B185a8614j1568O392d927A7344J0912n082
+11218B3174G573i182q308N715A765J1555j487b370j6979o101Q303B383K1231J0852
+11232C4466p695C886b0859j2167R283d569A4877Q192m612B157a3755m090g646
+11246G646Q231l961b976j4631n081P263D407K0342N144j1677d135j8266l625Q816
+11260a7210B599J8178N085j1968g784j4404J520h224H126J0073k190B738a3777
+11274a9948Q990F512J3679P59G995i155j2836Q38e718A5599J2859n273D071a8298
+11289c1451M066a1128A1611J4489q09H872f367p137M377D918P198l627c028j5868
+11303a8896o943P289B401K4186R534j0041B609b0459j1379M905i635A2464J0644
+11316B3108n538A732a2092j534c346A0104R515l955A493a6815q637P084E81J5633
+11330A6214M327o906c976j6087m367a0361A2250J7573q01A2482i786j6152l951
+11343b9889J2577C234J5830O62H176d294o090M752D754R002r50b31j8804j0893
+11357b9928O401c909B0264J4892k178A4919a0246j8624j133a4001F765J0251l056
+11370A3960C047i689k817N971G112J0259j248C085a3296r763M990a01A8734R349
+11384B8083p374d16j9847j0216R586g68A8503Q656q446I7a6223n433O732B161
+11399A5522O15D800f774p074N325C905J1703L990I046a1694j6857j047a3218I716
+11414B8005M241j3502e706j8627l857J2426C120J2705J858H397b784q565M622
+11427f727E327R742j490c5j7489j0659M893g488A5436J7994j687A1932a1519j4241
+11441b5760J470a0950H199R928j465C846a1136n695P165C168J1387O59E699a0146
+11456a9958L064a855A6264P043p735c063j6687o440Q703B893K0449O888r561A2
+11471a8058p621P251c344A0215L955F928c790o981M443F946J3453N27G927a1868
+11486b7429j094J2712F956J8381M191j2063b703j6080l848R790B908J2342M29
+11499A5679B874a0901o640P291C648J2594K368q901g478j3102J4e707A3149J0060
+11513B3209k899D692a4873r932K639f479A4030J1106l719D472a0840p926L664
+11526a5102a883A0703M849E896i202r696O217B269J5326N830o971e99j8221q539
+11540b7359P886f04A8301O929q809E30a5850o392P852A536J4263J805E903h420
+11555a5562L602A720J3741M273p730e357j6469k603J0827F699J3124L225j1145
+11568A1903e100j5527j623i590H306J1207l37E099i508p931M361A232J3446L105
+11582A7783H125g553j2683Q84g108H823J0471K28E875a2622r576M709b151A6115
+11597B4940m894E723a2677q948N433i27A1623K331D606h417p540J667a847A4009
+11612B2847m098A399a6625o401O690a333A6176Q424q835a602j5638m244R796C537
+11627A5633P36E449i712r580L053C24J3702O586o802d1j3182m047O728E829J4523
+11642B0352N08H103a1827j3121q3a0671F750J2038J401G634f803p922M254A437
+11657A4797J914p387f272j2046q52i183G580J2713n11E429a1852r593K492e116
+11672A2422Q604m806B221a4086m005P623D206J1549L951q418d079j2197k163g037
+11687F306Q486m664b503j3560o639Q046E045J7149N849r303B88a5379m696N548
+11701a4527A416J3073L59D496a0208o767J926a711A0762O382l273a575j4492n398
+11715b1465a0678G357J3046K275j1075e803j3376j185g827H118R876j714C126
+11729a1123q525K599d476A1111N674m407a561j0710r60b763A1294R732k851C906
+11744a4117j1149M026d803A2639P724m673B673a3210o722N026H2J4128L319o357
+11758A1172a305r751j559b637A0767Q081o206c054j4972n879Q600B150J4499O460
+11772B3109p817G9a5839o728Q151B256J2993L415q485b830j0029P65a383A2181
+11787A7090p600e351j3654l979R784C365J3248K656r009e114j2100J658e169A1672
+11802B0169L96G074a0693j1711K795f592H580O300m940a820q038k210d314A0523
+11817A7620m026c04j5759p807O285b226A5542J0852k243H556i659j0510K917e769
+11832E910N315C952g735p300K505I13J4255P396o314C744a2296o151L906a680
+11847A1208P500q014c842j3221k830R197D384J3823K717I592g581j0300N81f308
+11862G571O112k871A212h936l490e613H746Q761N46E291a0440j2705k044J1845
+11876a3344F179J4679M80I970f140q878K462b208I514M582n587d093r586q6d899
+11892G891R357k382C419a1448r667J172f559A1241R999k530E017a0625o601N921
+11906a1305F74J3002M495G443f640q404k40e454F602R306j447C563i975p234K553
+11921a4656e21A3095N739o351b614j1986m510g839H583J2639j190G706g872j1055
+11935a8927n93R253B353R452k653F3h217k545c055H684R796L126A0197h786j4913
+11950b3699j015J1970D697J3149j081H074e437p215R37a223I832K777D877f749
+11965a5947k218Q175G203J4605J618r431c278j1833j371g432E523N984n586e139
+11980a7414j422i155G294J2507L125p991A207a1655n403N237C99J1090l46H08
+11995a0600o340N939C790J3078L487q731d785j3323k381Q507A069J1424M430n918
+12009A1005a079r413j9a858I015N784m670b126j4036o362O945A625J4590N333
+12023B1548r255a729j1778n29f658E192Q138k003A751i580o545N165f25A1940
+12038A7784m897d70j5510n089Q205C486J2609M77p850d908p491M93a602I282M925
+12053A4207n509c006j0740m576M573F01J3484P356p822g99j2868k894P883D089
+12068A2980p67A36a3116m013O181C997J3056L036o731D67a2628n726L854b173
+12083H918M452o234c269q459Q47A46J3855O378o536c530j5506n059P862b649I786
+12099A7173l425B584e695k876b764G034O136l491a634j2669q758M241c937A3479
+12114B2792m366C411a0071m101O348C378O573p32H38h867o506L468c27A1374Q595
+12129A9969k530E660i984j0336J274e942I486L994n397c257q410J980I86J3057
+12143A4043O597n033A299a3153p485K897h625D784Q880m75B852h335m709N374
+12157g670E169J0436N08E662h496r116K396b144A2592N251l976A654a0335o612
+12171a6947K307e075F267M845E451b875q525p1b653A1027R980M32G654a0439j0190
+12186b0629K573c894G825L107k553a688p996k230N279D011Q046J535E412e300
+12201a4700J72d402A1563J0860k929G154i789q102M228c088E931K136A080i102
+12216a5654K438g55A1445Q208R75q001c30j2851k028g552E514P407n054d128j0932
+12231a5060k174h080E269J1747n4D855a0214o475K824e310G907P438J246p096
+12245I495b971q215J878b158G611J687A622a1628j2064L97i397I939J1623r58
+12259B0604r465a307o584J48F29P848J612l313d506q179m505N502D89J1991L026
+12274A5506p307g442j0801P60e216A0178Q546l326E098d212m057c974E191P365
+12288A2556j357C806i532j0628k092O460b940A2392O083p059g34q071K494D360
+12303A4839L438q875d702j1744k664R521B836Q697m33D975e164q345l583P934
+12317i158C443J1238K9F270d068n631M015G005J2185J09H765i093j1153k164R322
+12332a3088b775F040J476l298c287m221J754D006R712N894m042C769a1592p856
+12346a9448O464A128J3372J250D562h704p706K283e781E022N121k541D27e090
+12361h638M042D176J1249O056n523A566a3178p460O427e34H262j95b125j0876
+12375a3001l805O584B202J2956M854n597C916f168l578J352e07H327M325m438
+12389H214d646j0872l217g916D230P882j814a127j2123k449g180H329J0748J448
+12403B0525p121B502g156n370J943c016E086J503F66i765o284K421c669A1114
+12418A8775l242A368a1124k377d385H235O223k63o606c861p569j157M179F30N728
+12433F358P10d05r669p201L977C36J4635Q414o240C298g391k238b816F059L877
+12448I936m366e650j0453l418M555d616G240Q285L36p390c188q488J179c12A2116
+12464A4118F987e084r138L454D47J0775L990G377c929j1352l877M818d787F519
+12479A2864N63F265b761n690b720G527R048j639D082a0384j0758K108g058F958
+12494A0382m998b398m192j206b070G257O121L105n831a680j0570l404N200A886
+12509A2861L155D746i944p055L930b54H929J613C949e522m754J802h52I663N543
+12524A5206j61o773c724r128l218P034B982R803k470b064j1755m714O820C152
+12539A3898J156o478a660m995Q87B855N258K851k671i70r555p553J432g650E041
+12555A4969k927H78a0440j641d171G889Q928j796D541h251m265L149b162E384
+12570H032p80G74g904m953J816h10A0181M220n354c127j1063K19c185A1860Q327
+12585B0187m959C715g374n921K601e007I22L053A129d841o206P4b368F753J1085
+12600A7838L742p072a478j3364n80f218D769M272l459e265q872o61f994E339P811
+12615A3150K73l555D53f884l337L190A057R431J347C481h054p345M969A496J1142
+12630A2638K771n520d125j0482j621P885B107P650N50m308b1n487q23i36G511
+12646A2522o26b89j3414n665L926a978A0447N294p072b510p612K862A926P572
+12660I498K741l838a34p788o615J66f684D652P507j332E401e807m673d922G331
+12676A5520r43A256a2263n145K680d021F617N859j925C612c951l085L155A161
+12691G620L445l988c240j1088k999Q422E412J0014r92D395f939n495M324B017
+12706I381J213C534d249n973MK201A400R590M984n958a088r806k399O619D828
+12722A1349l368b435j0751j266e779F823Q669j451o953a649o546j903L554h05
+12737F140J377B276g066o448J959b301A1713O899n064H43a0177k954e625D093
+12752H760k771a215n997m497K961a589I359N266M24F560d084p559j352d615F403
+12768A1254E482f368p340L449h0A1820N405m446C919f953m941K706M386B635L743
+12783F378j603d64p241m457N427E563R690J211G239e106r622O63e680E245N974
+12798A1219m014A09e684p92b186E434K664J776m205e416j0932l528P472I47J2494
+12813A3441L967n488C13f029K213D789P170j860H94i894p341k25O657a309G511
+12829A2332j694C366c129n89C6Q047N588k676b41j3512p747P241a131I267K921
+12844A2188E796c172m349R59b340D572M579r00C449c750m689m52IR915O622m068
+12860A2478h91j3453l939N984b267F640J564B873e317k947L873D046P010L354
+12874A4410j530F304b403q573j67d660B274N089A876g611r668O67e608I265J0160
+12889A9425q79q922g07n357K843B81M637O91B032e029o279l819L450a958I092
+12905A4602m851A97i050r83f44I372N012n193a904r335r96M282I57P941J783l030
+12921G651d87q559k912K293c941E071L433k847c787n431L945F051J1159K608q268
+12936A1550a433j2371l632L922d795A725K632k026b239j547J41A901O714O297
+12950A4912j122D085a0247o265L035d194G067M307m022b053o908Q75e16G500K222
+12965I722l626i58o845n776Q30e041E313R469J485p506a846o065J486B152N932
+12980H084q28c234j0623m940N358b535G693N693r98n755d76n638Q08h50E331L611
+12996H942k153h83r564l593N931B982R119j109B313i399m029N211I0Q325J987
+13011A0402l045A125d990j067K435B043O651L633m439c223j0596k763P007A232
+13026I988k706D5h910j968d872E244P479K036n950A252d803k566J985C0M936N79
+13042E545A9h596p698Q01d289H713P566j530F104c557k853a412E586L848l533
+13057E901a963p449k408p57e993B950P610J806o179c888o177K77c377G195M146
+13072A1341l887a389q366J978A46J0152L533m882H75h688m174j53N099a784E062
+13088F960l263a232k802a292F999R244J463G213g120j0635O11P136a29F165l2
+13103F133A060b806k157c70D767M140J088l496a251r324m346M641F05J0419K134
+13118A3158E985d200n816O17b395E949K364C716d361n156N39c345C399O535K138
+13133A2072l586B048h933k617M122A840N769j106E10h148n033M570C260R553l7
+13148A2776n891b131n227j146L591A643M282J456B872b603n791k120d193D508
+13163A0242q76D13i658k408N405D791P368p49C884d770m479j36c676A821M159
+13178E980Q20B222d492k215j63E4Q143M672l889c185q866k042f990C533O853o4
+13194A0322C347d955l890J862a798E249Q62k309a92o338l215J388C94J0567M418
+13209A5379m570c99j0037j251M363A133O636k111b967o675J76c352D714O627K272
+13224A3613l572A944f717l709J555b413D094K540C193d502o457K547c74A0428
+13239A2855m646b528p253p38L719A519O387J347l517I93d486k182K756A489M439
+13254E928P17D27a0168n016M121d28A1049M097n225B138e336K45a604D341K985
+13269G326j856a655n241l662me085B791O579O71B894f499m233M776B216Q229K472
+13285A2917F114b596o115J576a317E513K965C580c293l817l977O03d592D629P067
+13300A1696j411C316c670l441b866C715P701r75B591g461n850L473b452E887J246
+13315G133k088c12n662k872J917a19E999M434j456B199e484k237c423E909N431
+13330A1340k398a063j0876k796L063c061C810L518l180a037k115J16d63F027M850
+13345A0877Q21m615b385q269j020M638C684N301j923a709p684j816L971A457P035
+13360H492J544m507a457k884m3A66O034L491p95m088e793o430p80N685B988K876
+13376E864j499b264o500K38a483H476N205k320E538a168n643p8b769B414L189
+13391E603l43h77o875n222R60c668E637L202k253a477o310J960B462Q635K935
+13406A4032l518C230c803o141M36L976a010B297m34b990m816k697L761C835Q781
+13421A2616J621n907h56o517Q7a441F331K484l869a905o678j167K842a564C363
+13437E880k542c370m903r07c311E738Q167J820p694i82p190J640a518D393P4D00
+13454g996m206P51M221A060O155K752j244C192c269k452e27E912L538r19H74g357
+13471a2064K884i37F684Q91B016f173l601K015c654C070N582J312l340e23l498
+13486d021K03b0G559L955E697b615j0020l196M435a518F036M20B336b805k089
+13501d894J462C182P595K201k692C044c143o142P8M442A645L670B398e523n928
+13516a1451Q69c591F377N423l33E222a306l318J014A990M601R24k913b032n096
+13531g128m460K049a810E004J945l050c330n344L53a141G952N311k238C345d354
+13547f125K825B746L101l42G46e795n292k693N037a018F591L669l161A43c394
+13563b628D025O732J519n814c692q405j410K802c390B742J813k086b597k444J057
+13578c984A754N587L498m9C829e807o004L704a103F496K522D179b524n631q11
+13593h966c454C467L797j915E54c870l096J626i22F827M240k08D098d187l651
+13608g838P41A58N708n55D11g769l011K090f75H244M187k693D007a448m524p24
+13624f696b413B869K381j968c313n886j005d299D211N479P09m869d268n562K087
+13639g743a753D003J953k120a523m208k55K483C273O071O77l250g65p595p44K813
+13655f291E70N361q44d43o874m62c750B999N520K454m152b81n536j273K610C04
+13672D685J084k600b845o321J116a832E451M428l779a10p290k433M422B135P013
+13687I148m09l849f22n061O16a130C987K699j280a79q126l287J836b315E774M764
+13703A0538j777B031c311j154e28E912K820k594a462p264l382J238e126B119M231
+13718F350J558B340a410k110a678D648L971J235D390d993o168o04M326B160L833
+13733E993o61A704b538k197b313B005N289J649m397a704o523m01K021I50N794
+13748F744J872l730d416k879R81b155E049J579k569a817m613k90c337C385M926
+13763H311Q45l928a291o776j687L045E91L338L40i94n427l10K577C706Q004J709
+13779A3419m282A687d816l066J012b803f28b81k089n160r54J923B020Q797L924
+13794A4741q6F941a784m266N74c6B669K38a947o310l474J885d179C582N837o81
+13810H738m214a185k912J529B233N565K141l142e23o344l304L659BL063j48a291
+13827g158l623K914c74F103M917n70m751A895a877F7L590K931j902e88r380n902
+13843a5870n70P169a083E549K074k667e36p04A353O786L611m81l874b228o537
+13858h765k154Q50d599A446J905e2n802j920J602D95P766L257k106C396c973k167
+13874f140b545G97M839N59B725c860m768j410L683i24C367J157A58d256l450L535
+13890d171A623R428K295l160B446c653j910R52E0M094j506a666o972j945L05d364
+13907D329M494L29m366h84k339a053C518M129j051A905e161m588k26d448B932
+13923G963j033B041d916k006j72c348B995K631k35G52d210o77B3P458L742n23
+13939A0700D760b742o080j712M164b278D26c58l606l083L85b026D651O830J687
+13954A3168l199C984c205k955b873A209L167j714b445n420l596K967b497C111
+13969F609j658C93c418j229f12E840O244J63n023A106d389k212R22d8H71a308
+13986g368m595p34N240g6G523L875j672l424B988G34K525L778J068j744b057p636
+14002i693n939Q78M877b790B052m29a013k014R07C522N181O444r63n650D98e282
+14019g112K513a655I9a326m784n017j093L695a286F174M372k244C095a410L25
+14034a085B616N605K449k186A144e619m242J4J864a994A293a274l525k825Q41
+14049f783a898F033O025K191k418E327a438j315a067C623q49a258p123m077l76
+14064a2834K556b458E276K986kC161f91k49G71O507K294r88B234d517m172N50
+14080h139b995B342J304j436b519n703j063L313A190N848N05j409A469g68p42
+14095a510B634L929K909l602a559p207l694K841M248A78L978j358b604j532J473
+14110b663A792N114K645K74m718b044m229N36b679B660J920k173c105m679j676
+14125i460M274D29M444J637B865c98m730J528H78P168J859o84B888c420m135J471
+14141f084b197A743R84D61e308m695M37c783C928M373K92k720D99a916q7B307
+14158F288K132D017b390n348k364K606a907B298N78A436c710j531J295A704O282
+14173G986L480j985D548b197m512P18a403C103J065G94d022l713O12L237B131
+14189F472R89C303a624k472J802B501N345J419j853I08e956k148J502b009B790
+14205B134e98m179k999J468e21E681M597l62m189A169c937P05e0C913O49c57n324
+14222e681m418J255L901I78N435k07k065a001m035K031dE831K913k370A396d143
+14239f076J192A675K304j958D69e136l956J279b545C968L228O6l539a127k482
+14254c609a736A639M117J3k540c421l915j763L556d0D269M34B180b350l052J129
+14270d273A398M256K496l033b55m201j650J539B35N008P21A856c993l582M46b454
+14287B464L548l59B673c790j499b296B585K949Q84k414b154m421q27L023C27L942
+14303D269N61D78c408l007K177a814E605J564j283A601c822k073K085D23M305
+14318D728O90B014c098m498R71b038A820L473J40B126c822k568K692A603L787
+14333E390J436C234a016m216j201K193G63M409O33B053b295k866J025d8D638J747
+14349F385j467A060d487k396K796A199M208K38B678b040l972L05b853B669K944
+14364E613K17I33c387n30J219I36M958J762C669a426m978j090K940a12D668P42
+14380E410k434b690l496J628h1E222K809k233A889c981l413K477e57D356Q39B492
+14397b676l878K92b658B542K636L98A314c405j825J581A504L805K044j891a189
+14413e402j663K702a33B530J005f1k612l537K091CN774K634k017A838c240k152
+14429e392J253B22M623o29D56d478k792J383K641B709K420P35A250b351l710K045
+14445d016A137M250N30j745e60l561j628K342E25L910j339a8n022j880P42a554
+14462D085L169q47B207b126j776J794A505K945O22A881c750m296K84c815A119
+14478D966r47A97b374k628a470A132M979K365k953G17d826j002K849b94C417L65
+14494C782A022d610k412N61b346C243L457j410A193b603j794a688B257L943J50
+14509F350B883a983m858N29J596b38C017l55a79l509l524c287A411M834J526j644
+14525F127A872b989p55a425A368K228j55d86m329l094M67b240B859L085m86k630
+14541B828b649j520J874A942L910m8k472b468k820J81K533A162K236J018A357
+14557d069k895J791h48D232K225k506A228b257k492a939B958L295n05A807b194
+14573f873M6b952A730K801j739a715k238p55J738B729L241J208k885g1n216n8
+14589e345K631A704K714k40H06c404k565J973b94C628J744k448a210k642j297
+14604e149b543A907M758N3B595a331k872k65a742B813J839j878d7m830k405J797
+14620e485a071D735J400k274E69a458r33E9L686K575j455E21d453l156K057b278
+14637A129L372p03f40m719P14K201B665M456J51k847a60l624n15f43B334J998
+14653D332j132a335l996m61O55b56C174J633B293i40k165q08a21C520L410K18
+14669G148B629b342l957K60K710A150J932I99b100l539P61J795B004M875K61k810
+14685D330A82c883l95f36C098J305B198a761l590k050K522a93D024J883k30E25
+14702c025n68e99C051K121j337E70c506l480J424a462B376K107j877a217l052
+14717d269o65K337B175L267J965l108d87k947n92a677A158K396j05a199m321J01
+14733e419J763I63L423K164k063A88b532j592a143C855Q50k9A06d555j763j085
+14749g403L593A614M159k249f0j177p35C5L718L440l87A531c224l907n92c114
+14766e26C204j014h72k835p09J924C115M084K59j476A332c500J05a354I85J881
+14782B866j206a661m649j223J700a458C106K542m94A474a575j353d57D598L235
+14797G833q96C177a493n101j200K362f30B60N57a590k868J43a494B572M222K182
+14813H976k700A963a431j531h40A442J111K39a641n273k374J821b655A994K323
+14828D317j65j845e79k240E68L901J506L61B731a465l812j239K726a74B033J58
+14844B191a631l883n50K363A885L891J102k019A664a279k777a751B419J074J23
+14859C616a60k906k494l65a789A435K575j919b258j939r24b287B621M089L91k673
+14875D428E87d139J52a091B659K170j792a92l947k145J616a343A618J859A495
+14891a365l011l20a18D533L161j486k986A83c062ra207A642K004A092c581l064
+14907f645q19J546b086B075J535J451A794a203L62C406M205k4k229A024d508k907
+14923g415J82c429c65B147a287k881k751O48a862B437N570O24p44C181E82A88
+14940C121L91p79e24l890m784k225L344L642E49K272m32D92a142E18L305M965
+14956H788K647j960D556b46m351k194J264J848J171j640l493r36R26L712C984
+14972G622J876k527k179B263R0J536K702k5l109c016o241j762N61L482b482d8
+14989a363j425P45G60M232L686K738q05m833A452d040R6J441J149d98k271l986
+15005f755k733j063M420e81E117J103r38k121A202J413K479K707l75k923a713
+15021e636k031q80L199a836b69j021l430j203J386A45N131L456J598m210k735
+15036C385e62j16I58K451j359h63m326k825j195K723a778A582O20j091i45p35
+15052a680f5D269L631J422j388l904a711l581J216J816g03B55b191k474k251L38
+15068f578L236B547K870n60j404I81a151C31K151L624L72j640f92m249k148K041
+15084e048b358d55C29b540k935j030K910c37E126K536O82l638k106b14A1L424
+15100C435J495j270e33n568l350n86K747c158A768J477o60b33j270A406L640K589
+15116G635O07j635A923b326m95n6J161d19g0l340l870j815N08b449B486M198J380
+15133H064l443B292H26J782K389J547k44B533b467m384j011J094K421a390O09
+15148g81k561j850J067h72D025M516K351j625m215H00a929j80F68k23j29b877
+15165g066k004o38M161h24C096J060j661D48P75K739K214K115m50C471a281l620
+15181d901l141J218b405a085L57k666k559j083K898C98M991J692m17l039j366
+15196B259A008J040K012L99j839a674m715l894J734K202a404A358J667A140a058
+15212b117f48C673M255l0j628B117f34l057n12a331O58j92l608r55r36Q07a60
+15230D297K516j448B565b048g12F81L133J820k75j706e63m597j919K250K198a34
+15247i40j726j322J61a636C396L254J312l217j996f58n50N51A563K021n97a522
+15264f010k362K39K823a43B163J083n77i29hB206K212K456j294B115b458k296
+15280d754l42K199A048J097H35b276l627k010L136f94C611K639n01k385D57a97
+15297A303K831M75j318h00k863j709K03b355h98A050a31k645j792n47a041C505
+15314H234J257l093B494a514m45L41G11Q17B38d201k318p37L570C4K975J161r43
+15331C227Ba131j418A516L459J996j944A535b041k717j88J750H4J880H20f04m075
+15348d679K81a497A816K449Q54k480g5k119i55H26K251J104j591i39l504l142
+15364g585J515a734I22K148q04a394j854R32A72L501K094k36B073a336j531Q42
+15380b025c82B200N96A182b763l020k88K847B25M164l13p69F43b368p35i32B866
+15398C608q8H41b543p55R17i24A138J386A15c207j548K27b202C235J774M42k683
+15415B768a04l109P85h26B556R42j605a502j972n57N22d30B696n40I35a470j513
+15432b983K43F95L251J455p91D8c309p07q2i63A599J744p05a037k672q51b164
+15450A056K379p23j228h44k510O04E98K408K570A877h76k777m87J011a051B541
+15467B695G63a981k470K49a366A957J799K77A480g51j928a273D48J265J120b30
+15484b268k121p16K523A885L263n44j981f79k299N57fA340J815oi43k184j68J208
+15502b087a01B979r6j026a17j788L07b1B014J549j474d49k428j494n24h14C260
+15520D853j590A98b846k14a504a85B631J84E62a655k033J125I00K745r31L98B61
+15538c195q00Q50A614J536j38A243h04k363J18a195A714K376K47A731g71k238
+15554c009J61a284E98J377B55a857k490N26h13B259K486J111k638a315k278j97
+15570c790a399A386R88n75f24k674j035P35a38B118L25n45h29j561o40d81A996
+15588D461n41C49c230r3l0g61B256J778j558a22l271j779J792H89K373k11A118
+15606f35j195f91H27K267P00j740b009k765K20J854b13B701J42j343h60k933M16
+15623c377a647A764K040J622A925a749o51n3e49B303J17I82a621k096m44a603
+15640A942J822k98A720c343l06K96e11B535J895M40H16a189k062J363h10A890
+15657A411b9j809j484j96a140C128R37m72A580a232k102J07c8B359O94q39a600
+15675d388o98J921a91B997J689q43D37a503p62i5A979m3p59a327j886j000b014
+15693A225K608J416B006d42k952q48J592e63B662O0B39b052k72L45A189J244R02
+15710C335j115c91j653j226a365A225J858j504D25b593j459J43b4E012Q46k241
+15726C617A604a586l185Q29J899A142R5k56d93q21k24G11J619L134j991D51c581
+15744e839J412a757A489J379j410E7b480k08b79B365K164K85j215c04l154q68
+15760d326a413F0J730C35a273k493J110a115B694P44J971B145f63l218n41K028
+15776b394F65K850N25B004a632j118L91g75A023O64m58b246j590q4a157A225K221
+15793C446L25j591B89a560O11A264K162N3n29i10l086k066J343a504H30J799Q21
+15810C450a76l3j625I8K971M08j495c77k943r83J344f57A907J921j240A161b793
+15828d167J555D7J539J216F66g37k007J094b64B110J511j059k27b002l11O94K27
+15845a392A007L06a38m239K75J62a561B203K176J906k638H57a364m75C94J585
+15861A979RI86h48k175j047a780B62J428O26A060a135k603Q82c9B724J581N14
+15878D819H48a113j261g49G73J911m82I21b384l378J362M50a409F60Q71n99O01
+15895A533b76A821K677K341K81k953c32l726k125K07K360a207k48J07j164n81
+15911c093a100F72K965K641p22j533F22b252o7c88B192n55A34b606k650j043b901
+15929A35K645k33A85e19k784J299F98L871J461j300j292B31a639L08A2N55d78
+15947d008j368j996L37b076A553L536Q18j770j413I77J755j38K012j317A87c192
+15964f443l73L86K764g22G03k19d57n27H30K897J694R97j692A190a804j307O16
+15981b495a025H50J22c5k636k430m65K699a40A644J3q19a379d10H99K474L509
+15998F882k31k017A065b889q04M29a570P09j41o28l857O53Q46E67L210K558M8
+16015F383k160A904B10J001P20L00q7a642k881j391k45K760H27J036n99a94j115
+16032a309j237a070B608J961J146j748j238a65o35m4E18J105D34c200k069j520
+16048f789R97J990D84K302k60A239m11J81J784J565K588q00j638d7m926M41j382
+16065e914K095J367O89j366j051R03D6L224K527k37k46A956a215d73G27J423R67
+16082C117m62a030k508k222j116L285R02C26a5j280q02i97A662K550K560j402
+16098E370Q53A858i32k57c82k15o45k1l337k783j560J864c143A647M672j1o40
+16115E668k179o3M31N20m59j797a477m211j490P19J953J911J276N30r25p11k02
+16132b627D77L056K265K018k411k414d42j255c70E87j46I8b251l004K13P36J281
+16149c025a058A460k61i24l21M79B607L176K218k06l705A144c196j677K022k2
+16165b873J94o84k331R8M75K259A627K741O71Qr86j365l22k26N61N57j522a360
+16184e903q45N30K609b51A233k28B7a999N95A234J828J932J83r03A561A2e66A592
+16203A759O4a531k215j865k113c714J156A39K241o11E74B39M75L340J403M21j005
+16220D873j962h6m131Q6M1J742K86j178o80q58J128c33A990L439R55k454j281
+16237B649F19b28A022R88L42A043b269k826o73J82J740a232E40f21J96o3p66H85
+16256D343K764o65B409H30f35o61L74A08a35k480j496j363j945L319a420B256
+16273D673r36j135j132J50O44J829O51A973a188l179j207j58K057a339N43l11
+16289a107j53j931k96d82B918L332N7k868j481B34g28A276J93K50C1c126j412
+16306d538j356J244a978e42H33j37e68j224B04J786L484J025j300k561g67k225
+16322b992o95J702g02J70k282k083K84O10g33A651K013O53j341j013G41L22%L419
+16340D482j347A121a216l923r45J954a169B01c66C60a474J99b73A28K230J817
+16356D175n31A599E07a94C9J186N25j80I2b064k480o86K150A39J167P05i2p8q36
+16375a006B3K827K179n60j496j337g93j116r87J416f85J0m38k194j458J937J177
+16392a651B581K435j420L07I61c03A67R71J879j237A23a491k792l94J439a092
+16409A429j03c33J18j789r8H99L122O04r75G71a344j649b55A184N12k32d56j432
+16427a888j905m10K066g79G15J256D81A3f27a28B736K001l72k022e83l076o51
+16444d310J257a184B09h28m26j752q3J230d28B721K168p05A593e30o67k74A119
+16462B001o11a112k241m23L69J319A377K63Q13I13a969O39N4A765N24P76j092
+16479A973E84a723j09j58D92J015m90a82k559j451J715h44A678J521o39I03h66
+16497a451A20P83J139P41j081a246k245N30R01d22B126J30e81j713K97g59I36
+16515C305Q22A830a002j311k54Q04A482r2J180B54g68j620M53Q42G61J186p40
+16532A207a176j031K84g65A474J447J026A709h27n44M3L75a34A814m91a048j500
+16549b548l82N11c27C376j46o39E07a320R7f0A844J02m84h74j405j113a630a52
+16568B603L19r10H50e96k063i87I74Q9J43l89a461j502J339a92A421J866K11C45
+16587a744m80Q9i47A260L42g65n58j269P74a83B293K319m78j320h23j598o23J229
+16605a815B22N31H1i56o09j06B67J049J774k87A195b45j626m06Q40b81A884o78
+16623A206c67k188M18K43F59K185R50r46d10k520J096nb48C85L85b81a40j950
+16641b090g52B018L41R11j193e35j911j537O53h08B102N68H86f37n61N45A131
+16659B279k30J81g1j656j306J84h36b29A328L89c01J13C9N93J475Q46M0d02k487
+16678b889q37M94R61A141n67J667I70b94D38k7J215N78j80E32e49k207k86J034
+16696b008A344N55k41B18a170p49O28A254Q39P35F1g96p35j857J397F94J110J836
+16714C640A775i03p09k35f9F68J160e20j595o99M19c50B353J459q80j155C27a279
+16733b183N37b53m01a42n48j251m30J68D84J463J532k70a26j686J3O38D64A94
+16752D57e9k186j485a599E20J741J659o10j453b67j110p02f56Q8A035i50l14o72
+16770a936J80A043J281J406j007D31a665j023a086N42G25K61M56F59a916k15J67
+16787a964A428J714m32G11b239j187J399i06A42R43j1a77j13QF37J810K76o47
+16805B076I01a926k339J59N83h33A801J476A063j73g08A317M01Q88L29G97g10
+16823b851m94M69J421C58K51q8Q3e8D79Q16K223O98q98a59k839j036J097c93I23
+16843A746p68A72a526d97F46Q03J71G94a404p41j133J178a28A951K195o89j637
+16860A820f50k037a24I33R2m69a284j722n68J592B39P18J572O35j390k7a004d12
+16879G73Q71k71C56b302k117J669J186A781J000m6A137g22k15J02L41A115l79
+16896G36c08j037r21P94d58C65K149M52j206d99k671L26a311A42J266c42j552
+16913a894j20j52R37A641J132O09l27H96d97j020n27a60a5B82a104j573n07J320
+16931a864c28B996M05j159h70j878h69l3a29A715n32B63c57M6q35M93I25P98G72
+16951a169k921m28a755d76B237L69K43p05C42J4J116J640k46A084e77k944j782
+16968e303M30M03a431C98N8N02e12D58J437J602J623j040A526a831j389a230m26
+16985a656a22F72L05i85q89n25f79b02A830L43N99A045a500L28i7B177L91k28
+17003B340A090b295L21j197a505P34Da185n11j437K42a013A748K929k16N34A953
+17021C83c87d6l34A12a922k073j103k78K289h8B296J138j405Q55A400E90O80J098
+17039B368m14n54d55j927j109O1a631B79J373m95a603n23i96a9A616L18p16D66
+17058e87K38a72A239O43R36o67H2a231j666j161J695f49F60c13q51l39N91A127
+17077C843J082j714A360o09a753m08O14M0b76j140m08j497P12j36G54K337P58
+17094C849j824F38c62j001A56K01K473I83c98j037rl36b56A147e6l82j260j161
+17112b859l23R20I8K224M31k82j142C15J027Q55J156l38G86a778j295j287l24
+17129d684K304h34c21E17e37F05a00A912K246M58j256A639a91j726l92i78F11
+17147C51c44k026J4n75J225g9A235j76l45B80a45D03Q93J886O52A518p16a936
+17166b792j867a224j56D6b329j365R61J248H47J867J660r26K53j565D08L92J85
+17183I85l49C05b240q20k062N4J179d36A847O97G00j93L75K58J377j08O39q36
+17201B212I36a322n14j886a705a33q1q57j275k092K050a51A620M99O85A266a041
+17219F62A8K242K84Q92A687a638j646j910J258J483h27n85K06j553J300a30B025
+17237E316j30l97B084h3m66r90d18J40a36k519q60P10n38J645d27A649J498p62
+17255B385c80%A80J856j15J068j311a524o42p83h21kE87h09j71j601r94J691e50
+17275A805J377k57r39I74b11i9A462J110m57a69k265p24k0r12a420D23c54L7a13
+17295A40M71J531K217m55q50I72f68j315RR82B58J000a840j484K20J234C06R87
+17313A293O21j3o54A02N49N50N30O53N32A025a033r93r72a482o8C64b33p43j245
+17332b221j17c84A43K421Q86p12A153m24A44K39M82L80B26f30j236k073K62R20
+17350b757e88A751P6A53a02q16F24K531K46p33j222a21k28n49n94a03k68L3m01
+17369g39j358m00j84a94A408K63m98B59e25b06A609j13Q67o08D62d70j605j261
+17387c336a409f09K4B08a712J13L0k17A011J975J360j695j149d37l59L22A546
+17405I74e83k51j588p94O13h44A071K68m88e2l87a52k87A929J542q80j090a042
+17424b233J087c42a22I95e92j084l31j117i18E41J497l97K11F65a41F2J419J202
+17442B683L43j451a22k308o46j70a612c41a5j132J76d12k37O0B642l90P18q36
+17460B134o72b63p74j73A296O8a348n53r78p83R38HJ998J055j206G87k19K26l51
+17479D43J335k57C46f3o35m66o67h77A27l5N06a097j640l21a393I3K567q7A164
+17499b88D6N6R84Q6K46J85e21r75j310J071M13D95F9J45h49c38l7I32J692Q60
+17519C484A468j42h22j471k10d79C52d96J78m05o67L95D86M02Q88O1F70d75q78
+17538a353m36f47E56J329o83c20j115k51A57J72M91L70D73a95j880Q07K62A296
+17557A663O5F62e0p89l30F88M63J070c36r54m78o91J107A600G84K18m88A95g00
+17577f55H9J86J064m92o6i30j738a034d00B260L3r87g78c03j183A20J145m55R57
+17596A767a007j78J68j296D70O41J471m45r63a148R3b39mG00C34a084j280n47
+17614b911J209K71A325J429r28E52b37p71A30E1Q84K19C69b22j077o96P47D67
+17633B429k27B61d72q27o6E91M89O30A66a291m13k4b24F21J774q13n98g52j366
+17652b118n47d39B27K70B3K4a146M77E67J144N65j024k93g12p99n78K05g47b41
+17672b48E66h16L62l39G39J379R32G93f82L01k116M55a61F65K02i14c47j017c91
+17692g08A445J77n62b05j813k47J90e58F39Q95E33j65a797b58G84J026B68J469
+17710A737f89b09k116N08g28A044M09J203B31a12j79N4F01J281K76B69a411q39
+17728b250J59R32A258E00N59j26b66K8k99G90k2R15H03g77k512K32a129M52A738
+17748B300I12f15J16k38C76J425l98D39a453O4m13d82C64J594l37E07e36o4n01
+17767a101c74k78A287E43a721k22M93M72L49B351N16j279e85m2K90j7j5D38B18
+17787Ca186q51g71A637N95R94j442a358b59k141M52C6K22M80b0j098o15N09D91
+17807B420o5j79F14g64l53R2d61J6A400m49d71j590P94A232N97O54A233n37A24
+17827i49k71M7A120n12N21J5b96m16E16j69M30K39b46j698J47m03a044M29A621
+17847A362k63g21iG09N38J016l69F52b70q89j030r57a527E96R13C63a92n29H0
+17867I89J646K96A041a092j405L28L79d79G86e4G30A81L0d16E06R41L6j9k77a075
+17888b488J073L86A362k48k90b68j894O88P16A537j07o44l39a423c71j239b65
+17906D88J579L50A025h37k04ka87A87L2c56j493j37M33G06J574M92j84j064e62
+17926g71K74o62A77e60L5j359K51l53N13A554K65J173j220H8d39J02E68M60C65
+17946B6b020l40M64P47B19Q39R26m58D1d85n41c3A83J273P71C64a640o74e10E4
+17967D95L02B1a462n49L18O33E72M03K27D98b75m12p26G98Q45J468A324c41j791
+17986b132l44j33N28C24L71a83n30D03c72A318J298K99p00e32j202j616j71c17
+18005D08J216E77d32n50J01k90A469O69j89b4m28j730f57K06l9b41C34i02L07
+18024e95l41K64A255Q90J32B90a093J19j607N93A90O71k33G3a96m31P6A97g4q01
+18044h75c79o40q62J84d83A297J067m00J15g13J19j458a016A023L70m38e18l34
+18062h52l71L4G31R06k7J95h8p72c96o73A24P43a89j695j049Q7a214E39J602R66
+18082C107o14r37f13l84L96K62N8A72f32k28o41q59B9P69M58mB92c97k75F8J823
+18103A891j61p28D3i43j314O65j5A9J008D01b82p11b69a16E9J340K22p22m45f21
+18124F12l8J023j54F33a052j054j245K04J214e26A159L16o36k94i4H67R42L01
+18142B110M13D32g64j291j133J341g82C31d27o18o60J36E30P56J004Q31l47G20
+18161A4a085d21n35j65H59D24b490a015n33f89A795n55n67f05j40f2m03A901L85
+18180B286M2D01A68a267n36b32j261A701G16h95r73k33R10F05N9J406K91p21D82
+18200D16b31F80P7im30j249j41L6P99C05O80L20C88g6B95B5M47Q38N18C35h07
+18222b086Q83d17n1A357m99d30p37p28P27A91P2P81N76e67r51J56e80B15J047
+18241A262O62I20c8m89Q1A38b04H62i0j149L29r45K91e68A894l13F42O59h91Q
+18261h83a6I90j53N73C65a782j44N91f4H76k18M94h9j062K92K35A033J95J68l17
+18281A079f43k54K80E64B54J244l51B43a694r01a119d54o0a72j31d9j24j24A031
+18301B362k39I46e13q72m38k41f29B20M86l23e18l41o7L28A071J933o38r52f09
+18321c53o32b70E59L14B27q7f24J32n00K26H66J8k42d45q91L36a45A496L58E00
+18342C33R36I5h63C71D1J93c30M9j049o20P05B8J618E16b52n57d01n70a07B236
+18363A919o45g8p90n17M89k79C55O50L10Gc01j276P72H70j30J5A49g39D84e11
+18384B34J707N08A187e39r80j04m66N95c06I2K06a050j016P12a35G94J847r91
+18402A650p67K1g36A84N26k94b17N3r97j638M66g19F07J091k86n9D14g57G9M19
+18422D98P20j97B88g62p95K11c53B37J030B28a294J57m60N16B71J448k79L02E99
+18442E84f43C33P38l58K49c1m15j619N86l41b58L6bj50G89B10d99A503r8P63H72
+18464E07i54j340J75R90a2D99R4d1j11j027B20O24J428r01a35l93m02M64A190
+18484E98A60p0h53j179M56M1P40A344J118r87c13A77d66H49D22M63c88o13J61
+18503h40l70a68G67B43J174D7B3a143a90B30J380m75j12a71j577o90O67P35a36
+18523F78L60E9a207N92E0Q48C16Q18A35c46k71p51D5J78M02k96a121o46K90M26
+18543a051F31Q48j49N71E26g72b98F21PJ66j93e60m8j995J171L80A071m63M23
+18562A031J71f63K7I14O69L99J31a65j40j070J46m34c86F33h40k42k61L69L08
+18581f66D33J612J0J57G52d78K02C02R64O5B20a210j98j214R56a55B85J62R34
+18600A381D42c74E03a86A961m48K16D0i50l19m6j86b94C30g32p1k35d26B83J268
+18620A551Q81k71j074n32a542l38Q43A80P9p0a921N41O31o66a02A104J24L26o14
+18639I40c16B62L59A61J503b4A48a356k05e95b85k19A315B53J40f52J78A32R86
+18658A118D94N58M17a086b55r44o68e4I53C86A11a678K2h28D85M6J182l02l24
+18677A087i12F33h39F56C15P54e18p94j086R36O91D07L71j40J21a62D75b12A230
+18697I23R57B0c11j427m46g04b75C56b85k80a88j198b02I7J777K1O09B81a483
+18717a752e18B30b81B5e05j426i04k29D5J351O79q04c45a08k87H2J359a25F26
+18737b76r92Q7p10f79I0J070K46F57a63j85J21A175j05j07l63A17a453K71M5b83
+18758DO2e49p43L07M33a01F24R20n44k44E6a439a41D07a75L9G5a611f37j131e54
+18780B4J277K4n72G6c21a29k5A237N22J30e77r39P44k19K6B8R94H1a59q72M23
+18801f08a37C40J187j91j86h97j09B52a204b01A156d96J61j429K25P8G58J629
+18819B387H31M71i84d32A9R85O15n63J46n01h74j066h01d4D04J91N01d09j67k1
+18839e97A99L12Q01rm54i60R3L50c8j90A796A93a175M24l9l6A66J351A23A4g3
+18861e50K21D77kQO90E51i46j72c00J44I95J51e39o09l87B47d74B64J524n82A88
+18883c40G1c72f0I50dk68p48j45k64h0c4E18R61E01j54h91n80A76K94N25A37c17
+18906a223j05K72F32J124k22o04A00f42A3L57n4J293A98b49k88m32J20B89J022
+18925A311D73M62d54L2p84A94M66N01N75e94b93k6l73j40C46m6L94d08m71n90
+18945a469a42G65L97D42J53k22i66n2a5A003J18j71f35a4j343l85c0nH32B64c11
+18967a44r17a98I50K5L05c99C62a403f59H00c91B12b22j214l94n75P84e62A846
+18987G72J14m0A14f40B16J074m29k52B02a265f17b90p35b0A30M82d79E47a330
+19007E22N10N20R17C58f43k22h2I3J99N03r6g84n93j032J124b54I28O97p03m43
+19027D79J3c05D01K25J23k95e07O4j466f42L19A156m19C39m4a145M21d2B009E56
+19048G60ik74J0j246c24P7A399a546D3a164l68N99a67A120j66b31j079f09e4B36
+19069E0J567n82l49a175j34m26f37b42E71l4c44k64a62A55J127K97C09c8jo09
+19089f48j81g1C71l9J126e50n67e50o02f3C83J028k06i8c0m57a62M5E97i39d37
+19111c82k44m45I37P36m60E59b82m10E13a42B50L61p1I7a081k78L45a4E25K18
+19131G43O65F34rA80L31O53P0m19J15a401m84M37K63B45J516j61p16E3a176d11
+19152g06BR86G0g3D07e49b23I35P03A47b22k96o18nB6K17P97k48A42a002d57D27
+19175I90J180A058E13c92n73k72J14b48a16l50G2b1j257B26Q80j70j24K79G6a26
+19196f68j36A92R63m85P5a586L55c82A57K61K47P32a72G9c70A261k50N57E8c69
+19217a639l78Q87m13c6I77B06P23G1i93L88a41I41M79o75J65b22o66L95D53A12
+19238E58A16a016q4L49c6A119O90q56g7C3a122J57E11J86K01h20L18q39j36e34
+19259b12D64Q7F9d49l34L36J50I96G1J75Ka339JN46B012H41m4K43a85n29O4j18
+19281g68c04E67n3c98n48M01d9A373n14M78E83b98k54j034N41d19m24hj253N69
+19301f92J0R9D80J137k5E09R88A09g95n24B75b58I15C54i09n45C9K60L81K76b64
+19323A56i15p87b17C28A13J595j68j28g8j214a81H18J68l91h42Fb063L40f31D96
+19344A14M16e84b19D10J216E89Q81K07F81d03k03q89P3f19I4d12p56a63l93E70
+19365a72I96D32M39C65b00r25J07D24E9R61i53n98O91K13A7M97K17J41j83e06
+19386a365E33b65G02k90L09i98j85R7B35J25M41B49N35d91j302i4k41G78R5c57
+19407c67r67N29b90f1a9D44c23j364d38E3j2R23O75D15G9a035K99K10e9j34A18
+19429c63m25p12g06C59R64k83O15C92a48l9m67C15c09D8g13l98o08R4c93hA230
+19451A375k66b74j359a17b1F69P34K3I8a169J7b81o40C02L35a221M20l23K15D25
+19472A253N38K11I13c08a29q4B89K80A52h10q02k34%l64a050B38M30J066H17c4
+19493A343K37n38A24a72q79k57j077K95d01J51A132d28D54K92B36L65J711N30
+19511B842j274K6i9p12l13M23b69l37q35a90m88b75I68p3Q93j18qBc35j02A90
+19533D35J96K03f39Np00N20d07D90J52B20L7e25b39F09K041n50j32D58i49L75
+19553e74r6r7D51A60g68J36K2p80e15H92J236n68m7k55D14B00n4e20n1o93k45
+19574a509j056P77N11H15j05J137k17B21J051A64a46C59b17Q7j93q12j63L59O1
+19593h78a39F49j35B19e22a27k12A273o9j70m23a368K1e15C46d19G55B31a10j324
+19613a434m30a45A065E01J57M44GP43J88C41L18J56a038K3j250l86a133A17g74
+19633G82J04r1A61J090N7K11k50C47h5p79j272K84j42i82M80A35L4c32m9A517
+19654B475n82K51H67l98a494l97N09L38C30a98n69j9l96K27C18Q24n23R9kb61
+19675hA96a35A073k93a300J76r34M25K3b35oD37J09j38b09i3A002R30p8J1H20
+19697b36p63M58m17b31q96n71j18m1c16A273O27J128o18D77Q66C65e48E4c69r23
+19717a292K90j642L2Q70a13H72N18O25p30j29l67N87n52N78D98d76o13j028j43
+19736b260R98e62R0A099j54f12n62B68O14P95p58j13B30f50l38B7R32g5q70q8
+19756a033M81r74M63A05O62k42J72kJ44J9p3L8N20b23n10q36J51J60m42e83J59
+19777d24r2A059B5a022G81Q90K89l18n70c16K4j259p44J60B59f45m62aq2E17P62
+19798A279J304q26G38k52e32J3K40A64b24l7j51k23l17j066E63LJ30k32N77D07
+19819B30a74A044l34L50o7A03g49k04A11N8f06n34L77b49q11d1H44M09P46q84
+19839A115l69C05a165a15p23L90o81k10M59j196f8m1F68J272l48m09C93J38B33
+19859A143e40H1f00o77J11j42M73a83A570G67O87k37E79j83d33D37O5g62l77j25
+19879a264k33e6p29L04J77A48f38J07l60c45A114l94K48D31Q1a445B06K76R92
+19898A474c8j49Ia005L61A1b81E12K22b0m95G38l04j04J608J004E47P8g59o85
+19918a444m07L55f06H2f10O6b30E9M34J016l13L50b12n4n39n49K67D30I0D4f02
+19940h01i1B29K30R03D78K11f47A71e05h1A44f62c6l93m96D92h1A25L11h33J33
+19961g00o31d65r65G68J65L73Q12l26b38m18j01A192d35A17Ha123D12e69F56Q4
+19981G40L21j02b24o28B77c7G26M77c00A29d91j485h43l68N00I40B04P95C36R8
+20001D34GJ61Q5O22b47l90K75o93M57j59F14M64k78j47g38n67f20E61O69n04l27
+20022C99h19O8k76a53H21k56G2a06D7g58b96E9j8O92c26l13P0a3k10D01J015k87
+20044A129D26a12j575Q31D73l3A42k8L45k20f6C06P30J87k60G6e0j072d0m82l14
+20065h36b09D99L92i70o9L31A01Q53g0G43D8i81A30AL24J22A93Q19a159G9d14
+20087a026A29N92L69d4q35m09c50F50L49J30E59B22d30a04C64e40H91a89a2p68
+20107g80L09k35I5J44J38K59L71b70k18E9R99L89B89e71m01j33M51l12L85D49
+20128E29b70R5D41h74I33P15o91l99a15A8a144M50E7g83F54B70a056E0L14m5O65
+20149I84m10j8j02c72Ja85j8l53H05l49a462d59j134B88c7k4F33k58D4h71Q2G90
+20172A009K61k25a52j8m3C04A09d23P8E88g63J23k42A90Q78j53l54k31i6E6J015
+20193A071k32c43D93A19K0N1a786A42L80K68b80p69F64d36q18F30N28A40J73M77
+20213G90c93a26H20k5m7C6in12n5k88b00F66c2A37i64c0m18k07G41M42n48H2g60
+20237h04L99dE69k56J42c08l4l96L12D31l2GP03a260L76j99A252B51O28D36h84
+20259f93k92n21f33a23C44a32B90a08n09A063l97A91R32k68F1a359c36e4A97J433
+20279A630a73j05o11o70P31a83K8E48o5d00AJ06J66J372P05I94a51j146p7hj083
+20300a091I64f67l11K86l35d04J30A279n51p6N50a19G2a24n5G24k17a04j245L92
+20320i57c32m36A88N67L58m11b97K7j57a19A077j99P06c19g4C61J88C1J272o24
+20340F79B65b07KJ02m44K28F17Q08a090G5d81f3l3F66M53K92a133L12k82L78q6
+20361h11q7L82m16c31r19M79b45C42N03C55H6i54J50K23a09H93b05I61f04o16
+20381a220l76F1a07E38d65l59K13k62d28a40j51C24J147E85g30g0G93M92B24J378
+20401A602c52l95k208J120g87A52c69G72M21j77E8Q44K56k84C40e2k6m44j115
+20420a637g70K97D2K6Q1b18d7A16c83D55B17P67k95j79A46Q74D30eA298E90g94
+20442f45j151n5B57f92J31l9K89I30GJ453K04J46M15H44Db35I6a513P23k52l58
+20463a400n73L29c86bA080J563r49F79F9M37c57A747C59p5j26g70j011L62j95
+20482a614a26D81L36B94M33k71b61I68k07M02B47Q2c61l67b46j9C89a60p31K32
+20502f59j003j04a1q0G86J82J27c22G49J38j09B75M97B0a336J04j18O49k97k66
+20522a264N41b11I86P8A3Q59k1O64m39d03a83q77o80c90a54B26b43o64E74i2A167
+20544A217B27J20a07p81K13M1b25I16m09c8A075c71C98N89j56B31J106e02K5p79
+20564a256J84k46h6A541E03c48A78c56h9A99P00l97D7a254B15J29M07L07k03N07
+20584A362o45c72q52M31k4A34d18m12j027A45d86A008L76L43o08l9n05g93r14
+20603a707Q02l22Q8J89q11J93b86D81J64R06L03j53L66B79f39k55c30m18o33e29
+20624a394K50p83M81D28L87j91N88C08g00B92J471o61j26a33k67J38m26k92J51
+20643h29j10B0a100k02f33a99E41j25J236G95O70Q2n21D85C1K56c94q29j121m2
+20663b386a021l8J90D52K32L29C72O06O15P49o23p97c24j311j238N63P39j09J11
+20682a569J04g16G87C67L60L61J240n56G95a83n23m57l33O71D68a73l89m23L49
+20701f36A71M44g5A696q25c73B26K72k12fB97m1B7e59o85M57K9b66l70F02A17
+20723e78m39B4L51J274n29J12j23h36D5i60M71q35d28j377O79K74d1A195Q70p
+20743B058r52J21C68j38h7j015L16k16L60j299P2h79b25D58O15N40m84N21B75
+20763e90BM96f08n47M90q20K94N47H9M46Q0j55f18J50A25c44D04L64A06b15o13
+20784h28k48K81F14J83B0M72a342J44j0e84K84C29f54a41D39P3M52j94Ql70a26
+20806h24J72j466N43N00d80B4J71e07D7N93J371B83J151A18l2a494l12J93b89
+20826G6d72C76F4g8l64A164J40j8j25a2ej249N89nn9a5Ga102b91l46B48O08J01
+20849I57m71b89n5k49K00k1B92Q64a246d37a12D97c01p14a49G42a055L94H31a75
+20870A75J219J42l91Lj18d48K02j73k24O1r90g50m45k63c97G44J057K11r49C75
+20891A92J19b55F27f66N5m22l36M58l15M55D35N00Q85m19o60B3O94r7B46M44a54
+20913a168m10c01l22D45J5A51f70K32E27f25I2O00O50n09f35b3o06A26L32J243
+20933A701H01e46m78k71L59A78dC11R94g02D7M55O49P74H02k93h58J99n98k25
+20953a482M95K00c33A36K81E7L56J365K73H26J106G26f87l18l89K97B37h23L19
+20972e04A09a554e04E09K41K11P15F74a17H61I7i50C42a265C95d60r92N50D09
+20992c31a30H38a5F74f06D57g08D32N87c62k13a48k54O0j64H99B59c34o63r48
+21012a945g58n41a99F09m7N06B50M74d61A83J219F41eo40o9j135i19H5O64C10
+21033D88e33F97b37n37A83c63D97g76l5i9E11k21L19J23M26n49aB68g20a13A1
+21055A64a034C44j56h1F03k32J228KF31K02a10I97F3K94K30K34i43a37C46g69
+21076C98L38J65j26d38j097b14D19R6a99m8a14o94K88a70A92MP06d30j301F0e94
+21098g94A83e60a52m87b01A100B2b9A096j59m6B31a205e13H2i98A89P45C01a79
+21119f09G52l8J38qb64E17Lh07c58F1L5Q8b50o44p99J67D06b98B8Q20l12b28k98
+21142e26B43r8J53o9C2c14o00na26B4P80i41P4c63n6p09A85e74D61Ok29L35k03
+21165C70N06A94J200H9J100c06n24L94J78A469F11A04j0c85G13h81J11A229a60
+21185a50e0p96L99A58d36j47B85g83C08a113f9E69Q45E51M12c0B52g85j71A34
+21206G47k88M59d01j558g1q2k4B24b80q09J17d62p7B72N31p6k36g77b81N0J06
+21227a25D0P77l23J37f3o13B41mK17O51c33G7b0o73a88n8B53O79j55B69B6a031
+21250f25E92B30M01a71j67m03F59n7E9R62Hbm64F95A11pP7L06j13g40f3m43j51
+21273f57A13K27Q64E0d37k92a0B74a79A381C74a24l37j34E06R2b1C58b93A38f92
+21295a87H01l32M19cj5o23K23o6a88k24C85f73c15j89a09A016Q06B75R43B84N8
+21316C42c29O7B79f56B04a90o40L70n6i8G1J325b14I84a15C23h65A50M62k75N8
+21337C95J21g5n60F6a51C9f50p36e0q19C44J25R9B5gm60J37L5E72k12P31J54f
+21361G60f28Q2b01i1l93J03n18J5Eb68G04J20P35p01N3C37j62a291D61a65m94
+21382f59J6j66j00L98j94a7m2A70e4D95d15p1E72k57M78J3g32L56j89j111g8H4
+21405b10m4k79J05j06jF6J224n78A55L32j54A1J131n28b6C88c60o97J92l8d14
+21427f46H33C86N5b04I33kr1a45A84K14b32j240c32n96a4E70f31e2k51A001C93
+21449F14J024E78b17l51B96e89B09a31E39O87g49G3b8o92N8a59B71a09q84L61
+21469f32B36o3L75L2L45j91k79a82j44a9k50j239L6f92K16R3n21F8J355m64A65
+21491H18l69M42B40e48l22E1g3n93O5a88q1BN07j46K38h48K04D85K97a150J12
+21512a038C08O3c4l59H73c55D57A47a562e63K28r9L1F9e99l22P1K85k68D31N70
+21533A001B16a36C23b86Q8n80D36J84e63a25l38B4c58I75C51J20b8A19e29b38
+21554f54c11N3C61R32f35i4C5P77B30d01D00a898M0p5P65a37E75K09kL65M29m79
+21576A097e01A318E44d38Nq67o75M64M04d94J88H2b70E30q2Q84l83D43L85k28
+21596F00OJ16f49L6J09K15l60A29a383e05D99A0b85l78D56j57M31c29A482E95
+21617A82J294C38b73l25J97a77j193c30p99M04K34L6c0H02Q98J9o52j62b67H71
+21638a58A29a58k77j080a42j772g65j2H04P27j8A35J02J271D74O9b16D50b70q39
+21658a109m50e4ER44J31j40d78De74b68B95e71a50A3a66n0k51g6G2M63k50a487
+21681i53m18L67C90c94b9p69c38E94f8D08J078m81d91C24e60o4o48c96I1a66B09
+21703b89J01Q5H87J35J87D17j43e8j122K60c77r0P2A10A0O89B48b33A184N26l71
+21724A339a53a6j759f98B61a22l31a10m29h0m37D83Q24j32B69ri94M37j99j87
+21744i43K34C5R53J21f81I92c94H4N95B83b46o9l10K68o8a60A010N21E31f25F1
+21766D61A71J55K62b63p20d39j61m78A055O9n49B04N73j01c7p30J56b52j87j410
+21786a849K41g97m26i9A82J76J043j63n17k32B24o7J086E88g92p94f60a7l75A03
+21807D18O83E5N87d91d1D29K23k7a97R7l30b8q31a45H82M78C97e16m59B63N60
+21828H23k22A97K49c21P7P9E68K32j09l5c87A01a088J66d0o52fE33J54c06E63
+21850H11j10B75N58l7B39i04M8J95pJ46B94k4f58D24Q28l88J72JK59d36j33m33
+21872a002O1J81o0L66%A33h47G67C78J296o86j48j75f34J22B85jM19a324M56K23
+21893f45A86N91E4M28GN79A78a4o49a65D33j45N36L5k93A6d56l7J42J64g5a6p96
+21916h12l66K50H00k55J133j61D88J00O87a04D78j96d48O8j175N04m84f86IJ146
+21936A155E52j82K74j20A02K37R35k6b13l19o80M93a12n5B97f8Ge66j61F02e80
+21958F31c50O3G44A25c89B17K81j20O71A94L18c87p23J74a27B12l3i09B42C6P14
+21979G50O83E58L13l83j52K27a159N1j06c73B32a89q73N25E25j28J30O97q9G4
+22000a220e47G7a63D50i4n83D77c24n48B55O99D67K2B01a016m96N01i6F5O98j47
+22021F16b08B60M38k06J3N40B67a9B55a70B30f93h7j57G4M26f24m16G8J014e84
+22043F75B33J62iA37O21b23E55k21I1a037C44a162E17K91g95Q9J64J70H1HJ303
+22064A311C40J576C40P72f60b77D25N00h5k56A10b9q88d45A70J67J59L77B56m4
+22084B12M56d44h4F13j70f45D56h11K41j1E24Q3CJ218c42K3A9J10P20L83l70A52
+22107b62k21H2N24G8h30L48K10m60j83K91b5r6m4H77j82A69e79H79l17k27J33
+22128D68A58i96b74a05k57l02a76L0o40C8M95B14O53N24C20i18B2d98q5B57a35
+22150B06F7f45l87L82c03D21i1k74J09B47a518e2C95J98L15C42L81l12A49b74
+22171F32n6a62B04h55j03L64D6L35L50B03O59j47a56B76e51E2a051D26g52n62
+22191a314C5M8i9c9C60i63b8A40c7k89A160A19K90j20j05J23J96q0g59J91k54
+22212h22r7L92A09d33C09g4j45Q3j56l31B76J760D92J68bH00B75a037M25l14L02
+22233f24A56e36I6i84H52b32A140k5A96d43a13B26g5A252B57L9c10n31c19Q0P
+22254b32NC64n5C3Q9g19a94f9B11L18p4a1k44m95c50A084A63f03L0b0C11c72J35
+22277b37Q2C39c70P6j222c50E7K19J71J91J77d3nj50r4A60K79c43G80I9i11k14
+22299a125G86K2C19D6M62c17E6f1G43A28c14L0e5p5j69n58C37e5j12B0e05o6H
+22323D87a53B77a9r96a54D34A06f15m9A64a32E04d07E45E0O8M53d61a68m87E60
+22345b84J12q61F01b1n6o10E50h07H8J244I4e02k84A9N2c43G68J86g35B2a3j04
+22367a17G7K63j51M97l39a69m30j26G49F8Q67m33b25A11d15a92q31C05J13H8d92
+22389e47H68A55L00J96E6L20g5D90i7L2E43dr51d50q31N92K76A013g1Ok87j5m17
+22412g84j43aA050m91b54A63N15c78C27N58N5b13m90A53c27l36m79d3k16k33o87
+22433a179b30B49L51P77E74j07m5A07i85M29K16A024g62F00i5E0K9O12g25b18
+22454c10A68e81L8N3l05I00A35N22a00E4M06a83A14M87j57A95Di66a96C13E6b00
+22477a56C43M82c8F67A26P4J32e93m14R7M0A1b19e0B61h20G56O7I7b56E57Q4g09
+22501d59n28J96K38o13B00K79G9K59A18d17a57I28A01a43B81a63n0q27c22A121
+22522b5D59a9r42L53a7A8b06p56a76A76a261d40D6R03m5n7L34c58F20b51l5A05
+22545b86m11a81k50e7F27J451E44O20B23Q99e9j06D2O92J46f81B28b39j33a1A31
+22567b3E67e77L5Ha48a7A14c90g3B58g05b81a05l25F64J94H5K54h86b80B11m3
+22589A68D9L43c22E38a47A156B18J339G26e05G12a128L33b20l00j40B3d09F72
+22609a64o11c43B15P17D32K21d13l52B6h27c51m73F11bF13M58l23I4Q16f4a5p8
+22631i3j14H8e86A72F9L52b61j97D96A68K28e32b26D1a030K00n24B84P08b77B88
+22653H73l51d16j90a2I67C31i47b26A47h66k91L67b55A29N16E7k1P48l27b51l0
+22674b81A45m2c1j335b01A033l16b58F49A83c41o93d99Q4a78b7o55c32p8D6J140
+22695A186C63N47C72K98I3a97h1p47c19j63j113O85L80o0E36A94N06F8O8M71A20
+22717D8c92a7m67A03a221N62a1F43B36N21A41d86A14g89b53g8I75D55q3A08b18
+22739g56D31c58I00b44j73j045a3D09g71K25a2A77M45B46c44D55M87O44E00d58
+22760F18B62p0a11G3d49J55l04J73n47a3H46l07P40C40H5c36o52L29A61K77d98
+22782g9G06i92d09D5N63b19H38g36K69k78b7A38N42j10A19M01A31K69b44I32d34
+22804d32J38J1j278a2m72F92l4l02N75b62o60b81D54j24h03B82c67B5c06A4c14
+22826C85L30h23q6a59g5b5j70d3k77d8A35b91h7B13P74d07A145n49f27G6a70A15
+22849d23A1c50n02g3D79A31f6l05a08b1j70k36r8E40l5e87b17G2e33e8B60n7R67
+22872A170g39A94K13a185K36c2D53A63O8c39J66q41a53E14N10C08f27J33a30D6
+22893a136K92B44c69q77d23C14K55P03o00M61a61l55D8a77H9a7C47J98A37A8b88
+22915a143H63f68j24J81k49L53a20C30j40Qa55A46b48B47j5J68mk7c31o16J81
+22936g66k4c77M6j43A519e1E58a57A86PP49B94h96H6h6n99l94c94J6A25a9A36
+22959c37e1m07F90l17g73J64a76D4L17Q80K14B43g88F04c88r1j14C42J31H2L7
+22980A19e59G16b49A237j66B09f3B28N42g7m83e5p54B5J29i86k9M86G50k4J72
+23001H98d03M4B74j8C9P58c34H35B98d20J45A35f38F39h5B04Na363B57E4a38C67
+23024E30k35a70n77b84G81k7C2g63b51l69j061D8e93a20l81R3j67G70A53N04k57
+23045D00P40B57J42h4m64H0g1m11n41M54K6C66g50L31C35c0E31j2a34H12f63f4
+23068B35J42c22A40j5f34K58J18F35b79n65A44a22B70A08P72N23m99l89J11b52
+23089B52a39A01M37O5G3c90F7e44J16E47O95D3a83h2j37G89K87L5E6c12p18d37
+23112f61A31o1N0b54A066B17a93H00b48D09D6M72A33J35M95A79L06K43E5f23a88
+23134A67a3m50b12k90b00j47m62E06L88C53J28L96J48B80M58q4A53c24b5q30C30
+23156g26K01K35H04g5m27D15b2F4B1a101I23m20P4k14c23m62B76c99G4A6a401
+23178c27b5j194c98B55d10F81K96A57f5l4I82D85J77a365A0f66O2G79e06P8G48
+23200c55D91k41J38N80H2M59c13l36E7R7J7RJ94J75a54B03h21C75J70c57A121
+23222A223AJ14d97A29R24b33M8A64K05a158e11k99b05B70J06h57A96e74k10D04
+23243a034B39g8C88b46k06A28c2A47R0P7g07B18b4B90a50F8a35pG1a78n75G73
+23266A55J022m95C12Q1A65a48G64c2o17A42a283E1a90e2m31E42B11D9O65a85k76
+23287d61a90F48j91J47a30r81M67A37g71I9a58B27b98o11e3A67K4O11B38c83E26
+23309H58B5K40b60H85j59a381M04M42B66b18F78k81e57g8E87a27D67L04C57K8
+23329C85a293M44F2d42D35d05A049C8d79D72i81K7A05b3B00K44a096M68M9I60
+23350a083b76A86M6B4i4E67F8K04D1R6a18m46a55j46F07b43K0E11g8D22b30m78
+23372g08b9A14M8i04o6d15QD46B00J246E90a305D88B11c96I69F0a388e88n6J43
+23393e01a22o14A041a99C46A72a169b94j56B4b36j99F90D6B0M02A64N36k04a70
+23414b52B58A26J68P05C20a040b42A60L52k50c10A486l78A2e87F48j83c00q18
+23433a118D80d74J08a2p43L71A91c21C82j31b89k5a07F2M87N80EJ06a003D79c95
+23455e19H4Q84k97a468e29a31L5D67m5j83N58f73c8k30g8B26M56c3G7f77B22d97
+23478f33G41C42b18q0B56b62H68L02c33l53A47J033d1C99O38d54F19A90fD67h10
+23500F92a452F28j34J08J81C55f80E79e4B56f10j59L34B0a11C5O21C14N75C69
+23521d93F4g53c52k70B90e05E64k45f1B29L48j14h3j7m52E02c61E54i0F11L11
+23542I22D08c17D52K67A05N71a87A15e38k13A65J229A87d66F49j09a59A44a78
+23562B00g7k88j38C79n6a076E58A47d22N8Hc56D0@C09J95K75A58e91E1d36A67
+23585I31C11Q3a69K9k63B4e43D36b41m8i1J8l05C4R46D11O37c26D0a2A12a073
+23608B38A5a62D61g42L01D48k12J3J483H12l61h16j61r30d15M6F27b02O1k40C11
+23630F22J65L80i1k20j85F79B75c29B87e40B61c26j49q54f3A157A08a61e9j05
+23650a64j12o7A87N8R3M28a81E7L1a23E20a58D78a626g36l96L70C82J92N72l09
+23671H37c17H92l10A4c95a62j0n05B15B5c72a86C66A33e46E90i1k20k89b47p67
+23692a014E79C7pK80a186A050B95N43GRJ00J46b97iC08c82C56d17j98a66C34L27
+23714F61B74J62b59I07b97L3M1H84B18a64F3d62l44b28G43a93B21a57I77A06J13
+23735B19e75d8j11q3B72h8k58J08l3a10j30p87A19M71a60r47E61A9L50fk32o70
+23757i08L26A26M52M17g2A13i66b26A85m4K19a041c31C44L75l59Q15c8k56C00
+23778D1P8b03A254g65A19P20D03J37d77a78C4K32i7E71j04j81M27l11e2l27D95
+23800@c83E81b17D55i1D98Q5c28J34j411d24a21m53a03F42A37L00b13G55d48K18
+23821b30E1R0K86b71j75E91b23l24A88K63b23E46c90B62R75l61C51d13h0k29A30
+23843h21B76L25C8a17B07b02C14L41a49E24c7j33H02e82C11a86C64J80b03A23
+23864b22D74J95a00B75M9A8a172C95a368A011D29A67N3d12a17A91P66A84P2e13
+23885d00J87m77a41B00c87H65d91b14o20j31L89C64b69A00e53C16q5F7N24a60
+23906c38F77k59i42B90J30b05B60m3c09i8Mj081L85A14J070B7P80k16I1K46K32
+23927E69b49e2A015H2J43f71f9E44R6A08b00r09c20o61A262e78D26L91K61m16
+23947F62e91K1e7n98B59d3D3P76c50k51D30L43C18c98n64D94h29E61K87B94j17
+23968A77a16D3c08D09f35J26B83e07q7f4A98f95J92D81j85A41P05h71A024i69
+23989C09a29b8l1k02n22D7O89e30b29M6A554d63C09f3F8d55c6n33DP59h3j9m50
+24012e52G6b30m27G17l33g9I8K95e98b26M4j98q7a56E02j28g71b82D22j55a27
+24034g32c49m75B2M5i79F46d10iA11a84l90K67i2D65j56L2M98C48N4a58j07ja12
+24058a70l72C1b63qH8P7M50pL57k39A9M60a9m2iC96J86H1g62k33M08L1A39K57
+24082C96e44D28e10G62c95A451m92e47I46a26B66H9L0i0F09e18a46q71g2l68g8
+24104F5N50K3l06M52b70l2G6d38J71R2p29C31d46n74L80I8e78J44q1K10l1A000
+24127G2b24j74e6D88b06E78K21d61l3q8D58M15j18j10f0B54N78c44D95B14K26
+24148D40g3B01kh75d1D25A40b48F70a00n09E61g68a22k4B60N06h28i5k18l40C41
+24171F2N40A35a92k44M1q4c4B52P21B53d37B94J5P9e42dD60i0j46j52E72B74d07
+24195F67a89A24f6n51K96B73J57M18B3c38j22J41c2D95M53C1c29C99o9f53L23
+24216c30f8q61K14L24a2m01G56C69c01B21e47j85K40A26g88I86l51g20f4C10c70
+24238g94b50j3C48N4A0g08C52J19L33K23k84C48b83B90c60n14d05k1A71f5r37
+24259a002B77b15G79J5L58C06b32D0a26j07NC61g2C02d05m14A93J212A83l3P13
+24280H63C51J10G0e79E21k28b3m93d6B68f00E30e58A7b97l46K4L01r10E01a36
+24302f2D81a235C7a78G45d34G50C24A48e65a30m57m0k23k83C77d08k67L34G02
+24323a52dA46e53D04A88j6O70d61H25A64b78n4M2J12MD82c06D63f47E68F5a01
+24346C20g07A93i69C47c00a50C58K09j35f44J06D98d86e1I83B79L66G1L51j95
+24366B27d19pE12c98B66c90j030F72A1Q64A87P23D03h9C43c73Q9a05E00A51J165
+24387A316D19h60G53l9a47E35a73m05a43E8J23b15l27d8n43b04k7c0j62D60L35
+24408G95c31G03d87k59A0a079L18c68J71j19o88E3O09L10c17E69j35n4m5a96A295
+24430G90k31c7k97a02B72g39B27e28r2A94p0a66C06d1E28K61e79J64j96J02A72
+24452b48R6M0B76c78k33B4P16O2a7n96E37b21D59a51j8q1o36J97b83E08e2l7j9
+24475a08j92EK55j05g84B05b9m0o15m5o40c39p89a04m16J22O5A11O40C26H1c95
+24498A13f8c1o03C84J66A64a63FJ24L7e69M9J96Bh68B41J60b23B45b08F0J65J24
+24521C49i8q18B21i5J0B87e23K00J28H7P34a82Q8A112B52b88E81a49I10d21E6
+24543D80b95F4K38c0j017A6K87J100d91b37B53b18D87f12E96A15f58d3B29a46
+24564D93I6M73A45P26A44m0c84f5o63A328o38f53K37a91A17h3C7J63l9d44J69
+24585b75l99a82E62B37b54B73D0M13h33A245H9c87B39h13c60O1q02g2A6a13k47
+24606c60j56K15D62c9A02aD01n0K19d5F28h2m70D13a77E73B6a42fp96A62b91A409
+24630b95c2l81h9n27B52N18f54l46M25l4B56c1n2E05B30N30b20A75K54e64D66
+24652b01D08B2i32C68e32H01h98C18b25K8pB71d9C35l6G7a40l64Q0H64M12m38
+24674H38C47A44k6J204E82d32A29c76m9a74A72a456h6A30nf60B26f6H45a40O4
+24695g6j82G01g92L83a31D58j26E0J15N61h84K89l56C89a12E39F0K21f69f3A15
+24717a62d8E8N58B32A06f12E22q0j92J33e70N7g2o5l58B64b08D05A11K29J89j14
+24739D15c45a30F28b10G11d12E81B49N5F1a84o55A119k14b82D57d1J6F40p0J40
+24760G10B16E4d78H40HJ79e81J31a00B77i5j15R9m40E49c80A4R63c27A47M18e36
+24783d90n23F1b77m03C36M65f42k46a72H99l93k38A26A6N6J93p7b74l9D0J39F5
+24806B50j05M38A39J15H5e0k02D30j0f33I24D53a56B70P21a48k86J26O2i2l45
+24827d37B6e6D2O81f98c07l10b99C9J11g16C43b17o61c85j1J00q4B34i8F7Id32
+24851a18r3F30a99f0E9g96b10o01A00a1A96h45E38k9a269B86a22H1Q27d43H4c58
+24874I2L30f61a23A01b58I6a40n2D7Q16k15j97a9E49L8B57b44K0C5P60C81A89
+24897A05J02b02k2C16N93I4j5b03m13A233C74J38f54J70D15j66jc19j76B26R0
+24918C16a17A4L36b03A052a54l9p55b75p0E97e66a53B90A02j7K54p1A01c15A24
+24940fI4K64c02G81C58N43l14B81gj021F5e78I8f0A73b59C17A48d64D24a01F04
+24963D99e11a21n66A07L1J04K11c84J82A14K2c72A41P4d14H55h83H52C08h6G54
+24985E13P0f57D31d34E26a37L7o57K15D21B7J03J12e5H32EL80e0q27C39j62e1
+25008A9b44p6J39E60P4c7C55L00A26L24A44J23d06F12e68N4I61a045C38h25A36
+25030d0B14C6M1J330e4j99m9j5e5A07a86e8m89m6j16F81c53A01i86B78A33g77
+25053E32A8i5j04i2r46c25l6A48J75E7a087E76J48B67O17c92C40F0L33L99bj2
+25075a4G60A91d54F09e48A79a33k21F04L45b82C94d2j11A41J85L02c19c3p54B22
+25097A199a146d52C85d87a17A34b87C40j39a32C68N1b31j65k06j69H45h6E11g07
+25118A37J78a01C31O16c11j22a41A19Q96h49b02D3K35G3R33d58a99A09e9A99L52
+25139E51f1l59H36l30e61A357C17j17N5j0K78d89C91e5p54K54l55i0F5L31J90
+25160E86k26G6f56A63d72A50K44K5j89N5d17J66n96E91k1A29a51q30M76e2bF56
+25183C34J27a283e90b26q51L11B02K52jj58e19LA97F5e09D13g6n11A8J69h87A94
+25206c1D3Q46H5d31b05p8h0l37r7K55m97I9N17eI9J15A07K80c53a18cq5H29d39
+25231f89N4g6D6K58L92B32a230a18N3A02a339O37C22rIc02B23P5A24K93M64a54
+25254a94H03c28F14A47b91B5J0a164I9N37l4f57a22B63b83F41c36B0ma80AJ29
+25276A30i9D84a015c53E26f86C67c29m61H93b8E6Q09K58f04k13B98j36g9C51c05
+25298E78c54G84A06N64R9l52a7B87J32O28f39A40%g66I0J08M3a37A110B20c2H2
+25321d77F6f42a74j024c62a71L7D30h7l68G12b24G65l66c04E24B60L81K80c97
+25342a16m21E56b7E6J04j6b87J7C37K1e72J75E05d39B10e29A49e13qi1k28C82
+25365d0C11p6e3k50C99L17B97K51b79k61J6c8m50B53a74qe6j010a90M3F00d30
+25388I48A25i4j56C45K40a73B96O48c66n69H13d54A84f51b14B05a33F05c45a58
+25409A64h3n77B10a28p15C48i50D64b47F88b42B76N0f04F34c43h6H96e61H71m25
+25430D46a150C10H7e43G07A1O44i71B84D5a2n59F68k61A35a62p35gp0p36F15e96
+25453e53a34D66k30J396E99b04B70d0D58j98a90A58e3ip76e0F6c42G02M71f68
+25475c51D91d98j160c55a9H7d24a12C32g95G3c0C0a176e2C9a81l10A99e17j4E17
+25498B77a26p0R6m66A05h86a29j398d76A312e0j67D80g98a06E3i2A000m38c60
+25519f58b78l78A41c08o8G23B17b87I74f70D74K31i3C21p5a2j30m7L4E81J24a8
+25542A01a19G51C75P3k0J86A40h0n0k41C87a84A72L4i19b70D36f67A62N83B72
+25564I16c27Rg3k31C27h70d03D75a18F26j37j49a11A97E4a130F70B21e70a62A45
+25586F63f37l15B33d27b11k11I37m30d63j09O4B80l4e18D98B34a07B84f62b87
+25607a07I5D4a34B16q7c3C00r1h6B13b82m19b33r8F5b68A08M58B32e06k87B99
+25630A40fn70b45B40d51D9L00L08B84E0J92i72D19e12G48e05A89g17F35c90j01
+25651d91A65n1e73a17B64@B69a3H15M13Cg0A80b62b3G75B54j11J43M49b0l12B60
+25675a97G9d16E66A57o1J9c04E9g96F24c97j5a46D35A51M2K66d4A25e88o94C27
+25698e8C12A6c76F1a2j28N1G98c9H95c80Ge2n4o15B1J19N04a135a84j47B81b40
+25722b19D80A11J40i02J48K66b36E77L35m16e16c2l31A046h85B73F2a69D51o1
+25742C90Q9J33B16f34a13e2A12d31A085D90A68nK72d21B62H1a47E26A68L03A25
+25764B93e84C84E4M10A12K66a98j22j99D92c4p14L02H36g86c70j29A46c56G55
+25785f66B32M50A21A3b86D61b81d9q36e5j50e9q50C87a41o9PB14a018F41B31b35
+25808f21g6B97a90A026b4C49L71g2C49b44fC26a022c41G14a9A02f20J81e5l3B1
+25831h2C80j65d52C34c85o67a0F21K82C65a74G0a90m10A38J22g58L32m22C49a34
+25853b85k76B33K39b22C28K47j42b56D52c31l42K77j07B02M60b97c5r51f3I41
+25874A85J76c79M1D73b1A4N94K30g0o88cB68h81D30g00C07N03C38j44c00A7h63
+25897I73e05j55q0A15b03E42k34d19D79i49c31Fh20A0d12J80F10c40C88d0j45
+25918a85B10L2N02g10c35a49m00l50d42C90A00J19e25n56E89f85C24b63a25C08
+25939A41a23m75C35A6f43b40C01A34O36K5d9l3G22j27f24b39B19a6B82K00d23
+25961d28i2B41b36G2L27C6b50I69g45i8jd8B15i8G57a27G08c62i7A94e87K59E33
+25985b37B93A31N0k1f51c2j46l09n71b17B10b18k01J32D5f57b24j144f67hA31
+26007D51j99K98A22N84h0o53c60m07A55P60h77A029A6f49L3j57b81a10C94K38
+26027F32j68K85a08k43F13A17K45a35F6f76Cc06I99l78R4k75e39J41E28a11m78
+26048e89C49d37j71G4b06H33P3B56O9d08A99e32F10c87H37f62I07c15A017B46
+26069C25A52a85g8F63a6Aa09B74e75b23D30B10Q57C09M72B98j6A24O63f60b05
+26091C33b46j88J14qJ44C8g47L21C74a330d54k72K9A62M43C02H3L56c56C98g75
+26113H34C07a43j41B77K20A64Q18A11f03E22a64l07F06j94n8R4c19Pm36e5k67
+26134c22l65B63k8b23n83A68g0b8k43P3G99j8g97B2c80J84l92J06A95K80Q20a44
+26157f24a45j115A38L70a52j00B8K38a79A08J49f70J54C04A25M31e52b65n7A99
+26178d55a59j27p8H1M56a70j62J23C52d23q31A51h69A2P01B56d83a01D61a35j86
+26199c21O8A09c5G03C4a68H23b08B02N70d67C71a24f0B87c29F53N22D14A48b81
+26221a09j78I4M84d72j43C17d96A226c06n82E20a1H3L29K59e02B12a154C29e98
+26242A04N72c43j95j01D0e3E77b38j05l0Q4G29a18A48a61F15J89C09A32a37H6
+26264G77f30I02k62Di2I2M63a38C39@c24q75a95M5l97H12b7A35d3l3n23B19b78
+26288D88e19k46c16C93k4b20k65j19K28a45A02c84j60m22A013C83a38m2C17j18
+26308A99F3O30I8M05I6c30A59f48a51j99p84a37j27B39N88l09i37a62A24J34q5
+26329A73L30m3E9e80J42D3a68D19a17k37j00j80j01A05L06m4b71D6h24E7N24d5
+26352B35a87k98A06f69a18E59k40j57O65b20D79D8e73G12a42C96b91A77nL14a34
+26374d99A305b32B9N23d18g9E41B44j07b47D24A76K74f97J70m79h2C83g7l86P2
+26395c91a08j34c6A17M2K40b72l94j39G19k32g53B88c29E6c55k08q7A0a2o0D09
+26418a93E33A81J58b91k52l01E1J7a80d5B90C8R72a64r25D98c40H24j72k23A09
+26440d22A43a090a25A21M5d93k92E92a79o46c29A85i1A42M2e54H08D2c64k57C24
+26462e8j74k1A77a11H90a05G95e92F17e29E44B4J25O16B64g29d5No23C07a55A48
+26485D29f04j51K68k10C15R55i6n7n8F76i33A90M32c82E71k32J93h60K97K36p05
+26506a032B31g52b12E57A03RD3i5l57k00D11A4d47J31j13r6a84o27E74j35a14
+26528A164d22D49k14Q67a36p50q9b17B00h11f9G2R55D50j48K5b24A57a49RH62
+26550A15O62i3q0n77B47a554A08n0M48J47B35a04PB52PK22e88F42B33d35j43l5
+26572f13a46A339k22a11n11b15O8G93l43l5e57a06K4j57E20J31A30i82N2c07B59
+26594a15n82C55A37Fe52o0a75A72c76C20CMK01e77a7B23A9c11dB83J12A43M1a43
+26619C81d21A4d58C14c37e2I73d41A23P28g64q5D22f66N1Q0C97J47j29E0J096
+26640A146D04A6c28l49IL37b51j74G28k77a181e54A16e70A37f81A79l9c55A12
+26661C05b47D4d69E62a19A24a69C75J75b53k91I44c31f7H58D3g2D74D4f4j83A27
+26684d21J44A019A91R3L45a53A67f68j70d2k20F29b89B49e2r32M37A03J27c80
+26705C62L6A07f29B2O55A86J46h12g5k58G44g1F03B55J9J57e62k26A98g4C95J120
+26727A515I4bm05J84l18A96d46K10C12b15e2j5q98B20K01g34e6B2b74G06a134
+26749A54C7M52K9A1a46k62Q7j5a09n65E45b39q64E98b09C35i2k03F43Ia50j09
+26771b59m93G41B29e47q4b64D15A18N55e98A0d4m5r99b23F41h37b55n28m16a72
+26793g02G2c26k63b29B47a26E31b17D32n0A72b26m20B18d70A80c07f5E28A11D3
+26815h3B56c36C55L44b25E47g06a02j051e44em02k26k07C90c10D84j36a96E39
+26836d73b32A056A02M0f0H22q7a16j31A121f24K63l54E77E7g29P2Eb1m06A41K25
+26858C66f13G1J23O29C8K30I1c51J62m69K44K00C91E4a97f7p04a9nk85F34A53
+26881a169b93E90b64F83g76D68c41D40D9c23fC91a44G47J04f26k1E14j04A79b97
+26903C24g09B52o4K02a47E77f40A12k1f8l93G28C54n8d24m14C56b45F4J6L21K58
+26925F59L29F1g14J20h4F29B04a66r14F11h8B34a6A87a15C16a123c21E71g09E12
+26947G54b72A33Bd23o1F6c1l08C01h03a17N0j5A23M45j37k13b04j91J04h1j074
+26969a155F9Jf05a85A35J02c17D76I6b06j20A29a28k19k90f1E21R0A05c01j4A46
+26992A0K9c51F46f25k95D32d24C63J86R7p9A76Q8Ka03l54I5L13c77k42K03k93
+27014g09A341A00e95D53q1e95H3K88c80G52i8F20b71p59C69A53d6l74J84p53H67
+27036G24b61cD0J6k7M9Q1R51a10C75j12a28A30a283e46a38p2C09a207e8E78f44
+27059a64Ge31H18c22E90h75A35L5A6f38K92D66b73H4f17h7B40B7M14d28J06l26
+27081f48a00C13a95G03c04B99b41j6F09a86E42a18d4j91l79J66B85K02J67j13
+27101E41A66a51p20A93e3k27H94D9a03k59D01a202C05a39k94a20B11J74g20L41
+27121c79k99K78A3c54J33H39D02f32a25e2l56f2l78E47c53N8B69a2B17a08E3h98
+27144a261F79j92j34b98C83a44m5R0E24d46J37C03a012C4i89f5D81d98m49G47
+27165A22IJ060a56E52P0I1g32P1B73b01j29F14k36h1E4e63j24A19L82G4J01b69
+27188a84k62k31a36o78hI2b66A80N35c32l8g1C89f18G7N48j99c95B66d19k22A84
+27211b21k39D41b40o7ej3B71MK55d43Q7k95H15C9K34M09B12A8b84F26c46a10c3
+27235A55a88b2C05b57A43b66Mc8B62K69j72J51a147d29D9rM67J50n2A99d97b30
+27258C33a83K6A47e51a06j54j16Q6r7a29l37N7C59a12E24A64K39b2GN89d90b14
+27281f43A149A49a71C47j24i28l06N96F95d36A90m5b47n82F03c02j04C34i6r25
+27301a021b47I63i32C31d47a35A34e91G28e89I3B8h42b22RB16b9G76a25F31d53
+27323D01L27c21m98L95j11D35d36B93g16B08L31b36C79j38P04d00E57K17d74m46
+27343i20Bb05A13f2E86f70D99d02D47K8a93F55b38l61E06O22d03D05e43j2F57
+27365a80H0M87a034a25o52F74B20b67J4C9e31B10K16c15F16j78b78i2I43a204
+27386F14d42r02D47f26B73L74B73g86b40k82J12a62F19a05A000e5B92J19p6a70
+27407C6d41A97J21i1A43a19J3j52F93k15M76d66b07l82G6a1G83a9A29J78d29H3
+27430E8b1E39J15l6L63c49a16k35B55N9K3B0d48j334f79F42c34a3C19c43B21a93
+27453c45a45o7E0K50J84K98f55b81A151m54k85f60E70b48D53a58A46O9J90h6H58
+27475B54a07A3a14E62e2m70B10e96p4n07B9c95K3p04C16c12j70j00a15B43a66
+27497F71d23j128q9d94b29D95b90E40a39F67L29F8L39h9G04C0e35a23n51d7o83
+27518g30B56d26e2A12f1n25K38bF7d39I9c09B52f0j49N6C3a195A18P77e6D26a217
+27542h68c87D43g70c19j85E94g11j68b85o19D10e69B10p3J08a59D45a56G53N1
+27562H04b82A9P82a0Hb71n47l14K35a44r7A100e07F15f46A2b12l11a99ap2A11
+27585e43b18A63h0q0k23i3C80b03q42d0F90a82A15N46a68m14G65j81A73b15k92
+27606e07B82fn78F98A94E3f3G33k96a79H50A24b97d0m69B87I3J37m7g07a38B86
+27629C2R9a37C11p0O17h29A83d46fl29Pk33k34C42b55D07C9h56J12L71ME95f6
+27653D96b7r0o24L12j31a4E87h99A298f65C91K23b42A96b94j174A65m0L38j04
+27673C59e12E24A58e85a56g7j256L52E2a52F41B83A9c2l43A61N20n3g5B54I4L29
+27695D23E7b85H75b99B66c53C08g9H20b40j08D42K80b01A37M51D0N53A86f85E11
+27717a40j97F68m7a98G28B28j05n8b98k6F99j07k73A11i5A56f61B15a29k47A62
+27739a9p28B93h39A11ek57i9H2a64B7e77a59k35C07D5O6ka10D6f9E89A69N95b05
+27764D6a87m73J11l12B13n2e2l45C8Q99a89D1J052k36j36c32B9J40f69a1r21J86
+27786g46G08e1r88D50b79D93O46B93a54o49bC30J1b9A009d65j29A8bB4a100M4
+27808a056K70A54K4g56J01D36g22j58b91D35A36L85c64G44d57o34a21B85J28l6
+27828C77A26N49f36C05c44f3C91b87c5E89a28D15B4h93G05J48D10b85h3n46J23
+27849e06B02j0J11d25B44d12n26C53a598C47q6d52E44a025D21Q35A50P54k14B94
+27870A67P66h41g8r9j88E98B80A31c06F19j22g69b95g0B13K63c29a61A258B6g19
+27892f64E15A71N06h36B37a83l00c6k82a10B65M44b43E66J46k47a40D28j78R7
+27912C47d5G39b26B41K43@D16a54A7b40j53B85D7O48c44j94o6C06L15a11j48C44
+27935a33A90a6n33l44m53d98l14a21D01g84J82K21A20qK6pb24jj47J79l17l21
+27957h31c75F64a67k02C56a053a25m56J91K8N3l79b46EK56b71o43a24e9C74e30
+27979a73A62e45a29e9l4F3M23b56C69a307N02L17B87J9c98a15A139n62B35f27
+28000E93d32j12J46B5J65a115M32m41a5E74k17r3O70b21k11C4J247A51M5P32c85
+28022B35p6C1M05p4L69C34b59k19f0n33H6N94a61A242d76@E42h34b10K2B1O1A
+28046a99a4j09E90b51F70d54o46B19a78B43i4l83A252f20J23K16F9c31c1no65
+28067g01H69B18e6B48L44i8l89A325F44a78n23k30c47G5d98a68C7c30E69k2a335
+28089G7L03d64C58a89k11A127f65D01f47E46fj296F99l07N78a34D37c96A50c11
+28110A30b32E51c99B73i6E87a85B56ej08k94J30p9a4j02B93Lb82l0J55A04J92
+28132B96K30d59C33c94J41g0p2o86I50C91e01o0b14N8C57h28A65K95b13l14a67
+28154f3k9A189n65a77m88E45b85A61J137b03r63B19E6L39M75A46O9J939c20G11
+28175F6a042A063C53a68D57j35A29J64a87A72D9L75j89d24A74O34A06a98A12b97
+28196E00A87b80j53B30Q0e51B52c30M9A203A52a42H57a80D2L67f05H20iD35d22
+28218F5a16D28A7L39d98a76D22F6M0B0a094H20l12e07O8C20Q30C42L54d80A08
+28240a041M74k18B14d07C5fm67B7a076c65C96a24F40k89J77I2l6c71E24j32j48
+28261B44A12h22E04J16M55k95F7J61h5B92j12L49g7l96H4M47A16J302f50j27L20
+28282d57k63b58F82g80E11A00O48B0a261a69A39M41f61a20n29H50C01d09F0K20
+28302B80D3a37I24a15k05n88b03m6G73l24D0d06j032A81n8J368D27j8g64B42G1
+28324H05C33a27N3B35G5B0M09h54J68A23a88B32D4O5dD65C3L52a314b73g4j46
+28346b20l98D53k03K99B8J79P9b73o23b18q2j72C6K01B0N1K12d37H4a988d55B23
+28369E57n7a268E35a3m24G09k40d47l17A10L0J37J60a4r26a72C21k2h82a84l23
+28390e07P6I07k50A96O74C41JA4Q5c30N7p83J76e6C49A19a9o68m2H60e72K60j01
+28413d13m78a51F44C07L64g90F66e79D71a70m99K77j30h9C63h8B27J78D7f78B35
+28435d1G02d54n21d59K4B77f19D88f2G76b05C80f47G58a47m7E23j21J7a95E53
+28457F07a98l98C77M34b8E04a04A01b77B07Pe4A31A5J88b20k87B07a37D76a27
+28479F26j31f2C41c39A48Q38D12f8E23b91D5b43A50F5K77b49D82j98K51n4b15
+28501F51d91E74a8j52j5E08K25B05h79J97J31J77J76I6L57b01E33O46m82f7r9
+28522a66j8C10b87K4C91L00a19D93B0i2E98k93b46L9C32L01B22d4m09K15B4P6
+28544A00e69PA52d12a39A53K04D9L23p6h7r21b79F18j38B40P34j50%c7k37i7D65
+28568A135b61ij107C93Fd4G45a03B81H7i0G63Rh27A9g45D1N4b99F96a53B52a61
+28592C22e43j68G5i1D0d27aB01c72kA12i58H19b21Pq58A05e58G75H3K99M49a10
+28616B05h4j274b7B53P10H6a67H63d47QC67J97c62A70c8C1R3N38A65c82a10H2
+28639D33A28K86e38B17E8h43E00M60a17B79M48k30b82C39g54D28a35C09e79m82
+28659a061J72P4a33m5I30f71b35E94B94b60O1j07B38a346f20A56R2b10G28a5m94
+28680e09C56g03C20g40E4e98h9o1a6q5em25q4G44f78E68a32j73O5R4b1m21R2C4
+28705g11a70I22a53l67D2R02e62Q1O9A132a080d75a7j067C8b04A54f17a79j94
+28725c73C87e94K58a05m60d3l37C05a12j66E32h97A71B2J60b28f7H07c22D07K81
+28746F88a11k5I9a221B18J160F36e42J26o60I58B0N0K90J58c20J27C57f00k1A47
+28768C44a68j55A1e81C8b03DK2f43A78b72G72j95e3C42a70l60k18h0C8e70B08
+28791I5d68A01e26H47A71k9c90g1A92N02d10D44h2A400e43A33b8k06E60b96J19
+28812a77F15g64a85A022f29b19a00E69k60h32c15E22D4K07J27P0a388F2L21b18
+28833d26l36Ml7C30M80k16c54h3H0O18b57aD28g0K5I66AO63d71K31o42b69F55
+28857D65B05a52cp6r56D14L65D5d77Q4J93F4a12B89O6e29K61j53n99B07d87p77
+28879a264N12d5F4K23c59H24e18A48a85f6j202c16C71K15B37o6b19j188C16j29
+28899A87F6b11J01F43K1A44n4g35D32K84g40b63l4j73E66a73k04C76i62A05d61
+28921A74K52j50a04B20b75j27m89J70B07J13A37O2Q14l93f7C48g5A466f7Fa04
+28943a34B03J0e47K0j5G16j57d51a56A95Q4g2j36D87D9R86d63l9K30b6C4c14j68
+28966d82O9A077D70K49b81j54O6A64G1a292N06a5o71b19iq68@F7i72E69b00A52
+28989A055c85Ja11E43f99A2J301a16j39j38n5E88O34C56b06B73g79L16C15d28
+29010d52A8c99B2g1j37E6b86C35K44F2J7e46A412A77c2k94i3C0N59c98J4G41f2
+29034G7g37I7Q5f38C16g29D36a07G04J27B59d01A1J34e79F86e71B30a37B38Q21
+29055A059H3c25B03R21B71b75A478C80A87B1N51d3D20J51H8e62C16d04j56a03
+29076b10m11B2J80h40c36a29A43o9c43D05c03m53A00N91G0Q48e77d5j03o07E5
+29098b25d0D63j78F2c55l1A681H10l79a38m43o61H69A53O78j20A84b04D63r3a10
+29120A106e31D03K28a654g85B10A4P59A68N19B20g88c05n82D8J063l90K61B60
+29140c02l52K96E87j79H9m4a05m69A177e2E67a31j26o17c45l38E42o9f25A011
+29161a5r0C61e09I96C96J5j51f81b7p15a68D00J01i45M04o01C60c39B26d19F28
+29183a086I5L01b42J9I80c9A82q7a411d51a26E04E7J24g6k80k51E08b75CO72q0
+29205E95d32L5r8f2j96I93f15D28r9C4K43A05e27l11G89c51A80c2I36l98d8D97
+29228A47g51L70J23J00j07o43E94d08E53K13k22k12g56b35CP2i0k70C81K89c47
+29250B30c29m10A36a84j45b7m17J47C08e01o54b4j11C60G4e56J01B44Q0H5a191
+29272c79a40j22H79b10B1M30a81k78G0a00F99i62b79E13a32A8a96q11L70b33q06
+29293a039F1a029K16b68D83b98a37p24q5L23B27A7Oe04m4J31B30e55D10A82K79
+29314D61c97n81d70D03d95B11O07f4I8P2K41a72D19c88h3p3B2L79p0b6G36b55
+29337B29M00E8g99F9k0N00L3B7K47c30J52k6j59F98a34j50J3D96j98j42K22N4
+29359D32a15j192E52b20R1l20C14E2a4D59d2A047f56C9d1p89F48ij60D52e59b55
+29382a49k9k79A70P4e1m74j93a96q99N22k32c17j57a14A61K28f01D31J56d6n73
+29403f19F4a50j468g1I24D29d25F03ik5D3d26A53J85N8A31e42m23a50l08C30e0
+29426D82e36F17c64B07c67A51FK45N60d48H6a60D12d29G02b90A55a472h5C10c52
+29448a46p48H8a150D35J74h6j66m71j35D35k5i52a85l66G09a33L8H69g5j133b87
+29470B52h72a22m40H49a00l78f0q86A76A6J77M98J48E1K17d62J39J26E84d45a65
+29492f3n21K55G83b36D35b71O9D02J60a80C27a286b02A1f5l07A014g93c50C66
+29513D13K82b17J07m84C64j0j12i93H39l28j83f76J56F65H4M7n1K44L63b28l3
+29534b61o08c49C27j43K70h1A99E5b88A18B4a03A434a047D26J59b94J37m42K00
+29554c99I49B47a73k25m5K8j63h7k47o2j71E10j85a72L3l72A68c06m07F63B48
+29576I0a89F26a00k25J51k2A61c25l9C76L40j53d25a92A015D52A97L19A23J86
+29596C09K9D8N13J23C34K67b4k48E64A25b25f6m63E55d63m37F14c1k40A84P29
+29617I13h7A011j20a75o6k29D15p7M08a73E0d08F2L11b30A191n51b15R1B63b22
+29639D05d25JF8J58L0A26P15a72g9j63L4N4j93o4F9L18j46o1Bd36JH10J50c79
+29664c61c3p82b48j15C43a06n8P2m88h0j67C31L78O60C96A9dG50j44b85B21c37
+29687b13H63k49i45a14D0b93G06b65J30F85d17C12J73k25D0g09A080c90B72i69
+29708H74a019D42b96h5A3a15m36I3N5J52a101D17@f0j89eo4m14C88i9A371d18
+29731C94a6B96A01J138a285B34c12L5A73d4p3n23l50a04F4c78P6B21o1b85m20
+29752g05j98b13P4PB26b07l29J36D55A81J48J75L77c73B13G5M24i34a64A315e26
+29774E71g7k56k9B89e90C85P0A63f1B59L98i20E66h8c8D91j22A31d20c6k67I05
+29797A63B7M22a00L5l22B16a085B3b66k55I12d58D5a69D67a65J0d9k10f5b3G28
+29820c93C8f43J14b52J09C06M7c59l49h6nm63A77a52A268b83e1B93c94l4a8m61
+29842d79B87L47k90J32b1l78a15m14a48k66B47J566b94J19D56j20J33A14O30A88
+29863B10M32C12f38F5A4a158d75C48J31F2L49g34a27C07R9b22i8E14a75n11B10
+29885C74e26D72d77G60b55f3l6A39J70n2P2L24C26L54F1P9c31i6F53a435C07M25
+29907G32a62n44J57A37a71j94bq98H6f16B73a178A30A6d76D27A7J16a16j54E18
+29929C78d33D83b32F9h79D13d33k91c4D25c01B35QL46d8D01d31E74B36A14b97
+29951f05m52M10b0j372C07b93E28h5D62d84a12D14a5E8O1b27n80C13K49K88a14
+29973B28F2e86C94j02a83N5j90j157E05A92e07n49B47a75P9F05i25J15C97d58
+29994D66g51C75l0i90b39E31a059c24G63a06A119c70l99K62O9Q7n9B83a44r5d3
+30016g85b32p0l79n13C33e40C76b85O9f3C36A52MP36h23L55B70O02a60q35E39
+30038d03D02J18b91C56e37c3l11G2J37d35G07%D4O14k95i45C97b78j17J29C17
+30060D78L02j71A48B5a50n5B80f56P2k41kD97b93n11A63e87ep24A11M88B82a61
+30083a136A42k6K97K35N92f9H10d76e4A41L50a95B23c14D32f12B76b98D3h64a91
+30105b49B79q8O12k98k18b6Gd50C04qj43B0e21C6c99R1n7D53b42O9k37F72A64
+30129C0a84A53d1n03J72ik86r0A54c38A54a71k30G8a94r32D95cj98l78j30a4k04
+30152b18E30j16K22A68Q13d11D14m1a24p21a96C46e2A053a46E24F6c5l2D34j98
+30173B36L02f67f1A10M17A99a41A50a44N5l65B14a07o3k94A045C79f99C10c72
+30194f78K81J62C99a78B68M7n7N05k10D7c06F56a23G03f56H66A39k3n0c43J69
+30215a74l01G72b10l91j90K39b36q6j85E70A53b94E78e61F62B20c10I46b16q08
+30235a024K43b71C65j22K78B25d52F59a37G3a18k9l8a5A157B59O77a58E50J65
+30255G15a350e28H80d82G86b09D23e11P1F51A71g82E7L45c56E2O26a8A12e8k15
+30276b73B46f21I3J35N10A30K1N20i84b01F53B91J11J93E2g32E50l2d62a34j076
+30297a210G45C41L55j22a38G59k42a67k66A82e04a05A22M14a74C48A22L56j47
+30316C31f63K17A037a27A87L94m1a38G79g43P7B20N22l23B0d40A23N20f09b41
+30337A23k2h75B49q4b4E3f9E4M27g1D58r3b74E03D8e02B65R27c46E19M49b25G94
+30361I1O98k85B07M5g48e6q46b49D60h6F78B07b59k19A72m2b15D20a66J0b4p22
+30383g46b47j41A83D9O00B79Mb93C88R2i31A55J80P11D07N8K64B90a601e73m0
+30404f13b36o49D37A34K33e08K53k97J92F5d88E67d49a49B2M99a80B59K55r6c41
+30426I55f57c12E87a34l87K25m79c51i3D14K90a22F25bC05A45N08l05j68K96b4
+30448d10d6D56i3j064G84B67c53F79k68j03a3j92k13A056a70B04RD8M11G3c63
+30470G86j01g9C42o7h35I8P52C44F6d54A150e8j24B82J09L82B80A25N99J80h05
+30492F6k9a76G90f02F81j26a18k62J25Q5E52J09k14b76O5k51p5C65a02n36b09
+30514D45O31C37d78b08r9po73E15j93F5i3r7D37I4MJ242c69F72P25D53b8l38B61
+30538f9H43A37k0i8k57a69D77K48a092d53A025A88h98A018A29g6k88A5a260A88
+30559H23H3b51J16G25j83C9a97B89c80F83g11L05C35a85D99R0e57H46b27D82P74
+30580A256a20A71M14b73D4A9L00b17a5p26B84d08J52q59B97b04D15e9j08B3a419
+30602c38H0d07A73a51B93g5A41g7q05D23o0a2l70j18j13D60A6L8a017A8f26a52
+30625A20b75i7k71L0A60M08b85J15F70B91L38K30A23d37o00A547h65C57f3I1P8
+30646A69R8e85F8b0C04d34f5C55N45d05q8j58A97H3a44G66j25c67n49A29e65a94
+30669e20k79A9e74G06Q3h9B77rc36F14A36a62k99C83H5b21E82b96f8q65c42a37
+30692G21j84k50J42D8b85m64a1j9E2d53F7d53G23e27J82G84h19b35n88B21f35
+30714I8f85b80j6G81k48B9f83a57o22a95m79L34I99o3D4a063G55O6k67G0d90I12
+30737b34k00C8c76C81b66E91e04G10i2C67a06E89j0A62o6b52I19l99F5c07B46
+30759A018c08A9J1e00D1c96m9j41C3b21D14j04A18f40r6H43l22A93L2J40A19h21
+30782a01I03d09G81d8D22H6c70c1k53D72A30c03H18a35p32a98j49A65N99B97A13
+30804e0D04b9A69b11F90f9j040a91O0j6l57A77f04%b62r35M53B82L76e7A382c33
+30827h54D0R12C04a73C23b68J6m1A113e14e5G38L94h6B42J34a009d00A005a87
+30848B66d18E7O47c54c9F63a7D93K07C10K91h9l6j02D83P17B05M13C09c4KI20
+30871C55d7E3a076a28n94Q6j63K04a11k80e7B1c94Q5j70C47b90D34J48A94L87
+30892E81E9PK14O9H0K0O7a44C58i42F5M8g63K13B74M56l40b85F4h27B16b02AJ32
+30916A33K29p9j09f98K56A6f01C93A16i08J93H69J32C64a92h7j049d54A91K64
+30936D55L6d20m05a7l23j39F56e13q0F57k90d3m37J48a31B59M47f17r4C19C1c96
+30959d28o45D84j51J98f36F95h76D00K89n3B63d19H75b74ja20l82E20b69q54C1
+30981E1M52L08B2i3D4c31B99h36K21K56B93J1g03a10F61L22a43G8P84e7A36d73
+31004b1B30D2c50k04K56l25A3J89M47e42F19c7D5N76A67O21B57A25e1j8j16C51
+31027A57f69D19K2i43d71D54g43C03A31b89l66K92B2J70e38H36a41o4D07f72D28
+31049b69h2H68bn16D57A45i36B12B3M38H4M37a53k93C4J467a50j66B23L75f2C69
+31072b5B09l8M69b24o40b53E06k0f60A064b76E15N11A0J10d95E4K42a049c12F10
+31094H06d59B39e02a69H38c48e1o14D37b21A74K30h90go97a31B60F8J80e48J64
+31115c84j65r23c68H35a169b81n1B50G6Q38A76h06A13a80m55E05a066B53d28A0
+31136B93ki5k64m8J70G88d88A96d3E76N7K14C66h7j1M2m06c0B36j07b31p8j8Q7
+31160b40q72b31D80K7A76i95d7A92N60C17A02R19a62C58A1L23K9g55R9b2n4l64
+31182d40D14b86F1g48J15J60C2e28l34a22C30A37n7f74g9n57b94A05d8n22q9A210
+31205C3e45a24j49D84Q14c70D46bE27K73H1b15C10e31F82J15A45J33g24D61j81
+31226B80a79k83G96l64a02B16L07J41a292G4L63a072b4k77C84K57j85a44C95L37
+31246G32b2A07E0e7k34k48E0c46e0I91a68G4f18D6c06k89j51A66J30P7c32R2L9
+31269b01H73f6A75c04E36f57cj56b0k02k48G29k82p3D2a89B19f11P3A2J30a13
+31292B88K34c76p91C84J57c38A513C51c34G02d09a42k64G5M89k7c47L9A29N34
+31312F63a99q0A25Q4M98b2F01A94J77P0d29D8P7mB3a45O3k61G0K47j21L74h47
+31336A78H7L75K34b0D99c37D95A50g6A170D94b44p08b27P9J3m82B8c7o77A91J0
+31358B01Ed84J78K4B90i3m12J41C08p9c53m2Q3H14A25a53N0C54K16c95E20d2o7
+31381a09j80A80j5N91c9G8N84b79a7l04A9b40P7AN8c95D51j14c19A177c13E36
+31404b7I57i7q34G1c79A40P8b8E3J044C39a17C43g0A34A1b39G25a68E88a64j51
+31426c15B57O92l73A90Q83B2b95e1o18C4c93A18d23l33c78J66C46d95o47n5A9
+31448g39c4o95b93l78C96c53a10F79A42b5k34I39h50a06F09A54R01b36C57H4c87
+31470I1d31c1A83L17c92C45c37p99a80l58a88B21E2c68hA226i79K55d3m65j68
+31491f76kD45r1m1j5J67h12A225D22N3J29k5c39k47B69g63A55a19j63C5A0J76
+31513A86f88E89g53K37F11h53G48f25f1A243m79f96B41d25d8k1E97k60c08a37
+31534a79Ec47j058A21b40n8J02l57a96h7E29L03B37b62k7k42n1M9D91a71B59J36
+31556C95i03a47D88g89D54k02a51H55l31C2a055c43e4l52m02I20c9k47q39G67
+31577C16O14DaC58N43B59i0k58g5B26j00jh60b15k88H6h30G2b15B52e26E54K67
+31600H21g62l90i9A16b68a34D47A92r4d90J30A023C92c01e1k62k66K58p01E33
+31621D3K91R9J07e72B97N34d04A02J27f14F54a80n21J66d1G78A91L05a25l65a6
+31643g1F78h28C36g10k37c68C68I1d73F18B98f97C28j28K45b19D75k02C2f27f3
+31665I06h9k69C05a78k65a02D9a43k24F00k67I4K08J96j01N38B9h89b84B84I0
+31687a37q13C8L56A48K44f48D63l5c37J61o65D38e90H76f40Q3b52k65B80C7J46
+31708A83L45N2j07h26p0A0f27B37e21H14d30r0b06F4c43G64F5K10ik21O6C32A10
+31732A65c86g0aC41c47I9P61k41b93k09Q7I00Cf93B83c26k8f4pF4P47l10j20a6
+31757A87c05C82J283A5a86d3D19C0g6F11k03M81B5O68e27R7C09f26C25A31M39
+31778E70k13O0i3j5A58f59A139a05j97m54A44m9i15D0c33o52c33B62J68A3O49
+31799F62e30n82E5b36M6B25m8g2n13D73j39e94A33o6d67B66Q77e01j29A7f43A58
+31822g88J85F5M31a128B30J034e31l03b21L0iI05j98B49Q9M40a68q06b01B4er54
+31844i59gD58A46b02j0k99J77JD73c82l65A083c24J32h1p10K20E68f63F4M86r8
+31866D52D0a8l83l6B65g11G03L91B81L2h41A19O48k89a024J28C08e41l9B91a5
+31888b58D77A59J16O3h11J73K94d2l63A57e82D8g1k24l98c06E91f7n34j99b93
+31910a03l33g4o8B91k9a9A98R36E6K93f45a3D27d98A50J18A04d76A063n07b8l37
+31932c65l46C16fl60G8a6p05C86J78c23E67K88a38B90A30L89I2h08D90A29B8L52
+31954C80L7b56k42F9e62J63B54M37d44lq8H46b14P7r9E61b7l4n40n98C16A16f0
+31978h21a60k37J77F37k16d03a80B51c81C19j45K35b03I2J349g21G57b40a6j18
+31998a34q91C88f7B39L24M68a36I8b40j21l07C13a77D76j84c82C43i20h7B49K1
+32019B70g85A88r3b86J05E16l9Ag02E10L17k98a54LOj109f24K65H8M99A57L52
+32041E09H6b77e0j015F01a716I35C46i6k01d1B76C5P01d67J37j63b39k32E02e51
+32063c21a47el9l97J62H10j73a071A3Q79D43J62e15p68D78b32o51D60a215b72
+32084c82A69c45g5q45b67j90D73A78J2J58br66B2J5J92d0A71K25J27A91b40l12
+32106e52A4M77d65N7B33M23B21b62C92R21b01A6e45A126b60l70b11k33C30b18
+32127b3j91A178r2h61G60k78k04L17J83B51i2B89A34J09a76E32A93b0m6l03F68
+32149F25B90j29c45n27A9N98K00H3J80e42a7k42i3j98k00B90J45b80E72B10d13
+32171g38l1L26A69dp64p93F30a66E87g3D6J55a043K22h3D81K31C11i34A3a349
+32193A88i3B83k7e86a70k51A220A36M72b42E21e42a29I76c62a9E29a7C96J1M02
+32214H09B7P76d26k4D00j84c28j74J3b28E85B20d59J3D57L48d20D67f91b19G14
+32236D12e37o5E01b85f8l18C5J29L71Q26C35M16B9b13E24A33i9H4a52H4L04b92
+32259a033B00a64A53O10h9G77d43a50n1C03j12J31b0A85a63C23g11d6m10A4K13
+32280B27L08f50G61fl01r55c63E39b99B63K37A72N66J13l30R0b20l93B8O18d45
+32302i6F57a59F57Q9k28J81b9D01a78k84r2C58b26E13I4k8J23g37fC71g17E7L00
+32325C57I4e04I7J9a04A63h83d24A32F5a313c42f4n16b33C85a45k43D40b3k98
+32346c21C01j07c21F24k63d49k99a76B81f6D33A69d13f4I2J40J76e38E18N9C2
+32368B57b0A077d72D84M8A64m2e76E37B8a16C14b76B82r6k6b71e8E36f87A8i25
+32391A063n18g21J25C06d18E98k14C3L31C3e04G95c00A00M36b97C44L99C8b21
+32412c34m5H9K44i7l24j98D3N25k23j41e88eD83K47d94A83p3i9r5D9O4c09M0n29
+32436g98r7f4F32N45D67f52C15i4E57b71R6d5dDfr15L97r0K87j10B93A23P0Bc48
+32462B06d0n64l66G18f5K8q23F60e81e9F67k72a0G73@d03R6A186D54C5R14C71
+32485f9E23bk2G7L14b01F6L5J72e41J73b6F98A94i57L20L8k1K38D71A94M51g01
+32509B17fj45n14A129B0N87a46B87d72C59J04I3b07o25J93j88D15j16h15a40p89
+32530i29a74k61D11o4j57J20l8j8L53b2A31K70b79A18E9d2E73c03D41f4B65p9
+32552A86K5k7L27L56B94g05H27c42C7P92J3b18i2q02j9b00n06C37K58c16A35Q9
+32574B24K1K67d32B95c32A124A7d30A02M4M95a62C50e23E49c1n91J3m3e9l59H1
+32597A33O72a9D86f48C1f35K38o35D95L32b81G65c25G00j66B56J62j24f48a02
+32618F95b37H0K62b63G39k84O51D39r3a385HJ46K71J4j89e57A407b43o4B50A9
+32640B15B4c21H3A6O5a004A03J80b32H01j73c31D53a323A046C94r6b36j036c9
+32661c85a69p89b27A34a252M22C14i23a04C17a4B7c29j20B39b10E47J3f45E92
+32682g3A13M37a71l39C8L21e64A57i19K60A532H3C5a04I7c23D52j8a021O0b01
+32704I9j8a80O6C9a154F22A84C2e25k45b42D7J26c4j62G97I5a29B39a40A54A0
+32727c8B96a116d72I9J96b67E37e99K65N7MG96f79C26I0c44l74A25L17b70o61
+32748i31c13J36D21A77f01k58b12l72b78G76c46J71m68K97B86I7O66d5B45
+$$ Imaginary data points
+##PAGE= N=2
+##DATA TABLE= (X++(I..I)), XYDATA
+0@@@@@A6a6A6a6C2c2D8f4H0a12A28a72B04b49B99c54D26e03E92f92H13i31A086
+28a247A422a638A854b107B388b688C027c399C805d253D737e276E859f498G199
+44g960H796i712A0717a1809A3032a4368A5852a7516A9358b1456B3837b6565B9747
+58c3497C7996d3529E0498e9623G2108i0354A19676a74688C14931a877715p9320
+69a957035D81567k20840h87394q98440P14907c31099D34182Q30935Q81819k27904
+79A919032p27713m38980j53707a98918o24778c25022F38311A52585a545128j105668
+89b650796N16864g49732H98849J370510Q0665E72398a476825m19074h47247E6459
+100D49024N07981N05988k36058E29938A30341d4857l28738j8374A09659D4625
+111a332268j322575M96530a81221A540524O30110l63038D94685a193696n42676
+120a736372e02684A046746L58007l72418q0936j63429a67474j062587j24991N35324
+130h19728M00824a47536F0290c82444r66649K1593D26515J923413K11747A215665
+141c20961r90880k05346f46159H16988O60605o57906g5888l15017k96425o42577
+151a329907r7841c96667H33631L76440l69424A65165g06106m68621c39958A222127
+162A578718A25509a451617j53527f45034E33048J108081O02303o56238a2715j169667
+172a182382k48861j18494j64930O95655E52771R55605n38717a37848n10644J98531
+182d49961B27261R69301M25862E88726a176215n77632e82788I31988O14767k07267
+192A339488F32614e39584j120646k65575M82547N23666c22423G60246R00340m33216
+202A227370a59310o75531a35277A026912P18390J5213H29140h97875j196109N34147
+212a559837i8801D58432b11566p11444j53531M3108K70725A75026J246229O81634
+222B102889L706l38580G96206i98786j450094L23461d31079H67108L5337B08578
+233e25117l42726c54695H59452O60123G17572g23078o94705J70943L65592c38940
+244F62143R48785J45909n63304C79678f31298q89592K33716B41983J255899m73937
+254A023945e83708j113995j8107P07877I6985J021462R0530B90279d20262e0718
+265F97716J76508j32211J12717r5929a76511j306846p15097J78760R46001D95097
+276A928138K1663D19467a069305l4072d8825I02291L20748l11695C1946h86993
+287a012289c69507H1557d0900n6198A56164A8717g37369m21724d86190H19326
+298A904315M08584o53790b00181j998783m36668a283931B43846M21426C28391
+308B9122a02173M4299C95219O12820P1943n27892F6861b46338o14553p01434K11219
+319a351106b0010A298730K29846F91096e90400j011583P3774a15948A529944L60974
+329A890918H64691c09703n10633m4431J96463a63904C57900P1583B02681p9913
+339A22768C9264c38644j28538C00065R86921j61715c07515j425037l83412P17812
+349a398152I3159J631055O54411r42989a68235p88490K31386c55558J34993A0868
+360C10756p4993a72231k64650J5266J78420B48467P08414P8286i0780j450033
+370a540813l16716g50358H36511J091517R4480I90104e85325q95578L68998b55651
+381A36317K3516J28448J1446a87527n81716P06b23150D25810N44632J76987D73054
+393g96385n51755c90272A123578N40412p68577d22311j130627m39793O19800A1316
+404A127777K15832k79530k82540B96763e27619n55781K86517b3376D72692r1254
+414C81438a81022p16405j91245a49289A392330O75792q84630c78088j006845p7916
+424a462849O39764B27064Q62679Q460C67256c24648l43509l21402k10968N52743
+434f47784F14545Q85926k44908C36897c92758j63353a07358G45211M56767D29969
+445a173660r68860M74456c84531G18356N66732Q403n67687a12497n41794o3179
+455g17470K01165e3966G39769N85578m15775c65010j022666J6569e17226E02322
+466A063007l47135c63105p65202M42976E27504P71238j69420D60382c14186p89260
+476a103446m68998K87893c79238E85253P53856M23208l43231A38856a191777j89477
+486a381254d30896E17548J00569b4225q45141m79879L96980B55740J088690P4537
+496A418967F57927a01616l79892j38813J28389E1956O99528L28830k78803a75
+507a118296q63081K28520c28556A179393L88812p21627g9648m48515J85275C36058
+518I91338j07731f1837r21660j68696L58576L91624I2658P27712M63663l76120
+528I07913a08962r36752l51921M32785B02824J258265K59080F30826h12345n61202
+538a373547M96892b1583E63924O8387A89456c96480j54724a49098C50512K69109
+548F19621J52900J6194B82782g70283q99125k2020g99518E16778J082028J49547
+558A748353G14684g18128n52471e82679D50384M49202k10515A57428d62309m06047
+568h68356J48030a56339B72823P7132l7386j32182c14588o16274O4527A69672
+579A412719M60672o19211g9392j341325n23776P03317I4135Q41766j22427B19137
+590b26055j25926J55929A89122L74832O1382k72880g0468n15175m82574M3795
+600a024422a27068A050964M12770p01806d33469q57392l2440d40405H77794P56800
+610A634594m43868D6558g76071j41395J88651K91465A1249M25338L0507I9683
+621b83526j30116K02729C77487P62092K17891D98513i42522q69152L27571c25043
+632H62692N37576m10354c5769q19254n1346d08124A18099L69722K31746p7547
+642F42020A38923d76571k56578K44189G9329O11269J94067B42062i36698o48168
+652a584866O02367C79275J026620J08543o76635b02680q48042j13093e23640B44011
+663E77559m4770j82054b5668n69073l05331L96101C69040O62426j1620C44560
+674f01105n49907L85102C33613Q48572j51124F6387i49352m58329L03897b08124
+685G61223M75140j40728m64477E9456e67377l92848K60627I5945N93261j50712
+695E38494a71328o98740k12652N34276E73023R18159j28717B61101h30040k91145
+705a121185M36130D686O17816K92185k58079d5475o75202k91019J33876c53112
+716D73644O83899o9266B30941f95705k42877c82841D98729N46205k73117b27509
+727a193942j51843f44251B91116O23519J54986l12218I3736e53576k28356K54582
+737e27350b296E75299L48601k97081c73901r91931q4047e38263F01389O03771
+747A205160j52285C54034d04843k23995a00881F57856K42728m49202b89630o60639
+757i50269m29860m904O08687B72032R51430L76587l57781C37387e79303k68688
+767h47991b78216E36088K36465A87783g59901o42627J00141d60962F10065N90348
+777A200413j71017D44529i3663l48679j13044b75522C48105M80370j42216b3683
+788h45565m66438K18080a32183A058690N13728n96135a66090p55702K0508c66838
+799B40206L17329j79920a76536m68858j5188b54459C27828N68337L23430k42779
+809I76816I9158i45899n35394L15187b09148G77577L37744E41750d59963n75908
+819a035871K67359B0252P10206K65993k62920I8792d90400j36855b86867A89755
+830E32571J06273k81813d03404q64434k41933O93532C49231Q68953J20868o14177
+840G24875b26372o22969K09631B04480P08741J1447C46861c71774n12779j26730
+850a011283L20488h0248D66178J87834k51287a52317n37186n9202a10877H56015
+861A418364k97223A47235h99845m81446M01350B1830Q42338Q8657C85911b95134
+872g15319p3871K93414H1802N17315P4142B90620b19126l14207P5116I9557Q12584
+883I12141M25430n04182c70485j046280k01754O56549G3055Q31728J88198m83297
+893F09684a03223m01649Q8076d1512C57860K19449j34556h2660o43787l26024
+903a052471K65708A586R12491M61354l82445a4553q78004j22686d25866C37909
+914G39668k09651a94155p67927k28096M99870A69999P24217L61049o8997n51012
+924F35256b17806o41638M836c18926B26353J24131c3350o45443m13694L04000
+934g88487B25798J079024L88771n14976A49118h03571m45373J91501d33519B12531
+945E42405p9375H5580c33583j24606g6129F25344N12104j09613B83083g19076
+956a417371P0072e23127D46379L82124l70936b05932m04289Q2411d355G40434
+967A295001l1636F19725b49011o72513k47590K58100b44019D11186J07885d2640
+978g72340k37030M89747D10761Q21497K19103n19854C5786f20715m6762b19314
+989C27788K67574k07311b29455p05977l87729J66075d67856D61641P06246M2433
+999A210320E57420b74129l62007c15703C56258N02176m1444A88373f72501m83526
+1009a156027K60097a22560E88071K56433k30740B2283f98025m59546J50578b89209
+1020E41384M58295j12799C36063b66336j75785A3650P64485M22920l37404i7281
+1031a130839n40304K00893g20840I4887M67723N124B60965g4793p0167B10789
+1042H38432M64040q5336E32155d72190q55915k34688N71762A0623O91442o7292
+1052F34773B9375e57807j66615L28238B52545N99755J26193m59983a87600m62209
+1062f49809J5512a96250D63511N54168M6284D32832e51610p20454l5507N95851
+1072g11720H6694M83557j15355a04433m91444M2525F9543Q29510N29826j02883
+1082A325996F20080c13702o89001j70387L31205b26871C24472J34255F8051e19477
+1093g58287L77660C96992O91422J78624m97154a85992q29226j52207N75674B22039
+1104G29146j6156B83297b89365l80597Q8479d2499E80685K71572k70121h6475
+1115g90244l13153L23981B7635P70962K14722m66645b43749n46799Q1215g3021
+1126F53550L35233k39825A01735e95826l66893J82116a65709D62320K24251k88323
+1136C98248a97938n56420j51044d49515D26365P09337K6016E13366c17006m92250
+1146h09256O8261b10199D30211K91280l04965b69894n53207m3612d08438B80072
+1157H49981J34708m42158b72801o96621j31079N07482B25155O18440N7547D22829
+1168a93332k81224b10218D01177M95034m6041A80299g69113o90275p5810N24709
+1178a010489a70111F12783L75952j79682B98419f7353C8003M84251M70721P5418
+1188A068393n00022c92876r73174m04075M13501d37001C80011L06130k04308D0268
+1199b84376P0722B70781N91045K66436k91186A13382f61907m15419J74364b35066
+1210E17043L47909l02321b01376p15759j79974M60418A24848N54899N0108C28929
+1221b12959k97132K05970C35632O49936J90544m17442c7403p85285m25187J48046
+1231a099829d48201B82382K89173B52223c47044l70875J49151E4794P76750M77312
+1241A308856j63940D11599d21207m19813J61963a47593C72664J79791B56675c71092
+1252i39816j13049M67551B00618O30526J00309m53317a93020m22607J15498I8824
+1263G95718L12385l39922d7514p80311k90209K88916b11998C59989K12025k72013
+1273C00001b71788m32271P7031e2270F53621M09422j17830C33988d49510m73733
+1283i23243J69153f6381F24898K12728l77687b38496n94661j46283L92974A12714
+1294F72600O7610C08870b91276l42815J54782I0034O41692L08544k63102C6144
+1305g70052l70814K89827a30158E19675J90963l17283a81907m41964K2800f7803
+1316F33507L60696k43762F5056f54876l87757J37658b88687D72296M21490j84258
+1326G09528A12291d23146j08974a79947C85033L90512j11381A9763h01812m66255
+1336a268067J97841c37977D97176M97533n3136D36174a77051l24731J66683A76449
+1347F26591J2782A47827e59658m86943L7432d37980C65566N72485j8756C31447
+1358c99482l68446J94814c178E62036K21176k75156a24970n83663j11818c65861
+1369C46626N03848N143C60832c66761n44864j7699d01598B98787L84348j62937
+1379E20198a9638n19782j33758c00808C90914N95392J00177m99790b21706o26844
+1389h48550r7289M25926A11925M40674j6784F4913e63337l43122K33750A9040
+1400G21023K75759k67352A28804d35320j82799b87426C37353M44241j06997E6271
+1411f82936m33491R7785d34956C33665N14307n5031B49149c55502k30056K76790
+1421c08768B65540N02310R7688m20732b84774n88895n7834d33983B61434M30742
+1431F92176q2632I8501e10491l18313J95084f678F66006K70296l11050d0736n84924
+1442f25660j43814L64958B51355N50704P3036C84003c63429n04867M0739c30626
+1453B65983L36690j17333a7435n51537j77862c64228C51260N73634P2836m61951
+1463E35779a96286o02960j32956M24660B02801N15198k0562A87328d39335l33333
+1473g72668J58261g0360E26397K60086k67205a10132n58737r4152c35624C30804
+1484H16892J9705C69548c30097n02958L0105b52260D29651L45656j95973D71f02702
+1496h69796K53304D2105O54207K10912l58558a02441m98662n7274b76848B95930
+1507F89568p5559G3512e78720l03968K56046B0808O32284K49398k83033d7676
+1518g04591k23883L62467A35019N66916Q7064C93343b04063m24323J1268a65617
+1529D41391L31594k03697d6019o02158j97111L05892G9066N69010J70212l65266
+1539D53022b36825n49060k6427c06385C85626M59378k7952C24669c51504m36969
+1549g88473R2250a46078D58029K39292k58137a18595n00860j31405L48969B40374
+1560G63399L2163C02553c75656m13327R9877a57043D86147L74347j47829A01866
+1571e90089l15866K55883a9778E63621J96782k79098i2008n03568q8523b78329
+1582C44770L87308j18385H1869e17359l07512J81086d7319F17932K98991k84804
+1592F32119c7563o04448j61723L38939A49152N16759J02288C60299c10408m85408
+1602g95816L0675b59694C63775L45709j13629A10511d37220k40826K59540A93628
+1613G33875Q2070C76891c06561n22285o2439M38970B45272N31595J5353B92567
+1624c61466l67625J28098i7476D60350K71594k01526c8778n62272j48964c70592
+1635B65938M67763J3178C07398c30282m61817J7352b68250C96827L65678j67676
+1645E94829B9310e54792k42115K48857F8834O26422K32052l24887e4973n46649
+1655f01622j03896L45789A75068L75150l5739E6854e38808l09984K33102B9141
+1666F68678K47622k64161D5708e53719k34172K88610A33531N38275P1391C15101
+1677c10897m29164J2750b82005C30218L90908j06874G8223e02365k18753K75807
+1687d45311A26656N14334J44295l35647a93555n43006p0139c46437C25100M44199
+1697G69299l9261B58997c65869m07635O6876a90213D30067K90448k28605f4882
+1708e60358j22186L30891B45539N04059O8368C74624b99182m59665L2653b61185
+1719C20487L41846j06571D5308e51367k64853K80149A18747N96825J73608l28987
+1729E60193e8029n52124j66137L19068A35264M43085k0258A14519d10692k44761
+1739f55453J96058G9484N72792K43720k91526h2406o58489k20238L23449f528
+1750E48938J76227k88509a13673m25784K1147e5998E07409K59711k22701c0740
+1761f31264k86040K11252i8038E35712K49396k71458d9501m55863o0501b09453
+1772C37783L88100o2281A30539e53307l79104J72666a64990D80284L32872j40056
+1782F73100A60263d02146k37062K46386A38444M12036j98A45128d13030l72206
+1792g85236O4514a98608D99433M26844j27938B14146d26459l12514J62143g3235
+1803D50977K04065k76113b02115m77908l5786b89373C12802M09194j4070B79578
+1814c18319l91570R0317i9357D89149K49838k42065f9037n36793j85485L00141
+1824d91174A30047N48379J02328C73068b44730m14335K4854b20297C28315L54197
+1834F82512q5779I5223e00229k74373K35320C2958N38470J85686k71059h4236
+1845f00891j16105c35160B76769M07542o8204A32010d52125l31420J26839a21657
+1856E12033L35435j80484A06269d53271k17680K16057B7020M36542R6108B15950
+1867c58825l91019J06333h3206E68927L46188j49314B12406d42000l83511J18557
+1877g06954a85903C59308K01772k33553a36741l73204k9732a62947D29781M30685
+1887H60466n5354B59059d39090m25567O9402c11360B77571L42477j06883D2831
+1898d43755j28612b37265C22564M00558j7128B70332c59357m81014l3041d10445
+1909B75369M74792j2183C10162b16973k90870J10571C1875M42095R7726A88817
+1920d44507m52374K8895c71317C18502N29179R9489l77322d3171m49025p602a25240
+1932C10350J69388k30140b65834n04307j55056L60359A35172O12355J49963l56627
+1942E40863c9443m24490l2246a41781C58986L01655j42139a1421n77933k51803
+1952h41157K17113h9126D50702K42317k12127f4180n17405j11055c05513C03070
+1963G27572j5409B92544b76227l73492O8766a01141D58016K40565k40818h7109
+1974e91021j76985K41417E325N05110J48747l21241b30714m09053L9573a32282
+1985D79222L89329o9249C00446c27347l58104J21153a04432C26596Q9429A11205
+1996c93287l94397j4312c55239C50418N62587R0742l97652I180d19352m8508a59334
+2008B67457K06425k36597c32904n14717q3342M20564A62494N54801J58531l00874
+2018E74952A414d84425q5583b28229B70988L00389q8997F5849d26483k57731J77311
+2029e06903C8561N61080J78190l44738b07854n26519j09257L44924H5268M87845
+2039E73113J03440l29038a52975k97407J21174A03447M41375J67058k42849a05274
+2050g18240k69837K65261i2227D94479J99320k45710c0068l88646l2514h4364
+2061D31772K71871j99179d3122n46472k21905K18851e2713E25505K81503j95495
+2071F11513F2550d76310j81269K59709H9112L76017J4126A08482d17204l15368
+2081g32572J54077a4474F02370K75936k12147A31518d00985k42533J72325a933
+2092D46247J01039B14461c19934l81357J4206b79571C01680M20411j5546B45241
+2103c48132l07239J83254D0584M83860J55002k56122i4954m67082j12699L23240
+2113c51495A93471L87748j7747A64573c65483l49841M6624b21255C74155L58401
+2123G32556j24186A02871d12846j73365K63353B00827M61242J02728l55615b01802
+2134f77835n2228L48247H1630K75083o2959f3145m32242j94690K62864B12277
+2145H57424K58404k64164B46245c60430k96518J36983a04549B36331l1337a92707
+2156f59405j84513K50037a2806F14584L59995r5492C88156a92559l06505J25438
+2166c73626C6220L71727N8748A45813c84466m11407M552c20632C29842M06255
+2176G36097q5179A72752c68093k83001J22654g7481D35678K49804j69839F0562
+2187c44196q3324a57597B81253L17706n3067F7650e97389m34426Q9313c87983
+2198B78205M05518k4276B94267a37149j92772a31929C19027L62020k0015B40444
+2209c44131m32332o4363L31261D2329M33186L1775A25187c71897k29630K14089
+2219c87438A36190N16663K04295k52636C0771e12089j58860K96878A27693L51072
+2229D78765k178A35464c51819l48213L1222b36795C27808L24297j08000A11671
+2240c42560j82180K17589A94284M62867Q4554C47519b80259m55127j4418c54671
+2251A85686L70835l517A88193c06266k91380J13320d1248D28847J96257j92945
+2261D32159b7851m43577j33843K98461B45740M22977j7594B01454c72868l42204
+2271g15072P6986b03034C37551L20822j09512H0048d26161k09669J95054I016
+2282D34350J55993k21679a07380m12983l5766a62483C89201L26080j08692A33332
+2293d22440l15662J13120a55147C53571J99646k27868a41397l79678n1046b60010
+2304B70656M63578R8604l59223a29035m53206m2624b94034A47131K53718j00168
+2314C00681i9895m29840j21486c19407B63966M51608M6175l62383a57228m53618
+2324f10846r6512L29510A78867M23475K4883B69793b09359k95837N9752g2659
+2335C66623J81091k47811b41095m60857o1986L79320A87714M38258P6218k99039
+2345D03151g0176l38258K8892a531D51599J95971k17461i5932n53803k79098J65841
+2356g62992b27149C58595K72995j73749C0784b97420K338B8050M29734K47951
+2366G05735j39185F4959e08717k87758J56447a73017C05270K22219j49024e9701
+2377e15833j48270L02731B19146M76327P6095l40361i5171l92020l8150b03243
+2388B48025K43552j58265a13257m15882j06483K64364A09444M35741J33036k82269
+2398C95952a52764m58513n7961b98975B46332L90190J8884B95196b29812l50616
+2408e80428P3273g1775C90557J55181k35359a42304l90746j02735K61606A13503
+2419E24749N9153B57759b18145l00860P0518d4790D61525K92394j41509H1031
+2430e21286k91043J80217a37249C38648J83972j80860e8184l46032l8107a23535
+2441C38201K77890r9737A04840c63279k58885J09933g5041D33608K40099k20079
+2451D53628h8194m99014j35687K91305I5172M50307J13295k90026a29544l64707
+2461d94251J1120a36806B82178K15899j13820F004d15833j90003K01215I3156
+2472E55839J12604l11546a70026m17902o5059c23653B11894L98919j2490A81206
+2483c42534k76510J22677h6308C66035K40140j16231H0036c58990j61062K20747
+2493b99305A20612L15505n339I7183c82025l23156Q3388a29139D77300L31142
+2503H08442j34341A98135c14928k67265J05381g8684C48730J58292k28602a73519
+2514e32981l0156b53383B07500L40389P269B11146b71359k82673J27459B5792
+2525D85120J51500k53036a22841m66569j47641K77830H4173M65404J02790k89126
+2535C63241i6080l42207l9086b00328B25004K83229q0789A3184d41991j69278
+2545f11269K26900H4641M21234J21964k63642a39027m20739m3839b41171B76208
+2556F05355m5698A81790c09555l26973M2883a95550C07685K73794j19945F2520
+2567c26012j32375K04839A59256L49851J8132A55092c72596l19930R9730a57400
+2578C48664K95911p1260A70399c26990k65180J45843a630D28584J37309k21867
+2588C44026i8540m01677j07932K75245A55986L65623q465A60977b68792k16295
+2598d85087J29478D2321M25217J64739k39907a31242m80085j38383K74374C0022
+2609D78056J53145k17949c5689l81224l8571a28121C15532K31440j36281b278
+2620d43815k02924J65881b9313D20011J44830k47018a28774l33712j2001a55976
+2631C14012L42793j9878B24472c41502l60982N3720b51283B21336K74137p0932
+2641D24541G3210c15845j33021b08481B34071L22637k6566A73463b97948l23553
+2651f21501J7138b37274B72467L25346p4611A10421c51402k11559J57379B0769
+2662D62305J78236k22020g8103m40135r7673K78385A00944L13883J7473A55638
+2673b38795k35605J21469G0499M32979J44893k40784g5039m58169j82355K13707
+2683e01856c383D72168J36404k71589a26642l32840k477a49654B75548K71752
+2693E47300p3253H4283c67276k09605J66587B628L82804J20880k11284a26188
+2704d92918n5582b16554B93671L46381m6251A94644c12144l27706L2436b27910
+2715B69366K93510r7230G8297c04370j20433J92172A35958L08531L7878A82170
+2726b91026l31402M6416a80124C07051K83352p7899A22620c45261k49429J50484
+2736d44206A7643M64523J61525k26077b8358l96319j28110K05870E9599L32099
+2746C91698J6937I1120c19801k07161J37739I444M27946K08721j57706C5582d33248
+2758e99133K42370A10964L75320N5794B50292b24223l79195m1932c08368A90226
+2769E24320j6119A99423a69768j94952R9184G2591L50004Q5222B23611b66970
+2780f37074j1780c00537B02060L80110M1123B93584b02585l40570M1802a27018
+2791C05829K13904j18609C4183c63263j74828J80744F8042L78107O7796B40503
+2802a74514k87904J4377a33295B96544K59575j18910f159m75985j97246J98640
+2812d80750a6012D54923K27226j46935A01741c38065j59482K02899H4555K69641
+2822C54196k0203D3532c39369k27491J04369d8891D24687K22123j66276E1394
+2833c56560j45015J94770A09340L72084O7870B33799b75357l72434q992c15970
+2844A60050L50891M3635k74394a21534k38866R6708G7215L05691L7505A49655
+2855b78113l42394l5855c17260B21623M11610K9561C20167a50902l12982P622
+2865d56262a49940B55864K33314j19405c4511m10303j39815K16286E1304L73404
+2875D24708J14161k09250g5197l26737j2802a02414C01099K01601j41149c6622
+2886d65014k06409J64635c3743D74148K22187j87897F5005c44145j44228J71303
+2896c17070D2321L10223L8480A09557b91010k24709J17091a8032C86305J86792
+2906E73097j43229B2035d07371j66538K18796A01085L81548O5495B73591a68059
+2917e23045n5135b85911A79738L33161k1011A58547b35975j98788J05943E240
+2928C57233J35913k01329a35808l64529m5730b47748A96396L16686P356B06573
+2939b50551l12493M7840a29169C31102K36725j12587H5317c13842j94641J31300
+2949c77183G99L68659R3633B15975a82231k70458K9691a14190B92028K57819p3501
+2960D76346H7057c79796k34637J49036d7426C73271J75800j57525c592l89968
+2970c93560j23681K35123A48493L26159J3993B00599a96266k67717J9380a37988
+2981B59127K05876j45676g7398l66801q9968K41441A45722L95726J17605k52660
+2991D06393g3118m00440o7198K69614A21489K56469l3138D9889c24655k01575
+3001e26230J37452B2787M17453J53285j91144D944c55426j12454K00113A22610
+3012D31013j953I8360c37956k42967J00183a01224C45141K65773p8461A45310
+3023c06933k18703J39020b5580B92074Q1982A82625a60815k69440J4358h0111
+3034C71549K61840j02877A33776c22632k65049O5455a70943B41399J95040j53097
+3044B83342i1129l15320l6642a76170B38857L28582L9990k94149a49851l37544
+3054d87395l648a92014A73653J82474j07817g7296l38933j15900K28597A56626
+3065E60032Q5486k73792g5556l53625p2610K35920A27507K91131j9822H0827c06816
+3077d98247J27816a2738C60414J65286j57645c2686l86813j01693K48225A44393
+3088D44501M560A70779b19965k68616M2878i5545C43495K32764j24850F7147c32525
+3100e22234J15687e9509C00835J28406k02969a59649k80163K4063a03428C02481
+3111E62002m9201A63823b83882k56320J01240f9670C02940J40566j58265g1060
+3122d12723j08059K21933A31549L56762M3755B51695a52331k71750J4060a23403
+3133B52562K16016j12788a9233l80073j23851K06621G5886L43959R5379k15491
+3143B99733a09902l47733m6537b20901A95599K76960k3446A49970b39359k46258
+3153d85617O5012g2018C25858J64365j76971f4914l13768n6403b09133A69084
+3164D68105J6238A80524b56999k88237M1520a80263B22200K49426m5733A10298
+3175b74597j82449J58803I2082L43628O8422k41511a36378l22901n2441b55775
+3186A45387K76362l8953G4242b75362j63603J20151B0643L70685J75391j65180
+3196D01539b4169m15937j31375K16416D8895L35420P4495k22167a35400k69284
+3206d04684L3792e5804C06691J55906j44984c2436l55330j55831J51100b846C88572
+3218E23797j99984e8536l04684l9633a54978B29876K77752l4528A16958c34199
+3229e84048R9166a34466B29494J67015j05021f137k91108o9997a44785B35585
+3240E16656o391B13453b10067l11762j7494b38942A92035K70182p4691C8311c28789
+3252d64445J68869F3729L30957R7977k08626a05913l13481l0879a95215A68485
+3263D14825p023A52193b10500k34649P2504a8812C71544J45050k02804a01608
+3274d76461j16459K13811C8901L63843P8474k31495i2673k10184M1979i404B99324
+3286D76867r6699B1241c97442k00397J45892g2475B90162J30513j69556a07198
+3297d14131k4720a29876C07892K65872o5525A80618a98330k25571L9358a11468
+3308B22791J61743j28715h1466l16913r2654J96182H0604L37425P6935B43578
+3319a77199k87992N2481f5333C29588J94716j08754H0460b82742j76056J15956
+3329c42842a2748C01953Q8461j87608a37798k87212o1451K22334A28310L20453
+3339D48763K2348A75609b18346k06584J22212E3900L60408J37022j81661c1831
+3350d05695j20167J87253a473B61810M4440A21824a85797k39732Q016a14710C13946
+3362E84165o6274A69607b22720j92090J12015C0369L24078P2084A72661b39372
+3373e28179R216b46761A15172K62291L2511A92942a42917k24318N5980d308C45006
+3385E09746j30576A7081c65491j54140J96027I2597L28533J0087A35224b43983
+3396d69778L9544a59585A84104K15914m8653G4389b39694j39659J27216F9370
+3407D05456J42386j68409b6131l85171r8894K43892A21534K44010o0816g641l57851
+3418c65492j72775J30302d0603C45846J78955j05961A28595a58114j29425R7748
+3428a89791H1989K72489N5130A55092b72129l10357K0361b26618A99375K50310
+3438D49685o5203F3874b86654j31307J78410A20905K95113N9140j88740c0829
+3449c14069r9292J57852H0323K85917K2393A20982b54258k33962N8241a05467
+3460B83769J89476j53961g3402l34937l5936a77502A99384K66129K9704k07563
+3470B87654e1969k84716n9022J96651A07895K03256l9589f60l47814j95700J24069
+3481d20105a7140D01386J41205k11279e3143k70128O929f2191B68817K00498o9277
+3492D00038I0058b82577k19569M2264b03473A21281K17601j9845E9470b75985
+3503d30854J74240A40590L36957L4277B28868a71605k56365M3330g9915B73624
+3514D38587j25959f730l05375j30737R6993g6923B32374J71918r7851b4466l40251
+3525c64717r8543K26408A62363L06759J6529B06662a80234k22220R9371C3881
+3536C45177N9803A90037a48924k71372q1000J49220c1111B96626J38280j41268
+3546B93638b8284k76602m1609a11114B66063K62849n7141A00554c30377j82432
+3556e12809J65461A370K70863L4561A16795a72023k16173n023a60884A81164K53335
+3567D34499K3799k16225i8671k78955l2359a43829B55907K38157j18266i163l68634
+3578c77797r7911K12812I0991K56075r42I8089b25465j85556O2821i2927B03678
+3590C94981l090A76837a52549k35135M8442i858C71961J49319k03573a02628l64099
+3601d66727p6364K41364H0096K57262l3200D1842b35107r5306J30980F2395K61381
+3612C23776J35382p4288A01754b48742j99918R6970b2520C11703J03810A99979
+3623b02944l15127Q146a70111B59767K14922j14534E3706b15459q3398J16673
+3633a82184E4719K33213R0877j29139d1949k86059j00540J54313E8464L13518
+3643C71982O5900A73821b62596k84533Q5231g4942C22031J47038j53399E985b55272
+3655c11718a42000A36725K07795J4177j76060i4918k47330q6853J55757F5820
+3666C58909Q423E7253c42559j79525J82395G7509L77462J05354k12387b3380k79900
+3677c03280k6125a33336A16408J43717k6747E6702a97077k05295j4277a78360
+3688A94052K55589n1803G4417b91723j46808J84460A43390L29856J9419A87154
+3699b15247k22070P0656a07373A57767J43998k7242I0055a70437j87335K2239
+3709c35533i0917B26079J76743r6501b2801l40398r7952b05610B37140L03216
+3719E40356n7584A25372b56037j68093J01240f3071A88050J08625r1590c1127
+3730b73707j08114R2380b7118B79784J74008j03475E959c35848n9776a10951B92109
+3742D94382j49812d1455l58555j13730J76616a272B76295P0987j37931b3506j98674
+3753b22180p9370R2249C9928K86900J15432j82305a19033k99333J0939i3477B89159
+3765D63402j58526g6620l34975n3255b17443A31302K09655k5383A22369a14868
+3776b94382m0923J49131A14269K81836O7627k16732a19722k68605J9111f9628
+3787B82266J25698A87711b21551k82775N1085a31738B18363J77018m7065A44476
+3798i9515j68384J588h2026A89706J94398j9714A08187b58171k42432P1189f9153
+3810C17651J10014A83810a97055k12079J02515H351L02844J11550j25855B5065
+3821b33348j10211P5027e7781A92200J66124l1512E9559c05370j95223J50756
+3831c49837E6252L50854L7226A60433b14567j96155J08306A6160K95867O9121
+3841C81148j82546g9311j91255k3689J21648C8285K23428J19730j01965d1059
+3852c90081j26087K09319A02475L24527J6494A44414b40234j78112J62012A02257
+3863C67493q997A28154a36803j50587R69J31060E9905K04683O7643j48680a21653
+3875c92876m3708a86367B21617K90782n2887H1990c35932j41382K15106A05699
+3886C39646k9531I0884a48795j23762M1472f0365A50055J37248j1864A00488a76605
+3898d08745j0100a35644B84530K44699j35712b6246l75592n7450a88498A86132
+3909D04374n4480I1053a79457j21089O9012e6394A12876R2393k0900C1809b09239
+3921c83376P2252B5108L89363J50278k16882i0119l51363l2985a85085B00884
+3932D00937j15883b1880k53205m6997J33249D470J67101R2739k6543F2520a87416
+3944c38087R2165E8450L09741P6279A99368b20680k97545O0577g4356C43906J44825
+3955D88731j94061d6631k42750l4783J31604D263J70434P1823o6142a241j99731
+3966b00972q7913J12689A05496K76567M6499A51823b81279k56642J33703A3462
+3977C88169O5682B08926a37584k15865J7512a37255A07658J58596J8653j08432
+3987A76475i279j92185r4434J01903H6905K61266L548D6678c46109j61522K06595
+3998c01036A18866L32072J7904A84559a86324k04383P3637f3341A73443R7488
+4008B70931m0094I8248h7779j83398n7185J60899A46635K42018l3738D8672c03571
+4020d32711K06781A67688K80189n3703D3594c25960j23142J67993A3141K24872
+4030B38013P7688n7919I6923a19606j68011p058a03712A79660J83238p0810a3956
+4042c48674r8324a99736B17943K53162j11625a3250l26889n9787J99340H6544
+4053B83106K9161j23880a6618j93249r7722N4164d5380B28320J67478r7587d2582
+4065c83598n7029a46823B57092J89295j59628g5966k85575j8353a48108A57092
+4076C35965l3697A19624h7052j41595m3438P7570A5946K57791J20055j64076a41131
+4088d46100N078a17196B78886J73419j65488g6125k72083K2514d7761B49948J00775
+4099C50723j20700A4424a72306j12636j5174J17327E9929K47040O6730A77524
+4110a64982k43060N3199a9148C61073J29826k32805a55986k64990O7860e0000
+4121B23498O9224j25302b6533j59518p0074M6187d9697A66784J65037m687A06675
+4133b29049k19279R2650B1666L84214P5862A90423b23191k08845J18651d897B49955
+4145C01105j43909e8362j53908k6686R0463A0120J75460J21369l5548C5942b87001
+4157d50818J66685A18498L34058j209A23940b75120j81127J43352A9851K68183
+4167B88034K7276A27373i9838j13175K6847h2636E3061J47418R1357p3254d4418
+4179c42297r6690K14641A65542K82064m1628F4325c22931j38171K10894A30146
+4190C76870m0510I7363a36320j02912K3993J02377C1891J45790O2838r2492g7299
+4202b96154l3896a07043B55938K37656j04896a7555m04807q8849b34906A57437
+4213C68728p8137D6569a69431p5702O5181c4532A20746J06223J4122j13399h9777
+4225b97489k9843i9518B52698J88651j65864a36585l35291N994a39623B52077
+4236D38359j11047D4282a99389o4400J07297H501J29524O0220j4563F6465a45701
+4248c34848J1489e7128B85085J39396j96860a59001k72955N3631c6286C37988
+4259D71878j87198e6735k39407j0204J51223A8156J24021N9573k2717C5418a84895
+4271c30976O8387I288K96553R2661A95280a68384k44526Q8063D4590L57073N8166
+4282D59829A93959a65273k01253L5927a53336D0501J31273M1476o5160d883j76237
+4293a81120r0642R2375H4875K74650O3315A75102b20171k28527J32113E9277L01567
+4304C60844n334G6114b47682j45741R5388e6475A71264J08846k2900j16625b0889
+4316a81752q0261R5492I4331K49950J3244G0595c10347j68597J82691H7308K86904
+4327C74212j8845F9853b42846j09086J51872G1691J93139K6569r6206E1363a11301
+4339b62676m6199J45131A24707K28618l0867B9187c08170j16184K05740A59631
+4350D21044o0411C2392b91786p1348a67695A02607J53259j0103j10919a4319j52798
+4361a67117j04481K4072f3911A93750J65101p3706a3023l27256r3719a90167B14629
+4373D50972j20099b2033k89040k1114a24615A22444J30820l1117H1004h7535j24202
+4384b11737l6712P5399A1626K26712J26664j11533g0079l12248l7050a28860B62243
+4396D40626j59705g0367k65157j146a06217A63251J21944p3475C4170a20795p7851
+4407a98646j790P9370D9834K02201Q2987j60051a59214k60611L4691f0899C13571
+4419D54017j89292i7612k57105L1288e8931B11572P8119j23367b6137j36404n3400
+4430b15941J9509i5853H6766J78970L4400A18258a78782j94559P3856B1877L46349
+4441C68226R6735B17195a92000k45280Q7844d1141B20611M5121j31550c9973j16891
+4452a56864l0359N3733d531A58429J17759j9436F5812b13173j74652R6509E2920
+4464C80654L6334A17135b70574j73977J46101B3502K53948L7747j55306e1078
+4475a82461n79Q7994B8337J21048Q2111l1913E659b58395j30920J53448A18733
+4487C99533k4688F1096b97243j30186J80015I1500K47323o807A23991a09897j07980
+4498b17877L1870h1956C8002J17600O8443o1905d8032k36568o9557a64564A67689
+4510C93435o0372A7311c18762r5961a93083A68932K19286o7229F5400a67599p9772
+4521b47371N5421g3319E7022J12980L7420r6447i3066j86344k1113a01238B11137
+4533D10830r4270b7045l31853m5112a32397B19015J58464j14923A215b12649o1213
+4544b73862Q6300b6135A23429P8799j7856G0434a11024j58173j0996f8857B43248
+4556D11392j44166i1601k83710J5179g0259B58231J25632j44844e3364k23751
+4566b77115k4821J42566B5658J22235L9672k9514D7842a26245j39729L6297A4041
+4578C02895R9908j89339a37780k49373L8460e6280B61373R7758A75232a31532
+4589c22233L7221i4966I8173J09106J7876n8788B6254a50328j05975P2202D9998
+4601B87786N1039A30471b07914k19864Q0790a5071C06820O2649A48396a48912
+4612b92408P5578b2921A54973Q6427j8103A09916f3463j55762n2432J04283E8832
+4624B73411L3530I0951b37650j74810J41739H3776K83601K621A23898a64027j33943
+4635b97970P9898a3252A73654N7027p5616A3517a28604j02279j2960a20494A20317
+4647C27618j0072F1081b56338j20073J76247A32467K34749l4317F4906b36128
+4658c52590J25390A5330J77772K2167r2171e763j17457p6483J9869b6369B01534
+4670C45411p6447e685k92760r1508J84860A26368K22727o2719g043k85959n8282
+4681c51284a63048A01445J56209n403j08204B593a23080o6324M1562F557J83132
+4692A89689Q1688j11429a10080k54968m2542a72779A85886K08265r8568h808k50244
+4703b59052j0778g1028A70394J22879m2034H9794i7124j27136k2731Q0608a3429
+4715A50074P5675r8525a18633k14922K0633b7645C13701J38339j63441c3766k44417
+4726b78183j2019i6154A40430J07680q0167b0260j66187o7674L2301a10110F0793
+4738B30602N0148A40219a15420j73887O1875D1976K79602P6915j94114a30272
+4749c67883K2201a02288A55415Q7684j04700d0319j29931l1980N6914a1440A59982
+4761B85263j5696H4779a64641j48304P7139B4229K61176N0521A17770b10075j84335
+4772c94410R7539a1480B35539N5245j24988b1701j38288l4505P2632B1562J44724
+4783A66286O8287o2327h671k12056j04045J12019G2419K59062J7939A00528b19523
+4795c56292J32833E3253K13116J7771A21556i7009j41168K640a16957C7009J26973
+4806A63982N0772n5404h455j94931o7680a15958A73764J98654n9726C0633b71993
+4818c85999J39899C1933K11682J180E9057a54643q9833O6736b5633A30048J13324
+4829B43372K7953r9203b9193j91073l6118i6681A47997J40444r0829h0370k76962
+4840c57332o6343K03123A04860K10410k8513H8299a01704o1388P0997D7314J37051
+4851A84365P3459m1200E3764a63219j55895Q286a33819A08489J37744q3133i3291
+4863c20273N627e9346B60000J57319q5901I7258a20421q5061O2036h50A24262
+4875A56930G8188g5560j63992q9052N8857e0901B15986J26992j17668d7184j98908
+4886b46092L8372C4572K58866Q8120j40063c0028k30969o4441J12016c1012I8795
+4898A26928F1806e7154j24821m9785J01862A07399K27951M5950j80408h6753j92826
+4909b79579L1024b3576B18440O7935A21148a53873j82810K2915a32729F8676J23752
+4920A92428J8455p8597a2845j38522l6708g2414A36694J61238j1975H4288a91064
+4932c54438P3908a6490B35197M4670I7474a54051j31246N9615c8533A55596J04316
+4943B59912k8777I3720h3919j21023J9h0377A07086J38080k1932B2271b32923
+4955c45968J36225H1952K24973l459I9357a47479j21951O2570a9715A65851P0000
+4966B35851p6225b685j54364p4361M0989c8352A62927J26969n5267G790b32367
+4978b98585a40874A20073J71070l6824C5613b14668j08290J03953H269J87958
+4988A96227L8003r6287a1872j25171n1400O1072C8493J83087P1176j17641f9976
+5000b84149l2843a48614A10001J65047n2470i964k29898n0375a35985I6474J56950
+5011B53424P339j16953b5732j40292l9570R0162E5032J44704J9636H3776a36807
+5023c10948M152a01511A76942J47121r1698a5205k07111j5492g5181A38290J25240
+5034B63530k6569H2216a11661j23084L430a10182E7437J25544J0133F4046a43787
+5046b86276N6123A0450K57251Q4391j43200e0906j93731j2228i7038A15856J17038
+5057B32894n4156A945a71582o9836N5908d2707A23860J14212j7797E7834a56501
+5069b65956Q6289E1563K11208L7348A36882a22502j81074K4117g5777A52159R2724
+5080B44883q2240a1097j45070m5887O8198A7453J64610Q0416p3995h156j96621
+5091b04777p0163J06714D9368J86071J9455G7726a73745j39766Q4143G653K16814
+5102B24467O1222j04539b972j56549m7024Q2073C4637J37317K6690I3978h5516
+5114b41554l0558a34738A06959J83966j5314F5548a76886r5776J07990E7605J80087
+5125B37692K6820j31983g5569j54904j1071a17839E5365J18319P990G8155i1896
+5137b26176j211e9828A75349J36738o9088A8555b01410p0666J20293G2811J73132
+5148B45943j393G1509a46035j17759L6346h1193H3310J08434K16G5881i9979j13740
+5160b13719M1068A4492K05485Q0957j03509c3710k12043n2118J46302H4107J50809
+5171B34916l7998A2750a77290p3963O9832a5526A61993R5196m2310E4952a23946
+5183b10249O0142A7462J71224N7255j18935a07630j87746K490i9748A42602J18726
+5194B61328o6240A0302a64732o2398Q4278C7579J67698N2321r1749i211j60287
+5205a69498n8070P8241B8377J68430L0677G9794a52751j43223N1839c8961A80066
+5217B75474q0407A132a77611m0817i9821I1592J30194n48A01415g5077j44714
+5228b19791l6180J10072E6726J59990O18E3155a54017j02659P4580B3336K03256
+5239B26592O4429j19365e1006j66771m245h3218I3571J05180j4554E5977a20969
+5251b48535J3484g7753A25981J19835l5040D3043a51711q8752Q4515E7623J91345
+5262B48968K2579A09307a15595j33470K8185g2939A01799J00292l1396B4438a45687
+5274b27931N7966b496A77184Q6475o5929E052a98385o9589J21709G7399J58770
+5285B36169j4286E6441a39555j05742M8063b5834A58175Q0499p4192g928j55922
+5296a63850n1884P4145A8697J62853O1004r5955e8696j76521j5147i4988A23378
+5308B53952l5360D1304a61897r4334P5887I054J69743M0771r8181d1487j32191
+5319a73678l1556R3718F4494J55568K0880A00593a06914j38896J9552f4671A36942
+5331B51505n6601b5j96729n7991J16430F0043J46033J1282A04421f4855j31757
+5342a96612j1973h5449I7073J22512j8623E5573a28537j10380L9330b2452A80840
+5354B63106j05041e6826j71285j6978a10496H1915J34275M494I1361h8214j15199
+5365b03413K7649c2435A29582Q1813m7361G563a75702r2428P5720A1132J92364
+5376B03496M8368j22965f7053j38909O119e2257A40747J11983m7555C0182a55164
+5388b40729N2540d1643A16666P8786n1281a7711j64314m4765a07804I6223J53314
+5399B49537N414A09594i4736j36427J9153d9160A39530Q0957p9413c4804j56037
+5410a90841m8136Q2703A4524J64104N8840q8322c1155j45034j6052f9336A10299
+5422B32810j8661D8829a61605j11329O6030a4888A59271M9441r0433d5884j39293
+5433a85177k9283a04256H2821J47757R976A14170f6556j26139n40f7823A11789
+5445B21334n2178a6388j89607o0977J01415B5403J61779M0059j01998e3743j34696
+5456a88439N396d4171A30218J01553l0526E9161a20750j17137K3783e7528A29528
+5468B13569p7986d4993j55055k6936a09054H4780J49437Q125A02834h7644j11866
+5479a99510K9493b9506A26743P8557m8689F34a75188q2548P4659A746J71423N0947
+5491B24116r4104d3733j43751j5759g2762A23217J25632l7373D3207a37825q0781
+5502b18606N3427a8660A36598O8303p0051c5573j60118l7843J05561E1418J46079
+5513A97497K5162A09589g6432j35943J6528c3970A54885Q6825o5879I641a53916
+5525b25493O7068G148J54970L5049H8076h3834j23259k824h9011I0953J38310
+5536B29263N276I2562a00836j06831M8378B512J58635N6222q6588d9119j65017
+5547b14136m1237J11595D1256J38524J0553H2392f9399j05712J3436b5137A55567
+5559B55797n4448B3769a60485q1083O3850a4864A43719N0913r5877g8299j32990
+5570b11289P530f2531A17120J09985j8896G5850i5297j03340L0446a9347A42990
+5582B09760p9229c8760j54331m6103R6691D4391J57143J9278I1442i0756j08379
+5593a99135K7280c3234A28771R1874l9456B6959a46586p5026P1603A2202J39381
+5604A51583L7205q9088f5103j41242j8129i2681A08383J30061j8821G4419i6688
+5616a92472L3021a7719A40341O1828q4819e7247j46132k9416R9110C5214J48891
+5627A84105L9223r9050e0283j23702J6942a7166A43411P5055o0665g032j80939
+5638a87971q1992P2634a7041A51693N0432q3221b9450j15958q794d5106A20453
+5650B35945k3643E8978a28846j06556L2242f2230I9112P8507n7125c6428j46512
+5661a82940k7666i1529I4474J34821Q430j16038e0734j28541o262f5219I8745
+5673A87345m8525a5370j57620o3781O6447f506A59776O1012q3443c3416j30370
+5684a63786p73d3040A19778J05124j9871F0908a25574j12933L4296e4597A01456
+5696A66434n4438b6184j35219m2159R7143H0663J51674J3762A21307e5585j18963
+5707a74548k877f5723H7553R0924m4484b4856j59330n3669Q4259A3627J56549
+5718A70176N9523p4529i031j45903k5046g0727I0497J00886k2139D0183a26630
+5730b28512L5351c7880A36854P3314o7929a3800j36755l5450Q6072E6951J36528
+5741A93479K0289I6956h2330j22940P334g2245H8405R5350k7785A7508a39792
+5753b08673P5344C5907J51417M1575r2070b4853j38367l2836R3567E6549J10037
+5764A66586k0908G978a49941p7633N0890b2991A54516R8855m2150E4691a04719
+5776a58832P5270E2196R8372o367B4184a50555j23454J8032a03481H9485J16972
+5787B06457j1697H1835d9017o6867N0133H0098J33655J9152A07896h8446j52408
+5798b40854l3662R3754a9539A15567K3783C8378a03884o4504O6549E7007J54230
+5809B11237O4506o5405D7377a22797p3773O4820A4250J12793J707A5134a44614
+5821b55594J1164a04831H5196J25180j4069G3373e7670n1589d8125I1147J30192
+5832B21339K8235j08653e7480j69252m6122Q8822c6523G1315Q029a1682j24383
+5843a36065n9952P2830F0523J90409Q4222o5130A05587f4966q9423L0661a4218
+5855H1773n808d6898j60715q8166M0891i6964I9931J39426J0843j14362a6583
+5867i0341c9874H7478J05207N850H7048i2679j57445m0429J03444i821A20599
+5879A30056C4112h9824o6555M5042C3027J64149P8336o6844D2215a15644n9109
+5890a74753N9045A2828J11586J5787C0604a39681j15375K1981i1399H2413J08879
+5901A91292m221G9316e7657p1500N0267F5385J29855K0664j06908f5372j40861
+5912b06233l6835R0530A0170J29935J3061D6514i5190p4056M3893A2009J44623
+5923A56632P0053n9215I700a49556n8114P8358B1739J25640K4277H5558e9578
+5935a69166j272e0901A08175Q8370m5051G072a44203o9600N0871a8466A35348
+5947B01884o6219a2705j25049j4250e5385H7212J00576p030E9762a08626j06151
+5958b14777K8189e0739I7179O6347m8305a6150j34929m9081Q1223D5704J41797
+5969A87501K4883r7106c0429j02542j339c3627A08838Q9144m0148C578a66548
+5981b49630M5623f8523G2693O2954m5643c2385j01557Q012A837J71565J07992
+5992B81394j5142A32860e0087j38053k1462R3480A0750N5905A2101a12100j01376
+6003b13476n853a07475G9244J70099N6154q5950E5968g3703k2458b0023H4023
+6015A32569n6080g0533j60164p2552O8390f5789A05003P8234m0594B8548g8760
+6027a00398i860A39781J02661k0676H4342h5062j05967O391h2597D9473O7470
+6038A16943n2954g8558j33596k7209J00753C0479J48595N6168o0116D4014f8886
+6050h0035A8100J27531N4436o6811b5596j72205r6098L3322a16129D4856P9555
+6061A24411m0138a9098p7656J3455B4222J51667J06068j4069A23939g2203j32199
+6072b04402o334R8707A0993O8092l0346f2531j14504k7246J00011G0743J40853
+6083B11596K6876q8669C602a11683j7706c8795I4966Q1128m1924d141j50151p0990
+6095b25282M3103e0224I5735O7101n4693b8998j17955j1110e4801I5051J06697
+6106B01748J918A01082e1004j07197Q823c6426I3830N3359o0070d5468j27021
+6117a72489m2061P3688A5955J47872M3711q3612b2952j08651p357d5123H6346
+6129A73250k4069B3165a25407o8021N4917b806A25139M6405o0841b3592j28799
+6140a52391l5906Q7785E2105J09215k035E5459h1780q4134K1717b0880A34370
+6152B15335m8012B3836a19226n6909M9716i221I8896K6453D6184h8260r5090J9270
+6164a64080c9158A16627R4479j5747G7178g5706r3149K7184a2156A19794M1451
+6175A61245p1343d4036j13637k4239Q0571C9992J14096P451E7340h4642q3302
+6186a67944K6945b7031A10296P6436l1802B8634a08302n1123O8825D6535J07734
+6197A54269J0624F8207h9175j26487j5250J07633C7418J11517Q78F4727c8719
+6209h9712L7758E9808J15696L0411r4969e9820j43805l5852Q3533a4055A07094
+6221A34449E5064g1986p7416L7406A9989J38263O5017m8029D2970a02612p5482
+6232a78094L7513a6911I6928K4205D3728g8733q6889P828e3032I5111J00432k0653
+6244A74890D3809a07772o8778M8336h33A29071N6389n0408A180a29039m0853P0270
+6256i9622B7296R3229M88C2085i4190q4316K1813c0275A20345P7573m3424B8039
+6269i4960m7368N4504C6965J15807J8648G3133h6292j13911n434R7139C1038J06602
+6281A37640J5127F9322e1963o9769L7812C5614J13220K8452p7406d1131j24637
+6292a65768l2274Q2587C5472J14062M943E4505g7368q2798J5257c8194I8870Q5824
+6304A84694k9466C1966a02296n6396N3017A1471J08059K9238p0697e3903j08439
+6315a62342j418e6080H2977P9679k7329B4113a03505o6395L8939d89A38107N8844
+6327A96951o1212c12j26718m4633N6638G790J10364K1682E2682g5406p5107K9798
+6339a20715f528A15547N8091m3509D098a29702n3735O5043B1634J21583K6383
+6350A69600p4148c3705j10664k2660Q3133E5865R9745r608C8801h9573o5165L5484
+6362a19254f112A14199N2107n6251b1138j11946j9002f9805E4737Q8527K510E1262
+6375h9436j00861J3845e3563I7943Q5722k2908E2297g1269o5300L4286I386J06554
+6387A15940K0467D9384h0750q7853P598f2293G0832R1238n657E1719h0789o9936
+6399a50725L9621F397J20453N1942n5672a0793j36519m9916O9696A1336J10379
+6410A21715J4197E8370d9609p1187J2966a2036A10324O2297m9195e743j22918
+6421a28661m4624N6168I748J21164M3664p0431c6387j15702j4710g5645E6491
+6433A44479o315D2555h2255p3163L1060f153A15168M3305n2896d218j00479l0426
+6445a35123O0709D7618R8293j54C6420a09803q9177J9878f4805H2522R4191j0364
+6457A66349E9761f6830n6039M4809B7999R1439J4862F1838e8675j02046j1718
+6468a72439h1406E2623Q9875j2333C1846h6023o3281L4947E764J35357N6457o0428
+6480A37150e819j26124l8087O3736I188R8574K3027F1981e4445q4491J2550b8816
+6493H7097N7771l4854C230a14310n0783N9435C0310J25001L0147q1204b9453j05039
+6505a34492k1381P4816D4663R2470p034B7727i8264o5724K9553c2980H1478O3789
+6517A45267k7403A4051i0726k4995c9062H5270Q1631j4965D5065a00507j02568
+6528b03075M541h9014E6603Q7920j5235C4689g0022m8696L8488B4640J07834L4175
+6540A66649p1018c1893j00523j3291f9648D4436P9442q955A6225a09862o3715
+6551a73577M7673C539J27740M8244n3829E318a13244m7767N4193A5964J10225
+6562A26189K4423p2743c6687q3342j808d1887F6353O4135l5136a8193j13573l3567
+6574a65333O9915C5116J10922L2182o8635b2752j17021k1816g9324D9857Q8028
+6585A37885K35E5932f0631p8795Q655c4645H4285N4272m7883a9515r4992j9278
+6597a33785f5401E0265R2535M815E1115h1333q0834K0657c5786I1991Q0516j5514
+6609A56993E0040h5834p9328K9277b8305G7851L7508m8325b8885q1090r838c8287
+6622H1105P5784k4915B3813i6095n7453L5848g160A15117N8915m8805b382j27297
+6634a29679m7126N6216b723A02203L3805o1024c8810q5617L004b6850H7198N9397
+6646A46595k9966B2698g6201m2439M2846B9315R7903J2497D8775i2505j06485
+6657a98990r940R3838C1252J24326L5875p1044C99g9964P500E797Q1339K5829
+6669A12965n4514e1407j01948k7733P4964B2206R8746J2415F2501d3172p3293
+6680a16465P616a2831A17985P3479l9225B1709a18052o9049K9169e2720F6315
+6692A31116k9585F810g6636p539a7272G1674M8875k8125d791j17920o2474M4113
+6704a41072a0522A26998O1275m2870B8887i1292n7060M2133H864J03703K1728
+6715A34295E9106e3843p7490L396e1775E2868O9311j1833B1241h0972m2091M7624
+6727g5439B9083R1217J6224F2458e9720j01841o669f8204H1256J08601M766r2715
+6739A01908c0803j01536j8524O0966A636N2902k6968e1178o3087Q883a7654A07345
+6752B02880J3073q9088a6604j13061j4505f6616C6202N0304l4903e0044j11805
+6763a61849m9942N4537a8855A25603O9487k7215G9533e469l5541h844F4884M7744
+6775A12628l2286c1182j22175n4481M0969e2291F9392O5166l3388h932j12533
+6786a21465k8988g2566F2233J11811L5682n3554D4784f0301l8609M3832B0737
+6798E7206A3497h6119r3537l1909O3690a4189A20428O0002m3174C4789d5246l957
+6810d9203B3336J03863O4875k5044D7290a12301j12001r374Q3920c5176D2346
+6822D9501I77e4794o129I262J13446Q4312r769I4910d1335r4460o605f4289D5079
+6836A14000k5161a5631j20006n5052M0395d1419G5145O2482k2515B6296f1235
+6848g9504a1401I1469O5174j8390D9054f3573p4350O703d7182E3117L8018C4579
+6861g5831r1785j2019P9027D0238J35043N4213n3696E3412e3766l4093L8534A7951
+6874E6943k5652e4256r3291k7183P1800B7636J14991L2461n3574A0533i3964l7512
+6886a31476N3149C0121Q0641m957B0592h3307n8155K4934a4905A09968P2276k4117
+6898A58127E1714f5671n8066K1558c1719B8201M169b7222q4869m4711M7462A8369
+6911A62635Q1537k3109A10515b9576r8744r544f5301B6882L8410A9896g2237p1782
+6923a44019m61f9551D2314Q8978J1635G1282c1864n9881K6318B5541R3788L6695
+6935A56024m5640A113a15898m9460M7787g053H7167J5204C4009g4971q5775q690
+6947a69436Q2143D1971R8782J4630n7373B4059h334A6835O5069N2777j0457B5617
+6960a27500j21463k2452Q3912e1142F6419M8628l1906H505d0641a2826H5707J01722
+6972A87429L6913n6407D5799h5658q1772K439O9467b3700f524m9993p0516k6171
+6984a53204N1839A8011J37495Q8145j3365j09376a6411q3845R060a1796G1863
+6996A00207m8146e1005j00382l5498N1283c5701D7666J5859A5490d8790k5709
+7007g4499b8069G9225J13732M6433n5538E1167h2658o8575J8362e7554A6877J7918
+7019C4795b5303j01337o9199K2196f1878G9664J03990K5788n1424F8717a574o947
+7031h521C9099M0598k0040c1032j18677p9832M598R8772B3000J23223L0983p0705
+7043A06501e021p7873k631a8804G2527N8879j5743C2692f3726l9347M0873A8298
+7056H0090Q78A4260h8074p5095K355g0710E3278P7207j1368D1575d8477l9979
+7068h8456L6030D7454J06341L6760o0879d07j22660n6112K7362g2183H061L1459
+7080C9520G687e2387k5327b9852G0074R2068K3684o1297B267a17542n5179M4406
+7092a28315a4477I5031L4979n2323a9526q1192j7075N5282C0706P1769l837B1039
+7105g4328m6907K7937i137G6807L6939l4977d533p0082K30C164J04508N8367k7654
+7118A38385C0423a10954j04984j3316Q6249a4085H0872J7807m3473a31j6908B0655
+7131I5518O3942l884G0155e5536r0592r367O6683A379N9772j1164b6337r0916
+7143a17253l8324N5812B0912J19531N2054l3162F0083d8117n3872K9937A3565
+7155H5659O017B9910e4517n5392N948d3869C1216L2682B2157g2979p8605J621
+7167a49963e9799H1705J23434M5969n0925G7415d6753n9271K1080b3715A1948
+7179g695o8326p6685l0882M8910a8809A00926N9133k4878E8450f954j4391B4564
+7192I9849N0294k7423A4463a23178q8660P448Q9612F96Q2106Q028B9607e2095
+7205i3086L7845C7136Q0101K2386m6168A4196d8693p236a022G7671L5115m8352
+7217F4434d9759j16751n4862L4446g7457E1690Q2611n131E4866b3523k0947D006
+7230H3599N6197o634F0585d7828q2934p684O2903F798L9645B0506e1440o4916
+7242a16356r340e9514E9808J07139K8643o6192A3560h4379k7891M5203A9537O7970
+7254H7507K054A9387g4693m8059K4110b3953E2696L1088l1884b6867p1489j3210
+7266a11566d2602F6753Q0920J551p3256b6287p2800j827c1283F2837N1430l1718
+7278H2549a5432j00255m5016K9623d5005D8726N0690k0836A2758c9975O812C2868
+7291A09744L5091l8691D672a12628p0316K3730e8332E4661N5768k4432A1242f4712
+7304i1050L8846C1760P1627P852D6764d4727n8204J0298b1178F7411N4044j7672
+7316A03783A8324g6840l9958L6716C681P0003J0494B9226f4295p3480J45e4445
+7329F7176Q6435P086o5022D555f2163r913b6261C8184K4457A6910g0733p0359
+7341a41092r57f9222C8853Q6185J6859o1139b1231o9612N666a3086G2053M6287
+7353A18340k2460A5357g9100n1835K3656b1959F4116K5930m1548b8991o0584m301
+7365i3876c2642E9460O3764j1647C0896f4064m5918K8114d34H3184L7947l5065
+7377H6066g672r3241l4400M5555g04G7178J9907m5389b8468o1933K675a6335G6179
+7391A22279k8080A1166f9862l2864L4144I687P6544J8002D5330e5164p4019l615
+7403a32798O5452C4512P7943J6465n5833a9585o4158Q524g759F5444K6502l9938
+7415E2008b7774p2266j7595N6545C4988P2584J706D1761d6517o1756L509c7011
+7428E7427O4561r952C0218f5013m4744K7963d503G1620K8871m0049b4177p2317
+7440i6494p596d2321D4923N2695j1990B0892e7880m5136K1705A125R0915L6995
+7452A29035m2313f242r1046l4414L8093a270H6518K8732n0768b4057o0010N188
+7464g8879a8972E0741L6113k0516b240p8520k9378M3174B4208P9181J8926n3059
+7476F9256b3734q2806k1893N6293B7450P8490M625D4460d1671n2297J1632a7879
+7489E9807L6689k9887a1006o8835j3952d5941B9512N9752Q221D0185e0234o9349
+7501a19583L849c4508F9092N9016j8747C0010f0563n0855K1941i975G0540K6981
+7513I7521l9414a8996n9848r849d4087B9244N4407l48B1706f0406m1233K9426
+7525g2213A1791Q5317L4582l8808e978j03056l9574M6726e623G7896K2132l9701
+7537F0327f077n1835n402a4731E3382L9973k4161f419p8802l1964L5574A886Q5505
+7550H7391L2957m6067b0896p7493r730d3172D6203N8867m592C3786e5919n7329
+7562a13248Q149c4483E0215M5330j6650B2581d0130l0015K8065B6170O0648l48
+7574H6470A4143h4789n7790K1498c6371F8823O4633q633D9410c9677m7687J8996
+7586f8368e667E4659K2180l1563b5881o8751j8796N1878B9770O6589K101C9629
+7599c7171m7513J6598E405Q0495K7017m9103c2399p7588j7532M7801G656P8998
+7611H6654L0797l5813B818f8411j5830d0686B8116M3056r748d419p6127l2267
+7623a12813M4978B8306Q3781J9492n5779a2239p2116j6294M1806A5625N6915L28
+7635G2868A5431f2314m3829J7521a6047G2280N6531j4079C7828e3605m3175L1124
+7647f5656E896N5854j102C948f8891m2325J9879a0870H2466N0096j8191D1139
+7660d1762n4417K697c3711D3883L8237k9208b4965o6206l949c6309E1156O1849
+7672A13005k600D2192d9351n3153J4641a9602D9575K8336k3046c544o2286k3001
+7684h8831L5522B8867P1374J3781n5638c5752p3147j3356N9665C1334O5548n012
+7696I1870B4682d6097k3398L4299B8394N3405O645D3423c9341p3121j9409M9061
+7708h2810C721P3983K2442l7655g393n1039Q696A9053P7324K4616n3248c3818
+7721a22450k7556M0878b4281E3552L1662k6486D115c6932K609I591N7763L6200
+7733A03554j6929A1853h4540n5019K6253b2618F8144L5596l8055a0457o3300j3834
+7745h7591c7586C8176M8785r885A7440e1687l6922J3397a4067F6178N5249j0641
+7757A10786C7669e1753m7967J8321a9348C6341Q453e633p7600m1787L4027G266
+7770A12788N3686j7140o7336b220o4943j5918L3930A100K3786d491o1102n1320
+7782a16913K38e2268E1118Q8259J3779o3812e865n8474R081a352E4251J2198B9130
+7796d3508o2912j5978M6380G411P4132K9883l0471G791f6660k8322L8810B3803
+7809H3727p998A0363f1923k0437c8198D1147O5394P950n5627c1972p3843j9272
+7821a25087L6160b1963D0379K4253k4420a5958m5879P953A7618Q6878M1107l6491
+7833A09112A7298g7036m5280K3822b8790C3835R378C8e5218j9936K7485A4837
+7846H2568M5556j1114D6439e1917o9551P11e6071B9526N2555j0671A0506e1043
+7859e9177b911G2095L3416l5128a0003q3286m4637J1656f1159B4108O0443Q038
+7871I2589l7808C336b5624e800E0344N5544N049C9698g3797q8741p735P0487c564
+7885F1059O730B8484a4545j4312A473N3714M2731K479m6066a9480p0551k9616
+7897a19647L5444A824Q2638K4706E4498c8566o5500K269d3465B6744L3218k3633
+7909C6329b1331m5023N863G66Q0425N6649O354m5587A7745f7998m9319J2553d8491
+7923H56i98m9915o1128j5450N8104D4110J10534M6088m0103G1871c596l0317R678
+7936b4235c260G014g755m8606o1947l7001K1254e3558D6185P2192Q254n3894f849
+7950e2002b4140E2340O1705n406C9204d6384n5523L48M5306E826L5803q285a4447
+7964f8330l0403J4303b3716E5933N7200m751D5565b5211j8367G909P9336M3740
+7976A30985k8283A1444i4183o9094j338N3620d0963F135J0069C944h780i30C9621
+7990A05430O1870J3763o3669I54a09116m5732L3184d9648E843O55d1583m9366
+8002i0949j548c0023E9798O6114J1230l7764C2181c5008m1642O614a6972D5807
+8015G1479l2152b3691n2331L368a7379E4877L1718D1897e3506q0410q121O3421
+8027g8616A5722P7571L5241j4271m6898A5679a0054b48B6015J4337j9344c9020
+8040a20333n0437K0670e3342E9882N9658k0348C0563b2873k928A7920N4105K6175
+8052I8200k4645G440f4585m1893O109M7498A5832N8343J2004C9643c9022n7439
+8064i6461J0968b0430D7160J7073B3698d0929l5395K9313C3661Q4979L5213l4146
+8076A19707D2425c9742n2053j2838K4049c3463E326J720c8811n3352j1329d8200
+8089E1643Q8070K4752m6574C4203b6122j143A7209L6081j1840a7280p4090m9511
+8101a40881q737L9143c3309E2374N2063p125D3914a8036k9116a7470E2668O0753
+8113A13421J702D5633d3569m4382K3332c781D0576n192a3352o3953m3153K444
+8125a18014M7329B040O3065L1718j1200C9817f837r691C3491P9319M3804l8303
+8137A18311I355a08659o5745P196N5273e3782K6757p807j2262J7366B7120P4943
+8149A02063O1608K4167k4388p3351a6163r2187l2204M2979b0936C1261j0700d2922
+8162a05137j0461N6672B9688O1778q68D3909h259j7873e949C2583L9745J9945
+8174I2273j2876B6991d4079n0121L879c7454B3423J9972D66h4837o6882N718e7474
+8188F2636Q3098J1902m0021n2092C1467j2243K193j673B598d0639n7080m5034
+8200a42753r053M7323a4837G9702M2644l5412A204f4114P744A7041P8339L0871
+8212A26251l2031B3296d4534l2958J2135b7109E595Q792a603l4507l1464r047
+8224g6621L0838B1695O3733O913C5989d3753m1095L5493C6608Q5216K6394m9206
+8236I9012E740g4833k9459J9074L7399a8491g357o464k1004k2764M996f082F7634
+8250A22652k241n9649a8930m2265K1940B9421N6425n409E308i0512n5039J0647
+8262a34904O0870a378E3661K2842j3966B4131a5375j3401d129C9009L2919j2184
+8274E9744E991e7878k0659c3022E1154N6747k1859a930r5692m7004J6574O0900
+8286f7152C368N0300J4873j7923B1674B212O310L2254M3746K2365l1720a1106
+8299a00107l6119L7741b3372B5373q418c2737m5923J232b1977F3425O5050J1558
+8311A40033l8758C4141c1061m3385p563L6832A5895L9376j4015a8452n6864q323
+8323h3639c4876C3464L5035k5671b3999n8136M19a8088F4708N1609j172m0907
+8335G4238A3612d3622l3418O858b7333B2411J7775A0254e2584m8064N824b9438
+8348E6338N0056k0317A8146c7208J532A3669N2560J6418k7900b597o1102l8854
+8360a02553j652M0441a282E5344J7861l0389b1607m9649N757A918P8698K8418
+8372A09034m0509g637n3083J159a4197C4484J6788B4755b5562m5825j2406K3933
+8384e9860i109D5574L9152pC3941d1599n0953J8349A9P7801K2526m3950a6293
+8398f4140N124a0307C7942R081A0616d1649l2150J387L0613H014N4042L4567j2231
+8411H4392B4381d7153l3771K6776A5184O1339N191B4845e5229m7246K0735a4033
+8424D7515J4216k9288h110k6057o45a2904B2616L3910Q242l0274b4413n3740j1611
+8437h9764d3285C6966O3283l242B4303f5583m1176L1394g448D7319J1492k6324
+8449C2487d249k2854L893B103L3370J9007p127I997d2731m6229k218c6853D6940
+8463A02669j7750G743g1008k4038M3288B1374N2917K837C4083a9233k8446P311
+8475d0368a3721A3392J5834j59E886c7647l3223Q287b894G0520L2359l5562a3627
+8489h2820j2040c9282D1440N0677j4881A8001d2286k5377J0464b7380H177K5724
+8501C3901O753A9515a7472k5576J2465A5964N0476J2561C4035d7045o0605R687
+8513i7963b1855F8754M0447k9844A0559e0372k4756J3254b6406A1896K6741K2
+8525C8659A5673a6586j7009J5877B7483M3739P576B6122e6283n2051K0127a3404
+8538E9549K2069l7478b0892m8065l175c1517B6558M3735J1999k1145A7346c2321
+8551f8300K499b1908C0079J4252F063d9305j9989c0496D3978N7574j838C7976
+8564d5711n4004O107d2156A8066L9869Q548j7337H661c5565k2076J9264A3670
+8577E7319n45I394e2609k9385K9224A3884N5235j979A0791e3906k0575L5605B2765
+8591G2809J5896k0634A8901d2876m9733r544L6584A688N6958J2945C5172a9799
+8604d6940a7420D4573L6040k4245a3676o3391j3776L7654F955N0657J4293k3626
+8616D8279B657d1025k0631J0691g660D7875L4784j4137A833g3081k7012L8306
+8628f1787A3914M9537m881A3966b7040m511B824M6381K0579k2014d589n5915l3646
+8641i4150k983L2604A215P1689M0427k2457B0216e0029k0343c3023B6223L1607
+8653E7830j9523a8711n0775j923b4377C3333K7976j3839A2979b1355k1759J949
+8665d1165a6694B6815L9196Q80A9006e0993n0691Q230b5241F2929M7910k2513
+8677H8326B0471d1764j1084b6208E454Q990a895k8324k1767L59K4882B1607M9090
+8690G0697K8876j2559C0216d4874n5220O824b8144D8339K9305l7551b6418m4756
+8702g1174J0080i216D3797K2215j7418A0096b5300j2905P554i833A5044J8178
+8714C3222n727i262m6657j7150c2608D8234O4024R77D4860d6620o0332J16N2702
+8727e4134F786L2914n506I156c019C302J6868J7688J5102M65B3383c3839n7781
+8740i1620j6107M0937I653O2040P865C1403c6158l2702L0513C0003N3459j054
+8752H2408C6872a8369l8866j2658J1177b6059A4476K5971k413A1112a8920m398
+8764b3318F318M9777K4931l1971c1733p9378j8720N2824I646O7570J6285k5655
+8776F7846B3571a0003j1010i604H276J0441o282a2375l8616l1052L978b7797D6606
+8790I2839j2589A8448d0266q714f405E1466K5853k6901a1384o3423k4773J7046
+8802h2534c6083A6189L9073J7827j4498A9252b2506j2721i104C1314J1283G460
+8815e5079m1798J4912a3614F8345M4433k1559B8246c2289k3353R792b0130B856
+8828A5330m012a3944l5461j6524K5037A9225O3674K6612k8771A3507d6939j1827
+8840e8766a8576B7105N946a1284n8302k9436J6095c1435C4384N1719K0607j9833
+8852H6877C9112a6858l8651m398b8387A4991J9106G403d4883k8542K8583B2616
+8865H1908N038D1434b7103m5218l77L4738H536L1640N776j6167B023b4533p066
+8878c1599g942D0817L7949o181A1206f7410m6511J3970c9566B1541K2725k0224
+8890B4042g730j1570G640M8829L5704l15l6627a167n8070m3300r656L6155i873
+8904D8354J2951B7625b1029k0884a6264C7837M4614q273A8030d4490k6720K2778
+8916d8432a764C4140J1349j4420A335c3959k1384J0398h201C6269K1653j9168
+8928C8754a4864n6745j7967M4087C5347O2302L250m7511c11k6663P882D453J0358
+8941A4811G66c3902l7682k1636J1904L9531A6645O1830L6304j4406C9932b3729
+8954d7724a7300C3389K1919B7320c5122n4815j2320L4879g312C9287J4376j4910
+8966C8753A5285a612m837D563K2023J9403l295B077e7525l7800J6636a2054F8680
+8980A10141k1186B1361d7113k7295J7598a9821b52n600j7028j0294N850e590C3270
+8994G7942K9615q137D6689b6850n2708o475L6203A204K0402e978n3143l1296K3537
+9007f6880B644O9337L6599o578l6303A7705b2335j7506O412a5488b423l298k0977
+9020b6698k4911q143b8260C7989N6300M09C5333d6391m8390O149c9113B2377L6330
+9033E8707J120k5520G755a411E587J5588J3681j164I672c8617n1055k0037K9953
+9046g9756a3567D5286J6254l0019a0971j6274B090N7524M5807R6m9937a4420n5412
+9059f9832k4358Q873K9108b0377I513P687b804k4664j58E860N1039L2095j5182
+9072G3812A9179d2393k3959K8264B1145M5476j154B1074c3097l5498l782K0629
+9084e1748a6582A7459J4066j5243a5689k3616L238B010N5049L9231o408C7746
+9097b1095k4202b1880A8673J4748F261d6068n0276k0013K3850c5453C0929M8786
+9109G9715J6714j4035l5822I283h187G594K9169Q864A1324e0451m8140j280M5537
+9122e4334F506M2186l193H694c1314j1901a9547A9042L3214J0231j1986A7534
+9135b2148k4841Q977E853M8646J6363l1576b3987n6208j3901L1556a3665A6058
+9148I156a8691j5529a5688C1077N1486L0647k712l6740A1019e5292m1459J037
+9160i5714L6389a4941D506h249l1353j8666K3319B4223O2507K0641l1828A8725
+9173b7123j3221J7238D520K0527j353A203c1471k4618J335b5262A8372L6020Q33
+9186E5225A4133d6726l7170J8453e181E4243K2193j6583B3033e979k400A2077
+9199C7284L590A4432c0803m2047k4446O165L7693C759N0708J1643k8024c638j5328
+9212a8966E035M8869L6625o547C5493c2616m7028j620L0037a4834C113C90a5067
+9226c1818m370J7388B1650M4309K0956k1067A4123c7652k1887K5341A5257M1728
+9238E6985q62A3526d0336k7763J2209a8641A4771J1088I916a5977k5132m352b1897
+9252B2718M4848J7752j5994B4277b1017j9157J8782B0130K0194A5734d1677n2530
+9264i4207j0961L2045a7043C6849K9312l214k5308A2275n913Q898K0868J3027
+9276D9155p900F325d6951m0331J393d0393A7355L1677j3262e646m0361r300b7420
+9290B1846L8291M648k7321B518a8368M33a841B5052K0601n317A334e2446l5475
+9303h7921P048c8642A1882K8217j0767f285k8930Q128A6579N1177K4454j5483
+9315G6727C2142a9355l5461q405J8387a3119A1581Pa2769k9421j1012K1180A3921
+9329F1682J4867k9619f351l8051M644h21D2513J7374j5836C331c7485k2617O921
+9342e3181b4530H933J8213r400a2064k9987q932K5279B4917M6297Q549l3654d526
+9356c5997O786C306L0866P258A5376c1306l9596r423K5264a2167B7848J9249n208
+9369D1889A5033a5237q764A4M4779K7117j2231A3976c9836k9654R687b0143A9289
+9383C0643I268b6094k3741O919a2345B7335L1012N921k5998d629l6073m304a6616
+9397B4557K6105q985E179c9460k1178J9856B563L3642j514C160c5261j8992J0247
+9410d4006h434C4919L2205j76k8469b052k9137j199i194B3007J3393A6739b9868
+9424g3246o753L5526A0306L8067N730k2429b123j9029Q226A5179K9867Q861k1286
+9437C2621g292l8964k0700J1247a7812B5922K0894j7489a3462l4145P19a2321
+9450C2223K7312o374A7934b1514j9007J2265D531K7816N432j7632a2989l1581
+9462d4570j3548J9595D299L9842P403B3652a9438k9238M283i430C6115K5617j1961
+9475D9771G345b9434j1482J7976G254K4748J740A2524b5495k9786k799K6892A1970
+9489D5324N883k5575a2888k3137R817A2918L9895R588k9214a6432l9215q475K0750
+9502d3372f619B6307Q626j6777a2855j7918N866C304L3128J9320j1383F674c9791
+9516f0430J7595A075M0776J0068k4520a3237l0368k271a8613A9516K1354o044
+9528C4826C577b6741j7332Q790d874C2666K3222j0466G333c3206j3009K0289A2402
+9542D0390k694E984c5597k4539J0109a0874C2130K1729q641A5510a8019j6779
+9554c4798N859A536L1118J0303k0539a5809l0845l765b4516A7590L0535l946I646
+9568c1805j9475J6769B644L4517J0415j5442a16l3496j1615J8825A0010L0197
+9580D0207N934k3015a5621l0961k544b2380A9444K3684q993a149l3266p836a9597
+9594A7579L1583N788k6188a3597l3383l996K0683E982K4755M434A3812b0202k2793
+9607d2995Q267B002L9910J5216k0325c722l6644j0861J8676D789K9248K840A2778
+9621b0296j6808Q128a310C3468K0357j0270E612c9024k3534J1785a1670B6710
+9634D4747j3201A742b6721k420b047C2763J6073j5736c884l7570j9341R926a6856
+9648B4606K4368p252A3401a9348j0937a4099A5602K7335k58A0332c5245k9842
+9660f5087O213b2686B1888K4545k918B0448h698j5594J0089A3363K1551j083G233
+9674c0799l1341j963K9380A2147M1739P667k5047d223k4053N560A784K5176O289
+9687C3249A2325b4476l0807l258K6276H670L5132R178j5555C873b6267o109i365
+9701B3571J5683j5659a2705l4982j2280J9082A360M1781J7114j7622E356b5707
+9714c1732J5195G128J6601k416d183l2364j6417J6240B915M0802K0937j2703A4035
+9728b7139j8566J1213a293B4237Q75g87l0116j5192J0431d395C6268K4782m746
+9741E6304B2351a7194k2219M290a0742A5411Q754I061b3887k4560M878a0555C4107
+9755F1847m883B6130a5338k8493p92a9190A1722J6419q960f195k2278m785a5076
+9769B0158K9639K943B3858b0978l1864p55b5461A0465K3094m93H632b1522r583
+9782c1105a4015A8879K7295L134B3645a4527l3914j1479J9240b912B9886Q865
+9794C8751A8768i230j5454Q929A0720K9704Q950k1855a5172l8580q766K3251b142
+9808C2518J3133j3799B313b2581l207c999B5271J3851j3926g334l4894j6421J3736
+9821d4913d484C6893J7365j5624F478b0667n646a0056A5107J7299p036f249l6247
+9834d2496j7901J3690i610C0975K5781k800B5460i360k0785J0051E023J8449l269
+9847B0203e595l2339j7904Q737a2277C2736K7134m273B7091h754k0828J477f953
+9861A7433P219H242b5765k6226K732a8062B3625L1457M894k4752c337k9858j513
+9874c4708a2873A2268P462E342b1749k1126j039a8357B3440L5705Q425k4800e22
+9888c6428j0823J5601d801A7039j293h450k4843l855a3507B4272L0349Q137k0833
+9901D1925C611c4925j6904J4081i230A4731J91a752k2631j1515J2186A1426M0416
+9914E1842J7280j7703A0358c1190j9588Q560a6694I558R621G330a6714j4142J0039
+9927b0817I506L1093J6435j0746A0219c2629k3839O712a6572A8646J6628r402
+9939B5872D98b1659k738e846B3173K0959o756D981c2892k1494M525b0817A4565
+9953C7629j619A4137a3104r171f353B1943K0494k262A0355c0424l1082j998K8216
+9966c5288G019K7540M651j8767c215j1594O633A4423K1479N116A8071b0821l0318
+9979e1139m107K4572F263K8021P923j9638i962k3847M438c896B5144J0736j2446
+9992B3434e090k7587j1264J8463A0835L0751P313j9000c388k4737p199J3980D844
+10006B4017p052a3429k9041o567K1684A1234L7228J6804j2182A8850a8051j4211
+10018c2262Q830b892A2464m122a1937k5362j4239J2975a182C8454J9918q023A7509
+10032a5448j7679P977A60K3707N182H801b1876j9799N528i302B4039K0581m101
+10045D0519A3160b3706k1349L809a4724A5814J1913r091c774j8676J693B437L4198
+10058C6635K1842o404A5980b6763l1686k459J9551i963A5164K425G41a7232J076
+10071a6156E799L1151K1922j72k5877a0160l6480q512K1451c202A8219j718a964
+10085b3630j0530J2020I711L0712J0366j8516b072k9244q928J3347D519K6067
+10097C0586P197A8692a0922j6768N100g4B2256R462j4519a6614l4050j0454K0625
+10110d0493b233C5034J5070q599A9286d153o278B255K2171J0706j4734a3116l4750
+10123d7866j7245J1220b1718A3472K0895o518F301a4617k251D221K8321J7796
+10135E0338l954A9182b0050k6209l410b3701H100J7302m324a181k3785r132J2037
+10148b2061E148K6476N476A7527a3730j9466N269b630B9906K1063k721B0789a6270
+10162d1960J860a8412D189Q898C583a8936k0719l39a2759B5799K9344K943k1911
+10175C6175F823a7097n756g200A4496J0388H950b4135k7149m968J9558c332C2903
+10189D7684j1030F142a8607n305f731A7107J6885l100H498b0655j4705R127A120
+10203B6526N606A4856a6335k7852p973J7501I43L0239R836j5098A665a4926N688
+10216i238A1206K3968J0726j4704c209l6145j7427Q470a8657G603J1539q475i515
+10230b3590N276G601L0837J7714q198A7197a9130k1478J465a6643A2288J4938
+10242B7226j0235h881k3198l523J6950F930K1979L575A3114a6495j8244P534i
+10256C1243J4961o701A3811a8017j6364O154b659B0617K980C302b5092k0857j25
+10269d6074b2661A2746K8178N007j9679A08a2149L263A0594J9548M282A5849a9461
+10283d9587q369K0287d452B3857P597j2583c959j7920K165C938K8046J2798j1505
+10296C3277E828b4379j3661R040d712B0760Q655A4610a3246j9953j646a5568A1238
+10310C0570j031G329b0542j4573J0986E375L0532J2447j0226I232b0650j3455
+10322c4105P767e656A3510K13d481k3926j3092R645d083B9470K0485k411A9910
+10336a0092j4993P836C607J9264L986I269b0804k3119l207b2699H761K1772R33
+10349C1466A5301a0496j5527N219B459K6538J0376j4887c213k3237o334J4000
+10361a8784F797K2300K073H885b3629j9024K639a6253A2879K0771n55A5320a0388
+10375b1976R791A2285K0090K081A5964a3395k4382m380J9691F843K0382j184D152
+10389b1236j2997P626a82B8132J5555r144G375a9431j0505J1155D079J9365K131
+10402B5575G622a9547j8482L186a1542A7515J4491o909C438b1027r052J1087H910
+10416C5045R226j8191c384k6703n783J3190A270J9169K377E374b1371j1732Q074
+10429b5029E89K4978J1047r965A979b2876n923a3256A4577K1103j448A2600a7498
+10443d0410k431J9336G504K1431j513G524a4069j0495J0220F293K1042O301j4689
+10456A8947i421k1955l4a1589A5011J6382l022F077b3587j8393N790h405A9863
+10470C5138o805E947a7079j0695J1127F952K1644K501A3259a2885j5000J889g848
+10484A3960J3223q422f215k6328q305J6061F523K7735J1201j2725F121b0895j0008
+10497c0903J1021D207J8730p62D171a7700j2884M874d761A8989J0619j1959g119
+10511b6627j489a1390A6530K1846M131k0336a1824k5880l125K0078G420J8553
+10523B5973r37H629a3664j2175N838A388K0490M422A1818a0429j6034K85h112
+10537A9673J8829l882I357b2101j6796N858a1065A6677J6625m919C261b2643j1187
+10550c3830J2502A207J8802O710j1002b499j5529J402A98K2132P960j2720a0094
+10564c5892r340J2017b289B9086J3840j0998C623b1857o620J0746D122J8054L336
+10577B5512A1049a3190j4298N958b077A8439P833j0148e288k1603n353J5491A2449
+10591C5815L5A5185a4371k1931R4a6862A1783K1862K301A5980h009j4971L407
+10604a9573e011A1417N958E502a5083j6094K421e807B3332J7343l268A4864a4665
+10618c5210J192a0974A6898J5874q971A311b1462r582P891a111B0317Q635j2820
+10631A6132e652j5769R75c399A6230J0548p569c778k4248q495J3617G398K5989
+10644C3387P668j3690e68k6510j1994J1363b059A9609M815j1946f481j1144K649
+10657a4976B330J9391Q033j1145g973k2653l821J5749G337K0573N452A6649a0851
+10671c1053n46a1713A4268J7570l051A2009a2201j6190K616e861A5176P999j0182
+10684A2993e854j5283J2d922A7768J4474m913E088b4999j5562P429i551A9114
+10698C4505k954A0503a3662j3687P851A710J9068L474A1888i823j6386k24i480
+10712A4915J2981n951b59k1361o823J0695E714K2137P982j1767f234k4823o519
+10725c7576J4248B241K1340N830j0089b247j7658l7d092A4655N943A0249a1923
+10739b9928m016J6689A1148K3928M202j5608c473k1167l132J3472G606J6423k549
+10752B1480B914b2344j2426R846b073B0419J0436p081E233a4420m620h390A1509
+10766B3622n805b774k1553j2280N643d568B5096J7436o987I355a7397j4855M477
+10779b7775i244A0984Q678q415g240j1795K698C582J9700Q777p193B362b3121
+10793c7753O578f703A7603J1039j0553c988j8444m455a3378A2338K1386J967A7493
+10807h209j7080j743a3108E068J1364m176d981j6792k476i271A3548J8038j68
+10820C1418A5105a1091k2043l320a6648A3234J8713j019A3731i828j5228K337
+10832b2719e635A3663Q307q111e459j5680j899i244A0914J5157r89G310a6628
+10846c1014P401E4K4846J3079q096D172b3660j5861P561a0607A3364Q892o699
+10859A5557A56a0838p42B82J7667R606p158b292k3540j0018R218a668B1731J0869
+10873C2600j0441b201k1501n688J3198G890J8948K625j4221f748j8967k215a2467
+10887I453J2356m544D224a1101m614f729A0844J4157k332A556b6506j6200M476
+10900c8230a3642A7298K3488L302j6676c98k0442l646a2032B265O487C752i058
+10914b0484L7d441A9716J5377n057H510a7203j4275L541i817A5755J3587m842
+10927B4500A396b2002q819R748A223K0048R395p422B292a7703p049Q291A181J1408
+10941A2589j868b431j4064l376g848A5748K0227L885j9756a0860k5159o841J1740
+10954c1120e754B1231J1200r455B994a3746l566g399H424Q171m666b292j5419
+10967a7711m000i776A2501J5278j956G412a7269j6276n35a5050A3698K1388n4
+10980C5032A6898h375j8227j484J3223E027J3207j885E18a3017k189b872A3961
+10994B3094l264A404b1334j3436O418c892B0309J2480o928E329a8737j1456O873
+11007b3320g63B2993Q697q973A925a7697q135P732b529I384J464a210j3008k014
+11021a6232b672A7705J6261J143A6838a1649k5915r860J5188b946B4349J0964
+11033C5313q790G903a0720n784P679D332Q643n205i068j3628k061i521A1244J7680
+11047B8924L921j5478g644j9859o84a1679I510J4520j77F150a7442j4362M060
+11060b7744e561A8176J3775n600A0304g714r131L523i93I852k587f135j5947n073
+11074b7155J1044F131K5003J0450q906F089b3794j4830N354a2415A0779J3246
+11086B4025l489D638i901o638f374I189P890m621b133j5732p153P667B511K3204
+11100B5715N864j0739d102k1015o899J2319C911J9877M771j1445e989j7637q48
+11113b4474a0207G267J1072n42D126a0748p802O291E792J5028J107G690a3133
+11127b5725o62a0068A2165J9045l512H822a5145j4339L704g938A4300J1557j916
+11140B3941H324i859r486P015E07J0481p08a833j4130q933P784C488K4083J1758
+11154C9329j1631C312b2469j2926M457a2083A1654J2672n272A982a0409l084c559
+11168I640R814j942A323a9704j0267P024b442A7479R257p238B178a5914n530R837
+11182a1607I265J5773p35G996a3083j5499j772J4190F823J7990K65j2246d617
+11196a2769K131A586J0640K267A359a6948j2256K918d954B1260J5638k482A6022
+11210i550j8950j989J4401D291J2730j646B142a0876l322f589A0198J3051j146
+11223B2103F571a3807j3259L838f769A3976R732m062B493a7616r692P655A311
+11237B0071P494j0037i60j7763o626J0068B298J6991O16G189h687q180L197c99
+11252A4804O656j0556a0502j5579j237a2471I869J8039M069j0963d259k0109l923
+11265b8291J2493C392J3417J349G286f959q825M792B939J3539O23C961a4932j1423
+11279b6355L265f511A6920J5659j044A3284a0159j7468J05a3011F453J2115j721
+11292A6847A872a3142n733P982F794J3240J076I659h886j1205R67f442A2285J1180
+11306B3465p411a726j6656p228Q696C514J8895R062r413g40k1338q009R326c145
+11321A3068M601n148A94i200K477G104J2151j17D839a5236j6193j266J3068G100
+11336B9905P489j4329B48a9008n646Q193G2J3831J775D453a0191o177O639F027
+11351A7744K036r619g817j5735n78i394A0913J2436k244F019a3802j1843J775
+11364b3870e250A7634J3138m914H303a1592j0031K360e791F774N280E333g153
+11378a3941L892C475J6113M968p579c778k1033q568R786H2K3255R524q182E322
+11393a4707r512M360d854A0291K359E266f731o250N144D687J2345L539j0114g590
+11408b4822k979J3222H771J8236K212j2776e735j7002n177J1808D123J4111J328
+11421A9562H027e466r752K489a110A2750N937I282g478j1390J414e042A1975J0459
+11435B2434j275C626a8847j2925N503e828A6385J2216j993A1087h374j2484Q26
+11448b0032g257F083N126E376e755o383J385C427J4291P494r572d644j9636q910
+11462c3190R411c163A9643J0568o027F393a1986r183O528A005J1026K015E820
+11476h095r085Q53b016A3615Q013p946b816j5758l342J0910G624J4336K269A1589
+11491a1327j4745p23a2504G001J5581K125j1257d151j2665M16d432H747K990D433
+11506g771q820N64c288A6196J1493m038F124a6225j1358K134i306A0940J2564
+11519B3504j428G406i388q771M009a862A1344M780p591f504j1375O42c717A3492
+11534B0223l655A510a5107r048O413A174J8252O897q284e8j6926p006P795B53
+11549A5632L568I541f944q898J442c137A2152N466m777b528j4651m455a0552H088
+11564B0110K464A0609f516j6289j662J1455F043J5504J52I262h250r787L414b864
+11579A0598O876o486c199j3411J21e047A0627R342j507E946a3775j2075J198h295
+11594A1102J1961k844F770i624p380K871B053J4348L470H970g293j0552k95h639
+11609G224R480j314B163a3790p684P666B862J3922P743q071d62j7492o087R505
+11623a4536C805J6131J218I849d768j0943j140e505I584N774n460c531j2736k913
+11637a9180Q538E809J5161M166q824b176j6845j757a0306F215J1783k355C234
+11651a2620q858N076b417A3194N412n245A483a1730l256g426H028J0707j43D741
+11666a2354r579K580d696A2016J0609l057C953a5482p783O423f86A3045L319n044
+11680A1320a441r995j174c103A1912Q701m208A866a4559r188L520d791A2765P980
+11694B0745p195c079j4574k186i894G026J1974L256r596d566j1944r88f291F454
+11709A3868k892c02j2553o771O725C955J4469J886H554h843j2384O3i774I369
+11724B3481P3A0027f314q980r02e357G140N613l703d248j2679j891h103G297J1326
+11739A8623n45G059h264j0508J090b703A4824Q358n739B469a3546q472L397c607
+11754I777O630m701c305j0198j244e336H582R772k819C910a1493q369N620B930
+11769A6329L852q031b800j5290o506R026B032J3065M825r285c320j1717j563h044
+11784F775J0339j191C155i069m852e708F422J0937o83D981a2712j2934n13a1414
+11799G192J3974K607q752a578j2466j941e939G861O694n669c911j1096j456g519
+11814G432J2304j619F229a0214j0002K419f131H975R658k604C821a1562p383O943
+11828a2002A528J6135M607p212A4a4961n695P153F01J0471k451h11r594l592f683
+11844G113J1984M738q319b250j6793o595P262a602A5638N464p445A2a2331k707
+11858a5038d982G651N704n036c284j0773l874Q385D894J3300L936r042a901j4177
+11872a6078k923Q603D613J2345O63D933a1353j0752N242d022A1270P202m543A521
+11887a0242m409O321D106J0218n6E487f532r612K96d345A1078Q387l502G99a5495
+11903b3699O662b264A4102P326n892H01a1525j826O602D864P117j061B024i211
+11918a5311K764A276J3666N840o750c218j5158o285P852a3A5560M600p489h43
+11933a0157O7i76A0136M454m531b533j3887o382O057b496A1831O928m007A079
+11948a1910k388e762H920R221m162A510a3152p236M326b923A2882P263m128D151
+11963i156o890K863b916G855L399D431h642p991L674B067J5446P671l925E106
+11978a3282r679L129f976E992N045m344a415p469j142b337I840R447j316E828
+11993a0930j0634J359g446H851J0579l786B289a1127k529N906D181Q779q24D030
+12008i002q702K67f773H830J1844r41H328f786q718K82c184A0625L415F226g516
+12024a7054N07d654I902P544j062F117g782r200K036d962H178P357k177C358i481
+12040a6331N711C825J1325P10D108i777j0218K787d917A0113R143k258F215g225
+12055a4262K620c450F637M772m585c532j0759k000e738I939J1739j767G889h957
+12070b0440R74f390G507N944l532D38g745k561M938E459Q898J135E907h794j2018
+12085b0812L43a0222G306J2295Q95G946f196p693M969B083Q701l26B152i557p863
+12100a7420L51g336G415J1383L173q577a257j0509l648g541C806P643l700d495
+12115a6214j287e925I626J0766p30r130d737j1809j878Q188B381P811K302E518
+12130c882n882N17A482J3120L570G917h380j3889o11R884C303J2722K581q777
+12144I829b650n836K143H37P566L731l563c534j1547n752N819b08A4375N032p022
+12159A2385a721j2752k248g376G406P420k723A663g980k998M374C930Q699L600
+12173A6229o710d303j3655l896P337a891A0587N407o054c304q859K529A789J2864
+12187A4653L559q141c127j1855k843O474F54J0940K435m580b459r931j940N190
+12201i140B047J0652l05C634h066p548g453F733J2557K841r478c062j4617l325
+12215b1004O203c897D793K040B836c977m314J903A434J2228Q829n741A102a2272
+12230b0769O384D31J3446L065q373e817r374N70e395D167N026j454A093h460m926
+12245a3386L923C161J4098N684n228D296a0099q360N147h94H030l68c888j0160
+12259a4048m511P488A978J3631M992l972F865e599n987M41c157H508M871m422
+12273H957c754j1097k976g532F831P171m068b644j2151m741P949B433J3789M911
+12287B1133l866F448b603o598J742a037E919P17E07a2702r749L061e668A2205
+12302B0840l732E482f480n505M658D845Q286k98D703b891p935j745N446A966J0106
+12317A2072r50D86a2541r132L413c905A1294Q670k390E481e243k729H6J0616K672
+12332A3374m546a292j1442q245J368i693C315R281J160F609c507p932L115D072
+12347A5444L232H351f047r599K430b867G853N480l222a09j0544p310K680g618
+12362B875Q241N56D821d679l027a772A0394J0274j449F273a1432j0318M76i803
+12377C749O422l142b78q848j072M445C231Q001L812k862B169i628m206e574F416
+12393A5633j376A323a2877q865L884e822G814L699E525b441n786J023a837G951
+12408A6293K498p419a866j1859k638N756H31R070o82a891j2512m570R028E768
+12423A4544l4F884c298o999O75b363H505P321j134o348c638j0854l780P048A35
+12439H340k976e337q931J511a106A3923R617k477A0251d595p849k28f198A578
+12454F272j029a047p548n208K029a493A1090O000n849a785j1143j377c752H758
+12469A6340k348C549g230m240M675A300N818J984C458d567j0132n265M317f55
+12484A4117N911m715D660e893k831i02A0419K851E183h538r534J66P710G13Q087
+12499H800L243l311I08h635k969M575D236J0490K104H395e435r606J629h86A0285
+12515A2690E245f959o583m28N555B085Q523j112D112b523o431O1b159I975P646
+12530A7621P92F195h785r064K504d224G987J637B954i434n112K536b139G960N925
+12545A3885q23o352c33p352K5a814G056N628l897c392j3169n556O382H13J2268
+12560A3081K474p573c555o225K549A051Q796K053m505A059g613m052Q67a670I607
+12576A3959m786b944j2413l229P095A956J2193Q34E218f683k541c682E469P709
+12590A3178J603o434a03j1135m470K434e017C000M788j708b826p518p9C82J5032
+12605A5414O365m745B175a2019n009L840c727E106K135C388c225l746k8b456D760
+12621A2636J008F652f199j0214J319c610I396P646n086I48a1002j853f298D323
+12636A0179k444F46g292n816J430N754C552Q628J905n786a907p737j03c78I780
+12652A1980E793h669j1161J379e946G638O054p79n476a87n681K54b087C663M277
+12667G940j698b444r310n070N092A126J3259M556p962c155q345Q55d02G356K667
+12682A0023m973b538r481j275M735D91R313M122j546D447f005o595L748A196J0012
+12697A1208q6H84a0899n158N335A976J0508L862p053f68p838k599L948a450E222
+12713H206j363f57p566l041c248F805R839k280C221i694o717L720g57I470r5C719
+12730c912m417j02a031F848N795J516o195b856r477l419O938A980Q488j486C19
+12746a0585n48c786H610P826k271D256e907n724L15M024B117N721r5B429c896
+12762h905J685dA1262N977n339h17j3761k621P234A675P385p21A145f109k553
+12777h662c387D377P378R1l727C5i811o386R77d832H125O053m046e08q251o12
+12793i371a712H370M829m582c479q954k045f975A914P533L417j684D775d168m942
+12808i110J416e86F927J121b36j1443o281K500a892A2481P521l512F564b982k153
+12823e135J507b1B019o98b821q691l802J42e364F655J0291K310p408a473r760
+12838a1233J979f77I451J828D941e919o267l6e051D418M633m51B363d020o185
+12853a0205K41c368D368P816J755E461f359n329N518E208R329p58B705h766q357
+12868a7123Jg388E12O225O4l307a209k083a287D911Q240M257n356a93j2907m523
+12884a7623M614b890F886O49g01r267m758O953C562R910K409k326o307a192m986
+12899f178j683c374C296K312A997g400o849j302e262G743R664k368C875h068l849
+12914a1917L947G15P023J775l713C86d938j823L026C048N134J220C285g332r807
+12929a7139j182g975D549R995j649C768c599j436A287P954L674k064A820h348
+12944a6109j299M822b330F294N672j484A121f355L60B139Q797J912D157f611q423
+12959a5034k22f128E932P575m11o357a079o003k579L512a423C791P11a759p205
+12974h964k627M551D882J1498M411q247B1a1560j66d864B778K686I47e002m546
+12989i548j051L222A098O367P243k189D179f049m283J598E3R364L062D819f523
+13005a1930K948f97H446J574m658c120p002j745M638A102P043L992j932D462d551
+13021i576M397C780P730j244A163i785n304L382b525E354L203m042c952m019J149
+13036f822C0P133N390J588m466gr880l738M220d71E943q63c674q313k264P014
+13052g237F857Q425J963p312B38e317j130K751A238L584K57I51f334n200J375
+13067a0159a337H412N700m086c28j1568l794O859C342P152m4m870a123k042Q10
+13082b355B447M036O68l011d411r079l857J828e794F280R035j512E050c990j496
+13097e486A960O552K809E578d032q601l044M623b019E275M221j138D178b656m460
+13112g116J004HP647L070C937f228o402K085a324H886O086l266d5q661k705M391
+13128g020a518B498K749j579i83m039j940b265G115O395j224E180g537p958K251
+13143a3244d770G118L149m268a622o863J163b781D670L496O41m044b772n254j304
+13158i330c487C467O750J75C142f574p689L664E51Q986J772E395c978l830J191
+13173f617a781E269L280j108A305f037m817j92e172D030O675Q3B727f316m700
+13188a1016M585D010P265j056C177g225l872J677f0G090L244k960B738e815l397
+13203i212N53M142D283M153j086c65p731m57a044H168O403k293B222h683o050
+13218a4733L463d296B978K312m9I30c428n99a558C987P611q3n709c975q331j658
+13234a3964O340C633P616j186D09f821k147d093B801M777QC630d677k363j036
+13249h076L933D191O967J999m947c77r594j583d987C865K590B632f323n244J279
+13264a0288c162F792O059K34n852i28n058k061K770D33N603J31A77f713n225J269
+13280a0669a499G893K726m481c557o329J506a855G553N145k310D720b451m070
+13294f521k53K504A297L720n89a746r209j106L906B015R113K759n055f77p428
+13309h105J11c80G068K540D237f57o564j852M46a647D028L634k986b422o259k420
+13325a1101L876C429Q724J574o174b021m625J671A714N783l78B400f174n966j759
+13340a3899N795a711E851L426q71B124d589j288a261F594M654r74A771g199n633
+13355a2832M370f3E817K088A832e732l596k28M720B126N799J027j046A131d694
+13371e113G00O874L617l958b213r746l930M384b835E995J261B194d374j416K212
+13386c578F02O635L075R11m832c046m780J238b120E125K741l604d749q132j953
+13401a4834N964B034O708n15B798a932j672a106C429O617O94k659C08f870n801
+13416a2671P60N744B212N386l677b750n989J117A50Q280M312k152B318d591l195
+13431g786K793A244N028P57k119a460o036k936J259a873D632K849B924d782m479
+13446i261K652C652Q723L083m360B893e926m181L575b583B245m44b371l510m134
+13461a0015O02b975E207O651P70n964b243n586J919A38P798L198D800c764o358
+13476a0122R71M112F13L661m42an740m929K782a643E663O041N00n395b016m774
+13492f790K162C566N200j517a41r427m836N82O689B081N738m46B496i76k574a271
+13509B681P744K722l581A010i568l418L528b059D715J024b41p512l410L596A052
+13525H039L155j800B827a960k147k63A767M066J777k719d311o817j310f194B055
+13541G221j235B99f358k895c839C885O417K514l540C150b999l081J379i6C418
+13557C864a080p881n317J726e730F165P654j656E754a753r65e6D825K507k398
+13572D934b4o429m985j006N698H00N738J688l494i19m787m77A399P095J764m277
+13588E981b169o930l57c739C892M893p3B263d633l555N08L808E92N150M08A027
+13605c810l509L537C930O563J424m819b302o887j782M933A530K816n51c39n787
+13620f126R3K886B149N453L496k476I49f528l986L485a349E319K449C429d217
+13636g332J335G80O930K775n009d3p061k633J792a946D000K181j567d0m267j263
+13652e570e18D865M790l82A400g272m429J248c058C079L489k826h93m250n54b090
+13669D184N802k226C328b430n117j149L811A755P696k359G92f271k191K142H04
+13685G106L69B656d124l497R37b329E524M867j35D950a202m791j447b334D300
+13701E446A738d157o274p81e548C971P122M70m547a24l729o2hC248J035j658d527
+13719i110k336K643i81F044M932j568B466c982j083K256D430L966l262a625o731
+13734h356k211K920a512D936L515j089B142c255k118J628G32M732K218C572d841
+13750i127L47b337D687M246k362F48e926k811K221h45E315J156C142g96l002k72
+13766d070J953C801O279o85B012f465o547O05e130A486L828j170E87c637m93B363
+13783I153L296j826D685c549o648l207L743b999A313M52d10m523j410a113G251
+13799A4010J736p011H75f519j959K832f40B047k40a880m660l023K574a382F321
+13815H915j254C369c787j837K037D105O872p77n032b875n281j011K699a087A137
+13831G83c575l280j170c801C174O961L626j837n703d38m367K126A379K656G14
+13847e688o229k573K303d335E231L598j79l603I56d92A993M468K006n81B599e522
+13864a1355o41L978h95D473J9B96e912k166b922C680N391O26l102A661c355k134
+13880e489b264C119L158L21b1n331m166p98d291A311L160j257b464l210k95a85
+13897F739M217K447n677b48m978k067K720K278A337F29c917l893j012L491A618
+13913H374K849k495A021d668m67K168B994L357r11A734c524l758K628g15D751
+13929F882k874a601o887k445J600a024E757J403j231A049a848b47C638N777J834
+13944A1249m749a367o216m935J737L769d52B562q31h88l563Q23A419O599M949
+13959A2967r61n946f86n752k79a568C065J347A497d541l893l012L351a722C973
+13975E776j894a13l579a227C879N415L437j260E298b421o668L82L588a921h50
+13991d551l305l274J722c112E627O127K561l126n030A398b59I46M081J381E23
+14007e845q057j059L341d899A218N359j754B10a998A312M737N395K287j913E580
+14023b631m614j475L994d77A630a110n878l135M95M146B030O684K037m249A309
+14039f28F15L424L912J725m202a150p477m718K044M882a096E30g14k572k596b848
+14056B857Q176M615k049F797G32d601r80K616c88F90c681m789k607K09M733B375
+14073H191J803l300B631c458J611A101N120J910k577E67e388k490K442a565C073
+14089C176a467n766j891R93c516D195N218J267m430F40a256b93B721L792N37A504
+14106d655n855j600M139a873C964J012j922a466k226J097B392N871J923k690I16
+14122c669k635J222C33L455J437A644e868l389o8M170A451L651N57k517a391k463
+14138c854a337C961M490J939m081b21n171l019K182a577B410o62a618m960j476
+14153h054K763a519F470L638j100m270C86b671J217A917M520o83A607e159m185
+14168i344j893M130B78M292Q55A562b971j996a217C417O386O94l097H87d526r08
+14184e434K86b96B528J840b08m896l367J114b305C077M144RB742b807n04e33D612
+14202H517m17l403a515n142k974J806b143B069o68h72l990m91K409B585O382L279
+14218A2246l887B278c262l404K904H34L638j329c08n448l761K181b769C011M347
+14233G358k078A854c022j622K244C114M132J475D218a056m605l65K546A027J333
+14248B360j83a814n261k360L307c70D987L903j674B678b804k459Q17A618L719
+14263E337j446G3d580l068M11b789C623K577j557A66d983K31J177A641M578K142
+14279H361l437i17m694k59K204A994L056j72I80d117m106K874i26D622K352j942
+14295E032A151c744n37J853B197L737O24A990d366l181N17L421B188L912p58A216
+14312c912k206K902A047M330J172k261a037l860o51a991B150K599n64F45d270
+14328g235J061a883D787J365r88A000c763j029J552A294M011N38B515c170k639
+14343e809j18a465C105K471j458i5m639l47N94A596L656J425k074a208l974l05
+14359e487b719A512K853J458F45d658j525J198a884C921L540k294A228c033j628
+14374d661b082B979K695p50A630c261m103N89b974B541L558q15C72c834r77J449
+14390c362A322M560J13j561d45m309k68b286A159M689J46G24d139l848J035a439
+14407D370K200j523A959c125j409a556B763L722m11k560b790l693o34L457C28
+14423E039j850E9b704k291b045B782N138j25k650i35m130j022K414A968K509o28
+14439C849B77d685j457Q63a076B971L984B680C68c990J25J616C213L744n18B875
+14456a813m206n46b254A490J822p42e28m040j471J533A067M862J959j950A387
+14472b632q82J447B228K755r37g07m365k474P83b574B638K274J09D31d117o4a282
+14490B923L562J028l535b241l326M0b281F17L686j744a419m125p11N20E55N189
+14506E744J174k435E25c002l50f52C690L113n56I26d103l703J544L088I72K178
+14522C150l89a160l738j68h28D274K462J214l671c31l836N89j48A586K506j750
+14538B342a794m221j354J279C9M526K439l174b79k077j967b035B594K922l61A026
+14555c031k655n69d29C447J695j854a686m060j129K510B01O000N17k462A46b908
+14572c345i4C281L101j881A71d611k802J574b217B702K496j556i48l395J55g48
+14589C263L250m19B457b308l270N97a931B857K409j760A14e096p29K542G0M027
+14605D097n0A659c321k368N63g26D379L161j92B742b784k366L20b168C010P60
+14621C770A373b896k629l82K001B082L432J341k651e43l505a972A645K462K333
+14636F440k006a815n255q39J973b03B952R59r19a652k361m02a122D646J879J34
+14652F659B753a649l216P17HM087O41B360c889l184Q0K570C81M442M27B263c01
+14670c849a893A178L821Q87j596H21d825k761R88a791B528J17D63b937k630J393
+14686d174a156D831L212j145C333a964k669l46h51A305J680A342a970l612j234
+14701f816c380A962M112p66k253e93k933N98A20L768J943k144a594m428j408L068
+14717d362A22L464J849B381a263m211J343a366A812M563q27k169b778k190N62
+14732d406H1K261J082H91b884k791p25b740B724N632m77l839h79k493j04i16B013
+14750D088j864b262m297p30K370d21C257M021l364A275b059j7A081L029K325k204
+14766D231f73m463k501O56c362A717K227j087c93l543L25a213C630N231j878k726
+14782D257D3c454j036a580A418J312B61c423l369r45L043A090M130K157l022A083
+14799i94j070G77L700K151j725B86e078k599N37L006a76I75M1b285k306J645A26
+14817D933M158n65l841h7l205j748a482A476J478A3c393l110q05J352a306D128
+14834E634j159A812a434O03C86L998K020j557A074c551l679O29b615I29K705o05
+14850C029h72m440r2b376B713L376P29l386C15b368n24b12B892K062k192g94m848
+14867e642m64J105f12C589J215B197b821j497k88b181C351K925r24k294a938j890
+14883c828J685O31C277R44A780a809m821L41K351a87C048Q93I55b970j486J411
+14899c045D15N394K833j722k678a132k216q39a106A173l77a475k702l819P22c201
+14916A123L834o9j285C44c64o2C615L556P65j906i03l996k691J154J297a281F82
+14934e55k772k542K220E21N649L178o54k481B475D87b32A296Q79q39c037m624
+14950g661l341q73L960c159B003K408p73j182m53O63L557L324P60l903A264d066
+14967g755N91K817J388L03j530l867q9K423e94E848M563N05l427k421k427r14
+14983A727J627N13l08h27n592m580j083L630c578C87Q27J30a042d82B169M098
+14999F267M686M7j834C478a447n079O12K024J457J157l052l420p69J088b136B817
+15016G177L25k056A232j23J829K035K053n28A881d303m029j040J602b696f75E46
+15033a498k123j61L43B071M660L204k479l268A183a302A1M95J962p78c048k977
+15049f025l443L78L852a17C769J274B294b17j489A161L575K380J74k391D51d295
+15066e175O34b200F98c62k187m218j091K687f93C852K455j15k865h25q91A208
+15083C601K822o61B789a916m216q87J498a616f57j578q54j699k51a780C321M702
+15099H023J957j467D159D51a005g7A277J275j142b968m134k696J006L919a087
+15115B990N50A393c31C33K679M202J924J38C846b54m765m3O98a424D5a241l207
+15132d448l269o55K471c18C878K635P20k964j235A060J957K262J39j743h00n388
+15148f188k965L2L028b837B17J82b155o57j12H89M455N043o50k403B524a210r32
+15165b142o85J190A70h96m210m028p56L358a403C264K147P8B310E20A63K611M631
+15182G405R62k397B641b435m102q97P81K851a000n96j623j212N47a531C575M122
+15198G697K83p90B792a101c82A301J817Q97A229c292m943j507O40M338E81J948
+15214B529L78o55C66N91P09L447K367n84B844b185k133j05J820A75O99h16l445
+15231d261k484j229L777A372L181J314n73k610B86e40I07K536J240q03g0l325
+15247c395k895O06K081d37A20a615k678o88L87C01N061L465R77l546A699b195
+15264b637J018A05J318b74l464j629k393K834g23A648J686j17A074f16E5K447
+15280B502L380J565k099A719b384m285P05K108D75O10L21a848l425m17b463A451
+15297D106R29j320I10a25B77K658K518j46A345b178m374j299P92c510E99K287
+15313B886I89a256k327K86I90K067N371j328l121H09a760j010f24H65e6j196l595
+15330d847k004J474K226B359K891J45j362E66b083l56c03D842q3r88E95b319k777
+15347e096P20a445F10N45b98l122j112J860i41B993L091j084j392e99k772a371
+15364F95L163Q17A889c150k138j857K034a699A311Q21A062g97p72N79A486K619
+15380D105M47L32c6l597j612K226g1C155o31G41b631k766j65b381A534K531N13
+15397D578A645C00b174g54H04K198R42j453g97l143p13J557i63C399K26d68k227
+15414b695k637J383c09C568J930J17B445d18k600J147e6B445P14C37b930j696
+15430d626O30J894E66L352K27a81k007j333O49i1C688J221j004E83b737r08a646
+15448A03K034J181G45b398j604M70a266B830J454A743a71k284m73J450A761K337
+15464D098R68k038f80l739n64K433a00A729L8F78a846p55k19C15L069J569j470
+15481C483B98b880j607K071A586R45p3H33b404k542J786h98C147K003l94A927
+15498b604q25R02c09A798P57j107i19l405J035i15B188J877l92B90b375j971J322
+15515c024A91K028K237k056E85b940L93R03B36M017q78j507B38d139M60a655A930
+15533B917o60g2l115p9J473B346J556k89A111a205k812r79J701e07C255m20A363
+15551i34n05j67A919J113J190j705a225l233K33J072e69A921K4F65b132j958K85
+15568c805h49C218J171M40A157a655j239j58D7Q52J525n58b402m38m05e15B036
+15586C387K39A188b760j130J004C47L054J560K52C98c015n7L94d93B442L39I14
+15604a112k003k58d11B112O78L5G48a507l05g33A056K761o86A461a658m121k72
+15621f051K412H70J706o42M86b30j791l47b61B747Q2n81e75k834J101b81A659
+15639C492k41H67b233k213o26a063B027J987j009A016b071j311J143H50J616J511
+15655C977j324d86q95k848a608b02B121F88i23k480n76J430A216L714J008j088
+15671D850H68c281o38M73a366H72J626r93a072j675M97C85J540J332k67b57k527
+15688b784j240Q96f45B339J660j857a406l120J472g87B260J792J98A513a618j551
+15704c169j744a822H5J311k35k45a756M76A55K864J251r12A048b608k028k53K385
+15721b504A319L273j321A000a910K08q96A4K125N91j030a140k529O64J469c0B801
+15739B293r21e63o82M91B754J089Q82B250b87l463k243J479i14B244L76N00A042
+15757a136N56b70B326J832B015g61k413q80O45b89A982Q62j291g41k221j25g12
+15775A387K612j4A273a731k425P43a436A310K474j094A43b234l12c79A021K85
+15791A306Q2h05k071k633K268e15B679K511r03j909a129j203n03c44B032k69a74
+15809b066o35j070M53D54K974k79r00e40j538h27G06J653R93j113a587k289j15
+15826c991J109c22B861J273A953a141k636n24a222B6J109R93G88f58o42M44A917
+15844C889P43j562a178k220j778J920f08H93p6g14j454j766J167H07L054J200
+15860E061j095A374e16k202L47A061J203n2e9k723j593M55J230A414O99O4f56
+15878c319p11J296E58K764P80N59k152d12j901D81M37P29b68j521k811r13p25
+15895f238b263A361K701J98j008A019c14B080J485J413j85A556c957k360l34K602
+15911d049J695a086B172f4j210m96a08B429K868l09k060A265b200k46O14A55J681
+15928A836L12A86c041j899L96J952c72A787l89H8a820P17A086K689J665J013k353
+15945D100E70a959q35r00f35n12m92k723j875J095J238G59L772K932j033k557
+15961C873j082c68A358Q93j077n30b822j900k901J075K494b43B190l60E68a155
+15978a511B12K909K494k2k241A001a616n82o43A01J535a86k062k120j621J156
+15994d833a596E82J493K99b2p78K43C015K703J194j042k926a457l147j404J376
+16010d632J793J098K2m21j440J55c25B769K695R19k307H36h9m77a13A569Q88F31
+16029a019l102j862r2a967e53A238K19a155K43q26A91K956J427Q42B603j058a005
+16047g24H2J292A32a796l126k420j176L984a653A968L551j56j860j423N0J632
+16063C762J369L48o98B7b835k338k01R78f35l2j858n9r44a721D6L655K520L43
+16081F564j927F14cp83b89B404Q31j235b097k370j894J228Q62a445dA96c25E4
+16100A722J961L124J296o03l168A91b805j624J042J054R12k119j403r56O0J774
+16116d065A285L502J008O61k518r10n63rK007j778c11l753k090j136R19c074a94
+16134A175C30f67k087J159B26K647K701M12k796r64b53o36D14Q73n9f51l576k881
+16152g108K58K130K251G45J998j41r53d63A203K498K642J308j671A604a673k300
+16168c973j728J025J134l77j31r29J139J073F71L000K044J251q97k840a3C15J298
+16185A613J134J08A57b541k877o51K148J348c08G11B33a183M57bA905K611K236
+16202F752j444B546D75f97p27b74A152c94j405l286j974O88K166c53F45K544R01
+16219D090j397j176J383Q9J916P90B538h68l541j658J402J798a430N53j313j504
+16235c694n89J224A358K582J943J12j539A245E54K6J659m57J23d85k204k682r54
+16252f325J198a504D83k34J69a327O04A89L832K640m61j416j925f06j384j108
+16268c098J033g56m76k153q95j797J359a657H88M241j356m53A095C01J613J010
+16284B924J208l51G52b218l417L49K65K293c18A67i6k042j149J628A152K946Q11
+16301D909N21k596B37d89D76J739j031k3a625k121k581R49Q94d77B121L00F10
+16319B50b85A246K106J880P98j697D75b512j910J397Q34l1h69j091k108K65J302
+16336b501E77K959R92j93k035c49j84b13A096J769n52A50b144k131o9J740J243
+16353a361A091j26C92i67n33C56J360J269J433q35A703C40a914I3J784Q79H42
+16371a608k291j055K19K263C57J450J191I75l93O1R72J326l5J789A696i41j891
+16388b832r44R7f26K94C52b327j221j40R22A748K612J653k747A332D72b626a96
+16406B74J436o34a22k803r61j15a916b12B036k49h89l00q55g55A074L108o82j61
+16424C339e0j625l48IK30Q61E06a269j873k85o36J667A391J300K50G78a105F1
+16443A943J812P57j560I28c334j004j41J204a021E79B47b08j692j24N35A224L517
+16460D741n26B048f72q93r8f04H76J970j281c57k172j338O61i06C57J859l47f3
+16479f45r06@B234J363j95H70g05j107l9h0A140M44H0b336j895O15J501e41A762
+16499C422r08B19M82f68D82L66K025p46f17k619p4M55h65B349j99n44A3a711Q5
+16518a626b15A176J215M20I60e67r74l41O72A171J528j28E20c014P19a098G13
+16536A266k27m37h75j737J283A011J518Q49J76A450f58k294nA69L91J579G25e21
+16555b006M1g22A801J573j533j18a378p39r1J095A051K82n39c83j752j69f00A42
+16574C295j99q51a008j054j425J374F07J160k60e8n48n91g7A011J616R37A613
+16592d95k659k79K09E68O36J034j053h77l17n71A461J764Q06j867G2b982o77P98
+16610b861a128H79m5f90k89n69b15B064j5J137o35d28j323k284N18a563A708P22
+16628B430m7A143a634K23d3H85K524j070E77a920m25OJ026D04J441j0E65a852
+16647a587L50A130K170A263E54b415q46J88a136A106J125o68O27A33g61P3e3A218
+16666A084n29a964q17p89J303C27J887J977B026E14a999R69H34O02K88C9a207
+16684b897l69R25i35A489J373n50F13h46L16A042K27M27m61a164j797K51Q33I16
+16703C261L26j258D82a765N20M00L46G97J6k88a74j379j52b70B082P93n82A074
+16722a857p36N76A83R14O27a94j650o53K00E96J024K327j005m39c36k414r63J538
+16740b175a036A222m47i62p87c05a51B518P2M82e03k22k223N78Q50e23H35N54
+16758A389a88j511j40Q57A683L47K064A960d67k885N86N11A220k16j66A04i24
+16776d18C65J007R86l13G50c09k535q84J572g79B058L19l68d90j042c92a88A064
+16795B135H17a736j731O06a313a17A304J671n52l07c77p02F94MQ30j74a217k466
+16813c683p16K176O07A748J440K05A635D34G9M87R25L80H47a305j364j347K91
+16830c725J621c11C026m83q08F74a140j05I62J712j102G32b193n22N89A34P19
+16847H53J945o58o38c11n97l96J46E91M62M05a670o24N35O84B284J932P30j874
+16865C072b5j426m15L59c20l29a16j234J64p65K42H60J227J971k17G71a040j684
+16883b724O06g04H82j1g30j912n39a269H30J733K02o07C29f39j858m4e99A55J411
+16902A566m53c75j051K9G56K086N29o72h98r51j640K0J263a38H85R9a418k40e54
+16922C28J434J878L31A104g37k309j97a344H86Q63o95a256o85k09e08F30J128
+16939A758N5H04a403j29k81A15O85J737J03n97A85a782l17f17A513A57n2c453
+16958e399J818a518A303K282k7o59r41D38Po8K95j5n6c348j000qK77h71A328K05
+16978A533J110F51g13A049J132J106n49A255a2j903j599J375O62f71H15L8B30
+16996a034o63K85A98K281k7A45i46L21K16A997J648p71p67i93j515j261O62J98
+17014b909J025e52b02o26j097h89I69K595K337j103j828B12a825M49k97e71a84
+17032b229j614q60M50a260B405P40P20k81A714c82p82c69A392O88q02a427o07
+17049b034k71N13a02A336P82e60j888J007p76F89j27K524r7j477G43e71B89P00
+17067I89J586k28F10a257k131q09M54a360D3P27C31J04j39O86J734J460j52j276
+17085B748f20j247j061N61a091L27H03j23a366m13j36D25O49J913n41I62f18C86
+17104d48C65J539N69j074b00j133j603Q09Q85dI52c65k929J76P94i88B913J084
+17122C997m19j353E56K43j02L94f74F34a225j534j531l41J856c92E22J278k91
+17139A509g27A11j8K401J116K95j217c37j481l44g96K09b38F36a680j423j98R51
+17157b350f65H84P39J019j167o70e09F89K150P26R09k128e90k674q65M01J254
+17174b474e87p35j157R02K9gB096J319K032m30j976C91a427k80a69K5p98j655
+17192b597k272R11Q42f74H4J208O82r50L77j0J38J28R25L02q76C86a953j381a541
+17212h81a83k88j745j099L93a104b34B432J171n76q05L80o58n23R0N19r39d60
+17231c263j455k54K090J331C90A77e20j445H8J658P38K063k8k118b73j4k489J92
+17249b584K42B98h67L54k141j25M71f50B487Q68o65j233d90q1H55M17J793A349
+17268B21a172j332J87j069h93F0i85k62r11k75K2A087J113J814o51j250H93h99
+17287F18J033J00d26q65j887j633J550J214A9O14L02L80F01J14B32K763N69J12
+17305C676j469c99j851J19O27c70C21a055K23j955O02N23Q21A295R14I91J56E10
+17324A53J068K081p72p1a017q10j744N25N36J187b36c9j959M29f39G6J691P01
+17342B468P68n67n10A66f10J5a20B77d3j184k727O37R78Q25H20O47J10h43n05
+17361a348E12K66J435N51k77A104a48j626N3N10H5J331g7j828j699L10J439H55
+17380B471J004G40C45c39F1J371k4j81R3F0b432m31k06J109a65F62c72o51p14
+17399a737O12D04K054R68L7j635q34g70o9J99G3P32a68k524m73J51R51eC23K069
+17419B392r35a47p16K87a89B466o43M20b53k301h81m72j56C71i97c01j391o46
+17437b338P80m26I56J837M51A565m25a20j725H08J264O9F11a642m84j175Q38N07
+17455a956A25e98K70k51l47a75A330J084J645j68A686f32j286J69P92A153C29
+17473A12b542N52k34c01a11A877K10m63F5f18A00R22Q56jJ53e64j322j560a441
+17493c85G68K51b62j973N50J33D34J518N79l22j34F06d0A82N56O44l48f6j214
+17512a280j646j67R43d92A310J205p27a602g58c69A472P8P57o19b91j500M12o09
+17530a988N90A33jP6a184m1M27b86A275J498n4A00a391l03N74F53J157m62C14
+17550D11a883L34j61A3Q88L2A26a058o15m84i8B261J102p16G33h27L15N3A115
+17570A645k27A6a261j380Q02D7a54A148R74j85B87a949Q21b66B588q4A39g72j474
+17589b246e81q8A451J320j201j0a189j477N08h83a27e2H17B86a187j240a167A020
+17608B789q70E20D8a454r03g69a24A215G3h92k4m33o32A067O12N92l12A3a459
+17628a229n93a97A193m87k24b246h52c98C01J755n40J90A02b249M82N42a65A497
+17647A277E40A83f6q31F91L8M1P56gj551j988J762C41N97C38M32A78b58k89B61
+17668I42J068K7F00f08k503N55a169C13N58M69A06lg48J42A288l20Q8D80b361
+17688b031h41a9E97B01J483a62j824i68K08D04J848A059J87a274K94j718R27c01
+17707H89J710C45M08g07b65k4E57J039a86j145q17k54O87D42J768O53p46I81i77
+17727a064a13B25q2i64r81M00K23N59C58J115k74j03E18a17m12N0B68J291p23
+17746H36l81a886M04n28c20A778N70K75A144a45r75N04k7B44r5a69o77m47p7b65
+17767C12K870j147r29a115p89k72d16H98A76O64b27j496b93A166M42n2k35o50
+17785F71e52j804M33a73k70G22M29A5c55r83c77A133J464p56q23D2a293j299J26
+17804b466a42j24B42d02n63J76i1E48J380N94j177B33g27k70l14B26P56B96c13
+17824a344e72J54A36J044n6k93f64q91L43d75e1A700N0k91C63f75h9A20J532J72
+17844A824F94h74n64q28k50a47A149M67K52G82B37H5N07K05k80m6e19k00k357
+17863c076J035Q45c81A229J440p17E3d01E28J093o07m99f04q57j74l93Q78h2I84
+17883A596j95b26p95K09r0A327n68N74e07j892N67G8J223L03n18G9h78l52L65
+17902h65j15D08L13O58F09e08j84L34A017J38J069H05d31j008l07d00p7H74A50
+17922D9a098a46B45N90J625M73k63B27e57j729J34i42d00J29O0j458J99e28H20
+17942B146L4k50a35A99i05b58j00F08k98a6j039j935a487L93F5J499m22J101f91
+17962g97j93A70Q37L81a06L7r3c8n88B37R26L14a28j532M41m90e14A424J281m65
+17982B240l98a93D39e25F05O73Q8d50j659m24J43g46a32A538k23J83D75a21C58
+18002A642k52E74O47a769j039j004a738g07b58A486k18fF60R66p83N28l2l58h82
+18022a129j036M87a38I44K007A257C52e69o19d12C36M86L30f24k01M3q36N33H10
+18042A582N76B11d65j263b43A9R83A29L00f19j051g12b30A343R12j01E82f29j051
+18061a680j20K32D51K47c06r01e11A60P68M04J177j003b00j088n86l07f13E17
+18080A055A13g46n81J21e42A237Q30N48H45D3f17K70C79QK23a48p75j122J40L67
+18100a538B80J039J134j156o33g16c41F85n1Q23J87C91d71l12j530R89A41b76
+18119c08m24j047d61j2a65B025K79j54A047d28a08C62N78L78m90a170j571K66
+18137b475M76R45b1B037J83A085j24K19K93M1O36p86I8a911q73N75R78F08O06
+18156A214D11c86p87a65j179A421O94o17m41A14h96q83d9A59O68k03g44k25j861
+18175b830J180d7G37O71o42k07h88k72D65L55J730A263j51c28j307O99m5M8Hd48
+18196a682L45d84b19A384J748r50r23o03c10r32d8j4A215c46r82j93K14L18B04
+18216I11J116p24If74K30m17A646m1k14i41J13o13A51e66A061k15B15f23J0j19
+18236g32j784d68B22Q67m10b62o96p08H18L26Lj13b48j81l54K38b65A82k1f85
+18257a269J37jB35J264P6P75j020B05e52n14F1J258l7E20d13j521M78g10h3A246
+18278A301K10g45mm69c52E70J933A113B73c0j055M81D12A62K80a19j085p92p40
+18297b736a030D64O02N25p7e09b3I3P85L04J524q31g8j663LJ1c83G53P2L02A59
+18319a873c96l13A305L04E27a87E9a015L90E14J316r10a49p4k281O91l57a31G14
+18339A731b9p96j29p2G36M96J22j30C08g06n92b83I44l8D36A04a231J56K15C62
+18360D57J311o69c40m55r56c09B57J216K96n89A15f50j058a21m83j17A63f85j97
+18379h82r86c72o4A164k64P10E43c59p77E95j10J159j47F28J83f05j035j24f60
+18399d87H78C83a197L35A030M82R41m2m42C41a163d71j69F68k73I3g94j078o37
+18418b509Q16G3J300j33M32n63K92C31M27J097m90C70j31g59j49k40J58F50N54
+18437A204E71a007m61n9e72G26Q78K2O70I73l67i02K15J51I61e7p50p90j56o6
+18457a819C29rJ289O7p55l12k03b11I56P46l21F26c07q41q54q7b20e4I35f85j83
+18478h68K43D11N30O76j80C25j42a83j075L40b92B82a0j19l18j212M98b05G24
+18498B135I75M4b92p37a92l4E20p3A75a298M61n21L65A167n05J265A05d38q4I3
+18519A60M41J796G83f54j283K66f16K65C44f57K61a18p92J53A08J019J33n91e69
+18539a291q51R93d61C55N54l32i92j95q5l25A074L70j9o01l22k32e12G41L43A16
+18560a099N28j600N48M47C09P33L38k77G9d70C38N37K09o2J23g2r85j39K03K31
+18580g62k20d62k99c10o64K50K93B421J21k22H36c46j566b91e1H97j95c76l41
+18599g17j388J001k93b19A176L34O55q03c6k41H65M00m65K24a093l94j037N10
+18617b014N64H17k9J26c92A94Q59C59J634J98n05C23h25p74K37L36H23c41C63
+18637d39k316R65a97A427n5Q05r34m36g18C60j8K65M6B78a64k018O2d31H13B57
+18658A123m70B81e30K32d7H73O05J72G67a116n02M6c34B02Q2f16l6n16l20G02
+18679I88O69k02L00E19e5j027N01F27M58b70o68j182p4O41g29H73N59j17a25B03
+18700A233D93J099P9n51c50q39n01K31L38E6Q39D01h59A35h8B34j04J705O11G95
+18721C42a453e98r03C2N5g68L2r00O70A28Q12L38P39j93D95K19b75j150E35c57
+18742a90A115g11r71g82m90F39O68D40e00O9p14G78Q31B20J601p89a88r92P5M52
+18762f53J26E55k35h67d21r35H86j7J058J39r16D52e05q95N03a02A151E29b015
+18782a403M71m88L91A63J36K261H88b47n6B39A01M97P19D55a335l66j107i64A88
+18802I44A53h58k03J31r6C95P41R09D94j17d93p92e83a12A105c2n85k4m34K31
+18822h44A44J307k75j81C12i72O6B52I3N41J374B52H3a693d79l28A280l39C51
+18842D15f76A94a035I51l24L99l11d34q82m86O49C33n9L76k67e53p23J62b10A062
+18863I57K46a70n93q61C16M93K03K98c71l51n76L09C99j52O9O47e96J61a97j022
+18883a219E02P74Kk20m87a183L01D64R6N32B62L80h48k82b63k89A63J202E64q4
+18903D80i14a20r52M73K70C33b29c0A47f48A00O79O43m44h5A93i70n5E84N13f12
+18925g23m97K44j04K50E55M44l61K23B74c29E34a55G51J90K14j76a330f43b64
+18945E72M95lA78h36l98N78B03J476N80r26C8c85l74a17D0M35O50C00d25m94g3
+18967d00m41K21A23P1a395d30o11C43J175k87M26b55j36J9j64a34F86H4e97A30
+18988d97j165A17P58j92q6J44C9g79b36F03L30q4k64d61j058m70b23l6M5B92b87
+19010f71J34b08F49M90Q61n85m85C66f59a20K1J9C74e01o30l83j19e15C73n3J073
+19031A393o4C08d02o91e20A262D6J06f53r39N95l1A26L99K04k29B25b35I6h87
+19052F31L77B22a074N06l59F42b14D08J70ld30k096M56h55C52N22B25Q33a5l04
+19072c19P7C65J95o0M74b12A88g12L32a22A639a75m21i0l96j47G32Q45G06J55
+19092H61f56l66l00N3e52D3P52p7B51d75D5LL97J057E78L4j92d66o69K67a53B67
+19115b29l30j060K80A03j4J358l70J79l24c83j176d96F12A04g91c89a17m33Fb70
+19136I32J314E68f26a14r04L84B70A14J429B46a077k16n8A28b13F75K76I8h11
+19156i18c14F05k9P69D53A89e41b39m10E30K38C83D7a875q0d94a34A159K31n45
+19176H45l54c06k05c0j56A042j99g62j30r13f55b70O0E46J38a02j770P71H52M76
+19196A328m79P08b45q5m42m68M26a52F69c06o41L84k76n91A99J514o05J29b2j58
+19216a80r94B3J155m94G9J5a655m21R89iA047n17J42b58D78h14A88J95M95N59
+19236A437D72g25m00j65c9A06M96p4d07l67L11p6A13R24J87E01j45b84j082E24
+19257a19C81a98i2o8j139K82b22I54Q76E04c50o84L78n76O05H15j38B98e95n33
+19277a128i5E49k51J42L24K6h14n00n35h79K34C64q2c68j154a52l03b0A417l62
+19297A055B63i80p06k49d33J69a23q9a06o86j89m32B52O37m38A75c09j54n47e05
+19318C05Q04m87P55C32a159d18J6C91h5K8m46m73d44D03b75F81J160G59g92d4
+19339i59B53MK99P0e91j072N83K02B52R75B30q9L23g33k10H24M27m21l80g74m0
+19360h14J64r58d40B70O77A5J2h12L42D19j48J611A10O09d98l53d17d5D61N00
+19380I61D73B20k4d58A79b5B77O71B08K37a624d64q1F57j85B5c66A42d24p37E17
+19402A50J40A9Q29b8C5b37A90j2L08q3C7a070n0B1J75K98J25b92l3I46C74L76
+19424G50J526p6C11I0g76o19M54b53o29E21j07a32p02D59P6R86n35D4J68E2b230
+19446a005c86J25k9j85l33K21p13c28A432L68p72A40d42a24n37B95f4D88a88j49
+19466c37j103M88b14m29f7l61J65J17j287e52A129L39N63n6H11m7d91p22J57R9
+19486i57A07a914M44f34b06r1F12N21N19E65k23L1O65m90r4K7g46j566l29N66
+19506b075J51f63A86M75M54l24L66j07L95j09E18L97f25J45q89j18N94L41b12
+19526g53r28J91M86C71M00J435n65K73l31a211b22A03K07O81b82j108d37l44k34
+19545a015J65B60O80g25Q5f2H97M03J00J209j182e18q15j227j96J040M25L34l12
+19564a269L71C37p7J391N61P58n91A042n14a40C2L51J48d16l50r79f20b06F57
+19584A439l6N66I04A30f54a15r38B79c42n48j18j093d33a15A082B97O63a53k8
+19603a81C54h94e9A539J38k89D28d61n54q96Q32n91B9d81j85b33m4G59R10j95
+19623A474j68R5f46B18A04RK6b87k72q03k12L96L06b46A183M54N92q42A60J176
+19643A336k50m20B50g39n76j540M23R49g11L12E19J28M40a62H7Q02O14J84F67
+19663B12a050m18J45M76k50c40B16a786P90b22H7J250M7M7n42B25a314d90C87
+19683C80Q19k45a251m84h43j698h35J65B69N15N77m75M12J76J117o45H86G4a431
+19703b265h40d14j099L52L71l26Q7B08R23J277m6J43p44D16b61k39n48j9K96q62
+19723a633kj69N4e24H28O48P94J62A115l16a8%n81B56O56f48oj443i94d50l61
+19744h11C18K51K0P8f17A79O03R96A72O09a38m62B33a337d40J12F76f31k77k49
+19764a157M54H15K70M6K26n9B87d8F9J74P05a09r69k25m8o56h76b42C87B7J002
+19785A029J077q86qK9N21o40C39f22j361f48r07O67i0F54b04bn45F97O5J70l91
+19806E41B02b80C81a463B67h4F46A75b98l65k2k02c5H53L48E15j64J72a14G08
+19827G25Q8A21L38j22b223N87b67l37J66C97e31b5A68m2J346k90M33J84G00i08
+19848a328k28b28n66q75M16c91j20a69B07J628l92K63q02a145N6b06l38l07a65
+19868B10a793M61N97A53c5D18M96C62L83e15J23a17A091D19Bd34j490N29M16A081
+19889A805q10f55b9m41p61H92A25R04J32a92A100D36j17l4c54D74e01o58J14l19
+19909a364A67a59A340k51M19j13B16a88C41M3O74m2D9b512a077c8m56i5p9A95
+19930C37K07M54q3k08P72F94g08j221p47N12a081d34F53j11d5k49r3e5G83B19
+19951H96D33d24p05c61C99Q84f4p6p09Q0c40F4d31H73B09E5g61o36f72a47G50
+19973I13FN96d81o38M18c26E89f5C64g11c27i9D16R73L48E15P65A79a01Bc54B63
+19996A055m34a14l01n68J62G17k94h1C9d87B00b39m7A934F92k04a158M02K43j05
+20016f18G63C12J221o79b95f5k59l78J08A74JP20i55Q9K63D57J61k69J176o17
+20036I08a137K87JI46jJ59c6A22K8M98D4Q87M60D58Q3i53K99k36c26a38I04n5
+20058H49a015a48E21K75J096r00D63e23o70N07n62M23F27A48a00H01h34J39K20
+20077d75B57M28j90L1b38j163H8K95a9G06R0l63c26B7h72B31M98B2c55l35b86
+20099d92m35A313n44r7lb4n58l03C52E5L23i41K9l68d89B10O16L03M1P60a55b3
+20122g0rI38B34o3b94n88r3c59C44J280F55B91i30i6H22j76O84l77j90l27b97
+20144a141m72a6A474j97C27b67o33c53m51G4L88d6D15b09j51p42c81A074b17Q6
+20164a31m27r4j39m3G08k33K59B42a040d83l71c43C73J136o43O40@i81M64l21
+20184h38B83R5a86n25E71j71B6b64A501B20O11L82I7i11A31Q9P92d44p28L22p45
+20205a595e02F14c66F62M1g60j055c95j41B37J212C81J02c71k20j13G4L49R61
+20224A384d87j006d85p42N41B33q2J700D40A78h67a80G90j60I8P20b0l26a6B70
+20245e8C64J68J39i34m00O05l04C52L68J73L61B73c47C37k6J52L22B20b32q24
+20265a056r93f76E50B63c55J32j24m80d3D33j81J064C51A69h6p6j75d6A56N29
+20285F85f33N2j81l24p5C94F6N07A72J38f05b36G27K67r9L36d2j03n30j90K33
+20306f32b67H1a001M33a75A24O67b63A662R05e30D57a41Fa33B77K6d7r89k68L68
+20327i36A37f85K23b25B99g85J19a03j20G83j9K42A01f36L04H53l46j91O8F4i31
+20349a277R5b85B79M33O38E45d47J78h5D35P09D69j06b92j574M89K61e25D03A90
+20370e67h2j266c15G34B94J369C49D8b79m42c8A72K47R46e03C64c89D43i78d30
+20391A00D6A0h99l1B03h83A466E30R6q4a20o9p64a74A08J10e18q91j41O20a48
+20413A353E64j32K36N64B20J19A51J52c8l5m87b75o64L41A66LJ075e26E97a41
+20434h85j85F11K40A11d14H54P2K46l99J91k04b76o75j000Q15n41g23Fc17F53
+20455H63c00A400l96P87R1i7A03d60j053M19d98j324N50M87K32PD55P85M49n8
+20475A631j89m16D45b41A39b45F65C09a94l77m54b03k17k65P3A090m53A03a95
+20495A126e40B74L84p9A20hk10n69b34A51a015K29r52N58o15H7Q98J318K92A061
+20516E93g44a49F84q2A34e35q63O64m55M11K71I12k76k40N32d05E97O50F14M5
+20536F59C0a061p15N05k31F66k17j02l3J58J31K89C25J97b83n2m33Q8I1a41A000
+20558E97a35G05C3R47b8A395A16O40c96j97a05o50L32A155C59Q5K00g7m68B60
+20579f09D62a11A163A0L59d4A60P99G6O86a38A43a247j33p4d18n2b29B38P44k48
+20600G34N9Q73R70m58E39A49c44j400o9L68k1J81c85m27k66a23B50J447N49j61
+20620B085H83B10g01b74g7o73B8e79n66k83e46q82A270J23R50F37J98b62l62G97
+20641C12J347I5c60n99L00n60c09j080H6b72j47p05B20F4K45R26N85G46L30m83
+20661E93A16K93g52D1f87j426O27m61e52a09C15F2P52K196A406q0A92N29k1d72
+20682a529j245R60r72a289c86J01D32R25A86N43B77O77O77j32d32q98e04o26L65
+20701g65c14l36M3QB32a81l85A63M28J211a00B00m4M6a76A083nG6c47k02j68a73
+20724i36j10a45B55g37A89b4A538k78M68J52b90C6a670r8K82o8k37a35j71k57
+20744e63D52O73M51K90J71o24A88n5i78d35q45L51p56J37k10L02c13A122j25N74
+20764A571m77J82a113b68M1A014A51f18j62J20o00i9m56A026l45a68H99f67b46
+20784f29B02O31N42n47D2g98a40C43J27I5b22j157J80N0D50k07P8O49M86n91l67
+20805D98J07B40e59C08e83j25k245a321j292h73b36F85Q50n24j36A99J165k00
+20823A164E2M6g04r09L94j142J083c9m24J09D23j81m2O08K91m80K47i55B3a309
+20844a107M6a05C37h25K72e1J8A30d3G96C40i7A85a52j4l15a07C75K63b57o68
+20865i25i8n79J57a65l67a07k47B93Q07D89M68O30k66n74G5e72n7n64J4J71d23
+20887h63K89A53K01J72J032J07M5q37A12i95o70b50p40c30l88R8j274P76B06M44
+20907F50N84O00F15B4N83B79b9l81F92h72l94C24a684d38a24H45p0K39m93h42
+20928H2c35E78K77l89Q00f39k98K01l31a2C28g14o87M25d58A67K5N76Q23F41j65
+20949D76L09k41J75J44C27e39rj245g79m04a11nA169E33J99o8M15a37C69A06l3
+20970G3L08d08q87Ka57H16a113A75M1q8b60A351K76B51M85A58L2g29A8f11g2C23
+20993H00f27c0l64k58b13A77K20d66P1C6J62d46G80l76R5j09g5A77L51e0K2dj51
+21016a55p42l96K05m8H65J74N09n73d59D13P8c34J6O6o95k84e20o24b93H43N4
+21037H97B42P92j84d85J25k27J15B28g5o38L43n38A96J92Q21j37A21K0c79k90
+21057f69qe6A20a77m1j70a19F84e16I30j7j89c8C13f88J78b37H91a21o98C82J72
+21079E54i51e7B63A16Q15l02B14e43k34E07J46b71E49g45K90a17e7D20O7f0r8
+21100a58k96l23b39Q0B17l4N24C43a19A52d4A182j69r8h07k73n23a13q2D51A33
+21122F11a96o98c47C17H4Q34B17c92B43c28J01o68c49f1G88g27l83C41b71A023
+21143E17N90k30A34f46O5Q2LC48l6h8A46g01b37A20l4M42l1b32Q5r77b45F35A25
+21167E19R41A66a643d87C87e29C41P98E7i44H3g28K7C62L31o1c78j01C04f47b99
+21189C96c63a5l79m57b47I29B60P08Q3n25j5a074b57bC78M86b2fj011K47L65j37
+21211e42D94A17b00l71b07q2I5b77A354D6a85D67a233C7K02C4K88a67E11N1c53
+21233i76F65j27J71l54b80k75a79C28c07A493k00a59k48j012A53L6i8D61a257
+21253g47A42c34dG88L19C56e95k01A117A28P52f48A58h20g4o96C78J92e93H97
+21274a23G09h35K59A48O35A32L49N2f00K32j19A64L36J098B14g45B6h75m94F89
+21295b75i2B31c0l41a01A191c47A173l62a36k91J71j154e09j41mcm68b4k19A141
+21317C34M63J07C03d08n9E84A1M91A1J388c1p63k26DO8N30R05d81A091a024A28
+21339@d69A2M40c14j2B51a048c13j3n5C63g02L17J88k73m96D5A6J042k08B49Q69
+21361A118m08K33B85b93K3n58b25j320d48l33L40F18B13c49L1I05k29K04K81g81
+21382G0b51k44j40r5c13k39j99E8L57Q6d26H79A44d0m66k48O6l95D11M13B99I3
+21405c98A41h61A07e01b07l37k98K92n2J31A370o9L5n1O95H53f58I94A86L91c97
+21427A68a660g12n31e3J7G11l06N35D15A27f00G53E0b14A12a140qM44b04m29A98
+21449f3I8h81b44B00K34M61a70H27k71a3l41DL40O74a34M0k35m09n8J12n01b01
+21472e47J68g0F38Q4nj42J495G97d8j07j146D6K47h30A49g29a80p45B51j07M65
+21493F09a79H56B24a34k15E13i1j44k39k87a48k81G50B49N37K52C03b46n51j45
+21513i42j50c9D78F5b15m04b89B4J195j16j68A00N94a85n00k37E12a14G33k47
+21533D86C1f71C86C9M35O85E77O29g01p22J57J44B25g04A6c87H5c29q1G80l15
+21554D65c3A77L2d26D87l2O45o9j22A96J70c31n96b78l70r90L31c93q85Q5K17
+21575i76a62H18R92q24j96N52M4m02J70A22e54k56o75R2K02L63L26A223n92m1
+21595E90c14J9C70K72q4a2F73d53b13e5A67G2L53g45I9b74R6m33E9K74p4c17i3
+21619G89L42j87J70l05p4A4i7j811p36b2I1J92f30J52b16D6L86K034r93p10J36
+21640H99e73B50i12R8Q0j73q1c6k52m9C06J83J369m63j4g63d1o32A27N27c5o99
+21662g34o94C74e78G2L09J23Q26b36l2k3j29B46a68B27D6J76E8k5f40A67M13e95
+21685A16b62m16L7A34a00B87n4M6J546C22K74H3d4k46o18Q0k95e16J66H96b76
+21707F54K66d89D45L32A05e71F10A69b60k45J5l2l49b57I65J93B05J064C02A28
+21728b06A035B16g81o34j88O00o35D38j48f1m21I69A27d93H17j45e15a00j49j67
+21748d16j29p8a21C23b9r0q46O3M46m9A036j84A09f49B19K05M74M39l37k85C16
+21770c74k46k48j4q18c53J57j17l61b66C97J25O28J75o05b65k53Q6j020f95B13
+21791a045m39c87l21a32B52R70L0D49j56J61g16a26q28b22j99p3O3o16K96A484
+21812C65N42N05A6d27n68D64a14G63B33d40k95J12h4D02d68I81g4o64a10j60n09
+21833g79B36D9J213D95j61K12c1l28A093C9a159B47a048L44l80c86F07M3K80m41
+21853D89o7A53N28J434j010b33o27If17j229b85A13J213C57L89b54C48M05gA270
+21874A408C81A87g67j04m13M37J59B46d32D8a27G45J03P04H3M15l8b77m9G97a08
+21896F57K01l95a285j81a63o17c65H20A08a6j51B6M63N83D46L30l04N03D34c88
+21917C4e31b57m64j12k20M70Q2A468l01N30L37F51L22c30j53j12j27A017d86K13
+21937b73q4a3A168P5j47l96k64A40k4J52p4K27b96o62D53f57a47A09J268D88O7
+21958E55M78g08a37k45J05G03b97j26F30J00e53D13J007C69J87h91E48a314em0
+21978d5n34o49d68B84j26O03B91j03J309k00D38a215q5e44J74e5D07A67a5C39
+21999A51b42J17C46B3J04e14m16lc94A19O29l66M10b21A613e9C89A1a37r02n28
+22020a567M27c82k4g6B57e16I35L35E63k4k30N04P2K33a53k52O3n53G9B5M40f63
+22043D39fk87C33e4H43j18B09Q0c28J19i9k74A119B94a345B8i25P1a00o90b58
+22065a031L87c7n14E85J204A37C0J90h93K54n41C03b54n82Jc50r40N10C45%o7
+22086B78J127p02q7a11p1A300m51D05L65b79q21B2a64l15d8j69H07g01a33K1G69
+22108a75l19A071b02G75c83k45k38c62n17h6m7l32k93a7H34L11a65B62N31l84
+22128D09d87A161l67A83Q33g65n0L67n03L36F46d35E24a92j14B66b49E35JB39
+22149E02f59h9k32h7j15A152b26C4L69g67J16b42A66d15B80A24J61f89K92A07
+22170I21D29a02B82O76c37i0E58A21c28n11J32H2a19C00M83B10K49e39a05G2R7
+22191A69a10A124A91O1b44j39C07c03E10N8B08a004M65P3C99A34L44A89a25D8
+22212E34c64A35L42a50m90a88j8n61K64E8N78H2b23j403C51C8a9G75O15c53D23
+22234f30j18H4a92b4l37J13j228d26E00k03K68d41H0N0e47a6I52c55C84A59a16
+22256A48i40K90l79B08C9g74C89d06d0C24L10O28E53r7c1m06h1n90b01q7F90C02
+22279A40qN62e42e6F51J63C31K23a103B77L57r6B20L15q1l3N16c02F4M32L5k51
+22301B80a038k9c39A33c21a45aI99B94b13D71e89D34a11D26c96k82l07A75a62
+22322A72o9a10B06e2m42B48a35j46F03J0a347E99j16k29I5K90p3a4p52j81D79
+22344A70a85A092m35b57C05e69b71E93N97c07E08k17a091C1L67I5a092B14M30
+22363F44i88L11a53A036E00b70g9B85d16E62b21A55J99A03g60a81B34J7I1oO0
+22384A45g1H40h19c06l32B08M71A96b30k49B20J75A27L70J74J45i49M49J15q3
+22404d68j4B41b33D0i5C90a04A122D38c58j0j56K04l44l12F78j3B25a37j050N82
+22425f05E21d55D88J89c27o26L53g9o89H0M1N64l01N91d20l65G00BM48j48b80
+22447a413e49r36d25A172g34A4a17F15c53n00G30K49b42B06d69m6b08l58C94N77
+22467I71C8J68A4f0D48K27B30a69G54h26R7H3i35A76G8a82A263B47J70g80l0J29
+22489f81j28j6k64C0e20A92N64J9j41k12g7l0b3F46C21d47a45j21B28a398O35
+22510g63E60H1d92A257D93B36b19K6A51a70G54B20d13M5G41k67M66B19K69e12
+22531a241e10l91b28k42l56A109D16c78a64k5C35L53a8l15a05j76j095a87D23
+22551d58C17i60d54A169m79N18m05j40j02a9r74a79m66c02B54n2E4h55A48o6J93
+22572B75R97h32H80i06e2j74K9G3e24A57d35O1B35J37b80D11m9K92g96p72J32
+22593a436f78J95A65f6k9n86E6O58L06i2n18b64f1D63g59C76o4I2b98G13a26E98
+22616c62B32D0L76K35c49m92J63O3a0q8A491D36P5a26F5R8Q10a48m24C64Hb38
+22639F88l0O71N2c01I42D8O45Cb10k57k28R8k36k82h6I20m10M16b70H45Cb73c1
+22663g05C2d14n28J14J66b1k19F68A76Di49A416d30a90L6K5C60j65J335h92G34
+22685G2b84B30N23e98o7b45n62r36h2A04J54i92c92j05E09J3Q6k70b80B31a37
+22707F29c30j30C87Hg78j42D2K12c27C42L33a56K2lD48a01j33er06b61C1L51J14
+22730D96d20A105a95l0M1q75M94e0G88d4E47k05j19M95h16D61j85A38L87c43q15
+22751a158K94A77a04D12e63b5E54c70D5N46rK52C5K86i86KC7Q3P10H1P97l57a96
+22775d39B59M32k48o1c11k64B26e35C47c22C46K4N6O19m24f55G30l48j32i27l63
+22796a290c18E24a86D24l4CR59C0M55c93a32D82A26b9G0a366B07O1q7a21q3l32
+22818e36C99e54m19A80c07n6m49B89i63k69d43D34M20l60k7d95m86L19K40J35
+22838b87B21E0g25p7b17k64K37F70a91D72L9B9f4G39g30a46C32a32C59d31k10
+22859f41C04mD0L02j50K42a035L37C00P7O7O3Ea52k25A10L73f06H76g69F08b97
+22882h87A10c6D98L64J19c72C32a45m91B83e18H59f42k35j89d19A48c56A269o15
+22902F54BN33e9D71R5G5j5M74H6A7i73E08C2Q99a30j31H46f5A772g60C75d67j90
+22925f57C85g02B18o1Q46B03J97n3A28P49b94C83D2b00c8qA57e16F21R0b80C50
+22948E91d47p7A86P4d67D8c65j4j27j19j59a40d1E6c03A64k3K0C4oM47Q6A10Q99
+22972A009j9m25A40R09F7N9a345d34a69m10H53m20e22F74k30J73c50G54M56E06
+22993b6n78K76A74b93N1j62p1C28g65N8J22I2L9P08j31J15A31f12J29G00A1K25
+23015B36J66f25J71O0a25B53f1k34k04C83D9h3j39A48P42m21N18D9J047a17I33
+23037c28q7n54j70b99m80m86A89J16L7f6D08e8A39P51m27b10B22a038d54J47l43
+23058f50G11h16A305b2p23D70b28E78a29D70L34i18A008H1M63k46L62k17A93d39
+23079e71L4I61e85a19k40L6A114e01E59C1R43N6A26O90c76C67c60F4a50N5j185
+23100a280e17J47A91Q73@F5c2r8l66J00I9b89A22K53L37A10e78B80A0P70K36h36
+23123e94O3b48k42G95l08dA86a31C17a75H39k04A19f65a4j517c03l78h3l40j83
+23144f06D79E9b71a25D26K85L62B09j9a28K7D86e8m02G15a219d7q96J69O5a4C13
+23167c0m35c3G13B64R3J60J063C9b47C01h2j46l60B77a73G92f68j23d6n67A90
+23189D54R06a16G09I1AP92f81i8F58e02D5h3%L8E07a88j00J4C97g61B44K58e50
+23213D68e36a29n29D54J45L27f51K78k56K83R4IO23a53A400C35Le43I51l16j53
+23234D82A72d63i6j211b75l42R8a71l0B59b00D62c4H7J78L47J42a82E47k53J15
+23255D09H7c32p94P4K21K17E65N5b71C2R86A83L81h98B4P7a47A005a2m7E56F9
+23278h12C18j49L08g98J71l41f1k76E8N64A39K40J24k23A03d15l17K16D38gk94
+23299c01k23A45L89e08j01a30p81h9D06Q3r8K08g65B44Q02e50a7D0i36C41a73
+23321h27j95L21c18J53A216e03F09D4a204C41a34A254l35D12d64A097B36c82a35
+23341C36M1b69l4p18G43F8M01J93O17o15A00gl46G03j76b10E09k47b01m35J63
+23362d73J16a58q78b34jl28A5a52A334E78b09F25a72k52M8F3N35e09K5a50l82
+23383e32I1K4b11G45N61a19A2P07f30J92D29q1i16D97d16I5D3O58L05n00b50f8
+23406A2i0m23R1D78H2h4C48J94l7b24B88i4A36e9p40C89JkK52rl0B06L1K43j53
+23431C27a89B5L02i61Ha74j2C18a38A89a25p6A95M8a95A12a06b6C52b97D18A09
+23454c32G76a95B81r0k9K15L02A24N12a84j298b02E88i43c77k73K09j189G2L36
+23474D08b55a24B78Q19C06c47k19o10c12J50G25C15A26M97I2g35A80c25G83C49
+23495A07a88k40n1C38M32a05kr49a28k83QF56L94m73Q1a82n88c18k50E00A25d34
+23518c57c9B41b46k87a07A46o8g07c4B13d28C64N62d60C58J08A34e76L8a65B25
+23540e20f8p07C27Q79c64c3p1C26a66D79A02a2A05e62E0j7g26C49rhG30j4j26
+23563E90a41H5d88A97a21C59P4g06D43e94K74A51J56A08e34K1d4m47A37J04O14
+23584H55a60A012c81o41c55l2B57a87B77L21b67m6J36M5F6L27b2m42G13C55j51
+23605B04J81B9J2K17n3f91g7G1O41f79p8c6o31B3Q8N22n4L83a52r06J31e6j274
+23628a330f8l97f8C16H2L77j22N4l2O25l46J50g80H7d04D53F7fA28b51O1A5c59
+23652G93j18e14A21h85c46k04a85A17M29b81b8k50G07B54a89E12A58e80p69A78
+23673g09C9f18F63A23f3m18D70c24A22m0b89j11D08a089a39F23A12J090C82c76
+23694b83J8o87G95a61m35K97l75B45e1C99G3h52c4l56r8a00C37B9J11b57A8g3
+23717f12j054F6a21D69j89F3i1k20k84b14A71L92a24F5b14P0A29d89D68K21k55
+23738D34a36j159H1f35G6K01a436C39K49L86j71A50J59c4B38E6d31a4B6a80p88
+23759i68b83D57f70G37k09K39b17I42B29b94m5H35J38i05M29J6p5C42J60c05H40
+23781E5f6q58C12d4j02Jl62J48N7A41N94B09a324A075a36k40E6a084e42E24f26
+23803C42P78Qk77h48a95A81J90d8B08F5c99C17f1C09a21n24H16l76o2g47A12M62
+23825E74M19D06i4o25l5L60A36g22a45E9J16c71m23F18d5A82P62d79a28iA79e38
+23848a006D86f86k8C73n3H1K33a42B89KO26c49a7k96k84r6H05r7e64n25B45D3
+23871g99D71f42B47J1L55i08d38G0K55L06i74H40B40c84o54C97g72a70A03b60
+23892F29C04c14a12A30K31M7a134a02F6N95a076L65b68M2C04L91B23i18G21K29
+23912I50m13k08f97A23K00O77B09M6O60A69E2eo50A328B19a36l50A71M18D0R1
+23933A31M22A93B7b24j32n9A67b14e5B30a163C41a76j3O4F44M61f27C20a10o52
+23954g62G27A75c12p21c61q00d61A22a08A246b73C4g41G91F2J82D4N74d95C24
+23975A34c10B27i30E78F0a45k5C23a7C47M57m00F2c84B38J34J00f43e3o96D30
+23997B91L06g17b49m83c60n1B12B4L90f85a47A74O60A45M37h43Q2a50j476A18
+24018C04L27b68n07K52A8f7D12b8a0o49J72H3c25D9M23n2c72l70b48A055m38O56
+24040A273h50E55f72b53P7F85f10j63A121A83O79A14f31a38j41g6A86c92N8k85
+24060f19K39l06M0b38A20J16j2O91D20i25I76g65I27B50n0b60D17f34B44a5j035
+24081a050R8E13c1l97n18b29l05d4p20a60e1A049B39b07B18A06f16n7B32c16D15
+24103d56D96A84M90b88A094A73d5I98m50a54F74b42P8j385B66h5j19j46o23B49
+24124g42C65A50e00J87n7A49a18A453F87C8M62d88C54P3e63IJ13N03C7c37h9n70
+24146f59F56a62C46M77l48A30L65M12B98K39e52n28K83b37j61R0a49p89L67j08
+24166f79b04A32a94eB76c23F76a98B1c2j93D31A7a059J79D21dC18d38H90A91J18
+24188C09a11a5l14C46R66I8c55k75K98F13L00b44q7o55A121B71e20j6a48B31d44
+24210B27a33B47c10A67R4Qb54k77i7o81B70K31D3e76n43M67B93b28a3q46D47n8
+24232C89j84c25h8j21B94j9e11A38K09e06K8O5F43h93A27Q14B22J24K69B12O61
+24253H73C70d6n10j53a40D46i36h8H61C14K82i7p18A088k73K67C19c62E94f70
+24274A24O84k23a58Ga027M44B75Rd0E87A42L76c25a36B63b23F54f81D90c48B30
+24296e00G24C62e6G1O1c35M8a24m83E0P47l26hD87d28A0N10O91g25A08J00d39
+24319b56A67ob34E22a39d8D78e05k10D62L26j89J13g84E7K11L23I2A2f13I1g06
+24342d43J10k26H76D18a96A75J68C9M9R12g93a46r7H13H0B8b30D18b90k29A84
+24364f29a2p9L1k85D13A76g34b41B31n5m4L4J65b51A80d75O1H0c19m05K19a06
+24387g3kF17p9A95N6M87A71c43G16J25i88d46j28k16a90m75D69K59A54f54B45
+24409B81M11H9d60A34E1M89f76J13G10j75d47D80m1b63e3m37A86f9o9C94g06H09
+24432B77P60d04l42b14f6l43j53K03k18E66k61c19C35a124K20b97o93A94N14a11
+24453H3g2F22a46D91r3b95D51b44b7G55e83J62B97p7P70f82D75A02M42j22h0m71
+24475e51A58P31A65L5d43F74b38E4b89A01O75f81K78p73g5B12f54A58N74J23k94
+24496E61L01i8G1P99b41E61k78d57K3o0BJ477m41I5P92b94o0q80a57A85d6m3m68
+24519e57M2A025b19P5M6m95A43O0b27l28M3J10A66J27O06B81i3o42L66n70B74
+24541D5f80j77H8O4c98k61Q7m67h0A5g22a60C24L39l18iD65J47D1R5J25N69a013
+24565C55L17a44o96B16K91a00j43D79a91O8j3r80B43N82A5N34r2a20l41J6B80
+24587c26H96C00a66H4b30J8n72A15E2O89B18a55o65A53o7K7b94K0r6C5M48I4f91
+24611f4F37B35a204E89c45Q1B34N31a242E6d96E16r8j58J18B8M97b83A74d34F
+24633A478o12i31L40G2a28D68c01F77J46e98C5b69m3A50e04B4O66b22P3A10K56
+24654C66e17G45a81A13g93k83c00H27g66B75K10f36F06a81m8j54D85e01k63F28
+24675c82G4J47e16E63q7L42a95a5j117F77f52j22l76d9B11h12A17f15k80a22A49
+24697A71K75c85B33O67B01a77C1K66c28F0a92E47J7j66a25E35b07k02a4D3d47
+24719A54e55a18C97a252F38c48m8k05Ib99B95e32G2O8J41b30B26K8J124c21G6
+24741c68Q1h7j56F6d84n9A48e84F9b97B39a62o46k47d86C03d90c3B51b53nB34
+24764A98a10e5j20l0k3C64J58d25A1a094E59a111C28E6J25J152A44L45O50f7l31
+24785c98B59e6j21d2B83a164F5a300F15e3n73E5L48a26C02N3R8A46g38c33c3j524
+24807a557C19P5JJ0i9d2l8E60N90l42C53M92c77k23MC75J21e26k33B03r9N46A27
+24831c97F93j89j50b65k31C00A10c72j67a52k84E15h63j17c01m28m23B26N44A56
+24852C50d32M9I93k96K85d06f7H41e57H10e91E3h06L32B82L61f2F55G6R45g65
+24874B04b26C66b17j98B02e60A85c15E11N16A66g25h2a8A82Q81d00f7l04I9P9
+24895A78c65E55k1A96N08A88c07F22k55l9d36l6G2a15E80a0A61e85j25G43f67
+24917g36D8d96J26m74L81k31E61c27B2f3E82N90B50M47e48G0d66j039P10E08K
+24938E10F7a5l7F51A98M47b9A98R6L37b85b7k33E42A13a3fm04A5a171b43B8L00
+24961C28BL36I5FN9O0L01D6c76J81C77Nc47F00J76a57p54n5l4a01C69P88E38e12
+24986E91k64a32m14H6fI8a85A87f81C71E1P53k94i84E69a141A03J45L10g0D81
+25008d7E68f83K17a18e0I85C05J17J62J31L98k50K29m77A20c99o10B69r9c23j38
+25029d61K8B34K31g2m99A266a98H30c72r8K29k81a48o1b5p69G50e8r18b1A79P45
+25051I24j99M4l22P5b07A35J44C4GJ42c18C3f28D31d06B42a46j86A38M33j37b84
+25074B09d56A193b86G53A00e23E82I0k0e79B8K99j37J76M23f6H53e7m1o10j94
+25095i02I2f27D98a9A80b9C21A03L95M74A66f25I30C12J19N70D64B12G9c38C60
+25117a099j20A37a366c2l90r92I71m13B52K56e79F0d15k40B39b90D00Bc94e7D84
+25139A68q1a93e8B37J24O82b63a19C99c56a63C21B1K15r1n2b15C01J405FM98k51
+25161B53J43d78A52i66H7l3c77l05b80C52b59A88B7f41m72c79A40b35m80K2A03
+25183G26i2l52I40d7C64a61F30b4j178B43K10h22l78A080a25A76J9p5g90c50A97
+25205B27M92e36A86N1b14a5o40B50c82a80B98r6L03B04H6a89B59L8O24b6A92p8
+25227A14J02j7M62j53a46o34a47A4M06d18b1j123B68L62f97A649n69d64f6He17
+25249a7F83C03r0g78K72m04b88A18M4e50f7B7d72A08De67B7g17c1D6e89K07F78
+25273i6F50c10F19J2e4m48k68b58L2p1E52c65l22E13a71N5k24H0a27B43d50G30
+25296A50M84i38a67I43A77P26D49j55c3j38k04H51e31A112A21P3E7e25a92G8K65
+25317C43N0A18a030C70e82l48D2c06n40d17A80e61A09J58n8N19A22m0N1a096b88
+25339a157b27l87B21h66L45I7e33a63E26k34A04M92b32b8G17l43a56C84c25n37
+25359h62a47D60e23J44q12N64J26C2d78A44k6b34k89J7G6c93h1D99L86d64b25
+25381C34c31B9g89C56h6j61O5l2B42N1M1c54A61c32k88K75E79a437e74j201g88
+25403A16c18n59A82N92d12E68a33k6O2l80b02L4I04a76A25d86K30C31a400B02
+25424c00C09d84l34D6b42k13n47B11J69c72k20E02f52C10d10J39A88j5e33K02
+25444c31F36Q8b98C28M50B30e62B26J95l9b9C6N2O24l45n4j7c46ej37Ln86b59
+25468D18A82J49P6Q9H3e63Q9d3D11B1K1M66b52D81A38P00O0e39g9H88C51a57b7
+25492A53L55e5A71P98A3f66A090a4k63B99M3e28C3K60c52D8a38E54b34o00j06
+25513i40B76M56h2D70K72c20E08a26B14e20K45J17j26J15m64A84O38B80c29a35
+25534H85B0d45J38a39n30C48c2r91A67K24j09d95C82a84j74I39d98E49M17D68
+25555E37d24B01d9q9C31I7g84j95E03R6e15g4A2f21D0j1M95b68B42J40L39R20
+25577A641e49k90b85B30e0q6C01I3L24R4B09d07J78c7A38m9N36o0e18E90b5k70
+25599b95A93a82m5j46hI0K80a92A52h5j150Da73q3G45o3b94l81A47A9J46Q90A84
+25623I90h01a60E59A77G2b88E79j0A2K93a82b1q28D03a240B14l0c4B40O39B22
+25645D4a100P3H02i20h9r64N20B61e64I6N91A09e63l40f4H10J32d23F8g5I88p1
+25667I17f10O9E11f31b74p78H0J06Ab75p23A0Q25B21B5a5n78b42j250d85o84d89
+25690E95J5g94B08c2l44H35hk37A309B15g99A113%l07E6Q55B8a44k37D92c41b6
+25713G39K77d16d4D49a46I05k5l77g3k36b4q52b09D84e92D39f99j82D96b51C17
+25735g63E67j22a34I07B37f75C41d29A129b47E2a38F22B5e79K50A39b35n50a56
+25756i21b41A082l0B38g08A79G2a79jj47M7C19J07a80E64L3a19G68c12P5E32d92
+25779B28K10g43a01k33J59m15B35P3A28R29c2n29O1I34c08M0O0E72P53c68B65
+25801gG72b15M7c1A69k0c07a1E46j48I8c09D63L51d71D1b28j36G75C3f2j4q90
+25824i66H08B46j02b00K6E0J043b25N2j77D08P3a090B3b25l21H69A95N3l1E2P0
+25846A22R08D2K7J53a60j037e79H56a215a60L6j54p50I37Q7e10f3EJ11d4l06m18
+25868g68F62I8d75A74e07J97A92h92B25c42k76A8J006B28j2d11J09D40K67C19
+25889C16K74H5i45J40A4J072b3q74b3C71h30D67d96A59K48h2D61o7I8b63I41h73
+25912D88A27M2b2B15d2I61m13a13F64l9c47A652C3c07J43l35b42o64K37b16E48
+25934g12B48e42I68i7k06e2q9A326h2C23L11H0a20I2L39b7k82A1e8k97A67L66
+25956E33e3B47f51J05E43K26f7m76p2A22L60A11C5R60G2M26a09F33i1l14A146
+25978f67F59a07C8e19C49f29B48f39G73A85b72j08a4C69b81m23A7K91b78E94j76
+25999D18a17B80L2a10j065c56n93M00a7q33C8a82C00M77B39d72B37b13D93a4m4
+26020e8D85K7e16D61Bh57C15H0K0J42K84B31i0c1I98C62f47b64D24b20F67B71
+26043i26PN2F87O03h02E80A31l3jK8m7a76Ia152e27B33M5f51B80a3m17D47f98
+26067E21c2E50b7n22Q9E17a002a90B7L5e78E04d56a80n64C34A44J363f11D33c04
+26089D9N31B07M06J8b93a00H92k92A0b39n90L00J17a65A0d89a39D68j02r8f5l77
+26111d42E3M19a04A39M71g80b13c0o05m8H83D23q9O25B24f79C01L37k91b6j62
+26132a88A8c23E39a15j33A209A6b40j124d96G35a92E20c96O3D56n8e55C20M37
+26152G57b74m42J67K41o46F48F0a603C64j67J9d6j520a40B54a365E58d89h9A16
+26173g73c05B40c27E3d28m4q19N50A66a224c10C59b34A029c73A64J119A30o4e71
+26194i75B85a76j76m23b94I01k72f24J68k19O0E85k54a4H04a01L9C48c30A28c11
+26216c07K5j8E00c73A44g94J92C2K13f21Q5d2D54L28A99a65j87J24J9C64e85b88
+26239D44e3j17B03d27D55d34C16a17B06K39b35m54a24I35A32e35F94g48K37B96
+26260B31a72k88p85A73G4k9g86a84D59J34A41N7J55a042A132m87a9n91I68B58
+26281A78c55C42g06I7D0d88Q4J93C10K8c78p3B13K45c82C73c35lj56J82G29e32
+26304D15A34L51e24J64J75H00f3A107K2m86A06f06B18ne44A27M72q4k18i0o00
+26325f90D71a35l72A04a192L59B66b09B91I1d04G06g32K47b18O0C39j5K67B02
+26346f03A060l78j46b39I56a78M0F8R63b93A80M82C23M6c60f1E34a64l51J8J17
+26367c80F65B24g3B44g9C99nb79l7B94L09A41O1f01E03c42D54b31E61e24a09B84
+26390D82J5e70C51D7K7O4b2G79A5b81H5c92p6B6P37C58j41L5A13d44E77f29H87
+26414a08j26C32a21B24J77K99A47b77E71B36M02d64A90d02A51d83fA125a64j59
+26434c23B77D4j8h33L03J49B83a3B84j27a053A331g12H5b85D41b32A69a00l88
+26454d88B38h75A153c71E94k83j50d04F19a088j08b64a22n03B66f2A06K58Nb47
+26475f21h4p90a71e6E99a44E45A40k4c84j55A150g83C26e4l56m21a62C48b7m3
+26496g0G89A84J01DM28c17a01D14f73j3D03g64c28G04J38k35k37o3e7H7i2H78
+26519g08G08a73l17a72j07E37B03c2k34G0a252B47J33f63C33c33a38n80A160D19
+26540b64A26h56J71G05j47c49N5E71b13G36E3K55e29f0D49L37J66m16N92b42r0
+26561c32k07j42E0L84b51E4bl85B11M19B20J1N63a93m03A59J5K1b12A27a54l40
+26583d94N5l66hj6p61K46A07a32m21h2k61m75B79A1M65r6a62M3A42b51k38Q7o2
+26606d64O5n70H10d50J97F0J60F2J97a000b70A95c89F09iG5b27H06b22E36i50
+26628B2L42a074i6B90O92d88l16j46H13a11A12K72I7R43d03C75d62J65D86d08
+26649F3P08j52b31H24J22K88C13k4A01J44i01K48b49H51p0B43A2a06D4a39o14
+26670g53A15a04A45e05L4A260D15j10J3L64b77F66c30a42N4j75h6A9a298d34G69
+26692a95E36a01F58a26D73e15C34b90MC56A4Q0M48b37L9C62a53H31A8J91b29G67
+26715B62c7B13N02m1b35C58J11l9r6A42J6b44D8J4b66A0N2a125d4m14J50F02k26
+26738C76b75o06c31B73j23e72H0a74A001b82g2B79K51d02A29N9g27J17A61c7j077
+26759a114a54I77j94i3n3f2m62G0O1g79J21C5d98F04a018b22o10b37b8D02J97
+26780E99B05L51d09K4A31J64C4J62i10C76h81b5p1b4n57k92a38k3m47b89a43a0
+26803a97k95F29j76i2C9a19B8f19E32n7a067c02o2k02k38J36B24g0H66b63m89
+26824g52a8E6a78D11e00G41I2J025h1B60D0K73I5Q77f28A00K03Q4a113M04dm40
+26846d44E57L40b08k64A54Q37D56j43J98K31B30b85l62L12a14F0c66a32j49c0
+26867e03E90M97e73A8f6B65e86o2C01f33Ae28D35g5G16j71g48G47B03d05E42j54
+26889C88N35l99i5D29j48N80a75p32E77e14b52A27c38L6n4E55c32D89e30D42B5
+26911D01j32a35F56B16M21of9j34l04c9G53C56j3K1A26mf25D97d1B7M21J02f62
+26935c4l44C49k1c15A75P43a71G97a97o00K33m26E9c25k08F42e39f9H97D7Q85
+26956I32A32m9c63B65J97b39L3E5bE29A26a77C88j20b33A89J22dB97L39d90I0
+26979E0M96j64h37M08B51k3a94l13A47d13C05j27e40A57L31a55D70f8G14B84Q2
+27000C66b2H5M52K00C56J14b83j11a44D77c72C8c93C65a33p24c03r7A78L21b90
+27022A260i6k70F33d78b17a1l10E33a037M99E9d22k45q9b1F6K09A35N40f31k76
+27043i07A9c49F9a18B15a06k6C3d29F9g35C39C2c15H12k70o2j56L63f2D03q3M79
+27066G99b32B33ck00h5l4N1n7M3F37H9i85K55I2M96A95b34k20A44O2R37f5E07
+27090b9j67o98D19r3K21A42m7fC89K26d13a66g4A549b09n67k70b31m53K68N1a07
+27113a33l13J5F19g2A13d2G89b39D06IL29A6c39oB33K15f72E68a90p9o4J04p02
+27136i31A12L34B06rL69f86E87K69b31q17H64f25C55ra273G9K26A22f02F3J096
+27157A159k48B20a77o7D85cG03b94E2L72b95E60b24A32M4G3K26g54B09B6K85p2
+27179B39d4j4r5A47i9K3E62k4b9j74l89D67e54m7C82r6J76d8j2F3P65A37M14A65
+27204C95h31O5p7A463c17m69O6C08d44P9F23g58A2O71C36c55C24d24p10M64G24
+27226A230a22E02a178c26k06a42m1p0E78K07c36m45c89@A78n5e5q23F36I6a43
+27248c85n74a67k31l73B1L55b58D0Q79B25J4i23h9B28b23C99A63@b34j11A10g99
+27271F4O25d45a3p4l26E19f8j24E38e06BK97K92C6J4N95O06F21k28L82B47b10
+27294d07l4A35a70j6M2B71a58C31a02n1D80a1B82g69n9A50c48k25J93e7B78d24
+27317b1j98A52M61q9i71M43D87k17e9o0G51j82i48D2M89a40E04B0h28A07Gc43
+27340g3q4q5j0B48L86j36N0l9e23E39B26d72i3k04I61E6O9B7a031D0K37m3C0J209
+27364A239I0f47aI98h26c14H50h8B17K26k06e6j093E8i75c1D69m2L52e5m78K51
+27386b82m10C45n9g64F82C29c12J41D44B12B0b97C16A52D9K7c67E06A44Q3a0l98
+27408d08D69b83k49h0B5a20B52G3c95C54e84H47a8hE09h94M19G3b81D35d67A72
+27431d47a64A290m91a165A28O53i3C85R60C65M86b06C37b26G8b86A20J06bk88
+27451b90C46E5i0m40C7L21K20b44Q0A12L49n7e85J61E32J52k80A97h45J29E13
+27473c52b8F41a99m1A9c94Q7m02f6H70a86a1A79L8a07L2D90i2aq37D14c6A031
+27497A58K92H6g04a6E80M2J27B68a159d45b2j56k04G1A8a86m70K50A48c79F91
+27519a13l3B3i17A19Q1lK74k00F0K42R1A24J08a87B48g59L17A32M88d17B91c2
+27542c73Q9B73A27f33A3O3a23I36B26O1p3f48A77a90F5R18b83i4A67Q1M22h50
+27565b52r59D4O39a338I1P70B8K11lN8O4J42j29e72K38h5k74B36e18I27i23d01
+27588F17k41j31h06b26B89I2a051fE99c16m53b79d7H55A03b46C40m8a133c50k94
+27609f44r9N2B0a03C56M40e90M2Gf76B80a59A78K45q8c50d0fA99a52l95j34A062
+27633G18b69B53e25B67a181A39R2d19C40e33B95c85B55d25j43g3k8C17c5C69d18
+27655a3E85n4g23B64c25B81a28l84b19k32a7k38k68K31k31I47m69j84a7D3c74
+27677C5P0J31a76k11F85g17C16b03k62A35N77J0e17a5Af65B63J33d55a1B46c23
+27700a78%pA80k3f29A097B24q9g68L58B52O50b1l97E23K9e73E57e3F4N96J7G3
+27724a61m65b40A31d16A170B6P63l70a91a2l29K1k68k87F58j24f08A21M73o2l
+27745E29q2g62L73H72d7m0E18a18l38r28D60a200d55I20a042B69G5N89k83b90
+27766a04m8A80N24C17c68a71F43d97k16C50r1F6d61h1l0r08B20e62M2i0A34f53
+27789I3b67k90K74A66f22D00K25g08m26B31c1C61J04L95b3A40K14a445b51A036
+27810B68a256a26A83L86c46G48e15a88o3I5e36b11a02k46j49B50P02A22a27k87
+27830d14K0H58k15C3M1b28j480c09B77d99A006C21j18j5K7L9N09g28C62d4l58
+27851d02d0A61K01j1A33i26E48h71B64d96C84b63B67J48M05C87c36C78O26A62
+27872G58B01N52Jf9B24d93d2C63M15e11e4I0L84a026c40B21m4c58J59A213C15
+27894D88A60L27j63H0L58b19j93j86G71f04A58g37H03R5c39L0G23A45f48a96j51
+27915c47P1b9E8L41a056C32A63b86Q4B02L51N1P62D68c61B2J01d97J38D08C0K27
+27937B57J26b53H4N3iI97A87e60D34A48J78f0b2C64q9d61B10P4e76G30h55J58
+27959f97f1l13E2b71h5H78d05F6j7d90J13I23A04c26l52J48l89B39K31j69c34
+27981B89e04l62B99M63C03N83k50e29a75j2L8j06P5I53i13L05C02a78j47c6E0
+28003B41g98F44M45e29I9K19c01l6l38k32b84d6j07m92a42B81c08A43e22g1J3
+28024e8A71G3b09A38d63N7C64h8A30a92k21D63a55B75A07M73G0BL23f80C33O97
+28046A030B51L92a092F23e93E77R7i01c21o3m17m21a60C7N49A03d54D1N12A58
+28067De23B71a56A29c42l26A7b22k68A287a89E79C2a75o80b25m44p01a32D21E9
+28089F97A61d4j3G57c7B50L16i88H4j3i3j25m61B93J01P03B38A14J07b67o3k6
+28111c56q70d6o11C53d21J63B36a20r89F93l04a60C03g78K44ja50A35D7a035i5
+28133F27D7a4I34a283A008b36R3A61K05j65d35D53q1q8g40A85h45i9D88K74k30
+28154E32e18C42b07A59a1k90a24j87K9l40c05C21c25D89L49h17L74a97nC91d99
+28176c13M5e1I1M51e1C15kQ0A31h78O4J54L07F1R92g3I5O97b02M7d1k69A36b21
+28201C4J18a54B44aF51j09g45l07A272f8m61p27e49J29I4c4q96B03f40c01l77
+28222f78m67F97f71J10C29d81D28j7P3j98p3f68F5d68a64C97e44F08k63a10Lp28
+28244h35n9C69c99E95d58H0L94A6K47D9c18D30e93D4b2q61d07j74J60a03B01Q00
+28266A001B95c65I99a35q36D74h0j24l28A073K48m66f2k2p3D56j48b99B98j4d25
+28288a95H11c35D06c2p77D85Q3h20A51O41j15a51k46a13c4C27c44A75J0c96A07
+28310a68k65A07B5a262H15c31l5k21B20N8O05A72K40g03B95e04p74K77H90q8f19
+28332d32G74a65k3m87J48J20G7g14a57D67K57B30f68B21q0F4L03d48j66p2K41
+28353d45E20d07j15J71D14L50k47j58J68b65a15C31J040k20D28e23F5c86B17h17
+28374fF18B37K00a222g8A91N78k20A52a39F79d39b9l76k38b53a26j24J19l97L2
+28395d96J95f6H9f47B91A9J55K92h0k0o7q40E0a30D36A0O41A53K62j92j4J77a040
+28419d27C33r3R5D6b61A98e4K1l25m46G9d0j58F20d44E32e5E69K13b23l86D08
+28442f60A75m9g2C52j57c16k91j25k83d46C84M57B41K49e91B65b06o09D20a84
+28463b07K6C16d32A035B4N48A12a55P6B36L87A14E7M1N03A16f8k05m08B53a91
+28485d31H03e78K68m87K1L20D00e31a04j12H34l87g63F92k96J69A9c55F0M23a25
+28507B86d80G43f2j13M9A12N5d20a90G12J26e3B56D9M26I7L16k05M5iD77A36g
+28531b21l08D50a084a85D21h81A66P2e3F70a88l0A77M70J73C54A22L29A53f96
+28552hj45D64P5b34A89P75R9B37p6d63D85gE81B62d34l22H6g37B74N97A45J161
+28574A306a38l50B94g4k9D64B17Q29d2F61b77D8R03c17b6j082E58h71He05A46
+28596A5e00H61B42O36a8B62d56C66e52c2n47J97E43g3n5n22A77K57e45C21M08
+28617G29O5F3e39j77E51e21I72j21a97A34b33j111d82K07a08H42h73b34C43c5
+28638I63i36L31C33fA58L8b0q73K22b31m73A12a75j27b5o23F0g41E38Ba051A29
+28661e32A77J35f38M5M5G10B49j22e69J93C97d73A53P53d33j5F23B85j31k6J97
+28682C25a93n7C69a48j08j64R0C90d07A123A39a72P0l89O0r0j20A03O25j21mA11
+28705a81k39C90a24G05B62K22f00F10B0EN37q1k6a102E63h06a63D08L25k03K3
+28726E53a89l50B18n3i74E44k12a01D78M1A57L73a97q0B15a82g3A50c38E62E7
+28748A02c27n08d11B78A38g44A39J045A19c89A208b92m6I07H8J19n9M5f76b75
+28769c73L8A44b74n50b22B20b54c2k73gj60G4c43l88B90e48N9A8N69b49R6C44
+28792b8E89O5M05d38J02k90a96B03a309h2j89D67A30b73f9l0q82a92C31a82B99
+28814a41D31j41J35h57D68G1bn23M9I19C36q0a081L56K44k6C52e99E96j57J122
+28835A561f00l36FJR75d28n87E4Q8f7A41R43B43f5A58N61B76J00a28A2d85F8f03
+28859B2d93o21F77g56a16D14h2A40L35L7f80A08a90C01h09G06B89j36a77I60D62
+28881c83J66A12e64D85H3J06O68g9k31D13e57A023B30K93A22O61e82a00E61j23
+28901D38d20E46K82A57e21f0n4I1d2n09rB28b96A54M68e6l76d9m09a79r3j5A65
+28925e26er69E73b69i9D04j52e05A117C89b06p62a98G27A05O99h95A93J7e2G1
+28947E41A34L86h28J45E80e40E93j39Rb77F17a25E21c9j89b9H44De03g2D71G9
+28970C05Q73c1j06B92Q28A36N47h7m72a19j61C62Ea01c3F35e54N4G21d26A303
+28992A77d26j91a54E56B31J10a00l25D62B1f38D85A93O29C17d10M5J81j98A58
+29013e5j137B30J37d91J5C99e27E29b69A15b35p21A41b27j053b20B21H3d63F62
+29034C5d76C67N69l6B22o0b26m35g4A84k4f28k6D05d9j57A29e08g2m59C8h18g4
+29058b5D12a46l84b44E18A20Q84c49b7D6c65D80r9L58i07A4b2OG2L10j66J17M99
+29081H32g8Mo48B53A19a274B33Ok5F5M54a60l5F73d13A10a350g8k85G02B53mM03
+29104F52A78b85QA113m27A60K86e78b61m39J74k27j69N2L21o8A9h0l24B7a69A50
+29127d05J75A27c03C71e39A01a26m51E15d42M1D35A69K38a20m74B69c43C60K34
+29147E94R89d1C60FK12ka59j06F6N84a31k84G39c73k9B25l4c46m61L71a82j168
+29169a350E47A42N3a8B59M32c00B26c8H44d78a27k25j41G07I5a9k60D55Mj29f01
+29192C1N37O50A73c66g5A074d44C3e14K28E94B07c84B48M74B16J073d46b18A12
+29213a035C3e70BK48c39P5J8C77L71a72F3J00Q33g5n53C79Q0e91a28j74B61K01
+29235D62G1e31l52K76I8a6q34K70j92A82J52J05e33k36b14M1C77d92a42E43d60
+29257B39b78C2L20b32A033m57A16O04B42c71G9M0M26e35G8k1P42j08d94r98e60
+29279b28F08g15B81d7j22B23d64C22b09D48r6A19c53r2Kk65c4E38j25b85G6d28
+29302b24l06D86a124D29c84A048d9A39J8P13k25M15A76J1i72F42A54g24C47g58
+29323B34K20j10c77l22K9A90g92a45A0M00r4i75c12j182a3F77k08c93B1O08j82
+29344D47A03b96G77e82k53L64D17r2m7f77C32b48h2C6M55J2i87M72D53k03hk70
+29366b78q70G71g80E83B58i1G32H6h17J58F0J192A66O1L08b43A57h33a57E59h4
+29388d12F50M36j95A60c49E2a2I5e58l9C41a60A9J44c27l00K66k57F46C03e46
+29410A18h2j98k85E4R32B63a02A0a7m43B6e5n45o03F04o5a97l27J57f6m72K00
+29432c38a46q59F2a47O1k66j95E58b08A45M97L9j72O12A55Ai35b49d0B47A12h41
+29455g59K79A41P8f89H35b19E73b5j36l44i4k25A32N08B7a31C78j74c87E87f2
+29477E57c14F16g80a99A96f07b08C57j62q9c35l98oa1j62B64b89f6j97B59e05
+29499b60k75Q3B81d91J78E25A90M81c21A53E6K58h5n84C65b39F66A56K02K23a07
+29521c14B69a73F53a094A08d07F2h2j0j78h4j355A93a66B05g43D70e24hA81f95
+29543C72A76N96d20a14l18c1j002d44j4H90k73b0p17a24C11d91C45A58K99c14
+29564C48Q31d25D22h83A75M42b65F16a21E91c41O7k17o2C31J94B15c27C76e75
+29585a94k69j054c36k92E2Q62b02G0M43d41j95H71b68C04E4N8Q89D29J38a72n60
+29606g32C50a08m45D54c15l97C74M58l75a61j21j18a60E26c23G92a03n6F31C11
+29627a00j96D03b91A94q6b74G0J320b37G98a129A44c82o08c13h4pk6d6A89f9l38
+29649d07H58a06D08c4r97a89L1A80a8C63K62GQ34E8d19B33R0i1E56d10E99G8c8
+29673a51A90N34e80P9b23B3M33L0f9k03f6a7C42I6jJ58c45B85f50j65K64a95A007
+29697A61c60D1c68J38k61F35d20E72c72F94b13F63C0P7e60K49o57L35C2d9m02
+29718d51P7A5K17m8d95B61a14m11J66a01A25g84l36b15f1A03O1bl51F01E2K38
+29740B90K05B40i50d37A30d86G14J23C62a47G1K63c08k71N3A15a1p32A59c27A14
+29762c85J28D89a82B79d75a63k58D21g36A73Q13c22e6A06M1N7co24E6c85i6p31
+29784h27L56p35A026B99b82o45A78b96a29D75A17d75A34J69c12j74C42d19B19
+29804c15B84b68G3R1a062D24d04A305h50J00B7g0l1B06M65m0J80a76C1K26g82
+29826D49a41p24C17c42k45p3J77F84A95b22m31E9g32C94e54B48B0d26E28J22j0
+29847F40j82g59l0k84H25a61f3E94i88a56Ka1n13I45b12E1b43I85h9j9E46C3N73
+29870F06f00J85B13R6j36a041G51h03G75j40b16A59b34B37J78k6j18L28JH0d31
+29892F1a08L9p84b00B00a75k39F61f57B00Ja94C98c28j121H27A32b26Q6k86F13
+29914e12A38d91r23b55P3iD11K60j01J81l18c59b1A55b02A90b91j63F62j22c48
+29936B6O72g61J95G42c17o45C79c49E39k00L00a05n57A189e7B77c59A8J05P46
+29956H69C40K38Hb64n02kJ40E92c13n52A26a597a83an1p37E52j54im44b22B3J170
+29979A193e45E4b39FK05r9J10J18j8e4B78d01B53L36P81i2D41d38B77j22m4g18
+30002g77J51E03Q43b90j65p99A05N67l23m3A46d88C52rj27rP39C80A25R5J33N17
+30024H70c50A41K19k7c47F69e3j61I48B1J5b40j62D91e1C93c55b8j07I16a36F49
+30047d33q36e04A11g82A54N66A79J50K14p6j6e68d8o52d4j18K2j50I85d8A14M99
+30069F13c02a32C40b49l99K57A10L03b37l22N7b09p94e3C65r0L38L18b04D22b48
+30091B05O6a006E68B43b2o09j89a58m09J09R9a56m44B22e7G35R0c95j1k45b51
+30113a79k5E45d67I4K13O8L04B73b73L3C54a81k32A51a14B97H4J8B0c34a30gA51
+30137C00e5n70R9A54J72K10b09E65R51E93b1j80l11L0E08B19H4d51l72J11D82
+30159A16e24C55K64b10k1r4A021a38l63K45k97C73A50b59O5j21C02A11L86b56
+30180i89E71A72e02G92A78B5O45k61a615f57F42a47l22l28a36r1E86F4b51C01
+30201E67b71J05k39a84f4A92N09c66A56c75A12b36H61A81a162B89A37f30E59a0
+30222G45b61n14A11b36A821g84c87p56a70E68a244M55c21j18d7p30A27a43e4l62
+30242d16E27d48P9o16D02J57i21M39D20N9A84m8b48H64B71K56B58g27C16K5c25
+30264b07D3M24m9K36o2h3mB2a04oA60J17e84F89m2a179b18B72b07i9m28G04g83
+30288h14g5b2j3E00B45g9D61k26c15J53o38F0L29D7kd01C25j1N29d56p1F98d62
+30312B28J18e11hn27C97a064d49C64k4a96D01J4N14C41o9a67D55A38d30a85A63
+30334a08m03E71n9oh30c03i0A66a58I37f66D92A66R1a69N3n19j94C72g64C52f61
+30357A22a53n80F21q2A15d3C73e66J27B68h48c00D39d60K25K1j10B78O2A52a05
+30379E61j46c07E74B82M93C04g66m39M11B18O36B8O76e08B22c91o28b46O5k38
+30399d19A06M0a65D27g06E33e78D21a25p1I2K2k3a07j67l73k71F56d74R9H6M08
+30421D94c88J41C26P2b78d5n5b2p95K90E07L25D01P7M47a91I29F7d38g7n16b14
+30444C52G1QN84b13j67C94e97C14A17J75c22c1D22d99J28a38j8a0D7K49K08a86
+30467I64m59d53D21j55c89R2D04c70C0bA21b75A49Q4A9R7b05P1k85a70C25N0E9
+30491A59J63f61E47a61E85a213B55d05A68J7H7g99L34I49e22E42c28D4c5D66j55
+30512C11Q2i3E85g63A99O0%g81L10J00h5A29AQ1e43B16c3C7L67e70l1F51a15n
+30536a20d6l52J89E93l7J98C54A02M11k48b91B10K24AL49d6B48g51d6n88B22L39
+30558E61a21G3d46J6D6eG1b4E21c04j21a97AM53C2J122l89k20c43m50B41c24j260
+30581a584d85r4I22c23J26C9d90K38A67J555q51g30a52l12E89k39A18J29i86E1
+30602d24F8c03p0H64C31J53H0h2D43l0N0d50B67l2h10a89G17n3L61e80j1C50j69
+30625A81g01A50kb80k54b42E64a05l87el79f2G5qc1A063b78F24k64J23b83C97
+30648c29B56i9c6j41n52K70c6l5n76C4i97b43G9a15k93m72H2a50n5E07j26j29
+30670B52N66g5G35k44g77E04g19A8d10d7j55E32j47b5F78a88D6d16D46q5d16o33
+30692a049H50J3b39m82B42L15A78P5g7Gb38A673c88D87A65c84f5A073a2j20A11
+30714i9o73L67l24D92d82J7a19m77C4b25n55b77G91h04h5B39N20L42B52c44E67
+30736d7B48O1e1A72l1K46I6h15A45J43g66B55J103c89k79E32k13N37A96a10k43
+30757c53D16e92b48k83n39d76fp92D82h7j83J04k07E9J36a0o21J74G51a56B67
+30779B52d2E15H3a190a22C38G7mL4P7c1j80C08f1j41k84m26c34a52o69g5K9E19
+30803H20j79K09b76j79l90a22q74a50qm90O0F5M65a042b11j70A1b53r3q0a0n34
+30825e44E8a41B2re12H8d57D85L28A75f17m88E86c39i4H15B70H1k0K77L49a76
+30848d10A056g4A36M13a258E90J00e37o79D08j06c72p3b02a4j82D5a178E27f06
+30869c46B52p5J48c94r6E75b0p16H03b00C38b71H18b48A162D12a90l49r0e3C47
+30891e60a10A58a016C56Ge26b55F41e03k09a82E58j78c82A01P54e39J87H95b84
+30912b12r7D08L40l32A9a502a77e9B70A18E4b44j29E2d74a57C86P32d93a37l59
+30933d96A83a2j89n13K59j18g8r50D23B2c29H42h24fj37B35J83A83L47M95C01
+30955B36e15E72f22K33E10f87K21J87C55f41F69b33E42a35l26B33R18A69J57j58
+30975A68b31j53R9r5l31A93E5M89j79J6o6G7c34n36b5l09p39c30p48M03E21a51
+30998A71E8c01f8D59a28m61C3K60K08k12a49C59f22C34h23f5A98d95C87a41n74
+31019g15c4p95A39M9J13g71C20a05k34G28C34o8K07m7e3j44j32Q0F44b36n2E48
+31042@A09d43O1l28C20Q5c75b5o36b44D46o8a22A071C85b02G50K20c41l19D22
+31064c44n38A040A98a75E5Q08b06k95E18b31r3b2A5K91a63n36E33d56k60a83m92
+31085f75A215A29f19h7j59B61pJ18M52c29j24j47B6b41A56a05j64k48C1c82o2
+31106d44J90p58e0D7O33j82A21a26B25c59D38GK55c71dk92r60a7G54c13B52g9
+31129A255e40B54c12k99E02b03C25j53B2e0B85l7o9a78q16L75K44J59F0J000c52
+31151B19A00h53F67a94A67c93k44b21A40M06b62i2p57n6d38G72A70m8L60c86G91
+31173F17C9ij111D76B29a257a0B25f02I5e19D74c63D23i12b73P3A58a27fE8e38
+31196b03l01D06j63i50d08C17d14A72j2c1l87k15H58c27I92c5m39C74b19I73a028
+31218d73m39L08A57h15G7e70C94A14e85D42g9C28g00K31E54c67j5G62j54r7g1
+31240c66B59M4f10M5G90l19j84f34a26A41b21G3K76f03l00b93a14o5a7D52a52
+31262d00C62i04a53B16O71C02c87J58B73e11D28f78B55f99K59D79b10A22M89B70
+31283b20A37B2K07K01D9J1L96J06c99k24A38b9j93A63M84C3K04Jb6l20j16B65
+31306b42m9p3G37e60D43e3H47f26C14j8j36G7L19d10G27B28c03D12G5a5n1J8k51
+31329b99E59H1P62j29o1G9d80C26d76G5K75f0G01B13c83b7G82d08Q3F80j99c19
+31352A82M58a8l23F27k96P8M82A03g65b17gm10B32e20F14I5i5A030J17D1P3d09
+31375B91d38B8O29J44M11A73k4N81A19h22A30K07L28p2A13N34c64m7D39c57c7
+31397F79A53e71C49b19k0C13J00d5A83J42j9b28B7e3D98c4A04j9a59k97F78eG26
+31421E59a45l09B05J7j02c77H02D5M8J68c80d5j84j23j31E10b18o14L95A1a61
+31443I69b69jH3a85p17K02b76C77b64q61b0j218A43e1l61n09L87J38l36B32Q9
+31464C21L32e96fD38c50A140D42A66Q21K9a393A45i3d2j50I27A4Q3fG03l28M42
+31486H17A88L15K2i8q87M19d6o44A52c73j07a51j097N33m11a67G3g3E05g68A39
+31508D88j3k26q6b56F2g64j31a94B90j29g18A20N33o8B02e30H6c63C35Ga75B4
+31531a9n38j34p1E29g13F00j80nd39a33N3b8B92N59D4g30a36G32I4d39D1L81A39
+31555d21j1a41k47o95A207i14D49b63a30e5k82A47D7b81A12e81E49B04K76L69
+31575H49A23d65H96e21k97M01P3B90o9M8d52B1f02E19N66a048c92A38J41a02k44
+31596c46A06b46K7D2c66E84b27B35E5h5G04G6Pc82i4l51k34E35O44d96B42M9f5
+31620C95c40F63l23n0F8c66c1n98J30J68G4a05D2L30P11B53K07b69E13b01r96
+31641a197B64g83A03g82A409c5k40C00J73k15M37h14a88G3O21A9J57a92G33l08
+31661D25A31L12j38ph46C06A21e66G39e61m49A85g47A58c40C3M14f3p07g8A18
+31683E1K55c24B72f0n16f5n26C31a8n62J30G24k26L5A33N75e37J23B83c8E59a05
+31706a4k10B19E7K74g4A71K02c05E8h19c91E6e13o01K40c56j86q0Db0A25b59k05
+31729d64F17d98A30R5a90D43i5l62l34g1D11a27A33O52P1a90e1D40a22G23f36
+31751Da72d3m48j83E87b43E65b87D93K16b32o04A03J36Q78E14e91J74B00b52p0
+31772c22L2F95I9g43C74J47d35a21F93a54I12g18i3o0k67F29d16G84g7j204I1
+31794I4e78a79q4A197k25l33E2e95b10e9E59e12j93L6o9c03H62a64k92o94E95
+31816a71l20R6H70D08e05A45K90c6l08A99F3K22K80B5a40d4a6m91D20J65p4J14
+31838F25B22K16j82f32C1c70D6L17A67K79NO42iD40F0f34C7c88G8a88E80k54a97
+31862A212E65g61c00C91C4d19a20A02a06F80I9K09A09l9c69j24B15c88M6J10c2
+31884H03c20C3L93a69j95i0m76A0c23J28B62N62C47K61j91d91Lj17B96a32E46
+31906e38B99b65m07A071g71B73a70L2A52M85A36a0F77e52C46c0D16j16e13K19
+31926b94H50a32C72b57L6G17H3K70A44Q33a64A006E03f86L27j99J78G74e37f2
+31947E39O65D53d03a82k83g3j29A22D4L52J44L85j84b36C58Ke2n54B0a65c9q1
+31969a20m4m62D27C9d85C11O33a56b3E4N8a65k57B97f92C93b68q8D18d39n1Ah91
+31993G57f05b40n24K78M2A96b68F14h4G2b56D2f1D26K75f41b97e5B10a70o15H
+32016H49Bb24k43A77a095b11j08D25b06k56q9p1a52p20E42r9j67M32H3N13j23
+32037D73k05k0L76c82G0a041B38H7M67A39i6B0K74e90J37I2a51A28K18L41a25
+32059g59B71b10a3B09L99b47a05kA032C21a63E4c57k15J75j82B23c1C79l0e02
+32081h66D2O44C42r2a51k86J5m3C9K81b4B2P24C9L29A20J07a23j82c1C85c46J8
+32104c28H4d46B78a52l0F40k11d77P4H07l95j80f44F74H9L82d05q37F22F8J375
+32125A443a570d22A92c32C69K14j32G9d6j82o85A155B51J18j70N0a369N47H01
+32145A83g85B27d18B99b08C53j46D8f80l45b50q0a65q43E21N2d46G73k94c05C22
+32167g89a92F00a61d2a8A50p2L08j83K35h9A146A38K7J29b02A029l98f64a67I62
+32189f17G16j86E7A1K51h49J76c6n17E86d42F84c47M9C11H0J102eA80h60QA279
+32212b33a01A210c6l42J69LIa77C72A07c5J4j09j63A208c07a38k00j97A62K79
+32233D41J93B89e29A08g5A20d34A014G6R91e7j60B98A05J73b24E7J33R14C46q8
+32254B58O47b02A023J12l43B37l8J90a65C29d93m2A15a64n3m07N1b44%A69i51
+32276A10c01k67A69L46k25K37j89J6C8N40j48L51N40D0J88a75B71dn83D37e5j85
+32298b40F36m7k44a78I04b0B52B5b36D75a11F7b350H02L45b84A31e09D72h7l20
+32319d07d1F37a453G43K42a84m3l09A63i4C42a56A36c66d2A01qN06j21j39i0A35
+32342g71k1b05A28e86b54E45B5N03e19p5h5ol9k02J56o2J06j3E55C0a151e33H9
+32366B29G5A1f55b54j4J11C13J68I0gF9a05l31b04j04B51J23b97E9M58I5b29P0
+32389a59D85N93d8A11N81j22b1B93J82I4h9I51e2D52d0E16h90B30J36E7g81A82
+32412A99K87A52g35J22E44i8C42e3A38D4g86D44d61a1l31F2M88m8f59E66J64H4
+32435A58P49B10g98G52d00a36k01h1o81g8q4E43J36H1h0D34e03B59J06M6a97E05
+32458G25g44a63D42k10d39M5D46J25d82C61i38d61I85k63M45n62f55I38k90A41
+32479A2a68l67G31g9a7r28b63n3J51N6l8G88b46n3p06B3M10L7E8L11A16L72N42
+32502A030C7L73e29J47p01a13D03j56b01B27L1J02b74B16N53g79D71k25a11F02
+32523h4p37b67D3Q09c56l94J18F27B48h48C70b48D87K02J29C06f05G01N52B54
+32544g07a93m29a64C28F8O4d39D7a33C7h88f9B75h97a65A01c81G35P84I6A9g69
+32567I15D22c46H5a88I9g70F70e04o1K46A29c91k75b11E4O80l17h09A9M29a23
+32589a159l6d21B41I2L2a36A27d36ra6A27iE87a25k66D10j58N2l4J1e81a94D8
+32613E14f0D54f76D25a39D03e29C83Ha250E57f5A127C15j00a54q92b66A24K00
+32633C24K71r1P2d80J27B95f6j39H5eB22N8j29K20a85k13J02F92e89H59a54A61
+32656A74L50f59A20K41g47c61D17a06l21B30J96j58K70k19P1d94J78j32j63e8
+32677e85g6J7C38R5J14G2a10C50L36a93A106C49C1e4l04B64gB33N18c36G94c76
+32700D6d81C02e16b10F9Q13b78D19M59j57i45b33J14E79i31M02J8A41B4b33k79
+32721e12H5B6J55L04a4n4F95d46K00c1D60b32r3C97a187F5R3K79A51e2A18a63
+32744I29j82H5e97F91k38a54G2J08P71a47j43k95I84a296A72j1J6F5i70A59k0
+32765A39b59D40
+##END NTUPLES=NMR FID
+##END=
+$$
+$$ end of block 1
+$$
+##TITLE=1H_ns16 DMSO /opt/topspin3.5pl6/data/complat/nmr PH 44
+##JCAMPDX= 6.0 $$ Bruker NMR JCAMP-DX V2.0
+##DATA TYPE= NMR SPECTRUM
+##DATA CLASS= NTUPLES
+##ORIGIN= PH
+##OWNER= PH
+##LONG DATE= 2018/07/09 16:34:42+0000
+$$ 1.90.2.2 TopSpin 3.5 pl 6
+$$ 2018-07-09 18:34:43.574 +0200 nmr@ibg-4-babsi
+$$ Compression mode = diff/dup
+##.OBSERVE FREQUENCY= 400.13240078
+##.OBSERVE NUCLEUS= ^1H
+##.ACQUISITION MODE= SIMULTANEOUS (DQD)
+##.ACQUISITION SCHEME= undefined
+##.AVERAGES= 16
+##.DIGITISER RES= 22
+##SPECTROMETER/DATA SYSTEM= spect
+##.PULSE SEQUENCE= zg30
+##.SOLVENT NAME= DMSO
+##.SHIFT REFERENCE= INTERNAL, DMSO, 1, 16.01277
+##AUDIT TRAIL= $$ (NUMBER, WHEN, WHO, WHERE, PROCESS, VERSION, WHAT)
+$$ ##TITLE= Audit trail, TopSpin 3.5 pl 6
+$$ ##JCAMPDX= 5.01
+$$ ##ORIGIN= Bruker BioSpin GmbH
+$$ ##OWNER= nmr
+$$ $$ /opt/topspin3.5pl6/data/complat/nmr/data/PH/nmr/PH-771/30/pdata/1/auditp.txt
+$$ ##AUDIT TRAIL= $$ (NUMBER, WHEN, WHO, WHERE, PROCESS, VERSION, WHAT)
+( 1,<2018-07-09 18:34:42.776 +0200>,,,,,
+ )
+( 2,<2018-07-09 18:34:42.811 +0200>,,,,,
+ )
+( 3,<2018-07-09 18:34:43.207 +0200>,,,,,
+ )
+( 4,<2018-07-09 18:34:43.421 +0200>,,,,,
+ )
+( 5,<2018-07-09 18:34:43.491 +0200>,,,,,
+ )
+$$ ##END=
+$$
+$$ $$ hash MD5
+$$ $$ AD F7 B1 87 45 DA 14 03 FB B3 37 F9 9C 67 19 06
+##$RELAX=
+##$BRUKER FILE EXP=format.temp
+$$ EDIT_PAR COMMAND FILE
+$$
+$$ DI_MODE LONG
+$$ ED_ENTRY ACQU
+$$ ORDER FILE
+$$
+$$
+$$ HEADER "F2 - Acquisition Parameters"
+$$ T_NAME Date_
+$$ TYPE R64
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 50000000
+$$ REL "Date_=itodate(DATE)"
+$$ INV_REL "DATE=datetoi(Date_,DATE)"
+$$ FORMAT "%14.0f"
+$$ TEXT " "
+$$ END
+$$ T_NAME Time
+$$ TYPE R32
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 1000000
+$$ REL "Time=itotime(DATE)"
+$$ INV_REL "DATE=timetoi(Time,DATE)"
+$$ FORMAT "%14.2f h"
+$$ TEXT " "
+$$ END
+$$ NAME INSTRUM
+$$ TEXT " "
+$$ END
+$$ NAME PROBHD
+$$ FORMAT "%14.14s"
+$$ TEXT " "
+$$ END
+$$ NAME PULPROG
+$$ TEXT " "
+$$ END
+$$ NAME TD
+$$ TEXT " "
+$$ END
+$$ NAME SOLVENT
+$$ TEXT " "
+$$ END
+$$ NAME NS
+$$ TEXT " "
+$$ END
+$$ NAME DS
+$$ TEXT " "
+$$ END
+$$ T_NAME SWH
+$$ TYPE R32
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 1e8
+$$ REL "SWH=SW*SFO1"
+$$ INV_REL "SW=SWH/SFO1"
+$$ UNIT "Hz"
+$$ FORMAT "%14.3f Hz"
+$$ TEXT " "
+$$ END
+$$ T_NAME FIDRES
+$$ TYPE R32
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 100000
+$$ REL "FIDRES=2*SW*SFO1/TD"
+$$ INV_REL "TD = nextpow(2*SW*SFO1/FIDRES)"
+$$ UNIT "Hz"
+$$ FORMAT "%14.6f Hz"
+$$ TEXT " "
+$$ END
+$$ T_NAME AQ
+$$ TYPE R32
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 1000
+$$ REL "AQ=aqcalc(SW,SFO1,TD,DIGTYP)"
+$$ INV_REL "TD=tdcalc(SW,SFO1,1.0e6*AQ,DIGTYP)"
+$$ UNIT "sec"
+$$ FORMAT "%14.7f sec"
+$$ TEXT " "
+$$ END
+$$ NAME RG
+$$ TEXT " "
+$$ END
+$$ T_NAME DW
+$$ TYPE R32
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 1000000
+$$ REL "DW=1/(2*SW*SFO1)"
+$$ INV_REL "SW=1000000/(2*(0.005+DW)*SFO1)"
+$$ UNIT "usec"
+$$ FORMAT "%14.3lf usec"
+$$ TEXT " "
+$$ END
+$$ NAME DE
+$$ FORMAT "%14.2f usec"
+$$ TEXT " "
+$$ END
+$$ NAME TE
+$$ FORMAT "%14.1f K"
+$$ TEXT " "
+$$ END
+$$ T_NAME D1
+$$ TYPE R32
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 1e38
+$$ REL "D1=D[1]"
+$$ INV_REL "D[1]=D1"
+$$ UNIT "sec"
+$$ FORMAT "%14.8f sec"
+$$ TEXT " "
+$$ END
+$$ NAME TD0
+$$ TEXT " "
+$$ END
+$$ NAME SFO1
+$$ FORMAT "%14.7f MHz"
+$$ TEXT " "
+$$ END
+$$ NAME NUC1
+$$ NONEDIT
+$$ TEXT " "
+$$ END
+$$ T_NAME P1
+$$ TYPE R32
+$$ CLASS ACQU
+$$ SUBRANGE 0.0 1.0e10
+$$ REL "P1=P[1]"
+$$ INV_REL "P[1]=P1"
+$$ UNIT "usec"
+$$ FORMAT "%14.2f usec"
+$$ TEXT " "
+$$ END
+$$ T_NAME PLW1
+$$ TYPE R32
+$$ CLASS ACQU
+$$ REL "PLW1=PLW[1]"
+$$ INV_REL "PLW[1]=PLW1"
+$$ UNIT "W"
+$$ FORMAT "%14.8f W"
+$$ TEXT "power PLW1 "
+$$ END
+##$RELAX=
+##$BRUKER FILE EXP=fq1list
+$$ O 400.132401
+$$ -2000000
+$$ -1992172
+$$ -1984344
+$$ -1976517
+$$ -1968689
+$$ -1960861
+$$ -1953033
+$$ -1945205
+$$ -1937378
+$$ -1929550
+$$ -1921722
+$$ -1913894
+$$ -1906067
+$$ -1898239
+$$ -1890411
+$$ -1882583
+$$ -1874755
+$$ -1866928
+$$ -1859100
+$$ -1851272
+$$ -1843444
+$$ -1835616
+$$ -1827789
+$$ -1819961
+$$ -1812133
+$$ -1804305
+$$ -1796477
+$$ -1788650
+$$ -1780822
+$$ -1772994
+$$ -1765166
+$$ -1757339
+$$ -1749511
+$$ -1741683
+$$ -1733855
+$$ -1726027
+$$ -1718200
+$$ -1710372
+$$ -1702544
+$$ -1694716
+$$ -1686888
+$$ -1679061
+$$ -1671233
+$$ -1663405
+$$ -1655577
+$$ -1647750
+$$ -1639922
+$$ -1632094
+$$ -1624266
+$$ -1616438
+$$ -1608611
+$$ -1600783
+$$ -1592955
+$$ -1585127
+$$ -1577299
+$$ -1569472
+$$ -1561644
+$$ -1553816
+$$ -1545988
+$$ -1538160
+$$ -1530333
+$$ -1522505
+$$ -1514677
+$$ -1506849
+$$ -1499022
+$$ -1491194
+$$ -1483366
+$$ -1475538
+$$ -1467710
+$$ -1459883
+$$ -1452055
+$$ -1444227
+$$ -1436399
+$$ -1428571
+$$ -1420744
+$$ -1412916
+$$ -1405088
+$$ -1397260
+$$ -1389432
+$$ -1381605
+$$ -1373777
+$$ -1365949
+$$ -1358121
+$$ -1350294
+$$ -1342466
+$$ -1334638
+$$ -1326810
+$$ -1318982
+$$ -1311155
+$$ -1303327
+$$ -1295499
+$$ -1287671
+$$ -1279843
+$$ -1272016
+$$ -1264188
+$$ -1256360
+$$ -1248532
+$$ -1240705
+$$ -1232877
+$$ -1225049
+$$ -1217221
+$$ -1209393
+$$ -1201566
+$$ -1193738
+$$ -1185910
+$$ -1178082
+$$ -1170254
+$$ -1162427
+$$ -1154599
+$$ -1146771
+$$ -1138943
+$$ -1131115
+$$ -1123288
+$$ -1115460
+$$ -1107632
+$$ -1099804
+$$ -1091977
+$$ -1084149
+$$ -1076321
+$$ -1068493
+$$ -1060665
+$$ -1052838
+$$ -1045010
+$$ -1037182
+$$ -1029354
+$$ -1021526
+$$ -1013699
+$$ -1005871
+$$ -998043
+$$ -990215
+$$ -982387
+$$ -974560
+$$ -966732
+$$ -958904
+$$ -951076
+$$ -943249
+$$ -935421
+$$ -927593
+$$ -919765
+$$ -911937
+$$ -904110
+$$ -896282
+$$ -888454
+$$ -880626
+$$ -872798
+$$ -864971
+$$ -857143
+$$ -849315
+$$ -841487
+$$ -833659
+$$ -825832
+$$ -818004
+$$ -810176
+$$ -802348
+$$ -794521
+$$ -786693
+$$ -778865
+$$ -771037
+$$ -763209
+$$ -755382
+$$ -747554
+$$ -739726
+$$ -731898
+$$ -724070
+$$ -716243
+$$ -708415
+$$ -700587
+$$ -692759
+$$ -684932
+$$ -677104
+$$ -669276
+$$ -661448
+$$ -653620
+$$ -645793
+$$ -637965
+$$ -630137
+$$ -622309
+$$ -614481
+$$ -606654
+$$ -598826
+$$ -590998
+$$ -583170
+$$ -575342
+$$ -567515
+$$ -559687
+$$ -551859
+$$ -544031
+$$ -536204
+$$ -528376
+$$ -520548
+$$ -512720
+$$ -504892
+$$ -497065
+$$ -489237
+$$ -481409
+$$ -473581
+$$ -465753
+$$ -457926
+$$ -450098
+$$ -442270
+$$ -434442
+$$ -426614
+$$ -418787
+$$ -410959
+$$ -403131
+$$ -395303
+$$ -387476
+$$ -379648
+$$ -371820
+$$ -363992
+$$ -356164
+$$ -348337
+$$ -340509
+$$ -332681
+$$ -324853
+$$ -317025
+$$ -309198
+$$ -301370
+$$ -293542
+$$ -285714
+$$ -277886
+$$ -270059
+$$ -262231
+$$ -254403
+$$ -246575
+$$ -238748
+$$ -230920
+$$ -223092
+$$ -215264
+$$ -207436
+$$ -199609
+$$ -191781
+$$ -183953
+$$ -176125
+$$ -168297
+$$ -160470
+$$ -152642
+$$ -144814
+$$ -136986
+$$ -129159
+$$ -121331
+$$ -113503
+$$ -105675
+$$ -97847
+$$ -90020
+$$ -82192
+$$ -74364
+$$ -66536
+$$ -58708
+$$ -50881
+$$ -43053
+$$ -35225
+$$ -27397
+$$ -19569
+$$ -11742
+$$ -3914
+$$ 3914
+$$ 11742
+$$ 19569
+$$ 27397
+$$ 35225
+$$ 43053
+$$ 50881
+$$ 58708
+$$ 66536
+$$ 74364
+$$ 82192
+$$ 90020
+$$ 97847
+$$ 105675
+$$ 113503
+$$ 121331
+$$ 129159
+$$ 136986
+$$ 144814
+$$ 152642
+$$ 160470
+$$ 168297
+$$ 176125
+$$ 183953
+$$ 191781
+$$ 199609
+$$ 207436
+$$ 215264
+$$ 223092
+$$ 230920
+$$ 238748
+$$ 246575
+$$ 254403
+$$ 262231
+$$ 270059
+$$ 277886
+$$ 285714
+$$ 293542
+$$ 301370
+$$ 309198
+$$ 317025
+$$ 324853
+$$ 332681
+$$ 340509
+$$ 348337
+$$ 356164
+$$ 363992
+$$ 371820
+$$ 379648
+$$ 387476
+$$ 395303
+$$ 403131
+$$ 410959
+$$ 418787
+$$ 426614
+$$ 434442
+$$ 442270
+$$ 450098
+$$ 457926
+$$ 465753
+$$ 473581
+$$ 481409
+$$ 489237
+$$ 497065
+$$ 504892
+$$ 512720
+$$ 520548
+$$ 528376
+$$ 536204
+$$ 544031
+$$ 551859
+$$ 559687
+$$ 567515
+$$ 575342
+$$ 583170
+$$ 590998
+$$ 598826
+$$ 606654
+$$ 614481
+$$ 622309
+$$ 630137
+$$ 637965
+$$ 645793
+$$ 653620
+$$ 661448
+$$ 669276
+$$ 677104
+$$ 684932
+$$ 692759
+$$ 700587
+$$ 708415
+$$ 716243
+$$ 724070
+$$ 731898
+$$ 739726
+$$ 747554
+$$ 755382
+$$ 763209
+$$ 771037
+$$ 778865
+$$ 786693
+$$ 794521
+$$ 802348
+$$ 810176
+$$ 818004
+$$ 825832
+$$ 833659
+$$ 841487
+$$ 849315
+$$ 857143
+$$ 864971
+$$ 872798
+$$ 880626
+$$ 888454
+$$ 896282
+$$ 904110
+$$ 911937
+$$ 919765
+$$ 927593
+$$ 935421
+$$ 943249
+$$ 951076
+$$ 958904
+$$ 966732
+$$ 974560
+$$ 982387
+$$ 990215
+$$ 998043
+$$ 1005871
+$$ 1013699
+$$ 1021526
+$$ 1029354
+$$ 1037182
+$$ 1045010
+$$ 1052838
+$$ 1060665
+$$ 1068493
+$$ 1076321
+$$ 1084149
+$$ 1091977
+$$ 1099804
+$$ 1107632
+$$ 1115460
+$$ 1123288
+$$ 1131115
+$$ 1138943
+$$ 1146771
+$$ 1154599
+$$ 1162427
+$$ 1170254
+$$ 1178082
+$$ 1185910
+$$ 1193738
+$$ 1201566
+$$ 1209393
+$$ 1217221
+$$ 1225049
+$$ 1232877
+$$ 1240705
+$$ 1248532
+$$ 1256360
+$$ 1264188
+$$ 1272016
+$$ 1279843
+$$ 1287671
+$$ 1295499
+$$ 1303327
+$$ 1311155
+$$ 1318982
+$$ 1326810
+$$ 1334638
+$$ 1342466
+$$ 1350294
+$$ 1358121
+$$ 1365949
+$$ 1373777
+$$ 1381605
+$$ 1389432
+$$ 1397260
+$$ 1405088
+$$ 1412916
+$$ 1420744
+$$ 1428571
+$$ 1436399
+$$ 1444227
+$$ 1452055
+$$ 1459883
+$$ 1467710
+$$ 1475538
+$$ 1483366
+$$ 1491194
+$$ 1499022
+$$ 1506849
+$$ 1514677
+$$ 1522505
+$$ 1530333
+$$ 1538160
+$$ 1545988
+$$ 1553816
+$$ 1561644
+$$ 1569472
+$$ 1577299
+$$ 1585127
+$$ 1592955
+$$ 1600783
+$$ 1608611
+$$ 1616438
+$$ 1624266
+$$ 1632094
+$$ 1639922
+$$ 1647750
+$$ 1655577
+$$ 1663405
+$$ 1671233
+$$ 1679061
+$$ 1686888
+$$ 1694716
+$$ 1702544
+$$ 1710372
+$$ 1718200
+$$ 1726027
+$$ 1733855
+$$ 1741683
+$$ 1749511
+$$ 1757339
+$$ 1765166
+$$ 1772994
+$$ 1780822
+$$ 1788650
+$$ 1796477
+$$ 1804305
+$$ 1812133
+$$ 1819961
+$$ 1827789
+$$ 1835616
+$$ 1843444
+$$ 1851272
+$$ 1859100
+$$ 1866928
+$$ 1874755
+$$ 1882583
+$$ 1890411
+$$ 1898239
+$$ 1906067
+$$ 1913894
+$$ 1921722
+$$ 1929550
+$$ 1937378
+$$ 1945205
+$$ 1953033
+$$ 1960861
+$$ 1968689
+$$ 1976517
+$$ 1984344
+$$ 1992172
+$$ 2000000
+##$RELAX=
+##$BRUKER FILE EXP=scon2
+$$ ##TITLE= Parameter file, TopSpin 3.5 pl 6
+$$ ##JCAMPDX= 5.0
+$$ ##DATATYPE= Parameter Values
+$$ ##NPOINTS= 1 $$ modification sequence number
+$$ ##ORIGIN= Bruker BioSpin GmbH
+$$ ##OWNER= nmr
+$$ $$ 2018-07-09 18:33:07.958 +0200 nmr@ibg-4-babsi
+$$ $$ /opt/topspin3.5pl6/data/complat/nmr/data/PH/nmr/PH-771/30/scon2
+$$ $$ process /opt/topspin3.5pl6/prog/mod/go4
+$$ ##$BLKTR= (0..19)
+$$ 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+$$ ##$DE1= 4.5
+$$ ##$DEADC= 0.5
+$$ ##$DEPA= 4.5
+$$ ##$DERX= 1.5
+$$ ##$FILCOR= 0
+$$ ##$GRADCHAN= 0
+$$ ##$GRADPRE= (0..1)
+$$ 10 10
+$$ ##$HD_BLKTR= (0..19)
+$$ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+$$ ##$HD_DE1= 5
+$$ ##$HD_DEADC= 0
+$$ ##$HD_DEPA= 2.5
+$$ ##$HD_DERX= 0
+$$ ##END=
+##$RELAX=
+##$BRUKER FILE EXP=prosol_History
+##$RELAX=
+##$BRUKER FILE EXP=pulseprogram
+$$ # 1 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ ;zg30
+$$ ;avance-version (12/01/11)
+$$ ;1D sequence
+$$ ;using 30 degree flip angle
+$$ ;
+$$ ;$CLASS=HighRes
+$$ ;$DIM=1D
+$$ ;$TYPE=
+$$ ;$SUBTYPE=
+$$ ;$COMMENT=
+$$ ;$RECOMMEND=y
+$$
+$$
+$$ # 1 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/Avance.incl" 1
+$$ ;Avance3aqs.incl
+$$ ; for AV III with AQS IPSO
+$$ ;
+$$ ;avance-version (15/06/05)
+$$ ;
+$$ ;$CLASS=HighRes Incl
+$$ ;$COMMENT=
+$$ # 170 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/Avance.incl"
+$$ ;$Id: Avance3aqs.incl,v 1.1.8.3 2015/03/05 16:46:54 ber Exp $
+$$ # 14 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30" 2
+$$
+$$
+$$ # 17 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ "acqt0=-p1*0.66/3.1416"
+$$
+$$
+$$ # 1 "mc_line 20 file /opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30 exp. def. part of mc cmd. before ze"
+$$ ; dimension 1D; AQ_mode
+$$ define delay MCWRK
+$$ define delay MCREST
+$$ "MCREST = 30m - 30m"
+$$ "MCWRK = 0.333333*30m"
+$$
+$$ dccorr
+$$ # 20 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ 1 ze
+$$ # 1 "mc_line 20 file /opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30 exp. def. of mc cmd. after ze"
+$$ # 21 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ # 1 "mc_line 21 file /opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30 exp. start label for mc cmd."
+$$ 2 MCWRK * 2
+$$ LBLF0, MCWRK
+$$ MCREST
+$$ # 22 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ d1
+$$ p1*0.33 ph1
+$$ go=2 ph31
+$$ # 1 "mc_line 25 file /opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30 exp. mc cmd. in line"
+$$ MCWRK wr #0
+$$ MCWRK zd
+$$ lo to LBLF0 times td0
+$$
+$$ # 26 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ exit
+$$ # 29 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ ph1=0 2 2 0 1 3 3 1
+$$ ph31=0 2 2 0 1 3 3 1
+$$
+$$
+$$ ;pl1 : f1 channel - power level for pulse (default)
+$$ ;p1 : f1 channel - 90 degree high power pulse
+$$ ;d1 : relaxation delay; 1-5 * T1
+$$ ;ns: 1 * n, total number of scans: NS * TD0
+$$ # 40 "/opt/topspin3.5pl6/exp/stan/nmr/lists/pp/zg30"
+$$ ;$Id: zg30,v 1.12 2012/01/31 17:49:31 ber Exp $
+##$RELAX=
+##$BRUKER FILE EXP=shimvalues
+$$ # Mon Jul 9 18:34:42 2018
+$$ #$$PROBEIDENTIFIER=Z116098_0570
+$$ #$$PROBENAME=PA BBO 400S1 BBF-H-D-05 Z SP
+$$ #$$SHIMID=292722
+$$ #
+$$ # Active Shim Gradients
+$$ #
+$$ Z -10343
+$$ Z2 2172
+$$ Z3 -308
+$$ Z4 -1701
+$$ Z5 528
+$$ Z6 2192
+$$ Z7 -2289
+$$ Z8 -117
+$$ X 3251
+$$ XZ -698
+$$ XZ2 2438
+$$ XZ3 -169
+$$ XZ4 -555
+$$ XZ5 1731
+$$ Y 420
+$$ YZ -1082
+$$ YZ2 -180
+$$ YZ3 -929
+$$ YZ4 233
+$$ YZ5 3803
+$$ XY -1633
+$$ XYZ 1468
+$$ XYZ2 -417
+$$ XYZ3 494
+$$ XYZ4 263
+$$ XYZ5 0
+$$ (X2-Y2) -1669
+$$ (X2-Y2)Z -1275
+$$ (X2-Y2)Z2 976
+$$ (X2-Y2)Z3 361
+$$ (X2-Y2)Z4 -678
+$$ (X2-Y2)Z5 0
+$$ X3 2782
+$$ X3Z -52
+$$ Y3 -133
+$$ Y3Z 647
+$$ #
+$$ # Lock Parameter
+$$ #
+$$ FIELD 4932.190
+$$ LOCKPHASE 103.600
+$$ LOCKPOWER -20.000
+$$ LOCKGAIN 101.347
+$$ LOCKDC -75.000
+$$ LOCKSHIFT 2.490
+$$ LOOPGAIN 5.000
+$$ LOOPTIME 0.250
+$$ LOOPFILTER 500.000
+$$ #
+$$ IEEE64_VERSION_CODE 1
+$$ #
+$$ # Shim currents
+$$ #
+$$ SHIM_SETTING [1 ] -5308.19255181
+$$ SHIM_SETTING [2 ] 1516.76908859
+$$ SHIM_SETTING [3 ] 889.56803599
+$$ SHIM_SETTING [4 ] -1053.20310913
+$$ SHIM_SETTING [5 ] 148.52261207
+$$ SHIM_SETTING [6 ] -135.93500083
+$$ SHIM_SETTING [7 ] -497.12237849
+$$ SHIM_SETTING [8 ] 3136.94850686
+$$ SHIM_SETTING [9 ] 539.77849344
+$$ SHIM_SETTING [10] 651.25612282
+$$ SHIM_SETTING [11] 0.00000000
+$$ SHIM_SETTING [12] -780.18000000
+$$ SHIM_SETTING [13] 514.48700000
+$$ SHIM_SETTING [14] 1374.39300000
+$$ SHIM_SETTING [15] 4786.77300000
+$$ SHIM_SETTING [16] 5286.18300000
+$$ SHIM_SETTING [17] 2452.32300000
+$$ SHIM_SETTING [18] 2010.58600000
+$$ SHIM_SETTING [19] 1859.41700000
+$$ SHIM_SETTING [20] -1117.73500000
+$$ SHIM_SETTING [21] -1427.28500000
+$$ SHIM_SETTING [22] 589.75700000
+$$ SHIM_SETTING [23] -2832.90900000
+$$ SHIM_SETTING [24] -578.45200000
+$$ SHIM_SETTING [25] -1318.77900000
+$$ SHIM_SETTING [26] -1470.93100000
+$$ SHIM_SETTING [27] 1324.21400000
+$$ SHIM_SETTING [28] -260.35600000
+$$ SHIM_SETTING [29] 481.12800000
+$$ SHIM_SETTING [30] -1162.33700000
+$$ SHIM_SETTING [31] 1564.29600000
+$$ SHIM_SETTING [32] 943.47600000
+$$ SHIM_SETTING [33] 481.78100000
+$$ SHIM_SETTING [34] -3183.59300000
+$$ SHIM_SETTING [35] -867.66700000
+$$ SHIM_SETTING [36] -2313.08700000
+$$ SHIM_SETTING [37] -2521.56100000
+$$ SHIM_SETTING [38] 3387.33700000
+$$ SHIM_SETTING [39] -957.13500000
+$$ SHIM_SETTING [40] 0.00000000
+##$RELAX=
+##$BRUKER FILE EXP=uxnmr.par
+$$ ##TITLE= Parameter file, TopSpin 3.5 pl 6
+$$ ##JCAMPDX= 5.0
+$$ ##DATATYPE= Parameter Values
+$$ ##NPOINTS= 33 $$ modification sequence number
+$$ ##ORIGIN= Bruker BioSpin GmbH
+$$ ##OWNER= nmrsu
+$$ $$ 2017-08-18 15:18:49.179 +0200 nmr@ibg-4-babsi
+$$ $$ /opt/topspin3.5pl6/conf/instr/spect/uxnmr.par
+$$ $$ process /opt/topspin3.5pl6/prog/mod/cfserverav3
+$$ ##$ACB= 0
+$$ ##$ACBTAT= (0..23)
+$$ 0 66 66 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTBA= (0..23)
+$$ 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTBLK= (0..23)
+$$ 0 1 1 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTCTL= (0..23)
+$$ 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTDI= (0..23)
+$$ 0 102 102 -1779670252 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTDM= (0..23)
+$$ 0 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTFHI= (0..23)
+$$ 0 400 400 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTFL= (0..23)
+$$ 0 73 74 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTFLO= (0..23)
+$$ 0 9 9 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTINP= (0..23)
+$$ 0 1 2 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTOUT= (0..23)
+$$ 0 1 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTPO= (0..23)
+$$ 0 150000 60000 5000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTPW= (0..23)
+$$ 0 10 10 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTSB= (0..23)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTSDT= (0..23)
+$$ 0 -1 -1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$ACBTY=
+$$ ##$AMPDFLT= no
+$$ ##$AQSBDCH= (0..95)
+$$ 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255
+$$ ##$AQSBDHW= (0..95)
+$$ 5 1 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255
+$$ ##$AQSBDID= (0..95)
+$$ 82 88 83 83 65 86 86 86 66 66 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255
+$$ ##$AQSBDNO= (0..95)
+$$ 1 1 1 2 1 1 2 3 1 1 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255
+$$ ##$AQSBDSL= (0..95)
+$$ 2 3 4 4 8 12 14 15 255 1 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255
+$$ ##$AQSBDTY= (0..95)
+$$ 67 214 50 50 5 148 147 145 217 7 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255
+$$ ##$AQSBUAD= (0..95)
+$$ 16 52 36 37 54 160 161 162 32 32 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255
+$$ ##$AQSECL= (0..95)
+$$ 0 5 3 3 9 2 0 1 1 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255
+$$ ##$AQSECLS= (0..95)
+$$ 4 1 2 2 2 1 1 2 2 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
+$$ 255
+$$ ##$AQSETH1=
+$$ ##$AQSETH2=
+$$ ##$AQSSPLT= no
+$$ ##$ATT19F= (0..1)
+$$ 0 0
+$$ ##$ATT1H= (0..1)
+$$ 0 0
+$$ ##$ATT3H= (0..1)
+$$ 0 0
+$$ ##$ATTX= (0..1)
+$$ 0 0
+$$ ##$ATTY= (0..1)
+$$ 0 0
+$$ ##$ATTZ= (0..1)
+$$ 0 0
+$$ ##$BACSAIR= yes
+$$ ##$BACSCAP= 0
+$$ ##$BACSDEL= 1
+$$ ##$BACSFCM= no
+$$ ##$BACSOPT= <>
+$$ ##$BACSTY=
+$$ ##$BARPTY=
+$$ ##$BFREQ= 400.13
+$$ ##$BGAETH= (0..9)
+$$
+$$ ##$BIRDS= yes
+$$ ##$BMPC= 0
+$$ ##$BMPCTY=
+$$ ##$BPSUTY=
+$$ ##$BSMS= 2
+$$ ##$BSMS19FLock= no
+$$ ##$BSMSETH= <149.236.99.20>
+$$ ##$BSMSTY=
+$$ ##$BgaChFac2= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$BgaChMap= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$BgaChMaxv= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$BgaChRouting= (0..63)
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$BgaChShimMap= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$BgaChShimMaxv= (0..7)
+$$ 0 0 0 0 0 0 0 0
+$$ ##$BlaEth= (0..9)
+$$ <149.236.99.20> <> <>
+$$ ##$BlaNam= (0..9)
+$$ <> <> <> <> <> <>
+$$ <> <>
+$$ ##$BlaPN= (0..9)
+$$ <> <> <> <> <> <> <> <>
+$$ ##$BlaSN= (0..9)
+$$ <5376> <02008> <> <> <> <> <> <> <> <>
+$$ ##$BsmsAuxEth=
+$$ ##$CFASMOD= (0..7)
+$$ 1 1 1 1 1 1 1 1
+$$ ##$CFASMUL= (0..7)
+$$ 1 1 1 1 1 1 1 1
+$$ ##$CNFTXDR= (0..7)
+$$ 6 6 0 0 0 0 0 0
+$$ ##$COMDIG2= 0
+$$ ##$CPDBTY=
+$$ ##$CRCOTY=
+$$ ##$CSW1= (0..31)
+$$ 1 1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$CSW2= (0..31)
+$$ 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+$$ ##$CSWNUM= (0..7)
+$$ 2 1 0 0 0 0 0 0
+$$ ##$ConsolePnSn= <>
+$$ ##$CryoProAccPnSn= <>
+$$ ##$Ctb1Eth=
+$$ ##$CubeEth= (0..7)
+$$